Version Description
- Completely new Bulk Optimization page.
- Better detection of image sizes with duplicate filenames.
- Simplified account activation and API key creation.
- Fix to the bottom drop-down menu in the Media Library.
- Use the latest PHP client library for connecting to TinyJPG and TinyPNG.
- Added fallback to fopen for older systems running PHP 5.2.
Download this release
Release Info
Developer | TinyPNG |
Plugin | Compress JPEG & PNG images |
Version | 2.0.0 |
Comparing to | |
See all releases |
Code changes from version 1.7.2 to 2.0.0
- .gitignore +2 -0
- .travis.yml +69 -2
- README.md +14 -8
- RELEASE +1 -1
- bin/check-style +2 -0
- bin/docker-functions +0 -69
- bin/format-language-files +15 -0
- bin/format-style +2 -0
- bin/install-docker +25 -0
- bin/integration-tests +81 -56
- bin/post-install +4 -0
- bin/restore-wordpress +0 -35
- bin/run-wordpress +16 -22
- bin/test-wordpress +0 -57
- bin/unit-tests +2 -3
- composer.json +19 -2
- composer.lock +270 -78
- config/Dockerfile +0 -12
- config/{Dockerfile-mock-tinypng-webservice → Dockerfile-mock-webservice} +0 -0
- config/Dockerfile-phantomjs +1 -1
- config/Dockerfile-wordpress-45 +15 -0
- config/mysql/additional.cnf +3 -0
- docker-compose.yml +45 -0
- phpcs.xml +22 -0
- readme.txt +37 -26
- src/class-tiny-compress-client.php +174 -0
- src/class-tiny-compress-curl.php +0 -132
- src/class-tiny-compress-fopen.php +231 -102
- src/class-tiny-compress.php +145 -138
- src/class-tiny-exception.php +25 -8
- src/class-tiny-image-size.php +150 -0
- src/class-tiny-image.php +413 -0
- src/class-tiny-metadata-image.php +0 -121
- src/class-tiny-metadata.php +0 -216
- src/class-tiny-notices.php +118 -100
- src/class-tiny-php.php +6 -6
- src/class-tiny-plugin.php +429 -278
- src/class-tiny-settings.php +641 -420
- src/class-tiny-wp-base.php +67 -80
- src/config/tiny-config.php +7 -2
- src/css/admin.css +301 -0
- src/css/bulk-optimization.css +380 -0
- src/{cacert.pem → data/cacert.pem} +0 -0
- src/images/button-spinner-2x.gif +0 -0
- src/images/button-spinner.gif +0 -0
- src/images/spinner-2x.gif +0 -0
- src/images/spinner.gif +0 -0
- src/js/admin.js +227 -0
- src/js/bulk-optimization.js +217 -0
- src/scripts/admin.js +0 -223
- src/styles/admin.css +0 -142
- src/vendor/tinify/Tinify.php +107 -0
- src/vendor/tinify/Tinify/Client.php +118 -0
- src/vendor/tinify/Tinify/Exception.php +36 -0
- src/vendor/tinify/Tinify/Result.php +36 -0
- src/vendor/tinify/Tinify/ResultMeta.php +23 -0
- src/vendor/tinify/Tinify/Source.php +69 -0
- src/vendor/tinify/data/cacert.pem +3988 -0
- src/views/account-status-connected.php +87 -0
- src/views/account-status-create-advanced.php +57 -0
- src/views/account-status-create-simple.php +28 -0
- src/views/account-status-loading.php +8 -0
- src/views/account-status-update.php +32 -0
- src/views/bulk-optimization-chart.php +53 -0
- src/views/bulk-optimization-form.php +16 -0
- src/views/bulk-optimization.php +218 -0
- src/views/compress-details-processing.php +7 -9
- src/views/compress-details.php +150 -147
- test/fixtures/Client.php +119 -0
- test/fixtures/input-example.jpg +0 -0
- test/fixtures/input-example.png +0 -0
- test/fixtures/json/{wp_meta_default_sizes.json → _wp_attachment_metadata.json} +10 -4
- test/fixtures/json/_wp_attachment_metadata_duplicates.json +51 -0
- test/fixtures/json/image_database_metadata.json +49 -0
- test/fixtures/json/image_filesystem_data.json +22 -0
- test/fixtures/json/wp_meta_sizes_with_same_files.json +0 -21
- test/fixtures/tiny-config.php +7 -2
- test/helpers/integration_helper.php +0 -9
- test/helpers/mock-http-stream-wrapper.php +98 -0
- test/helpers/mock-tinify-client.php +50 -0
- test/helpers/setup.php +153 -125
- test/helpers/wordpress.php +228 -230
- test/integration/BulkCompressIntegrationTest.php +0 -82
- test/integration/BulkOptimizationIntegrationTest.php +80 -0
- test/integration/CompressIntegrationTest.php +353 -273
- test/integration/IntegrationTestCase.php +159 -133
- test/integration/PluginIntegrationTest.php +31 -13
- test/integration/SettingsIntegrationTest.php +284 -184
- test/mock-tinypng-webservice/.htaccess +1 -0
- test/mock-tinypng-webservice/common.php +1 -1
- test/mock-tinypng-webservice/keys.php +14 -0
- test/mock-tinypng-webservice/output-example.jpg +0 -0
- test/mock-tinypng-webservice/output-example.png +0 -0
- test/mock-tinypng-webservice/{output-resized.png → output-resized.jpg} +0 -0
- test/mock-tinypng-webservice/output.php +5 -3
- test/mock-tinypng-webservice/reset.php +2 -2
- test/mock-tinypng-webservice/shrink.php +16 -9
- test/unit/TinyCompressClientTest.php +48 -0
- test/unit/TinyCompressFopenTest.php +33 -0
- test/unit/TinyCompressNoClientTest.php +15 -0
- test/unit/TinyCompressNoCurlTest.php +0 -28
- test/unit/TinyCompressSharedTestCase.php +304 -0
- test/unit/TinyCompressTest.php +14 -17
- test/unit/TinyExceptionTest.php +25 -0
- test/unit/TinyImageDuplicateTest.php +70 -0
- test/unit/TinyImageEmptyTest.php +26 -0
- test/unit/TinyImageSizeTest.php +158 -0
- test/unit/TinyImageTest.php +124 -0
- test/unit/TinyMetadataImageTest.php +0 -155
- test/unit/TinyMetadataTest.php +0 -82
- test/unit/TinyPluginTest.php +203 -195
- test/unit/TinySettingsTest.php +251 -169
- test/unit/TinyTestCase.php +79 -30
- test/unit/TinyWpBaseTest.php +15 -16
- test/wp-includes/version.php +7 -0
- tiny-compress-images.php +17 -17
.gitignore
CHANGED
@@ -1,5 +1,7 @@
|
|
1 |
*.log
|
|
|
2 |
/vendor
|
3 |
.DS_Store
|
4 |
/tmp/*
|
5 |
!/tmp/.gitkeep
|
|
1 |
*.log
|
2 |
+
*.bak
|
3 |
/vendor
|
4 |
.DS_Store
|
5 |
/tmp/*
|
6 |
!/tmp/.gitkeep
|
7 |
+
/src/languages/
|
.travis.yml
CHANGED
@@ -4,9 +4,76 @@ php:
|
|
4 |
- 5.4
|
5 |
- 5.5
|
6 |
- 5.6
|
|
|
7 |
- hhvm
|
8 |
-
|
9 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
notifications:
|
11 |
email: false
|
12 |
slack:
|
4 |
- 5.4
|
5 |
- 5.5
|
6 |
- 5.6
|
7 |
+
- 7.0
|
8 |
- hhvm
|
9 |
+
matrix:
|
10 |
+
include:
|
11 |
+
- dist: trusty
|
12 |
+
php: 7.0
|
13 |
+
env: WORDPRESS_VERSION=45 INTEGRATION_TESTS=true
|
14 |
+
script: bin/integration-tests
|
15 |
+
- dist: trusty
|
16 |
+
php: 7.0
|
17 |
+
env: WORDPRESS_VERSION=44 INTEGRATION_TESTS=true
|
18 |
+
script: bin/integration-tests
|
19 |
+
- dist: trusty
|
20 |
+
php: 7.0
|
21 |
+
env: WORDPRESS_VERSION=43 INTEGRATION_TESTS=true
|
22 |
+
script: bin/integration-tests
|
23 |
+
- dist: trusty
|
24 |
+
php: 7.0
|
25 |
+
env: WORDPRESS_VERSION=42 INTEGRATION_TESTS=true
|
26 |
+
script: bin/integration-tests
|
27 |
+
- dist: trusty
|
28 |
+
php: 7.0
|
29 |
+
env: WORDPRESS_VERSION=41 INTEGRATION_TESTS=true
|
30 |
+
script: bin/integration-tests
|
31 |
+
- dist: trusty
|
32 |
+
php: 7.0
|
33 |
+
env: WORDPRESS_VERSION=40 INTEGRATION_TESTS=true
|
34 |
+
script: bin/integration-tests
|
35 |
+
- dist: trusty
|
36 |
+
php: 7.0
|
37 |
+
env: WORDPRESS_VERSION=39 INTEGRATION_TESTS=true
|
38 |
+
script: bin/integration-tests
|
39 |
+
- dist: trusty
|
40 |
+
php: 7.0
|
41 |
+
env: WORDPRESS_VERSION=38 INTEGRATION_TESTS=true
|
42 |
+
script: bin/integration-tests
|
43 |
+
- dist: trusty
|
44 |
+
php: 7.0
|
45 |
+
env: WORDPRESS_VERSION=37 INTEGRATION_TESTS=true
|
46 |
+
script: bin/integration-tests
|
47 |
+
- dist: trusty
|
48 |
+
php: 7.0
|
49 |
+
env: WORDPRESS_VERSION=36 INTEGRATION_TESTS=true
|
50 |
+
script: bin/integration-tests
|
51 |
+
- dist: trusty
|
52 |
+
php: 7.0
|
53 |
+
env: WORDPRESS_VERSION=35 INTEGRATION_TESTS=true
|
54 |
+
script: bin/integration-tests
|
55 |
+
- dist: trusty
|
56 |
+
php: 7.0
|
57 |
+
env: WORDPRESS_VERSION=34 INTEGRATION_TESTS=true
|
58 |
+
script: bin/integration-tests
|
59 |
+
- dist: trusty
|
60 |
+
php: 7.0
|
61 |
+
env: WORDPRESS_VERSION=33 INTEGRATION_TESTS=true
|
62 |
+
script: bin/integration-tests
|
63 |
+
- dist: trusty
|
64 |
+
php: 7.0
|
65 |
+
env: WORDPRESS_VERSION=32 INTEGRATION_TESTS=true
|
66 |
+
script: bin/integration-tests
|
67 |
+
- dist: trusty
|
68 |
+
php: 7.0
|
69 |
+
env: WORDPRESS_VERSION=31 INTEGRATION_TESTS=true
|
70 |
+
script: bin/integration-tests
|
71 |
+
install:
|
72 |
+
- composer install
|
73 |
+
- if [[ "$INTEGRATION_TESTS" == "true" ]]; then sudo bin/install-docker; fi
|
74 |
+
script:
|
75 |
+
- bin/unit-tests
|
76 |
+
- bin/check-style --warning-severity=0 src
|
77 |
notifications:
|
78 |
email: false
|
79 |
slack:
|
README.md
CHANGED
@@ -17,23 +17,21 @@ Got questions or feedback? Let us know! Contact us at support@tinypng.com.
|
|
17 |
## Information for plugin contributors
|
18 |
|
19 |
### Prerequisites
|
20 |
-
* A working Docker installation (https://docs.docker.com/installation/).
|
21 |
* Composer (https://getcomposer.org/download/).
|
22 |
* PhantomJS 2.1 or greater (http://phantomjs.org).
|
23 |
* MySQL client and admin tools.
|
24 |
|
25 |
### Running the plugin in WordPress
|
26 |
-
1. Run `bin/run-wordpress <version>`. E.g. `bin/run-wordpress
|
27 |
-
2.
|
28 |
|
29 |
### Running the unit tests
|
30 |
-
1. Run `bin/unit-tests
|
31 |
|
32 |
### Running the integration tests
|
33 |
-
1.
|
34 |
-
2. Run `bin/integration-tests
|
35 |
-
added, all versions between $version and $to_version are tested). E.g.
|
36 |
-
`bin/integration-tests 41` or `bin/integration-tests 40 42`.
|
37 |
|
38 |
### Translating the plugin
|
39 |
Language packs will be generated for the plugin once translations for a
|
@@ -41,6 +39,14 @@ language are 100% filled in and approved.
|
|
41 |
|
42 |
See https://translate.wordpress.org/projects/wp-plugins/tiny-compress-images.
|
43 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
44 |
## License
|
45 |
|
46 |
Copyright (C) 2015-2016 Voormedia B.V.
|
17 |
## Information for plugin contributors
|
18 |
|
19 |
### Prerequisites
|
20 |
+
* A working Docker 1.12+ and Docker Compose installation (https://docs.docker.com/installation/).
|
21 |
* Composer (https://getcomposer.org/download/).
|
22 |
* PhantomJS 2.1 or greater (http://phantomjs.org).
|
23 |
* MySQL client and admin tools.
|
24 |
|
25 |
### Running the plugin in WordPress
|
26 |
+
1. Run `bin/run-wordpress <version>`. E.g. `bin/run-wordpress 45`.
|
27 |
+
2. Connect to Wordpress on port `80<version>` (e.g. port `8045`).
|
28 |
|
29 |
### Running the unit tests
|
30 |
+
1. Run `bin/unit-tests <optional path to file>`.
|
31 |
|
32 |
### Running the integration tests
|
33 |
+
1. Install Docker 1.12 and docker-compose.
|
34 |
+
2. Run `bin/integration-tests <version>`. E.g. `bin/integration-tests 45`.
|
|
|
|
|
35 |
|
36 |
### Translating the plugin
|
37 |
Language packs will be generated for the plugin once translations for a
|
39 |
|
40 |
See https://translate.wordpress.org/projects/wp-plugins/tiny-compress-images.
|
41 |
|
42 |
+
For development you may create .po and .mo files for a each language. The .mo
|
43 |
+
files can be created with [gettext](https://www.gnu.org/software/gettext/).
|
44 |
+
Install gettext and generate the .mo language file do the following:
|
45 |
+
|
46 |
+
1. Install gettext for example run `brew install gettext`.
|
47 |
+
2. Add a link msgfmt `ln -s /usr/local/Cellar/gettext/0.19.7/bin/msgfmt ~/.bin`.
|
48 |
+
3. Generate the .mo files `bin/format-language-files`.
|
49 |
+
|
50 |
## License
|
51 |
|
52 |
Copyright (C) 2015-2016 Voormedia B.V.
|
RELEASE
CHANGED
@@ -9,7 +9,7 @@ In order to release a new version of the plugin to wordpress.org, perform the fo
|
|
9 |
7. Locally, checkout the new tag: `git checkout <tagged version>`.
|
10 |
8. If not already done so, checkout the plugin's Subversion repository: `svn co http://plugins.svn.wordpress.org/tiny-compress-images`.
|
11 |
9. Run `svn update` when the Subversion repository already existed.
|
12 |
-
10. Update svn:ignore property of trunk when .gitignore is updated: `svn propedit svn:ignore trunk`.
|
13 |
11. Delete everything in trunk `rm -rf <path-to-local-svn-repo/trunk/*`.
|
14 |
12. Manually copy the Git release to the local Subversion repo: `git ls-files | xargs tar c | tar x -C <path-to-local-svn-repo>/trunk/`.
|
15 |
13. Add new files `svn st | awk '/^\?/ { print $2; }' | xargs svn add`.
|
9 |
7. Locally, checkout the new tag: `git checkout <tagged version>`.
|
10 |
8. If not already done so, checkout the plugin's Subversion repository: `svn co http://plugins.svn.wordpress.org/tiny-compress-images`.
|
11 |
9. Run `svn update` when the Subversion repository already existed.
|
12 |
+
10. Update svn:ignore property of trunk when .gitignore is updated: `svn propedit svn:ignore trunk`. Make sure src/vendor/* is NOT ignored in SVN.
|
13 |
11. Delete everything in trunk `rm -rf <path-to-local-svn-repo/trunk/*`.
|
14 |
12. Manually copy the Git release to the local Subversion repo: `git ls-files | xargs tar c | tar x -C <path-to-local-svn-repo>/trunk/`.
|
15 |
13. Add new files `svn st | awk '/^\?/ { print $2; }' | xargs svn add`.
|
bin/check-style
ADDED
@@ -0,0 +1,2 @@
|
|
|
|
|
1 |
+
#!/bin/bash
|
2 |
+
vendor/bin/phpcs --standard=phpcs.xml "$@"
|
bin/docker-functions
DELETED
@@ -1,69 +0,0 @@
|
|
1 |
-
#!/bin/bash
|
2 |
-
|
3 |
-
build_wordpress_image() {
|
4 |
-
docker build -t "wordpress-$version" - < "$DIR/../config/$dockerfile"
|
5 |
-
}
|
6 |
-
|
7 |
-
build_phantomjs_image() {
|
8 |
-
docker build -t phantomjs - < $DIR/../config/Dockerfile-phantomjs
|
9 |
-
}
|
10 |
-
|
11 |
-
build_mock_tinypng_webservice_image() {
|
12 |
-
docker build -t mock-tinypng-webservice - < $DIR/../config/Dockerfile-mock-tinypng-webservice
|
13 |
-
}
|
14 |
-
|
15 |
-
run_phantomjs() {
|
16 |
-
if docker ps -a | grep -q phantomjs
|
17 |
-
then
|
18 |
-
docker rm -f phantomjs
|
19 |
-
fi
|
20 |
-
|
21 |
-
echo "Starting PhantomJS container..."
|
22 |
-
docker run --name phantomjs \
|
23 |
-
--link "wordpress$version":wordpress \
|
24 |
-
--detach=false phantomjs
|
25 |
-
}
|
26 |
-
|
27 |
-
run_wordpress() {
|
28 |
-
if docker ps --filter status=running | grep -q "wordpress$version"
|
29 |
-
then
|
30 |
-
docker stop "wordpress$version"
|
31 |
-
fi
|
32 |
-
|
33 |
-
if docker ps -a | grep -q "wordpress$version"
|
34 |
-
then
|
35 |
-
docker rm "wordpress$version"
|
36 |
-
fi
|
37 |
-
|
38 |
-
docker run --name "wordpress$version" \
|
39 |
-
--volume="$DIR/../":/var/www/html/wp-content/plugins/tinypng-image-compression \
|
40 |
-
--link mysql-wordpress:mysql \
|
41 |
-
--link mock-tinypng-webservice:webservice \
|
42 |
-
-d -p "80$version":80 -e WORDPRESS_DB_NAME="wordpress_$version" "wordpress-$version"
|
43 |
-
}
|
44 |
-
|
45 |
-
run_mysql() {
|
46 |
-
if ! docker ps --filter status=running | grep -q mysql-wordpress
|
47 |
-
then
|
48 |
-
echo "Starting MySQL container..."
|
49 |
-
if docker ps -a | grep -q "mysql-wordpress"
|
50 |
-
then
|
51 |
-
docker start "mysql-wordpress"
|
52 |
-
else
|
53 |
-
docker run --name mysql-wordpress -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql:5.5
|
54 |
-
fi
|
55 |
-
fi
|
56 |
-
}
|
57 |
-
|
58 |
-
run_mock_tinypng_webservice() {
|
59 |
-
if docker ps -a | grep -q mock-tinypng-webservice
|
60 |
-
then
|
61 |
-
docker rm -f mock-tinypng-webservice
|
62 |
-
fi
|
63 |
-
|
64 |
-
echo "Starting mock TinyPNG webservice container..."
|
65 |
-
docker run --name mock-tinypng-webservice \
|
66 |
-
--volume="$DIR/../test/mock-tinypng-webservice":/var/www/html \
|
67 |
-
-p 8080:80 \
|
68 |
-
-d mock-tinypng-webservice
|
69 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bin/format-language-files
ADDED
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/usr/bin/env perl
|
2 |
+
|
3 |
+
use strict;
|
4 |
+
use warnings;
|
5 |
+
use File::Basename qw(dirname fileparse);
|
6 |
+
|
7 |
+
my $dir = dirname($0);
|
8 |
+
open FIND, "find $dir/../src/languages -type f -name '*.po' |";
|
9 |
+
while (<FIND>) {
|
10 |
+
chomp;
|
11 |
+
my ($name,$path,$suffix) = fileparse($_, qr/[.][^.]*/);
|
12 |
+
print "$name\n";
|
13 |
+
system "msgfmt", "-o", "$path$name.mo", "$path$name$suffix";
|
14 |
+
}
|
15 |
+
close FIND;
|
bin/format-style
ADDED
@@ -0,0 +1,2 @@
|
|
|
|
|
1 |
+
#!/bin/bash
|
2 |
+
vendor/bin/phpcbf --standard=phpcs.xml "$@"
|
bin/install-docker
ADDED
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/bin/bash -x
|
2 |
+
|
3 |
+
# Copyright 2016 go-dockerclient authors. All rights reserved.
|
4 |
+
# Use of this source code is governed by a BSD-style
|
5 |
+
# license that can be found in the LICENSE file.
|
6 |
+
|
7 |
+
DOCKER_VERSION=1.12.0~rc2
|
8 |
+
LSB_RELEASE=$(lsb_release -cs)
|
9 |
+
OS_NAME=$(uname -s)
|
10 |
+
OS_ARCH=$(uname -m)
|
11 |
+
|
12 |
+
stop docker || true
|
13 |
+
rm -rf /var/lib/docker
|
14 |
+
rm -f $(which docker)
|
15 |
+
rm -f $(which docker-compose)
|
16 |
+
|
17 |
+
set -e
|
18 |
+
apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
|
19 |
+
echo "deb https://apt.dockerproject.org/repo ubuntu-trusty main" | tee /etc/apt/sources.list.d/docker.list
|
20 |
+
echo "deb https://apt.dockerproject.org/repo ubuntu-trusty testing" | tee -a /etc/apt/sources.list.d/docker.list
|
21 |
+
apt-get update
|
22 |
+
apt-get install docker-engine=${DOCKER_VERSION}-0~${LSB_RELEASE} -y --force-yes -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold"
|
23 |
+
|
24 |
+
curl -L https://github.com/docker/compose/releases/download/1.8.0-rc1/docker-compose-${OS_NAME}-${OS_ARCH} > /usr/local/bin/docker-compose
|
25 |
+
chmod +x /usr/local/bin/docker-compose
|
bin/integration-tests
CHANGED
@@ -1,57 +1,82 @@
|
|
1 |
-
#!/
|
2 |
-
|
3 |
-
|
4 |
-
|
5 |
-
|
6 |
-
|
7 |
-
|
8 |
-
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
if
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
next;
|
50 |
-
}
|
51 |
-
print(" - Testing\n");
|
52 |
-
$ret = system("$dir/test-wordpress $version");
|
53 |
-
if ($ret) {
|
54 |
-
print(" Error: $ret\n");
|
55 |
-
next;
|
56 |
-
}
|
57 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/bin/bash
|
2 |
+
|
3 |
+
display_usage() {
|
4 |
+
echo -e "Usage:\n\t$0 <version> \n\nExample:\n\t$0 45"
|
5 |
+
}
|
6 |
+
|
7 |
+
if [ -z "${HOST}" ]; then
|
8 |
+
export HOST=127.0.0.1
|
9 |
+
fi
|
10 |
+
|
11 |
+
if [ -z "${WORDPRESS_VERSION}" ]; then
|
12 |
+
if [ $# -eq 0 ]; then
|
13 |
+
display_usage
|
14 |
+
exit 1
|
15 |
+
fi
|
16 |
+
|
17 |
+
export WORDPRESS_VERSION="$1"
|
18 |
+
fi
|
19 |
+
|
20 |
+
export MYSQL_PWD=root
|
21 |
+
export WORDPRESS_DATABASE=wordpress_${WORDPRESS_VERSION}
|
22 |
+
export WORDPRESS_PORT=80${WORDPRESS_VERSION}
|
23 |
+
export WORDPRESS_URL=http://wordpress
|
24 |
+
|
25 |
+
function wait_for_service_port {
|
26 |
+
while ! curl -s localhost:$1 > /dev/null; do
|
27 |
+
sleep 0.25
|
28 |
+
done
|
29 |
+
}
|
30 |
+
|
31 |
+
function prepare_test_config {
|
32 |
+
mv src/config/tiny-config.php src/config/tiny-config.php.bak
|
33 |
+
mv src/vendor/tinify/Tinify/Client.php src/vendor/tinify/Tinify/Client.php.bak
|
34 |
+
cp test/fixtures/tiny-config.php src/config/tiny-config.php
|
35 |
+
cp test/fixtures/Client.php src/vendor/tinify/Tinify/Client.php
|
36 |
+
}
|
37 |
+
|
38 |
+
function restore_config {
|
39 |
+
mv src/config/tiny-config.php.bak src/config/tiny-config.php
|
40 |
+
mv src/vendor/tinify/Tinify/Client.php.bak src/vendor/tinify/Tinify/Client.php
|
41 |
+
}
|
42 |
+
|
43 |
+
function start_services {
|
44 |
+
if [ "${KEEP_ALIVE}" ]; then
|
45 |
+
docker-compose up -d --build > /dev/null || { trap - EXIT; exit 1; }
|
46 |
+
else
|
47 |
+
docker-compose up -d --build --force-recreate > /dev/null || { trap - EXIT; exit 1; }
|
48 |
+
fi
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
49 |
}
|
50 |
+
|
51 |
+
function stop_services {
|
52 |
+
docker-compose down
|
53 |
+
}
|
54 |
+
|
55 |
+
function wait_for_services {
|
56 |
+
echo "Waiting for PhantomJS..."
|
57 |
+
wait_for_service_port 8910
|
58 |
+
|
59 |
+
echo "Waiting for WordPress..."
|
60 |
+
wait_for_service_port 80${WORDPRESS_VERSION}
|
61 |
+
|
62 |
+
echo "Waiting for MySQL..."
|
63 |
+
wait_for_service_port 3306
|
64 |
+
}
|
65 |
+
|
66 |
+
function setup {
|
67 |
+
prepare_test_config
|
68 |
+
start_services
|
69 |
+
wait_for_services
|
70 |
+
}
|
71 |
+
|
72 |
+
function teardown {
|
73 |
+
restore_config
|
74 |
+
if ! [ "${KEEP_ALIVE}" ]; then
|
75 |
+
stop_services
|
76 |
+
fi
|
77 |
+
}
|
78 |
+
|
79 |
+
trap teardown EXIT
|
80 |
+
setup
|
81 |
+
|
82 |
+
vendor/bin/phpunit test/integration
|
bin/post-install
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
1 |
+
#!/bin/bash
|
2 |
+
rm -rf src/vendor
|
3 |
+
mkdir src/vendor
|
4 |
+
cp -R vendor/tinify/tinify/lib src/vendor/tinify
|
bin/restore-wordpress
DELETED
@@ -1,35 +0,0 @@
|
|
1 |
-
#!/bin/bash
|
2 |
-
|
3 |
-
set -e
|
4 |
-
|
5 |
-
display_usage() {
|
6 |
-
echo -e "Usage:\n\t$0 <version> \n\nExample:\n\t$0 41"
|
7 |
-
}
|
8 |
-
|
9 |
-
if [ $# -ne 1 ]
|
10 |
-
then
|
11 |
-
display_usage
|
12 |
-
exit 1
|
13 |
-
fi
|
14 |
-
|
15 |
-
version="$1"
|
16 |
-
DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
|
17 |
-
source $DIR/docker-functions
|
18 |
-
|
19 |
-
export WORDPRESS_VERSION=$version
|
20 |
-
export WORDPRESS_DATABASE=wordpress_$version
|
21 |
-
export MYSQL_ROOT_PASSWORD=root
|
22 |
-
|
23 |
-
if hash docker-machine 2>/dev/null; then
|
24 |
-
export HOST_IP=$(docker-machine ip $DOCKER_MACHINE_NAME)
|
25 |
-
else
|
26 |
-
export HOST_IP=$(boot2docker ip)
|
27 |
-
fi
|
28 |
-
if [ -z "$HOST_IP" ]; then
|
29 |
-
echo "Could not find docker machine ip"
|
30 |
-
exit 2
|
31 |
-
fi
|
32 |
-
|
33 |
-
export MYSQL_DUMP_FILE=tmp/mysqldump_wordpress_$version.sql.gz
|
34 |
-
|
35 |
-
gunzip -c < $MYSQL_DUMP_FILE | mysql -h $HOST_IP -u root "-p$MYSQL_ROOT_PASSWORD" $WORDPRESS_DATABASE
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bin/run-wordpress
CHANGED
@@ -1,31 +1,25 @@
|
|
1 |
#!/bin/bash
|
2 |
|
3 |
-
set -e
|
4 |
-
|
5 |
display_usage() {
|
6 |
-
echo -e "Usage:\n\t$0 <version> \n\nExample:\n\t$0
|
7 |
}
|
8 |
|
9 |
-
if [
|
10 |
-
then
|
11 |
-
|
12 |
-
|
|
|
|
|
|
|
13 |
fi
|
14 |
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
source $DIR/docker-functions
|
19 |
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
exit 1
|
24 |
-
fi
|
25 |
|
26 |
-
|
27 |
-
|
28 |
-
build_mock_tinypng_webservice_image
|
29 |
-
run_mock_tinypng_webservice
|
30 |
-
build_wordpress_image
|
31 |
-
run_wordpress
|
1 |
#!/bin/bash
|
2 |
|
|
|
|
|
3 |
display_usage() {
|
4 |
+
echo -e "Usage:\n\t$0 <version> \n\nExample:\n\t$0 45"
|
5 |
}
|
6 |
|
7 |
+
if [ -z "${WORDPRESS_VERSION}" ]; then
|
8 |
+
if [ $# -eq 0 ]; then
|
9 |
+
display_usage
|
10 |
+
exit 1
|
11 |
+
fi
|
12 |
+
|
13 |
+
export WORDPRESS_VERSION="$1"
|
14 |
fi
|
15 |
|
16 |
+
function stop_services {
|
17 |
+
docker-compose down
|
18 |
+
}
|
|
|
19 |
|
20 |
+
function teardown {
|
21 |
+
stop_services
|
22 |
+
}
|
|
|
|
|
23 |
|
24 |
+
trap teardown EXIT
|
25 |
+
docker-compose up --build
|
|
|
|
|
|
|
|
bin/test-wordpress
DELETED
@@ -1,57 +0,0 @@
|
|
1 |
-
#!/bin/bash
|
2 |
-
|
3 |
-
set -e
|
4 |
-
|
5 |
-
display_usage() {
|
6 |
-
echo -e "Usage:\n\t$0 <version> [IntegrationTestFile.php] \n\nExample:\n\t$0 41"
|
7 |
-
}
|
8 |
-
|
9 |
-
if [ $# -eq 0 ]
|
10 |
-
then
|
11 |
-
display_usage
|
12 |
-
exit 1
|
13 |
-
fi
|
14 |
-
|
15 |
-
version="$1"
|
16 |
-
DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
|
17 |
-
source $DIR/docker-functions
|
18 |
-
|
19 |
-
if [ $# -ge 2 ]
|
20 |
-
then
|
21 |
-
PHPUNIT_ARG="$2"
|
22 |
-
else
|
23 |
-
PHPUNIT_ARG="test/integration"
|
24 |
-
fi
|
25 |
-
|
26 |
-
export WORDPRESS_VERSION=$version
|
27 |
-
export WORDPRESS_DATABASE=wordpress_$version
|
28 |
-
export MYSQL_ROOT_PASSWORD=root
|
29 |
-
|
30 |
-
if hash docker-machine 2>/dev/null; then
|
31 |
-
export HOST_IP=$(docker-machine ip $DOCKER_MACHINE_NAME)
|
32 |
-
else
|
33 |
-
export HOST_IP=$(boot2docker ip)
|
34 |
-
fi
|
35 |
-
if [ -z "$HOST_IP" ]; then
|
36 |
-
echo "Could not find docker machine ip"
|
37 |
-
exit 2
|
38 |
-
fi
|
39 |
-
|
40 |
-
export HOST_PORT=80$version
|
41 |
-
export WORDPRESS_URL=http://$HOST_IP:$HOST_PORT
|
42 |
-
|
43 |
-
function prepare_test_config {
|
44 |
-
printf "\nPreparing test config\n\n"
|
45 |
-
mv src/config/tiny-config.php src/config/tiny-config.php.bak
|
46 |
-
cp test/fixtures/tiny-config.php src/config/tiny-config.php
|
47 |
-
}
|
48 |
-
|
49 |
-
function restore_config {
|
50 |
-
printf "\n\nRestoring config\n\n"
|
51 |
-
mv src/config/tiny-config.php.bak src/config/tiny-config.php
|
52 |
-
}
|
53 |
-
|
54 |
-
trap 'restore_config' EXIT
|
55 |
-
|
56 |
-
prepare_test_config
|
57 |
-
vendor/bin/phpunit "$PHPUNIT_ARG"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bin/unit-tests
CHANGED
@@ -1,3 +1,2 @@
|
|
1 |
-
#!/bin/
|
2 |
-
|
3 |
-
vendor/bin/phpunit --process-isolation test/unit $@
|
1 |
+
#!/bin/bash
|
2 |
+
vendor/bin/phpunit test/unit $@
|
|
composer.json
CHANGED
@@ -3,7 +3,15 @@
|
|
3 |
"description": "Speed up your website. Optimize your JPEG and PNG images automatically with TinyPNG.",
|
4 |
"license": "GPL-2.0+",
|
5 |
"type": "wordpress-plugin",
|
6 |
-
"keywords": [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7 |
"require": {
|
8 |
"php": ">=5.3.0",
|
9 |
"composer/installers": "~1.0"
|
@@ -12,6 +20,15 @@
|
|
12 |
"phpunit/phpunit": "~4.6",
|
13 |
"facebook/webdriver": "~1.1",
|
14 |
"mikey179/vfsStream": "~1.5",
|
15 |
-
"mockery/mockery": "~0.9"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
16 |
}
|
17 |
}
|
3 |
"description": "Speed up your website. Optimize your JPEG and PNG images automatically with TinyPNG.",
|
4 |
"license": "GPL-2.0+",
|
5 |
"type": "wordpress-plugin",
|
6 |
+
"keywords": [
|
7 |
+
"plugin"
|
8 |
+
],
|
9 |
+
"repositories": [
|
10 |
+
{
|
11 |
+
"type": "vcs",
|
12 |
+
"url": "https://github.com/tinify/tinify-php"
|
13 |
+
}
|
14 |
+
],
|
15 |
"require": {
|
16 |
"php": ">=5.3.0",
|
17 |
"composer/installers": "~1.0"
|
20 |
"phpunit/phpunit": "~4.6",
|
21 |
"facebook/webdriver": "~1.1",
|
22 |
"mikey179/vfsStream": "~1.5",
|
23 |
+
"mockery/mockery": "~0.9",
|
24 |
+
"phpdocumentor/reflection-docblock": "~2.0",
|
25 |
+
"symfony/yaml": "~2.8",
|
26 |
+
"squizlabs/php_codesniffer": "~2.2",
|
27 |
+
"tinify/tinify": "dev-create-key",
|
28 |
+
"wp-coding-standards/wpcs": "dev-master"
|
29 |
+
},
|
30 |
+
"scripts": {
|
31 |
+
"post-install-cmd": "bin/post-install",
|
32 |
+
"post-update-cmd": "bin/post-install"
|
33 |
}
|
34 |
}
|
composer.lock
CHANGED
@@ -1,27 +1,28 @@
|
|
1 |
{
|
2 |
"_readme": [
|
3 |
"This file locks the dependencies of your project to a known state",
|
4 |
-
"Read more about it at
|
5 |
"This file is @generated automatically"
|
6 |
],
|
7 |
-
"hash": "
|
|
|
8 |
"packages": [
|
9 |
{
|
10 |
"name": "composer/installers",
|
11 |
-
"version": "v1.0
|
12 |
"source": {
|
13 |
"type": "git",
|
14 |
"url": "https://github.com/composer/installers.git",
|
15 |
-
"reference": "
|
16 |
},
|
17 |
"dist": {
|
18 |
"type": "zip",
|
19 |
-
"url": "https://api.github.com/repos/composer/installers/zipball/
|
20 |
-
"reference": "
|
21 |
"shasum": ""
|
22 |
},
|
23 |
"require": {
|
24 |
-
"composer-plugin-api": "1.0
|
25 |
},
|
26 |
"replace": {
|
27 |
"roundcube/plugin-installer": "*",
|
@@ -39,8 +40,8 @@
|
|
39 |
}
|
40 |
},
|
41 |
"autoload": {
|
42 |
-
"psr-
|
43 |
-
"Composer\\Installers\\": "src/"
|
44 |
}
|
45 |
},
|
46 |
"notification-url": "https://packagist.org/downloads/",
|
@@ -55,13 +56,16 @@
|
|
55 |
}
|
56 |
],
|
57 |
"description": "A multi-framework Composer library installer",
|
58 |
-
"homepage": "
|
59 |
"keywords": [
|
60 |
"Craft",
|
61 |
"Dolibarr",
|
62 |
"Hurad",
|
|
|
63 |
"MODX Evo",
|
|
|
64 |
"OXID",
|
|
|
65 |
"SMF",
|
66 |
"Thelia",
|
67 |
"WolfCMS",
|
@@ -77,6 +81,7 @@
|
|
77 |
"dokuwiki",
|
78 |
"drupal",
|
79 |
"elgg",
|
|
|
80 |
"fuelphp",
|
81 |
"grav",
|
82 |
"installer",
|
@@ -102,7 +107,7 @@
|
|
102 |
"zend",
|
103 |
"zikula"
|
104 |
],
|
105 |
-
"time": "
|
106 |
}
|
107 |
],
|
108 |
"packages-dev": [
|
@@ -162,19 +167,20 @@
|
|
162 |
},
|
163 |
{
|
164 |
"name": "facebook/webdriver",
|
165 |
-
"version": "1.1.
|
166 |
"source": {
|
167 |
"type": "git",
|
168 |
"url": "https://github.com/facebook/php-webdriver.git",
|
169 |
-
"reference": "
|
170 |
},
|
171 |
"dist": {
|
172 |
"type": "zip",
|
173 |
-
"url": "https://api.github.com/repos/facebook/php-webdriver/zipball/
|
174 |
-
"reference": "
|
175 |
"shasum": ""
|
176 |
},
|
177 |
"require": {
|
|
|
178 |
"php": ">=5.3.19"
|
179 |
},
|
180 |
"require-dev": {
|
@@ -201,7 +207,7 @@
|
|
201 |
"selenium",
|
202 |
"webdriver"
|
203 |
],
|
204 |
-
"time": "
|
205 |
},
|
206 |
{
|
207 |
"name": "hamcrest/hamcrest-php",
|
@@ -250,16 +256,16 @@
|
|
250 |
},
|
251 |
{
|
252 |
"name": "mikey179/vfsStream",
|
253 |
-
"version": "v1.6.
|
254 |
"source": {
|
255 |
"type": "git",
|
256 |
"url": "https://github.com/mikey179/vfsStream.git",
|
257 |
-
"reference": "
|
258 |
},
|
259 |
"dist": {
|
260 |
"type": "zip",
|
261 |
-
"url": "https://api.github.com/repos/mikey179/vfsStream/zipball/
|
262 |
-
"reference": "
|
263 |
"shasum": ""
|
264 |
},
|
265 |
"require": {
|
@@ -292,20 +298,20 @@
|
|
292 |
],
|
293 |
"description": "Virtual file system to mock the real file system in unit tests.",
|
294 |
"homepage": "http://vfs.bovigo.org/",
|
295 |
-
"time": "
|
296 |
},
|
297 |
{
|
298 |
"name": "mockery/mockery",
|
299 |
-
"version": "0.9.
|
300 |
"source": {
|
301 |
"type": "git",
|
302 |
"url": "https://github.com/padraic/mockery.git",
|
303 |
-
"reference": "
|
304 |
},
|
305 |
"dist": {
|
306 |
"type": "zip",
|
307 |
-
"url": "https://api.github.com/repos/padraic/mockery/zipball/
|
308 |
-
"reference": "
|
309 |
"shasum": ""
|
310 |
},
|
311 |
"require": {
|
@@ -357,7 +363,7 @@
|
|
357 |
"test double",
|
358 |
"testing"
|
359 |
],
|
360 |
-
"time": "
|
361 |
},
|
362 |
{
|
363 |
"name": "phpdocumentor/reflection-docblock",
|
@@ -410,30 +416,32 @@
|
|
410 |
},
|
411 |
{
|
412 |
"name": "phpspec/prophecy",
|
413 |
-
"version": "v1.
|
414 |
"source": {
|
415 |
"type": "git",
|
416 |
"url": "https://github.com/phpspec/prophecy.git",
|
417 |
-
"reference": "
|
418 |
},
|
419 |
"dist": {
|
420 |
"type": "zip",
|
421 |
-
"url": "https://api.github.com/repos/phpspec/prophecy/zipball/
|
422 |
-
"reference": "
|
423 |
"shasum": ""
|
424 |
},
|
425 |
"require": {
|
426 |
"doctrine/instantiator": "^1.0.2",
|
427 |
-
"
|
428 |
-
"
|
|
|
|
|
429 |
},
|
430 |
"require-dev": {
|
431 |
-
"phpspec/phpspec": "
|
432 |
},
|
433 |
"type": "library",
|
434 |
"extra": {
|
435 |
"branch-alias": {
|
436 |
-
"dev-master": "1.
|
437 |
}
|
438 |
},
|
439 |
"autoload": {
|
@@ -466,7 +474,7 @@
|
|
466 |
"spy",
|
467 |
"stub"
|
468 |
],
|
469 |
-
"time": "
|
470 |
},
|
471 |
{
|
472 |
"name": "phpunit/php-code-coverage",
|
@@ -620,21 +628,24 @@
|
|
620 |
},
|
621 |
{
|
622 |
"name": "phpunit/php-timer",
|
623 |
-
"version": "1.0.
|
624 |
"source": {
|
625 |
"type": "git",
|
626 |
"url": "https://github.com/sebastianbergmann/php-timer.git",
|
627 |
-
"reference": "
|
628 |
},
|
629 |
"dist": {
|
630 |
"type": "zip",
|
631 |
-
"url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/
|
632 |
-
"reference": "
|
633 |
"shasum": ""
|
634 |
},
|
635 |
"require": {
|
636 |
"php": ">=5.3.3"
|
637 |
},
|
|
|
|
|
|
|
638 |
"type": "library",
|
639 |
"autoload": {
|
640 |
"classmap": [
|
@@ -657,7 +668,7 @@
|
|
657 |
"keywords": [
|
658 |
"timer"
|
659 |
],
|
660 |
-
"time": "
|
661 |
},
|
662 |
{
|
663 |
"name": "phpunit/php-token-stream",
|
@@ -710,16 +721,16 @@
|
|
710 |
},
|
711 |
{
|
712 |
"name": "phpunit/phpunit",
|
713 |
-
"version": "4.8.
|
714 |
"source": {
|
715 |
"type": "git",
|
716 |
"url": "https://github.com/sebastianbergmann/phpunit.git",
|
717 |
-
"reference": "
|
718 |
},
|
719 |
"dist": {
|
720 |
"type": "zip",
|
721 |
-
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/
|
722 |
-
"reference": "
|
723 |
"shasum": ""
|
724 |
},
|
725 |
"require": {
|
@@ -733,7 +744,7 @@
|
|
733 |
"phpunit/php-code-coverage": "~2.1",
|
734 |
"phpunit/php-file-iterator": "~1.4",
|
735 |
"phpunit/php-text-template": "~1.2",
|
736 |
-
"phpunit/php-timer": "
|
737 |
"phpunit/phpunit-mock-objects": "~2.3",
|
738 |
"sebastian/comparator": "~1.1",
|
739 |
"sebastian/diff": "~1.2",
|
@@ -778,7 +789,7 @@
|
|
778 |
"testing",
|
779 |
"xunit"
|
780 |
],
|
781 |
-
"time": "
|
782 |
},
|
783 |
{
|
784 |
"name": "phpunit/phpunit-mock-objects",
|
@@ -902,28 +913,28 @@
|
|
902 |
},
|
903 |
{
|
904 |
"name": "sebastian/diff",
|
905 |
-
"version": "1.
|
906 |
"source": {
|
907 |
"type": "git",
|
908 |
"url": "https://github.com/sebastianbergmann/diff.git",
|
909 |
-
"reference": "
|
910 |
},
|
911 |
"dist": {
|
912 |
"type": "zip",
|
913 |
-
"url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/
|
914 |
-
"reference": "
|
915 |
"shasum": ""
|
916 |
},
|
917 |
"require": {
|
918 |
"php": ">=5.3.3"
|
919 |
},
|
920 |
"require-dev": {
|
921 |
-
"phpunit/phpunit": "~4.
|
922 |
},
|
923 |
"type": "library",
|
924 |
"extra": {
|
925 |
"branch-alias": {
|
926 |
-
"dev-master": "1.
|
927 |
}
|
928 |
},
|
929 |
"autoload": {
|
@@ -946,24 +957,24 @@
|
|
946 |
}
|
947 |
],
|
948 |
"description": "Diff implementation",
|
949 |
-
"homepage": "
|
950 |
"keywords": [
|
951 |
"diff"
|
952 |
],
|
953 |
-
"time": "2015-
|
954 |
},
|
955 |
{
|
956 |
"name": "sebastian/environment",
|
957 |
-
"version": "1.3.
|
958 |
"source": {
|
959 |
"type": "git",
|
960 |
"url": "https://github.com/sebastianbergmann/environment.git",
|
961 |
-
"reference": "
|
962 |
},
|
963 |
"dist": {
|
964 |
"type": "zip",
|
965 |
-
"url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/
|
966 |
-
"reference": "
|
967 |
"shasum": ""
|
968 |
},
|
969 |
"require": {
|
@@ -1000,20 +1011,20 @@
|
|
1000 |
"environment",
|
1001 |
"hhvm"
|
1002 |
],
|
1003 |
-
"time": "
|
1004 |
},
|
1005 |
{
|
1006 |
"name": "sebastian/exporter",
|
1007 |
-
"version": "1.2.
|
1008 |
"source": {
|
1009 |
"type": "git",
|
1010 |
"url": "https://github.com/sebastianbergmann/exporter.git",
|
1011 |
-
"reference": "
|
1012 |
},
|
1013 |
"dist": {
|
1014 |
"type": "zip",
|
1015 |
-
"url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/
|
1016 |
-
"reference": "
|
1017 |
"shasum": ""
|
1018 |
},
|
1019 |
"require": {
|
@@ -1021,12 +1032,13 @@
|
|
1021 |
"sebastian/recursion-context": "~1.0"
|
1022 |
},
|
1023 |
"require-dev": {
|
|
|
1024 |
"phpunit/phpunit": "~4.4"
|
1025 |
},
|
1026 |
"type": "library",
|
1027 |
"extra": {
|
1028 |
"branch-alias": {
|
1029 |
-
"dev-master": "1.
|
1030 |
}
|
1031 |
},
|
1032 |
"autoload": {
|
@@ -1066,7 +1078,7 @@
|
|
1066 |
"export",
|
1067 |
"exporter"
|
1068 |
],
|
1069 |
-
"time": "
|
1070 |
},
|
1071 |
{
|
1072 |
"name": "sebastian/global-state",
|
@@ -1121,16 +1133,16 @@
|
|
1121 |
},
|
1122 |
{
|
1123 |
"name": "sebastian/recursion-context",
|
1124 |
-
"version": "1.0.
|
1125 |
"source": {
|
1126 |
"type": "git",
|
1127 |
"url": "https://github.com/sebastianbergmann/recursion-context.git",
|
1128 |
-
"reference": "
|
1129 |
},
|
1130 |
"dist": {
|
1131 |
"type": "zip",
|
1132 |
-
"url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/
|
1133 |
-
"reference": "
|
1134 |
"shasum": ""
|
1135 |
},
|
1136 |
"require": {
|
@@ -1170,7 +1182,7 @@
|
|
1170 |
],
|
1171 |
"description": "Provides functionality to recursively process PHP variables",
|
1172 |
"homepage": "http://www.github.com/sebastianbergmann/recursion-context",
|
1173 |
-
"time": "2015-
|
1174 |
},
|
1175 |
{
|
1176 |
"name": "sebastian/version",
|
@@ -1207,18 +1219,96 @@
|
|
1207 |
"homepage": "https://github.com/sebastianbergmann/version",
|
1208 |
"time": "2015-06-21 13:59:46"
|
1209 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1210 |
{
|
1211 |
"name": "symfony/yaml",
|
1212 |
-
"version": "v2.
|
1213 |
"source": {
|
1214 |
"type": "git",
|
1215 |
"url": "https://github.com/symfony/yaml.git",
|
1216 |
-
"reference": "
|
1217 |
},
|
1218 |
"dist": {
|
1219 |
"type": "zip",
|
1220 |
-
"url": "https://api.github.com/repos/symfony/yaml/zipball/
|
1221 |
-
"reference": "
|
1222 |
"shasum": ""
|
1223 |
},
|
1224 |
"require": {
|
@@ -1227,13 +1317,16 @@
|
|
1227 |
"type": "library",
|
1228 |
"extra": {
|
1229 |
"branch-alias": {
|
1230 |
-
"dev-master": "2.
|
1231 |
}
|
1232 |
},
|
1233 |
"autoload": {
|
1234 |
"psr-4": {
|
1235 |
"Symfony\\Component\\Yaml\\": ""
|
1236 |
-
}
|
|
|
|
|
|
|
1237 |
},
|
1238 |
"notification-url": "https://packagist.org/downloads/",
|
1239 |
"license": [
|
@@ -1251,12 +1344,111 @@
|
|
1251 |
],
|
1252 |
"description": "Symfony Yaml Component",
|
1253 |
"homepage": "https://symfony.com",
|
1254 |
-
"time": "
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1255 |
}
|
1256 |
],
|
1257 |
"aliases": [],
|
1258 |
"minimum-stability": "stable",
|
1259 |
-
"stability-flags":
|
|
|
|
|
|
|
1260 |
"prefer-stable": false,
|
1261 |
"prefer-lowest": false,
|
1262 |
"platform": {
|
1 |
{
|
2 |
"_readme": [
|
3 |
"This file locks the dependencies of your project to a known state",
|
4 |
+
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
|
5 |
"This file is @generated automatically"
|
6 |
],
|
7 |
+
"hash": "a57757225d561a110b24be5d3693b09e",
|
8 |
+
"content-hash": "7f6c88906f0f6b5c11c990d665d5349e",
|
9 |
"packages": [
|
10 |
{
|
11 |
"name": "composer/installers",
|
12 |
+
"version": "v1.1.0",
|
13 |
"source": {
|
14 |
"type": "git",
|
15 |
"url": "https://github.com/composer/installers.git",
|
16 |
+
"reference": "a3595c5272a6f247228abb20076ed27321e4aae9"
|
17 |
},
|
18 |
"dist": {
|
19 |
"type": "zip",
|
20 |
+
"url": "https://api.github.com/repos/composer/installers/zipball/a3595c5272a6f247228abb20076ed27321e4aae9",
|
21 |
+
"reference": "a3595c5272a6f247228abb20076ed27321e4aae9",
|
22 |
"shasum": ""
|
23 |
},
|
24 |
"require": {
|
25 |
+
"composer-plugin-api": "^1.0"
|
26 |
},
|
27 |
"replace": {
|
28 |
"roundcube/plugin-installer": "*",
|
40 |
}
|
41 |
},
|
42 |
"autoload": {
|
43 |
+
"psr-4": {
|
44 |
+
"Composer\\Installers\\": "src/Composer/Installers"
|
45 |
}
|
46 |
},
|
47 |
"notification-url": "https://packagist.org/downloads/",
|
56 |
}
|
57 |
],
|
58 |
"description": "A multi-framework Composer library installer",
|
59 |
+
"homepage": "https://composer.github.io/installers/",
|
60 |
"keywords": [
|
61 |
"Craft",
|
62 |
"Dolibarr",
|
63 |
"Hurad",
|
64 |
+
"ImageCMS",
|
65 |
"MODX Evo",
|
66 |
+
"Mautic",
|
67 |
"OXID",
|
68 |
+
"RadPHP",
|
69 |
"SMF",
|
70 |
"Thelia",
|
71 |
"WolfCMS",
|
81 |
"dokuwiki",
|
82 |
"drupal",
|
83 |
"elgg",
|
84 |
+
"expressionengine",
|
85 |
"fuelphp",
|
86 |
"grav",
|
87 |
"installer",
|
107 |
"zend",
|
108 |
"zikula"
|
109 |
],
|
110 |
+
"time": "2016-07-05 06:18:20"
|
111 |
}
|
112 |
],
|
113 |
"packages-dev": [
|
167 |
},
|
168 |
{
|
169 |
"name": "facebook/webdriver",
|
170 |
+
"version": "1.1.2",
|
171 |
"source": {
|
172 |
"type": "git",
|
173 |
"url": "https://github.com/facebook/php-webdriver.git",
|
174 |
+
"reference": "0b889d7de7461439f8a3bbcca46e0f696cb27986"
|
175 |
},
|
176 |
"dist": {
|
177 |
"type": "zip",
|
178 |
+
"url": "https://api.github.com/repos/facebook/php-webdriver/zipball/0b889d7de7461439f8a3bbcca46e0f696cb27986",
|
179 |
+
"reference": "0b889d7de7461439f8a3bbcca46e0f696cb27986",
|
180 |
"shasum": ""
|
181 |
},
|
182 |
"require": {
|
183 |
+
"ext-curl": "*",
|
184 |
"php": ">=5.3.19"
|
185 |
},
|
186 |
"require-dev": {
|
207 |
"selenium",
|
208 |
"webdriver"
|
209 |
],
|
210 |
+
"time": "2016-06-04 00:02:34"
|
211 |
},
|
212 |
{
|
213 |
"name": "hamcrest/hamcrest-php",
|
256 |
},
|
257 |
{
|
258 |
"name": "mikey179/vfsStream",
|
259 |
+
"version": "v1.6.3",
|
260 |
"source": {
|
261 |
"type": "git",
|
262 |
"url": "https://github.com/mikey179/vfsStream.git",
|
263 |
+
"reference": "c19925cd0390d3c436a0203ae859afa460d0474b"
|
264 |
},
|
265 |
"dist": {
|
266 |
"type": "zip",
|
267 |
+
"url": "https://api.github.com/repos/mikey179/vfsStream/zipball/c19925cd0390d3c436a0203ae859afa460d0474b",
|
268 |
+
"reference": "c19925cd0390d3c436a0203ae859afa460d0474b",
|
269 |
"shasum": ""
|
270 |
},
|
271 |
"require": {
|
298 |
],
|
299 |
"description": "Virtual file system to mock the real file system in unit tests.",
|
300 |
"homepage": "http://vfs.bovigo.org/",
|
301 |
+
"time": "2016-04-09 09:42:01"
|
302 |
},
|
303 |
{
|
304 |
"name": "mockery/mockery",
|
305 |
+
"version": "0.9.5",
|
306 |
"source": {
|
307 |
"type": "git",
|
308 |
"url": "https://github.com/padraic/mockery.git",
|
309 |
+
"reference": "4db079511a283e5aba1b3c2fb19037c645e70fc2"
|
310 |
},
|
311 |
"dist": {
|
312 |
"type": "zip",
|
313 |
+
"url": "https://api.github.com/repos/padraic/mockery/zipball/4db079511a283e5aba1b3c2fb19037c645e70fc2",
|
314 |
+
"reference": "4db079511a283e5aba1b3c2fb19037c645e70fc2",
|
315 |
"shasum": ""
|
316 |
},
|
317 |
"require": {
|
363 |
"test double",
|
364 |
"testing"
|
365 |
],
|
366 |
+
"time": "2016-05-22 21:52:33"
|
367 |
},
|
368 |
{
|
369 |
"name": "phpdocumentor/reflection-docblock",
|
416 |
},
|
417 |
{
|
418 |
"name": "phpspec/prophecy",
|
419 |
+
"version": "v1.6.1",
|
420 |
"source": {
|
421 |
"type": "git",
|
422 |
"url": "https://github.com/phpspec/prophecy.git",
|
423 |
+
"reference": "58a8137754bc24b25740d4281399a4a3596058e0"
|
424 |
},
|
425 |
"dist": {
|
426 |
"type": "zip",
|
427 |
+
"url": "https://api.github.com/repos/phpspec/prophecy/zipball/58a8137754bc24b25740d4281399a4a3596058e0",
|
428 |
+
"reference": "58a8137754bc24b25740d4281399a4a3596058e0",
|
429 |
"shasum": ""
|
430 |
},
|
431 |
"require": {
|
432 |
"doctrine/instantiator": "^1.0.2",
|
433 |
+
"php": "^5.3|^7.0",
|
434 |
+
"phpdocumentor/reflection-docblock": "^2.0|^3.0.2",
|
435 |
+
"sebastian/comparator": "^1.1",
|
436 |
+
"sebastian/recursion-context": "^1.0"
|
437 |
},
|
438 |
"require-dev": {
|
439 |
+
"phpspec/phpspec": "^2.0"
|
440 |
},
|
441 |
"type": "library",
|
442 |
"extra": {
|
443 |
"branch-alias": {
|
444 |
+
"dev-master": "1.6.x-dev"
|
445 |
}
|
446 |
},
|
447 |
"autoload": {
|
474 |
"spy",
|
475 |
"stub"
|
476 |
],
|
477 |
+
"time": "2016-06-07 08:13:47"
|
478 |
},
|
479 |
{
|
480 |
"name": "phpunit/php-code-coverage",
|
628 |
},
|
629 |
{
|
630 |
"name": "phpunit/php-timer",
|
631 |
+
"version": "1.0.8",
|
632 |
"source": {
|
633 |
"type": "git",
|
634 |
"url": "https://github.com/sebastianbergmann/php-timer.git",
|
635 |
+
"reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260"
|
636 |
},
|
637 |
"dist": {
|
638 |
"type": "zip",
|
639 |
+
"url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/38e9124049cf1a164f1e4537caf19c99bf1eb260",
|
640 |
+
"reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260",
|
641 |
"shasum": ""
|
642 |
},
|
643 |
"require": {
|
644 |
"php": ">=5.3.3"
|
645 |
},
|
646 |
+
"require-dev": {
|
647 |
+
"phpunit/phpunit": "~4|~5"
|
648 |
+
},
|
649 |
"type": "library",
|
650 |
"autoload": {
|
651 |
"classmap": [
|
668 |
"keywords": [
|
669 |
"timer"
|
670 |
],
|
671 |
+
"time": "2016-05-12 18:03:57"
|
672 |
},
|
673 |
{
|
674 |
"name": "phpunit/php-token-stream",
|
721 |
},
|
722 |
{
|
723 |
"name": "phpunit/phpunit",
|
724 |
+
"version": "4.8.26",
|
725 |
"source": {
|
726 |
"type": "git",
|
727 |
"url": "https://github.com/sebastianbergmann/phpunit.git",
|
728 |
+
"reference": "fc1d8cd5b5de11625979125c5639347896ac2c74"
|
729 |
},
|
730 |
"dist": {
|
731 |
"type": "zip",
|
732 |
+
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/fc1d8cd5b5de11625979125c5639347896ac2c74",
|
733 |
+
"reference": "fc1d8cd5b5de11625979125c5639347896ac2c74",
|
734 |
"shasum": ""
|
735 |
},
|
736 |
"require": {
|
744 |
"phpunit/php-code-coverage": "~2.1",
|
745 |
"phpunit/php-file-iterator": "~1.4",
|
746 |
"phpunit/php-text-template": "~1.2",
|
747 |
+
"phpunit/php-timer": "^1.0.6",
|
748 |
"phpunit/phpunit-mock-objects": "~2.3",
|
749 |
"sebastian/comparator": "~1.1",
|
750 |
"sebastian/diff": "~1.2",
|
789 |
"testing",
|
790 |
"xunit"
|
791 |
],
|
792 |
+
"time": "2016-05-17 03:09:28"
|
793 |
},
|
794 |
{
|
795 |
"name": "phpunit/phpunit-mock-objects",
|
913 |
},
|
914 |
{
|
915 |
"name": "sebastian/diff",
|
916 |
+
"version": "1.4.1",
|
917 |
"source": {
|
918 |
"type": "git",
|
919 |
"url": "https://github.com/sebastianbergmann/diff.git",
|
920 |
+
"reference": "13edfd8706462032c2f52b4b862974dd46b71c9e"
|
921 |
},
|
922 |
"dist": {
|
923 |
"type": "zip",
|
924 |
+
"url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e",
|
925 |
+
"reference": "13edfd8706462032c2f52b4b862974dd46b71c9e",
|
926 |
"shasum": ""
|
927 |
},
|
928 |
"require": {
|
929 |
"php": ">=5.3.3"
|
930 |
},
|
931 |
"require-dev": {
|
932 |
+
"phpunit/phpunit": "~4.8"
|
933 |
},
|
934 |
"type": "library",
|
935 |
"extra": {
|
936 |
"branch-alias": {
|
937 |
+
"dev-master": "1.4-dev"
|
938 |
}
|
939 |
},
|
940 |
"autoload": {
|
957 |
}
|
958 |
],
|
959 |
"description": "Diff implementation",
|
960 |
+
"homepage": "https://github.com/sebastianbergmann/diff",
|
961 |
"keywords": [
|
962 |
"diff"
|
963 |
],
|
964 |
+
"time": "2015-12-08 07:14:41"
|
965 |
},
|
966 |
{
|
967 |
"name": "sebastian/environment",
|
968 |
+
"version": "1.3.7",
|
969 |
"source": {
|
970 |
"type": "git",
|
971 |
"url": "https://github.com/sebastianbergmann/environment.git",
|
972 |
+
"reference": "4e8f0da10ac5802913afc151413bc8c53b6c2716"
|
973 |
},
|
974 |
"dist": {
|
975 |
"type": "zip",
|
976 |
+
"url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/4e8f0da10ac5802913afc151413bc8c53b6c2716",
|
977 |
+
"reference": "4e8f0da10ac5802913afc151413bc8c53b6c2716",
|
978 |
"shasum": ""
|
979 |
},
|
980 |
"require": {
|
1011 |
"environment",
|
1012 |
"hhvm"
|
1013 |
],
|
1014 |
+
"time": "2016-05-17 03:18:57"
|
1015 |
},
|
1016 |
{
|
1017 |
"name": "sebastian/exporter",
|
1018 |
+
"version": "1.2.2",
|
1019 |
"source": {
|
1020 |
"type": "git",
|
1021 |
"url": "https://github.com/sebastianbergmann/exporter.git",
|
1022 |
+
"reference": "42c4c2eec485ee3e159ec9884f95b431287edde4"
|
1023 |
},
|
1024 |
"dist": {
|
1025 |
"type": "zip",
|
1026 |
+
"url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4",
|
1027 |
+
"reference": "42c4c2eec485ee3e159ec9884f95b431287edde4",
|
1028 |
"shasum": ""
|
1029 |
},
|
1030 |
"require": {
|
1032 |
"sebastian/recursion-context": "~1.0"
|
1033 |
},
|
1034 |
"require-dev": {
|
1035 |
+
"ext-mbstring": "*",
|
1036 |
"phpunit/phpunit": "~4.4"
|
1037 |
},
|
1038 |
"type": "library",
|
1039 |
"extra": {
|
1040 |
"branch-alias": {
|
1041 |
+
"dev-master": "1.3.x-dev"
|
1042 |
}
|
1043 |
},
|
1044 |
"autoload": {
|
1078 |
"export",
|
1079 |
"exporter"
|
1080 |
],
|
1081 |
+
"time": "2016-06-17 09:04:28"
|
1082 |
},
|
1083 |
{
|
1084 |
"name": "sebastian/global-state",
|
1133 |
},
|
1134 |
{
|
1135 |
"name": "sebastian/recursion-context",
|
1136 |
+
"version": "1.0.2",
|
1137 |
"source": {
|
1138 |
"type": "git",
|
1139 |
"url": "https://github.com/sebastianbergmann/recursion-context.git",
|
1140 |
+
"reference": "913401df809e99e4f47b27cdd781f4a258d58791"
|
1141 |
},
|
1142 |
"dist": {
|
1143 |
"type": "zip",
|
1144 |
+
"url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/913401df809e99e4f47b27cdd781f4a258d58791",
|
1145 |
+
"reference": "913401df809e99e4f47b27cdd781f4a258d58791",
|
1146 |
"shasum": ""
|
1147 |
},
|
1148 |
"require": {
|
1182 |
],
|
1183 |
"description": "Provides functionality to recursively process PHP variables",
|
1184 |
"homepage": "http://www.github.com/sebastianbergmann/recursion-context",
|
1185 |
+
"time": "2015-11-11 19:50:13"
|
1186 |
},
|
1187 |
{
|
1188 |
"name": "sebastian/version",
|
1219 |
"homepage": "https://github.com/sebastianbergmann/version",
|
1220 |
"time": "2015-06-21 13:59:46"
|
1221 |
},
|
1222 |
+
{
|
1223 |
+
"name": "squizlabs/php_codesniffer",
|
1224 |
+
"version": "2.6.2",
|
1225 |
+
"source": {
|
1226 |
+
"type": "git",
|
1227 |
+
"url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
|
1228 |
+
"reference": "4edb770cb853def6e60c93abb088ad5ac2010c83"
|
1229 |
+
},
|
1230 |
+
"dist": {
|
1231 |
+
"type": "zip",
|
1232 |
+
"url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/4edb770cb853def6e60c93abb088ad5ac2010c83",
|
1233 |
+
"reference": "4edb770cb853def6e60c93abb088ad5ac2010c83",
|
1234 |
+
"shasum": ""
|
1235 |
+
},
|
1236 |
+
"require": {
|
1237 |
+
"ext-simplexml": "*",
|
1238 |
+
"ext-tokenizer": "*",
|
1239 |
+
"ext-xmlwriter": "*",
|
1240 |
+
"php": ">=5.1.2"
|
1241 |
+
},
|
1242 |
+
"require-dev": {
|
1243 |
+
"phpunit/phpunit": "~4.0"
|
1244 |
+
},
|
1245 |
+
"bin": [
|
1246 |
+
"scripts/phpcs",
|
1247 |
+
"scripts/phpcbf"
|
1248 |
+
],
|
1249 |
+
"type": "library",
|
1250 |
+
"extra": {
|
1251 |
+
"branch-alias": {
|
1252 |
+
"dev-master": "2.x-dev"
|
1253 |
+
}
|
1254 |
+
},
|
1255 |
+
"autoload": {
|
1256 |
+
"classmap": [
|
1257 |
+
"CodeSniffer.php",
|
1258 |
+
"CodeSniffer/CLI.php",
|
1259 |
+
"CodeSniffer/Exception.php",
|
1260 |
+
"CodeSniffer/File.php",
|
1261 |
+
"CodeSniffer/Fixer.php",
|
1262 |
+
"CodeSniffer/Report.php",
|
1263 |
+
"CodeSniffer/Reporting.php",
|
1264 |
+
"CodeSniffer/Sniff.php",
|
1265 |
+
"CodeSniffer/Tokens.php",
|
1266 |
+
"CodeSniffer/Reports/",
|
1267 |
+
"CodeSniffer/Tokenizers/",
|
1268 |
+
"CodeSniffer/DocGenerators/",
|
1269 |
+
"CodeSniffer/Standards/AbstractPatternSniff.php",
|
1270 |
+
"CodeSniffer/Standards/AbstractScopeSniff.php",
|
1271 |
+
"CodeSniffer/Standards/AbstractVariableSniff.php",
|
1272 |
+
"CodeSniffer/Standards/IncorrectPatternException.php",
|
1273 |
+
"CodeSniffer/Standards/Generic/Sniffs/",
|
1274 |
+
"CodeSniffer/Standards/MySource/Sniffs/",
|
1275 |
+
"CodeSniffer/Standards/PEAR/Sniffs/",
|
1276 |
+
"CodeSniffer/Standards/PSR1/Sniffs/",
|
1277 |
+
"CodeSniffer/Standards/PSR2/Sniffs/",
|
1278 |
+
"CodeSniffer/Standards/Squiz/Sniffs/",
|
1279 |
+
"CodeSniffer/Standards/Zend/Sniffs/"
|
1280 |
+
]
|
1281 |
+
},
|
1282 |
+
"notification-url": "https://packagist.org/downloads/",
|
1283 |
+
"license": [
|
1284 |
+
"BSD-3-Clause"
|
1285 |
+
],
|
1286 |
+
"authors": [
|
1287 |
+
{
|
1288 |
+
"name": "Greg Sherwood",
|
1289 |
+
"role": "lead"
|
1290 |
+
}
|
1291 |
+
],
|
1292 |
+
"description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
|
1293 |
+
"homepage": "http://www.squizlabs.com/php-codesniffer",
|
1294 |
+
"keywords": [
|
1295 |
+
"phpcs",
|
1296 |
+
"standards"
|
1297 |
+
],
|
1298 |
+
"time": "2016-07-13 23:29:13"
|
1299 |
+
},
|
1300 |
{
|
1301 |
"name": "symfony/yaml",
|
1302 |
+
"version": "v2.8.8",
|
1303 |
"source": {
|
1304 |
"type": "git",
|
1305 |
"url": "https://github.com/symfony/yaml.git",
|
1306 |
+
"reference": "dba4bb5846798cd12f32e2d8f3f35d77045773c8"
|
1307 |
},
|
1308 |
"dist": {
|
1309 |
"type": "zip",
|
1310 |
+
"url": "https://api.github.com/repos/symfony/yaml/zipball/dba4bb5846798cd12f32e2d8f3f35d77045773c8",
|
1311 |
+
"reference": "dba4bb5846798cd12f32e2d8f3f35d77045773c8",
|
1312 |
"shasum": ""
|
1313 |
},
|
1314 |
"require": {
|
1317 |
"type": "library",
|
1318 |
"extra": {
|
1319 |
"branch-alias": {
|
1320 |
+
"dev-master": "2.8-dev"
|
1321 |
}
|
1322 |
},
|
1323 |
"autoload": {
|
1324 |
"psr-4": {
|
1325 |
"Symfony\\Component\\Yaml\\": ""
|
1326 |
+
},
|
1327 |
+
"exclude-from-classmap": [
|
1328 |
+
"/Tests/"
|
1329 |
+
]
|
1330 |
},
|
1331 |
"notification-url": "https://packagist.org/downloads/",
|
1332 |
"license": [
|
1344 |
],
|
1345 |
"description": "Symfony Yaml Component",
|
1346 |
"homepage": "https://symfony.com",
|
1347 |
+
"time": "2016-06-29 05:29:29"
|
1348 |
+
},
|
1349 |
+
{
|
1350 |
+
"name": "tinify/tinify",
|
1351 |
+
"version": "dev-create-key",
|
1352 |
+
"source": {
|
1353 |
+
"type": "git",
|
1354 |
+
"url": "https://github.com/tinify/tinify-php.git",
|
1355 |
+
"reference": "c369f9fd8ea1bae4654bac6f4d3ed4070fb75f03"
|
1356 |
+
},
|
1357 |
+
"dist": {
|
1358 |
+
"type": "zip",
|
1359 |
+
"url": "https://api.github.com/repos/tinify/tinify-php/zipball/c369f9fd8ea1bae4654bac6f4d3ed4070fb75f03",
|
1360 |
+
"reference": "c369f9fd8ea1bae4654bac6f4d3ed4070fb75f03",
|
1361 |
+
"shasum": ""
|
1362 |
+
},
|
1363 |
+
"require": {
|
1364 |
+
"ext-curl": "*",
|
1365 |
+
"ext-json": "*",
|
1366 |
+
"lib-curl": ">=7.20.0",
|
1367 |
+
"php": ">=5.3.0"
|
1368 |
+
},
|
1369 |
+
"require-dev": {
|
1370 |
+
"phpunit/phpunit": "~4.0",
|
1371 |
+
"symfony/yaml": "~2.0"
|
1372 |
+
},
|
1373 |
+
"type": "library",
|
1374 |
+
"autoload": {
|
1375 |
+
"files": [
|
1376 |
+
"lib/Tinify.php",
|
1377 |
+
"lib/Tinify/Exception.php"
|
1378 |
+
],
|
1379 |
+
"psr-4": {
|
1380 |
+
"Tinify\\": "lib/Tinify/"
|
1381 |
+
}
|
1382 |
+
},
|
1383 |
+
"license": [
|
1384 |
+
"MIT"
|
1385 |
+
],
|
1386 |
+
"authors": [
|
1387 |
+
{
|
1388 |
+
"name": "Rolf Timmermans",
|
1389 |
+
"email": "rolftimmermans@voormedia.com"
|
1390 |
+
}
|
1391 |
+
],
|
1392 |
+
"description": "PHP client for the Tinify API. Tinify compresses your images intelligently. Read more at https://tinify.com.",
|
1393 |
+
"homepage": "https://tinify.com/developers",
|
1394 |
+
"keywords": [
|
1395 |
+
"api",
|
1396 |
+
"compress",
|
1397 |
+
"images",
|
1398 |
+
"tinify",
|
1399 |
+
"tinyjpg",
|
1400 |
+
"tinypng"
|
1401 |
+
],
|
1402 |
+
"support": {
|
1403 |
+
"email": "support@tinify.com",
|
1404 |
+
"source": "https://github.com/tinify/tinify-php/tree/create-key",
|
1405 |
+
"issues": "https://github.com/tinify/tinify-php/issues"
|
1406 |
+
},
|
1407 |
+
"time": "2016-06-22 11:58:28"
|
1408 |
+
},
|
1409 |
+
{
|
1410 |
+
"name": "wp-coding-standards/wpcs",
|
1411 |
+
"version": "dev-master",
|
1412 |
+
"source": {
|
1413 |
+
"type": "git",
|
1414 |
+
"url": "https://github.com/WordPress-Coding-Standards/WordPress-Coding-Standards.git",
|
1415 |
+
"reference": "f50ccffe5ef3a77e84b3be9487cb7a477248a8ea"
|
1416 |
+
},
|
1417 |
+
"dist": {
|
1418 |
+
"type": "zip",
|
1419 |
+
"url": "https://api.github.com/repos/WordPress-Coding-Standards/WordPress-Coding-Standards/zipball/f50ccffe5ef3a77e84b3be9487cb7a477248a8ea",
|
1420 |
+
"reference": "f50ccffe5ef3a77e84b3be9487cb7a477248a8ea",
|
1421 |
+
"shasum": ""
|
1422 |
+
},
|
1423 |
+
"require": {
|
1424 |
+
"squizlabs/php_codesniffer": "~2.2"
|
1425 |
+
},
|
1426 |
+
"type": "library",
|
1427 |
+
"notification-url": "https://packagist.org/downloads/",
|
1428 |
+
"license": [
|
1429 |
+
"MIT"
|
1430 |
+
],
|
1431 |
+
"authors": [
|
1432 |
+
{
|
1433 |
+
"name": "Contributors",
|
1434 |
+
"homepage": "https://github.com/WordPress-Coding-Standards/WordPress-Coding-Standards/graphs/contributors"
|
1435 |
+
}
|
1436 |
+
],
|
1437 |
+
"description": "PHP_CodeSniffer rules (sniffs) to enforce WordPress coding conventions",
|
1438 |
+
"keywords": [
|
1439 |
+
"phpcs",
|
1440 |
+
"standards",
|
1441 |
+
"wordpress"
|
1442 |
+
],
|
1443 |
+
"time": "2016-05-02 03:33:03"
|
1444 |
}
|
1445 |
],
|
1446 |
"aliases": [],
|
1447 |
"minimum-stability": "stable",
|
1448 |
+
"stability-flags": {
|
1449 |
+
"tinify/tinify": 20,
|
1450 |
+
"wp-coding-standards/wpcs": 20
|
1451 |
+
},
|
1452 |
"prefer-stable": false,
|
1453 |
"prefer-lowest": false,
|
1454 |
"platform": {
|
config/Dockerfile
DELETED
@@ -1,12 +0,0 @@
|
|
1 |
-
FROM php:5.6-cli
|
2 |
-
|
3 |
-
RUN apt-get update && apt-get install -yqq zlib1g-dev
|
4 |
-
RUN curl -Os https://phar.phpunit.de/phpunit.phar && chmod +x phpunit.phar && mv phpunit.phar /usr/local/bin/phpunit
|
5 |
-
RUN docker-php-ext-install mysqli zip
|
6 |
-
|
7 |
-
COPY upload.png /tmp/upload.png
|
8 |
-
|
9 |
-
VOLUME ["/usr/src/wordpress-plugin-tests"]
|
10 |
-
WORKDIR /usr/src/wordpress-plugin-tests
|
11 |
-
|
12 |
-
CMD ["phpunit", "integration"]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
config/{Dockerfile-mock-tinypng-webservice → Dockerfile-mock-webservice}
RENAMED
File without changes
|
config/Dockerfile-phantomjs
CHANGED
@@ -1,4 +1,4 @@
|
|
1 |
-
FROM
|
2 |
|
3 |
EXPOSE 8910
|
4 |
|
1 |
+
FROM wernight/phantomjs:2
|
2 |
|
3 |
EXPOSE 8910
|
4 |
|
config/Dockerfile-wordpress-45
ADDED
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
FROM wordpress:4
|
2 |
+
|
3 |
+
ENV WORDPRESS_VERSION 4.5.3
|
4 |
+
ENV WORDPRESS_UPSTREAM_VERSION 4.5.3
|
5 |
+
ENV WORDPRESS_SHA1 835b68748dae5a9d31c059313cd0150f03a49269
|
6 |
+
|
7 |
+
# upstream tarballs include ./wordpress/ so this gives us /usr/src/wordpress
|
8 |
+
RUN curl -o wordpress.tar.gz -sSL https://wordpress.org/wordpress-${WORDPRESS_UPSTREAM_VERSION}.tar.gz \
|
9 |
+
&& echo "$WORDPRESS_SHA1 *wordpress.tar.gz" | sha1sum -c - \
|
10 |
+
&& tar -xzf wordpress.tar.gz -C /usr/src/ \
|
11 |
+
&& rm wordpress.tar.gz \
|
12 |
+
&& chown -R www-data:www-data /usr/src/wordpress
|
13 |
+
|
14 |
+
ENTRYPOINT ["/entrypoint.sh"]
|
15 |
+
CMD ["apache2-foreground"]
|
config/mysql/additional.cnf
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
1 |
+
[mysqld]
|
2 |
+
# Required for WordPress 3.8 and below.
|
3 |
+
sql-mode="NO_ENGINE_SUBSTITUTION"
|
docker-compose.yml
ADDED
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
version: '2'
|
2 |
+
|
3 |
+
services:
|
4 |
+
wordpress:
|
5 |
+
build:
|
6 |
+
context: config
|
7 |
+
dockerfile: Dockerfile-wordpress-${WORDPRESS_VERSION}
|
8 |
+
ports:
|
9 |
+
- 80${WORDPRESS_VERSION}:80
|
10 |
+
volumes:
|
11 |
+
- .:/var/www/html/wp-content/plugins/tiny-compress-images
|
12 |
+
links:
|
13 |
+
- mysql
|
14 |
+
- phantomjs
|
15 |
+
- webservice
|
16 |
+
environment:
|
17 |
+
WORDPRESS_DB_NAME: wordpress_${WORDPRESS_VERSION}
|
18 |
+
WORDPRESS_DB_PASSWORD: root
|
19 |
+
|
20 |
+
mysql:
|
21 |
+
image: mysql
|
22 |
+
ports:
|
23 |
+
- 3306:3306
|
24 |
+
volumes:
|
25 |
+
- ./config/mysql:/etc/mysql/conf.d
|
26 |
+
environment:
|
27 |
+
MYSQL_ROOT_PASSWORD: root
|
28 |
+
|
29 |
+
phantomjs:
|
30 |
+
ports:
|
31 |
+
- 8910:8910
|
32 |
+
volumes:
|
33 |
+
- ./test/fixtures:/test/fixtures
|
34 |
+
build:
|
35 |
+
context: config
|
36 |
+
dockerfile: Dockerfile-phantomjs
|
37 |
+
|
38 |
+
webservice:
|
39 |
+
ports:
|
40 |
+
- 80:80
|
41 |
+
volumes:
|
42 |
+
- ./test/mock-tinypng-webservice:/var/www/html
|
43 |
+
build:
|
44 |
+
context: config
|
45 |
+
dockerfile: Dockerfile-mock-webservice
|
phpcs.xml
ADDED
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0"?>
|
2 |
+
<ruleset>
|
3 |
+
<config name="installed_paths" value="vendor/wp-coding-standards/wpcs"/>
|
4 |
+
|
5 |
+
<rule ref="WordPress-Core"/>
|
6 |
+
<rule ref="Generic.Files.LineLength">
|
7 |
+
<properties>
|
8 |
+
<property name="lineLimit" value="100"/>
|
9 |
+
<property name="absoluteLineLimit" value="100"/>
|
10 |
+
</properties>
|
11 |
+
<exclude-pattern>src/views</exclude-pattern>
|
12 |
+
</rule>
|
13 |
+
|
14 |
+
<file>tiny-compress-images.php</file>
|
15 |
+
<file>src</file>
|
16 |
+
<file>test</file>
|
17 |
+
<exclude-pattern>src/css</exclude-pattern>
|
18 |
+
<exclude-pattern>src/data</exclude-pattern>
|
19 |
+
<exclude-pattern>src/js</exclude-pattern>
|
20 |
+
<exclude-pattern>src/vendor</exclude-pattern>
|
21 |
+
<exclude-pattern>test/mock-tinypng-webservice</exclude-pattern>
|
22 |
+
</ruleset>
|
readme.txt
CHANGED
@@ -3,8 +3,8 @@ Contributors: TinyPNG
|
|
3 |
Donate link: https://tinypng.com/
|
4 |
Tags: optimize, compress, shrink, resize, faster, fit, scale, improve, images, tinypng, tinyjpg, jpeg, jpg, png, lossy, jpegmini, crunch, minify, smush, save, bandwidth, website, speed, performance, panda, wordpress app
|
5 |
Requires at least: 3.0.6
|
6 |
-
Tested up to: 4.
|
7 |
-
Stable tag:
|
8 |
License: GPLv2 or later
|
9 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
10 |
|
@@ -38,6 +38,10 @@ After you upload an image to your WordPress site, each resized image is uploaded
|
|
38 |
|
39 |
Install this plugin and obtain your free API key from https://tinypng.com/developers. With a free account you can optimize **roughly 100 images each month** (based on a regular WordPress installation). The exact number depends on the amount of thumbnails you use. You can change which of the generated thumbnail sizes should be optimized in the *Settings > Media* page. If you’re a heavy user you can optimize more images for a small additional fee per image.
|
40 |
|
|
|
|
|
|
|
|
|
41 |
= Multisite support =
|
42 |
|
43 |
The API key can optionally be configured in wp-config.php. This removes the need to set a key on each site individually in your multisite network.
|
@@ -57,18 +61,18 @@ Want to contribute? Check out the [Tinify Wordpress plugin on GitHub](https://gi
|
|
57 |
1. Visit *Plugins > Add New*.
|
58 |
2. Search for 'tinypng' and press the 'Install Now' button for the plugin named 'Compress JPEG & PNG images' by 'TinyPNG'.
|
59 |
3. Activate the plugin from your *Plugins* page.
|
60 |
-
4.
|
61 |
-
5.
|
62 |
-
6.
|
63 |
|
64 |
= From WordPress.org =
|
65 |
|
66 |
1. Download the plugin named 'Compress JPEG & PNG images' by 'TinyPNG'.
|
67 |
2. Upload the `tiny-compress-images` directory to your `/wp-content/plugins/` directory, using your favorite method (ftp, sftp, scp, etc...)
|
68 |
3. Activate the plugin from your Plugins page.
|
69 |
-
4.
|
70 |
-
5.
|
71 |
-
6.
|
72 |
|
73 |
= Optional configuration =
|
74 |
|
@@ -76,19 +80,18 @@ The API key can also be configured in wp-config.php. You can add a `TINY_API_KEY
|
|
76 |
|
77 |
== Screenshots ==
|
78 |
|
79 |
-
1.
|
80 |
-
2. In the Media Library
|
81 |
-
3.
|
82 |
-
4.
|
83 |
-
5. Bulk optimization of all images through the Media > Compress All Images page.
|
84 |
|
85 |
== Frequently Asked Questions ==
|
86 |
|
87 |
= Q: How many images can I optimize for free? =
|
88 |
-
A: In a default
|
89 |
|
90 |
= Q: What happens to the optimized images when I uninstall the plugin? =
|
91 |
-
A: When you remove the
|
92 |
|
93 |
= Q: I don't recall uploading 500 photos this month but my limit is already reached. How is this number calculated? =
|
94 |
A: When you upload an image to your website, WordPress will create different sized versions of it (see *Settings > Media*). The plugin will compress each of these sizes, so when you have 100 images and 5 different sizes you will do 500 compressions.
|
@@ -97,34 +100,42 @@ A: When you upload an image to your website, WordPress will create different siz
|
|
97 |
A: No. There are no limitations on the size of the images you want to compress.
|
98 |
|
99 |
= Q: What happens when I reach my monthly limit? =
|
100 |
-
A: Everything will keep on working, but newly uploaded images will not be optimized. Of course we encourage everyone to sign up for a
|
101 |
|
102 |
= Q: Can I optimize all existing images in my media library? =
|
103 |
-
A: Yes! After installing the plugin, go to *Media >
|
104 |
|
105 |
== Changelog ==
|
106 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
107 |
= 1.7.2 =
|
108 |
-
* Show more information about compressed
|
109 |
* Add compression details to image overview.
|
110 |
|
111 |
= 1.7.1 =
|
112 |
-
*
|
113 |
-
* Option to preserve
|
114 |
-
* Improved
|
115 |
|
116 |
= 1.7.0 =
|
117 |
* Option to preserve copyright information in your original JPEG images.
|
118 |
* Added proxy support for cURL.
|
119 |
-
*
|
120 |
|
121 |
= 1.6.0 =
|
122 |
* Improved compression status in the Media Library with new details window.
|
123 |
-
* Show total compression savings on the Media Settings page
|
124 |
* Moved Compress All Images from the Tools to the Media menu.
|
125 |
|
126 |
= 1.5.0 =
|
127 |
-
* Resize original images by specifying a maximum width and/or height.
|
128 |
* Support for the mobile WordPress app (thanks to David Goodwin).
|
129 |
|
130 |
= 1.4.0 =
|
@@ -133,13 +144,13 @@ A: Yes! After installing the plugin, go to *Media > Compress All Images*, and cl
|
|
133 |
* Clarification that original images will be overwritten when compressed.
|
134 |
|
135 |
= 1.3.2 =
|
136 |
-
* Detect different thumbnail sizes with the same dimensions
|
137 |
|
138 |
= 1.3.1 =
|
139 |
* Media library shows files that are in the process of compression.
|
140 |
|
141 |
= 1.3.0 =
|
142 |
-
*
|
143 |
* Better indication of image sizes that have been compressed.
|
144 |
* Detection of image sizes modified after compression by other plugins.
|
145 |
|
3 |
Donate link: https://tinypng.com/
|
4 |
Tags: optimize, compress, shrink, resize, faster, fit, scale, improve, images, tinypng, tinyjpg, jpeg, jpg, png, lossy, jpegmini, crunch, minify, smush, save, bandwidth, website, speed, performance, panda, wordpress app
|
5 |
Requires at least: 3.0.6
|
6 |
+
Tested up to: 4.6
|
7 |
+
Stable tag: 2.0.0
|
8 |
License: GPLv2 or later
|
9 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
10 |
|
38 |
|
39 |
Install this plugin and obtain your free API key from https://tinypng.com/developers. With a free account you can optimize **roughly 100 images each month** (based on a regular WordPress installation). The exact number depends on the amount of thumbnails you use. You can change which of the generated thumbnail sizes should be optimized in the *Settings > Media* page. If you’re a heavy user you can optimize more images for a small additional fee per image.
|
40 |
|
41 |
+
= Optimizing all your images =
|
42 |
+
|
43 |
+
You can optimize all your JPEG and PNG images at once by going to *Media > Bulk Optimization*. Clicking on the big button will start optimizing all unoptimized images in your media library.
|
44 |
+
|
45 |
= Multisite support =
|
46 |
|
47 |
The API key can optionally be configured in wp-config.php. This removes the need to set a key on each site individually in your multisite network.
|
61 |
1. Visit *Plugins > Add New*.
|
62 |
2. Search for 'tinypng' and press the 'Install Now' button for the plugin named 'Compress JPEG & PNG images' by 'TinyPNG'.
|
63 |
3. Activate the plugin from your *Plugins* page.
|
64 |
+
4. Go to the *Settings > Media* page and register a new account.
|
65 |
+
5. Or enter the API key you got from https://tinypng.com/developers.
|
66 |
+
6. Go to *Media > Bulk Optimization* and optimize all your images!
|
67 |
|
68 |
= From WordPress.org =
|
69 |
|
70 |
1. Download the plugin named 'Compress JPEG & PNG images' by 'TinyPNG'.
|
71 |
2. Upload the `tiny-compress-images` directory to your `/wp-content/plugins/` directory, using your favorite method (ftp, sftp, scp, etc...)
|
72 |
3. Activate the plugin from your Plugins page.
|
73 |
+
4. Go to the *Settings > Media* page and register a new account.
|
74 |
+
5. Or enter the API key you got from https://tinypng.com/developers.
|
75 |
+
6. Go to *Media > Bulk Optimization* and optimize all your images!
|
76 |
|
77 |
= Optional configuration =
|
78 |
|
80 |
|
81 |
== Screenshots ==
|
82 |
|
83 |
+
1. Register a new account or enter your existing API key. Then choose the image sizes to optimize and any other options like resizing and preserving metadata in your original image uploads.
|
84 |
+
2. In the Media Library list view you can see the savings on your images.
|
85 |
+
3. From the Media Library you can compress individual images and use the Bulk Actions drop-down to quickly optimize multiple images at once.
|
86 |
+
4. Last but not least you can also use Bulk Optimization to optimize your entire WordPress site.
|
|
|
87 |
|
88 |
== Frequently Asked Questions ==
|
89 |
|
90 |
= Q: How many images can I optimize for free? =
|
91 |
+
A: In a default WordPress installation you can optimize around 100 images for free each month. WordPress creates different thumbnails of your images which all have to be compressed. Some plugins even add more sizes, so take a look at the *Settings > Media* page before you start optimization.
|
92 |
|
93 |
= Q: What happens to the optimized images when I uninstall the plugin? =
|
94 |
+
A: When you remove the plugin all your optimized images will remain optimized.
|
95 |
|
96 |
= Q: I don't recall uploading 500 photos this month but my limit is already reached. How is this number calculated? =
|
97 |
A: When you upload an image to your website, WordPress will create different sized versions of it (see *Settings > Media*). The plugin will compress each of these sizes, so when you have 100 images and 5 different sizes you will do 500 compressions.
|
100 |
A: No. There are no limitations on the size of the images you want to compress.
|
101 |
|
102 |
= Q: What happens when I reach my monthly limit? =
|
103 |
+
A: Everything will keep on working, but newly uploaded images will not be optimized. Of course we encourage everyone to sign up for a paid account to cover the hosting and development costs of the service.
|
104 |
|
105 |
= Q: Can I optimize all existing images in my media library? =
|
106 |
+
A: Yes! After installing the plugin, go to *Media > Bulk Optimization*, and click on the start button to optimize all unoptimized images in your media library.
|
107 |
|
108 |
== Changelog ==
|
109 |
|
110 |
+
= 2.0.0 =
|
111 |
+
* Completely new Bulk Optimization page.
|
112 |
+
* Better detection of image sizes with duplicate filenames.
|
113 |
+
* Simplified account activation and API key creation.
|
114 |
+
* Fix to the bottom drop-down menu in the Media Library.
|
115 |
+
* Use the latest PHP client library for connecting to TinyJPG and TinyPNG.
|
116 |
+
* Added fallback to fopen for older systems running PHP 5.2.
|
117 |
+
|
118 |
= 1.7.2 =
|
119 |
+
* Show more information about compressed image sizes in details popup.
|
120 |
* Add compression details to image overview.
|
121 |
|
122 |
= 1.7.1 =
|
123 |
+
* Preserve GPS locations and creation dates in the original JPEG images.
|
124 |
+
* Option to preserve copyright information in your original PNG images.
|
125 |
+
* Improved detection of unsupported file types.
|
126 |
|
127 |
= 1.7.0 =
|
128 |
* Option to preserve copyright information in your original JPEG images.
|
129 |
* Added proxy support for cURL.
|
130 |
+
* Support for translate.wordpress.org plugin translations.
|
131 |
|
132 |
= 1.6.0 =
|
133 |
* Improved compression status in the Media Library with new details window.
|
134 |
+
* Show total compression savings on the Media Settings page.
|
135 |
* Moved Compress All Images from the Tools to the Media menu.
|
136 |
|
137 |
= 1.5.0 =
|
138 |
+
* Resize original images by specifying a maximum width and/or height.
|
139 |
* Support for the mobile WordPress app (thanks to David Goodwin).
|
140 |
|
141 |
= 1.4.0 =
|
144 |
* Clarification that original images will be overwritten when compressed.
|
145 |
|
146 |
= 1.3.2 =
|
147 |
+
* Detect different thumbnail sizes with the same dimensions.
|
148 |
|
149 |
= 1.3.1 =
|
150 |
* Media library shows files that are in the process of compression.
|
151 |
|
152 |
= 1.3.0 =
|
153 |
+
* Added option to bulk compress your whole media library in one go.
|
154 |
* Better indication of image sizes that have been compressed.
|
155 |
* Detection of image sizes modified after compression by other plugins.
|
156 |
|
src/class-tiny-compress-client.php
ADDED
@@ -0,0 +1,174 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Tiny Compress Images - WordPress plugin.
|
4 |
+
* Copyright (C) 2015-2016 Voormedia B.V.
|
5 |
+
*
|
6 |
+
* This program is free software; you can redistribute it and/or modify it
|
7 |
+
* under the terms of the GNU General Public License as published by the Free
|
8 |
+
* Software Foundation; either version 2 of the License, or (at your option)
|
9 |
+
* any later version.
|
10 |
+
*
|
11 |
+
* This program is distributed in the hope that it will be useful, but WITHOUT
|
12 |
+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
13 |
+
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
14 |
+
* more details.
|
15 |
+
*
|
16 |
+
* You should have received a copy of the GNU General Public License along
|
17 |
+
* with this program; if not, write to the Free Software Foundation, Inc., 51
|
18 |
+
* Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
19 |
+
*/
|
20 |
+
|
21 |
+
if ( ! defined( '\Tinify\VERSION' ) ) {
|
22 |
+
/* Load vendored client if it is not yet loaded. */
|
23 |
+
require_once dirname( __FILE__ ) . '/vendor/tinify/Tinify/Exception.php';
|
24 |
+
require_once dirname( __FILE__ ) . '/vendor/tinify/Tinify/ResultMeta.php';
|
25 |
+
require_once dirname( __FILE__ ) . '/vendor/tinify/Tinify/Result.php';
|
26 |
+
require_once dirname( __FILE__ ) . '/vendor/tinify/Tinify/Source.php';
|
27 |
+
require_once dirname( __FILE__ ) . '/vendor/tinify/Tinify/Client.php';
|
28 |
+
require_once dirname( __FILE__ ) . '/vendor/tinify/Tinify.php';
|
29 |
+
}
|
30 |
+
|
31 |
+
class Tiny_Compress_Client extends Tiny_Compress {
|
32 |
+
private $last_error_code = 0;
|
33 |
+
private $last_message = '';
|
34 |
+
private $proxy;
|
35 |
+
|
36 |
+
protected function __construct( $api_key, $after_compress_callback ) {
|
37 |
+
parent::__construct( $after_compress_callback );
|
38 |
+
|
39 |
+
$this->proxy = new WP_HTTP_Proxy();
|
40 |
+
|
41 |
+
\Tinify\setAppIdentifier( self::identifier() );
|
42 |
+
\Tinify\setKey( $api_key );
|
43 |
+
}
|
44 |
+
|
45 |
+
public function can_create_key() {
|
46 |
+
return true;
|
47 |
+
}
|
48 |
+
|
49 |
+
public function get_compression_count() {
|
50 |
+
return \Tinify\getCompressionCount();
|
51 |
+
}
|
52 |
+
|
53 |
+
public function get_key() {
|
54 |
+
return \Tinify\getKey();
|
55 |
+
}
|
56 |
+
|
57 |
+
public function limit_reached() {
|
58 |
+
return 429 == $this->last_error_code;
|
59 |
+
}
|
60 |
+
|
61 |
+
protected function validate() {
|
62 |
+
try {
|
63 |
+
$this->last_error_code = 0;
|
64 |
+
$this->set_request_options( \Tinify\Tinify::getClient() );
|
65 |
+
|
66 |
+
\Tinify\Tinify::getClient()->request( 'post', '/shrink' );
|
67 |
+
return true;
|
68 |
+
|
69 |
+
} catch (\Tinify\Exception $err) {
|
70 |
+
$this->last_error_code = $err->status;
|
71 |
+
|
72 |
+
if ( 429 == $err->status || 400 == $err->status ) {
|
73 |
+
return true;
|
74 |
+
}
|
75 |
+
|
76 |
+
throw new Tiny_Exception(
|
77 |
+
$err->getMessage(),
|
78 |
+
get_class( $err ),
|
79 |
+
$err->status
|
80 |
+
);
|
81 |
+
}
|
82 |
+
}
|
83 |
+
|
84 |
+
protected function compress( $input, $resize_opts, $preserve_opts ) {
|
85 |
+
try {
|
86 |
+
$this->last_error_code = 0;
|
87 |
+
$this->set_request_options( \Tinify\Tinify::getClient() );
|
88 |
+
|
89 |
+
$source = \Tinify\fromBuffer( $input );
|
90 |
+
|
91 |
+
if ( $resize_opts ) {
|
92 |
+
$source = $source->resize( $resize_opts );
|
93 |
+
}
|
94 |
+
|
95 |
+
if ( $preserve_opts ) {
|
96 |
+
$source = $source->preserve( $preserve_opts );
|
97 |
+
}
|
98 |
+
|
99 |
+
$result = $source->result();
|
100 |
+
|
101 |
+
$meta = array(
|
102 |
+
'input' => array(
|
103 |
+
'size' => strlen( $input ),
|
104 |
+
'type' => $result->mediaType(),
|
105 |
+
),
|
106 |
+
'output' => array(
|
107 |
+
'size' => $result->size(),
|
108 |
+
'type' => $result->mediaType(),
|
109 |
+
'width' => $result->width(),
|
110 |
+
'height' => $result->height(),
|
111 |
+
'ratio' => round( $result->size() / strlen( $input ), 4 ),
|
112 |
+
),
|
113 |
+
);
|
114 |
+
|
115 |
+
$buffer = $result->toBuffer();
|
116 |
+
return array( $buffer, $meta );
|
117 |
+
|
118 |
+
} catch (\Tinify\Exception $err) {
|
119 |
+
$this->last_error_code = $err->status;
|
120 |
+
|
121 |
+
throw new Tiny_Exception(
|
122 |
+
$err->getMessage(),
|
123 |
+
get_class( $err ),
|
124 |
+
$err->status
|
125 |
+
);
|
126 |
+
}
|
127 |
+
}
|
128 |
+
|
129 |
+
public function create_key( $email, $options ) {
|
130 |
+
try {
|
131 |
+
$this->last_error_code = 0;
|
132 |
+
$this->set_request_options(
|
133 |
+
\Tinify\Tinify::getClient( \Tinify\Tinify::ANONYMOUS )
|
134 |
+
);
|
135 |
+
|
136 |
+
\Tinify\createKey( $email, $options );
|
137 |
+
} catch (\Tinify\Exception $err) {
|
138 |
+
$this->last_error_code = $err->status;
|
139 |
+
|
140 |
+
throw new Tiny_Exception(
|
141 |
+
$err->getMessage(),
|
142 |
+
get_class( $err ),
|
143 |
+
$err->status
|
144 |
+
);
|
145 |
+
}
|
146 |
+
}
|
147 |
+
|
148 |
+
private function set_request_options( $client ) {
|
149 |
+
/* The client does not let us override cURL properties yet, so we have
|
150 |
+
to use a reflection property. */
|
151 |
+
$property = new ReflectionProperty( $client, 'options' );
|
152 |
+
$property->setAccessible( true );
|
153 |
+
$options = $property->getValue( $client );
|
154 |
+
|
155 |
+
if ( TINY_DEBUG ) {
|
156 |
+
$file = fopen( dirname( __FILE__ ) . '/curl.log', 'w' );
|
157 |
+
if ( is_resource( $file ) ) {
|
158 |
+
$options[ CURLOPT_VERBOSE ] = true;
|
159 |
+
$options[ CURLOPT_STDERR ] = $file;
|
160 |
+
}
|
161 |
+
}
|
162 |
+
|
163 |
+
if ( $this->proxy->is_enabled() && $this->proxy->send_through_proxy( $url ) ) {
|
164 |
+
$options[ CURLOPT_PROXYTYPE ] = CURLPROXY_HTTP;
|
165 |
+
$options[ CURLOPT_PROXY ] = $this->proxy->host();
|
166 |
+
$options[ CURLOPT_PROXYPORT ] = $this->proxy->port();
|
167 |
+
|
168 |
+
if ( $this->proxy->use_authentication() ) {
|
169 |
+
$options[ CURLOPT_PROXYAUTH ] = CURLAUTH_ANY;
|
170 |
+
$options[ CURLOPT_PROXYUSERPWD ] = $this->proxy->authentication();
|
171 |
+
}
|
172 |
+
}
|
173 |
+
}
|
174 |
+
}
|
src/class-tiny-compress-curl.php
DELETED
@@ -1,132 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Tiny Compress Images - WordPress plugin.
|
4 |
-
* Copyright (C) 2015-2016 Voormedia B.V.
|
5 |
-
*
|
6 |
-
* This program is free software; you can redistribute it and/or modify it
|
7 |
-
* under the terms of the GNU General Public License as published by the Free
|
8 |
-
* Software Foundation; either version 2 of the License, or (at your option)
|
9 |
-
* any later version.
|
10 |
-
*
|
11 |
-
* This program is distributed in the hope that it will be useful, but WITHOUT
|
12 |
-
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
13 |
-
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
14 |
-
* more details.
|
15 |
-
*
|
16 |
-
* You should have received a copy of the GNU General Public License along
|
17 |
-
* with this program; if not, write to the Free Software Foundation, Inc., 51
|
18 |
-
* Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
19 |
-
*/
|
20 |
-
|
21 |
-
class Tiny_Compress_Curl extends Tiny_Compress {
|
22 |
-
private static $curl_version;
|
23 |
-
|
24 |
-
protected static function curl_version() {
|
25 |
-
if (is_null(self::$curl_version)) {
|
26 |
-
self::$curl_version = curl_version();
|
27 |
-
}
|
28 |
-
return self::$curl_version['version'];
|
29 |
-
}
|
30 |
-
|
31 |
-
protected function shrink_options($input) {
|
32 |
-
$options = array(
|
33 |
-
CURLOPT_URL => Tiny_Config::URL,
|
34 |
-
CURLOPT_USERPWD => 'api:' . $this->api_key,
|
35 |
-
CURLOPT_POSTFIELDS => $input,
|
36 |
-
CURLOPT_BINARYTRANSFER => true,
|
37 |
-
CURLOPT_RETURNTRANSFER => true,
|
38 |
-
CURLOPT_HEADER => true,
|
39 |
-
CURLOPT_CAINFO => self::get_ca_file(),
|
40 |
-
CURLOPT_SSL_VERIFYPEER => true,
|
41 |
-
CURLOPT_USERAGENT => Tiny_WP_Base::plugin_identification() . ' cURL/' . self::curl_version()
|
42 |
-
);
|
43 |
-
$options = $this->add_proxy_options(Tiny_Config::URL, $options);
|
44 |
-
if (TINY_DEBUG) {
|
45 |
-
$f = fopen(dirname(__FILE__) . '/curl.log', 'w');
|
46 |
-
if (is_resource($f)) {
|
47 |
-
$options[CURLOPT_VERBOSE] = true;
|
48 |
-
$options[CURLOPT_STDERR] = $f;
|
49 |
-
}
|
50 |
-
}
|
51 |
-
return $options;
|
52 |
-
}
|
53 |
-
|
54 |
-
protected function shrink($input) {
|
55 |
-
$request = curl_init();
|
56 |
-
curl_setopt_array($request, $this->shrink_options($input));
|
57 |
-
|
58 |
-
$response = curl_exec($request);
|
59 |
-
if ($response === false || $response === null) {
|
60 |
-
return array(array(
|
61 |
-
'error' => 'CurlError',
|
62 |
-
'message' => sprintf("cURL: %s [%d]", curl_error($request), curl_errno($request))
|
63 |
-
), null, null
|
64 |
-
);
|
65 |
-
}
|
66 |
-
|
67 |
-
$header_size = curl_getinfo($request, CURLINFO_HEADER_SIZE);
|
68 |
-
$status_code = curl_getinfo($request, CURLINFO_HTTP_CODE);
|
69 |
-
$headers = self::parse_headers(substr($response, 0, $header_size));
|
70 |
-
curl_close($request);
|
71 |
-
|
72 |
-
return array(self::decode(substr($response, $header_size)), $headers, $status_code);
|
73 |
-
}
|
74 |
-
|
75 |
-
protected function output_options($url, $resize_options, $preserve_options) {
|
76 |
-
$options = array(
|
77 |
-
CURLOPT_URL => $url,
|
78 |
-
CURLOPT_RETURNTRANSFER => true,
|
79 |
-
CURLOPT_HEADER => true,
|
80 |
-
CURLOPT_CAINFO => self::get_ca_file(),
|
81 |
-
CURLOPT_SSL_VERIFYPEER => true,
|
82 |
-
CURLOPT_USERAGENT => Tiny_WP_Base::plugin_identification() . ' cURL/' . self::curl_version()
|
83 |
-
);
|
84 |
-
$this->add_proxy_options($url, $options);
|
85 |
-
|
86 |
-
$body = array();
|
87 |
-
|
88 |
-
if ($preserve_options) {
|
89 |
-
$body['preserve'] = $preserve_options;
|
90 |
-
}
|
91 |
-
|
92 |
-
if ($resize_options) {
|
93 |
-
$body['resize'] = $resize_options;
|
94 |
-
}
|
95 |
-
|
96 |
-
if ($resize_options || $preserve_options) {
|
97 |
-
$options[CURLOPT_USERPWD] = 'api:' . $this->api_key;
|
98 |
-
$options[CURLOPT_HTTPHEADER] = array('Content-Type: application/json');
|
99 |
-
$options[CURLOPT_POSTFIELDS] = json_encode($body);
|
100 |
-
}
|
101 |
-
|
102 |
-
return $options;
|
103 |
-
}
|
104 |
-
|
105 |
-
protected function output($url, $resize_options, $preserve_options) {
|
106 |
-
$request = curl_init();
|
107 |
-
$options = $this->output_options($url, $resize_options, $preserve_options);
|
108 |
-
curl_setopt_array($request, $options);
|
109 |
-
|
110 |
-
$response = curl_exec($request);
|
111 |
-
$header_size = curl_getinfo($request, CURLINFO_HEADER_SIZE);
|
112 |
-
$status_code = curl_getinfo($request, CURLINFO_HTTP_CODE);
|
113 |
-
$headers = self::parse_headers(substr($response, 0, $header_size));
|
114 |
-
curl_close($request);
|
115 |
-
|
116 |
-
return array(substr($response, $header_size), $headers, $status_code);
|
117 |
-
}
|
118 |
-
|
119 |
-
private function add_proxy_options($url, $options) {
|
120 |
-
if ($this->proxy->is_enabled() && $this->proxy->send_through_proxy($url)) {
|
121 |
-
$options[CURLOPT_PROXYTYPE] = CURLPROXY_HTTP;
|
122 |
-
$options[CURLOPT_PROXY] = $this->proxy->host();
|
123 |
-
$options[CURLOPT_PROXYPORT] = $this->proxy->port();
|
124 |
-
|
125 |
-
if ($this->proxy->use_authentication()) {
|
126 |
-
$options[CURLOPT_PROXYAUTH] = CURLAUTH_ANY;
|
127 |
-
$options[CURLOPT_PROXYUSERPWD] = $this->proxy->authentication();
|
128 |
-
}
|
129 |
-
}
|
130 |
-
return $options;
|
131 |
-
}
|
132 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
src/class-tiny-compress-fopen.php
CHANGED
@@ -19,106 +19,235 @@
|
|
19 |
*/
|
20 |
|
21 |
class Tiny_Compress_Fopen extends Tiny_Compress {
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
124 |
}
|
19 |
*/
|
20 |
|
21 |
class Tiny_Compress_Fopen extends Tiny_Compress {
|
22 |
+
private $last_error_code = 0;
|
23 |
+
private $compression_count;
|
24 |
+
private $api_key;
|
25 |
+
|
26 |
+
protected static function identifier() {
|
27 |
+
parent::identifier() . ' fopen';
|
28 |
+
}
|
29 |
+
|
30 |
+
protected function __construct( $api_key, $after_compress_callback ) {
|
31 |
+
parent::__construct( $after_compress_callback );
|
32 |
+
|
33 |
+
$this->api_key = $api_key;
|
34 |
+
}
|
35 |
+
|
36 |
+
public function can_create_key() {
|
37 |
+
return false;
|
38 |
+
}
|
39 |
+
|
40 |
+
public function get_compression_count() {
|
41 |
+
return $this->compression_count;
|
42 |
+
}
|
43 |
+
|
44 |
+
public function get_key() {
|
45 |
+
return $this->api_key;
|
46 |
+
}
|
47 |
+
|
48 |
+
public function limit_reached() {
|
49 |
+
return 429 == $this->last_error_code;
|
50 |
+
}
|
51 |
+
|
52 |
+
protected function validate() {
|
53 |
+
$params = $this->request_options( 'POST' );
|
54 |
+
list($details, $headers, $status_code) = $this->request( $params );
|
55 |
+
|
56 |
+
if ( 429 == $status_code || 400 == $status_code ) {
|
57 |
+
return true;
|
58 |
+
} else if ( is_array( $details ) && isset( $details['error'] ) ) {
|
59 |
+
throw new Tiny_Exception(
|
60 |
+
$details['message'],
|
61 |
+
'Tinify\Exception',
|
62 |
+
$status_code
|
63 |
+
);
|
64 |
+
} else {
|
65 |
+
throw new Tiny_Exception(
|
66 |
+
'Unexpected error during validation',
|
67 |
+
'Tinify\Exception',
|
68 |
+
$status_code
|
69 |
+
);
|
70 |
+
}
|
71 |
+
}
|
72 |
+
|
73 |
+
protected function compress( $input, $resize_opts, $preserve_opts ) {
|
74 |
+
$params = $this->request_options( 'POST', $input );
|
75 |
+
list($details, $headers, $status_code) = $this->request( $params );
|
76 |
+
|
77 |
+
$output_url = isset( $headers['location'] ) ? $headers['location'] : null;
|
78 |
+
if ( $status_code >= 400 && is_array( $details ) && isset( $details['error'] ) ) {
|
79 |
+
throw new Tiny_Exception(
|
80 |
+
$details['message'],
|
81 |
+
'Tinify\Exception',
|
82 |
+
$status_code
|
83 |
+
);
|
84 |
+
} else if ( $status_code >= 400 ) {
|
85 |
+
throw new Tiny_Exception(
|
86 |
+
'Unexpected error during compression',
|
87 |
+
'Tinify\Exception',
|
88 |
+
$status_code
|
89 |
+
);
|
90 |
+
} else if ( null === $output_url ) {
|
91 |
+
throw new Tiny_Exception(
|
92 |
+
'Could not find output location',
|
93 |
+
'Tinify\Exception'
|
94 |
+
);
|
95 |
+
}
|
96 |
+
|
97 |
+
$params = $this->output_request_options( $resize_opts, $preserve_opts );
|
98 |
+
list($output, $headers, $status_code) = $this->request( $params, $output_url );
|
99 |
+
|
100 |
+
if ( $status_code >= 400 && is_array( $output ) && isset( $output['error'] ) ) {
|
101 |
+
throw new Tiny_Exception(
|
102 |
+
$output['message'],
|
103 |
+
'Tinify\Exception',
|
104 |
+
$status_code
|
105 |
+
);
|
106 |
+
} else if ( $status_code >= 400 ) {
|
107 |
+
throw new Tiny_Exception(
|
108 |
+
'Unexpected error during output retrieval',
|
109 |
+
'Tinify\Exception',
|
110 |
+
$status_code
|
111 |
+
);
|
112 |
+
}
|
113 |
+
|
114 |
+
if ( is_string( $output ) && 0 == strlen( $output ) ) {
|
115 |
+
throw new Tiny_Exception(
|
116 |
+
'Could not download output',
|
117 |
+
'Tinify\Exception'
|
118 |
+
);
|
119 |
+
}
|
120 |
+
|
121 |
+
$meta = array(
|
122 |
+
'input' => array(
|
123 |
+
'size' => strlen( $input ),
|
124 |
+
'type' => $headers['content-type'],
|
125 |
+
),
|
126 |
+
'output' => array(
|
127 |
+
'size' => strlen( $output ),
|
128 |
+
'type' => $headers['content-type'],
|
129 |
+
'width' => intval( $headers['image-width'] ),
|
130 |
+
'height' => intval( $headers['image-height'] ),
|
131 |
+
'ratio' => round( strlen( $output ) / strlen( $input ), 4 ),
|
132 |
+
),
|
133 |
+
);
|
134 |
+
|
135 |
+
return array( $output, $meta );
|
136 |
+
}
|
137 |
+
|
138 |
+
private function request( $params, $url = Tiny_Config::URL ) {
|
139 |
+
$context = stream_context_create( $params );
|
140 |
+
$request = fopen( $url, 'rb', false, $context );
|
141 |
+
|
142 |
+
if ( ! $request ) {
|
143 |
+
throw new Tiny_Exception(
|
144 |
+
'Could not execute request, enable cURL for detailed errors',
|
145 |
+
'Tinify\FopenError'
|
146 |
+
);
|
147 |
+
}
|
148 |
+
|
149 |
+
$meta_data = stream_get_meta_data( $request );
|
150 |
+
$headers = $meta_data['wrapper_data'];
|
151 |
+
if ( ! is_array( $headers ) ) {
|
152 |
+
$headers = iterator_to_array( $headers );
|
153 |
+
}
|
154 |
+
|
155 |
+
$status_code = $this->parse_status_code( $headers );
|
156 |
+
$headers = $this->parse_headers( $headers );
|
157 |
+
|
158 |
+
if ( isset( $headers['compression-count'] ) ) {
|
159 |
+
$this->compression_count = intval( $headers['compression-count'] );
|
160 |
+
}
|
161 |
+
|
162 |
+
$this->last_error_code = $status_code;
|
163 |
+
|
164 |
+
$response = stream_get_contents( $request );
|
165 |
+
fclose( $request );
|
166 |
+
|
167 |
+
if ( isset( $headers['content-type'] ) &&
|
168 |
+
substr( 'application/json' == $headers['content-type'], 0, 16 ) ) {
|
169 |
+
$response = $this->decode( $response );
|
170 |
+
}
|
171 |
+
|
172 |
+
return array( $response, $headers, $status_code );
|
173 |
+
}
|
174 |
+
|
175 |
+
private function parse_status_code( $headers ) {
|
176 |
+
if ( $headers && count( $headers ) > 0 ) {
|
177 |
+
$http_code_values = explode( ' ', $headers[0] );
|
178 |
+
if ( count( $http_code_values ) > 1 ) {
|
179 |
+
return intval( $http_code_values[1] );
|
180 |
+
}
|
181 |
+
}
|
182 |
+
return null;
|
183 |
+
}
|
184 |
+
|
185 |
+
private function parse_headers( $headers ) {
|
186 |
+
$res = array();
|
187 |
+
foreach ( $headers as $header ) {
|
188 |
+
$split = explode( ':', $header, 2 );
|
189 |
+
if ( 2 === count( $split ) ) {
|
190 |
+
$res[ strtolower( $split[0] ) ] = trim( $split[1] );
|
191 |
+
}
|
192 |
+
}
|
193 |
+
return $res;
|
194 |
+
}
|
195 |
+
|
196 |
+
private function request_options( $method, $body = null ) {
|
197 |
+
return array(
|
198 |
+
'http' => array(
|
199 |
+
'method' => $method,
|
200 |
+
'header' => array(
|
201 |
+
'Content-type: image/png',
|
202 |
+
'Authorization: Basic ' . base64_encode( 'api:' . $this->api_key ),
|
203 |
+
'User-Agent: ' . self::identifier(),
|
204 |
+
),
|
205 |
+
'content' => $body,
|
206 |
+
'follow_location' => 0,
|
207 |
+
'max_redirects' => 1, // Necessary for PHP 5.2
|
208 |
+
'ignore_errors' => true, // Apparently, a 201 is a failure
|
209 |
+
),
|
210 |
+
'ssl' => array(
|
211 |
+
'cafile' => $this->get_ca_file(),
|
212 |
+
'verify_peer' => true,
|
213 |
+
),
|
214 |
+
);
|
215 |
+
}
|
216 |
+
|
217 |
+
private function output_request_options( $resize_opts, $preserve_opts ) {
|
218 |
+
$body = array();
|
219 |
+
|
220 |
+
if ( $preserve_opts ) {
|
221 |
+
$body['preserve'] = $preserve_opts;
|
222 |
+
}
|
223 |
+
|
224 |
+
if ( $resize_opts ) {
|
225 |
+
$body['resize'] = $resize_opts;
|
226 |
+
}
|
227 |
+
|
228 |
+
if ( $resize_opts || $preserve_opts ) {
|
229 |
+
$options['http']['header'][] = 'Content-Type: application/json';
|
230 |
+
return $this->request_options( 'GET', json_encode( $body ) );
|
231 |
+
} else {
|
232 |
+
return $this->request_options( 'GET', null );
|
233 |
+
}
|
234 |
+
}
|
235 |
+
|
236 |
+
private static function get_ca_file() {
|
237 |
+
return dirname( __FILE__ ) . '/data/cacert.pem';
|
238 |
+
}
|
239 |
+
|
240 |
+
private static function decode( $text ) {
|
241 |
+
$result = json_decode( $text, true );
|
242 |
+
if ( null === $result ) {
|
243 |
+
$message = sprintf(
|
244 |
+
'JSON: %s [%d]',
|
245 |
+
(PHP_VERSION_ID >= 50500 ? json_last_error_msg() : 'Unknown error'),
|
246 |
+
(PHP_VERSION_ID >= 50300 ? json_last_error() : 'Error')
|
247 |
+
);
|
248 |
+
|
249 |
+
throw new Tiny_Exception( $message, 'JsonError' );
|
250 |
+
}
|
251 |
+
return $result;
|
252 |
+
}
|
253 |
}
|
src/class-tiny-compress.php
CHANGED
@@ -19,142 +19,149 @@
|
|
19 |
*/
|
20 |
|
21 |
abstract class Tiny_Compress {
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
160 |
}
|
19 |
*/
|
20 |
|
21 |
abstract class Tiny_Compress {
|
22 |
+
const KEY_MISSING = 'Register an account or provide an API key first';
|
23 |
+
const FILE_MISSING = 'File does not exist';
|
24 |
+
const WRITE_ERROR = 'No permission to write to file';
|
25 |
+
|
26 |
+
protected $after_compress_callback;
|
27 |
+
|
28 |
+
public static function create( $api_key, $after_compress_callback = null ) {
|
29 |
+
if ( Tiny_PHP::client_supported() ) {
|
30 |
+
$class = 'Tiny_Compress_Client';
|
31 |
+
} elseif ( Tiny_PHP::fopen_available() ) {
|
32 |
+
$class = 'Tiny_Compress_Fopen';
|
33 |
+
} else {
|
34 |
+
throw new Tiny_Exception(
|
35 |
+
'No HTTP client is available (cURL or fopen)',
|
36 |
+
'NoHttpClient'
|
37 |
+
);
|
38 |
+
}
|
39 |
+
return new $class($api_key, $after_compress_callback);
|
40 |
+
}
|
41 |
+
|
42 |
+
/* Based on pricing April 2016. */
|
43 |
+
public static function estimate_cost( $compressions, $usage ) {
|
44 |
+
return round(
|
45 |
+
self::compression_cost( $compressions + $usage ) -
|
46 |
+
self::compression_cost( $usage ),
|
47 |
+
2
|
48 |
+
);
|
49 |
+
}
|
50 |
+
|
51 |
+
protected function __construct( $after_compress_callback ) {
|
52 |
+
$this->after_compress_callback = $after_compress_callback;
|
53 |
+
}
|
54 |
+
|
55 |
+
public abstract function can_create_key();
|
56 |
+
public abstract function get_compression_count();
|
57 |
+
public abstract function get_key();
|
58 |
+
public abstract function limit_reached();
|
59 |
+
|
60 |
+
public function get_status() {
|
61 |
+
if ( $this->get_key() == null ) {
|
62 |
+
return (object) array(
|
63 |
+
'ok' => false,
|
64 |
+
'message' => self::KEY_MISSING,
|
65 |
+
);
|
66 |
+
}
|
67 |
+
|
68 |
+
$result = false;
|
69 |
+
$message = null;
|
70 |
+
|
71 |
+
try {
|
72 |
+
$result = $this->validate();
|
73 |
+
} catch (Tiny_Exception $err) {
|
74 |
+
if ( $err->get_status() == 401 ) {
|
75 |
+
$message = 'The key that you have entered is not valid';
|
76 |
+
} else {
|
77 |
+
list( $message ) = explode( ' (HTTP', $err->getMessage(), 2 );
|
78 |
+
}
|
79 |
+
}
|
80 |
+
|
81 |
+
$this->call_after_compress_callback();
|
82 |
+
|
83 |
+
return (object) array(
|
84 |
+
'ok' => $result,
|
85 |
+
'message' => $message,
|
86 |
+
);
|
87 |
+
}
|
88 |
+
|
89 |
+
public function compress_file( $file, $resize_opts = array(), $preserve_opts = array() ) {
|
90 |
+
if ( $this->get_key() == null ) {
|
91 |
+
throw new Tiny_Exception( self::KEY_MISSING, 'KeyError' );
|
92 |
+
}
|
93 |
+
|
94 |
+
if ( ! file_exists( $file ) ) {
|
95 |
+
throw new Tiny_Exception( self::FILE_MISSING, 'FileError' );
|
96 |
+
}
|
97 |
+
|
98 |
+
if ( ! is_writable( $file ) ) {
|
99 |
+
throw new Tiny_Exception( self::WRITE_ERROR, 'FileError' );
|
100 |
+
}
|
101 |
+
|
102 |
+
if ( ! $this->needs_resize( $file, $resize_opts ) ) {
|
103 |
+
$resize_opts = false;
|
104 |
+
}
|
105 |
+
|
106 |
+
try {
|
107 |
+
list( $output, $details ) = $this->compress(
|
108 |
+
file_get_contents( $file ),
|
109 |
+
$resize_opts,
|
110 |
+
$preserve_opts
|
111 |
+
);
|
112 |
+
} catch (Tiny_Exception $err) {
|
113 |
+
$this->call_after_compress_callback();
|
114 |
+
throw $err;
|
115 |
+
}
|
116 |
+
|
117 |
+
$this->call_after_compress_callback();
|
118 |
+
file_put_contents( $file, $output );
|
119 |
+
|
120 |
+
if ( $resize_opts ) {
|
121 |
+
$details['output']['resized'] = true;
|
122 |
+
}
|
123 |
+
|
124 |
+
return $details;
|
125 |
+
}
|
126 |
+
|
127 |
+
protected abstract function validate();
|
128 |
+
protected abstract function compress( $input, $resize_options, $preserve_options );
|
129 |
+
|
130 |
+
protected static function identifier() {
|
131 |
+
return 'WordPress/' . Tiny_Plugin::wp_version() . ' Plugin/' . Tiny_Plugin::version();
|
132 |
+
}
|
133 |
+
|
134 |
+
private function call_after_compress_callback() {
|
135 |
+
if ( $this->after_compress_callback ) {
|
136 |
+
call_user_func( $this->after_compress_callback, $this );
|
137 |
+
}
|
138 |
+
}
|
139 |
+
|
140 |
+
private static function needs_resize( $file, $resize_options ) {
|
141 |
+
if ( ! $resize_options ) {
|
142 |
+
return false;
|
143 |
+
}
|
144 |
+
|
145 |
+
list($width, $height) = getimagesize( $file );
|
146 |
+
|
147 |
+
return ( $width > $resize_options['width'] || $height > $resize_options['height'] );
|
148 |
+
}
|
149 |
+
|
150 |
+
private static function compression_cost( $total ) {
|
151 |
+
$cost = 0;
|
152 |
+
|
153 |
+
if ( $total > 10000 ) {
|
154 |
+
$compressions = $total - 10000;
|
155 |
+
$cost += $compressions * 0.002;
|
156 |
+
$total -= $compressions;
|
157 |
+
}
|
158 |
+
|
159 |
+
if ( $total > 500 ) {
|
160 |
+
$compressions = $total - 500;
|
161 |
+
$cost += $compressions * 0.009;
|
162 |
+
$total -= $compressions;
|
163 |
+
}
|
164 |
+
|
165 |
+
return $cost;
|
166 |
+
}
|
167 |
}
|
src/class-tiny-exception.php
CHANGED
@@ -19,14 +19,31 @@
|
|
19 |
*/
|
20 |
|
21 |
class Tiny_Exception extends Exception {
|
22 |
-
|
|
|
23 |
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
|
|
|
|
28 |
|
29 |
-
|
30 |
-
|
31 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
32 |
}
|
19 |
*/
|
20 |
|
21 |
class Tiny_Exception extends Exception {
|
22 |
+
protected $type;
|
23 |
+
protected $status;
|
24 |
|
25 |
+
public function __construct( $message, $type = null, $status = null ) {
|
26 |
+
if ( ! is_string( $message ) || ($type && ! is_string( $type )) ) {
|
27 |
+
throw new InvalidArgumentException(
|
28 |
+
'First two arguments must be strings'
|
29 |
+
);
|
30 |
+
}
|
31 |
|
32 |
+
$this->type = $type;
|
33 |
+
$this->status = $status;
|
34 |
+
|
35 |
+
parent::__construct( $message );
|
36 |
+
}
|
37 |
+
|
38 |
+
public function get_type() {
|
39 |
+
return $this->type;
|
40 |
+
}
|
41 |
+
|
42 |
+
public function get_status() {
|
43 |
+
return $this->status;
|
44 |
+
}
|
45 |
+
|
46 |
+
public function get_message() {
|
47 |
+
return $this->getMessage();
|
48 |
+
}
|
49 |
}
|
src/class-tiny-image-size.php
ADDED
@@ -0,0 +1,150 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Tiny Compress Images - WordPress plugin.
|
4 |
+
* Copyright (C) 2015-2016 Voormedia B.V.
|
5 |
+
*
|
6 |
+
* This program is free software; you can redistribute it and/or modify it
|
7 |
+
* under the terms of the GNU General Public License as published by the Free
|
8 |
+
* Software Foundation; either version 2 of the License, or (at your option)
|
9 |
+
* any later version.
|
10 |
+
*
|
11 |
+
* This program is distributed in the hope that it will be useful, but WITHOUT
|
12 |
+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
13 |
+
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
14 |
+
* more details.
|
15 |
+
*
|
16 |
+
* You should have received a copy of the GNU General Public License along
|
17 |
+
* with this program; if not, write to the Free Software Foundation, Inc., 51
|
18 |
+
* Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
19 |
+
*/
|
20 |
+
|
21 |
+
class Tiny_Image_Size {
|
22 |
+
public $filename;
|
23 |
+
public $meta = array();
|
24 |
+
|
25 |
+
/* Used more than once and not trivial, so we are memoizing these */
|
26 |
+
private $_exists;
|
27 |
+
private $_file_size;
|
28 |
+
private $_duplicate = false;
|
29 |
+
private $_duplicate_of_size = '';
|
30 |
+
|
31 |
+
public function __construct( $filename = null ) {
|
32 |
+
$this->filename = $filename;
|
33 |
+
}
|
34 |
+
|
35 |
+
public function end_time() {
|
36 |
+
if ( isset( $this->meta['end'] ) ) {
|
37 |
+
return $this->meta['end'];
|
38 |
+
} elseif ( isset( $this->meta['timestamp'] ) ) {
|
39 |
+
return $this->meta['timestamp'];
|
40 |
+
} else {
|
41 |
+
return null;
|
42 |
+
}
|
43 |
+
}
|
44 |
+
|
45 |
+
public function add_tiny_meta_start() {
|
46 |
+
$this->meta = array( 'start' => time() );
|
47 |
+
}
|
48 |
+
|
49 |
+
public function add_tiny_meta( $response ) {
|
50 |
+
if ( isset( $this->meta['start'] ) ) {
|
51 |
+
$this->meta = $response;
|
52 |
+
$this->meta['end'] = time();
|
53 |
+
}
|
54 |
+
}
|
55 |
+
|
56 |
+
public function add_tiny_meta_error( $exception ) {
|
57 |
+
if ( isset( $this->meta['start'] ) ) {
|
58 |
+
$this->meta = array(
|
59 |
+
'error' => $exception->get_type(),
|
60 |
+
'message' => $exception->get_message(),
|
61 |
+
'timestamp' => time(),
|
62 |
+
);
|
63 |
+
}
|
64 |
+
}
|
65 |
+
|
66 |
+
public function has_been_compressed() {
|
67 |
+
return isset( $this->meta['output'] );
|
68 |
+
}
|
69 |
+
|
70 |
+
public function never_compressed() {
|
71 |
+
return ! $this->has_been_compressed();
|
72 |
+
}
|
73 |
+
|
74 |
+
public function filesize() {
|
75 |
+
if ( is_null( $this->_file_size ) ) {
|
76 |
+
if ( $this->exists() ) {
|
77 |
+
$this->_file_size = filesize( $this->filename );
|
78 |
+
} else {
|
79 |
+
$this->_file_size = 0;
|
80 |
+
}
|
81 |
+
}
|
82 |
+
return $this->_file_size;
|
83 |
+
}
|
84 |
+
|
85 |
+
public function exists() {
|
86 |
+
if ( is_null( $this->_exists ) ) {
|
87 |
+
$this->_exists = $this->filename && file_exists( $this->filename );
|
88 |
+
}
|
89 |
+
return $this->_exists;
|
90 |
+
}
|
91 |
+
|
92 |
+
private function same_size() {
|
93 |
+
return ( $this->filesize() == $this->meta['output']['size'] );
|
94 |
+
}
|
95 |
+
|
96 |
+
public function still_exists() {
|
97 |
+
return $this->has_been_compressed() && $this->exists();
|
98 |
+
}
|
99 |
+
|
100 |
+
public function missing() {
|
101 |
+
return $this->has_been_compressed() && ! $this->exists();
|
102 |
+
}
|
103 |
+
|
104 |
+
public function compressed() {
|
105 |
+
return $this->still_exists() && $this->same_size();
|
106 |
+
}
|
107 |
+
|
108 |
+
public function modified() {
|
109 |
+
return $this->still_exists() && ! $this->same_size();
|
110 |
+
}
|
111 |
+
|
112 |
+
public function uncompressed() {
|
113 |
+
return $this->exists() &&
|
114 |
+
! $this->is_duplicate() &&
|
115 |
+
! ( isset( $this->meta['output'] ) && $this->same_size() );
|
116 |
+
}
|
117 |
+
|
118 |
+
public function in_progress() {
|
119 |
+
return $this->recently_started() && ! isset( $this->meta['output'] );
|
120 |
+
}
|
121 |
+
|
122 |
+
public function resized() {
|
123 |
+
return (
|
124 |
+
isset( $this->meta['output'] ) &&
|
125 |
+
isset( $this->meta['output']['resized'] ) &&
|
126 |
+
$this->meta['output']['resized']
|
127 |
+
);
|
128 |
+
}
|
129 |
+
|
130 |
+
public function mark_duplicate( $duplicate_size_name ) {
|
131 |
+
$this->_duplicate = true;
|
132 |
+
$this->_duplicate_of_size = $duplicate_size_name;
|
133 |
+
}
|
134 |
+
|
135 |
+
public function is_duplicate() {
|
136 |
+
return $this->_duplicate;
|
137 |
+
}
|
138 |
+
|
139 |
+
public function duplicate_of_size() {
|
140 |
+
return $this->_duplicate_of_size;
|
141 |
+
}
|
142 |
+
|
143 |
+
private function recently_started() {
|
144 |
+
$thirty_minutes_ago = date( 'U' ) - ( 60 * 30 );
|
145 |
+
return (
|
146 |
+
isset( $this->meta['start'] ) &&
|
147 |
+
$this->meta['start'] > $thirty_minutes_ago
|
148 |
+
);
|
149 |
+
}
|
150 |
+
}
|
src/class-tiny-image.php
ADDED
@@ -0,0 +1,413 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Tiny Compress Images - WordPress plugin.
|
4 |
+
* Copyright (C) 2015-2016 Voormedia B.V.
|
5 |
+
*
|
6 |
+
* This program is free software; you can redistribute it and/or modify it
|
7 |
+
* under the terms of the GNU General Public License as published by the Free
|
8 |
+
* Software Foundation; either version 2 of the License, or (at your option)
|
9 |
+
* any later version.
|
10 |
+
*
|
11 |
+
* This program is distributed in the hope that it will be useful, but WITHOUT
|
12 |
+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
13 |
+
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
14 |
+
* more details.
|
15 |
+
*
|
16 |
+
* You should have received a copy of the GNU General Public License along
|
17 |
+
* with this program; if not, write to the Free Software Foundation, Inc., 51
|
18 |
+
* Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
19 |
+
*/
|
20 |
+
|
21 |
+
class Tiny_Image {
|
22 |
+
const META_KEY = 'tiny_compress_images';
|
23 |
+
const ORIGINAL = 0;
|
24 |
+
|
25 |
+
private $id;
|
26 |
+
private $name;
|
27 |
+
private $wp_metadata;
|
28 |
+
private $sizes = array();
|
29 |
+
private $statistics = array();
|
30 |
+
|
31 |
+
public function __construct( $id, $wp_metadata = null, $tiny_metadata = null ) {
|
32 |
+
$this->id = $id;
|
33 |
+
$this->wp_metadata = $wp_metadata;
|
34 |
+
$this->parse_wp_metadata();
|
35 |
+
$this->parse_tiny_metadata( $tiny_metadata );
|
36 |
+
$this->detect_duplicates();
|
37 |
+
}
|
38 |
+
|
39 |
+
private function parse_wp_metadata() {
|
40 |
+
if ( ! is_array( $this->wp_metadata ) ) {
|
41 |
+
$this->wp_metadata = wp_get_attachment_metadata( $this->id );
|
42 |
+
}
|
43 |
+
if ( ! is_array( $this->wp_metadata ) ) {
|
44 |
+
return;
|
45 |
+
}
|
46 |
+
$path_info = pathinfo( $this->wp_metadata['file'] );
|
47 |
+
$this->name = $path_info['basename'];
|
48 |
+
|
49 |
+
$upload_dir = wp_upload_dir();
|
50 |
+
$path_prefix = $upload_dir['basedir'] . '/';
|
51 |
+
if ( isset( $path_info['dirname'] ) ) {
|
52 |
+
$path_prefix .= $path_info['dirname'] .'/';
|
53 |
+
}
|
54 |
+
|
55 |
+
$filename = $path_prefix . $this->name;
|
56 |
+
$this->sizes[ self::ORIGINAL ] = new Tiny_Image_Size( $filename );
|
57 |
+
|
58 |
+
if ( isset( $this->wp_metadata['sizes'] ) && is_array( $this->wp_metadata['sizes'] ) ) {
|
59 |
+
foreach ( $this->wp_metadata['sizes'] as $size_name => $info ) {
|
60 |
+
$this->sizes[ $size_name ] = new Tiny_Image_Size( $path_prefix . $info['file'] );
|
61 |
+
}
|
62 |
+
}
|
63 |
+
}
|
64 |
+
|
65 |
+
private function detect_duplicates() {
|
66 |
+
$filenames = array();
|
67 |
+
|
68 |
+
if ( is_array( $this->wp_metadata )
|
69 |
+
&& isset( $this->wp_metadata['sizes'] )
|
70 |
+
&& is_array( $this->wp_metadata['sizes'] ) ) {
|
71 |
+
|
72 |
+
$settings = new Tiny_Settings();
|
73 |
+
$active_sizes = $settings->get_sizes();
|
74 |
+
$active_tinify_sizes = $settings->get_active_tinify_sizes();
|
75 |
+
|
76 |
+
foreach ( $this->wp_metadata['sizes'] as $size_name => $size ) {
|
77 |
+
if ( $this->sizes[ $size_name ]->has_been_compressed()
|
78 |
+
&& array_key_exists( $size_name, $active_sizes ) ) {
|
79 |
+
$filenames = $this->duplicate_check( $filenames, $size['file'], $size_name );
|
80 |
+
}
|
81 |
+
}
|
82 |
+
foreach ( $this->wp_metadata['sizes'] as $size_name => $size ) {
|
83 |
+
if ( in_array( $size_name, $active_tinify_sizes, true ) ) {
|
84 |
+
$filenames = $this->duplicate_check( $filenames, $size['file'], $size_name );
|
85 |
+
}
|
86 |
+
}
|
87 |
+
foreach ( $this->wp_metadata['sizes'] as $size_name => $size ) {
|
88 |
+
if ( array_key_exists( $size_name, $active_sizes ) ) {
|
89 |
+
$filenames = $this->duplicate_check( $filenames, $size['file'], $size_name );
|
90 |
+
}
|
91 |
+
}
|
92 |
+
foreach ( $this->wp_metadata['sizes'] as $size_name => $size ) {
|
93 |
+
$filenames = $this->duplicate_check( $filenames, $size['file'], $size_name );
|
94 |
+
}
|
95 |
+
}
|
96 |
+
}
|
97 |
+
|
98 |
+
private function duplicate_check( $filenames, $file, $size_name ) {
|
99 |
+
if ( isset( $filenames[ $file ] ) ) {
|
100 |
+
if ( $filenames[ $file ] != $size_name ) {
|
101 |
+
$this->sizes[ $size_name ]->mark_duplicate( $filenames[ $file ] );
|
102 |
+
}
|
103 |
+
} else {
|
104 |
+
$filenames[ $file ] = $size_name;
|
105 |
+
}
|
106 |
+
return $filenames;
|
107 |
+
}
|
108 |
+
|
109 |
+
private function parse_tiny_metadata( $tiny_metadata ) {
|
110 |
+
if ( is_null( $tiny_metadata ) ) {
|
111 |
+
$tiny_metadata = get_post_meta( $this->id, self::META_KEY, true );
|
112 |
+
}
|
113 |
+
if ( $tiny_metadata ) {
|
114 |
+
foreach ( $tiny_metadata as $size => $meta ) {
|
115 |
+
if ( ! isset( $this->sizes[ $size ] ) ) {
|
116 |
+
$this->sizes[ $size ] = new Tiny_Image_Size();
|
117 |
+
}
|
118 |
+
$this->sizes[ $size ]->meta = $meta;
|
119 |
+
}
|
120 |
+
}
|
121 |
+
}
|
122 |
+
|
123 |
+
public function get_id() {
|
124 |
+
return $this->id;
|
125 |
+
}
|
126 |
+
|
127 |
+
public function get_name() {
|
128 |
+
return $this->name;
|
129 |
+
}
|
130 |
+
|
131 |
+
public function get_wp_metadata() {
|
132 |
+
return $this->wp_metadata;
|
133 |
+
}
|
134 |
+
|
135 |
+
public function file_type_allowed() {
|
136 |
+
return in_array( $this->get_mime_type(), array( 'image/jpeg', 'image/png' ) );
|
137 |
+
}
|
138 |
+
|
139 |
+
public function get_mime_type() {
|
140 |
+
return get_post_mime_type( $this->id );
|
141 |
+
}
|
142 |
+
|
143 |
+
public function compress( $settings ) {
|
144 |
+
if ( $settings->get_compressor() === null || ! $this->file_type_allowed() ) {
|
145 |
+
return;
|
146 |
+
}
|
147 |
+
|
148 |
+
$success = 0;
|
149 |
+
$failed = 0;
|
150 |
+
|
151 |
+
$compressor = $settings->get_compressor();
|
152 |
+
$active_tinify_sizes = $settings->get_active_tinify_sizes();
|
153 |
+
$uncompressed_sizes = $this->filter_image_sizes( 'uncompressed', $active_tinify_sizes );
|
154 |
+
|
155 |
+
foreach ( $uncompressed_sizes as $size_name => $size ) {
|
156 |
+
if ( ! $size->is_duplicate() ) {
|
157 |
+
$size->add_tiny_meta_start();
|
158 |
+
$this->update_tiny_post_meta();
|
159 |
+
$resize = $settings->get_resize_options( $size_name );
|
160 |
+
$preserve = $settings->get_preserve_options( $size_name );
|
161 |
+
try {
|
162 |
+
$response = $compressor->compress_file( $size->filename, $resize, $preserve );
|
163 |
+
$size->add_tiny_meta( $response );
|
164 |
+
$success++;
|
165 |
+
} catch (Tiny_Exception $e) {
|
166 |
+
$size->add_tiny_meta_error( $e );
|
167 |
+
$failed++;
|
168 |
+
}
|
169 |
+
$this->add_wp_metadata( $size_name, $size );
|
170 |
+
$this->update_tiny_post_meta();
|
171 |
+
}
|
172 |
+
}
|
173 |
+
return array( 'success' => $success, 'failed' => $failed );
|
174 |
+
}
|
175 |
+
|
176 |
+
public function add_wp_metadata( $size_name, $size ) {
|
177 |
+
if ( self::is_original( $size_name ) ) {
|
178 |
+
if ( isset( $size->meta['output'] ) ) {
|
179 |
+
$output = $size->meta['output'];
|
180 |
+
if ( isset( $output['width'] ) && isset( $output['height'] ) ) {
|
181 |
+
$this->wp_metadata['width'] = $output['width'];
|
182 |
+
$this->wp_metadata['height'] = $output['height'];
|
183 |
+
}
|
184 |
+
}
|
185 |
+
}
|
186 |
+
}
|
187 |
+
|
188 |
+
public function update_tiny_post_meta() {
|
189 |
+
$tiny_metadata = array();
|
190 |
+
foreach ( $this->sizes as $size_name => $size ) {
|
191 |
+
$tiny_metadata[ $size_name ] = $size->meta;
|
192 |
+
}
|
193 |
+
update_post_meta( $this->id, self::META_KEY, $tiny_metadata );
|
194 |
+
}
|
195 |
+
|
196 |
+
public function get_image_sizes() {
|
197 |
+
$original = isset( $this->sizes[ self::ORIGINAL ] )
|
198 |
+
? array( self::ORIGINAL => $this->sizes[ self::ORIGINAL ] )
|
199 |
+
: array();
|
200 |
+
$compressed = array();
|
201 |
+
$uncompressed = array();
|
202 |
+
foreach ( $this->sizes as $size_name => $size ) {
|
203 |
+
if ( self::is_original( $size_name ) ) {
|
204 |
+
continue;
|
205 |
+
}
|
206 |
+
|
207 |
+
if ( $size->has_been_compressed() ) {
|
208 |
+
$compressed[ $size_name ] = $size;
|
209 |
+
} else {
|
210 |
+
$uncompressed[ $size_name ] = $size;
|
211 |
+
}
|
212 |
+
}
|
213 |
+
ksort( $compressed );
|
214 |
+
ksort( $uncompressed );
|
215 |
+
return $original + $compressed + $uncompressed;
|
216 |
+
}
|
217 |
+
|
218 |
+
public function get_image_size( $size = self::ORIGINAL, $create = false ) {
|
219 |
+
if ( isset( $this->sizes[ $size ] ) ) {
|
220 |
+
return $this->sizes[ $size ];
|
221 |
+
} elseif ( $create ) {
|
222 |
+
return new Tiny_Image_Size();
|
223 |
+
} else {
|
224 |
+
return null;
|
225 |
+
}
|
226 |
+
}
|
227 |
+
|
228 |
+
public function filter_image_sizes( $method, $filter_sizes = null ) {
|
229 |
+
$selection = array();
|
230 |
+
if ( is_null( $filter_sizes ) ) {
|
231 |
+
$filter_sizes = array_keys( $this->sizes );
|
232 |
+
}
|
233 |
+
foreach ( $filter_sizes as $size_name ) {
|
234 |
+
if ( ! isset( $this->sizes[ $size_name ] ) ) {
|
235 |
+
continue;
|
236 |
+
}
|
237 |
+
|
238 |
+
$tiny_image_size = $this->sizes[ $size_name ];
|
239 |
+
if ( $tiny_image_size->$method() ) {
|
240 |
+
$selection[ $size_name ] = $tiny_image_size;
|
241 |
+
}
|
242 |
+
}
|
243 |
+
return $selection;
|
244 |
+
}
|
245 |
+
|
246 |
+
public function get_count( $methods, $count_sizes = null ) {
|
247 |
+
$stats = array_fill_keys( $methods, 0 );
|
248 |
+
if ( is_null( $count_sizes ) ) {
|
249 |
+
$count_sizes = array_keys( $this->sizes );
|
250 |
+
}
|
251 |
+
foreach ( $count_sizes as $size ) {
|
252 |
+
if ( ! isset( $this->sizes[ $size ] ) ) {
|
253 |
+
continue;
|
254 |
+
}
|
255 |
+
|
256 |
+
foreach ( $methods as $method ) {
|
257 |
+
if ( $this->sizes[ $size ]->$method() ) {
|
258 |
+
$stats[ $method ]++;
|
259 |
+
}
|
260 |
+
}
|
261 |
+
}
|
262 |
+
return $stats;
|
263 |
+
}
|
264 |
+
|
265 |
+
public function get_latest_error() {
|
266 |
+
$settings = new Tiny_Settings();
|
267 |
+
$active_tinify_sizes = $settings->get_active_tinify_sizes();
|
268 |
+
$error_message = null;
|
269 |
+
$last_timestamp = null;
|
270 |
+
foreach ( $this->sizes as $size_name => $size ) {
|
271 |
+
if ( in_array( $size_name, $active_tinify_sizes, true ) ) {
|
272 |
+
if ( isset( $size->meta['error'] ) && isset( $size->meta['message'] ) ) {
|
273 |
+
if ( null === $last_timestamp || $last_timestamp < $size->meta['timestamp'] ) {
|
274 |
+
$last_timestamp = $size->meta['timestamp'];
|
275 |
+
$error_message = $size->meta['message'];
|
276 |
+
}
|
277 |
+
}
|
278 |
+
}
|
279 |
+
}
|
280 |
+
return $error_message;
|
281 |
+
}
|
282 |
+
|
283 |
+
public function get_savings( $stats ) {
|
284 |
+
$before = $stats['initial_total_size'];
|
285 |
+
$after = $stats['optimized_total_size'];
|
286 |
+
if ( 0 === $before ) {
|
287 |
+
$savings = 0;
|
288 |
+
} else {
|
289 |
+
$savings = ($before - $after) / $before * 100;
|
290 |
+
}
|
291 |
+
return '' . number_format( $savings, 1 );
|
292 |
+
}
|
293 |
+
|
294 |
+
public function get_statistics() {
|
295 |
+
if ( $this->statistics ) {
|
296 |
+
error_log( 'Strangely the image statistics are asked for again.' );
|
297 |
+
return $this->statistics;
|
298 |
+
}
|
299 |
+
|
300 |
+
$this->statistics['initial_total_size'] = 0;
|
301 |
+
$this->statistics['optimized_total_size'] = 0;
|
302 |
+
$this->statistics['image_sizes_optimized'] = 0;
|
303 |
+
$this->statistics['available_unoptimized_sizes'] = 0;
|
304 |
+
|
305 |
+
$settings = new Tiny_Settings();
|
306 |
+
$active_sizes = $settings->get_sizes();
|
307 |
+
$active_tinify_sizes = $settings->get_active_tinify_sizes();
|
308 |
+
|
309 |
+
foreach ( $this->sizes as $size_name => $size ) {
|
310 |
+
if ( ! $size->is_duplicate() ) {
|
311 |
+
if ( array_key_exists( $size_name, $active_sizes ) ) {
|
312 |
+
if ( isset( $size->meta['input'] ) ) {
|
313 |
+
$input = $size->meta['input'];
|
314 |
+
$this->statistics['initial_total_size'] += intval( $input['size'] );
|
315 |
+
|
316 |
+
if ( isset( $size->meta['output'] ) ) {
|
317 |
+
$output = $size->meta['output'];
|
318 |
+
if ( $size->modified() ) {
|
319 |
+
$this->statistics['optimized_total_size'] += $size->filesize();
|
320 |
+
if ( in_array( $size_name, $active_tinify_sizes, true ) ) {
|
321 |
+
$this->statistics['available_unoptimized_sizes'] += 1;
|
322 |
+
}
|
323 |
+
} else {
|
324 |
+
$this->statistics['optimized_total_size']
|
325 |
+
+= intval( $output['size'] );
|
326 |
+
$this->statistics['image_sizes_optimized'] += 1;
|
327 |
+
}
|
328 |
+
} else {
|
329 |
+
$this->statistics['optimized_total_size'] += intval( $input['size'] );
|
330 |
+
}
|
331 |
+
} elseif ( $size->exists() ) {
|
332 |
+
$this->statistics['initial_total_size'] += $size->filesize();
|
333 |
+
$this->statistics['optimized_total_size'] += $size->filesize();
|
334 |
+
if ( in_array( $size_name, $active_tinify_sizes, true ) ) {
|
335 |
+
$this->statistics['available_unoptimized_sizes'] += 1;
|
336 |
+
}
|
337 |
+
}
|
338 |
+
}
|
339 |
+
}
|
340 |
+
}
|
341 |
+
|
342 |
+
return $this->statistics;
|
343 |
+
}
|
344 |
+
|
345 |
+
public static function get_optimization_statistics( $result = null ) {
|
346 |
+
global $wpdb;
|
347 |
+
|
348 |
+
if ( is_null( $result ) ) {
|
349 |
+
// Select posts that have "_wp_attachment_metadata" image metadata
|
350 |
+
// and optionally contain "tiny_compress_images" metadata.
|
351 |
+
$query =
|
352 |
+
"SELECT
|
353 |
+
$wpdb->posts.ID,
|
354 |
+
$wpdb->posts.post_title,
|
355 |
+
$wpdb->postmeta.meta_value,
|
356 |
+
wp_postmeta_file.meta_value AS unique_attachment_name,
|
357 |
+
wp_postmeta_tiny.meta_value AS tiny_meta_value
|
358 |
+
FROM $wpdb->posts
|
359 |
+
LEFT JOIN $wpdb->postmeta
|
360 |
+
ON $wpdb->posts.ID = $wpdb->postmeta.post_id
|
361 |
+
LEFT JOIN $wpdb->postmeta AS wp_postmeta_file
|
362 |
+
ON $wpdb->posts.ID = wp_postmeta_file.post_id
|
363 |
+
AND wp_postmeta_file.meta_key = '_wp_attached_file'
|
364 |
+
LEFT JOIN $wpdb->postmeta AS wp_postmeta_tiny
|
365 |
+
ON $wpdb->posts.ID = wp_postmeta_tiny.post_id
|
366 |
+
AND wp_postmeta_tiny.meta_key = '" . self::META_KEY . "'
|
367 |
+
WHERE $wpdb->posts.post_type = 'attachment'
|
368 |
+
AND (
|
369 |
+
$wpdb->posts.post_mime_type = 'image/jpeg' OR
|
370 |
+
$wpdb->posts.post_mime_type = 'image/png'
|
371 |
+
)
|
372 |
+
AND $wpdb->postmeta.meta_key = '_wp_attachment_metadata'
|
373 |
+
GROUP BY unique_attachment_name
|
374 |
+
ORDER BY ID DESC";
|
375 |
+
|
376 |
+
$result = $wpdb->get_results( $query, ARRAY_A );
|
377 |
+
}
|
378 |
+
|
379 |
+
$stats = array();
|
380 |
+
$stats['uploaded-images'] = 0;
|
381 |
+
$stats['optimized-image-sizes'] = 0;
|
382 |
+
$stats['available-unoptimised-sizes'] = 0;
|
383 |
+
$stats['optimized-library-size'] = 0;
|
384 |
+
$stats['unoptimized-library-size'] = 0;
|
385 |
+
$stats['available-for-optimization'] = array();
|
386 |
+
|
387 |
+
for ( $i = 0; $i < sizeof( $result ); $i++ ) {
|
388 |
+
$wp_metadata = unserialize( $result[ $i ]['meta_value'] );
|
389 |
+
$tiny_metadata = unserialize( $result[ $i ]['tiny_meta_value'] );
|
390 |
+
if ( ! is_array( $tiny_metadata ) ) {
|
391 |
+
$tiny_metadata = array();
|
392 |
+
}
|
393 |
+
$tiny_image = new Tiny_Image( $result[ $i ]['ID'], $wp_metadata, $tiny_metadata );
|
394 |
+
$image_stats = $tiny_image->get_statistics();
|
395 |
+
$stats['uploaded-images']++;
|
396 |
+
$stats['available-unoptimised-sizes'] += $image_stats['available_unoptimized_sizes'];
|
397 |
+
$stats['optimized-image-sizes'] += $image_stats['image_sizes_optimized'];
|
398 |
+
$stats['optimized-library-size'] += $image_stats['optimized_total_size'];
|
399 |
+
$stats['unoptimized-library-size'] += $image_stats['initial_total_size'];
|
400 |
+
if ( $image_stats['available_unoptimized_sizes'] > 0 ) {
|
401 |
+
$stats['available-for-optimization'][] = array(
|
402 |
+
'ID' => $result[ $i ]['ID'],
|
403 |
+
'post_title' => $result[ $i ]['post_title'],
|
404 |
+
);
|
405 |
+
}
|
406 |
+
}
|
407 |
+
return $stats;
|
408 |
+
}
|
409 |
+
|
410 |
+
public static function is_original( $size ) {
|
411 |
+
return self::ORIGINAL === $size;
|
412 |
+
}
|
413 |
+
}
|
src/class-tiny-metadata-image.php
DELETED
@@ -1,121 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Tiny Compress Images - WordPress plugin.
|
4 |
-
* Copyright (C) 2015-2016 Voormedia B.V.
|
5 |
-
*
|
6 |
-
* This program is free software; you can redistribute it and/or modify it
|
7 |
-
* under the terms of the GNU General Public License as published by the Free
|
8 |
-
* Software Foundation; either version 2 of the License, or (at your option)
|
9 |
-
* any later version.
|
10 |
-
*
|
11 |
-
* This program is distributed in the hope that it will be useful, but WITHOUT
|
12 |
-
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
13 |
-
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
14 |
-
* more details.
|
15 |
-
*
|
16 |
-
* You should have received a copy of the GNU General Public License along
|
17 |
-
* with this program; if not, write to the Free Software Foundation, Inc., 51
|
18 |
-
* Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
19 |
-
*/
|
20 |
-
|
21 |
-
class Tiny_Metadata_Image {
|
22 |
-
public $filename;
|
23 |
-
public $url;
|
24 |
-
public $meta;
|
25 |
-
|
26 |
-
/* Used more than once and not trivial, so we are memoizing these */
|
27 |
-
private $_exists;
|
28 |
-
private $_same_size;
|
29 |
-
|
30 |
-
public function __construct($filename=null, $url=null) {
|
31 |
-
$this->filename = $filename;
|
32 |
-
$this->url = $url;
|
33 |
-
}
|
34 |
-
|
35 |
-
public function end_time() {
|
36 |
-
if (!is_array($this->meta))
|
37 |
-
return null;
|
38 |
-
elseif (isset($this->meta['end']))
|
39 |
-
return $this->meta['end'];
|
40 |
-
elseif (isset($this->meta['timestamp']))
|
41 |
-
return $this->meta['timestamp'];
|
42 |
-
else
|
43 |
-
return null;
|
44 |
-
}
|
45 |
-
|
46 |
-
public function add_request() {
|
47 |
-
$this->meta = array('start' => time());
|
48 |
-
}
|
49 |
-
|
50 |
-
public function add_response($response) {
|
51 |
-
if (is_array($this->meta)) {
|
52 |
-
$this->meta = $response;
|
53 |
-
$this->meta['end'] = time();
|
54 |
-
}
|
55 |
-
}
|
56 |
-
|
57 |
-
public function add_exception($exception) {
|
58 |
-
if (is_array($this->meta)) {
|
59 |
-
$this->meta = array(
|
60 |
-
'error' => $exception->get_error(),
|
61 |
-
'message' => $exception->getMessage(),
|
62 |
-
'timestamp' => time()
|
63 |
-
);
|
64 |
-
}
|
65 |
-
}
|
66 |
-
|
67 |
-
public function has_been_compressed() {
|
68 |
-
return is_array($this->meta) && isset($this->meta['output']);
|
69 |
-
}
|
70 |
-
|
71 |
-
public function never_compressed() {
|
72 |
-
return !$this->has_been_compressed();
|
73 |
-
}
|
74 |
-
|
75 |
-
public function filesize() {
|
76 |
-
return filesize($this->filename);
|
77 |
-
}
|
78 |
-
|
79 |
-
public function exists() {
|
80 |
-
if (is_null($this->_exists)) {
|
81 |
-
$this->_exists = $this->filename && file_exists($this->filename);
|
82 |
-
}
|
83 |
-
return $this->_exists;
|
84 |
-
}
|
85 |
-
|
86 |
-
private function same_size() {
|
87 |
-
if (is_null($this->_same_size)) {
|
88 |
-
$this->_same_size = $this->filesize() == $this->meta['output']['size'];
|
89 |
-
}
|
90 |
-
return $this->_same_size;
|
91 |
-
}
|
92 |
-
|
93 |
-
public function still_exists() {
|
94 |
-
return $this->has_been_compressed() && $this->exists();
|
95 |
-
}
|
96 |
-
|
97 |
-
public function missing() {
|
98 |
-
return $this->has_been_compressed() && !$this->exists();
|
99 |
-
}
|
100 |
-
|
101 |
-
public function compressed() {
|
102 |
-
return $this->still_exists() && $this->same_size();
|
103 |
-
}
|
104 |
-
|
105 |
-
public function modified() {
|
106 |
-
return $this->still_exists() && !$this->same_size();
|
107 |
-
}
|
108 |
-
|
109 |
-
public function uncompressed() {
|
110 |
-
return $this->exists() && !(isset($this->meta['output']) && $this->same_size());
|
111 |
-
}
|
112 |
-
|
113 |
-
public function in_progress() {
|
114 |
-
return is_array($this->meta) && isset($this->meta['start']) && !isset($this->meta['output']);
|
115 |
-
}
|
116 |
-
|
117 |
-
public function resized() {
|
118 |
-
return is_array($this->meta) && isset($this->meta['output']) && isset($this->meta['output']['resized'])
|
119 |
-
&& $this->meta['output']['resized'];
|
120 |
-
}
|
121 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
src/class-tiny-metadata.php
DELETED
@@ -1,216 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Tiny Compress Images - WordPress plugin.
|
4 |
-
* Copyright (C) 2015-2016 Voormedia B.V.
|
5 |
-
*
|
6 |
-
* This program is free software; you can redistribute it and/or modify it
|
7 |
-
* under the terms of the GNU General Public License as published by the Free
|
8 |
-
* Software Foundation; either version 2 of the License, or (at your option)
|
9 |
-
* any later version.
|
10 |
-
*
|
11 |
-
* This program is distributed in the hope that it will be useful, but WITHOUT
|
12 |
-
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
13 |
-
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
14 |
-
* more details.
|
15 |
-
*
|
16 |
-
* You should have received a copy of the GNU General Public License along
|
17 |
-
* with this program; if not, write to the Free Software Foundation, Inc., 51
|
18 |
-
* Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
19 |
-
*/
|
20 |
-
|
21 |
-
class Tiny_Metadata {
|
22 |
-
const META_KEY = 'tiny_compress_images';
|
23 |
-
const ORIGINAL = 0;
|
24 |
-
|
25 |
-
private $id;
|
26 |
-
private $name;
|
27 |
-
private $images = array();
|
28 |
-
|
29 |
-
public static function is_original($size) {
|
30 |
-
return $size === self::ORIGINAL;
|
31 |
-
}
|
32 |
-
|
33 |
-
public function __construct($id, $wp_metadata=null) {
|
34 |
-
$this->id = $id;
|
35 |
-
|
36 |
-
if (is_null($wp_metadata)) {
|
37 |
-
$wp_metadata = wp_get_attachment_metadata($id);
|
38 |
-
}
|
39 |
-
$this->parse_wp_metadata($wp_metadata);
|
40 |
-
|
41 |
-
$values = get_post_meta($this->id, self::META_KEY, true);
|
42 |
-
if (!is_array($values)) {
|
43 |
-
$values = array();
|
44 |
-
}
|
45 |
-
foreach ($values as $size => $meta) {
|
46 |
-
if (!isset($this->images[$size])) {
|
47 |
-
$this->images[$size] = new Tiny_Metadata_Image();
|
48 |
-
}
|
49 |
-
$this->images[$size]->meta = $meta;
|
50 |
-
}
|
51 |
-
}
|
52 |
-
|
53 |
-
private function parse_wp_metadata($wp_metadata) {
|
54 |
-
if (!is_array($wp_metadata)) {
|
55 |
-
return;
|
56 |
-
}
|
57 |
-
|
58 |
-
$path_info = pathinfo($wp_metadata['file']);
|
59 |
-
$upload_dir = wp_upload_dir();
|
60 |
-
$path_prefix = $upload_dir['basedir'] . '/';
|
61 |
-
$url_prefix = $upload_dir['baseurl'] . '/';
|
62 |
-
if (isset($path_info['dirname'])) {
|
63 |
-
$path_prefix .= $path_info['dirname'] .'/';
|
64 |
-
$url_prefix .= $path_info['dirname'] .'/';
|
65 |
-
}
|
66 |
-
|
67 |
-
$this->name = $path_info['basename'];
|
68 |
-
|
69 |
-
$this->images[self::ORIGINAL] = new Tiny_Metadata_Image(
|
70 |
-
"$path_prefix${path_info['basename']}",
|
71 |
-
"$url_prefix${path_info['basename']}");
|
72 |
-
|
73 |
-
$unique_sizes = array();
|
74 |
-
if (isset($wp_metadata['sizes']) && is_array($wp_metadata['sizes'])) {
|
75 |
-
foreach ($wp_metadata['sizes'] as $size => $info) {
|
76 |
-
$filename = $info['file'];
|
77 |
-
|
78 |
-
if (!isset($unique_sizes[$filename])) {
|
79 |
-
$this->images[$size] = new Tiny_Metadata_Image(
|
80 |
-
"$path_prefix$filename", "$url_prefix$filename");
|
81 |
-
}
|
82 |
-
}
|
83 |
-
}
|
84 |
-
}
|
85 |
-
|
86 |
-
public function get_image($size=self::ORIGINAL, $create=false) {
|
87 |
-
if (isset($this->images[$size]))
|
88 |
-
return $this->images[$size];
|
89 |
-
elseif ($create)
|
90 |
-
return new Tiny_Metadata_Image();
|
91 |
-
else
|
92 |
-
return null;
|
93 |
-
}
|
94 |
-
|
95 |
-
public function update_wp_metadata($wp_metadata) {
|
96 |
-
$original = $this->get_image();
|
97 |
-
if (is_null($original) || !is_array($original->meta)) {
|
98 |
-
return $wp_metadata;
|
99 |
-
}
|
100 |
-
|
101 |
-
$m = $original->meta;
|
102 |
-
if (isset($m['output']) && isset($m['output']['width']) && isset($m['output']['height'])) {
|
103 |
-
$wp_metadata['width'] = $m['output']['width'];
|
104 |
-
$wp_metadata['height'] = $m['output']['height'];
|
105 |
-
}
|
106 |
-
return $wp_metadata;
|
107 |
-
}
|
108 |
-
|
109 |
-
public function update() {
|
110 |
-
$values = array();
|
111 |
-
foreach ($this->images as $size => $image) {
|
112 |
-
if (is_array($image->meta)) {
|
113 |
-
$values[$size] = $image->meta;
|
114 |
-
}
|
115 |
-
}
|
116 |
-
update_post_meta($this->id, self::META_KEY, $values);
|
117 |
-
}
|
118 |
-
|
119 |
-
public function get_id() {
|
120 |
-
return $this->id;
|
121 |
-
}
|
122 |
-
|
123 |
-
public function get_name() {
|
124 |
-
return $this->name;
|
125 |
-
}
|
126 |
-
|
127 |
-
public function can_be_compressed() {
|
128 |
-
return in_array($this->get_mime_type(), array("image/jpeg", "image/png"));
|
129 |
-
}
|
130 |
-
|
131 |
-
public function get_mime_type() {
|
132 |
-
return get_post_mime_type($this->id);
|
133 |
-
}
|
134 |
-
|
135 |
-
public function get_images() {
|
136 |
-
$original = isset($this->images[self::ORIGINAL])
|
137 |
-
? array(self::ORIGINAL => $this->images[self::ORIGINAL])
|
138 |
-
: array();
|
139 |
-
$compressed = array();
|
140 |
-
$uncompressed = array();
|
141 |
-
foreach ($this->images as $size => $image) {
|
142 |
-
if (self::is_original($size)) continue;
|
143 |
-
if ($image->has_been_compressed()) {
|
144 |
-
$compressed[$size] = $image;
|
145 |
-
} else {
|
146 |
-
$uncompressed[$size] = $image;
|
147 |
-
}
|
148 |
-
}
|
149 |
-
ksort($compressed);
|
150 |
-
ksort($uncompressed);
|
151 |
-
return $original + $compressed + $uncompressed;
|
152 |
-
}
|
153 |
-
|
154 |
-
public function filter_images($method, $sizes=null) {
|
155 |
-
$selection = array();
|
156 |
-
if (is_null($sizes)) {
|
157 |
-
$sizes = array_keys($this->images);
|
158 |
-
}
|
159 |
-
foreach ($sizes as $size) {
|
160 |
-
if (!isset($this->images[$size])) continue;
|
161 |
-
$image = $this->images[$size];
|
162 |
-
if ($image->$method()) {
|
163 |
-
$selection[$size] = $image;
|
164 |
-
}
|
165 |
-
}
|
166 |
-
return $selection;
|
167 |
-
}
|
168 |
-
|
169 |
-
public function get_count($methods, $sizes=null) {
|
170 |
-
$stats = array_fill_keys($methods, 0);
|
171 |
-
if (is_null($sizes)) {
|
172 |
-
$sizes = array_keys($this->images);
|
173 |
-
}
|
174 |
-
foreach ($sizes as $size) {
|
175 |
-
if (!isset($this->images[$size])) continue;
|
176 |
-
foreach ($methods as $method) {
|
177 |
-
if ($this->images[$size]->$method()) {
|
178 |
-
$stats[$method]++;
|
179 |
-
}
|
180 |
-
}
|
181 |
-
}
|
182 |
-
return $stats;
|
183 |
-
}
|
184 |
-
|
185 |
-
public function get_latest_error() {
|
186 |
-
$last_time = null;
|
187 |
-
$message = null;
|
188 |
-
foreach ($this->images as $size => $image) {
|
189 |
-
if (!is_array($image->meta)) continue;
|
190 |
-
$m = $image->meta;
|
191 |
-
if (isset($m['error']) && isset($m['message']) && ($last_time === null || $last_time < $m['timestamp'])) {
|
192 |
-
$last_time = $m['timestamp'];
|
193 |
-
$message = $m['message'];
|
194 |
-
}
|
195 |
-
}
|
196 |
-
return $message;
|
197 |
-
}
|
198 |
-
|
199 |
-
public function get_savings() {
|
200 |
-
$result = array(
|
201 |
-
'input' => 0,
|
202 |
-
'output' => 0,
|
203 |
-
'count' => 0
|
204 |
-
);
|
205 |
-
foreach ($this->images as $size => $image) {
|
206 |
-
if (!is_array($image->meta)) continue;
|
207 |
-
$m = $image->meta;
|
208 |
-
if (isset($m['input']) && isset($m['output'])) {
|
209 |
-
$result['count']++;
|
210 |
-
$result['input'] += $m['input']['size'];
|
211 |
-
$result['output'] += $m['output']['size'];
|
212 |
-
}
|
213 |
-
}
|
214 |
-
return $result;
|
215 |
-
}
|
216 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
src/class-tiny-notices.php
CHANGED
@@ -19,105 +19,123 @@
|
|
19 |
*/
|
20 |
|
21 |
class Tiny_Notices extends Tiny_WP_Base {
|
|
|
|
|
22 |
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
123 |
}
|
19 |
*/
|
20 |
|
21 |
class Tiny_Notices extends Tiny_WP_Base {
|
22 |
+
private $notices;
|
23 |
+
private $dismissals;
|
24 |
|
25 |
+
private static function get_option_key() {
|
26 |
+
return self::get_prefixed_name( 'admin_notices' );
|
27 |
+
}
|
28 |
+
|
29 |
+
private static function get_user_meta_key() {
|
30 |
+
return self::get_prefixed_name( 'admin_notice_dismissals' );
|
31 |
+
}
|
32 |
+
|
33 |
+
public function admin_init() {
|
34 |
+
add_action( 'wp_ajax_tiny_dismiss_notice', $this->get_method( 'dismiss' ) );
|
35 |
+
if ( current_user_can( 'manage_options' ) ) {
|
36 |
+
$this->show_stored();
|
37 |
+
}
|
38 |
+
}
|
39 |
+
|
40 |
+
private function load_notices() {
|
41 |
+
if ( is_array( $this->notices ) ) {
|
42 |
+
return;
|
43 |
+
}
|
44 |
+
$option = get_option( self::get_option_key() );
|
45 |
+
$this->notices = is_array( $option ) ? $option : array();
|
46 |
+
}
|
47 |
+
|
48 |
+
private function save_notices() {
|
49 |
+
update_option( self::get_option_key(), $this->notices );
|
50 |
+
}
|
51 |
+
|
52 |
+
private function load() {
|
53 |
+
$this->load_notices();
|
54 |
+
$this->load_dismissals();
|
55 |
+
}
|
56 |
+
|
57 |
+
private function load_dismissals() {
|
58 |
+
if ( is_array( $this->dismissals ) ) {
|
59 |
+
return;
|
60 |
+
}
|
61 |
+
|
62 |
+
$meta = get_user_meta(
|
63 |
+
$this->get_user_id(),
|
64 |
+
$this->get_user_meta_key(),
|
65 |
+
true
|
66 |
+
);
|
67 |
+
|
68 |
+
$this->dismissals = is_array( $meta ) ? $meta : array();
|
69 |
+
}
|
70 |
+
|
71 |
+
private function save_dismissals() {
|
72 |
+
update_user_meta(
|
73 |
+
$this->get_user_id(),
|
74 |
+
$this->get_user_meta_key(),
|
75 |
+
$this->dismissals
|
76 |
+
);
|
77 |
+
}
|
78 |
+
|
79 |
+
private function show_stored() {
|
80 |
+
$this->load();
|
81 |
+
foreach ( $this->notices as $name => $message ) {
|
82 |
+
if ( empty( $this->dismissals[ $name ] ) ) {
|
83 |
+
$this->show( $name, $message );
|
84 |
+
}
|
85 |
+
}
|
86 |
+
}
|
87 |
+
|
88 |
+
public function add( $name, $message ) {
|
89 |
+
$this->load_notices();
|
90 |
+
$this->notices[ $name ] = $message;
|
91 |
+
$this->save_notices();
|
92 |
+
}
|
93 |
+
|
94 |
+
public function remove( $name ) {
|
95 |
+
$this->load();
|
96 |
+
if ( isset( $this->notices[ $name ] ) ) {
|
97 |
+
unset( $this->notices[ $name ] );
|
98 |
+
$this->save_notices();
|
99 |
+
}
|
100 |
+
if ( isset( $this->dismissals[ $name ] ) ) {
|
101 |
+
unset( $this->dismissals[ $name ] );
|
102 |
+
$this->save_dismissals();
|
103 |
+
}
|
104 |
+
}
|
105 |
+
|
106 |
+
public function dismiss() {
|
107 |
+
if ( empty( $_POST['name'] ) || ! $this->check_ajax_referer() ) {
|
108 |
+
echo json_encode( false );
|
109 |
+
exit();
|
110 |
+
}
|
111 |
+
$this->load_dismissals();
|
112 |
+
$this->dismissals[ $_POST['name'] ] = true;
|
113 |
+
$this->save_dismissals();
|
114 |
+
echo json_encode( true );
|
115 |
+
exit();
|
116 |
+
}
|
117 |
+
|
118 |
+
public function show( $name, $message, $klass = 'error', $dismissible = true ) {
|
119 |
+
$css = array( $klass, 'notice', 'tiny-notice' );
|
120 |
+
if ( ! $dismissible ) {
|
121 |
+
$add = '</p>';
|
122 |
+
} else if ( self::check_wp_version( 4.2 ) ) {
|
123 |
+
$add = '</p>';
|
124 |
+
$css[] = 'is-dismissible';
|
125 |
+
} else {
|
126 |
+
$add = ' <a href="#" class="tiny-dismiss">' .
|
127 |
+
esc_html__( 'Dismiss', 'tiny-compress-images' ) . '</a></p>';
|
128 |
+
}
|
129 |
+
|
130 |
+
$css = implode( ' ', $css );
|
131 |
+
$plugin_name = esc_html__( 'Compress JPEG & PNG images', 'tiny-compress-images' );
|
132 |
+
|
133 |
+
add_action( 'admin_notices',
|
134 |
+
create_function(
|
135 |
+
'',
|
136 |
+
"echo '<div class=\"$css\" data-name=\"$name\"><p>" .
|
137 |
+
$plugin_name . ": $message$add</div>';"
|
138 |
+
)
|
139 |
+
);
|
140 |
+
}
|
141 |
}
|
src/class-tiny-php.php
CHANGED
@@ -19,11 +19,11 @@
|
|
19 |
*/
|
20 |
|
21 |
class Tiny_PHP {
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
}
|
19 |
*/
|
20 |
|
21 |
class Tiny_PHP {
|
22 |
+
public static function fopen_available() {
|
23 |
+
return ini_get( 'allow_url_fopen' );
|
24 |
+
}
|
25 |
|
26 |
+
public static function client_supported() {
|
27 |
+
return version_compare( PHP_VERSION, '5.3', '>' ) && extension_loaded( 'curl' );
|
28 |
+
}
|
29 |
}
|
src/class-tiny-plugin.php
CHANGED
@@ -19,282 +19,433 @@
|
|
19 |
*/
|
20 |
|
21 |
class Tiny_Plugin extends Tiny_WP_Base {
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
|
166 |
-
|
167 |
-
|
168 |
-
|
169 |
-
|
170 |
-
|
171 |
-
|
172 |
-
|
173 |
-
|
174 |
-
|
175 |
-
|
176 |
-
|
177 |
-
|
178 |
-
|
179 |
-
|
180 |
-
|
181 |
-
|
182 |
-
|
183 |
-
|
184 |
-
|
185 |
-
|
186 |
-
|
187 |
-
|
188 |
-
|
189 |
-
|
190 |
-
|
191 |
-
|
192 |
-
|
193 |
-
|
194 |
-
|
195 |
-
|
196 |
-
|
197 |
-
|
198 |
-
|
199 |
-
|
200 |
-
|
201 |
-
|
202 |
-
|
203 |
-
|
204 |
-
|
205 |
-
|
206 |
-
|
207 |
-
|
208 |
-
|
209 |
-
|
210 |
-
|
211 |
-
|
212 |
-
|
213 |
-
|
214 |
-
|
215 |
-
|
216 |
-
|
217 |
-
|
218 |
-
|
219 |
-
|
220 |
-
|
221 |
-
|
222 |
-
|
223 |
-
|
224 |
-
|
225 |
-
|
226 |
-
|
227 |
-
|
228 |
-
|
229 |
-
|
230 |
-
|
231 |
-
|
232 |
-
|
233 |
-
|
234 |
-
|
235 |
-
|
236 |
-
|
237 |
-
|
238 |
-
|
239 |
-
|
240 |
-
|
241 |
-
|
242 |
-
|
243 |
-
|
244 |
-
|
245 |
-
|
246 |
-
|
247 |
-
|
248 |
-
|
249 |
-
|
250 |
-
|
251 |
-
|
252 |
-
|
253 |
-
|
254 |
-
|
255 |
-
|
256 |
-
|
257 |
-
|
258 |
-
|
259 |
-
|
260 |
-
|
261 |
-
|
262 |
-
|
263 |
-
|
264 |
-
|
265 |
-
|
266 |
-
|
267 |
-
|
268 |
-
|
269 |
-
|
270 |
-
|
271 |
-
|
272 |
-
|
273 |
-
|
274 |
-
|
275 |
-
|
276 |
-
|
277 |
-
|
278 |
-
|
279 |
-
|
280 |
-
|
281 |
-
|
282 |
-
|
283 |
-
|
284 |
-
|
285 |
-
|
286 |
-
|
287 |
-
|
288 |
-
|
289 |
-
|
290 |
-
|
291 |
-
|
292 |
-
|
293 |
-
|
294 |
-
|
295 |
-
|
296 |
-
|
297 |
-
|
298 |
-
|
299 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
300 |
}
|
19 |
*/
|
20 |
|
21 |
class Tiny_Plugin extends Tiny_WP_Base {
|
22 |
+
const MEDIA_COLUMN = self::NAME;
|
23 |
+
const DATETIME_FORMAT = 'Y-m-d G:i:s';
|
24 |
+
|
25 |
+
private static $version;
|
26 |
+
|
27 |
+
private $settings;
|
28 |
+
private $twig;
|
29 |
+
|
30 |
+
public static function jpeg_quality() {
|
31 |
+
return 85;
|
32 |
+
}
|
33 |
+
|
34 |
+
public static function version() {
|
35 |
+
if ( is_null( self::$version ) ) {
|
36 |
+
$plugin_data = get_plugin_data( dirname( __FILE__ ) . '/../tiny-compress-images.php' );
|
37 |
+
self::$version = $plugin_data['Version'];
|
38 |
+
}
|
39 |
+
return self::$version;
|
40 |
+
}
|
41 |
+
|
42 |
+
|
43 |
+
public function __construct() {
|
44 |
+
parent::__construct();
|
45 |
+
|
46 |
+
$this->settings = new Tiny_Settings();
|
47 |
+
}
|
48 |
+
|
49 |
+
public function set_compressor( $compressor ) {
|
50 |
+
$this->settings->set_compressor( $compressor );
|
51 |
+
}
|
52 |
+
|
53 |
+
public function init() {
|
54 |
+
add_filter( 'jpeg_quality',
|
55 |
+
$this->get_static_method( 'jpeg_quality' )
|
56 |
+
);
|
57 |
+
|
58 |
+
add_filter( 'wp_editor_set_quality',
|
59 |
+
$this->get_static_method( 'jpeg_quality' )
|
60 |
+
);
|
61 |
+
|
62 |
+
add_filter( 'wp_generate_attachment_metadata',
|
63 |
+
$this->get_method( 'compress_on_upload' ),
|
64 |
+
10, 2
|
65 |
+
);
|
66 |
+
|
67 |
+
load_plugin_textdomain( self::NAME, false,
|
68 |
+
dirname( plugin_basename( __FILE__ ) ) . '/languages'
|
69 |
+
);
|
70 |
+
}
|
71 |
+
|
72 |
+
public function admin_init() {
|
73 |
+
add_action( 'admin_enqueue_scripts',
|
74 |
+
$this->get_method( 'enqueue_scripts' )
|
75 |
+
);
|
76 |
+
|
77 |
+
add_action( 'admin_action_tiny_bulk_action',
|
78 |
+
$this->get_method( 'media_library_bulk_action' )
|
79 |
+
);
|
80 |
+
|
81 |
+
add_action( 'admin_action_-1',
|
82 |
+
$this->get_method( 'media_library_bulk_action' )
|
83 |
+
);
|
84 |
+
|
85 |
+
add_filter( 'manage_media_columns',
|
86 |
+
$this->get_method( 'add_media_columns' )
|
87 |
+
);
|
88 |
+
|
89 |
+
add_action( 'manage_media_custom_column',
|
90 |
+
$this->get_method( 'render_media_column' ),
|
91 |
+
10, 2
|
92 |
+
);
|
93 |
+
|
94 |
+
add_action( 'attachment_submitbox_misc_actions',
|
95 |
+
$this->get_method( 'show_media_info' )
|
96 |
+
);
|
97 |
+
|
98 |
+
add_action( 'wp_ajax_tiny_compress_image_from_library',
|
99 |
+
$this->get_method( 'compress_image_from_library' )
|
100 |
+
);
|
101 |
+
|
102 |
+
add_action( 'wp_ajax_tiny_compress_image_for_bulk',
|
103 |
+
$this->get_method( 'compress_image_for_bulk' )
|
104 |
+
);
|
105 |
+
|
106 |
+
add_action( 'wp_ajax_tiny_get_optimization_statistics',
|
107 |
+
$this->get_method( 'ajax_optimization_statistics' )
|
108 |
+
);
|
109 |
+
|
110 |
+
$plugin = plugin_basename(
|
111 |
+
dirname( dirname( __FILE__ ) ) . '/tiny-compress-images.php'
|
112 |
+
);
|
113 |
+
|
114 |
+
add_filter( "plugin_action_links_$plugin",
|
115 |
+
$this->get_method( 'add_plugin_links' )
|
116 |
+
);
|
117 |
+
|
118 |
+
add_thickbox();
|
119 |
+
}
|
120 |
+
|
121 |
+
public function admin_menu() {
|
122 |
+
add_media_page(
|
123 |
+
__( 'Bulk Optimization', 'tiny-compress-images' ),
|
124 |
+
esc_html__( 'Bulk Optimization', 'tiny-compress-images' ),
|
125 |
+
'upload_files',
|
126 |
+
'tiny-bulk-optimization',
|
127 |
+
$this->get_method( 'render_bulk_optimization_page' )
|
128 |
+
);
|
129 |
+
}
|
130 |
+
|
131 |
+
public function add_plugin_links( $current_links ) {
|
132 |
+
$additional = array(
|
133 |
+
'settings' => sprintf(
|
134 |
+
'<a href="options-media.php#%s">%s</a>',
|
135 |
+
self::NAME,
|
136 |
+
esc_html__( 'Settings', 'tiny-compress-images' )
|
137 |
+
),
|
138 |
+
'bulk' => sprintf(
|
139 |
+
'<a href="upload.php?page=tiny-bulk-optimization">%s</a>',
|
140 |
+
esc_html__( 'Bulk Optimization', 'tiny-compress-images' )
|
141 |
+
),
|
142 |
+
);
|
143 |
+
return array_merge( $additional, $current_links );
|
144 |
+
}
|
145 |
+
|
146 |
+
public function enqueue_scripts( $hook ) {
|
147 |
+
wp_enqueue_style( self::NAME .'_admin', plugins_url( '/css/admin.css', __FILE__ ),
|
148 |
+
array(), self::version() );
|
149 |
+
wp_register_script( self::NAME .'_admin', plugins_url( '/js/admin.js', __FILE__ ),
|
150 |
+
array(), self::version(), true );
|
151 |
+
|
152 |
+
// WordPress < 3.3 does not handle multidimensional arrays
|
153 |
+
wp_localize_script( self::NAME .'_admin', 'tinyCompress', array(
|
154 |
+
'nonce' => wp_create_nonce( 'tiny-compress' ),
|
155 |
+
'wpVersion' => self::wp_version(),
|
156 |
+
'pluginVersion' => self::version(),
|
157 |
+
'L10nAllDone' => __( 'All images are processed', 'tiny-compress-images' ),
|
158 |
+
'L10nNoActionTaken' => __( 'No action taken', 'tiny-compress-images' ),
|
159 |
+
'L10nBulkAction' => __( 'Compress Images', 'tiny-compress-images' ),
|
160 |
+
'L10nCancelled' => __( 'Cancelled', 'tiny-compress-images' ),
|
161 |
+
'L10nCompressing' => __( 'Compressing', 'tiny-compress-images' ),
|
162 |
+
'L10nCompressed' => __( 'compressed', 'tiny-compress-images' ),
|
163 |
+
'L10nFile' => __( 'File', 'tiny-compress-images' ),
|
164 |
+
'L10nSizesOptimized' => __( 'Sizes optimized', 'tiny-compress-images' ),
|
165 |
+
'L10nInitialSize' => __( 'Initial size', 'tiny-compress-images' ),
|
166 |
+
'L10nCurrentSize' => __( 'Current size', 'tiny-compress-images' ),
|
167 |
+
'L10nSavings' => __( 'Savings', 'tiny-compress-images' ),
|
168 |
+
'L10nStatus' => __( 'Status', 'tiny-compress-images' ),
|
169 |
+
'L10nShowMoreDetails' => __( 'Show more details', 'tiny-compress-images' ),
|
170 |
+
'L10nError' => __( 'Error', 'tiny-compress-images' ),
|
171 |
+
'L10nLatestError' => __( 'Latest error', 'tiny-compress-images' ),
|
172 |
+
'L10nInternalError' => __( 'Internal error', 'tiny-compress-images' ),
|
173 |
+
'L10nOutOf' => __( 'out of', 'tiny-compress-images' ),
|
174 |
+
'L10nWaiting' => __( 'Waiting', 'tiny-compress-images' ),
|
175 |
+
));
|
176 |
+
|
177 |
+
wp_enqueue_script( self::NAME .'_admin' );
|
178 |
+
|
179 |
+
if ( 'media_page_tiny-bulk-optimization' == $hook ) {
|
180 |
+
wp_enqueue_style(
|
181 |
+
self::NAME . '_tiny_bulk_optimization',
|
182 |
+
plugins_url( '/css/bulk-optimization.css', __FILE__ ),
|
183 |
+
array(), self::version()
|
184 |
+
);
|
185 |
+
|
186 |
+
wp_register_script(
|
187 |
+
self::NAME . '_tiny_bulk_optimization',
|
188 |
+
plugins_url( '/js/bulk-optimization.js', __FILE__ ),
|
189 |
+
array(), self::version(), true
|
190 |
+
);
|
191 |
+
|
192 |
+
wp_enqueue_script( self::NAME .'_tiny_bulk_optimization' );
|
193 |
+
}
|
194 |
+
|
195 |
+
}
|
196 |
+
|
197 |
+
public function compress_on_upload( $metadata, $attachment_id ) {
|
198 |
+
if ( ! empty( $metadata ) ) {
|
199 |
+
$tiny_image = new Tiny_Image( $attachment_id, $metadata );
|
200 |
+
$result = $tiny_image->compress( $this->settings );
|
201 |
+
return $tiny_image->get_wp_metadata();
|
202 |
+
} else {
|
203 |
+
return $metadata;
|
204 |
+
}
|
205 |
+
}
|
206 |
+
|
207 |
+
public function compress_image_from_library() {
|
208 |
+
if ( ! $this->check_ajax_referer() ) {
|
209 |
+
exit();
|
210 |
+
}
|
211 |
+
if ( ! current_user_can( 'upload_files' ) ) {
|
212 |
+
$message = esc_html__(
|
213 |
+
"You don't have permission to upload files.",
|
214 |
+
'tiny-compress-images'
|
215 |
+
);
|
216 |
+
echo $message;
|
217 |
+
exit();
|
218 |
+
}
|
219 |
+
if ( empty( $_POST['id'] ) ) {
|
220 |
+
$message = esc_html__(
|
221 |
+
'Not a valid media file.',
|
222 |
+
'tiny-compress-images'
|
223 |
+
);
|
224 |
+
echo $message;
|
225 |
+
exit();
|
226 |
+
}
|
227 |
+
$id = intval( $_POST['id'] );
|
228 |
+
$metadata = wp_get_attachment_metadata( $id );
|
229 |
+
if ( ! is_array( $metadata ) ) {
|
230 |
+
$message = esc_html__(
|
231 |
+
'Could not find metadata of media file.',
|
232 |
+
'tiny-compress-images'
|
233 |
+
);
|
234 |
+
echo $message;
|
235 |
+
exit;
|
236 |
+
}
|
237 |
+
|
238 |
+
$tiny_image = new Tiny_Image( $id, $metadata );
|
239 |
+
$result = $tiny_image->compress( $this->settings );
|
240 |
+
|
241 |
+
// The wp_update_attachment_metadata call is thrown because the
|
242 |
+
// dimensions of the original image can change. This will then
|
243 |
+
// trigger other plugins and can result in unexpected behaviour and
|
244 |
+
// further changes to the image. This may require another approach.
|
245 |
+
wp_update_attachment_metadata( $id, $tiny_image->get_wp_metadata() );
|
246 |
+
|
247 |
+
echo $this->render_compress_details( $tiny_image );
|
248 |
+
|
249 |
+
exit();
|
250 |
+
}
|
251 |
+
|
252 |
+
public function compress_image_for_bulk() {
|
253 |
+
if ( ! $this->check_ajax_referer() ) {
|
254 |
+
exit();
|
255 |
+
}
|
256 |
+
if ( ! current_user_can( 'upload_files' ) ) {
|
257 |
+
$message = esc_html__(
|
258 |
+
"You don't have permission to upload files.",
|
259 |
+
'tiny-compress-images'
|
260 |
+
);
|
261 |
+
echo json_encode( array( 'error' => $message ) );
|
262 |
+
exit();
|
263 |
+
}
|
264 |
+
if ( empty( $_POST['id'] ) ) {
|
265 |
+
$message = esc_html__(
|
266 |
+
'Not a valid media file.',
|
267 |
+
'tiny-compress-images'
|
268 |
+
);
|
269 |
+
echo json_encode( array( 'error' => $message ) );
|
270 |
+
exit();
|
271 |
+
}
|
272 |
+
$id = intval( $_POST['id'] );
|
273 |
+
$metadata = wp_get_attachment_metadata( $id );
|
274 |
+
if ( ! is_array( $metadata ) ) {
|
275 |
+
$message = esc_html__(
|
276 |
+
'Could not find metadata of media file.',
|
277 |
+
'tiny-compress-images'
|
278 |
+
);
|
279 |
+
echo json_encode( array( 'error' => $message ) );
|
280 |
+
exit;
|
281 |
+
}
|
282 |
+
|
283 |
+
$tiny_image_before = new Tiny_Image( $id, $metadata );
|
284 |
+
$image_statistics_before = $tiny_image_before->get_statistics();
|
285 |
+
$size_before = $image_statistics_before['optimized_total_size'];
|
286 |
+
|
287 |
+
$tiny_image = new Tiny_Image( $id, $metadata );
|
288 |
+
$result = $tiny_image->compress( $this->settings );
|
289 |
+
$image_statistics = $tiny_image->get_statistics();
|
290 |
+
wp_update_attachment_metadata( $id, $tiny_image->get_wp_metadata() );
|
291 |
+
|
292 |
+
$current_library_size = intval( $_POST['current_size'] );
|
293 |
+
$size_after = $image_statistics['optimized_total_size'];
|
294 |
+
$new_library_size = $current_library_size + $size_after - $size_before;
|
295 |
+
|
296 |
+
$result['message'] = $tiny_image->get_latest_error();
|
297 |
+
$result['image_sizes_optimized'] = $image_statistics['image_sizes_optimized'];
|
298 |
+
|
299 |
+
$result['initial_total_size'] = size_format(
|
300 |
+
$image_statistics['initial_total_size'], 1
|
301 |
+
);
|
302 |
+
|
303 |
+
$result['optimized_total_size'] = size_format(
|
304 |
+
$image_statistics['optimized_total_size'], 1
|
305 |
+
);
|
306 |
+
|
307 |
+
$result['savings'] = $tiny_image->get_savings( $image_statistics );
|
308 |
+
$result['status'] = $this->settings->get_status();
|
309 |
+
$result['thumbnail'] = wp_get_attachment_image(
|
310 |
+
$id, array( '30', '30' ), true, array(
|
311 |
+
'class' => 'pinkynail',
|
312 |
+
'alt' => '',
|
313 |
+
)
|
314 |
+
);
|
315 |
+
$result['size_change'] = $size_after - $size_before;
|
316 |
+
$result['human_readable_library_size'] = size_format( $new_library_size, 2 );
|
317 |
+
|
318 |
+
echo json_encode( $result );
|
319 |
+
|
320 |
+
exit();
|
321 |
+
}
|
322 |
+
|
323 |
+
public function ajax_optimization_statistics() {
|
324 |
+
if ( ! $this->check_ajax_referer() ) {
|
325 |
+
exit();
|
326 |
+
}
|
327 |
+
$stats = Tiny_Image::get_optimization_statistics();
|
328 |
+
echo json_encode( $stats );
|
329 |
+
exit();
|
330 |
+
}
|
331 |
+
|
332 |
+
public function media_library_bulk_action() {
|
333 |
+
check_admin_referer( 'bulk-media' );
|
334 |
+
|
335 |
+
if ( empty( $_REQUEST['action'] ) || (
|
336 |
+
'tiny_bulk_action' != $_REQUEST['action'] &&
|
337 |
+
'tiny_bulk_action' != $_REQUEST['action2'] ) ) {
|
338 |
+
return;
|
339 |
+
}
|
340 |
+
|
341 |
+
if ( empty( $_REQUEST['media'] ) || ( ! $_REQUEST['media'] ) ) {
|
342 |
+
return;
|
343 |
+
}
|
344 |
+
|
345 |
+
$ids = implode( '-', array_map( 'intval', $_REQUEST['media'] ) );
|
346 |
+
wp_redirect(add_query_arg(
|
347 |
+
'_wpnonce',
|
348 |
+
wp_create_nonce( 'tiny-bulk-optimization' ),
|
349 |
+
admin_url( "upload.php?page=tiny-bulk-optimization&ids=$ids" )
|
350 |
+
));
|
351 |
+
exit();
|
352 |
+
}
|
353 |
+
|
354 |
+
public function add_media_columns( $columns ) {
|
355 |
+
$columns[ self::MEDIA_COLUMN ] = esc_html__( 'Compression', 'tiny-compress-images' );
|
356 |
+
return $columns;
|
357 |
+
}
|
358 |
+
|
359 |
+
public function render_media_column( $column, $id ) {
|
360 |
+
if ( self::MEDIA_COLUMN === $column ) {
|
361 |
+
$tiny_image = new Tiny_Image( $id );
|
362 |
+
if ( $tiny_image->file_type_allowed() ) {
|
363 |
+
echo '<div class="tiny-ajax-container">';
|
364 |
+
$this->render_compress_details( $tiny_image );
|
365 |
+
echo '</div>';
|
366 |
+
}
|
367 |
+
}
|
368 |
+
}
|
369 |
+
|
370 |
+
public function show_media_info() {
|
371 |
+
global $post;
|
372 |
+
$tiny_image = new Tiny_Image( $post->ID );
|
373 |
+
if ( $tiny_image->file_type_allowed() ) {
|
374 |
+
echo '<div class="misc-pub-section tiny-compress-images">';
|
375 |
+
echo '<h4>';
|
376 |
+
esc_html_e( 'JPEG and PNG optimization', 'tiny-compress-images' );
|
377 |
+
echo '</h4>';
|
378 |
+
echo '<div class="tiny-ajax-container">';
|
379 |
+
$this->render_compress_details( $tiny_image );
|
380 |
+
echo '</div>';
|
381 |
+
echo '</div>';
|
382 |
+
}
|
383 |
+
}
|
384 |
+
|
385 |
+
private function render_compress_details( $tiny_image ) {
|
386 |
+
$in_progress = $tiny_image->filter_image_sizes( 'in_progress' );
|
387 |
+
if ( count( $in_progress ) > 0 ) {
|
388 |
+
include( dirname( __FILE__ ) . '/views/compress-details-processing.php' );
|
389 |
+
} else {
|
390 |
+
include( dirname( __FILE__ ) . '/views/compress-details.php' );
|
391 |
+
}
|
392 |
+
}
|
393 |
+
|
394 |
+
public function render_bulk_optimization_page() {
|
395 |
+
$stats = Tiny_Image::get_optimization_statistics();
|
396 |
+
$estimated_costs = Tiny_Compress::estimate_cost(
|
397 |
+
$stats['available-unoptimised-sizes'],
|
398 |
+
$this->settings->get_compression_count()
|
399 |
+
);
|
400 |
+
$admin_colors = self::retrieve_admin_colors();
|
401 |
+
|
402 |
+
$active_tinify_sizes = $this->settings->get_active_tinify_sizes();
|
403 |
+
|
404 |
+
$auto_start_bulk = isset( $_REQUEST['ids'] );
|
405 |
+
|
406 |
+
include( dirname( __FILE__ ) . '/views/bulk-optimization.php' );
|
407 |
+
}
|
408 |
+
|
409 |
+
private static function retrieve_admin_colors() {
|
410 |
+
global $_wp_admin_css_colors;
|
411 |
+
$admin_colour_scheme = get_user_option( 'admin_color', get_current_user_id() );
|
412 |
+
$admin_colors = array( '#0074aa', '#1685b5', '#78ca44', '#0086ba' ); // default
|
413 |
+
if ( isset( $_wp_admin_css_colors[ $admin_colour_scheme ] ) ) {
|
414 |
+
if ( isset( $_wp_admin_css_colors[ $admin_colour_scheme ]->colors ) ) {
|
415 |
+
$admin_colors = $_wp_admin_css_colors[ $admin_colour_scheme ]->colors;
|
416 |
+
}
|
417 |
+
}
|
418 |
+
if ( '#e5e5e5' == $admin_colors[0] && '#999' == $admin_colors[1] ) {
|
419 |
+
$admin_colors[0] = '#bbb';
|
420 |
+
}
|
421 |
+
if ( '#5589aa' == $admin_colors[0] && '#cfdfe9' == $admin_colors[1] ) {
|
422 |
+
$admin_colors[1] = '#85aec5';
|
423 |
+
}
|
424 |
+
if ( '#7c7976' == $admin_colors[0] && '#c6c6c6' == $admin_colors[1] ) {
|
425 |
+
$admin_colors[1] = '#adaba9';
|
426 |
+
$admin_colors[2] = '#adaba9';
|
427 |
+
}
|
428 |
+
if ( self::wp_version() > 3.7 ) {
|
429 |
+
if ( 'fresh' == $admin_colour_scheme ) {
|
430 |
+
$admin_colors = array( '#0074aa', '#1685b5', '#78ca44', '#0086ba' ); // better
|
431 |
+
}
|
432 |
+
}
|
433 |
+
return $admin_colors;
|
434 |
+
}
|
435 |
+
|
436 |
+
private function get_ids_to_compress() {
|
437 |
+
if ( empty( $_REQUEST['ids'] ) ) {
|
438 |
+
return array();
|
439 |
+
}
|
440 |
+
|
441 |
+
$ids = implode( ',', array_map( 'intval', explode( '-', $_REQUEST['ids'] ) ) );
|
442 |
+
$condition = "AND ID IN($ids)";
|
443 |
+
|
444 |
+
global $wpdb;
|
445 |
+
return $wpdb->get_results(
|
446 |
+
"SELECT ID, post_title FROM $wpdb->posts
|
447 |
+
WHERE post_type = 'attachment' $condition
|
448 |
+
AND (post_mime_type = 'image/jpeg' OR post_mime_type = 'image/png')
|
449 |
+
ORDER BY ID DESC", ARRAY_A);
|
450 |
+
}
|
451 |
}
|
src/class-tiny-settings.php
CHANGED
@@ -17,425 +17,646 @@
|
|
17 |
* with this program; if not, write to the Free Software Foundation, Inc., 51
|
18 |
* Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
19 |
*/
|
20 |
-
|
21 |
class Tiny_Settings extends Tiny_WP_Base {
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
|
166 |
-
|
167 |
-
|
168 |
-
|
169 |
-
|
170 |
-
|
171 |
-
|
172 |
-
|
173 |
-
|
174 |
-
|
175 |
-
|
176 |
-
|
177 |
-
|
178 |
-
|
179 |
-
|
180 |
-
|
181 |
-
|
182 |
-
|
183 |
-
|
184 |
-
|
185 |
-
|
186 |
-
|
187 |
-
|
188 |
-
|
189 |
-
|
190 |
-
|
191 |
-
|
192 |
-
|
193 |
-
|
194 |
-
|
195 |
-
|
196 |
-
|
197 |
-
|
198 |
-
|
199 |
-
|
200 |
-
|
201 |
-
|
202 |
-
|
203 |
-
|
204 |
-
|
205 |
-
|
206 |
-
|
207 |
-
|
208 |
-
|
209 |
-
|
210 |
-
|
211 |
-
|
212 |
-
|
213 |
-
|
214 |
-
|
215 |
-
|
216 |
-
|
217 |
-
|
218 |
-
|
219 |
-
|
220 |
-
|
221 |
-
|
222 |
-
|
223 |
-
|
224 |
-
|
225 |
-
|
226 |
-
|
227 |
-
|
228 |
-
|
229 |
-
|
230 |
-
|
231 |
-
|
232 |
-
|
233 |
-
|
234 |
-
|
235 |
-
|
236 |
-
|
237 |
-
|
238 |
-
|
239 |
-
|
240 |
-
|
241 |
-
|
242 |
-
|
243 |
-
|
244 |
-
|
245 |
-
|
246 |
-
|
247 |
-
|
248 |
-
|
249 |
-
|
250 |
-
|
251 |
-
|
252 |
-
|
253 |
-
|
254 |
-
|
255 |
-
|
256 |
-
|
257 |
-
|
258 |
-
|
259 |
-
|
260 |
-
|
261 |
-
|
262 |
-
|
263 |
-
|
264 |
-
|
265 |
-
|
266 |
-
|
267 |
-
|
268 |
-
|
269 |
-
|
270 |
-
|
271 |
-
|
272 |
-
|
273 |
-
|
274 |
-
|
275 |
-
|
276 |
-
|
277 |
-
|
278 |
-
|
279 |
-
|
280 |
-
|
281 |
-
|
282 |
-
|
283 |
-
|
284 |
-
|
285 |
-
|
286 |
-
|
287 |
-
|
288 |
-
|
289 |
-
|
290 |
-
|
291 |
-
|
292 |
-
|
293 |
-
|
294 |
-
|
295 |
-
|
296 |
-
|
297 |
-
|
298 |
-
|
299 |
-
|
300 |
-
|
301 |
-
|
302 |
-
|
303 |
-
|
304 |
-
|
305 |
-
|
306 |
-
|
307 |
-
|
308 |
-
|
309 |
-
|
310 |
-
|
311 |
-
|
312 |
-
|
313 |
-
|
314 |
-
|
315 |
-
|
316 |
-
|
317 |
-
|
318 |
-
|
319 |
-
|
320 |
-
|
321 |
-
|
322 |
-
|
323 |
-
|
324 |
-
|
325 |
-
|
326 |
-
|
327 |
-
|
328 |
-
|
329 |
-
|
330 |
-
|
331 |
-
|
332 |
-
|
333 |
-
|
334 |
-
|
335 |
-
|
336 |
-
|
337 |
-
|
338 |
-
|
339 |
-
|
340 |
-
|
341 |
-
|
342 |
-
|
343 |
-
|
344 |
-
|
345 |
-
|
346 |
-
|
347 |
-
|
348 |
-
|
349 |
-
|
350 |
-
|
351 |
-
|
352 |
-
|
353 |
-
|
354 |
-
|
355 |
-
|
356 |
-
|
357 |
-
|
358 |
-
|
359 |
-
|
360 |
-
|
361 |
-
|
362 |
-
|
363 |
-
|
364 |
-
|
365 |
-
|
366 |
-
|
367 |
-
|
368 |
-
|
369 |
-
|
370 |
-
|
371 |
-
|
372 |
-
|
373 |
-
|
374 |
-
|
375 |
-
|
376 |
-
|
377 |
-
|
378 |
-
|
379 |
-
|
380 |
-
|
381 |
-
|
382 |
-
|
383 |
-
|
384 |
-
|
385 |
-
|
386 |
-
|
387 |
-
|
388 |
-
|
389 |
-
|
390 |
-
|
391 |
-
|
392 |
-
|
393 |
-
|
394 |
-
|
395 |
-
|
396 |
-
|
397 |
-
|
398 |
-
|
399 |
-
|
400 |
-
|
401 |
-
|
402 |
-
|
403 |
-
|
404 |
-
|
405 |
-
|
406 |
-
|
407 |
-
|
408 |
-
|
409 |
-
|
410 |
-
|
411 |
-
|
412 |
-
|
413 |
-
|
414 |
-
|
415 |
-
|
416 |
-
|
417 |
-
|
418 |
-
|
419 |
-
|
420 |
-
|
421 |
-
|
422 |
-
|
423 |
-
|
424 |
-
|
425 |
-
|
426 |
-
|
427 |
-
|
428 |
-
|
429 |
-
|
430 |
-
|
431 |
-
|
432 |
-
|
433 |
-
|
434 |
-
|
435 |
-
|
436 |
-
|
437 |
-
|
438 |
-
|
439 |
-
|
440 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
441 |
}
|
17 |
* with this program; if not, write to the Free Software Foundation, Inc., 51
|
18 |
* Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
19 |
*/
|
|
|
20 |
class Tiny_Settings extends Tiny_WP_Base {
|
21 |
+
const DUMMY_SIZE = '_tiny_dummy';
|
22 |
+
|
23 |
+
private $sizes;
|
24 |
+
private $tinify_sizes;
|
25 |
+
private $compressor;
|
26 |
+
private $notices;
|
27 |
+
|
28 |
+
public function __construct() {
|
29 |
+
parent::__construct();
|
30 |
+
$this->notices = new Tiny_Notices();
|
31 |
+
}
|
32 |
+
|
33 |
+
private function init_compressor() {
|
34 |
+
$this->compressor = Tiny_Compress::create(
|
35 |
+
$this->get_api_key(),
|
36 |
+
$this->get_method( 'after_compress_callback' )
|
37 |
+
);
|
38 |
+
}
|
39 |
+
|
40 |
+
public function get_absolute_url() {
|
41 |
+
return get_admin_url( null, 'options-media.php#' . self::NAME );
|
42 |
+
}
|
43 |
+
|
44 |
+
public function xmlrpc_init() {
|
45 |
+
try {
|
46 |
+
$this->init_compressor();
|
47 |
+
} catch (Tiny_Exception $e) {
|
48 |
+
}
|
49 |
+
}
|
50 |
+
|
51 |
+
public function admin_init() {
|
52 |
+
if ( current_user_can( 'manage_options' ) ) {
|
53 |
+
if ( ! $this->get_api_key() ) {
|
54 |
+
$notice_class = 'error';
|
55 |
+
$notice = esc_html__(
|
56 |
+
'Please register or provide an API key to start compressing images',
|
57 |
+
'tiny-compress-images'
|
58 |
+
);
|
59 |
+
} else if ( $this->get_api_key_pending() ) {
|
60 |
+
$notice_class = 'notice-warning';
|
61 |
+
$notice = esc_html__(
|
62 |
+
'Please activate your account to start compressing images',
|
63 |
+
'tiny-compress-images'
|
64 |
+
);
|
65 |
+
}
|
66 |
+
|
67 |
+
if ( isset( $notice ) && $notice ) {
|
68 |
+
$link = sprintf(
|
69 |
+
'<a href="options-media.php#%s">%s</a>', self::NAME, $notice
|
70 |
+
);
|
71 |
+
$this->notices->show( 'setting', $link, $notice_class, false );
|
72 |
+
}
|
73 |
+
|
74 |
+
if ( ! Tiny_PHP::client_supported() ) {
|
75 |
+
$details = 'PHP ' . PHP_VERSION;
|
76 |
+
if ( extension_loaded( 'curl' ) ) {
|
77 |
+
$curlinfo = curl_version();
|
78 |
+
$details .= ' with curl ' . $curlinfo['version'];
|
79 |
+
} else {
|
80 |
+
$details .= ' without curl';
|
81 |
+
}
|
82 |
+
$message = esc_html__(
|
83 |
+
'You are using an outdated platform (' . $details .
|
84 |
+
') – some features are disabled', 'tiny-compress-images'
|
85 |
+
);
|
86 |
+
$this->notices->show( 'deprecated', $message, 'notice-warning', false );
|
87 |
+
}
|
88 |
+
}
|
89 |
+
|
90 |
+
try {
|
91 |
+
$this->init_compressor();
|
92 |
+
} catch (Tiny_Exception $e) {
|
93 |
+
$this->notices->show(
|
94 |
+
'compressor_exception',
|
95 |
+
esc_html__( $e->getMessage(), 'tiny-compress-images' ),
|
96 |
+
'error', false
|
97 |
+
);
|
98 |
+
}
|
99 |
+
|
100 |
+
$section = self::get_prefixed_name( 'settings' );
|
101 |
+
add_settings_section( $section,
|
102 |
+
esc_html__( 'JPEG and PNG optimization', 'tiny-compress-images' ),
|
103 |
+
$this->get_method( 'render_section' ),
|
104 |
+
'media'
|
105 |
+
);
|
106 |
+
|
107 |
+
$field = self::get_prefixed_name( 'api_key' );
|
108 |
+
register_setting( 'media', $field );
|
109 |
+
add_settings_field( $field,
|
110 |
+
esc_html__( 'TinyPNG account', 'tiny-compress-images' ),
|
111 |
+
$this->get_method( 'render_pending_status' ),
|
112 |
+
'media',
|
113 |
+
$section
|
114 |
+
);
|
115 |
+
|
116 |
+
$field = self::get_prefixed_name( 'api_key_pending' );
|
117 |
+
register_setting( 'media', $field );
|
118 |
+
|
119 |
+
$field = self::get_prefixed_name( 'sizes' );
|
120 |
+
register_setting( 'media', $field );
|
121 |
+
add_settings_field( $field,
|
122 |
+
esc_html__( 'File compression', 'tiny-compress-images' ),
|
123 |
+
$this->get_method( 'render_sizes' ),
|
124 |
+
'media',
|
125 |
+
$section
|
126 |
+
);
|
127 |
+
|
128 |
+
$field = self::get_prefixed_name( 'resize_original' );
|
129 |
+
register_setting( 'media', $field );
|
130 |
+
add_settings_field( $field,
|
131 |
+
esc_html__( 'Original image', 'tiny-compress-images' ),
|
132 |
+
$this->get_method( 'render_resize' ),
|
133 |
+
'media',
|
134 |
+
$section
|
135 |
+
);
|
136 |
+
|
137 |
+
$field = self::get_prefixed_name( 'preserve_data' );
|
138 |
+
register_setting( 'media', $field );
|
139 |
+
|
140 |
+
add_settings_section( 'section_end', '',
|
141 |
+
$this->get_method( 'render_section_end' ),
|
142 |
+
'media'
|
143 |
+
);
|
144 |
+
|
145 |
+
add_action(
|
146 |
+
'wp_ajax_tiny_image_sizes_notice',
|
147 |
+
$this->get_method( 'image_sizes_notice' )
|
148 |
+
);
|
149 |
+
|
150 |
+
add_action(
|
151 |
+
'wp_ajax_tiny_account_status',
|
152 |
+
$this->get_method( 'account_status' )
|
153 |
+
);
|
154 |
+
|
155 |
+
add_action(
|
156 |
+
'wp_ajax_tiny_settings_create_api_key',
|
157 |
+
$this->get_method( 'create_api_key' )
|
158 |
+
);
|
159 |
+
|
160 |
+
add_action(
|
161 |
+
'wp_ajax_tiny_settings_update_api_key',
|
162 |
+
$this->get_method( 'update_api_key' )
|
163 |
+
);
|
164 |
+
}
|
165 |
+
|
166 |
+
public function image_sizes_notice() {
|
167 |
+
$this->render_image_sizes_notice(
|
168 |
+
$_GET['image_sizes_selected'],
|
169 |
+
isset( $_GET['resize_original'] )
|
170 |
+
);
|
171 |
+
|
172 |
+
exit();
|
173 |
+
}
|
174 |
+
|
175 |
+
public function account_status() {
|
176 |
+
$this->render_account_status();
|
177 |
+
exit();
|
178 |
+
}
|
179 |
+
|
180 |
+
public function get_compressor() {
|
181 |
+
return $this->compressor;
|
182 |
+
}
|
183 |
+
|
184 |
+
public function set_compressor( $compressor ) {
|
185 |
+
$this->compressor = $compressor;
|
186 |
+
}
|
187 |
+
|
188 |
+
public function get_status() {
|
189 |
+
return intval( get_option( self::get_prefixed_name( 'status' ) ) );
|
190 |
+
}
|
191 |
+
|
192 |
+
protected function get_api_key() {
|
193 |
+
if ( defined( 'TINY_API_KEY' ) ) {
|
194 |
+
return TINY_API_KEY;
|
195 |
+
} else {
|
196 |
+
return get_option( self::get_prefixed_name( 'api_key' ) );
|
197 |
+
}
|
198 |
+
}
|
199 |
+
|
200 |
+
protected function get_api_key_pending() {
|
201 |
+
if ( defined( 'TINY_API_KEY' ) ) {
|
202 |
+
return false;
|
203 |
+
} else {
|
204 |
+
return get_option( self::get_prefixed_name( 'api_key_pending' ) );
|
205 |
+
}
|
206 |
+
}
|
207 |
+
|
208 |
+
protected function clear_api_key_pending() {
|
209 |
+
delete_option( self::get_prefixed_name( 'api_key_pending' ) );
|
210 |
+
}
|
211 |
+
|
212 |
+
protected static function get_intermediate_size( $size ) {
|
213 |
+
/* Inspired by
|
214 |
+
http://codex.wordpress.org/Function_Reference/get_intermediate_image_sizes */
|
215 |
+
global $_wp_additional_image_sizes;
|
216 |
+
|
217 |
+
$width = get_option( $size . '_size_w' );
|
218 |
+
$height = get_option( $size . '_size_h' );
|
219 |
+
if ( $width && $height ) {
|
220 |
+
return array( $width, $height );
|
221 |
+
}
|
222 |
+
|
223 |
+
if ( isset( $_wp_additional_image_sizes[ $size ] ) ) {
|
224 |
+
$sizes = $_wp_additional_image_sizes[ $size ];
|
225 |
+
return array(
|
226 |
+
isset( $sizes['width'] ) ? $sizes['width'] : null,
|
227 |
+
isset( $sizes['height'] ) ? $sizes['height'] : null,
|
228 |
+
);
|
229 |
+
}
|
230 |
+
return array( null, null );
|
231 |
+
}
|
232 |
+
|
233 |
+
public function get_sizes() {
|
234 |
+
if ( is_array( $this->sizes ) ) {
|
235 |
+
return $this->sizes;
|
236 |
+
}
|
237 |
+
|
238 |
+
$setting = get_option( self::get_prefixed_name( 'sizes' ) );
|
239 |
+
|
240 |
+
$size = Tiny_Image::ORIGINAL;
|
241 |
+
$this->sizes = array(
|
242 |
+
$size => array(
|
243 |
+
'width' => null,
|
244 |
+
'height' => null,
|
245 |
+
'tinify' => ! is_array( $setting ) ||
|
246 |
+
( isset( $setting[ $size ] ) && 'on' === $setting[ $size ] ),
|
247 |
+
),
|
248 |
+
);
|
249 |
+
|
250 |
+
foreach ( get_intermediate_image_sizes() as $size ) {
|
251 |
+
if ( self::DUMMY_SIZE === $size ) {
|
252 |
+
continue;
|
253 |
+
}
|
254 |
+
|
255 |
+
list($width, $height) = self::get_intermediate_size( $size );
|
256 |
+
if ( $width || $height ) {
|
257 |
+
$this->sizes[ $size ] = array(
|
258 |
+
'width' => $width,
|
259 |
+
'height' => $height,
|
260 |
+
'tinify' => ! is_array( $setting ) ||
|
261 |
+
( isset( $setting[ $size ] ) && 'on' === $setting[ $size ] ),
|
262 |
+
);
|
263 |
+
}
|
264 |
+
}
|
265 |
+
|
266 |
+
return $this->sizes;
|
267 |
+
}
|
268 |
+
|
269 |
+
public function get_active_tinify_sizes() {
|
270 |
+
if ( is_array( $this->tinify_sizes ) ) {
|
271 |
+
return $this->tinify_sizes;
|
272 |
+
}
|
273 |
+
|
274 |
+
$this->tinify_sizes = array();
|
275 |
+
foreach ( $this->get_sizes() as $size => $values ) {
|
276 |
+
if ( $values['tinify'] ) {
|
277 |
+
$this->tinify_sizes[] = $size;
|
278 |
+
}
|
279 |
+
}
|
280 |
+
return $this->tinify_sizes;
|
281 |
+
}
|
282 |
+
|
283 |
+
public function get_resize_enabled() {
|
284 |
+
/* This only applies if the original is being resized. */
|
285 |
+
$sizes = $this->get_sizes();
|
286 |
+
if ( ! $sizes[ Tiny_Image::ORIGINAL ]['tinify'] ) {
|
287 |
+
return false;
|
288 |
+
}
|
289 |
+
|
290 |
+
$setting = get_option( self::get_prefixed_name( 'resize_original' ) );
|
291 |
+
return isset( $setting['enabled'] ) && 'on' === $setting['enabled'];
|
292 |
+
}
|
293 |
+
|
294 |
+
public function get_preserve_enabled( $name ) {
|
295 |
+
$setting = get_option( self::get_prefixed_name( 'preserve_data' ) );
|
296 |
+
return isset( $setting[ $name ] ) && 'on' === $setting[ $name ];
|
297 |
+
}
|
298 |
+
|
299 |
+
public function get_preserve_options( $size_name ) {
|
300 |
+
if ( ! Tiny_Image::is_original( $size_name ) ) {
|
301 |
+
return false;
|
302 |
+
}
|
303 |
+
$options = array();
|
304 |
+
$settings = get_option( self::get_prefixed_name( 'preserve_data' ) );
|
305 |
+
if ( $settings ) {
|
306 |
+
$keys = array_keys( $settings );
|
307 |
+
foreach ( $keys as &$key ) {
|
308 |
+
if ( 'on' === $settings[ $key ] ) {
|
309 |
+
array_push( $options, $key );
|
310 |
+
}
|
311 |
+
}
|
312 |
+
}
|
313 |
+
return $options;
|
314 |
+
}
|
315 |
+
|
316 |
+
public function get_resize_options( $size_name ) {
|
317 |
+
if ( ! Tiny_Image::is_original( $size_name ) ) {
|
318 |
+
return false;
|
319 |
+
}
|
320 |
+
if ( ! $this->get_resize_enabled() ) {
|
321 |
+
return false;
|
322 |
+
}
|
323 |
+
$setting = get_option( self::get_prefixed_name( 'resize_original' ) );
|
324 |
+
$width = intval( $setting['width'] );
|
325 |
+
$height = intval( $setting['height'] );
|
326 |
+
$method = $width > 0 && $height > 0 ? 'fit' : 'scale';
|
327 |
+
$options['method'] = $method;
|
328 |
+
if ( $width > 0 ) {
|
329 |
+
$options['width'] = $width;
|
330 |
+
}
|
331 |
+
if ( $height > 0 ) {
|
332 |
+
$options['height'] = $height;
|
333 |
+
}
|
334 |
+
return sizeof( $options ) >= 2 ? $options : false;
|
335 |
+
}
|
336 |
+
|
337 |
+
public function render_section_end() {
|
338 |
+
echo '</div>';
|
339 |
+
}
|
340 |
+
|
341 |
+
public function render_section() {
|
342 |
+
echo '<div class="' . self::NAME . '">';
|
343 |
+
echo '<span id="' . self::NAME . '"></span>';
|
344 |
+
}
|
345 |
+
|
346 |
+
public function render_sizes() {
|
347 |
+
echo '<p>';
|
348 |
+
esc_html_e(
|
349 |
+
'Choose sizes to compress. Remember each selected size counts as a compression.',
|
350 |
+
'tiny-compress-images'
|
351 |
+
);
|
352 |
+
echo '</p>';
|
353 |
+
echo '<input type="hidden" name="' .
|
354 |
+
self::get_prefixed_name( 'sizes[' . self::DUMMY_SIZE . ']' ) . '" value="on"/>';
|
355 |
+
|
356 |
+
foreach ( $this->get_sizes() as $size => $option ) {
|
357 |
+
$this->render_size_checkbox( $size, $option );
|
358 |
+
}
|
359 |
+
echo '<br>';
|
360 |
+
echo '<div id="tiny-image-sizes-notice">';
|
361 |
+
|
362 |
+
$this->render_image_sizes_notice(
|
363 |
+
count( self::get_active_tinify_sizes() ),
|
364 |
+
self::get_resize_enabled()
|
365 |
+
);
|
366 |
+
|
367 |
+
echo '</div>';
|
368 |
+
}
|
369 |
+
|
370 |
+
private function render_size_checkbox( $size, $option ) {
|
371 |
+
$id = self::get_prefixed_name( "sizes_$size" );
|
372 |
+
$name = self::get_prefixed_name( 'sizes[' . $size . ']' );
|
373 |
+
$checked = ( $option['tinify'] ? ' checked="checked"' : '' );
|
374 |
+
if ( Tiny_Image::is_original( $size ) ) {
|
375 |
+
$label = esc_html__( 'Original image', 'tiny-compress-images' ) . ' (' .
|
376 |
+
esc_html__( 'overwritten by compressed image', 'tiny-compress-images' ) . ')';
|
377 |
+
} else {
|
378 |
+
$label = esc_html__( ucfirst( $size ) )
|
379 |
+
. ' - ' . $option['width'] . 'x' . $option['height'];
|
380 |
+
}
|
381 |
+
echo '<p>';
|
382 |
+
echo '<input type="checkbox" id="' . $id . '" name="' . $name .
|
383 |
+
'" value="on" ' . $checked . '/>';
|
384 |
+
echo '<label for="' . $id . '">' . $label . '</label>';
|
385 |
+
echo '</p>';
|
386 |
+
}
|
387 |
+
|
388 |
+
public function render_image_sizes_notice( $active_sizes_count, $resize_original_enabled ) {
|
389 |
+
echo '<p>';
|
390 |
+
if ( $resize_original_enabled ) {
|
391 |
+
$active_sizes_count++;
|
392 |
+
}
|
393 |
+
|
394 |
+
if ( $active_sizes_count < 1 ) {
|
395 |
+
esc_html_e(
|
396 |
+
'With these settings no images will be compressed.',
|
397 |
+
'tiny-compress-images'
|
398 |
+
);
|
399 |
+
} else {
|
400 |
+
$free_images_per_month = floor(
|
401 |
+
Tiny_Config::MONTHLY_FREE_COMPRESSIONS / $active_sizes_count
|
402 |
+
);
|
403 |
+
printf( wp_kses( __(
|
404 |
+
'With these settings you can compress ' .
|
405 |
+
'<strong> at least %s images </strong> for free each month.',
|
406 |
+
'tiny-compress-images'
|
407 |
+
), array( 'strong' => array() ) ), $free_images_per_month );
|
408 |
+
}
|
409 |
+
echo '</p>';
|
410 |
+
}
|
411 |
+
|
412 |
+
public function render_resize() {
|
413 |
+
echo '<p class="tiny-resize-unavailable" style="display: none">';
|
414 |
+
esc_html_e(
|
415 |
+
'Enable compression of the original image size for more options.',
|
416 |
+
'tiny-compress-images'
|
417 |
+
);
|
418 |
+
echo '</p>';
|
419 |
+
|
420 |
+
$id = self::get_prefixed_name( 'resize_original_enabled' );
|
421 |
+
$name = self::get_prefixed_name( 'resize_original[enabled]' );
|
422 |
+
$checked = ( $this->get_resize_enabled() ? ' checked="checked"' : '' );
|
423 |
+
|
424 |
+
$label = esc_html__(
|
425 |
+
'Resize and compress the original image',
|
426 |
+
'tiny-compress-images'
|
427 |
+
);
|
428 |
+
|
429 |
+
echo '<p class="tiny-resize-available">';
|
430 |
+
echo '<input type="checkbox" id="' . $id . '" name="' . $name .
|
431 |
+
'" value="on" '. $checked . '/>';
|
432 |
+
echo '<label for="' . $id . '">' . $label . '</label>';
|
433 |
+
echo '<br>';
|
434 |
+
echo '</p>';
|
435 |
+
|
436 |
+
echo '<p class="tiny-resize-available tiny-resize-resolution">';
|
437 |
+
printf( '%s ', esc_html__( 'Max Width' ) );
|
438 |
+
$this->render_resize_input( 'width' );
|
439 |
+
printf( '%s ', esc_html__( 'Max Height' ) );
|
440 |
+
$this->render_resize_input( 'height' );
|
441 |
+
echo '</p>';
|
442 |
+
|
443 |
+
echo '<p class="tiny-resize-available tiny-resize-resolution">';
|
444 |
+
|
445 |
+
esc_html_e(
|
446 |
+
'Resizing takes 1 additional compression for each image that is larger.',
|
447 |
+
'tiny-compress-images'
|
448 |
+
);
|
449 |
+
|
450 |
+
echo '</p><br>';
|
451 |
+
|
452 |
+
$this->render_preserve_input(
|
453 |
+
'creation',
|
454 |
+
esc_html__(
|
455 |
+
'Preserve creation date and time in the original image',
|
456 |
+
'tiny-compress-images'
|
457 |
+
) . ' ' .
|
458 |
+
esc_html__( '(JPEG only)', 'tiny-compress-images' )
|
459 |
+
);
|
460 |
+
|
461 |
+
$this->render_preserve_input(
|
462 |
+
'copyright',
|
463 |
+
esc_html__(
|
464 |
+
'Preserve copyright information in the original image',
|
465 |
+
'tiny-compress-images'
|
466 |
+
)
|
467 |
+
);
|
468 |
+
|
469 |
+
$this->render_preserve_input(
|
470 |
+
'location',
|
471 |
+
esc_html__(
|
472 |
+
'Preserve GPS location in the original image',
|
473 |
+
'tiny-compress-images'
|
474 |
+
) . ' ' .
|
475 |
+
esc_html__( '(JPEG only)', 'tiny-compress-images' )
|
476 |
+
);
|
477 |
+
}
|
478 |
+
|
479 |
+
public function render_preserve_input( $name, $description ) {
|
480 |
+
echo '<p class="tiny-preserve">';
|
481 |
+
$id = sprintf( self::get_prefixed_name( 'preserve_data_%s' ), $name );
|
482 |
+
$field = sprintf( self::get_prefixed_name( 'preserve_data[%s]' ), $name );
|
483 |
+
$checked = ( $this->get_preserve_enabled( $name ) ? ' checked="checked"' : '' );
|
484 |
+
$label = esc_html__( $description, 'tiny-compress-images' );
|
485 |
+
echo '<input type="checkbox" id="' . $id . '" name="' . $field .
|
486 |
+
'" value="on" ' . $checked . '/>';
|
487 |
+
echo '<label for="' . $id . '">' . $label . '</label>';
|
488 |
+
echo '<br>';
|
489 |
+
echo '</p>';
|
490 |
+
}
|
491 |
+
|
492 |
+
public function render_resize_input( $name ) {
|
493 |
+
$id = sprintf( self::get_prefixed_name( 'resize_original_%s' ), $name );
|
494 |
+
$field = sprintf( self::get_prefixed_name( 'resize_original[%s]' ), $name );
|
495 |
+
$settings = get_option( self::get_prefixed_name( 'resize_original' ) );
|
496 |
+
$value = isset( $settings[ $name ] ) ? $settings[ $name ] : '2048';
|
497 |
+
echo '<input type="number" id="'. $id .'" name="' . $field .
|
498 |
+
'" value="' . $value . '" size="5" />';
|
499 |
+
}
|
500 |
+
|
501 |
+
public function get_compression_count() {
|
502 |
+
$field = self::get_prefixed_name( 'status' );
|
503 |
+
return get_option( $field );
|
504 |
+
}
|
505 |
+
|
506 |
+
public function after_compress_callback( $compressor ) {
|
507 |
+
if ( ! is_null( $count = $compressor->get_compression_count() ) ) {
|
508 |
+
$field = self::get_prefixed_name( 'status' );
|
509 |
+
update_option( $field, $count );
|
510 |
+
}
|
511 |
+
if ( $compressor->limit_reached() ) {
|
512 |
+
$link = '<a href="https://tinypng.com/developers" target="_blank">' .
|
513 |
+
esc_html__( 'TinyPNG API account', 'tiny-compress-images' ) . '</a>';
|
514 |
+
|
515 |
+
$this->notices->add('limit-reached',
|
516 |
+
sprintf(
|
517 |
+
esc_html__(
|
518 |
+
'You have reached your limit of %s compressions this month.',
|
519 |
+
'tiny-compress-images'
|
520 |
+
),
|
521 |
+
$count
|
522 |
+
) .
|
523 |
+
sprintf(
|
524 |
+
esc_html__(
|
525 |
+
'Upgrade your %s if you like to compress more images.',
|
526 |
+
'tiny-compress-images'
|
527 |
+
),
|
528 |
+
$link
|
529 |
+
)
|
530 |
+
);
|
531 |
+
} else {
|
532 |
+
$this->notices->remove( 'limit-reached' );
|
533 |
+
}
|
534 |
+
}
|
535 |
+
|
536 |
+
public function render_account_status() {
|
537 |
+
$key = $this->get_api_key();
|
538 |
+
if ( empty( $key ) ) {
|
539 |
+
$compressor = $this->get_compressor();
|
540 |
+
if ( $compressor->can_create_key() ) {
|
541 |
+
include( dirname( __FILE__ ) . '/views/account-status-create-advanced.php' );
|
542 |
+
} else {
|
543 |
+
include( dirname( __FILE__ ) . '/views/account-status-create-simple.php' );
|
544 |
+
}
|
545 |
+
} else {
|
546 |
+
$status = $this->compressor->get_status();
|
547 |
+
$status->pending = false;
|
548 |
+
|
549 |
+
if ( $status->ok ) {
|
550 |
+
if ( $this->get_api_key_pending() ) {
|
551 |
+
$this->clear_api_key_pending();
|
552 |
+
}
|
553 |
+
} else {
|
554 |
+
if ( $this->get_api_key_pending() ) {
|
555 |
+
$status->ok = true;
|
556 |
+
$status->pending = true;
|
557 |
+
$status->message = (
|
558 |
+
'An email has been sent with a link to activate your account'
|
559 |
+
);
|
560 |
+
}
|
561 |
+
}
|
562 |
+
|
563 |
+
include( dirname( __FILE__ ) . '/views/account-status-connected.php' );
|
564 |
+
}
|
565 |
+
}
|
566 |
+
|
567 |
+
public function render_pending_status() {
|
568 |
+
$key = $this->get_api_key();
|
569 |
+
if ( empty( $key ) ) {
|
570 |
+
$compressor = $this->get_compressor();
|
571 |
+
if ( $compressor->can_create_key() ) {
|
572 |
+
include( dirname( __FILE__ ) . '/views/account-status-create-advanced.php' );
|
573 |
+
} else {
|
574 |
+
include( dirname( __FILE__ ) . '/views/account-status-create-simple.php' );
|
575 |
+
}
|
576 |
+
} else {
|
577 |
+
include( dirname( __FILE__ ) . '/views/account-status-loading.php' );
|
578 |
+
}
|
579 |
+
}
|
580 |
+
|
581 |
+
public function create_api_key() {
|
582 |
+
$compressor = $this->get_compressor();
|
583 |
+
if ( $compressor->can_create_key() ) {
|
584 |
+
if ( ! isset( $_POST['name'] ) || ! $_POST['name'] ) {
|
585 |
+
$status = (object) array(
|
586 |
+
'ok' => false,
|
587 |
+
'message' => __(
|
588 |
+
'Please enter your name', 'tiny-compress-images'
|
589 |
+
),
|
590 |
+
);
|
591 |
+
echo json_encode( $status );
|
592 |
+
exit();
|
593 |
+
}
|
594 |
+
|
595 |
+
if ( ! isset( $_POST['email'] ) || ! $_POST['email'] ) {
|
596 |
+
$status = (object) array(
|
597 |
+
'ok' => false,
|
598 |
+
'message' => __(
|
599 |
+
'Please enter your email address', 'tiny-compress-images'
|
600 |
+
),
|
601 |
+
);
|
602 |
+
echo json_encode( $status );
|
603 |
+
exit();
|
604 |
+
}
|
605 |
+
|
606 |
+
try {
|
607 |
+
$site = str_replace( array( 'http://', 'https://' ), '', get_bloginfo( 'url' ) );
|
608 |
+
$identifier = 'WordPress plugin for ' . $site;
|
609 |
+
$link = $this->get_absolute_url();
|
610 |
+
$compressor->create_key( $_POST['email'], array(
|
611 |
+
'name' => $_POST['name'],
|
612 |
+
'identifier' => $identifier,
|
613 |
+
'link' => $link,
|
614 |
+
) );
|
615 |
+
|
616 |
+
update_option( self::get_prefixed_name( 'api_key_pending' ), true );
|
617 |
+
update_option( self::get_prefixed_name( 'api_key' ), $compressor->get_key() );
|
618 |
+
update_option( self::get_prefixed_name( 'status' ), 0 );
|
619 |
+
|
620 |
+
$status = (object) array(
|
621 |
+
'ok' => true,
|
622 |
+
'message' => null,
|
623 |
+
);
|
624 |
+
} catch (Tiny_Exception $err) {
|
625 |
+
list( $message ) = explode( ' (HTTP', $err->getMessage(), 2 );
|
626 |
+
$status = (object) array(
|
627 |
+
'ok' => false,
|
628 |
+
'message' => $message,
|
629 |
+
);
|
630 |
+
}
|
631 |
+
} else {
|
632 |
+
$status = (object) array(
|
633 |
+
'ok' => false,
|
634 |
+
'message' => 'This feature is not available on your platform',
|
635 |
+
);
|
636 |
+
}
|
637 |
+
|
638 |
+
$status->message = __( $status->message, 'tiny-compress-images' );
|
639 |
+
echo json_encode( $status );
|
640 |
+
exit();
|
641 |
+
}
|
642 |
+
|
643 |
+
public function update_api_key() {
|
644 |
+
$key = $_POST['key'];
|
645 |
+
if ( empty( $key ) ) {
|
646 |
+
/* Always save if key is blank, so the key can be deleted. */
|
647 |
+
$status = (object) array(
|
648 |
+
'ok' => true,
|
649 |
+
'message' => null,
|
650 |
+
);
|
651 |
+
} else {
|
652 |
+
$status = Tiny_Compress::create( $key )->get_status();
|
653 |
+
}
|
654 |
+
if ( $status->ok ) {
|
655 |
+
update_option( self::get_prefixed_name( 'api_key_pending' ), false );
|
656 |
+
update_option( self::get_prefixed_name( 'api_key' ), $key );
|
657 |
+
}
|
658 |
+
$status->message = __( $status->message, 'tiny-compress-images' );
|
659 |
+
echo json_encode( $status );
|
660 |
+
exit();
|
661 |
+
}
|
662 |
}
|
src/class-tiny-wp-base.php
CHANGED
@@ -19,84 +19,71 @@
|
|
19 |
*/
|
20 |
|
21 |
abstract class Tiny_WP_Base {
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
}
|
90 |
-
|
91 |
-
public function init() {
|
92 |
-
}
|
93 |
-
|
94 |
-
public function xmlrpc_init() {
|
95 |
-
}
|
96 |
-
|
97 |
-
public function admin_init() {
|
98 |
-
}
|
99 |
-
|
100 |
-
public function admin_menu() {
|
101 |
-
}
|
102 |
}
|
19 |
*/
|
20 |
|
21 |
abstract class Tiny_WP_Base {
|
22 |
+
const NAME = 'tiny-compress-images';
|
23 |
+
const PREFIX = 'tinypng_';
|
24 |
+
|
25 |
+
private static $wp_version;
|
26 |
+
|
27 |
+
public static function wp_version() {
|
28 |
+
if ( is_null( self::$wp_version ) ) {
|
29 |
+
// Try to use unmodified version
|
30 |
+
include( ABSPATH . WPINC . '/version.php' );
|
31 |
+
if ( isset( $wp_version ) ) {
|
32 |
+
self::$wp_version = $wp_version;
|
33 |
+
} else {
|
34 |
+
self::$wp_version = $GLOBALS['wp_version'];
|
35 |
+
}
|
36 |
+
}
|
37 |
+
return self::$wp_version;
|
38 |
+
}
|
39 |
+
|
40 |
+
public static function check_wp_version( $version ) {
|
41 |
+
return floatval( self::wp_version() ) >= $version;
|
42 |
+
}
|
43 |
+
|
44 |
+
protected function is_xmlrpc_request() {
|
45 |
+
return defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST;
|
46 |
+
}
|
47 |
+
|
48 |
+
protected static function get_prefixed_name( $name ) {
|
49 |
+
return self::PREFIX . $name;
|
50 |
+
}
|
51 |
+
|
52 |
+
public function __construct() {
|
53 |
+
add_action( 'init', $this->get_method( 'init' ) );
|
54 |
+
if ( self::is_xmlrpc_request() ) {
|
55 |
+
add_action( 'init', $this->get_method( 'xmlrpc_init' ) );
|
56 |
+
} elseif ( is_admin() ) {
|
57 |
+
add_action( 'admin_init', $this->get_method( 'admin_init' ) );
|
58 |
+
add_action( 'admin_menu', $this->get_method( 'admin_menu' ) );
|
59 |
+
}
|
60 |
+
}
|
61 |
+
|
62 |
+
protected function get_method( $name ) {
|
63 |
+
return array( $this, $name );
|
64 |
+
}
|
65 |
+
|
66 |
+
protected function get_static_method( $name ) {
|
67 |
+
return array( get_class( $this ), $name );
|
68 |
+
}
|
69 |
+
|
70 |
+
protected function get_user_id() {
|
71 |
+
return get_current_user_id();
|
72 |
+
}
|
73 |
+
|
74 |
+
protected function check_ajax_referer() {
|
75 |
+
return check_ajax_referer( 'tiny-compress', '_nonce', false );
|
76 |
+
}
|
77 |
+
|
78 |
+
public function init() {
|
79 |
+
}
|
80 |
+
|
81 |
+
public function xmlrpc_init() {
|
82 |
+
}
|
83 |
+
|
84 |
+
public function admin_init() {
|
85 |
+
}
|
86 |
+
|
87 |
+
public function admin_menu() {
|
88 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
89 |
}
|
src/config/tiny-config.php
CHANGED
@@ -1,6 +1,11 @@
|
|
1 |
<?php
|
2 |
|
|
|
|
|
|
|
|
|
3 |
class Tiny_Config {
|
4 |
-
|
5 |
-
|
|
|
6 |
}
|
1 |
<?php
|
2 |
|
3 |
+
if ( ! defined( 'TINY_DEBUG' ) ) {
|
4 |
+
define( 'TINY_DEBUG', null );
|
5 |
+
}
|
6 |
+
|
7 |
class Tiny_Config {
|
8 |
+
/* URL is only used by fopen driver. */
|
9 |
+
const URL = 'https://api.tinify.com/shrink';
|
10 |
+
const MONTHLY_FREE_COMPRESSIONS = 500;
|
11 |
}
|
src/css/admin.css
ADDED
@@ -0,0 +1,301 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
div.misc-pub-section.tiny-compress-images {
|
2 |
+
border-top: 1px solid #e1e1e1;
|
3 |
+
padding-bottom: 16px;
|
4 |
+
}
|
5 |
+
|
6 |
+
/* Settings */
|
7 |
+
div.tiny-account-status {
|
8 |
+
box-sizing: border-box;
|
9 |
+
display: table-cell;
|
10 |
+
width: 500px;
|
11 |
+
padding: 22px 28px;
|
12 |
+
border: 1px solid #e1e1e1;
|
13 |
+
background-color: white;
|
14 |
+
}
|
15 |
+
|
16 |
+
div.tiny-account-status div.status {
|
17 |
+
box-sizing: border-box;
|
18 |
+
padding-left: 26px;
|
19 |
+
position: relative;
|
20 |
+
}
|
21 |
+
|
22 |
+
div.tiny-account-status div.status:before {
|
23 |
+
box-sizing: border-box;
|
24 |
+
position: absolute;
|
25 |
+
width: 20px;
|
26 |
+
height: 20px;
|
27 |
+
font-size: 28px;
|
28 |
+
font-family: dashicons;
|
29 |
+
font-weight: 400;
|
30 |
+
font-style: normal;
|
31 |
+
}
|
32 |
+
|
33 |
+
div.tiny-account-status div.status-failure:before {
|
34 |
+
left: -6px;
|
35 |
+
top: -6px;
|
36 |
+
color: #d54e21;
|
37 |
+
content: "\f158";
|
38 |
+
}
|
39 |
+
|
40 |
+
div.tiny-account-status div.status-success:before {
|
41 |
+
left: -6px;
|
42 |
+
top: -6px;
|
43 |
+
color: #30d030;
|
44 |
+
content: "\f147";
|
45 |
+
}
|
46 |
+
|
47 |
+
div.tiny-account-status div.status-pending:before {
|
48 |
+
left: -6px;
|
49 |
+
top: -4px;
|
50 |
+
color: #0086ba;
|
51 |
+
font-size: 24px;
|
52 |
+
content: "\f466";
|
53 |
+
}
|
54 |
+
|
55 |
+
div.tiny-account-status div.status-loading:before {
|
56 |
+
left: -2px;
|
57 |
+
top: 0;
|
58 |
+
background: url(../images/spinner.gif) no-repeat center;
|
59 |
+
background-size: 20px 20px;
|
60 |
+
content: "";
|
61 |
+
}
|
62 |
+
|
63 |
+
@media (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) {
|
64 |
+
div.tiny-account-status div.status-loading:before {
|
65 |
+
background-image: url(../images/spinner-2x.gif);
|
66 |
+
}
|
67 |
+
}
|
68 |
+
|
69 |
+
div.tiny-account-status h4 {
|
70 |
+
margin-top: 0;
|
71 |
+
line-height: 1.5;
|
72 |
+
}
|
73 |
+
|
74 |
+
div.tiny-account-status p {
|
75 |
+
margin-top: 0;
|
76 |
+
margin-bottom: 4px;
|
77 |
+
}
|
78 |
+
|
79 |
+
div.tiny-account-status button + p {
|
80 |
+
margin-top: 8px;
|
81 |
+
}
|
82 |
+
|
83 |
+
div.tiny-account-status p:last-child {
|
84 |
+
margin-bottom: 0;
|
85 |
+
}
|
86 |
+
|
87 |
+
div.tiny-account-status p.introduction {
|
88 |
+
margin-bottom: 12px;
|
89 |
+
}
|
90 |
+
|
91 |
+
div.tiny-account-status p.status {
|
92 |
+
font-weight: bold;
|
93 |
+
}
|
94 |
+
|
95 |
+
div.tiny-account-status.wide {
|
96 |
+
width: auto;
|
97 |
+
max-width: 700px;
|
98 |
+
}
|
99 |
+
|
100 |
+
div.tiny-account-status div.failure input {
|
101 |
+
border: 1px solid #d54e21;
|
102 |
+
}
|
103 |
+
|
104 |
+
div.tiny-account-status div.failure p.message {
|
105 |
+
color: #d54e21;
|
106 |
+
}
|
107 |
+
|
108 |
+
div.tiny-account-status div.update {
|
109 |
+
width: 380px;
|
110 |
+
}
|
111 |
+
|
112 |
+
div.tiny-account-status.wide div.create {
|
113 |
+
box-sizing: border-box;
|
114 |
+
display: table-cell;
|
115 |
+
width: 50%;
|
116 |
+
padding-right: 30px;
|
117 |
+
border-right: 1px solid #e5e5e5;
|
118 |
+
}
|
119 |
+
|
120 |
+
div.tiny-account-status.wide div.update {
|
121 |
+
box-sizing: border-box;
|
122 |
+
display: table-cell;
|
123 |
+
width: 50%;
|
124 |
+
padding-left: 29px;
|
125 |
+
}
|
126 |
+
|
127 |
+
@media screen and (max-width: 600px) {
|
128 |
+
div.tiny-account-status.wide div.create {
|
129 |
+
display: block;
|
130 |
+
width: auto;
|
131 |
+
padding-right: 0;
|
132 |
+
padding-bottom: 20px;
|
133 |
+
border-right: 0;
|
134 |
+
border-bottom: 1px solid #e5e5e5;
|
135 |
+
}
|
136 |
+
|
137 |
+
div.tiny-account-status.wide div.update {
|
138 |
+
display: block;
|
139 |
+
width: auto;
|
140 |
+
padding-top: 29px;
|
141 |
+
padding-left: 0;
|
142 |
+
}
|
143 |
+
}
|
144 |
+
|
145 |
+
div.tiny-account-status.wide div.create input, div.tiny-account-status.wide div.update input {
|
146 |
+
width: 100%;
|
147 |
+
margin-bottom: 8px;
|
148 |
+
}
|
149 |
+
|
150 |
+
div.tiny-account-status.wide div.create button, div.tiny-account-status.wide div.update button {
|
151 |
+
width: 100%;
|
152 |
+
margin-top: 4px;
|
153 |
+
margin-bottom: 4px;
|
154 |
+
}
|
155 |
+
|
156 |
+
div.tiny-account-status.wide div.create button.loading, div.tiny-account-status.wide div.update button.loading {
|
157 |
+
background-image: url(../images/button-spinner.gif) !important;
|
158 |
+
background-size: 16px 16px !important;
|
159 |
+
background-position: 95% 50% !important;
|
160 |
+
background-repeat: no-repeat !important;
|
161 |
+
}
|
162 |
+
|
163 |
+
@media (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) {
|
164 |
+
div.tiny-account-status.wide div.create button.loading, div.tiny-account-status.wide div.update button.loading {
|
165 |
+
background-image: url(../images/button-spinner-2x.gif) !important;
|
166 |
+
}
|
167 |
+
}
|
168 |
+
|
169 |
+
p.tiny-resize-resolution {
|
170 |
+
margin-left: 24px;
|
171 |
+
}
|
172 |
+
|
173 |
+
p.tiny-resize-resolution input {
|
174 |
+
margin-right: 6px;
|
175 |
+
}
|
176 |
+
|
177 |
+
input[type=number][name*="tinypng_resize_original"] {
|
178 |
+
width: 65px;
|
179 |
+
}
|
180 |
+
|
181 |
+
/* Media library */
|
182 |
+
.tiny-compress-images .spinner.hidden {
|
183 |
+
display: none;
|
184 |
+
visibility: hidden;
|
185 |
+
float: none;
|
186 |
+
margin-top: 0;
|
187 |
+
}
|
188 |
+
|
189 |
+
.tiny-compress-images div.spinner {
|
190 |
+
display: inline-block;
|
191 |
+
visibility: visible;
|
192 |
+
float: right;
|
193 |
+
margin-top: 4px;
|
194 |
+
}
|
195 |
+
|
196 |
+
.tiny-compress-images span.spinner {
|
197 |
+
visibility: visible;
|
198 |
+
float: none;
|
199 |
+
margin: 0;
|
200 |
+
}
|
201 |
+
|
202 |
+
.tiny-compress-images span.icon {
|
203 |
+
display: inline-block;
|
204 |
+
margin-left: -4px;
|
205 |
+
padding-right: 4px;
|
206 |
+
}
|
207 |
+
|
208 |
+
.tiny-compress-images span.dashicons-before::before {
|
209 |
+
margin-left: -2px;
|
210 |
+
font-size: 23px;
|
211 |
+
}
|
212 |
+
|
213 |
+
.tiny-compress-images .details-container {
|
214 |
+
overflow: auto;
|
215 |
+
}
|
216 |
+
|
217 |
+
.tiny-compress-images .details-container button {
|
218 |
+
display: block;
|
219 |
+
margin-left: 20px;
|
220 |
+
margin-bottom: 5px;
|
221 |
+
}
|
222 |
+
|
223 |
+
.tiny-compress-images .details-container span.icon {
|
224 |
+
position: absolute;
|
225 |
+
}
|
226 |
+
|
227 |
+
.tiny-compress-images .details-container .message {
|
228 |
+
display: inline-block;
|
229 |
+
margin-left: 20px;
|
230 |
+
}
|
231 |
+
|
232 |
+
.tiny-compress-images .details-container a.message {
|
233 |
+
margin-bottom: 5px;
|
234 |
+
}
|
235 |
+
|
236 |
+
.tiny-compress-images span.success {
|
237 |
+
color: #30d030;
|
238 |
+
}
|
239 |
+
|
240 |
+
.tiny-compress-images span.warning {
|
241 |
+
color: #f0ad4e;
|
242 |
+
}
|
243 |
+
|
244 |
+
.tiny-compress-images span.error {
|
245 |
+
color: #d54e21;
|
246 |
+
}
|
247 |
+
|
248 |
+
.tiny-compress-images span.alert {
|
249 |
+
color: gray;
|
250 |
+
}
|
251 |
+
|
252 |
+
#tiny-compress-status .spinner,
|
253 |
+
#tiny-compress-savings .spinner {
|
254 |
+
visibility: visible;
|
255 |
+
display: inline;
|
256 |
+
float: left;
|
257 |
+
width: 20px;
|
258 |
+
height: 20px;
|
259 |
+
margin: 0;
|
260 |
+
}
|
261 |
+
|
262 |
+
.tiny-compression-details {
|
263 |
+
padding: 10px;
|
264 |
+
}
|
265 |
+
|
266 |
+
.tiny-compression-details table {
|
267 |
+
width: 100%;
|
268 |
+
border: 1px solid #e5e5e5;
|
269 |
+
border-collapse: collapse;
|
270 |
+
white-space: nowrap;
|
271 |
+
}
|
272 |
+
|
273 |
+
.tiny-compression-details table tr.even {
|
274 |
+
background-color: #f9f9f9;
|
275 |
+
}
|
276 |
+
|
277 |
+
.tiny-compression-details table td {
|
278 |
+
padding: 6px 10px;
|
279 |
+
}
|
280 |
+
|
281 |
+
.tiny-compression-details table th {
|
282 |
+
padding: 8px 10px;
|
283 |
+
border-bottom: 1px solid #e5e5e5;
|
284 |
+
font-size: 14px;
|
285 |
+
}
|
286 |
+
|
287 |
+
.tiny-compression-details table tfoot {
|
288 |
+
border-top: 1px solid #e5e5e5;
|
289 |
+
}
|
290 |
+
|
291 |
+
.tiny-compression-details table tfoot td {
|
292 |
+
padding: 8px 10px;
|
293 |
+
}
|
294 |
+
|
295 |
+
.tiny-compress-images .modal {
|
296 |
+
display: none;
|
297 |
+
}
|
298 |
+
|
299 |
+
.tiny-compress-images h4 {
|
300 |
+
margin: 0.5em 0;
|
301 |
+
}
|
src/css/bulk-optimization.css
ADDED
@@ -0,0 +1,380 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
div.tiny-bulk-optimization div.dashboard {
|
2 |
+
min-width: 750px;
|
3 |
+
margin-top: 10px;
|
4 |
+
border: 1px solid #e5e5e5;
|
5 |
+
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
|
6 |
+
background-color: #fff;
|
7 |
+
}
|
8 |
+
|
9 |
+
@media only screen and (max-width: 799px) {
|
10 |
+
div.tiny-bulk-optimization div.dashboard {
|
11 |
+
min-width: 250px;
|
12 |
+
}
|
13 |
+
}
|
14 |
+
|
15 |
+
div.tiny-bulk-optimization div.available {
|
16 |
+
float: left;
|
17 |
+
width: 50%;
|
18 |
+
}
|
19 |
+
|
20 |
+
@media only screen and (max-width: 799px) {
|
21 |
+
div.tiny-bulk-optimization div.available {
|
22 |
+
width: 100%;
|
23 |
+
}
|
24 |
+
}
|
25 |
+
|
26 |
+
div.tiny-bulk-optimization div.available div.inner {
|
27 |
+
max-width: 600px;
|
28 |
+
padding: 4px 23px 23px;
|
29 |
+
}
|
30 |
+
|
31 |
+
div.tiny-bulk-optimization div.available table.totals {
|
32 |
+
max-width: 500px;
|
33 |
+
width: 100%;
|
34 |
+
margin: 18px 0;
|
35 |
+
border: 1px solid #e5e5e5;
|
36 |
+
border-spacing: 1px;
|
37 |
+
box-shadow: inset 0 0 0 25px #fff;
|
38 |
+
background-color: #e5e5e5;
|
39 |
+
}
|
40 |
+
|
41 |
+
/*ie6-8*/ div.tiny-bulk-optimization div.available table.totals {
|
42 |
+
border-collapse: collapse \9;
|
43 |
+
border-spacing: 0 \9;
|
44 |
+
}
|
45 |
+
|
46 |
+
/*ie6-8*/ div.tiny-bulk-optimization div.available table.totals td {
|
47 |
+
border: 1px solid #e5e5e5 \9;
|
48 |
+
}
|
49 |
+
|
50 |
+
div.tiny-bulk-optimization div.available table.totals td.item {
|
51 |
+
width: 33%;
|
52 |
+
padding: 1em 8px;
|
53 |
+
vertical-align: top;
|
54 |
+
text-align: center;
|
55 |
+
background-color: #fff;
|
56 |
+
}
|
57 |
+
|
58 |
+
@media only screen and (max-width: 400px) {
|
59 |
+
div.tiny-bulk-optimization div.available table.totals td.item.costs {
|
60 |
+
display: none;
|
61 |
+
}
|
62 |
+
}
|
63 |
+
|
64 |
+
div.tiny-bulk-optimization div.available table.totals td.item h3 {
|
65 |
+
margin-top: 0;
|
66 |
+
text-transform: uppercase;
|
67 |
+
color: #bbb;
|
68 |
+
font-size: 1.1em;
|
69 |
+
font-weight: normal;
|
70 |
+
}
|
71 |
+
|
72 |
+
div.tiny-bulk-optimization div.available table.totals td.item span {
|
73 |
+
font-size: 1.8em;
|
74 |
+
font-weight: bold;
|
75 |
+
line-height: 1em;
|
76 |
+
}
|
77 |
+
|
78 |
+
div.tiny-bulk-optimization div.available table.totals td.item div.tooltip {
|
79 |
+
position: relative;
|
80 |
+
display: inline-block;
|
81 |
+
vertical-align: super;
|
82 |
+
}
|
83 |
+
|
84 |
+
div.tiny-bulk-optimization div.available table.totals td.item div.tooltip span.dashicons {
|
85 |
+
font-weight: normal;
|
86 |
+
font-size: 1.3em;
|
87 |
+
/* WordPress color embedded in webpage */
|
88 |
+
}
|
89 |
+
|
90 |
+
* + html div.tiny-bulk-optimization div.available table.totals td.item div.tooltip span.dashicons {
|
91 |
+
display: none;
|
92 |
+
}
|
93 |
+
|
94 |
+
div.tiny-bulk-optimization div.available table.totals td.item div.tooltip div.tip {
|
95 |
+
position: absolute;
|
96 |
+
z-index: 10;
|
97 |
+
display: none;
|
98 |
+
top: 50%;
|
99 |
+
left: 130%;
|
100 |
+
width: 18em;
|
101 |
+
padding: 0 1em;
|
102 |
+
background-color: #fff;
|
103 |
+
box-shadow: 1px 1px 4px rgba(0,0,0,0.2);
|
104 |
+
border: 1px solid #e5e5e5;
|
105 |
+
text-align: left;
|
106 |
+
}
|
107 |
+
|
108 |
+
div.tiny-bulk-optimization div.available table.totals td.item div.tooltip:hover div.tip {
|
109 |
+
display: block;
|
110 |
+
}
|
111 |
+
|
112 |
+
div.tiny-bulk-optimization div.available div.notes {
|
113 |
+
display: table;
|
114 |
+
}
|
115 |
+
|
116 |
+
div.tiny-bulk-optimization div.available div.notes h4 {
|
117 |
+
display: table-cell;
|
118 |
+
font-size: 1.1em;
|
119 |
+
padding-right: 1.2em;
|
120 |
+
white-space: nowrap;
|
121 |
+
}
|
122 |
+
|
123 |
+
div.tiny-bulk-optimization div.available div.notes p {
|
124 |
+
display: table-cell;
|
125 |
+
}
|
126 |
+
|
127 |
+
div.tiny-bulk-optimization div.savings {
|
128 |
+
margin-left: 50%;
|
129 |
+
}
|
130 |
+
|
131 |
+
@media only screen and (max-width: 799px) {
|
132 |
+
div.tiny-bulk-optimization div.savings {
|
133 |
+
margin-left: 0;
|
134 |
+
}
|
135 |
+
}
|
136 |
+
|
137 |
+
div.tiny-bulk-optimization div.savings div.inner {
|
138 |
+
max-width: 600px;
|
139 |
+
padding: 4px 23px 23px;
|
140 |
+
}
|
141 |
+
|
142 |
+
div.tiny-bulk-optimization div.savings div.legend {
|
143 |
+
margin-left: 50%;
|
144 |
+
}
|
145 |
+
|
146 |
+
div.tiny-bulk-optimization div.savings div.chart {
|
147 |
+
float: left;
|
148 |
+
position: relative;
|
149 |
+
width: 50%;
|
150 |
+
text-align: center;
|
151 |
+
}
|
152 |
+
|
153 |
+
div.tiny-bulk-optimization div.savings div.chart svg circle.main {
|
154 |
+
fill: #ebebeb;
|
155 |
+
animation: shwoosh 2s ease;
|
156 |
+
transition: stroke-dasharray 1s ease;
|
157 |
+
}
|
158 |
+
|
159 |
+
div.tiny-bulk-optimization div.savings div.chart svg circle.inner {
|
160 |
+
fill: #fff;
|
161 |
+
}
|
162 |
+
|
163 |
+
div.tiny-bulk-optimization div.savings div.chart div.value {
|
164 |
+
position: absolute;
|
165 |
+
top: 0;
|
166 |
+
left: 0;
|
167 |
+
width: 100%;
|
168 |
+
color: #7acb44;
|
169 |
+
text-align: center;
|
170 |
+
}
|
171 |
+
|
172 |
+
div.tiny-bulk-optimization div.savings div.chart div.value div.percentage {
|
173 |
+
width: 50%;
|
174 |
+
margin-left: auto;
|
175 |
+
margin-right: auto;
|
176 |
+
margin-top: 65px;
|
177 |
+
font-size: 2.4em;
|
178 |
+
line-height: 1em;
|
179 |
+
}
|
180 |
+
|
181 |
+
div.tiny-bulk-optimization div.savings div.chart div.value div.label {
|
182 |
+
width: 50%;
|
183 |
+
margin-left: auto;
|
184 |
+
margin-right: auto;
|
185 |
+
font-size: 1.4em;
|
186 |
+
line-height: 1.2em;
|
187 |
+
}
|
188 |
+
|
189 |
+
div.tiny-bulk-optimization div.savings div.legend {
|
190 |
+
/* margin-left defined inline */
|
191 |
+
padding: 30px 0;
|
192 |
+
}
|
193 |
+
|
194 |
+
div.tiny-bulk-optimization div.savings table {
|
195 |
+
margin: 0 auto;
|
196 |
+
}
|
197 |
+
|
198 |
+
div.tiny-bulk-optimization div.savings table td.value {
|
199 |
+
font-size: 1.4em;
|
200 |
+
vertical-align: top;
|
201 |
+
text-align: right;
|
202 |
+
padding: 15px 8px 0 5px;
|
203 |
+
white-space: nowrap;
|
204 |
+
}
|
205 |
+
|
206 |
+
div.tiny-bulk-optimization div.savings table td.description {
|
207 |
+
padding: 19px 0 0;
|
208 |
+
line-height: 14px;
|
209 |
+
vertical-align: top;
|
210 |
+
text-align: left;
|
211 |
+
color: #bbb;
|
212 |
+
}
|
213 |
+
|
214 |
+
@media only screen and (max-width: 400px) {
|
215 |
+
div.tiny-bulk-optimization div.savings div.chart {
|
216 |
+
float: none;
|
217 |
+
width: 100%;
|
218 |
+
}
|
219 |
+
}
|
220 |
+
|
221 |
+
@media only screen and (max-width: 400px) {
|
222 |
+
div.tiny-bulk-optimization div.savings div.legend {
|
223 |
+
margin-left: 0 !important;
|
224 |
+
padding: 10px 0;
|
225 |
+
}
|
226 |
+
}
|
227 |
+
|
228 |
+
div.tiny-bulk-optimization div.optimize {
|
229 |
+
margin: 4px 23px 32px;
|
230 |
+
text-align: center;
|
231 |
+
clear: both;
|
232 |
+
}
|
233 |
+
|
234 |
+
div.tiny-bulk-optimization div.optimize div.progressbar {
|
235 |
+
position: relative;
|
236 |
+
height: 32px;
|
237 |
+
margin-bottom: 32px;
|
238 |
+
line-height: 32px;
|
239 |
+
border-radius: 32px;
|
240 |
+
font-size: 1.2em;
|
241 |
+
font-weight: bold;
|
242 |
+
color: #fff;
|
243 |
+
background-color: #ebebeb;
|
244 |
+
}
|
245 |
+
|
246 |
+
div.tiny-bulk-optimization div.optimize div.progressbar div.progress {
|
247 |
+
position: absolute;
|
248 |
+
left: 0;
|
249 |
+
min-width: 32px;
|
250 |
+
width: 0;
|
251 |
+
height: 32px;
|
252 |
+
z-index: 2;
|
253 |
+
border-radius: 16px;
|
254 |
+
transition: width 1s ease;
|
255 |
+
background-size: 40px 80px;
|
256 |
+
-webkit-backface-visibility: hidden;
|
257 |
+
-webkit-perspective: 1000;
|
258 |
+
backface-visibility: hidden;
|
259 |
+
perspective: 1000;
|
260 |
+
}
|
261 |
+
|
262 |
+
@keyframes progress-bar {
|
263 |
+
to {
|
264 |
+
background-position: 3200px 0;
|
265 |
+
}
|
266 |
+
}
|
267 |
+
|
268 |
+
div.tiny-bulk-optimization div.optimize div.progressbar div.numbers {
|
269 |
+
position: relative;
|
270 |
+
z-index: 3;
|
271 |
+
text-shadow: 1px 1px 3px rgba(0,0,0,0.2);
|
272 |
+
}
|
273 |
+
|
274 |
+
div.tiny-bulk-optimization div.optimize div.optimization-buttons input.button-hero {
|
275 |
+
display: none;
|
276 |
+
}
|
277 |
+
|
278 |
+
div.tiny-bulk-optimization div.optimize div.optimization-buttons input.button-hero.visible {
|
279 |
+
display: inline;
|
280 |
+
}
|
281 |
+
|
282 |
+
div.tiny-bulk-optimization div.optimize div.optimization-buttons input.button-hero {
|
283 |
+
min-width: 230px;
|
284 |
+
}
|
285 |
+
|
286 |
+
div.tiny-bulk-optimization div.optimize div.optimization-buttons input.button-hero.red {
|
287 |
+
/* WP < 3.8 */ background-image: none;
|
288 |
+
border-color: #920011;
|
289 |
+
background-color: #d0021b;
|
290 |
+
box-shadow: 0 2px 0 #920011 !important;
|
291 |
+
text-shadow: 0 -1px 1px #920011, 1px 0 1px #920011, 0 1px 1px #920011, -1px 0 1px #920011;
|
292 |
+
}
|
293 |
+
|
294 |
+
div.tiny-bulk-optimization div.optimize div.optimization-buttons input.button-hero.red:focus,
|
295 |
+
div.tiny-bulk-optimization div.optimize div.optimization-buttons input.button-hero.red:hover {
|
296 |
+
background-color: #e00016;
|
297 |
+
}
|
298 |
+
|
299 |
+
div.tiny-bulk-optimization div.optimize div.optimization-buttons input.button-hero.red:active {
|
300 |
+
background-color: #d0021b;
|
301 |
+
box-shadow: 0 3px 0 #920011 inset !important;
|
302 |
+
}
|
303 |
+
|
304 |
+
div.tiny-bulk-optimization div.optimize div#optimization-spinner {
|
305 |
+
position: absolute;
|
306 |
+
display: none;
|
307 |
+
width: 20px;
|
308 |
+
height: 20px;
|
309 |
+
margin-top: 15px;
|
310 |
+
background-size: 20px 20px;
|
311 |
+
}
|
312 |
+
|
313 |
+
div.tiny-bulk-optimization table.whitebox {
|
314 |
+
min-width: 750px;
|
315 |
+
margin-top: 16px;
|
316 |
+
border: 1px solid #e5e5e5;
|
317 |
+
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
|
318 |
+
background-color: #fff;
|
319 |
+
}
|
320 |
+
|
321 |
+
|
322 |
+
@media only screen and (max-width: 799px) {
|
323 |
+
div.tiny-bulk-optimization table.whitebox {
|
324 |
+
min-width: 250px;
|
325 |
+
}
|
326 |
+
}
|
327 |
+
|
328 |
+
div.tiny-bulk-optimization table.whitebox th.column-author {
|
329 |
+
/* WP 3.1-4.2 */ width: auto;
|
330 |
+
}
|
331 |
+
|
332 |
+
div.tiny-bulk-optimization table.whitebox thead th.thumbnail {
|
333 |
+
width: 30px;
|
334 |
+
}
|
335 |
+
|
336 |
+
div.tiny-bulk-optimization table.whitebox thead th.savings {
|
337 |
+
width: 70px;
|
338 |
+
}
|
339 |
+
|
340 |
+
div.tiny-bulk-optimization table.whitebox thead th.status {
|
341 |
+
}
|
342 |
+
|
343 |
+
div.tiny-bulk-optimization table.whitebox th.thumbnail {
|
344 |
+
width: 30px;
|
345 |
+
height: 32px;
|
346 |
+
padding-top: 6px;
|
347 |
+
vertical-align: top;
|
348 |
+
}
|
349 |
+
|
350 |
+
div.tiny-bulk-optimization table.whitebox td {
|
351 |
+
padding-top: 12px;
|
352 |
+
}
|
353 |
+
|
354 |
+
div.tiny-bulk-optimization table.whitebox td.name,
|
355 |
+
div.tiny-bulk-optimization table.whitebox td.status {
|
356 |
+
padding-bottom: 12px;
|
357 |
+
}
|
358 |
+
|
359 |
+
div.tiny-bulk-optimization table.whitebox td.column-primary button {
|
360 |
+
margin-top: 6px;
|
361 |
+
}
|
362 |
+
|
363 |
+
div.tiny-bulk-optimization button.toggle-row {
|
364 |
+
/* WP < 4.3 */ display: none;
|
365 |
+
}
|
366 |
+
|
367 |
+
div.tiny-bulk-optimization table.whitebox tr.success button.toggle-row:before {
|
368 |
+
color: #7acb44;
|
369 |
+
content: "\f147"; /* yes */
|
370 |
+
}
|
371 |
+
|
372 |
+
div.tiny-bulk-optimization table.whitebox tr.failed button.toggle-row:before {
|
373 |
+
color: #d54e21;
|
374 |
+
content: "\f158"; /* more compatibility*/
|
375 |
+
}
|
376 |
+
|
377 |
+
div.tiny-bulk-optimization table.whitebox tr.failed.is-expanded span.icon {
|
378 |
+
display: none;
|
379 |
+
}
|
380 |
+
|
src/{cacert.pem → data/cacert.pem}
RENAMED
File without changes
|
src/images/button-spinner-2x.gif
ADDED
Binary file
|
src/images/button-spinner.gif
ADDED
Binary file
|
src/images/spinner-2x.gif
ADDED
Binary file
|
src/images/spinner.gif
ADDED
Binary file
|
src/js/admin.js
ADDED
@@ -0,0 +1,227 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
(function() {
|
2 |
+
function compressImage(event) {
|
3 |
+
var element = jQuery(event.target)
|
4 |
+
var container = element.closest('div.tiny-ajax-container')
|
5 |
+
element.attr('disabled', 'disabled')
|
6 |
+
container.find('span.spinner').removeClass('hidden')
|
7 |
+
container.find('span.dashicons').remove()
|
8 |
+
jQuery.ajax({
|
9 |
+
url: ajaxurl,
|
10 |
+
type: 'POST',
|
11 |
+
data: {
|
12 |
+
_nonce: tinyCompress.nonce,
|
13 |
+
action: 'tiny_compress_image_from_library',
|
14 |
+
id: element.data('id') || element.attr('data-id')
|
15 |
+
},
|
16 |
+
success: function(data) {
|
17 |
+
container.html(data)
|
18 |
+
},
|
19 |
+
error: function() {
|
20 |
+
element.removeAttr('disabled')
|
21 |
+
container.find('span.spinner').addClass('hidden')
|
22 |
+
}
|
23 |
+
})
|
24 |
+
}
|
25 |
+
|
26 |
+
function submitKey(event) {
|
27 |
+
event.preventDefault()
|
28 |
+
jQuery(event.target).attr({disabled: true}).addClass('loading')
|
29 |
+
|
30 |
+
var action
|
31 |
+
var parent = jQuery(event.target).closest('div')
|
32 |
+
|
33 |
+
if (jQuery(event.target).data('tiny-action') == 'update-key') {
|
34 |
+
action = 'update'
|
35 |
+
var key = parent.find('#tinypng_api_key').val()
|
36 |
+
} else if (jQuery(event.target).data('tiny-action') == 'create-key') {
|
37 |
+
action = 'create'
|
38 |
+
var name = parent.find('#tinypng_api_key_name').val()
|
39 |
+
var email = parent.find('#tinypng_api_key_email').val()
|
40 |
+
} else {
|
41 |
+
return false
|
42 |
+
}
|
43 |
+
|
44 |
+
jQuery.ajax({
|
45 |
+
url: ajaxurl,
|
46 |
+
type: 'POST',
|
47 |
+
data: {
|
48 |
+
_nonce: tinyCompress.nonce,
|
49 |
+
action: 'tiny_settings_' + action + '_api_key',
|
50 |
+
key: key,
|
51 |
+
name: name,
|
52 |
+
email: email,
|
53 |
+
},
|
54 |
+
|
55 |
+
success: function(json) {
|
56 |
+
var status = JSON.parse(json)
|
57 |
+
if (status.ok) {
|
58 |
+
var target = jQuery('#tiny-account-status')
|
59 |
+
if (target.length) {
|
60 |
+
jQuery.get(ajaxurl + '?action=tiny_account_status', function(data) {
|
61 |
+
jQuery(event.target).attr({disabled: false}).removeClass('loading')
|
62 |
+
target.replaceWith(data)
|
63 |
+
})
|
64 |
+
}
|
65 |
+
} else {
|
66 |
+
jQuery(event.target).attr({disabled: false}).removeClass('loading')
|
67 |
+
parent.addClass('failure')
|
68 |
+
parent.find('p.message').text(status.message).show()
|
69 |
+
}
|
70 |
+
},
|
71 |
+
|
72 |
+
error: function() {
|
73 |
+
jQuery(event.target).attr({disabled: false}).removeClass('loading')
|
74 |
+
parent.addClass('failure')
|
75 |
+
parent.find('p.message').text('Something went wrong, try again soon').show()
|
76 |
+
}
|
77 |
+
})
|
78 |
+
|
79 |
+
return false
|
80 |
+
}
|
81 |
+
|
82 |
+
function dismissNotice(event) {
|
83 |
+
var element = jQuery(event.target)
|
84 |
+
var notice = element.closest('.tiny-notice')
|
85 |
+
element.attr('disabled', 'disabled')
|
86 |
+
jQuery.ajax({
|
87 |
+
url: ajaxurl,
|
88 |
+
type: 'POST',
|
89 |
+
dataType: 'json',
|
90 |
+
data: {
|
91 |
+
_nonce: tinyCompress.nonce,
|
92 |
+
action: 'tiny_dismiss_notice',
|
93 |
+
name: notice.data('name') || notice.attr('data-name')
|
94 |
+
},
|
95 |
+
success: function(data) {
|
96 |
+
if (data) {
|
97 |
+
notice.remove()
|
98 |
+
}
|
99 |
+
},
|
100 |
+
error: function() {
|
101 |
+
element.removeAttr('disabled')
|
102 |
+
}
|
103 |
+
})
|
104 |
+
return false
|
105 |
+
}
|
106 |
+
|
107 |
+
function updateResizeSettings() {
|
108 |
+
if (propOf('#tinypng_sizes_0', 'checked')) {
|
109 |
+
jQuery('.tiny-resize-available').show()
|
110 |
+
jQuery('.tiny-resize-unavailable').hide()
|
111 |
+
} else {
|
112 |
+
jQuery('.tiny-resize-available').hide()
|
113 |
+
jQuery('.tiny-resize-unavailable').show()
|
114 |
+
}
|
115 |
+
|
116 |
+
var original_enabled = propOf('#tinypng_resize_original_enabled', 'checked')
|
117 |
+
jQuery('#tinypng_resize_original_width, #tinypng_resize_original_height').each(function (i, el) {
|
118 |
+
el.disabled = !original_enabled
|
119 |
+
})
|
120 |
+
}
|
121 |
+
|
122 |
+
function updatePreserveSettings() {
|
123 |
+
if (propOf('#tinypng_sizes_0', 'checked')) {
|
124 |
+
jQuery('.tiny-preserve').show()
|
125 |
+
} else {
|
126 |
+
jQuery('.tiny-preserve').hide()
|
127 |
+
jQuery('#tinypng_preserve_data_creation').attr('checked', false)
|
128 |
+
jQuery('#tinypng_preserve_data_copyright').attr('checked', false)
|
129 |
+
jQuery('#tinypng_preserve_data_location').attr('checked', false)
|
130 |
+
}
|
131 |
+
}
|
132 |
+
|
133 |
+
function updateSettings() {
|
134 |
+
updateResizeSettings()
|
135 |
+
updatePreserveSettings()
|
136 |
+
}
|
137 |
+
|
138 |
+
var adminpage = ''
|
139 |
+
if (typeof window.adminpage !== 'undefined') {
|
140 |
+
adminpage = window.adminpage
|
141 |
+
}
|
142 |
+
|
143 |
+
function eventOn(event, eventSelector, callback) {
|
144 |
+
if (typeof jQuery.fn.on === 'function') {
|
145 |
+
jQuery(document).on(event, eventSelector, callback)
|
146 |
+
} else {
|
147 |
+
jQuery(eventSelector).live(event, callback)
|
148 |
+
}
|
149 |
+
}
|
150 |
+
|
151 |
+
function propOf(selector, property) {
|
152 |
+
if (typeof jQuery.fn.prop === 'function') {
|
153 |
+
/* Added in 1.6. Before jQuery 1.6, the .attr() method sometimes took
|
154 |
+
property values into account. */
|
155 |
+
return jQuery(selector).prop(property)
|
156 |
+
} else {
|
157 |
+
return jQuery(selector).attr(property)
|
158 |
+
}
|
159 |
+
}
|
160 |
+
|
161 |
+
function setPropOf(selector, property, value) {
|
162 |
+
if (typeof jQuery.fn.prop === 'function') {
|
163 |
+
/* Added in 1.6. Before jQuery 1.6, the .attr() method sometimes took
|
164 |
+
property values into account. */
|
165 |
+
jQuery(selector).prop(property, value)
|
166 |
+
} else {
|
167 |
+
jQuery(selector).attr(property, value)
|
168 |
+
}
|
169 |
+
}
|
170 |
+
|
171 |
+
function changeEnterKeyTarget(selector, button) {
|
172 |
+
eventOn('keyup keypress', selector, function(event) {
|
173 |
+
var code = event.keyCode || event.which
|
174 |
+
if (code == 13) {
|
175 |
+
jQuery(button).click()
|
176 |
+
return false
|
177 |
+
}
|
178 |
+
})
|
179 |
+
}
|
180 |
+
|
181 |
+
switch (adminpage) {
|
182 |
+
case 'upload-php':
|
183 |
+
eventOn('click', 'button.tiny-compress', compressImage)
|
184 |
+
|
185 |
+
setPropOf('button.tiny-compress', 'disabled', null)
|
186 |
+
|
187 |
+
jQuery('<option>').val('tiny_bulk_action').text(tinyCompress.L10nBulkAction).appendTo('select[name=action]')
|
188 |
+
jQuery('<option>').val('tiny_bulk_action').text(tinyCompress.L10nBulkAction).appendTo('select[name=action2]')
|
189 |
+
break
|
190 |
+
case 'post-php':
|
191 |
+
eventOn('click', 'button.tiny-compress', compressImage)
|
192 |
+
break
|
193 |
+
case 'options-media-php':
|
194 |
+
changeEnterKeyTarget('div.tiny-account-status create', '[data-tiny-action=create-key]')
|
195 |
+
changeEnterKeyTarget('div.tiny-account-status update', '[data-tiny-action=update-key]')
|
196 |
+
|
197 |
+
eventOn('click', '[data-tiny-action=create-key]', submitKey)
|
198 |
+
eventOn('click', '[data-tiny-action=update-key]', submitKey)
|
199 |
+
|
200 |
+
var target = jQuery('#tiny-account-status[data-state=pending]')
|
201 |
+
if (target.length) {
|
202 |
+
jQuery.get(ajaxurl + '?action=tiny_account_status', function(data) {
|
203 |
+
target.replaceWith(data)
|
204 |
+
})
|
205 |
+
}
|
206 |
+
|
207 |
+
eventOn('click', 'input[name*=tinypng_sizes], #tinypng_resize_original_enabled', function() {
|
208 |
+
/* Unfortunately, we need some additional information to display
|
209 |
+
the correct notice. */
|
210 |
+
totalSelectedSizes = jQuery('input[name*=tinypng_sizes]:checked').length
|
211 |
+
var image_count_url = ajaxurl + '?action=tiny_image_sizes_notice&image_sizes_selected=' + totalSelectedSizes
|
212 |
+
if (propOf('#tinypng_resize_original_enabled', 'checked') && propOf('#tinypng_sizes_0', 'checked')) {
|
213 |
+
image_count_url += '&resize_original=true'
|
214 |
+
}
|
215 |
+
jQuery('#tiny-image-sizes-notice').load(image_count_url)
|
216 |
+
})
|
217 |
+
|
218 |
+
jQuery('#tinypng_sizes_0, #tinypng_resize_original_enabled').click(updateSettings)
|
219 |
+
updateSettings()
|
220 |
+
|
221 |
+
}
|
222 |
+
|
223 |
+
jQuery('.tiny-notice a.tiny-dismiss').click(dismissNotice)
|
224 |
+
jQuery(function() {
|
225 |
+
jQuery('.tiny-notice.is-dismissible button').unbind('click').click(dismissNotice)
|
226 |
+
})
|
227 |
+
}).call()
|
src/js/bulk-optimization.js
ADDED
@@ -0,0 +1,217 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
(function() {
|
2 |
+
function updateProgressBar(successFullCompressions) {
|
3 |
+
var totalToOptimize = parseInt(jQuery("div#compression-progress-bar").data("number-to-optimize"))
|
4 |
+
|
5 |
+
var optimizedSoFar = parseInt(jQuery("#optimized-so-far").text())
|
6 |
+
jQuery("#optimized-so-far").html(successFullCompressions + optimizedSoFar)
|
7 |
+
|
8 |
+
var percentage = "100%"
|
9 |
+
if (totalToOptimize > 0) {
|
10 |
+
percentage = Math.round((successFullCompressions + optimizedSoFar) / totalToOptimize * 100, 1) + "%"
|
11 |
+
}
|
12 |
+
jQuery("div#compression-progress-bar #progress-size").css("width", percentage)
|
13 |
+
jQuery("div#compression-progress-bar #percentage").html("(" + percentage + ")")
|
14 |
+
|
15 |
+
var numberToOptimize = parseInt(jQuery("#optimizable-image-sizes").html())
|
16 |
+
jQuery("#optimizable-image-sizes").html(numberToOptimize - successFullCompressions)
|
17 |
+
}
|
18 |
+
|
19 |
+
function updateSavings(successFullCompressions, successFullSaved, newHumanReadableLibrarySize) {
|
20 |
+
|
21 |
+
window.currentLibraryBytes = window.currentLibraryBytes + successFullSaved
|
22 |
+
|
23 |
+
var imagesSizedOptimized = parseInt(jQuery("#optimized-image-sizes").text()) + successFullCompressions
|
24 |
+
var initialLibraryBytes = parseInt(jQuery("#unoptimized-library-size").data("bytes"))
|
25 |
+
var percentage = (1 - window.currentLibraryBytes / initialLibraryBytes)
|
26 |
+
var chartSize = jQuery("div#optimization-chart").data("full-circle-size")
|
27 |
+
|
28 |
+
jQuery("#optimized-image-sizes").html(imagesSizedOptimized)
|
29 |
+
jQuery("#optimized-library-size").attr("data-bytes", window.currentLibraryBytes)
|
30 |
+
jQuery("#optimized-library-size").html(newHumanReadableLibrarySize)
|
31 |
+
jQuery("#savings-percentage").html(Math.round(percentage * 1000) / 10 + "%")
|
32 |
+
jQuery("div#optimization-chart svg circle.main").css("stroke-dasharray", "" + (chartSize * percentage) + " " + chartSize)
|
33 |
+
|
34 |
+
}
|
35 |
+
|
36 |
+
function handleCancellation() {
|
37 |
+
jQuery("div#bulk-optimization-actions").hide()
|
38 |
+
jQuery("div.progress").css("animation", "none")
|
39 |
+
}
|
40 |
+
|
41 |
+
function updateRowAfterCompression(row, data) {
|
42 |
+
var successFullCompressions = parseInt(data.success)
|
43 |
+
var successFullSaved = parseInt(data.size_change)
|
44 |
+
var newHumanReadableLibrarySize = data.human_readable_library_size
|
45 |
+
if (successFullCompressions == 0) {
|
46 |
+
row.find(".status").html(tinyCompress.L10nNoActionTaken)
|
47 |
+
} else {
|
48 |
+
row.find(".status").html(successFullCompressions + " " + tinyCompress.L10nCompressed)
|
49 |
+
updateProgressBar(successFullCompressions);
|
50 |
+
updateSavings(successFullCompressions, successFullSaved, newHumanReadableLibrarySize)
|
51 |
+
}
|
52 |
+
}
|
53 |
+
|
54 |
+
function bulkOptimizationCallback(error, data, items, i) {
|
55 |
+
if (window.optimizationCancelled) {
|
56 |
+
handleCancellation();
|
57 |
+
}
|
58 |
+
|
59 |
+
var row = jQuery("#optimization-items tr").eq(parseInt(i)+1)
|
60 |
+
|
61 |
+
if (error) {
|
62 |
+
row.addClass("failed")
|
63 |
+
row.find(".status").html(tinyCompress.L10nInternalError + "<br>" + error.toString())
|
64 |
+
row.find(".status").attr("title", error.toString())
|
65 |
+
} else if (data == null) {
|
66 |
+
row.addClass("failed")
|
67 |
+
row.find(".status").html(tinyCompress.L10nCancelled)
|
68 |
+
} else if (data.error) {
|
69 |
+
row.addClass("failed")
|
70 |
+
row.find(".status").html(tinyCompress.L10nError + "<br>" + data.error)
|
71 |
+
row.find(".status").attr("title", data.error)
|
72 |
+
} else if (data.failed > 0) {
|
73 |
+
row.addClass("failed")
|
74 |
+
row.find(".status").html("<span class=\"icon dashicons dashicons-no error\"></span><span class=\"message\">" + tinyCompress.L10nLatestError + ": " + data.message + "</span>");
|
75 |
+
row.find(".status").attr("title", data.message)
|
76 |
+
} else {
|
77 |
+
row.addClass("success")
|
78 |
+
updateRowAfterCompression(row, data)
|
79 |
+
}
|
80 |
+
|
81 |
+
row.find(".name").html(items[i].post_title + "<button class=\"toggle-row\" type=\"button\"><span class=\"screen-reader-text\">" + tinyCompress.L10nShowMoreDetails + "</span></button>")
|
82 |
+
|
83 |
+
if (!data.image_sizes_optimized) {
|
84 |
+
data.image_sizes_optimized = "-";
|
85 |
+
}
|
86 |
+
if (!data.initial_total_size) {
|
87 |
+
data.initial_total_size = "-";
|
88 |
+
}
|
89 |
+
if (!data.optimized_total_size) {
|
90 |
+
data.optimized_total_size = "-";
|
91 |
+
}
|
92 |
+
if (!data.savings || data.savings == 0) {
|
93 |
+
data.savings = "-";
|
94 |
+
} else {
|
95 |
+
data.savings += "%";
|
96 |
+
}
|
97 |
+
|
98 |
+
row.find(".thumbnail").html(data.thumbnail)
|
99 |
+
row.find(".sizes-optimized").html(data.image_sizes_optimized)
|
100 |
+
row.find(".initial-size").html(data.initial_total_size)
|
101 |
+
row.find(".optimized-size").html(data.optimized_total_size)
|
102 |
+
row.find(".savings").html(data.savings)
|
103 |
+
|
104 |
+
if (items[++i]) {
|
105 |
+
if (!window.optimizationCancelled) {
|
106 |
+
drawSomeRows(items, 1);
|
107 |
+
}
|
108 |
+
bulkOptimizeItem(items, i)
|
109 |
+
} else {
|
110 |
+
var message = jQuery("<div class=\"updated\"><p></p></div>")
|
111 |
+
message.find("p").html(tinyCompress.L10nAllDone)
|
112 |
+
message.insertAfter(jQuery("#tiny-bulk-optimization h1"))
|
113 |
+
jQuery("div#optimization-spinner").css("display", "none")
|
114 |
+
jQuery("div.progress").css("width", "100%")
|
115 |
+
jQuery("div#bulk-optimization-actions").hide()
|
116 |
+
jQuery("div.progress").css("animation", "none")
|
117 |
+
}
|
118 |
+
}
|
119 |
+
|
120 |
+
function bulkOptimizeItem(items, i) {
|
121 |
+
if (window.optimizationCancelled) {
|
122 |
+
return;
|
123 |
+
}
|
124 |
+
|
125 |
+
var item = items[i]
|
126 |
+
var row = jQuery("#optimization-items tr").eq(parseInt(i)+1)
|
127 |
+
row.find(".status").removeClass("todo")
|
128 |
+
row.find(".status").html(tinyCompress.L10nCompressing)
|
129 |
+
jQuery.ajax({
|
130 |
+
url: ajaxurl,
|
131 |
+
type: "POST",
|
132 |
+
dataType: "json",
|
133 |
+
data: {
|
134 |
+
_nonce: tinyCompress.nonce,
|
135 |
+
action: "tiny_compress_image_for_bulk",
|
136 |
+
id: items[i].ID,
|
137 |
+
current_size: window.currentLibraryBytes
|
138 |
+
},
|
139 |
+
success: function(data) { bulkOptimizationCallback(null, data, items, i)},
|
140 |
+
error: function(xhr, textStatus, errorThrown) { bulkOptimizationCallback(errorThrown, null, items, i) }
|
141 |
+
})
|
142 |
+
jQuery("#tiny-progress span").html(i + 1)
|
143 |
+
}
|
144 |
+
|
145 |
+
function prepareBulkOptimization(items) {
|
146 |
+
window.allBulkOptimizationItems = items
|
147 |
+
updateProgressBar(0)
|
148 |
+
}
|
149 |
+
|
150 |
+
function startBulkOptimization(items) {
|
151 |
+
window.optimizationCancelled = false
|
152 |
+
window.totalRowsDrawn = 0
|
153 |
+
window.currentLibraryBytes = parseInt(jQuery("#optimized-library-size").data("bytes"))
|
154 |
+
|
155 |
+
jQuery("div.progress").css("animation", "progress-bar 80s linear infinite")
|
156 |
+
jQuery("div#optimization-spinner").css("display", "inline-block")
|
157 |
+
updateProgressBar(0)
|
158 |
+
drawSomeRows(items, 10)
|
159 |
+
bulkOptimizeItem(items, 0)
|
160 |
+
}
|
161 |
+
|
162 |
+
function drawSomeRows(items, rowsToDraw) {
|
163 |
+
var list = jQuery("#optimization-items tbody")
|
164 |
+
var row
|
165 |
+
for (var drawNow = window.totalRowsDrawn; drawNow < Math.min( rowsToDraw + window.totalRowsDrawn, items.length); drawNow++) {
|
166 |
+
row = jQuery("<tr class=\"media-item\">" +
|
167 |
+
"<th class=\"thumbnail\" />" +
|
168 |
+
"<td class=\"column-primary name\" />" +
|
169 |
+
"<td class=\"column-author sizes-optimized\" data-colname=\"" + tinyCompress.L10nSizesOptimized + "\" ></>" +
|
170 |
+
"<td class=\"column-author initial-size\" data-colname=\"" + tinyCompress.L10nInitialSize + "\" ></>" +
|
171 |
+
"<td class=\"column-author optimized-size\" data-colname=\"" + tinyCompress.L10nCurrentSize + "\" ></>" +
|
172 |
+
"<td class=\"column-author savings\" data-colname=\"" + tinyCompress.L10nSavings + "\" ></>" +
|
173 |
+
"<td class=\"status todo\" data-colname=\"" + tinyCompress.L10nStatus + "\" />" +
|
174 |
+
"</tr>")
|
175 |
+
row.find(".status").html(tinyCompress.L10nWaiting)
|
176 |
+
row.find(".name").html(items[drawNow].post_title)
|
177 |
+
list.append(row)
|
178 |
+
}
|
179 |
+
window.totalRowsDrawn = drawNow
|
180 |
+
}
|
181 |
+
|
182 |
+
function cancelOptimization() {
|
183 |
+
window.optimizationCancelled = true;
|
184 |
+
jQuery("div#optimization-spinner").css("display", "none");
|
185 |
+
jQuery(jQuery("#optimization-items tr td.status.todo")).html(tinyCompress.L10nCancelled)
|
186 |
+
jQuery("div#bulk-optimization-actions input").removeClass("visible")
|
187 |
+
jQuery("div#bulk-optimization-actions input#id-cancelling").addClass("visible")
|
188 |
+
}
|
189 |
+
|
190 |
+
jQuery("div#bulk-optimization-actions input").click(function() {
|
191 |
+
if ((jQuery(this).attr("id") == "id-start") && jQuery(this).hasClass("visible")) {
|
192 |
+
jQuery("div#bulk-optimization-actions input#id-start").removeClass("visible")
|
193 |
+
jQuery("div#bulk-optimization-actions input#id-optimizing").addClass("visible")
|
194 |
+
startBulkOptimization(window.allBulkOptimizationItems);
|
195 |
+
}
|
196 |
+
if ((jQuery(this).attr("id") == "id-cancel") && jQuery(this).hasClass("visible")) {
|
197 |
+
cancelOptimization();
|
198 |
+
}
|
199 |
+
});
|
200 |
+
|
201 |
+
jQuery("div#bulk-optimization-actions input").hover(function() {
|
202 |
+
if ((jQuery(this).attr("id") == "id-optimizing") && jQuery(this).hasClass("visible")) {
|
203 |
+
window.lastActiveButton = jQuery("div#bulk-optimization-actions input.visible")
|
204 |
+
lastActiveButton.removeClass("visible")
|
205 |
+
jQuery("div#bulk-optimization-actions input#id-cancel").addClass("visible")
|
206 |
+
}
|
207 |
+
}, function() {
|
208 |
+
if ((jQuery(this).attr("id") == "id-cancel") && jQuery(this).hasClass("visible")) {
|
209 |
+
window.lastActiveButton.addClass("visible")
|
210 |
+
jQuery("div#bulk-optimization-actions input#id-cancel").removeClass("visible")
|
211 |
+
}
|
212 |
+
});
|
213 |
+
|
214 |
+
window.bulkOptimizationAutorun = startBulkOptimization
|
215 |
+
window.bulkOptimization = prepareBulkOptimization
|
216 |
+
|
217 |
+
}).call()
|
src/scripts/admin.js
DELETED
@@ -1,223 +0,0 @@
|
|
1 |
-
(function() {
|
2 |
-
|
3 |
-
function check_wp_version(version) {
|
4 |
-
return parseFloat(tinyCompress.wpVersion) >= version
|
5 |
-
}
|
6 |
-
|
7 |
-
function compress_image(event) {
|
8 |
-
var element = jQuery(event.target)
|
9 |
-
var container = element.closest('.tiny-ajax-container')
|
10 |
-
|
11 |
-
element.attr('disabled', 'disabled')
|
12 |
-
container.find('.spinner').removeClass('hidden')
|
13 |
-
container.find('span.dashicons').addClass('hidden')
|
14 |
-
jQuery.ajax({
|
15 |
-
url: ajaxurl,
|
16 |
-
type: "POST",
|
17 |
-
data: {
|
18 |
-
_nonce: tinyCompress.nonce,
|
19 |
-
action: 'tiny_compress_image',
|
20 |
-
id: element.data('id') || element.attr('data-id')
|
21 |
-
},
|
22 |
-
success: function(data) {
|
23 |
-
container.html(data)
|
24 |
-
},
|
25 |
-
error: function() {
|
26 |
-
element.removeAttr('disabled')
|
27 |
-
container.find('.spinner').addClass('hidden')
|
28 |
-
}
|
29 |
-
})
|
30 |
-
}
|
31 |
-
|
32 |
-
function dismiss_notice(event) {
|
33 |
-
var element = jQuery(event.target)
|
34 |
-
var notice = element.closest(".tiny-notice")
|
35 |
-
element.attr('disabled', 'disabled')
|
36 |
-
jQuery.ajax({
|
37 |
-
url: ajaxurl,
|
38 |
-
type: "POST",
|
39 |
-
dataType: "json",
|
40 |
-
data: {
|
41 |
-
_nonce: tinyCompress.nonce,
|
42 |
-
action: 'tiny_dismiss_notice',
|
43 |
-
name: notice.data('name') || notice.attr('data-name')
|
44 |
-
},
|
45 |
-
success: function(data) {
|
46 |
-
if (data) {
|
47 |
-
notice.remove()
|
48 |
-
}
|
49 |
-
},
|
50 |
-
error: function() {
|
51 |
-
element.removeAttr('disabled')
|
52 |
-
}
|
53 |
-
})
|
54 |
-
return false
|
55 |
-
}
|
56 |
-
|
57 |
-
function bulk_compress_callback(error, data, items, i) {
|
58 |
-
var row = jQuery(jQuery('#media-items').children("div")[i])
|
59 |
-
var status
|
60 |
-
|
61 |
-
if (check_wp_version(3.3)) {
|
62 |
-
status = row.find('.bar')
|
63 |
-
} else {
|
64 |
-
row.find('.bar').remove()
|
65 |
-
status = row.find('.percent')
|
66 |
-
}
|
67 |
-
|
68 |
-
if (data.thumbnail) {
|
69 |
-
var img = jQuery('<img class="pinkynail">')
|
70 |
-
img.attr("src", data.thumbnail)
|
71 |
-
row.prepend(img)
|
72 |
-
}
|
73 |
-
|
74 |
-
if (error) {
|
75 |
-
status.addClass('failed')
|
76 |
-
row.find('.percent').html(tinyCompress.L10nInternalError)
|
77 |
-
row.find('.progress').attr("title", error.toString())
|
78 |
-
} else if (data.error) {
|
79 |
-
status.addClass('failed')
|
80 |
-
row.find('.percent').html(tinyCompress.L10nError)
|
81 |
-
row.find('.progress').attr("title", data.error)
|
82 |
-
} else if (data.failed > 0) {
|
83 |
-
status.addClass('failed')
|
84 |
-
row.find('.bar').css('width', '100%')
|
85 |
-
row.find('.percent').html(data.success + " " + (data.success == 1 ? tinyCompress.L10nCompression : tinyCompress.L10nCompressions))
|
86 |
-
row.find('.progress').attr("title", data.message)
|
87 |
-
} else {
|
88 |
-
status.addClass('success')
|
89 |
-
row.find('.bar').css('width', '100%')
|
90 |
-
row.find('.percent').html(data.success + " " + (data.success == 1 ? tinyCompress.L10nCompression : tinyCompress.L10nCompressions))
|
91 |
-
}
|
92 |
-
|
93 |
-
if (data.status) {
|
94 |
-
jQuery('#tiny-status span').html(data.status)
|
95 |
-
}
|
96 |
-
|
97 |
-
if (items[++i]) {
|
98 |
-
bulk_compress_item(items, i)
|
99 |
-
} else {
|
100 |
-
var message = jQuery('<div class="updated"><p></p></div>');
|
101 |
-
message.find('p').html(tinyCompress.L10nAllDone)
|
102 |
-
message.insertAfter(jQuery("#tiny-bulk-compress h2"))
|
103 |
-
}
|
104 |
-
}
|
105 |
-
|
106 |
-
function bulk_compress_item(items, i) {
|
107 |
-
var item = items[i]
|
108 |
-
var row = jQuery(jQuery('#media-items').children("div")[i])
|
109 |
-
row.find('.percent').html(tinyCompress.L10nCompressing)
|
110 |
-
jQuery.ajax({
|
111 |
-
url: ajaxurl,
|
112 |
-
type: "POST",
|
113 |
-
dataType: "json",
|
114 |
-
data: {
|
115 |
-
_nonce: tinyCompress.nonce,
|
116 |
-
action: 'tiny_compress_image',
|
117 |
-
id: items[i].ID,
|
118 |
-
json: true
|
119 |
-
},
|
120 |
-
success: function(data) { bulk_compress_callback(null, data, items, i)},
|
121 |
-
error: function(xhr, textStatus, errorThrown) { bulk_compress_callback(errorThrown, {}, items, i) }
|
122 |
-
})
|
123 |
-
jQuery('#tiny-progress span').html(i + 1)
|
124 |
-
}
|
125 |
-
|
126 |
-
function bulk_compress(items) {
|
127 |
-
var list = jQuery('#media-items')
|
128 |
-
var row
|
129 |
-
for (var i = 0; i < items.length; i++) {
|
130 |
-
if (check_wp_version(3.3)) {
|
131 |
-
row = jQuery('<div class="media-item"><div class="progress"><div class="percent"></div><div class="bar"></div></div><div class="filename"></div></div>')
|
132 |
-
} else {
|
133 |
-
row = jQuery('<div class="media-item" style="box-shadow: none"><div class="progress"><div class="bar"></div></div><div class="percent"></div><div class="filename"></div></div>')
|
134 |
-
}
|
135 |
-
row.find('.percent').html(tinyCompress.L10nWaiting)
|
136 |
-
row.find('.filename').html(items[i].post_title)
|
137 |
-
list.append(row)
|
138 |
-
}
|
139 |
-
bulk_compress_item(items, 0)
|
140 |
-
}
|
141 |
-
|
142 |
-
function update_resize_settings() {
|
143 |
-
if (jQuery('#tinypng_sizes_0').prop('checked')) {
|
144 |
-
jQuery('.tiny-resize-available').show()
|
145 |
-
jQuery('.tiny-resize-unavailable').hide()
|
146 |
-
} else {
|
147 |
-
jQuery('.tiny-resize-available').hide()
|
148 |
-
jQuery('.tiny-resize-unavailable').show()
|
149 |
-
}
|
150 |
-
|
151 |
-
var original_enabled = jQuery('#tinypng_resize_original_enabled').prop('checked')
|
152 |
-
jQuery('#tinypng_resize_original_width, #tinypng_resize_original_height').each(function (i, el) {
|
153 |
-
el.disabled = !original_enabled
|
154 |
-
})
|
155 |
-
}
|
156 |
-
|
157 |
-
function update_preserve_settings() {
|
158 |
-
if (jQuery('#tinypng_sizes_0').prop('checked')) {
|
159 |
-
jQuery('.tiny-preserve').show()
|
160 |
-
} else {
|
161 |
-
jQuery('.tiny-preserve').hide()
|
162 |
-
jQuery('#tinypng_preserve_data_creation').attr('checked', false)
|
163 |
-
jQuery('#tinypng_preserve_data_copyright').attr('checked', false)
|
164 |
-
jQuery('#tinypng_preserve_data_location').attr('checked', false)
|
165 |
-
}
|
166 |
-
}
|
167 |
-
|
168 |
-
function update_settings() {
|
169 |
-
update_resize_settings()
|
170 |
-
update_preserve_settings()
|
171 |
-
}
|
172 |
-
|
173 |
-
var adminpage = ""
|
174 |
-
if (typeof window.adminpage !== "undefined") {
|
175 |
-
adminpage = window.adminpage
|
176 |
-
}
|
177 |
-
|
178 |
-
function eventOn(parentSelector, event, eventSelector, callback) {
|
179 |
-
if (typeof jQuery.fn.on === "function") {
|
180 |
-
jQuery(parentSelector).on(event, eventSelector, callback)
|
181 |
-
} else {
|
182 |
-
jQuery(eventSelector).live(event, callback)
|
183 |
-
}
|
184 |
-
}
|
185 |
-
|
186 |
-
if (adminpage === "upload-php") {
|
187 |
-
eventOn('table', 'click', 'button.tiny-compress', compress_image)
|
188 |
-
|
189 |
-
if (typeof jQuery.fn.prop === "function") {
|
190 |
-
jQuery('button.tiny-compress').prop('disabled', null)
|
191 |
-
} else {
|
192 |
-
jQuery('button.tiny-compress').attr('disabled', null)
|
193 |
-
}
|
194 |
-
|
195 |
-
jQuery('<option>').val('tiny_bulk_compress').text(tinyCompress.L10nBulkAction).appendTo('select[name="action"]')
|
196 |
-
jQuery('<option>').val('tiny_bulk_compress').text(tinyCompress.L10nBulkAction).appendTo('select[name="action2"]')
|
197 |
-
} else if (adminpage === "post-php") {
|
198 |
-
eventOn('div.postbox-container div.tiny-compress-images', 'click', 'button.tiny-compress', compress_image)
|
199 |
-
} else if (adminpage === "options-media-php") {
|
200 |
-
jQuery('#tiny-compress-status').load(ajaxurl + '?action=tiny_compress_status')
|
201 |
-
jQuery('#tiny-compress-savings').load(ajaxurl + '?action=tiny_compress_savings')
|
202 |
-
|
203 |
-
jQuery('input[name*="tinypng_sizes"], input#tinypng_resize_original_enabled').on("click", function() {
|
204 |
-
// Unfortunately, we need some additional information to display the correct notice.
|
205 |
-
totalSelectedSizes = jQuery('input[name*="tinypng_sizes"]:checked').length
|
206 |
-
var image_count_url = ajaxurl + '?action=tiny_image_sizes_notice&image_sizes_selected=' + totalSelectedSizes
|
207 |
-
if (jQuery('input#tinypng_resize_original_enabled').prop('checked') && jQuery('input#tinypng_sizes_0').prop('checked')) {
|
208 |
-
image_count_url += '&resize_original=true'
|
209 |
-
}
|
210 |
-
jQuery('#tiny-image-sizes-notice').load(image_count_url)
|
211 |
-
})
|
212 |
-
|
213 |
-
jQuery('#tinypng_sizes_0, #tinypng_resize_original_enabled').click(update_settings)
|
214 |
-
update_settings()
|
215 |
-
}
|
216 |
-
|
217 |
-
jQuery('.tiny-notice a.tiny-dismiss').click(dismiss_notice)
|
218 |
-
jQuery(function() {
|
219 |
-
jQuery('.tiny-notice.is-dismissible button').unbind('click').click(dismiss_notice)
|
220 |
-
})
|
221 |
-
|
222 |
-
window.tinyBulkCompress = bulk_compress
|
223 |
-
}).call()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
src/styles/admin.css
DELETED
@@ -1,142 +0,0 @@
|
|
1 |
-
.tiny-compress-images .spinner.hidden {
|
2 |
-
display: none;
|
3 |
-
visibility: hidden;
|
4 |
-
float: none;
|
5 |
-
margin-top: 0;
|
6 |
-
}
|
7 |
-
|
8 |
-
.tiny-compress-images div.spinner {
|
9 |
-
display: inline-block;
|
10 |
-
visibility: visible;
|
11 |
-
float: right;
|
12 |
-
margin-top: 4px;
|
13 |
-
}
|
14 |
-
|
15 |
-
.tiny-compress-images span.spinner {
|
16 |
-
visibility: visible;
|
17 |
-
float: none;
|
18 |
-
margin: 0;
|
19 |
-
}
|
20 |
-
|
21 |
-
.tiny-compress-images .details-container {
|
22 |
-
overflow: auto;
|
23 |
-
}
|
24 |
-
|
25 |
-
.tiny-compress-images .details-container button {
|
26 |
-
display: block;
|
27 |
-
margin: 5px 0 10px 24px;
|
28 |
-
}
|
29 |
-
|
30 |
-
.tiny-compress-images .details-container span.icon {
|
31 |
-
position: absolute;
|
32 |
-
}
|
33 |
-
|
34 |
-
.tiny-compress-images .details-container .message {
|
35 |
-
display: inline-block;
|
36 |
-
margin-left: 24px;
|
37 |
-
}
|
38 |
-
|
39 |
-
.tiny-compress-images .details-container span.success {
|
40 |
-
color: #0EE00E;
|
41 |
-
}
|
42 |
-
|
43 |
-
.tiny-compress-images .details-container span.error {
|
44 |
-
color: #D54E21;
|
45 |
-
}
|
46 |
-
|
47 |
-
.tiny-compress-images .details-container span.alert {
|
48 |
-
color: gray;
|
49 |
-
}
|
50 |
-
|
51 |
-
#tiny-compress-status .spinner, #tiny-compress-savings .spinner {
|
52 |
-
display: inline;
|
53 |
-
visibility: visible;
|
54 |
-
float: left;
|
55 |
-
margin: 0;
|
56 |
-
}
|
57 |
-
|
58 |
-
.tiny-compression-details {
|
59 |
-
padding: 10px;
|
60 |
-
}
|
61 |
-
|
62 |
-
.tiny-compression-details table {
|
63 |
-
border: 1px solid #E5E5E5;
|
64 |
-
border-collapse: collapse;
|
65 |
-
white-space: nowrap;
|
66 |
-
width: 100%;
|
67 |
-
}
|
68 |
-
|
69 |
-
.tiny-compression-details table tr.even {
|
70 |
-
background-color: #F9F9F9;
|
71 |
-
}
|
72 |
-
|
73 |
-
.tiny-compression-details table td {
|
74 |
-
padding: 6px 10px;
|
75 |
-
}
|
76 |
-
|
77 |
-
.tiny-compression-details table th {
|
78 |
-
padding: 8px 10px;
|
79 |
-
border-bottom: 1px solid #E5E5E5;
|
80 |
-
font-size: 14px;
|
81 |
-
}
|
82 |
-
|
83 |
-
.tiny-compression-details table tfoot {
|
84 |
-
border-top: 1px solid #E5E5E5;
|
85 |
-
}
|
86 |
-
|
87 |
-
.tiny-compression-details table tfoot td {
|
88 |
-
padding: 8px 10px;
|
89 |
-
}
|
90 |
-
|
91 |
-
.tiny-compress-images .modal {
|
92 |
-
display: none;
|
93 |
-
}
|
94 |
-
|
95 |
-
.tiny-compress-images h4 {
|
96 |
-
margin: 0.5em 0;
|
97 |
-
}
|
98 |
-
|
99 |
-
#tiny-bulk-compress #media-items .bar.failed {
|
100 |
-
background-color: #DD3D36;
|
101 |
-
}
|
102 |
-
|
103 |
-
#tiny-bulk-compress #media-items .percent.failed {
|
104 |
-
color: #DD3D36;
|
105 |
-
}
|
106 |
-
|
107 |
-
#tiny-bulk-compress .media-item {
|
108 |
-
box-shadow: 0px 1px 0px #DFDFDF;
|
109 |
-
min-height: 36px;
|
110 |
-
margin-bottom: 1px;
|
111 |
-
position: relative;
|
112 |
-
width: 100%;
|
113 |
-
background: none repeat scroll 0% 0% #FFF;
|
114 |
-
}
|
115 |
-
|
116 |
-
#tiny-bulk-compress .progress~.percent {
|
117 |
-
float: right;
|
118 |
-
line-height: 36px;
|
119 |
-
margin-right: 20px;
|
120 |
-
}
|
121 |
-
|
122 |
-
#tiny-progress p, #tiny-status p {
|
123 |
-
font-size: 120%;
|
124 |
-
}
|
125 |
-
|
126 |
-
#tiny-progress span, #tiny-status span {
|
127 |
-
background: none repeat scroll 0% 0% #FFF;
|
128 |
-
box-shadow: 0px 1px 0px #DFDFDF;
|
129 |
-
padding: 5px;
|
130 |
-
}
|
131 |
-
|
132 |
-
p.tiny-resize-resolution {
|
133 |
-
margin-left: 24px;
|
134 |
-
}
|
135 |
-
|
136 |
-
p.tiny-resize-resolution input {
|
137 |
-
margin-right: 6px;
|
138 |
-
}
|
139 |
-
|
140 |
-
input[type=number][name*="tinypng_resize_original"] {
|
141 |
-
width: 65px;
|
142 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
src/vendor/tinify/Tinify.php
ADDED
@@ -0,0 +1,107 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tinify;
|
4 |
+
|
5 |
+
const VERSION = "1.3.0";
|
6 |
+
|
7 |
+
class Tinify {
|
8 |
+
const AUTHENTICATED = true;
|
9 |
+
const ANONYMOUS = false;
|
10 |
+
|
11 |
+
private static $key = NULL;
|
12 |
+
private static $appIdentifier = NULL;
|
13 |
+
private static $compressionCount = NULL;
|
14 |
+
|
15 |
+
private static $client = NULL;
|
16 |
+
|
17 |
+
public static function setKey($key) {
|
18 |
+
self::$key = $key;
|
19 |
+
self::$client = NULL;
|
20 |
+
}
|
21 |
+
|
22 |
+
public static function getKey() {
|
23 |
+
return self::$key;
|
24 |
+
}
|
25 |
+
|
26 |
+
public static function createKey($email, $options) {
|
27 |
+
$body = array_merge(array("email" => $email), $options);
|
28 |
+
$response = self::getClient(self::ANONYMOUS)->request("post", "/keys", $body);
|
29 |
+
self::setKey($response->body->key);
|
30 |
+
}
|
31 |
+
|
32 |
+
public static function setAppIdentifier($appIdentifier) {
|
33 |
+
self::$appIdentifier = $appIdentifier;
|
34 |
+
self::$client = NULL;
|
35 |
+
}
|
36 |
+
|
37 |
+
public static function getCompressionCount() {
|
38 |
+
return self::$compressionCount;
|
39 |
+
}
|
40 |
+
|
41 |
+
public static function setCompressionCount($compressionCount) {
|
42 |
+
self::$compressionCount = $compressionCount;
|
43 |
+
}
|
44 |
+
|
45 |
+
public static function getClient($mode = self::AUTHENTICATED) {
|
46 |
+
if ($mode == self::AUTHENTICATED && !self::$key) {
|
47 |
+
throw new AccountException("Provide an API key with Tinify\setKey(...)");
|
48 |
+
}
|
49 |
+
|
50 |
+
if (!self::$client) {
|
51 |
+
self::$client = new Client(self::$key, self::$appIdentifier);
|
52 |
+
}
|
53 |
+
|
54 |
+
return self::$client;
|
55 |
+
}
|
56 |
+
|
57 |
+
public static function setClient($client) {
|
58 |
+
self::$client = $client;
|
59 |
+
}
|
60 |
+
}
|
61 |
+
|
62 |
+
function setKey($key) {
|
63 |
+
return Tinify::setKey($key);
|
64 |
+
}
|
65 |
+
|
66 |
+
function getKey() {
|
67 |
+
return Tinify::getKey();
|
68 |
+
}
|
69 |
+
|
70 |
+
function createKey($email, $options) {
|
71 |
+
return Tinify::createKey($email, $options);
|
72 |
+
}
|
73 |
+
|
74 |
+
function setAppIdentifier($appIdentifier) {
|
75 |
+
return Tinify::setAppIdentifier($appIdentifier);
|
76 |
+
}
|
77 |
+
|
78 |
+
function getCompressionCount() {
|
79 |
+
return Tinify::getCompressionCount();
|
80 |
+
}
|
81 |
+
|
82 |
+
function compressionCount() {
|
83 |
+
return Tinify::getCompressionCount();
|
84 |
+
}
|
85 |
+
|
86 |
+
function fromFile($path) {
|
87 |
+
return Source::fromFile($path);
|
88 |
+
}
|
89 |
+
|
90 |
+
function fromBuffer($string) {
|
91 |
+
return Source::fromBuffer($string);
|
92 |
+
}
|
93 |
+
|
94 |
+
function fromUrl($string) {
|
95 |
+
return Source::fromUrl($string);
|
96 |
+
}
|
97 |
+
|
98 |
+
function validate() {
|
99 |
+
try {
|
100 |
+
Tinify::getClient()->request("post", "/shrink");
|
101 |
+
} catch (AccountException $err) {
|
102 |
+
if ($err->status == 429) return true;
|
103 |
+
throw $err;
|
104 |
+
} catch (ClientException $err) {
|
105 |
+
return true;
|
106 |
+
}
|
107 |
+
}
|
src/vendor/tinify/Tinify/Client.php
ADDED
@@ -0,0 +1,118 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tinify;
|
4 |
+
|
5 |
+
class Client {
|
6 |
+
const API_ENDPOINT = "https://api.tinify.com";
|
7 |
+
|
8 |
+
protected $options;
|
9 |
+
|
10 |
+
public static function userAgent() {
|
11 |
+
$curl = curl_version();
|
12 |
+
return "Tinify/" . VERSION . " PHP/" . PHP_VERSION . " curl/" . $curl["version"];
|
13 |
+
}
|
14 |
+
|
15 |
+
private static function caBundle() {
|
16 |
+
return __DIR__ . "/../data/cacert.pem";
|
17 |
+
}
|
18 |
+
|
19 |
+
function __construct($key, $appIdentifier = NULL) {
|
20 |
+
$userAgent = join(" ", array_filter(array(self::userAgent(), $appIdentifier)));
|
21 |
+
$this->options = array(
|
22 |
+
CURLOPT_BINARYTRANSFER => true,
|
23 |
+
CURLOPT_RETURNTRANSFER => true,
|
24 |
+
CURLOPT_HEADER => true,
|
25 |
+
CURLOPT_USERPWD => $key ? ("api:" . $key) : NULL,
|
26 |
+
CURLOPT_CAINFO => self::caBundle(),
|
27 |
+
CURLOPT_SSL_VERIFYPEER => true,
|
28 |
+
CURLOPT_USERAGENT => $userAgent,
|
29 |
+
);
|
30 |
+
}
|
31 |
+
|
32 |
+
function request($method, $url, $body = NULL, $header = array()) {
|
33 |
+
if (is_array($body)) {
|
34 |
+
if (!empty($body)) {
|
35 |
+
$body = json_encode($body);
|
36 |
+
array_push($header, "Content-Type: application/json");
|
37 |
+
} else {
|
38 |
+
$body = NULL;
|
39 |
+
}
|
40 |
+
}
|
41 |
+
|
42 |
+
$request = curl_init();
|
43 |
+
curl_setopt_array($request, $this->options);
|
44 |
+
|
45 |
+
$url = strtolower(substr($url, 0, 6)) == "https:" ? $url : self::API_ENDPOINT . $url;
|
46 |
+
curl_setopt($request, CURLOPT_URL, $url);
|
47 |
+
curl_setopt($request, CURLOPT_HTTPHEADER, $header);
|
48 |
+
curl_setopt($request, CURLOPT_CUSTOMREQUEST, strtoupper($method));
|
49 |
+
|
50 |
+
if ($body) {
|
51 |
+
curl_setopt($request, CURLOPT_POSTFIELDS, $body);
|
52 |
+
}
|
53 |
+
|
54 |
+
$response = curl_exec($request);
|
55 |
+
|
56 |
+
if (is_string($response)) {
|
57 |
+
$status = curl_getinfo($request, CURLINFO_HTTP_CODE);
|
58 |
+
$headerSize = curl_getinfo($request, CURLINFO_HEADER_SIZE);
|
59 |
+
curl_close($request);
|
60 |
+
|
61 |
+
$headers = self::parseHeaders(substr($response, 0, $headerSize));
|
62 |
+
$body = substr($response, $headerSize);
|
63 |
+
|
64 |
+
if (isset($headers["compression-count"])) {
|
65 |
+
Tinify::setCompressionCount(intval($headers["compression-count"]));
|
66 |
+
}
|
67 |
+
|
68 |
+
$isJson = false;
|
69 |
+
if (isset($headers["content-type"])) {
|
70 |
+
/* Parse JSON response bodies. */
|
71 |
+
list($contentType) = explode(";", $headers["content-type"], 2);
|
72 |
+
if (strtolower(trim($contentType)) == "application/json") {
|
73 |
+
$isJson = true;
|
74 |
+
}
|
75 |
+
}
|
76 |
+
|
77 |
+
/* 1xx and 3xx are unexpected and will be treated as error. */
|
78 |
+
$isError = $status <= 199 || $status >= 300;
|
79 |
+
|
80 |
+
if ($isJson || $isError) {
|
81 |
+
/* Parse JSON bodies, always interpret errors as JSON. */
|
82 |
+
$body = json_decode($body);
|
83 |
+
if (!$body) {
|
84 |
+
$message = sprintf("Error while parsing response: %s (#%d)",
|
85 |
+
PHP_VERSION_ID >= 50500 ? json_last_error_msg() : "Error",
|
86 |
+
json_last_error());
|
87 |
+
throw Exception::create($message, "ParseError", $status);
|
88 |
+
}
|
89 |
+
}
|
90 |
+
|
91 |
+
if ($isError) {
|
92 |
+
throw Exception::create($body->message, $body->error, $status);
|
93 |
+
}
|
94 |
+
|
95 |
+
return (object) array("body" => $body, "headers" => $headers);
|
96 |
+
} else {
|
97 |
+
$message = sprintf("%s (#%d)", curl_error($request), curl_errno($request));
|
98 |
+
curl_close($request);
|
99 |
+
throw new ConnectionException("Error while connecting: " . $message);
|
100 |
+
}
|
101 |
+
}
|
102 |
+
|
103 |
+
protected static function parseHeaders($headers) {
|
104 |
+
if (!is_array($headers)) {
|
105 |
+
$headers = explode("\r\n", $headers);
|
106 |
+
}
|
107 |
+
|
108 |
+
$result = array();
|
109 |
+
foreach ($headers as $header) {
|
110 |
+
if (empty($header)) continue;
|
111 |
+
$split = explode(":", $header, 2);
|
112 |
+
if (count($split) === 2) {
|
113 |
+
$result[strtolower($split[0])] = trim($split[1]);
|
114 |
+
}
|
115 |
+
}
|
116 |
+
return $result;
|
117 |
+
}
|
118 |
+
}
|
src/vendor/tinify/Tinify/Exception.php
ADDED
@@ -0,0 +1,36 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tinify;
|
4 |
+
|
5 |
+
class Exception extends \Exception {
|
6 |
+
public $status;
|
7 |
+
|
8 |
+
public static function create($message, $type, $status) {
|
9 |
+
if ($status == 401 || $status == 403 || $status == 429) {
|
10 |
+
$klass = "Tinify\AccountException";
|
11 |
+
} else if($status >= 400 && $status <= 499) {
|
12 |
+
$klass = "Tinify\ClientException";
|
13 |
+
} else if($status >= 500 && $status <= 599) {
|
14 |
+
$klass = "Tinify\ServerException";
|
15 |
+
} else {
|
16 |
+
$klass = "Tinify\Exception";
|
17 |
+
}
|
18 |
+
|
19 |
+
if (empty($message)) $message = "No message was provided";
|
20 |
+
return new $klass($message, $type, $status);
|
21 |
+
}
|
22 |
+
|
23 |
+
function __construct($message, $type = NULL, $status = NULL) {
|
24 |
+
$this->status = $status;
|
25 |
+
if ($status) {
|
26 |
+
parent::__construct($message . " (HTTP " . $status . "/" . $type . ")");
|
27 |
+
} else {
|
28 |
+
parent::__construct($message);
|
29 |
+
}
|
30 |
+
}
|
31 |
+
}
|
32 |
+
|
33 |
+
class AccountException extends Exception {}
|
34 |
+
class ClientException extends Exception {}
|
35 |
+
class ServerException extends Exception {}
|
36 |
+
class ConnectionException extends Exception {}
|
src/vendor/tinify/Tinify/Result.php
ADDED
@@ -0,0 +1,36 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tinify;
|
4 |
+
|
5 |
+
class Result extends ResultMeta {
|
6 |
+
protected $data;
|
7 |
+
|
8 |
+
public function __construct($meta, $data) {
|
9 |
+
$this->meta = $meta;
|
10 |
+
$this->data = $data;
|
11 |
+
}
|
12 |
+
|
13 |
+
public function data() {
|
14 |
+
return $this->data;
|
15 |
+
}
|
16 |
+
|
17 |
+
public function toBuffer() {
|
18 |
+
return $this->data;
|
19 |
+
}
|
20 |
+
|
21 |
+
public function toFile($path) {
|
22 |
+
return file_put_contents($path, $this->toBuffer());
|
23 |
+
}
|
24 |
+
|
25 |
+
public function size() {
|
26 |
+
return intval($this->meta["content-length"]);
|
27 |
+
}
|
28 |
+
|
29 |
+
public function mediaType() {
|
30 |
+
return $this->meta["content-type"];
|
31 |
+
}
|
32 |
+
|
33 |
+
public function contentType() {
|
34 |
+
return $this->mediaType();
|
35 |
+
}
|
36 |
+
}
|
src/vendor/tinify/Tinify/ResultMeta.php
ADDED
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tinify;
|
4 |
+
|
5 |
+
class ResultMeta {
|
6 |
+
protected $meta;
|
7 |
+
|
8 |
+
public function __construct($meta) {
|
9 |
+
$this->meta = $meta;
|
10 |
+
}
|
11 |
+
|
12 |
+
public function width() {
|
13 |
+
return intval($this->meta["image-width"]);
|
14 |
+
}
|
15 |
+
|
16 |
+
public function height() {
|
17 |
+
return intval($this->meta["image-height"]);
|
18 |
+
}
|
19 |
+
|
20 |
+
public function location() {
|
21 |
+
return isset($this->meta["location"]) ? $this->meta["location"] : null;
|
22 |
+
}
|
23 |
+
}
|
src/vendor/tinify/Tinify/Source.php
ADDED
@@ -0,0 +1,69 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tinify;
|
4 |
+
|
5 |
+
class Source {
|
6 |
+
private $url, $commands;
|
7 |
+
|
8 |
+
public static function fromFile($path) {
|
9 |
+
return self::fromBuffer(file_get_contents($path));
|
10 |
+
}
|
11 |
+
|
12 |
+
public static function fromBuffer($string) {
|
13 |
+
$response = Tinify::getClient()->request("post", "/shrink", $string);
|
14 |
+
return new self($response->headers["location"]);
|
15 |
+
}
|
16 |
+
|
17 |
+
public static function fromUrl($url) {
|
18 |
+
$body = array("source" => array("url" => $url));
|
19 |
+
$response = Tinify::getClient()->request("post", "/shrink", $body);
|
20 |
+
return new self($response->headers["location"]);
|
21 |
+
}
|
22 |
+
|
23 |
+
public function __construct($url, $commands = array()) {
|
24 |
+
$this->url = $url;
|
25 |
+
$this->commands = $commands;
|
26 |
+
}
|
27 |
+
|
28 |
+
public function preserve() {
|
29 |
+
$options = $this->flatten(func_get_args());
|
30 |
+
$commands = array_merge($this->commands, array("preserve" => $options));
|
31 |
+
return new self($this->url, $commands);
|
32 |
+
}
|
33 |
+
|
34 |
+
public function resize($options) {
|
35 |
+
$commands = array_merge($this->commands, array("resize" => $options));
|
36 |
+
return new self($this->url, $commands);
|
37 |
+
}
|
38 |
+
|
39 |
+
public function store($options) {
|
40 |
+
$response = Tinify::getClient()->request("post", $this->url,
|
41 |
+
array_merge($this->commands, array("store" => $options)));
|
42 |
+
return new Result($response->headers, $response->body);
|
43 |
+
}
|
44 |
+
|
45 |
+
public function result() {
|
46 |
+
$response = Tinify::getClient()->request("get", $this->url, $this->commands);
|
47 |
+
return new Result($response->headers, $response->body);
|
48 |
+
}
|
49 |
+
|
50 |
+
public function toFile($path) {
|
51 |
+
return $this->result()->toFile($path);
|
52 |
+
}
|
53 |
+
|
54 |
+
public function toBuffer() {
|
55 |
+
return $this->result()->toBuffer();
|
56 |
+
}
|
57 |
+
|
58 |
+
private static function flatten($options) {
|
59 |
+
$flattened = array();
|
60 |
+
foreach ($options as $option) {
|
61 |
+
if (is_array($option)) {
|
62 |
+
$flattened = array_merge($flattened, $option);
|
63 |
+
} else {
|
64 |
+
array_push($flattened, $option);
|
65 |
+
}
|
66 |
+
}
|
67 |
+
return $flattened;
|
68 |
+
}
|
69 |
+
}
|
src/vendor/tinify/data/cacert.pem
ADDED
@@ -0,0 +1,3988 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
##
|
2 |
+
## Bundle of CA Root Certificates
|
3 |
+
##
|
4 |
+
## Certificate data from Mozilla as of: Wed Apr 22 03:12:04 2015
|
5 |
+
##
|
6 |
+
## This is a bundle of X.509 certificates of public Certificate Authorities
|
7 |
+
## (CA). These were automatically extracted from Mozilla's root certificates
|
8 |
+
## file (certdata.txt). This file can be found in the mozilla source tree:
|
9 |
+
## http://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt
|
10 |
+
##
|
11 |
+
## It contains the certificates in PEM format and therefore
|
12 |
+
## can be directly used with curl / libcurl / php_curl, or with
|
13 |
+
## an Apache+mod_ssl webserver for SSL client authentication.
|
14 |
+
## Just configure this file as the SSLCACertificateFile.
|
15 |
+
##
|
16 |
+
## Conversion done with mk-ca-bundle.pl version 1.25.
|
17 |
+
## SHA1: ed3c0bbfb7912bcc00cd2033b0cb85c98d10559c
|
18 |
+
##
|
19 |
+
|
20 |
+
|
21 |
+
Equifax Secure CA
|
22 |
+
=================
|
23 |
+
-----BEGIN CERTIFICATE-----
|
24 |
+
MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE
|
25 |
+
ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
|
26 |
+
MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT
|
27 |
+
B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB
|
28 |
+
nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR
|
29 |
+
fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW
|
30 |
+
8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG
|
31 |
+
A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE
|
32 |
+
CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG
|
33 |
+
A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS
|
34 |
+
spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB
|
35 |
+
Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961
|
36 |
+
zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB
|
37 |
+
BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95
|
38 |
+
70+sB3c4
|
39 |
+
-----END CERTIFICATE-----
|
40 |
+
|
41 |
+
GlobalSign Root CA
|
42 |
+
==================
|
43 |
+
-----BEGIN CERTIFICATE-----
|
44 |
+
MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx
|
45 |
+
GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds
|
46 |
+
b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV
|
47 |
+
BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD
|
48 |
+
VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa
|
49 |
+
DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc
|
50 |
+
THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb
|
51 |
+
Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP
|
52 |
+
c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX
|
53 |
+
gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
|
54 |
+
HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF
|
55 |
+
AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj
|
56 |
+
Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG
|
57 |
+
j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH
|
58 |
+
hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC
|
59 |
+
X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
|
60 |
+
-----END CERTIFICATE-----
|
61 |
+
|
62 |
+
GlobalSign Root CA - R2
|
63 |
+
=======================
|
64 |
+
-----BEGIN CERTIFICATE-----
|
65 |
+
MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv
|
66 |
+
YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
|
67 |
+
bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
|
68 |
+
aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
|
69 |
+
bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6
|
70 |
+
ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp
|
71 |
+
s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN
|
72 |
+
S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL
|
73 |
+
TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C
|
74 |
+
ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
|
75 |
+
FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i
|
76 |
+
YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN
|
77 |
+
BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp
|
78 |
+
9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu
|
79 |
+
01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7
|
80 |
+
9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
|
81 |
+
TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
|
82 |
+
-----END CERTIFICATE-----
|
83 |
+
|
84 |
+
Verisign Class 3 Public Primary Certification Authority - G3
|
85 |
+
============================================================
|
86 |
+
-----BEGIN CERTIFICATE-----
|
87 |
+
MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
|
88 |
+
UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
|
89 |
+
cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
|
90 |
+
IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
|
91 |
+
dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
|
92 |
+
CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
|
93 |
+
dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
|
94 |
+
cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg
|
95 |
+
Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
|
96 |
+
ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1
|
97 |
+
EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc
|
98 |
+
cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw
|
99 |
+
EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj
|
100 |
+
055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
|
101 |
+
ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f
|
102 |
+
j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
|
103 |
+
/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0
|
104 |
+
xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa
|
105 |
+
t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
|
106 |
+
-----END CERTIFICATE-----
|
107 |
+
|
108 |
+
Verisign Class 4 Public Primary Certification Authority - G3
|
109 |
+
============================================================
|
110 |
+
-----BEGIN CERTIFICATE-----
|
111 |
+
MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
|
112 |
+
UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
|
113 |
+
cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
|
114 |
+
IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
|
115 |
+
dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
|
116 |
+
CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
|
117 |
+
dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
|
118 |
+
cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg
|
119 |
+
Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
|
120 |
+
ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS
|
121 |
+
tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM
|
122 |
+
8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW
|
123 |
+
Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX
|
124 |
+
Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
|
125 |
+
j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt
|
126 |
+
mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
|
127 |
+
fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd
|
128 |
+
RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG
|
129 |
+
UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
|
130 |
+
-----END CERTIFICATE-----
|
131 |
+
|
132 |
+
Entrust.net Premium 2048 Secure Server CA
|
133 |
+
=========================================
|
134 |
+
-----BEGIN CERTIFICATE-----
|
135 |
+
MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
|
136 |
+
ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp
|
137 |
+
bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
|
138 |
+
BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx
|
139 |
+
NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
|
140 |
+
d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
|
141 |
+
MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u
|
142 |
+
ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
|
143 |
+
MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL
|
144 |
+
Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr
|
145 |
+
hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW
|
146 |
+
nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi
|
147 |
+
VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E
|
148 |
+
BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ
|
149 |
+
KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy
|
150 |
+
T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
|
151 |
+
zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT
|
152 |
+
J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e
|
153 |
+
nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE=
|
154 |
+
-----END CERTIFICATE-----
|
155 |
+
|
156 |
+
Baltimore CyberTrust Root
|
157 |
+
=========================
|
158 |
+
-----BEGIN CERTIFICATE-----
|
159 |
+
MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE
|
160 |
+
ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li
|
161 |
+
ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC
|
162 |
+
SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs
|
163 |
+
dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME
|
164 |
+
uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB
|
165 |
+
UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C
|
166 |
+
G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9
|
167 |
+
XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr
|
168 |
+
l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI
|
169 |
+
VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB
|
170 |
+
BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh
|
171 |
+
cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5
|
172 |
+
hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa
|
173 |
+
Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H
|
174 |
+
RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
|
175 |
+
-----END CERTIFICATE-----
|
176 |
+
|
177 |
+
AddTrust Low-Value Services Root
|
178 |
+
================================
|
179 |
+
-----BEGIN CERTIFICATE-----
|
180 |
+
MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
|
181 |
+
QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU
|
182 |
+
cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw
|
183 |
+
CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO
|
184 |
+
ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB
|
185 |
+
AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6
|
186 |
+
54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr
|
187 |
+
oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1
|
188 |
+
Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui
|
189 |
+
GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w
|
190 |
+
HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD
|
191 |
+
AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT
|
192 |
+
RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw
|
193 |
+
HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt
|
194 |
+
ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph
|
195 |
+
iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
|
196 |
+
eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr
|
197 |
+
mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj
|
198 |
+
ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
|
199 |
+
-----END CERTIFICATE-----
|
200 |
+
|
201 |
+
AddTrust External Root
|
202 |
+
======================
|
203 |
+
-----BEGIN CERTIFICATE-----
|
204 |
+
MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
|
205 |
+
QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD
|
206 |
+
VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw
|
207 |
+
NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU
|
208 |
+
cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg
|
209 |
+
Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821
|
210 |
+
+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw
|
211 |
+
Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo
|
212 |
+
aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy
|
213 |
+
2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7
|
214 |
+
7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P
|
215 |
+
BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL
|
216 |
+
VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk
|
217 |
+
VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB
|
218 |
+
IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl
|
219 |
+
j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
|
220 |
+
6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355
|
221 |
+
e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u
|
222 |
+
G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
|
223 |
+
-----END CERTIFICATE-----
|
224 |
+
|
225 |
+
AddTrust Public Services Root
|
226 |
+
=============================
|
227 |
+
-----BEGIN CERTIFICATE-----
|
228 |
+
MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
|
229 |
+
QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU
|
230 |
+
cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ
|
231 |
+
BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l
|
232 |
+
dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF
|
233 |
+
AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu
|
234 |
+
nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i
|
235 |
+
d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG
|
236 |
+
Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw
|
237 |
+
HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G
|
238 |
+
A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
|
239 |
+
/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux
|
240 |
+
FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G
|
241 |
+
A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4
|
242 |
+
JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL
|
243 |
+
+YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao
|
244 |
+
GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9
|
245 |
+
Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H
|
246 |
+
EufOX1362KqxMy3ZdvJOOjMMK7MtkAY=
|
247 |
+
-----END CERTIFICATE-----
|
248 |
+
|
249 |
+
AddTrust Qualified Certificates Root
|
250 |
+
====================================
|
251 |
+
-----BEGIN CERTIFICATE-----
|
252 |
+
MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
|
253 |
+
QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU
|
254 |
+
cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx
|
255 |
+
CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ
|
256 |
+
IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG
|
257 |
+
9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx
|
258 |
+
64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3
|
259 |
+
KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o
|
260 |
+
L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR
|
261 |
+
wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU
|
262 |
+
MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/
|
263 |
+
BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE
|
264 |
+
BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y
|
265 |
+
azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD
|
266 |
+
ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG
|
267 |
+
GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X
|
268 |
+
dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze
|
269 |
+
RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB
|
270 |
+
iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE=
|
271 |
+
-----END CERTIFICATE-----
|
272 |
+
|
273 |
+
Entrust Root Certification Authority
|
274 |
+
====================================
|
275 |
+
-----BEGIN CERTIFICATE-----
|
276 |
+
MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV
|
277 |
+
BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw
|
278 |
+
b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG
|
279 |
+
A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0
|
280 |
+
MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu
|
281 |
+
MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu
|
282 |
+
Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v
|
283 |
+
dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
|
284 |
+
ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz
|
285 |
+
A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww
|
286 |
+
Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68
|
287 |
+
j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN
|
288 |
+
rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw
|
289 |
+
DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1
|
290 |
+
MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH
|
291 |
+
hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
|
292 |
+
A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM
|
293 |
+
Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa
|
294 |
+
v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS
|
295 |
+
W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0
|
296 |
+
tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8
|
297 |
+
-----END CERTIFICATE-----
|
298 |
+
|
299 |
+
RSA Security 2048 v3
|
300 |
+
====================
|
301 |
+
-----BEGIN CERTIFICATE-----
|
302 |
+
MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK
|
303 |
+
ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy
|
304 |
+
MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb
|
305 |
+
BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
|
306 |
+
AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7
|
307 |
+
Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb
|
308 |
+
WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH
|
309 |
+
KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP
|
310 |
+
+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/
|
311 |
+
MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E
|
312 |
+
FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY
|
313 |
+
v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj
|
314 |
+
0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj
|
315 |
+
VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395
|
316 |
+
nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA
|
317 |
+
pKnXwiJPZ9d37CAFYd4=
|
318 |
+
-----END CERTIFICATE-----
|
319 |
+
|
320 |
+
GeoTrust Global CA
|
321 |
+
==================
|
322 |
+
-----BEGIN CERTIFICATE-----
|
323 |
+
MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
|
324 |
+
Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw
|
325 |
+
MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
|
326 |
+
LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
|
327 |
+
CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo
|
328 |
+
BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet
|
329 |
+
8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc
|
330 |
+
T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU
|
331 |
+
vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD
|
332 |
+
AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk
|
333 |
+
DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q
|
334 |
+
zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4
|
335 |
+
d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2
|
336 |
+
mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p
|
337 |
+
XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm
|
338 |
+
Mw==
|
339 |
+
-----END CERTIFICATE-----
|
340 |
+
|
341 |
+
GeoTrust Global CA 2
|
342 |
+
====================
|
343 |
+
-----BEGIN CERTIFICATE-----
|
344 |
+
MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
|
345 |
+
R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw
|
346 |
+
MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
|
347 |
+
LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
|
348 |
+
ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/
|
349 |
+
NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k
|
350 |
+
LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA
|
351 |
+
Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b
|
352 |
+
HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF
|
353 |
+
MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH
|
354 |
+
K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7
|
355 |
+
srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh
|
356 |
+
ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL
|
357 |
+
OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC
|
358 |
+
x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF
|
359 |
+
H4z1Ir+rzoPz4iIprn2DQKi6bA==
|
360 |
+
-----END CERTIFICATE-----
|
361 |
+
|
362 |
+
GeoTrust Universal CA
|
363 |
+
=====================
|
364 |
+
-----BEGIN CERTIFICATE-----
|
365 |
+
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
|
389 |
+
P/rmMuGNG2+k5o7Y+SlIis5z/iw=
|
390 |
+
-----END CERTIFICATE-----
|
391 |
+
|
392 |
+
GeoTrust Universal CA 2
|
393 |
+
=======================
|
394 |
+
-----BEGIN CERTIFICATE-----
|
395 |
+
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
|
419 |
+
X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
|
420 |
+
-----END CERTIFICATE-----
|
421 |
+
|
422 |
+
Visa eCommerce Root
|
423 |
+
===================
|
424 |
+
-----BEGIN CERTIFICATE-----
|
425 |
+
MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG
|
426 |
+
EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug
|
427 |
+
QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2
|
428 |
+
WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm
|
429 |
+
VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
|
430 |
+
bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL
|
431 |
+
F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b
|
432 |
+
RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0
|
433 |
+
TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI
|
434 |
+
/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs
|
435 |
+
GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG
|
436 |
+
MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc
|
437 |
+
CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW
|
438 |
+
YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz
|
439 |
+
zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu
|
440 |
+
YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
|
441 |
+
398znM/jra6O1I7mT1GvFpLgXPYHDw==
|
442 |
+
-----END CERTIFICATE-----
|
443 |
+
|
444 |
+
Certum Root CA
|
445 |
+
==============
|
446 |
+
-----BEGIN CERTIFICATE-----
|
447 |
+
MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK
|
448 |
+
ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla
|
449 |
+
Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u
|
450 |
+
by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x
|
451 |
+
wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL
|
452 |
+
kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ
|
453 |
+
89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K
|
454 |
+
Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P
|
455 |
+
NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq
|
456 |
+
hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+
|
457 |
+
GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg
|
458 |
+
GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/
|
459 |
+
0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS
|
460 |
+
qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw==
|
461 |
+
-----END CERTIFICATE-----
|
462 |
+
|
463 |
+
Comodo AAA Services root
|
464 |
+
========================
|
465 |
+
-----BEGIN CERTIFICATE-----
|
466 |
+
MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
|
467 |
+
R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
|
468 |
+
TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw
|
469 |
+
MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl
|
470 |
+
c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
|
471 |
+
BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
|
472 |
+
ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG
|
473 |
+
C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs
|
474 |
+
i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW
|
475 |
+
Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH
|
476 |
+
Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK
|
477 |
+
Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f
|
478 |
+
BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl
|
479 |
+
cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz
|
480 |
+
LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm
|
481 |
+
7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
|
482 |
+
Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z
|
483 |
+
8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C
|
484 |
+
12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
|
485 |
+
-----END CERTIFICATE-----
|
486 |
+
|
487 |
+
Comodo Secure Services root
|
488 |
+
===========================
|
489 |
+
-----BEGIN CERTIFICATE-----
|
490 |
+
MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
|
491 |
+
R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
|
492 |
+
TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw
|
493 |
+
MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu
|
494 |
+
Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi
|
495 |
+
BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
|
496 |
+
ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP
|
497 |
+
9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc
|
498 |
+
rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC
|
499 |
+
oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V
|
500 |
+
p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E
|
501 |
+
FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w
|
502 |
+
gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj
|
503 |
+
YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm
|
504 |
+
aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm
|
505 |
+
4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj
|
506 |
+
Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL
|
507 |
+
DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw
|
508 |
+
pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H
|
509 |
+
RR3B7Hzs/Sk=
|
510 |
+
-----END CERTIFICATE-----
|
511 |
+
|
512 |
+
Comodo Trusted Services root
|
513 |
+
============================
|
514 |
+
-----BEGIN CERTIFICATE-----
|
515 |
+
MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
|
516 |
+
R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
|
517 |
+
TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw
|
518 |
+
MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h
|
519 |
+
bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw
|
520 |
+
IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC
|
521 |
+
AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7
|
522 |
+
3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y
|
523 |
+
/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6
|
524 |
+
juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS
|
525 |
+
ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud
|
526 |
+
DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
|
527 |
+
/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp
|
528 |
+
ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl
|
529 |
+
cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw
|
530 |
+
uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32
|
531 |
+
pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA
|
532 |
+
BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l
|
533 |
+
R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O
|
534 |
+
9y5Xt5hwXsjEeLBi
|
535 |
+
-----END CERTIFICATE-----
|
536 |
+
|
537 |
+
QuoVadis Root CA
|
538 |
+
================
|
539 |
+
-----BEGIN CERTIFICATE-----
|
540 |
+
MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE
|
541 |
+
ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
|
542 |
+
eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz
|
543 |
+
MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp
|
544 |
+
cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD
|
545 |
+
EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
|
546 |
+
AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk
|
547 |
+
J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL
|
548 |
+
F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL
|
549 |
+
YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen
|
550 |
+
AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w
|
551 |
+
PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y
|
552 |
+
ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7
|
553 |
+
MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj
|
554 |
+
YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs
|
555 |
+
ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
|
556 |
+
Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW
|
557 |
+
Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu
|
558 |
+
BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw
|
559 |
+
FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0
|
560 |
+
aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6
|
561 |
+
tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo
|
562 |
+
fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul
|
563 |
+
LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x
|
564 |
+
gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi
|
565 |
+
5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi
|
566 |
+
5nrQNiOKSnQ2+Q==
|
567 |
+
-----END CERTIFICATE-----
|
568 |
+
|
569 |
+
QuoVadis Root CA 2
|
570 |
+
==================
|
571 |
+
-----BEGIN CERTIFICATE-----
|
572 |
+
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
|
598 |
+
-----END CERTIFICATE-----
|
599 |
+
|
600 |
+
QuoVadis Root CA 3
|
601 |
+
==================
|
602 |
+
-----BEGIN CERTIFICATE-----
|
603 |
+
MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
|
604 |
+
EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx
|
605 |
+
OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
|
606 |
+
aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
|
607 |
+
DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg
|
608 |
+
DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij
|
609 |
+
KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K
|
610 |
+
DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv
|
611 |
+
BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp
|
612 |
+
p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8
|
613 |
+
nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX
|
614 |
+
MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM
|
615 |
+
Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz
|
616 |
+
uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT
|
617 |
+
BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj
|
618 |
+
YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
|
619 |
+
aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB
|
620 |
+
BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD
|
621 |
+
VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4
|
622 |
+
ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE
|
623 |
+
AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV
|
624 |
+
qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s
|
625 |
+
hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z
|
626 |
+
POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2
|
627 |
+
Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp
|
628 |
+
8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC
|
629 |
+
bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu
|
630 |
+
g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p
|
631 |
+
vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr
|
632 |
+
qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=
|
633 |
+
-----END CERTIFICATE-----
|
634 |
+
|
635 |
+
Security Communication Root CA
|
636 |
+
==============================
|
637 |
+
-----BEGIN CERTIFICATE-----
|
638 |
+
MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
|
639 |
+
U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
|
640 |
+
HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
|
641 |
+
U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
|
642 |
+
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw
|
643 |
+
8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM
|
644 |
+
DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX
|
645 |
+
5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd
|
646 |
+
DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2
|
647 |
+
JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw
|
648 |
+
DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g
|
649 |
+
0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a
|
650 |
+
mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ
|
651 |
+
s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ
|
652 |
+
6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi
|
653 |
+
FL39vmwLAw==
|
654 |
+
-----END CERTIFICATE-----
|
655 |
+
|
656 |
+
Sonera Class 2 Root CA
|
657 |
+
======================
|
658 |
+
-----BEGIN CERTIFICATE-----
|
659 |
+
MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
|
660 |
+
U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw
|
661 |
+
NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
|
662 |
+
IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3
|
663 |
+
/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT
|
664 |
+
dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG
|
665 |
+
f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P
|
666 |
+
tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH
|
667 |
+
nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT
|
668 |
+
XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt
|
669 |
+
0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI
|
670 |
+
cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph
|
671 |
+
Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx
|
672 |
+
EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH
|
673 |
+
llpwrN9M
|
674 |
+
-----END CERTIFICATE-----
|
675 |
+
|
676 |
+
Staat der Nederlanden Root CA
|
677 |
+
=============================
|
678 |
+
-----BEGIN CERTIFICATE-----
|
679 |
+
MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE
|
680 |
+
ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g
|
681 |
+
Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w
|
682 |
+
HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh
|
683 |
+
bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt
|
684 |
+
vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P
|
685 |
+
jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca
|
686 |
+
C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth
|
687 |
+
vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6
|
688 |
+
22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV
|
689 |
+
HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v
|
690 |
+
dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN
|
691 |
+
BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR
|
692 |
+
EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw
|
693 |
+
MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y
|
694 |
+
nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR
|
695 |
+
iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw==
|
696 |
+
-----END CERTIFICATE-----
|
697 |
+
|
698 |
+
UTN DATACorp SGC Root CA
|
699 |
+
========================
|
700 |
+
-----BEGIN CERTIFICATE-----
|
701 |
+
MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE
|
702 |
+
BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
|
703 |
+
IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ
|
704 |
+
BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa
|
705 |
+
MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w
|
706 |
+
HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy
|
707 |
+
dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC
|
708 |
+
AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys
|
709 |
+
raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo
|
710 |
+
wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA
|
711 |
+
9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv
|
712 |
+
33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud
|
713 |
+
DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9
|
714 |
+
BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD
|
715 |
+
LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3
|
716 |
+
DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft
|
717 |
+
Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0
|
718 |
+
I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx
|
719 |
+
EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP
|
720 |
+
DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI
|
721 |
+
-----END CERTIFICATE-----
|
722 |
+
|
723 |
+
UTN USERFirst Hardware Root CA
|
724 |
+
==============================
|
725 |
+
-----BEGIN CERTIFICATE-----
|
726 |
+
MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE
|
727 |
+
BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
|
728 |
+
IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd
|
729 |
+
BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx
|
730 |
+
OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0
|
731 |
+
eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz
|
732 |
+
ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3
|
733 |
+
DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI
|
734 |
+
wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd
|
735 |
+
tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8
|
736 |
+
i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf
|
737 |
+
Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw
|
738 |
+
gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF
|
739 |
+
lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF
|
740 |
+
UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF
|
741 |
+
BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
|
742 |
+
//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW
|
743 |
+
XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2
|
744 |
+
lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn
|
745 |
+
iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67
|
746 |
+
nfhmqA==
|
747 |
+
-----END CERTIFICATE-----
|
748 |
+
|
749 |
+
Camerfirma Chambers of Commerce Root
|
750 |
+
====================================
|
751 |
+
-----BEGIN CERTIFICATE-----
|
752 |
+
MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
|
753 |
+
QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
|
754 |
+
ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx
|
755 |
+
NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp
|
756 |
+
cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn
|
757 |
+
MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC
|
758 |
+
AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU
|
759 |
+
xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH
|
760 |
+
NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW
|
761 |
+
DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV
|
762 |
+
d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud
|
763 |
+
EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v
|
764 |
+
cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P
|
765 |
+
AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh
|
766 |
+
bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD
|
767 |
+
VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz
|
768 |
+
aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi
|
769 |
+
fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD
|
770 |
+
L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN
|
771 |
+
UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n
|
772 |
+
ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1
|
773 |
+
erfutGWaIZDgqtCYvDi1czyL+Nw=
|
774 |
+
-----END CERTIFICATE-----
|
775 |
+
|
776 |
+
Camerfirma Global Chambersign Root
|
777 |
+
==================================
|
778 |
+
-----BEGIN CERTIFICATE-----
|
779 |
+
MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
|
780 |
+
QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
|
781 |
+
ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx
|
782 |
+
NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt
|
783 |
+
YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg
|
784 |
+
MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw
|
785 |
+
ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J
|
786 |
+
1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O
|
787 |
+
by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl
|
788 |
+
6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c
|
789 |
+
8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/
|
790 |
+
BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j
|
791 |
+
aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B
|
792 |
+
Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj
|
793 |
+
aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y
|
794 |
+
ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh
|
795 |
+
bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA
|
796 |
+
PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y
|
797 |
+
gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ
|
798 |
+
PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4
|
799 |
+
IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes
|
800 |
+
t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==
|
801 |
+
-----END CERTIFICATE-----
|
802 |
+
|
803 |
+
NetLock Notary (Class A) Root
|
804 |
+
=============================
|
805 |
+
-----BEGIN CERTIFICATE-----
|
806 |
+
MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI
|
807 |
+
EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6
|
808 |
+
dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j
|
809 |
+
ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX
|
810 |
+
DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH
|
811 |
+
EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD
|
812 |
+
VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz
|
813 |
+
cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM
|
814 |
+
D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ
|
815 |
+
z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC
|
816 |
+
/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7
|
817 |
+
tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6
|
818 |
+
4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG
|
819 |
+
A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC
|
820 |
+
Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv
|
821 |
+
bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu
|
822 |
+
IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn
|
823 |
+
LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0
|
824 |
+
ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz
|
825 |
+
IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh
|
826 |
+
IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu
|
827 |
+
b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh
|
828 |
+
bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg
|
829 |
+
Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp
|
830 |
+
bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5
|
831 |
+
ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP
|
832 |
+
ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB
|
833 |
+
CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr
|
834 |
+
KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM
|
835 |
+
8CgHrTwXZoi1/baI
|
836 |
+
-----END CERTIFICATE-----
|
837 |
+
|
838 |
+
XRamp Global CA Root
|
839 |
+
====================
|
840 |
+
-----BEGIN CERTIFICATE-----
|
841 |
+
MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE
|
842 |
+
BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj
|
843 |
+
dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
|
844 |
+
dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx
|
845 |
+
HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg
|
846 |
+
U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
|
847 |
+
dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu
|
848 |
+
IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx
|
849 |
+
foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE
|
850 |
+
zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs
|
851 |
+
AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry
|
852 |
+
xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
|
853 |
+
EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap
|
854 |
+
oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC
|
855 |
+
AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc
|
856 |
+
/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
|
857 |
+
qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n
|
858 |
+
nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz
|
859 |
+
8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=
|
860 |
+
-----END CERTIFICATE-----
|
861 |
+
|
862 |
+
Go Daddy Class 2 CA
|
863 |
+
===================
|
864 |
+
-----BEGIN CERTIFICATE-----
|
865 |
+
MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY
|
866 |
+
VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp
|
867 |
+
ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG
|
868 |
+
A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
|
869 |
+
RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD
|
870 |
+
ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
|
871 |
+
2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32
|
872 |
+
qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j
|
873 |
+
YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY
|
874 |
+
vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O
|
875 |
+
BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o
|
876 |
+
atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu
|
877 |
+
MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG
|
878 |
+
A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim
|
879 |
+
PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt
|
880 |
+
I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
|
881 |
+
HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI
|
882 |
+
Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b
|
883 |
+
vZ8=
|
884 |
+
-----END CERTIFICATE-----
|
885 |
+
|
886 |
+
Starfield Class 2 CA
|
887 |
+
====================
|
888 |
+
-----BEGIN CERTIFICATE-----
|
889 |
+
MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc
|
890 |
+
U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg
|
891 |
+
Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo
|
892 |
+
MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG
|
893 |
+
A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG
|
894 |
+
SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY
|
895 |
+
bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ
|
896 |
+
JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm
|
897 |
+
epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN
|
898 |
+
F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF
|
899 |
+
MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f
|
900 |
+
hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo
|
901 |
+
bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g
|
902 |
+
QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs
|
903 |
+
afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM
|
904 |
+
PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
|
905 |
+
xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD
|
906 |
+
KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3
|
907 |
+
QBFGmh95DmK/D5fs4C8fF5Q=
|
908 |
+
-----END CERTIFICATE-----
|
909 |
+
|
910 |
+
StartCom Certification Authority
|
911 |
+
================================
|
912 |
+
-----BEGIN CERTIFICATE-----
|
913 |
+
MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
|
914 |
+
U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
|
915 |
+
ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
|
916 |
+
NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
|
917 |
+
LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
|
918 |
+
U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
|
919 |
+
ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
|
920 |
+
o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
|
921 |
+
Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
|
922 |
+
eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
|
923 |
+
2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
|
924 |
+
6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
|
925 |
+
osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
|
926 |
+
untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
|
927 |
+
UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
|
928 |
+
37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
|
929 |
+
FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0
|
930 |
+
Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj
|
931 |
+
YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH
|
932 |
+
AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw
|
933 |
+
Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg
|
934 |
+
U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5
|
935 |
+
LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl
|
936 |
+
cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh
|
937 |
+
cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT
|
938 |
+
dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC
|
939 |
+
AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh
|
940 |
+
3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm
|
941 |
+
vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk
|
942 |
+
fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3
|
943 |
+
fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ
|
944 |
+
EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
|
945 |
+
yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl
|
946 |
+
1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/
|
947 |
+
lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro
|
948 |
+
g14=
|
949 |
+
-----END CERTIFICATE-----
|
950 |
+
|
951 |
+
Taiwan GRCA
|
952 |
+
===========
|
953 |
+
-----BEGIN CERTIFICATE-----
|
954 |
+
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
|
979 |
+
-----END CERTIFICATE-----
|
980 |
+
|
981 |
+
Swisscom Root CA 1
|
982 |
+
==================
|
983 |
+
-----BEGIN CERTIFICATE-----
|
984 |
+
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
|
1010 |
+
NY6E0F/6MBr1mmz0DlP5OlvRHA==
|
1011 |
+
-----END CERTIFICATE-----
|
1012 |
+
|
1013 |
+
DigiCert Assured ID Root CA
|
1014 |
+
===========================
|
1015 |
+
-----BEGIN CERTIFICATE-----
|
1016 |
+
MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG
|
1017 |
+
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
|
1018 |
+
IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx
|
1019 |
+
MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
|
1020 |
+
ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew
|
1021 |
+
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO
|
1022 |
+
9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy
|
1023 |
+
UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW
|
1024 |
+
/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy
|
1025 |
+
oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf
|
1026 |
+
GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF
|
1027 |
+
66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq
|
1028 |
+
hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc
|
1029 |
+
EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn
|
1030 |
+
SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i
|
1031 |
+
8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
|
1032 |
+
+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
|
1033 |
+
-----END CERTIFICATE-----
|
1034 |
+
|
1035 |
+
DigiCert Global Root CA
|
1036 |
+
=======================
|
1037 |
+
-----BEGIN CERTIFICATE-----
|
1038 |
+
MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG
|
1039 |
+
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
|
1040 |
+
HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw
|
1041 |
+
MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
|
1042 |
+
dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq
|
1043 |
+
hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn
|
1044 |
+
TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5
|
1045 |
+
BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H
|
1046 |
+
4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y
|
1047 |
+
7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB
|
1048 |
+
o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm
|
1049 |
+
8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF
|
1050 |
+
BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr
|
1051 |
+
EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt
|
1052 |
+
tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886
|
1053 |
+
UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
|
1054 |
+
CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
|
1055 |
+
-----END CERTIFICATE-----
|
1056 |
+
|
1057 |
+
DigiCert High Assurance EV Root CA
|
1058 |
+
==================================
|
1059 |
+
-----BEGIN CERTIFICATE-----
|
1060 |
+
MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
|
1061 |
+
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
|
1062 |
+
KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
|
1063 |
+
MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
|
1064 |
+
MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
|
1065 |
+
Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
|
1066 |
+
Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
|
1067 |
+
OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
|
1068 |
+
MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
|
1069 |
+
NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
|
1070 |
+
h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
|
1071 |
+
Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
|
1072 |
+
JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
|
1073 |
+
V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
|
1074 |
+
myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
|
1075 |
+
mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
|
1076 |
+
vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
|
1077 |
+
-----END CERTIFICATE-----
|
1078 |
+
|
1079 |
+
Certplus Class 2 Primary CA
|
1080 |
+
===========================
|
1081 |
+
-----BEGIN CERTIFICATE-----
|
1082 |
+
MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE
|
1083 |
+
BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN
|
1084 |
+
OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy
|
1085 |
+
dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP
|
1086 |
+
ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR
|
1087 |
+
5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ
|
1088 |
+
Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO
|
1089 |
+
YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e
|
1090 |
+
e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME
|
1091 |
+
CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ
|
1092 |
+
YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t
|
1093 |
+
L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD
|
1094 |
+
P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R
|
1095 |
+
TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+
|
1096 |
+
7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW
|
1097 |
+
//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
|
1098 |
+
l7+ijrRU
|
1099 |
+
-----END CERTIFICATE-----
|
1100 |
+
|
1101 |
+
DST Root CA X3
|
1102 |
+
==============
|
1103 |
+
-----BEGIN CERTIFICATE-----
|
1104 |
+
MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK
|
1105 |
+
ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X
|
1106 |
+
DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1
|
1107 |
+
cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD
|
1108 |
+
ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT
|
1109 |
+
rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9
|
1110 |
+
UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy
|
1111 |
+
xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d
|
1112 |
+
utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T
|
1113 |
+
AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ
|
1114 |
+
MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug
|
1115 |
+
dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE
|
1116 |
+
GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw
|
1117 |
+
RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS
|
1118 |
+
fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
|
1119 |
+
-----END CERTIFICATE-----
|
1120 |
+
|
1121 |
+
DST ACES CA X6
|
1122 |
+
==============
|
1123 |
+
-----BEGIN CERTIFICATE-----
|
1124 |
+
MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG
|
1125 |
+
EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT
|
1126 |
+
MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha
|
1127 |
+
MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE
|
1128 |
+
CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC
|
1129 |
+
AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI
|
1130 |
+
DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa
|
1131 |
+
pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow
|
1132 |
+
GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy
|
1133 |
+
MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud
|
1134 |
+
EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu
|
1135 |
+
Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy
|
1136 |
+
dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU
|
1137 |
+
CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2
|
1138 |
+
5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t
|
1139 |
+
Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq
|
1140 |
+
nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs
|
1141 |
+
vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3
|
1142 |
+
oKfN5XozNmr6mis=
|
1143 |
+
-----END CERTIFICATE-----
|
1144 |
+
|
1145 |
+
TURKTRUST Certificate Services Provider Root 1
|
1146 |
+
==============================================
|
1147 |
+
-----BEGIN CERTIFICATE-----
|
1148 |
+
MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF
|
1149 |
+
bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP
|
1150 |
+
MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0
|
1151 |
+
acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx
|
1152 |
+
MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg
|
1153 |
+
U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB
|
1154 |
+
TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC
|
1155 |
+
aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC
|
1156 |
+
AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX
|
1157 |
+
yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i
|
1158 |
+
Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ
|
1159 |
+
8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4
|
1160 |
+
W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME
|
1161 |
+
BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46
|
1162 |
+
sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE
|
1163 |
+
q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy
|
1164 |
+
B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY
|
1165 |
+
nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H
|
1166 |
+
-----END CERTIFICATE-----
|
1167 |
+
|
1168 |
+
TURKTRUST Certificate Services Provider Root 2
|
1169 |
+
==============================================
|
1170 |
+
-----BEGIN CERTIFICATE-----
|
1171 |
+
MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF
|
1172 |
+
bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP
|
1173 |
+
MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
|
1174 |
+
QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN
|
1175 |
+
MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr
|
1176 |
+
dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G
|
1177 |
+
A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls
|
1178 |
+
acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G
|
1179 |
+
CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe
|
1180 |
+
LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI
|
1181 |
+
x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g
|
1182 |
+
QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr
|
1183 |
+
5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB
|
1184 |
+
AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G
|
1185 |
+
A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt
|
1186 |
+
Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4
|
1187 |
+
Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+
|
1188 |
+
hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P
|
1189 |
+
9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5
|
1190 |
+
UrbnBEI=
|
1191 |
+
-----END CERTIFICATE-----
|
1192 |
+
|
1193 |
+
SwissSign Gold CA - G2
|
1194 |
+
======================
|
1195 |
+
-----BEGIN CERTIFICATE-----
|
1196 |
+
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
|
1222 |
+
-----END CERTIFICATE-----
|
1223 |
+
|
1224 |
+
SwissSign Silver CA - G2
|
1225 |
+
========================
|
1226 |
+
-----BEGIN CERTIFICATE-----
|
1227 |
+
MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT
|
1228 |
+
BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X
|
1229 |
+
DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3
|
1230 |
+
aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG
|
1231 |
+
9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644
|
1232 |
+
N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm
|
1233 |
+
+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH
|
1234 |
+
6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu
|
1235 |
+
MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h
|
1236 |
+
qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5
|
1237 |
+
FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs
|
1238 |
+
ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc
|
1239 |
+
celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X
|
1240 |
+
CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
|
1241 |
+
BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB
|
1242 |
+
tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0
|
1243 |
+
cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P
|
1244 |
+
4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F
|
1245 |
+
kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L
|
1246 |
+
3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx
|
1247 |
+
/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa
|
1248 |
+
DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP
|
1249 |
+
e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu
|
1250 |
+
WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ
|
1251 |
+
DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub
|
1252 |
+
DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u
|
1253 |
+
-----END CERTIFICATE-----
|
1254 |
+
|
1255 |
+
GeoTrust Primary Certification Authority
|
1256 |
+
========================================
|
1257 |
+
-----BEGIN CERTIFICATE-----
|
1258 |
+
MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG
|
1259 |
+
EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD
|
1260 |
+
ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx
|
1261 |
+
CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ
|
1262 |
+
cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
|
1263 |
+
CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN
|
1264 |
+
b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9
|
1265 |
+
nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge
|
1266 |
+
RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt
|
1267 |
+
tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
|
1268 |
+
AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI
|
1269 |
+
hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K
|
1270 |
+
Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN
|
1271 |
+
NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa
|
1272 |
+
Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG
|
1273 |
+
1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
|
1274 |
+
-----END CERTIFICATE-----
|
1275 |
+
|
1276 |
+
thawte Primary Root CA
|
1277 |
+
======================
|
1278 |
+
-----BEGIN CERTIFICATE-----
|
1279 |
+
MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE
|
1280 |
+
BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
|
1281 |
+
aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
|
1282 |
+
cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3
|
1283 |
+
MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg
|
1284 |
+
SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv
|
1285 |
+
KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT
|
1286 |
+
FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs
|
1287 |
+
oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ
|
1288 |
+
1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc
|
1289 |
+
q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K
|
1290 |
+
aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p
|
1291 |
+
afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD
|
1292 |
+
VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF
|
1293 |
+
AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE
|
1294 |
+
uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
|
1295 |
+
xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89
|
1296 |
+
jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH
|
1297 |
+
z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==
|
1298 |
+
-----END CERTIFICATE-----
|
1299 |
+
|
1300 |
+
VeriSign Class 3 Public Primary Certification Authority - G5
|
1301 |
+
============================================================
|
1302 |
+
-----BEGIN CERTIFICATE-----
|
1303 |
+
MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
|
1304 |
+
BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
|
1305 |
+
ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
|
1306 |
+
IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp
|
1307 |
+
ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB
|
1308 |
+
yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln
|
1309 |
+
biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh
|
1310 |
+
dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt
|
1311 |
+
YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
|
1312 |
+
ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz
|
1313 |
+
j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD
|
1314 |
+
Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/
|
1315 |
+
Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r
|
1316 |
+
fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/
|
1317 |
+
BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv
|
1318 |
+
Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
|
1319 |
+
aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
|
1320 |
+
SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+
|
1321 |
+
X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE
|
1322 |
+
KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC
|
1323 |
+
Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE
|
1324 |
+
ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
|
1325 |
+
-----END CERTIFICATE-----
|
1326 |
+
|
1327 |
+
SecureTrust CA
|
1328 |
+
==============
|
1329 |
+
-----BEGIN CERTIFICATE-----
|
1330 |
+
MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG
|
1331 |
+
EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy
|
1332 |
+
dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe
|
1333 |
+
BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC
|
1334 |
+
ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX
|
1335 |
+
OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t
|
1336 |
+
DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH
|
1337 |
+
GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b
|
1338 |
+
01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH
|
1339 |
+
ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/
|
1340 |
+
BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj
|
1341 |
+
aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
|
1342 |
+
KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu
|
1343 |
+
SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf
|
1344 |
+
mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ
|
1345 |
+
nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
|
1346 |
+
3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
|
1347 |
+
-----END CERTIFICATE-----
|
1348 |
+
|
1349 |
+
Secure Global CA
|
1350 |
+
================
|
1351 |
+
-----BEGIN CERTIFICATE-----
|
1352 |
+
MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG
|
1353 |
+
EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH
|
1354 |
+
bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg
|
1355 |
+
MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg
|
1356 |
+
Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx
|
1357 |
+
YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ
|
1358 |
+
bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g
|
1359 |
+
8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV
|
1360 |
+
HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi
|
1361 |
+
0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
|
1362 |
+
EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn
|
1363 |
+
oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA
|
1364 |
+
MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+
|
1365 |
+
OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn
|
1366 |
+
CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5
|
1367 |
+
3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
|
1368 |
+
f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
|
1369 |
+
-----END CERTIFICATE-----
|
1370 |
+
|
1371 |
+
COMODO Certification Authority
|
1372 |
+
==============================
|
1373 |
+
-----BEGIN CERTIFICATE-----
|
1374 |
+
MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE
|
1375 |
+
BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
|
1376 |
+
A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1
|
1377 |
+
dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb
|
1378 |
+
MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD
|
1379 |
+
T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
|
1380 |
+
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH
|
1381 |
+
+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww
|
1382 |
+
xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV
|
1383 |
+
4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA
|
1384 |
+
1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI
|
1385 |
+
rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E
|
1386 |
+
BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k
|
1387 |
+
b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC
|
1388 |
+
AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP
|
1389 |
+
OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
|
1390 |
+
RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc
|
1391 |
+
IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN
|
1392 |
+
+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==
|
1393 |
+
-----END CERTIFICATE-----
|
1394 |
+
|
1395 |
+
Network Solutions Certificate Authority
|
1396 |
+
=======================================
|
1397 |
+
-----BEGIN CERTIFICATE-----
|
1398 |
+
MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG
|
1399 |
+
EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr
|
1400 |
+
IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx
|
1401 |
+
MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
|
1402 |
+
MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
|
1403 |
+
CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx
|
1404 |
+
jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT
|
1405 |
+
aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT
|
1406 |
+
crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc
|
1407 |
+
/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB
|
1408 |
+
AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP
|
1409 |
+
BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv
|
1410 |
+
bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA
|
1411 |
+
A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q
|
1412 |
+
4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/
|
1413 |
+
GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
|
1414 |
+
wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD
|
1415 |
+
ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
|
1416 |
+
-----END CERTIFICATE-----
|
1417 |
+
|
1418 |
+
WellsSecure Public Root Certificate Authority
|
1419 |
+
=============================================
|
1420 |
+
-----BEGIN CERTIFICATE-----
|
1421 |
+
MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM
|
1422 |
+
F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw
|
1423 |
+
NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
|
1424 |
+
MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl
|
1425 |
+
bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD
|
1426 |
+
VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
|
1427 |
+
CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1
|
1428 |
+
iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13
|
1429 |
+
i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8
|
1430 |
+
bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB
|
1431 |
+
K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB
|
1432 |
+
AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu
|
1433 |
+
cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm
|
1434 |
+
lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB
|
1435 |
+
i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww
|
1436 |
+
GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg
|
1437 |
+
Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI
|
1438 |
+
K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0
|
1439 |
+
bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj
|
1440 |
+
qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es
|
1441 |
+
E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ
|
1442 |
+
tylv2G0xffX8oRAHh84vWdw+WNs=
|
1443 |
+
-----END CERTIFICATE-----
|
1444 |
+
|
1445 |
+
COMODO ECC Certification Authority
|
1446 |
+
==================================
|
1447 |
+
-----BEGIN CERTIFICATE-----
|
1448 |
+
MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC
|
1449 |
+
R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
|
1450 |
+
ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB
|
1451 |
+
dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix
|
1452 |
+
GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
|
1453 |
+
Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo
|
1454 |
+
b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X
|
1455 |
+
4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni
|
1456 |
+
wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E
|
1457 |
+
BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG
|
1458 |
+
FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA
|
1459 |
+
U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
|
1460 |
+
-----END CERTIFICATE-----
|
1461 |
+
|
1462 |
+
IGC/A
|
1463 |
+
=====
|
1464 |
+
-----BEGIN CERTIFICATE-----
|
1465 |
+
MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD
|
1466 |
+
VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE
|
1467 |
+
Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy
|
1468 |
+
MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI
|
1469 |
+
EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT
|
1470 |
+
STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB
|
1471 |
+
IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2
|
1472 |
+
TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW
|
1473 |
+
So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy
|
1474 |
+
HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd
|
1475 |
+
frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ
|
1476 |
+
tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB
|
1477 |
+
egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC
|
1478 |
+
iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK
|
1479 |
+
q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q
|
1480 |
+
MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg
|
1481 |
+
Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI
|
1482 |
+
lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF
|
1483 |
+
0mBWWg==
|
1484 |
+
-----END CERTIFICATE-----
|
1485 |
+
|
1486 |
+
Security Communication EV RootCA1
|
1487 |
+
=================================
|
1488 |
+
-----BEGIN CERTIFICATE-----
|
1489 |
+
MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
|
1490 |
+
U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh
|
1491 |
+
dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE
|
1492 |
+
BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl
|
1493 |
+
Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
|
1494 |
+
AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO
|
1495 |
+
/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX
|
1496 |
+
WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z
|
1497 |
+
ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4
|
1498 |
+
bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK
|
1499 |
+
9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
|
1500 |
+
SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm
|
1501 |
+
iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG
|
1502 |
+
Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW
|
1503 |
+
mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW
|
1504 |
+
T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490
|
1505 |
+
-----END CERTIFICATE-----
|
1506 |
+
|
1507 |
+
OISTE WISeKey Global Root GA CA
|
1508 |
+
===============================
|
1509 |
+
-----BEGIN CERTIFICATE-----
|
1510 |
+
MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE
|
1511 |
+
BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG
|
1512 |
+
A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH
|
1513 |
+
bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD
|
1514 |
+
VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw
|
1515 |
+
IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5
|
1516 |
+
IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9
|
1517 |
+
Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg
|
1518 |
+
Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD
|
1519 |
+
d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ
|
1520 |
+
/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R
|
1521 |
+
LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
|
1522 |
+
AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
|
1523 |
+
KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm
|
1524 |
+
MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4
|
1525 |
+
+vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
|
1526 |
+
hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY
|
1527 |
+
okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=
|
1528 |
+
-----END CERTIFICATE-----
|
1529 |
+
|
1530 |
+
Microsec e-Szigno Root CA
|
1531 |
+
=========================
|
1532 |
+
-----BEGIN CERTIFICATE-----
|
1533 |
+
MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE
|
1534 |
+
BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL
|
1535 |
+
EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0
|
1536 |
+
MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz
|
1537 |
+
dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT
|
1538 |
+
GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
|
1539 |
+
AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG
|
1540 |
+
d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N
|
1541 |
+
oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc
|
1542 |
+
QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ
|
1543 |
+
PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb
|
1544 |
+
MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG
|
1545 |
+
IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD
|
1546 |
+
VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3
|
1547 |
+
LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A
|
1548 |
+
dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn
|
1549 |
+
AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA
|
1550 |
+
4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg
|
1551 |
+
AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA
|
1552 |
+
egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6
|
1553 |
+
Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO
|
1554 |
+
PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv
|
1555 |
+
c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h
|
1556 |
+
cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw
|
1557 |
+
IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT
|
1558 |
+
WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV
|
1559 |
+
MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER
|
1560 |
+
MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp
|
1561 |
+
Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal
|
1562 |
+
HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT
|
1563 |
+
nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE
|
1564 |
+
aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a
|
1565 |
+
86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK
|
1566 |
+
yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB
|
1567 |
+
S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU=
|
1568 |
+
-----END CERTIFICATE-----
|
1569 |
+
|
1570 |
+
Certigna
|
1571 |
+
========
|
1572 |
+
-----BEGIN CERTIFICATE-----
|
1573 |
+
MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw
|
1574 |
+
EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3
|
1575 |
+
MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI
|
1576 |
+
Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q
|
1577 |
+
XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH
|
1578 |
+
GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p
|
1579 |
+
ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg
|
1580 |
+
DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf
|
1581 |
+
Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ
|
1582 |
+
tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ
|
1583 |
+
BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J
|
1584 |
+
SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA
|
1585 |
+
hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+
|
1586 |
+
ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu
|
1587 |
+
PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY
|
1588 |
+
1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
|
1589 |
+
WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
|
1590 |
+
-----END CERTIFICATE-----
|
1591 |
+
|
1592 |
+
TC TrustCenter Class 2 CA II
|
1593 |
+
============================
|
1594 |
+
-----BEGIN CERTIFICATE-----
|
1595 |
+
MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC
|
1596 |
+
REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy
|
1597 |
+
IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw
|
1598 |
+
MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1
|
1599 |
+
c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE
|
1600 |
+
AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
|
1601 |
+
AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw
|
1602 |
+
IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2
|
1603 |
+
xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ
|
1604 |
+
Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u
|
1605 |
+
SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB
|
1606 |
+
/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB
|
1607 |
+
7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90
|
1608 |
+
Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU
|
1609 |
+
cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i
|
1610 |
+
SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
|
1611 |
+
TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G
|
1612 |
+
dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ
|
1613 |
+
KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj
|
1614 |
+
TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP
|
1615 |
+
JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk
|
1616 |
+
vQ==
|
1617 |
+
-----END CERTIFICATE-----
|
1618 |
+
|
1619 |
+
TC TrustCenter Universal CA I
|
1620 |
+
=============================
|
1621 |
+
-----BEGIN CERTIFICATE-----
|
1622 |
+
MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC
|
1623 |
+
REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy
|
1624 |
+
IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN
|
1625 |
+
MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg
|
1626 |
+
VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw
|
1627 |
+
JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD
|
1628 |
+
ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC
|
1629 |
+
qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv
|
1630 |
+
xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw
|
1631 |
+
ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O
|
1632 |
+
gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j
|
1633 |
+
BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
|
1634 |
+
AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG
|
1635 |
+
1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy
|
1636 |
+
vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3
|
1637 |
+
ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT
|
1638 |
+
ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a
|
1639 |
+
7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY
|
1640 |
+
-----END CERTIFICATE-----
|
1641 |
+
|
1642 |
+
Deutsche Telekom Root CA 2
|
1643 |
+
==========================
|
1644 |
+
-----BEGIN CERTIFICATE-----
|
1645 |
+
MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT
|
1646 |
+
RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG
|
1647 |
+
A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5
|
1648 |
+
MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G
|
1649 |
+
A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS
|
1650 |
+
b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5
|
1651 |
+
bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI
|
1652 |
+
KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY
|
1653 |
+
AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK
|
1654 |
+
Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV
|
1655 |
+
jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV
|
1656 |
+
HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr
|
1657 |
+
E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy
|
1658 |
+
zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8
|
1659 |
+
rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G
|
1660 |
+
dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
|
1661 |
+
Cm26OWMohpLzGITY+9HPBVZkVw==
|
1662 |
+
-----END CERTIFICATE-----
|
1663 |
+
|
1664 |
+
ComSign Secured CA
|
1665 |
+
==================
|
1666 |
+
-----BEGIN CERTIFICATE-----
|
1667 |
+
MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE
|
1668 |
+
AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w
|
1669 |
+
NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD
|
1670 |
+
QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
|
1671 |
+
ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs
|
1672 |
+
49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH
|
1673 |
+
7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB
|
1674 |
+
kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1
|
1675 |
+
9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw
|
1676 |
+
AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t
|
1677 |
+
U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA
|
1678 |
+
j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC
|
1679 |
+
AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a
|
1680 |
+
BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp
|
1681 |
+
FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP
|
1682 |
+
51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz
|
1683 |
+
OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw==
|
1684 |
+
-----END CERTIFICATE-----
|
1685 |
+
|
1686 |
+
Cybertrust Global Root
|
1687 |
+
======================
|
1688 |
+
-----BEGIN CERTIFICATE-----
|
1689 |
+
MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li
|
1690 |
+
ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4
|
1691 |
+
MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD
|
1692 |
+
ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
|
1693 |
+
+Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW
|
1694 |
+
0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL
|
1695 |
+
AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin
|
1696 |
+
89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT
|
1697 |
+
8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP
|
1698 |
+
BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2
|
1699 |
+
MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G
|
1700 |
+
A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO
|
1701 |
+
lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi
|
1702 |
+
5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2
|
1703 |
+
hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T
|
1704 |
+
X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
|
1705 |
+
WL1WMRJOEcgh4LMRkWXbtKaIOM5V
|
1706 |
+
-----END CERTIFICATE-----
|
1707 |
+
|
1708 |
+
ePKI Root Certification Authority
|
1709 |
+
=================================
|
1710 |
+
-----BEGIN CERTIFICATE-----
|
1711 |
+
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
|
1737 |
+
-----END CERTIFICATE-----
|
1738 |
+
|
1739 |
+
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
|
1740 |
+
=============================================================================================================================
|
1741 |
+
-----BEGIN CERTIFICATE-----
|
1742 |
+
MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH
|
1743 |
+
DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q
|
1744 |
+
aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry
|
1745 |
+
b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV
|
1746 |
+
BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg
|
1747 |
+
S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4
|
1748 |
+
MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl
|
1749 |
+
IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF
|
1750 |
+
n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl
|
1751 |
+
IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft
|
1752 |
+
dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl
|
1753 |
+
cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B
|
1754 |
+
AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO
|
1755 |
+
Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1
|
1756 |
+
xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR
|
1757 |
+
6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL
|
1758 |
+
hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd
|
1759 |
+
BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
|
1760 |
+
MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4
|
1761 |
+
N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT
|
1762 |
+
y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh
|
1763 |
+
LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M
|
1764 |
+
dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI=
|
1765 |
+
-----END CERTIFICATE-----
|
1766 |
+
|
1767 |
+
Buypass Class 2 CA 1
|
1768 |
+
====================
|
1769 |
+
-----BEGIN CERTIFICATE-----
|
1770 |
+
MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
|
1771 |
+
QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2
|
1772 |
+
MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
|
1773 |
+
c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI
|
1774 |
+
hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M
|
1775 |
+
cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83
|
1776 |
+
0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4
|
1777 |
+
0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R
|
1778 |
+
uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC
|
1779 |
+
MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P
|
1780 |
+
AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV
|
1781 |
+
1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt
|
1782 |
+
7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2
|
1783 |
+
fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w
|
1784 |
+
wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho
|
1785 |
+
-----END CERTIFICATE-----
|
1786 |
+
|
1787 |
+
Buypass Class 3 CA 1
|
1788 |
+
====================
|
1789 |
+
-----BEGIN CERTIFICATE-----
|
1790 |
+
MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
|
1791 |
+
QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1
|
1792 |
+
MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
|
1793 |
+
c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI
|
1794 |
+
hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx
|
1795 |
+
ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0
|
1796 |
+
n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia
|
1797 |
+
AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c
|
1798 |
+
1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC
|
1799 |
+
MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P
|
1800 |
+
AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7
|
1801 |
+
pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA
|
1802 |
+
EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5
|
1803 |
+
htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj
|
1804 |
+
el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915
|
1805 |
+
-----END CERTIFICATE-----
|
1806 |
+
|
1807 |
+
EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1
|
1808 |
+
==========================================================================
|
1809 |
+
-----BEGIN CERTIFICATE-----
|
1810 |
+
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
|
1837 |
+
-----END CERTIFICATE-----
|
1838 |
+
|
1839 |
+
certSIGN ROOT CA
|
1840 |
+
================
|
1841 |
+
-----BEGIN CERTIFICATE-----
|
1842 |
+
MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD
|
1843 |
+
VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa
|
1844 |
+
Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE
|
1845 |
+
CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I
|
1846 |
+
JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH
|
1847 |
+
rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2
|
1848 |
+
ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD
|
1849 |
+
0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943
|
1850 |
+
AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B
|
1851 |
+
Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB
|
1852 |
+
AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8
|
1853 |
+
SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0
|
1854 |
+
x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt
|
1855 |
+
vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz
|
1856 |
+
TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD
|
1857 |
+
-----END CERTIFICATE-----
|
1858 |
+
|
1859 |
+
CNNIC ROOT
|
1860 |
+
==========
|
1861 |
+
-----BEGIN CERTIFICATE-----
|
1862 |
+
MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE
|
1863 |
+
ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw
|
1864 |
+
OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw
|
1865 |
+
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD
|
1866 |
+
o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz
|
1867 |
+
VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT
|
1868 |
+
VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or
|
1869 |
+
czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK
|
1870 |
+
y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC
|
1871 |
+
wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S
|
1872 |
+
lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5
|
1873 |
+
Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM
|
1874 |
+
O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8
|
1875 |
+
BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2
|
1876 |
+
G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m
|
1877 |
+
mxE=
|
1878 |
+
-----END CERTIFICATE-----
|
1879 |
+
|
1880 |
+
ApplicationCA - Japanese Government
|
1881 |
+
===================================
|
1882 |
+
-----BEGIN CERTIFICATE-----
|
1883 |
+
MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT
|
1884 |
+
SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw
|
1885 |
+
MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl
|
1886 |
+
cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
|
1887 |
+
CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4
|
1888 |
+
fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN
|
1889 |
+
wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE
|
1890 |
+
jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu
|
1891 |
+
nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU
|
1892 |
+
WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV
|
1893 |
+
BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD
|
1894 |
+
vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs
|
1895 |
+
o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g
|
1896 |
+
/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD
|
1897 |
+
io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW
|
1898 |
+
dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL
|
1899 |
+
rosot4LKGAfmt1t06SAZf7IbiVQ=
|
1900 |
+
-----END CERTIFICATE-----
|
1901 |
+
|
1902 |
+
GeoTrust Primary Certification Authority - G3
|
1903 |
+
=============================================
|
1904 |
+
-----BEGIN CERTIFICATE-----
|
1905 |
+
MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE
|
1906 |
+
BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0
|
1907 |
+
IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy
|
1908 |
+
eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz
|
1909 |
+
NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo
|
1910 |
+
YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT
|
1911 |
+
LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI
|
1912 |
+
hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j
|
1913 |
+
K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE
|
1914 |
+
c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C
|
1915 |
+
IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu
|
1916 |
+
dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC
|
1917 |
+
MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr
|
1918 |
+
2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9
|
1919 |
+
cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE
|
1920 |
+
Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
|
1921 |
+
AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s
|
1922 |
+
t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt
|
1923 |
+
-----END CERTIFICATE-----
|
1924 |
+
|
1925 |
+
thawte Primary Root CA - G2
|
1926 |
+
===========================
|
1927 |
+
-----BEGIN CERTIFICATE-----
|
1928 |
+
MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC
|
1929 |
+
VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu
|
1930 |
+
IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg
|
1931 |
+
Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV
|
1932 |
+
MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG
|
1933 |
+
b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt
|
1934 |
+
IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS
|
1935 |
+
LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5
|
1936 |
+
8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU
|
1937 |
+
mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN
|
1938 |
+
G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K
|
1939 |
+
rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
|
1940 |
+
-----END CERTIFICATE-----
|
1941 |
+
|
1942 |
+
thawte Primary Root CA - G3
|
1943 |
+
===========================
|
1944 |
+
-----BEGIN CERTIFICATE-----
|
1945 |
+
MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE
|
1946 |
+
BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
|
1947 |
+
aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
|
1948 |
+
cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w
|
1949 |
+
ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
|
1950 |
+
d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD
|
1951 |
+
VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG
|
1952 |
+
A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
|
1953 |
+
MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At
|
1954 |
+
P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC
|
1955 |
+
+BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY
|
1956 |
+
7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW
|
1957 |
+
vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E
|
1958 |
+
BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ
|
1959 |
+
KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK
|
1960 |
+
A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
|
1961 |
+
t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC
|
1962 |
+
8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm
|
1963 |
+
er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A=
|
1964 |
+
-----END CERTIFICATE-----
|
1965 |
+
|
1966 |
+
GeoTrust Primary Certification Authority - G2
|
1967 |
+
=============================================
|
1968 |
+
-----BEGIN CERTIFICATE-----
|
1969 |
+
MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC
|
1970 |
+
VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu
|
1971 |
+
Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD
|
1972 |
+
ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1
|
1973 |
+
OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
|
1974 |
+
MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl
|
1975 |
+
b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG
|
1976 |
+
BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc
|
1977 |
+
KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD
|
1978 |
+
VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+
|
1979 |
+
EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m
|
1980 |
+
ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2
|
1981 |
+
npaqBA+K
|
1982 |
+
-----END CERTIFICATE-----
|
1983 |
+
|
1984 |
+
VeriSign Universal Root Certification Authority
|
1985 |
+
===============================================
|
1986 |
+
-----BEGIN CERTIFICATE-----
|
1987 |
+
MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE
|
1988 |
+
BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
|
1989 |
+
ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
|
1990 |
+
IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u
|
1991 |
+
IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV
|
1992 |
+
UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
|
1993 |
+
cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
|
1994 |
+
IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0
|
1995 |
+
aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj
|
1996 |
+
1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP
|
1997 |
+
MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72
|
1998 |
+
9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I
|
1999 |
+
AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR
|
2000 |
+
tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G
|
2001 |
+
CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O
|
2002 |
+
a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
|
2003 |
+
DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3
|
2004 |
+
Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx
|
2005 |
+
Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx
|
2006 |
+
P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P
|
2007 |
+
wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4
|
2008 |
+
mJO37M2CYfE45k+XmCpajQ==
|
2009 |
+
-----END CERTIFICATE-----
|
2010 |
+
|
2011 |
+
VeriSign Class 3 Public Primary Certification Authority - G4
|
2012 |
+
============================================================
|
2013 |
+
-----BEGIN CERTIFICATE-----
|
2014 |
+
MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC
|
2015 |
+
VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3
|
2016 |
+
b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz
|
2017 |
+
ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj
|
2018 |
+
YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL
|
2019 |
+
MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU
|
2020 |
+
cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo
|
2021 |
+
b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5
|
2022 |
+
IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8
|
2023 |
+
Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz
|
2024 |
+
rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB
|
2025 |
+
/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw
|
2026 |
+
HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u
|
2027 |
+
Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD
|
2028 |
+
A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx
|
2029 |
+
AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
|
2030 |
+
-----END CERTIFICATE-----
|
2031 |
+
|
2032 |
+
NetLock Arany (Class Gold) Főtanúsítvány
|
2033 |
+
============================================
|
2034 |
+
-----BEGIN CERTIFICATE-----
|
2035 |
+
MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G
|
2036 |
+
A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610
|
2037 |
+
dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB
|
2038 |
+
cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx
|
2039 |
+
MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO
|
2040 |
+
ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv
|
2041 |
+
biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6
|
2042 |
+
c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu
|
2043 |
+
0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw
|
2044 |
+
/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk
|
2045 |
+
H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw
|
2046 |
+
fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1
|
2047 |
+
neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB
|
2048 |
+
BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW
|
2049 |
+
qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta
|
2050 |
+
YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
|
2051 |
+
bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna
|
2052 |
+
NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu
|
2053 |
+
dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
|
2054 |
+
-----END CERTIFICATE-----
|
2055 |
+
|
2056 |
+
Staat der Nederlanden Root CA - G2
|
2057 |
+
==================================
|
2058 |
+
-----BEGIN CERTIFICATE-----
|
2059 |
+
MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE
|
2060 |
+
CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
|
2061 |
+
Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC
|
2062 |
+
TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l
|
2063 |
+
ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ
|
2064 |
+
5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn
|
2065 |
+
vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj
|
2066 |
+
CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil
|
2067 |
+
e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR
|
2068 |
+
OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI
|
2069 |
+
CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65
|
2070 |
+
48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi
|
2071 |
+
trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737
|
2072 |
+
qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB
|
2073 |
+
AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC
|
2074 |
+
ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV
|
2075 |
+
HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA
|
2076 |
+
A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz
|
2077 |
+
+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj
|
2078 |
+
f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN
|
2079 |
+
kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk
|
2080 |
+
CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF
|
2081 |
+
URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb
|
2082 |
+
CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h
|
2083 |
+
oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV
|
2084 |
+
IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm
|
2085 |
+
66+KAQ==
|
2086 |
+
-----END CERTIFICATE-----
|
2087 |
+
|
2088 |
+
CA Disig
|
2089 |
+
========
|
2090 |
+
-----BEGIN CERTIFICATE-----
|
2091 |
+
MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK
|
2092 |
+
QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw
|
2093 |
+
MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz
|
2094 |
+
bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3
|
2095 |
+
DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm
|
2096 |
+
GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD
|
2097 |
+
Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo
|
2098 |
+
hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt
|
2099 |
+
ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w
|
2100 |
+
gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P
|
2101 |
+
AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz
|
2102 |
+
aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff
|
2103 |
+
ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa
|
2104 |
+
BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t
|
2105 |
+
WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3
|
2106 |
+
mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/
|
2107 |
+
CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K
|
2108 |
+
ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA
|
2109 |
+
4Z7CRneC9VkGjCFMhwnN5ag=
|
2110 |
+
-----END CERTIFICATE-----
|
2111 |
+
|
2112 |
+
Juur-SK
|
2113 |
+
=======
|
2114 |
+
-----BEGIN CERTIFICATE-----
|
2115 |
+
MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA
|
2116 |
+
c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw
|
2117 |
+
DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG
|
2118 |
+
SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy
|
2119 |
+
aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
|
2120 |
+
ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf
|
2121 |
+
TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC
|
2122 |
+
+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw
|
2123 |
+
UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa
|
2124 |
+
Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF
|
2125 |
+
MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD
|
2126 |
+
HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh
|
2127 |
+
AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA
|
2128 |
+
cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr
|
2129 |
+
AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw
|
2130 |
+
cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE
|
2131 |
+
FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G
|
2132 |
+
A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo
|
2133 |
+
ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL
|
2134 |
+
abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678
|
2135 |
+
IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh
|
2136 |
+
Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2
|
2137 |
+
yyqcjg==
|
2138 |
+
-----END CERTIFICATE-----
|
2139 |
+
|
2140 |
+
Hongkong Post Root CA 1
|
2141 |
+
=======================
|
2142 |
+
-----BEGIN CERTIFICATE-----
|
2143 |
+
MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT
|
2144 |
+
DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx
|
2145 |
+
NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n
|
2146 |
+
IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF
|
2147 |
+
AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1
|
2148 |
+
ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr
|
2149 |
+
auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh
|
2150 |
+
qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY
|
2151 |
+
V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV
|
2152 |
+
HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i
|
2153 |
+
h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio
|
2154 |
+
l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei
|
2155 |
+
IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps
|
2156 |
+
T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT
|
2157 |
+
c4afU9hDDl3WY4JxHYB0yvbiAmvZWg==
|
2158 |
+
-----END CERTIFICATE-----
|
2159 |
+
|
2160 |
+
SecureSign RootCA11
|
2161 |
+
===================
|
2162 |
+
-----BEGIN CERTIFICATE-----
|
2163 |
+
MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi
|
2164 |
+
SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS
|
2165 |
+
b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw
|
2166 |
+
KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1
|
2167 |
+
cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL
|
2168 |
+
TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO
|
2169 |
+
wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq
|
2170 |
+
g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP
|
2171 |
+
O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA
|
2172 |
+
bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX
|
2173 |
+
t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh
|
2174 |
+
OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r
|
2175 |
+
bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ
|
2176 |
+
Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01
|
2177 |
+
y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061
|
2178 |
+
lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=
|
2179 |
+
-----END CERTIFICATE-----
|
2180 |
+
|
2181 |
+
ACEDICOM Root
|
2182 |
+
=============
|
2183 |
+
-----BEGIN CERTIFICATE-----
|
2184 |
+
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
|
2210 |
+
-----END CERTIFICATE-----
|
2211 |
+
|
2212 |
+
Microsec e-Szigno Root CA 2009
|
2213 |
+
==============================
|
2214 |
+
-----BEGIN CERTIFICATE-----
|
2215 |
+
MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER
|
2216 |
+
MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv
|
2217 |
+
c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
|
2218 |
+
dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE
|
2219 |
+
BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt
|
2220 |
+
U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw
|
2221 |
+
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA
|
2222 |
+
fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG
|
2223 |
+
0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA
|
2224 |
+
pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm
|
2225 |
+
1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC
|
2226 |
+
AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf
|
2227 |
+
QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE
|
2228 |
+
FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o
|
2229 |
+
lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX
|
2230 |
+
I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
|
2231 |
+
tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02
|
2232 |
+
yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi
|
2233 |
+
LXpUq3DDfSJlgnCW
|
2234 |
+
-----END CERTIFICATE-----
|
2235 |
+
|
2236 |
+
GlobalSign Root CA - R3
|
2237 |
+
=======================
|
2238 |
+
-----BEGIN CERTIFICATE-----
|
2239 |
+
MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv
|
2240 |
+
YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
|
2241 |
+
bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
|
2242 |
+
aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
|
2243 |
+
bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt
|
2244 |
+
iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ
|
2245 |
+
0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3
|
2246 |
+
rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl
|
2247 |
+
OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2
|
2248 |
+
xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
|
2249 |
+
FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7
|
2250 |
+
lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8
|
2251 |
+
EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E
|
2252 |
+
bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18
|
2253 |
+
YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r
|
2254 |
+
kpeDMdmztcpHWD9f
|
2255 |
+
-----END CERTIFICATE-----
|
2256 |
+
|
2257 |
+
Autoridad de Certificacion Firmaprofesional CIF A62634068
|
2258 |
+
=========================================================
|
2259 |
+
-----BEGIN CERTIFICATE-----
|
2260 |
+
MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA
|
2261 |
+
BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
|
2262 |
+
MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw
|
2263 |
+
QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB
|
2264 |
+
NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD
|
2265 |
+
Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P
|
2266 |
+
B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY
|
2267 |
+
7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH
|
2268 |
+
ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI
|
2269 |
+
plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX
|
2270 |
+
MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX
|
2271 |
+
LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK
|
2272 |
+
bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU
|
2273 |
+
vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud
|
2274 |
+
EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH
|
2275 |
+
DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
|
2276 |
+
cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA
|
2277 |
+
bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx
|
2278 |
+
ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx
|
2279 |
+
51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk
|
2280 |
+
R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP
|
2281 |
+
T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f
|
2282 |
+
Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl
|
2283 |
+
osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR
|
2284 |
+
crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR
|
2285 |
+
saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD
|
2286 |
+
KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi
|
2287 |
+
6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
|
2288 |
+
-----END CERTIFICATE-----
|
2289 |
+
|
2290 |
+
Izenpe.com
|
2291 |
+
==========
|
2292 |
+
-----BEGIN CERTIFICATE-----
|
2293 |
+
MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG
|
2294 |
+
EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz
|
2295 |
+
MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu
|
2296 |
+
QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ
|
2297 |
+
03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK
|
2298 |
+
ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU
|
2299 |
+
+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC
|
2300 |
+
PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT
|
2301 |
+
OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK
|
2302 |
+
F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK
|
2303 |
+
0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+
|
2304 |
+
0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB
|
2305 |
+
leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID
|
2306 |
+
AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+
|
2307 |
+
SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG
|
2308 |
+
NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx
|
2309 |
+
MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
|
2310 |
+
BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l
|
2311 |
+
Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga
|
2312 |
+
kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q
|
2313 |
+
hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs
|
2314 |
+
g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5
|
2315 |
+
aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5
|
2316 |
+
nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC
|
2317 |
+
ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo
|
2318 |
+
Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z
|
2319 |
+
WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==
|
2320 |
+
-----END CERTIFICATE-----
|
2321 |
+
|
2322 |
+
Chambers of Commerce Root - 2008
|
2323 |
+
================================
|
2324 |
+
-----BEGIN CERTIFICATE-----
|
2325 |
+
MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD
|
2326 |
+
MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
|
2327 |
+
bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
|
2328 |
+
QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy
|
2329 |
+
Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl
|
2330 |
+
ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF
|
2331 |
+
EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl
|
2332 |
+
cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
|
2333 |
+
AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA
|
2334 |
+
XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj
|
2335 |
+
h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/
|
2336 |
+
ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk
|
2337 |
+
NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g
|
2338 |
+
D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331
|
2339 |
+
lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ
|
2340 |
+
0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
|
2341 |
+
ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2
|
2342 |
+
EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI
|
2343 |
+
G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ
|
2344 |
+
BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh
|
2345 |
+
bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh
|
2346 |
+
bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC
|
2347 |
+
CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH
|
2348 |
+
AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1
|
2349 |
+
wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH
|
2350 |
+
3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU
|
2351 |
+
RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6
|
2352 |
+
M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1
|
2353 |
+
YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF
|
2354 |
+
9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK
|
2355 |
+
zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG
|
2356 |
+
nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
|
2357 |
+
OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ
|
2358 |
+
-----END CERTIFICATE-----
|
2359 |
+
|
2360 |
+
Global Chambersign Root - 2008
|
2361 |
+
==============================
|
2362 |
+
-----BEGIN CERTIFICATE-----
|
2363 |
+
MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD
|
2364 |
+
MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
|
2365 |
+
bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
|
2366 |
+
QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx
|
2367 |
+
NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg
|
2368 |
+
Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ
|
2369 |
+
QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
|
2370 |
+
aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf
|
2371 |
+
VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf
|
2372 |
+
XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0
|
2373 |
+
ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB
|
2374 |
+
/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA
|
2375 |
+
TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M
|
2376 |
+
H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe
|
2377 |
+
Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF
|
2378 |
+
HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
|
2379 |
+
wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB
|
2380 |
+
AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT
|
2381 |
+
BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE
|
2382 |
+
BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm
|
2383 |
+
aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm
|
2384 |
+
aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp
|
2385 |
+
1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0
|
2386 |
+
dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG
|
2387 |
+
/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6
|
2388 |
+
ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s
|
2389 |
+
dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg
|
2390 |
+
9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH
|
2391 |
+
foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du
|
2392 |
+
qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr
|
2393 |
+
P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq
|
2394 |
+
c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
|
2395 |
+
09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
|
2396 |
+
-----END CERTIFICATE-----
|
2397 |
+
|
2398 |
+
Go Daddy Root Certificate Authority - G2
|
2399 |
+
========================================
|
2400 |
+
-----BEGIN CERTIFICATE-----
|
2401 |
+
MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
|
2402 |
+
B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu
|
2403 |
+
MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
|
2404 |
+
MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
|
2405 |
+
b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G
|
2406 |
+
A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
|
2407 |
+
hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq
|
2408 |
+
9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD
|
2409 |
+
+qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd
|
2410 |
+
fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl
|
2411 |
+
NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC
|
2412 |
+
MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9
|
2413 |
+
BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac
|
2414 |
+
vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r
|
2415 |
+
5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV
|
2416 |
+
N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
|
2417 |
+
LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1
|
2418 |
+
-----END CERTIFICATE-----
|
2419 |
+
|
2420 |
+
Starfield Root Certificate Authority - G2
|
2421 |
+
=========================================
|
2422 |
+
-----BEGIN CERTIFICATE-----
|
2423 |
+
MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
|
2424 |
+
B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
|
2425 |
+
b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
|
2426 |
+
eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw
|
2427 |
+
DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg
|
2428 |
+
VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB
|
2429 |
+
dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv
|
2430 |
+
W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs
|
2431 |
+
bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk
|
2432 |
+
N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf
|
2433 |
+
ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU
|
2434 |
+
JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
|
2435 |
+
AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol
|
2436 |
+
TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx
|
2437 |
+
4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw
|
2438 |
+
F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
|
2439 |
+
pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ
|
2440 |
+
c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
|
2441 |
+
-----END CERTIFICATE-----
|
2442 |
+
|
2443 |
+
Starfield Services Root Certificate Authority - G2
|
2444 |
+
==================================================
|
2445 |
+
-----BEGIN CERTIFICATE-----
|
2446 |
+
MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
|
2447 |
+
B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
|
2448 |
+
b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl
|
2449 |
+
IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV
|
2450 |
+
BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT
|
2451 |
+
dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg
|
2452 |
+
Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
|
2453 |
+
AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2
|
2454 |
+
h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa
|
2455 |
+
hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP
|
2456 |
+
LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB
|
2457 |
+
rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
|
2458 |
+
AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG
|
2459 |
+
SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP
|
2460 |
+
E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy
|
2461 |
+
xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
|
2462 |
+
iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza
|
2463 |
+
YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6
|
2464 |
+
-----END CERTIFICATE-----
|
2465 |
+
|
2466 |
+
AffirmTrust Commercial
|
2467 |
+
======================
|
2468 |
+
-----BEGIN CERTIFICATE-----
|
2469 |
+
MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS
|
2470 |
+
BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw
|
2471 |
+
MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
|
2472 |
+
bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF
|
2473 |
+
AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb
|
2474 |
+
DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV
|
2475 |
+
C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6
|
2476 |
+
BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww
|
2477 |
+
MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV
|
2478 |
+
HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
|
2479 |
+
AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG
|
2480 |
+
hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi
|
2481 |
+
qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv
|
2482 |
+
0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh
|
2483 |
+
sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
|
2484 |
+
-----END CERTIFICATE-----
|
2485 |
+
|
2486 |
+
AffirmTrust Networking
|
2487 |
+
======================
|
2488 |
+
-----BEGIN CERTIFICATE-----
|
2489 |
+
MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS
|
2490 |
+
BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw
|
2491 |
+
MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
|
2492 |
+
bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF
|
2493 |
+
AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE
|
2494 |
+
Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI
|
2495 |
+
dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24
|
2496 |
+
/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb
|
2497 |
+
h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV
|
2498 |
+
HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
|
2499 |
+
AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu
|
2500 |
+
UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6
|
2501 |
+
12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23
|
2502 |
+
WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9
|
2503 |
+
/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
|
2504 |
+
-----END CERTIFICATE-----
|
2505 |
+
|
2506 |
+
AffirmTrust Premium
|
2507 |
+
===================
|
2508 |
+
-----BEGIN CERTIFICATE-----
|
2509 |
+
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
|
2533 |
+
-----END CERTIFICATE-----
|
2534 |
+
|
2535 |
+
AffirmTrust Premium ECC
|
2536 |
+
=======================
|
2537 |
+
-----BEGIN CERTIFICATE-----
|
2538 |
+
MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV
|
2539 |
+
BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx
|
2540 |
+
MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U
|
2541 |
+
cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA
|
2542 |
+
IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ
|
2543 |
+
N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW
|
2544 |
+
BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK
|
2545 |
+
BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X
|
2546 |
+
57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM
|
2547 |
+
eQ==
|
2548 |
+
-----END CERTIFICATE-----
|
2549 |
+
|
2550 |
+
Certum Trusted Network CA
|
2551 |
+
=========================
|
2552 |
+
-----BEGIN CERTIFICATE-----
|
2553 |
+
MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK
|
2554 |
+
ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv
|
2555 |
+
biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy
|
2556 |
+
MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU
|
2557 |
+
ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
|
2558 |
+
MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
|
2559 |
+
AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC
|
2560 |
+
l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J
|
2561 |
+
J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4
|
2562 |
+
fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0
|
2563 |
+
cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB
|
2564 |
+
Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw
|
2565 |
+
DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj
|
2566 |
+
jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1
|
2567 |
+
mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj
|
2568 |
+
Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
|
2569 |
+
03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
|
2570 |
+
-----END CERTIFICATE-----
|
2571 |
+
|
2572 |
+
Certinomis - Autorité Racine
|
2573 |
+
=============================
|
2574 |
+
-----BEGIN CERTIFICATE-----
|
2575 |
+
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
|
2600 |
+
vgt2Fl43N+bYdJeimUV5
|
2601 |
+
-----END CERTIFICATE-----
|
2602 |
+
|
2603 |
+
Root CA Generalitat Valenciana
|
2604 |
+
==============================
|
2605 |
+
-----BEGIN CERTIFICATE-----
|
2606 |
+
MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE
|
2607 |
+
ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290
|
2608 |
+
IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3
|
2609 |
+
WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE
|
2610 |
+
CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G
|
2611 |
+
CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2
|
2612 |
+
F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B
|
2613 |
+
ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ
|
2614 |
+
D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte
|
2615 |
+
JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB
|
2616 |
+
AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n
|
2617 |
+
dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB
|
2618 |
+
ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl
|
2619 |
+
AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA
|
2620 |
+
YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy
|
2621 |
+
AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA
|
2622 |
+
aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt
|
2623 |
+
AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA
|
2624 |
+
YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu
|
2625 |
+
AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA
|
2626 |
+
OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0
|
2627 |
+
dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV
|
2628 |
+
BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G
|
2629 |
+
A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S
|
2630 |
+
b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh
|
2631 |
+
TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz
|
2632 |
+
Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63
|
2633 |
+
NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH
|
2634 |
+
iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt
|
2635 |
+
+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM=
|
2636 |
+
-----END CERTIFICATE-----
|
2637 |
+
|
2638 |
+
A-Trust-nQual-03
|
2639 |
+
================
|
2640 |
+
-----BEGIN CERTIFICATE-----
|
2641 |
+
MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE
|
2642 |
+
Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy
|
2643 |
+
a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R
|
2644 |
+
dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw
|
2645 |
+
RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0
|
2646 |
+
ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1
|
2647 |
+
c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA
|
2648 |
+
zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n
|
2649 |
+
yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE
|
2650 |
+
SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4
|
2651 |
+
iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V
|
2652 |
+
cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV
|
2653 |
+
eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40
|
2654 |
+
ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr
|
2655 |
+
sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd
|
2656 |
+
JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS
|
2657 |
+
mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6
|
2658 |
+
ahq97BvIxYSazQ==
|
2659 |
+
-----END CERTIFICATE-----
|
2660 |
+
|
2661 |
+
TWCA Root Certification Authority
|
2662 |
+
=================================
|
2663 |
+
-----BEGIN CERTIFICATE-----
|
2664 |
+
MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ
|
2665 |
+
VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh
|
2666 |
+
dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG
|
2667 |
+
EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB
|
2668 |
+
IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
|
2669 |
+
AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx
|
2670 |
+
QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC
|
2671 |
+
oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP
|
2672 |
+
4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r
|
2673 |
+
y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB
|
2674 |
+
BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG
|
2675 |
+
9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC
|
2676 |
+
mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW
|
2677 |
+
QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY
|
2678 |
+
T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny
|
2679 |
+
Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
|
2680 |
+
-----END CERTIFICATE-----
|
2681 |
+
|
2682 |
+
Security Communication RootCA2
|
2683 |
+
==============================
|
2684 |
+
-----BEGIN CERTIFICATE-----
|
2685 |
+
MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
|
2686 |
+
U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh
|
2687 |
+
dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC
|
2688 |
+
SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy
|
2689 |
+
aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
|
2690 |
+
ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++
|
2691 |
+
+T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R
|
2692 |
+
3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV
|
2693 |
+
spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K
|
2694 |
+
EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8
|
2695 |
+
QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB
|
2696 |
+
CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj
|
2697 |
+
u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk
|
2698 |
+
3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q
|
2699 |
+
tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29
|
2700 |
+
mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
|
2701 |
+
-----END CERTIFICATE-----
|
2702 |
+
|
2703 |
+
EC-ACC
|
2704 |
+
======
|
2705 |
+
-----BEGIN CERTIFICATE-----
|
2706 |
+
MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE
|
2707 |
+
BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w
|
2708 |
+
ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD
|
2709 |
+
VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE
|
2710 |
+
CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT
|
2711 |
+
BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7
|
2712 |
+
MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt
|
2713 |
+
SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl
|
2714 |
+
Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh
|
2715 |
+
cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND
|
2716 |
+
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK
|
2717 |
+
w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT
|
2718 |
+
ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4
|
2719 |
+
HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a
|
2720 |
+
E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw
|
2721 |
+
0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E
|
2722 |
+
BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD
|
2723 |
+
VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0
|
2724 |
+
Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l
|
2725 |
+
dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ
|
2726 |
+
lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa
|
2727 |
+
Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe
|
2728 |
+
l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2
|
2729 |
+
E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D
|
2730 |
+
5EI=
|
2731 |
+
-----END CERTIFICATE-----
|
2732 |
+
|
2733 |
+
Hellenic Academic and Research Institutions RootCA 2011
|
2734 |
+
=======================================================
|
2735 |
+
-----BEGIN CERTIFICATE-----
|
2736 |
+
MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT
|
2737 |
+
O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y
|
2738 |
+
aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
|
2739 |
+
IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT
|
2740 |
+
AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
|
2741 |
+
IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo
|
2742 |
+
IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
|
2743 |
+
AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI
|
2744 |
+
1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa
|
2745 |
+
71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u
|
2746 |
+
8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH
|
2747 |
+
3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/
|
2748 |
+
MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8
|
2749 |
+
MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu
|
2750 |
+
b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt
|
2751 |
+
XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8
|
2752 |
+
TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD
|
2753 |
+
/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N
|
2754 |
+
7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4
|
2755 |
+
-----END CERTIFICATE-----
|
2756 |
+
|
2757 |
+
Actalis Authentication Root CA
|
2758 |
+
==============================
|
2759 |
+
-----BEGIN CERTIFICATE-----
|
2760 |
+
MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM
|
2761 |
+
BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE
|
2762 |
+
AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky
|
2763 |
+
MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz
|
2764 |
+
IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
|
2765 |
+
IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ
|
2766 |
+
wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa
|
2767 |
+
by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6
|
2768 |
+
zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f
|
2769 |
+
YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2
|
2770 |
+
oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l
|
2771 |
+
EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7
|
2772 |
+
hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8
|
2773 |
+
EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5
|
2774 |
+
jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY
|
2775 |
+
iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
|
2776 |
+
ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI
|
2777 |
+
WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0
|
2778 |
+
JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx
|
2779 |
+
K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+
|
2780 |
+
Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC
|
2781 |
+
4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo
|
2782 |
+
2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz
|
2783 |
+
lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem
|
2784 |
+
OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9
|
2785 |
+
vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
|
2786 |
+
-----END CERTIFICATE-----
|
2787 |
+
|
2788 |
+
Trustis FPS Root CA
|
2789 |
+
===================
|
2790 |
+
-----BEGIN CERTIFICATE-----
|
2791 |
+
MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG
|
2792 |
+
EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290
|
2793 |
+
IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV
|
2794 |
+
BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ
|
2795 |
+
KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ
|
2796 |
+
RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk
|
2797 |
+
H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa
|
2798 |
+
cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt
|
2799 |
+
o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA
|
2800 |
+
AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd
|
2801 |
+
BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c
|
2802 |
+
GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC
|
2803 |
+
yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P
|
2804 |
+
8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV
|
2805 |
+
l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl
|
2806 |
+
iB6XzCGcKQENZetX2fNXlrtIzYE=
|
2807 |
+
-----END CERTIFICATE-----
|
2808 |
+
|
2809 |
+
StartCom Certification Authority
|
2810 |
+
================================
|
2811 |
+
-----BEGIN CERTIFICATE-----
|
2812 |
+
MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
|
2813 |
+
U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
|
2814 |
+
ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
|
2815 |
+
NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
|
2816 |
+
LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
|
2817 |
+
U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
|
2818 |
+
ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
|
2819 |
+
o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
|
2820 |
+
Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
|
2821 |
+
eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
|
2822 |
+
2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
|
2823 |
+
6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
|
2824 |
+
osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
|
2825 |
+
untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
|
2826 |
+
UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
|
2827 |
+
37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
|
2828 |
+
VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ
|
2829 |
+
Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0
|
2830 |
+
dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu
|
2831 |
+
c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv
|
2832 |
+
bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0
|
2833 |
+
aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0
|
2834 |
+
aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t
|
2835 |
+
L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG
|
2836 |
+
cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5
|
2837 |
+
fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm
|
2838 |
+
N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN
|
2839 |
+
Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T
|
2840 |
+
tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX
|
2841 |
+
e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA
|
2842 |
+
2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs
|
2843 |
+
HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE
|
2844 |
+
JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib
|
2845 |
+
D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8=
|
2846 |
+
-----END CERTIFICATE-----
|
2847 |
+
|
2848 |
+
StartCom Certification Authority G2
|
2849 |
+
===================================
|
2850 |
+
-----BEGIN CERTIFICATE-----
|
2851 |
+
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
|
2875 |
+
obp573PYtlNXLfbQ4ddI
|
2876 |
+
-----END CERTIFICATE-----
|
2877 |
+
|
2878 |
+
Buypass Class 2 Root CA
|
2879 |
+
=======================
|
2880 |
+
-----BEGIN CERTIFICATE-----
|
2881 |
+
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
|
2905 |
+
rJgWVqA=
|
2906 |
+
-----END CERTIFICATE-----
|
2907 |
+
|
2908 |
+
Buypass Class 3 Root CA
|
2909 |
+
=======================
|
2910 |
+
-----BEGIN CERTIFICATE-----
|
2911 |
+
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
|
2935 |
+
Cp/HuZc=
|
2936 |
+
-----END CERTIFICATE-----
|
2937 |
+
|
2938 |
+
T-TeleSec GlobalRoot Class 3
|
2939 |
+
============================
|
2940 |
+
-----BEGIN CERTIFICATE-----
|
2941 |
+
MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
|
2942 |
+
IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
|
2943 |
+
cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx
|
2944 |
+
MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
|
2945 |
+
dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
|
2946 |
+
ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3
|
2947 |
+
DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK
|
2948 |
+
9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU
|
2949 |
+
NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF
|
2950 |
+
iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W
|
2951 |
+
0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA
|
2952 |
+
MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr
|
2953 |
+
AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb
|
2954 |
+
fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT
|
2955 |
+
ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h
|
2956 |
+
P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
|
2957 |
+
e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw==
|
2958 |
+
-----END CERTIFICATE-----
|
2959 |
+
|
2960 |
+
EE Certification Centre Root CA
|
2961 |
+
===============================
|
2962 |
+
-----BEGIN CERTIFICATE-----
|
2963 |
+
MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
|
2964 |
+
EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy
|
2965 |
+
dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw
|
2966 |
+
MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB
|
2967 |
+
UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy
|
2968 |
+
ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB
|
2969 |
+
DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM
|
2970 |
+
TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2
|
2971 |
+
rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw
|
2972 |
+
93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN
|
2973 |
+
P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T
|
2974 |
+
AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ
|
2975 |
+
MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF
|
2976 |
+
BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj
|
2977 |
+
xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM
|
2978 |
+
lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u
|
2979 |
+
uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU
|
2980 |
+
3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM
|
2981 |
+
dcGWxZ0=
|
2982 |
+
-----END CERTIFICATE-----
|
2983 |
+
|
2984 |
+
TURKTRUST Certificate Services Provider Root 2007
|
2985 |
+
=================================================
|
2986 |
+
-----BEGIN CERTIFICATE-----
|
2987 |
+
MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF
|
2988 |
+
bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP
|
2989 |
+
MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
|
2990 |
+
QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X
|
2991 |
+
DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl
|
2992 |
+
a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN
|
2993 |
+
BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp
|
2994 |
+
bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw
|
2995 |
+
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N
|
2996 |
+
YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv
|
2997 |
+
KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya
|
2998 |
+
KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT
|
2999 |
+
rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC
|
3000 |
+
AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP
|
3001 |
+
BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s
|
3002 |
+
Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I
|
3003 |
+
aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO
|
3004 |
+
Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb
|
3005 |
+
BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK
|
3006 |
+
poRq0Tl9
|
3007 |
+
-----END CERTIFICATE-----
|
3008 |
+
|
3009 |
+
D-TRUST Root Class 3 CA 2 2009
|
3010 |
+
==============================
|
3011 |
+
-----BEGIN CERTIFICATE-----
|
3012 |
+
MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK
|
3013 |
+
DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe
|
3014 |
+
Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE
|
3015 |
+
LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw
|
3016 |
+
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD
|
3017 |
+
ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA
|
3018 |
+
BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv
|
3019 |
+
KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z
|
3020 |
+
p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC
|
3021 |
+
AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ
|
3022 |
+
4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y
|
3023 |
+
eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw
|
3024 |
+
MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G
|
3025 |
+
PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw
|
3026 |
+
OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm
|
3027 |
+
2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0
|
3028 |
+
o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV
|
3029 |
+
dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph
|
3030 |
+
X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I=
|
3031 |
+
-----END CERTIFICATE-----
|
3032 |
+
|
3033 |
+
D-TRUST Root Class 3 CA 2 EV 2009
|
3034 |
+
=================================
|
3035 |
+
-----BEGIN CERTIFICATE-----
|
3036 |
+
MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
|
3037 |
+
DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
|
3038 |
+
OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
|
3039 |
+
DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
|
3040 |
+
OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS
|
3041 |
+
egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh
|
3042 |
+
zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T
|
3043 |
+
7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60
|
3044 |
+
sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35
|
3045 |
+
11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv
|
3046 |
+
cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v
|
3047 |
+
ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El
|
3048 |
+
MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp
|
3049 |
+
b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh
|
3050 |
+
c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+
|
3051 |
+
PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05
|
3052 |
+
nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX
|
3053 |
+
ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA
|
3054 |
+
NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv
|
3055 |
+
w9y4AyHqnxbxLFS1
|
3056 |
+
-----END CERTIFICATE-----
|
3057 |
+
|
3058 |
+
PSCProcert
|
3059 |
+
==========
|
3060 |
+
-----BEGIN CERTIFICATE-----
|
3061 |
+
MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1dG9yaWRhZCBk
|
3062 |
+
ZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9sYW5vMQswCQYDVQQGEwJWRTEQ
|
3063 |
+
MA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlzdHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lz
|
3064 |
+
dGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBl
|
3065 |
+
cmludGVuZGVuY2lhIGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUw
|
3066 |
+
IwYJKoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEwMFoXDTIw
|
3067 |
+
MTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHByb2NlcnQubmV0LnZlMQ8w
|
3068 |
+
DQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGExKjAoBgNVBAsTIVByb3ZlZWRvciBkZSBD
|
3069 |
+
ZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZp
|
3070 |
+
Y2FjaW9uIEVsZWN0cm9uaWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIw
|
3071 |
+
DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo97BVC
|
3072 |
+
wfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74BCXfgI8Qhd19L3uA
|
3073 |
+
3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38GieU89RLAu9MLmV+QfI4tL3czkkoh
|
3074 |
+
RqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmO
|
3075 |
+
EO8GqQKJ/+MMbpfg353bIdD0PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG2
|
3076 |
+
0qCZyFSTXai20b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH
|
3077 |
+
0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/6mnbVSKVUyqU
|
3078 |
+
td+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1mv6JpIzi4mWCZDlZTOpx+FIyw
|
3079 |
+
Bm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvp
|
3080 |
+
r2uKGcfLFFb14dq12fy/czja+eevbqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/
|
3081 |
+
AgEBMDcGA1UdEgQwMC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAz
|
3082 |
+
Ni0wMB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFDgBStuyId
|
3083 |
+
xuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0b3JpZGFkIGRlIENlcnRp
|
3084 |
+
ZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xhbm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQH
|
3085 |
+
EwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5h
|
3086 |
+
Y2lvbmFsIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5k
|
3087 |
+
ZW5jaWEgZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkqhkiG
|
3088 |
+
9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQDAgEGME0GA1UdEQRG
|
3089 |
+
MESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0wMDAwMDKgGwYFYIZeAgKgEgwQUklG
|
3090 |
+
LUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEagRKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52
|
3091 |
+
ZS9sY3IvQ0VSVElGSUNBRE8tUkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNy
|
3092 |
+
YWl6LnN1c2NlcnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v
|
3093 |
+
Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsGAQUFBwIBFh5o
|
3094 |
+
dHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcNAQELBQADggIBACtZ6yKZu4Sq
|
3095 |
+
T96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmN
|
3096 |
+
g7+mvTV+LFwxNG9s2/NkAZiqlCxB3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4q
|
3097 |
+
uxtxj7mkoP3YldmvWb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1
|
3098 |
+
n8GhHVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHmpHmJWhSn
|
3099 |
+
FFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXzsOfIt+FTvZLm8wyWuevo
|
3100 |
+
5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bEqCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq
|
3101 |
+
3TNWOByyrYDT13K9mmyZY+gAu0F2BbdbmRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5
|
3102 |
+
poLWccret9W6aAjtmcz9opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3Y
|
3103 |
+
eMLEYC/HYvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km
|
3104 |
+
-----END CERTIFICATE-----
|
3105 |
+
|
3106 |
+
China Internet Network Information Center EV Certificates Root
|
3107 |
+
==============================================================
|
3108 |
+
-----BEGIN CERTIFICATE-----
|
3109 |
+
MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCQ04xMjAwBgNV
|
3110 |
+
BAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyMUcwRQYDVQQDDD5D
|
3111 |
+
aGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMg
|
3112 |
+
Um9vdDAeFw0xMDA4MzEwNzExMjVaFw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAG
|
3113 |
+
A1UECgwpQ2hpbmEgSW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMM
|
3114 |
+
PkNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRpZmljYXRl
|
3115 |
+
cyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z7r07eKpkQ0H1UN+U8i6y
|
3116 |
+
jUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA//DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV
|
3117 |
+
98YPjUesWgbdYavi7NifFy2cyjw1l1VxzUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2H
|
3118 |
+
klY0bBoQCxfVWhyXWIQ8hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23
|
3119 |
+
KzhmBsUs4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54ugQEC
|
3120 |
+
7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oYNJKiyoOCWTAPBgNV
|
3121 |
+
HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUfHJLOcfA22KlT5uqGDSSosqD
|
3122 |
+
glkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd5
|
3123 |
+
0XPFtQO3WKwMVC/GVhMPMdoG52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM
|
3124 |
+
7+czV0I664zBechNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws
|
3125 |
+
ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrIzo9uoV1/A3U0
|
3126 |
+
5K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATywy39FCqQmbkHzJ8=
|
3127 |
+
-----END CERTIFICATE-----
|
3128 |
+
|
3129 |
+
Swisscom Root CA 2
|
3130 |
+
==================
|
3131 |
+
-----BEGIN CERTIFICATE-----
|
3132 |
+
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
|
3158 |
+
5OfNeOI5wSsSnqaeG8XmDtkx2Q==
|
3159 |
+
-----END CERTIFICATE-----
|
3160 |
+
|
3161 |
+
Swisscom Root EV CA 2
|
3162 |
+
=====================
|
3163 |
+
-----BEGIN CERTIFICATE-----
|
3164 |
+
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
|
3190 |
+
l8PVP3wbI+2ksx0WckNLIOFZfsLorSa/ovc=
|
3191 |
+
-----END CERTIFICATE-----
|
3192 |
+
|
3193 |
+
CA Disig Root R1
|
3194 |
+
================
|
3195 |
+
-----BEGIN CERTIFICATE-----
|
3196 |
+
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
|
3220 |
+
a7+h89n07eLw4+1knj0vllJPgFOL
|
3221 |
+
-----END CERTIFICATE-----
|
3222 |
+
|
3223 |
+
CA Disig Root R2
|
3224 |
+
================
|
3225 |
+
-----BEGIN CERTIFICATE-----
|
3226 |
+
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
|
3250 |
+
7+ZtsH8tZ/3zbBt1RqPlShfppNcL
|
3251 |
+
-----END CERTIFICATE-----
|
3252 |
+
|
3253 |
+
ACCVRAIZ1
|
3254 |
+
=========
|
3255 |
+
-----BEGIN CERTIFICATE-----
|
3256 |
+
MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB
|
3257 |
+
SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1
|
3258 |
+
MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH
|
3259 |
+
UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
|
3260 |
+
DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM
|
3261 |
+
jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0
|
3262 |
+
RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD
|
3263 |
+
aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ
|
3264 |
+
0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG
|
3265 |
+
WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7
|
3266 |
+
8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR
|
3267 |
+
5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J
|
3268 |
+
9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK
|
3269 |
+
Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw
|
3270 |
+
Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu
|
3271 |
+
Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2
|
3272 |
+
VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM
|
3273 |
+
Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA
|
3274 |
+
QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh
|
3275 |
+
AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA
|
3276 |
+
YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj
|
3277 |
+
AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA
|
3278 |
+
IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk
|
3279 |
+
aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0
|
3280 |
+
dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2
|
3281 |
+
MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI
|
3282 |
+
hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E
|
3283 |
+
R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN
|
3284 |
+
YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49
|
3285 |
+
nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ
|
3286 |
+
TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3
|
3287 |
+
sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h
|
3288 |
+
I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg
|
3289 |
+
Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd
|
3290 |
+
3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p
|
3291 |
+
EfbRD0tVNEYqi4Y7
|
3292 |
+
-----END CERTIFICATE-----
|
3293 |
+
|
3294 |
+
TWCA Global Root CA
|
3295 |
+
===================
|
3296 |
+
-----BEGIN CERTIFICATE-----
|
3297 |
+
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
|
3321 |
+
-----END CERTIFICATE-----
|
3322 |
+
|
3323 |
+
TeliaSonera Root CA v1
|
3324 |
+
======================
|
3325 |
+
-----BEGIN CERTIFICATE-----
|
3326 |
+
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
|
3349 |
+
WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=
|
3350 |
+
-----END CERTIFICATE-----
|
3351 |
+
|
3352 |
+
E-Tugra Certification Authority
|
3353 |
+
===============================
|
3354 |
+
-----BEGIN CERTIFICATE-----
|
3355 |
+
MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w
|
3356 |
+
DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls
|
3357 |
+
ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN
|
3358 |
+
ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw
|
3359 |
+
NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx
|
3360 |
+
QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl
|
3361 |
+
cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD
|
3362 |
+
DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
|
3363 |
+
MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd
|
3364 |
+
hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K
|
3365 |
+
CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g
|
3366 |
+
ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ
|
3367 |
+
BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0
|
3368 |
+
E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz
|
3369 |
+
rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq
|
3370 |
+
jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn
|
3371 |
+
rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5
|
3372 |
+
dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB
|
3373 |
+
/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG
|
3374 |
+
MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK
|
3375 |
+
kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO
|
3376 |
+
XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807
|
3377 |
+
VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo
|
3378 |
+
a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc
|
3379 |
+
dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV
|
3380 |
+
KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT
|
3381 |
+
Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0
|
3382 |
+
8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G
|
3383 |
+
C7TbO6Orb1wdtn7os4I07QZcJA==
|
3384 |
+
-----END CERTIFICATE-----
|
3385 |
+
|
3386 |
+
T-TeleSec GlobalRoot Class 2
|
3387 |
+
============================
|
3388 |
+
-----BEGIN CERTIFICATE-----
|
3389 |
+
MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
|
3390 |
+
IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
|
3391 |
+
cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx
|
3392 |
+
MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
|
3393 |
+
dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
|
3394 |
+
ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3
|
3395 |
+
DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ
|
3396 |
+
SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F
|
3397 |
+
vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970
|
3398 |
+
2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV
|
3399 |
+
WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA
|
3400 |
+
MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy
|
3401 |
+
YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4
|
3402 |
+
r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf
|
3403 |
+
vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR
|
3404 |
+
3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN
|
3405 |
+
9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg==
|
3406 |
+
-----END CERTIFICATE-----
|
3407 |
+
|
3408 |
+
Atos TrustedRoot 2011
|
3409 |
+
=====================
|
3410 |
+
-----BEGIN CERTIFICATE-----
|
3411 |
+
MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU
|
3412 |
+
cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4
|
3413 |
+
MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG
|
3414 |
+
A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV
|
3415 |
+
hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr
|
3416 |
+
54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+
|
3417 |
+
DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320
|
3418 |
+
HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR
|
3419 |
+
z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R
|
3420 |
+
l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ
|
3421 |
+
bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB
|
3422 |
+
CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h
|
3423 |
+
k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh
|
3424 |
+
TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9
|
3425 |
+
61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G
|
3426 |
+
3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed
|
3427 |
+
-----END CERTIFICATE-----
|
3428 |
+
|
3429 |
+
QuoVadis Root CA 1 G3
|
3430 |
+
=====================
|
3431 |
+
-----BEGIN CERTIFICATE-----
|
3432 |
+
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
|
3456 |
+
hMJKzRwuJIczYOXD
|
3457 |
+
-----END CERTIFICATE-----
|
3458 |
+
|
3459 |
+
QuoVadis Root CA 2 G3
|
3460 |
+
=====================
|
3461 |
+
-----BEGIN CERTIFICATE-----
|
3462 |
+
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
|
3486 |
+
O3jtZsSOeWmD3n+M
|
3487 |
+
-----END CERTIFICATE-----
|
3488 |
+
|
3489 |
+
QuoVadis Root CA 3 G3
|
3490 |
+
=====================
|
3491 |
+
-----BEGIN CERTIFICATE-----
|
3492 |
+
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
|
3516 |
+
PpxxVJkES/1Y+Zj0
|
3517 |
+
-----END CERTIFICATE-----
|
3518 |
+
|
3519 |
+
DigiCert Assured ID Root G2
|
3520 |
+
===========================
|
3521 |
+
-----BEGIN CERTIFICATE-----
|
3522 |
+
MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG
|
3523 |
+
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
|
3524 |
+
IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw
|
3525 |
+
MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
|
3526 |
+
ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw
|
3527 |
+
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH
|
3528 |
+
35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq
|
3529 |
+
bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw
|
3530 |
+
VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP
|
3531 |
+
YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn
|
3532 |
+
lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO
|
3533 |
+
w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv
|
3534 |
+
0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz
|
3535 |
+
d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW
|
3536 |
+
hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M
|
3537 |
+
jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo
|
3538 |
+
IhNzbM8m9Yop5w==
|
3539 |
+
-----END CERTIFICATE-----
|
3540 |
+
|
3541 |
+
DigiCert Assured ID Root G3
|
3542 |
+
===========================
|
3543 |
+
-----BEGIN CERTIFICATE-----
|
3544 |
+
MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV
|
3545 |
+
UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD
|
3546 |
+
VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1
|
3547 |
+
MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
|
3548 |
+
d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ
|
3549 |
+
BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb
|
3550 |
+
RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs
|
3551 |
+
KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF
|
3552 |
+
UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy
|
3553 |
+
YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy
|
3554 |
+
1vUhZscv6pZjamVFkpUBtA==
|
3555 |
+
-----END CERTIFICATE-----
|
3556 |
+
|
3557 |
+
DigiCert Global Root G2
|
3558 |
+
=======================
|
3559 |
+
-----BEGIN CERTIFICATE-----
|
3560 |
+
MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG
|
3561 |
+
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
|
3562 |
+
HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx
|
3563 |
+
MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
|
3564 |
+
dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq
|
3565 |
+
hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ
|
3566 |
+
kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO
|
3567 |
+
3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV
|
3568 |
+
BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM
|
3569 |
+
UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB
|
3570 |
+
o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu
|
3571 |
+
5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr
|
3572 |
+
F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U
|
3573 |
+
WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH
|
3574 |
+
QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/
|
3575 |
+
iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl
|
3576 |
+
MrY=
|
3577 |
+
-----END CERTIFICATE-----
|
3578 |
+
|
3579 |
+
DigiCert Global Root G3
|
3580 |
+
=======================
|
3581 |
+
-----BEGIN CERTIFICATE-----
|
3582 |
+
MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV
|
3583 |
+
UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD
|
3584 |
+
VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw
|
3585 |
+
MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k
|
3586 |
+
aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C
|
3587 |
+
AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O
|
3588 |
+
YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP
|
3589 |
+
BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp
|
3590 |
+
Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y
|
3591 |
+
3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34
|
3592 |
+
VOKa5Vt8sycX
|
3593 |
+
-----END CERTIFICATE-----
|
3594 |
+
|
3595 |
+
DigiCert Trusted Root G4
|
3596 |
+
========================
|
3597 |
+
-----BEGIN CERTIFICATE-----
|
3598 |
+
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
|
3623 |
+
82Z+
|
3624 |
+
-----END CERTIFICATE-----
|
3625 |
+
|
3626 |
+
WoSign
|
3627 |
+
======
|
3628 |
+
-----BEGIN CERTIFICATE-----
|
3629 |
+
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
|
3654 |
+
-----END CERTIFICATE-----
|
3655 |
+
|
3656 |
+
WoSign China
|
3657 |
+
============
|
3658 |
+
-----BEGIN CERTIFICATE-----
|
3659 |
+
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
|
3683 |
+
kI26oQ==
|
3684 |
+
-----END CERTIFICATE-----
|
3685 |
+
|
3686 |
+
COMODO RSA Certification Authority
|
3687 |
+
==================================
|
3688 |
+
-----BEGIN CERTIFICATE-----
|
3689 |
+
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
|
3715 |
+
LaZRfyHBNVOFBkpdn627G190
|
3716 |
+
-----END CERTIFICATE-----
|
3717 |
+
|
3718 |
+
USERTrust RSA Certification Authority
|
3719 |
+
=====================================
|
3720 |
+
-----BEGIN CERTIFICATE-----
|
3721 |
+
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
|
3747 |
+
Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9
|
3748 |
+
-----END CERTIFICATE-----
|
3749 |
+
|
3750 |
+
USERTrust ECC Certification Authority
|
3751 |
+
=====================================
|
3752 |
+
-----BEGIN CERTIFICATE-----
|
3753 |
+
MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC
|
3754 |
+
VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
|
3755 |
+
aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv
|
3756 |
+
biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC
|
3757 |
+
VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
|
3758 |
+
aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv
|
3759 |
+
biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2
|
3760 |
+
0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez
|
3761 |
+
nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV
|
3762 |
+
HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB
|
3763 |
+
HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu
|
3764 |
+
9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=
|
3765 |
+
-----END CERTIFICATE-----
|
3766 |
+
|
3767 |
+
GlobalSign ECC Root CA - R4
|
3768 |
+
===========================
|
3769 |
+
-----BEGIN CERTIFICATE-----
|
3770 |
+
MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb
|
3771 |
+
R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
|
3772 |
+
EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb
|
3773 |
+
R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
|
3774 |
+
EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl
|
3775 |
+
OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P
|
3776 |
+
AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV
|
3777 |
+
MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF
|
3778 |
+
JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q=
|
3779 |
+
-----END CERTIFICATE-----
|
3780 |
+
|
3781 |
+
GlobalSign ECC Root CA - R5
|
3782 |
+
===========================
|
3783 |
+
-----BEGIN CERTIFICATE-----
|
3784 |
+
MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb
|
3785 |
+
R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
|
3786 |
+
EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb
|
3787 |
+
R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
|
3788 |
+
EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6
|
3789 |
+
SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS
|
3790 |
+
h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd
|
3791 |
+
BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx
|
3792 |
+
uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7
|
3793 |
+
yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3
|
3794 |
+
-----END CERTIFICATE-----
|
3795 |
+
|
3796 |
+
Staat der Nederlanden Root CA - G3
|
3797 |
+
==================================
|
3798 |
+
-----BEGIN CERTIFICATE-----
|
3799 |
+
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
|
3824 |
+
-----END CERTIFICATE-----
|
3825 |
+
|
3826 |
+
Staat der Nederlanden EV Root CA
|
3827 |
+
================================
|
3828 |
+
-----BEGIN CERTIFICATE-----
|
3829 |
+
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
|
3853 |
+
eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg==
|
3854 |
+
-----END CERTIFICATE-----
|
3855 |
+
|
3856 |
+
IdenTrust Commercial Root CA 1
|
3857 |
+
==============================
|
3858 |
+
-----BEGIN CERTIFICATE-----
|
3859 |
+
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
|
3883 |
+
cGzM7vRX+Bi6hG6H
|
3884 |
+
-----END CERTIFICATE-----
|
3885 |
+
|
3886 |
+
IdenTrust Public Sector Root CA 1
|
3887 |
+
=================================
|
3888 |
+
-----BEGIN CERTIFICATE-----
|
3889 |
+
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
|
3913 |
+
3Wl9af0AVqW3rLatt8o+Ae+c
|
3914 |
+
-----END CERTIFICATE-----
|
3915 |
+
|
3916 |
+
Entrust Root Certification Authority - G2
|
3917 |
+
=========================================
|
3918 |
+
-----BEGIN CERTIFICATE-----
|
3919 |
+
MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV
|
3920 |
+
BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy
|
3921 |
+
bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug
|
3922 |
+
b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw
|
3923 |
+
HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT
|
3924 |
+
DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx
|
3925 |
+
OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s
|
3926 |
+
eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi
|
3927 |
+
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP
|
3928 |
+
/vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz
|
3929 |
+
HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU
|
3930 |
+
s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y
|
3931 |
+
TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx
|
3932 |
+
AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6
|
3933 |
+
0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z
|
3934 |
+
iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ
|
3935 |
+
Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi
|
3936 |
+
nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+
|
3937 |
+
vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO
|
3938 |
+
e4pIb4tF9g==
|
3939 |
+
-----END CERTIFICATE-----
|
3940 |
+
|
3941 |
+
Entrust Root Certification Authority - EC1
|
3942 |
+
==========================================
|
3943 |
+
-----BEGIN CERTIFICATE-----
|
3944 |
+
MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx
|
3945 |
+
FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn
|
3946 |
+
YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl
|
3947 |
+
ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
|
3948 |
+
IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw
|
3949 |
+
FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs
|
3950 |
+
LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg
|
3951 |
+
dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt
|
3952 |
+
IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy
|
3953 |
+
AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef
|
3954 |
+
9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
|
3955 |
+
FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h
|
3956 |
+
vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8
|
3957 |
+
kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G
|
3958 |
+
-----END CERTIFICATE-----
|
3959 |
+
|
3960 |
+
CFCA EV ROOT
|
3961 |
+
============
|
3962 |
+
-----BEGIN CERTIFICATE-----
|
3963 |
+
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
|
3988 |
+
-----END CERTIFICATE-----
|
src/views/account-status-connected.php
ADDED
@@ -0,0 +1,87 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<div class="tiny-account-status" id="tiny-account-status" data-state="complete">
|
2 |
+
<div class="status <?php echo $status->ok ? ( $status->pending ? 'status-pending' : 'status-success' ) : 'status-failure'; ?>">
|
3 |
+
<p class="status"><?php
|
4 |
+
if ( $status->ok ) {
|
5 |
+
if ( isset( $status->message ) ) {
|
6 |
+
echo esc_html__( $status->message, 'tiny-compress-images' );
|
7 |
+
} else {
|
8 |
+
echo esc_html__( 'Your account is connected', 'tiny-compress-images' );
|
9 |
+
}
|
10 |
+
} else {
|
11 |
+
echo esc_html__( 'Connection unsuccessful', 'tiny-compress-images' );
|
12 |
+
}
|
13 |
+
?></p>
|
14 |
+
<p><?php
|
15 |
+
if ( $status->ok ) {
|
16 |
+
$compressions = self::get_compression_count();
|
17 |
+
/* It is not possible to check if a subscription is free or flexible. */
|
18 |
+
if ( Tiny_Config::MONTHLY_FREE_COMPRESSIONS == $compressions ) {
|
19 |
+
$link = '<a href="https://tinypng.com/developers" target="_blank">' . esc_html__( 'TinyPNG API account', 'tiny-compress-images' ) . '</a>';
|
20 |
+
printf( esc_html__(
|
21 |
+
'You have reached your limit of %s compressions this month.',
|
22 |
+
'tiny-compress-images'
|
23 |
+
), $compressions );
|
24 |
+
echo '<br>';
|
25 |
+
printf( esc_html__(
|
26 |
+
'If you need to compress more images you can change your %s.',
|
27 |
+
'tiny-compress-images'
|
28 |
+
), $link );
|
29 |
+
} else {
|
30 |
+
printf( esc_html__(
|
31 |
+
'You have made %s compressions this month.',
|
32 |
+
'tiny-compress-images'
|
33 |
+
), $compressions );
|
34 |
+
}
|
35 |
+
} else {
|
36 |
+
if ( isset( $status->message ) ) {
|
37 |
+
echo esc_html__( 'Error', 'tiny-compress-images' ) . ': ';
|
38 |
+
echo esc_html__( $status->message, 'tiny-compress-images' );
|
39 |
+
} else {
|
40 |
+
esc_html__(
|
41 |
+
'API status could not be checked, enable cURL for more information',
|
42 |
+
'tiny-compress-images'
|
43 |
+
);
|
44 |
+
}
|
45 |
+
}
|
46 |
+
?></p>
|
47 |
+
<p><?php
|
48 |
+
if ( defined( 'TINY_API_KEY' ) ) {
|
49 |
+
echo sprintf( esc_html__(
|
50 |
+
'The API key has been configured in %s',
|
51 |
+
'tiny-compress-images'
|
52 |
+
), 'wp-config.php' );
|
53 |
+
} else {
|
54 |
+
echo '<a href="#" onclick="jQuery(\'div.tiny-account-status div.update\').toggle(); jQuery(\'div.tiny-account-status div.status\').toggle(); return false">';
|
55 |
+
echo esc_html__( 'Change API key', 'tiny-compress-images' );
|
56 |
+
echo '</a>';
|
57 |
+
}
|
58 |
+
?></p>
|
59 |
+
</div>
|
60 |
+
|
61 |
+
<div class="update" style="display: none">
|
62 |
+
<h4><?php echo esc_html__( 'Change your API key', 'tiny-compress-images' ); ?></h4>
|
63 |
+
<p class="introduction"><?php
|
64 |
+
$link = sprintf( '<a href="https://tinypng.com/developers" target="_blank">%s</a>',
|
65 |
+
esc_html__( 'TinyPNG developer section', 'tiny-compress-images' )
|
66 |
+
);
|
67 |
+
printf( esc_html__(
|
68 |
+
'Enter your API key. If you have lost your key, go to the %s to retrieve it.',
|
69 |
+
'tiny-compress-images'
|
70 |
+
), $link );
|
71 |
+
?></p>
|
72 |
+
|
73 |
+
<input type="text" id="tinypng_api_key"
|
74 |
+
name="tinypng_api_key" size="35" spellcheck="false"
|
75 |
+
value="<?php echo esc_attr( $key ); ?>">
|
76 |
+
|
77 |
+
<button class="button button-primary" data-tiny-action="update-key"><?php
|
78 |
+
echo esc_html__( 'Save' );
|
79 |
+
?></button>
|
80 |
+
|
81 |
+
<p class="message"></p>
|
82 |
+
|
83 |
+
<p><a href="#" onclick="jQuery('div.tiny-account-status div.update').toggle(); jQuery('div.tiny-account-status div.status').toggle(); return false"><?php
|
84 |
+
echo esc_html__( 'Cancel' );
|
85 |
+
?></a></p>
|
86 |
+
</div>
|
87 |
+
</div>
|
src/views/account-status-create-advanced.php
ADDED
@@ -0,0 +1,57 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
$user = wp_get_current_user();
|
4 |
+
$name = trim( $user->user_firstname . ' ' . $user->user_lastname );
|
5 |
+
$email = trim( $user->user_email );
|
6 |
+
|
7 |
+
?><div class="tiny-account-status wide" id="tiny-account-status" data-state="missing">
|
8 |
+
<div class="create">
|
9 |
+
<h4><?php
|
10 |
+
echo esc_html_e( 'Register new account', 'tiny-compress-images' );
|
11 |
+
?></h4>
|
12 |
+
|
13 |
+
<p class="introduction" class="description"><?php
|
14 |
+
echo esc_html__(
|
15 |
+
'Provide your name and email address to start optimizing images.',
|
16 |
+
'tiny-compress-images'
|
17 |
+
);
|
18 |
+
?></p>
|
19 |
+
|
20 |
+
<input type="text" id="tinypng_api_key_name" name="tinypng_api_key_name"
|
21 |
+
placeholder="Your full name" value="<?php echo esc_attr( $name ); ?>">
|
22 |
+
|
23 |
+
<input type="text" id="tinypng_api_key_email" name="tinypng_api_key_email"
|
24 |
+
placeholder="Your email address" value="<?php echo esc_attr( $email ); ?>">
|
25 |
+
|
26 |
+
<p class="message"></p>
|
27 |
+
|
28 |
+
<button class="button button-primary" data-tiny-action="create-key">
|
29 |
+
<?php echo esc_html__( 'Register Account', 'tiny-compress-images' ) ?>
|
30 |
+
</button>
|
31 |
+
</div>
|
32 |
+
|
33 |
+
<div class="update">
|
34 |
+
<h4><?php
|
35 |
+
echo esc_html__( 'Already have an account?', 'tiny-compress-images' );
|
36 |
+
?></h4>
|
37 |
+
|
38 |
+
<p class="introduction"><?php
|
39 |
+
$link = sprintf( '<a href="https://tinypng.com/developers" target="_blank">%s</a>',
|
40 |
+
esc_html__( 'TinyPNG developer section', 'tiny-compress-images' )
|
41 |
+
);
|
42 |
+
printf( esc_html__(
|
43 |
+
'Enter your API key. Go to the %s to retrieve it.',
|
44 |
+
'tiny-compress-images'
|
45 |
+
), $link );
|
46 |
+
?></p>
|
47 |
+
|
48 |
+
<input type="text" id="<?php echo esc_attr( self::get_prefixed_name( 'api_key' ) ); ?>"
|
49 |
+
name="<?php echo esc_attr( self::get_prefixed_name( 'api_key' ) ); ?>">
|
50 |
+
|
51 |
+
<p class="message"></p>
|
52 |
+
|
53 |
+
<button class="button button-primary" data-tiny-action="update-key">
|
54 |
+
<?php echo esc_html__( 'Save' ); ?>
|
55 |
+
</button>
|
56 |
+
</div>
|
57 |
+
</div>
|
src/views/account-status-create-simple.php
ADDED
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<div class="tiny-account-status" id="tiny-account-status" data-state="missing">
|
2 |
+
<div class="update">
|
3 |
+
<h4><?php echo esc_html__( 'Configure your account', 'tiny-compress-images' ); ?></h4>
|
4 |
+
<p class="introduction"><?php
|
5 |
+
$link = sprintf( '<a href="https://tinypng.com/developers" target="_blank">%s</a>',
|
6 |
+
esc_html__( 'TinyPNG developer section', 'tiny-compress-images' )
|
7 |
+
);
|
8 |
+
|
9 |
+
echo esc_html__( 'Enter your API key.', 'tiny-compress-images' );
|
10 |
+
echo ' ';
|
11 |
+
|
12 |
+
printf( esc_html__(
|
13 |
+
'If you have lost your key, go to the %s to retrieve it.',
|
14 |
+
'tiny-compress-images'
|
15 |
+
), $link );
|
16 |
+
?></p>
|
17 |
+
|
18 |
+
<input type="text" id="tinypng_api_key"
|
19 |
+
name="tinypng_api_key" size="35" spellcheck="false"
|
20 |
+
value="<?php echo esc_attr( $key ); ?>">
|
21 |
+
|
22 |
+
<button class="button button-primary" data-tiny-action="update-key"><?php
|
23 |
+
echo esc_html__( 'Save', 'tiny-compress-images' );
|
24 |
+
?></button>
|
25 |
+
|
26 |
+
<p class="message"></p>
|
27 |
+
</div>
|
28 |
+
</div>
|
src/views/account-status-loading.php
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<div class="tiny-account-status" id="tiny-account-status" data-state="pending">
|
2 |
+
<div class="status status-loading">
|
3 |
+
<p class="status"><?php echo esc_html__(
|
4 |
+
'Retrieving account status',
|
5 |
+
'tiny-compress-images'
|
6 |
+
); ?></p>
|
7 |
+
</div>
|
8 |
+
</div>
|
src/views/account-status-update.php
ADDED
@@ -0,0 +1,32 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<div class="tiny-account-status" id="tiny-account-status" data-state="missing">
|
2 |
+
<div class="update">
|
3 |
+
<h4><?php echo esc_html__( 'Change your API key', 'tiny-compress-images' ); ?></h4>
|
4 |
+
<p class="introduction"><?php
|
5 |
+
$link = sprintf( '<a href="https://tinypng.com/developers" target="_blank">%s</a>',
|
6 |
+
esc_html__( 'TinyPNG developer section', 'tiny-compress-images' )
|
7 |
+
);
|
8 |
+
|
9 |
+
echo esc_html__( 'Enter your API key.', 'tiny-compress-images' );
|
10 |
+
echo ' ';
|
11 |
+
|
12 |
+
printf( esc_html__(
|
13 |
+
'If you have lost your key, go to the %s to retrieve it.',
|
14 |
+
'tiny-compress-images'
|
15 |
+
), $link );
|
16 |
+
?></p>
|
17 |
+
|
18 |
+
<input type="text" id="tinypng_api_key"
|
19 |
+
name="tinypng_api_key" size="35" spellcheck="false"
|
20 |
+
value="<?php echo esc_attr( $key ); ?>">
|
21 |
+
|
22 |
+
<button class="button button-primary" data-tiny-action="update-key"><?php
|
23 |
+
echo esc_html__( 'Save', 'tiny-compress-images' );
|
24 |
+
?></button>
|
25 |
+
|
26 |
+
<p class="message"></p>
|
27 |
+
|
28 |
+
<p><a href="#" onclick="jQuery('div.tiny-account-status div.update').toggle(); jQuery('div.tiny-account-status div.status').toggle(); return false"><?php
|
29 |
+
echo esc_html__( 'Cancel', 'tiny-compress-images' );
|
30 |
+
?></a></p>
|
31 |
+
</div>
|
32 |
+
</div>
|
src/views/bulk-optimization-chart.php
ADDED
@@ -0,0 +1,53 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
$chart = array();
|
4 |
+
|
5 |
+
if ( 0 != $stats['unoptimized-library-size'] ) {
|
6 |
+
$chart['percentage'] = round( 100 - ( $stats['optimized-library-size'] / $stats['unoptimized-library-size'] * 100 ), 1 );
|
7 |
+
} else {
|
8 |
+
$chart['percentage'] = 0;
|
9 |
+
}
|
10 |
+
|
11 |
+
$chart['size'] = 180;
|
12 |
+
$chart['radius'] = $chart['size'] / 2 * 0.9;
|
13 |
+
$chart['main-radius'] = $chart['radius'] * 0.88;
|
14 |
+
$chart['center'] = $chart['size'] / 2;
|
15 |
+
$chart['stroke'] = $chart['radius'] / 2;
|
16 |
+
$chart['dash-stroke'] = $chart['radius'] / 4;
|
17 |
+
$chart['inner-radius'] = $chart['radius'] - $chart['stroke'] / 2;
|
18 |
+
$chart['circle-size'] = 2 * pi() * $chart['main-radius'];
|
19 |
+
$chart['dash-array-size'] = $chart['percentage'] / 100 * $chart['circle-size'];
|
20 |
+
|
21 |
+
?>
|
22 |
+
<style>
|
23 |
+
|
24 |
+
div.savings div.chart svg circle.main {
|
25 |
+
stroke-width: <?php echo $chart['dash-stroke'] ?>;
|
26 |
+
stroke-dasharray: <?php echo $chart['dash-array-size'] . ' ' . $chart['circle-size'] ?>;
|
27 |
+
}
|
28 |
+
|
29 |
+
div.tiny-bulk-optimization div.savings div.chart div.value {
|
30 |
+
min-width: <?php echo $chart['size'] ?>px;
|
31 |
+
}
|
32 |
+
|
33 |
+
@keyframes shwoosh {
|
34 |
+
from {
|
35 |
+
stroke-dasharray: <?php echo '0' . ' ' . $chart['circle-size'] ?>
|
36 |
+
}
|
37 |
+
to {
|
38 |
+
stroke-dasharray: <?php echo $chart['dash-array-size'] . ' ' . $chart['circle-size'] ?>
|
39 |
+
}
|
40 |
+
}
|
41 |
+
|
42 |
+
</style>
|
43 |
+
|
44 |
+
<div id="optimization-chart" class="chart" data-full-circle-size="<?php echo $chart['circle-size'] ?>" data-percentage-factor="<?php echo $chart['main-radius'] ?>" >
|
45 |
+
<svg width="<?php echo $chart['size'] ?>" height="<?php echo $chart['size'] ?>">
|
46 |
+
<circle class="main" transform="rotate(-90, <?php echo $chart['center'] ?>, <?php echo $chart['center'] ?>)" r="<?php echo $chart['main-radius'] ?>" cx="<?php echo $chart['center'] ?>" cy="<?php echo $chart['center'] ?>"/>
|
47 |
+
<circle class="inner" r="<?php echo $chart['inner-radius'] ?>" cx="<?php echo $chart['center'] ?>" cy="<?php echo $chart['center'] ?>" />
|
48 |
+
</svg>
|
49 |
+
<div class="value">
|
50 |
+
<div class="percentage" id="savings-percentage"><?php echo $chart['percentage'] ?>%</div>
|
51 |
+
<div class="label" ><?php echo esc_html__( 'savings', 'tiny-compress-images' ); ?></div>
|
52 |
+
</div>
|
53 |
+
</div>
|
src/views/bulk-optimization-form.php
ADDED
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<div id="bulk-optimization-actions" class="optimization-buttons">
|
2 |
+
<?php
|
3 |
+
if ( $auto_start_bulk ) {
|
4 |
+
$button_start_visibility = '';
|
5 |
+
$button_optimizing_visibility = ' visible';
|
6 |
+
} else {
|
7 |
+
$button_start_visibility = ' visible';
|
8 |
+
$button_optimizing_visibility = '';
|
9 |
+
}
|
10 |
+
submit_button( esc_attr__( 'Start Bulk Optimization', 'tiny-compress-images' ), 'button-primary button-hero' . $button_start_visibility, 'id-start', false );
|
11 |
+
submit_button( esc_attr__( 'Optimizing', 'tiny-compress-images' ) . '...', 'button-primary button-hero' . $button_optimizing_visibility, 'id-optimizing', false );
|
12 |
+
submit_button( esc_attr__( 'Cancel', 'tiny-compress-images' ), 'button-primary button-hero red', 'id-cancel', false );
|
13 |
+
submit_button( esc_attr__( 'Cancelling', 'tiny-compress-images' ) . '...', 'button-primary button-hero red', 'id-cancelling', false );
|
14 |
+
?>
|
15 |
+
<div id="optimization-spinner" class="spinner"></div>
|
16 |
+
</div>
|
src/views/bulk-optimization.php
ADDED
@@ -0,0 +1,218 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<style>
|
2 |
+
|
3 |
+
/* Admin color scheme colors */
|
4 |
+
|
5 |
+
div.tiny-bulk-optimization div.available div.tooltip span.dashicons {
|
6 |
+
color: <?php echo $admin_colors[3] ?>;
|
7 |
+
}
|
8 |
+
div.tiny-bulk-optimization div.savings div.chart div.value {
|
9 |
+
color: <?php echo $admin_colors[2] ?>;
|
10 |
+
}
|
11 |
+
div.tiny-bulk-optimization div.savings div.chart svg circle.main {
|
12 |
+
stroke: <?php echo $admin_colors[2] ?>;
|
13 |
+
}
|
14 |
+
div.tiny-bulk-optimization div.savings table td.emphasize {
|
15 |
+
color: <?php echo $admin_colors[2] ?>;
|
16 |
+
}
|
17 |
+
div.tiny-bulk-optimization div.dashboard div.optimize div.progressbar div.progress {
|
18 |
+
background-color: <?php echo $admin_colors[0] ?>;
|
19 |
+
background-image: linear-gradient(
|
20 |
+
-63deg,
|
21 |
+
<?php echo $admin_colors[0] ?> 0%,
|
22 |
+
<?php echo $admin_colors[0] ?> 25%,
|
23 |
+
<?php echo $admin_colors[1] ?> 25%,
|
24 |
+
<?php echo $admin_colors[1] ?> 50%,
|
25 |
+
<?php echo $admin_colors[0] ?> 50%,
|
26 |
+
<?php echo $admin_colors[0] ?> 75%,
|
27 |
+
<?php echo $admin_colors[1] ?> 75%,
|
28 |
+
<?php echo $admin_colors[1] ?> 100%
|
29 |
+
);
|
30 |
+
}
|
31 |
+
|
32 |
+
</style>
|
33 |
+
|
34 |
+
<div class="wrap tiny-bulk-optimization tiny-compress-images" id="tiny-bulk-optimization">
|
35 |
+
<div class="icon32" id="icon-upload"><br></div>
|
36 |
+
<h2><?php esc_html_e( 'Bulk Optimization', 'tiny-compress-images' ) ?></h2>
|
37 |
+
<div class="dashboard">
|
38 |
+
<div class="statistics">
|
39 |
+
<div class="available">
|
40 |
+
<div class="inner">
|
41 |
+
<h3><?php esc_html_e( 'Available Images', 'tiny-compress-images' ) ?></h3>
|
42 |
+
<p>
|
43 |
+
<?php
|
44 |
+
if ( 0 == $stats['optimized-image-sizes'] + $stats['available-unoptimised-sizes'] ) {
|
45 |
+
$percentage = 0;
|
46 |
+
} else {
|
47 |
+
$percentage_of_files = round( $stats['optimized-image-sizes'] / ( $stats['optimized-image-sizes'] + $stats['available-unoptimised-sizes'] ) * 100, 2 );
|
48 |
+
}
|
49 |
+
if ( 0 == $stats['uploaded-images'] + $stats['available-unoptimised-sizes'] ) {
|
50 |
+
esc_html_e( 'This page is designed to bulk optimize all your images. You don\'t seem to have uploaded any JPEG or PNG images yet.' );
|
51 |
+
} elseif ( 0 == sizeof( $active_tinify_sizes ) ) {
|
52 |
+
esc_html_e( 'Based on your current settings, nothing will be optimized. There are no active sizes selected for optimization.' );
|
53 |
+
} elseif ( 0 == $stats['available-unoptimised-sizes'] ) {
|
54 |
+
esc_html_e( 'Great! Your entire library is optimimized!' );
|
55 |
+
} elseif ( $stats['optimized-image-sizes'] > 0 ) {
|
56 |
+
( $percentage_of_files > 75 ) ? esc_html_e( 'You are doing great!', 'tiny-compress-images' ) : esc_html_e( 'You are doing good.', 'tiny-compress-images' );
|
57 |
+
echo ' ';
|
58 |
+
printf( esc_html__( '%d%% of your image library is optimized.', 'tiny-compress-images' ), $percentage_of_files );
|
59 |
+
echo ' ';
|
60 |
+
printf( esc_html__( 'Start the bulk optimization to optimize the remainder of your library.', 'tiny-compress-images' ) );
|
61 |
+
} else {
|
62 |
+
esc_html_e( 'Here you can start optimizing your entire library. Press the big button to start improving your website speed instantly!', 'tiny-compress-images' );
|
63 |
+
}
|
64 |
+
?>
|
65 |
+
</p>
|
66 |
+
<table class="totals">
|
67 |
+
<tr>
|
68 |
+
<td class="item">
|
69 |
+
<h3>
|
70 |
+
<?php echo wp_kses( __( 'Uploaded <br> images', 'tiny-compress-images' ), array( 'br' => array() ) ) ?>
|
71 |
+
</h3>
|
72 |
+
<span id="uploaded-images">
|
73 |
+
<?php echo $stats['uploaded-images']; ?>
|
74 |
+
</span>
|
75 |
+
</td>
|
76 |
+
<td class="item">
|
77 |
+
<h3>
|
78 |
+
<?php echo wp_kses( __( 'Uncompressed image sizes', 'tiny-compress-images' ), array( 'br' => array() ) ) ?>
|
79 |
+
</h3>
|
80 |
+
<span id="optimizable-image-sizes">
|
81 |
+
<?php echo $stats['available-unoptimised-sizes'] ?>
|
82 |
+
</span>
|
83 |
+
<div class="tooltip">
|
84 |
+
<span class="dashicons dashicons-info"></span>
|
85 |
+
<div class="tip">
|
86 |
+
<?php if ( $stats['uploaded-images'] > 0 && sizeof( $active_tinify_sizes ) > 0 && $stats['available-unoptimised-sizes'] > 0 ) { ?>
|
87 |
+
<p>
|
88 |
+
<?php
|
89 |
+
printf( esc_html__( 'With your current settings you can still optimize %d images sizes from your %d uploaded JPEG and PNG images.',
|
90 |
+
'tiny-compress-images'), $stats['available-unoptimised-sizes'], $stats['uploaded-images'] );
|
91 |
+
?>
|
92 |
+
</p>
|
93 |
+
<?php } ?>
|
94 |
+
<p>
|
95 |
+
<?php
|
96 |
+
if ( 0 == sizeof( $active_tinify_sizes ) ) {
|
97 |
+
esc_html_e( 'Based on your current settings, nothing will be optimized. There are no active sizes selected for optimization.', 'tiny-compress-images' );
|
98 |
+
} else {
|
99 |
+
esc_html_e( 'These sizes are currently activated for compression:', 'tiny-compress-images' );
|
100 |
+
echo '<ul>';
|
101 |
+
for ( $i = 0; $i < sizeof( $active_tinify_sizes ); ++$i ) {
|
102 |
+
$name = $active_tinify_sizes[ $i ];
|
103 |
+
if ( '0' == $name ) {
|
104 |
+
echo '<li>- ' . esc_html__( 'Original image', 'tiny-compress-images' ) . '</li>';
|
105 |
+
} else {
|
106 |
+
echo '<li>- ' . esc_html__( ucfirst( $name ) ) . '</li>';
|
107 |
+
}
|
108 |
+
}
|
109 |
+
echo '</ul>';
|
110 |
+
}
|
111 |
+
?>
|
112 |
+
</p>
|
113 |
+
</div>
|
114 |
+
</div>
|
115 |
+
</td>
|
116 |
+
<td class="item costs">
|
117 |
+
<h3>
|
118 |
+
<?php echo wp_kses( __( 'Estimated <br> cost', 'tiny-compress-images' ), array( 'br' => array() ) ) ?>
|
119 |
+
</h3>
|
120 |
+
<span id="estimated-cost">$ <?php echo number_format( $estimated_costs, 2 ) ?></span>
|
121 |
+
USD
|
122 |
+
</td>
|
123 |
+
</tr>
|
124 |
+
</table>
|
125 |
+
<div class="notes">
|
126 |
+
<h4><?php esc_html_e( 'Remember', 'tiny-compress-images' ) ?></h4>
|
127 |
+
<p>
|
128 |
+
<?php esc_html_e( 'For the plugin to do the work, you need to keep this page open. But no worries: when stopped, you can continue where you left off!', 'tiny-compress-images' ); ?>
|
129 |
+
</p>
|
130 |
+
</div>
|
131 |
+
</div>
|
132 |
+
</div>
|
133 |
+
<div class="savings">
|
134 |
+
<div class="inner">
|
135 |
+
<h3><?php esc_html_e( 'Total Savings', 'tiny-compress-images' ) ?></h3>
|
136 |
+
<p>
|
137 |
+
<?php esc_html_e( 'Statistics based on all available JPEG and PNG images in your media library.', 'tiny-compress-images' ); ?>
|
138 |
+
</p>
|
139 |
+
<?php
|
140 |
+
require_once dirname( __FILE__ ) . '/bulk-optimization-chart.php';
|
141 |
+
?>
|
142 |
+
<div class="legend">
|
143 |
+
<table>
|
144 |
+
<tr>
|
145 |
+
<td id="optimized-image-sizes" class="value emphasize">
|
146 |
+
<?php echo $stats['optimized-image-sizes']; ?>
|
147 |
+
</td>
|
148 |
+
<td class="description">
|
149 |
+
<?php echo _n( 'image size optimized', 'image sizes optimized', $stats['optimized-image-sizes'], 'tiny-compress-images' ) ?>
|
150 |
+
</td>
|
151 |
+
</tr>
|
152 |
+
<tr>
|
153 |
+
<td id="unoptimized-library-size" class="value" data-bytes="<?php echo $stats['unoptimized-library-size']; ?>" >
|
154 |
+
<?php echo ( $stats['unoptimized-library-size'] ? size_format( $stats['unoptimized-library-size'], 2 ) : '-'); ?>
|
155 |
+
</td>
|
156 |
+
<td class="description">
|
157 |
+
<?php esc_html_e( 'initial size', 'tiny-compress-images' ) ?>
|
158 |
+
</td>
|
159 |
+
</tr>
|
160 |
+
<tr>
|
161 |
+
<td id="optimized-library-size" class="value emphasize" data-bytes="<?php echo $stats['optimized-library-size'] ?>" class="green">
|
162 |
+
<?php echo ($stats['optimized-library-size'] ? size_format( $stats['optimized-library-size'], 2 ) : '-') ?>
|
163 |
+
</td>
|
164 |
+
<td class="description">
|
165 |
+
<?php esc_html_e( 'current size', 'tiny-compress-images' ) ?>
|
166 |
+
</td>
|
167 |
+
</tr>
|
168 |
+
</table>
|
169 |
+
</div>
|
170 |
+
</div>
|
171 |
+
</div>
|
172 |
+
</div>
|
173 |
+
<div class="optimize">
|
174 |
+
<?php if ( true ) { ?>
|
175 |
+
<div class="progressbar" id="compression-progress-bar" data-number-to-optimize="<?php echo $stats['optimized-image-sizes'] + $stats['available-unoptimised-sizes'] ?>" data-amount-optimized="0">
|
176 |
+
<div id="progress-size" class="progress">
|
177 |
+
</div>
|
178 |
+
<div class="numbers" >
|
179 |
+
<span id="optimized-so-far"><?php echo $stats['optimized-image-sizes'] ?></span>
|
180 |
+
/
|
181 |
+
<span><?php echo $stats['optimized-image-sizes'] + $stats['available-unoptimised-sizes'] ?></span>
|
182 |
+
<span id="percentage"></span>
|
183 |
+
</div>
|
184 |
+
</div>
|
185 |
+
<?php } ?>
|
186 |
+
<?php
|
187 |
+
if ( $stats['available-unoptimised-sizes'] > 0 ) {
|
188 |
+
require_once dirname( __FILE__ ) . '/bulk-optimization-form.php';
|
189 |
+
}
|
190 |
+
?>
|
191 |
+
</div>
|
192 |
+
</div>
|
193 |
+
<script type="text/javascript">
|
194 |
+
<?php
|
195 |
+
if ( $auto_start_bulk ) {
|
196 |
+
echo 'jQuery(function() { bulkOptimizationAutorun(' . json_encode( $this->get_ids_to_compress() ) . ')})';
|
197 |
+
} else {
|
198 |
+
echo 'jQuery(function() { bulkOptimization(' . json_encode( $stats['available-for-optimization'] ) . ')})';
|
199 |
+
}
|
200 |
+
?>
|
201 |
+
</script>
|
202 |
+
<table class="wp-list-table widefat fixed striped media whitebox" id="optimization-items" >
|
203 |
+
<thead>
|
204 |
+
<tr>
|
205 |
+
<?php // column-author WP 3.8-4.2 mobile view ?>
|
206 |
+
<th class="thumbnail"></th>
|
207 |
+
<th class="column-primary" ><?php esc_html_e( 'File', 'tiny-compress-images' ) ?></th>
|
208 |
+
<th class="column-author"><?php esc_html_e( 'Sizes Optimized', 'tiny-compress-images' ) ?></th>
|
209 |
+
<th class="column-author"><?php esc_html_e( 'Initial Size', 'tiny-compress-images' ) ?></th>
|
210 |
+
<th class="column-author"><?php esc_html_e( 'Current Size', 'tiny-compress-images' ) ?></th>
|
211 |
+
<th class="column-author savings" ><?php esc_html_e( 'Savings', 'tiny-compress-images' ) ?></th>
|
212 |
+
<th class="status" ><?php esc_html_e( 'Status', 'tiny-compress-images' ) ?></th>
|
213 |
+
</tr>
|
214 |
+
</thead>
|
215 |
+
<tbody>
|
216 |
+
</tbody>
|
217 |
+
</table>
|
218 |
+
</div>
|
src/views/compress-details-processing.php
CHANGED
@@ -1,10 +1,8 @@
|
|
1 |
-
|
2 |
-
|
3 |
-
|
4 |
-
|
5 |
-
|
6 |
-
|
7 |
-
|
8 |
-
</span>
|
9 |
-
</div>
|
10 |
</div>
|
1 |
+
<div class="details-container">
|
2 |
+
<div class="details">
|
3 |
+
<span class="icon spinner"></span>
|
4 |
+
<span class="message">
|
5 |
+
<span><?php esc_html_e( 'compressing', 'tiny-compress-images' ) ?></span>
|
6 |
+
</span>
|
7 |
+
</div>
|
|
|
|
|
8 |
</div>
|
src/views/compress-details.php
CHANGED
@@ -1,154 +1,157 @@
|
|
1 |
<?php
|
2 |
-
$error = $tiny_metadata->get_latest_error();
|
3 |
-
$total = $tiny_metadata->get_count(array('modified', 'missing', 'has_been_compressed', 'compressed'));
|
4 |
-
$active = $tiny_metadata->get_count(array('uncompressed', 'never_compressed'), $active_tinify_sizes);
|
5 |
-
$savings = $tiny_metadata->get_savings();
|
6 |
|
7 |
-
$
|
8 |
-
$
|
9 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
<?php if ($error) { ?>
|
15 |
-
<span class="icon dashicons dashicons-warning error"></span>
|
16 |
-
<?php } else if ($total['missing'] > 0 || $total['modified'] > 0) { ?>
|
17 |
-
<span class="icon dashicons dashicons-yes alert"></span>
|
18 |
-
<?php } else if ($total['compressed'] > 0 && $active['uncompressed'] > 0) { ?>
|
19 |
-
<span class="icon dashicons dashicons-yes alert"></span>
|
20 |
-
<?php } else if ($total['compressed'] > 0) { ?>
|
21 |
-
<span class="icon dashicons dashicons-yes success"></span>
|
22 |
-
<?php } ?>
|
23 |
-
<span class="icon spinner hidden"></span>
|
24 |
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
</div>
|
73 |
-
|
74 |
-
<?php if ($tiny_metadata->can_be_compressed() && $active['uncompressed'] > 0) { ?>
|
75 |
-
<button type="button" class="tiny-compress button button-small button-primary" data-id="<?php echo $tiny_metadata->get_id() ?>">
|
76 |
-
<?php echo esc_html__('Compress', 'tiny-compress-images') ?>
|
77 |
-
</button>
|
78 |
-
<?php } ?>
|
79 |
</div>
|
80 |
|
81 |
-
<div class="modal" id="modal_<?php echo $
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
echo '-';
|
117 |
-
}
|
118 |
-
?></td>
|
119 |
-
<?php
|
120 |
-
if ($image->has_been_compressed()) {
|
121 |
-
echo '<td>';
|
122 |
-
echo size_format($meta["output"]["size"], 1);
|
123 |
-
echo '</td>';
|
124 |
-
echo '<td>' . human_time_diff($image->end_time($size)) . ' ' . esc_html__('ago', 'tiny-compress-images') .'</td>';
|
125 |
-
} elseif (!$image->exists()) {
|
126 |
-
echo '<td colspan=2><em>' . esc_html__('Size is not present', 'tiny-compress-images') . '</em></td>';
|
127 |
-
} elseif (isset($size_active[$size])) {
|
128 |
-
echo '<td colspan=2><em>' . esc_html__('Not compressed', 'tiny-compress-images') . '</em></td>';
|
129 |
-
} elseif (isset($size_exists[$size])) {
|
130 |
-
echo '<td colspan=2><em>' . esc_html__('Not configured to be compressed', 'tiny-compress-images') . '</em></td>';
|
131 |
-
} else {
|
132 |
-
echo '<td colspan=2><em>' . esc_html__('Size is no longer in use', 'tiny-compress-images') . '</em></td>';
|
133 |
-
}
|
134 |
-
?>
|
135 |
-
</tr>
|
136 |
-
<?php $i++ ?>
|
137 |
-
<?php } ?>
|
138 |
-
<?php if ($savings['count'] > 0) { ?>
|
139 |
-
<tfoot>
|
140 |
-
<tr>
|
141 |
-
<td><?php esc_html_e('Combined', 'tiny-compress-images') ?></td>
|
142 |
-
<td><?php echo size_format($savings['input'], 1) ?></td>
|
143 |
-
<td><?php echo size_format($savings['output'], 1) ?></td>
|
144 |
-
<td></td>
|
145 |
-
</tr>
|
146 |
-
</tfoot>
|
147 |
-
<?php } ?>
|
148 |
-
</table>
|
149 |
-
<?php if ($savings['input'] && $savings['output']) { ?>
|
150 |
-
<p><strong><?php printf(esc_html__('Total savings %s (%.0f%%)', 'tiny-compress-images'), size_format($savings["input"] - $savings["output"], 1), (1 - $savings['output'] / floatval($savings['input'])) * 100) ?></strong></p>
|
151 |
-
<?php } ?>
|
152 |
-
</div>
|
153 |
-
</div>
|
154 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
<?php
|
|
|
|
|
|
|
|
|
2 |
|
3 |
+
$available_sizes = array_keys( $this->settings->get_sizes() );
|
4 |
+
$active_sizes = $this->settings->get_sizes();;
|
5 |
+
$active_tinify_sizes = $this->settings->get_active_tinify_sizes();
|
6 |
+
$error = $tiny_image->get_latest_error();
|
7 |
+
$total = $tiny_image->get_count( array( 'modified', 'missing', 'has_been_compressed', 'compressed' ) );
|
8 |
+
$active = $tiny_image->get_count( array( 'uncompressed', 'never_compressed' ), $active_tinify_sizes );
|
9 |
+
$image_statistics = $tiny_image->get_statistics();
|
10 |
+
$available_unoptimized_sizes = $image_statistics['available_unoptimized_sizes'];
|
11 |
+
$size_before = $image_statistics['initial_total_size'];
|
12 |
+
$size_after = $image_statistics['optimized_total_size'];
|
13 |
|
14 |
+
$size_active = array_fill_keys( $active_tinify_sizes, true );
|
15 |
+
$size_exists = array_fill_keys( $available_sizes, true );
|
16 |
+
ksort( $size_exists );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
17 |
|
18 |
+
?>
|
19 |
+
<div class="details-container">
|
20 |
+
<div class="details" >
|
21 |
+
<?php if ( $error ) {
|
22 |
+
// dashicons-warning available for WP 4.3+ ?>
|
23 |
+
<span class="icon dashicons dashicons-no error"></span>
|
24 |
+
<?php } else if ( $total['missing'] > 0 || $total['modified'] > 0 ) { ?>
|
25 |
+
<span class="icon dashicons dashicons-yes alert"></span>
|
26 |
+
<?php } else if ( $total['compressed'] > 0 && $available_unoptimized_sizes > 0 ) { ?>
|
27 |
+
<span class="icon dashicons dashicons-yes alert"></span>
|
28 |
+
<?php } else if ( $total['compressed'] > 0 ) { ?>
|
29 |
+
<span class="icon dashicons dashicons-yes success"></span>
|
30 |
+
<?php } ?>
|
31 |
+
<span class="icon spinner hidden"></span>
|
32 |
+
<?php if ( $total['has_been_compressed'] > 0 || (0 == $total['has_been_compressed'] && 0 == $available_unoptimized_sizes) ) { ?>
|
33 |
+
<span class="message">
|
34 |
+
<?php printf( wp_kses( _n( '<strong>%d</strong> size compressed', '<strong>%d</strong> sizes compressed', $total['has_been_compressed'], 'tiny-compress-images' ), array( 'strong' => array() ) ), $total['has_been_compressed'] ) ?>
|
35 |
+
</span>
|
36 |
+
<br/>
|
37 |
+
<?php } ?>
|
38 |
+
<?php if ( $available_unoptimized_sizes > 0 ) { ?>
|
39 |
+
<span class="message">
|
40 |
+
<?php printf( esc_html( _n( '%d size to be compressed', '%d sizes to be compressed', $available_unoptimized_sizes, 'tiny-compress-images' ) ), $available_unoptimized_sizes ) ?>
|
41 |
+
</span>
|
42 |
+
<br />
|
43 |
+
<?php } ?>
|
44 |
+
<?php if ( $size_before - $size_after ) { ?>
|
45 |
+
<span class="message">
|
46 |
+
<?php printf( esc_html__( 'Total savings %.0f%%', 'tiny-compress-images' ), (1 - $size_after / floatval( $size_before )) * 100 ) ?>
|
47 |
+
</span>
|
48 |
+
<br />
|
49 |
+
<?php } ?>
|
50 |
+
<?php if ( $error ) { ?>
|
51 |
+
<span class="message error_message">
|
52 |
+
<?php echo esc_html__( 'Latest error', 'tiny-compress-images' ) . ': '. esc_html__( $error, 'tiny-compress-images' ) ?>
|
53 |
+
</span>
|
54 |
+
<br/>
|
55 |
+
<?php } ?>
|
56 |
+
<a class="thickbox message" href="#TB_inline?width=700&height=500&inlineId=modal_<?php echo $tiny_image->get_id() ?>">
|
57 |
+
<?php esc_html_e( 'Details', 'tiny-compress-images' ) ?>
|
58 |
+
</a>
|
59 |
+
</div>
|
60 |
+
<?php if ( $active['uncompressed'] > 0 ) { ?>
|
61 |
+
<button type="button" class="tiny-compress button button-small button-primary" data-id="<?php echo $tiny_image->get_id() ?>">
|
62 |
+
<?php esc_html_e( 'Compress', 'tiny-compress-images' ) ?>
|
63 |
+
</button>
|
64 |
+
<?php } ?>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
65 |
</div>
|
66 |
|
67 |
+
<div class="modal" id="modal_<?php echo $tiny_image->get_id() ?>">
|
68 |
+
<div class="tiny-compression-details">
|
69 |
+
<h3>
|
70 |
+
<?php printf( esc_html__( 'Compression details for %s', 'tiny-compress-images' ), $tiny_image->get_name() ) ?>
|
71 |
+
</h3>
|
72 |
+
<table>
|
73 |
+
<tr>
|
74 |
+
<th><?php esc_html_e( 'Size' ) ?></th>
|
75 |
+
<th><?php esc_html_e( 'Initial Size', 'tiny-compress-images' ) ?></th>
|
76 |
+
<th><?php esc_html_e( 'Compressed', 'tiny-compress-images' ) ?></th>
|
77 |
+
<th><?php esc_html_e( 'Date' ) ?></th>
|
78 |
+
</tr>
|
79 |
+
<?php
|
80 |
+
$i = 0;
|
81 |
+
$sizes = $tiny_image->get_image_sizes() + $size_exists;
|
82 |
+
foreach ( $sizes as $size_name => $size ) {
|
83 |
+
if ( ! is_object( $size ) ) {
|
84 |
+
$size = new Tiny_Image_Size();
|
85 |
+
}
|
86 |
+
?>
|
87 |
+
<tr class="<?php echo ( 0 == $i % 2 ) ? 'even' : 'odd' ?>">
|
88 |
+
<?php
|
89 |
+
echo '<td>';
|
90 |
+
echo ( Tiny_Image::is_original( $size_name ) ? esc_html__( 'Original', 'tiny-compress-images' ) : esc_html__( ucfirst( $size_name ) ) );
|
91 |
+
echo ' ';
|
92 |
+
if ( ! array_key_exists( $size_name, $active_sizes ) ) {
|
93 |
+
echo '<em>' . esc_html__( '(not in use)', 'tiny-compress-images' ) . '</em>';
|
94 |
+
} else if ( $size->missing() ) {
|
95 |
+
echo '<em>' . esc_html__( '(file removed)', 'tiny-compress-images' ) . '</em>';
|
96 |
+
} else if ( $size->modified() ) {
|
97 |
+
echo '<em>' . esc_html__( '(modified after compression)', 'tiny-compress-images' ) . '</em>';
|
98 |
+
} else if ( $size->resized() ) {
|
99 |
+
printf( '<em>' . esc_html__( '(resized to %dx%d)', 'tiny-compress-images' ) . '</em>', $size->meta['output']['width'], $size->meta['output']['height'] );
|
100 |
+
}
|
101 |
+
echo '</td>';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
102 |
|
103 |
+
if ( $size->is_duplicate() ) {
|
104 |
+
echo '<td>-</td>';
|
105 |
+
printf( '<td colspan=2><em>' . esc_html__( 'Same file as "%s"', 'tiny-compress-images' ) . '</em></td>', esc_html__( ucfirst( $size->duplicate_of_size() ) ) );
|
106 |
+
} else if ( $size->has_been_compressed() ) {
|
107 |
+
echo '<td>' . size_format( $size->meta['input']['size'], 1 ) . '</td>';
|
108 |
+
echo '<td>' . size_format( $size->meta['output']['size'], 1 ) . '</td>';
|
109 |
+
echo '<td>' . sprintf( esc_html__( '%s ago' ), human_time_diff( $size->end_time( $size_name ) ) ) . '</td>';
|
110 |
+
} else if ( ! $size->exists() ) {
|
111 |
+
echo '<td>-</td>';
|
112 |
+
echo '<td colspan=2><em>' . esc_html__( 'Not present', 'tiny-compress-images' ) . '</em></td>';
|
113 |
+
} else if ( isset( $size_active[ $size_name ] ) ) {
|
114 |
+
echo '<td>' . size_format( $size->filesize(), 1 ) . '</td>';
|
115 |
+
echo '<td colspan=2><em>' . esc_html__( 'Not compressed', 'tiny-compress-images' ) . '</em></td>';
|
116 |
+
} else if ( isset( $size_exists[ $size_name ] ) ) {
|
117 |
+
echo '<td>' . size_format( $size->filesize(), 1 ) . '</td>';
|
118 |
+
echo '<td colspan=2><em>' . esc_html__( 'Not configured to be compressed', 'tiny-compress-images' ) . '</em></td>';
|
119 |
+
} else if ( ! array_key_exists( $size_name, $active_sizes ) ) {
|
120 |
+
echo '<td>' . size_format( $size->filesize(), 1 ) . '</td>';
|
121 |
+
echo '<td colspan=2><em>' . esc_html__( 'Size is not in use', 'tiny-compress-images' ) . '</em></td>';
|
122 |
+
} else {
|
123 |
+
echo '<td>' . size_format( $size->filesize(), 1 ) . '</td>';
|
124 |
+
echo '<td>-</td>';
|
125 |
+
}
|
126 |
+
?>
|
127 |
+
</tr><?php
|
128 |
+
$i++;
|
129 |
+
}
|
130 |
+
if ( $image_statistics['image_sizes_optimized'] > 0 ) { ?>
|
131 |
+
<tfoot>
|
132 |
+
<tr>
|
133 |
+
<td><?php esc_html_e( 'Combined', 'tiny-compress-images' ) ?></td>
|
134 |
+
<td><?php echo size_format( $size_before, 1 ) ?></td>
|
135 |
+
<td><?php echo size_format( $size_after, 1 ) ?></td>
|
136 |
+
<td></td>
|
137 |
+
</tr>
|
138 |
+
</tfoot><?php
|
139 |
+
}
|
140 |
+
?>
|
141 |
+
</table>
|
142 |
+
<p>
|
143 |
+
<strong>
|
144 |
+
<?php
|
145 |
+
if ( $size_before - $size_after ) {
|
146 |
+
printf( esc_html__( 'Total savings %.0f%% (%s)', 'tiny-compress-images' ),
|
147 |
+
( 1 - $size_after / floatval( $size_before ) ) * 100,
|
148 |
+
size_format( $size_before - $size_after, 1 )
|
149 |
+
);
|
150 |
+
} else {
|
151 |
+
printf( esc_html__( 'Total savings %.0f%%', 'tiny-compress-images' ), 0 );
|
152 |
+
}
|
153 |
+
?>
|
154 |
+
</strong>
|
155 |
+
</p>
|
156 |
+
</div>
|
157 |
+
</div>
|
test/fixtures/Client.php
ADDED
@@ -0,0 +1,119 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tinify;
|
4 |
+
|
5 |
+
class Client {
|
6 |
+
const API_ENDPOINT = 'http://webservice';
|
7 |
+
|
8 |
+
private $options;
|
9 |
+
|
10 |
+
public static function userAgent() {
|
11 |
+
$curl = curl_version();
|
12 |
+
return 'Tinify/' . VERSION . ' PHP/' . PHP_VERSION . ' curl/' . $curl['version'];
|
13 |
+
}
|
14 |
+
|
15 |
+
private static function caBundle() {
|
16 |
+
return __DIR__ . '/../data/cacert.pem';
|
17 |
+
}
|
18 |
+
|
19 |
+
function __construct($key, $appIdentifier = null) {
|
20 |
+
$userAgent = join( ' ', array_filter( array( self::userAgent(), $appIdentifier) ) );
|
21 |
+
$this->options = array(
|
22 |
+
CURLOPT_BINARYTRANSFER => true,
|
23 |
+
CURLOPT_RETURNTRANSFER => true,
|
24 |
+
CURLOPT_HEADER => true,
|
25 |
+
CURLOPT_USERPWD => $key ? ('api:' . $key) : null,
|
26 |
+
CURLOPT_USERAGENT => $userAgent,
|
27 |
+
);
|
28 |
+
}
|
29 |
+
|
30 |
+
function request($method, $url, $body = null, $header = array() ) {
|
31 |
+
if ( is_array( $body ) ) {
|
32 |
+
if ( ! empty( $body ) ) {
|
33 |
+
$body = json_encode( $body );
|
34 |
+
array_push( $header, 'Content-Type: application/json' );
|
35 |
+
} else {
|
36 |
+
$body = null;
|
37 |
+
}
|
38 |
+
}
|
39 |
+
|
40 |
+
$request = curl_init();
|
41 |
+
curl_setopt_array( $request, $this->options );
|
42 |
+
|
43 |
+
$url = strtolower( substr( $url, 0, 5 ) ) == 'http:' ? $url : self::API_ENDPOINT . $url;
|
44 |
+
curl_setopt( $request, CURLOPT_URL, $url );
|
45 |
+
curl_setopt( $request, CURLOPT_HTTPHEADER, $header );
|
46 |
+
curl_setopt( $request, CURLOPT_CUSTOMREQUEST, strtoupper( $method ) );
|
47 |
+
|
48 |
+
if ( $body ) {
|
49 |
+
curl_setopt( $request, CURLOPT_POSTFIELDS, $body );
|
50 |
+
}
|
51 |
+
|
52 |
+
$response = curl_exec( $request );
|
53 |
+
|
54 |
+
if ( is_string( $response ) ) {
|
55 |
+
$status = curl_getinfo( $request, CURLINFO_HTTP_CODE );
|
56 |
+
$headerSize = curl_getinfo( $request, CURLINFO_HEADER_SIZE );
|
57 |
+
curl_close( $request );
|
58 |
+
|
59 |
+
$headers = self::parseHeaders( substr( $response, 0, $headerSize ) );
|
60 |
+
$body = substr( $response, $headerSize );
|
61 |
+
|
62 |
+
if ( isset( $headers['compression-count'] ) ) {
|
63 |
+
Tinify::setCompressionCount( intval( $headers['compression-count'] ) );
|
64 |
+
}
|
65 |
+
|
66 |
+
$isJson = false;
|
67 |
+
if ( isset( $headers['content-type'] ) ) {
|
68 |
+
/* Parse JSON response bodies. */
|
69 |
+
list($contentType) = explode( ';', $headers['content-type'], 2 );
|
70 |
+
if ( strtolower( trim( $contentType ) ) == 'application/json' ) {
|
71 |
+
$isJson = true;
|
72 |
+
}
|
73 |
+
}
|
74 |
+
|
75 |
+
/* 1xx and 3xx are unexpected and will be treated as error. */
|
76 |
+
$isError = $status <= 199 || $status >= 300;
|
77 |
+
|
78 |
+
if ( $isJson || $isError ) {
|
79 |
+
/* Parse JSON bodies, always interpret errors as JSON. */
|
80 |
+
$body = json_decode( $body );
|
81 |
+
if ( ! $body ) {
|
82 |
+
$message = sprintf('Error while parsing response: %s (#%d)',
|
83 |
+
PHP_VERSION_ID >= 50500 ? json_last_error_msg() : 'Error',
|
84 |
+
json_last_error());
|
85 |
+
throw Exception::create( $message, 'ParseError', $status );
|
86 |
+
}
|
87 |
+
}
|
88 |
+
|
89 |
+
if ( $isError ) {
|
90 |
+
throw Exception::create( $body->message, $body->error, $status );
|
91 |
+
}
|
92 |
+
|
93 |
+
return (object) array( 'body' => $body, 'headers' => $headers );
|
94 |
+
} else {
|
95 |
+
$message = sprintf( '%s (#%d)', curl_error( $request ), curl_errno( $request ) );
|
96 |
+
curl_close( $request );
|
97 |
+
throw new ConnectionException( 'Error while connecting: ' . $message );
|
98 |
+
}
|
99 |
+
}
|
100 |
+
|
101 |
+
protected static function parseHeaders($headers) {
|
102 |
+
if ( ! is_array( $headers ) ) {
|
103 |
+
$headers = explode( "\r\n", $headers );
|
104 |
+
}
|
105 |
+
|
106 |
+
$result = array();
|
107 |
+
foreach ( $headers as $header ) {
|
108 |
+
if ( empty( $header ) ) {
|
109 |
+
continue;
|
110 |
+
}
|
111 |
+
|
112 |
+
$split = explode( ':', $header, 2 );
|
113 |
+
if ( count( $split ) === 2 ) {
|
114 |
+
$result[strtolower( $split[0] )] = trim( $split[1] );
|
115 |
+
}
|
116 |
+
}
|
117 |
+
return $result;
|
118 |
+
}
|
119 |
+
}
|
test/fixtures/input-example.jpg
CHANGED
Binary file
|
test/fixtures/input-example.png
CHANGED
Binary file
|
test/fixtures/json/{wp_meta_default_sizes.json → _wp_attachment_metadata.json}
RENAMED
@@ -3,10 +3,10 @@
|
|
3 |
"height": 1256,
|
4 |
"file": "2015/09/tinypng_gravatar.png",
|
5 |
"sizes": {
|
6 |
-
"
|
7 |
-
"file": "tinypng_gravatar-
|
8 |
-
"width":
|
9 |
-
"height":
|
10 |
"mime-type": "image/png"
|
11 |
},
|
12 |
"medium": {
|
@@ -20,6 +20,12 @@
|
|
20 |
"width": 600,
|
21 |
"height": 600,
|
22 |
"mime-type": "image/png"
|
|
|
|
|
|
|
|
|
|
|
|
|
23 |
}
|
24 |
},
|
25 |
"image_meta": {
|
3 |
"height": 1256,
|
4 |
"file": "2015/09/tinypng_gravatar.png",
|
5 |
"sizes": {
|
6 |
+
"small": {
|
7 |
+
"file": "tinypng_gravatar-200x200.png",
|
8 |
+
"width": 200,
|
9 |
+
"height": 200,
|
10 |
"mime-type": "image/png"
|
11 |
},
|
12 |
"medium": {
|
20 |
"width": 600,
|
21 |
"height": 600,
|
22 |
"mime-type": "image/png"
|
23 |
+
},
|
24 |
+
"thumbnail": {
|
25 |
+
"file": "tinypng_gravatar-150x150.png",
|
26 |
+
"width": 150,
|
27 |
+
"height": 150,
|
28 |
+
"mime-type": "image/png"
|
29 |
}
|
30 |
},
|
31 |
"image_meta": {
|
test/fixtures/json/_wp_attachment_metadata_duplicates.json
ADDED
@@ -0,0 +1,51 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"width": 1256,
|
3 |
+
"height": 1256,
|
4 |
+
"file": "2015/09/tinypng_gravatar.png",
|
5 |
+
"sizes": {
|
6 |
+
"small": {
|
7 |
+
"file": "tinypng_gravatar-200x200.png",
|
8 |
+
"width": 200,
|
9 |
+
"height": 200,
|
10 |
+
"mime-type": "image/png"
|
11 |
+
},
|
12 |
+
"medium": {
|
13 |
+
"file": "tinypng_gravatar-300x300.png",
|
14 |
+
"width": 300,
|
15 |
+
"height": 300,
|
16 |
+
"mime-type": "image/png"
|
17 |
+
},
|
18 |
+
"medium-2": {
|
19 |
+
"file": "tinypng_gravatar-300x300.png",
|
20 |
+
"width": 300,
|
21 |
+
"height": 300,
|
22 |
+
"mime-type": "image/png"
|
23 |
+
},
|
24 |
+
"large": {
|
25 |
+
"file": "tinypng_gravatar-600x600.png",
|
26 |
+
"width": 600,
|
27 |
+
"height": 600,
|
28 |
+
"mime-type": "image/png"
|
29 |
+
},
|
30 |
+
"custom-thumbnail": {
|
31 |
+
"file": "tinypng_gravatar-175x175.png",
|
32 |
+
"width": 175,
|
33 |
+
"height": 175,
|
34 |
+
"mime-type": "image/png"
|
35 |
+
},
|
36 |
+
"custom-thumbnail-2": {
|
37 |
+
"file": "tinypng_gravatar-175x175.png",
|
38 |
+
"width": 175,
|
39 |
+
"height": 175,
|
40 |
+
"mime-type": "image/png"
|
41 |
+
},
|
42 |
+
"custom-thumbnail-3": {
|
43 |
+
"file": "tinypng_gravatar-175x175.png",
|
44 |
+
"width": 175,
|
45 |
+
"height": 175,
|
46 |
+
"mime-type": "image/png"
|
47 |
+
}
|
48 |
+
},
|
49 |
+
"image_meta": {
|
50 |
+
}
|
51 |
+
}
|
test/fixtures/json/image_database_metadata.json
ADDED
@@ -0,0 +1,49 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"0": {
|
3 |
+
"input": {
|
4 |
+
"size": 146480
|
5 |
+
},
|
6 |
+
"output": {
|
7 |
+
"size": 137856,
|
8 |
+
"resized": true
|
9 |
+
},
|
10 |
+
"end": 1447925138,
|
11 |
+
"start": 1447925134
|
12 |
+
},
|
13 |
+
"small": {
|
14 |
+
"input": {
|
15 |
+
"size": 66480
|
16 |
+
},
|
17 |
+
"start": 1447925134
|
18 |
+
},
|
19 |
+
"medium": {
|
20 |
+
"input": {
|
21 |
+
"size": 72480
|
22 |
+
},
|
23 |
+
"output": {
|
24 |
+
"size": 57856
|
25 |
+
}
|
26 |
+
},
|
27 |
+
"thumbnail": {
|
28 |
+
"input": {
|
29 |
+
"size": 46480
|
30 |
+
},
|
31 |
+
"output": {
|
32 |
+
"size": 37856
|
33 |
+
},
|
34 |
+
"timestamp": 1437925244
|
35 |
+
},
|
36 |
+
"twentyfourteen-full-width": {
|
37 |
+
"input": {
|
38 |
+
"size": 139127
|
39 |
+
},
|
40 |
+
"output": {
|
41 |
+
"size": 121873
|
42 |
+
},
|
43 |
+
"end": 1447925214
|
44 |
+
},
|
45 |
+
"failed": {
|
46 |
+
"input": {
|
47 |
+
}
|
48 |
+
}
|
49 |
+
}
|
test/fixtures/json/image_filesystem_data.json
ADDED
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"path": "2015/09",
|
3 |
+
"images": [{
|
4 |
+
"file": "tinypng_gravatar.png",
|
5 |
+
"size": 137856
|
6 |
+
}, {
|
7 |
+
"file": "tinypng_gravatar-150x150.png",
|
8 |
+
"size": 37856
|
9 |
+
}, {
|
10 |
+
"file": "tinypng_gravatar-200x200.png",
|
11 |
+
"size": 66480
|
12 |
+
}, {
|
13 |
+
"file": "tinypng_gravatar-300x300.png",
|
14 |
+
"size": 57856
|
15 |
+
}, {
|
16 |
+
"file": "tinypng_gravatar-600x600.png",
|
17 |
+
"size": 95102
|
18 |
+
}, {
|
19 |
+
"file": "tinypng_gravatar-1038x576.png",
|
20 |
+
"size": 121873
|
21 |
+
}]
|
22 |
+
}
|
test/fixtures/json/wp_meta_sizes_with_same_files.json
DELETED
@@ -1,21 +0,0 @@
|
|
1 |
-
{
|
2 |
-
"width": 1080,
|
3 |
-
"height": 720,
|
4 |
-
"file": "2015/09/panda.png",
|
5 |
-
"sizes": {
|
6 |
-
"custom-size": {
|
7 |
-
"file": "panda-150x150.png",
|
8 |
-
"width": 150,
|
9 |
-
"height": 150,
|
10 |
-
"mime-type": "image/png"
|
11 |
-
},
|
12 |
-
"custom-size-2": {
|
13 |
-
"file": "panda-150x150.png",
|
14 |
-
"width": 150,
|
15 |
-
"height": 150,
|
16 |
-
"mime-type": "image/png"
|
17 |
-
}
|
18 |
-
},
|
19 |
-
"image_meta": {
|
20 |
-
}
|
21 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
test/fixtures/tiny-config.php
CHANGED
@@ -1,6 +1,11 @@
|
|
1 |
<?php
|
2 |
|
|
|
|
|
|
|
|
|
3 |
class Tiny_Config {
|
4 |
-
|
5 |
-
|
|
|
6 |
}
|
1 |
<?php
|
2 |
|
3 |
+
if ( ! defined( 'TINY_DEBUG' ) ) {
|
4 |
+
define( 'TINY_DEBUG', null );
|
5 |
+
}
|
6 |
+
|
7 |
class Tiny_Config {
|
8 |
+
/* URL is only used by fopen driver. */
|
9 |
+
const URL = 'http://webservice/shrink';
|
10 |
+
const MONTHLY_FREE_COMPRESSIONS = 500;
|
11 |
}
|
test/helpers/integration_helper.php
DELETED
@@ -1,9 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
function innerText($e) {
|
4 |
-
return $e->getText();
|
5 |
-
}
|
6 |
-
|
7 |
-
function elementName($e) {
|
8 |
-
return $e->getAttribute('name');
|
9 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
test/helpers/mock-http-stream-wrapper.php
ADDED
@@ -0,0 +1,98 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class MockHttpStreamWrapper implements IteratorAggregate, ArrayAccess, Countable {
|
4 |
+
public static $handlers = array();
|
5 |
+
|
6 |
+
public $context;
|
7 |
+
public $position = 0;
|
8 |
+
|
9 |
+
protected $data = array();
|
10 |
+
|
11 |
+
public static function clear() {
|
12 |
+
self::$handlers = array();
|
13 |
+
}
|
14 |
+
|
15 |
+
public static function register( $method, $url, $handler ) {
|
16 |
+
$key = self::get_key( $method, $url );
|
17 |
+
self::$handlers[ $key ] = $handler;
|
18 |
+
}
|
19 |
+
|
20 |
+
private static function get_key( $method, $url ) {
|
21 |
+
return strtoupper( $method ) . ' ' . $url;
|
22 |
+
}
|
23 |
+
|
24 |
+
/* IteratorAggregate */
|
25 |
+
|
26 |
+
public function getIterator() {
|
27 |
+
return new ArrayIterator( $this->data );
|
28 |
+
}
|
29 |
+
|
30 |
+
/* ArrayAccess */
|
31 |
+
|
32 |
+
public function offsetExists( $offset ) {
|
33 |
+
return array_key_exists( $offset, $this->data );
|
34 |
+
}
|
35 |
+
|
36 |
+
public function offsetGet( $offset ) {
|
37 |
+
return $this->data[ $offset ];
|
38 |
+
}
|
39 |
+
|
40 |
+
public function offsetSet( $offset, $value ) {
|
41 |
+
$this->data[ $offset ] = $value;
|
42 |
+
}
|
43 |
+
|
44 |
+
public function offsetUnset( $offset ) {
|
45 |
+
unset( $this->data[ $offset ] );
|
46 |
+
}
|
47 |
+
|
48 |
+
/* Countable */
|
49 |
+
public function count() {
|
50 |
+
return count( $this->data );
|
51 |
+
}
|
52 |
+
|
53 |
+
/* StreamWrapper */
|
54 |
+
public function stream_open( $path, $mode, $options, &$opened_path ) {
|
55 |
+
$context = stream_context_get_options( $this->context );
|
56 |
+
$path = str_replace( 'https://api.tinify.com', '', $path );
|
57 |
+
$key = self::get_key( $context['http']['method'], $path );
|
58 |
+
if ( isset( self::$handlers[ $key ] ) ) {
|
59 |
+
$handler = self::$handlers[ $key ];
|
60 |
+
|
61 |
+
$status = 'HTTP/1.1 ' . $handler['status'];
|
62 |
+
$body = isset( $handler['body'] ) ? $handler['body'] : '';
|
63 |
+
$headers = isset( $handler['headers'] ) ? $handler['headers'] : array();
|
64 |
+
|
65 |
+
$this->mocked_body = $body;
|
66 |
+
$this->mocked_status = $status;
|
67 |
+
|
68 |
+
array_push( $this->data, $status );
|
69 |
+
foreach ( $headers as $header => $value ) {
|
70 |
+
array_push( $this->data, $header . ': ' . $value );
|
71 |
+
}
|
72 |
+
} else {
|
73 |
+
throw new Exception( 'No handler for ' . $key );
|
74 |
+
}
|
75 |
+
return true;
|
76 |
+
}
|
77 |
+
|
78 |
+
public function stream_read( $count ) {
|
79 |
+
if ( $this->position > strlen( $this->mocked_body ) ) {
|
80 |
+
return false;
|
81 |
+
}
|
82 |
+
$result = substr( $this->mocked_body, $this->position, $count );
|
83 |
+
$this->position += $count;
|
84 |
+
return $result;
|
85 |
+
}
|
86 |
+
|
87 |
+
public function stream_eof() {
|
88 |
+
return $this->position >= strlen( $this->mocked_body );
|
89 |
+
}
|
90 |
+
|
91 |
+
public function stream_stat() {
|
92 |
+
return array( 'wrapper_data' => array( 'test' ) );
|
93 |
+
}
|
94 |
+
|
95 |
+
public function stream_tell() {
|
96 |
+
return $this->position;
|
97 |
+
}
|
98 |
+
}
|
test/helpers/mock-tinify-client.php
ADDED
@@ -0,0 +1,50 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class MockTinifyClient extends Tinify\Client {
|
4 |
+
function __construct( $key = null, $appIdentifier = null ) {
|
5 |
+
parent::__construct( $key, $appIdentifier );
|
6 |
+
$this->handlers = array();
|
7 |
+
}
|
8 |
+
|
9 |
+
public function request( $method, $url, $body = null, $header = array() ) {
|
10 |
+
$url = str_replace( 'https://api.tinify.com', '', $url );
|
11 |
+
$key = $this->get_key( $method, $url );
|
12 |
+
if ( isset( $this->handlers[ $key ] ) ) {
|
13 |
+
$handler = $this->handlers[ $key ];
|
14 |
+
|
15 |
+
$status = $handler['status'];
|
16 |
+
$body = isset( $handler['body'] ) ? $handler['body'] : '';
|
17 |
+
$headers = isset( $handler['headers'] ) ? $handler['headers'] : array();
|
18 |
+
|
19 |
+
if ( isset( $headers['compression-count'] ) ) {
|
20 |
+
\Tinify\Tinify::setCompressionCount(
|
21 |
+
intval( $headers['compression-count'] )
|
22 |
+
);
|
23 |
+
}
|
24 |
+
|
25 |
+
$isError = $status <= 199 || $status >= 300;
|
26 |
+
$isJson = true;
|
27 |
+
|
28 |
+
if ( $isJson || $isError ) {
|
29 |
+
$body = json_decode( $body );
|
30 |
+
}
|
31 |
+
|
32 |
+
if ( $isError ) {
|
33 |
+
throw \Tinify\Exception::create( $body->message, $body->error, $status );
|
34 |
+
}
|
35 |
+
|
36 |
+
return (object) array( 'body' => $body, 'headers' => $headers );
|
37 |
+
} else {
|
38 |
+
throw new Exception( 'No handler for ' . $key );
|
39 |
+
}
|
40 |
+
}
|
41 |
+
|
42 |
+
public function register( $method, $url, $handler ) {
|
43 |
+
$key = $this->get_key( $method, $url );
|
44 |
+
$this->handlers[ $key ] = $handler;
|
45 |
+
}
|
46 |
+
|
47 |
+
private function get_key( $method, $url ) {
|
48 |
+
return strtoupper( $method ) . ' ' . $url;
|
49 |
+
}
|
50 |
+
}
|
test/helpers/setup.php
CHANGED
@@ -10,168 +10,196 @@ use Facebook\WebDriver\Remote;
|
|
10 |
use Facebook\WebDriver\Remote\RemoteWebDriver;
|
11 |
use Facebook\WebDriver\Remote\DesiredCapabilities;
|
12 |
|
13 |
-
function wordpress($url = null) {
|
14 |
-
|
15 |
}
|
16 |
|
17 |
function wordpress_version() {
|
18 |
-
|
19 |
-
}
|
20 |
-
|
21 |
-
function configure_wordpress_for_testing($driver) {
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
backup_wordpress_site();
|
36 |
-
}
|
37 |
}
|
38 |
|
39 |
function restore_wordpress() {
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
}
|
44 |
|
45 |
function mysql_dump_file() {
|
46 |
-
|
47 |
}
|
48 |
|
49 |
function restore_wordpress_site() {
|
50 |
-
|
51 |
}
|
52 |
|
53 |
function backup_wordpress_site() {
|
54 |
-
|
55 |
}
|
56 |
|
57 |
-
function set_siteurl($site_url) {
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
|
|
|
|
|
|
|
|
62 |
}
|
63 |
|
64 |
function clear_settings() {
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
|
|
|
|
|
|
|
|
70 |
}
|
71 |
|
72 |
function clear_uploads() {
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
|
|
|
|
|
|
|
|
|
|
79 |
}
|
80 |
|
81 |
function is_wordpress_setup() {
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
}
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
149 |
}
|
150 |
|
151 |
function close_webdriver() {
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
}
|
156 |
|
157 |
function reset_webservice() {
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
}
|
165 |
|
166 |
// $global_webdriver_host = 'http://127.0.0.1:4444/wd/hub';
|
167 |
// $global_driver = RemoteWebDriver::create($global_webdriver_host, DesiredCapabilities::firefox());
|
168 |
$global_webdriver_host = 'http://127.0.0.1:8910';
|
169 |
-
$global_driver = RemoteWebDriver::create($global_webdriver_host, DesiredCapabilities::phantomjs());
|
170 |
$global_session_id = $global_driver->getSessionID();
|
171 |
-
$window = new WebDriverDimension(1280, 1024);
|
172 |
-
$global_driver->manage()->window()->setSize($window);
|
173 |
|
174 |
-
register_shutdown_function('close_webdriver');
|
175 |
-
register_shutdown_function('restore_wordpress');
|
176 |
|
177 |
-
configure_wordpress_for_testing($global_driver);
|
|
10 |
use Facebook\WebDriver\Remote\RemoteWebDriver;
|
11 |
use Facebook\WebDriver\Remote\DesiredCapabilities;
|
12 |
|
13 |
+
function wordpress( $url = null ) {
|
14 |
+
return getenv( 'WORDPRESS_URL' ) . $url;
|
15 |
}
|
16 |
|
17 |
function wordpress_version() {
|
18 |
+
return intval( getenv( 'WORDPRESS_VERSION' ) );
|
19 |
+
}
|
20 |
+
|
21 |
+
function configure_wordpress_for_testing( $driver ) {
|
22 |
+
if ( is_wordpress_setup() ) {
|
23 |
+
restore_wordpress_site();
|
24 |
+
set_siteurl( wordpress() );
|
25 |
+
login( $driver );
|
26 |
+
clear_uploads( $driver );
|
27 |
+
} else {
|
28 |
+
setup_wordpress_language( $driver );
|
29 |
+
setup_wordpress_site( $driver );
|
30 |
+
set_siteurl( wordpress() );
|
31 |
+
login( $driver );
|
32 |
+
activate_plugin( $driver );
|
33 |
+
backup_wordpress_site();
|
34 |
+
}
|
|
|
|
|
35 |
}
|
36 |
|
37 |
function restore_wordpress() {
|
38 |
+
if ( is_wordpress_setup() ) {
|
39 |
+
set_siteurl( 'http://' . getenv( 'HOST' ) . ':' . getenv( 'WORDPRESS_PORT' ) );
|
40 |
+
}
|
41 |
}
|
42 |
|
43 |
function mysql_dump_file() {
|
44 |
+
return dirname( __FILE__ ) . '/../../tmp/mysqldump_' . getenv( 'WORDPRESS_DATABASE' ) . '.sql.gz';
|
45 |
}
|
46 |
|
47 |
function restore_wordpress_site() {
|
48 |
+
shell_exec( 'gunzip -c < ' . mysql_dump_file() . ' | mysql -h ' . getenv( 'HOST' ) . ' -u root ' . getenv( 'WORDPRESS_DATABASE' ) );
|
49 |
}
|
50 |
|
51 |
function backup_wordpress_site() {
|
52 |
+
shell_exec( 'mysqldump -h ' . getenv( 'HOST' ) . ' -u root ' . getenv( 'WORDPRESS_DATABASE' ) . ' | gzip -c > ' . mysql_dump_file() );
|
53 |
}
|
54 |
|
55 |
+
function set_siteurl( $site_url ) {
|
56 |
+
$db = new mysqli( getenv( 'HOST' ), 'root',
|
57 |
+
getenv( 'MYSQL_PWD' ),
|
58 |
+
getenv( 'WORDPRESS_DATABASE' )
|
59 |
+
);
|
60 |
+
|
61 |
+
$statement = $db->prepare( "UPDATE wp_options SET option_value = ? WHERE option_name = 'home' OR option_name = 'siteurl'" );
|
62 |
+
$statement->bind_param( 's', $site_url );
|
63 |
+
$statement->execute();
|
64 |
}
|
65 |
|
66 |
function clear_settings() {
|
67 |
+
$db = new mysqli( getenv( 'HOST' ), 'root',
|
68 |
+
getenv( 'MYSQL_PWD' ),
|
69 |
+
getenv( 'WORDPRESS_DATABASE' )
|
70 |
+
);
|
71 |
+
|
72 |
+
$statement = $db->prepare( "DELETE FROM wp_options WHERE option_name LIKE 'tinypng_%'" );
|
73 |
+
$statement->execute();
|
74 |
+
$statement = $db->prepare( "DELETE FROM wp_usermeta WHERE meta_key LIKE 'tinypng_%'" );
|
75 |
+
$statement->execute();
|
76 |
}
|
77 |
|
78 |
function clear_uploads() {
|
79 |
+
$db = new mysqli( getenv( 'HOST' ), 'root',
|
80 |
+
getenv( 'MYSQL_PWD' ),
|
81 |
+
getenv( 'WORDPRESS_DATABASE' )
|
82 |
+
);
|
83 |
+
|
84 |
+
$statement = $db->prepare( "DELETE wp_postmeta FROM wp_postmeta JOIN wp_posts ON wp_posts.ID = wp_postmeta.post_id WHERE wp_posts.post_type = 'attachment'" );
|
85 |
+
$statement->execute();
|
86 |
+
$statement = $db->prepare( "DELETE FROM wp_posts WHERE wp_posts.post_type = 'attachment'" );
|
87 |
+
$statement->execute();
|
88 |
+
|
89 |
+
shell_exec( 'docker-compose exec wordpress rm -rf wp-content/uploads' );
|
90 |
}
|
91 |
|
92 |
function is_wordpress_setup() {
|
93 |
+
$db = new mysqli( getenv( 'HOST' ), 'root',
|
94 |
+
getenv( 'MYSQL_PWD' )
|
95 |
+
);
|
96 |
+
|
97 |
+
if ( $result = $db->query( "SELECT * FROM information_schema.tables WHERE table_schema = '" . getenv( 'WORDPRESS_DATABASE' ) . "'" ) ) {
|
98 |
+
return $result->num_rows > 0;
|
99 |
+
} else {
|
100 |
+
return false;
|
101 |
+
}
|
102 |
+
}
|
103 |
+
|
104 |
+
function setup_wordpress_language( $driver ) {
|
105 |
+
$driver->get( wordpress( '/wp-admin/install.php' ) );
|
106 |
+
$driver->findElement( WebDriverBy::tagName( 'form' ) )->submit();
|
107 |
+
}
|
108 |
+
|
109 |
+
function setup_wordpress_site( $driver ) {
|
110 |
+
if ( $driver->getCurrentURL() != wordpress( '/wp-admin/install.php?step=1' ) ) {
|
111 |
+
$driver->get( wordpress( '/wp-admin/install.php' ) );
|
112 |
+
}
|
113 |
+
$driver->findElement( WebDriverBy::name( 'weblog_title' ) )->sendKeys( 'Wordpress test' );
|
114 |
+
$driver->findElement( WebDriverBy::name( 'user_name' ) )->clear()->sendKeys( 'admin' );
|
115 |
+
if ( wordpress_version() > 42 ) {
|
116 |
+
$driver->findElement( WebDriverBy::id( 'pass1-text' ) )->clear()->sendKeys( 'a' )->sendKeys( 'dmin' );
|
117 |
+
} else {
|
118 |
+
$driver->findElement( WebDriverBy::name( 'admin_password' ) )->sendKeys( 'admin' );
|
119 |
+
$driver->findElement( WebDriverBy::name( 'admin_password2' ) )->sendKeys( 'admin' );
|
120 |
+
}
|
121 |
+
$driver->findElement( WebDriverBy::name( 'admin_email' ) )->sendKeys( 'developers@voormedia.com' );
|
122 |
+
$driver->findElement( WebDriverBy::tagName( 'form' ) )->submit();
|
123 |
+
|
124 |
+
$h1s = $driver->findElements( WebDriverBy::tagName( 'h1' ) );
|
125 |
+
$texts = array_map( function( $h1 ) {
|
126 |
+
return $h1->getText();
|
127 |
+
}, $h1s );
|
128 |
+
|
129 |
+
if ( array_search( 'Success', $texts ) >= 0 ) {
|
130 |
+
print "Setting up WordPress is successful.\n";
|
131 |
+
} else {
|
132 |
+
var_dump( $driver->getPageSource() );
|
133 |
+
throw new UnexpectedValueException( 'Setting up WordPress failed.' );
|
134 |
+
}
|
135 |
+
}
|
136 |
+
|
137 |
+
function login( $driver ) {
|
138 |
+
print 'Logging in to WordPress... ';
|
139 |
+
|
140 |
+
try {
|
141 |
+
$driver->get( wordpress( '/wp-login.php' ) );
|
142 |
+
|
143 |
+
usleep( 250000 );
|
144 |
+
|
145 |
+
$driver->findElement( WebDriverBy::id( 'user_login' ) )->sendKeys( 'admin' );
|
146 |
+
$driver->findElement( WebDriverBy::id( 'user_pass' ) )->sendKeys( 'admin' );
|
147 |
+
$driver->findElement( WebDriverBy::id( 'loginform' ) )->submit();
|
148 |
+
|
149 |
+
$driver
|
150 |
+
->wait( 2 )
|
151 |
+
->until(
|
152 |
+
WebDriverExpectedCondition::presenceOfElementLocated(
|
153 |
+
WebDriverBy::cssSelector( 'div.wrap h1, div.wrap h2' )
|
154 |
+
)
|
155 |
+
);
|
156 |
+
} catch (Exception $e) {
|
157 |
+
var_dump( $driver->getPageSource() );
|
158 |
+
print( $e );
|
159 |
+
throw new UnexpectedValueException( 'Login failed.' );
|
160 |
+
}
|
161 |
+
}
|
162 |
+
|
163 |
+
function activate_plugin( $driver ) {
|
164 |
+
$driver->get( wordpress( '/wp-admin/plugins.php' ) );
|
165 |
+
$activate_links = $driver->findElements( WebDriverBy::xpath( '//a[starts-with(@href, "plugins.php?action=activate&plugin=tiny-compress-images")]' ) );
|
166 |
+
$deactivate_links = $driver->findElements( WebDriverBy::xpath( '//a[starts-with(@href, "plugins.php?action=deactivate&plugin=tiny-compress-images")]' ) );
|
167 |
+
if ( count( $activate_links ) > 0 ) {
|
168 |
+
$activate_links[0]->click();
|
169 |
+
} elseif ( count( $deactivate_links ) > 0 ) {
|
170 |
+
print "Plugin already activated.\n";
|
171 |
+
} else {
|
172 |
+
var_dump( $driver->getPageSource() );
|
173 |
+
throw new UnexpectedValueException( 'Activating plugin failed.' );
|
174 |
+
}
|
175 |
+
$driver->get( wordpress( '/wp-admin/upload.php?mode=list' ) );
|
176 |
}
|
177 |
|
178 |
function close_webdriver() {
|
179 |
+
if ( isset( $GLOBALS['global_session_id'] ) && isset( $GLOBALS['global_webdriver_host'] ) ) {
|
180 |
+
RemoteWebDriver::createBySessionId( $GLOBALS['global_session_id'], $GLOBALS['global_webdriver_host'] )->close();
|
181 |
+
}
|
182 |
}
|
183 |
|
184 |
function reset_webservice() {
|
185 |
+
$request = curl_init();
|
186 |
+
curl_setopt_array($request, array(
|
187 |
+
CURLOPT_URL => 'http://' . getenv( 'HOST' ) .':8080/reset',
|
188 |
+
));
|
189 |
+
$response = curl_exec( $request );
|
190 |
+
curl_close( $request );
|
191 |
}
|
192 |
|
193 |
// $global_webdriver_host = 'http://127.0.0.1:4444/wd/hub';
|
194 |
// $global_driver = RemoteWebDriver::create($global_webdriver_host, DesiredCapabilities::firefox());
|
195 |
$global_webdriver_host = 'http://127.0.0.1:8910';
|
196 |
+
$global_driver = RemoteWebDriver::create( $global_webdriver_host, DesiredCapabilities::phantomjs() );
|
197 |
$global_session_id = $global_driver->getSessionID();
|
198 |
+
$window = new WebDriverDimension( 1280, 1024 );
|
199 |
+
$global_driver->manage()->window()->setSize( $window );
|
200 |
|
201 |
+
register_shutdown_function( 'close_webdriver' );
|
202 |
+
register_shutdown_function( 'restore_wordpress' );
|
203 |
|
204 |
+
configure_wordpress_for_testing( $global_driver );
|
205 |
+
print "\n";
|
test/helpers/wordpress.php
CHANGED
@@ -1,245 +1,243 @@
|
|
1 |
<?php
|
2 |
|
|
|
|
|
|
|
3 |
use org\bovigo\vfs\vfsStream;
|
4 |
use org\bovigo\vfs\content\LargeFileContent;
|
5 |
|
6 |
class WordPressOptions {
|
7 |
-
|
8 |
-
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
}
|
35 |
|
36 |
class WordPressStubs {
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
|
166 |
-
|
167 |
-
|
168 |
-
|
169 |
-
|
170 |
-
|
171 |
-
|
172 |
-
|
173 |
-
|
174 |
-
|
175 |
-
|
176 |
-
|
177 |
-
|
178 |
-
|
179 |
-
|
180 |
-
|
181 |
-
|
182 |
-
|
183 |
-
|
184 |
-
|
185 |
-
|
186 |
-
|
187 |
-
|
188 |
-
|
189 |
-
|
190 |
-
|
191 |
-
|
192 |
-
|
193 |
-
|
194 |
-
|
195 |
-
|
196 |
-
|
197 |
-
|
198 |
-
|
199 |
-
|
200 |
-
|
201 |
-
|
202 |
-
|
203 |
-
|
204 |
-
|
205 |
-
|
206 |
-
|
207 |
-
|
208 |
-
|
209 |
-
|
210 |
-
|
211 |
-
|
212 |
-
|
213 |
-
|
214 |
-
|
215 |
-
|
216 |
-
|
217 |
-
|
218 |
-
|
219 |
-
|
220 |
-
|
221 |
-
|
222 |
-
|
223 |
-
|
224 |
-
|
225 |
-
|
226 |
-
foreach ($dir->getChildren() as $child) {
|
227 |
-
$file = $child->getName();
|
228 |
-
if (preg_match($regex, $file, $match)) {
|
229 |
-
$metadata['sizes'][$match[1]] = array('file' => $file);
|
230 |
-
}
|
231 |
-
}
|
232 |
-
|
233 |
-
return $metadata;
|
234 |
-
}
|
235 |
}
|
236 |
|
237 |
class WP_HTTP_Proxy {
|
238 |
-
|
239 |
-
|
240 |
-
|
|
|
|
|
|
|
|
|
241 |
}
|
242 |
|
243 |
-
function
|
244 |
-
|
245 |
}
|
1 |
<?php
|
2 |
|
3 |
+
define( 'ABSPATH', dirname( dirname( __FILE__ ) ) . '/' );
|
4 |
+
define( 'WPINC', 'wp-includes' );
|
5 |
+
|
6 |
use org\bovigo\vfs\vfsStream;
|
7 |
use org\bovigo\vfs\content\LargeFileContent;
|
8 |
|
9 |
class WordPressOptions {
|
10 |
+
private $values;
|
11 |
+
|
12 |
+
public function __construct() {
|
13 |
+
$this->values = array(
|
14 |
+
'thumbnail_size_w' => 150,
|
15 |
+
'thumbnail_size_h' => 150,
|
16 |
+
'medium_size_w' => 300,
|
17 |
+
'medium_size_h' => 300,
|
18 |
+
'large_size_w' => 1024,
|
19 |
+
'large_size_h' => 1024,
|
20 |
+
);
|
21 |
+
}
|
22 |
+
|
23 |
+
public function set( $key, $value ) {
|
24 |
+
if ( preg_match( '#^(.+)\[(.+)\]$#', $key, $match ) ) {
|
25 |
+
if ( ! isset( $this->values[ $match[1] ] ) ) {
|
26 |
+
$this->values[ $match[1] ] = array();
|
27 |
+
}
|
28 |
+
$this->values[ $match[1] ][ $match[2] ] = $value;
|
29 |
+
} else {
|
30 |
+
$this->values[ $key ] = $value;
|
31 |
+
}
|
32 |
+
}
|
33 |
+
|
34 |
+
public function get( $key, $default = null ) {
|
35 |
+
return isset( $this->values[ $key ] ) ? $this->values[ $key ] : $default;
|
36 |
+
}
|
37 |
}
|
38 |
|
39 |
class WordPressStubs {
|
40 |
+
const UPLOAD_DIR = 'wp-content/uploads';
|
41 |
+
|
42 |
+
private $vfs;
|
43 |
+
private $initFunctions;
|
44 |
+
private $admin_initFunctions;
|
45 |
+
private $options;
|
46 |
+
private $metadata;
|
47 |
+
private $calls;
|
48 |
+
private $stubs;
|
49 |
+
|
50 |
+
public function __construct( $vfs ) {
|
51 |
+
$GLOBALS['wp'] = $this;
|
52 |
+
$this->vfs = $vfs;
|
53 |
+
$this->addMethod( 'add_action' );
|
54 |
+
$this->addMethod( 'add_filter' );
|
55 |
+
$this->addMethod( 'register_setting' );
|
56 |
+
$this->addMethod( 'add_settings_section' );
|
57 |
+
$this->addMethod( 'add_settings_field' );
|
58 |
+
$this->addMethod( 'get_option' );
|
59 |
+
$this->addMethod( 'get_site_option' );
|
60 |
+
$this->addMethod( 'update_site_option' );
|
61 |
+
$this->addMethod( 'get_post_meta' );
|
62 |
+
$this->addMethod( 'update_post_meta' );
|
63 |
+
$this->addMethod( 'get_intermediate_image_sizes' );
|
64 |
+
$this->addMethod( 'add_image_size' );
|
65 |
+
$this->addMethod( 'translate' );
|
66 |
+
$this->addMethod( 'load_plugin_textdomain' );
|
67 |
+
$this->addMethod( 'get_post_mime_type' );
|
68 |
+
$this->addMethod( 'get_plugin_data' );
|
69 |
+
$this->addMethod( 'wp_upload_dir' );
|
70 |
+
$this->addMethod( 'plugin_basename' );
|
71 |
+
$this->addMethod( 'is_multisite' );
|
72 |
+
$this->addMethod( 'current_user_can' );
|
73 |
+
$this->addMethod( 'wp_get_attachment_metadata' );
|
74 |
+
$this->addMethod( 'is_admin' );
|
75 |
+
$this->defaults();
|
76 |
+
$this->create_filesystem();
|
77 |
+
}
|
78 |
+
|
79 |
+
public function create_filesystem() {
|
80 |
+
vfsStream::newDirectory( self::UPLOAD_DIR )
|
81 |
+
->at( $this->vfs );
|
82 |
+
}
|
83 |
+
|
84 |
+
public function defaults() {
|
85 |
+
$this->initFunctions = array();
|
86 |
+
$this->admin_initFunctions = array();
|
87 |
+
$this->options = new WordPressOptions();
|
88 |
+
$this->metadata = array();
|
89 |
+
$GLOBALS['_wp_additional_image_sizes'] = array();
|
90 |
+
}
|
91 |
+
|
92 |
+
public function call( $method, $args ) {
|
93 |
+
$this->calls[ $method ][] = $args;
|
94 |
+
if ( 'add_action' === $method ) {
|
95 |
+
if ( 'init' === $args[0] ) {
|
96 |
+
$this->initFunctions[] = $args[1];
|
97 |
+
} elseif ( 'admin_init' === $args[0] ) {
|
98 |
+
$this->admin_initFunctions[] = $args[1];
|
99 |
+
}
|
100 |
+
}
|
101 |
+
if ( 'translate' === $method ) {
|
102 |
+
return $args[0];
|
103 |
+
} elseif ( 'get_option' === $method ) {
|
104 |
+
return call_user_func_array( array( $this->options, 'get' ), $args );
|
105 |
+
} elseif ( 'get_post_meta' === $method ) {
|
106 |
+
return call_user_func_array( array( $this, 'getMetadata' ), $args );
|
107 |
+
} elseif ( 'add_image_size' === $method ) {
|
108 |
+
return call_user_func_array( array( $this, 'addImageSize' ), $args );
|
109 |
+
} elseif ( 'update_post_meta' === $method ) {
|
110 |
+
return call_user_func_array( array( $this, 'updateMetadata' ), $args );
|
111 |
+
} elseif ( 'get_intermediate_image_sizes' === $method ) {
|
112 |
+
return array_merge( array( 'thumbnail', 'medium', 'large' ), array_keys( $GLOBALS['_wp_additional_image_sizes'] ) );
|
113 |
+
} elseif ( 'get_plugin_data' === $method ) {
|
114 |
+
return array( 'Version' => '1.7.2' );
|
115 |
+
} elseif ( 'wp_upload_dir' === $method ) {
|
116 |
+
return array( 'basedir' => $this->vfs->url() . '/' . self::UPLOAD_DIR, 'baseurl' => '/' . self::UPLOAD_DIR );
|
117 |
+
} elseif ( 'is_admin' === $method ) {
|
118 |
+
return true;
|
119 |
+
} elseif ( $this->stubs[ $method ] ) {
|
120 |
+
return call_user_func_array( $this->stubs[ $method ], $args );
|
121 |
+
}
|
122 |
+
}
|
123 |
+
|
124 |
+
public function addMethod( $method ) {
|
125 |
+
$this->calls[ $method ] = array();
|
126 |
+
$this->stubs[ $method ] = array();
|
127 |
+
if ( ! function_exists( $method ) ) {
|
128 |
+
eval( "function $method() { return \$GLOBALS['wp']->call('$method', func_get_args()); }" );
|
129 |
+
}
|
130 |
+
}
|
131 |
+
|
132 |
+
public function addOption( $key, $value ) {
|
133 |
+
$this->options->set( $key, $value );
|
134 |
+
}
|
135 |
+
|
136 |
+
public function addImageSize( $size, $values ) {
|
137 |
+
$GLOBALS['_wp_additional_image_sizes'][ $size ] = $values;
|
138 |
+
}
|
139 |
+
|
140 |
+
public function getMetadata( $id, $key, $single = false ) {
|
141 |
+
$values = isset( $this->metadata[ $id ] ) ? $this->metadata[ $id ] : array();
|
142 |
+
$value = isset( $values[ $key ] ) ? $values[ $key ] : '';
|
143 |
+
return $single ? $value : array( $value );
|
144 |
+
}
|
145 |
+
|
146 |
+
public function updateMetadata( $id, $key, $values ) {
|
147 |
+
$this->metadata[ $id ][ $key ] = $values;
|
148 |
+
}
|
149 |
+
|
150 |
+
public function setTinyMetadata( $id, $values ) {
|
151 |
+
$this->metadata[ $id ] = array( Tiny_Image::META_KEY => $values );
|
152 |
+
}
|
153 |
+
|
154 |
+
public function getCalls( $method ) {
|
155 |
+
return $this->calls[ $method ];
|
156 |
+
}
|
157 |
+
|
158 |
+
public function init() {
|
159 |
+
foreach ( $this->initFunctions as $func ) {
|
160 |
+
call_user_func( $func );
|
161 |
+
}
|
162 |
+
}
|
163 |
+
|
164 |
+
public function admin_init() {
|
165 |
+
foreach ( $this->admin_initFunctions as $func ) {
|
166 |
+
call_user_func( $func );
|
167 |
+
}
|
168 |
+
}
|
169 |
+
|
170 |
+
public function stub( $method, $func ) {
|
171 |
+
$this->stubs[ $method ] = $func;
|
172 |
+
}
|
173 |
+
|
174 |
+
public function createImage( $file_size, $path, $name ) {
|
175 |
+
if ( ! $this->vfs->hasChild( self::UPLOAD_DIR . "/$path" ) ) {
|
176 |
+
vfsStream::newDirectory( self::UPLOAD_DIR . "/$path" )->at( $this->vfs );
|
177 |
+
}
|
178 |
+
$dir = $this->vfs->getChild( self::UPLOAD_DIR . "/$path" );
|
179 |
+
|
180 |
+
vfsStream::newFile( $name )
|
181 |
+
->withContent( new LargeFileContent( $file_size ) )
|
182 |
+
->at( $dir );
|
183 |
+
}
|
184 |
+
|
185 |
+
public function createImages( $sizes = null, $original_size = 12345, $path = '14/01', $name = 'test' ) {
|
186 |
+
vfsStream::newDirectory( self::UPLOAD_DIR . "/$path" )->at( $this->vfs );
|
187 |
+
$dir = $this->vfs->getChild( self::UPLOAD_DIR . '/' . $path );
|
188 |
+
|
189 |
+
vfsStream::newFile( "$name.png" )
|
190 |
+
->withContent( new LargeFileContent( $original_size ) )
|
191 |
+
->at( $dir );
|
192 |
+
|
193 |
+
if ( is_null( $sizes ) ) {
|
194 |
+
$sizes = array( 'thumbnail' => 100, 'medium' => 1000 , 'large' => 10000, 'post-thumbnail' => 1234 );
|
195 |
+
}
|
196 |
+
|
197 |
+
foreach ( $sizes as $key => $size ) {
|
198 |
+
vfsStream::newFile( "$name-$key.png" )
|
199 |
+
->withContent( new LargeFileContent( $size ) )
|
200 |
+
->at( $dir );
|
201 |
+
}
|
202 |
+
}
|
203 |
+
|
204 |
+
public function createImagesFromJSON( $virtual_images ) {
|
205 |
+
foreach ( $virtual_images['images'] as $image ) {
|
206 |
+
self::createImage( $image['size'], $virtual_images['path'], $image['file'] );
|
207 |
+
}
|
208 |
+
}
|
209 |
+
|
210 |
+
public function getTestMetadata( $path = '14/01', $name = 'test' ) {
|
211 |
+
$metadata = array(
|
212 |
+
'file' => "$path/$name.png",
|
213 |
+
'width' => 4000,
|
214 |
+
'height' => 3000,
|
215 |
+
'sizes' => array(),
|
216 |
+
);
|
217 |
+
|
218 |
+
$regex = '#^' . preg_quote( $name ) .'-([^.]+)[.](png|jpe?g)$#';
|
219 |
+
$dir = $this->vfs->getChild( self::UPLOAD_DIR . "/$path" );
|
220 |
+
foreach ( $dir->getChildren() as $child ) {
|
221 |
+
$file = $child->getName();
|
222 |
+
if ( preg_match( $regex, $file, $match ) ) {
|
223 |
+
$metadata['sizes'][ $match[1] ] = array( 'file' => $file );
|
224 |
+
}
|
225 |
+
}
|
226 |
+
|
227 |
+
return $metadata;
|
228 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
229 |
}
|
230 |
|
231 |
class WP_HTTP_Proxy {
|
232 |
+
public function is_enabled() {
|
233 |
+
return false;
|
234 |
+
}
|
235 |
+
}
|
236 |
+
|
237 |
+
function __( $text, $domain = 'default' ) {
|
238 |
+
return translate( $text, $domain );
|
239 |
}
|
240 |
|
241 |
+
function esc_html__( $text, $domain = 'default' ) {
|
242 |
+
return translate( $text, $domain );
|
243 |
}
|
test/integration/BulkCompressIntegrationTest.php
DELETED
@@ -1,82 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
require_once(dirname(__FILE__) . "/IntegrationTestCase.php");
|
4 |
-
|
5 |
-
use Facebook\WebDriver\WebDriverBy;
|
6 |
-
use Facebook\WebDriver\WebDriverExpectedCondition;
|
7 |
-
|
8 |
-
class BulkCompressIntegrationTest extends IntegrationTestCase {
|
9 |
-
|
10 |
-
public function setUp() {
|
11 |
-
parent::setUp();
|
12 |
-
}
|
13 |
-
|
14 |
-
public function tearDown() {
|
15 |
-
clear_settings();
|
16 |
-
clear_uploads();
|
17 |
-
reset_webservice();
|
18 |
-
}
|
19 |
-
|
20 |
-
public function testBulkCompressActionShouldBePresentInMedia() {
|
21 |
-
$this->upload_media(dirname(__FILE__) . '/../fixtures/input-example.png');
|
22 |
-
$this->assertEquals('Compress All Images', self::$driver->findElement(
|
23 |
-
WebDriverBy::cssSelector('select[name="action"] option[value="tiny_bulk_compress"]')
|
24 |
-
)->getText());
|
25 |
-
}
|
26 |
-
|
27 |
-
private function prepare($normal=1, $large=0) {
|
28 |
-
$this->set_api_key('PNG123');
|
29 |
-
$this->enable_compression_sizes(array());
|
30 |
-
|
31 |
-
for ($i = 0; $i < $normal; $i++) {
|
32 |
-
$this->upload_media(dirname(__FILE__) . '/../fixtures/input-example.jpg');
|
33 |
-
}
|
34 |
-
for ($i = 0; $i < $large; $i++) {
|
35 |
-
$this->upload_media(dirname(__FILE__) . '/../fixtures/input-example.png');
|
36 |
-
}
|
37 |
-
|
38 |
-
$this->upload_media(dirname(__FILE__) . '/../fixtures/input-example.gif');
|
39 |
-
$this->upload_media(dirname(__FILE__) . '/../fixtures/input-example.pdf');
|
40 |
-
|
41 |
-
$this->enable_compression_sizes(array('thumbnail', 'medium', 'large'));
|
42 |
-
}
|
43 |
-
|
44 |
-
public function testBulkCompressFromMediaShouldOnlyCompressSelected() {
|
45 |
-
$this->prepare(1, 2);
|
46 |
-
|
47 |
-
self::$driver->get(wordpress('/wp-admin/upload.php?orderby=title&order=asc'));
|
48 |
-
|
49 |
-
$checkboxes = self::$driver->findElements(WebDriverBy::cssSelector('tbody input[type="checkbox"]'));
|
50 |
-
$checkboxes[0]->click();
|
51 |
-
|
52 |
-
self::$driver->findElement(WebDriverBy::cssSelector('select[name="action"] option[value="tiny_bulk_compress"]'))->click();
|
53 |
-
self::$driver->findElement(WebDriverBy::cssSelector('div.actions input[value="Apply"]'))->click();
|
54 |
-
|
55 |
-
self::$driver->wait(3)->until(WebDriverExpectedCondition::textToBePresentInElement(
|
56 |
-
WebDriverBy::cssSelector('.updated'), 'All images are processed'));
|
57 |
-
|
58 |
-
$this->assertEquals('1', self::$driver->findElement(WebDriverBy::cssSelector('#tiny-progress span'))->getText());
|
59 |
-
$this->assertEquals('input-example', self::$driver->findElement(WebDriverBy::cssSelector('.media-item .filename'))->getText());
|
60 |
-
}
|
61 |
-
|
62 |
-
public function testBulkCompressShouldCompressAll() {
|
63 |
-
$this->prepare(1, 1);
|
64 |
-
|
65 |
-
self::$driver->get(wordpress('/wp-admin/upload.php?page=tiny-bulk-compress.php'));
|
66 |
-
$elements = self::$driver->findElements(WebDriverBy::cssSelector('#tiny-bulk-compress p'));
|
67 |
-
$this->assertContains('2 images', $elements[1]->getText());
|
68 |
-
|
69 |
-
self::$driver->findElement(WebDriverBy::cssSelector('#tiny-bulk-compress button'))->click();
|
70 |
-
self::$driver->wait(2)->until(WebDriverExpectedCondition::textToBePresentInElement(
|
71 |
-
WebDriverBy::cssSelector('.updated'), 'All images are processed'));
|
72 |
-
|
73 |
-
$elements = self::$driver->findElements(WebDriverBy::cssSelector('.media-item .filename'));
|
74 |
-
$filenames = array_map('innerText', $elements);
|
75 |
-
|
76 |
-
$this->assertEquals(2, count($filenames));
|
77 |
-
$this->assertContains('input-example', $filenames);
|
78 |
-
|
79 |
-
$this->assertEquals('2', self::$driver->findElement(WebDriverBy::cssSelector('#tiny-progress span'))->getText());
|
80 |
-
$this->assertEquals('4', self::$driver->findElement(WebDriverBy::cssSelector('#tiny-status span'))->getText());
|
81 |
-
}
|
82 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
test/integration/BulkOptimizationIntegrationTest.php
ADDED
@@ -0,0 +1,80 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
require_once dirname( __FILE__ ) . '/IntegrationTestCase.php';
|
4 |
+
|
5 |
+
class BulkOptimizationIntegrationTest extends IntegrationTestCase {
|
6 |
+
public function tear_down() {
|
7 |
+
parent::tear_down();
|
8 |
+
clear_settings();
|
9 |
+
clear_uploads();
|
10 |
+
}
|
11 |
+
|
12 |
+
public function test_summary_should_display_correct_values_for_empty_library() {
|
13 |
+
$this->enable_compression_sizes( array( '0', 'thumbnail', 'medium' ) );
|
14 |
+
|
15 |
+
$this->visit( '/wp-admin/upload.php?page=tiny-bulk-optimization' );
|
16 |
+
|
17 |
+
$this->assertEquals( '0', $this->find( '#uploaded-images' )->getText() );
|
18 |
+
$this->assertEquals( '0', $this->find( '#optimizable-image-sizes' )->getText() );
|
19 |
+
$this->assertEquals( '$ 0.00', $this->find( '#estimated-cost' )->getText() );
|
20 |
+
$this->assertEquals( '0', $this->find( '#optimized-image-sizes' )->getText() );
|
21 |
+
|
22 |
+
$this->assertEquals( '-', $this->find( '#unoptimized-library-size' )->getText() );
|
23 |
+
$this->assertEquals( '-', $this->find( '#optimized-library-size' )->getText() );
|
24 |
+
$this->assertEquals( '0%', $this->find( '#savings-percentage' )->getText() );
|
25 |
+
|
26 |
+
$this->assertEquals( '0 / 0 (100%)', $this->find( '#compression-progress-bar' )->getText() );
|
27 |
+
}
|
28 |
+
|
29 |
+
public function test_summary_should_display_correct_values() {
|
30 |
+
$this->set_api_key( 'JPG123' );
|
31 |
+
|
32 |
+
$this->enable_compression_sizes( array() );
|
33 |
+
$this->upload_media( 'test/fixtures/input-example.jpg' );
|
34 |
+
|
35 |
+
$this->enable_compression_sizes( array( '0' ) );
|
36 |
+
$this->upload_media( 'test/fixtures/input-example.jpg' );
|
37 |
+
|
38 |
+
$this->enable_compression_sizes( array( '0', 'thumbnail', 'medium' ) );
|
39 |
+
$this->upload_media( 'test/fixtures/input-example.jpg' );
|
40 |
+
|
41 |
+
$this->visit( '/wp-admin/upload.php?page=tiny-bulk-optimization' );
|
42 |
+
|
43 |
+
$this->assertEquals( '3', $this->find( '#uploaded-images' )->getText() );
|
44 |
+
$this->assertEquals( '5', $this->find( '#optimizable-image-sizes' )->getText() );
|
45 |
+
$this->assertEquals( '$ 0.00', $this->find( '#estimated-cost' )->getText() );
|
46 |
+
$this->assertEquals( '4', $this->find( '#optimized-image-sizes' )->getText() );
|
47 |
+
|
48 |
+
$this->assertRegExp( '/[23](\.\d+)? MB/', $this->find( '#unoptimized-library-size' )->getText() );
|
49 |
+
$this->assertRegExp( '/[12](\.\d+)? MB/', $this->find( '#optimized-library-size' )->getText() );
|
50 |
+
$this->assertRegExp( '/2\d(\.\d+)?%/', $this->find( '#savings-percentage' )->getText() );
|
51 |
+
|
52 |
+
$this->assertEquals( '4 / 9 (44%)', $this->find( '#compression-progress-bar' )->getText() );
|
53 |
+
}
|
54 |
+
|
55 |
+
public function test_start_bulk_optimization_should_optimize_remaining_images() {
|
56 |
+
$this->set_api_key( 'JPG123' );
|
57 |
+
|
58 |
+
$this->enable_compression_sizes( array() );
|
59 |
+
$this->upload_media( 'test/fixtures/input-example.jpg' );
|
60 |
+
|
61 |
+
$this->enable_compression_sizes( array( '0' ) );
|
62 |
+
$this->upload_media( 'test/fixtures/input-example.jpg' );
|
63 |
+
|
64 |
+
$this->enable_compression_sizes( array( '0', 'thumbnail', 'medium' ) );
|
65 |
+
$this->upload_media( 'test/fixtures/input-example.jpg' );
|
66 |
+
|
67 |
+
$this->visit( '/wp-admin/upload.php?page=tiny-bulk-optimization' );
|
68 |
+
|
69 |
+
$this->assertEquals( '5', $this->find( '#optimizable-image-sizes' )->getText() );
|
70 |
+
|
71 |
+
$this->find_button( 'Start Bulk Optimization' )->click();
|
72 |
+
|
73 |
+
$this->wait_for_text(
|
74 |
+
'#optimizable-image-sizes',
|
75 |
+
'0'
|
76 |
+
);
|
77 |
+
|
78 |
+
$this->assertEquals( '9 / 9 (100%)', $this->find( '#compression-progress-bar' )->getText() );
|
79 |
+
}
|
80 |
+
}
|
test/integration/CompressIntegrationTest.php
CHANGED
@@ -1,278 +1,358 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
require_once
|
4 |
-
|
5 |
-
use Facebook\WebDriver\WebDriverBy;
|
6 |
-
use Facebook\WebDriver\WebDriverExpectedCondition;
|
7 |
|
8 |
class CompressIntegrationTest extends IntegrationTestCase {
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
|
166 |
-
|
167 |
-
|
168 |
-
|
169 |
-
|
170 |
-
|
171 |
-
|
172 |
-
|
173 |
-
|
174 |
-
|
175 |
-
|
176 |
-
|
177 |
-
|
178 |
-
|
179 |
-
|
180 |
-
|
181 |
-
|
182 |
-
|
183 |
-
|
184 |
-
|
185 |
-
|
186 |
-
|
187 |
-
|
188 |
-
|
189 |
-
|
190 |
-
|
191 |
-
|
192 |
-
|
193 |
-
|
194 |
-
|
195 |
-
|
196 |
-
|
197 |
-
|
198 |
-
|
199 |
-
|
200 |
-
|
201 |
-
|
202 |
-
|
203 |
-
|
204 |
-
|
205 |
-
|
206 |
-
|
207 |
-
|
208 |
-
|
209 |
-
|
210 |
-
|
211 |
-
|
212 |
-
|
213 |
-
|
214 |
-
|
215 |
-
|
216 |
-
|
217 |
-
|
218 |
-
|
219 |
-
|
220 |
-
|
221 |
-
|
222 |
-
|
223 |
-
|
224 |
-
|
225 |
-
|
226 |
-
|
227 |
-
|
228 |
-
|
229 |
-
|
230 |
-
|
231 |
-
|
232 |
-
|
233 |
-
|
234 |
-
|
235 |
-
|
236 |
-
|
237 |
-
|
238 |
-
|
239 |
-
|
240 |
-
|
241 |
-
|
242 |
-
|
243 |
-
|
244 |
-
|
245 |
-
|
246 |
-
|
247 |
-
|
248 |
-
|
249 |
-
|
250 |
-
|
251 |
-
|
252 |
-
|
253 |
-
|
254 |
-
|
255 |
-
|
256 |
-
|
257 |
-
|
258 |
-
|
259 |
-
|
260 |
-
|
261 |
-
|
262 |
-
|
263 |
-
|
264 |
-
|
265 |
-
|
266 |
-
|
267 |
-
|
268 |
-
|
269 |
-
|
270 |
-
|
271 |
-
|
272 |
-
|
273 |
-
|
274 |
-
|
275 |
-
|
276 |
-
|
277 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
278 |
}
|
1 |
<?php
|
2 |
|
3 |
+
require_once dirname( __FILE__ ) . '/IntegrationTestCase.php';
|
|
|
|
|
|
|
4 |
|
5 |
class CompressIntegrationTest extends IntegrationTestCase {
|
6 |
+
public function tear_down() {
|
7 |
+
parent::tear_down();
|
8 |
+
clear_settings();
|
9 |
+
clear_uploads();
|
10 |
+
}
|
11 |
+
|
12 |
+
public function test_upload_without_key_should_show_error() {
|
13 |
+
$this->upload_media( 'test/fixtures/input-example.jpg' );
|
14 |
+
|
15 |
+
$this->assertContains(
|
16 |
+
'Latest error: Register an account or provide an API key first',
|
17 |
+
$this->find( 'td.tiny-compress-images' )->getText()
|
18 |
+
);
|
19 |
+
}
|
20 |
+
|
21 |
+
public function test_upload_with_invalid_key_should_show_error() {
|
22 |
+
$this->set_api_key( '1234' );
|
23 |
+
$this->upload_media( 'test/fixtures/input-example.jpg' );
|
24 |
+
|
25 |
+
$this->assertContains(
|
26 |
+
'Latest error: Credentials are invalid',
|
27 |
+
$this->find( 'td.tiny-compress-images' )->getText()
|
28 |
+
);
|
29 |
+
}
|
30 |
+
|
31 |
+
public function test_upload_with_limited_key_should_show_error() {
|
32 |
+
$this->set_api_key( 'LIMIT123' );
|
33 |
+
$this->upload_media( 'test/fixtures/input-example.jpg' );
|
34 |
+
|
35 |
+
$this->assertContains(
|
36 |
+
'Latest error: Your monthly limit has been exceeded',
|
37 |
+
$this->find( 'td.tiny-compress-images' )->getText()
|
38 |
+
);
|
39 |
+
}
|
40 |
+
|
41 |
+
public function test_upload_with_valid_key_should_show_sizes_compressed() {
|
42 |
+
$this->set_api_key( 'JPG123' );
|
43 |
+
$this->upload_media( 'test/fixtures/input-example.jpg' );
|
44 |
+
|
45 |
+
$this->assertContains(
|
46 |
+
'sizes compressed',
|
47 |
+
$this->find( 'td.tiny-compress-images' )->getText()
|
48 |
+
);
|
49 |
+
}
|
50 |
+
|
51 |
+
public function test_upload_with_gateway_timeout_should_show_error() {
|
52 |
+
$this->set_api_key( 'GATEWAYTIMEOUT' );
|
53 |
+
$this->enable_compression_sizes( array( 'medium' ) );
|
54 |
+
$this->upload_media( 'test/fixtures/input-example.jpg' );
|
55 |
+
|
56 |
+
$this->assertContains(
|
57 |
+
'Error while parsing response',
|
58 |
+
$this->find( 'td.tiny-compress-images' )->getText()
|
59 |
+
);
|
60 |
+
}
|
61 |
+
|
62 |
+
public function test_upload_with_incorrect_metadata_should_show_error() {
|
63 |
+
$this->set_api_key( 'PNG123 INVALID' );
|
64 |
+
$this->enable_compression_sizes( array( '0', 'medium' ) );
|
65 |
+
$this->enable_preserve( array( 'copyright' ) );
|
66 |
+
$this->upload_media( 'test/fixtures/input-example.jpg' );
|
67 |
+
|
68 |
+
$this->assertContains(
|
69 |
+
"Metadata key 'author' not supported",
|
70 |
+
$this->find( 'td.tiny-compress-images' )->getText()
|
71 |
+
);
|
72 |
+
}
|
73 |
+
|
74 |
+
public function test_upload_should_show_details_in_edit_screen() {
|
75 |
+
if ( ! $this->has_postbox_container() ) { return; }
|
76 |
+
$this->set_api_key( 'JPG123' );
|
77 |
+
$this->enable_compression_sizes( array() );
|
78 |
+
$this->upload_media( 'test/fixtures/input-example.jpg' );
|
79 |
+
$this->enable_compression_sizes( array( 'medium', 'large' ) );
|
80 |
+
$this->find_link( 'input-example' )->click();
|
81 |
+
|
82 |
+
$this->assertContains(
|
83 |
+
"JPEG and PNG optimization\n2 sizes to be compressed\nDetails\nCompress",
|
84 |
+
$this->find( 'div.postbox-container div.tiny-compress-images' )->getText()
|
85 |
+
);
|
86 |
+
}
|
87 |
+
|
88 |
+
public function test_upload_should_show_details_in_edit_screen_popup() {
|
89 |
+
if ( ! $this->has_postbox_container() ) { return; }
|
90 |
+
$this->set_api_key( 'PNG123' );
|
91 |
+
$this->enable_compression_sizes( array( 'medium', 'large' ) );
|
92 |
+
$this->upload_media( 'test/fixtures/input-example.png' );
|
93 |
+
|
94 |
+
$this->find_link( 'input-example' )->click();
|
95 |
+
$this->find( 'div.tiny-compress-images a.thickbox' )->click();
|
96 |
+
|
97 |
+
$this->assertContains(
|
98 |
+
'Compression details for input-example.png',
|
99 |
+
$this->find( 'div.tiny-compression-details' )->getText()
|
100 |
+
);
|
101 |
+
}
|
102 |
+
|
103 |
+
public function test_upload_should_show_compression_details_in_edit_screen_popup() {
|
104 |
+
if ( ! $this->has_postbox_container() ) { return; }
|
105 |
+
$this->set_api_key( 'JPG123' );
|
106 |
+
$this->enable_compression_sizes( array( 'medium', 'large' ) );
|
107 |
+
$this->upload_media( 'test/fixtures/input-example.jpg' );
|
108 |
+
|
109 |
+
$this->find_link( 'input-example' )->click();
|
110 |
+
$this->find( 'div.tiny-compress-images a.thickbox' )->click();
|
111 |
+
|
112 |
+
$rows = $this->find_all( 'div.tiny-compression-details tr' );
|
113 |
+
$rows = array_map( function( $row ) {
|
114 |
+
$cells = $this->find_all( 'td', $row );
|
115 |
+
if ( count( $cells ) > 0 ) {
|
116 |
+
return $cells[0]->getText();
|
117 |
+
}
|
118 |
+
}, $rows );
|
119 |
+
|
120 |
+
$rows = array_filter( $rows, function( $row ) {
|
121 |
+
return $row && in_array( $row, array(
|
122 |
+
'Original',
|
123 |
+
'Thumbnail',
|
124 |
+
'Medium',
|
125 |
+
'Large',
|
126 |
+
) );
|
127 |
+
});
|
128 |
+
|
129 |
+
$this->assertEquals(
|
130 |
+
array(
|
131 |
+
'Original',
|
132 |
+
'Large',
|
133 |
+
'Medium',
|
134 |
+
'Thumbnail',
|
135 |
+
),
|
136 |
+
array_values( $rows )
|
137 |
+
);
|
138 |
+
}
|
139 |
+
|
140 |
+
public function test_compress_button_in_edit_screen_should_compress_images() {
|
141 |
+
if ( ! $this->has_postbox_container() ) { return; }
|
142 |
+
$this->upload_media( 'test/fixtures/input-example.jpg' );
|
143 |
+
|
144 |
+
$this->set_api_key( 'JPG123' );
|
145 |
+
$this->enable_compression_sizes( array( 'medium', 'large' ) );
|
146 |
+
|
147 |
+
$this->find_link( 'input-example' )->click();
|
148 |
+
$this->find( 'div.tiny-compress-images button.tiny-compress' )->click();
|
149 |
+
|
150 |
+
$this->wait_for_text(
|
151 |
+
'div.tiny-compress-images',
|
152 |
+
'2 sizes compressed'
|
153 |
+
);
|
154 |
+
}
|
155 |
+
|
156 |
+
public function test_compress_button_should_compress_uncompressed_sizes() {
|
157 |
+
$this->set_api_key( 'JPG123' );
|
158 |
+
|
159 |
+
$this->enable_compression_sizes( array( 'medium' ) );
|
160 |
+
$this->upload_media( 'test/fixtures/input-example.jpg' );
|
161 |
+
$this->enable_compression_sizes( array( 'medium', 'thumbnail' ) );
|
162 |
+
|
163 |
+
$this->visit( '/wp-admin/upload.php' );
|
164 |
+
$this->assertContains(
|
165 |
+
'1 size compressed',
|
166 |
+
$this->find( 'td.tiny-compress-images' )->getText()
|
167 |
+
);
|
168 |
+
|
169 |
+
$this->assertContains(
|
170 |
+
'1 size to be compressed',
|
171 |
+
$this->find( 'td.tiny-compress-images' )->getText()
|
172 |
+
);
|
173 |
+
|
174 |
+
$this->find( 'td.tiny-compress-images button' )->click();
|
175 |
+
|
176 |
+
$this->wait_for_text(
|
177 |
+
'td.tiny-compress-images',
|
178 |
+
'2 sizes compressed'
|
179 |
+
);
|
180 |
+
}
|
181 |
+
|
182 |
+
public function test_compress_button_should_show_error_for_incorrect_json() {
|
183 |
+
$this->enable_compression_sizes( array() );
|
184 |
+
$this->upload_media( 'test/fixtures/input-example.jpg' );
|
185 |
+
$this->enable_compression_sizes( array( 'medium', 'large' ) );
|
186 |
+
|
187 |
+
$this->set_api_key( 'JSON1234' );
|
188 |
+
$this->visit( '/wp-admin/upload.php' );
|
189 |
+
|
190 |
+
$this->find( 'td.tiny-compress-images button' )->click();
|
191 |
+
$this->wait_for_text(
|
192 |
+
'td.tiny-compress-images',
|
193 |
+
'Error while parsing response'
|
194 |
+
);
|
195 |
+
}
|
196 |
+
|
197 |
+
public function test_limit_reached_dismiss_button_should_remove_error() {
|
198 |
+
$this->set_api_key( 'LIMIT123' );
|
199 |
+
$this->upload_media( 'test/fixtures/input-example.jpg' );
|
200 |
+
|
201 |
+
$this->find( '.tiny-notice button, .tiny-notice a.tiny-dismiss' )->click();
|
202 |
+
$this->wait_for_text_disappearance( 'a.tiny-dismiss', 'Dismiss' );
|
203 |
+
|
204 |
+
$this->visit( '/wp-admin/options-media.php' );
|
205 |
+
$this->assertEquals( 0, count( $this->find_all( 'div.error p' ) ) );
|
206 |
+
}
|
207 |
+
|
208 |
+
public function test_resize_fit_should_display_resized_text_in_library() {
|
209 |
+
$this->set_api_key( 'JPG123' );
|
210 |
+
$this->enable_resize(array(
|
211 |
+
'method' => 'fit',
|
212 |
+
'width' => 300,
|
213 |
+
'height' => 200,
|
214 |
+
));
|
215 |
+
|
216 |
+
$this->upload_media( 'test/fixtures/input-example.jpg' );
|
217 |
+
$this->find( 'td.tiny-compress-images a.thickbox' )->click();
|
218 |
+
|
219 |
+
$this->assertContains(
|
220 |
+
'resized to 300x200',
|
221 |
+
$this->find( 'div.tiny-compression-details' )->getText()
|
222 |
+
);
|
223 |
+
}
|
224 |
+
|
225 |
+
public function test_resize_fit_should_display_resized_text_in_edit_screen() {
|
226 |
+
if ( ! $this->has_postbox_container() ) { return; }
|
227 |
+
$this->set_api_key( 'JPG123' );
|
228 |
+
$this->enable_resize(array(
|
229 |
+
'method' => 'fit',
|
230 |
+
'width' => 300,
|
231 |
+
'height' => 200,
|
232 |
+
));
|
233 |
+
|
234 |
+
$this->upload_media( 'test/fixtures/input-example.jpg' );
|
235 |
+
$this->find_link( 'input-example' )->click();
|
236 |
+
|
237 |
+
$this->assertContains(
|
238 |
+
'Dimensions: 300 × 200',
|
239 |
+
$this->find( $this->postbox_dimension_selector() )->getText()
|
240 |
+
);
|
241 |
+
}
|
242 |
+
|
243 |
+
public function test_resize_scale_should_display_resized_text_in_library() {
|
244 |
+
$this->set_api_key( 'JPG123' );
|
245 |
+
$this->enable_resize(array(
|
246 |
+
'method' => 'scale',
|
247 |
+
'height' => 200,
|
248 |
+
));
|
249 |
+
|
250 |
+
$this->upload_media( 'test/fixtures/input-example.jpg' );
|
251 |
+
$this->find( 'td.tiny-compress-images a.thickbox' )->click();
|
252 |
+
|
253 |
+
$this->assertContains(
|
254 |
+
'resized to 300x200',
|
255 |
+
$this->find( 'div.tiny-compression-details' )->getText()
|
256 |
+
);
|
257 |
+
}
|
258 |
+
|
259 |
+
public function test_resize_scale_should_display_resized_text_in_edit_screen() {
|
260 |
+
if ( ! $this->has_postbox_container() ) { return; }
|
261 |
+
$this->set_api_key( 'JPG123' );
|
262 |
+
$this->enable_resize(array(
|
263 |
+
'method' => 'scale',
|
264 |
+
'height' => 200,
|
265 |
+
));
|
266 |
+
|
267 |
+
$this->upload_media( 'test/fixtures/input-example.jpg' );
|
268 |
+
$this->find_link( 'input-example' )->click();
|
269 |
+
|
270 |
+
$this->assertContains(
|
271 |
+
'Dimensions: 300 × 200',
|
272 |
+
$this->find( $this->postbox_dimension_selector() )->getText()
|
273 |
+
);
|
274 |
+
}
|
275 |
+
|
276 |
+
public function test_superfluous_resize_should_not_display_resized_text_in_library() {
|
277 |
+
$this->set_api_key( 'JPG123' );
|
278 |
+
$this->enable_resize(array(
|
279 |
+
'method' => 'fit',
|
280 |
+
'width' => 15000,
|
281 |
+
'height' => 15000,
|
282 |
+
));
|
283 |
+
|
284 |
+
$this->upload_media( 'test/fixtures/input-example.jpg' );
|
285 |
+
$this->find( 'td.tiny-compress-images a.thickbox' )->click();
|
286 |
+
|
287 |
+
$this->assertNotContains(
|
288 |
+
'resized',
|
289 |
+
$this->find( 'div.tiny-compression-details' )->getText()
|
290 |
+
);
|
291 |
+
}
|
292 |
+
|
293 |
+
public function test_superfluous_resize_should_display_original_dimensions_in_edit_screen() {
|
294 |
+
if ( ! $this->has_postbox_container() ) { return; }
|
295 |
+
$this->set_api_key( 'JPG123' );
|
296 |
+
$this->enable_resize(array(
|
297 |
+
'method' => 'fit',
|
298 |
+
'width' => 15000,
|
299 |
+
'height' => 15000,
|
300 |
+
));
|
301 |
+
|
302 |
+
$this->upload_media( 'test/fixtures/input-example.jpg' );
|
303 |
+
$this->find_link( 'input-example' )->click();
|
304 |
+
|
305 |
+
$this->assertContains(
|
306 |
+
'Dimensions: 1080 × 720',
|
307 |
+
$this->find( $this->postbox_dimension_selector() )->getText()
|
308 |
+
);
|
309 |
+
}
|
310 |
+
|
311 |
+
public function test_resize_disabled_should_not_display_resized_text_in_library() {
|
312 |
+
$this->set_api_key( 'JPG123' );
|
313 |
+
$this->disable_resize();
|
314 |
+
|
315 |
+
$this->upload_media( 'test/fixtures/input-example.jpg' );
|
316 |
+
$this->find( 'td.tiny-compress-images a.thickbox' )->click();
|
317 |
+
|
318 |
+
$this->assertNotContains(
|
319 |
+
'resized',
|
320 |
+
$this->find( 'div.tiny-compression-details' )->getText()
|
321 |
+
);
|
322 |
+
}
|
323 |
+
|
324 |
+
public function test_resize_disabled_should_display_original_dimensions_in_edit_screen() {
|
325 |
+
if ( ! $this->has_postbox_container() ) { return; }
|
326 |
+
$this->set_api_key( 'JPG123' );
|
327 |
+
$this->disable_resize();
|
328 |
+
|
329 |
+
$this->upload_media( 'test/fixtures/input-example.jpg' );
|
330 |
+
$this->find_link( 'input-example' )->click();
|
331 |
+
|
332 |
+
$this->assertContains(
|
333 |
+
'Dimensions: 1080 × 720',
|
334 |
+
$this->find( $this->postbox_dimension_selector() )->getText()
|
335 |
+
);
|
336 |
+
}
|
337 |
+
|
338 |
+
public function test_preserve_copyright_should_not_display_modification_in_library() {
|
339 |
+
$this->set_api_key( 'PRESERVEJPG123' );
|
340 |
+
$this->enable_preserve( array( 'copyright' ) );
|
341 |
+
$this->upload_media( 'test/fixtures/input-copyright.jpg' );
|
342 |
+
|
343 |
+
$this->assertNotContains(
|
344 |
+
'files modified after compression',
|
345 |
+
$this->find( 'div.tiny-compression-details' )->getText()
|
346 |
+
);
|
347 |
+
}
|
348 |
+
|
349 |
+
public function test_unsupported_format_should_not_show_compress_info_in_library() {
|
350 |
+
$this->upload_media( 'test/fixtures/input-example.gif' );
|
351 |
+
$this->assertEquals( '', $this->find( 'td.column-tiny-compress-images' )->getText() );
|
352 |
+
}
|
353 |
+
|
354 |
+
public function test_non_image_file_should_not_show_compress_info_in_library() {
|
355 |
+
$this->upload_media( 'test/fixtures/input-example.pdf' );
|
356 |
+
$this->assertEquals( '', $this->find( 'td.column-tiny-compress-images' )->getText() );
|
357 |
+
}
|
358 |
}
|
test/integration/IntegrationTestCase.php
CHANGED
@@ -1,140 +1,166 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
require
|
4 |
-
require
|
5 |
|
6 |
use Facebook\WebDriver\WebDriverBy;
|
7 |
use Facebook\WebDriver\WebDriverExpectedCondition;
|
8 |
use Facebook\WebDriver\Remote\RemoteWebDriver;
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
140 |
}
|
1 |
<?php
|
2 |
|
3 |
+
require dirname( __FILE__ ) . '/../unit/TinyTestCase.php';
|
4 |
+
require dirname( __FILE__ ) . '/../helpers/setup.php';
|
5 |
|
6 |
use Facebook\WebDriver\WebDriverBy;
|
7 |
use Facebook\WebDriver\WebDriverExpectedCondition;
|
8 |
use Facebook\WebDriver\Remote\RemoteWebDriver;
|
9 |
+
|
10 |
+
abstract class IntegrationTestCase extends Tiny_TestCase {
|
11 |
+
protected static $driver;
|
12 |
+
protected static $db;
|
13 |
+
|
14 |
+
public static function set_up_before_class() {
|
15 |
+
self::$driver = RemoteWebDriver::createBySessionId(
|
16 |
+
$GLOBALS['global_session_id'],
|
17 |
+
$GLOBALS['global_webdriver_host']
|
18 |
+
);
|
19 |
+
|
20 |
+
self::$db = new mysqli( getenv( 'HOST' ), 'root',
|
21 |
+
getenv( 'MYSQL_PWD' ),
|
22 |
+
getenv( 'WORDPRESS_DATABASE' )
|
23 |
+
);
|
24 |
+
}
|
25 |
+
|
26 |
+
protected function visit( $path ) {
|
27 |
+
self::$driver->get( wordpress( $path ) );
|
28 |
+
}
|
29 |
+
|
30 |
+
protected function refresh() {
|
31 |
+
self::$driver->navigate()->refresh();
|
32 |
+
}
|
33 |
+
|
34 |
+
protected function find( $selector, $base = null ) {
|
35 |
+
if ( ! $base ) {
|
36 |
+
$base = self::$driver;
|
37 |
+
}
|
38 |
+
|
39 |
+
return $base->findElement(
|
40 |
+
WebDriverBy::cssSelector( $selector )
|
41 |
+
);
|
42 |
+
}
|
43 |
+
|
44 |
+
protected function find_all( $selector, $base = null ) {
|
45 |
+
if ( ! $base ) {
|
46 |
+
$base = self::$driver;
|
47 |
+
}
|
48 |
+
|
49 |
+
return $base->findElements(
|
50 |
+
WebDriverBy::cssSelector( $selector )
|
51 |
+
);
|
52 |
+
}
|
53 |
+
|
54 |
+
protected function find_link( $text ) {
|
55 |
+
return self::$driver->findElement(
|
56 |
+
WebDriverBy::partialLinkText( $text )
|
57 |
+
);
|
58 |
+
}
|
59 |
+
|
60 |
+
protected function find_button( $text ) {
|
61 |
+
return self::$driver->findElement(
|
62 |
+
WebDriverBy::cssSelector( "input[value='{$text}']" )
|
63 |
+
);
|
64 |
+
}
|
65 |
+
|
66 |
+
protected function wait_for_text( $selector, $text ) {
|
67 |
+
self::$driver->wait( 2 )->until(
|
68 |
+
WebDriverExpectedCondition::textToBePresentInElement(
|
69 |
+
WebDriverBy::cssSelector( $selector ), $text
|
70 |
+
)
|
71 |
+
);
|
72 |
+
}
|
73 |
+
|
74 |
+
protected function wait_for_text_disappearance( $selector, $text ) {
|
75 |
+
self::$driver->wait( 2 )->until(
|
76 |
+
WebDriverExpectedCondition::invisibilityOfElementWithText(
|
77 |
+
WebDriverBy::cssSelector( $selector ), $text
|
78 |
+
)
|
79 |
+
);
|
80 |
+
}
|
81 |
+
|
82 |
+
protected function has_postbox_container() {
|
83 |
+
return wordpress_version() >= 35;
|
84 |
+
}
|
85 |
+
|
86 |
+
protected function postbox_dimension_selector() {
|
87 |
+
$version = wordpress_version();
|
88 |
+
if ( $version < 37 ) {
|
89 |
+
return 'div.misc-pub-section:nth-child(5)';
|
90 |
+
} elseif ( $version == 37 ) {
|
91 |
+
return 'div.misc-pub-section:nth-child(6)';
|
92 |
+
} else {
|
93 |
+
return 'div.misc-pub-dimensions';
|
94 |
+
}
|
95 |
+
}
|
96 |
+
|
97 |
+
protected function upload_media( $path ) {
|
98 |
+
$this->visit( '/wp-admin/media-new.php?browser-uploader&flash=0' );
|
99 |
+
|
100 |
+
$links = $this->find_all( 'p.upload-flash-bypass a' );
|
101 |
+
if ( count( $links ) > 0 && $links[0]->isDisplayed() ) {
|
102 |
+
$links[0]->click();
|
103 |
+
}
|
104 |
+
|
105 |
+
$this->find( 'input[name=async-upload]' )->sendKeys( $path );
|
106 |
+
$this->find( 'input[type=submit]' )->click();
|
107 |
+
|
108 |
+
$this->wait_for_text( 'div.wrap h1, div.wrap h2', 'Media Library' );
|
109 |
+
}
|
110 |
+
|
111 |
+
protected function set_api_key( $api_key, $wait = true ) {
|
112 |
+
$this->set_option( 'tinypng_api_key', $api_key );
|
113 |
+
}
|
114 |
+
|
115 |
+
protected function enable_compression_sizes( $sizes ) {
|
116 |
+
$value = array( '_tiny_dummy' => 'on' );
|
117 |
+
foreach ( $sizes as $size ) {
|
118 |
+
$value[ $size ] = 'on';
|
119 |
+
}
|
120 |
+
$this->set_option( 'tinypng_sizes', serialize( $value ) );
|
121 |
+
}
|
122 |
+
|
123 |
+
protected function enable_preserve( $keys ) {
|
124 |
+
$value = array();
|
125 |
+
foreach ( $keys as $key ) {
|
126 |
+
$value[ $key ] = 'on';
|
127 |
+
}
|
128 |
+
$this->set_option( 'tinypng_preserve_data', serialize( $value ) );
|
129 |
+
}
|
130 |
+
|
131 |
+
protected function disable_preserve() {
|
132 |
+
$this->unset_option( 'tinypng_preserve_data' );
|
133 |
+
}
|
134 |
+
|
135 |
+
protected function enable_resize( $options ) {
|
136 |
+
$value = array( 'enabled' => 'on' );
|
137 |
+
foreach ( $options as $option => $val ) {
|
138 |
+
$value[ $option ] = $val;
|
139 |
+
}
|
140 |
+
$this->set_option( 'tinypng_resize_original', serialize( $value ) );
|
141 |
+
}
|
142 |
+
|
143 |
+
protected function disable_resize() {
|
144 |
+
$this->unset_option( 'tinypng_resize_original' );
|
145 |
+
}
|
146 |
+
|
147 |
+
protected function set_option( $name, $value ) {
|
148 |
+
$this->unset_option( $name );
|
149 |
+
|
150 |
+
$query = self::$db->prepare(
|
151 |
+
'INSERT INTO wp_options (option_name, option_value) VALUES (?, ?)'
|
152 |
+
);
|
153 |
+
|
154 |
+
$query->bind_param( 'ss', $name, $value );
|
155 |
+
$query->execute();
|
156 |
+
}
|
157 |
+
|
158 |
+
protected function unset_option( $name ) {
|
159 |
+
$query = self::$db->prepare(
|
160 |
+
'DELETE FROM wp_options WHERE option_name = ?'
|
161 |
+
);
|
162 |
+
|
163 |
+
$query->bind_param( 's', $name );
|
164 |
+
$query->execute();
|
165 |
+
}
|
166 |
}
|
test/integration/PluginIntegrationTest.php
CHANGED
@@ -1,23 +1,41 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
require_once
|
4 |
|
5 |
use Facebook\WebDriver\WebDriverBy;
|
6 |
|
7 |
class PluginIntegrationTest extends IntegrationTestCase {
|
|
|
|
|
|
|
|
|
8 |
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
|
14 |
-
|
15 |
-
|
16 |
-
|
|
|
|
|
17 |
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
23 |
}
|
1 |
<?php
|
2 |
|
3 |
+
require_once dirname( __FILE__ ) . '/IntegrationTestCase.php';
|
4 |
|
5 |
use Facebook\WebDriver\WebDriverBy;
|
6 |
|
7 |
class PluginIntegrationTest extends IntegrationTestCase {
|
8 |
+
public function set_up() {
|
9 |
+
parent::set_up();
|
10 |
+
$this->visit( '/wp-admin/plugins.php' );
|
11 |
+
}
|
12 |
|
13 |
+
public function tear_down() {
|
14 |
+
parent::tear_down();
|
15 |
+
clear_settings();
|
16 |
+
}
|
17 |
|
18 |
+
public function test_plugin_list_should_include_title() {
|
19 |
+
$element = $this->find(
|
20 |
+
'tr[data-slug=tiny-compress-images] td.plugin-title strong, ' . /* WP4.5+ */
|
21 |
+
'tr#compress-jpeg-png-images td.plugin-title strong'
|
22 |
+
);
|
23 |
|
24 |
+
$this->assertEquals(
|
25 |
+
'Compress JPEG & PNG images',
|
26 |
+
$element->getText()
|
27 |
+
);
|
28 |
+
}
|
29 |
+
|
30 |
+
public function test_plugin_list_should_include_settings_link() {
|
31 |
+
$element = $this->find(
|
32 |
+
'tr[data-slug=tiny-compress-images] span.settings a, ' . /* WP4.5+ */
|
33 |
+
'tr#compress-jpeg-png-images span.settings a'
|
34 |
+
);
|
35 |
+
|
36 |
+
$this->assertStringEndsWith(
|
37 |
+
'options-media.php#tiny-compress-images',
|
38 |
+
$element->getAttribute( 'href' )
|
39 |
+
);
|
40 |
+
}
|
41 |
}
|
test/integration/SettingsIntegrationTest.php
CHANGED
@@ -1,190 +1,290 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
require_once
|
4 |
-
|
5 |
-
use Facebook\WebDriver\WebDriverBy;
|
6 |
-
use Facebook\WebDriver\WebDriverExpectedCondition;
|
7 |
|
8 |
class SettingsIntegrationTest extends IntegrationTestCase {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9 |
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
public function tearDown() {
|
16 |
-
clear_settings();
|
17 |
-
}
|
18 |
-
|
19 |
-
public function testTitlePresence()
|
20 |
-
{
|
21 |
-
$headings = self::$driver->findElements(WebDriverBy::cssSelector('h1, h2, h3, h4'));
|
22 |
-
$texts = array_map('innerText', $headings);
|
23 |
-
$this->assertContains('PNG and JPEG optimization', $texts);
|
24 |
-
}
|
25 |
-
|
26 |
-
public function testApiKeyInputPresence() {
|
27 |
-
$elements = self::$driver->findElements(WebDriverBy::name('tinypng_api_key'));
|
28 |
-
$this->assertEquals(1, count($elements));
|
29 |
-
}
|
30 |
-
|
31 |
-
public function testShouldPersistApiKey() {
|
32 |
-
$element = $this->set_api_key('1234');
|
33 |
-
$this->assertEquals('1234', $element->getAttribute('value'));
|
34 |
-
}
|
35 |
-
|
36 |
-
public function testShouldShowNoticeIfNoApiKeyIsSet() {
|
37 |
-
$element = self::$driver->findElement(WebDriverBy::cssSelector('.error a'));
|
38 |
-
$this->assertStringEndsWith('options-media.php#tiny-compress-images', $element->getAttribute('href'));
|
39 |
-
}
|
40 |
-
|
41 |
-
public function testShouldShowNoNoticeIfApiKeyIsSet() {
|
42 |
-
$this->set_api_key('1234');
|
43 |
-
$elements = self::$driver->findElements(WebDriverBy::cssSelector('.error a'));
|
44 |
-
$this->assertEquals(0, count($elements));
|
45 |
-
}
|
46 |
-
|
47 |
-
public function testNoApiKeyNoticeShouldLinkToSettings() {
|
48 |
-
self::$driver->findElement(WebDriverBy::cssSelector('.error a'))->click();
|
49 |
-
$this->assertStringEndsWith('options-media.php#tiny-compress-images', self::$driver->getCurrentURL());
|
50 |
-
}
|
51 |
-
|
52 |
-
public function testDefaultSizesBeingCompressed() {
|
53 |
-
$elements = self::$driver->findElements(
|
54 |
-
WebDriverBy::xpath('//input[@type="checkbox" and starts-with(@name, "tinypng_sizes") and @checked="checked"]'));
|
55 |
-
$size_ids = array_map('elementName', $elements);
|
56 |
-
$this->assertContains('tinypng_sizes[0]', $size_ids);
|
57 |
-
$this->assertContains('tinypng_sizes[thumbnail]', $size_ids);
|
58 |
-
$this->assertContains('tinypng_sizes[medium]', $size_ids);
|
59 |
-
$this->assertContains('tinypng_sizes[large]', $size_ids);
|
60 |
-
}
|
61 |
-
|
62 |
-
public function testShouldPersistSizes() {
|
63 |
-
$element = self::$driver->findElement(WebDriverBy::id('tinypng_sizes_medium'));
|
64 |
-
$element->click();
|
65 |
-
$element = self::$driver->findElement(WebDriverBy::id('tinypng_sizes_0'));
|
66 |
-
$element->click();
|
67 |
-
self::$driver->findElement(WebDriverBy::tagName('form'))->submit();
|
68 |
-
|
69 |
-
$elements = self::$driver->findElements(
|
70 |
-
WebDriverBy::xpath('//input[@type="checkbox" and starts-with(@name, "tinypng_sizes") and @checked="checked"]'));
|
71 |
-
$size_ids = array_map('elementName', $elements);
|
72 |
-
$this->assertNotContains('tinypng_sizes[0]', $size_ids);
|
73 |
-
$this->assertContains('tinypng_sizes[thumbnail]', $size_ids);
|
74 |
-
$this->assertNotContains('tinypng_sizes[medium]', $size_ids);
|
75 |
-
$this->assertContains('tinypng_sizes[large]', $size_ids);
|
76 |
-
}
|
77 |
-
|
78 |
-
public function testShouldPersistNoSizes() {
|
79 |
-
$elements = self::$driver->findElements(
|
80 |
-
WebDriverBy::xpath('//input[@type="checkbox" and starts-with(@name, "tinypng_sizes") and @checked="checked"]'));
|
81 |
-
foreach ($elements as $element) {
|
82 |
-
$element->click();
|
83 |
-
}
|
84 |
-
self::$driver->findElement(WebDriverBy::tagName('form'))->submit();
|
85 |
-
|
86 |
-
$elements = self::$driver->findElements(
|
87 |
-
WebDriverBy::xpath('//input[@type="checkbox" and starts-with(@name, "tinypng_sizes") and @checked="checked"]'));
|
88 |
-
$this->assertEquals(0, count(array_map('elementName', $elements)));
|
89 |
-
}
|
90 |
-
|
91 |
-
public function testShouldShowTotalImagesInfo() {
|
92 |
-
$this->enable_compression_sizes(array('0', 'thumbnail', 'medium', 'large'));
|
93 |
-
$element = self::$driver->findElement(WebDriverBy::id('tiny-image-sizes-notice'));
|
94 |
-
$this->assertContains('With these settings you can compress at least 125 images for free each month.', $element->getText());
|
95 |
-
}
|
96 |
-
|
97 |
-
public function testShouldUpdateTotalImagesInfo() {
|
98 |
-
$this->enable_compression_sizes(array('0', 'thumbnail', 'medium', 'large'));
|
99 |
-
$element = self::$driver->findElement(
|
100 |
-
WebDriverBy::xpath('//input[@type="checkbox" and @name="tinypng_sizes[0]" and @checked="checked"]'));
|
101 |
-
$element->click();
|
102 |
-
self::$driver->wait(2)->until(WebDriverExpectedCondition::textToBePresentInElement(
|
103 |
-
WebDriverBy::cssSelector('#tiny-image-sizes-notice'),
|
104 |
-
'With these settings you can compress at least 166 images for free each month.'));
|
105 |
-
}
|
106 |
-
|
107 |
-
public function testShouldShowCorrectNoImageSizesInfo() {
|
108 |
-
$elements = self::$driver->findElements(
|
109 |
-
WebDriverBy::xpath('//input[@type="checkbox" and starts-with(@name, "tinypng_sizes") and @checked="checked"]'));
|
110 |
-
foreach ($elements as $element) {
|
111 |
-
$element->click();
|
112 |
-
}
|
113 |
-
self::$driver->wait(2)->until(WebDriverExpectedCondition::textToBePresentInElement(
|
114 |
-
WebDriverBy::cssSelector('#tiny-image-sizes-notice'), 'With these settings no images will be compressed.'));
|
115 |
-
// Not really necessary anymore to assert this.
|
116 |
-
$elements = self::$driver->findElement(WebDriverBy::id('tiny-image-sizes-notice'))->findElements(WebDriverBy::tagName('p'));
|
117 |
-
$statuses = array_map('innerText', $elements);
|
118 |
-
$this->assertContains('With these settings no images will be compressed.', $statuses);
|
119 |
-
}
|
120 |
-
|
121 |
-
public function testShouldShowResizingWhenOriginalEnabled() {
|
122 |
-
$element = self::$driver->findElement(WebDriverBy::id('tinypng_sizes_0'));
|
123 |
-
if (!$element->getAttribute('checked')) {
|
124 |
-
$element->click();
|
125 |
-
}
|
126 |
-
$labels = self::$driver->findElements(WebDriverBy::tagName('label'));
|
127 |
-
$texts = array_map('innerText', $labels);
|
128 |
-
$this->assertContains('Resize and compress the orginal image', $texts);
|
129 |
-
$paragraphs = self::$driver->findElements(WebDriverBy::tagName('p'));
|
130 |
-
$texts = array_map('innerText', $paragraphs);
|
131 |
-
$this->assertNotContains('Enable compression of the original image size for more options.', $texts);
|
132 |
-
}
|
133 |
-
|
134 |
-
public function testShouldNotShowResizingWhenOriginalDisabled() {
|
135 |
-
$element = self::$driver->findElement(WebDriverBy::id('tinypng_sizes_0'));
|
136 |
-
if ($element->getAttribute('checked')) {
|
137 |
-
$element->click();
|
138 |
-
}
|
139 |
-
self::$driver->wait(1)->until(WebDriverExpectedCondition::textToBePresentInElement(
|
140 |
-
WebDriverBy::cssSelector('p.tiny-resize-unavailable'), 'Enable compression of the original image size for more options.'));
|
141 |
-
$labels = self::$driver->findElements(WebDriverBy::tagName('label'));
|
142 |
-
$texts = array_map('innerText', $labels);
|
143 |
-
$this->assertNotContains('Resize and compress orginal images to fit within:', $texts);
|
144 |
-
}
|
145 |
-
|
146 |
-
public function testShouldNotShowResizingWhenOriginalDisabledWhenShownFirst() {
|
147 |
-
$this->enable_compression_sizes(array('original'));
|
148 |
-
self::$driver->navigate()->refresh();
|
149 |
-
$this->assertEquals('Enable compression of the original image size for more options.',
|
150 |
-
self::$driver->findElement(WebDriverBy::cssSelector('.tiny-resize-unavailable'))->getText());
|
151 |
-
}
|
152 |
-
|
153 |
-
public function testShouldPersistResizingSettings() {
|
154 |
-
$this->enable_resize(123, 456);
|
155 |
-
$this->assertEquals('123', self::$driver->findElement(WebDriverBy::id('tinypng_resize_original_width'))->getAttribute('value'));
|
156 |
-
$this->assertEquals('456', self::$driver->findElement(WebDriverBy::id('tinypng_resize_original_height'))->getAttribute('value'));
|
157 |
-
}
|
158 |
-
|
159 |
-
public function testStatusPresenceOK() {
|
160 |
-
reset_webservice();
|
161 |
-
$this->set_api_key('PNG123');
|
162 |
-
self::$driver->wait(2)->until(WebDriverExpectedCondition::textToBePresentInElement(
|
163 |
-
WebDriverBy::cssSelector('#tiny-compress-status'),
|
164 |
-
"API connection successful\nYou have made"));
|
165 |
-
}
|
166 |
-
|
167 |
-
public function testStatusPresenseFail() {
|
168 |
-
$this->set_api_key('INVALID123');
|
169 |
-
self::$driver->wait(2)->until(WebDriverExpectedCondition::textToBePresentInElement(
|
170 |
-
WebDriverBy::cssSelector('#tiny-compress-status'),
|
171 |
-
"API connection unsuccessful\nError: Credentials are invalid"));
|
172 |
-
}
|
173 |
-
|
174 |
-
public function testShouldShowBulkCompressionLink() {
|
175 |
-
reset_webservice();
|
176 |
-
self::$driver->wait(2)->until(WebDriverExpectedCondition::textToBePresentInElement(
|
177 |
-
WebDriverBy::cssSelector('#tiny-compress-savings p'),
|
178 |
-
'No images compressed yet. Use Compress All Images to compress existing images.'));
|
179 |
-
}
|
180 |
-
|
181 |
-
public function testShouldShowSavings() {
|
182 |
-
reset_webservice();
|
183 |
-
$this->set_api_key('PNG123');
|
184 |
-
$this->upload_media(dirname(__FILE__) . '/../fixtures/input-example.png');
|
185 |
-
self::$driver->get(wordpress('/wp-admin/options-media.php'));
|
186 |
-
self::$driver->wait(2)->until(WebDriverExpectedCondition::textToBePresentInElement(
|
187 |
-
WebDriverBy::cssSelector('#tiny-compress-savings p'),
|
188 |
-
'You have saved a total of'));
|
189 |
-
}
|
190 |
}
|
1 |
<?php
|
2 |
|
3 |
+
require_once dirname( __FILE__ ) . '/IntegrationTestCase.php';
|
|
|
|
|
|
|
4 |
|
5 |
class SettingsIntegrationTest extends IntegrationTestCase {
|
6 |
+
public function set_up() {
|
7 |
+
parent::set_up();
|
8 |
+
$this->visit( '/wp-admin/options-media.php' );
|
9 |
+
}
|
10 |
+
|
11 |
+
public function tear_down() {
|
12 |
+
parent::tear_down();
|
13 |
+
clear_settings();
|
14 |
+
clear_uploads();
|
15 |
+
}
|
16 |
+
|
17 |
+
protected function get_enabled_sizes() {
|
18 |
+
return array_map( function( $checkbox ) {
|
19 |
+
return $checkbox->getAttribute( 'name' );
|
20 |
+
}, $this->find_all( 'input[type=checkbox][checked][name^=tinypng_sizes]' ) );
|
21 |
+
}
|
22 |
+
|
23 |
+
public function test_settings_should_contain_title() {
|
24 |
+
$headings = array_map( function( $heading ) {
|
25 |
+
return $heading->getText();
|
26 |
+
}, $this->find_all( 'h2, h3' ) );
|
27 |
+
|
28 |
+
$this->assertContains( 'JPEG and PNG optimization', $headings );
|
29 |
+
}
|
30 |
+
|
31 |
+
public function test_settings_should_show_notice_if_key_is_missing() {
|
32 |
+
$this->assertStringEndsWith(
|
33 |
+
'options-media.php#tiny-compress-images',
|
34 |
+
$this->find( '.error a' )->getAttribute( 'href' )
|
35 |
+
);
|
36 |
+
}
|
37 |
+
|
38 |
+
public function test_settings_should_not_show_notice_if_key_is_set() {
|
39 |
+
$this->set_api_key( 'PNG123' );
|
40 |
+
$this->refresh();
|
41 |
+
|
42 |
+
$this->assertEquals( 0, count( $this->find_all( '.error a' ) ) );
|
43 |
+
}
|
44 |
+
|
45 |
+
public function test_settings_should_store_valid_api_key() {
|
46 |
+
$this->find( '#tinypng_api_key' )->sendKeys( 'PNG123' );
|
47 |
+
$this->find( 'button[data-tiny-action=update-key]' )->click();
|
48 |
+
|
49 |
+
$this->wait_for_text(
|
50 |
+
'div.tiny-account-status p.status',
|
51 |
+
'Your account is connected'
|
52 |
+
);
|
53 |
+
|
54 |
+
$this->refresh();
|
55 |
+
|
56 |
+
$this->assertEquals(
|
57 |
+
'Your account is connected',
|
58 |
+
$this->find( 'div.tiny-account-status p.status' )->getText()
|
59 |
+
);
|
60 |
+
}
|
61 |
+
|
62 |
+
public function test_settings_should_not_store_invalid_api_key() {
|
63 |
+
$this->find( '#tinypng_api_key' )->sendKeys( 'INVALID123' );
|
64 |
+
$this->find( 'button[data-tiny-action=update-key]' )->click();
|
65 |
+
|
66 |
+
$this->wait_for_text(
|
67 |
+
'div.tiny-account-status div.update p.message',
|
68 |
+
'The key that you have entered is not valid'
|
69 |
+
);
|
70 |
+
|
71 |
+
$this->refresh();
|
72 |
+
|
73 |
+
$this->assertEquals(
|
74 |
+
'Register new account',
|
75 |
+
$this->find( 'div.tiny-account-status h4' )->getText()
|
76 |
+
);
|
77 |
+
}
|
78 |
+
|
79 |
+
public function test_settings_should_allow_changing_api_key() {
|
80 |
+
$this->find( '#tinypng_api_key' )->sendKeys( 'PNG123' );
|
81 |
+
$this->find( 'button[data-tiny-action=update-key]' )->click();
|
82 |
+
|
83 |
+
$this->wait_for_text(
|
84 |
+
'div.tiny-account-status p.status',
|
85 |
+
'Your account is connected'
|
86 |
+
);
|
87 |
+
|
88 |
+
$this->find_link( 'Change API key' )->click();
|
89 |
+
|
90 |
+
$this->find( '#tinypng_api_key' )->sendKeys( 'JPG123' );
|
91 |
+
$this->find( 'button[data-tiny-action=update-key]' )->click();
|
92 |
+
|
93 |
+
$this->wait_for_text(
|
94 |
+
'div.tiny-account-status p.status',
|
95 |
+
'Your account is connected'
|
96 |
+
);
|
97 |
+
}
|
98 |
+
|
99 |
+
public function test_settings_should_pre_fill_registration_form() {
|
100 |
+
$this->assertEquals(
|
101 |
+
'',
|
102 |
+
$this->find( '#tinypng_api_key_name' )->getAttribute( 'value' )
|
103 |
+
);
|
104 |
+
|
105 |
+
$this->assertEquals(
|
106 |
+
'developers@voormedia.com',
|
107 |
+
$this->find( '#tinypng_api_key_email' )->getAttribute( 'value' )
|
108 |
+
);
|
109 |
+
}
|
110 |
+
|
111 |
+
public function test_settings_should_not_send_registration_without_name() {
|
112 |
+
$this->find( '#tinypng_api_key_name' )->clear();
|
113 |
+
$this->find( '#tinypng_api_key_email' )->clear()->sendKeys( 'john@example.com' );
|
114 |
+
$this->find( 'button[data-tiny-action=create-key]' )->click();
|
115 |
+
|
116 |
+
$this->wait_for_text(
|
117 |
+
'div.tiny-account-status div.create p.message',
|
118 |
+
'Please enter your name'
|
119 |
+
);
|
120 |
+
|
121 |
+
$this->refresh();
|
122 |
+
|
123 |
+
$this->assertEquals(
|
124 |
+
'Register new account',
|
125 |
+
$this->find( 'div.tiny-account-status h4' )->getText()
|
126 |
+
);
|
127 |
+
}
|
128 |
+
|
129 |
+
public function test_settings_should_not_send_registration_without_email() {
|
130 |
+
$this->find( '#tinypng_api_key_name' )->clear()->sendKeys( 'John' );
|
131 |
+
$this->find( '#tinypng_api_key_email' )->clear();
|
132 |
+
$this->find( 'button[data-tiny-action=create-key]' )->click();
|
133 |
+
|
134 |
+
$this->wait_for_text(
|
135 |
+
'div.tiny-account-status div.create p.message',
|
136 |
+
'Please enter your email address'
|
137 |
+
);
|
138 |
+
|
139 |
+
$this->refresh();
|
140 |
+
|
141 |
+
$this->assertEquals(
|
142 |
+
'Register new account',
|
143 |
+
$this->find( 'div.tiny-account-status h4' )->getText()
|
144 |
+
);
|
145 |
+
}
|
146 |
+
|
147 |
+
public function test_settings_should_store_registration_key() {
|
148 |
+
$this->find( '#tinypng_api_key_name' )->clear()->sendKeys( 'John' );
|
149 |
+
$this->find( '#tinypng_api_key_email' )->clear()->sendKeys( 'john@example.com' );
|
150 |
+
$this->find( 'button[data-tiny-action=create-key]' )->click();
|
151 |
+
|
152 |
+
$this->wait_for_text(
|
153 |
+
'div.tiny-account-status p.status',
|
154 |
+
'An email has been sent with a link to activate your account'
|
155 |
+
);
|
156 |
+
|
157 |
+
$this->refresh();
|
158 |
+
|
159 |
+
$this->assertEquals(
|
160 |
+
'An email has been sent with a link to activate your account',
|
161 |
+
$this->find( 'div.tiny-account-status p.status' )->getText()
|
162 |
+
);
|
163 |
+
}
|
164 |
+
|
165 |
+
public function test_settings_should_enable_all_sizes_by_default() {
|
166 |
+
$enabled_sizes = $this->get_enabled_sizes();
|
167 |
+
|
168 |
+
$this->assertContains( 'tinypng_sizes[0]', $enabled_sizes );
|
169 |
+
$this->assertContains( 'tinypng_sizes[thumbnail]', $enabled_sizes );
|
170 |
+
$this->assertContains( 'tinypng_sizes[medium]', $enabled_sizes );
|
171 |
+
$this->assertContains( 'tinypng_sizes[large]', $enabled_sizes );
|
172 |
+
}
|
173 |
+
|
174 |
+
public function test_settings_should_store_enabled_sizes() {
|
175 |
+
$this->find( '#tinypng_sizes_medium' )->click();
|
176 |
+
$this->find( '#tinypng_sizes_0' )->click();
|
177 |
+
$this->find( 'form' )->submit();
|
178 |
+
|
179 |
+
$enabled_sizes = $this->get_enabled_sizes();
|
180 |
+
|
181 |
+
$this->assertNotContains( 'tinypng_sizes[0]', $enabled_sizes );
|
182 |
+
$this->assertContains( 'tinypng_sizes[thumbnail]', $enabled_sizes );
|
183 |
+
$this->assertNotContains( 'tinypng_sizes[medium]', $enabled_sizes );
|
184 |
+
$this->assertContains( 'tinypng_sizes[large]', $enabled_sizes );
|
185 |
+
}
|
186 |
+
|
187 |
+
public function test_settings_should_store_all_disabled_sizes() {
|
188 |
+
$checkboxes = $this->find_all(
|
189 |
+
'input[type=checkbox][checked][name^=tinypng_sizes]'
|
190 |
+
);
|
191 |
+
|
192 |
+
foreach ( $checkboxes as $checkbox ) {
|
193 |
+
$checkbox->click();
|
194 |
+
}
|
195 |
+
|
196 |
+
$this->find( 'form' )->submit();
|
197 |
+
|
198 |
+
$enabled_sizes = $this->get_enabled_sizes();
|
199 |
+
$this->assertEquals( 0, count( $enabled_sizes ) );
|
200 |
+
}
|
201 |
+
|
202 |
+
public function test_settings_should_show_free_compressions() {
|
203 |
+
$this->enable_compression_sizes(
|
204 |
+
array( '0', 'thumbnail', 'medium', 'large' )
|
205 |
+
);
|
206 |
+
|
207 |
+
$this->refresh();
|
208 |
+
|
209 |
+
$this->assertContains(
|
210 |
+
'With these settings you can compress at least 125 images for free each month.',
|
211 |
+
$this->find( '#tiny-image-sizes-notice' )->getText()
|
212 |
+
);
|
213 |
+
}
|
214 |
+
|
215 |
+
public function test_settings_should_update_free_compressions() {
|
216 |
+
$this->enable_compression_sizes(
|
217 |
+
array( '0', 'thumbnail', 'medium', 'large' )
|
218 |
+
);
|
219 |
+
|
220 |
+
$this->refresh();
|
221 |
+
$this->find( '#tinypng_sizes_medium' )->click();
|
222 |
+
|
223 |
+
$this->assertContains(
|
224 |
+
'With these settings you can compress at least 166 images for free each month.',
|
225 |
+
$this->find( '#tiny-image-sizes-notice' )->getText()
|
226 |
+
);
|
227 |
+
}
|
228 |
+
|
229 |
+
public function test_settings_should_show_no_compressions() {
|
230 |
+
$checkboxes = $this->find_all(
|
231 |
+
'input[type=checkbox][checked][name^=tinypng_sizes]'
|
232 |
+
);
|
233 |
+
|
234 |
+
foreach ( $checkboxes as $checkbox ) {
|
235 |
+
$checkbox->click();
|
236 |
+
}
|
237 |
+
|
238 |
+
$this->assertContains(
|
239 |
+
'With these settings no images will be compressed.',
|
240 |
+
$this->find( '#tiny-image-sizes-notice' )->getText()
|
241 |
+
);
|
242 |
+
}
|
243 |
+
|
244 |
+
public function test_settings_should_show_resizing_when_original_enabled() {
|
245 |
+
$elements = $this->find_all( 'label[for=tinypng_resize_original_enabled]' );
|
246 |
+
$this->assertEquals(
|
247 |
+
'Resize and compress the original image',
|
248 |
+
$elements[0]->getText()
|
249 |
+
);
|
250 |
+
|
251 |
+
$elements = $this->find_all( 'p.tiny-resize-unavailable' );
|
252 |
+
$this->assertEquals(
|
253 |
+
'',
|
254 |
+
$elements[0]->getText()
|
255 |
+
);
|
256 |
+
}
|
257 |
+
|
258 |
+
public function test_settings_should_not_show_resizing_when_original_disabled() {
|
259 |
+
$this->find( '#tinypng_sizes_0' )->click(); /* Enabled by default */
|
260 |
+
|
261 |
+
$elements = $this->find_all( 'label[for=tinypng_resize_original_enabled]' );
|
262 |
+
$this->assertEquals(
|
263 |
+
'',
|
264 |
+
$elements[0]->getText()
|
265 |
+
);
|
266 |
+
|
267 |
+
$elements = $this->find_all( 'p.tiny-resize-unavailable' );
|
268 |
+
$this->assertEquals(
|
269 |
+
'Enable compression of the original image size for more options.',
|
270 |
+
$elements[0]->getText()
|
271 |
+
);
|
272 |
+
}
|
273 |
+
|
274 |
+
public function test_settings_should_store_resizing_settings() {
|
275 |
+
$this->find( '#tinypng_resize_original_enabled' )->click();
|
276 |
+
$this->find( '#tinypng_resize_original_width' )->clear()->sendKeys( '234' );
|
277 |
+
$this->find( '#tinypng_resize_original_height' )->clear()->sendKeys( '345' );
|
278 |
+
$this->find( 'form' )->submit();
|
279 |
+
|
280 |
+
$this->assertEquals(
|
281 |
+
'234',
|
282 |
+
$this->find( '#tinypng_resize_original_width' )->getAttribute( 'value' )
|
283 |
+
);
|
284 |
|
285 |
+
$this->assertEquals(
|
286 |
+
'345',
|
287 |
+
$this->find( '#tinypng_resize_original_height' )->getAttribute( 'value' )
|
288 |
+
);
|
289 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
290 |
}
|
test/mock-tinypng-webservice/.htaccess
CHANGED
@@ -1,4 +1,5 @@
|
|
1 |
RewriteEngine On
|
|
|
2 |
RewriteRule ^shrink$ shrink.php [last]
|
3 |
RewriteRule ^output/.+$ output.php [last]
|
4 |
RewriteRule ^reset$ reset.php [last]
|
1 |
RewriteEngine On
|
2 |
+
RewriteRule ^keys$ keys.php [last]
|
3 |
RewriteRule ^shrink$ shrink.php [last]
|
4 |
RewriteRule ^output/.+$ output.php [last]
|
5 |
RewriteRule ^reset$ reset.php [last]
|
test/mock-tinypng-webservice/common.php
CHANGED
@@ -5,7 +5,7 @@ define('SESSION_FILE', '/tmp/session.dat');
|
|
5 |
if (file_exists(SESSION_FILE)) {
|
6 |
$session = unserialize(file_get_contents(SESSION_FILE));
|
7 |
} else {
|
8 |
-
$session = array('Compression-Count' => 0);
|
9 |
}
|
10 |
|
11 |
function save_session() {
|
5 |
if (file_exists(SESSION_FILE)) {
|
6 |
$session = unserialize(file_get_contents(SESSION_FILE));
|
7 |
} else {
|
8 |
+
$session = array( 'Compression-Count' => 0 );
|
9 |
}
|
10 |
|
11 |
function save_session() {
|
test/mock-tinypng-webservice/keys.php
ADDED
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
ob_start();
|
4 |
+
|
5 |
+
header('HTTP/1.1 202 Pending');
|
6 |
+
header("Content-Type: application/json; charset=utf-8");
|
7 |
+
|
8 |
+
echo json_encode(
|
9 |
+
array(
|
10 |
+
'key' => 'PENDING123',
|
11 |
+
)
|
12 |
+
);
|
13 |
+
|
14 |
+
ob_end_flush();
|
test/mock-tinypng-webservice/output-example.jpg
CHANGED
Binary file
|
test/mock-tinypng-webservice/output-example.png
CHANGED
Binary file
|
test/mock-tinypng-webservice/{output-resized.png → output-resized.jpg}
RENAMED
File without changes
|
test/mock-tinypng-webservice/output.php
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
<?php
|
2 |
ob_start();
|
3 |
|
4 |
-
require_once
|
5 |
|
6 |
if (preg_match('#output/.+[.](png|jpg)$#', $_SERVER['REQUEST_URI'], $match)) {
|
7 |
$file = str_replace('/', '-', $match[0]);
|
@@ -18,8 +18,6 @@ if (!is_null($api_key)) {
|
|
18 |
$resize = $data->resize;
|
19 |
if ($resize->method) {
|
20 |
$file = "output-resized.$ext";
|
21 |
-
$headers["Image-Width"] = $resize->width;
|
22 |
-
$headers["Image-Height"] = $resize->height;
|
23 |
}
|
24 |
}
|
25 |
|
@@ -35,8 +33,12 @@ if (strpos($api_key, 'GATEWAYTIMEOUT') !== false) {
|
|
35 |
);
|
36 |
echo json_encode($response);
|
37 |
} else if ($file && file_exists($file)) {
|
|
|
38 |
header("Content-Type: $mime");
|
39 |
header('Content-Disposition: attachment');
|
|
|
|
|
|
|
40 |
foreach ($headers as $name => $value) {
|
41 |
header("$name: $value");
|
42 |
}
|
1 |
<?php
|
2 |
ob_start();
|
3 |
|
4 |
+
require_once 'common.php';
|
5 |
|
6 |
if (preg_match('#output/.+[.](png|jpg)$#', $_SERVER['REQUEST_URI'], $match)) {
|
7 |
$file = str_replace('/', '-', $match[0]);
|
18 |
$resize = $data->resize;
|
19 |
if ($resize->method) {
|
20 |
$file = "output-resized.$ext";
|
|
|
|
|
21 |
}
|
22 |
}
|
23 |
|
33 |
);
|
34 |
echo json_encode($response);
|
35 |
} else if ($file && file_exists($file)) {
|
36 |
+
list($width, $height) = getimagesize($file);
|
37 |
header("Content-Type: $mime");
|
38 |
header('Content-Disposition: attachment');
|
39 |
+
header('Image-Width: ' . $width);
|
40 |
+
header('Image-Height: ' . $height);
|
41 |
+
header('Content-Length: ' . filesize($file));
|
42 |
foreach ($headers as $name => $value) {
|
43 |
header("$name: $value");
|
44 |
}
|
test/mock-tinypng-webservice/reset.php
CHANGED
@@ -1,4 +1,4 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
require
|
4 |
-
$session = null;
|
1 |
<?php
|
2 |
|
3 |
+
require 'common.php';
|
4 |
+
$session = null;
|
test/mock-tinypng-webservice/shrink.php
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
<?php
|
2 |
ob_start();
|
3 |
|
4 |
-
require_once
|
5 |
|
6 |
function mock_png_response() {
|
7 |
global $session;
|
@@ -11,9 +11,12 @@ function mock_png_response() {
|
|
11 |
header("Location: http://webservice/output/example.png");
|
12 |
header("Content-Type: application/json; charset=utf-8");
|
13 |
header("Compression-Count: {$session['Compression-Count']}");
|
|
|
|
|
|
|
14 |
$response = array(
|
15 |
-
"input" => array("size" =>
|
16 |
-
"output" => array("size" => 151021, "type" => "image/png", "ratio" => 0.933)
|
17 |
);
|
18 |
return json_encode($response);
|
19 |
}
|
@@ -26,10 +29,12 @@ function mock_jpg_response() {
|
|
26 |
header("Location: http://webservice/output/example.jpg");
|
27 |
header("Content-Type: application/json; charset=utf-8");
|
28 |
header("Compression-Count: {$session['Compression-Count']}");
|
|
|
|
|
29 |
|
30 |
$response = array(
|
31 |
-
"input" => array("size" => 15391, "type" => "image/jpeg"),
|
32 |
-
"output" => array("size" => 13910, "type" => "image/jpeg", "ratio" => 0.904)
|
33 |
);
|
34 |
return json_encode($response);
|
35 |
}
|
@@ -42,10 +47,12 @@ function mock_preserve_jpg_copyright_response() {
|
|
42 |
header("Location: http://webservice/output/copyright.jpg");
|
43 |
header("Content-Type: application/json; charset=utf-8");
|
44 |
header("Compression-Count: {$session['Compression-Count']}");
|
|
|
|
|
45 |
|
46 |
$response = array(
|
47 |
-
"input" => array("size" => 110329, "type" => "image/jpeg"),
|
48 |
-
"output" => array("size" => 97835, "type" => "image/jpeg", "ratio" => 0.8868)
|
49 |
);
|
50 |
return json_encode($response);
|
51 |
}
|
@@ -58,7 +65,7 @@ function mock_empty_response() {
|
|
58 |
header("Compression-Count: {$session['Compression-Count']}");
|
59 |
|
60 |
$response = array(
|
61 |
-
"error" => "
|
62 |
"message" => "File is empty"
|
63 |
);
|
64 |
return json_encode($response);
|
@@ -72,7 +79,7 @@ function mock_limit_reached_response() {
|
|
72 |
header("Compression-Count: 500");
|
73 |
|
74 |
$response = array(
|
75 |
-
"error" => "
|
76 |
"message" => "Your monthly limit has been exceeded"
|
77 |
);
|
78 |
return json_encode($response);
|
1 |
<?php
|
2 |
ob_start();
|
3 |
|
4 |
+
require_once 'common.php';
|
5 |
|
6 |
function mock_png_response() {
|
7 |
global $session;
|
11 |
header("Location: http://webservice/output/example.png");
|
12 |
header("Content-Type: application/json; charset=utf-8");
|
13 |
header("Compression-Count: {$session['Compression-Count']}");
|
14 |
+
header("Image-Width: 720");
|
15 |
+
header("Image-Height: 1080");
|
16 |
+
|
17 |
$response = array(
|
18 |
+
"input" => array( "size" => 641206, "type" => "image/png" ),
|
19 |
+
"output" => array( "size" => 151021, "type" => "image/png", "ratio" => 0.933 )
|
20 |
);
|
21 |
return json_encode($response);
|
22 |
}
|
29 |
header("Location: http://webservice/output/example.jpg");
|
30 |
header("Content-Type: application/json; charset=utf-8");
|
31 |
header("Compression-Count: {$session['Compression-Count']}");
|
32 |
+
header("Image-Width: 200");
|
33 |
+
header("Image-Height: 150");
|
34 |
|
35 |
$response = array(
|
36 |
+
"input" => array( "size" => 15391, "type" => "image/jpeg" ),
|
37 |
+
"output" => array( "size" => 13910, "type" => "image/jpeg", "ratio" => 0.904 )
|
38 |
);
|
39 |
return json_encode($response);
|
40 |
}
|
47 |
header("Location: http://webservice/output/copyright.jpg");
|
48 |
header("Content-Type: application/json; charset=utf-8");
|
49 |
header("Compression-Count: {$session['Compression-Count']}");
|
50 |
+
header("Image-Width: 330");
|
51 |
+
header("Image-Height: 1080");
|
52 |
|
53 |
$response = array(
|
54 |
+
"input" => array( "size" => 110329, "type" => "image/jpeg" ),
|
55 |
+
"output" => array( "size" => 97835, "type" => "image/jpeg", "ratio" => 0.8868 )
|
56 |
);
|
57 |
return json_encode($response);
|
58 |
}
|
65 |
header("Compression-Count: {$session['Compression-Count']}");
|
66 |
|
67 |
$response = array(
|
68 |
+
"error" => "Input missing",
|
69 |
"message" => "File is empty"
|
70 |
);
|
71 |
return json_encode($response);
|
79 |
header("Compression-Count: 500");
|
80 |
|
81 |
$response = array(
|
82 |
+
"error" => "Too many requests",
|
83 |
"message" => "Your monthly limit has been exceeded"
|
84 |
);
|
85 |
return json_encode($response);
|
test/unit/TinyCompressClientTest.php
ADDED
@@ -0,0 +1,48 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
require_once dirname( __FILE__ ) . '/TinyCompressSharedTestCase.php';
|
4 |
+
|
5 |
+
class Tiny_Compress_Client_Test extends Tiny_Compress_Shared_TestCase {
|
6 |
+
public static function set_up_before_class() {
|
7 |
+
Tiny_PHP::$client_supported = true;
|
8 |
+
}
|
9 |
+
|
10 |
+
public function set_up() {
|
11 |
+
parent::set_up();
|
12 |
+
$this->client = new MockTinifyClient();
|
13 |
+
Tinify\Tinify::setClient( $this->client );
|
14 |
+
}
|
15 |
+
|
16 |
+
protected function register( $method, $url, $details ) {
|
17 |
+
$this->client->register( $method, $url, $details );
|
18 |
+
}
|
19 |
+
|
20 |
+
public function test_should_return_client_compressor() {
|
21 |
+
$this->assertInstanceOf( 'Tiny_Compress_Client', $this->compressor );
|
22 |
+
}
|
23 |
+
|
24 |
+
public function test_can_create_key_should_return_true() {
|
25 |
+
$this->assertSame( true, $this->compressor->can_create_key() );
|
26 |
+
}
|
27 |
+
|
28 |
+
public function test_create_key_should_set_api_key() {
|
29 |
+
$this->register( 'POST', '/keys', array(
|
30 |
+
'status' => 202,
|
31 |
+
'headers' => array(
|
32 |
+
'content-type' => 'application/json',
|
33 |
+
),
|
34 |
+
'body' => json_encode(array(
|
35 |
+
'key' => 'newkey123',
|
36 |
+
)),
|
37 |
+
));
|
38 |
+
|
39 |
+
$this->compressor->create_key( 'john@example.com', array(
|
40 |
+
'name' => 'John Doe',
|
41 |
+
));
|
42 |
+
|
43 |
+
$this->assertEquals(
|
44 |
+
'newkey123',
|
45 |
+
$this->compressor->get_key()
|
46 |
+
);
|
47 |
+
}
|
48 |
+
}
|
test/unit/TinyCompressFopenTest.php
ADDED
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
require_once dirname( __FILE__ ) . '/TinyCompressSharedTestCase.php';
|
4 |
+
|
5 |
+
class Tiny_Compress_Fopen_Test extends Tiny_Compress_Shared_TestCase {
|
6 |
+
public static function set_up_before_class() {
|
7 |
+
Tiny_PHP::$client_supported = false;
|
8 |
+
}
|
9 |
+
|
10 |
+
public function set_up() {
|
11 |
+
stream_wrapper_unregister( 'https' );
|
12 |
+
stream_wrapper_register( 'https', 'MockHttpStreamWrapper', STREAM_IS_URL );
|
13 |
+
MockHttpStreamWrapper::clear();
|
14 |
+
parent::set_up();
|
15 |
+
}
|
16 |
+
|
17 |
+
public function tear_down() {
|
18 |
+
parent::tear_down();
|
19 |
+
stream_wrapper_restore( 'http' );
|
20 |
+
}
|
21 |
+
|
22 |
+
protected function register( $method, $url, $details ) {
|
23 |
+
MockHttpStreamWrapper::register( $method, $url, $details );
|
24 |
+
}
|
25 |
+
|
26 |
+
public function test_should_return_fopen_compressor_if_client_not_supported() {
|
27 |
+
$this->assertInstanceOf( 'Tiny_Compress_Fopen', $this->compressor );
|
28 |
+
}
|
29 |
+
|
30 |
+
public function test_can_create_key_should_return_false() {
|
31 |
+
$this->assertSame( false, $this->compressor->can_create_key() );
|
32 |
+
}
|
33 |
+
}
|
test/unit/TinyCompressNoClientTest.php
ADDED
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
require_once dirname( __FILE__ ) . '/TinyTestCase.php';
|
4 |
+
|
5 |
+
class Tiny_Compress_No_Client_Test extends Tiny_TestCase {
|
6 |
+
public static function set_up_before_class() {
|
7 |
+
Tiny_PHP::$client_supported = false;
|
8 |
+
Tiny_PHP::$fopen_available = false;
|
9 |
+
}
|
10 |
+
|
11 |
+
public function test_should_throw_error_when_curl_and_fopen_unavailable() {
|
12 |
+
$this->setExpectedException( 'Tiny_Exception' );
|
13 |
+
Tiny_Compress::create( 'api1234' );
|
14 |
+
}
|
15 |
+
}
|
test/unit/TinyCompressNoCurlTest.php
DELETED
@@ -1,28 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
require_once(dirname(__FILE__) . "/TinyTestCase.php");
|
4 |
-
|
5 |
-
class Tiny_Compress_No_Curl_Test extends TinyTestCase {
|
6 |
-
protected $mock;
|
7 |
-
|
8 |
-
public function setUp() {
|
9 |
-
parent::setUp();
|
10 |
-
$this->php_mock = \Mockery::mock('alias:Tiny_PHP');
|
11 |
-
$this->php_mock->shouldReceive('is_curl_available')->andReturn(false);
|
12 |
-
}
|
13 |
-
|
14 |
-
public function testShouldReturnFopenCompressorIfCurlUnavailable() {
|
15 |
-
$this->php_mock->shouldReceive('is_fopen_available')->andReturn(true);
|
16 |
-
$compressor = Tiny_Compress::get_compressor('api1234');
|
17 |
-
$this->assertInstanceOf('Tiny_Compress_Fopen', $compressor);
|
18 |
-
}
|
19 |
-
|
20 |
-
/**
|
21 |
-
* @expectedException Tiny_Exception
|
22 |
-
*/
|
23 |
-
public function testShouldThrowErrorWhenCurlAndFopenUnavailable() {
|
24 |
-
$this->php_mock->shouldReceive('is_fopen_available')->andReturn(false);
|
25 |
-
$compressor = Tiny_Compress::get_compressor('api1234');
|
26 |
-
$this->assertInstanceOf('Tiny_Compress', $compressor);
|
27 |
-
}
|
28 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
test/unit/TinyCompressSharedTestCase.php
ADDED
@@ -0,0 +1,304 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
require_once dirname( __FILE__ ) . '/TinyTestCase.php';
|
4 |
+
|
5 |
+
abstract class Tiny_Compress_Shared_TestCase extends Tiny_TestCase {
|
6 |
+
public function set_up() {
|
7 |
+
parent::set_up();
|
8 |
+
$this->after_compress_called = false;
|
9 |
+
$after_compress_called = &$this->after_compress_called;
|
10 |
+
$callback = function( $compressor ) use ( &$after_compress_called ) {
|
11 |
+
$after_compress_called = true;
|
12 |
+
};
|
13 |
+
$this->compressor = Tiny_Compress::create( 'api1234', $callback );
|
14 |
+
}
|
15 |
+
|
16 |
+
protected abstract function register( $method, $url, $details );
|
17 |
+
|
18 |
+
public function test_should_return_client_compressor() {
|
19 |
+
$this->assertInstanceOf( 'Tiny_Compress', $this->compressor );
|
20 |
+
}
|
21 |
+
|
22 |
+
public function test_get_key_should_return_key() {
|
23 |
+
$this->assertSame( 'api1234', $this->compressor->get_key() );
|
24 |
+
}
|
25 |
+
|
26 |
+
public function test_get_status_should_return_success_status() {
|
27 |
+
$this->register( 'POST', '/shrink', array(
|
28 |
+
'status' => 400,
|
29 |
+
'headers' => array(
|
30 |
+
'content-type' => 'application/json',
|
31 |
+
),
|
32 |
+
'body' => json_encode(array(
|
33 |
+
'error' => 'Input missing',
|
34 |
+
'message' => 'No file provided',
|
35 |
+
)),
|
36 |
+
));
|
37 |
+
|
38 |
+
$this->assertEquals(
|
39 |
+
(object) array(
|
40 |
+
'ok' => true,
|
41 |
+
'message' => null,
|
42 |
+
),
|
43 |
+
$this->compressor->get_status()
|
44 |
+
);
|
45 |
+
|
46 |
+
$this->assertEquals(
|
47 |
+
false,
|
48 |
+
$this->compressor->limit_reached()
|
49 |
+
);
|
50 |
+
|
51 |
+
$this->assertEquals(
|
52 |
+
true,
|
53 |
+
$this->after_compress_called
|
54 |
+
);
|
55 |
+
}
|
56 |
+
|
57 |
+
public function test_get_status_should_return_limit_reached_status() {
|
58 |
+
$this->register( 'POST', '/shrink', array(
|
59 |
+
'status' => 429,
|
60 |
+
'headers' => array(
|
61 |
+
'content-type' => 'application/json',
|
62 |
+
),
|
63 |
+
'body' => json_encode(array(
|
64 |
+
'error' => 'Too many requests',
|
65 |
+
'message' => 'Your monthly limit has been exceeded',
|
66 |
+
)),
|
67 |
+
));
|
68 |
+
|
69 |
+
$this->assertEquals(
|
70 |
+
(object) array(
|
71 |
+
'ok' => true,
|
72 |
+
'message' => null,
|
73 |
+
),
|
74 |
+
$this->compressor->get_status()
|
75 |
+
);
|
76 |
+
|
77 |
+
$this->assertEquals(
|
78 |
+
true,
|
79 |
+
$this->compressor->limit_reached()
|
80 |
+
);
|
81 |
+
|
82 |
+
$this->assertEquals(
|
83 |
+
true,
|
84 |
+
$this->after_compress_called
|
85 |
+
);
|
86 |
+
}
|
87 |
+
|
88 |
+
public function test_get_status_should_return_unauthorized_status() {
|
89 |
+
$this->register( 'POST', '/shrink', array(
|
90 |
+
'status' => 401,
|
91 |
+
'headers' => array(
|
92 |
+
'content-type' => 'application/json',
|
93 |
+
),
|
94 |
+
'body' => json_encode(array(
|
95 |
+
'error' => 'Unauthorized',
|
96 |
+
'message' => 'Credentials are invalid',
|
97 |
+
)),
|
98 |
+
));
|
99 |
+
|
100 |
+
$this->assertEquals(
|
101 |
+
(object) array(
|
102 |
+
'ok' => false,
|
103 |
+
'message' => 'The key that you have entered is not valid',
|
104 |
+
),
|
105 |
+
$this->compressor->get_status()
|
106 |
+
);
|
107 |
+
|
108 |
+
$this->assertEquals(
|
109 |
+
false,
|
110 |
+
$this->compressor->limit_reached()
|
111 |
+
);
|
112 |
+
|
113 |
+
$this->assertEquals(
|
114 |
+
true,
|
115 |
+
$this->after_compress_called
|
116 |
+
);
|
117 |
+
}
|
118 |
+
|
119 |
+
public function test_compress_file_should_save_compressed_file() {
|
120 |
+
$this->register( 'POST', '/shrink', array(
|
121 |
+
'status' => 201,
|
122 |
+
'headers' => array(
|
123 |
+
'location' => 'https://api.tinify.com/output/compressed.png',
|
124 |
+
'content-type' => 'application/json',
|
125 |
+
),
|
126 |
+
'body' => '{}',
|
127 |
+
));
|
128 |
+
|
129 |
+
$handler = array(
|
130 |
+
'status' => 200,
|
131 |
+
'headers' => array(
|
132 |
+
'content-type' => 'image/png',
|
133 |
+
'content-length' => 9,
|
134 |
+
'image-width' => 10,
|
135 |
+
'image-height' => 15,
|
136 |
+
),
|
137 |
+
'body' => 'optimized',
|
138 |
+
);
|
139 |
+
|
140 |
+
$this->register( 'GET', '/output/compressed.png', $handler );
|
141 |
+
$this->register( 'POST', '/output/compressed.png', $handler );
|
142 |
+
|
143 |
+
file_put_contents( $this->vfs->url() . '/image.png', 'unoptimized' );
|
144 |
+
|
145 |
+
$this->assertEquals(
|
146 |
+
array(
|
147 |
+
'input' => array(
|
148 |
+
'size' => 11,
|
149 |
+
'type' => 'image/png',
|
150 |
+
),
|
151 |
+
'output' => array(
|
152 |
+
'size' => 9,
|
153 |
+
'type' => 'image/png',
|
154 |
+
'width' => 10,
|
155 |
+
'height' => 15,
|
156 |
+
'ratio' => round( 9 / 11, 4 ),
|
157 |
+
),
|
158 |
+
),
|
159 |
+
$this->compressor->compress_file( $this->vfs->url() . '/image.png' )
|
160 |
+
);
|
161 |
+
|
162 |
+
$this->assertEquals(
|
163 |
+
false,
|
164 |
+
$this->compressor->limit_reached()
|
165 |
+
);
|
166 |
+
|
167 |
+
$this->assertEquals(
|
168 |
+
true,
|
169 |
+
$this->after_compress_called
|
170 |
+
);
|
171 |
+
}
|
172 |
+
|
173 |
+
public function test_compress_file_should_save_resized_file() {
|
174 |
+
$this->register( 'POST', '/shrink', array(
|
175 |
+
'status' => 201,
|
176 |
+
'headers' => array(
|
177 |
+
'location' => 'https://api.tinify.com/output/compressed.png',
|
178 |
+
'content-type' => 'application/json',
|
179 |
+
),
|
180 |
+
'body' => '{}',
|
181 |
+
));
|
182 |
+
|
183 |
+
$handler = array(
|
184 |
+
'status' => 200,
|
185 |
+
'headers' => array(
|
186 |
+
'content-type' => 'image/png',
|
187 |
+
'content-length' => 5,
|
188 |
+
'image-width' => 6,
|
189 |
+
'image-height' => 9,
|
190 |
+
),
|
191 |
+
'body' => 'small',
|
192 |
+
);
|
193 |
+
|
194 |
+
$this->register( 'GET', '/output/compressed.png', $handler );
|
195 |
+
$this->register( 'POST', '/output/compressed.png', $handler );
|
196 |
+
|
197 |
+
$img = file_get_contents( 'test/fixtures/input-example.jpg' );
|
198 |
+
file_put_contents( $this->vfs->url() . '/image.png', $img );
|
199 |
+
|
200 |
+
$resize = array(
|
201 |
+
'width' => 9,
|
202 |
+
'method' => 'fit',
|
203 |
+
);
|
204 |
+
|
205 |
+
$this->assertEquals(
|
206 |
+
array(
|
207 |
+
'input' => array(
|
208 |
+
'size' => 641206,
|
209 |
+
'type' => 'image/png',
|
210 |
+
),
|
211 |
+
'output' => array(
|
212 |
+
'size' => 5,
|
213 |
+
'type' => 'image/png',
|
214 |
+
'width' => 6,
|
215 |
+
'height' => 9,
|
216 |
+
'ratio' => round( 5 / 641206, 4 ),
|
217 |
+
'resized' => true,
|
218 |
+
),
|
219 |
+
),
|
220 |
+
$this->compressor->compress_file( $this->vfs->url() . '/image.png', $resize )
|
221 |
+
);
|
222 |
+
|
223 |
+
$this->assertEquals(
|
224 |
+
false,
|
225 |
+
$this->compressor->limit_reached()
|
226 |
+
);
|
227 |
+
|
228 |
+
$this->assertEquals(
|
229 |
+
true,
|
230 |
+
$this->after_compress_called
|
231 |
+
);
|
232 |
+
}
|
233 |
+
|
234 |
+
public function test_compress_file_should_return_unauthorized_status() {
|
235 |
+
$this->register( 'POST', '/shrink', array(
|
236 |
+
'status' => 401,
|
237 |
+
'headers' => array(
|
238 |
+
'content-type' => 'application/json',
|
239 |
+
),
|
240 |
+
'body' => json_encode(array(
|
241 |
+
'error' => 'Unauthorized',
|
242 |
+
'message' => 'Credentials are invalid',
|
243 |
+
)),
|
244 |
+
));
|
245 |
+
|
246 |
+
file_put_contents( $this->vfs->url() . '/image.png', 'unoptimized' );
|
247 |
+
|
248 |
+
$exception = null;
|
249 |
+
try {
|
250 |
+
$this->compressor->compress_file( $this->vfs->url() . '/image.png' );
|
251 |
+
} catch (Exception $err) {
|
252 |
+
$exception = $err;
|
253 |
+
}
|
254 |
+
|
255 |
+
$this->assertEquals(
|
256 |
+
false,
|
257 |
+
$this->compressor->limit_reached()
|
258 |
+
);
|
259 |
+
|
260 |
+
$this->assertEquals(
|
261 |
+
true,
|
262 |
+
$this->after_compress_called
|
263 |
+
);
|
264 |
+
|
265 |
+
$this->setExpectedException( 'Tiny_Exception' );
|
266 |
+
throw $exception;
|
267 |
+
}
|
268 |
+
|
269 |
+
public function test_get_compression_count_should_return_null_before_compresion() {
|
270 |
+
$this->assertSame( null, $this->compressor->get_compression_count() );
|
271 |
+
}
|
272 |
+
|
273 |
+
public function test_get_compression_count_should_return_count() {
|
274 |
+
$this->register( 'POST', '/shrink', array(
|
275 |
+
'status' => 201,
|
276 |
+
'headers' => array(
|
277 |
+
'location' => 'https://api.tinify.com/output/compressed.png',
|
278 |
+
'content-type' => 'application/json',
|
279 |
+
'compression-count' => 12,
|
280 |
+
),
|
281 |
+
'body' => '{}',
|
282 |
+
));
|
283 |
+
|
284 |
+
$handler = array(
|
285 |
+
'status' => 200,
|
286 |
+
'headers' => array(
|
287 |
+
'content-type' => 'image/png',
|
288 |
+
'content-length' => 9,
|
289 |
+
'image-width' => 10,
|
290 |
+
'image-height' => 15,
|
291 |
+
'compression-count' => 12,
|
292 |
+
),
|
293 |
+
'body' => 'optimized',
|
294 |
+
);
|
295 |
+
|
296 |
+
$this->register( 'GET', '/output/compressed.png', $handler );
|
297 |
+
$this->register( 'POST', '/output/compressed.png', $handler );
|
298 |
+
|
299 |
+
file_put_contents( $this->vfs->url() . '/image.png', 'unoptimized' );
|
300 |
+
$this->compressor->compress_file( $this->vfs->url() . '/image.png' );
|
301 |
+
|
302 |
+
$this->assertSame( 12, $this->compressor->get_compression_count() );
|
303 |
+
}
|
304 |
+
}
|
test/unit/TinyCompressTest.php
CHANGED
@@ -1,23 +1,20 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
require_once
|
4 |
|
5 |
-
class
|
6 |
-
|
|
|
|
|
|
|
7 |
|
8 |
-
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
}
|
13 |
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
public function testShouldReturnCurlCompressorByDefault() {
|
20 |
-
$compressor = Tiny_Compress::get_compressor('api1234');
|
21 |
-
$this->assertInstanceOf('Tiny_Compress_Curl', $compressor);
|
22 |
-
}
|
23 |
}
|
1 |
<?php
|
2 |
|
3 |
+
require_once dirname( __FILE__ ) . '/TinyTestCase.php';
|
4 |
|
5 |
+
class Tiny_Compress_Common extends Tiny_TestCase {
|
6 |
+
public function test_estimate_cost_free() {
|
7 |
+
$this->assertEquals( 150 * 0,
|
8 |
+
Tiny_Compress::estimate_cost( 150, 0 ) );
|
9 |
+
}
|
10 |
|
11 |
+
public function test_estimate_cost_normal_and_free() {
|
12 |
+
$this->assertEquals( 350 * 0 + 2650 * 0.009,
|
13 |
+
Tiny_Compress::estimate_cost( 3000, 150 ) );
|
14 |
+
}
|
|
|
15 |
|
16 |
+
public function test_estimate_cost_cheap_and_normal_and_free() {
|
17 |
+
$this->assertEquals( 500 * 0 + 9500 * 0.009 + 40000 * 0.002,
|
18 |
+
Tiny_Compress::estimate_cost( 50000, 0 ) );
|
19 |
+
}
|
|
|
|
|
|
|
|
|
|
|
20 |
}
|
test/unit/TinyExceptionTest.php
ADDED
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
require_once dirname( __FILE__ ) . '/TinyTestCase.php';
|
4 |
+
|
5 |
+
class Tiny_Exception_Test extends Tiny_TestCase {
|
6 |
+
public function test_constructor_creates_exception_with_message() {
|
7 |
+
$err = new Tiny_Exception( 'Message' );
|
8 |
+
$this->assertInstanceOf( 'Tiny_Exception', $err );
|
9 |
+
}
|
10 |
+
|
11 |
+
public function test_constructor_creates_exception_with_message_and_error() {
|
12 |
+
$err = new Tiny_Exception( 'Message', 'ErrorType' );
|
13 |
+
$this->assertInstanceOf( 'Tiny_Exception', $err );
|
14 |
+
}
|
15 |
+
|
16 |
+
public function test_constructor_throws_if_message_is_not_a_string() {
|
17 |
+
$this->setExpectedException( 'InvalidArgumentException' );
|
18 |
+
new Tiny_Exception( 404, 'ErrorType' );
|
19 |
+
}
|
20 |
+
|
21 |
+
public function test_constructor_throws_if_error_is_not_a_string() {
|
22 |
+
$this->setExpectedException( 'InvalidArgumentException' );
|
23 |
+
new Tiny_Exception( 'Message', new Exception( 'err' ) );
|
24 |
+
}
|
25 |
+
}
|
test/unit/TinyImageDuplicateTest.php
ADDED
@@ -0,0 +1,70 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
require_once dirname( __FILE__ ) . '/TinyTestCase.php';
|
4 |
+
|
5 |
+
class Tiny_Image_Duplicate_Test extends Tiny_TestCase {
|
6 |
+
public function set_up() {
|
7 |
+
parent::set_up();
|
8 |
+
|
9 |
+
$this->wp->addImageSize( 'medium-2', array( 'width' => 300, 'height' => 300 ) );
|
10 |
+
$this->wp->addImageSize( 'custom-thumbnail', array( 'width' => 175, 'height' => 175 ) );
|
11 |
+
$this->wp->addImageSize( 'custom-thumbnail-2', array( 'width' => 175, 'height' => 175 ) );
|
12 |
+
|
13 |
+
$this->wp->addOption( 'tinypng_sizes[medium-2]', 'on' );
|
14 |
+
$this->wp->addOption( 'tinypng_sizes[custom-thumbnail]', 'off' );
|
15 |
+
$this->wp->addOption( 'tinypng_sizes[custom-thumbnail-2]', 'on' );
|
16 |
+
$this->wp->addOption( 'tinypng_sizes[custom-thumbnail-3]', 'on' );
|
17 |
+
|
18 |
+
$this->wp->createImagesFromJSON( $this->json( 'image_filesystem_data' ) );
|
19 |
+
$this->wp->setTinyMetadata( 1, $this->json( 'image_database_metadata' ) );
|
20 |
+
$this->subject = new Tiny_Image( 1, $this->json( '_wp_attachment_metadata_duplicates' ) );
|
21 |
+
}
|
22 |
+
|
23 |
+
public function test_get_images_should_return_all_images() {
|
24 |
+
$this->assertEquals( array(
|
25 |
+
Tiny_Image::ORIGINAL,
|
26 |
+
'medium',
|
27 |
+
'thumbnail',
|
28 |
+
'twentyfourteen-full-width',
|
29 |
+
'custom-thumbnail',
|
30 |
+
'custom-thumbnail-2',
|
31 |
+
'custom-thumbnail-3',
|
32 |
+
'failed',
|
33 |
+
'large',
|
34 |
+
'medium-2',
|
35 |
+
'small',
|
36 |
+
), array_keys( $this->subject->get_image_sizes() ) );
|
37 |
+
}
|
38 |
+
|
39 |
+
public function test_filter_images_should_filter_correctly() {
|
40 |
+
$this->assertEquals( array(
|
41 |
+
Tiny_Image::ORIGINAL,
|
42 |
+
'medium',
|
43 |
+
), array_keys( $this->subject->filter_image_sizes( 'compressed' ) ) );
|
44 |
+
}
|
45 |
+
|
46 |
+
public function test_filter_images_should_filter_duplicates_correctly() {
|
47 |
+
$this->assertEquals( array(
|
48 |
+
'medium-2',
|
49 |
+
'custom-thumbnail',
|
50 |
+
'custom-thumbnail-3',
|
51 |
+
), array_keys( $this->subject->filter_image_sizes( 'is_duplicate' ) ) );
|
52 |
+
}
|
53 |
+
|
54 |
+
public function test_duplicate_images_should_be_linked_to_primary_size() {
|
55 |
+
$this->assertEquals(
|
56 |
+
'medium',
|
57 |
+
$this->subject->get_image_size( 'medium-2' )->duplicate_of_size()
|
58 |
+
);
|
59 |
+
|
60 |
+
$this->assertEquals(
|
61 |
+
'custom-thumbnail-2',
|
62 |
+
$this->subject->get_image_size( 'custom-thumbnail' )->duplicate_of_size()
|
63 |
+
);
|
64 |
+
|
65 |
+
$this->assertEquals(
|
66 |
+
'custom-thumbnail-2',
|
67 |
+
$this->subject->get_image_size( 'custom-thumbnail-3' )->duplicate_of_size()
|
68 |
+
);
|
69 |
+
}
|
70 |
+
}
|
test/unit/TinyImageEmptyTest.php
ADDED
@@ -0,0 +1,26 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
require_once dirname( __FILE__ ) . '/TinyTestCase.php';
|
4 |
+
|
5 |
+
class Tiny_Image_Empty_Test extends Tiny_TestCase {
|
6 |
+
public function set_up() {
|
7 |
+
parent::set_up();
|
8 |
+
|
9 |
+
$this->wp->createImagesFromJSON( $this->json( 'image_filesystem_data' ) );
|
10 |
+
$this->wp->setTinyMetadata( 1, '' );
|
11 |
+
$this->subject = new Tiny_Image( 1, $this->json( '_wp_attachment_metadata' ) );
|
12 |
+
}
|
13 |
+
|
14 |
+
public function test_get_savings() {
|
15 |
+
$this->assertEquals( 0, $this->subject->get_savings( $this->subject->get_statistics() ) );
|
16 |
+
}
|
17 |
+
|
18 |
+
public function test_get_statistics() {
|
19 |
+
$this->assertEquals( array(
|
20 |
+
'initial_total_size' => 328670,
|
21 |
+
'optimized_total_size' => 328670,
|
22 |
+
'image_sizes_optimized' => 0,
|
23 |
+
'available_unoptimized_sizes' => 4,
|
24 |
+
), $this->subject->get_statistics() );
|
25 |
+
}
|
26 |
+
}
|
test/unit/TinyImageSizeTest.php
ADDED
@@ -0,0 +1,158 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
require_once dirname( __FILE__ ) . '/TinyTestCase.php';
|
4 |
+
|
5 |
+
class Tiny_Image_Size_Test extends Tiny_TestCase {
|
6 |
+
public function set_up() {
|
7 |
+
parent::set_up();
|
8 |
+
|
9 |
+
$this->wp->createImagesFromJSON( $this->json( 'image_filesystem_data' ) );
|
10 |
+
$this->wp->setTinyMetadata( 1, $this->json( 'image_database_metadata' ) );
|
11 |
+
$tiny_image = new Tiny_Image( 1, $this->json( '_wp_attachment_metadata' ) );
|
12 |
+
|
13 |
+
$this->original = $tiny_image->get_image_size();
|
14 |
+
$this->thumbnail = $tiny_image->get_image_size( 'thumbnail' );
|
15 |
+
$this->small = $tiny_image->get_image_size( 'small' );
|
16 |
+
$this->medium = $tiny_image->get_image_size( 'medium' );
|
17 |
+
$this->large = $tiny_image->get_image_size( 'large' );
|
18 |
+
}
|
19 |
+
|
20 |
+
public function test_end_time_should_return_end_from_meta() {
|
21 |
+
$this->assertEquals( 1447925138, $this->original->end_time() );
|
22 |
+
}
|
23 |
+
|
24 |
+
public function test_end_time_should_return_end_from_timestamp_if_end_is_unavailable() {
|
25 |
+
$this->assertEquals( 1437925244, $this->thumbnail->end_time() );
|
26 |
+
}
|
27 |
+
|
28 |
+
public function test_end_time_should_return_null_if_unavailable() {
|
29 |
+
$this->assertEquals( null, $this->medium->end_time() );
|
30 |
+
}
|
31 |
+
|
32 |
+
public function test_add_tiny_meta_start_should_add_start_time() {
|
33 |
+
$this->large->add_tiny_meta_start();
|
34 |
+
$this->assertEqualWithinDelta( time(), $this->large->meta['start'], 2 );
|
35 |
+
}
|
36 |
+
|
37 |
+
public function test_add_tiny_meta_start_should_unset_previous_response() {
|
38 |
+
$this->medium->add_tiny_meta_start();
|
39 |
+
$this->assertEqualWithinDelta( time(), $this->medium->meta['start'], 2 );
|
40 |
+
}
|
41 |
+
|
42 |
+
public function test_add_tiny_meta_should_add_end_time() {
|
43 |
+
$this->large->add_tiny_meta_start();
|
44 |
+
$this->large->add_tiny_meta( array( 'input' => array( 'size' => 1024 ), 'output' => array( 'size' => 1024 ) ) );
|
45 |
+
$this->assertEqualWithinDelta( time(), $this->large->meta['end'], 2 );
|
46 |
+
}
|
47 |
+
|
48 |
+
public function test_add_response_should_response() {
|
49 |
+
$this->large->add_tiny_meta_start();
|
50 |
+
$this->large->add_tiny_meta( array( 'input' => array( 'size' => 1024 ), 'output' => array( 'size' => 1024 ) ) );
|
51 |
+
$actual = $this->large->meta;
|
52 |
+
unset( $actual['end'] );
|
53 |
+
$this->assertEquals( array( 'input' => array( 'size' => 1024 ), 'output' => array( 'size' => 1024 ) ), $actual );
|
54 |
+
}
|
55 |
+
|
56 |
+
public function test_add_response_should_not_add_if_no_request_was_made() {
|
57 |
+
$this->large->add_tiny_meta( array( 'input' => array( 'size' => 1024 ), 'output' => array( 'size' => 1024 ) ) );
|
58 |
+
$this->assertEquals( array(), $this->large->meta );
|
59 |
+
}
|
60 |
+
|
61 |
+
public function test_add_exception_should_add_message_and_error() {
|
62 |
+
$this->large->add_tiny_meta_start();
|
63 |
+
$this->large->add_tiny_meta_error( new Tiny_Exception( 'Image could not be found', 'Not found' ) );
|
64 |
+
unset( $this->large->meta['timestamp'] );
|
65 |
+
$this->assertEquals( array( 'error' => 'Not found', 'message' => 'Image could not be found' ), $this->large->meta );
|
66 |
+
}
|
67 |
+
|
68 |
+
public function test_add_exception_should_add_timestamp() {
|
69 |
+
$this->large->add_tiny_meta_start();
|
70 |
+
$this->large->add_tiny_meta_error( new Tiny_Exception( 'Image could not be found', 'Not found' ) );
|
71 |
+
$this->assertEqualWithinDelta( time(), $this->large->meta['timestamp'], 2 );
|
72 |
+
}
|
73 |
+
|
74 |
+
public function test_add_exception_should_not_add_if_no_request_was_made() {
|
75 |
+
$this->large->add_tiny_meta_error( new Tiny_Exception( 'Image could not be found', 'Not found' ) );
|
76 |
+
unset( $this->large->meta['timestamp'] );
|
77 |
+
$this->assertEquals( array(), $this->large->meta );
|
78 |
+
}
|
79 |
+
|
80 |
+
public function test_image_has_been_compressed_if_meta_has_output() {
|
81 |
+
$this->assertTrue( $this->original->has_been_compressed() );
|
82 |
+
}
|
83 |
+
|
84 |
+
public function test_image_has_not_been_compressed_if_meta_does_not_have_output() {
|
85 |
+
$this->assertFalse( $this->large->has_been_compressed() );
|
86 |
+
}
|
87 |
+
|
88 |
+
public function test_image_size_filename() {
|
89 |
+
$image_size = new Tiny_Image_Size( 'random_file_name.jpg' );
|
90 |
+
$this->assertEquals( 'random_file_name.jpg', $image_size->filename );
|
91 |
+
}
|
92 |
+
|
93 |
+
public function test_image_does_not_still_exist_if_file_does_not_exist() {
|
94 |
+
$image = new Tiny_Image_Size( 'file_that_does_not_exist.jpg' );
|
95 |
+
$this->assertFalse( $image->still_exists() );
|
96 |
+
}
|
97 |
+
|
98 |
+
public function test_image_still_exists_if_file_exists() {
|
99 |
+
$this->assertTrue( $this->original->still_exists() );
|
100 |
+
}
|
101 |
+
|
102 |
+
public function test_image_compressed_should_return_true_if_file_exists_and_size_is_same() {
|
103 |
+
$this->assertTrue( $this->original->compressed() );
|
104 |
+
}
|
105 |
+
|
106 |
+
public function test_image_compressed_should_return_false_if_size_is_inequal_to_meta() {
|
107 |
+
$this->wp->createImage( 37857, '2015/09', 'tinypng_gravatar-150x150.png' );
|
108 |
+
$this->assertFalse( $this->thumbnail->compressed() );
|
109 |
+
}
|
110 |
+
|
111 |
+
public function test_image_modified_should_return_true_if_size_is_inequal_to_meta() {
|
112 |
+
$this->wp->createImage( 37857, '2015/09', 'tinypng_gravatar-150x150.png' );
|
113 |
+
$this->assertTrue( $this->thumbnail->modified() );
|
114 |
+
}
|
115 |
+
|
116 |
+
public function test_image_modified_should_return_false_if_compressed_correctly() {
|
117 |
+
$this->assertFalse( $this->original->modified() );
|
118 |
+
}
|
119 |
+
|
120 |
+
public function test_uncompressed_should_return_true_if_image_exist_and_is_uncompressed() {
|
121 |
+
$this->wp->createImage( 37857, '2015/09', 'tinypng_gravatar-150x150.png' );
|
122 |
+
$this->assertTrue( $this->thumbnail->uncompressed() );
|
123 |
+
}
|
124 |
+
|
125 |
+
public function test_uncompressed_should_return_false_if_image_exist_and_is_compressed() {
|
126 |
+
$this->assertFalse( $this->original->uncompressed() );
|
127 |
+
}
|
128 |
+
|
129 |
+
public function test_in_progress_should_return_false_if_meta_start_is_long_ago() {
|
130 |
+
$image_size = new Tiny_Image_Size( 'test.jpg' );
|
131 |
+
$one_hour_ago = date( 'U' ) - (60 * 60);
|
132 |
+
$image_size->meta['start'] = $one_hour_ago;
|
133 |
+
$this->assertFalse( $image_size->in_progress() );
|
134 |
+
}
|
135 |
+
|
136 |
+
public function test_in_progress_should_return_truef_meta_start_is_recent() {
|
137 |
+
$image_size = new Tiny_Image_Size( 'test.jpg' );
|
138 |
+
$two_minutes_ago = date( 'U' ) - (60 * 2);
|
139 |
+
$image_size->meta['start'] = $two_minutes_ago;
|
140 |
+
$this->assertTrue( $image_size->in_progress() );
|
141 |
+
}
|
142 |
+
|
143 |
+
public function test_in_progress_should_return_false_if_meta_contains_start_and_output() {
|
144 |
+
$this->assertFalse( $this->original->in_progress() );
|
145 |
+
}
|
146 |
+
|
147 |
+
public function test_in_progress_should_return_false_if_meta_contains_timestamp_and_output() {
|
148 |
+
$this->assertFalse( $this->thumbnail->in_progress() );
|
149 |
+
}
|
150 |
+
|
151 |
+
public function test_resized_should_return_true_if_meta_have_output_and_resized() {
|
152 |
+
$this->assertTrue( $this->original->resized() );
|
153 |
+
}
|
154 |
+
|
155 |
+
public function test_resized_should_return_false_if_meta_have_output_and_not_resized() {
|
156 |
+
$this->assertFalse( $this->thumbnail->resized() );
|
157 |
+
}
|
158 |
+
}
|
test/unit/TinyImageTest.php
ADDED
@@ -0,0 +1,124 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
require_once dirname( __FILE__ ) . '/TinyTestCase.php';
|
4 |
+
|
5 |
+
class Tiny_Image_Test extends Tiny_TestCase {
|
6 |
+
public function set_up() {
|
7 |
+
parent::set_up();
|
8 |
+
|
9 |
+
$this->wp->createImagesFromJSON( $this->json( 'image_filesystem_data' ) );
|
10 |
+
$this->wp->setTinyMetadata( 1, $this->json( 'image_database_metadata' ) );
|
11 |
+
$this->subject = new Tiny_Image( 1, $this->json( '_wp_attachment_metadata' ) );
|
12 |
+
}
|
13 |
+
|
14 |
+
public function test_tiny_post_meta_key_may_never_change() {
|
15 |
+
$this->assertEquals( '61b16225f107e6f0a836bf19d47aa0fd912f8925', sha1( Tiny_Image::META_KEY ) );
|
16 |
+
}
|
17 |
+
|
18 |
+
public function test_update_wp_metadata_should_not_update_with_no_resized_original() {
|
19 |
+
$tiny_image = new Tiny_Image( 150, $this->json( '_wp_attachment_metadata' ) );
|
20 |
+
$tiny_image_metadata = $tiny_image->get_wp_metadata();
|
21 |
+
$this->assertEquals( 1256, $tiny_image_metadata['width'] );
|
22 |
+
$this->assertEquals( 1256, $tiny_image_metadata['height'] );
|
23 |
+
}
|
24 |
+
|
25 |
+
public function test_update_wp_metadata_should_update_with_resized_original() {
|
26 |
+
$tiny_image = new Tiny_Image( 150, $this->json( '_wp_attachment_metadata' ) );
|
27 |
+
$response = array( 'output' => array( 'width' => 200, 'height' => 100 ) );
|
28 |
+
$tiny_image->get_image_size()->add_tiny_meta_start();
|
29 |
+
$tiny_image->get_image_size()->add_tiny_meta( $response );
|
30 |
+
$tiny_image->add_wp_metadata( Tiny_Image::ORIGINAL, $tiny_image->get_image_size() );
|
31 |
+
$tiny_image_metadata = $tiny_image->get_wp_metadata();
|
32 |
+
$this->assertEquals( 200, $tiny_image_metadata['width'] );
|
33 |
+
$this->assertEquals( 100, $tiny_image_metadata['height'] );
|
34 |
+
}
|
35 |
+
|
36 |
+
public function test_get_images_should_return_all_images() {
|
37 |
+
$this->assertEquals( array(
|
38 |
+
Tiny_Image::ORIGINAL,
|
39 |
+
'medium',
|
40 |
+
'thumbnail',
|
41 |
+
'twentyfourteen-full-width',
|
42 |
+
'failed',
|
43 |
+
'large',
|
44 |
+
'small',
|
45 |
+
), array_keys( $this->subject->get_image_sizes() ) );
|
46 |
+
}
|
47 |
+
|
48 |
+
public function test_filter_images_should_filter_correctly() {
|
49 |
+
$this->assertEquals( array(
|
50 |
+
Tiny_Image::ORIGINAL,
|
51 |
+
'medium',
|
52 |
+
'thumbnail',
|
53 |
+
), array_keys( $this->subject->filter_image_sizes( 'compressed' ) ) );
|
54 |
+
}
|
55 |
+
|
56 |
+
public function test_filter_images_should_filter_correctly_when_sizes_are_given() {
|
57 |
+
$this->assertEquals( array(
|
58 |
+
Tiny_Image::ORIGINAL
|
59 |
+
), array_keys( $this->subject->filter_image_sizes( 'compressed', array( Tiny_Image::ORIGINAL, 'invalid' ) ) )
|
60 |
+
);
|
61 |
+
}
|
62 |
+
|
63 |
+
public function test_get_count_should_add_count_correctly() {
|
64 |
+
$this->assertEquals(array(
|
65 |
+
'compressed' => 3,
|
66 |
+
'resized' => 1,
|
67 |
+
), $this->subject->get_count( array( 'compressed', 'resized' ) )
|
68 |
+
);
|
69 |
+
}
|
70 |
+
|
71 |
+
public function test_get_count_should_add_count_correctly_when_sizes_are_given() {
|
72 |
+
$this->assertEquals(array(
|
73 |
+
'compressed' => 1,
|
74 |
+
'resized' => 1,
|
75 |
+
), $this->subject->get_count( array( 'compressed', 'resized' ), array( Tiny_Image::ORIGINAL, 'invalid' ) )
|
76 |
+
);
|
77 |
+
}
|
78 |
+
|
79 |
+
public function test_get_latest_error_should_return_message() {
|
80 |
+
$this->subject->get_image_size()->add_tiny_meta_start( 'large' );
|
81 |
+
$this->subject->get_image_size()->add_tiny_meta_error( new Tiny_Exception( 'Could not download output', 'OutputError' ), 'large' );
|
82 |
+
$this->assertEquals( 'Could not download output', $this->subject->get_latest_error() );
|
83 |
+
}
|
84 |
+
|
85 |
+
public function test_get_statistics() {
|
86 |
+
$this->assertEquals( array(
|
87 |
+
'initial_total_size' => 360542,
|
88 |
+
'optimized_total_size' => 328670,
|
89 |
+
'image_sizes_optimized' => 3,
|
90 |
+
'available_unoptimized_sizes' => 1,
|
91 |
+
), $this->subject->get_statistics() );
|
92 |
+
}
|
93 |
+
|
94 |
+
public function test_get_image_sizes_available_for_compression_when_file_modified() {
|
95 |
+
$this->wp->createImage( 37857, '2015/09', 'tinypng_gravatar-150x150.png' );
|
96 |
+
$statistics = $this->subject->get_statistics();
|
97 |
+
$this->assertEquals( 2, $statistics['available_unoptimized_sizes'] );
|
98 |
+
}
|
99 |
+
|
100 |
+
public function test_get_savings() {
|
101 |
+
$this->assertEquals( 8.8, $this->subject->get_savings( $this->subject->get_statistics() ) );
|
102 |
+
}
|
103 |
+
|
104 |
+
public function test_get_optimization_statistics() {
|
105 |
+
$wpdb_wp_metadata = serialize( $this->json( '_wp_attachment_metadata' ) );
|
106 |
+
$wpdb_tiny_metadata = serialize( $this->json( 'image_database_metadata' ) );
|
107 |
+
$wpdb_results = array(
|
108 |
+
array( 'ID' => 1, 'post_title' => 'I am the one and only', 'meta_value' => $wpdb_wp_metadata, 'tiny_meta_value' => $wpdb_wp_metadata ),
|
109 |
+
array( 'ID' => 3628, 'post_title' => 'Ferrari.jpeg', 'meta_value' => '', 'tiny_meta_value' => '' ),
|
110 |
+
array( 'ID' => 4350, 'post_title' => 'IMG 3092', 'meta_value' => '', 'tiny_meta_value' => '' ),
|
111 |
+
);
|
112 |
+
$this->assertEquals(
|
113 |
+
array(
|
114 |
+
'uploaded-images' => 3,
|
115 |
+
'optimized-image-sizes' => 0,
|
116 |
+
'available-unoptimised-sizes' => 4,
|
117 |
+
'optimized-library-size' => 328670,
|
118 |
+
'unoptimized-library-size' => 328670,
|
119 |
+
'available-for-optimization' => array( array( 'ID' => 1, 'post_title' => 'I am the one and only' ) ),
|
120 |
+
),
|
121 |
+
Tiny_Image::get_optimization_statistics( $wpdb_results )
|
122 |
+
);
|
123 |
+
}
|
124 |
+
}
|
test/unit/TinyMetadataImageTest.php
DELETED
@@ -1,155 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
require_once(dirname(__FILE__) . "/TinyTestCase.php");
|
4 |
-
|
5 |
-
class Tiny_Metadata_Image_Test extends TinyTestCase {
|
6 |
-
public function setUp() {
|
7 |
-
parent::setUp();
|
8 |
-
|
9 |
-
$meta = array(Tiny_Metadata::META_KEY => array(
|
10 |
-
Tiny_Metadata::ORIGINAL => array(
|
11 |
-
"input" => array("size" => 146480),
|
12 |
-
"output" => array("size" => 137856, "resized" => true),
|
13 |
-
'end' => 1447925138,
|
14 |
-
'start' => 1447925134),
|
15 |
-
"thumbnail" => array(
|
16 |
-
"input" => array("size" => 46480),
|
17 |
-
"output" => array("size" => 37856),
|
18 |
-
'timestamp' => 1447925244),
|
19 |
-
"medium" => array(
|
20 |
-
"input" => array("size" => 66480),
|
21 |
-
"output" => array("size" => 57856)),
|
22 |
-
"small" => array(
|
23 |
-
"input" => array("size" => 66480),
|
24 |
-
'start' => 1447925134),
|
25 |
-
));
|
26 |
-
$this->wp->setMetadata(1, $meta);
|
27 |
-
$this->wp->createImagesFromMeta($this->json("wp_meta_default_sizes"), $meta, 137856);
|
28 |
-
$metadata = new Tiny_Metadata(1, $this->json("wp_meta_default_sizes"));
|
29 |
-
$this->original = $metadata->get_image();
|
30 |
-
$this->thumbnail = $metadata->get_image('thumbnail');
|
31 |
-
$this->small = $metadata->get_image('small');
|
32 |
-
$this->medium = $metadata->get_image('medium');
|
33 |
-
$this->large = $metadata->get_image('large');
|
34 |
-
}
|
35 |
-
|
36 |
-
public function testEndTimeShouldReturnEndFromMeta() {
|
37 |
-
$this->assertEquals(1447925138, $this->original->end_time());
|
38 |
-
}
|
39 |
-
|
40 |
-
public function testEndTimeShouldReturnEndFromTimestampIfEndIsUnavailable() {
|
41 |
-
$this->assertEquals(1447925244, $this->thumbnail->end_time());
|
42 |
-
}
|
43 |
-
|
44 |
-
public function testEndTimeShouldReturnNullIfUnavailable() {
|
45 |
-
$this->assertEquals(null, $this->medium->end_time());
|
46 |
-
}
|
47 |
-
|
48 |
-
public function testAddRequestShouldAddStartTime() {
|
49 |
-
$this->large->add_request();
|
50 |
-
$this->assertEqualWithinDelta(time(), $this->large->meta['start'], 2);
|
51 |
-
}
|
52 |
-
|
53 |
-
public function testAddRequestShouldUnsetPreviousResponse() {
|
54 |
-
$this->medium->add_request();
|
55 |
-
$this->assertEqualWithinDelta(time(), $this->medium->meta['start'], 2);
|
56 |
-
}
|
57 |
-
|
58 |
-
public function testAddResponseShouldAddEndTime() {
|
59 |
-
$this->large->add_request();
|
60 |
-
$this->large->add_response(array('input' => array('size' => 1024), 'output' => array('size' => 1024)));
|
61 |
-
$this->assertEqualWithinDelta(time(), $this->large->meta['end'], 2);
|
62 |
-
}
|
63 |
-
|
64 |
-
public function testAddResponseShouldResponse() {
|
65 |
-
$this->large->add_request();
|
66 |
-
$this->large->add_response(array('input' => array('size' => 1024), 'output' => array('size' => 1024)));
|
67 |
-
$actual = $this->large->meta;
|
68 |
-
unset($actual['end']);
|
69 |
-
$this->assertEquals(array('input' => array('size' => 1024), 'output' => array('size' => 1024)), $actual);
|
70 |
-
}
|
71 |
-
|
72 |
-
public function testAddResponseShouldNotAddIfNoRequestWasMade() {
|
73 |
-
$this->large->add_response(array('input' => array('size' => 1024), 'output' => array('size' => 1024)));
|
74 |
-
$this->assertEquals(null, $this->large->meta);
|
75 |
-
}
|
76 |
-
|
77 |
-
public function testAddExceptionShouldAddMessageAndError() {
|
78 |
-
$this->large->add_request();
|
79 |
-
$this->large->add_exception(new Tiny_Exception("Image could not be found", "Not found"));
|
80 |
-
unset($this->large->meta['timestamp']);
|
81 |
-
$this->assertEquals(array('error' => 'Not found', 'message' => 'Image could not be found'), $this->large->meta);
|
82 |
-
}
|
83 |
-
|
84 |
-
public function testAddExceptionShouldAddTimestamp() {
|
85 |
-
$this->large->add_request();
|
86 |
-
$this->large->add_exception(new Tiny_Exception("Image could not be found", "Not found"));
|
87 |
-
$this->assertEqualWithinDelta(time(), $this->large->meta['timestamp'], 2);
|
88 |
-
}
|
89 |
-
|
90 |
-
public function testAddExceptionShouldNotAddIfNoRequestWasMade() {
|
91 |
-
$this->large->add_exception(new Tiny_Exception("Image could not be found", "Not found"));
|
92 |
-
unset($this->large->meta['timestamp']);
|
93 |
-
$this->assertEquals(null, $this->large->meta);
|
94 |
-
}
|
95 |
-
|
96 |
-
public function testImageHasBeenCompressedIfMetaHasOutput() {
|
97 |
-
$this->assertTrue($this->original->has_been_compressed());
|
98 |
-
}
|
99 |
-
|
100 |
-
public function testImageHasNotBeenCompressedIfMetaDoesNotHaveOutput() {
|
101 |
-
$this->assertFalse($this->large->has_been_compressed());
|
102 |
-
}
|
103 |
-
|
104 |
-
public function testImageDoesNotStillExistIfFileDoesNotExist() {
|
105 |
-
$image = new Tiny_Metadata_Image('does_not_exist');
|
106 |
-
$this->assertFalse($image->still_exists());
|
107 |
-
}
|
108 |
-
|
109 |
-
public function testImageStillExistsIfFileExists() {
|
110 |
-
$this->assertTrue($this->original->still_exists());
|
111 |
-
}
|
112 |
-
|
113 |
-
public function testImageCompressedShouldReturnTrueIfFileExistsAndSizeIsSame() {
|
114 |
-
$this->assertTrue($this->original->compressed());
|
115 |
-
}
|
116 |
-
|
117 |
-
public function testImageCompressedShouldReturnFalseIfSizeIsInequalToMeta() {
|
118 |
-
$this->wp->createImage(37857, "2015/09", "tinypng_gravatar-150x150.png");
|
119 |
-
$this->assertFalse($this->thumbnail->compressed());
|
120 |
-
}
|
121 |
-
|
122 |
-
public function testImageModifiedShouldReturnTrueIfSizeIsInequalToMeta() {
|
123 |
-
$this->wp->createImage(37857, "2015/09", "tinypng_gravatar-150x150.png");
|
124 |
-
$this->assertTrue($this->thumbnail->modified());
|
125 |
-
}
|
126 |
-
|
127 |
-
public function testImageModifiedShouldReturnFalseIfCompressedCorrectly() {
|
128 |
-
$this->assertFalse($this->original->modified());
|
129 |
-
}
|
130 |
-
|
131 |
-
public function testUncompressedShouldReturnTrueIfImageExistAndIsUncompressed() {
|
132 |
-
$this->wp->createImage(37857, "2015/09", "tinypng_gravatar-150x150.png");
|
133 |
-
$this->assertTrue($this->thumbnail->uncompressed());
|
134 |
-
}
|
135 |
-
|
136 |
-
public function testUncompressedShouldReturnFalseIfImageExistAndIsCompressed() {
|
137 |
-
$this->assertFalse($this->original->uncompressed());
|
138 |
-
}
|
139 |
-
|
140 |
-
public function testInProgressShouldReturnTrueIfMetaHaveStartAndNotOutput() {
|
141 |
-
$this->assertTrue($this->small->in_progress());
|
142 |
-
}
|
143 |
-
|
144 |
-
public function testInProgressShouldReturnFalseIfMetaHaveStartAndOutput() {
|
145 |
-
$this->assertFalse($this->original->in_progress());
|
146 |
-
}
|
147 |
-
|
148 |
-
public function testResizedShouldReturnTrueIfMetaHaveOutputAndResized() {
|
149 |
-
$this->assertTrue($this->original->resized());
|
150 |
-
}
|
151 |
-
|
152 |
-
public function testResizedShouldReturnFalseIfMetaHaveOutputAndNotResized() {
|
153 |
-
$this->assertFalse($this->thumbnail->resized());
|
154 |
-
}
|
155 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
test/unit/TinyMetadataTest.php
DELETED
@@ -1,82 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
require_once(dirname(__FILE__) . "/TinyTestCase.php");
|
4 |
-
|
5 |
-
class Tiny_Metadata_Test extends TinyTestCase {
|
6 |
-
public function setUp() {
|
7 |
-
parent::setUp();
|
8 |
-
|
9 |
-
$meta = array(Tiny_Metadata::META_KEY => array(
|
10 |
-
Tiny_Metadata::ORIGINAL => array(
|
11 |
-
"input" => array("size" => 146480),
|
12 |
-
"output" => array("size" => 137856, "resized" => true)),
|
13 |
-
"thumbnail" => array(
|
14 |
-
"input" => array("size" => 46480),
|
15 |
-
"output" => array("size" => 37856)),
|
16 |
-
"medium" => array(
|
17 |
-
"input" => array("size" => 66480),
|
18 |
-
"output" => array("size" => 57856)),
|
19 |
-
));
|
20 |
-
$this->wp->setMetadata(1, $meta);
|
21 |
-
$this->wp->createImagesFromMeta($this->json("wp_meta_default_sizes"), $meta, 137856);
|
22 |
-
$this->subject = new Tiny_Metadata(1, $this->json("wp_meta_default_sizes"));
|
23 |
-
}
|
24 |
-
|
25 |
-
public function testUpdateWpMetadataShouldNotUpdateWithNoResizedOriginal() {
|
26 |
-
$tiny_meta = new Tiny_Metadata(150, $this->json("wp_meta_sizes_with_same_files"));
|
27 |
-
$wp_metadata = array(
|
28 |
-
'width' => 2000,
|
29 |
-
'height' => 1000
|
30 |
-
);
|
31 |
-
$this->assertEquals(array('width' => 2000, 'height' => 1000), $tiny_meta->update_wp_metadata($wp_metadata));
|
32 |
-
}
|
33 |
-
|
34 |
-
public function testUpdateWpMetadataShouldUpdateWithResizedOriginal() {
|
35 |
-
$tiny_meta = new Tiny_Metadata(150, $this->json("wp_meta_sizes_with_same_files"));
|
36 |
-
$wp_metadata = array(
|
37 |
-
'width' => 2000,
|
38 |
-
'height' => 1000
|
39 |
-
);
|
40 |
-
$tiny_meta->get_image()->add_request();
|
41 |
-
$tiny_meta->get_image()->add_response(array('output' => array('width' => 200, 'height' => 100)));
|
42 |
-
$this->assertEquals(array('width' => 200, 'height' => 100), $tiny_meta->update_wp_metadata($wp_metadata));
|
43 |
-
}
|
44 |
-
|
45 |
-
public function testGetImagesShouldReturnAllImages() {
|
46 |
-
$this->assertEquals(array(Tiny_Metadata::ORIGINAL, 'medium', 'thumbnail', 'large'), array_keys(
|
47 |
-
$this->subject->get_images()));
|
48 |
-
}
|
49 |
-
|
50 |
-
public function testFilterImagesShouldFilterCorrectly() {
|
51 |
-
$this->assertEquals(array(Tiny_Metadata::ORIGINAL, 'thumbnail', 'medium'), array_keys(
|
52 |
-
$this->subject->filter_images('compressed')));
|
53 |
-
}
|
54 |
-
|
55 |
-
public function testFilterImagesShouldFilterCorrectlyWhenSizesAreGiven() {
|
56 |
-
$this->assertEquals(array(Tiny_Metadata::ORIGINAL), array_keys(
|
57 |
-
$this->subject->filter_images('compressed', array(Tiny_Metadata::ORIGINAL, 'invalid'))
|
58 |
-
));
|
59 |
-
}
|
60 |
-
|
61 |
-
public function testGetCountShouldAddCountCorrectly() {
|
62 |
-
$this->assertEquals(array(
|
63 |
-
'compressed' => 3,
|
64 |
-
'resized' => 1,
|
65 |
-
), $this->subject->get_count(array('compressed', 'resized'))
|
66 |
-
);
|
67 |
-
}
|
68 |
-
|
69 |
-
public function testGetCountShouldAddCountCorrectlyWhenSizesAreGiven() {
|
70 |
-
$this->assertEquals(array(
|
71 |
-
'compressed' => 1,
|
72 |
-
'resized' => 1,
|
73 |
-
), $this->subject->get_count(array('compressed', 'resized'), array(Tiny_Metadata::ORIGINAL, 'invalid'))
|
74 |
-
);
|
75 |
-
}
|
76 |
-
|
77 |
-
public function testGetLatestErrorShouldReturnMessage() {
|
78 |
-
$this->subject->get_image()->add_request("large");
|
79 |
-
$this->subject->get_image()->add_exception(new Tiny_Exception('Could not download output', 'OutputError'), "large");
|
80 |
-
$this->assertEquals("Could not download output", $this->subject->get_latest_error());
|
81 |
-
}
|
82 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
test/unit/TinyPluginTest.php
CHANGED
@@ -1,202 +1,210 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
require_once
|
4 |
|
5 |
use org\bovigo\vfs\vfsStream;
|
6 |
use org\bovigo\vfs\content\LargeFileContent;
|
7 |
|
8 |
-
class Tiny_Plugin_Test extends
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
|
166 |
-
|
167 |
-
|
168 |
-
|
169 |
-
|
170 |
-
|
171 |
-
|
172 |
-
|
173 |
-
|
174 |
-
|
175 |
-
|
176 |
-
|
177 |
-
|
178 |
-
|
179 |
-
|
180 |
-
|
181 |
-
|
182 |
-
|
183 |
-
|
184 |
-
|
185 |
-
|
186 |
-
|
187 |
-
|
188 |
-
|
189 |
-
|
190 |
-
|
191 |
-
|
192 |
-
|
193 |
-
|
194 |
-
|
195 |
-
|
196 |
-
|
197 |
-
|
198 |
-
|
199 |
-
|
200 |
-
|
201 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
202 |
}
|
1 |
<?php
|
2 |
|
3 |
+
require_once dirname( __FILE__ ) . '/TinyTestCase.php';
|
4 |
|
5 |
use org\bovigo\vfs\vfsStream;
|
6 |
use org\bovigo\vfs\content\LargeFileContent;
|
7 |
|
8 |
+
class Tiny_Plugin_Test extends Tiny_TestCase {
|
9 |
+
public function set_up() {
|
10 |
+
parent::set_up();
|
11 |
+
$this->subject = new Tiny_Plugin();
|
12 |
+
$this->subject->init();
|
13 |
+
$this->compressor = $this->getMockBuilder( 'TestCompressor' )
|
14 |
+
->setMethods( array( 'compress_file' ) )
|
15 |
+
->getMock();
|
16 |
+
$this->subject->set_compressor( $this->compressor );
|
17 |
+
|
18 |
+
$this->wp->addOption( 'tinypng_api_key', 'test123' );
|
19 |
+
$this->wp->addOption( 'tinypng_sizes[0]', 'on' );
|
20 |
+
$this->wp->addOption( 'tinypng_sizes[large]', 'on' );
|
21 |
+
$this->wp->addOption( 'tinypng_sizes[post-thumbnail]', 'on' );
|
22 |
+
|
23 |
+
$this->wp->addImageSize( 'post-thumbnail', array( 'width' => 825, 'height' => 510 ) );
|
24 |
+
$this->wp->createImages();
|
25 |
+
}
|
26 |
+
|
27 |
+
public function success_compress( $file ) {
|
28 |
+
if ( preg_match( '#[^-]+-([^.]+)[.](png|jpe?g)$#', basename( $file ), $match ) ) {
|
29 |
+
$key = $match[1];
|
30 |
+
} else {
|
31 |
+
$key = null;
|
32 |
+
}
|
33 |
+
|
34 |
+
$input = filesize( $file );
|
35 |
+
switch ( $key ) {
|
36 |
+
case 'thumbnail':
|
37 |
+
$output = 81;
|
38 |
+
$width = '150';
|
39 |
+
$height = '150';
|
40 |
+
break;
|
41 |
+
case 'medium':
|
42 |
+
$output = 768;
|
43 |
+
$width = '300';
|
44 |
+
$height = '300';
|
45 |
+
break;
|
46 |
+
case 'large':
|
47 |
+
$output = 6789;
|
48 |
+
$width = '1024';
|
49 |
+
$height = '1024';
|
50 |
+
break;
|
51 |
+
case 'post-thumbnail':
|
52 |
+
$output = 1000;
|
53 |
+
$width = '800';
|
54 |
+
$height = '500';
|
55 |
+
break;
|
56 |
+
default:
|
57 |
+
$output = 10000;
|
58 |
+
$width = '4000';
|
59 |
+
$height = '3000';
|
60 |
+
}
|
61 |
+
$this->vfs->getChild( vfsStream::path( $file ) )->truncate( $output );
|
62 |
+
return array( 'input' => array( 'size' => $input ), 'output' => array( 'size' => $output, 'width' => $width, 'height' => $height ) );
|
63 |
+
}
|
64 |
+
|
65 |
+
public function test_init_should_add_filters() {
|
66 |
+
$this->assertEquals(array(
|
67 |
+
array( 'jpeg_quality', array( 'Tiny_Plugin', 'jpeg_quality' ) ),
|
68 |
+
array( 'wp_editor_set_quality', array( 'Tiny_Plugin', 'jpeg_quality' ) ),
|
69 |
+
array( 'wp_generate_attachment_metadata', array( $this->subject, 'compress_on_upload' ), 10, 2 ),
|
70 |
+
), $this->wp->getCalls( 'add_filter' ));
|
71 |
+
}
|
72 |
+
|
73 |
+
public function test_compress_should_respect_settings() {
|
74 |
+
$this->wp->stub( 'get_post_mime_type', create_function( '$i', 'return "image/png";' ) );
|
75 |
+
$this->compressor->expects( $this->exactly( 3 ) )->method( 'compress_file' )->withConsecutive(
|
76 |
+
array( $this->equalTo( 'vfs://root/wp-content/uploads/14/01/test.png' ) ),
|
77 |
+
array( $this->equalTo( 'vfs://root/wp-content/uploads/14/01/test-large.png' ) ),
|
78 |
+
array( $this->equalTo( 'vfs://root/wp-content/uploads/14/01/test-post-thumbnail.png' ) )
|
79 |
+
)->will( $this->returnCallback( array( $this, 'success_compress' ) ) );
|
80 |
+
$this->subject->compress_on_upload( $this->wp->getTestMetadata(), 1 );
|
81 |
+
}
|
82 |
+
|
83 |
+
public function test_compress_should_not_compress_twice() {
|
84 |
+
$this->wp->stub( 'get_post_mime_type', create_function( '$i', 'return "image/png";' ) );
|
85 |
+
|
86 |
+
$testmeta = $this->wp->getTestMetadata();
|
87 |
+
$tiny_image = new Tiny_Image( 1, $testmeta );
|
88 |
+
$tiny_image->get_image_size()->add_tiny_meta_start();
|
89 |
+
$tiny_image->get_image_size()->add_tiny_meta( self::success_compress( 'vfs://root/wp-content/uploads/14/01/test.png' ) );
|
90 |
+
$tiny_image->get_image_size( 'large' )->add_tiny_meta_start();
|
91 |
+
$tiny_image->get_image_size( 'large' )->add_tiny_meta( self::success_compress( 'vfs://root/wp-content/uploads/14/01/test-large.png' ) );
|
92 |
+
$tiny_image->update_tiny_post_meta();
|
93 |
+
|
94 |
+
$this->compressor->expects( $this->once() )->method( 'compress_file' )->withConsecutive(
|
95 |
+
array( $this->equalTo( 'vfs://root/wp-content/uploads/14/01/test-post-thumbnail.png' ) )
|
96 |
+
)->will( $this->returnCallback( array( $this, 'success_compress' ) ) );
|
97 |
+
$this->subject->compress_on_upload( $testmeta, 1 );
|
98 |
+
}
|
99 |
+
|
100 |
+
public function test_compress_when_file_changed() {
|
101 |
+
$this->wp->stub( 'get_post_mime_type', create_function( '$i', 'return "image/png";' ) );
|
102 |
+
|
103 |
+
$testmeta = $this->wp->getTestMetadata();
|
104 |
+
$tiny_image = new Tiny_Image( 1, $testmeta );
|
105 |
+
$tiny_image->get_image_size()->add_tiny_meta_start();
|
106 |
+
$tiny_image->get_image_size()->add_tiny_meta( self::success_compress( 'vfs://root/wp-content/uploads/14/01/test.png' ) );
|
107 |
+
$tiny_image->get_image_size( 'large' )->add_tiny_meta_start();
|
108 |
+
$tiny_image->get_image_size( 'large' )->add_tiny_meta( self::success_compress( 'vfs://root/wp-content/uploads/14/01/test-large.png' ) );
|
109 |
+
$tiny_image->get_image_size( 'post-thumbnail' )->add_tiny_meta_start();
|
110 |
+
$tiny_image->get_image_size( 'post-thumbnail' )->add_tiny_meta( self::success_compress( 'vfs://root/wp-content/uploads/14/01/test-post-thumbnail.png' ) );
|
111 |
+
$tiny_image->update_tiny_post_meta();
|
112 |
+
|
113 |
+
$this->vfs->getChild( 'wp-content/uploads/14/01/test-large.png' )->truncate( 100000 );
|
114 |
+
|
115 |
+
$this->compressor->expects( $this->once() )->method( 'compress_file' )->withConsecutive(
|
116 |
+
array( $this->equalTo( 'vfs://root/wp-content/uploads/14/01/test-large.png' ) )
|
117 |
+
)->will( $this->returnCallback( array( $this, 'success_compress' ) ) );
|
118 |
+
$this->subject->compress_on_upload( $testmeta, 1 );
|
119 |
+
}
|
120 |
+
|
121 |
+
public function test_compress_should_update_metadata() {
|
122 |
+
$this->wp->stub( 'get_post_mime_type', create_function( '$i', 'return "image/png";' ) );
|
123 |
+
$this->compressor->expects( $this->exactly( 3 ) )->method( 'compress_file' )->will(
|
124 |
+
$this->returnCallback( array( $this, 'success_compress' ) )
|
125 |
+
);
|
126 |
+
|
127 |
+
$this->subject->compress_on_upload( $this->wp->getTestMetadata(), 1 );
|
128 |
+
|
129 |
+
$tiny_metadata = $this->wp->getMetadata( 1, Tiny_Image::META_KEY, true );
|
130 |
+
foreach ( $tiny_metadata as $key => $values ) {
|
131 |
+
if ( ! empty( $values ) ) {
|
132 |
+
$this->assertBetween( -1, + 1, $values['end'] - time() );
|
133 |
+
unset( $tiny_metadata[ $key ]['end'] );
|
134 |
+
unset( $tiny_metadata[ $key ]['start'] );
|
135 |
+
}
|
136 |
+
}
|
137 |
+
$this->assertEquals(array(
|
138 |
+
0 => array( 'input' => array( 'size' => 12345 ), 'output' => array( 'size' => 10000, 'width' => 4000, 'height' => 3000 ) ),
|
139 |
+
'thumbnail' => array(),
|
140 |
+
'medium' => array(),
|
141 |
+
'large' => array( 'input' => array( 'size' => 10000 ), 'output' => array( 'size' => 6789, 'width' => 1024, 'height' => 1024 ) ),
|
142 |
+
'post-thumbnail' => array( 'input' => array( 'size' => 1234 ), 'output' => array( 'size' => 1000, 'width' => 800, 'height' => 500 ) ),
|
143 |
+
), $tiny_metadata);
|
144 |
+
}
|
145 |
+
|
146 |
+
public function test_should_handle_compress_exceptions() {
|
147 |
+
$this->wp->stub( 'get_post_mime_type', create_function( '$i', 'return "image/jpeg";' ) );
|
148 |
+
|
149 |
+
$this->compressor->expects( $this->exactly( 3 ) )->method( 'compress_file' )->will(
|
150 |
+
$this->throwException( new Tiny_Exception( 'Does not appear to be a PNG or JPEG file', 'BadSignature' ) )
|
151 |
+
);
|
152 |
+
|
153 |
+
$this->subject->compress_on_upload( $this->wp->getTestMetadata(), 1 );
|
154 |
+
|
155 |
+
$tiny_metadata = $this->wp->getMetadata( 1, Tiny_Image::META_KEY, true );
|
156 |
+
foreach ( $tiny_metadata as $key => $values ) {
|
157 |
+
if ( ! empty( $values ) ) {
|
158 |
+
$this->assertEquals( time(), $values['timestamp'], 2 );
|
159 |
+
unset( $tiny_metadata[ $key ]['timestamp'] );
|
160 |
+
}
|
161 |
+
}
|
162 |
+
$this->assertEquals(array(
|
163 |
+
0 => array( 'error' => 'BadSignature', 'message' => 'Does not appear to be a PNG or JPEG file' ),
|
164 |
+
'thumbnail' => array(),
|
165 |
+
'medium' => array(),
|
166 |
+
'large' => array( 'error' => 'BadSignature', 'message' => 'Does not appear to be a PNG or JPEG file' ),
|
167 |
+
'post-thumbnail' => array( 'error' => 'BadSignature', 'message' => 'Does not appear to be a PNG or JPEG file' ),
|
168 |
+
), $tiny_metadata);
|
169 |
+
}
|
170 |
+
|
171 |
+
public function test_should_return_if_no_compressor() {
|
172 |
+
$this->subject->set_compressor( null );
|
173 |
+
$this->wp->stub( 'get_post_mime_type', create_function( '$i', 'return "image/png";' ) );
|
174 |
+
$this->compressor->expects( $this->never() )->method( 'compress_file' );
|
175 |
+
|
176 |
+
$this->subject->compress_on_upload( $this->wp->getTestMetadata(), 1 );
|
177 |
+
}
|
178 |
+
|
179 |
+
public function test_should_return_if_no_image() {
|
180 |
+
$this->wp->stub( 'get_post_mime_type', create_function( '$i', 'return "video/webm";' ) );
|
181 |
+
$this->compressor->expects( $this->never() )->method( 'compress_file' );
|
182 |
+
|
183 |
+
$this->subject->compress_on_upload( $this->wp->getTestMetadata(), 1 );
|
184 |
+
}
|
185 |
+
|
186 |
+
public function test_wrong_metadata_should_not_show_warnings() {
|
187 |
+
$this->wp->stub( 'get_post_mime_type', create_function( '$i', 'return "image/png";' ) );
|
188 |
+
$this->compressor->expects( $this->exactly( 1 ) )->method( 'compress_file' )->will(
|
189 |
+
$this->returnCallback( array( $this, 'success_compress' ) )
|
190 |
+
);
|
191 |
+
|
192 |
+
$testmeta = $this->wp->getTestMetadata();
|
193 |
+
$testmeta['sizes'] = 0;
|
194 |
+
|
195 |
+
$this->subject->compress_on_upload( $testmeta, 1 );
|
196 |
+
}
|
197 |
+
|
198 |
+
public function test_wrong_metadata_should_save_tiny_metadata() {
|
199 |
+
$this->wp->stub( 'get_post_mime_type', create_function( '$i', 'return "image/png";' ) );
|
200 |
+
$this->compressor->expects( $this->exactly( 1 ) )->method( 'compress_file' )->will(
|
201 |
+
$this->returnCallback( array( $this, 'success_compress' ) )
|
202 |
+
);
|
203 |
+
|
204 |
+
$testmeta = $this->wp->getTestMetadata();
|
205 |
+
$testmeta['sizes'] = 0;
|
206 |
+
|
207 |
+
$this->subject->compress_on_upload( $testmeta, 1 );
|
208 |
+
$this->assertEquals( 2, count( $this->wp->getCalls( 'update_post_meta' ) ) );
|
209 |
+
}
|
210 |
}
|
test/unit/TinySettingsTest.php
CHANGED
@@ -1,172 +1,254 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
require_once
|
4 |
-
|
5 |
-
class Tiny_Settings_Test extends
|
6 |
-
|
7 |
-
|
8 |
-
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
|
166 |
-
|
167 |
-
|
168 |
-
|
169 |
-
|
170 |
-
|
171 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
172 |
}
|
1 |
<?php
|
2 |
|
3 |
+
require_once dirname( __FILE__ ) . '/TinyTestCase.php';
|
4 |
+
|
5 |
+
class Tiny_Settings_Test extends Tiny_TestCase {
|
6 |
+
public function set_up() {
|
7 |
+
parent::set_up();
|
8 |
+
$this->subject = new Tiny_Settings();
|
9 |
+
$this->subject->admin_init();
|
10 |
+
}
|
11 |
+
|
12 |
+
public function test_admin_init_should_register_keys() {
|
13 |
+
$this->assertEquals(array(
|
14 |
+
array( 'media', 'tinypng_api_key' ),
|
15 |
+
array( 'media', 'tinypng_api_key_pending' ),
|
16 |
+
array( 'media', 'tinypng_sizes' ),
|
17 |
+
array( 'media', 'tinypng_resize_original' ),
|
18 |
+
array( 'media', 'tinypng_preserve_data' ),
|
19 |
+
), $this->wp->getCalls( 'register_setting' ));
|
20 |
+
}
|
21 |
+
|
22 |
+
public function test_admin_init_should_add_settings_section() {
|
23 |
+
$this->assertEquals( array(
|
24 |
+
array(
|
25 |
+
'tinypng_settings',
|
26 |
+
'JPEG and PNG optimization',
|
27 |
+
array( $this->subject, 'render_section' ),
|
28 |
+
'media',
|
29 |
+
),
|
30 |
+
array(
|
31 |
+
'section_end',
|
32 |
+
'',
|
33 |
+
array( $this->subject, 'render_section_end' ),
|
34 |
+
'media',
|
35 |
+
),
|
36 |
+
), $this->wp->getCalls( 'add_settings_section' ) );
|
37 |
+
}
|
38 |
+
|
39 |
+
public function test_admin_init_should_add_settings_field() {
|
40 |
+
$this->assertEquals( array(
|
41 |
+
array(
|
42 |
+
'tinypng_api_key',
|
43 |
+
'TinyPNG account',
|
44 |
+
array( $this->subject, 'render_pending_status' ),
|
45 |
+
'media',
|
46 |
+
'tinypng_settings',
|
47 |
+
),
|
48 |
+
array(
|
49 |
+
'tinypng_sizes',
|
50 |
+
'File compression',
|
51 |
+
array( $this->subject, 'render_sizes' ),
|
52 |
+
'media',
|
53 |
+
'tinypng_settings',
|
54 |
+
),
|
55 |
+
array(
|
56 |
+
'tinypng_resize_original',
|
57 |
+
'Original image',
|
58 |
+
array( $this->subject, 'render_resize' ),
|
59 |
+
'media',
|
60 |
+
'tinypng_settings',
|
61 |
+
),
|
62 |
+
), $this->wp->getCalls( 'add_settings_field' ) );
|
63 |
+
}
|
64 |
+
|
65 |
+
public function test_should_retrieve_sizes_with_settings() {
|
66 |
+
$this->wp->addOption( 'tinypng_sizes[0]', 'on' );
|
67 |
+
$this->wp->addOption( 'tinypng_sizes[medium]', 'on' );
|
68 |
+
$this->wp->addOption( 'tinypng_sizes[post-thumbnail]', 'on' );
|
69 |
+
$this->wp->addImageSize( 'post-thumbnail', array( 'width' => 825, 'height' => 510 ) );
|
70 |
+
|
71 |
+
$this->subject->get_sizes();
|
72 |
+
$this->assertEquals(array(
|
73 |
+
0 => array( 'width' => null, 'height' => null, 'tinify' => true ),
|
74 |
+
'thumbnail' => array( 'width' => 150, 'height' => 150, 'tinify' => false ),
|
75 |
+
'medium' => array( 'width' => 300, 'height' => 300, 'tinify' => true ),
|
76 |
+
'large' => array( 'width' => 1024, 'height' => 1024, 'tinify' => false ),
|
77 |
+
'post-thumbnail' => array( 'width' => 825, 'height' => 510, 'tinify' => true ),
|
78 |
+
), $this->subject->get_sizes());
|
79 |
+
}
|
80 |
+
|
81 |
+
public function test_should_skip_dummy_size() {
|
82 |
+
$this->wp->addOption( 'tinypng_sizes[tiny_dummy]', 'on' );
|
83 |
+
|
84 |
+
$this->subject->get_sizes();
|
85 |
+
$this->assertEquals(array(
|
86 |
+
0 => array( 'width' => null, 'height' => null, 'tinify' => false ),
|
87 |
+
'thumbnail' => array( 'width' => 150, 'height' => 150, 'tinify' => false ),
|
88 |
+
'medium' => array( 'width' => 300, 'height' => 300, 'tinify' => false ),
|
89 |
+
'large' => array( 'width' => 1024, 'height' => 1024, 'tinify' => false ),
|
90 |
+
), $this->subject->get_sizes());
|
91 |
+
}
|
92 |
+
|
93 |
+
public function test_should_set_all_sizes_on_without_configuration() {
|
94 |
+
$this->subject->get_sizes();
|
95 |
+
$this->assertEquals(array(
|
96 |
+
0 => array( 'width' => null, 'height' => null, 'tinify' => true ),
|
97 |
+
'thumbnail' => array( 'width' => 150, 'height' => 150, 'tinify' => true ),
|
98 |
+
'medium' => array( 'width' => 300, 'height' => 300, 'tinify' => true ),
|
99 |
+
'large' => array( 'width' => 1024, 'height' => 1024, 'tinify' => true ),
|
100 |
+
), $this->subject->get_sizes());
|
101 |
+
}
|
102 |
+
|
103 |
+
public function test_should_show_additional_size() {
|
104 |
+
$this->wp->addImageSize( 'additional_size_1', array( 'width' => 666, 'height' => 333 ) );
|
105 |
+
$this->subject->get_sizes();
|
106 |
+
$sizes = $this->subject->get_sizes();
|
107 |
+
$this->assertEquals(
|
108 |
+
array( 'width' => 666, 'height' => 333, 'tinify' => true ),
|
109 |
+
$sizes['additional_size_1']
|
110 |
+
);
|
111 |
+
}
|
112 |
+
|
113 |
+
public function test_should_show_additional_size_without_height() {
|
114 |
+
$this->wp->addImageSize( 'additional_size_no_height', array( 'width' => 777 ) );
|
115 |
+
$this->subject->get_sizes();
|
116 |
+
$sizes = $this->subject->get_sizes();
|
117 |
+
$this->assertEquals(
|
118 |
+
array( 'width' => 777, 'height' => 0, 'tinify' => true ),
|
119 |
+
$sizes['additional_size_no_height']
|
120 |
+
);
|
121 |
+
}
|
122 |
+
|
123 |
+
public function test_should_show_additional_size_without_width() {
|
124 |
+
$this->wp->addImageSize( 'additional_size_no_width', array( 'height' => 888 ) );
|
125 |
+
$this->subject->get_sizes();
|
126 |
+
$sizes = $this->subject->get_sizes();
|
127 |
+
$this->assertEquals(
|
128 |
+
array( 'width' => 0, 'height' => 888, 'tinify' => true ),
|
129 |
+
$sizes['additional_size_no_width']
|
130 |
+
);
|
131 |
+
}
|
132 |
+
|
133 |
+
public function test_get_resize_enabled_should_return_true_if_enabled() {
|
134 |
+
$this->wp->addOption( 'tinypng_resize_original', array( 'enabled' => 'on' ) );
|
135 |
+
$this->assertEquals( true, $this->subject->get_resize_enabled() );
|
136 |
+
}
|
137 |
+
|
138 |
+
public function test_get_resize_enabled_should_return_false_without_configuration() {
|
139 |
+
$this->wp->addOption( 'tinypng_resize_original', array() );
|
140 |
+
$this->assertEquals( false, $this->subject->get_resize_enabled() );
|
141 |
+
}
|
142 |
+
|
143 |
+
public function test_get_resize_enabled_should_return_false_if_original_is_not_compressed() {
|
144 |
+
$this->wp->addOption( 'tinypng_sizes[0]', 'off' );
|
145 |
+
$this->wp->addOption( 'tinypng_resize_original', array( 'enabled' => 'on' ) );
|
146 |
+
$this->assertEquals( false, $this->subject->get_resize_enabled() );
|
147 |
+
}
|
148 |
+
|
149 |
+
public function test_should_return_resize_options_with_width_and_height() {
|
150 |
+
$this->wp->addOption(
|
151 |
+
'tinypng_resize_original',
|
152 |
+
array( 'enabled' => 'on', 'width' => '800', 'height' => '600' )
|
153 |
+
);
|
154 |
+
|
155 |
+
$this->assertEquals(
|
156 |
+
array( 'method' => 'fit', 'width' => 800, 'height' => 600 ),
|
157 |
+
$this->subject->get_resize_options( Tiny_Image::ORIGINAL )
|
158 |
+
);
|
159 |
+
}
|
160 |
+
|
161 |
+
public function test_should_return_resize_options_without_width() {
|
162 |
+
$this->wp->addOption(
|
163 |
+
'tinypng_resize_original',
|
164 |
+
array( 'enabled' => 'on', 'width' => '', 'height' => '600' )
|
165 |
+
);
|
166 |
+
|
167 |
+
$this->assertEquals(
|
168 |
+
array( 'method' => 'scale', 'height' => 600 ),
|
169 |
+
$this->subject->get_resize_options( Tiny_Image::ORIGINAL )
|
170 |
+
);
|
171 |
+
}
|
172 |
+
|
173 |
+
public function test_should_return_resize_options_without_height() {
|
174 |
+
$this->wp->addOption(
|
175 |
+
'tinypng_resize_original',
|
176 |
+
array( 'enabled' => 'on', 'width' => '800', 'height' => '' )
|
177 |
+
);
|
178 |
+
|
179 |
+
$this->assertEquals(
|
180 |
+
array( 'method' => 'scale', 'width' => 800 ),
|
181 |
+
$this->subject->get_resize_options( Tiny_Image::ORIGINAL )
|
182 |
+
);
|
183 |
+
}
|
184 |
+
|
185 |
+
public function test_should_return_resize_options_with_invaled_width() {
|
186 |
+
$this->wp->addOption(
|
187 |
+
'tinypng_resize_original',
|
188 |
+
array( 'enabled' => 'on', 'width' => '-1', 'height' => '600' )
|
189 |
+
);
|
190 |
+
|
191 |
+
$this->assertEquals(
|
192 |
+
array( 'method' => 'scale', 'height' => 600 ),
|
193 |
+
$this->subject->get_resize_options( Tiny_Image::ORIGINAL )
|
194 |
+
);
|
195 |
+
}
|
196 |
+
|
197 |
+
public function test_should_return_resize_options_with_invaled_height() {
|
198 |
+
$this->wp->addOption(
|
199 |
+
'tinypng_resize_original',
|
200 |
+
array( 'enabled' => 'on', 'width' => '800', 'height' => '-1' )
|
201 |
+
);
|
202 |
+
|
203 |
+
$this->assertEquals(
|
204 |
+
array( 'method' => 'scale', 'width' => 800 ),
|
205 |
+
$this->subject->get_resize_options( Tiny_Image::ORIGINAL )
|
206 |
+
);
|
207 |
+
}
|
208 |
+
|
209 |
+
public function test_should_not_return_resize_options_without_with_and_height() {
|
210 |
+
$this->wp->addOption(
|
211 |
+
'tinypng_resize_original',
|
212 |
+
array( 'enabled' => 'on', 'width' => '', 'height' => '' )
|
213 |
+
);
|
214 |
+
|
215 |
+
$this->assertEquals( false, $this->subject->get_resize_options( Tiny_Image::ORIGINAL ) );
|
216 |
+
}
|
217 |
+
|
218 |
+
public function test_should_not_return_resize_options_when_not_enabled() {
|
219 |
+
$this->wp->addOption(
|
220 |
+
'tinypng_resize_original',
|
221 |
+
array( 'width' => '800', 'height' => '600' )
|
222 |
+
);
|
223 |
+
|
224 |
+
$this->assertEquals( false, $this->subject->get_resize_options( Tiny_Image::ORIGINAL ) );
|
225 |
+
}
|
226 |
+
|
227 |
+
public function test_should_return_include_metadata_enabled() {
|
228 |
+
$this->wp->addOption( 'tinypng_preserve_data', array( 'copyright' => 'on' ) );
|
229 |
+
$this->assertEquals( true, $this->subject->get_preserve_enabled( 'copyright' ) );
|
230 |
+
}
|
231 |
+
|
232 |
+
public function test_should_return_include_metadata_not_enabled_without_configuration() {
|
233 |
+
$this->wp->addOption( 'tinypng_include_metadata', array() );
|
234 |
+
$this->assertEquals( false, $this->subject->get_preserve_enabled( 'copyright' ) );
|
235 |
+
}
|
236 |
+
|
237 |
+
public function test_should_return_preserve_options_when_enabled() {
|
238 |
+
$this->wp->addOption( 'tinypng_preserve_data', array( 'copyright' => 'on' ) );
|
239 |
+
|
240 |
+
$this->assertEquals(
|
241 |
+
array( '0' => 'copyright' ),
|
242 |
+
$this->subject->get_preserve_options( Tiny_Image::ORIGINAL )
|
243 |
+
);
|
244 |
+
}
|
245 |
+
|
246 |
+
public function test_should_not_return_preserve_options_when_disabled() {
|
247 |
+
$this->wp->addOption( 'tinypng_include_metadata', array() );
|
248 |
+
|
249 |
+
$this->assertEquals(
|
250 |
+
array(),
|
251 |
+
$this->subject->get_preserve_options( Tiny_Image::ORIGINAL )
|
252 |
+
);
|
253 |
+
}
|
254 |
}
|
test/unit/TinyTestCase.php
CHANGED
@@ -1,44 +1,93 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
|
4 |
-
|
|
|
|
|
|
|
5 |
|
6 |
use org\bovigo\vfs\vfsStream;
|
7 |
|
8 |
-
function plugin_autoloader($class) {
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
15 |
}
|
16 |
|
17 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
18 |
|
19 |
-
|
20 |
-
|
21 |
-
|
|
|
|
|
22 |
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
|
|
|
|
|
|
|
|
27 |
|
28 |
-
|
29 |
-
|
30 |
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
|
41 |
-
|
42 |
-
|
43 |
-
}
|
44 |
}
|
1 |
<?php
|
2 |
|
3 |
+
require_once dirname( __FILE__ ) . '/../helpers/mock-http-stream-wrapper.php';
|
4 |
+
require_once dirname( __FILE__ ) . '/../helpers/mock-tinify-client.php';
|
5 |
+
require_once dirname( __FILE__ ) . '/../helpers/wordpress.php';
|
6 |
+
require_once dirname( __FILE__ ) . '/../../src/config/tiny-config.php';
|
7 |
+
require_once 'vendor/autoload.php';
|
8 |
|
9 |
use org\bovigo\vfs\vfsStream;
|
10 |
|
11 |
+
function plugin_autoloader( $class ) {
|
12 |
+
$file = dirname( __FILE__ ) . '/../../src/class-' .
|
13 |
+
str_replace( '_', '-', strtolower( $class ) ) . '.php';
|
14 |
+
|
15 |
+
if ( file_exists( $file ) ) {
|
16 |
+
include $file;
|
17 |
+
} else {
|
18 |
+
spl_autoload( $class );
|
19 |
+
}
|
20 |
+
}
|
21 |
+
|
22 |
+
spl_autoload_register( 'plugin_autoloader' );
|
23 |
+
|
24 |
+
class Tiny_PHP {
|
25 |
+
public static $fopen_available = true;
|
26 |
+
public static $client_supported = true;
|
27 |
+
|
28 |
+
public static function fopen_available() {
|
29 |
+
return self::$fopen_available;
|
30 |
+
}
|
31 |
+
|
32 |
+
public static function client_supported() {
|
33 |
+
return self::$client_supported;
|
34 |
+
}
|
35 |
}
|
36 |
|
37 |
+
abstract class Tiny_TestCase extends PHPUnit_Framework_TestCase {
|
38 |
+
protected $wp;
|
39 |
+
protected $vfs;
|
40 |
+
|
41 |
+
// @codingStandardsIgnoreStart
|
42 |
+
public static function setUpBeforeClass() {
|
43 |
+
static::set_up_before_class();
|
44 |
+
}
|
45 |
+
|
46 |
+
public static function tearDownAfterClass() {
|
47 |
+
static::tear_down_after_class();
|
48 |
+
}
|
49 |
+
|
50 |
+
protected function setUp() {
|
51 |
+
$this->set_up();
|
52 |
+
}
|
53 |
+
|
54 |
+
protected function tearDown() {
|
55 |
+
$this->tear_down();
|
56 |
+
}
|
57 |
+
|
58 |
+
protected function assertBetween($lower_bound, $upper_bound, $actual, $message = '') {
|
59 |
+
$this->assertGreaterThanOrEqual( $lower_bound, $actual, $message );
|
60 |
+
$this->assertLessThanOrEqual( $upper_bound, $actual, $message );
|
61 |
+
}
|
62 |
|
63 |
+
protected function assertEqualWithinDelta($expected, $actual, $delta, $message = '') {
|
64 |
+
$this->assertGreaterThanOrEqual( $expected - $delta, $actual, $message );
|
65 |
+
$this->assertLessThanOrEqual( $expected + $delta, $actual, $message );
|
66 |
+
}
|
67 |
+
// @codingStandardsIgnoreEnd
|
68 |
|
69 |
+
protected function json( $file_name ) {
|
70 |
+
return json_decode(
|
71 |
+
file_get_contents(
|
72 |
+
dirname( __FILE__ ) . '/../fixtures/json/' . $file_name . '.json'
|
73 |
+
),
|
74 |
+
true
|
75 |
+
);
|
76 |
+
}
|
77 |
|
78 |
+
public static function set_up_before_class() {
|
79 |
+
}
|
80 |
|
81 |
+
public static function tear_down_after_class() {
|
82 |
+
Tiny_PHP::$client_supported = true;
|
83 |
+
Tiny_PHP::$fopen_available = true;
|
84 |
+
}
|
85 |
|
86 |
+
protected function set_up() {
|
87 |
+
$this->vfs = vfsStream::setup();
|
88 |
+
$this->wp = new WordPressStubs( $this->vfs );
|
89 |
+
}
|
90 |
|
91 |
+
protected function tear_down() {
|
92 |
+
}
|
|
|
93 |
}
|
test/unit/TinyWpBaseTest.php
CHANGED
@@ -1,24 +1,23 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
require_once
|
4 |
|
5 |
class Tiny_Test_Base extends Tiny_WP_Base {
|
6 |
}
|
7 |
|
8 |
-
class Tiny_WP_Base_Test extends
|
|
|
|
|
|
|
|
|
9 |
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
array('admin_menu', array($this->subject, 'admin_menu'))
|
20 |
-
),
|
21 |
-
$this->wp->getCalls('add_action')
|
22 |
-
);
|
23 |
-
}
|
24 |
}
|
1 |
<?php
|
2 |
|
3 |
+
require_once dirname( __FILE__ ) . '/TinyTestCase.php';
|
4 |
|
5 |
class Tiny_Test_Base extends Tiny_WP_Base {
|
6 |
}
|
7 |
|
8 |
+
class Tiny_WP_Base_Test extends Tiny_TestCase {
|
9 |
+
public function set_up() {
|
10 |
+
parent::set_up();
|
11 |
+
$this->subject = new Tiny_Test_Base();
|
12 |
+
}
|
13 |
|
14 |
+
public function test_should_add_init_hooks() {
|
15 |
+
$this->assertEquals(array(
|
16 |
+
array( 'init', array( $this->subject, 'init' ) ),
|
17 |
+
array( 'admin_init', array( $this->subject, 'admin_init' ) ),
|
18 |
+
array( 'admin_menu', array( $this->subject, 'admin_menu' ) ),
|
19 |
+
),
|
20 |
+
$this->wp->getCalls( 'add_action' )
|
21 |
+
);
|
22 |
+
}
|
|
|
|
|
|
|
|
|
|
|
23 |
}
|
test/wp-includes/version.php
ADDED
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
$wp_version = '4.6-alpha-37595';
|
4 |
+
$wp_db_version = 36686;
|
5 |
+
$tinymce_version = '4310-20160418';
|
6 |
+
$required_php_version = '5.2.4';
|
7 |
+
$required_mysql_version = '5.0';
|
tiny-compress-images.php
CHANGED
@@ -2,28 +2,28 @@
|
|
2 |
/**
|
3 |
* Plugin Name: Compress JPEG & PNG images
|
4 |
* Description: Speed up your website. Optimize your JPEG and PNG images automatically with TinyPNG.
|
5 |
-
* Version:
|
6 |
* Author: TinyPNG
|
7 |
* Author URI: https://tinypng.com
|
8 |
* Text Domain: tiny-compress-images
|
9 |
* License: GPLv2 or later
|
10 |
*/
|
11 |
|
12 |
-
require dirname(__FILE__) . '/src/config/tiny-config.php';
|
13 |
-
require dirname(__FILE__) . '/src/class-tiny-php.php';
|
14 |
-
require dirname(__FILE__) . '/src/class-tiny-wp-base.php';
|
15 |
-
require dirname(__FILE__) . '/src/class-tiny-exception.php';
|
16 |
-
require dirname(__FILE__) . '/src/class-tiny-compress.php';
|
17 |
-
require dirname(__FILE__) . '/src/class-tiny-
|
18 |
-
require dirname(__FILE__) . '/src/class-tiny-
|
19 |
-
require dirname(__FILE__) . '/src/class-tiny-
|
20 |
-
require dirname(__FILE__) . '/src/class-tiny-
|
21 |
-
require dirname(__FILE__) . '/src/class-tiny-
|
22 |
-
require dirname(__FILE__) . '/src/class-tiny-plugin.php';
|
23 |
-
require dirname(__FILE__) . '/src/class-tiny-notices.php';
|
24 |
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
}
|
|
|
|
2 |
/**
|
3 |
* Plugin Name: Compress JPEG & PNG images
|
4 |
* Description: Speed up your website. Optimize your JPEG and PNG images automatically with TinyPNG.
|
5 |
+
* Version: 2.0.0
|
6 |
* Author: TinyPNG
|
7 |
* Author URI: https://tinypng.com
|
8 |
* Text Domain: tiny-compress-images
|
9 |
* License: GPLv2 or later
|
10 |
*/
|
11 |
|
12 |
+
require dirname( __FILE__ ) . '/src/config/tiny-config.php';
|
13 |
+
require dirname( __FILE__ ) . '/src/class-tiny-php.php';
|
14 |
+
require dirname( __FILE__ ) . '/src/class-tiny-wp-base.php';
|
15 |
+
require dirname( __FILE__ ) . '/src/class-tiny-exception.php';
|
16 |
+
require dirname( __FILE__ ) . '/src/class-tiny-compress.php';
|
17 |
+
require dirname( __FILE__ ) . '/src/class-tiny-image-size.php';
|
18 |
+
require dirname( __FILE__ ) . '/src/class-tiny-image.php';
|
19 |
+
require dirname( __FILE__ ) . '/src/class-tiny-settings.php';
|
20 |
+
require dirname( __FILE__ ) . '/src/class-tiny-plugin.php';
|
21 |
+
require dirname( __FILE__ ) . '/src/class-tiny-notices.php';
|
|
|
|
|
22 |
|
23 |
+
if ( Tiny_PHP::client_supported() ) {
|
24 |
+
require dirname( __FILE__ ) . '/src/class-tiny-compress-client.php';
|
25 |
+
} else {
|
26 |
+
require dirname( __FILE__ ) . '/src/class-tiny-compress-fopen.php';
|
27 |
}
|
28 |
+
|
29 |
+
$tiny_plugin = new Tiny_Plugin();
|