Modern Events Calendar Lite - Version 3.1.2

Version Description

  • Fixed: Update from WordPress (Lite Version)
Download this release

Release Info

Developer webnus
Plugin Icon 128x128 Modern Events Calendar Lite
Version 3.1.2
Comparing to
See all releases

Version 3.1.2

Files changed (137) hide show
  1. app/addons/KC.php +85 -0
  2. app/addons/VC.php +78 -0
  3. app/addons/index.html +0 -0
  4. app/api/Google/Auth/Abstract.php +38 -0
  5. app/api/Google/Auth/AppIdentity.php +120 -0
  6. app/api/Google/Auth/AssertionCredentials.php +136 -0
  7. app/api/Google/Auth/ComputeEngine.php +146 -0
  8. app/api/Google/Auth/Exception.php +24 -0
  9. app/api/Google/Auth/LoginTicket.php +71 -0
  10. app/api/Google/Auth/OAuth2.php +646 -0
  11. app/api/Google/Auth/Simple.php +63 -0
  12. app/api/Google/Cache/Abstract.php +53 -0
  13. app/api/Google/Cache/Apc.php +113 -0
  14. app/api/Google/Cache/Exception.php +24 -0
  15. app/api/Google/Cache/File.php +209 -0
  16. app/api/Google/Cache/Memcache.php +184 -0
  17. app/api/Google/Cache/Null.php +57 -0
  18. app/api/Google/Client.php +715 -0
  19. app/api/Google/Collection.php +101 -0
  20. app/api/Google/Config.php +456 -0
  21. app/api/Google/Exception.php +20 -0
  22. app/api/Google/Http/Batch.php +145 -0
  23. app/api/Google/Http/CacheParser.php +185 -0
  24. app/api/Google/Http/MediaFileUpload.php +341 -0
  25. app/api/Google/Http/REST.php +178 -0
  26. app/api/Google/Http/Request.php +504 -0
  27. app/api/Google/IO/Abstract.php +339 -0
  28. app/api/Google/IO/Curl.php +194 -0
  29. app/api/Google/IO/Exception.php +69 -0
  30. app/api/Google/IO/Stream.php +243 -0
  31. app/api/Google/IO/cacerts.pem +2183 -0
  32. app/api/Google/Logger/Abstract.php +408 -0
  33. app/api/Google/Logger/Exception.php +24 -0
  34. app/api/Google/Logger/File.php +158 -0
  35. app/api/Google/Logger/Null.php +43 -0
  36. app/api/Google/Logger/Psr.php +93 -0
  37. app/api/Google/Model.php +295 -0
  38. app/api/Google/Service.php +56 -0
  39. app/api/Google/Service/Calendar.php +3856 -0
  40. app/api/Google/Service/Exception.php +105 -0
  41. app/api/Google/Service/Resource.php +255 -0
  42. app/api/Google/Signer/Abstract.php +29 -0
  43. app/api/Google/Signer/P12.php +94 -0
  44. app/api/Google/Task/Exception.php +24 -0
  45. app/api/Google/Task/Retryable.php +36 -0
  46. app/api/Google/Task/Runner.php +257 -0
  47. app/api/Google/Utils.php +133 -0
  48. app/api/Google/Utils/URITemplate.php +333 -0
  49. app/api/Google/Verifier/Abstract.php +30 -0
  50. app/api/Google/Verifier/Pem.php +75 -0
  51. app/api/Google/autoload.php +37 -0
  52. app/api/Google/index.html +0 -0
  53. app/api/Stripe/Account.php +131 -0
  54. app/api/Stripe/AlipayAccount.php +13 -0
  55. app/api/Stripe/ApiRequestor.php +283 -0
  56. app/api/Stripe/ApiResource.php +205 -0
  57. app/api/Stripe/ApiResponse.php +32 -0
  58. app/api/Stripe/ApplePayDomain.php +65 -0
  59. app/api/Stripe/ApplicationFee.php +69 -0
  60. app/api/Stripe/ApplicationFeeRefund.php +44 -0
  61. app/api/Stripe/AttachedObject.php +31 -0
  62. app/api/Stripe/Balance.php +26 -0
  63. app/api/Stripe/BalanceTransaction.php +57 -0
  64. app/api/Stripe/BankAccount.php +25 -0
  65. app/api/Stripe/BitcoinReceiver.php +85 -0
  66. app/api/Stripe/BitcoinTransaction.php +13 -0
  67. app/api/Stripe/Card.php +13 -0
  68. app/api/Stripe/Charge.php +184 -0
  69. app/api/Stripe/Collection.php +87 -0
  70. app/api/Stripe/CountrySpec.php +44 -0
  71. app/api/Stripe/Coupon.php +77 -0
  72. app/api/Stripe/Customer.php +190 -0
  73. app/api/Stripe/Dispute.php +83 -0
  74. app/api/Stripe/Error/Api.php +7 -0
  75. app/api/Stripe/Error/ApiConnection.php +7 -0
  76. app/api/Stripe/Error/Authentication.php +7 -0
  77. app/api/Stripe/Error/Base.php +60 -0
  78. app/api/Stripe/Error/Card.php +41 -0
  79. app/api/Stripe/Error/InvalidRequest.php +23 -0
  80. app/api/Stripe/Error/Permission.php +7 -0
  81. app/api/Stripe/Error/RateLimit.php +7 -0
  82. app/api/Stripe/Event.php +43 -0
  83. app/api/Stripe/ExternalAccount.php +89 -0
  84. app/api/Stripe/FileUpload.php +61 -0
  85. app/api/Stripe/HttpClient/ClientInterface.php +18 -0
  86. app/api/Stripe/HttpClient/CurlClient.php +282 -0
  87. app/api/Stripe/HttpClient/data/ca-certificates.crt +3919 -0
  88. app/api/Stripe/HttpClient/data/test.png +0 -0
  89. app/api/Stripe/Invoice.php +92 -0
  90. app/api/Stripe/InvoiceItem.php +77 -0
  91. app/api/Stripe/JsonSerializable.php +18 -0
  92. app/api/Stripe/Order.php +87 -0
  93. app/api/Stripe/OrderReturn.php +33 -0
  94. app/api/Stripe/Plan.php +90 -0
  95. app/api/Stripe/Product.php +77 -0
  96. app/api/Stripe/Recipient.php +92 -0
  97. app/api/Stripe/Refund.php +79 -0
  98. app/api/Stripe/SKU.php +77 -0
  99. app/api/Stripe/SingletonApiResource.php +36 -0
  100. app/api/Stripe/Source.php +58 -0
  101. app/api/Stripe/Stripe.php +126 -0
  102. app/api/Stripe/StripeObject.php +293 -0
  103. app/api/Stripe/Subscription.php +97 -0
  104. app/api/Stripe/SubscriptionItem.php +88 -0
  105. app/api/Stripe/ThreeDSecure.php +36 -0
  106. app/api/Stripe/Token.php +43 -0
  107. app/api/Stripe/Transfer.php +115 -0
  108. app/api/Stripe/TransferReversal.php +53 -0
  109. app/api/Stripe/Util/AutoPagingIterator.php +61 -0
  110. app/api/Stripe/Util/RequestOptions.php +79 -0
  111. app/api/Stripe/Util/Set.php +44 -0
  112. app/api/Stripe/Util/Util.php +144 -0
  113. app/api/Stripe/autoload.php +22 -0
  114. app/api/TFPDF/font/courier.php +8 -0
  115. app/api/TFPDF/font/courierb.php +8 -0
  116. app/api/TFPDF/font/courierbi.php +8 -0
  117. app/api/TFPDF/font/courieri.php +8 -0
  118. app/api/TFPDF/font/helvetica.php +19 -0
  119. app/api/TFPDF/font/helveticab.php +19 -0
  120. app/api/TFPDF/font/helveticabi.php +19 -0
  121. app/api/TFPDF/font/helveticai.php +19 -0
  122. app/api/TFPDF/font/symbol.php +19 -0
  123. app/api/TFPDF/font/times.php +19 -0
  124. app/api/TFPDF/font/timesb.php +19 -0
  125. app/api/TFPDF/font/timesbi.php +19 -0
  126. app/api/TFPDF/font/timesi.php +19 -0
  127. app/api/TFPDF/font/unifont/DejaVuSans.ttf +0 -0
  128. app/api/TFPDF/font/unifont/DejaVuSansCondensed-Bold.ttf +0 -0
  129. app/api/TFPDF/font/unifont/DejaVuSansCondensed.ttf +0 -0
  130. app/api/TFPDF/font/unifont/ttfonts.php +1083 -0
  131. app/api/TFPDF/font/zapfdingbats.php +19 -0
  132. app/api/TFPDF/tfpdf.php +2299 -0
  133. app/api/index.html +0 -0
  134. app/controller.php +18 -0
  135. app/crons/index.html +0 -0
  136. app/features/colors.php +104 -0
  137. app/features/compatibility.php +42 -0
app/addons/KC.php ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /** no direct access **/
3
+ defined('MECEXEC') or die();
4
+
5
+ /**
6
+ * Webnus MEC King Composer addon class
7
+ * @author Webnus <info@webnus.biz>
8
+ */
9
+ class MEC_addon_KC extends MEC_base
10
+ {
11
+ /**
12
+ * @var MEC_factory
13
+ */
14
+ public $factory;
15
+
16
+ /**
17
+ * @var MEC_main
18
+ */
19
+ public $main;
20
+
21
+ /**
22
+ * Constructor method
23
+ * @author Webnus <info@webnus.biz>
24
+ */
25
+ public function __construct()
26
+ {
27
+ // MEC Factory class
28
+ $this->factory = $this->getFactory();
29
+
30
+ // MEC Main class
31
+ $this->main = $this->getMain();
32
+ }
33
+
34
+ /**
35
+ * Initialize the KC addon
36
+ * @author Webnus <info@webnus.biz>
37
+ * @return boolean
38
+ */
39
+ public function init()
40
+ {
41
+ // King Composer is not installed
42
+ if(!function_exists('kc_add_map')) return false;
43
+
44
+ $this->factory->action('init', array($this, 'map'));
45
+ return true;
46
+ }
47
+
48
+ /**
49
+ * Register the addon in KC
50
+ * @author Webnus <info@webnus.biz>
51
+ */
52
+ public function map()
53
+ {
54
+ $calendar_posts = get_posts(array('post_type'=>'mec_calendars', 'posts_per_page'=>'-1'));
55
+
56
+ $calendars_name = $calendars_number = array();
57
+ foreach($calendar_posts as $calendar_post)
58
+ {
59
+ $calendars_name[] = $calendar_post->post_title;
60
+ $calendars_number[] = $calendar_post->ID;
61
+ }
62
+
63
+ $calendars_array = array_combine($calendars_number, $calendars_name);
64
+
65
+ kc_add_map(array
66
+ (
67
+ 'MEC' => array(
68
+ 'name' => esc_html__('Modern Events Calendar', 'mec'),
69
+ 'icon' => 'mec-kingcomposer-icon',
70
+ 'category' => esc_html__('Content', 'mec'),
71
+ 'params' => array(
72
+ 'General' => array(
73
+ array(
74
+ 'name' => 'id',
75
+ 'label' => esc_html__('Shortcode', 'mec'),
76
+ 'type' => 'select',
77
+ 'options' => $calendars_array,
78
+ 'description' => esc_html__('Select from predefined shortcodes', 'mec'),
79
+ ),
80
+ ),
81
+ )
82
+ ),
83
+ ));
84
+ }
85
+ }
app/addons/VC.php ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /** no direct access **/
3
+ defined('MECEXEC') or die();
4
+
5
+ /**
6
+ * Webnus MEC VC addon class
7
+ * @author Webnus <info@webnus.biz>
8
+ */
9
+ class MEC_addon_VC extends MEC_base
10
+ {
11
+ /**
12
+ * @var MEC_factory
13
+ */
14
+ public $factory;
15
+
16
+ /**
17
+ * @var MEC_main
18
+ */
19
+ public $main;
20
+
21
+ /**
22
+ * Constructor method
23
+ * @author Webnus <info@webnus.biz>
24
+ */
25
+ public function __construct()
26
+ {
27
+ // MEC Factory class
28
+ $this->factory = $this->getFactory();
29
+
30
+ // MEC Main class
31
+ $this->main = $this->getMain();
32
+ }
33
+
34
+ /**
35
+ * Initialize the VC addon
36
+ * @author Webnus <info@webnus.biz>
37
+ */
38
+ public function init()
39
+ {
40
+ // Visual Composer is not installed
41
+ if(!function_exists('vc_map')) return false;
42
+
43
+ $this->factory->action('vc_before_init', array($this, 'map'));
44
+ return true;
45
+ }
46
+
47
+ /**
48
+ * Register the addon in VC
49
+ * @author Webnus <info@webnus.biz>
50
+ */
51
+ public function map()
52
+ {
53
+ $calendar_posts = get_posts(array('post_type'=>'mec_calendars', 'posts_per_page'=>'-1'));
54
+
55
+ $calendars = array();
56
+ foreach($calendar_posts as $calendar_post) $calendars[$calendar_post->post_title] = $calendar_post->ID;
57
+
58
+ vc_map(array(
59
+ 'name'=>esc_html__('Modern Events Calendar', 'mec'),
60
+ 'base'=>'MEC',
61
+ 'class'=>'',
62
+ 'controls'=>'full',
63
+ 'icon'=>$this->main->asset('img/ico-mec-vc.png'),
64
+ 'category'=>esc_html__('Content', 'mec'),
65
+ 'params'=>array(
66
+ array(
67
+ 'type'=>'dropdown',
68
+ 'holder'=>'div',
69
+ 'class'=>'',
70
+ 'heading'=>esc_html__('Shortcode', 'mec'),
71
+ 'param_name'=>'id',
72
+ 'value'=>$calendars,
73
+ 'description'=>esc_html__('Select from predefined shortcodes', 'mec')
74
+ )
75
+ )
76
+ ));
77
+ }
78
+ }
app/addons/index.html ADDED
File without changes
app/api/Google/Auth/Abstract.php ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2010 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ if (!class_exists('Google_Client')) {
19
+ require_once dirname(__FILE__) . '/../autoload.php';
20
+ }
21
+
22
+ /**
23
+ * Abstract class for the Authentication in the API client
24
+ * @author Chris Chabot <chabotc@google.com>
25
+ *
26
+ */
27
+ abstract class Google_Auth_Abstract
28
+ {
29
+ /**
30
+ * An utility function that first calls $this->auth->sign($request) and then
31
+ * executes makeRequest() on that signed request. Used for when a request
32
+ * should be authenticated
33
+ * @param Google_Http_Request $request
34
+ * @return Google_Http_Request $request
35
+ */
36
+ abstract public function authenticatedRequest(Google_Http_Request $request);
37
+ abstract public function sign(Google_Http_Request $request);
38
+ }
app/api/Google/Auth/AppIdentity.php ADDED
@@ -0,0 +1,120 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2014 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ /*
19
+ * WARNING - this class depends on the Google App Engine PHP library
20
+ * which is 5.3 and above only, so if you include this in a PHP 5.2
21
+ * setup or one without 5.3 things will blow up.
22
+ */
23
+ use google\appengine\api\app_identity\AppIdentityService;
24
+
25
+ if (!class_exists('Google_Client')) {
26
+ require_once dirname(__FILE__) . '/../autoload.php';
27
+ }
28
+
29
+ /**
30
+ * Authentication via the Google App Engine App Identity service.
31
+ */
32
+ class Google_Auth_AppIdentity extends Google_Auth_Abstract
33
+ {
34
+ const CACHE_PREFIX = "Google_Auth_AppIdentity::";
35
+ private $client;
36
+ private $token = false;
37
+ private $tokenScopes = false;
38
+
39
+ public function __construct(Google_Client $client, $config = null)
40
+ {
41
+ $this->client = $client;
42
+ }
43
+
44
+ /**
45
+ * Retrieve an access token for the scopes supplied.
46
+ */
47
+ public function authenticateForScope($scopes)
48
+ {
49
+ if ($this->token && $this->tokenScopes == $scopes) {
50
+ return $this->token;
51
+ }
52
+
53
+ $cacheKey = self::CACHE_PREFIX;
54
+ if (is_string($scopes)) {
55
+ $cacheKey .= $scopes;
56
+ } else if (is_array($scopes)) {
57
+ $cacheKey .= implode(":", $scopes);
58
+ }
59
+
60
+ $this->token = $this->client->getCache()->get($cacheKey);
61
+ if (!$this->token) {
62
+ $this->retrieveToken($scopes, $cacheKey);
63
+ } else if ($this->token['expiration_time'] < time()) {
64
+ $this->client->getCache()->delete($cacheKey);
65
+ $this->retrieveToken($scopes, $cacheKey);
66
+ }
67
+
68
+ $this->tokenScopes = $scopes;
69
+ return $this->token;
70
+ }
71
+
72
+ /**
73
+ * Retrieve a new access token and store it in cache
74
+ * @param mixed $scopes
75
+ * @param string $cacheKey
76
+ */
77
+ private function retrieveToken($scopes, $cacheKey)
78
+ {
79
+ $this->token = AppIdentityService::getAccessToken($scopes);
80
+ if ($this->token) {
81
+ $this->client->getCache()->set(
82
+ $cacheKey,
83
+ $this->token
84
+ );
85
+ }
86
+ }
87
+
88
+ /**
89
+ * Perform an authenticated / signed apiHttpRequest.
90
+ * This function takes the apiHttpRequest, calls apiAuth->sign on it
91
+ * (which can modify the request in what ever way fits the auth mechanism)
92
+ * and then calls apiCurlIO::makeRequest on the signed request
93
+ *
94
+ * @param Google_Http_Request $request
95
+ * @return Google_Http_Request The resulting HTTP response including the
96
+ * responseHttpCode, responseHeaders and responseBody.
97
+ */
98
+ public function authenticatedRequest(Google_Http_Request $request)
99
+ {
100
+ $request = $this->sign($request);
101
+ return $this->client->getIo()->makeRequest($request);
102
+ }
103
+
104
+ public function sign(Google_Http_Request $request)
105
+ {
106
+ if (!$this->token) {
107
+ // No token, so nothing to do.
108
+ return $request;
109
+ }
110
+
111
+ $this->client->getLogger()->debug('App Identity authentication');
112
+
113
+ // Add the OAuth2 header to the request
114
+ $request->setRequestHeaders(
115
+ array('Authorization' => 'Bearer ' . $this->token['access_token'])
116
+ );
117
+
118
+ return $request;
119
+ }
120
+ }
app/api/Google/Auth/AssertionCredentials.php ADDED
@@ -0,0 +1,136 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2012 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ if (!class_exists('Google_Client')) {
19
+ require_once dirname(__FILE__) . '/../autoload.php';
20
+ }
21
+
22
+ /**
23
+ * Credentials object used for OAuth 2.0 Signed JWT assertion grants.
24
+ */
25
+ class Google_Auth_AssertionCredentials
26
+ {
27
+ const MAX_TOKEN_LIFETIME_SECS = 3600;
28
+
29
+ public $serviceAccountName;
30
+ public $scopes;
31
+ public $privateKey;
32
+ public $privateKeyPassword;
33
+ public $assertionType;
34
+ public $sub;
35
+ /**
36
+ * @deprecated
37
+ * @link http://tools.ietf.org/html/draft-ietf-oauth-json-web-token-06
38
+ */
39
+ public $prn;
40
+ private $useCache;
41
+
42
+ /**
43
+ * @param $serviceAccountName
44
+ * @param $scopes array List of scopes
45
+ * @param $privateKey
46
+ * @param string $privateKeyPassword
47
+ * @param string $assertionType
48
+ * @param bool|string $sub The email address of the user for which the
49
+ * application is requesting delegated access.
50
+ * @param bool useCache Whether to generate a cache key and allow
51
+ * automatic caching of the generated token.
52
+ */
53
+ public function __construct(
54
+ $serviceAccountName,
55
+ $scopes,
56
+ $privateKey,
57
+ $privateKeyPassword = 'notasecret',
58
+ $assertionType = 'http://oauth.net/grant_type/jwt/1.0/bearer',
59
+ $sub = false,
60
+ $useCache = true
61
+ ) {
62
+ $this->serviceAccountName = $serviceAccountName;
63
+ $this->scopes = is_string($scopes) ? $scopes : implode(' ', $scopes);
64
+ $this->privateKey = $privateKey;
65
+ $this->privateKeyPassword = $privateKeyPassword;
66
+ $this->assertionType = $assertionType;
67
+ $this->sub = $sub;
68
+ $this->prn = $sub;
69
+ $this->useCache = $useCache;
70
+ }
71
+
72
+ /**
73
+ * Generate a unique key to represent this credential.
74
+ * @return string
75
+ */
76
+ public function getCacheKey()
77
+ {
78
+ if (!$this->useCache) {
79
+ return false;
80
+ }
81
+ $h = $this->sub;
82
+ $h .= $this->assertionType;
83
+ $h .= $this->privateKey;
84
+ $h .= $this->scopes;
85
+ $h .= $this->serviceAccountName;
86
+ return md5($h);
87
+ }
88
+
89
+ public function generateAssertion()
90
+ {
91
+ $now = time();
92
+
93
+ $jwtParams = array(
94
+ 'aud' => Google_Auth_OAuth2::OAUTH2_TOKEN_URI,
95
+ 'scope' => $this->scopes,
96
+ 'iat' => $now,
97
+ 'exp' => $now + self::MAX_TOKEN_LIFETIME_SECS,
98
+ 'iss' => $this->serviceAccountName,
99
+ );
100
+
101
+ if ($this->sub !== false) {
102
+ $jwtParams['sub'] = $this->sub;
103
+ } else if ($this->prn !== false) {
104
+ $jwtParams['prn'] = $this->prn;
105
+ }
106
+
107
+ return $this->makeSignedJwt($jwtParams);
108
+ }
109
+
110
+ /**
111
+ * Creates a signed JWT.
112
+ * @param array $payload
113
+ * @return string The signed JWT.
114
+ */
115
+ private function makeSignedJwt($payload)
116
+ {
117
+ $header = array('typ' => 'JWT', 'alg' => 'RS256');
118
+
119
+ $payload = json_encode($payload);
120
+ // Handle some overzealous escaping in PHP json that seemed to cause some errors
121
+ // with claimsets.
122
+ $payload = str_replace('\/', '/', $payload);
123
+
124
+ $segments = array(
125
+ Google_Utils::urlSafeB64Encode(json_encode($header)),
126
+ Google_Utils::urlSafeB64Encode($payload)
127
+ );
128
+
129
+ $signingInput = implode('.', $segments);
130
+ $signer = new Google_Signer_P12($this->privateKey, $this->privateKeyPassword);
131
+ $signature = $signer->sign($signingInput);
132
+ $segments[] = Google_Utils::urlSafeB64Encode($signature);
133
+
134
+ return implode(".", $segments);
135
+ }
136
+ }
app/api/Google/Auth/ComputeEngine.php ADDED
@@ -0,0 +1,146 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2014 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ if (!class_exists('Google_Client')) {
19
+ require_once dirname(__FILE__) . '/../autoload.php';
20
+ }
21
+
22
+ /**
23
+ * Authentication via built-in Compute Engine service accounts.
24
+ * The instance must be pre-configured with a service account
25
+ * and the appropriate scopes.
26
+ * @author Jonathan Parrott <jon.wayne.parrott@gmail.com>
27
+ */
28
+ class Google_Auth_ComputeEngine extends Google_Auth_Abstract
29
+ {
30
+ const METADATA_AUTH_URL =
31
+ 'http://metadata/computeMetadata/v1/instance/service-accounts/default/token';
32
+ private $client;
33
+ private $token;
34
+
35
+ public function __construct(Google_Client $client, $config = null)
36
+ {
37
+ $this->client = $client;
38
+ }
39
+
40
+ /**
41
+ * Perform an authenticated / signed apiHttpRequest.
42
+ * This function takes the apiHttpRequest, calls apiAuth->sign on it
43
+ * (which can modify the request in what ever way fits the auth mechanism)
44
+ * and then calls apiCurlIO::makeRequest on the signed request
45
+ *
46
+ * @param Google_Http_Request $request
47
+ * @return Google_Http_Request The resulting HTTP response including the
48
+ * responseHttpCode, responseHeaders and responseBody.
49
+ */
50
+ public function authenticatedRequest(Google_Http_Request $request)
51
+ {
52
+ $request = $this->sign($request);
53
+ return $this->client->getIo()->makeRequest($request);
54
+ }
55
+
56
+ /**
57
+ * @param string $token
58
+ * @throws Google_Auth_Exception
59
+ */
60
+ public function setAccessToken($token)
61
+ {
62
+ $token = json_decode($token, true);
63
+ if ($token == null) {
64
+ throw new Google_Auth_Exception('Could not json decode the token');
65
+ }
66
+ if (! isset($token['access_token'])) {
67
+ throw new Google_Auth_Exception("Invalid token format");
68
+ }
69
+ $token['created'] = time();
70
+ $this->token = $token;
71
+ }
72
+
73
+ public function getAccessToken()
74
+ {
75
+ return json_encode($this->token);
76
+ }
77
+
78
+ /**
79
+ * Acquires a new access token from the compute engine metadata server.
80
+ * @throws Google_Auth_Exception
81
+ */
82
+ public function acquireAccessToken()
83
+ {
84
+ $request = new Google_Http_Request(
85
+ self::METADATA_AUTH_URL,
86
+ 'GET',
87
+ array(
88
+ 'Metadata-Flavor' => 'Google'
89
+ )
90
+ );
91
+ $request->disableGzip();
92
+ $response = $this->client->getIo()->makeRequest($request);
93
+
94
+ if ($response->getResponseHttpCode() == 200) {
95
+ $this->setAccessToken($response->getResponseBody());
96
+ $this->token['created'] = time();
97
+ return $this->getAccessToken();
98
+ } else {
99
+ throw new Google_Auth_Exception(
100
+ sprintf(
101
+ "Error fetching service account access token, message: '%s'",
102
+ $response->getResponseBody()
103
+ ),
104
+ $response->getResponseHttpCode()
105
+ );
106
+ }
107
+ }
108
+
109
+ /**
110
+ * Include an accessToken in a given apiHttpRequest.
111
+ * @param Google_Http_Request $request
112
+ * @return Google_Http_Request
113
+ * @throws Google_Auth_Exception
114
+ */
115
+ public function sign(Google_Http_Request $request)
116
+ {
117
+ if ($this->isAccessTokenExpired()) {
118
+ $this->acquireAccessToken();
119
+ }
120
+
121
+ $this->client->getLogger()->debug('Compute engine service account authentication');
122
+
123
+ $request->setRequestHeaders(
124
+ array('Authorization' => 'Bearer ' . $this->token['access_token'])
125
+ );
126
+
127
+ return $request;
128
+ }
129
+
130
+ /**
131
+ * Returns if the access_token is expired.
132
+ * @return bool Returns True if the access_token is expired.
133
+ */
134
+ public function isAccessTokenExpired()
135
+ {
136
+ if (!$this->token || !isset($this->token['created'])) {
137
+ return true;
138
+ }
139
+
140
+ // If the token is set to expire in the next 30 seconds.
141
+ $expired = ($this->token['created']
142
+ + ($this->token['expires_in'] - 30)) < time();
143
+
144
+ return $expired;
145
+ }
146
+ }
app/api/Google/Auth/Exception.php ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2013 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ if (!class_exists('Google_Client')) {
19
+ require_once dirname(__FILE__) . '/../autoload.php';
20
+ }
21
+
22
+ class Google_Auth_Exception extends Google_Exception
23
+ {
24
+ }
app/api/Google/Auth/LoginTicket.php ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2011 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ if (!class_exists('Google_Client')) {
19
+ require_once dirname(__FILE__) . '/../autoload.php';
20
+ }
21
+
22
+ /**
23
+ * Class to hold information about an authenticated login.
24
+ *
25
+ * @author Brian Eaton <beaton@google.com>
26
+ */
27
+ class Google_Auth_LoginTicket
28
+ {
29
+ const USER_ATTR = "sub";
30
+
31
+ // Information from id token envelope.
32
+ private $envelope;
33
+
34
+ // Information from id token payload.
35
+ private $payload;
36
+
37
+ /**
38
+ * Creates a user based on the supplied token.
39
+ *
40
+ * @param string $envelope Header from a verified authentication token.
41
+ * @param string $payload Information from a verified authentication token.
42
+ */
43
+ public function __construct($envelope, $payload)
44
+ {
45
+ $this->envelope = $envelope;
46
+ $this->payload = $payload;
47
+ }
48
+
49
+ /**
50
+ * Returns the numeric identifier for the user.
51
+ * @throws Google_Auth_Exception
52
+ * @return
53
+ */
54
+ public function getUserId()
55
+ {
56
+ if (array_key_exists(self::USER_ATTR, $this->payload)) {
57
+ return $this->payload[self::USER_ATTR];
58
+ }
59
+ throw new Google_Auth_Exception("No user_id in token");
60
+ }
61
+
62
+ /**
63
+ * Returns attributes from the login ticket. This can contain
64
+ * various information about the user session.
65
+ * @return array
66
+ */
67
+ public function getAttributes()
68
+ {
69
+ return array("envelope" => $this->envelope, "payload" => $this->payload);
70
+ }
71
+ }
app/api/Google/Auth/OAuth2.php ADDED
@@ -0,0 +1,646 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2008 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ if (!class_exists('Google_Client')) {
19
+ require_once dirname(__FILE__) . '/../autoload.php';
20
+ }
21
+
22
+ /**
23
+ * Authentication class that deals with the OAuth 2 web-server authentication flow
24
+ *
25
+ */
26
+ class Google_Auth_OAuth2 extends Google_Auth_Abstract
27
+ {
28
+ const OAUTH2_REVOKE_URI = 'https://accounts.google.com/o/oauth2/revoke';
29
+ const OAUTH2_TOKEN_URI = 'https://accounts.google.com/o/oauth2/token';
30
+ const OAUTH2_AUTH_URL = 'https://accounts.google.com/o/oauth2/auth';
31
+ const CLOCK_SKEW_SECS = 300; // five minutes in seconds
32
+ const AUTH_TOKEN_LIFETIME_SECS = 300; // five minutes in seconds
33
+ const MAX_TOKEN_LIFETIME_SECS = 86400; // one day in seconds
34
+ const OAUTH2_ISSUER = 'accounts.google.com';
35
+ const OAUTH2_ISSUER_HTTPS = 'https://accounts.google.com';
36
+
37
+ /** @var Google_Auth_AssertionCredentials $assertionCredentials */
38
+ private $assertionCredentials;
39
+
40
+ /**
41
+ * @var string The state parameters for CSRF and other forgery protection.
42
+ */
43
+ private $state;
44
+
45
+ /**
46
+ * @var array The token bundle.
47
+ */
48
+ private $token = array();
49
+
50
+ /**
51
+ * @var Google_Client the base client
52
+ */
53
+ private $client;
54
+
55
+ /**
56
+ * Instantiates the class, but does not initiate the login flow, leaving it
57
+ * to the discretion of the caller.
58
+ */
59
+ public function __construct(Google_Client $client)
60
+ {
61
+ $this->client = $client;
62
+ }
63
+
64
+ /**
65
+ * Perform an authenticated / signed apiHttpRequest.
66
+ * This function takes the apiHttpRequest, calls apiAuth->sign on it
67
+ * (which can modify the request in what ever way fits the auth mechanism)
68
+ * and then calls apiCurlIO::makeRequest on the signed request
69
+ *
70
+ * @param Google_Http_Request $request
71
+ * @return Google_Http_Request The resulting HTTP response including the
72
+ * responseHttpCode, responseHeaders and responseBody.
73
+ */
74
+ public function authenticatedRequest(Google_Http_Request $request)
75
+ {
76
+ $request = $this->sign($request);
77
+ return $this->client->getIo()->makeRequest($request);
78
+ }
79
+
80
+ /**
81
+ * @param string $code
82
+ * @param boolean $crossClient
83
+ * @throws Google_Auth_Exception
84
+ * @return string
85
+ */
86
+ public function authenticate($code, $crossClient = false)
87
+ {
88
+ if (strlen($code) == 0) {
89
+ throw new Google_Auth_Exception("Invalid code");
90
+ }
91
+
92
+ $arguments = array(
93
+ 'code' => $code,
94
+ 'grant_type' => 'authorization_code',
95
+ 'client_id' => $this->client->getClassConfig($this, 'client_id'),
96
+ 'client_secret' => $this->client->getClassConfig($this, 'client_secret')
97
+ );
98
+
99
+ if ($crossClient !== true) {
100
+ $arguments['redirect_uri'] = $this->client->getClassConfig($this, 'redirect_uri');
101
+ }
102
+
103
+ // We got here from the redirect from a successful authorization grant,
104
+ // fetch the access token
105
+ $request = new Google_Http_Request(
106
+ self::OAUTH2_TOKEN_URI,
107
+ 'POST',
108
+ array(),
109
+ $arguments
110
+ );
111
+ $request->disableGzip();
112
+ $response = $this->client->getIo()->makeRequest($request);
113
+
114
+ if ($response->getResponseHttpCode() == 200) {
115
+ $this->setAccessToken($response->getResponseBody());
116
+ $this->token['created'] = time();
117
+ return $this->getAccessToken();
118
+ } else {
119
+ $decodedResponse = json_decode($response->getResponseBody(), true);
120
+ if ($decodedResponse != null && $decodedResponse['error']) {
121
+ $errorText = $decodedResponse['error'];
122
+ if (isset($decodedResponse['error_description'])) {
123
+ $errorText .= ": " . $decodedResponse['error_description'];
124
+ }
125
+ }
126
+ throw new Google_Auth_Exception(
127
+ sprintf(
128
+ "Error fetching OAuth2 access token, message: '%s'",
129
+ $errorText
130
+ ),
131
+ $response->getResponseHttpCode()
132
+ );
133
+ }
134
+ }
135
+
136
+ /**
137
+ * Create a URL to obtain user authorization.
138
+ * The authorization endpoint allows the user to first
139
+ * authenticate, and then grant/deny the access request.
140
+ * @param string $scope The scope is expressed as a list of space-delimited strings.
141
+ * @return string
142
+ */
143
+ public function createAuthUrl($scope)
144
+ {
145
+ $params = array(
146
+ 'response_type' => 'code',
147
+ 'redirect_uri' => $this->client->getClassConfig($this, 'redirect_uri'),
148
+ 'client_id' => $this->client->getClassConfig($this, 'client_id'),
149
+ 'scope' => $scope,
150
+ 'access_type' => $this->client->getClassConfig($this, 'access_type'),
151
+ );
152
+
153
+ // Prefer prompt to approval prompt.
154
+ if ($this->client->getClassConfig($this, 'prompt')) {
155
+ $params = $this->maybeAddParam($params, 'prompt');
156
+ } else {
157
+ $params = $this->maybeAddParam($params, 'approval_prompt');
158
+ }
159
+ $params = $this->maybeAddParam($params, 'login_hint');
160
+ $params = $this->maybeAddParam($params, 'hd');
161
+ $params = $this->maybeAddParam($params, 'openid.realm');
162
+ $params = $this->maybeAddParam($params, 'include_granted_scopes');
163
+
164
+ // If the list of scopes contains plus.login, add request_visible_actions
165
+ // to auth URL.
166
+ $rva = $this->client->getClassConfig($this, 'request_visible_actions');
167
+ if (strpos($scope, 'plus.login') && strlen($rva) > 0) {
168
+ $params['request_visible_actions'] = $rva;
169
+ }
170
+
171
+ if (isset($this->state)) {
172
+ $params['state'] = $this->state;
173
+ }
174
+
175
+ return self::OAUTH2_AUTH_URL . "?" . http_build_query($params, '', '&');
176
+ }
177
+
178
+ /**
179
+ * @param string $token
180
+ * @throws Google_Auth_Exception
181
+ */
182
+ public function setAccessToken($token)
183
+ {
184
+ $token = json_decode($token, true);
185
+ if ($token == null) {
186
+ throw new Google_Auth_Exception('Could not json decode the token');
187
+ }
188
+ if (! isset($token['access_token'])) {
189
+ throw new Google_Auth_Exception("Invalid token format");
190
+ }
191
+ $this->token = $token;
192
+ }
193
+
194
+ public function getAccessToken()
195
+ {
196
+ return json_encode($this->token);
197
+ }
198
+
199
+ public function getRefreshToken()
200
+ {
201
+ if (array_key_exists('refresh_token', $this->token)) {
202
+ return $this->token['refresh_token'];
203
+ } else {
204
+ return null;
205
+ }
206
+ }
207
+
208
+ public function setState($state)
209
+ {
210
+ $this->state = $state;
211
+ }
212
+
213
+ public function setAssertionCredentials(Google_Auth_AssertionCredentials $creds)
214
+ {
215
+ $this->assertionCredentials = $creds;
216
+ }
217
+
218
+ /**
219
+ * Include an accessToken in a given apiHttpRequest.
220
+ * @param Google_Http_Request $request
221
+ * @return Google_Http_Request
222
+ * @throws Google_Auth_Exception
223
+ */
224
+ public function sign(Google_Http_Request $request)
225
+ {
226
+ // add the developer key to the request before signing it
227
+ if ($this->client->getClassConfig($this, 'developer_key')) {
228
+ $request->setQueryParam('key', $this->client->getClassConfig($this, 'developer_key'));
229
+ }
230
+
231
+ // Cannot sign the request without an OAuth access token.
232
+ if (null == $this->token && null == $this->assertionCredentials) {
233
+ return $request;
234
+ }
235
+
236
+ // Check if the token is set to expire in the next 30 seconds
237
+ // (or has already expired).
238
+ if ($this->isAccessTokenExpired()) {
239
+ if ($this->assertionCredentials) {
240
+ $this->refreshTokenWithAssertion();
241
+ } else {
242
+ $this->client->getLogger()->debug('OAuth2 access token expired');
243
+ if (! array_key_exists('refresh_token', $this->token)) {
244
+ $error = "The OAuth 2.0 access token has expired,"
245
+ ." and a refresh token is not available. Refresh tokens"
246
+ ." are not returned for responses that were auto-approved.";
247
+
248
+ $this->client->getLogger()->error($error);
249
+ throw new Google_Auth_Exception($error);
250
+ }
251
+ $this->refreshToken($this->token['refresh_token']);
252
+ }
253
+ }
254
+
255
+ $this->client->getLogger()->debug('OAuth2 authentication');
256
+
257
+ // Add the OAuth2 header to the request
258
+ $request->setRequestHeaders(
259
+ array('Authorization' => 'Bearer ' . $this->token['access_token'])
260
+ );
261
+
262
+ return $request;
263
+ }
264
+
265
+ /**
266
+ * Fetches a fresh access token with the given refresh token.
267
+ * @param string $refreshToken
268
+ * @return void
269
+ */
270
+ public function refreshToken($refreshToken)
271
+ {
272
+ $this->refreshTokenRequest(
273
+ array(
274
+ 'client_id' => $this->client->getClassConfig($this, 'client_id'),
275
+ 'client_secret' => $this->client->getClassConfig($this, 'client_secret'),
276
+ 'refresh_token' => $refreshToken,
277
+ 'grant_type' => 'refresh_token'
278
+ )
279
+ );
280
+ }
281
+
282
+ /**
283
+ * Fetches a fresh access token with a given assertion token.
284
+ * @param Google_Auth_AssertionCredentials $assertionCredentials optional.
285
+ * @return void
286
+ */
287
+ public function refreshTokenWithAssertion($assertionCredentials = null)
288
+ {
289
+ if (!$assertionCredentials) {
290
+ $assertionCredentials = $this->assertionCredentials;
291
+ }
292
+
293
+ $cacheKey = $assertionCredentials->getCacheKey();
294
+
295
+ if ($cacheKey) {
296
+ // We can check whether we have a token available in the
297
+ // cache. If it is expired, we can retrieve a new one from
298
+ // the assertion.
299
+ $token = $this->client->getCache()->get($cacheKey);
300
+ if ($token) {
301
+ $this->setAccessToken($token);
302
+ }
303
+ if (!$this->isAccessTokenExpired()) {
304
+ return;
305
+ }
306
+ }
307
+
308
+ $this->client->getLogger()->debug('OAuth2 access token expired');
309
+ $this->refreshTokenRequest(
310
+ array(
311
+ 'grant_type' => 'assertion',
312
+ 'assertion_type' => $assertionCredentials->assertionType,
313
+ 'assertion' => $assertionCredentials->generateAssertion(),
314
+ )
315
+ );
316
+
317
+ if ($cacheKey) {
318
+ // Attempt to cache the token.
319
+ $this->client->getCache()->set(
320
+ $cacheKey,
321
+ $this->getAccessToken()
322
+ );
323
+ }
324
+ }
325
+
326
+ private function refreshTokenRequest($params)
327
+ {
328
+ if (isset($params['assertion'])) {
329
+ $this->client->getLogger()->info(
330
+ 'OAuth2 access token refresh with Signed JWT assertion grants.'
331
+ );
332
+ } else {
333
+ $this->client->getLogger()->info('OAuth2 access token refresh');
334
+ }
335
+
336
+ $http = new Google_Http_Request(
337
+ self::OAUTH2_TOKEN_URI,
338
+ 'POST',
339
+ array(),
340
+ $params
341
+ );
342
+ $http->disableGzip();
343
+ $request = $this->client->getIo()->makeRequest($http);
344
+
345
+ $code = $request->getResponseHttpCode();
346
+ $body = $request->getResponseBody();
347
+ if (200 == $code) {
348
+ $token = json_decode($body, true);
349
+ if ($token == null) {
350
+ throw new Google_Auth_Exception("Could not json decode the access token");
351
+ }
352
+
353
+ if (! isset($token['access_token']) || ! isset($token['expires_in'])) {
354
+ throw new Google_Auth_Exception("Invalid token format");
355
+ }
356
+
357
+ if (isset($token['id_token'])) {
358
+ $this->token['id_token'] = $token['id_token'];
359
+ }
360
+ $this->token['access_token'] = $token['access_token'];
361
+ $this->token['expires_in'] = $token['expires_in'];
362
+ $this->token['created'] = time();
363
+ } else {
364
+ throw new Google_Auth_Exception("Error refreshing the OAuth2 token, message: '$body'", $code);
365
+ }
366
+ }
367
+
368
+ /**
369
+ * Revoke an OAuth2 access token or refresh token. This method will revoke the current access
370
+ * token, if a token isn't provided.
371
+ * @throws Google_Auth_Exception
372
+ * @param string|null $token The token (access token or a refresh token) that should be revoked.
373
+ * @return boolean Returns True if the revocation was successful, otherwise False.
374
+ */
375
+ public function revokeToken($token = null)
376
+ {
377
+ if (!$token) {
378
+ if (!$this->token) {
379
+ // Not initialized, no token to actually revoke
380
+ return false;
381
+ } elseif (array_key_exists('refresh_token', $this->token)) {
382
+ $token = $this->token['refresh_token'];
383
+ } else {
384
+ $token = $this->token['access_token'];
385
+ }
386
+ }
387
+ $request = new Google_Http_Request(
388
+ self::OAUTH2_REVOKE_URI,
389
+ 'POST',
390
+ array(),
391
+ "token=$token"
392
+ );
393
+ $request->disableGzip();
394
+ $response = $this->client->getIo()->makeRequest($request);
395
+ $code = $response->getResponseHttpCode();
396
+ if ($code == 200) {
397
+ $this->token = null;
398
+ return true;
399
+ }
400
+
401
+ return false;
402
+ }
403
+
404
+ /**
405
+ * Returns if the access_token is expired.
406
+ * @return bool Returns True if the access_token is expired.
407
+ */
408
+ public function isAccessTokenExpired()
409
+ {
410
+ if (!$this->token || !isset($this->token['created'])) {
411
+ return true;
412
+ }
413
+
414
+ // If the token is set to expire in the next 30 seconds.
415
+ $expired = ($this->token['created']
416
+ + ($this->token['expires_in'] - 30)) < time();
417
+
418
+ return $expired;
419
+ }
420
+
421
+ // Gets federated sign-on certificates to use for verifying identity tokens.
422
+ // Returns certs as array structure, where keys are key ids, and values
423
+ // are PEM encoded certificates.
424
+ private function getFederatedSignOnCerts()
425
+ {
426
+ return $this->retrieveCertsFromLocation(
427
+ $this->client->getClassConfig($this, 'federated_signon_certs_url')
428
+ );
429
+ }
430
+
431
+ /**
432
+ * Retrieve and cache a certificates file.
433
+ *
434
+ * @param $url string location
435
+ * @throws Google_Auth_Exception
436
+ * @return array certificates
437
+ */
438
+ public function retrieveCertsFromLocation($url)
439
+ {
440
+ // If we're retrieving a local file, just grab it.
441
+ if ("http" != substr($url, 0, 4)) {
442
+ $file = file_get_contents($url);
443
+ if ($file) {
444
+ return json_decode($file, true);
445
+ } else {
446
+ throw new Google_Auth_Exception(
447
+ "Failed to retrieve verification certificates: '" .
448
+ $url . "'."
449
+ );
450
+ }
451
+ }
452
+
453
+ // This relies on makeRequest caching certificate responses.
454
+ $request = $this->client->getIo()->makeRequest(
455
+ new Google_Http_Request(
456
+ $url
457
+ )
458
+ );
459
+ if ($request->getResponseHttpCode() == 200) {
460
+ $certs = json_decode($request->getResponseBody(), true);
461
+ if ($certs) {
462
+ return $certs;
463
+ }
464
+ }
465
+ throw new Google_Auth_Exception(
466
+ "Failed to retrieve verification certificates: '" .
467
+ $request->getResponseBody() . "'.",
468
+ $request->getResponseHttpCode()
469
+ );
470
+ }
471
+
472
+ /**
473
+ * Verifies an id token and returns the authenticated apiLoginTicket.
474
+ * Throws an exception if the id token is not valid.
475
+ * The audience parameter can be used to control which id tokens are
476
+ * accepted. By default, the id token must have been issued to this OAuth2 client.
477
+ *
478
+ * @param $id_token
479
+ * @param $audience
480
+ * @return Google_Auth_LoginTicket
481
+ */
482
+ public function verifyIdToken($id_token = null, $audience = null)
483
+ {
484
+ if (!$id_token) {
485
+ $id_token = $this->token['id_token'];
486
+ }
487
+ $certs = $this->getFederatedSignonCerts();
488
+ if (!$audience) {
489
+ $audience = $this->client->getClassConfig($this, 'client_id');
490
+ }
491
+
492
+ return $this->verifySignedJwtWithCerts(
493
+ $id_token,
494
+ $certs,
495
+ $audience,
496
+ array(self::OAUTH2_ISSUER, self::OAUTH2_ISSUER_HTTPS)
497
+ );
498
+ }
499
+
500
+ /**
501
+ * Verifies the id token, returns the verified token contents.
502
+ *
503
+ * @param $jwt string the token
504
+ * @param $certs array of certificates
505
+ * @param $required_audience string the expected consumer of the token
506
+ * @param [$issuer] the expected issues, defaults to Google
507
+ * @param [$max_expiry] the max lifetime of a token, defaults to MAX_TOKEN_LIFETIME_SECS
508
+ * @throws Google_Auth_Exception
509
+ * @return mixed token information if valid, false if not
510
+ */
511
+ public function verifySignedJwtWithCerts(
512
+ $jwt,
513
+ $certs,
514
+ $required_audience,
515
+ $issuer = null,
516
+ $max_expiry = null
517
+ ) {
518
+ if (!$max_expiry) {
519
+ // Set the maximum time we will accept a token for.
520
+ $max_expiry = self::MAX_TOKEN_LIFETIME_SECS;
521
+ }
522
+
523
+ $segments = explode(".", $jwt);
524
+ if (count($segments) != 3) {
525
+ throw new Google_Auth_Exception("Wrong number of segments in token: $jwt");
526
+ }
527
+ $signed = $segments[0] . "." . $segments[1];
528
+ $signature = Google_Utils::urlSafeB64Decode($segments[2]);
529
+
530
+ // Parse envelope.
531
+ $envelope = json_decode(Google_Utils::urlSafeB64Decode($segments[0]), true);
532
+ if (!$envelope) {
533
+ throw new Google_Auth_Exception("Can't parse token envelope: " . $segments[0]);
534
+ }
535
+
536
+ // Parse token
537
+ $json_body = Google_Utils::urlSafeB64Decode($segments[1]);
538
+ $payload = json_decode($json_body, true);
539
+ if (!$payload) {
540
+ throw new Google_Auth_Exception("Can't parse token payload: " . $segments[1]);
541
+ }
542
+
543
+ // Check signature
544
+ $verified = false;
545
+ foreach ($certs as $keyName => $pem) {
546
+ $public_key = new Google_Verifier_Pem($pem);
547
+ if ($public_key->verify($signed, $signature)) {
548
+ $verified = true;
549
+ break;
550
+ }
551
+ }
552
+
553
+ if (!$verified) {
554
+ throw new Google_Auth_Exception("Invalid token signature: $jwt");
555
+ }
556
+
557
+ // Check issued-at timestamp
558
+ $iat = 0;
559
+ if (array_key_exists("iat", $payload)) {
560
+ $iat = $payload["iat"];
561
+ }
562
+ if (!$iat) {
563
+ throw new Google_Auth_Exception("No issue time in token: $json_body");
564
+ }
565
+ $earliest = $iat - self::CLOCK_SKEW_SECS;
566
+
567
+ // Check expiration timestamp
568
+ $now = time();
569
+ $exp = 0;
570
+ if (array_key_exists("exp", $payload)) {
571
+ $exp = $payload["exp"];
572
+ }
573
+ if (!$exp) {
574
+ throw new Google_Auth_Exception("No expiration time in token: $json_body");
575
+ }
576
+ if ($exp >= $now + $max_expiry) {
577
+ throw new Google_Auth_Exception(
578
+ sprintf("Expiration time too far in future: %s", $json_body)
579
+ );
580
+ }
581
+
582
+ $latest = $exp + self::CLOCK_SKEW_SECS;
583
+ if ($now < $earliest) {
584
+ throw new Google_Auth_Exception(
585
+ sprintf(
586
+ "Token used too early, %s < %s: %s",
587
+ $now,
588
+ $earliest,
589
+ $json_body
590
+ )
591
+ );
592
+ }
593
+ if ($now > $latest) {
594
+ throw new Google_Auth_Exception(
595
+ sprintf(
596
+ "Token used too late, %s > %s: %s",
597
+ $now,
598
+ $latest,
599
+ $json_body
600
+ )
601
+ );
602
+ }
603
+
604
+ // support HTTP and HTTPS issuers
605
+ // @see https://developers.google.com/identity/sign-in/web/backend-auth
606
+ $iss = $payload['iss'];
607
+ if ($issuer && !in_array($iss, (array) $issuer)) {
608
+ throw new Google_Auth_Exception(
609
+ sprintf(
610
+ "Invalid issuer, %s not in %s: %s",
611
+ $iss,
612
+ "[".implode(",", (array) $issuer)."]",
613
+ $json_body
614
+ )
615
+ );
616
+ }
617
+
618
+ // Check audience
619
+ $aud = $payload["aud"];
620
+ if ($aud != $required_audience) {
621
+ throw new Google_Auth_Exception(
622
+ sprintf(
623
+ "Wrong recipient, %s != %s:",
624
+ $aud,
625
+ $required_audience,
626
+ $json_body
627
+ )
628
+ );
629
+ }
630
+
631
+ // All good.
632
+ return new Google_Auth_LoginTicket($envelope, $payload);
633
+ }
634
+
635
+ /**
636
+ * Add a parameter to the auth params if not empty string.
637
+ */
638
+ private function maybeAddParam($params, $name)
639
+ {
640
+ $param = $this->client->getClassConfig($this, $name);
641
+ if ($param != '') {
642
+ $params[$name] = $param;
643
+ }
644
+ return $params;
645
+ }
646
+ }
app/api/Google/Auth/Simple.php ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2010 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ if (!class_exists('Google_Client')) {
19
+ require_once dirname(__FILE__) . '/../autoload.php';
20
+ }
21
+
22
+ /**
23
+ * Simple API access implementation. Can either be used to make requests
24
+ * completely unauthenticated, or by using a Simple API Access developer
25
+ * key.
26
+ */
27
+ class Google_Auth_Simple extends Google_Auth_Abstract
28
+ {
29
+ private $client;
30
+
31
+ public function __construct(Google_Client $client, $config = null)
32
+ {
33
+ $this->client = $client;
34
+ }
35
+
36
+ /**
37
+ * Perform an authenticated / signed apiHttpRequest.
38
+ * This function takes the apiHttpRequest, calls apiAuth->sign on it
39
+ * (which can modify the request in what ever way fits the auth mechanism)
40
+ * and then calls apiCurlIO::makeRequest on the signed request
41
+ *
42
+ * @param Google_Http_Request $request
43
+ * @return Google_Http_Request The resulting HTTP response including the
44
+ * responseHttpCode, responseHeaders and responseBody.
45
+ */
46
+ public function authenticatedRequest(Google_Http_Request $request)
47
+ {
48
+ $request = $this->sign($request);
49
+ return $this->io->makeRequest($request);
50
+ }
51
+
52
+ public function sign(Google_Http_Request $request)
53
+ {
54
+ $key = $this->client->getClassConfig($this, 'developer_key');
55
+ if ($key) {
56
+ $this->client->getLogger()->debug(
57
+ 'Simple API Access developer key authentication'
58
+ );
59
+ $request->setQueryParam('key', $key);
60
+ }
61
+ return $request;
62
+ }
63
+ }
app/api/Google/Cache/Abstract.php ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2008 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ /**
19
+ * Abstract storage class
20
+ *
21
+ * @author Chris Chabot <chabotc@google.com>
22
+ */
23
+ abstract class Google_Cache_Abstract
24
+ {
25
+
26
+ abstract public function __construct(Google_Client $client);
27
+
28
+ /**
29
+ * Retrieves the data for the given key, or false if they
30
+ * key is unknown or expired
31
+ *
32
+ * @param String $key The key who's data to retrieve
33
+ * @param boolean|int $expiration Expiration time in seconds
34
+ *
35
+ */
36
+ abstract public function get($key, $expiration = false);
37
+
38
+ /**
39
+ * Store the key => $value set. The $value is serialized
40
+ * by this function so can be of any type
41
+ *
42
+ * @param string $key Key of the data
43
+ * @param string $value data
44
+ */
45
+ abstract public function set($key, $value);
46
+
47
+ /**
48
+ * Removes the key/data pair for the given $key
49
+ *
50
+ * @param String $key
51
+ */
52
+ abstract public function delete($key);
53
+ }
app/api/Google/Cache/Apc.php ADDED
@@ -0,0 +1,113 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2010 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ if (!class_exists('Google_Client')) {
19
+ require_once dirname(__FILE__) . '/../autoload.php';
20
+ }
21
+
22
+ /**
23
+ * A persistent storage class based on the APC cache, which is not
24
+ * really very persistent, as soon as you restart your web server
25
+ * the storage will be wiped, however for debugging and/or speed
26
+ * it can be useful, and cache is a lot cheaper then storage.
27
+ *
28
+ * @author Chris Chabot <chabotc@google.com>
29
+ */
30
+ class Google_Cache_Apc extends Google_Cache_Abstract
31
+ {
32
+ /**
33
+ * @var Google_Client the current client
34
+ */
35
+ private $client;
36
+
37
+ public function __construct(Google_Client $client)
38
+ {
39
+ if (! function_exists('apc_add') ) {
40
+ $error = "Apc functions not available";
41
+
42
+ $client->getLogger()->error($error);
43
+ throw new Google_Cache_Exception($error);
44
+ }
45
+
46
+ $this->client = $client;
47
+ }
48
+
49
+ /**
50
+ * @inheritDoc
51
+ */
52
+ public function get($key, $expiration = false)
53
+ {
54
+ $ret = apc_fetch($key);
55
+ if ($ret === false) {
56
+ $this->client->getLogger()->debug(
57
+ 'APC cache miss',
58
+ array('key' => $key)
59
+ );
60
+ return false;
61
+ }
62
+ if (is_numeric($expiration) && (time() - $ret['time'] > $expiration)) {
63
+ $this->client->getLogger()->debug(
64
+ 'APC cache miss (expired)',
65
+ array('key' => $key, 'var' => $ret)
66
+ );
67
+ $this->delete($key);
68
+ return false;
69
+ }
70
+
71
+ $this->client->getLogger()->debug(
72
+ 'APC cache hit',
73
+ array('key' => $key, 'var' => $ret)
74
+ );
75
+
76
+ return $ret['data'];
77
+ }
78
+
79
+ /**
80
+ * @inheritDoc
81
+ */
82
+ public function set($key, $value)
83
+ {
84
+ $var = array('time' => time(), 'data' => $value);
85
+ $rc = apc_store($key, $var);
86
+
87
+ if ($rc == false) {
88
+ $this->client->getLogger()->error(
89
+ 'APC cache set failed',
90
+ array('key' => $key, 'var' => $var)
91
+ );
92
+ throw new Google_Cache_Exception("Couldn't store data");
93
+ }
94
+
95
+ $this->client->getLogger()->debug(
96
+ 'APC cache set',
97
+ array('key' => $key, 'var' => $var)
98
+ );
99
+ }
100
+
101
+ /**
102
+ * @inheritDoc
103
+ * @param String $key
104
+ */
105
+ public function delete($key)
106
+ {
107
+ $this->client->getLogger()->debug(
108
+ 'APC cache delete',
109
+ array('key' => $key)
110
+ );
111
+ apc_delete($key);
112
+ }
113
+ }
app/api/Google/Cache/Exception.php ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2013 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ if (!class_exists('Google_Client')) {
19
+ require_once dirname(__FILE__) . '/../autoload.php';
20
+ }
21
+
22
+ class Google_Cache_Exception extends Google_Exception
23
+ {
24
+ }
app/api/Google/Cache/File.php ADDED
@@ -0,0 +1,209 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2008 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ if (!class_exists('Google_Client')) {
19
+ require_once dirname(__FILE__) . '/../autoload.php';
20
+ }
21
+
22
+ /*
23
+ * This class implements a basic on disk storage. While that does
24
+ * work quite well it's not the most elegant and scalable solution.
25
+ * It will also get you into a heap of trouble when you try to run
26
+ * this in a clustered environment.
27
+ *
28
+ * @author Chris Chabot <chabotc@google.com>
29
+ */
30
+ class Google_Cache_File extends Google_Cache_Abstract
31
+ {
32
+ const MAX_LOCK_RETRIES = 10;
33
+ private $path;
34
+ private $fh;
35
+
36
+ /**
37
+ * @var Google_Client the current client
38
+ */
39
+ private $client;
40
+
41
+ public function __construct(Google_Client $client)
42
+ {
43
+ $this->client = $client;
44
+ $this->path = $this->client->getClassConfig($this, 'directory');
45
+ }
46
+
47
+ public function get($key, $expiration = false)
48
+ {
49
+ $storageFile = $this->getCacheFile($key);
50
+ $data = false;
51
+
52
+ if (!file_exists($storageFile)) {
53
+ $this->client->getLogger()->debug(
54
+ 'File cache miss',
55
+ array('key' => $key, 'file' => $storageFile)
56
+ );
57
+ return false;
58
+ }
59
+
60
+ if ($expiration) {
61
+ $mtime = filemtime($storageFile);
62
+ if ((time() - $mtime) >= $expiration) {
63
+ $this->client->getLogger()->debug(
64
+ 'File cache miss (expired)',
65
+ array('key' => $key, 'file' => $storageFile)
66
+ );
67
+ $this->delete($key);
68
+ return false;
69
+ }
70
+ }
71
+
72
+ if ($this->acquireReadLock($storageFile)) {
73
+ if (filesize($storageFile) > 0) {
74
+ $data = fread($this->fh, filesize($storageFile));
75
+ $data = unserialize($data);
76
+ } else {
77
+ $this->client->getLogger()->debug(
78
+ 'Cache file was empty',
79
+ array('file' => $storageFile)
80
+ );
81
+ }
82
+ $this->unlock($storageFile);
83
+ }
84
+
85
+ $this->client->getLogger()->debug(
86
+ 'File cache hit',
87
+ array('key' => $key, 'file' => $storageFile, 'var' => $data)
88
+ );
89
+
90
+ return $data;
91
+ }
92
+
93
+ public function set($key, $value)
94
+ {
95
+ $storageFile = $this->getWriteableCacheFile($key);
96
+ if ($this->acquireWriteLock($storageFile)) {
97
+ // We serialize the whole request object, since we don't only want the
98
+ // responseContent but also the postBody used, headers, size, etc.
99
+ $data = serialize($value);
100
+ $result = fwrite($this->fh, $data);
101
+ $this->unlock($storageFile);
102
+
103
+ $this->client->getLogger()->debug(
104
+ 'File cache set',
105
+ array('key' => $key, 'file' => $storageFile, 'var' => $value)
106
+ );
107
+ } else {
108
+ $this->client->getLogger()->notice(
109
+ 'File cache set failed',
110
+ array('key' => $key, 'file' => $storageFile)
111
+ );
112
+ }
113
+ }
114
+
115
+ public function delete($key)
116
+ {
117
+ $file = $this->getCacheFile($key);
118
+ if (file_exists($file) && !unlink($file)) {
119
+ $this->client->getLogger()->error(
120
+ 'File cache delete failed',
121
+ array('key' => $key, 'file' => $file)
122
+ );
123
+ throw new Google_Cache_Exception("Cache file could not be deleted");
124
+ }
125
+
126
+ $this->client->getLogger()->debug(
127
+ 'File cache delete',
128
+ array('key' => $key, 'file' => $file)
129
+ );
130
+ }
131
+
132
+ private function getWriteableCacheFile($file)
133
+ {
134
+ return $this->getCacheFile($file, true);
135
+ }
136
+
137
+ private function getCacheFile($file, $forWrite = false)
138
+ {
139
+ return $this->getCacheDir($file, $forWrite) . '/' . md5($file);
140
+ }
141
+
142
+ private function getCacheDir($file, $forWrite)
143
+ {
144
+ // use the first 2 characters of the hash as a directory prefix
145
+ // this should prevent slowdowns due to huge directory listings
146
+ // and thus give some basic amount of scalability
147
+ $storageDir = $this->path . '/' . substr(md5($file), 0, 2);
148
+ if ($forWrite && ! is_dir($storageDir)) {
149
+ if (! mkdir($storageDir, 0700, true)) {
150
+ $this->client->getLogger()->error(
151
+ 'File cache creation failed',
152
+ array('dir' => $storageDir)
153
+ );
154
+ throw new Google_Cache_Exception("Could not create storage directory: $storageDir");
155
+ }
156
+ }
157
+ return $storageDir;
158
+ }
159
+
160
+ private function acquireReadLock($storageFile)
161
+ {
162
+ return $this->acquireLock(LOCK_SH, $storageFile);
163
+ }
164
+
165
+ private function acquireWriteLock($storageFile)
166
+ {
167
+ $rc = $this->acquireLock(LOCK_EX, $storageFile);
168
+ if (!$rc) {
169
+ $this->client->getLogger()->notice(
170
+ 'File cache write lock failed',
171
+ array('file' => $storageFile)
172
+ );
173
+ $this->delete($storageFile);
174
+ }
175
+ return $rc;
176
+ }
177
+
178
+ private function acquireLock($type, $storageFile)
179
+ {
180
+ $mode = $type == LOCK_EX ? "w" : "r";
181
+ $this->fh = fopen($storageFile, $mode);
182
+ if (!$this->fh) {
183
+ $this->client->getLogger()->error(
184
+ 'Failed to open file during lock acquisition',
185
+ array('file' => $storageFile)
186
+ );
187
+ return false;
188
+ }
189
+ if ($type == LOCK_EX) {
190
+ chmod($storageFile, 0600);
191
+ }
192
+ $count = 0;
193
+ while (!flock($this->fh, $type | LOCK_NB)) {
194
+ // Sleep for 10ms.
195
+ usleep(10000);
196
+ if (++$count < self::MAX_LOCK_RETRIES) {
197
+ return false;
198
+ }
199
+ }
200
+ return true;
201
+ }
202
+
203
+ public function unlock($storageFile)
204
+ {
205
+ if ($this->fh) {
206
+ flock($this->fh, LOCK_UN);
207
+ }
208
+ }
209
+ }
app/api/Google/Cache/Memcache.php ADDED
@@ -0,0 +1,184 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2008 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ if (!class_exists('Google_Client')) {
19
+ require_once dirname(__FILE__) . '/../autoload.php';
20
+ }
21
+
22
+ /**
23
+ * A persistent storage class based on the memcache, which is not
24
+ * really very persistent, as soon as you restart your memcache daemon
25
+ * the storage will be wiped.
26
+ *
27
+ * Will use either the memcache or memcached extensions, preferring
28
+ * memcached.
29
+ *
30
+ * @author Chris Chabot <chabotc@google.com>
31
+ */
32
+ class Google_Cache_Memcache extends Google_Cache_Abstract
33
+ {
34
+ private $connection = false;
35
+ private $mc = false;
36
+ private $host;
37
+ private $port;
38
+
39
+ /**
40
+ * @var Google_Client the current client
41
+ */
42
+ private $client;
43
+
44
+ public function __construct(Google_Client $client)
45
+ {
46
+ if (!function_exists('memcache_connect') && !class_exists("Memcached")) {
47
+ $error = "Memcache functions not available";
48
+
49
+ $client->getLogger()->error($error);
50
+ throw new Google_Cache_Exception($error);
51
+ }
52
+
53
+ $this->client = $client;
54
+
55
+ if ($client->isAppEngine()) {
56
+ // No credentials needed for GAE.
57
+ $this->mc = new Memcached();
58
+ $this->connection = true;
59
+ } else {
60
+ $this->host = $client->getClassConfig($this, 'host');
61
+ $this->port = $client->getClassConfig($this, 'port');
62
+ if (empty($this->host) || (empty($this->port) && (string) $this->port != "0")) {
63
+ $error = "You need to supply a valid memcache host and port";
64
+
65
+ $client->getLogger()->error($error);
66
+ throw new Google_Cache_Exception($error);
67
+ }
68
+ }
69
+ }
70
+
71
+ /**
72
+ * @inheritDoc
73
+ */
74
+ public function get($key, $expiration = false)
75
+ {
76
+ $this->connect();
77
+ $ret = false;
78
+ if ($this->mc) {
79
+ $ret = $this->mc->get($key);
80
+ } else {
81
+ $ret = memcache_get($this->connection, $key);
82
+ }
83
+ if ($ret === false) {
84
+ $this->client->getLogger()->debug(
85
+ 'Memcache cache miss',
86
+ array('key' => $key)
87
+ );
88
+ return false;
89
+ }
90
+ if (is_numeric($expiration) && (time() - $ret['time'] > $expiration)) {
91
+ $this->client->getLogger()->debug(
92
+ 'Memcache cache miss (expired)',
93
+ array('key' => $key, 'var' => $ret)
94
+ );
95
+ $this->delete($key);
96
+ return false;
97
+ }
98
+
99
+ $this->client->getLogger()->debug(
100
+ 'Memcache cache hit',
101
+ array('key' => $key, 'var' => $ret)
102
+ );
103
+
104
+ return $ret['data'];
105
+ }
106
+
107
+ /**
108
+ * @inheritDoc
109
+ * @param string $key
110
+ * @param string $value
111
+ * @throws Google_Cache_Exception
112
+ */
113
+ public function set($key, $value)
114
+ {
115
+ $this->connect();
116
+ // we store it with the cache_time default expiration so objects will at
117
+ // least get cleaned eventually.
118
+ $data = array('time' => time(), 'data' => $value);
119
+ $rc = false;
120
+ if ($this->mc) {
121
+ $rc = $this->mc->set($key, $data);
122
+ } else {
123
+ $rc = memcache_set($this->connection, $key, $data, false);
124
+ }
125
+ if ($rc == false) {
126
+ $this->client->getLogger()->error(
127
+ 'Memcache cache set failed',
128
+ array('key' => $key, 'var' => $data)
129
+ );
130
+
131
+ throw new Google_Cache_Exception("Couldn't store data in cache");
132
+ }
133
+
134
+ $this->client->getLogger()->debug(
135
+ 'Memcache cache set',
136
+ array('key' => $key, 'var' => $data)
137
+ );
138
+ }
139
+
140
+ /**
141
+ * @inheritDoc
142
+ * @param String $key
143
+ */
144
+ public function delete($key)
145
+ {
146
+ $this->connect();
147
+ if ($this->mc) {
148
+ $this->mc->delete($key, 0);
149
+ } else {
150
+ memcache_delete($this->connection, $key, 0);
151
+ }
152
+
153
+ $this->client->getLogger()->debug(
154
+ 'Memcache cache delete',
155
+ array('key' => $key)
156
+ );
157
+ }
158
+
159
+ /**
160
+ * Lazy initialiser for memcache connection. Uses pconnect for to take
161
+ * advantage of the persistence pool where possible.
162
+ */
163
+ private function connect()
164
+ {
165
+ if ($this->connection) {
166
+ return;
167
+ }
168
+
169
+ if (class_exists("Memcached")) {
170
+ $this->mc = new Memcached();
171
+ $this->mc->addServer($this->host, $this->port);
172
+ $this->connection = true;
173
+ } else {
174
+ $this->connection = memcache_pconnect($this->host, $this->port);
175
+ }
176
+
177
+ if (! $this->connection) {
178
+ $error = "Couldn't connect to memcache server";
179
+
180
+ $this->client->getLogger()->error($error);
181
+ throw new Google_Cache_Exception($error);
182
+ }
183
+ }
184
+ }
app/api/Google/Cache/Null.php ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2014 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ if (!class_exists('Google_Client')) {
19
+ require_once dirname(__FILE__) . '/../autoload.php';
20
+ }
21
+
22
+ /**
23
+ * A blank storage class, for cases where caching is not
24
+ * required.
25
+ */
26
+ class Google_Cache_Null extends Google_Cache_Abstract
27
+ {
28
+ public function __construct(Google_Client $client)
29
+ {
30
+
31
+ }
32
+
33
+ /**
34
+ * @inheritDoc
35
+ */
36
+ public function get($key, $expiration = false)
37
+ {
38
+ return false;
39
+ }
40
+
41
+ /**
42
+ * @inheritDoc
43
+ */
44
+ public function set($key, $value)
45
+ {
46
+ // Nop.
47
+ }
48
+
49
+ /**
50
+ * @inheritDoc
51
+ * @param String $key
52
+ */
53
+ public function delete($key)
54
+ {
55
+ // Nop.
56
+ }
57
+ }
app/api/Google/Client.php ADDED
@@ -0,0 +1,715 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2010 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ if (!class_exists('Google_Client')) {
19
+ require_once dirname(__FILE__) . '/autoload.php';
20
+ }
21
+
22
+ /**
23
+ * The Google API Client
24
+ * https://github.com/google/google-api-php-client
25
+ */
26
+ class Google_Client
27
+ {
28
+ const LIBVER = "1.1.5";
29
+ const USER_AGENT_SUFFIX = "google-api-php-client/";
30
+ /**
31
+ * @var Google_Auth_Abstract $auth
32
+ */
33
+ private $auth;
34
+
35
+ /**
36
+ * @var Google_IO_Abstract $io
37
+ */
38
+ private $io;
39
+
40
+ /**
41
+ * @var Google_Cache_Abstract $cache
42
+ */
43
+ private $cache;
44
+
45
+ /**
46
+ * @var Google_Config $config
47
+ */
48
+ private $config;
49
+
50
+ /**
51
+ * @var Google_Logger_Abstract $logger
52
+ */
53
+ private $logger;
54
+
55
+ /**
56
+ * @var boolean $deferExecution
57
+ */
58
+ private $deferExecution = false;
59
+
60
+ /** @var array $scopes */
61
+ // Scopes requested by the client
62
+ protected $requestedScopes = array();
63
+
64
+ // definitions of services that are discovered.
65
+ protected $services = array();
66
+
67
+ // Used to track authenticated state, can't discover services after doing authenticate()
68
+ private $authenticated = false;
69
+
70
+ /**
71
+ * Construct the Google Client.
72
+ *
73
+ * @param $config Google_Config or string for the ini file to load
74
+ */
75
+ public function __construct($config = null)
76
+ {
77
+ if (is_string($config) && strlen($config)) {
78
+ $config = new Google_Config($config);
79
+ } else if ( !($config instanceof Google_Config)) {
80
+ $config = new Google_Config();
81
+
82
+ if ($this->isAppEngine()) {
83
+ // Automatically use Memcache if we're in AppEngine.
84
+ $config->setCacheClass('Google_Cache_Memcache');
85
+ }
86
+
87
+ if (version_compare(phpversion(), "5.3.4", "<=") || $this->isAppEngine()) {
88
+ // Automatically disable compress.zlib, as currently unsupported.
89
+ $config->setClassConfig('Google_Http_Request', 'disable_gzip', true);
90
+ }
91
+ }
92
+
93
+ if ($config->getIoClass() == Google_Config::USE_AUTO_IO_SELECTION) {
94
+ if (function_exists('curl_version') && function_exists('curl_exec')
95
+ && !$this->isAppEngine()) {
96
+ $config->setIoClass("Google_IO_Curl");
97
+ } else {
98
+ $config->setIoClass("Google_IO_Stream");
99
+ }
100
+ }
101
+
102
+ $this->config = $config;
103
+ }
104
+
105
+ /**
106
+ * Get a string containing the version of the library.
107
+ *
108
+ * @return string
109
+ */
110
+ public function getLibraryVersion()
111
+ {
112
+ return self::LIBVER;
113
+ }
114
+
115
+ /**
116
+ * Attempt to exchange a code for an valid authentication token.
117
+ * If $crossClient is set to true, the request body will not include
118
+ * the request_uri argument
119
+ * Helper wrapped around the OAuth 2.0 implementation.
120
+ *
121
+ * @param $code string code from accounts.google.com
122
+ * @param $crossClient boolean, whether this is a cross-client authentication
123
+ * @return string token
124
+ */
125
+ public function authenticate($code, $crossClient = false)
126
+ {
127
+ $this->authenticated = true;
128
+ return $this->getAuth()->authenticate($code, $crossClient);
129
+ }
130
+
131
+ /**
132
+ * Loads a service account key and parameters from a JSON
133
+ * file from the Google Developer Console. Uses that and the
134
+ * given array of scopes to return an assertion credential for
135
+ * use with refreshTokenWithAssertionCredential.
136
+ *
137
+ * @param string $jsonLocation File location of the project-key.json.
138
+ * @param array $scopes The scopes to assert.
139
+ * @return Google_Auth_AssertionCredentials.
140
+ * @
141
+ */
142
+ public function loadServiceAccountJson($jsonLocation, $scopes)
143
+ {
144
+ $data = json_decode(file_get_contents($jsonLocation));
145
+ if (isset($data->type) && $data->type == 'service_account') {
146
+ // Service Account format.
147
+ $cred = new Google_Auth_AssertionCredentials(
148
+ $data->client_email,
149
+ $scopes,
150
+ $data->private_key
151
+ );
152
+ return $cred;
153
+ } else {
154
+ throw new Google_Exception("Invalid service account JSON file.");
155
+ }
156
+ }
157
+
158
+ /**
159
+ * Set the auth config from the JSON string provided.
160
+ * This structure should match the file downloaded from
161
+ * the "Download JSON" button on in the Google Developer
162
+ * Console.
163
+ * @param string $json the configuration json
164
+ * @throws Google_Exception
165
+ */
166
+ public function setAuthConfig($json)
167
+ {
168
+ $data = json_decode($json);
169
+ $key = isset($data->installed) ? 'installed' : 'web';
170
+ if (!isset($data->$key)) {
171
+ throw new Google_Exception("Invalid client secret JSON file.");
172
+ }
173
+ $this->setClientId($data->$key->client_id);
174
+ $this->setClientSecret($data->$key->client_secret);
175
+ if (isset($data->$key->redirect_uris)) {
176
+ $this->setRedirectUri($data->$key->redirect_uris[0]);
177
+ }
178
+ }
179
+
180
+ /**
181
+ * Set the auth config from the JSON file in the path
182
+ * provided. This should match the file downloaded from
183
+ * the "Download JSON" button on in the Google Developer
184
+ * Console.
185
+ * @param string $file the file location of the client json
186
+ */
187
+ public function setAuthConfigFile($file)
188
+ {
189
+ $this->setAuthConfig(file_get_contents($file));
190
+ }
191
+
192
+ /**
193
+ * @throws Google_Auth_Exception
194
+ * @return array
195
+ * @visible For Testing
196
+ */
197
+ public function prepareScopes()
198
+ {
199
+ if (empty($this->requestedScopes)) {
200
+ throw new Google_Auth_Exception("No scopes specified");
201
+ }
202
+ $scopes = implode(' ', $this->requestedScopes);
203
+ return $scopes;
204
+ }
205
+
206
+ /**
207
+ * Set the OAuth 2.0 access token using the string that resulted from calling createAuthUrl()
208
+ * or Google_Client#getAccessToken().
209
+ * @param string $accessToken JSON encoded string containing in the following format:
210
+ * {"access_token":"TOKEN", "refresh_token":"TOKEN", "token_type":"Bearer",
211
+ * "expires_in":3600, "id_token":"TOKEN", "created":1320790426}
212
+ */
213
+ public function setAccessToken($accessToken)
214
+ {
215
+ if ($accessToken == 'null') {
216
+ $accessToken = null;
217
+ }
218
+ $this->getAuth()->setAccessToken($accessToken);
219
+ }
220
+
221
+
222
+
223
+ /**
224
+ * Set the authenticator object
225
+ * @param Google_Auth_Abstract $auth
226
+ */
227
+ public function setAuth(Google_Auth_Abstract $auth)
228
+ {
229
+ $this->config->setAuthClass(get_class($auth));
230
+ $this->auth = $auth;
231
+ }
232
+
233
+ /**
234
+ * Set the IO object
235
+ * @param Google_IO_Abstract $io
236
+ */
237
+ public function setIo(Google_IO_Abstract $io)
238
+ {
239
+ $this->config->setIoClass(get_class($io));
240
+ $this->io = $io;
241
+ }
242
+
243
+ /**
244
+ * Set the Cache object
245
+ * @param Google_Cache_Abstract $cache
246
+ */
247
+ public function setCache(Google_Cache_Abstract $cache)
248
+ {
249
+ $this->config->setCacheClass(get_class($cache));
250
+ $this->cache = $cache;
251
+ }
252
+
253
+ /**
254
+ * Set the Logger object
255
+ * @param Google_Logger_Abstract $logger
256
+ */
257
+ public function setLogger(Google_Logger_Abstract $logger)
258
+ {
259
+ $this->config->setLoggerClass(get_class($logger));
260
+ $this->logger = $logger;
261
+ }
262
+
263
+ /**
264
+ * Construct the OAuth 2.0 authorization request URI.
265
+ * @return string
266
+ */
267
+ public function createAuthUrl()
268
+ {
269
+ $scopes = $this->prepareScopes();
270
+ return $this->getAuth()->createAuthUrl($scopes);
271
+ }
272
+
273
+ /**
274
+ * Get the OAuth 2.0 access token.
275
+ * @return string $accessToken JSON encoded string in the following format:
276
+ * {"access_token":"TOKEN", "refresh_token":"TOKEN", "token_type":"Bearer",
277
+ * "expires_in":3600,"id_token":"TOKEN", "created":1320790426}
278
+ */
279
+ public function getAccessToken()
280
+ {
281
+ $token = $this->getAuth()->getAccessToken();
282
+ // The response is json encoded, so could be the string null.
283
+ // It is arguable whether this check should be here or lower
284
+ // in the library.
285
+ return (null == $token || 'null' == $token || '[]' == $token) ? null : $token;
286
+ }
287
+
288
+ /**
289
+ * Get the OAuth 2.0 refresh token.
290
+ * @return string $refreshToken refresh token or null if not available
291
+ */
292
+ public function getRefreshToken()
293
+ {
294
+ return $this->getAuth()->getRefreshToken();
295
+ }
296
+
297
+ /**
298
+ * Returns if the access_token is expired.
299
+ * @return bool Returns True if the access_token is expired.
300
+ */
301
+ public function isAccessTokenExpired()
302
+ {
303
+ return $this->getAuth()->isAccessTokenExpired();
304
+ }
305
+
306
+ /**
307
+ * Set OAuth 2.0 "state" parameter to achieve per-request customization.
308
+ * @see http://tools.ietf.org/html/draft-ietf-oauth-v2-22#section-3.1.2.2
309
+ * @param string $state
310
+ */
311
+ public function setState($state)
312
+ {
313
+ $this->getAuth()->setState($state);
314
+ }
315
+
316
+ /**
317
+ * @param string $accessType Possible values for access_type include:
318
+ * {@code "offline"} to request offline access from the user.
319
+ * {@code "online"} to request online access from the user.
320
+ */
321
+ public function setAccessType($accessType)
322
+ {
323
+ $this->config->setAccessType($accessType);
324
+ }
325
+
326
+ /**
327
+ * @param string $approvalPrompt Possible values for approval_prompt include:
328
+ * {@code "force"} to force the approval UI to appear. (This is the default value)
329
+ * {@code "auto"} to request auto-approval when possible.
330
+ */
331
+ public function setApprovalPrompt($approvalPrompt)
332
+ {
333
+ $this->config->setApprovalPrompt($approvalPrompt);
334
+ }
335
+
336
+ /**
337
+ * Set the login hint, email address or sub id.
338
+ * @param string $loginHint
339
+ */
340
+ public function setLoginHint($loginHint)
341
+ {
342
+ $this->config->setLoginHint($loginHint);
343
+ }
344
+
345
+ /**
346
+ * Set the application name, this is included in the User-Agent HTTP header.
347
+ * @param string $applicationName
348
+ */
349
+ public function setApplicationName($applicationName)
350
+ {
351
+ $this->config->setApplicationName($applicationName);
352
+ }
353
+
354
+ /**
355
+ * Set the OAuth 2.0 Client ID.
356
+ * @param string $clientId
357
+ */
358
+ public function setClientId($clientId)
359
+ {
360
+ $this->config->setClientId($clientId);
361
+ }
362
+
363
+ /**
364
+ * Set the OAuth 2.0 Client Secret.
365
+ * @param string $clientSecret
366
+ */
367
+ public function setClientSecret($clientSecret)
368
+ {
369
+ $this->config->setClientSecret($clientSecret);
370
+ }
371
+
372
+ /**
373
+ * Set the OAuth 2.0 Redirect URI.
374
+ * @param string $redirectUri
375
+ */
376
+ public function setRedirectUri($redirectUri)
377
+ {
378
+ $this->config->setRedirectUri($redirectUri);
379
+ }
380
+
381
+ /**
382
+ * If 'plus.login' is included in the list of requested scopes, you can use
383
+ * this method to define types of app activities that your app will write.
384
+ * You can find a list of available types here:
385
+ * @link https://developers.google.com/+/api/moment-types
386
+ *
387
+ * @param array $requestVisibleActions Array of app activity types
388
+ */
389
+ public function setRequestVisibleActions($requestVisibleActions)
390
+ {
391
+ if (is_array($requestVisibleActions)) {
392
+ $requestVisibleActions = join(" ", $requestVisibleActions);
393
+ }
394
+ $this->config->setRequestVisibleActions($requestVisibleActions);
395
+ }
396
+
397
+ /**
398
+ * Set the developer key to use, these are obtained through the API Console.
399
+ * @see http://code.google.com/apis/console-help/#generatingdevkeys
400
+ * @param string $developerKey
401
+ */
402
+ public function setDeveloperKey($developerKey)
403
+ {
404
+ $this->config->setDeveloperKey($developerKey);
405
+ }
406
+
407
+ /**
408
+ * Set the hd (hosted domain) parameter streamlines the login process for
409
+ * Google Apps hosted accounts. By including the domain of the user, you
410
+ * restrict sign-in to accounts at that domain.
411
+ * @param $hd string - the domain to use.
412
+ */
413
+ public function setHostedDomain($hd)
414
+ {
415
+ $this->config->setHostedDomain($hd);
416
+ }
417
+
418
+ /**
419
+ * Set the prompt hint. Valid values are none, consent and select_account.
420
+ * If no value is specified and the user has not previously authorized
421
+ * access, then the user is shown a consent screen.
422
+ * @param $prompt string
423
+ */
424
+ public function setPrompt($prompt)
425
+ {
426
+ $this->config->setPrompt($prompt);
427
+ }
428
+
429
+ /**
430
+ * openid.realm is a parameter from the OpenID 2.0 protocol, not from OAuth
431
+ * 2.0. It is used in OpenID 2.0 requests to signify the URL-space for which
432
+ * an authentication request is valid.
433
+ * @param $realm string - the URL-space to use.
434
+ */
435
+ public function setOpenidRealm($realm)
436
+ {
437
+ $this->config->setOpenidRealm($realm);
438
+ }
439
+
440
+ /**
441
+ * If this is provided with the value true, and the authorization request is
442
+ * granted, the authorization will include any previous authorizations
443
+ * granted to this user/application combination for other scopes.
444
+ * @param $include boolean - the URL-space to use.
445
+ */
446
+ public function setIncludeGrantedScopes($include)
447
+ {
448
+ $this->config->setIncludeGrantedScopes($include);
449
+ }
450
+
451
+ /**
452
+ * Fetches a fresh OAuth 2.0 access token with the given refresh token.
453
+ * @param string $refreshToken
454
+ */
455
+ public function refreshToken($refreshToken)
456
+ {
457
+ $this->getAuth()->refreshToken($refreshToken);
458
+ }
459
+
460
+ /**
461
+ * Revoke an OAuth2 access token or refresh token. This method will revoke the current access
462
+ * token, if a token isn't provided.
463
+ * @throws Google_Auth_Exception
464
+ * @param string|null $token The token (access token or a refresh token) that should be revoked.
465
+ * @return boolean Returns True if the revocation was successful, otherwise False.
466
+ */
467
+ public function revokeToken($token = null)
468
+ {
469
+ return $this->getAuth()->revokeToken($token);
470
+ }
471
+
472
+ /**
473
+ * Verify an id_token. This method will verify the current id_token, if one
474
+ * isn't provided.
475
+ * @throws Google_Auth_Exception
476
+ * @param string|null $token The token (id_token) that should be verified.
477
+ * @return Google_Auth_LoginTicket Returns an apiLoginTicket if the verification was
478
+ * successful.
479
+ */
480
+ public function verifyIdToken($token = null)
481
+ {
482
+ return $this->getAuth()->verifyIdToken($token);
483
+ }
484
+
485
+ /**
486
+ * Verify a JWT that was signed with your own certificates.
487
+ *
488
+ * @param $id_token string The JWT token
489
+ * @param $cert_location array of certificates
490
+ * @param $audience string the expected consumer of the token
491
+ * @param $issuer string the expected issuer, defaults to Google
492
+ * @param [$max_expiry] the max lifetime of a token, defaults to MAX_TOKEN_LIFETIME_SECS
493
+ * @return mixed token information if valid, false if not
494
+ */
495
+ public function verifySignedJwt($id_token, $cert_location, $audience, $issuer, $max_expiry = null)
496
+ {
497
+ $auth = new Google_Auth_OAuth2($this);
498
+ $certs = $auth->retrieveCertsFromLocation($cert_location);
499
+ return $auth->verifySignedJwtWithCerts($id_token, $certs, $audience, $issuer, $max_expiry);
500
+ }
501
+
502
+ /**
503
+ * @param $creds Google_Auth_AssertionCredentials
504
+ */
505
+ public function setAssertionCredentials(Google_Auth_AssertionCredentials $creds)
506
+ {
507
+ $this->getAuth()->setAssertionCredentials($creds);
508
+ }
509
+
510
+ /**
511
+ * Set the scopes to be requested. Must be called before createAuthUrl().
512
+ * Will remove any previously configured scopes.
513
+ * @param array $scopes, ie: array('https://www.googleapis.com/auth/plus.login',
514
+ * 'https://www.googleapis.com/auth/moderator')
515
+ */
516
+ public function setScopes($scopes)
517
+ {
518
+ $this->requestedScopes = array();
519
+ $this->addScope($scopes);
520
+ }
521
+
522
+ /**
523
+ * This functions adds a scope to be requested as part of the OAuth2.0 flow.
524
+ * Will append any scopes not previously requested to the scope parameter.
525
+ * A single string will be treated as a scope to request. An array of strings
526
+ * will each be appended.
527
+ * @param $scope_or_scopes string|array e.g. "profile"
528
+ */
529
+ public function addScope($scope_or_scopes)
530
+ {
531
+ if (is_string($scope_or_scopes) && !in_array($scope_or_scopes, $this->requestedScopes)) {
532
+ $this->requestedScopes[] = $scope_or_scopes;
533
+ } else if (is_array($scope_or_scopes)) {
534
+ foreach ($scope_or_scopes as $scope) {
535
+ $this->addScope($scope);
536
+ }
537
+ }
538
+ }
539
+
540
+ /**
541
+ * Returns the list of scopes requested by the client
542
+ * @return array the list of scopes
543
+ *
544
+ */
545
+ public function getScopes()
546
+ {
547
+ return $this->requestedScopes;
548
+ }
549
+
550
+ /**
551
+ * Declare whether batch calls should be used. This may increase throughput
552
+ * by making multiple requests in one connection.
553
+ *
554
+ * @param boolean $useBatch True if the batch support should
555
+ * be enabled. Defaults to False.
556
+ */
557
+ public function setUseBatch($useBatch)
558
+ {
559
+ // This is actually an alias for setDefer.
560
+ $this->setDefer($useBatch);
561
+ }
562
+
563
+ /**
564
+ * Declare whether making API calls should make the call immediately, or
565
+ * return a request which can be called with ->execute();
566
+ *
567
+ * @param boolean $defer True if calls should not be executed right away.
568
+ */
569
+ public function setDefer($defer)
570
+ {
571
+ $this->deferExecution = $defer;
572
+ }
573
+
574
+ /**
575
+ * Helper method to execute deferred HTTP requests.
576
+ *
577
+ * @param $request Google_Http_Request|Google_Http_Batch
578
+ * @throws Google_Exception
579
+ * @return object of the type of the expected class or array.
580
+ */
581
+ public function execute($request)
582
+ {
583
+ if ($request instanceof Google_Http_Request) {
584
+ $request->setUserAgent(
585
+ $this->getApplicationName()
586
+ . " " . self::USER_AGENT_SUFFIX
587
+ . $this->getLibraryVersion()
588
+ );
589
+ if (!$this->getClassConfig("Google_Http_Request", "disable_gzip")) {
590
+ $request->enableGzip();
591
+ }
592
+ $request->maybeMoveParametersToBody();
593
+ return Google_Http_REST::execute($this, $request);
594
+ } else if ($request instanceof Google_Http_Batch) {
595
+ return $request->execute();
596
+ } else {
597
+ throw new Google_Exception("Do not know how to execute this type of object.");
598
+ }
599
+ }
600
+
601
+ /**
602
+ * Whether or not to return raw requests
603
+ * @return boolean
604
+ */
605
+ public function shouldDefer()
606
+ {
607
+ return $this->deferExecution;
608
+ }
609
+
610
+ /**
611
+ * @return Google_Auth_Abstract Authentication implementation
612
+ */
613
+ public function getAuth()
614
+ {
615
+ if (!isset($this->auth)) {
616
+ $class = $this->config->getAuthClass();
617
+ $this->auth = new $class($this);
618
+ }
619
+ return $this->auth;
620
+ }
621
+
622
+ /**
623
+ * @return Google_IO_Abstract IO implementation
624
+ */
625
+ public function getIo()
626
+ {
627
+ if (!isset($this->io)) {
628
+ $class = $this->config->getIoClass();
629
+ $this->io = new $class($this);
630
+ }
631
+ return $this->io;
632
+ }
633
+
634
+ /**
635
+ * @return Google_Cache_Abstract Cache implementation
636
+ */
637
+ public function getCache()
638
+ {
639
+ if (!isset($this->cache)) {
640
+ $class = $this->config->getCacheClass();
641
+ $this->cache = new $class($this);
642
+ }
643
+ return $this->cache;
644
+ }
645
+
646
+ /**
647
+ * @return Google_Logger_Abstract Logger implementation
648
+ */
649
+ public function getLogger()
650
+ {
651
+ if (!isset($this->logger)) {
652
+ $class = $this->config->getLoggerClass();
653
+ $this->logger = new $class($this);
654
+ }
655
+ return $this->logger;
656
+ }
657
+
658
+ /**
659
+ * Retrieve custom configuration for a specific class.
660
+ * @param $class string|object - class or instance of class to retrieve
661
+ * @param $key string optional - key to retrieve
662
+ * @return array
663
+ */
664
+ public function getClassConfig($class, $key = null)
665
+ {
666
+ if (!is_string($class)) {
667
+ $class = get_class($class);
668
+ }
669
+ return $this->config->getClassConfig($class, $key);
670
+ }
671
+
672
+ /**
673
+ * Set configuration specific to a given class.
674
+ * $config->setClassConfig('Google_Cache_File',
675
+ * array('directory' => '/tmp/cache'));
676
+ * @param $class string|object - The class name for the configuration
677
+ * @param $config string key or an array of configuration values
678
+ * @param $value string optional - if $config is a key, the value
679
+ *
680
+ */
681
+ public function setClassConfig($class, $config, $value = null)
682
+ {
683
+ if (!is_string($class)) {
684
+ $class = get_class($class);
685
+ }
686
+ $this->config->setClassConfig($class, $config, $value);
687
+
688
+ }
689
+
690
+ /**
691
+ * @return string the base URL to use for calls to the APIs
692
+ */
693
+ public function getBasePath()
694
+ {
695
+ return $this->config->getBasePath();
696
+ }
697
+
698
+ /**
699
+ * @return string the name of the application
700
+ */
701
+ public function getApplicationName()
702
+ {
703
+ return $this->config->getApplicationName();
704
+ }
705
+
706
+ /**
707
+ * Are we running in Google AppEngine?
708
+ * return bool
709
+ */
710
+ public function isAppEngine()
711
+ {
712
+ return (isset($_SERVER['SERVER_SOFTWARE']) &&
713
+ strpos($_SERVER['SERVER_SOFTWARE'], 'Google App Engine') !== false);
714
+ }
715
+ }
app/api/Google/Collection.php ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if (!class_exists('Google_Client')) {
4
+ require_once dirname(__FILE__) . '/autoload.php';
5
+ }
6
+
7
+ /**
8
+ * Extension to the regular Google_Model that automatically
9
+ * exposes the items array for iteration, so you can just
10
+ * iterate over the object rather than a reference inside.
11
+ */
12
+ class Google_Collection extends Google_Model implements Iterator, Countable
13
+ {
14
+ protected $collection_key = 'items';
15
+
16
+ public function rewind()
17
+ {
18
+ if (isset($this->modelData[$this->collection_key])
19
+ && is_array($this->modelData[$this->collection_key])) {
20
+ reset($this->modelData[$this->collection_key]);
21
+ }
22
+ }
23
+
24
+ public function current()
25
+ {
26
+ $this->coerceType($this->key());
27
+ if (is_array($this->modelData[$this->collection_key])) {
28
+ return current($this->modelData[$this->collection_key]);
29
+ }
30
+ }
31
+
32
+ public function key()
33
+ {
34
+ if (isset($this->modelData[$this->collection_key])
35
+ && is_array($this->modelData[$this->collection_key])) {
36
+ return key($this->modelData[$this->collection_key]);
37
+ }
38
+ }
39
+
40
+ public function next()
41
+ {
42
+ return next($this->modelData[$this->collection_key]);
43
+ }
44
+
45
+ public function valid()
46
+ {
47
+ $key = $this->key();
48
+ return $key !== null && $key !== false;
49
+ }
50
+
51
+ public function count()
52
+ {
53
+ if (!isset($this->modelData[$this->collection_key])) {
54
+ return 0;
55
+ }
56
+ return count($this->modelData[$this->collection_key]);
57
+ }
58
+
59
+ public function offsetExists($offset)
60
+ {
61
+ if (!is_numeric($offset)) {
62
+ return parent::offsetExists($offset);
63
+ }
64
+ return isset($this->modelData[$this->collection_key][$offset]);
65
+ }
66
+
67
+ public function offsetGet($offset)
68
+ {
69
+ if (!is_numeric($offset)) {
70
+ return parent::offsetGet($offset);
71
+ }
72
+ $this->coerceType($offset);
73
+ return $this->modelData[$this->collection_key][$offset];
74
+ }
75
+
76
+ public function offsetSet($offset, $value)
77
+ {
78
+ if (!is_numeric($offset)) {
79
+ return parent::offsetSet($offset, $value);
80
+ }
81
+ $this->modelData[$this->collection_key][$offset] = $value;
82
+ }
83
+
84
+ public function offsetUnset($offset)
85
+ {
86
+ if (!is_numeric($offset)) {
87
+ return parent::offsetUnset($offset);
88
+ }
89
+ unset($this->modelData[$this->collection_key][$offset]);
90
+ }
91
+
92
+ private function coerceType($offset)
93
+ {
94
+ $typeKey = $this->keyType($this->collection_key);
95
+ if (isset($this->$typeKey) && !is_object($this->modelData[$this->collection_key][$offset])) {
96
+ $type = $this->$typeKey;
97
+ $this->modelData[$this->collection_key][$offset] =
98
+ new $type($this->modelData[$this->collection_key][$offset]);
99
+ }
100
+ }
101
+ }
app/api/Google/Config.php ADDED
@@ -0,0 +1,456 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2010 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ /**
19
+ * A class to contain the library configuration for the Google API client.
20
+ */
21
+ class Google_Config
22
+ {
23
+ const GZIP_DISABLED = true;
24
+ const GZIP_ENABLED = false;
25
+ const GZIP_UPLOADS_ENABLED = true;
26
+ const GZIP_UPLOADS_DISABLED = false;
27
+ const USE_AUTO_IO_SELECTION = "auto";
28
+ const TASK_RETRY_NEVER = 0;
29
+ const TASK_RETRY_ONCE = 1;
30
+ const TASK_RETRY_ALWAYS = -1;
31
+ protected $configuration;
32
+
33
+ /**
34
+ * Create a new Google_Config. Can accept an ini file location with the
35
+ * local configuration. For example:
36
+ * application_name="My App"
37
+ *
38
+ * @param [$ini_file_location] - optional - The location of the ini file to load
39
+ */
40
+ public function __construct($ini_file_location = null)
41
+ {
42
+ $this->configuration = array(
43
+ // The application_name is included in the User-Agent HTTP header.
44
+ 'application_name' => '',
45
+
46
+ // Which Authentication, Storage and HTTP IO classes to use.
47
+ 'auth_class' => 'Google_Auth_OAuth2',
48
+ 'io_class' => self::USE_AUTO_IO_SELECTION,
49
+ 'cache_class' => 'Google_Cache_File',
50
+ 'logger_class' => 'Google_Logger_Null',
51
+
52
+ // Don't change these unless you're working against a special development
53
+ // or testing environment.
54
+ 'base_path' => 'https://www.googleapis.com',
55
+
56
+ // Definition of class specific values, like file paths and so on.
57
+ 'classes' => array(
58
+ 'Google_IO_Abstract' => array(
59
+ 'request_timeout_seconds' => 100,
60
+ ),
61
+ 'Google_IO_Curl' => array(
62
+ 'disable_proxy_workaround' => false,
63
+ 'options' => null,
64
+ ),
65
+ 'Google_Logger_Abstract' => array(
66
+ 'level' => 'debug',
67
+ 'log_format' => "[%datetime%] %level%: %message% %context%\n",
68
+ 'date_format' => 'd/M/Y:H:i:s O',
69
+ 'allow_newlines' => true
70
+ ),
71
+ 'Google_Logger_File' => array(
72
+ 'file' => 'php://stdout',
73
+ 'mode' => 0640,
74
+ 'lock' => false,
75
+ ),
76
+ 'Google_Http_Request' => array(
77
+ // Disable the use of gzip on calls if set to true. Defaults to false.
78
+ 'disable_gzip' => self::GZIP_ENABLED,
79
+
80
+ // We default gzip to disabled on uploads even if gzip is otherwise
81
+ // enabled, due to some issues seen with small packet sizes for uploads.
82
+ // Please test with this option before enabling gzip for uploads in
83
+ // a production environment.
84
+ 'enable_gzip_for_uploads' => self::GZIP_UPLOADS_DISABLED,
85
+ ),
86
+ // If you want to pass in OAuth 2.0 settings, they will need to be
87
+ // structured like this.
88
+ 'Google_Auth_OAuth2' => array(
89
+ // Keys for OAuth 2.0 access, see the API console at
90
+ // https://developers.google.com/console
91
+ 'client_id' => '',
92
+ 'client_secret' => '',
93
+ 'redirect_uri' => '',
94
+
95
+ // Simple API access key, also from the API console. Ensure you get
96
+ // a Server key, and not a Browser key.
97
+ 'developer_key' => '',
98
+
99
+ // Other parameters.
100
+ 'hd' => '',
101
+ 'prompt' => '',
102
+ 'openid.realm' => '',
103
+ 'include_granted_scopes' => '',
104
+ 'login_hint' => '',
105
+ 'request_visible_actions' => '',
106
+ 'access_type' => 'online',
107
+ 'approval_prompt' => 'auto',
108
+ 'federated_signon_certs_url' =>
109
+ 'https://www.googleapis.com/oauth2/v1/certs',
110
+ ),
111
+ 'Google_Task_Runner' => array(
112
+ // Delays are specified in seconds
113
+ 'initial_delay' => 1,
114
+ 'max_delay' => 60,
115
+ // Base number for exponential backoff
116
+ 'factor' => 2,
117
+ // A random number between -jitter and jitter will be added to the
118
+ // factor on each iteration to allow for better distribution of
119
+ // retries.
120
+ 'jitter' => .5,
121
+ // Maximum number of retries allowed
122
+ 'retries' => 0
123
+ ),
124
+ 'Google_Service_Exception' => array(
125
+ 'retry_map' => array(
126
+ '500' => self::TASK_RETRY_ALWAYS,
127
+ '503' => self::TASK_RETRY_ALWAYS,
128
+ 'rateLimitExceeded' => self::TASK_RETRY_ALWAYS,
129
+ 'userRateLimitExceeded' => self::TASK_RETRY_ALWAYS
130
+ )
131
+ ),
132
+ 'Google_IO_Exception' => array(
133
+ 'retry_map' => !extension_loaded('curl') ? array() : array(
134
+ CURLE_COULDNT_RESOLVE_HOST => self::TASK_RETRY_ALWAYS,
135
+ CURLE_COULDNT_CONNECT => self::TASK_RETRY_ALWAYS,
136
+ CURLE_OPERATION_TIMEOUTED => self::TASK_RETRY_ALWAYS,
137
+ CURLE_SSL_CONNECT_ERROR => self::TASK_RETRY_ALWAYS,
138
+ CURLE_GOT_NOTHING => self::TASK_RETRY_ALWAYS
139
+ )
140
+ ),
141
+ // Set a default directory for the file cache.
142
+ 'Google_Cache_File' => array(
143
+ 'directory' => sys_get_temp_dir() . '/Google_Client'
144
+ )
145
+ ),
146
+ );
147
+ if ($ini_file_location) {
148
+ $ini = parse_ini_file($ini_file_location, true);
149
+ if (is_array($ini) && count($ini)) {
150
+ $merged_configuration = $ini + $this->configuration;
151
+ if (isset($ini['classes']) && isset($this->configuration['classes'])) {
152
+ $merged_configuration['classes'] = $ini['classes'] + $this->configuration['classes'];
153
+ }
154
+ $this->configuration = $merged_configuration;
155
+ }
156
+ }
157
+ }
158
+
159
+ /**
160
+ * Set configuration specific to a given class.
161
+ * $config->setClassConfig('Google_Cache_File',
162
+ * array('directory' => '/tmp/cache'));
163
+ * @param $class string The class name for the configuration
164
+ * @param $config string key or an array of configuration values
165
+ * @param $value string optional - if $config is a key, the value
166
+ */
167
+ public function setClassConfig($class, $config, $value = null)
168
+ {
169
+ if (!is_array($config)) {
170
+ if (!isset($this->configuration['classes'][$class])) {
171
+ $this->configuration['classes'][$class] = array();
172
+ }
173
+ $this->configuration['classes'][$class][$config] = $value;
174
+ } else {
175
+ $this->configuration['classes'][$class] = $config;
176
+ }
177
+ }
178
+
179
+ public function getClassConfig($class, $key = null)
180
+ {
181
+ if (!isset($this->configuration['classes'][$class])) {
182
+ return null;
183
+ }
184
+ if ($key === null) {
185
+ return $this->configuration['classes'][$class];
186
+ } else {
187
+ return $this->configuration['classes'][$class][$key];
188
+ }
189
+ }
190
+
191
+ /**
192
+ * Return the configured cache class.
193
+ * @return string
194
+ */
195
+ public function getCacheClass()
196
+ {
197
+ return $this->configuration['cache_class'];
198
+ }
199
+
200
+ /**
201
+ * Return the configured logger class.
202
+ * @return string
203
+ */
204
+ public function getLoggerClass()
205
+ {
206
+ return $this->configuration['logger_class'];
207
+ }
208
+
209
+ /**
210
+ * Return the configured Auth class.
211
+ * @return string
212
+ */
213
+ public function getAuthClass()
214
+ {
215
+ return $this->configuration['auth_class'];
216
+ }
217
+
218
+ /**
219
+ * Set the auth class.
220
+ *
221
+ * @param $class string the class name to set
222
+ */
223
+ public function setAuthClass($class)
224
+ {
225
+ $prev = $this->configuration['auth_class'];
226
+ if (!isset($this->configuration['classes'][$class]) &&
227
+ isset($this->configuration['classes'][$prev])) {
228
+ $this->configuration['classes'][$class] =
229
+ $this->configuration['classes'][$prev];
230
+ }
231
+ $this->configuration['auth_class'] = $class;
232
+ }
233
+
234
+ /**
235
+ * Set the IO class.
236
+ *
237
+ * @param $class string the class name to set
238
+ */
239
+ public function setIoClass($class)
240
+ {
241
+ $prev = $this->configuration['io_class'];
242
+ if (!isset($this->configuration['classes'][$class]) &&
243
+ isset($this->configuration['classes'][$prev])) {
244
+ $this->configuration['classes'][$class] =
245
+ $this->configuration['classes'][$prev];
246
+ }
247
+ $this->configuration['io_class'] = $class;
248
+ }
249
+
250
+ /**
251
+ * Set the cache class.
252
+ *
253
+ * @param $class string the class name to set
254
+ */
255
+ public function setCacheClass($class)
256
+ {
257
+ $prev = $this->configuration['cache_class'];
258
+ if (!isset($this->configuration['classes'][$class]) &&
259
+ isset($this->configuration['classes'][$prev])) {
260
+ $this->configuration['classes'][$class] =
261
+ $this->configuration['classes'][$prev];
262
+ }
263
+ $this->configuration['cache_class'] = $class;
264
+ }
265
+
266
+ /**
267
+ * Set the logger class.
268
+ *
269
+ * @param $class string the class name to set
270
+ */
271
+ public function setLoggerClass($class)
272
+ {
273
+ $prev = $this->configuration['logger_class'];
274
+ if (!isset($this->configuration['classes'][$class]) &&
275
+ isset($this->configuration['classes'][$prev])) {
276
+ $this->configuration['classes'][$class] =
277
+ $this->configuration['classes'][$prev];
278
+ }
279
+ $this->configuration['logger_class'] = $class;
280
+ }
281
+
282
+ /**
283
+ * Return the configured IO class.
284
+ *
285
+ * @return string
286
+ */
287
+ public function getIoClass()
288
+ {
289
+ return $this->configuration['io_class'];
290
+ }
291
+
292
+ /**
293
+ * Set the application name, this is included in the User-Agent HTTP header.
294
+ * @param string $name
295
+ */
296
+ public function setApplicationName($name)
297
+ {
298
+ $this->configuration['application_name'] = $name;
299
+ }
300
+
301
+ /**
302
+ * @return string the name of the application
303
+ */
304
+ public function getApplicationName()
305
+ {
306
+ return $this->configuration['application_name'];
307
+ }
308
+
309
+ /**
310
+ * Set the client ID for the auth class.
311
+ * @param $clientId string - the API console client ID
312
+ */
313
+ public function setClientId($clientId)
314
+ {
315
+ $this->setAuthConfig('client_id', $clientId);
316
+ }
317
+
318
+ /**
319
+ * Set the client secret for the auth class.
320
+ * @param $secret string - the API console client secret
321
+ */
322
+ public function setClientSecret($secret)
323
+ {
324
+ $this->setAuthConfig('client_secret', $secret);
325
+ }
326
+
327
+ /**
328
+ * Set the redirect uri for the auth class. Note that if using the
329
+ * Javascript based sign in flow, this should be the string 'postmessage'.
330
+ *
331
+ * @param $uri string - the URI that users should be redirected to
332
+ */
333
+ public function setRedirectUri($uri)
334
+ {
335
+ $this->setAuthConfig('redirect_uri', $uri);
336
+ }
337
+
338
+ /**
339
+ * Set the app activities for the auth class.
340
+ * @param $rva string a space separated list of app activity types
341
+ */
342
+ public function setRequestVisibleActions($rva)
343
+ {
344
+ $this->setAuthConfig('request_visible_actions', $rva);
345
+ }
346
+
347
+ /**
348
+ * Set the the access type requested (offline or online.)
349
+ * @param $access string - the access type
350
+ */
351
+ public function setAccessType($access)
352
+ {
353
+ $this->setAuthConfig('access_type', $access);
354
+ }
355
+
356
+ /**
357
+ * Set when to show the approval prompt (auto or force)
358
+ * @param $approval string - the approval request
359
+ */
360
+ public function setApprovalPrompt($approval)
361
+ {
362
+ $this->setAuthConfig('approval_prompt', $approval);
363
+ }
364
+
365
+ /**
366
+ * Set the login hint (email address or sub identifier)
367
+ * @param $hint string
368
+ */
369
+ public function setLoginHint($hint)
370
+ {
371
+ $this->setAuthConfig('login_hint', $hint);
372
+ }
373
+
374
+ /**
375
+ * Set the developer key for the auth class. Note that this is separate value
376
+ * from the client ID - if it looks like a URL, its a client ID!
377
+ * @param $key string - the API console developer key
378
+ */
379
+ public function setDeveloperKey($key)
380
+ {
381
+ $this->setAuthConfig('developer_key', $key);
382
+ }
383
+
384
+ /**
385
+ * Set the hd (hosted domain) parameter streamlines the login process for
386
+ * Google Apps hosted accounts. By including the domain of the user, you
387
+ * restrict sign-in to accounts at that domain.
388
+ *
389
+ * This should not be used to ensure security on your application - check
390
+ * the hd values within an id token (@see Google_Auth_LoginTicket) after sign
391
+ * in to ensure that the user is from the domain you were expecting.
392
+ *
393
+ * @param $hd string - the domain to use.
394
+ */
395
+ public function setHostedDomain($hd)
396
+ {
397
+ $this->setAuthConfig('hd', $hd);
398
+ }
399
+
400
+ /**
401
+ * Set the prompt hint. Valid values are none, consent and select_account.
402
+ * If no value is specified and the user has not previously authorized
403
+ * access, then the user is shown a consent screen.
404
+ * @param $prompt string
405
+ */
406
+ public function setPrompt($prompt)
407
+ {
408
+ $this->setAuthConfig('prompt', $prompt);
409
+ }
410
+
411
+ /**
412
+ * openid.realm is a parameter from the OpenID 2.0 protocol, not from OAuth
413
+ * 2.0. It is used in OpenID 2.0 requests to signify the URL-space for which
414
+ * an authentication request is valid.
415
+ * @param $realm string - the URL-space to use.
416
+ */
417
+ public function setOpenidRealm($realm)
418
+ {
419
+ $this->setAuthConfig('openid.realm', $realm);
420
+ }
421
+
422
+ /**
423
+ * If this is provided with the value true, and the authorization request is
424
+ * granted, the authorization will include any previous authorizations
425
+ * granted to this user/application combination for other scopes.
426
+ * @param $include boolean - the URL-space to use.
427
+ */
428
+ public function setIncludeGrantedScopes($include)
429
+ {
430
+ $this->setAuthConfig(
431
+ 'include_granted_scopes',
432
+ $include ? "true" : "false"
433
+ );
434
+ }
435
+
436
+ /**
437
+ * @return string the base URL to use for API calls
438
+ */
439
+ public function getBasePath()
440
+ {
441
+ return $this->configuration['base_path'];
442
+ }
443
+
444
+ /**
445
+ * Set the auth configuration for the current auth class.
446
+ * @param $key - the key to set
447
+ * @param $value - the parameter value
448
+ */
449
+ private function setAuthConfig($key, $value)
450
+ {
451
+ if (!isset($this->configuration['classes'][$this->getAuthClass()])) {
452
+ $this->configuration['classes'][$this->getAuthClass()] = array();
453
+ }
454
+ $this->configuration['classes'][$this->getAuthClass()][$key] = $value;
455
+ }
456
+ }
app/api/Google/Exception.php ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2013 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ class Google_Exception extends Exception
19
+ {
20
+ }
app/api/Google/Http/Batch.php ADDED
@@ -0,0 +1,145 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2012 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ if (!class_exists('Google_Client')) {
19
+ require_once dirname(__FILE__) . '/../autoload.php';
20
+ }
21
+
22
+ /**
23
+ * Class to handle batched requests to the Google API service.
24
+ */
25
+ class Google_Http_Batch
26
+ {
27
+ /** @var string Multipart Boundary. */
28
+ private $boundary;
29
+
30
+ /** @var array service requests to be executed. */
31
+ private $requests = array();
32
+
33
+ /** @var Google_Client */
34
+ private $client;
35
+
36
+ private $expected_classes = array();
37
+
38
+ private $root_url;
39
+
40
+ private $batch_path;
41
+
42
+ public function __construct(Google_Client $client, $boundary = false, $rootUrl = '', $batchPath = '')
43
+ {
44
+ $this->client = $client;
45
+ $this->root_url = rtrim($rootUrl ? $rootUrl : $this->client->getBasePath(), '/');
46
+ $this->batch_path = $batchPath ? $batchPath : 'batch';
47
+ $this->expected_classes = array();
48
+ $boundary = (false == $boundary) ? mt_rand() : $boundary;
49
+ $this->boundary = str_replace('"', '', $boundary);
50
+ }
51
+
52
+ public function add(Google_Http_Request $request, $key = false)
53
+ {
54
+ if (false == $key) {
55
+ $key = mt_rand();
56
+ }
57
+
58
+ $this->requests[$key] = $request;
59
+ }
60
+
61
+ public function execute()
62
+ {
63
+ $body = '';
64
+
65
+ /** @var Google_Http_Request $req */
66
+ foreach ($this->requests as $key => $req) {
67
+ $body .= "--{$this->boundary}\n";
68
+ $body .= $req->toBatchString($key) . "\n\n";
69
+ $this->expected_classes["response-" . $key] = $req->getExpectedClass();
70
+ }
71
+
72
+ $body .= "--{$this->boundary}--";
73
+
74
+ $url = $this->root_url . '/' . $this->batch_path;
75
+ $httpRequest = new Google_Http_Request($url, 'POST');
76
+ $httpRequest->setRequestHeaders(
77
+ array('Content-Type' => 'multipart/mixed; boundary=' . $this->boundary)
78
+ );
79
+
80
+ $httpRequest->setPostBody($body);
81
+ $response = $this->client->getIo()->makeRequest($httpRequest);
82
+
83
+ return $this->parseResponse($response);
84
+ }
85
+
86
+ public function parseResponse(Google_Http_Request $response)
87
+ {
88
+ $contentType = $response->getResponseHeader('content-type');
89
+ $contentType = explode(';', $contentType);
90
+ $boundary = false;
91
+ foreach ($contentType as $part) {
92
+ $part = (explode('=', $part, 2));
93
+ if (isset($part[0]) && 'boundary' == trim($part[0])) {
94
+ $boundary = $part[1];
95
+ }
96
+ }
97
+
98
+ $body = $response->getResponseBody();
99
+ if ($body) {
100
+ $body = str_replace("--$boundary--", "--$boundary", $body);
101
+ $parts = explode("--$boundary", $body);
102
+ $responses = array();
103
+
104
+ foreach ($parts as $part) {
105
+ $part = trim($part);
106
+ if (!empty($part)) {
107
+ list($metaHeaders, $part) = explode("\r\n\r\n", $part, 2);
108
+ $metaHeaders = $this->client->getIo()->getHttpResponseHeaders($metaHeaders);
109
+
110
+ $status = substr($part, 0, strpos($part, "\n"));
111
+ $status = explode(" ", $status);
112
+ $status = $status[1];
113
+
114
+ list($partHeaders, $partBody) = $this->client->getIo()->ParseHttpResponse($part, false);
115
+ $response = new Google_Http_Request("");
116
+ $response->setResponseHttpCode($status);
117
+ $response->setResponseHeaders($partHeaders);
118
+ $response->setResponseBody($partBody);
119
+
120
+ // Need content id.
121
+ $key = $metaHeaders['content-id'];
122
+
123
+ if (isset($this->expected_classes[$key]) &&
124
+ strlen($this->expected_classes[$key]) > 0) {
125
+ $class = $this->expected_classes[$key];
126
+ $response->setExpectedClass($class);
127
+ }
128
+
129
+ try {
130
+ $response = Google_Http_REST::decodeHttpResponse($response, $this->client);
131
+ $responses[$key] = $response;
132
+ } catch (Google_Service_Exception $e) {
133
+ // Store the exception as the response, so successful responses
134
+ // can be processed.
135
+ $responses[$key] = $e;
136
+ }
137
+ }
138
+ }
139
+
140
+ return $responses;
141
+ }
142
+
143
+ return null;
144
+ }
145
+ }
app/api/Google/Http/CacheParser.php ADDED
@@ -0,0 +1,185 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2012 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ if (!class_exists('Google_Client')) {
19
+ require_once dirname(__FILE__) . '/../autoload.php';
20
+ }
21
+
22
+ /**
23
+ * Implement the caching directives specified in rfc2616. This
24
+ * implementation is guided by the guidance offered in rfc2616-sec13.
25
+ */
26
+ class Google_Http_CacheParser
27
+ {
28
+ public static $CACHEABLE_HTTP_METHODS = array('GET', 'HEAD');
29
+ public static $CACHEABLE_STATUS_CODES = array('200', '203', '300', '301');
30
+
31
+ /**
32
+ * Check if an HTTP request can be cached by a private local cache.
33
+ *
34
+ * @static
35
+ * @param Google_Http_Request $resp
36
+ * @return bool True if the request is cacheable.
37
+ * False if the request is uncacheable.
38
+ */
39
+ public static function isRequestCacheable(Google_Http_Request $resp)
40
+ {
41
+ $method = $resp->getRequestMethod();
42
+ if (! in_array($method, self::$CACHEABLE_HTTP_METHODS)) {
43
+ return false;
44
+ }
45
+
46
+ // Don't cache authorized requests/responses.
47
+ // [rfc2616-14.8] When a shared cache receives a request containing an
48
+ // Authorization field, it MUST NOT return the corresponding response
49
+ // as a reply to any other request...
50
+ if ($resp->getRequestHeader("authorization")) {
51
+ return false;
52
+ }
53
+
54
+ return true;
55
+ }
56
+
57
+ /**
58
+ * Check if an HTTP response can be cached by a private local cache.
59
+ *
60
+ * @static
61
+ * @param Google_Http_Request $resp
62
+ * @return bool True if the response is cacheable.
63
+ * False if the response is un-cacheable.
64
+ */
65
+ public static function isResponseCacheable(Google_Http_Request $resp)
66
+ {
67
+ // First, check if the HTTP request was cacheable before inspecting the
68
+ // HTTP response.
69
+ if (false == self::isRequestCacheable($resp)) {
70
+ return false;
71
+ }
72
+
73
+ $code = $resp->getResponseHttpCode();
74
+ if (! in_array($code, self::$CACHEABLE_STATUS_CODES)) {
75
+ return false;
76
+ }
77
+
78
+ // The resource is uncacheable if the resource is already expired and
79
+ // the resource doesn't have an ETag for revalidation.
80
+ $etag = $resp->getResponseHeader("etag");
81
+ if (self::isExpired($resp) && $etag == false) {
82
+ return false;
83
+ }
84
+
85
+ // [rfc2616-14.9.2] If [no-store is] sent in a response, a cache MUST NOT
86
+ // store any part of either this response or the request that elicited it.
87
+ $cacheControl = $resp->getParsedCacheControl();
88
+ if (isset($cacheControl['no-store'])) {
89
+ return false;
90
+ }
91
+
92
+ // Pragma: no-cache is an http request directive, but is occasionally
93
+ // used as a response header incorrectly.
94
+ $pragma = $resp->getResponseHeader('pragma');
95
+ if ($pragma == 'no-cache' || strpos($pragma, 'no-cache') !== false) {
96
+ return false;
97
+ }
98
+
99
+ // [rfc2616-14.44] Vary: * is extremely difficult to cache. "It implies that
100
+ // a cache cannot determine from the request headers of a subsequent request
101
+ // whether this response is the appropriate representation."
102
+ // Given this, we deem responses with the Vary header as uncacheable.
103
+ $vary = $resp->getResponseHeader('vary');
104
+ if ($vary) {
105
+ return false;
106
+ }
107
+
108
+ return true;
109
+ }
110
+
111
+ /**
112
+ * @static
113
+ * @param Google_Http_Request $resp
114
+ * @return bool True if the HTTP response is considered to be expired.
115
+ * False if it is considered to be fresh.
116
+ */
117
+ public static function isExpired(Google_Http_Request $resp)
118
+ {
119
+ // HTTP/1.1 clients and caches MUST treat other invalid date formats,
120
+ // especially including the value “0”, as in the past.
121
+ $parsedExpires = false;
122
+ $responseHeaders = $resp->getResponseHeaders();
123
+
124
+ if (isset($responseHeaders['expires'])) {
125
+ $rawExpires = $responseHeaders['expires'];
126
+ // Check for a malformed expires header first.
127
+ if (empty($rawExpires) || (is_numeric($rawExpires) && $rawExpires <= 0)) {
128
+ return true;
129
+ }
130
+
131
+ // See if we can parse the expires header.
132
+ $parsedExpires = strtotime($rawExpires);
133
+ if (false == $parsedExpires || $parsedExpires <= 0) {
134
+ return true;
135
+ }
136
+ }
137
+
138
+ // Calculate the freshness of an http response.
139
+ $freshnessLifetime = false;
140
+ $cacheControl = $resp->getParsedCacheControl();
141
+ if (isset($cacheControl['max-age'])) {
142
+ $freshnessLifetime = $cacheControl['max-age'];
143
+ }
144
+
145
+ $rawDate = $resp->getResponseHeader('date');
146
+ $parsedDate = strtotime($rawDate);
147
+
148
+ if (empty($rawDate) || false == $parsedDate) {
149
+ // We can't default this to now, as that means future cache reads
150
+ // will always pass with the logic below, so we will require a
151
+ // date be injected if not supplied.
152
+ throw new Google_Exception("All cacheable requests must have creation dates.");
153
+ }
154
+
155
+ if (false == $freshnessLifetime && isset($responseHeaders['expires'])) {
156
+ $freshnessLifetime = $parsedExpires - $parsedDate;
157
+ }
158
+
159
+ if (false == $freshnessLifetime) {
160
+ return true;
161
+ }
162
+
163
+ // Calculate the age of an http response.
164
+ $age = max(0, time() - $parsedDate);
165
+ if (isset($responseHeaders['age'])) {
166
+ $age = max($age, strtotime($responseHeaders['age']));
167
+ }
168
+
169
+ return $freshnessLifetime <= $age;
170
+ }
171
+
172
+ /**
173
+ * Determine if a cache entry should be revalidated with by the origin.
174
+ *
175
+ * @param Google_Http_Request $response
176
+ * @return bool True if the entry is expired, else return false.
177
+ */
178
+ public static function mustRevalidate(Google_Http_Request $response)
179
+ {
180
+ // [13.3] When a cache has a stale entry that it would like to use as a
181
+ // response to a client's request, it first has to check with the origin
182
+ // server to see if its cached entry is still usable.
183
+ return self::isExpired($response);
184
+ }
185
+ }
app/api/Google/Http/MediaFileUpload.php ADDED
@@ -0,0 +1,341 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright 2012 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ if (!class_exists('Google_Client')) {
19
+ require_once dirname(__FILE__) . '/../autoload.php';
20
+ }
21
+
22
+ /**
23
+ * Manage large file uploads, which may be media but can be any type
24
+ * of sizable data.
25
+ */
26
+ class Google_Http_MediaFileUpload
27
+ {
28
+ const UPLOAD_MEDIA_TYPE = 'media';
29
+ const UPLOAD_MULTIPART_TYPE = 'multipart';
30
+ const UPLOAD_RESUMABLE_TYPE = 'resumable';
31
+
32
+ /** @var string $mimeType */
33
+ private $mimeType;
34
+
35
+ /** @var string $data */
36
+ private $data;
37
+
38
+ /** @var bool $resumable */
39
+ private $resumable;
40
+
41
+ /** @var int $chunkSize */
42
+ private $chunkSize;
43
+
44
+ /** @var int $size */
45
+ private $size;
46
+
47
+ /** @var string $resumeUri */
48
+ private $resumeUri;
49
+
50
+ /** @var int $progress */
51
+ private $progress;
52
+
53
+ /** @var Google_Client */
54
+ private $client;
55
+
56
+ /** @var Google_Http_Request */
57
+ private $request;
58
+
59
+ /** @var string */
60
+ private $boundary;
61
+
62
+ /**
63
+ * Result code from last HTTP call
64
+ * @var int
65
+ */
66
+ private $httpResultCode;
67
+
68
+ /**
69
+ * @param $mimeType string
70
+ * @param $data string The bytes you want to upload.
71
+ * @param $resumable bool
72
+ * @param bool $chunkSize File will be uploaded in chunks of this many bytes.
73
+ * only used if resumable=True
74
+ */
75
+ public function __construct(
76
+ Google_Client $client,
77
+ Google_Http_Request $request,
78
+ $mimeType,
79
+ $data,
80
+ $resumable = false,
81
+ $chunkSize = false,
82
+ $boundary = false
83
+ ) {
84
+ $this->client = $client;
85
+ $this->request = $request;
86
+ $this->mimeType = $mimeType;
87
+ $this->data = $data;
88
+ $this->size = strlen($this->data);
89
+ $this->resumable = $resumable;
90
+ if (!$chunkSize) {
91
+ $chunkSize = 256 * 1024;
92
+ }
93
+ $this->chunkSize = $chunkSize;
94
+ $this->progress = 0;
95
+ $this->boundary = $boundary;
96
+
97
+ // Process Media Request
98
+ $this->process();
99
+ }
100
+
101
+ /**
102
+ * Set the size of the file that is being uploaded.
103
+ * @param $size - int file size in bytes
104
+ */
105
+ public function setFileSize($size)
106
+ {
107
+ $this->size = $size;
108
+ }
109
+
110
+ /**
111
+ * Return the progress on the upload
112
+ * @return int progress in bytes uploaded.
113
+ */
114
+ public function getProgress()
115
+ {
116
+ return $this->progress;
117
+ }
118
+
119
+ /**
120
+ * Return the HTTP result code from the last call made.
121
+ * @return int code
122
+ */
123
+ public function getHttpResultCode()
124
+ {
125
+ return $this->httpResultCode;
126
+ }
127
+
128
+ /**
129
+ * Sends a PUT-Request to google drive and parses the response,
130
+ * setting the appropiate variables from the response()
131
+ *
132
+ * @param Google_Http_Request $httpRequest the Reuqest which will be send
133
+ *
134
+ * @return false|mixed false when the upload is unfinished or the decoded http response
135
+ *
136
+ */
137
+ private function makePutRequest(Google_Http_Request $httpRequest)
138
+ {
139
+ if ($this->client->getClassConfig("Google_Http_Request", "enable_gzip_for_uploads")) {
140
+ $httpRequest->enableGzip();
141
+ } else {
142
+ $httpRequest->disableGzip();
143
+ }
144
+
145
+ $response = $this->client->getIo()->makeRequest($httpRequest);
146
+ $response->setExpectedClass($this->request->getExpectedClass());
147
+ $code = $response->getResponseHttpCode();
148
+ $this->httpResultCode = $code;
149
+
150
+ if (308 == $code) {
151
+ // Track the amount uploaded.
152
+ $range = explode('-', $response->getResponseHeader('range'));
153
+ $this->progress = $range[1] + 1;
154
+
155
+ // Allow for changing upload URLs.
156
+ $location = $response->getResponseHeader('location');
157
+ if ($location) {
158
+ $this->resumeUri = $location;
159
+ }
160
+
161
+ // No problems, but upload not complete.
162
+ return false;
163
+ } else {
164
+ return Google_Http_REST::decodeHttpResponse($response, $this->client);
165
+ }
166
+ }
167
+
168
+ /**
169
+ * Send the next part of the file to upload.
170
+ * @param [$chunk] the next set of bytes to send. If false will used $data passed
171
+ * at construct time.
172
+ */
173
+ public function nextChunk($chunk = false)
174
+ {
175
+ if (false == $this->resumeUri) {
176
+ $this->resumeUri = $this->fetchResumeUri();
177
+ }
178
+
179
+ if (false == $chunk) {
180
+ $chunk = substr($this->data, $this->progress, $this->chunkSize);
181
+ }
182
+ $lastBytePos = $this->progress + strlen($chunk) - 1;
183
+ $headers = array(
184
+ 'content-range' => "bytes $this->progress-$lastBytePos/$this->size",
185
+ 'content-type' => $this->request->getRequestHeader('content-type'),
186
+ 'content-length' => $this->chunkSize,
187
+ 'expect' => '',
188
+ );
189
+
190
+ $httpRequest = new Google_Http_Request(
191
+ $this->resumeUri,
192
+ 'PUT',
193
+ $headers,
194
+ $chunk
195
+ );
196
+ return $this->makePutRequest($httpRequest);
197
+ }
198
+
199
+ /**
200
+ * Resume a previously unfinished upload
201
+ * @param $resumeUri the resume-URI of the unfinished, resumable upload.
202
+ */
203
+ public function resume($resumeUri)
204
+ {
205
+ $this->resumeUri = $resumeUri;
206
+ $headers = array(
207
+ 'content-range' => "bytes */$this->size",
208
+ 'content-length' => 0,
209
+ );
210
+ $httpRequest = new Google_Http_Request(
211
+ $this->resumeUri,
212
+ 'PUT',
213
+ $headers
214
+ );
215
+ return $this->makePutRequest($httpRequest);
216
+ }
217
+
218
+ /**
219
+ * @return array|bool
220
+ * @visible for testing
221
+ */
222
+ private function process()
223
+ {
224
+ $postBody = false;
225
+ $contentType = false;
226
+
227
+ $meta = $this->request->getPostBody();
228
+ $meta = is_string($meta) ? json_decode($meta, true) : $meta;
229
+
230
+ $uploadType = $this->getUploadType($meta);
231
+ $this->request->setQueryParam('uploadType', $uploadType);
232
+ $this->transformToUploadUrl();
233
+ $mimeType = $this->mimeType ?
234
+ $this->mimeType :
235
+ $this->request->getRequestHeader('content-type');
236
+
237
+ if (self::UPLOAD_RESUMABLE_TYPE == $uploadType) {
238
+ $contentType = $mimeType;
239
+ $postBody = is_string($meta) ? $meta : json_encode($meta);
240
+ } else if (self::UPLOAD_MEDIA_TYPE == $uploadType) {
241
+ $contentType = $mimeType;
242
+ $postBody = $this->data;
243
+ } else if (self::UPLOAD_MULTIPART_TYPE == $uploadType) {
244
+ // This is a multipart/related upload.
245
+ $boundary = $this->boundary ? $this->boundary : mt_rand();
246
+ $boundary = str_replace('"', '', $boundary);
247
+ $contentType = 'multipart/related; boundary=' . $boundary;
248
+ $related = "--$boundary\r\n";
249
+ $related .= "Content-Type: application/json; charset=UTF-8\r\n";
250
+ $related .= "\r\n" . json_encode($meta) . "\r\n";
251
+ $related .= "--$boundary\r\n";
252
+ $related .= "Content-Type: $mimeType\r\n";
253
+ $related .= "Content-Transfer-Encoding: base64\r\n";
254
+ $related .= "\r\n" . base64_encode($this->data) . "\r\n";
255
+ $related .= "--$boundary--";
256
+ $postBody = $related;
257
+ }
258
+
259
+ $this->request->setPostBody($postBody);
260
+
261
+ if (isset($contentType) && $contentType) {
262
+ $contentTypeHeader['content-type'] = $contentType;
263
+ $this->request->setRequestHeaders($contentTypeHeader);
264
+ }
265
+ }
266
+
267
+ private function transformToUploadUrl()
268
+ {
269
+ $base = $this->request->getBaseComponent();
270
+ $this->request->setBaseComponent($base . '/upload');
271
+ }
272
+
273
+ /**
274
+ * Valid upload types:
275
+ * - resumable (UPLOAD_RESUMABLE_TYPE)
276
+ * - media (UPLOAD_MEDIA_TYPE)
277
+ * - multipart (UPLOAD_MULTIPART_TYPE)
278
+ * @param $meta
279
+ * @return string
280
+ * @visible for testing
281
+ */
282
+ public function getUploadType($meta)
283
+ {
284
+ if ($this->resumable) {
285
+ return self::UPLOAD_RESUMABLE_TYPE;
286
+ }
287
+
288
+ if (false == $meta && $this->data) {
289
+ return self::UPLOAD_MEDIA_TYPE;
290
+ }
291
+
292
+ return self::UPLOAD_MULTIPART_TYPE;
293
+ }
294
+
295
+ public function getResumeUri()
296
+ {
297
+ return ( $this->resumeUri !== null ? $this->resumeUri : $this->fetchResumeUri() );
298
+ }
299
+
300
+ private function fetchResumeUri()
301
+ {
302
+ $result = null;
303
+ $body = $this->request->getPostBody();
304
+ if ($body) {
305
+ $headers = array(
306
+ 'content-type' => 'application/json; charset=UTF-8',
307
+ 'content-length' => Google_Utils::getStrLen($body),
308
+ 'x-upload-content-type' => $this->mimeType,
309
+ 'x-upload-content-length' => $this->size,
310
+ 'expect' => '',
311
+ );
312
+ $this->request->setRequestHeaders($headers);
313
+ }
314
+
315
+ $response = $this->client->getIo()->makeRequest($this->request);
316
+ $location = $response->getResponseHeader('location');
317
+ $code = $response->getResponseHttpCode();
318
+
319
+ if (200 == $code && true == $location) {
320
+ return $location;
321
+ }
322
+ $message = $code;
323
+ $body = @json_decode($response->getResponseBody());
324
+ if (!empty($body->error->errors) ) {
325
+ $message .= ': ';
326
+ foreach ($body->error->errors as $error) {
327
+ $message .= "{$error->domain}, {$error->message};";
328
+ }
329
+ $message = rtrim($message, ';');
330
+ }
331
+
332
+ $error = "Failed to start the resumable upload (HTTP {$message})";
333
+ $this->client->getLogger()->error($error);
334
+ throw new Google_Exception($error);
335
+ }
336
+
337
+ public function setChunkSize($chunkSize)
338
+ {
339
+ $this->chunkSize = $chunkSize;
340
+ }
341
+ }
app/api/Google/Http/REST.php ADDED
@@ -0,0 +1,178 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2010 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ if (!class_exists('Google_Client')) {
19
+ require_once dirname(__FILE__) . '/../autoload.php';
20
+ }
21
+
22
+ /**
23
+ * This class implements the RESTful transport of apiServiceRequest()'s
24
+ */
25
+ class Google_Http_REST
26
+ {
27
+ /**
28
+ * Executes a Google_Http_Request and (if applicable) automatically retries
29
+ * when errors occur.
30
+ *
31
+ * @param Google_Client $client
32
+ * @param Google_Http_Request $req
33
+ * @return array decoded result
34
+ * @throws Google_Service_Exception on server side error (ie: not authenticated,
35
+ * invalid or malformed post body, invalid url)
36
+ */
37
+ public static function execute(Google_Client $client, Google_Http_Request $req)
38
+ {
39
+ $runner = new Google_Task_Runner(
40
+ $client,
41
+ sprintf('%s %s', $req->getRequestMethod(), $req->getUrl()),
42
+ array(get_class(), 'doExecute'),
43
+ array($client, $req)
44
+ );
45
+
46
+ return $runner->run();
47
+ }
48
+
49
+ /**
50
+ * Executes a Google_Http_Request
51
+ *
52
+ * @param Google_Client $client
53
+ * @param Google_Http_Request $req
54
+ * @return array decoded result
55
+ * @throws Google_Service_Exception on server side error (ie: not authenticated,
56
+ * invalid or malformed post body, invalid url)
57
+ */
58
+ public static function doExecute(Google_Client $client, Google_Http_Request $req)
59
+ {
60
+ $httpRequest = $client->getIo()->makeRequest($req);
61
+ $httpRequest->setExpectedClass($req->getExpectedClass());
62
+ return self::decodeHttpResponse($httpRequest, $client);
63
+ }
64
+
65
+ /**
66
+ * Decode an HTTP Response.
67
+ * @static
68
+ * @throws Google_Service_Exception
69
+ * @param Google_Http_Request $response The http response to be decoded.
70
+ * @param Google_Client $client
71
+ * @return mixed|null
72
+ */
73
+ public static function decodeHttpResponse($response, Google_Client $client = null)
74
+ {
75
+ $code = $response->getResponseHttpCode();
76
+ $body = $response->getResponseBody();
77
+ $decoded = null;
78
+
79
+ if ((intVal($code)) >= 300) {
80
+ $decoded = json_decode($body, true);
81
+ $err = 'Error calling ' . $response->getRequestMethod() . ' ' . $response->getUrl();
82
+ if (isset($decoded['error']) &&
83
+ isset($decoded['error']['message']) &&
84
+ isset($decoded['error']['code'])) {
85
+ // if we're getting a json encoded error definition, use that instead of the raw response
86
+ // body for improved readability
87
+ $err .= ": ({$decoded['error']['code']}) {$decoded['error']['message']}";
88
+ } else {
89
+ $err .= ": ($code) $body";
90
+ }
91
+
92
+ $errors = null;
93
+ // Specific check for APIs which don't return error details, such as Blogger.
94
+ if (isset($decoded['error']) && isset($decoded['error']['errors'])) {
95
+ $errors = $decoded['error']['errors'];
96
+ }
97
+
98
+ $map = null;
99
+ if ($client) {
100
+ $client->getLogger()->error(
101
+ $err,
102
+ array('code' => $code, 'errors' => $errors)
103
+ );
104
+
105
+ $map = $client->getClassConfig(
106
+ 'Google_Service_Exception',
107
+ 'retry_map'
108
+ );
109
+ }
110
+ throw new Google_Service_Exception($err, $code, null, $errors, $map);
111
+ }
112
+
113
+ // Only attempt to decode the response, if the response code wasn't (204) 'no content'
114
+ if ($code != '204') {
115
+ if ($response->getExpectedRaw()) {
116
+ return $body;
117
+ }
118
+
119
+ $decoded = json_decode($body, true);
120
+ if ($decoded === null || $decoded === "") {
121
+ $error = "Invalid json in service response: $body";
122
+ if ($client) {
123
+ $client->getLogger()->error($error);
124
+ }
125
+ throw new Google_Service_Exception($error);
126
+ }
127
+
128
+ if ($response->getExpectedClass()) {
129
+ $class = $response->getExpectedClass();
130
+ $decoded = new $class($decoded);
131
+ }
132
+ }
133
+ return $decoded;
134
+ }
135
+
136
+ /**
137
+ * Parse/expand request parameters and create a fully qualified
138
+ * request uri.
139
+ * @static
140
+ * @param string $servicePath
141
+ * @param string $restPath
142
+ * @param array $params
143
+ * @return string $requestUrl
144
+ */
145
+ public static function createRequestUri($servicePath, $restPath, $params)
146
+ {
147
+ $requestUrl = $servicePath . $restPath;
148
+ $uriTemplateVars = array();
149
+ $queryVars = array();
150
+ foreach ($params as $paramName => $paramSpec) {
151
+ if ($paramSpec['type'] == 'boolean') {
152
+ $paramSpec['value'] = ($paramSpec['value']) ? 'true' : 'false';
153
+ }
154
+ if ($paramSpec['location'] == 'path') {
155
+ $uriTemplateVars[$paramName] = $paramSpec['value'];
156
+ } else if ($paramSpec['location'] == 'query') {
157
+ if (isset($paramSpec['repeated']) && is_array($paramSpec['value'])) {
158
+ foreach ($paramSpec['value'] as $value) {
159
+ $queryVars[] = $paramName . '=' . rawurlencode(rawurldecode($value));
160
+ }
161
+ } else {
162
+ $queryVars[] = $paramName . '=' . rawurlencode(rawurldecode($paramSpec['value']));
163
+ }
164
+ }
165
+ }
166
+
167
+ if (count($uriTemplateVars)) {
168
+ $uriTemplateParser = new Google_Utils_URITemplate();
169
+ $requestUrl = $uriTemplateParser->parse($requestUrl, $uriTemplateVars);
170
+ }
171
+
172
+ if (count($queryVars)) {
173
+ $requestUrl .= '?' . implode($queryVars, '&');
174
+ }
175
+
176
+ return $requestUrl;
177
+ }
178
+ }
app/api/Google/Http/Request.php ADDED
@@ -0,0 +1,504 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2010 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ if (!class_exists('Google_Client')) {
19
+ require_once dirname(__FILE__) . '/../autoload.php';
20
+ }
21
+
22
+ /**
23
+ * HTTP Request to be executed by IO classes. Upon execution, the
24
+ * responseHttpCode, responseHeaders and responseBody will be filled in.
25
+ *
26
+ * @author Chris Chabot <chabotc@google.com>
27
+ * @author Chirag Shah <chirags@google.com>
28
+ *
29
+ */
30
+ class Google_Http_Request
31
+ {
32
+ const GZIP_UA = " (gzip)";
33
+
34
+ private $batchHeaders = array(
35
+ 'Content-Type' => 'application/http',
36
+ 'Content-Transfer-Encoding' => 'binary',
37
+ 'MIME-Version' => '1.0',
38
+ );
39
+
40
+ protected $queryParams;
41
+ protected $requestMethod;
42
+ protected $requestHeaders;
43
+ protected $baseComponent = null;
44
+ protected $path;
45
+ protected $postBody;
46
+ protected $userAgent;
47
+ protected $canGzip = null;
48
+
49
+ protected $responseHttpCode;
50
+ protected $responseHeaders;
51
+ protected $responseBody;
52
+
53
+ protected $expectedClass;
54
+ protected $expectedRaw = false;
55
+
56
+ public $accessKey;
57
+
58
+ public function __construct(
59
+ $url,
60
+ $method = 'GET',
61
+ $headers = array(),
62
+ $postBody = null
63
+ ) {
64
+ $this->setUrl($url);
65
+ $this->setRequestMethod($method);
66
+ $this->setRequestHeaders($headers);
67
+ $this->setPostBody($postBody);
68
+ }
69
+
70
+ /**
71
+ * Misc function that returns the base url component of the $url
72
+ * used by the OAuth signing class to calculate the base string
73
+ * @return string The base url component of the $url.
74
+ */
75
+ public function getBaseComponent()
76
+ {
77
+ return $this->baseComponent;
78
+ }
79
+
80
+ /**
81
+ * Set the base URL that path and query parameters will be added to.
82
+ * @param $baseComponent string
83
+ */
84
+ public function setBaseComponent($baseComponent)
85
+ {
86
+ $this->baseComponent = rtrim($baseComponent, '/');
87
+ }
88
+
89
+ /**
90
+ * Enable support for gzipped responses with this request.
91
+ */
92
+ public function enableGzip()
93
+ {
94
+ $this->setRequestHeaders(array("Accept-Encoding" => "gzip"));
95
+ $this->canGzip = true;
96
+ $this->setUserAgent($this->userAgent);
97
+ }
98
+
99
+ /**
100
+ * Disable support for gzip responses with this request.
101
+ */
102
+ public function disableGzip()
103
+ {
104
+ if (
105
+ isset($this->requestHeaders['accept-encoding']) &&
106
+ $this->requestHeaders['accept-encoding'] == "gzip"
107
+ ) {
108
+ unset($this->requestHeaders['accept-encoding']);
109
+ }
110
+ $this->canGzip = false;
111
+ $this->userAgent = str_replace(self::GZIP_UA, "", $this->userAgent);
112
+ }
113
+
114
+ /**
115
+ * Can this request accept a gzip response?
116
+ * @return bool
117
+ */
118
+ public function canGzip()
119
+ {
120
+ return $this->canGzip;
121
+ }
122
+
123
+ /**
124
+ * Misc function that returns an array of the query parameters of the current
125
+ * url used by the OAuth signing class to calculate the signature
126
+ * @return array Query parameters in the query string.
127
+ */
128
+ public function getQueryParams()
129
+ {
130
+ return $this->queryParams;
131
+ }
132
+
133
+ /**
134
+ * Set a new query parameter.
135
+ * @param $key - string to set, does not need to be URL encoded
136
+ * @param $value - string to set, does not need to be URL encoded
137
+ */
138
+ public function setQueryParam($key, $value)
139
+ {
140
+ $this->queryParams[$key] = $value;
141
+ }
142
+
143
+ /**
144
+ * @return string HTTP Response Code.
145
+ */
146
+ public function getResponseHttpCode()
147
+ {
148
+ return (int) $this->responseHttpCode;
149
+ }
150
+
151
+ /**
152
+ * @param int $responseHttpCode HTTP Response Code.
153
+ */
154
+ public function setResponseHttpCode($responseHttpCode)
155
+ {
156
+ $this->responseHttpCode = $responseHttpCode;
157
+ }
158
+
159
+ /**
160
+ * @return $responseHeaders (array) HTTP Response Headers.
161
+ */
162
+ public function getResponseHeaders()
163
+ {
164
+ return $this->responseHeaders;
165
+ }
166
+
167
+ /**
168
+ * @return string HTTP Response Body
169
+ */
170
+ public function getResponseBody()
171
+ {
172
+ return $this->responseBody;
173
+ }
174
+
175
+ /**
176
+ * Set the class the response to this request should expect.
177
+ *
178
+ * @param $class string the class name
179
+ */
180
+ public function setExpectedClass($class)
181
+ {
182
+ $this->expectedClass = $class;
183
+ }
184
+
185
+ /**
186
+ * Retrieve the expected class the response should expect.
187
+ * @return string class name
188
+ */
189
+ public function getExpectedClass()
190
+ {
191
+ return $this->expectedClass;
192
+ }
193
+
194
+ /**
195
+ * Enable expected raw response
196
+ */
197
+ public function enableExpectedRaw()
198
+ {
199
+ $this->expectedRaw = true;
200
+ }
201
+
202
+ /**
203
+ * Disable expected raw response
204
+ */
205
+ public function disableExpectedRaw()
206
+ {
207
+ $this->expectedRaw = false;
208
+ }
209
+
210
+ /**
211
+ * Expected raw response or not.
212
+ * @return boolean expected raw response
213
+ */
214
+ public function getExpectedRaw()
215
+ {
216
+ return $this->expectedRaw;
217
+ }
218
+
219
+ /**
220
+ * @param array $headers The HTTP response headers
221
+ * to be normalized.
222
+ */
223
+ public function setResponseHeaders($headers)
224
+ {
225
+ $headers = Google_Utils::normalize($headers);
226
+ if ($this->responseHeaders) {
227
+ $headers = array_merge($this->responseHeaders, $headers);
228
+ }
229
+
230
+ $this->responseHeaders = $headers;
231
+ }
232
+
233
+ /**
234
+ * @param string $key
235
+ * @return array|boolean Returns the requested HTTP header or
236
+ * false if unavailable.
237
+ */
238
+ public function getResponseHeader($key)
239
+ {
240
+ return isset($this->responseHeaders[$key])
241
+ ? $this->responseHeaders[$key]
242
+ : false;
243
+ }
244
+
245
+ /**
246
+ * @param string $responseBody The HTTP response body.
247
+ */
248
+ public function setResponseBody($responseBody)
249
+ {
250
+ $this->responseBody = $responseBody;
251
+ }
252
+
253
+ /**
254
+ * @return string $url The request URL.
255
+ */
256
+ public function getUrl()
257
+ {
258
+ return $this->baseComponent . $this->path .
259
+ (count($this->queryParams) ?
260
+ "?" . $this->buildQuery($this->queryParams) :
261
+ '');
262
+ }
263
+
264
+ /**
265
+ * @return string $method HTTP Request Method.
266
+ */
267
+ public function getRequestMethod()
268
+ {
269
+ return $this->requestMethod;
270
+ }
271
+
272
+ /**
273
+ * @return array $headers HTTP Request Headers.
274
+ */
275
+ public function getRequestHeaders()
276
+ {
277
+ return $this->requestHeaders;
278
+ }
279
+
280
+ /**
281
+ * @param string $key
282
+ * @return array|boolean Returns the requested HTTP header or
283
+ * false if unavailable.
284
+ */
285
+ public function getRequestHeader($key)
286
+ {
287
+ return isset($this->requestHeaders[$key])
288
+ ? $this->requestHeaders[$key]
289
+ : false;
290
+ }
291
+
292
+ /**
293
+ * @return string $postBody HTTP Request Body.
294
+ */
295
+ public function getPostBody()
296
+ {
297
+ return $this->postBody;
298
+ }
299
+
300
+ /**
301
+ * @param string $url the url to set
302
+ */
303
+ public function setUrl($url)
304
+ {
305
+ if (substr($url, 0, 4) != 'http') {
306
+ // Force the path become relative.
307
+ if (substr($url, 0, 1) !== '/') {
308
+ $url = '/' . $url;
309
+ }
310
+ }
311
+ $parts = parse_url($url);
312
+ if (isset($parts['host'])) {
313
+ $this->baseComponent = sprintf(
314
+ "%s%s%s",
315
+ isset($parts['scheme']) ? $parts['scheme'] . "://" : '',
316
+ isset($parts['host']) ? $parts['host'] : '',
317
+ isset($parts['port']) ? ":" . $parts['port'] : ''
318
+ );
319
+ }
320
+ $this->path = isset($parts['path']) ? $parts['path'] : '';
321
+ $this->queryParams = array();
322
+ if (isset($parts['query'])) {
323
+ $this->queryParams = $this->parseQuery($parts['query']);
324
+ }
325
+ }
326
+
327
+ /**
328
+ * @param string $method Set he HTTP Method and normalize
329
+ * it to upper-case, as required by HTTP.
330
+ *
331
+ */
332
+ public function setRequestMethod($method)
333
+ {
334
+ $this->requestMethod = strtoupper($method);
335
+ }
336
+
337
+ /**
338
+ * @param array $headers The HTTP request headers
339
+ * to be set and normalized.
340
+ */
341
+ public function setRequestHeaders($headers)
342
+ {
343
+ $headers = Google_Utils::normalize($headers);
344
+ if ($this->requestHeaders) {
345
+ $headers = array_merge($this->requestHeaders, $headers);
346
+ }
347
+ $this->requestHeaders = $headers;
348
+ }
349
+
350
+ /**
351
+ * @param string $postBody the postBody to set
352
+ */
353
+ public function setPostBody($postBody)
354
+ {
355
+ $this->postBody = $postBody;
356
+ }
357
+
358
+ /**
359
+ * Set the User-Agent Header.
360
+ * @param string $userAgent The User-Agent.
361
+ */
362
+ public function setUserAgent($userAgent)
363
+ {
364
+ $this->userAgent = $userAgent;
365
+ if ($this->canGzip) {
366
+ $this->userAgent = $userAgent . self::GZIP_UA;
367
+ }
368
+ }
369
+
370
+ /**
371
+ * @return string The User-Agent.
372
+ */
373
+ public function getUserAgent()
374
+ {
375
+ return $this->userAgent;
376
+ }
377
+
378
+ /**
379
+ * Returns a cache key depending on if this was an OAuth signed request
380
+ * in which case it will use the non-signed url and access key to make this
381
+ * cache key unique per authenticated user, else use the plain request url
382
+ * @return string The md5 hash of the request cache key.
383
+ */
384
+ public function getCacheKey()
385
+ {
386
+ $key = $this->getUrl();
387
+
388
+ if (isset($this->accessKey)) {
389
+ $key .= $this->accessKey;
390
+ }
391
+
392
+ if (isset($this->requestHeaders['authorization'])) {
393
+ $key .= $this->requestHeaders['authorization'];
394
+ }
395
+
396
+ return md5($key);
397
+ }
398
+
399
+ public function getParsedCacheControl()
400
+ {
401
+ $parsed = array();
402
+ $rawCacheControl = $this->getResponseHeader('cache-control');
403
+ if ($rawCacheControl) {
404
+ $rawCacheControl = str_replace(', ', '&', $rawCacheControl);
405
+ parse_str($rawCacheControl, $parsed);
406
+ }
407
+
408
+ return $parsed;
409
+ }
410
+
411
+ /**
412
+ * @param string $id
413
+ * @return string A string representation of the HTTP Request.
414
+ */
415
+ public function toBatchString($id)
416
+ {
417
+ $str = '';
418
+ $path = parse_url($this->getUrl(), PHP_URL_PATH) . "?" .
419
+ http_build_query($this->queryParams);
420
+ $str .= $this->getRequestMethod() . ' ' . $path . " HTTP/1.1\n";
421
+
422
+ foreach ($this->getRequestHeaders() as $key => $val) {
423
+ $str .= $key . ': ' . $val . "\n";
424
+ }
425
+
426
+ if ($this->getPostBody()) {
427
+ $str .= "\n";
428
+ $str .= $this->getPostBody();
429
+ }
430
+
431
+ $headers = '';
432
+ foreach ($this->batchHeaders as $key => $val) {
433
+ $headers .= $key . ': ' . $val . "\n";
434
+ }
435
+
436
+ $headers .= "Content-ID: $id\n";
437
+ $str = $headers . "\n" . $str;
438
+
439
+ return $str;
440
+ }
441
+
442
+ /**
443
+ * Our own version of parse_str that allows for multiple variables
444
+ * with the same name.
445
+ * @param $string - the query string to parse
446
+ */
447
+ private function parseQuery($string)
448
+ {
449
+ $return = array();
450
+ $parts = explode("&", $string);
451
+ foreach ($parts as $part) {
452
+ list($key, $value) = explode('=', $part, 2);
453
+ $value = urldecode($value);
454
+ if (isset($return[$key])) {
455
+ if (!is_array($return[$key])) {
456
+ $return[$key] = array($return[$key]);
457
+ }
458
+ $return[$key][] = $value;
459
+ } else {
460
+ $return[$key] = $value;
461
+ }
462
+ }
463
+ return $return;
464
+ }
465
+
466
+ /**
467
+ * A version of build query that allows for multiple
468
+ * duplicate keys.
469
+ * @param $parts array of key value pairs
470
+ */
471
+ private function buildQuery($parts)
472
+ {
473
+ $return = array();
474
+ foreach ($parts as $key => $value) {
475
+ if (is_array($value)) {
476
+ foreach ($value as $v) {
477
+ $return[] = urlencode($key) . "=" . urlencode($v);
478
+ }
479
+ } else {
480
+ $return[] = urlencode($key) . "=" . urlencode($value);
481
+ }
482
+ }
483
+ return implode('&', $return);
484
+ }
485
+
486
+ /**
487
+ * If we're POSTing and have no body to send, we can send the query
488
+ * parameters in there, which avoids length issues with longer query
489
+ * params.
490
+ */
491
+ public function maybeMoveParametersToBody()
492
+ {
493
+ if ($this->getRequestMethod() == "POST" && empty($this->postBody)) {
494
+ $this->setRequestHeaders(
495
+ array(
496
+ "content-type" =>
497
+ "application/x-www-form-urlencoded; charset=UTF-8"
498
+ )
499
+ );
500
+ $this->setPostBody($this->buildQuery($this->queryParams));
501
+ $this->queryParams = array();
502
+ }
503
+ }
504
+ }
app/api/Google/IO/Abstract.php ADDED
@@ -0,0 +1,339 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2013 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ /**
19
+ * Abstract IO base class
20
+ */
21
+
22
+ if (!class_exists('Google_Client')) {
23
+ require_once dirname(__FILE__) . '/../autoload.php';
24
+ }
25
+
26
+ abstract class Google_IO_Abstract
27
+ {
28
+ const UNKNOWN_CODE = 0;
29
+ const FORM_URLENCODED = 'application/x-www-form-urlencoded';
30
+ private static $CONNECTION_ESTABLISHED_HEADERS = array(
31
+ "HTTP/1.0 200 Connection established\r\n\r\n",
32
+ "HTTP/1.1 200 Connection established\r\n\r\n",
33
+ );
34
+ private static $ENTITY_HTTP_METHODS = array("POST" => null, "PUT" => null);
35
+ private static $HOP_BY_HOP = array(
36
+ 'connection' => true,
37
+ 'keep-alive' => true,
38
+ 'proxy-authenticate' => true,
39
+ 'proxy-authorization' => true,
40
+ 'te' => true,
41
+ 'trailers' => true,
42
+ 'transfer-encoding' => true,
43
+ 'upgrade' => true
44
+ );
45
+
46
+
47
+ /** @var Google_Client */
48
+ protected $client;
49
+
50
+ public function __construct(Google_Client $client)
51
+ {
52
+ $this->client = $client;
53
+ $timeout = $client->getClassConfig('Google_IO_Abstract', 'request_timeout_seconds');
54
+ if ($timeout > 0) {
55
+ $this->setTimeout($timeout);
56
+ }
57
+ }
58
+
59
+ /**
60
+ * Executes a Google_Http_Request
61
+ * @param Google_Http_Request $request the http request to be executed
62
+ * @return array containing response headers, body, and http code
63
+ * @throws Google_IO_Exception on curl or IO error
64
+ */
65
+ abstract public function executeRequest(Google_Http_Request $request);
66
+
67
+ /**
68
+ * Set options that update the transport implementation's behavior.
69
+ * @param $options
70
+ */
71
+ abstract public function setOptions($options);
72
+
73
+ /**
74
+ * Set the maximum request time in seconds.
75
+ * @param $timeout in seconds
76
+ */
77
+ abstract public function setTimeout($timeout);
78
+
79
+ /**
80
+ * Get the maximum request time in seconds.
81
+ * @return timeout in seconds
82
+ */
83
+ abstract public function getTimeout();
84
+
85
+ /**
86
+ * Test for the presence of a cURL header processing bug
87
+ *
88
+ * The cURL bug was present in versions prior to 7.30.0 and caused the header
89
+ * length to be miscalculated when a "Connection established" header added by
90
+ * some proxies was present.
91
+ *
92
+ * @return boolean
93
+ */
94
+ abstract protected function needsQuirk();
95
+
96
+ /**
97
+ * @visible for testing.
98
+ * Cache the response to an HTTP request if it is cacheable.
99
+ * @param Google_Http_Request $request
100
+ * @return bool Returns true if the insertion was successful.
101
+ * Otherwise, return false.
102
+ */
103
+ public function setCachedRequest(Google_Http_Request $request)
104
+ {
105
+ // Determine if the request is cacheable.
106
+ if (Google_Http_CacheParser::isResponseCacheable($request)) {
107
+ $this->client->getCache()->set($request->getCacheKey(), $request);
108
+ return true;
109
+ }
110
+
111
+ return false;
112
+ }
113
+
114
+ /**
115
+ * Execute an HTTP Request
116
+ *
117
+ * @param Google_Http_Request $request the http request to be executed
118
+ * @return Google_Http_Request http request with the response http code,
119
+ * response headers and response body filled in
120
+ * @throws Google_IO_Exception on curl or IO error
121
+ */
122
+ public function makeRequest(Google_Http_Request $request)
123
+ {
124
+ // First, check to see if we have a valid cached version.
125
+ $cached = $this->getCachedRequest($request);
126
+ if ($cached !== false && $cached instanceof Google_Http_Request) {
127
+ if (!$this->checkMustRevalidateCachedRequest($cached, $request)) {
128
+ return $cached;
129
+ }
130
+ }
131
+
132
+ if (array_key_exists($request->getRequestMethod(), self::$ENTITY_HTTP_METHODS)) {
133
+ $request = $this->processEntityRequest($request);
134
+ }
135
+
136
+ list($responseData, $responseHeaders, $respHttpCode) = $this->executeRequest($request);
137
+
138
+ if ($respHttpCode == 304 && $cached) {
139
+ // If the server responded NOT_MODIFIED, return the cached request.
140
+ $this->updateCachedRequest($cached, $responseHeaders);
141
+ return $cached;
142
+ }
143
+
144
+ if (!isset($responseHeaders['Date']) && !isset($responseHeaders['date'])) {
145
+ $responseHeaders['date'] = date("r");
146
+ }
147
+
148
+ $request->setResponseHttpCode($respHttpCode);
149
+ $request->setResponseHeaders($responseHeaders);
150
+ $request->setResponseBody($responseData);
151
+ // Store the request in cache (the function checks to see if the request
152
+ // can actually be cached)
153
+ $this->setCachedRequest($request);
154
+ return $request;
155
+ }
156
+
157
+ /**
158
+ * @visible for testing.
159
+ * @param Google_Http_Request $request
160
+ * @return Google_Http_Request|bool Returns the cached object or
161
+ * false if the operation was unsuccessful.
162
+ */
163
+ public function getCachedRequest(Google_Http_Request $request)
164
+ {
165
+ if (false === Google_Http_CacheParser::isRequestCacheable($request)) {
166
+ return false;
167
+ }
168
+
169
+ return $this->client->getCache()->get($request->getCacheKey());
170
+ }
171
+
172
+ /**
173
+ * @visible for testing
174
+ * Process an http request that contains an enclosed entity.
175
+ * @param Google_Http_Request $request
176
+ * @return Google_Http_Request Processed request with the enclosed entity.
177
+ */
178
+ public function processEntityRequest(Google_Http_Request $request)
179
+ {
180
+ $postBody = $request->getPostBody();
181
+ $contentType = $request->getRequestHeader("content-type");
182
+
183
+ // Set the default content-type as application/x-www-form-urlencoded.
184
+ if (false == $contentType) {
185
+ $contentType = self::FORM_URLENCODED;
186
+ $request->setRequestHeaders(array('content-type' => $contentType));
187
+ }
188
+
189
+ // Force the payload to match the content-type asserted in the header.
190
+ if ($contentType == self::FORM_URLENCODED && is_array($postBody)) {
191
+ $postBody = http_build_query($postBody, '', '&');
192
+ $request->setPostBody($postBody);
193
+ }
194
+
195
+ // Make sure the content-length header is set.
196
+ if (!$postBody || is_string($postBody)) {
197
+ $postsLength = strlen($postBody);
198
+ $request->setRequestHeaders(array('content-length' => $postsLength));
199
+ }
200
+
201
+ return $request;
202
+ }
203
+
204
+ /**
205
+ * Check if an already cached request must be revalidated, and if so update
206
+ * the request with the correct ETag headers.
207
+ * @param Google_Http_Request $cached A previously cached response.
208
+ * @param Google_Http_Request $request The outbound request.
209
+ * return bool If the cached object needs to be revalidated, false if it is
210
+ * still current and can be re-used.
211
+ */
212
+ protected function checkMustRevalidateCachedRequest($cached, $request)
213
+ {
214
+ if (Google_Http_CacheParser::mustRevalidate($cached)) {
215
+ $addHeaders = array();
216
+ if ($cached->getResponseHeader('etag')) {
217
+ // [13.3.4] If an entity tag has been provided by the origin server,
218
+ // we must use that entity tag in any cache-conditional request.
219
+ $addHeaders['If-None-Match'] = $cached->getResponseHeader('etag');
220
+ } elseif ($cached->getResponseHeader('date')) {
221
+ $addHeaders['If-Modified-Since'] = $cached->getResponseHeader('date');
222
+ }
223
+
224
+ $request->setRequestHeaders($addHeaders);
225
+ return true;
226
+ } else {
227
+ return false;
228
+ }
229
+ }
230
+
231
+ /**
232
+ * Update a cached request, using the headers from the last response.
233
+ * @param Google_Http_Request $cached A previously cached response.
234
+ * @param mixed Associative array of response headers from the last request.
235
+ */
236
+ protected function updateCachedRequest($cached, $responseHeaders)
237
+ {
238
+ $hopByHop = self::$HOP_BY_HOP;
239
+ if (!empty($responseHeaders['connection'])) {
240
+ $connectionHeaders = array_map(
241
+ 'strtolower',
242
+ array_filter(
243
+ array_map('trim', explode(',', $responseHeaders['connection']))
244
+ )
245
+ );
246
+ $hopByHop += array_fill_keys($connectionHeaders, true);
247
+ }
248
+
249
+ $endToEnd = array_diff_key($responseHeaders, $hopByHop);
250
+ $cached->setResponseHeaders($endToEnd);
251
+ }
252
+
253
+ /**
254
+ * Used by the IO lib and also the batch processing.
255
+ *
256
+ * @param $respData
257
+ * @param $headerSize
258
+ * @return array
259
+ */
260
+ public function parseHttpResponse($respData, $headerSize)
261
+ {
262
+ // check proxy header
263
+ foreach (self::$CONNECTION_ESTABLISHED_HEADERS as $established_header) {
264
+ if (stripos($respData, $established_header) !== false) {
265
+ // existed, remove it
266
+ $respData = str_ireplace($established_header, '', $respData);
267
+ // Subtract the proxy header size unless the cURL bug prior to 7.30.0
268
+ // is present which prevented the proxy header size from being taken into
269
+ // account.
270
+ if (!$this->needsQuirk()) {
271
+ $headerSize -= strlen($established_header);
272
+ }
273
+ break;
274
+ }
275
+ }
276
+
277
+ if ($headerSize) {
278
+ $responseBody = substr($respData, $headerSize);
279
+ $responseHeaders = substr($respData, 0, $headerSize);
280
+ } else {
281
+ $responseSegments = explode("\r\n\r\n", $respData, 2);
282
+ $responseHeaders = $responseSegments[0];
283
+ $responseBody = isset($responseSegments[1]) ? $responseSegments[1] :
284
+ null;
285
+ }
286
+
287
+ $responseHeaders = $this->getHttpResponseHeaders($responseHeaders);
288
+ return array($responseHeaders, $responseBody);
289
+ }
290
+
291
+ /**
292
+ * Parse out headers from raw headers
293
+ * @param rawHeaders array or string
294
+ * @return array
295
+ */
296
+ public function getHttpResponseHeaders($rawHeaders)
297
+ {
298
+ if (is_array($rawHeaders)) {
299
+ return $this->parseArrayHeaders($rawHeaders);
300
+ } else {
301
+ return $this->parseStringHeaders($rawHeaders);
302
+ }
303
+ }
304
+
305
+ private function parseStringHeaders($rawHeaders)
306
+ {
307
+ $headers = array();
308
+ $responseHeaderLines = explode("\r\n", $rawHeaders);
309
+ foreach ($responseHeaderLines as $headerLine) {
310
+ if ($headerLine && strpos($headerLine, ':') !== false) {
311
+ list($header, $value) = explode(': ', $headerLine, 2);
312
+ $header = strtolower($header);
313
+ if (isset($headers[$header])) {
314
+ $headers[$header] .= "\n" . $value;
315
+ } else {
316
+ $headers[$header] = $value;
317
+ }
318
+ }
319
+ }
320
+ return $headers;
321
+ }
322
+
323
+ private function parseArrayHeaders($rawHeaders)
324
+ {
325
+ $header_count = count($rawHeaders);
326
+ $headers = array();
327
+
328
+ for ($i = 0; $i < $header_count; $i++) {
329
+ $header = $rawHeaders[$i];
330
+ // Times will have colons in - so we just want the first match.
331
+ $header_parts = explode(': ', $header, 2);
332
+ if (count($header_parts) == 2) {
333
+ $headers[strtolower($header_parts[0])] = $header_parts[1];
334
+ }
335
+ }
336
+
337
+ return $headers;
338
+ }
339
+ }
app/api/Google/IO/Curl.php ADDED
@@ -0,0 +1,194 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2014 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ /**
19
+ * Curl based implementation of Google_IO.
20
+ *
21
+ * @author Stuart Langley <slangley@google.com>
22
+ */
23
+
24
+ if (!class_exists('Google_Client')) {
25
+ require_once dirname(__FILE__) . '/../autoload.php';
26
+ }
27
+
28
+ class Google_IO_Curl extends Google_IO_Abstract
29
+ {
30
+ // cURL hex representation of version 7.30.0
31
+ const NO_QUIRK_VERSION = 0x071E00;
32
+
33
+ private $options = array();
34
+
35
+ /** @var bool $disableProxyWorkaround */
36
+ private $disableProxyWorkaround;
37
+
38
+ public function __construct(Google_Client $client)
39
+ {
40
+ if (!extension_loaded('curl')) {
41
+ $error = 'The cURL IO handler requires the cURL extension to be enabled';
42
+ $client->getLogger()->critical($error);
43
+ throw new Google_IO_Exception($error);
44
+ }
45
+
46
+ parent::__construct($client);
47
+
48
+ $this->disableProxyWorkaround = $this->client->getClassConfig(
49
+ 'Google_IO_Curl',
50
+ 'disable_proxy_workaround'
51
+ );
52
+ }
53
+
54
+ /**
55
+ * Execute an HTTP Request
56
+ *
57
+ * @param Google_Http_Request $request the http request to be executed
58
+ * @return array containing response headers, body, and http code
59
+ * @throws Google_IO_Exception on curl or IO error
60
+ */
61
+ public function executeRequest(Google_Http_Request $request)
62
+ {
63
+ $curl = curl_init();
64
+
65
+ if ($request->getPostBody()) {
66
+ curl_setopt($curl, CURLOPT_POSTFIELDS, $request->getPostBody());
67
+ }
68
+
69
+ $requestHeaders = $request->getRequestHeaders();
70
+ if ($requestHeaders && is_array($requestHeaders)) {
71
+ $curlHeaders = array();
72
+ foreach ($requestHeaders as $k => $v) {
73
+ $curlHeaders[] = "$k: $v";
74
+ }
75
+ curl_setopt($curl, CURLOPT_HTTPHEADER, $curlHeaders);
76
+ }
77
+ curl_setopt($curl, CURLOPT_URL, $request->getUrl());
78
+
79
+ curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $request->getRequestMethod());
80
+ curl_setopt($curl, CURLOPT_USERAGENT, $request->getUserAgent());
81
+
82
+ curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false);
83
+ curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
84
+
85
+ // The SSL version will be determined by the underlying library
86
+ // @see https://github.com/google/google-api-php-client/pull/644
87
+ //curl_setopt($curl, CURLOPT_SSLVERSION, 1);
88
+
89
+ curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
90
+ curl_setopt($curl, CURLOPT_HEADER, true);
91
+
92
+ if ($request->canGzip()) {
93
+ curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate');
94
+ }
95
+
96
+ $options = $this->client->getClassConfig('Google_IO_Curl', 'options');
97
+ if (is_array($options)) {
98
+ $this->setOptions($options);
99
+ }
100
+
101
+ foreach ($this->options as $key => $var) {
102
+ curl_setopt($curl, $key, $var);
103
+ }
104
+
105
+ if (!isset($this->options[CURLOPT_CAINFO])) {
106
+ curl_setopt($curl, CURLOPT_CAINFO, dirname(__FILE__) . '/cacerts.pem');
107
+ }
108
+
109
+ $this->client->getLogger()->debug(
110
+ 'cURL request',
111
+ array(
112
+ 'url' => $request->getUrl(),
113
+ 'method' => $request->getRequestMethod(),
114
+ 'headers' => $requestHeaders,
115
+ 'body' => $request->getPostBody()
116
+ )
117
+ );
118
+
119
+ $response = curl_exec($curl);
120
+ if ($response === false) {
121
+ $error = curl_error($curl);
122
+ $code = curl_errno($curl);
123
+ $map = $this->client->getClassConfig('Google_IO_Exception', 'retry_map');
124
+
125
+ $this->client->getLogger()->error('cURL ' . $error);
126
+ throw new Google_IO_Exception($error, $code, null, $map);
127
+ }
128
+ $headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
129
+
130
+ list($responseHeaders, $responseBody) = $this->parseHttpResponse($response, $headerSize);
131
+ $responseCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
132
+
133
+ $this->client->getLogger()->debug(
134
+ 'cURL response',
135
+ array(
136
+ 'code' => $responseCode,
137
+ 'headers' => $responseHeaders,
138
+ 'body' => $responseBody,
139
+ )
140
+ );
141
+
142
+ return array($responseBody, $responseHeaders, $responseCode);
143
+ }
144
+
145
+ /**
146
+ * Set options that update the transport implementation's behavior.
147
+ * @param $options
148
+ */
149
+ public function setOptions($options)
150
+ {
151
+ $this->options = $options + $this->options;
152
+ }
153
+
154
+ /**
155
+ * Set the maximum request time in seconds.
156
+ * @param $timeout in seconds
157
+ */
158
+ public function setTimeout($timeout)
159
+ {
160
+ // Since this timeout is really for putting a bound on the time
161
+ // we'll set them both to the same. If you need to specify a longer
162
+ // CURLOPT_TIMEOUT, or a higher CONNECTTIMEOUT, the best thing to
163
+ // do is use the setOptions method for the values individually.
164
+ $this->options[CURLOPT_CONNECTTIMEOUT] = $timeout;
165
+ $this->options[CURLOPT_TIMEOUT] = $timeout;
166
+ }
167
+
168
+ /**
169
+ * Get the maximum request time in seconds.
170
+ * @return timeout in seconds
171
+ */
172
+ public function getTimeout()
173
+ {
174
+ return $this->options[CURLOPT_TIMEOUT];
175
+ }
176
+
177
+ /**
178
+ * Test for the presence of a cURL header processing bug
179
+ *
180
+ * {@inheritDoc}
181
+ *
182
+ * @return boolean
183
+ */
184
+ protected function needsQuirk()
185
+ {
186
+ if ($this->disableProxyWorkaround) {
187
+ return false;
188
+ }
189
+
190
+ $ver = curl_version();
191
+ $versionNum = $ver['version_number'];
192
+ return $versionNum < Google_IO_Curl::NO_QUIRK_VERSION;
193
+ }
194
+ }
app/api/Google/IO/Exception.php ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2013 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ if (!class_exists('Google_Client')) {
19
+ require_once dirname(__FILE__) . '/../autoload.php';
20
+ }
21
+
22
+ class Google_IO_Exception extends Google_Exception implements Google_Task_Retryable
23
+ {
24
+ /**
25
+ * @var array $retryMap Map of errors with retry counts.
26
+ */
27
+ private $retryMap = array();
28
+
29
+ /**
30
+ * Creates a new IO exception with an optional retry map.
31
+ *
32
+ * @param string $message
33
+ * @param int $code
34
+ * @param Exception|null $previous
35
+ * @param array|null $retryMap Map of errors with retry counts.
36
+ */
37
+ public function __construct(
38
+ $message,
39
+ $code = 0,
40
+ Exception $previous = null,
41
+ array $retryMap = null
42
+ ) {
43
+ if (version_compare(PHP_VERSION, '5.3.0') >= 0) {
44
+ parent::__construct($message, $code, $previous);
45
+ } else {
46
+ parent::__construct($message, $code);
47
+ }
48
+
49
+ if (is_array($retryMap)) {
50
+ $this->retryMap = $retryMap;
51
+ }
52
+ }
53
+
54
+ /**
55
+ * Gets the number of times the associated task can be retried.
56
+ *
57
+ * NOTE: -1 is returned if the task can be retried indefinitely
58
+ *
59
+ * @return integer
60
+ */
61
+ public function allowedRetries()
62
+ {
63
+ if (isset($this->retryMap[$this->code])) {
64
+ return $this->retryMap[$this->code];
65
+ }
66
+
67
+ return 0;
68
+ }
69
+ }
app/api/Google/IO/Stream.php ADDED
@@ -0,0 +1,243 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2013 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ /**
19
+ * Http Streams based implementation of Google_IO.
20
+ *
21
+ * @author Stuart Langley <slangley@google.com>
22
+ */
23
+
24
+ if (!class_exists('Google_Client')) {
25
+ require_once dirname(__FILE__) . '/../autoload.php';
26
+ }
27
+
28
+ class Google_IO_Stream extends Google_IO_Abstract
29
+ {
30
+ const TIMEOUT = "timeout";
31
+ const ZLIB = "compress.zlib://";
32
+ private $options = array();
33
+ private $trappedErrorNumber;
34
+ private $trappedErrorString;
35
+
36
+ private static $DEFAULT_HTTP_CONTEXT = array(
37
+ "follow_location" => 0,
38
+ "ignore_errors" => 1,
39
+ );
40
+
41
+ private static $DEFAULT_SSL_CONTEXT = array(
42
+ "verify_peer" => true,
43
+ );
44
+
45
+ public function __construct(Google_Client $client)
46
+ {
47
+ if (!ini_get('allow_url_fopen')) {
48
+ $error = 'The stream IO handler requires the allow_url_fopen runtime ' .
49
+ 'configuration to be enabled';
50
+ $client->getLogger()->critical($error);
51
+ throw new Google_IO_Exception($error);
52
+ }
53
+
54
+ parent::__construct($client);
55
+ }
56
+
57
+ /**
58
+ * Execute an HTTP Request
59
+ *
60
+ * @param Google_Http_Request $request the http request to be executed
61
+ * @return array containing response headers, body, and http code
62
+ * @throws Google_IO_Exception on curl or IO error
63
+ */
64
+ public function executeRequest(Google_Http_Request $request)
65
+ {
66
+ $default_options = stream_context_get_options(stream_context_get_default());
67
+
68
+ $requestHttpContext = array_key_exists('http', $default_options) ?
69
+ $default_options['http'] : array();
70
+
71
+ if ($request->getPostBody()) {
72
+ $requestHttpContext["content"] = $request->getPostBody();
73
+ }
74
+
75
+ $requestHeaders = $request->getRequestHeaders();
76
+ if ($requestHeaders && is_array($requestHeaders)) {
77
+ $headers = "";
78
+ foreach ($requestHeaders as $k => $v) {
79
+ $headers .= "$k: $v\r\n";
80
+ }
81
+ $requestHttpContext["header"] = $headers;
82
+ }
83
+
84
+ $requestHttpContext["method"] = $request->getRequestMethod();
85
+ $requestHttpContext["user_agent"] = $request->getUserAgent();
86
+
87
+ $requestSslContext = array_key_exists('ssl', $default_options) ?
88
+ $default_options['ssl'] : array();
89
+
90
+ if (!$this->client->isAppEngine() && !array_key_exists("cafile", $requestSslContext)) {
91
+ $requestSslContext["cafile"] = dirname(__FILE__) . '/cacerts.pem';
92
+ }
93
+
94
+ $options = array(
95
+ "http" => array_merge(
96
+ self::$DEFAULT_HTTP_CONTEXT,
97
+ $requestHttpContext
98
+ ),
99
+ "ssl" => array_merge(
100
+ self::$DEFAULT_SSL_CONTEXT,
101
+ $requestSslContext
102
+ )
103
+ );
104
+
105
+ $context = stream_context_create($options);
106
+
107
+ $url = $request->getUrl();
108
+
109
+ if ($request->canGzip()) {
110
+ $url = self::ZLIB . $url;
111
+ }
112
+
113
+ $this->client->getLogger()->debug(
114
+ 'Stream request',
115
+ array(
116
+ 'url' => $url,
117
+ 'method' => $request->getRequestMethod(),
118
+ 'headers' => $requestHeaders,
119
+ 'body' => $request->getPostBody()
120
+ )
121
+ );
122
+
123
+ // We are trapping any thrown errors in this method only and
124
+ // throwing an exception.
125
+ $this->trappedErrorNumber = null;
126
+ $this->trappedErrorString = null;
127
+
128
+ // START - error trap.
129
+ set_error_handler(array($this, 'trapError'));
130
+ $fh = fopen($url, 'r', false, $context);
131
+ restore_error_handler();
132
+ // END - error trap.
133
+
134
+ if ($this->trappedErrorNumber) {
135
+ $error = sprintf(
136
+ "HTTP Error: Unable to connect: '%s'",
137
+ $this->trappedErrorString
138
+ );
139
+
140
+ $this->client->getLogger()->error('Stream ' . $error);
141
+ throw new Google_IO_Exception($error, $this->trappedErrorNumber);
142
+ }
143
+
144
+ $response_data = false;
145
+ $respHttpCode = self::UNKNOWN_CODE;
146
+ if ($fh) {
147
+ if (isset($this->options[self::TIMEOUT])) {
148
+ stream_set_timeout($fh, $this->options[self::TIMEOUT]);
149
+ }
150
+
151
+ $response_data = stream_get_contents($fh);
152
+ fclose($fh);
153
+
154
+ $respHttpCode = $this->getHttpResponseCode($http_response_header);
155
+ }
156
+
157
+ if (false === $response_data) {
158
+ $error = sprintf(
159
+ "HTTP Error: Unable to connect: '%s'",
160
+ $respHttpCode
161
+ );
162
+
163
+ $this->client->getLogger()->error('Stream ' . $error);
164
+ throw new Google_IO_Exception($error, $respHttpCode);
165
+ }
166
+
167
+ $responseHeaders = $this->getHttpResponseHeaders($http_response_header);
168
+
169
+ $this->client->getLogger()->debug(
170
+ 'Stream response',
171
+ array(
172
+ 'code' => $respHttpCode,
173
+ 'headers' => $responseHeaders,
174
+ 'body' => $response_data,
175
+ )
176
+ );
177
+
178
+ return array($response_data, $responseHeaders, $respHttpCode);
179
+ }
180
+
181
+ /**
182
+ * Set options that update the transport implementation's behavior.
183
+ * @param $options
184
+ */
185
+ public function setOptions($options)
186
+ {
187
+ $this->options = $options + $this->options;
188
+ }
189
+
190
+ /**
191
+ * Method to handle errors, used for error handling around
192
+ * stream connection methods.
193
+ */
194
+ public function trapError($errno, $errstr)
195
+ {
196
+ $this->trappedErrorNumber = $errno;
197
+ $this->trappedErrorString = $errstr;
198
+ }
199
+
200
+ /**
201
+ * Set the maximum request time in seconds.
202
+ * @param $timeout in seconds
203
+ */
204
+ public function setTimeout($timeout)
205
+ {
206
+ $this->options[self::TIMEOUT] = $timeout;
207
+ }
208
+
209
+ /**
210
+ * Get the maximum request time in seconds.
211
+ * @return timeout in seconds
212
+ */
213
+ public function getTimeout()
214
+ {
215
+ return $this->options[self::TIMEOUT];
216
+ }
217
+
218
+ /**
219
+ * Test for the presence of a cURL header processing bug
220
+ *
221
+ * {@inheritDoc}
222
+ *
223
+ * @return boolean
224
+ */
225
+ protected function needsQuirk()
226
+ {
227
+ return false;
228
+ }
229
+
230
+ protected function getHttpResponseCode($response_headers)
231
+ {
232
+ $header_count = count($response_headers);
233
+
234
+ for ($i = 0; $i < $header_count; $i++) {
235
+ $header = $response_headers[$i];
236
+ if (strncasecmp("HTTP", $header, strlen("HTTP")) == 0) {
237
+ $response = explode(' ', $header);
238
+ return $response[1];
239
+ }
240
+ }
241
+ return self::UNKNOWN_CODE;
242
+ }
243
+ }
app/api/Google/IO/cacerts.pem ADDED
@@ -0,0 +1,2183 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Issuer: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc.
2
+ # Subject: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc.
3
+ # Label: "GTE CyberTrust Global Root"
4
+ # Serial: 421
5
+ # MD5 Fingerprint: ca:3d:d3:68:f1:03:5c:d0:32:fa:b8:2b:59:e8:5a:db
6
+ # SHA1 Fingerprint: 97:81:79:50:d8:1c:96:70:cc:34:d8:09:cf:79:44:31:36:7e:f4:74
7
+ # SHA256 Fingerprint: a5:31:25:18:8d:21:10:aa:96:4b:02:c7:b7:c6:da:32:03:17:08:94:e5:fb:71:ff:fb:66:67:d5:e6:81:0a:36
8
+ -----BEGIN CERTIFICATE-----
9
+ MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD
10
+ VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv
11
+ bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv
12
+ b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV
13
+ UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU
14
+ cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds
15
+ b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH
16
+ iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS
17
+ r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4
18
+ 04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r
19
+ GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9
20
+ 3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P
21
+ lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/
22
+ -----END CERTIFICATE-----
23
+
24
+ # Issuer: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division
25
+ # Subject: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division
26
+ # Label: "Thawte Server CA"
27
+ # Serial: 1
28
+ # MD5 Fingerprint: c5:70:c4:a2:ed:53:78:0c:c8:10:53:81:64:cb:d0:1d
29
+ # SHA1 Fingerprint: 23:e5:94:94:51:95:f2:41:48:03:b4:d5:64:d2:a3:a3:f5:d8:8b:8c
30
+ # SHA256 Fingerprint: b4:41:0b:73:e2:e6:ea:ca:47:fb:c4:2f:8f:a4:01:8a:f4:38:1d:c5:4c:fa:a8:44:50:46:1e:ed:09:45:4d:e9
31
+ -----BEGIN CERTIFICATE-----
32
+ MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx
33
+ FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
34
+ VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
35
+ biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm
36
+ MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx
37
+ MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT
38
+ DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3
39
+ dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl
40
+ cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3
41
+ DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD
42
+ gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91
43
+ yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX
44
+ L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj
45
+ EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG
46
+ 7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e
47
+ QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ
48
+ qdq5snUb9kLy78fyGPmJvKP/iiMucEc=
49
+ -----END CERTIFICATE-----
50
+
51
+ # Issuer: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division
52
+ # Subject: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division
53
+ # Label: "Thawte Premium Server CA"
54
+ # Serial: 1
55
+ # MD5 Fingerprint: 06:9f:69:79:16:66:90:02:1b:8c:8c:a2:c3:07:6f:3a
56
+ # SHA1 Fingerprint: 62:7f:8d:78:27:65:63:99:d2:7d:7f:90:44:c9:fe:b3:f3:3e:fa:9a
57
+ # SHA256 Fingerprint: ab:70:36:36:5c:71:54:aa:29:c2:c2:9f:5d:41:91:16:3b:16:2a:22:25:01:13:57:d5:6d:07:ff:a7:bc:1f:72
58
+ -----BEGIN CERTIFICATE-----
59
+ MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx
60
+ FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
61
+ VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
62
+ biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy
63
+ dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t
64
+ MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB
65
+ MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG
66
+ A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp
67
+ b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl
68
+ cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv
69
+ bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE
70
+ VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ
71
+ ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR
72
+ uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG
73
+ 9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI
74
+ hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM
75
+ pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg==
76
+ -----END CERTIFICATE-----
77
+
78
+ # Issuer: O=Equifax OU=Equifax Secure Certificate Authority
79
+ # Subject: O=Equifax OU=Equifax Secure Certificate Authority
80
+ # Label: "Equifax Secure CA"
81
+ # Serial: 903804111
82
+ # MD5 Fingerprint: 67:cb:9d:c0:13:24:8a:82:9b:b2:17:1e:d1:1b:ec:d4
83
+ # SHA1 Fingerprint: d2:32:09:ad:23:d3:14:23:21:74:e4:0d:7f:9d:62:13:97:86:63:3a
84
+ # SHA256 Fingerprint: 08:29:7a:40:47:db:a2:36:80:c7:31:db:6e:31:76:53:ca:78:48:e1:be:bd:3a:0b:01:79:a7:07:f9:2c:f1:78
85
+ -----BEGIN CERTIFICATE-----
86
+ MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
87
+ UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy
88
+ dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1
89
+ MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx
90
+ dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B
91
+ AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f
92
+ BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A
93
+ cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC
94
+ AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ
95
+ MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm
96
+ aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw
97
+ ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj
98
+ IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF
99
+ MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
100
+ A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y
101
+ 7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh
102
+ 1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4
103
+ -----END CERTIFICATE-----
104
+
105
+ # Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority
106
+ # Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority
107
+ # Label: "Verisign Class 3 Public Primary Certification Authority"
108
+ # Serial: 149843929435818692848040365716851702463
109
+ # MD5 Fingerprint: 10:fc:63:5d:f6:26:3e:0d:f3:25:be:5f:79:cd:67:67
110
+ # SHA1 Fingerprint: 74:2c:31:92:e6:07:e4:24:eb:45:49:54:2b:e1:bb:c5:3e:61:74:e2
111
+ # SHA256 Fingerprint: e7:68:56:34:ef:ac:f6:9a:ce:93:9a:6b:25:5b:7b:4f:ab:ef:42:93:5b:50:a2:65:ac:b5:cb:60:27:e4:4e:70
112
+ -----BEGIN CERTIFICATE-----
113
+ MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG
114
+ A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
115
+ cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
116
+ MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
117
+ BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt
118
+ YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
119
+ ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE
120
+ BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is
121
+ I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G
122
+ CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do
123
+ lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc
124
+ AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k
125
+ -----END CERTIFICATE-----
126
+
127
+ # Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network
128
+ # Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network
129
+ # Label: "Verisign Class 3 Public Primary Certification Authority - G2"
130
+ # Serial: 167285380242319648451154478808036881606
131
+ # MD5 Fingerprint: a2:33:9b:4c:74:78:73:d4:6c:e7:c1:f3:8d:cb:5c:e9
132
+ # SHA1 Fingerprint: 85:37:1c:a6:e5:50:14:3d:ce:28:03:47:1b:de:3a:09:e8:f8:77:0f
133
+ # SHA256 Fingerprint: 83:ce:3c:12:29:68:8a:59:3d:48:5f:81:97:3c:0f:91:95:43:1e:da:37:cc:5e:36:43:0e:79:c7:a8:88:63:8b
134
+ -----BEGIN CERTIFICATE-----
135
+ MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ
136
+ BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh
137
+ c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy
138
+ MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp
139
+ emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X
140
+ DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw
141
+ FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg
142
+ UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo
143
+ YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5
144
+ MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB
145
+ AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4
146
+ pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0
147
+ 13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID
148
+ AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk
149
+ U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i
150
+ F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY
151
+ oJ2daZH9
152
+ -----END CERTIFICATE-----
153
+
154
+ # Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA
155
+ # Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA
156
+ # Label: "GlobalSign Root CA"
157
+ # Serial: 4835703278459707669005204
158
+ # MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a
159
+ # SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c
160
+ # SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99
161
+ -----BEGIN CERTIFICATE-----
162
+ MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG
163
+ A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
164
+ b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw
165
+ MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
166
+ YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT
167
+ aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ
168
+ jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp
169
+ xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp
170
+ 1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG
171
+ snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ
172
+ U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8
173
+ 9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E
174
+ BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B
175
+ AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz
176
+ yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE
177
+ 38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP
178
+ AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad
179
+ DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME
180
+ HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
181
+ -----END CERTIFICATE-----
182
+
183
+ # Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2
184
+ # Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2
185
+ # Label: "GlobalSign Root CA - R2"
186
+ # Serial: 4835703278459682885658125
187
+ # MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30
188
+ # SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe
189
+ # SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e
190
+ -----BEGIN CERTIFICATE-----
191
+ MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G
192
+ A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp
193
+ Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1
194
+ MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG
195
+ A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
196
+ hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL
197
+ v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8
198
+ eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq
199
+ tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd
200
+ C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa
201
+ zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB
202
+ mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH
203
+ V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n
204
+ bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG
205
+ 3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs
206
+ J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO
207
+ 291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS
208
+ ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd
209
+ AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
210
+ TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
211
+ -----END CERTIFICATE-----
212
+
213
+ # Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority
214
+ # Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority
215
+ # Label: "ValiCert Class 1 VA"
216
+ # Serial: 1
217
+ # MD5 Fingerprint: 65:58:ab:15:ad:57:6c:1e:a8:a7:b5:69:ac:bf:ff:eb
218
+ # SHA1 Fingerprint: e5:df:74:3c:b6:01:c4:9b:98:43:dc:ab:8c:e8:6a:81:10:9f:e4:8e
219
+ # SHA256 Fingerprint: f4:c1:49:55:1a:30:13:a3:5b:c7:bf:fe:17:a7:f3:44:9b:c1:ab:5b:5a:0a:e7:4b:06:c2:3b:90:00:4c:01:04
220
+ -----BEGIN CERTIFICATE-----
221
+ MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
222
+ IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
223
+ BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
224
+ aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
225
+ 9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy
226
+ NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
227
+ azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
228
+ YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
229
+ Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
230
+ cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y
231
+ LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+
232
+ TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y
233
+ TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0
234
+ LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW
235
+ I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw
236
+ nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI
237
+ -----END CERTIFICATE-----
238
+
239
+ # Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority
240
+ # Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority
241
+ # Label: "ValiCert Class 2 VA"
242
+ # Serial: 1
243
+ # MD5 Fingerprint: a9:23:75:9b:ba:49:36:6e:31:c2:db:f2:e7:66:ba:87
244
+ # SHA1 Fingerprint: 31:7a:2a:d0:7f:2b:33:5e:f5:a1:c3:4e:4b:57:e8:b7:d8:f1:fc:a6
245
+ # SHA256 Fingerprint: 58:d0:17:27:9c:d4:dc:63:ab:dd:b1:96:a6:c9:90:6c:30:c4:e0:87:83:ea:e8:c1:60:99:54:d6:93:55:59:6b
246
+ -----BEGIN CERTIFICATE-----
247
+ MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
248
+ IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
249
+ BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
250
+ aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
251
+ 9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy
252
+ NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
253
+ azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
254
+ YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
255
+ Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
256
+ cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY
257
+ dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9
258
+ WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS
259
+ v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v
260
+ UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu
261
+ IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC
262
+ W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd
263
+ -----END CERTIFICATE-----
264
+
265
+ # Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority
266
+ # Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority
267
+ # Label: "RSA Root Certificate 1"
268
+ # Serial: 1
269
+ # MD5 Fingerprint: a2:6f:53:b7:ee:40:db:4a:68:e7:fa:18:d9:10:4b:72
270
+ # SHA1 Fingerprint: 69:bd:8c:f4:9c:d3:00:fb:59:2e:17:93:ca:55:6a:f3:ec:aa:35:fb
271
+ # SHA256 Fingerprint: bc:23:f9:8a:31:3c:b9:2d:e3:bb:fc:3a:5a:9f:44:61:ac:39:49:4c:4a:e1:5a:9e:9d:f1:31:e9:9b:73:01:9a
272
+ -----BEGIN CERTIFICATE-----
273
+ MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
274
+ IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
275
+ BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
276
+ aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
277
+ 9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy
278
+ NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
279
+ azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
280
+ YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
281
+ Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
282
+ cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD
283
+ cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs
284
+ 2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY
285
+ JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE
286
+ Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ
287
+ n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A
288
+ PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu
289
+ -----END CERTIFICATE-----
290
+
291
+ # Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only
292
+ # Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only
293
+ # Label: "Verisign Class 3 Public Primary Certification Authority - G3"
294
+ # Serial: 206684696279472310254277870180966723415
295
+ # MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09
296
+ # SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6
297
+ # SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44
298
+ -----BEGIN CERTIFICATE-----
299
+ MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
300
+ CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
301
+ cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
302
+ LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
303
+ aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
304
+ dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
305
+ VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
306
+ aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
307
+ bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
308
+ IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
309
+ LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b
310
+ N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t
311
+ KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu
312
+ kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm
313
+ CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ
314
+ Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu
315
+ imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te
316
+ 2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe
317
+ DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
318
+ /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p
319
+ F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt
320
+ TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
321
+ -----END CERTIFICATE-----
322
+
323
+ # Issuer: CN=VeriSign Class 4 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only
324
+ # Subject: CN=VeriSign Class 4 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only
325
+ # Label: "Verisign Class 4 Public Primary Certification Authority - G3"
326
+ # Serial: 314531972711909413743075096039378935511
327
+ # MD5 Fingerprint: db:c8:f2:27:2e:b1:ea:6a:29:23:5d:fe:56:3e:33:df
328
+ # SHA1 Fingerprint: c8:ec:8c:87:92:69:cb:4b:ab:39:e9:8d:7e:57:67:f3:14:95:73:9d
329
+ # SHA256 Fingerprint: e3:89:36:0d:0f:db:ae:b3:d2:50:58:4b:47:30:31:4e:22:2f:39:c1:56:a0:20:14:4e:8d:96:05:61:79:15:06
330
+ -----BEGIN CERTIFICATE-----
331
+ MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
332
+ CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
333
+ cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
334
+ LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
335
+ aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
336
+ dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
337
+ VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
338
+ aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
339
+ bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
340
+ IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
341
+ LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1
342
+ GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ
343
+ +mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd
344
+ U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm
345
+ NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY
346
+ ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/
347
+ ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1
348
+ CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq
349
+ g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
350
+ fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c
351
+ 2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/
352
+ bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
353
+ -----END CERTIFICATE-----
354
+
355
+ # Issuer: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
356
+ # Subject: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
357
+ # Label: "Entrust.net Secure Server CA"
358
+ # Serial: 927650371
359
+ # MD5 Fingerprint: df:f2:80:73:cc:f1:e6:61:73:fc:f5:42:e9:c5:7c:ee
360
+ # SHA1 Fingerprint: 99:a6:9b:e6:1a:fe:88:6b:4d:2b:82:00:7c:b8:54:fc:31:7e:15:39
361
+ # SHA256 Fingerprint: 62:f2:40:27:8c:56:4c:4d:d8:bf:7d:9d:4f:6f:36:6e:a8:94:d2:2f:5f:34:d9:89:a9:83:ac:ec:2f:ff:ed:50
362
+ -----BEGIN CERTIFICATE-----
363
+ MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC
364
+ VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u
365
+ ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc
366
+ KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u
367
+ ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1
368
+ MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE
369
+ ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j
370
+ b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
371
+ bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg
372
+ U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA
373
+ A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/
374
+ I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3
375
+ wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC
376
+ AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb
377
+ oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5
378
+ BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p
379
+ dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk
380
+ MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp
381
+ b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
382
+ dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0
383
+ MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi
384
+ E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa
385
+ MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI
386
+ hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN
387
+ 95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd
388
+ 2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
389
+ -----END CERTIFICATE-----
390
+
391
+ # Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
392
+ # Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
393
+ # Label: "Entrust.net Premium 2048 Secure Server CA"
394
+ # Serial: 946059622
395
+ # MD5 Fingerprint: ba:21:ea:20:d6:dd:db:8f:c1:57:8b:40:ad:a1:fc:fc
396
+ # SHA1 Fingerprint: 80:1d:62:d0:7b:44:9d:5c:5c:03:5c:98:ea:61:fa:44:3c:2a:58:fe
397
+ # SHA256 Fingerprint: d1:c3:39:ea:27:84:eb:87:0f:93:4f:c5:63:4e:4a:a9:ad:55:05:01:64:01:f2:64:65:d3:7a:57:46:63:35:9f
398
+ -----BEGIN CERTIFICATE-----
399
+ MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML
400
+ RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp
401
+ bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5
402
+ IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp
403
+ ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0xOTEy
404
+ MjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3
405
+ LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp
406
+ YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG
407
+ A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp
408
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq
409
+ K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe
410
+ sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX
411
+ MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT
412
+ XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/
413
+ HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH
414
+ 4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGA
415
+ vtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJFrlwMB0G
416
+ CSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEA
417
+ WUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo
418
+ oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQ
419
+ h7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18
420
+ f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfN
421
+ B/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVy
422
+ vUxFnmG6v4SBkgPR0ml8xQ==
423
+ -----END CERTIFICATE-----
424
+
425
+ # Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust
426
+ # Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust
427
+ # Label: "Baltimore CyberTrust Root"
428
+ # Serial: 33554617
429
+ # MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4
430
+ # SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74
431
+ # SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb
432
+ -----BEGIN CERTIFICATE-----
433
+ MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ
434
+ RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD
435
+ VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX
436
+ DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y
437
+ ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy
438
+ VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr
439
+ mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr
440
+ IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK
441
+ mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu
442
+ XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy
443
+ dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye
444
+ jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1
445
+ BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3
446
+ DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92
447
+ 9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx
448
+ jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0
449
+ Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz
450
+ ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS
451
+ R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
452
+ -----END CERTIFICATE-----
453
+
454
+ # Issuer: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc.
455
+ # Subject: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc.
456
+ # Label: "Equifax Secure Global eBusiness CA"
457
+ # Serial: 1
458
+ # MD5 Fingerprint: 8f:5d:77:06:27:c4:98:3c:5b:93:78:e7:d7:7d:9b:cc
459
+ # SHA1 Fingerprint: 7e:78:4a:10:1c:82:65:cc:2d:e1:f1:6d:47:b4:40:ca:d9:0a:19:45
460
+ # SHA256 Fingerprint: 5f:0b:62:ea:b5:e3:53:ea:65:21:65:16:58:fb:b6:53:59:f4:43:28:0a:4a:fb:d1:04:d7:7d:10:f9:f0:4c:07
461
+ -----BEGIN CERTIFICATE-----
462
+ MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc
463
+ MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT
464
+ ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw
465
+ MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj
466
+ dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l
467
+ c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC
468
+ UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc
469
+ 58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/
470
+ o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH
471
+ MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr
472
+ aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA
473
+ A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA
474
+ Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv
475
+ 8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV
476
+ -----END CERTIFICATE-----
477
+
478
+ # Issuer: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc.
479
+ # Subject: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc.
480
+ # Label: "Equifax Secure eBusiness CA 1"
481
+ # Serial: 4
482
+ # MD5 Fingerprint: 64:9c:ef:2e:44:fc:c6:8f:52:07:d0:51:73:8f:cb:3d
483
+ # SHA1 Fingerprint: da:40:18:8b:91:89:a3:ed:ee:ae:da:97:fe:2f:9d:f5:b7:d1:8a:41
484
+ # SHA256 Fingerprint: cf:56:ff:46:a4:a1:86:10:9d:d9:65:84:b5:ee:b5:8a:51:0c:42:75:b0:e5:f9:4f:40:bb:ae:86:5e:19:f6:73
485
+ -----BEGIN CERTIFICATE-----
486
+ MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc
487
+ MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT
488
+ ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw
489
+ MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j
490
+ LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ
491
+ KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo
492
+ RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu
493
+ WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw
494
+ Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD
495
+ AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK
496
+ eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM
497
+ zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+
498
+ WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN
499
+ /Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ==
500
+ -----END CERTIFICATE-----
501
+
502
+ # Issuer: O=Equifax Secure OU=Equifax Secure eBusiness CA-2
503
+ # Subject: O=Equifax Secure OU=Equifax Secure eBusiness CA-2
504
+ # Label: "Equifax Secure eBusiness CA 2"
505
+ # Serial: 930140085
506
+ # MD5 Fingerprint: aa:bf:bf:64:97:da:98:1d:6f:c6:08:3a:95:70:33:ca
507
+ # SHA1 Fingerprint: 39:4f:f6:85:0b:06:be:52:e5:18:56:cc:10:e1:80:e8:82:b3:85:cc
508
+ # SHA256 Fingerprint: 2f:27:4e:48:ab:a4:ac:7b:76:59:33:10:17:75:50:6d:c3:0e:e3:8e:f6:ac:d5:c0:49:32:cf:e0:41:23:42:20
509
+ -----BEGIN CERTIFICATE-----
510
+ MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
511
+ UzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2Vj
512
+ dXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0
513
+ NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXggU2VjdXJlMSYwJAYD
514
+ VQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCBnzANBgkqhkiG9w0B
515
+ AQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn2Z0G
516
+ vxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/
517
+ BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0C
518
+ AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEX
519
+ MBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJl
520
+ IGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkw
521
+ NjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBq
522
+ y/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQF
523
+ MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
524
+ A4GBAAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy
525
+ 0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1
526
+ E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN
527
+ -----END CERTIFICATE-----
528
+
529
+ # Issuer: CN=AddTrust Class 1 CA Root O=AddTrust AB OU=AddTrust TTP Network
530
+ # Subject: CN=AddTrust Class 1 CA Root O=AddTrust AB OU=AddTrust TTP Network
531
+ # Label: "AddTrust Low-Value Services Root"
532
+ # Serial: 1
533
+ # MD5 Fingerprint: 1e:42:95:02:33:92:6b:b9:5f:c0:7f:da:d6:b2:4b:fc
534
+ # SHA1 Fingerprint: cc:ab:0e:a0:4c:23:01:d6:69:7b:dd:37:9f:cd:12:eb:24:e3:94:9d
535
+ # SHA256 Fingerprint: 8c:72:09:27:9a:c0:4e:27:5e:16:d0:7f:d3:b7:75:e8:01:54:b5:96:80:46:e3:1f:52:dd:25:76:63:24:e9:a7
536
+ -----BEGIN CERTIFICATE-----
537
+ MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU
538
+ MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3
539
+ b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw
540
+ MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
541
+ QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD
542
+ VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA
543
+ A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul
544
+ CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n
545
+ tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl
546
+ dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch
547
+ PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC
548
+ +Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O
549
+ BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E
550
+ BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl
551
+ MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk
552
+ ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB
553
+ IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X
554
+ 7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz
555
+ 43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
556
+ eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl
557
+ pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA
558
+ WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
559
+ -----END CERTIFICATE-----
560
+
561
+ # Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network
562
+ # Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network
563
+ # Label: "AddTrust External Root"
564
+ # Serial: 1
565
+ # MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f
566
+ # SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68
567
+ # SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2
568
+ -----BEGIN CERTIFICATE-----
569
+ MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU
570
+ MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs
571
+ IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290
572
+ MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux
573
+ FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h
574
+ bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v
575
+ dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt
576
+ H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9
577
+ uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX
578
+ mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX
579
+ a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN
580
+ E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0
581
+ WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD
582
+ VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0
583
+ Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU
584
+ cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx
585
+ IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN
586
+ AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH
587
+ YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
588
+ 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC
589
+ Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX
590
+ c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a
591
+ mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
592
+ -----END CERTIFICATE-----
593
+
594
+ # Issuer: CN=AddTrust Public CA Root O=AddTrust AB OU=AddTrust TTP Network
595
+ # Subject: CN=AddTrust Public CA Root O=AddTrust AB OU=AddTrust TTP Network
596
+ # Label: "AddTrust Public Services Root"
597
+ # Serial: 1
598
+ # MD5 Fingerprint: c1:62:3e:23:c5:82:73:9c:03:59:4b:2b:e9:77:49:7f
599
+ # SHA1 Fingerprint: 2a:b6:28:48:5e:78:fb:f3:ad:9e:79:10:dd:6b:df:99:72:2c:96:e5
600
+ # SHA256 Fingerprint: 07:91:ca:07:49:b2:07:82:aa:d3:c7:d7:bd:0c:df:c9:48:58:35:84:3e:b2:d7:99:60:09:ce:43:ab:6c:69:27
601
+ -----BEGIN CERTIFICATE-----
602
+ MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU
603
+ MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3
604
+ b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx
605
+ MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB
606
+ ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV
607
+ BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC
608
+ AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV
609
+ 6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX
610
+ GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP
611
+ dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH
612
+ 1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF
613
+ 62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW
614
+ BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw
615
+ AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL
616
+ MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU
617
+ cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv
618
+ b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6
619
+ IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/
620
+ iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao
621
+ GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh
622
+ 4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm
623
+ XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY=
624
+ -----END CERTIFICATE-----
625
+
626
+ # Issuer: CN=AddTrust Qualified CA Root O=AddTrust AB OU=AddTrust TTP Network
627
+ # Subject: CN=AddTrust Qualified CA Root O=AddTrust AB OU=AddTrust TTP Network
628
+ # Label: "AddTrust Qualified Certificates Root"
629
+ # Serial: 1
630
+ # MD5 Fingerprint: 27:ec:39:47:cd:da:5a:af:e2:9a:01:65:21:a9:4c:bb
631
+ # SHA1 Fingerprint: 4d:23:78:ec:91:95:39:b5:00:7f:75:8f:03:3b:21:1e:c5:4d:8b:cf
632
+ # SHA256 Fingerprint: 80:95:21:08:05:db:4b:bc:35:5e:44:28:d8:fd:6e:c2:cd:e3:ab:5f:b9:7a:99:42:98:8e:b8:f4:dc:d0:60:16
633
+ -----BEGIN CERTIFICATE-----
634
+ MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU
635
+ MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3
636
+ b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1
637
+ MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK
638
+ EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh
639
+ BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B
640
+ AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq
641
+ xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G
642
+ 87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i
643
+ 2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U
644
+ WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1
645
+ 0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G
646
+ A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T
647
+ AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr
648
+ pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL
649
+ ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm
650
+ aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv
651
+ hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm
652
+ hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X
653
+ dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3
654
+ P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y
655
+ iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no
656
+ xqE=
657
+ -----END CERTIFICATE-----
658
+
659
+ # Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc.
660
+ # Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc.
661
+ # Label: "Entrust Root Certification Authority"
662
+ # Serial: 1164660820
663
+ # MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4
664
+ # SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9
665
+ # SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c
666
+ -----BEGIN CERTIFICATE-----
667
+ MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC
668
+ VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0
669
+ Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW
670
+ KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl
671
+ cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw
672
+ NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw
673
+ NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy
674
+ ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV
675
+ BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ
676
+ KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo
677
+ Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4
678
+ 4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9
679
+ KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI
680
+ rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi
681
+ 94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB
682
+ sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi
683
+ gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo
684
+ kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE
685
+ vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
686
+ A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t
687
+ O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua
688
+ AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP
689
+ 9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/
690
+ eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m
691
+ 0vdXcDazv/wor3ElhVsT/h5/WrQ8
692
+ -----END CERTIFICATE-----
693
+
694
+ # Issuer: CN=GeoTrust Global CA O=GeoTrust Inc.
695
+ # Subject: CN=GeoTrust Global CA O=GeoTrust Inc.
696
+ # Label: "GeoTrust Global CA"
697
+ # Serial: 144470
698
+ # MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5
699
+ # SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12
700
+ # SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a
701
+ -----BEGIN CERTIFICATE-----
702
+ MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
703
+ MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
704
+ YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG
705
+ EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg
706
+ R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9
707
+ 9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq
708
+ fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv
709
+ iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU
710
+ 1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+
711
+ bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW
712
+ MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA
713
+ ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l
714
+ uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn
715
+ Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS
716
+ tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
717
+ PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un
718
+ hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV
719
+ 5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==
720
+ -----END CERTIFICATE-----
721
+
722
+ # Issuer: CN=GeoTrust Global CA 2 O=GeoTrust Inc.
723
+ # Subject: CN=GeoTrust Global CA 2 O=GeoTrust Inc.
724
+ # Label: "GeoTrust Global CA 2"
725
+ # Serial: 1
726
+ # MD5 Fingerprint: 0e:40:a7:6c:de:03:5d:8f:d1:0f:e4:d1:8d:f9:6c:a9
727
+ # SHA1 Fingerprint: a9:e9:78:08:14:37:58:88:f2:05:19:b0:6d:2b:0d:2b:60:16:90:7d
728
+ # SHA256 Fingerprint: ca:2d:82:a0:86:77:07:2f:8a:b6:76:4f:f0:35:67:6c:fe:3e:5e:32:5e:01:21:72:df:3f:92:09:6d:b7:9b:85
729
+ -----BEGIN CERTIFICATE-----
730
+ MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW
731
+ MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs
732
+ IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG
733
+ EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg
734
+ R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A
735
+ PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8
736
+ Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL
737
+ TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL
738
+ 5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7
739
+ S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe
740
+ 2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
741
+ FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap
742
+ EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td
743
+ EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv
744
+ /NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN
745
+ A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0
746
+ abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF
747
+ I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz
748
+ 4iIprn2DQKi6bA==
749
+ -----END CERTIFICATE-----
750
+
751
+ # Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc.
752
+ # Subject: CN=GeoTrust Universal CA O=GeoTrust Inc.
753
+ # Label: "GeoTrust Universal CA"
754
+ # Serial: 1
755
+ # MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48
756
+ # SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79
757
+ # SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12
758
+ -----BEGIN CERTIFICATE-----
759
+ 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
788
+ -----END CERTIFICATE-----
789
+
790
+ # Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc.
791
+ # Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc.
792
+ # Label: "GeoTrust Universal CA 2"
793
+ # Serial: 1
794
+ # MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7
795
+ # SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79
796
+ # SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b
797
+ -----BEGIN CERTIFICATE-----
798
+ MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW
799
+ MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy
800
+ c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD
801
+ VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1
802
+ c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
803
+ AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81
804
+ WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG
805
+ FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq
806
+ XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL
807
+ se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb
808
+ KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd
809
+ IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73
810
+ y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt
811
+ hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc
812
+ QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4
813
+ Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV
814
+ HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV
815
+ HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ
816
+ KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
817
+ dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ
818
+ L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr
819
+ Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo
820
+ ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY
821
+ T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz
822
+ GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m
823
+ 1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV
824
+ OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH
825
+ 6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX
826
+ QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
827
+ -----END CERTIFICATE-----
828
+
829
+ # Issuer: CN=America Online Root Certification Authority 1 O=America Online Inc.
830
+ # Subject: CN=America Online Root Certification Authority 1 O=America Online Inc.
831
+ # Label: "America Online Root Certification Authority 1"
832
+ # Serial: 1
833
+ # MD5 Fingerprint: 14:f1:08:ad:9d:fa:64:e2:89:e7:1c:cf:a8:ad:7d:5e
834
+ # SHA1 Fingerprint: 39:21:c1:15:c1:5d:0e:ca:5c:cb:5b:c4:f0:7d:21:d8:05:0b:56:6a
835
+ # SHA256 Fingerprint: 77:40:73:12:c6:3a:15:3d:5b:c0:0b:4e:51:75:9c:df:da:c2:37:dc:2a:33:b6:79:46:e9:8e:9b:fa:68:0a:e3
836
+ -----BEGIN CERTIFICATE-----
837
+ MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc
838
+ MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP
839
+ bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2
840
+ MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft
841
+ ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg
842
+ Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP
843
+ ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk
844
+ hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym
845
+ 1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW
846
+ OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb
847
+ 2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko
848
+ O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw
849
+ AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU
850
+ AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB
851
+ BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF
852
+ Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb
853
+ LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir
854
+ oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C
855
+ MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds
856
+ sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7
857
+ -----END CERTIFICATE-----
858
+
859
+ # Issuer: CN=America Online Root Certification Authority 2 O=America Online Inc.
860
+ # Subject: CN=America Online Root Certification Authority 2 O=America Online Inc.
861
+ # Label: "America Online Root Certification Authority 2"
862
+ # Serial: 1
863
+ # MD5 Fingerprint: d6:ed:3c:ca:e2:66:0f:af:10:43:0d:77:9b:04:09:bf
864
+ # SHA1 Fingerprint: 85:b5:ff:67:9b:0c:79:96:1f:c8:6e:44:22:00:46:13:db:17:92:84
865
+ # SHA256 Fingerprint: 7d:3b:46:5a:60:14:e5:26:c0:af:fc:ee:21:27:d2:31:17:27:ad:81:1c:26:84:2d:00:6a:f3:73:06:cc:80:bd
866
+ -----BEGIN CERTIFICATE-----
867
+ MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc
868
+ MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP
869
+ bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2
870
+ MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft
871
+ ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg
872
+ Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP
873
+ ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC
874
+ 206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci
875
+ KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2
876
+ JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9
877
+ BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e
878
+ Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B
879
+ PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67
880
+ Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq
881
+ Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ
882
+ o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3
883
+ +L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj
884
+ YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj
885
+ FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE
886
+ AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn
887
+ xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2
888
+ LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc
889
+ obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8
890
+ CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe
891
+ IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA
892
+ DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F
893
+ AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX
894
+ Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb
895
+ AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl
896
+ Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw
897
+ RY8mkaKO/qk=
898
+ -----END CERTIFICATE-----
899
+
900
+ # Issuer: CN=AAA Certificate Services O=Comodo CA Limited
901
+ # Subject: CN=AAA Certificate Services O=Comodo CA Limited
902
+ # Label: "Comodo AAA Services root"
903
+ # Serial: 1
904
+ # MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0
905
+ # SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49
906
+ # SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4
907
+ -----BEGIN CERTIFICATE-----
908
+ MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb
909
+ MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
910
+ GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj
911
+ YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL
912
+ MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
913
+ BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM
914
+ GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
915
+ ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua
916
+ BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe
917
+ 3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4
918
+ YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR
919
+ rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm
920
+ ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU
921
+ oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
922
+ MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v
923
+ QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t
924
+ b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF
925
+ AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q
926
+ GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
927
+ Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2
928
+ G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi
929
+ l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3
930
+ smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
931
+ -----END CERTIFICATE-----
932
+
933
+ # Issuer: CN=Secure Certificate Services O=Comodo CA Limited
934
+ # Subject: CN=Secure Certificate Services O=Comodo CA Limited
935
+ # Label: "Comodo Secure Services root"
936
+ # Serial: 1
937
+ # MD5 Fingerprint: d3:d9:bd:ae:9f:ac:67:24:b3:c8:1b:52:e1:b9:a9:bd
938
+ # SHA1 Fingerprint: 4a:65:d5:f4:1d:ef:39:b8:b8:90:4a:4a:d3:64:81:33:cf:c7:a1:d1
939
+ # SHA256 Fingerprint: bd:81:ce:3b:4f:65:91:d1:1a:67:b5:fc:7a:47:fd:ef:25:52:1b:f9:aa:4e:18:b9:e3:df:2e:34:a7:80:3b:e8
940
+ -----BEGIN CERTIFICATE-----
941
+ MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb
942
+ MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
943
+ GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp
944
+ ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow
945
+ fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
946
+ A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV
947
+ BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB
948
+ BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM
949
+ cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S
950
+ HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996
951
+ CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk
952
+ 3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz
953
+ 6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV
954
+ HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud
955
+ EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv
956
+ Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw
957
+ Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww
958
+ DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0
959
+ 5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj
960
+ Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI
961
+ gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ
962
+ aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl
963
+ izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk=
964
+ -----END CERTIFICATE-----
965
+
966
+ # Issuer: CN=Trusted Certificate Services O=Comodo CA Limited
967
+ # Subject: CN=Trusted Certificate Services O=Comodo CA Limited
968
+ # Label: "Comodo Trusted Services root"
969
+ # Serial: 1
970
+ # MD5 Fingerprint: 91:1b:3f:6e:cd:9e:ab:ee:07:fe:1f:71:d2:b3:61:27
971
+ # SHA1 Fingerprint: e1:9f:e3:0e:8b:84:60:9e:80:9b:17:0d:72:a8:c5:ba:6e:14:09:bd
972
+ # SHA256 Fingerprint: 3f:06:e5:56:81:d4:96:f5:be:16:9e:b5:38:9f:9f:2b:8f:f6:1e:17:08:df:68:81:72:48:49:cd:5d:27:cb:69
973
+ -----BEGIN CERTIFICATE-----
974
+ MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb
975
+ MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
976
+ GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0
977
+ aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla
978
+ MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO
979
+ BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD
980
+ VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B
981
+ AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW
982
+ fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt
983
+ TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL
984
+ fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW
985
+ 1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7
986
+ kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G
987
+ A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD
988
+ VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v
989
+ ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo
990
+ dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu
991
+ Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/
992
+ HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32
993
+ pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS
994
+ jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+
995
+ xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn
996
+ dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi
997
+ -----END CERTIFICATE-----
998
+
999
+ # Issuer: CN=UTN - DATACorp SGC O=The USERTRUST Network OU=http://www.usertrust.com
1000
+ # Subject: CN=UTN - DATACorp SGC O=The USERTRUST Network OU=http://www.usertrust.com
1001
+ # Label: "UTN DATACorp SGC Root CA"
1002
+ # Serial: 91374294542884689855167577680241077609
1003
+ # MD5 Fingerprint: b3:a5:3e:77:21:6d:ac:4a:c0:c9:fb:d5:41:3d:ca:06
1004
+ # SHA1 Fingerprint: 58:11:9f:0e:12:82:87:ea:50:fd:d9:87:45:6f:4f:78:dc:fa:d6:d4
1005
+ # SHA256 Fingerprint: 85:fb:2f:91:dd:12:27:5a:01:45:b6:36:53:4f:84:02:4a:d6:8b:69:b8:ee:88:68:4f:f7:11:37:58:05:b3:48
1006
+ -----BEGIN CERTIFICATE-----
1007
+ MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB
1008
+ kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug
1009
+ Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
1010
+ dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw
1011
+ IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG
1012
+ EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD
1013
+ VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu
1014
+ dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN
1015
+ BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6
1016
+ E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ
1017
+ D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK
1018
+ 4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq
1019
+ lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW
1020
+ bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB
1021
+ o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT
1022
+ MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js
1023
+ LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr
1024
+ BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB
1025
+ AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft
1026
+ Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj
1027
+ j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH
1028
+ KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv
1029
+ 2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3
1030
+ mfnGV/TJVTl4uix5yaaIK/QI
1031
+ -----END CERTIFICATE-----
1032
+
1033
+ # Issuer: CN=UTN-USERFirst-Hardware O=The USERTRUST Network OU=http://www.usertrust.com
1034
+ # Subject: CN=UTN-USERFirst-Hardware O=The USERTRUST Network OU=http://www.usertrust.com
1035
+ # Label: "UTN USERFirst Hardware Root CA"
1036
+ # Serial: 91374294542884704022267039221184531197
1037
+ # MD5 Fingerprint: 4c:56:41:e5:0d:bb:2b:e8:ca:a3:ed:18:08:ad:43:39
1038
+ # SHA1 Fingerprint: 04:83:ed:33:99:ac:36:08:05:87:22:ed:bc:5e:46:00:e3:be:f9:d7
1039
+ # SHA256 Fingerprint: 6e:a5:47:41:d0:04:66:7e:ed:1b:48:16:63:4a:a3:a7:9e:6e:4b:96:95:0f:82:79:da:fc:8d:9b:d8:81:21:37
1040
+ -----BEGIN CERTIFICATE-----
1041
+ MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB
1042
+ lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug
1043
+ Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
1044
+ dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt
1045
+ SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG
1046
+ A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe
1047
+ MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v
1048
+ d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh
1049
+ cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn
1050
+ 0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ
1051
+ M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a
1052
+ MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd
1053
+ oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI
1054
+ DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy
1055
+ oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD
1056
+ VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0
1057
+ dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy
1058
+ bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF
1059
+ BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
1060
+ //bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli
1061
+ CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE
1062
+ CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t
1063
+ 3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS
1064
+ KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA==
1065
+ -----END CERTIFICATE-----
1066
+
1067
+ # Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com
1068
+ # Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com
1069
+ # Label: "XRamp Global CA Root"
1070
+ # Serial: 107108908803651509692980124233745014957
1071
+ # MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1
1072
+ # SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6
1073
+ # SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2
1074
+ -----BEGIN CERTIFICATE-----
1075
+ MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB
1076
+ gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk
1077
+ MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY
1078
+ UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx
1079
+ NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3
1080
+ dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy
1081
+ dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
1082
+ dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6
1083
+ 38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP
1084
+ KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q
1085
+ DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4
1086
+ qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa
1087
+ JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi
1088
+ PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P
1089
+ BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs
1090
+ jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0
1091
+ eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD
1092
+ ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR
1093
+ vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
1094
+ qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa
1095
+ IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy
1096
+ i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ
1097
+ O+7ETPTsJ3xCwnR8gooJybQDJbw=
1098
+ -----END CERTIFICATE-----
1099
+
1100
+ # Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority
1101
+ # Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority
1102
+ # Label: "Go Daddy Class 2 CA"
1103
+ # Serial: 0
1104
+ # MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67
1105
+ # SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4
1106
+ # SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4
1107
+ -----BEGIN CERTIFICATE-----
1108
+ MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh
1109
+ MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE
1110
+ YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3
1111
+ MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo
1112
+ ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg
1113
+ MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN
1114
+ ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA
1115
+ PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w
1116
+ wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi
1117
+ EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY
1118
+ avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+
1119
+ YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE
1120
+ sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h
1121
+ /t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5
1122
+ IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj
1123
+ YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD
1124
+ ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy
1125
+ OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P
1126
+ TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
1127
+ HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER
1128
+ dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf
1129
+ ReYNnyicsbkqWletNw+vHX/bvZ8=
1130
+ -----END CERTIFICATE-----
1131
+
1132
+ # Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority
1133
+ # Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority
1134
+ # Label: "Starfield Class 2 CA"
1135
+ # Serial: 0
1136
+ # MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24
1137
+ # SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a
1138
+ # SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58
1139
+ -----BEGIN CERTIFICATE-----
1140
+ MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl
1141
+ MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp
1142
+ U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw
1143
+ NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE
1144
+ ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp
1145
+ ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3
1146
+ DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf
1147
+ 8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN
1148
+ +lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0
1149
+ X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa
1150
+ K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA
1151
+ 1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G
1152
+ A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR
1153
+ zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0
1154
+ YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD
1155
+ bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w
1156
+ DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3
1157
+ L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D
1158
+ eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
1159
+ xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp
1160
+ VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY
1161
+ WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q=
1162
+ -----END CERTIFICATE-----
1163
+
1164
+ # Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing
1165
+ # Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing
1166
+ # Label: "StartCom Certification Authority"
1167
+ # Serial: 1
1168
+ # MD5 Fingerprint: 22:4d:8f:8a:fc:f7:35:c2:bb:57:34:90:7b:8b:22:16
1169
+ # SHA1 Fingerprint: 3e:2b:f7:f2:03:1b:96:f3:8c:e6:c4:d8:a8:5d:3e:2d:58:47:6a:0f
1170
+ # SHA256 Fingerprint: c7:66:a9:be:f2:d4:07:1c:86:3a:31:aa:49:20:e8:13:b2:d1:98:60:8c:b7:b7:cf:e2:11:43:b8:36:df:09:ea
1171
+ -----BEGIN CERTIFICATE-----
1172
+ MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW
1173
+ MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg
1174
+ Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh
1175
+ dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9
1176
+ MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi
1177
+ U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh
1178
+ cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA
1179
+ A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk
1180
+ pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf
1181
+ OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C
1182
+ Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT
1183
+ Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi
1184
+ HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM
1185
+ Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w
1186
+ +2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+
1187
+ Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3
1188
+ Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B
1189
+ 26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID
1190
+ AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
1191
+ FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j
1192
+ ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js
1193
+ LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM
1194
+ BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0
1195
+ Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy
1196
+ dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh
1197
+ cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh
1198
+ YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg
1199
+ dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp
1200
+ bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ
1201
+ YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT
1202
+ TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ
1203
+ 9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8
1204
+ jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW
1205
+ FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz
1206
+ ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1
1207
+ ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L
1208
+ EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu
1209
+ L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
1210
+ yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC
1211
+ O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V
1212
+ um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh
1213
+ NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14=
1214
+ -----END CERTIFICATE-----
1215
+
1216
+ # Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com
1217
+ # Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com
1218
+ # Label: "DigiCert Assured ID Root CA"
1219
+ # Serial: 17154717934120587862167794914071425081
1220
+ # MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72
1221
+ # SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43
1222
+ # SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c
1223
+ -----BEGIN CERTIFICATE-----
1224
+ MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl
1225
+ MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
1226
+ d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
1227
+ b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG
1228
+ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
1229
+ cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi
1230
+ MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c
1231
+ JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP
1232
+ mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+
1233
+ wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4
1234
+ VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/
1235
+ AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB
1236
+ AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW
1237
+ BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun
1238
+ pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC
1239
+ dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf
1240
+ fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm
1241
+ NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx
1242
+ H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
1243
+ +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
1244
+ -----END CERTIFICATE-----
1245
+
1246
+ # Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com
1247
+ # Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com
1248
+ # Label: "DigiCert Global Root CA"
1249
+ # Serial: 10944719598952040374951832963794454346
1250
+ # MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e
1251
+ # SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36
1252
+ # SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61
1253
+ -----BEGIN CERTIFICATE-----
1254
+ MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
1255
+ MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
1256
+ d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
1257
+ QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
1258
+ MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
1259
+ b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
1260
+ 9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
1261
+ CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
1262
+ nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
1263
+ 43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
1264
+ T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
1265
+ gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
1266
+ BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
1267
+ TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
1268
+ DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
1269
+ hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
1270
+ 06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
1271
+ PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
1272
+ YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
1273
+ CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
1274
+ -----END CERTIFICATE-----
1275
+
1276
+ # Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com
1277
+ # Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com
1278
+ # Label: "DigiCert High Assurance EV Root CA"
1279
+ # Serial: 3553400076410547919724730734378100087
1280
+ # MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a
1281
+ # SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25
1282
+ # SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf
1283
+ -----BEGIN CERTIFICATE-----
1284
+ MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs
1285
+ MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
1286
+ d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
1287
+ ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL
1288
+ MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
1289
+ LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug
1290
+ RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm
1291
+ +9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW
1292
+ PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM
1293
+ xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB
1294
+ Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3
1295
+ hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg
1296
+ EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF
1297
+ MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA
1298
+ FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec
1299
+ nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z
1300
+ eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF
1301
+ hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2
1302
+ Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
1303
+ vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep
1304
+ +OkuE6N36B9K
1305
+ -----END CERTIFICATE-----
1306
+
1307
+ # Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc.
1308
+ # Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc.
1309
+ # Label: "GeoTrust Primary Certification Authority"
1310
+ # Serial: 32798226551256963324313806436981982369
1311
+ # MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf
1312
+ # SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96
1313
+ # SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c
1314
+ -----BEGIN CERTIFICATE-----
1315
+ MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY
1316
+ MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo
1317
+ R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx
1318
+ MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
1319
+ Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp
1320
+ ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
1321
+ AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9
1322
+ AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA
1323
+ ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0
1324
+ 7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W
1325
+ kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI
1326
+ mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G
1327
+ A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ
1328
+ KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1
1329
+ 6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl
1330
+ 4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K
1331
+ oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj
1332
+ UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU
1333
+ AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
1334
+ -----END CERTIFICATE-----
1335
+
1336
+ # Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only
1337
+ # Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only
1338
+ # Label: "thawte Primary Root CA"
1339
+ # Serial: 69529181992039203566298953787712940909
1340
+ # MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12
1341
+ # SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81
1342
+ # SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f
1343
+ -----BEGIN CERTIFICATE-----
1344
+ MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB
1345
+ qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
1346
+ Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
1347
+ MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV
1348
+ BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw
1349
+ NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j
1350
+ LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG
1351
+ A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
1352
+ IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG
1353
+ SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs
1354
+ W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta
1355
+ 3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk
1356
+ 6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6
1357
+ Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J
1358
+ NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA
1359
+ MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP
1360
+ r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU
1361
+ DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz
1362
+ YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
1363
+ xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2
1364
+ /qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/
1365
+ LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7
1366
+ jVaMaA==
1367
+ -----END CERTIFICATE-----
1368
+
1369
+ # Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only
1370
+ # Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only
1371
+ # Label: "VeriSign Class 3 Public Primary Certification Authority - G5"
1372
+ # Serial: 33037644167568058970164719475676101450
1373
+ # MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c
1374
+ # SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5
1375
+ # SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df
1376
+ -----BEGIN CERTIFICATE-----
1377
+ MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB
1378
+ yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
1379
+ ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
1380
+ U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
1381
+ ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
1382
+ aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL
1383
+ MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
1384
+ ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln
1385
+ biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
1386
+ U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
1387
+ aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1
1388
+ nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex
1389
+ t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz
1390
+ SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG
1391
+ BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+
1392
+ rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/
1393
+ NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E
1394
+ BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH
1395
+ BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
1396
+ aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv
1397
+ MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE
1398
+ p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y
1399
+ 5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK
1400
+ WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ
1401
+ 4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N
1402
+ hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
1403
+ -----END CERTIFICATE-----
1404
+
1405
+ # Issuer: CN=COMODO Certification Authority O=COMODO CA Limited
1406
+ # Subject: CN=COMODO Certification Authority O=COMODO CA Limited
1407
+ # Label: "COMODO Certification Authority"
1408
+ # Serial: 104350513648249232941998508985834464573
1409
+ # MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75
1410
+ # SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b
1411
+ # SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66
1412
+ -----BEGIN CERTIFICATE-----
1413
+ MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB
1414
+ gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
1415
+ A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV
1416
+ BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw
1417
+ MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl
1418
+ YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P
1419
+ RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0
1420
+ aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3
1421
+ UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI
1422
+ 2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8
1423
+ Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp
1424
+ +2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+
1425
+ DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O
1426
+ nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW
1427
+ /zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g
1428
+ PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u
1429
+ QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY
1430
+ SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv
1431
+ IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
1432
+ RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4
1433
+ zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd
1434
+ BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB
1435
+ ZQ==
1436
+ -----END CERTIFICATE-----
1437
+
1438
+ # Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C.
1439
+ # Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C.
1440
+ # Label: "Network Solutions Certificate Authority"
1441
+ # Serial: 116697915152937497490437556386812487904
1442
+ # MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e
1443
+ # SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce
1444
+ # SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c
1445
+ -----BEGIN CERTIFICATE-----
1446
+ MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi
1447
+ MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
1448
+ MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp
1449
+ dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV
1450
+ UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO
1451
+ ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG
1452
+ SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz
1453
+ c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP
1454
+ OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl
1455
+ mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF
1456
+ BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4
1457
+ qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw
1458
+ gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB
1459
+ BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu
1460
+ bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp
1461
+ dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8
1462
+ 6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/
1463
+ h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH
1464
+ /nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
1465
+ wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN
1466
+ pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
1467
+ -----END CERTIFICATE-----
1468
+
1469
+ # Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited
1470
+ # Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited
1471
+ # Label: "COMODO ECC Certification Authority"
1472
+ # Serial: 41578283867086692638256921589707938090
1473
+ # MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23
1474
+ # SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11
1475
+ # SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7
1476
+ -----BEGIN CERTIFICATE-----
1477
+ MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL
1478
+ MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
1479
+ BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT
1480
+ IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw
1481
+ MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy
1482
+ ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N
1483
+ T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv
1484
+ biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR
1485
+ FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J
1486
+ cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW
1487
+ BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
1488
+ BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm
1489
+ fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv
1490
+ GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
1491
+ -----END CERTIFICATE-----
1492
+
1493
+ # Issuer: CN=TC TrustCenter Class 2 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 2 CA
1494
+ # Subject: CN=TC TrustCenter Class 2 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 2 CA
1495
+ # Label: "TC TrustCenter Class 2 CA II"
1496
+ # Serial: 941389028203453866782103406992443
1497
+ # MD5 Fingerprint: ce:78:33:5c:59:78:01:6e:18:ea:b9:36:a0:b9:2e:23
1498
+ # SHA1 Fingerprint: ae:50:83:ed:7c:f4:5c:bc:8f:61:c6:21:fe:68:5d:79:42:21:15:6e
1499
+ # SHA256 Fingerprint: e6:b8:f8:76:64:85:f8:07:ae:7f:8d:ac:16:70:46:1f:07:c0:a1:3e:ef:3a:1f:f7:17:53:8d:7a:ba:d3:91:b4
1500
+ -----BEGIN CERTIFICATE-----
1501
+ MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjEL
1502
+ MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV
1503
+ BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0
1504
+ Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYwMTEyMTQzODQzWhcNMjUxMjMxMjI1
1505
+ OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i
1506
+ SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UEAxMc
1507
+ VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD
1508
+ ggEPADCCAQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jf
1509
+ tMjWQ+nEdVl//OEd+DFwIxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKg
1510
+ uNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2J
1511
+ XjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQXa7pIXSSTYtZgo+U4+lK
1512
+ 8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7uSNQZu+99
1513
+ 5OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1Ud
1514
+ EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3
1515
+ kUrL84J6E1wIqzCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy
1516
+ dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6
1517
+ Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz
1518
+ JTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290
1519
+ Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
1520
+ TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iS
1521
+ GNn3Bzn1LL4GdXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprt
1522
+ ZjluS5TmVfwLG4t3wVMTZonZKNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8
1523
+ au0WOB9/WIFaGusyiC2y8zl3gK9etmF1KdsjTYjKUCjLhdLTEKJZbtOTVAB6okaV
1524
+ hgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kPJOzHdiEoZa5X6AeI
1525
+ dUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfkvQ==
1526
+ -----END CERTIFICATE-----
1527
+
1528
+ # Issuer: CN=TC TrustCenter Class 3 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 3 CA
1529
+ # Subject: CN=TC TrustCenter Class 3 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 3 CA
1530
+ # Label: "TC TrustCenter Class 3 CA II"
1531
+ # Serial: 1506523511417715638772220530020799
1532
+ # MD5 Fingerprint: 56:5f:aa:80:61:12:17:f6:67:21:e6:2b:6d:61:56:8e
1533
+ # SHA1 Fingerprint: 80:25:ef:f4:6e:70:c8:d4:72:24:65:84:fe:40:3b:8a:8d:6a:db:f5
1534
+ # SHA256 Fingerprint: 8d:a0:84:fc:f9:9c:e0:77:22:f8:9b:32:05:93:98:06:fa:5c:b8:11:e1:c8:13:f6:a1:08:c7:d3:36:b3:40:8e
1535
+ -----BEGIN CERTIFICATE-----
1536
+ MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjEL
1537
+ MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV
1538
+ BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0
1539
+ Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYwMTEyMTQ0MTU3WhcNMjUxMjMxMjI1
1540
+ OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i
1541
+ SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UEAxMc
1542
+ VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD
1543
+ ggEPADCCAQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJW
1544
+ Ht4bNwcwIi9v8Qbxq63WyKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+Q
1545
+ Vl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo6SI7dYnWRBpl8huXJh0obazovVkdKyT2
1546
+ 1oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZuV3bOx4a+9P/FRQI2Alq
1547
+ ukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk2ZyqBwi1
1548
+ Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1Ud
1549
+ EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NX
1550
+ XAek0CSnwPIA1DCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy
1551
+ dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6
1552
+ Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz
1553
+ JTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290
1554
+ Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
1555
+ TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlN
1556
+ irTzwppVMXzEO2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8
1557
+ TtXqluJucsG7Kv5sbviRmEb8yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6
1558
+ g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9IJqDnxrcOfHFcqMRA/07QlIp2+gB
1559
+ 95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal092Y+tTmBvTwtiBj
1560
+ S+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc5A==
1561
+ -----END CERTIFICATE-----
1562
+
1563
+ # Issuer: CN=TC TrustCenter Universal CA I O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA
1564
+ # Subject: CN=TC TrustCenter Universal CA I O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA
1565
+ # Label: "TC TrustCenter Universal CA I"
1566
+ # Serial: 601024842042189035295619584734726
1567
+ # MD5 Fingerprint: 45:e1:a5:72:c5:a9:36:64:40:9e:f5:e4:58:84:67:8c
1568
+ # SHA1 Fingerprint: 6b:2f:34:ad:89:58:be:62:fd:b0:6b:5c:ce:bb:9d:d9:4f:4e:39:f3
1569
+ # SHA256 Fingerprint: eb:f3:c0:2a:87:89:b1:fb:7d:51:19:95:d6:63:b7:29:06:d9:13:ce:0d:5e:10:56:8a:8a:77:e2:58:61:67:e7
1570
+ -----BEGIN CERTIFICATE-----
1571
+ MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTEL
1572
+ MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV
1573
+ BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1
1574
+ c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcNMDYwMzIyMTU1NDI4WhcNMjUxMjMx
1575
+ MjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIg
1576
+ R21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYwJAYD
1577
+ VQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcN
1578
+ AQEBBQADggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSR
1579
+ JJZ4Hgmgm5qVSkr1YnwCqMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3T
1580
+ fCZdzHd55yx4Oagmcw6iXSVphU9VDprvxrlE4Vc93x9UIuVvZaozhDrzznq+VZeu
1581
+ jRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtwag+1m7Z3W0hZneTvWq3z
1582
+ wZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9OgdwZu5GQ
1583
+ fezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYD
1584
+ VR0jBBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAO
1585
+ BgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0G
1586
+ CSqGSIb3DQEBBQUAA4IBAQAo0uCG1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X1
1587
+ 7caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/CyvwbZ71q+s2IhtNerNXxTPqYn
1588
+ 8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3ghUJGooWMNjs
1589
+ ydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT
1590
+ ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/
1591
+ 2TYcuiUaUj0a7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY
1592
+ -----END CERTIFICATE-----
1593
+
1594
+ # Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc
1595
+ # Subject: CN=Cybertrust Global Root O=Cybertrust, Inc
1596
+ # Label: "Cybertrust Global Root"
1597
+ # Serial: 4835703278459682877484360
1598
+ # MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1
1599
+ # SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6
1600
+ # SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3
1601
+ -----BEGIN CERTIFICATE-----
1602
+ MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG
1603
+ A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh
1604
+ bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE
1605
+ ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS
1606
+ b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5
1607
+ 7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS
1608
+ J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y
1609
+ HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP
1610
+ t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz
1611
+ FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY
1612
+ XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/
1613
+ MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw
1614
+ hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js
1615
+ MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA
1616
+ A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj
1617
+ Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx
1618
+ XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o
1619
+ omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc
1620
+ A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
1621
+ WL1WMRJOEcgh4LMRkWXbtKaIOM5V
1622
+ -----END CERTIFICATE-----
1623
+
1624
+ # Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only
1625
+ # Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only
1626
+ # Label: "GeoTrust Primary Certification Authority - G3"
1627
+ # Serial: 28809105769928564313984085209975885599
1628
+ # MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05
1629
+ # SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd
1630
+ # SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4
1631
+ -----BEGIN CERTIFICATE-----
1632
+ MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB
1633
+ mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT
1634
+ MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s
1635
+ eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv
1636
+ cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ
1637
+ BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
1638
+ MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0
1639
+ BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
1640
+ LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz
1641
+ +uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm
1642
+ hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn
1643
+ 5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W
1644
+ JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL
1645
+ DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC
1646
+ huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw
1647
+ HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB
1648
+ AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB
1649
+ zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN
1650
+ kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
1651
+ AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH
1652
+ SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G
1653
+ spki4cErx5z481+oghLrGREt
1654
+ -----END CERTIFICATE-----
1655
+
1656
+ # Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only
1657
+ # Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only
1658
+ # Label: "thawte Primary Root CA - G2"
1659
+ # Serial: 71758320672825410020661621085256472406
1660
+ # MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f
1661
+ # SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12
1662
+ # SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57
1663
+ -----BEGIN CERTIFICATE-----
1664
+ MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL
1665
+ MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp
1666
+ IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi
1667
+ BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw
1668
+ MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
1669
+ d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig
1670
+ YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v
1671
+ dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/
1672
+ BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6
1673
+ papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E
1674
+ BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K
1675
+ DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3
1676
+ KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox
1677
+ XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
1678
+ -----END CERTIFICATE-----
1679
+
1680
+ # Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only
1681
+ # Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only
1682
+ # Label: "thawte Primary Root CA - G3"
1683
+ # Serial: 127614157056681299805556476275995414779
1684
+ # MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31
1685
+ # SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2
1686
+ # SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c
1687
+ -----BEGIN CERTIFICATE-----
1688
+ MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB
1689
+ rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
1690
+ Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
1691
+ MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV
1692
+ BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa
1693
+ Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl
1694
+ LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u
1695
+ MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl
1696
+ ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz
1697
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm
1698
+ gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8
1699
+ YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf
1700
+ b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9
1701
+ 9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S
1702
+ zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk
1703
+ OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV
1704
+ HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA
1705
+ 2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW
1706
+ oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
1707
+ t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c
1708
+ KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM
1709
+ m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu
1710
+ MdRAGmI0Nj81Aa6sY6A=
1711
+ -----END CERTIFICATE-----
1712
+
1713
+ # Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only
1714
+ # Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only
1715
+ # Label: "GeoTrust Primary Certification Authority - G2"
1716
+ # Serial: 80682863203381065782177908751794619243
1717
+ # MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a
1718
+ # SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0
1719
+ # SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66
1720
+ -----BEGIN CERTIFICATE-----
1721
+ MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL
1722
+ MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj
1723
+ KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2
1724
+ MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
1725
+ eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV
1726
+ BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw
1727
+ NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV
1728
+ BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH
1729
+ MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL
1730
+ So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal
1731
+ tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
1732
+ BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG
1733
+ CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT
1734
+ qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz
1735
+ rD6ogRLQy7rQkgu2npaqBA+K
1736
+ -----END CERTIFICATE-----
1737
+
1738
+ # Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only
1739
+ # Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only
1740
+ # Label: "VeriSign Universal Root Certification Authority"
1741
+ # Serial: 85209574734084581917763752644031726877
1742
+ # MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19
1743
+ # SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54
1744
+ # SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c
1745
+ -----BEGIN CERTIFICATE-----
1746
+ MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB
1747
+ vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
1748
+ ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp
1749
+ U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W
1750
+ ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
1751
+ Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX
1752
+ MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0
1753
+ IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y
1754
+ IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh
1755
+ bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
1756
+ AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF
1757
+ 9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH
1758
+ H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H
1759
+ LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN
1760
+ /BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT
1761
+ rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud
1762
+ EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw
1763
+ WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs
1764
+ exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
1765
+ DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4
1766
+ sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+
1767
+ seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz
1768
+ 4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+
1769
+ BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR
1770
+ lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3
1771
+ 7M2CYfE45k+XmCpajQ==
1772
+ -----END CERTIFICATE-----
1773
+
1774
+ # Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only
1775
+ # Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only
1776
+ # Label: "VeriSign Class 3 Public Primary Certification Authority - G4"
1777
+ # Serial: 63143484348153506665311985501458640051
1778
+ # MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41
1779
+ # SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a
1780
+ # SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79
1781
+ -----BEGIN CERTIFICATE-----
1782
+ MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL
1783
+ MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
1784
+ ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln
1785
+ biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
1786
+ U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
1787
+ aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG
1788
+ A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp
1789
+ U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg
1790
+ SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln
1791
+ biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
1792
+ IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm
1793
+ GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve
1794
+ fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw
1795
+ AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ
1796
+ aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj
1797
+ aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW
1798
+ kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC
1799
+ 4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga
1800
+ FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
1801
+ -----END CERTIFICATE-----
1802
+
1803
+ # Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority
1804
+ # Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority
1805
+ # Label: "Verisign Class 3 Public Primary Certification Authority"
1806
+ # Serial: 80507572722862485515306429940691309246
1807
+ # MD5 Fingerprint: ef:5a:f1:33:ef:f1:cd:bb:51:02:ee:12:14:4b:96:c4
1808
+ # SHA1 Fingerprint: a1:db:63:93:91:6f:17:e4:18:55:09:40:04:15:c7:02:40:b0:ae:6b
1809
+ # SHA256 Fingerprint: a4:b6:b3:99:6f:c2:f3:06:b3:fd:86:81:bd:63:41:3d:8c:50:09:cc:4f:a3:29:c2:cc:f0:e2:fa:1b:14:03:05
1810
+ -----BEGIN CERTIFICATE-----
1811
+ MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG
1812
+ A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
1813
+ cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
1814
+ MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
1815
+ BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt
1816
+ YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
1817
+ ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE
1818
+ BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is
1819
+ I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G
1820
+ CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i
1821
+ 2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ
1822
+ 2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ
1823
+ -----END CERTIFICATE-----
1824
+
1825
+ # Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3
1826
+ # Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3
1827
+ # Label: "GlobalSign Root CA - R3"
1828
+ # Serial: 4835703278459759426209954
1829
+ # MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28
1830
+ # SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad
1831
+ # SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b
1832
+ -----BEGIN CERTIFICATE-----
1833
+ MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G
1834
+ A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp
1835
+ Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4
1836
+ MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG
1837
+ A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
1838
+ hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8
1839
+ RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT
1840
+ gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm
1841
+ KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd
1842
+ QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ
1843
+ XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw
1844
+ DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o
1845
+ LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU
1846
+ RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp
1847
+ jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK
1848
+ 6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX
1849
+ mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs
1850
+ Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH
1851
+ WD9f
1852
+ -----END CERTIFICATE-----
1853
+
1854
+ # Issuer: CN=TC TrustCenter Universal CA III O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA
1855
+ # Subject: CN=TC TrustCenter Universal CA III O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA
1856
+ # Label: "TC TrustCenter Universal CA III"
1857
+ # Serial: 2010889993983507346460533407902964
1858
+ # MD5 Fingerprint: 9f:dd:db:ab:ff:8e:ff:45:21:5f:f0:6c:9d:8f:fe:2b
1859
+ # SHA1 Fingerprint: 96:56:cd:7b:57:96:98:95:d0:e1:41:46:68:06:fb:b8:c6:11:06:87
1860
+ # SHA256 Fingerprint: 30:9b:4a:87:f6:ca:56:c9:31:69:aa:a9:9c:6d:98:88:54:d7:89:2b:d5:43:7e:2d:07:b2:9c:be:da:55:d3:5d
1861
+ -----BEGIN CERTIFICATE-----
1862
+ MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezEL
1863
+ MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV
1864
+ BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1
1865
+ c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAeFw0wOTA5MDkwODE1MjdaFw0yOTEy
1866
+ MzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNUQyBUcnVzdENlbnRl
1867
+ ciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0ExKDAm
1868
+ BgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqG
1869
+ SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF
1870
+ 5+cvAqBNLaT6hdqbJYUtQCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYv
1871
+ DIRlzg9uwliT6CwLOunBjvvya8o84pxOjuT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8v
1872
+ zArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+EutCHnNaYlAJ/Uqwa1D7KRT
1873
+ yGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1M4BDj5yj
1874
+ dipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBh
1875
+ MB8GA1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMB
1876
+ Af8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI
1877
+ 4jANBgkqhkiG9w0BAQUFAAOCAQEAg8ev6n9NCjw5sWi+e22JLumzCecYV42Fmhfz
1878
+ dkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+KGwWaODIl0YgoGhnYIg5IFHY
1879
+ aAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhKBgePxLcHsU0G
1880
+ DeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV
1881
+ CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPH
1882
+ LQNjO9Po5KIqwoIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg==
1883
+ -----END CERTIFICATE-----
1884
+
1885
+ # Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc.
1886
+ # Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc.
1887
+ # Label: "Go Daddy Root Certificate Authority - G2"
1888
+ # Serial: 0
1889
+ # MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01
1890
+ # SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b
1891
+ # SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da
1892
+ -----BEGIN CERTIFICATE-----
1893
+ MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx
1894
+ EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT
1895
+ EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp
1896
+ ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz
1897
+ NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH
1898
+ EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE
1899
+ AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw
1900
+ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD
1901
+ E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH
1902
+ /PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy
1903
+ DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh
1904
+ GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR
1905
+ tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA
1906
+ AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE
1907
+ FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX
1908
+ WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu
1909
+ 9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr
1910
+ gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo
1911
+ 2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
1912
+ LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI
1913
+ 4uJEvlz36hz1
1914
+ -----END CERTIFICATE-----
1915
+
1916
+ # Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc.
1917
+ # Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc.
1918
+ # Label: "Starfield Root Certificate Authority - G2"
1919
+ # Serial: 0
1920
+ # MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96
1921
+ # SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e
1922
+ # SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5
1923
+ -----BEGIN CERTIFICATE-----
1924
+ MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx
1925
+ EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
1926
+ HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs
1927
+ ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw
1928
+ MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
1929
+ b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj
1930
+ aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp
1931
+ Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
1932
+ ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg
1933
+ nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1
1934
+ HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N
1935
+ Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN
1936
+ dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0
1937
+ HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
1938
+ BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G
1939
+ CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU
1940
+ sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3
1941
+ 4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg
1942
+ 8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
1943
+ pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1
1944
+ mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
1945
+ -----END CERTIFICATE-----
1946
+
1947
+ # Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc.
1948
+ # Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc.
1949
+ # Label: "Starfield Services Root Certificate Authority - G2"
1950
+ # Serial: 0
1951
+ # MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2
1952
+ # SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f
1953
+ # SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5
1954
+ -----BEGIN CERTIFICATE-----
1955
+ MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx
1956
+ EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
1957
+ HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs
1958
+ ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
1959
+ MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD
1960
+ VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy
1961
+ ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy
1962
+ dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
1963
+ hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p
1964
+ OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2
1965
+ 8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K
1966
+ Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe
1967
+ hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk
1968
+ 6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw
1969
+ DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q
1970
+ AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI
1971
+ bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB
1972
+ ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z
1973
+ qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
1974
+ iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn
1975
+ 0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN
1976
+ sSi6
1977
+ -----END CERTIFICATE-----
1978
+
1979
+ # Issuer: CN=AffirmTrust Commercial O=AffirmTrust
1980
+ # Subject: CN=AffirmTrust Commercial O=AffirmTrust
1981
+ # Label: "AffirmTrust Commercial"
1982
+ # Serial: 8608355977964138876
1983
+ # MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7
1984
+ # SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7
1985
+ # SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7
1986
+ -----BEGIN CERTIFICATE-----
1987
+ MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE
1988
+ BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
1989
+ dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL
1990
+ MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
1991
+ cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
1992
+ AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP
1993
+ Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr
1994
+ ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL
1995
+ MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1
1996
+ yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr
1997
+ VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/
1998
+ nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
1999
+ KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG
2000
+ XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj
2001
+ vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt
2002
+ Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g
2003
+ N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC
2004
+ nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
2005
+ -----END CERTIFICATE-----
2006
+
2007
+ # Issuer: CN=AffirmTrust Networking O=AffirmTrust
2008
+ # Subject: CN=AffirmTrust Networking O=AffirmTrust
2009
+ # Label: "AffirmTrust Networking"
2010
+ # Serial: 8957382827206547757
2011
+ # MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f
2012
+ # SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f
2013
+ # SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b
2014
+ -----BEGIN CERTIFICATE-----
2015
+ MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE
2016
+ BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
2017
+ dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL
2018
+ MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
2019
+ cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
2020
+ AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y
2021
+ YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua
2022
+ kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL
2023
+ QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp
2024
+ 6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG
2025
+ yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i
2026
+ QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
2027
+ KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO
2028
+ tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu
2029
+ QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ
2030
+ Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u
2031
+ olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48
2032
+ x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
2033
+ -----END CERTIFICATE-----
2034
+
2035
+ # Issuer: CN=AffirmTrust Premium O=AffirmTrust
2036
+ # Subject: CN=AffirmTrust Premium O=AffirmTrust
2037
+ # Label: "AffirmTrust Premium"
2038
+ # Serial: 7893706540734352110
2039
+ # MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57
2040
+ # SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27
2041
+ # SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a
2042
+ -----BEGIN CERTIFICATE-----
2043
+ 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
2071
+ KeC2uAloGRwYQw==
2072
+ -----END CERTIFICATE-----
2073
+
2074
+ # Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust
2075
+ # Subject: CN=AffirmTrust Premium ECC O=AffirmTrust
2076
+ # Label: "AffirmTrust Premium ECC"
2077
+ # Serial: 8401224907861490260
2078
+ # MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d
2079
+ # SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb
2080
+ # SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23
2081
+ -----BEGIN CERTIFICATE-----
2082
+ MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC
2083
+ VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ
2084
+ cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ
2085
+ BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt
2086
+ VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D
2087
+ 0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9
2088
+ ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G
2089
+ A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G
2090
+ A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs
2091
+ aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I
2092
+ flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ==
2093
+ -----END CERTIFICATE-----
2094
+
2095
+ # Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing
2096
+ # Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing
2097
+ # Label: "StartCom Certification Authority"
2098
+ # Serial: 45
2099
+ # MD5 Fingerprint: c9:3b:0d:84:41:fc:a4:76:79:23:08:57:de:10:19:16
2100
+ # SHA1 Fingerprint: a3:f1:33:3f:e2:42:bf:cf:c5:d1:4e:8f:39:42:98:40:68:10:d1:a0
2101
+ # SHA256 Fingerprint: e1:78:90:ee:09:a3:fb:f4:f4:8b:9c:41:4a:17:d6:37:b7:a5:06:47:e9:bc:75:23:22:72:7f:cc:17:42:a9:11
2102
+ -----BEGIN CERTIFICATE-----
2103
+ MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW
2104
+ MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg
2105
+ Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh
2106
+ dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM3WhcNMzYwOTE3MTk0NjM2WjB9
2107
+ MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi
2108
+ U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh
2109
+ cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA
2110
+ A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk
2111
+ pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf
2112
+ OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C
2113
+ Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT
2114
+ Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi
2115
+ HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM
2116
+ Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w
2117
+ +2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+
2118
+ Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3
2119
+ Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B
2120
+ 26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID
2121
+ AQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
2122
+ VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFul
2123
+ F2mHMMo0aEPQQa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCC
2124
+ ATgwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5w
2125
+ ZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVk
2126
+ aWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENvbW1lcmNpYWwgKFN0
2127
+ YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0aGUg
2128
+ c2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0
2129
+ aWZpY2F0aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93
2130
+ d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgG
2131
+ CWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1
2132
+ dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5fPGFf59Jb2vKXfuM/gTF
2133
+ wWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWmN3PH/UvS
2134
+ Ta0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst
2135
+ 0OcNOrg+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNc
2136
+ pRJvkrKTlMeIFw6Ttn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKl
2137
+ CcWw0bdT82AUuoVpaiF8H3VhFyAXe2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVF
2138
+ P0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA2MFrLH9ZXF2RsXAiV+uKa0hK
2139
+ 1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBsHvUwyKMQ5bLm
2140
+ KhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE
2141
+ JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ
2142
+ 8dCAWZvLMdibD4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnm
2143
+ fyWl8kgAwKQB2j8=
2144
+ -----END CERTIFICATE-----
2145
+
2146
+ # Issuer: CN=StartCom Certification Authority G2 O=StartCom Ltd.
2147
+ # Subject: CN=StartCom Certification Authority G2 O=StartCom Ltd.
2148
+ # Label: "StartCom Certification Authority G2"
2149
+ # Serial: 59
2150
+ # MD5 Fingerprint: 78:4b:fb:9e:64:82:0a:d3:b8:4c:62:f3:64:f2:90:64
2151
+ # SHA1 Fingerprint: 31:f1:fd:68:22:63:20:ee:c6:3b:3f:9d:ea:4a:3e:53:7c:7c:39:17
2152
+ # SHA256 Fingerprint: c7:ba:65:67:de:93:a7:98:ae:1f:aa:79:1e:71:2d:37:8f:ae:1f:93:c4:39:7f:ea:44:1b:b7:cb:e6:fd:59:95
2153
+ -----BEGIN CERTIFICATE-----
2154
+ MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEW
2155
+ MBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlm
2156
+ aWNhdGlvbiBBdXRob3JpdHkgRzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1
2157
+ OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoG
2158
+ A1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRzIwggIiMA0G
2159
+ CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8Oo1XJ
2160
+ JZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsD
2161
+ vfOpL9HG4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnoo
2162
+ D/Uefyf3lLE3PbfHkffiAez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/
2163
+ Q0kGi4xDuFby2X8hQxfqp0iVAXV16iulQ5XqFYSdCI0mblWbq9zSOdIxHWDirMxW
2164
+ RST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbsO+wmETRIjfaAKxojAuuK
2165
+ HDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8HvKTlXcxN
2166
+ nw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM
2167
+ 0D4LnMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/i
2168
+ UUjXuG+v+E5+M5iSFGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9
2169
+ Ha90OrInwMEePnWjFqmveiJdnxMaz6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHg
2170
+ TuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
2171
+ AwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJKoZIhvcNAQEL
2172
+ BQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K
2173
+ 2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfX
2174
+ UfEpY9Z1zRbkJ4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl
2175
+ 6/2o1PXWT6RbdejF0mCy2wl+JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK
2176
+ 9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG/+gyRr61M3Z3qAFdlsHB1b6uJcDJ
2177
+ HgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTcnIhT76IxW1hPkWLI
2178
+ wpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/XldblhY
2179
+ XzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5l
2180
+ IxKVCCIcl85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoo
2181
+ hdVddLHRDiBYmxOlsGOm7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulr
2182
+ so8uBtjRkcfGEvRM/TAXw8HaOFvjqermobp573PYtlNXLfbQ4ddI
2183
+ -----END CERTIFICATE-----
app/api/Google/Logger/Abstract.php ADDED
@@ -0,0 +1,408 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2014 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ if (!class_exists('Google_Client')) {
19
+ require_once dirname(__FILE__) . '/../autoload.php';
20
+ }
21
+
22
+ /**
23
+ * Abstract logging class based on the PSR-3 standard.
24
+ *
25
+ * NOTE: We don't implement `Psr\Log\LoggerInterface` because we need to
26
+ * maintain PHP 5.2 support.
27
+ *
28
+ * @see https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md
29
+ */
30
+ abstract class Google_Logger_Abstract
31
+ {
32
+ /**
33
+ * Default log format
34
+ */
35
+ const DEFAULT_LOG_FORMAT = "[%datetime%] %level%: %message% %context%\n";
36
+ /**
37
+ * Default date format
38
+ *
39
+ * Example: 16/Nov/2014:03:26:16 -0500
40
+ */
41
+ const DEFAULT_DATE_FORMAT = 'd/M/Y:H:i:s O';
42
+
43
+ /**
44
+ * System is unusable
45
+ */
46
+ const EMERGENCY = 'emergency';
47
+ /**
48
+ * Action must be taken immediately
49
+ *
50
+ * Example: Entire website down, database unavailable, etc. This should
51
+ * trigger the SMS alerts and wake you up.
52
+ */
53
+ const ALERT = 'alert';
54
+ /**
55
+ * Critical conditions
56
+ *
57
+ * Example: Application component unavailable, unexpected exception.
58
+ */
59
+ const CRITICAL = 'critical';
60
+ /**
61
+ * Runtime errors that do not require immediate action but should typically
62
+ * be logged and monitored.
63
+ */
64
+ const ERROR = 'error';
65
+ /**
66
+ * Exceptional occurrences that are not errors.
67
+ *
68
+ * Example: Use of deprecated APIs, poor use of an API, undesirable things
69
+ * that are not necessarily wrong.
70
+ */
71
+ const WARNING = 'warning';
72
+ /**
73
+ * Normal but significant events.
74
+ */
75
+ const NOTICE = 'notice';
76
+ /**
77
+ * Interesting events.
78
+ *
79
+ * Example: User logs in, SQL logs.
80
+ */
81
+ const INFO = 'info';
82
+ /**
83
+ * Detailed debug information.
84
+ */
85
+ const DEBUG = 'debug';
86
+
87
+ /**
88
+ * @var array $levels Logging levels
89
+ */
90
+ protected static $levels = array(
91
+ self::EMERGENCY => 600,
92
+ self::ALERT => 550,
93
+ self::CRITICAL => 500,
94
+ self::ERROR => 400,
95
+ self::WARNING => 300,
96
+ self::NOTICE => 250,
97
+ self::INFO => 200,
98
+ self::DEBUG => 100,
99
+ );
100
+
101
+ /**
102
+ * @var integer $level The minimum logging level
103
+ */
104
+ protected $level = self::DEBUG;
105
+
106
+ /**
107
+ * @var string $logFormat The current log format
108
+ */
109
+ protected $logFormat = self::DEFAULT_LOG_FORMAT;
110
+ /**
111
+ * @var string $dateFormat The current date format
112
+ */
113
+ protected $dateFormat = self::DEFAULT_DATE_FORMAT;
114
+
115
+ /**
116
+ * @var boolean $allowNewLines If newlines are allowed
117
+ */
118
+ protected $allowNewLines = false;
119
+
120
+ /**
121
+ * @param Google_Client $client The current Google client
122
+ */
123
+ public function __construct(Google_Client $client)
124
+ {
125
+ $this->setLevel(
126
+ $client->getClassConfig('Google_Logger_Abstract', 'level')
127
+ );
128
+
129
+ $format = $client->getClassConfig('Google_Logger_Abstract', 'log_format');
130
+ $this->logFormat = $format ? $format : self::DEFAULT_LOG_FORMAT;
131
+
132
+ $format = $client->getClassConfig('Google_Logger_Abstract', 'date_format');
133
+ $this->dateFormat = $format ? $format : self::DEFAULT_DATE_FORMAT;
134
+
135
+ $this->allowNewLines = (bool) $client->getClassConfig(
136
+ 'Google_Logger_Abstract',
137
+ 'allow_newlines'
138
+ );
139
+ }
140
+
141
+ /**
142
+ * Sets the minimum logging level that this logger handles.
143
+ *
144
+ * @param integer $level
145
+ */
146
+ public function setLevel($level)
147
+ {
148
+ $this->level = $this->normalizeLevel($level);
149
+ }
150
+
151
+ /**
152
+ * Checks if the logger should handle messages at the provided level.
153
+ *
154
+ * @param integer $level
155
+ * @return boolean
156
+ */
157
+ public function shouldHandle($level)
158
+ {
159
+ return $this->normalizeLevel($level) >= $this->level;
160
+ }
161
+
162
+ /**
163
+ * System is unusable.
164
+ *
165
+ * @param string $message The log message
166
+ * @param array $context The log context
167
+ */
168
+ public function emergency($message, array $context = array())
169
+ {
170
+ $this->log(self::EMERGENCY, $message, $context);
171
+ }
172
+
173
+ /**
174
+ * Action must be taken immediately.
175
+ *
176
+ * Example: Entire website down, database unavailable, etc. This should
177
+ * trigger the SMS alerts and wake you up.
178
+ *
179
+ * @param string $message The log message
180
+ * @param array $context The log context
181
+ */
182
+ public function alert($message, array $context = array())
183
+ {
184
+ $this->log(self::ALERT, $message, $context);
185
+ }
186
+
187
+ /**
188
+ * Critical conditions.
189
+ *
190
+ * Example: Application component unavailable, unexpected exception.
191
+ *
192
+ * @param string $message The log message
193
+ * @param array $context The log context
194
+ */
195
+ public function critical($message, array $context = array())
196
+ {
197
+ $this->log(self::CRITICAL, $message, $context);
198
+ }
199
+
200
+ /**
201
+ * Runtime errors that do not require immediate action but should typically
202
+ * be logged and monitored.
203
+ *
204
+ * @param string $message The log message
205
+ * @param array $context The log context
206
+ */
207
+ public function error($message, array $context = array())
208
+ {
209
+ $this->log(self::ERROR, $message, $context);
210
+ }
211
+
212
+ /**
213
+ * Exceptional occurrences that are not errors.
214
+ *
215
+ * Example: Use of deprecated APIs, poor use of an API, undesirable things
216
+ * that are not necessarily wrong.
217
+ *
218
+ * @param string $message The log message
219
+ * @param array $context The log context
220
+ */
221
+ public function warning($message, array $context = array())
222
+ {
223
+ $this->log(self::WARNING, $message, $context);
224
+ }
225
+
226
+ /**
227
+ * Normal but significant events.
228
+ *
229
+ * @param string $message The log message
230
+ * @param array $context The log context
231
+ */
232
+ public function notice($message, array $context = array())
233
+ {
234
+ $this->log(self::NOTICE, $message, $context);
235
+ }
236
+
237
+ /**
238
+ * Interesting events.
239
+ *
240
+ * Example: User logs in, SQL logs.
241
+ *
242
+ * @param string $message The log message
243
+ * @param array $context The log context
244
+ */
245
+ public function info($message, array $context = array())
246
+ {
247
+ $this->log(self::INFO, $message, $context);
248
+ }
249
+
250
+ /**
251
+ * Detailed debug information.
252
+ *
253
+ * @param string $message The log message
254
+ * @param array $context The log context
255
+ */
256
+ public function debug($message, array $context = array())
257
+ {
258
+ $this->log(self::DEBUG, $message, $context);
259
+ }
260
+
261
+ /**
262
+ * Logs with an arbitrary level.
263
+ *
264
+ * @param mixed $level The log level
265
+ * @param string $message The log message
266
+ * @param array $context The log context
267
+ */
268
+ public function log($level, $message, array $context = array())
269
+ {
270
+ if (!$this->shouldHandle($level)) {
271
+ return false;
272
+ }
273
+
274
+ $levelName = is_int($level) ? array_search($level, self::$levels) : $level;
275
+ $message = $this->interpolate(
276
+ array(
277
+ 'message' => $message,
278
+ 'context' => $context,
279
+ 'level' => strtoupper($levelName),
280
+ 'datetime' => new DateTime(),
281
+ )
282
+ );
283
+
284
+ $this->write($message);
285
+ }
286
+
287
+ /**
288
+ * Interpolates log variables into the defined log format.
289
+ *
290
+ * @param array $variables The log variables.
291
+ * @return string
292
+ */
293
+ protected function interpolate(array $variables = array())
294
+ {
295
+ $template = $this->logFormat;
296
+
297
+ if (!$variables['context']) {
298
+ $template = str_replace('%context%', '', $template);
299
+ unset($variables['context']);
300
+ } else {
301
+ $this->reverseJsonInContext($variables['context']);
302
+ }
303
+
304
+ foreach ($variables as $key => $value) {
305
+ if (strpos($template, '%'. $key .'%') !== false) {
306
+ $template = str_replace(
307
+ '%' . $key . '%',
308
+ $this->export($value),
309
+ $template
310
+ );
311
+ }
312
+ }
313
+
314
+ return $template;
315
+ }
316
+
317
+ /**
318
+ * Reverses JSON encoded PHP arrays and objects so that they log better.
319
+ *
320
+ * @param array $context The log context
321
+ */
322
+ protected function reverseJsonInContext(array &$context)
323
+ {
324
+ if (!$context) {
325
+ return;
326
+ }
327
+
328
+ foreach ($context as $key => $val) {
329
+ if (!$val || !is_string($val) || !($val[0] == '{' || $val[0] == '[')) {
330
+ continue;
331
+ }
332
+
333
+ $json = @json_decode($val);
334
+ if (is_object($json) || is_array($json)) {
335
+ $context[$key] = $json;
336
+ }
337
+ }
338
+ }
339
+
340
+ /**
341
+ * Exports a PHP value for logging to a string.
342
+ *
343
+ * @param mixed $value The value to
344
+ */
345
+ protected function export($value)
346
+ {
347
+ if (is_string($value)) {
348
+ if ($this->allowNewLines) {
349
+ return $value;
350
+ }
351
+
352
+ return preg_replace('/[\r\n]+/', ' ', $value);
353
+ }
354
+
355
+ if (is_resource($value)) {
356
+ return sprintf(
357
+ 'resource(%d) of type (%s)',
358
+ $value,
359
+ get_resource_type($value)
360
+ );
361
+ }
362
+
363
+ if ($value instanceof DateTime) {
364
+ return $value->format($this->dateFormat);
365
+ }
366
+
367
+ if (version_compare(PHP_VERSION, '5.4.0', '>=')) {
368
+ $options = JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE;
369
+
370
+ if ($this->allowNewLines) {
371
+ $options |= JSON_PRETTY_PRINT;
372
+ }
373
+
374
+ return @json_encode($value, $options);
375
+ }
376
+
377
+ return str_replace('\\/', '/', @json_encode($value));
378
+ }
379
+
380
+ /**
381
+ * Converts a given log level to the integer form.
382
+ *
383
+ * @param mixed $level The logging level
384
+ * @return integer $level The normalized level
385
+ * @throws Google_Logger_Exception If $level is invalid
386
+ */
387
+ protected function normalizeLevel($level)
388
+ {
389
+ if (is_int($level) && array_search($level, self::$levels) !== false) {
390
+ return $level;
391
+ }
392
+
393
+ if (is_string($level) && isset(self::$levels[$level])) {
394
+ return self::$levels[$level];
395
+ }
396
+
397
+ throw new Google_Logger_Exception(
398
+ sprintf("Unknown LogLevel: '%s'", $level)
399
+ );
400
+ }
401
+
402
+ /**
403
+ * Writes a message to the current log implementation.
404
+ *
405
+ * @param string $message The message
406
+ */
407
+ abstract protected function write($message);
408
+ }
app/api/Google/Logger/Exception.php ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2014 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ if (!class_exists('Google_Client')) {
19
+ require_once dirname(__FILE__) . '/../autoload.php';
20
+ }
21
+
22
+ class Google_Logger_Exception extends Google_Exception
23
+ {
24
+ }
app/api/Google/Logger/File.php ADDED
@@ -0,0 +1,158 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2014 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ if (!class_exists('Google_Client')) {
19
+ require_once dirname(__FILE__) . '/../autoload.php';
20
+ }
21
+
22
+ /**
23
+ * File logging class based on the PSR-3 standard.
24
+ *
25
+ * This logger writes to a PHP stream resource.
26
+ */
27
+ class Google_Logger_File extends Google_Logger_Abstract
28
+ {
29
+ /**
30
+ * @var string|resource $file Where logs are written
31
+ */
32
+ private $file;
33
+ /**
34
+ * @var integer $mode The mode to use if the log file needs to be created
35
+ */
36
+ private $mode = 0640;
37
+ /**
38
+ * @var boolean $lock If a lock should be attempted before writing to the log
39
+ */
40
+ private $lock = false;
41
+
42
+ /**
43
+ * @var integer $trappedErrorNumber Trapped error number
44
+ */
45
+ private $trappedErrorNumber;
46
+ /**
47
+ * @var string $trappedErrorString Trapped error string
48
+ */
49
+ private $trappedErrorString;
50
+
51
+ /**
52
+ * {@inheritdoc}
53
+ */
54
+ public function __construct(Google_Client $client)
55
+ {
56
+ parent::__construct($client);
57
+
58
+ $file = $client->getClassConfig('Google_Logger_File', 'file');
59
+ if (!is_string($file) && !is_resource($file)) {
60
+ throw new Google_Logger_Exception(
61
+ 'File logger requires a filename or a valid file pointer'
62
+ );
63
+ }
64
+
65
+ $mode = $client->getClassConfig('Google_Logger_File', 'mode');
66
+ if (!$mode) {
67
+ $this->mode = $mode;
68
+ }
69
+
70
+ $this->lock = (bool) $client->getClassConfig('Google_Logger_File', 'lock');
71
+ $this->file = $file;
72
+ }
73
+
74
+ /**
75
+ * {@inheritdoc}
76
+ */
77
+ protected function write($message)
78
+ {
79
+ if (is_string($this->file)) {
80
+ $this->open();
81
+ } elseif (!is_resource($this->file)) {
82
+ throw new Google_Logger_Exception('File pointer is no longer available');
83
+ }
84
+
85
+ if ($this->lock) {
86
+ flock($this->file, LOCK_EX);
87
+ }
88
+
89
+ fwrite($this->file, (string) $message);
90
+
91
+ if ($this->lock) {
92
+ flock($this->file, LOCK_UN);
93
+ }
94
+ }
95
+
96
+ /**
97
+ * Opens the log for writing.
98
+ *
99
+ * @return resource
100
+ */
101
+ private function open()
102
+ {
103
+ // Used for trapping `fopen()` errors.
104
+ $this->trappedErrorNumber = null;
105
+ $this->trappedErrorString = null;
106
+
107
+ $old = set_error_handler(array($this, 'trapError'));
108
+
109
+ $needsChmod = !file_exists($this->file);
110
+ $fh = fopen($this->file, 'a');
111
+
112
+ restore_error_handler();
113
+
114
+ // Handles trapped `fopen()` errors.
115
+ if ($this->trappedErrorNumber) {
116
+ throw new Google_Logger_Exception(
117
+ sprintf(
118
+ "Logger Error: '%s'",
119
+ $this->trappedErrorString
120
+ ),
121
+ $this->trappedErrorNumber
122
+ );
123
+ }
124
+
125
+ if ($needsChmod) {
126
+ @chmod($this->file, $this->mode & ~umask());
127
+ }
128
+
129
+ return $this->file = $fh;
130
+ }
131
+
132
+ /**
133
+ * Closes the log stream resource.
134
+ */
135
+ private function close()
136
+ {
137
+ if (is_resource($this->file)) {
138
+ fclose($this->file);
139
+ }
140
+ }
141
+
142
+ /**
143
+ * Traps `fopen()` errors.
144
+ *
145
+ * @param integer $errno The error number
146
+ * @param string $errstr The error string
147
+ */
148
+ private function trapError($errno, $errstr)
149
+ {
150
+ $this->trappedErrorNumber = $errno;
151
+ $this->trappedErrorString = $errstr;
152
+ }
153
+
154
+ public function __destruct()
155
+ {
156
+ $this->close();
157
+ }
158
+ }
app/api/Google/Logger/Null.php ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2014 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ if (!class_exists('Google_Client')) {
19
+ require_once dirname(__FILE__) . '/../autoload.php';
20
+ }
21
+
22
+ /**
23
+ * Null logger based on the PSR-3 standard.
24
+ *
25
+ * This logger simply discards all messages.
26
+ */
27
+ class Google_Logger_Null extends Google_Logger_Abstract
28
+ {
29
+ /**
30
+ * {@inheritdoc}
31
+ */
32
+ public function shouldHandle($level)
33
+ {
34
+ return false;
35
+ }
36
+
37
+ /**
38
+ * {@inheritdoc}
39
+ */
40
+ protected function write($message, array $context = array())
41
+ {
42
+ }
43
+ }
app/api/Google/Logger/Psr.php ADDED
@@ -0,0 +1,93 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2014 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ if (!class_exists('Google_Client')) {
19
+ require_once dirname(__FILE__) . '/../autoload.php';
20
+ }
21
+
22
+ /**
23
+ * Psr logging class based on the PSR-3 standard.
24
+ *
25
+ * This logger will delegate all logging to a PSR-3 compatible logger specified
26
+ * with the `Google_Logger_Psr::setLogger()` method.
27
+ */
28
+ class Google_Logger_Psr extends Google_Logger_Abstract
29
+ {
30
+ /**
31
+ * @param Psr\Log\LoggerInterface $logger The PSR-3 logger
32
+ */
33
+ private $logger;
34
+
35
+ /**
36
+ * @param Google_Client $client The current Google client
37
+ * @param Psr\Log\LoggerInterface $logger PSR-3 logger where logging will be delegated.
38
+ */
39
+ public function __construct(Google_Client $client, /*Psr\Log\LoggerInterface*/ $logger = null)
40
+ {
41
+ parent::__construct($client);
42
+
43
+ if ($logger) {
44
+ $this->setLogger($logger);
45
+ }
46
+ }
47
+
48
+ /**
49
+ * Sets the PSR-3 logger where logging will be delegated.
50
+ *
51
+ * NOTE: The `$logger` should technically implement
52
+ * `Psr\Log\LoggerInterface`, but we don't explicitly require this so that
53
+ * we can be compatible with PHP 5.2.
54
+ *
55
+ * @param Psr\Log\LoggerInterface $logger The PSR-3 logger
56
+ */
57
+ public function setLogger(/*Psr\Log\LoggerInterface*/ $logger)
58
+ {
59
+ $this->logger = $logger;
60
+ }
61
+
62
+ /**
63
+ * {@inheritdoc}
64
+ */
65
+ public function shouldHandle($level)
66
+ {
67
+ return isset($this->logger) && parent::shouldHandle($level);
68
+ }
69
+
70
+ /**
71
+ * {@inheritdoc}
72
+ */
73
+ public function log($level, $message, array $context = array())
74
+ {
75
+ if (!$this->shouldHandle($level)) {
76
+ return false;
77
+ }
78
+
79
+ if ($context) {
80
+ $this->reverseJsonInContext($context);
81
+ }
82
+
83
+ $levelName = is_int($level) ? array_search($level, self::$levels) : $level;
84
+ $this->logger->log($levelName, $message, $context);
85
+ }
86
+
87
+ /**
88
+ * {@inheritdoc}
89
+ */
90
+ protected function write($message, array $context = array())
91
+ {
92
+ }
93
+ }
app/api/Google/Model.php ADDED
@@ -0,0 +1,295 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2011 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ /**
19
+ * This class defines attributes, valid values, and usage which is generated
20
+ * from a given json schema.
21
+ * http://tools.ietf.org/html/draft-zyp-json-schema-03#section-5
22
+ *
23
+ */
24
+ class Google_Model implements ArrayAccess
25
+ {
26
+ /**
27
+ * If you need to specify a NULL JSON value, use Google_Model::NULL_VALUE
28
+ * instead - it will be replaced when converting to JSON with a real null.
29
+ */
30
+ const NULL_VALUE = "{}gapi-php-null";
31
+ protected $internal_gapi_mappings = array();
32
+ protected $modelData = array();
33
+ protected $processed = array();
34
+
35
+ /**
36
+ * Polymorphic - accepts a variable number of arguments dependent
37
+ * on the type of the model subclass.
38
+ */
39
+ final public function __construct()
40
+ {
41
+ if (func_num_args() == 1 && is_array(func_get_arg(0))) {
42
+ // Initialize the model with the array's contents.
43
+ $array = func_get_arg(0);
44
+ $this->mapTypes($array);
45
+ }
46
+ $this->gapiInit();
47
+ }
48
+
49
+ /**
50
+ * Getter that handles passthrough access to the data array, and lazy object creation.
51
+ * @param string $key Property name.
52
+ * @return mixed The value if any, or null.
53
+ */
54
+ public function __get($key)
55
+ {
56
+ $keyTypeName = $this->keyType($key);
57
+ $keyDataType = $this->dataType($key);
58
+ if (isset($this->$keyTypeName) && !isset($this->processed[$key])) {
59
+ if (isset($this->modelData[$key])) {
60
+ $val = $this->modelData[$key];
61
+ } else if (isset($this->$keyDataType) &&
62
+ ($this->$keyDataType == 'array' || $this->$keyDataType == 'map')) {
63
+ $val = array();
64
+ } else {
65
+ $val = null;
66
+ }
67
+
68
+ if ($this->isAssociativeArray($val)) {
69
+ if (isset($this->$keyDataType) && 'map' == $this->$keyDataType) {
70
+ foreach ($val as $arrayKey => $arrayItem) {
71
+ $this->modelData[$key][$arrayKey] =
72
+ $this->createObjectFromName($keyTypeName, $arrayItem);
73
+ }
74
+ } else {
75
+ $this->modelData[$key] = $this->createObjectFromName($keyTypeName, $val);
76
+ }
77
+ } else if (is_array($val)) {
78
+ $arrayObject = array();
79
+ foreach ($val as $arrayIndex => $arrayItem) {
80
+ $arrayObject[$arrayIndex] =
81
+ $this->createObjectFromName($keyTypeName, $arrayItem);
82
+ }
83
+ $this->modelData[$key] = $arrayObject;
84
+ }
85
+ $this->processed[$key] = true;
86
+ }
87
+
88
+ return isset($this->modelData[$key]) ? $this->modelData[$key] : null;
89
+ }
90
+
91
+ /**
92
+ * Initialize this object's properties from an array.
93
+ *
94
+ * @param array $array Used to seed this object's properties.
95
+ * @return void
96
+ */
97
+ protected function mapTypes($array)
98
+ {
99
+ // Hard initialise simple types, lazy load more complex ones.
100
+ foreach ($array as $key => $val) {
101
+ if ( !property_exists($this, $this->keyType($key)) &&
102
+ property_exists($this, $key)) {
103
+ $this->$key = $val;
104
+ unset($array[$key]);
105
+ } elseif (property_exists($this, $camelKey = Google_Utils::camelCase($key))) {
106
+ // This checks if property exists as camelCase, leaving it in array as snake_case
107
+ // in case of backwards compatibility issues.
108
+ $this->$camelKey = $val;
109
+ }
110
+ }
111
+ $this->modelData = $array;
112
+ }
113
+
114
+ /**
115
+ * Blank initialiser to be used in subclasses to do post-construction initialisation - this
116
+ * avoids the need for subclasses to have to implement the variadics handling in their
117
+ * constructors.
118
+ */
119
+ protected function gapiInit()
120
+ {
121
+ return;
122
+ }
123
+
124
+ /**
125
+ * Create a simplified object suitable for straightforward
126
+ * conversion to JSON. This is relatively expensive
127
+ * due to the usage of reflection, but shouldn't be called
128
+ * a whole lot, and is the most straightforward way to filter.
129
+ */
130
+ public function toSimpleObject()
131
+ {
132
+ $object = new stdClass();
133
+
134
+ // Process all other data.
135
+ foreach ($this->modelData as $key => $val) {
136
+ $result = $this->getSimpleValue($val);
137
+ if ($result !== null) {
138
+ $object->$key = $this->nullPlaceholderCheck($result);
139
+ }
140
+ }
141
+
142
+ // Process all public properties.
143
+ $reflect = new ReflectionObject($this);
144
+ $props = $reflect->getProperties(ReflectionProperty::IS_PUBLIC);
145
+ foreach ($props as $member) {
146
+ $name = $member->getName();
147
+ $result = $this->getSimpleValue($this->$name);
148
+ if ($result !== null) {
149
+ $name = $this->getMappedName($name);
150
+ $object->$name = $this->nullPlaceholderCheck($result);
151
+ }
152
+ }
153
+
154
+ return $object;
155
+ }
156
+
157
+ /**
158
+ * Handle different types of values, primarily
159
+ * other objects and map and array data types.
160
+ */
161
+ private function getSimpleValue($value)
162
+ {
163
+ if ($value instanceof Google_Model) {
164
+ return $value->toSimpleObject();
165
+ } else if (is_array($value)) {
166
+ $return = array();
167
+ foreach ($value as $key => $a_value) {
168
+ $a_value = $this->getSimpleValue($a_value);
169
+ if ($a_value !== null) {
170
+ $key = $this->getMappedName($key);
171
+ $return[$key] = $this->nullPlaceholderCheck($a_value);
172
+ }
173
+ }
174
+ return $return;
175
+ }
176
+ return $value;
177
+ }
178
+
179
+ /**
180
+ * Check whether the value is the null placeholder and return true null.
181
+ */
182
+ private function nullPlaceholderCheck($value)
183
+ {
184
+ if ($value === self::NULL_VALUE) {
185
+ return null;
186
+ }
187
+ return $value;
188
+ }
189
+
190
+ /**
191
+ * If there is an internal name mapping, use that.
192
+ */
193
+ private function getMappedName($key)
194
+ {
195
+ if (isset($this->internal_gapi_mappings) &&
196
+ isset($this->internal_gapi_mappings[$key])) {
197
+ $key = $this->internal_gapi_mappings[$key];
198
+ }
199
+ return $key;
200
+ }
201
+
202
+ /**
203
+ * Returns true only if the array is associative.
204
+ * @param array $array
205
+ * @return bool True if the array is associative.
206
+ */
207
+ protected function isAssociativeArray($array)
208
+ {
209
+ if (!is_array($array)) {
210
+ return false;
211
+ }
212
+ $keys = array_keys($array);
213
+ foreach ($keys as $key) {
214
+ if (is_string($key)) {
215
+ return true;
216
+ }
217
+ }
218
+ return false;
219
+ }
220
+
221
+ /**
222
+ * Given a variable name, discover its type.
223
+ *
224
+ * @param $name
225
+ * @param $item
226
+ * @return object The object from the item.
227
+ */
228
+ private function createObjectFromName($name, $item)
229
+ {
230
+ $type = $this->$name;
231
+ return new $type($item);
232
+ }
233
+
234
+ /**
235
+ * Verify if $obj is an array.
236
+ * @throws Google_Exception Thrown if $obj isn't an array.
237
+ * @param array $obj Items that should be validated.
238
+ * @param string $method Method expecting an array as an argument.
239
+ */
240
+ public function assertIsArray($obj, $method)
241
+ {
242
+ if ($obj && !is_array($obj)) {
243
+ throw new Google_Exception(
244
+ "Incorrect parameter type passed to $method(). Expected an array."
245
+ );
246
+ }
247
+ }
248
+
249
+ public function offsetExists($offset)
250
+ {
251
+ return isset($this->$offset) || isset($this->modelData[$offset]);
252
+ }
253
+
254
+ public function offsetGet($offset)
255
+ {
256
+ return isset($this->$offset) ?
257
+ $this->$offset :
258
+ $this->__get($offset);
259
+ }
260
+
261
+ public function offsetSet($offset, $value)
262
+ {
263
+ if (property_exists($this, $offset)) {
264
+ $this->$offset = $value;
265
+ } else {
266
+ $this->modelData[$offset] = $value;
267
+ $this->processed[$offset] = true;
268
+ }
269
+ }
270
+
271
+ public function offsetUnset($offset)
272
+ {
273
+ unset($this->modelData[$offset]);
274
+ }
275
+
276
+ protected function keyType($key)
277
+ {
278
+ return $key . "Type";
279
+ }
280
+
281
+ protected function dataType($key)
282
+ {
283
+ return $key . "DataType";
284
+ }
285
+
286
+ public function __isset($key)
287
+ {
288
+ return isset($this->modelData[$key]);
289
+ }
290
+
291
+ public function __unset($key)
292
+ {
293
+ unset($this->modelData[$key]);
294
+ }
295
+ }
app/api/Google/Service.php ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2010 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ class Google_Service
19
+ {
20
+ public $batchPath;
21
+ public $rootUrl;
22
+ public $version;
23
+ public $servicePath;
24
+ public $availableScopes;
25
+ public $resource;
26
+ private $client;
27
+
28
+ public function __construct(Google_Client $client)
29
+ {
30
+ $this->client = $client;
31
+ }
32
+
33
+ /**
34
+ * Return the associated Google_Client class.
35
+ * @return Google_Client
36
+ */
37
+ public function getClient()
38
+ {
39
+ return $this->client;
40
+ }
41
+
42
+ /**
43
+ * Create a new HTTP Batch handler for this service
44
+ *
45
+ * @return Google_Http_Batch
46
+ */
47
+ public function createBatch()
48
+ {
49
+ return new Google_Http_Batch(
50
+ $this->client,
51
+ false,
52
+ $this->rootUrl,
53
+ $this->batchPath
54
+ );
55
+ }
56
+ }
app/api/Google/Service/Calendar.php ADDED
@@ -0,0 +1,3856 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
4
+ * use this file except in compliance with the License. You may obtain a copy of
5
+ * the License at
6
+ *
7
+ * http://www.apache.org/licenses/LICENSE-2.0
8
+ *
9
+ * Unless required by applicable law or agreed to in writing, software
10
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12
+ * License for the specific language governing permissions and limitations under
13
+ * the License.
14
+ */
15
+
16
+ /**
17
+ * Service definition for Calendar (v3).
18
+ *
19
+ * <p>
20
+ * Lets you manipulate events and other calendar data.</p>
21
+ *
22
+ * <p>
23
+ * For more information about this service, see the API
24
+ * <a href="https://developers.google.com/google-apps/calendar/firstapp" target="_blank">Documentation</a>
25
+ * </p>
26
+ *
27
+ * @author Google, Inc.
28
+ */
29
+ class Google_Service_Calendar extends Google_Service
30
+ {
31
+ /** Manage your calendars. */
32
+ const CALENDAR =
33
+ "https://www.googleapis.com/auth/calendar";
34
+ /** View your calendars. */
35
+ const CALENDAR_READONLY =
36
+ "https://www.googleapis.com/auth/calendar.readonly";
37
+
38
+ public $acl;
39
+ public $calendarList;
40
+ public $calendars;
41
+ public $channels;
42
+ public $colors;
43
+ public $events;
44
+ public $freebusy;
45
+ public $settings;
46
+
47
+
48
+ /**
49
+ * Constructs the internal representation of the Calendar service.
50
+ *
51
+ * @param Google_Client $client
52
+ */
53
+ public function __construct(Google_Client $client)
54
+ {
55
+ parent::__construct($client);
56
+ $this->rootUrl = 'https://www.googleapis.com/';
57
+ $this->servicePath = 'calendar/v3/';
58
+ $this->version = 'v3';
59
+ $this->serviceName = 'calendar';
60
+
61
+ $this->acl = new Google_Service_Calendar_Acl_Resource(
62
+ $this,
63
+ $this->serviceName,
64
+ 'acl',
65
+ array(
66
+ 'methods' => array(
67
+ 'delete' => array(
68
+ 'path' => 'calendars/{calendarId}/acl/{ruleId}',
69
+ 'httpMethod' => 'DELETE',
70
+ 'parameters' => array(
71
+ 'calendarId' => array(
72
+ 'location' => 'path',
73
+ 'type' => 'string',
74
+ 'required' => true,
75
+ ),
76
+ 'ruleId' => array(
77
+ 'location' => 'path',
78
+ 'type' => 'string',
79
+ 'required' => true,
80
+ ),
81
+ ),
82
+ ),'get' => array(
83
+ 'path' => 'calendars/{calendarId}/acl/{ruleId}',
84
+ 'httpMethod' => 'GET',
85
+ 'parameters' => array(
86
+ 'calendarId' => array(
87
+ 'location' => 'path',
88
+ 'type' => 'string',
89
+ 'required' => true,
90
+ ),
91
+ 'ruleId' => array(
92
+ 'location' => 'path',
93
+ 'type' => 'string',
94
+ 'required' => true,
95
+ ),
96
+ ),
97
+ ),'insert' => array(
98
+ 'path' => 'calendars/{calendarId}/acl',
99
+ 'httpMethod' => 'POST',
100
+ 'parameters' => array(
101
+ 'calendarId' => array(
102
+ 'location' => 'path',
103
+ 'type' => 'string',
104
+ 'required' => true,
105
+ ),
106
+ ),
107
+ ),'list' => array(
108
+ 'path' => 'calendars/{calendarId}/acl',
109
+ 'httpMethod' => 'GET',
110
+ 'parameters' => array(
111
+ 'calendarId' => array(
112
+ 'location' => 'path',
113
+ 'type' => 'string',
114
+ 'required' => true,
115
+ ),
116
+ 'maxResults' => array(
117
+ 'location' => 'query',
118
+ 'type' => 'integer',
119
+ ),
120
+ 'pageToken' => array(
121
+ 'location' => 'query',
122
+ 'type' => 'string',
123
+ ),
124
+ 'showDeleted' => array(
125
+ 'location' => 'query',
126
+ 'type' => 'boolean',
127
+ ),
128
+ 'syncToken' => array(
129
+ 'location' => 'query',
130
+ 'type' => 'string',
131
+ ),
132
+ ),
133
+ ),'patch' => array(
134
+ 'path' => 'calendars/{calendarId}/acl/{ruleId}',
135
+ 'httpMethod' => 'PATCH',
136
+ 'parameters' => array(
137
+ 'calendarId' => array(
138
+ 'location' => 'path',
139
+ 'type' => 'string',
140
+ 'required' => true,
141
+ ),
142
+ 'ruleId' => array(
143
+ 'location' => 'path',
144
+ 'type' => 'string',
145
+ 'required' => true,
146
+ ),
147
+ ),
148
+ ),'update' => array(
149
+ 'path' => 'calendars/{calendarId}/acl/{ruleId}',
150
+ 'httpMethod' => 'PUT',
151
+ 'parameters' => array(
152
+ 'calendarId' => array(
153
+ 'location' => 'path',
154
+ 'type' => 'string',
155
+ 'required' => true,
156
+ ),
157
+ 'ruleId' => array(
158
+ 'location' => 'path',
159
+ 'type' => 'string',
160
+ 'required' => true,
161
+ ),
162
+ ),
163
+ ),'watch' => array(
164
+ 'path' => 'calendars/{calendarId}/acl/watch',
165
+ 'httpMethod' => 'POST',
166
+ 'parameters' => array(
167
+ 'calendarId' => array(
168
+ 'location' => 'path',
169
+ 'type' => 'string',
170
+ 'required' => true,
171
+ ),
172
+ 'maxResults' => array(
173
+ 'location' => 'query',
174
+ 'type' => 'integer',
175
+ ),
176
+ 'pageToken' => array(
177
+ 'location' => 'query',
178
+ 'type' => 'string',
179
+ ),
180
+ 'showDeleted' => array(
181
+ 'location' => 'query',
182
+ 'type' => 'boolean',
183
+ ),
184
+ 'syncToken' => array(
185
+ 'location' => 'query',
186
+ 'type' => 'string',
187
+ ),
188
+ ),
189
+ ),
190
+ )
191
+ )
192
+ );
193
+ $this->calendarList = new Google_Service_Calendar_CalendarList_Resource(
194
+ $this,
195
+ $this->serviceName,
196
+ 'calendarList',
197
+ array(
198
+ 'methods' => array(
199
+ 'delete' => array(
200
+ 'path' => 'users/me/calendarList/{calendarId}',
201
+ 'httpMethod' => 'DELETE',
202
+ 'parameters' => array(
203
+ 'calendarId' => array(
204
+ 'location' => 'path',
205
+ 'type' => 'string',
206
+ 'required' => true,
207
+ ),
208
+ ),
209
+ ),'get' => array(
210
+ 'path' => 'users/me/calendarList/{calendarId}',
211
+ 'httpMethod' => 'GET',
212
+ 'parameters' => array(
213
+ 'calendarId' => array(
214
+ 'location' => 'path',
215
+ 'type' => 'string',
216
+ 'required' => true,
217
+ ),
218
+ ),
219
+ ),'insert' => array(
220
+ 'path' => 'users/me/calendarList',
221
+ 'httpMethod' => 'POST',
222
+ 'parameters' => array(
223
+ 'colorRgbFormat' => array(
224
+ 'location' => 'query',
225
+ 'type' => 'boolean',
226
+ ),
227
+ ),
228
+ ),'list' => array(
229
+ 'path' => 'users/me/calendarList',
230
+ 'httpMethod' => 'GET',
231
+ 'parameters' => array(
232
+ 'maxResults' => array(
233
+ 'location' => 'query',
234
+ 'type' => 'integer',
235
+ ),
236
+ 'minAccessRole' => array(
237
+ 'location' => 'query',
238
+ 'type' => 'string',
239
+ ),
240
+ 'pageToken' => array(
241
+ 'location' => 'query',
242
+ 'type' => 'string',
243
+ ),
244
+ 'showDeleted' => array(
245
+ 'location' => 'query',
246
+ 'type' => 'boolean',
247
+ ),
248
+ 'showHidden' => array(
249
+ 'location' => 'query',
250
+ 'type' => 'boolean',
251
+ ),
252
+ 'syncToken' => array(
253
+ 'location' => 'query',
254
+ 'type' => 'string',
255
+ ),
256
+ ),
257
+ ),'patch' => array(
258
+ 'path' => 'users/me/calendarList/{calendarId}',
259
+ 'httpMethod' => 'PATCH',
260
+ 'parameters' => array(
261
+ 'calendarId' => array(
262
+ 'location' => 'path',
263
+ 'type' => 'string',
264
+ 'required' => true,
265
+ ),
266
+ 'colorRgbFormat' => array(
267
+ 'location' => 'query',
268
+ 'type' => 'boolean',
269
+ ),
270
+ ),
271
+ ),'update' => array(
272
+ 'path' => 'users/me/calendarList/{calendarId}',
273
+ 'httpMethod' => 'PUT',
274
+ 'parameters' => array(
275
+ 'calendarId' => array(
276
+ 'location' => 'path',
277
+ 'type' => 'string',
278
+ 'required' => true,
279
+ ),
280
+ 'colorRgbFormat' => array(
281
+ 'location' => 'query',
282
+ 'type' => 'boolean',
283
+ ),
284
+ ),
285
+ ),'watch' => array(
286
+ 'path' => 'users/me/calendarList/watch',
287
+ 'httpMethod' => 'POST',
288
+ 'parameters' => array(
289
+ 'maxResults' => array(
290
+ 'location' => 'query',
291
+ 'type' => 'integer',
292
+ ),
293
+ 'minAccessRole' => array(
294
+ 'location' => 'query',
295
+ 'type' => 'string',
296
+ ),
297
+ 'pageToken' => array(
298
+ 'location' => 'query',
299
+ 'type' => 'string',
300
+ ),
301
+ 'showDeleted' => array(
302
+ 'location' => 'query',
303
+ 'type' => 'boolean',
304
+ ),
305
+ 'showHidden' => array(
306
+ 'location' => 'query',
307
+ 'type' => 'boolean',
308
+ ),
309
+ 'syncToken' => array(
310
+ 'location' => 'query',
311
+ 'type' => 'string',
312
+ ),
313
+ ),
314
+ ),
315
+ )
316
+ )
317
+ );
318
+ $this->calendars = new Google_Service_Calendar_Calendars_Resource(
319
+ $this,
320
+ $this->serviceName,
321
+ 'calendars',
322
+ array(
323
+ 'methods' => array(
324
+ 'clear' => array(
325
+ 'path' => 'calendars/{calendarId}/clear',
326
+ 'httpMethod' => 'POST',
327
+ 'parameters' => array(
328
+ 'calendarId' => array(
329
+ 'location' => 'path',
330
+ 'type' => 'string',
331
+ 'required' => true,
332
+ ),
333
+ ),
334
+ ),'delete' => array(
335
+ 'path' => 'calendars/{calendarId}',
336
+ 'httpMethod' => 'DELETE',
337
+ 'parameters' => array(
338
+ 'calendarId' => array(
339
+ 'location' => 'path',
340
+ 'type' => 'string',
341
+ 'required' => true,
342
+ ),
343
+ ),
344
+ ),'get' => array(
345
+ 'path' => 'calendars/{calendarId}',
346
+ 'httpMethod' => 'GET',
347
+ 'parameters' => array(
348
+ 'calendarId' => array(
349
+ 'location' => 'path',
350
+ 'type' => 'string',
351
+ 'required' => true,
352
+ ),
353
+ ),
354
+ ),'insert' => array(
355
+ 'path' => 'calendars',
356
+ 'httpMethod' => 'POST',
357
+ 'parameters' => array(),
358
+ ),'patch' => array(
359
+ 'path' => 'calendars/{calendarId}',
360
+ 'httpMethod' => 'PATCH',
361
+ 'parameters' => array(
362
+ 'calendarId' => array(
363
+ 'location' => 'path',
364
+ 'type' => 'string',
365
+ 'required' => true,
366
+ ),
367
+ ),
368
+ ),'update' => array(
369
+ 'path' => 'calendars/{calendarId}',
370
+ 'httpMethod' => 'PUT',
371
+ 'parameters' => array(
372
+ 'calendarId' => array(
373
+ 'location' => 'path',
374
+ 'type' => 'string',
375
+ 'required' => true,
376
+ ),
377
+ ),
378
+ ),
379
+ )
380
+ )
381
+ );
382
+ $this->channels = new Google_Service_Calendar_Channels_Resource(
383
+ $this,
384
+ $this->serviceName,
385
+ 'channels',
386
+ array(
387
+ 'methods' => array(
388
+ 'stop' => array(
389
+ 'path' => 'channels/stop',
390
+ 'httpMethod' => 'POST',
391
+ 'parameters' => array(),
392
+ ),
393
+ )
394
+ )
395
+ );
396
+ $this->colors = new Google_Service_Calendar_Colors_Resource(
397
+ $this,
398
+ $this->serviceName,
399
+ 'colors',
400
+ array(
401
+ 'methods' => array(
402
+ 'get' => array(
403
+ 'path' => 'colors',
404
+ 'httpMethod' => 'GET',
405
+ 'parameters' => array(),
406
+ ),
407
+ )
408
+ )
409
+ );
410
+ $this->events = new Google_Service_Calendar_Events_Resource(
411
+ $this,
412
+ $this->serviceName,
413
+ 'events',
414
+ array(
415
+ 'methods' => array(
416
+ 'delete' => array(
417
+ 'path' => 'calendars/{calendarId}/events/{eventId}',
418
+ 'httpMethod' => 'DELETE',
419
+ 'parameters' => array(
420
+ 'calendarId' => array(
421
+ 'location' => 'path',
422
+ 'type' => 'string',
423
+ 'required' => true,
424
+ ),
425
+ 'eventId' => array(
426
+ 'location' => 'path',
427
+ 'type' => 'string',
428
+ 'required' => true,
429
+ ),
430
+ 'sendNotifications' => array(
431
+ 'location' => 'query',
432
+ 'type' => 'boolean',
433
+ ),
434
+ ),
435
+ ),'get' => array(
436
+ 'path' => 'calendars/{calendarId}/events/{eventId}',
437
+ 'httpMethod' => 'GET',
438
+ 'parameters' => array(
439
+ 'calendarId' => array(
440
+ 'location' => 'path',
441
+ 'type' => 'string',
442
+ 'required' => true,
443
+ ),
444
+ 'eventId' => array(
445
+ 'location' => 'path',
446
+ 'type' => 'string',
447
+ 'required' => true,
448
+ ),
449
+ 'alwaysIncludeEmail' => array(
450
+ 'location' => 'query',
451
+ 'type' => 'boolean',
452
+ ),
453
+ 'maxAttendees' => array(
454
+ 'location' => 'query',
455
+ 'type' => 'integer',
456
+ ),
457
+ 'timeZone' => array(
458
+ 'location' => 'query',
459
+ 'type' => 'string',
460
+ ),
461
+ ),
462
+ ),'import' => array(
463
+ 'path' => 'calendars/{calendarId}/events/import',
464
+ 'httpMethod' => 'POST',
465
+ 'parameters' => array(
466
+ 'calendarId' => array(
467
+ 'location' => 'path',
468
+ 'type' => 'string',
469
+ 'required' => true,
470
+ ),
471
+ 'supportsAttachments' => array(
472
+ 'location' => 'query',
473
+ 'type' => 'boolean',
474
+ ),
475
+ ),
476
+ ),'insert' => array(
477
+ 'path' => 'calendars/{calendarId}/events',
478
+ 'httpMethod' => 'POST',
479
+ 'parameters' => array(
480
+ 'calendarId' => array(
481
+ 'location' => 'path',
482
+ 'type' => 'string',
483
+ 'required' => true,
484
+ ),
485
+ 'maxAttendees' => array(
486
+ 'location' => 'query',
487
+ 'type' => 'integer',
488
+ ),
489
+ 'sendNotifications' => array(
490
+ 'location' => 'query',
491
+ 'type' => 'boolean',
492
+ ),
493
+ 'supportsAttachments' => array(
494
+ 'location' => 'query',
495
+ 'type' => 'boolean',
496
+ ),
497
+ ),
498
+ ),'instances' => array(
499
+ 'path' => 'calendars/{calendarId}/events/{eventId}/instances',
500
+ 'httpMethod' => 'GET',
501
+ 'parameters' => array(
502
+ 'calendarId' => array(
503
+ 'location' => 'path',
504
+ 'type' => 'string',
505
+ 'required' => true,
506
+ ),
507
+ 'eventId' => array(
508
+ 'location' => 'path',
509
+ 'type' => 'string',
510
+ 'required' => true,
511
+ ),
512
+ 'alwaysIncludeEmail' => array(
513
+ 'location' => 'query',
514
+ 'type' => 'boolean',
515
+ ),
516
+ 'maxAttendees' => array(
517
+ 'location' => 'query',
518
+ 'type' => 'integer',
519
+ ),
520
+ 'maxResults' => array(
521
+ 'location' => 'query',
522
+ 'type' => 'integer',
523
+ ),
524
+ 'originalStart' => array(
525
+ 'location' => 'query',
526
+ 'type' => 'string',
527
+ ),
528
+ 'pageToken' => array(
529
+ 'location' => 'query',
530
+ 'type' => 'string',
531
+ ),
532
+ 'showDeleted' => array(
533
+ 'location' => 'query',
534
+ 'type' => 'boolean',
535
+ ),
536
+ 'timeMax' => array(
537
+ 'location' => 'query',
538
+ 'type' => 'string',
539
+ ),
540
+ 'timeMin' => array(
541
+ 'location' => 'query',
542
+ 'type' => 'string',
543
+ ),
544
+ 'timeZone' => array(
545
+ 'location' => 'query',
546
+ 'type' => 'string',
547
+ ),
548
+ ),
549
+ ),'list' => array(
550
+ 'path' => 'calendars/{calendarId}/events',
551
+ 'httpMethod' => 'GET',
552
+ 'parameters' => array(
553
+ 'calendarId' => array(
554
+ 'location' => 'path',
555
+ 'type' => 'string',
556
+ 'required' => true,
557
+ ),
558
+ 'alwaysIncludeEmail' => array(
559
+ 'location' => 'query',
560
+ 'type' => 'boolean',
561
+ ),
562
+ 'iCalUID' => array(
563
+ 'location' => 'query',
564
+ 'type' => 'string',
565
+ ),
566
+ 'maxAttendees' => array(
567
+ 'location' => 'query',
568
+ 'type' => 'integer',
569
+ ),
570
+ 'maxResults' => array(
571
+ 'location' => 'query',
572
+ 'type' => 'integer',
573
+ ),
574
+ 'orderBy' => array(
575
+ 'location' => 'query',
576
+ 'type' => 'string',
577
+ ),
578
+ 'pageToken' => array(
579
+ 'location' => 'query',
580
+ 'type' => 'string',
581
+ ),
582
+ 'privateExtendedProperty' => array(
583
+ 'location' => 'query',
584
+ 'type' => 'string',
585
+ 'repeated' => true,
586
+ ),
587
+ 'q' => array(
588
+ 'location' => 'query',
589
+ 'type' => 'string',
590
+ ),
591
+ 'sharedExtendedProperty' => array(
592
+ 'location' => 'query',
593
+ 'type' => 'string',
594
+ 'repeated' => true,
595
+ ),
596
+ 'showDeleted' => array(
597
+ 'location' => 'query',
598
+ 'type' => 'boolean',
599
+ ),
600
+ 'showHiddenInvitations' => array(
601
+ 'location' => 'query',
602
+ 'type' => 'boolean',
603
+ ),
604
+ 'singleEvents' => array(
605
+ 'location' => 'query',
606
+ 'type' => 'boolean',
607
+ ),
608
+ 'syncToken' => array(
609
+ 'location' => 'query',
610
+ 'type' => 'string',
611
+ ),
612
+ 'timeMax' => array(
613
+ 'location' => 'query',
614
+ 'type' => 'string',
615
+ ),
616
+ 'timeMin' => array(
617
+ 'location' => 'query',
618
+ 'type' => 'string',
619
+ ),
620
+ 'timeZone' => array(
621
+ 'location' => 'query',
622
+ 'type' => 'string',
623
+ ),
624
+ 'updatedMin' => array(
625
+ 'location' => 'query',
626
+ 'type' => 'string',
627
+ ),
628
+ ),
629
+ ),'move' => array(
630
+ 'path' => 'calendars/{calendarId}/events/{eventId}/move',
631
+ 'httpMethod' => 'POST',
632
+ 'parameters' => array(
633
+ 'calendarId' => array(
634
+ 'location' => 'path',
635
+ 'type' => 'string',
636
+ 'required' => true,
637
+ ),
638
+ 'eventId' => array(
639
+ 'location' => 'path',
640
+ 'type' => 'string',
641
+ 'required' => true,
642
+ ),
643
+ 'destination' => array(
644
+ 'location' => 'query',
645
+ 'type' => 'string',
646
+ 'required' => true,
647
+ ),
648
+ 'sendNotifications' => array(
649
+ 'location' => 'query',
650
+ 'type' => 'boolean',
651
+ ),
652
+ ),
653
+ ),'patch' => array(
654
+ 'path' => 'calendars/{calendarId}/events/{eventId}',
655
+ 'httpMethod' => 'PATCH',
656
+ 'parameters' => array(
657
+ 'calendarId' => array(
658
+ 'location' => 'path',
659
+ 'type' => 'string',
660
+ 'required' => true,
661
+ ),
662
+ 'eventId' => array(
663
+ 'location' => 'path',
664
+ 'type' => 'string',
665
+ 'required' => true,
666
+ ),
667
+ 'alwaysIncludeEmail' => array(
668
+ 'location' => 'query',
669
+ 'type' => 'boolean',
670
+ ),
671
+ 'maxAttendees' => array(
672
+ 'location' => 'query',
673
+ 'type' => 'integer',
674
+ ),
675
+ 'sendNotifications' => array(
676
+ 'location' => 'query',
677
+ 'type' => 'boolean',
678
+ ),
679
+ 'supportsAttachments' => array(
680
+ 'location' => 'query',
681
+ 'type' => 'boolean',
682
+ ),
683
+ ),
684
+ ),'quickAdd' => array(
685
+ 'path' => 'calendars/{calendarId}/events/quickAdd',
686
+ 'httpMethod' => 'POST',
687
+ 'parameters' => array(
688
+ 'calendarId' => array(
689
+ 'location' => 'path',
690
+ 'type' => 'string',
691
+ 'required' => true,
692
+ ),
693
+ 'text' => array(
694
+ 'location' => 'query',
695
+ 'type' => 'string',
696
+ 'required' => true,
697
+ ),
698
+ 'sendNotifications' => array(
699
+ 'location' => 'query',
700
+ 'type' => 'boolean',
701
+ ),
702
+ ),
703
+ ),'update' => array(
704
+ 'path' => 'calendars/{calendarId}/events/{eventId}',
705
+ 'httpMethod' => 'PUT',
706
+ 'parameters' => array(
707
+ 'calendarId' => array(
708
+ 'location' => 'path',
709
+ 'type' => 'string',
710
+ 'required' => true,
711
+ ),
712
+ 'eventId' => array(
713
+ 'location' => 'path',
714
+ 'type' => 'string',
715
+ 'required' => true,
716
+ ),
717
+ 'alwaysIncludeEmail' => array(
718
+ 'location' => 'query',
719
+ 'type' => 'boolean',
720
+ ),
721
+ 'maxAttendees' => array(
722
+ 'location' => 'query',
723
+ 'type' => 'integer',
724
+ ),
725
+ 'sendNotifications' => array(
726
+ 'location' => 'query',
727
+ 'type' => 'boolean',
728
+ ),
729
+ 'supportsAttachments' => array(
730
+ 'location' => 'query',
731
+ 'type' => 'boolean',
732
+ ),
733
+ ),
734
+ ),'watch' => array(
735
+ 'path' => 'calendars/{calendarId}/events/watch',
736
+ 'httpMethod' => 'POST',
737
+ 'parameters' => array(
738
+ 'calendarId' => array(
739
+ 'location' => 'path',
740
+ 'type' => 'string',
741
+ 'required' => true,
742
+ ),
743
+ 'alwaysIncludeEmail' => array(
744
+ 'location' => 'query',
745
+ 'type' => 'boolean',
746
+ ),
747
+ 'iCalUID' => array(
748
+ 'location' => 'query',
749
+ 'type' => 'string',
750
+ ),
751
+ 'maxAttendees' => array(
752
+ 'location' => 'query',
753
+ 'type' => 'integer',
754
+ ),
755
+ 'maxResults' => array(
756
+ 'location' => 'query',
757
+ 'type' => 'integer',
758
+ ),
759
+ 'orderBy' => array(
760
+ 'location' => 'query',
761
+ 'type' => 'string',
762
+ ),
763
+ 'pageToken' => array(
764
+ 'location' => 'query',
765
+ 'type' => 'string',
766
+ ),
767
+ 'privateExtendedProperty' => array(
768
+ 'location' => 'query',
769
+ 'type' => 'string',
770
+ 'repeated' => true,
771
+ ),
772
+ 'q' => array(
773
+ 'location' => 'query',
774
+ 'type' => 'string',
775
+ ),
776
+ 'sharedExtendedProperty' => array(
777
+ 'location' => 'query',
778
+ 'type' => 'string',
779
+ 'repeated' => true,
780
+ ),
781
+ 'showDeleted' => array(
782
+ 'location' => 'query',
783
+ 'type' => 'boolean',
784
+ ),
785
+ 'showHiddenInvitations' => array(
786
+ 'location' => 'query',
787
+ 'type' => 'boolean',
788
+ ),
789
+ 'singleEvents' => array(
790
+ 'location' => 'query',
791
+ 'type' => 'boolean',
792
+ ),
793
+ 'syncToken' => array(
794
+ 'location' => 'query',
795
+ 'type' => 'string',
796
+ ),
797
+ 'timeMax' => array(
798
+ 'location' => 'query',
799
+ 'type' => 'string',
800
+ ),
801
+ 'timeMin' => array(
802
+ 'location' => 'query',
803
+ 'type' => 'string',
804
+ ),
805
+ 'timeZone' => array(
806
+ 'location' => 'query',
807
+ 'type' => 'string',
808
+ ),
809
+ 'updatedMin' => array(
810
+ 'location' => 'query',
811
+ 'type' => 'string',
812
+ ),
813
+ ),
814
+ ),
815
+ )
816
+ )
817
+ );
818
+ $this->freebusy = new Google_Service_Calendar_Freebusy_Resource(
819
+ $this,
820
+ $this->serviceName,
821
+ 'freebusy',
822
+ array(
823
+ 'methods' => array(
824
+ 'query' => array(
825
+ 'path' => 'freeBusy',
826
+ 'httpMethod' => 'POST',
827
+ 'parameters' => array(),
828
+ ),
829
+ )
830
+ )
831
+ );
832
+ $this->settings = new Google_Service_Calendar_Settings_Resource(
833
+ $this,
834
+ $this->serviceName,
835
+ 'settings',
836
+ array(
837
+ 'methods' => array(
838
+ 'get' => array(
839
+ 'path' => 'users/me/settings/{setting}',
840
+ 'httpMethod' => 'GET',
841
+ 'parameters' => array(
842
+ 'setting' => array(
843
+ 'location' => 'path',
844
+ 'type' => 'string',
845
+ 'required' => true,
846
+ ),
847
+ ),
848
+ ),'list' => array(
849
+ 'path' => 'users/me/settings',
850
+ 'httpMethod' => 'GET',
851
+ 'parameters' => array(
852
+ 'maxResults' => array(
853
+ 'location' => 'query',
854
+ 'type' => 'integer',
855
+ ),
856
+ 'pageToken' => array(
857
+ 'location' => 'query',
858
+ 'type' => 'string',
859
+ ),
860
+ 'syncToken' => array(
861
+ 'location' => 'query',
862
+ 'type' => 'string',
863
+ ),
864
+ ),
865
+ ),'watch' => array(
866
+ 'path' => 'users/me/settings/watch',
867
+ 'httpMethod' => 'POST',
868
+ 'parameters' => array(
869
+ 'maxResults' => array(
870
+ 'location' => 'query',
871
+ 'type' => 'integer',
872
+ ),
873
+ 'pageToken' => array(
874
+ 'location' => 'query',
875
+ 'type' => 'string',
876
+ ),
877
+ 'syncToken' => array(
878
+ 'location' => 'query',
879
+ 'type' => 'string',
880
+ ),
881
+ ),
882
+ ),
883
+ )
884
+ )
885
+ );
886
+ }
887
+ }
888
+
889
+
890
+ /**
891
+ * The "acl" collection of methods.
892
+ * Typical usage is:
893
+ * <code>
894
+ * $calendarService = new Google_Service_Calendar(...);
895
+ * $acl = $calendarService->acl;
896
+ * </code>
897
+ */
898
+ class Google_Service_Calendar_Acl_Resource extends Google_Service_Resource
899
+ {
900
+
901
+ /**
902
+ * Deletes an access control rule. (acl.delete)
903
+ *
904
+ * @param string $calendarId Calendar identifier. To retrieve calendar IDs call
905
+ * the calendarList.list method. If you want to access the primary calendar of
906
+ * the currently logged in user, use the "primary" keyword.
907
+ * @param string $ruleId ACL rule identifier.
908
+ * @param array $optParams Optional parameters.
909
+ */
910
+ public function delete($calendarId, $ruleId, $optParams = array())
911
+ {
912
+ $params = array('calendarId' => $calendarId, 'ruleId' => $ruleId);
913
+ $params = array_merge($params, $optParams);
914
+ return $this->call('delete', array($params));
915
+ }
916
+
917
+ /**
918
+ * Returns an access control rule. (acl.get)
919
+ *
920
+ * @param string $calendarId Calendar identifier. To retrieve calendar IDs call
921
+ * the calendarList.list method. If you want to access the primary calendar of
922
+ * the currently logged in user, use the "primary" keyword.
923
+ * @param string $ruleId ACL rule identifier.
924
+ * @param array $optParams Optional parameters.
925
+ * @return Google_Service_Calendar_AclRule
926
+ */
927
+ public function get($calendarId, $ruleId, $optParams = array())
928
+ {
929
+ $params = array('calendarId' => $calendarId, 'ruleId' => $ruleId);
930
+ $params = array_merge($params, $optParams);
931
+ return $this->call('get', array($params), "Google_Service_Calendar_AclRule");
932
+ }
933
+
934
+ /**
935
+ * Creates an access control rule. (acl.insert)
936
+ *
937
+ * @param string $calendarId Calendar identifier. To retrieve calendar IDs call
938
+ * the calendarList.list method. If you want to access the primary calendar of
939
+ * the currently logged in user, use the "primary" keyword.
940
+ * @param Google_AclRule $postBody
941
+ * @param array $optParams Optional parameters.
942
+ * @return Google_Service_Calendar_AclRule
943
+ */
944
+ public function insert($calendarId, Google_Service_Calendar_AclRule $postBody, $optParams = array())
945
+ {
946
+ $params = array('calendarId' => $calendarId, 'postBody' => $postBody);
947
+ $params = array_merge($params, $optParams);
948
+ return $this->call('insert', array($params), "Google_Service_Calendar_AclRule");
949
+ }
950
+
951
+ /**
952
+ * Returns the rules in the access control list for the calendar. (acl.listAcl)
953
+ *
954
+ * @param string $calendarId Calendar identifier. To retrieve calendar IDs call
955
+ * the calendarList.list method. If you want to access the primary calendar of
956
+ * the currently logged in user, use the "primary" keyword.
957
+ * @param array $optParams Optional parameters.
958
+ *
959
+ * @opt_param int maxResults Maximum number of entries returned on one result
960
+ * page. By default the value is 100 entries. The page size can never be larger
961
+ * than 250 entries. Optional.
962
+ * @opt_param string pageToken Token specifying which result page to return.
963
+ * Optional.
964
+ * @opt_param bool showDeleted Whether to include deleted ACLs in the result.
965
+ * Deleted ACLs are represented by role equal to "none". Deleted ACLs will
966
+ * always be included if syncToken is provided. Optional. The default is False.
967
+ * @opt_param string syncToken Token obtained from the nextSyncToken field
968
+ * returned on the last page of results from the previous list request. It makes
969
+ * the result of this list request contain only entries that have changed since
970
+ * then. All entries deleted since the previous list request will always be in
971
+ * the result set and it is not allowed to set showDeleted to False. If the
972
+ * syncToken expires, the server will respond with a 410 GONE response code and
973
+ * the client should clear its storage and perform a full synchronization
974
+ * without any syncToken. Learn more about incremental synchronization.
975
+ * Optional. The default is to return all entries.
976
+ * @return Google_Service_Calendar_Acl
977
+ */
978
+ public function listAcl($calendarId, $optParams = array())
979
+ {
980
+ $params = array('calendarId' => $calendarId);
981
+ $params = array_merge($params, $optParams);
982
+ return $this->call('list', array($params), "Google_Service_Calendar_Acl");
983
+ }
984
+
985
+ /**
986
+ * Updates an access control rule. This method supports patch semantics.
987
+ * (acl.patch)
988
+ *
989
+ * @param string $calendarId Calendar identifier. To retrieve calendar IDs call
990
+ * the calendarList.list method. If you want to access the primary calendar of
991
+ * the currently logged in user, use the "primary" keyword.
992
+ * @param string $ruleId ACL rule identifier.
993
+ * @param Google_AclRule $postBody
994
+ * @param array $optParams Optional parameters.
995
+ * @return Google_Service_Calendar_AclRule
996
+ */
997
+ public function patch($calendarId, $ruleId, Google_Service_Calendar_AclRule $postBody, $optParams = array())
998
+ {
999
+ $params = array('calendarId' => $calendarId, 'ruleId' => $ruleId, 'postBody' => $postBody);
1000
+ $params = array_merge($params, $optParams);
1001
+ return $this->call('patch', array($params), "Google_Service_Calendar_AclRule");
1002
+ }
1003
+
1004
+ /**
1005
+ * Updates an access control rule. (acl.update)
1006
+ *
1007
+ * @param string $calendarId Calendar identifier. To retrieve calendar IDs call
1008
+ * the calendarList.list method. If you want to access the primary calendar of
1009
+ * the currently logged in user, use the "primary" keyword.
1010
+ * @param string $ruleId ACL rule identifier.
1011
+ * @param Google_AclRule $postBody
1012
+ * @param array $optParams Optional parameters.
1013
+ * @return Google_Service_Calendar_AclRule
1014
+ */
1015
+ public function update($calendarId, $ruleId, Google_Service_Calendar_AclRule $postBody, $optParams = array())
1016
+ {
1017
+ $params = array('calendarId' => $calendarId, 'ruleId' => $ruleId, 'postBody' => $postBody);
1018
+ $params = array_merge($params, $optParams);
1019
+ return $this->call('update', array($params), "Google_Service_Calendar_AclRule");
1020
+ }
1021
+
1022
+ /**
1023
+ * Watch for changes to ACL resources. (acl.watch)
1024
+ *
1025
+ * @param string $calendarId Calendar identifier. To retrieve calendar IDs call
1026
+ * the calendarList.list method. If you want to access the primary calendar of
1027
+ * the currently logged in user, use the "primary" keyword.
1028
+ * @param Google_Channel $postBody
1029
+ * @param array $optParams Optional parameters.
1030
+ *
1031
+ * @opt_param int maxResults Maximum number of entries returned on one result
1032
+ * page. By default the value is 100 entries. The page size can never be larger
1033
+ * than 250 entries. Optional.
1034
+ * @opt_param string pageToken Token specifying which result page to return.
1035
+ * Optional.
1036
+ * @opt_param bool showDeleted Whether to include deleted ACLs in the result.
1037
+ * Deleted ACLs are represented by role equal to "none". Deleted ACLs will
1038
+ * always be included if syncToken is provided. Optional. The default is False.
1039
+ * @opt_param string syncToken Token obtained from the nextSyncToken field
1040
+ * returned on the last page of results from the previous list request. It makes
1041
+ * the result of this list request contain only entries that have changed since
1042
+ * then. All entries deleted since the previous list request will always be in
1043
+ * the result set and it is not allowed to set showDeleted to False. If the
1044
+ * syncToken expires, the server will respond with a 410 GONE response code and
1045
+ * the client should clear its storage and perform a full synchronization
1046
+ * without any syncToken. Learn more about incremental synchronization.
1047
+ * Optional. The default is to return all entries.
1048
+ * @return Google_Service_Calendar_Channel
1049
+ */
1050
+ public function watch($calendarId, Google_Service_Calendar_Channel $postBody, $optParams = array())
1051
+ {
1052
+ $params = array('calendarId' => $calendarId, 'postBody' => $postBody);
1053
+ $params = array_merge($params, $optParams);
1054
+ return $this->call('watch', array($params), "Google_Service_Calendar_Channel");
1055
+ }
1056
+ }
1057
+
1058
+ /**
1059
+ * The "calendarList" collection of methods.
1060
+ * Typical usage is:
1061
+ * <code>
1062
+ * $calendarService = new Google_Service_Calendar(...);
1063
+ * $calendarList = $calendarService->calendarList;
1064
+ * </code>
1065
+ */
1066
+ class Google_Service_Calendar_CalendarList_Resource extends Google_Service_Resource
1067
+ {
1068
+
1069
+ /**
1070
+ * Deletes an entry on the user's calendar list. (calendarList.delete)
1071
+ *
1072
+ * @param string $calendarId Calendar identifier. To retrieve calendar IDs call
1073
+ * the calendarList.list method. If you want to access the primary calendar of
1074
+ * the currently logged in user, use the "primary" keyword.
1075
+ * @param array $optParams Optional parameters.
1076
+ */
1077
+ public function delete($calendarId, $optParams = array())
1078
+ {
1079
+ $params = array('calendarId' => $calendarId);
1080
+ $params = array_merge($params, $optParams);
1081
+ return $this->call('delete', array($params));
1082
+ }
1083
+
1084
+ /**
1085
+ * Returns an entry on the user's calendar list. (calendarList.get)
1086
+ *
1087
+ * @param string $calendarId Calendar identifier. To retrieve calendar IDs call
1088
+ * the calendarList.list method. If you want to access the primary calendar of
1089
+ * the currently logged in user, use the "primary" keyword.
1090
+ * @param array $optParams Optional parameters.
1091
+ * @return Google_Service_Calendar_CalendarListEntry
1092
+ */
1093
+ public function get($calendarId, $optParams = array())
1094
+ {
1095
+ $params = array('calendarId' => $calendarId);
1096
+ $params = array_merge($params, $optParams);
1097
+ return $this->call('get', array($params), "Google_Service_Calendar_CalendarListEntry");
1098
+ }
1099
+
1100
+ /**
1101
+ * Adds an entry to the user's calendar list. (calendarList.insert)
1102
+ *
1103
+ * @param Google_CalendarListEntry $postBody
1104
+ * @param array $optParams Optional parameters.
1105
+ *
1106
+ * @opt_param bool colorRgbFormat Whether to use the foregroundColor and
1107
+ * backgroundColor fields to write the calendar colors (RGB). If this feature is
1108
+ * used, the index-based colorId field will be set to the best matching option
1109
+ * automatically. Optional. The default is False.
1110
+ * @return Google_Service_Calendar_CalendarListEntry
1111
+ */
1112
+ public function insert(Google_Service_Calendar_CalendarListEntry $postBody, $optParams = array())
1113
+ {
1114
+ $params = array('postBody' => $postBody);
1115
+ $params = array_merge($params, $optParams);
1116
+ return $this->call('insert', array($params), "Google_Service_Calendar_CalendarListEntry");
1117
+ }
1118
+
1119
+ /**
1120
+ * Returns entries on the user's calendar list. (calendarList.listCalendarList)
1121
+ *
1122
+ * @param array $optParams Optional parameters.
1123
+ *
1124
+ * @opt_param int maxResults Maximum number of entries returned on one result
1125
+ * page. By default the value is 100 entries. The page size can never be larger
1126
+ * than 250 entries. Optional.
1127
+ * @opt_param string minAccessRole The minimum access role for the user in the
1128
+ * returned entries. Optional. The default is no restriction.
1129
+ * @opt_param string pageToken Token specifying which result page to return.
1130
+ * Optional.
1131
+ * @opt_param bool showDeleted Whether to include deleted calendar list entries
1132
+ * in the result. Optional. The default is False.
1133
+ * @opt_param bool showHidden Whether to show hidden entries. Optional. The
1134
+ * default is False.
1135
+ * @opt_param string syncToken Token obtained from the nextSyncToken field
1136
+ * returned on the last page of results from the previous list request. It makes
1137
+ * the result of this list request contain only entries that have changed since
1138
+ * then. If only read-only fields such as calendar properties or ACLs have
1139
+ * changed, the entry won't be returned. All entries deleted and hidden since
1140
+ * the previous list request will always be in the result set and it is not
1141
+ * allowed to set showDeleted neither showHidden to False. To ensure client
1142
+ * state consistency minAccessRole query parameter cannot be specified together
1143
+ * with nextSyncToken. If the syncToken expires, the server will respond with a
1144
+ * 410 GONE response code and the client should clear its storage and perform a
1145
+ * full synchronization without any syncToken. Learn more about incremental
1146
+ * synchronization. Optional. The default is to return all entries.
1147
+ * @return Google_Service_Calendar_CalendarList
1148
+ */
1149
+ public function listCalendarList($optParams = array())
1150
+ {
1151
+ $params = array();
1152
+ $params = array_merge($params, $optParams);
1153
+ return $this->call('list', array($params), "Google_Service_Calendar_CalendarList");
1154
+ }
1155
+
1156
+ /**
1157
+ * Updates an entry on the user's calendar list. This method supports patch
1158
+ * semantics. (calendarList.patch)
1159
+ *
1160
+ * @param string $calendarId Calendar identifier. To retrieve calendar IDs call
1161
+ * the calendarList.list method. If you want to access the primary calendar of
1162
+ * the currently logged in user, use the "primary" keyword.
1163
+ * @param Google_CalendarListEntry $postBody
1164
+ * @param array $optParams Optional parameters.
1165
+ *
1166
+ * @opt_param bool colorRgbFormat Whether to use the foregroundColor and
1167
+ * backgroundColor fields to write the calendar colors (RGB). If this feature is
1168
+ * used, the index-based colorId field will be set to the best matching option
1169
+ * automatically. Optional. The default is False.
1170
+ * @return Google_Service_Calendar_CalendarListEntry
1171
+ */
1172
+ public function patch($calendarId, Google_Service_Calendar_CalendarListEntry $postBody, $optParams = array())
1173
+ {
1174
+ $params = array('calendarId' => $calendarId, 'postBody' => $postBody);
1175
+ $params = array_merge($params, $optParams);
1176
+ return $this->call('patch', array($params), "Google_Service_Calendar_CalendarListEntry");
1177
+ }
1178
+
1179
+ /**
1180
+ * Updates an entry on the user's calendar list. (calendarList.update)
1181
+ *
1182
+ * @param string $calendarId Calendar identifier. To retrieve calendar IDs call
1183
+ * the calendarList.list method. If you want to access the primary calendar of
1184
+ * the currently logged in user, use the "primary" keyword.
1185
+ * @param Google_CalendarListEntry $postBody
1186
+ * @param array $optParams Optional parameters.
1187
+ *
1188
+ * @opt_param bool colorRgbFormat Whether to use the foregroundColor and
1189
+ * backgroundColor fields to write the calendar colors (RGB). If this feature is
1190
+ * used, the index-based colorId field will be set to the best matching option
1191
+ * automatically. Optional. The default is False.
1192
+ * @return Google_Service_Calendar_CalendarListEntry
1193
+ */
1194
+ public function update($calendarId, Google_Service_Calendar_CalendarListEntry $postBody, $optParams = array())
1195
+ {
1196
+ $params = array('calendarId' => $calendarId, 'postBody' => $postBody);
1197
+ $params = array_merge($params, $optParams);
1198
+ return $this->call('update', array($params), "Google_Service_Calendar_CalendarListEntry");
1199
+ }
1200
+
1201
+ /**
1202
+ * Watch for changes to CalendarList resources. (calendarList.watch)
1203
+ *
1204
+ * @param Google_Channel $postBody
1205
+ * @param array $optParams Optional parameters.
1206
+ *
1207
+ * @opt_param int maxResults Maximum number of entries returned on one result
1208
+ * page. By default the value is 100 entries. The page size can never be larger
1209
+ * than 250 entries. Optional.
1210
+ * @opt_param string minAccessRole The minimum access role for the user in the
1211
+ * returned entries. Optional. The default is no restriction.
1212
+ * @opt_param string pageToken Token specifying which result page to return.
1213
+ * Optional.
1214
+ * @opt_param bool showDeleted Whether to include deleted calendar list entries
1215
+ * in the result. Optional. The default is False.
1216
+ * @opt_param bool showHidden Whether to show hidden entries. Optional. The
1217
+ * default is False.
1218
+ * @opt_param string syncToken Token obtained from the nextSyncToken field
1219
+ * returned on the last page of results from the previous list request. It makes
1220
+ * the result of this list request contain only entries that have changed since
1221
+ * then. If only read-only fields such as calendar properties or ACLs have
1222
+ * changed, the entry won't be returned. All entries deleted and hidden since
1223
+ * the previous list request will always be in the result set and it is not
1224
+ * allowed to set showDeleted neither showHidden to False. To ensure client
1225
+ * state consistency minAccessRole query parameter cannot be specified together
1226
+ * with nextSyncToken. If the syncToken expires, the server will respond with a
1227
+ * 410 GONE response code and the client should clear its storage and perform a
1228
+ * full synchronization without any syncToken. Learn more about incremental
1229
+ * synchronization. Optional. The default is to return all entries.
1230
+ * @return Google_Service_Calendar_Channel
1231
+ */
1232
+ public function watch(Google_Service_Calendar_Channel $postBody, $optParams = array())
1233
+ {
1234
+ $params = array('postBody' => $postBody);
1235
+ $params = array_merge($params, $optParams);
1236
+ return $this->call('watch', array($params), "Google_Service_Calendar_Channel");
1237
+ }
1238
+ }
1239
+
1240
+ /**
1241
+ * The "calendars" collection of methods.
1242
+ * Typical usage is:
1243
+ * <code>
1244
+ * $calendarService = new Google_Service_Calendar(...);
1245
+ * $calendars = $calendarService->calendars;
1246
+ * </code>
1247
+ */
1248
+ class Google_Service_Calendar_Calendars_Resource extends Google_Service_Resource
1249
+ {
1250
+
1251
+ /**
1252
+ * Clears a primary calendar. This operation deletes all events associated with
1253
+ * the primary calendar of an account. (calendars.clear)
1254
+ *
1255
+ * @param string $calendarId Calendar identifier. To retrieve calendar IDs call
1256
+ * the calendarList.list method. If you want to access the primary calendar of
1257
+ * the currently logged in user, use the "primary" keyword.
1258
+ * @param array $optParams Optional parameters.
1259
+ */
1260
+ public function clear($calendarId, $optParams = array())
1261
+ {
1262
+ $params = array('calendarId' => $calendarId);
1263
+ $params = array_merge($params, $optParams);
1264
+ return $this->call('clear', array($params));
1265
+ }
1266
+
1267
+ /**
1268
+ * Deletes a secondary calendar. Use calendars.clear for clearing all events on
1269
+ * primary calendars. (calendars.delete)
1270
+ *
1271
+ * @param string $calendarId Calendar identifier. To retrieve calendar IDs call
1272
+ * the calendarList.list method. If you want to access the primary calendar of
1273
+ * the currently logged in user, use the "primary" keyword.
1274
+ * @param array $optParams Optional parameters.
1275
+ */
1276
+ public function delete($calendarId, $optParams = array())
1277
+ {
1278
+ $params = array('calendarId' => $calendarId);
1279
+ $params = array_merge($params, $optParams);
1280
+ return $this->call('delete', array($params));
1281
+ }
1282
+
1283
+ /**
1284
+ * Returns metadata for a calendar. (calendars.get)
1285
+ *
1286
+ * @param string $calendarId Calendar identifier. To retrieve calendar IDs call
1287
+ * the calendarList.list method. If you want to access the primary calendar of
1288
+ * the currently logged in user, use the "primary" keyword.
1289
+ * @param array $optParams Optional parameters.
1290
+ * @return Google_Service_Calendar_Calendar
1291
+ */
1292
+ public function get($calendarId, $optParams = array())
1293
+ {
1294
+ $params = array('calendarId' => $calendarId);
1295
+ $params = array_merge($params, $optParams);
1296
+ return $this->call('get', array($params), "Google_Service_Calendar_Calendar");
1297
+ }
1298
+
1299
+ /**
1300
+ * Creates a secondary calendar. (calendars.insert)
1301
+ *
1302
+ * @param Google_Calendar $postBody
1303
+ * @param array $optParams Optional parameters.
1304
+ * @return Google_Service_Calendar_Calendar
1305
+ */
1306
+ public function insert(Google_Service_Calendar_Calendar $postBody, $optParams = array())
1307
+ {
1308
+ $params = array('postBody' => $postBody);
1309
+ $params = array_merge($params, $optParams);
1310
+ return $this->call('insert', array($params), "Google_Service_Calendar_Calendar");
1311
+ }
1312
+
1313
+ /**
1314
+ * Updates metadata for a calendar. This method supports patch semantics.
1315
+ * (calendars.patch)
1316
+ *
1317
+ * @param string $calendarId Calendar identifier. To retrieve calendar IDs call
1318
+ * the calendarList.list method. If you want to access the primary calendar of
1319
+ * the currently logged in user, use the "primary" keyword.
1320
+ * @param Google_Calendar $postBody
1321
+ * @param array $optParams Optional parameters.
1322
+ * @return Google_Service_Calendar_Calendar
1323
+ */
1324
+ public function patch($calendarId, Google_Service_Calendar_Calendar $postBody, $optParams = array())
1325
+ {
1326
+ $params = array('calendarId' => $calendarId, 'postBody' => $postBody);
1327
+ $params = array_merge($params, $optParams);
1328
+ return $this->call('patch', array($params), "Google_Service_Calendar_Calendar");
1329
+ }
1330
+
1331
+ /**
1332
+ * Updates metadata for a calendar. (calendars.update)
1333
+ *
1334
+ * @param string $calendarId Calendar identifier. To retrieve calendar IDs call
1335
+ * the calendarList.list method. If you want to access the primary calendar of
1336
+ * the currently logged in user, use the "primary" keyword.
1337
+ * @param Google_Calendar $postBody
1338
+ * @param array $optParams Optional parameters.
1339
+ * @return Google_Service_Calendar_Calendar
1340
+ */
1341
+ public function update($calendarId, Google_Service_Calendar_Calendar $postBody, $optParams = array())
1342
+ {
1343
+ $params = array('calendarId' => $calendarId, 'postBody' => $postBody);
1344
+ $params = array_merge($params, $optParams);
1345
+ return $this->call('update', array($params), "Google_Service_Calendar_Calendar");
1346
+ }
1347
+ }
1348
+
1349
+ /**
1350
+ * The "channels" collection of methods.
1351
+ * Typical usage is:
1352
+ * <code>
1353
+ * $calendarService = new Google_Service_Calendar(...);
1354
+ * $channels = $calendarService->channels;
1355
+ * </code>
1356
+ */
1357
+ class Google_Service_Calendar_Channels_Resource extends Google_Service_Resource
1358
+ {
1359
+
1360
+ /**
1361
+ * Stop watching resources through this channel (channels.stop)
1362
+ *
1363
+ * @param Google_Channel $postBody
1364
+ * @param array $optParams Optional parameters.
1365
+ */
1366
+ public function stop(Google_Service_Calendar_Channel $postBody, $optParams = array())
1367
+ {
1368
+ $params = array('postBody' => $postBody);
1369
+ $params = array_merge($params, $optParams);
1370
+ return $this->call('stop', array($params));
1371
+ }
1372
+ }
1373
+
1374
+ /**
1375
+ * The "colors" collection of methods.
1376
+ * Typical usage is:
1377
+ * <code>
1378
+ * $calendarService = new Google_Service_Calendar(...);
1379
+ * $colors = $calendarService->colors;
1380
+ * </code>
1381
+ */
1382
+ class Google_Service_Calendar_Colors_Resource extends Google_Service_Resource
1383
+ {
1384
+
1385
+ /**
1386
+ * Returns the color definitions for calendars and events. (colors.get)
1387
+ *
1388
+ * @param array $optParams Optional parameters.
1389
+ * @return Google_Service_Calendar_Colors
1390
+ */
1391
+ public function get($optParams = array())
1392
+ {
1393
+ $params = array();
1394
+ $params = array_merge($params, $optParams);
1395
+ return $this->call('get', array($params), "Google_Service_Calendar_Colors");
1396
+ }
1397
+ }
1398
+
1399
+ /**
1400
+ * The "events" collection of methods.
1401
+ * Typical usage is:
1402
+ * <code>
1403
+ * $calendarService = new Google_Service_Calendar(...);
1404
+ * $events = $calendarService->events;
1405
+ * </code>
1406
+ */
1407
+ class Google_Service_Calendar_Events_Resource extends Google_Service_Resource
1408
+ {
1409
+
1410
+ /**
1411
+ * Deletes an event. (events.delete)
1412
+ *
1413
+ * @param string $calendarId Calendar identifier. To retrieve calendar IDs call
1414
+ * the calendarList.list method. If you want to access the primary calendar of
1415
+ * the currently logged in user, use the "primary" keyword.
1416
+ * @param string $eventId Event identifier.
1417
+ * @param array $optParams Optional parameters.
1418
+ *
1419
+ * @opt_param bool sendNotifications Whether to send notifications about the
1420
+ * deletion of the event. Optional. The default is False.
1421
+ */
1422
+ public function delete($calendarId, $eventId, $optParams = array())
1423
+ {
1424
+ $params = array('calendarId' => $calendarId, 'eventId' => $eventId);
1425
+ $params = array_merge($params, $optParams);
1426
+ return $this->call('delete', array($params));
1427
+ }
1428
+
1429
+ /**
1430
+ * Returns an event. (events.get)
1431
+ *
1432
+ * @param string $calendarId Calendar identifier. To retrieve calendar IDs call
1433
+ * the calendarList.list method. If you want to access the primary calendar of
1434
+ * the currently logged in user, use the "primary" keyword.
1435
+ * @param string $eventId Event identifier.
1436
+ * @param array $optParams Optional parameters.
1437
+ *
1438
+ * @opt_param bool alwaysIncludeEmail Whether to always include a value in the
1439
+ * email field for the organizer, creator and attendees, even if no real email
1440
+ * is available (i.e. a generated, non-working value will be provided). The use
1441
+ * of this option is discouraged and should only be used by clients which cannot
1442
+ * handle the absence of an email address value in the mentioned places.
1443
+ * Optional. The default is False.
1444
+ * @opt_param int maxAttendees The maximum number of attendees to include in the
1445
+ * response. If there are more than the specified number of attendees, only the
1446
+ * participant is returned. Optional.
1447
+ * @opt_param string timeZone Time zone used in the response. Optional. The
1448
+ * default is the time zone of the calendar.
1449
+ * @return Google_Service_Calendar_Event
1450
+ */
1451
+ public function get($calendarId, $eventId, $optParams = array())
1452
+ {
1453
+ $params = array('calendarId' => $calendarId, 'eventId' => $eventId);
1454
+ $params = array_merge($params, $optParams);
1455
+ return $this->call('get', array($params), "Google_Service_Calendar_Event");
1456
+ }
1457
+
1458
+ /**
1459
+ * Imports an event. This operation is used to add a private copy of an existing
1460
+ * event to a calendar. (events.import)
1461
+ *
1462
+ * @param string $calendarId Calendar identifier. To retrieve calendar IDs call
1463
+ * the calendarList.list method. If you want to access the primary calendar of
1464
+ * the currently logged in user, use the "primary" keyword.
1465
+ * @param Google_Event $postBody
1466
+ * @param array $optParams Optional parameters.
1467
+ *
1468
+ * @opt_param bool supportsAttachments Whether API client performing operation
1469
+ * supports event attachments. Optional. The default is False.
1470
+ * @return Google_Service_Calendar_Event
1471
+ */
1472
+ public function import($calendarId, Google_Service_Calendar_Event $postBody, $optParams = array())
1473
+ {
1474
+ $params = array('calendarId' => $calendarId, 'postBody' => $postBody);
1475
+ $params = array_merge($params, $optParams);
1476
+ return $this->call('import', array($params), "Google_Service_Calendar_Event");
1477
+ }
1478
+
1479
+ /**
1480
+ * Creates an event. (events.insert)
1481
+ *
1482
+ * @param string $calendarId Calendar identifier. To retrieve calendar IDs call
1483
+ * the calendarList.list method. If you want to access the primary calendar of
1484
+ * the currently logged in user, use the "primary" keyword.
1485
+ * @param Google_Event $postBody
1486
+ * @param array $optParams Optional parameters.
1487
+ *
1488
+ * @opt_param int maxAttendees The maximum number of attendees to include in the
1489
+ * response. If there are more than the specified number of attendees, only the
1490
+ * participant is returned. Optional.
1491
+ * @opt_param bool sendNotifications Whether to send notifications about the
1492
+ * creation of the new event. Optional. The default is False.
1493
+ * @opt_param bool supportsAttachments Whether API client performing operation
1494
+ * supports event attachments. Optional. The default is False.
1495
+ * @return Google_Service_Calendar_Event
1496
+ */
1497
+ public function insert($calendarId, Google_Service_Calendar_Event $postBody, $optParams = array())
1498
+ {
1499
+ $params = array('calendarId' => $calendarId, 'postBody' => $postBody);
1500
+ $params = array_merge($params, $optParams);
1501
+ return $this->call('insert', array($params), "Google_Service_Calendar_Event");
1502
+ }
1503
+
1504
+ /**
1505
+ * Returns instances of the specified recurring event. (events.instances)
1506
+ *
1507
+ * @param string $calendarId Calendar identifier. To retrieve calendar IDs call
1508
+ * the calendarList.list method. If you want to access the primary calendar of
1509
+ * the currently logged in user, use the "primary" keyword.
1510
+ * @param string $eventId Recurring event identifier.
1511
+ * @param array $optParams Optional parameters.
1512
+ *
1513
+ * @opt_param bool alwaysIncludeEmail Whether to always include a value in the
1514
+ * email field for the organizer, creator and attendees, even if no real email
1515
+ * is available (i.e. a generated, non-working value will be provided). The use
1516
+ * of this option is discouraged and should only be used by clients which cannot
1517
+ * handle the absence of an email address value in the mentioned places.
1518
+ * Optional. The default is False.
1519
+ * @opt_param int maxAttendees The maximum number of attendees to include in the
1520
+ * response. If there are more than the specified number of attendees, only the
1521
+ * participant is returned. Optional.
1522
+ * @opt_param int maxResults Maximum number of events returned on one result
1523
+ * page. By default the value is 250 events. The page size can never be larger
1524
+ * than 2500 events. Optional.
1525
+ * @opt_param string originalStart The original start time of the instance in
1526
+ * the result. Optional.
1527
+ * @opt_param string pageToken Token specifying which result page to return.
1528
+ * Optional.
1529
+ * @opt_param bool showDeleted Whether to include deleted events (with status
1530
+ * equals "cancelled") in the result. Cancelled instances of recurring events
1531
+ * will still be included if singleEvents is False. Optional. The default is
1532
+ * False.
1533
+ * @opt_param string timeMax Upper bound (exclusive) for an event's start time
1534
+ * to filter by. Optional. The default is not to filter by start time. Must be
1535
+ * an RFC3339 timestamp with mandatory time zone offset.
1536
+ * @opt_param string timeMin Lower bound (inclusive) for an event's end time to
1537
+ * filter by. Optional. The default is not to filter by end time. Must be an
1538
+ * RFC3339 timestamp with mandatory time zone offset.
1539
+ * @opt_param string timeZone Time zone used in the response. Optional. The
1540
+ * default is the time zone of the calendar.
1541
+ * @return Google_Service_Calendar_Events
1542
+ */
1543
+ public function instances($calendarId, $eventId, $optParams = array())
1544
+ {
1545
+ $params = array('calendarId' => $calendarId, 'eventId' => $eventId);
1546
+ $params = array_merge($params, $optParams);
1547
+ return $this->call('instances', array($params), "Google_Service_Calendar_Events");
1548
+ }
1549
+
1550
+ /**
1551
+ * Returns events on the specified calendar. (events.listEvents)
1552
+ *
1553
+ * @param string $calendarId Calendar identifier. To retrieve calendar IDs call
1554
+ * the calendarList.list method. If you want to access the primary calendar of
1555
+ * the currently logged in user, use the "primary" keyword.
1556
+ * @param array $optParams Optional parameters.
1557
+ *
1558
+ * @opt_param bool alwaysIncludeEmail Whether to always include a value in the
1559
+ * email field for the organizer, creator and attendees, even if no real email
1560
+ * is available (i.e. a generated, non-working value will be provided). The use
1561
+ * of this option is discouraged and should only be used by clients which cannot
1562
+ * handle the absence of an email address value in the mentioned places.
1563
+ * Optional. The default is False.
1564
+ * @opt_param string iCalUID Specifies event ID in the iCalendar format to be
1565
+ * included in the response. Optional.
1566
+ * @opt_param int maxAttendees The maximum number of attendees to include in the
1567
+ * response. If there are more than the specified number of attendees, only the
1568
+ * participant is returned. Optional.
1569
+ * @opt_param int maxResults Maximum number of events returned on one result
1570
+ * page. By default the value is 250 events. The page size can never be larger
1571
+ * than 2500 events. Optional.
1572
+ * @opt_param string orderBy The order of the events returned in the result.
1573
+ * Optional. The default is an unspecified, stable order.
1574
+ * @opt_param string pageToken Token specifying which result page to return.
1575
+ * Optional.
1576
+ * @opt_param string privateExtendedProperty Extended properties constraint
1577
+ * specified as propertyName=value. Matches only private properties. This
1578
+ * parameter might be repeated multiple times to return events that match all
1579
+ * given constraints.
1580
+ * @opt_param string q Free text search terms to find events that match these
1581
+ * terms in any field, except for extended properties. Optional.
1582
+ * @opt_param string sharedExtendedProperty Extended properties constraint
1583
+ * specified as propertyName=value. Matches only shared properties. This
1584
+ * parameter might be repeated multiple times to return events that match all
1585
+ * given constraints.
1586
+ * @opt_param bool showDeleted Whether to include deleted events (with status
1587
+ * equals "cancelled") in the result. Cancelled instances of recurring events
1588
+ * (but not the underlying recurring event) will still be included if
1589
+ * showDeleted and singleEvents are both False. If showDeleted and singleEvents
1590
+ * are both True, only single instances of deleted events (but not the
1591
+ * underlying recurring events) are returned. Optional. The default is False.
1592
+ * @opt_param bool showHiddenInvitations Whether to include hidden invitations
1593
+ * in the result. Optional. The default is False.
1594
+ * @opt_param bool singleEvents Whether to expand recurring events into
1595
+ * instances and only return single one-off events and instances of recurring
1596
+ * events, but not the underlying recurring events themselves. Optional. The
1597
+ * default is False.
1598
+ * @opt_param string syncToken Token obtained from the nextSyncToken field
1599
+ * returned on the last page of results from the previous list request. It makes
1600
+ * the result of this list request contain only entries that have changed since
1601
+ * then. All events deleted since the previous list request will always be in
1602
+ * the result set and it is not allowed to set showDeleted to False. There are
1603
+ * several query parameters that cannot be specified together with nextSyncToken
1604
+ * to ensure consistency of the client state.
1605
+ *
1606
+ * These are: - iCalUID - orderBy - privateExtendedProperty - q -
1607
+ * sharedExtendedProperty - timeMin - timeMax - updatedMin If the syncToken
1608
+ * expires, the server will respond with a 410 GONE response code and the client
1609
+ * should clear its storage and perform a full synchronization without any
1610
+ * syncToken. Learn more about incremental synchronization. Optional. The
1611
+ * default is to return all entries.
1612
+ * @opt_param string timeMax Upper bound (exclusive) for an event's start time
1613
+ * to filter by. Optional. The default is not to filter by start time. Must be
1614
+ * an RFC3339 timestamp with mandatory time zone offset, e.g.,
1615
+ * 2011-06-03T10:00:00-07:00, 2011-06-03T10:00:00Z. Milliseconds may be provided
1616
+ * but will be ignored.
1617
+ * @opt_param string timeMin Lower bound (inclusive) for an event's end time to
1618
+ * filter by. Optional. The default is not to filter by end time. Must be an
1619
+ * RFC3339 timestamp with mandatory time zone offset, e.g.,
1620
+ * 2011-06-03T10:00:00-07:00, 2011-06-03T10:00:00Z. Milliseconds may be provided
1621
+ * but will be ignored.
1622
+ * @opt_param string timeZone Time zone used in the response. Optional. The
1623
+ * default is the time zone of the calendar.
1624
+ * @opt_param string updatedMin Lower bound for an event's last modification
1625
+ * time (as a RFC3339 timestamp) to filter by. When specified, entries deleted
1626
+ * since this time will always be included regardless of showDeleted. Optional.
1627
+ * The default is not to filter by last modification time.
1628
+ * @return Google_Service_Calendar_Events
1629
+ */
1630
+ public function listEvents($calendarId, $optParams = array())
1631
+ {
1632
+ $params = array('calendarId' => $calendarId);
1633
+ $params = array_merge($params, $optParams);
1634
+ return $this->call('list', array($params), "Google_Service_Calendar_Events");
1635
+ }
1636
+
1637
+ /**
1638
+ * Moves an event to another calendar, i.e. changes an event's organizer.
1639
+ * (events.move)
1640
+ *
1641
+ * @param string $calendarId Calendar identifier of the source calendar where
1642
+ * the event currently is on.
1643
+ * @param string $eventId Event identifier.
1644
+ * @param string $destination Calendar identifier of the target calendar where
1645
+ * the event is to be moved to.
1646
+ * @param array $optParams Optional parameters.
1647
+ *
1648
+ * @opt_param bool sendNotifications Whether to send notifications about the
1649
+ * change of the event's organizer. Optional. The default is False.
1650
+ * @return Google_Service_Calendar_Event
1651
+ */
1652
+ public function move($calendarId, $eventId, $destination, $optParams = array())
1653
+ {
1654
+ $params = array('calendarId' => $calendarId, 'eventId' => $eventId, 'destination' => $destination);
1655
+ $params = array_merge($params, $optParams);
1656
+ return $this->call('move', array($params), "Google_Service_Calendar_Event");
1657
+ }
1658
+
1659
+ /**
1660
+ * Updates an event. This method supports patch semantics. (events.patch)
1661
+ *
1662
+ * @param string $calendarId Calendar identifier. To retrieve calendar IDs call
1663
+ * the calendarList.list method. If you want to access the primary calendar of
1664
+ * the currently logged in user, use the "primary" keyword.
1665
+ * @param string $eventId Event identifier.
1666
+ * @param Google_Event $postBody
1667
+ * @param array $optParams Optional parameters.
1668
+ *
1669
+ * @opt_param bool alwaysIncludeEmail Whether to always include a value in the
1670
+ * email field for the organizer, creator and attendees, even if no real email
1671
+ * is available (i.e. a generated, non-working value will be provided). The use
1672
+ * of this option is discouraged and should only be used by clients which cannot
1673
+ * handle the absence of an email address value in the mentioned places.
1674
+ * Optional. The default is False.
1675
+ * @opt_param int maxAttendees The maximum number of attendees to include in the
1676
+ * response. If there are more than the specified number of attendees, only the
1677
+ * participant is returned. Optional.
1678
+ * @opt_param bool sendNotifications Whether to send notifications about the
1679
+ * event update (e.g. attendee's responses, title changes, etc.). Optional. The
1680
+ * default is False.
1681
+ * @opt_param bool supportsAttachments Whether API client performing operation
1682
+ * supports event attachments. Optional. The default is False.
1683
+ * @return Google_Service_Calendar_Event
1684
+ */
1685
+ public function patch($calendarId, $eventId, Google_Service_Calendar_Event $postBody, $optParams = array())
1686
+ {
1687
+ $params = array('calendarId' => $calendarId, 'eventId' => $eventId, 'postBody' => $postBody);
1688
+ $params = array_merge($params, $optParams);
1689
+ return $this->call('patch', array($params), "Google_Service_Calendar_Event");
1690
+ }
1691
+
1692
+ /**
1693
+ * Creates an event based on a simple text string. (events.quickAdd)
1694
+ *
1695
+ * @param string $calendarId Calendar identifier. To retrieve calendar IDs call
1696
+ * the calendarList.list method. If you want to access the primary calendar of
1697
+ * the currently logged in user, use the "primary" keyword.
1698
+ * @param string $text The text describing the event to be created.
1699
+ * @param array $optParams Optional parameters.
1700
+ *
1701
+ * @opt_param bool sendNotifications Whether to send notifications about the
1702
+ * creation of the event. Optional. The default is False.
1703
+ * @return Google_Service_Calendar_Event
1704
+ */
1705
+ public function quickAdd($calendarId, $text, $optParams = array())
1706
+ {
1707
+ $params = array('calendarId' => $calendarId, 'text' => $text);
1708
+ $params = array_merge($params, $optParams);
1709
+ return $this->call('quickAdd', array($params), "Google_Service_Calendar_Event");
1710
+ }
1711
+
1712
+ /**
1713
+ * Updates an event. (events.update)
1714
+ *
1715
+ * @param string $calendarId Calendar identifier. To retrieve calendar IDs call
1716
+ * the calendarList.list method. If you want to access the primary calendar of
1717
+ * the currently logged in user, use the "primary" keyword.
1718
+ * @param string $eventId Event identifier.
1719
+ * @param Google_Event $postBody
1720
+ * @param array $optParams Optional parameters.
1721
+ *
1722
+ * @opt_param bool alwaysIncludeEmail Whether to always include a value in the
1723
+ * email field for the organizer, creator and attendees, even if no real email
1724
+ * is available (i.e. a generated, non-working value will be provided). The use
1725
+ * of this option is discouraged and should only be used by clients which cannot
1726
+ * handle the absence of an email address value in the mentioned places.
1727
+ * Optional. The default is False.
1728
+ * @opt_param int maxAttendees The maximum number of attendees to include in the
1729
+ * response. If there are more than the specified number of attendees, only the
1730
+ * participant is returned. Optional.
1731
+ * @opt_param bool sendNotifications Whether to send notifications about the
1732
+ * event update (e.g. attendee's responses, title changes, etc.). Optional. The
1733
+ * default is False.
1734
+ * @opt_param bool supportsAttachments Whether API client performing operation
1735
+ * supports event attachments. Optional. The default is False.
1736
+ * @return Google_Service_Calendar_Event
1737
+ */
1738
+ public function update($calendarId, $eventId, Google_Service_Calendar_Event $postBody, $optParams = array())
1739
+ {
1740
+ $params = array('calendarId' => $calendarId, 'eventId' => $eventId, 'postBody' => $postBody);
1741
+ $params = array_merge($params, $optParams);
1742
+ return $this->call('update', array($params), "Google_Service_Calendar_Event");
1743
+ }
1744
+
1745
+ /**
1746
+ * Watch for changes to Events resources. (events.watch)
1747
+ *
1748
+ * @param string $calendarId Calendar identifier. To retrieve calendar IDs call
1749
+ * the calendarList.list method. If you want to access the primary calendar of
1750
+ * the currently logged in user, use the "primary" keyword.
1751
+ * @param Google_Channel $postBody
1752
+ * @param array $optParams Optional parameters.
1753
+ *
1754
+ * @opt_param bool alwaysIncludeEmail Whether to always include a value in the
1755
+ * email field for the organizer, creator and attendees, even if no real email
1756
+ * is available (i.e. a generated, non-working value will be provided). The use
1757
+ * of this option is discouraged and should only be used by clients which cannot
1758
+ * handle the absence of an email address value in the mentioned places.
1759
+ * Optional. The default is False.
1760
+ * @opt_param string iCalUID Specifies event ID in the iCalendar format to be
1761
+ * included in the response. Optional.
1762
+ * @opt_param int maxAttendees The maximum number of attendees to include in the
1763
+ * response. If there are more than the specified number of attendees, only the
1764
+ * participant is returned. Optional.
1765
+ * @opt_param int maxResults Maximum number of events returned on one result
1766
+ * page. By default the value is 250 events. The page size can never be larger
1767
+ * than 2500 events. Optional.
1768
+ * @opt_param string orderBy The order of the events returned in the result.
1769
+ * Optional. The default is an unspecified, stable order.
1770
+ * @opt_param string pageToken Token specifying which result page to return.
1771
+ * Optional.
1772
+ * @opt_param string privateExtendedProperty Extended properties constraint
1773
+ * specified as propertyName=value. Matches only private properties. This
1774
+ * parameter might be repeated multiple times to return events that match all
1775
+ * given constraints.
1776
+ * @opt_param string q Free text search terms to find events that match these
1777
+ * terms in any field, except for extended properties. Optional.
1778
+ * @opt_param string sharedExtendedProperty Extended properties constraint
1779
+ * specified as propertyName=value. Matches only shared properties. This
1780
+ * parameter might be repeated multiple times to return events that match all
1781
+ * given constraints.
1782
+ * @opt_param bool showDeleted Whether to include deleted events (with status
1783
+ * equals "cancelled") in the result. Cancelled instances of recurring events
1784
+ * (but not the underlying recurring event) will still be included if
1785
+ * showDeleted and singleEvents are both False. If showDeleted and singleEvents
1786
+ * are both True, only single instances of deleted events (but not the
1787
+ * underlying recurring events) are returned. Optional. The default is False.
1788
+ * @opt_param bool showHiddenInvitations Whether to include hidden invitations
1789
+ * in the result. Optional. The default is False.
1790
+ * @opt_param bool singleEvents Whether to expand recurring events into
1791
+ * instances and only return single one-off events and instances of recurring
1792
+ * events, but not the underlying recurring events themselves. Optional. The
1793
+ * default is False.
1794
+ * @opt_param string syncToken Token obtained from the nextSyncToken field
1795
+ * returned on the last page of results from the previous list request. It makes
1796
+ * the result of this list request contain only entries that have changed since
1797
+ * then. All events deleted since the previous list request will always be in
1798
+ * the result set and it is not allowed to set showDeleted to False. There are
1799
+ * several query parameters that cannot be specified together with nextSyncToken
1800
+ * to ensure consistency of the client state.
1801
+ *
1802
+ * These are: - iCalUID - orderBy - privateExtendedProperty - q -
1803
+ * sharedExtendedProperty - timeMin - timeMax - updatedMin If the syncToken
1804
+ * expires, the server will respond with a 410 GONE response code and the client
1805
+ * should clear its storage and perform a full synchronization without any
1806
+ * syncToken. Learn more about incremental synchronization. Optional. The
1807
+ * default is to return all entries.
1808
+ * @opt_param string timeMax Upper bound (exclusive) for an event's start time
1809
+ * to filter by. Optional. The default is not to filter by start time. Must be
1810
+ * an RFC3339 timestamp with mandatory time zone offset, e.g.,
1811
+ * 2011-06-03T10:00:00-07:00, 2011-06-03T10:00:00Z. Milliseconds may be provided
1812
+ * but will be ignored.
1813
+ * @opt_param string timeMin Lower bound (inclusive) for an event's end time to
1814
+ * filter by. Optional. The default is not to filter by end time. Must be an
1815
+ * RFC3339 timestamp with mandatory time zone offset, e.g.,
1816
+ * 2011-06-03T10:00:00-07:00, 2011-06-03T10:00:00Z. Milliseconds may be provided
1817
+ * but will be ignored.
1818
+ * @opt_param string timeZone Time zone used in the response. Optional. The
1819
+ * default is the time zone of the calendar.
1820
+ * @opt_param string updatedMin Lower bound for an event's last modification
1821
+ * time (as a RFC3339 timestamp) to filter by. When specified, entries deleted
1822
+ * since this time will always be included regardless of showDeleted. Optional.
1823
+ * The default is not to filter by last modification time.
1824
+ * @return Google_Service_Calendar_Channel
1825
+ */
1826
+ public function watch($calendarId, Google_Service_Calendar_Channel $postBody, $optParams = array())
1827
+ {
1828
+ $params = array('calendarId' => $calendarId, 'postBody' => $postBody);
1829
+ $params = array_merge($params, $optParams);
1830
+ return $this->call('watch', array($params), "Google_Service_Calendar_Channel");
1831
+ }
1832
+ }
1833
+
1834
+ /**
1835
+ * The "freebusy" collection of methods.
1836
+ * Typical usage is:
1837
+ * <code>
1838
+ * $calendarService = new Google_Service_Calendar(...);
1839
+ * $freebusy = $calendarService->freebusy;
1840
+ * </code>
1841
+ */
1842
+ class Google_Service_Calendar_Freebusy_Resource extends Google_Service_Resource
1843
+ {
1844
+
1845
+ /**
1846
+ * Returns free/busy information for a set of calendars. (freebusy.query)
1847
+ *
1848
+ * @param Google_FreeBusyRequest $postBody
1849
+ * @param array $optParams Optional parameters.
1850
+ * @return Google_Service_Calendar_FreeBusyResponse
1851
+ */
1852
+ public function query(Google_Service_Calendar_FreeBusyRequest $postBody, $optParams = array())
1853
+ {
1854
+ $params = array('postBody' => $postBody);
1855
+ $params = array_merge($params, $optParams);
1856
+ return $this->call('query', array($params), "Google_Service_Calendar_FreeBusyResponse");
1857
+ }
1858
+ }
1859
+
1860
+ /**
1861
+ * The "settings" collection of methods.
1862
+ * Typical usage is:
1863
+ * <code>
1864
+ * $calendarService = new Google_Service_Calendar(...);
1865
+ * $settings = $calendarService->settings;
1866
+ * </code>
1867
+ */
1868
+ class Google_Service_Calendar_Settings_Resource extends Google_Service_Resource
1869
+ {
1870
+
1871
+ /**
1872
+ * Returns a single user setting. (settings.get)
1873
+ *
1874
+ * @param string $setting The id of the user setting.
1875
+ * @param array $optParams Optional parameters.
1876
+ * @return Google_Service_Calendar_Setting
1877
+ */
1878
+ public function get($setting, $optParams = array())
1879
+ {
1880
+ $params = array('setting' => $setting);
1881
+ $params = array_merge($params, $optParams);
1882
+ return $this->call('get', array($params), "Google_Service_Calendar_Setting");
1883
+ }
1884
+
1885
+ /**
1886
+ * Returns all user settings for the authenticated user. (settings.listSettings)
1887
+ *
1888
+ * @param array $optParams Optional parameters.
1889
+ *
1890
+ * @opt_param int maxResults Maximum number of entries returned on one result
1891
+ * page. By default the value is 100 entries. The page size can never be larger
1892
+ * than 250 entries. Optional.
1893
+ * @opt_param string pageToken Token specifying which result page to return.
1894
+ * Optional.
1895
+ * @opt_param string syncToken Token obtained from the nextSyncToken field
1896
+ * returned on the last page of results from the previous list request. It makes
1897
+ * the result of this list request contain only entries that have changed since
1898
+ * then. If the syncToken expires, the server will respond with a 410 GONE
1899
+ * response code and the client should clear its storage and perform a full
1900
+ * synchronization without any syncToken. Learn more about incremental
1901
+ * synchronization. Optional. The default is to return all entries.
1902
+ * @return Google_Service_Calendar_Settings
1903
+ */
1904
+ public function listSettings($optParams = array())
1905
+ {
1906
+ $params = array();
1907
+ $params = array_merge($params, $optParams);
1908
+ return $this->call('list', array($params), "Google_Service_Calendar_Settings");
1909
+ }
1910
+
1911
+ /**
1912
+ * Watch for changes to Settings resources. (settings.watch)
1913
+ *
1914
+ * @param Google_Channel $postBody
1915
+ * @param array $optParams Optional parameters.
1916
+ *
1917
+ * @opt_param int maxResults Maximum number of entries returned on one result
1918
+ * page. By default the value is 100 entries. The page size can never be larger
1919
+ * than 250 entries. Optional.
1920
+ * @opt_param string pageToken Token specifying which result page to return.
1921
+ * Optional.
1922
+ * @opt_param string syncToken Token obtained from the nextSyncToken field
1923
+ * returned on the last page of results from the previous list request. It makes
1924
+ * the result of this list request contain only entries that have changed since
1925
+ * then. If the syncToken expires, the server will respond with a 410 GONE
1926
+ * response code and the client should clear its storage and perform a full
1927
+ * synchronization without any syncToken. Learn more about incremental
1928
+ * synchronization. Optional. The default is to return all entries.
1929
+ * @return Google_Service_Calendar_Channel
1930
+ */
1931
+ public function watch(Google_Service_Calendar_Channel $postBody, $optParams = array())
1932
+ {
1933
+ $params = array('postBody' => $postBody);
1934
+ $params = array_merge($params, $optParams);
1935
+ return $this->call('watch', array($params), "Google_Service_Calendar_Channel");
1936
+ }
1937
+ }
1938
+
1939
+
1940
+
1941
+
1942
+ class Google_Service_Calendar_Acl extends Google_Collection
1943
+ {
1944
+ protected $collection_key = 'items';
1945
+ protected $internal_gapi_mappings = array(
1946
+ );
1947
+ public $etag;
1948
+ protected $itemsType = 'Google_Service_Calendar_AclRule';
1949
+ protected $itemsDataType = 'array';
1950
+ public $kind;
1951
+ public $nextPageToken;
1952
+ public $nextSyncToken;
1953
+
1954
+
1955
+ public function setEtag($etag)
1956
+ {
1957
+ $this->etag = $etag;
1958
+ }
1959
+ public function getEtag()
1960
+ {
1961
+ return $this->etag;
1962
+ }
1963
+ public function setItems($items)
1964
+ {
1965
+ $this->items = $items;
1966
+ }
1967
+ public function getItems()
1968
+ {
1969
+ return $this->items;
1970
+ }
1971
+ public function setKind($kind)
1972
+ {
1973
+ $this->kind = $kind;
1974
+ }
1975
+ public function getKind()
1976
+ {
1977
+ return $this->kind;
1978
+ }
1979
+ public function setNextPageToken($nextPageToken)
1980
+ {
1981
+ $this->nextPageToken = $nextPageToken;
1982
+ }
1983
+ public function getNextPageToken()
1984
+ {
1985
+ return $this->nextPageToken;
1986
+ }
1987
+ public function setNextSyncToken($nextSyncToken)
1988
+ {
1989
+ $this->nextSyncToken = $nextSyncToken;
1990
+ }
1991
+ public function getNextSyncToken()
1992
+ {
1993
+ return $this->nextSyncToken;
1994
+ }
1995
+ }
1996
+
1997
+ class Google_Service_Calendar_AclRule extends Google_Model
1998
+ {
1999
+ protected $internal_gapi_mappings = array(
2000
+ );
2001
+ public $etag;
2002
+ public $id;
2003
+ public $kind;
2004
+ public $role;
2005
+ protected $scopeType = 'Google_Service_Calendar_AclRuleScope';
2006
+ protected $scopeDataType = '';
2007
+
2008
+
2009
+ public function setEtag($etag)
2010
+ {
2011
+ $this->etag = $etag;
2012
+ }
2013
+ public function getEtag()
2014
+ {
2015
+ return $this->etag;
2016
+ }
2017
+ public function setId($id)
2018
+ {
2019
+ $this->id = $id;
2020
+ }
2021
+ public function getId()
2022
+ {
2023
+ return $this->id;
2024
+ }
2025
+ public function setKind($kind)
2026
+ {
2027
+ $this->kind = $kind;
2028
+ }
2029
+ public function getKind()
2030
+ {
2031
+ return $this->kind;
2032
+ }
2033
+ public function setRole($role)
2034
+ {
2035
+ $this->role = $role;
2036
+ }
2037
+ public function getRole()
2038
+ {
2039
+ return $this->role;
2040
+ }
2041
+ public function setScope(Google_Service_Calendar_AclRuleScope $scope)
2042
+ {
2043
+ $this->scope = $scope;
2044
+ }
2045
+ public function getScope()
2046
+ {
2047
+ return $this->scope;
2048
+ }
2049
+ }
2050
+
2051
+ class Google_Service_Calendar_AclRuleScope extends Google_Model
2052
+ {
2053
+ protected $internal_gapi_mappings = array(
2054
+ );
2055
+ public $type;
2056
+ public $value;
2057
+
2058
+
2059
+ public function setType($type)
2060
+ {
2061
+ $this->type = $type;
2062
+ }
2063
+ public function getType()
2064
+ {
2065
+ return $this->type;
2066
+ }
2067
+ public function setValue($value)
2068
+ {
2069
+ $this->value = $value;
2070
+ }
2071
+ public function getValue()
2072
+ {
2073
+ return $this->value;
2074
+ }
2075
+ }
2076
+
2077
+ class Google_Service_Calendar_Calendar extends Google_Model
2078
+ {
2079
+ protected $internal_gapi_mappings = array(
2080
+ );
2081
+ public $description;
2082
+ public $etag;
2083
+ public $id;
2084
+ public $kind;
2085
+ public $location;
2086
+ public $summary;
2087
+ public $timeZone;
2088
+
2089
+
2090
+ public function setDescription($description)
2091
+ {
2092
+ $this->description = $description;
2093
+ }
2094
+ public function getDescription()
2095
+ {
2096
+ return $this->description;
2097
+ }
2098
+ public function setEtag($etag)
2099
+ {
2100
+ $this->etag = $etag;
2101
+ }
2102
+ public function getEtag()
2103
+ {
2104
+ return $this->etag;
2105
+ }
2106
+ public function setId($id)
2107
+ {
2108
+ $this->id = $id;
2109
+ }
2110
+ public function getId()
2111
+ {
2112
+ return $this->id;
2113
+ }
2114
+ public function setKind($kind)
2115
+ {
2116
+ $this->kind = $kind;
2117
+ }
2118
+ public function getKind()
2119
+ {
2120
+ return $this->kind;
2121
+ }
2122
+ public function setLocation($location)
2123
+ {
2124
+ $this->location = $location;
2125
+ }
2126
+ public function getLocation()
2127
+ {
2128
+ return $this->location;
2129
+ }
2130
+ public function setSummary($summary)
2131
+ {
2132
+ $this->summary = $summary;
2133
+ }
2134
+ public function getSummary()
2135
+ {
2136
+ return $this->summary;
2137
+ }
2138
+ public function setTimeZone($timeZone)
2139
+ {
2140
+ $this->timeZone = $timeZone;
2141
+ }
2142
+ public function getTimeZone()
2143
+ {
2144
+ return $this->timeZone;
2145
+ }
2146
+ }
2147
+
2148
+ class Google_Service_Calendar_CalendarList extends Google_Collection
2149
+ {
2150
+ protected $collection_key = 'items';
2151
+ protected $internal_gapi_mappings = array(
2152
+ );
2153
+ public $etag;
2154
+ protected $itemsType = 'Google_Service_Calendar_CalendarListEntry';
2155
+ protected $itemsDataType = 'array';
2156
+ public $kind;
2157
+ public $nextPageToken;
2158
+ public $nextSyncToken;
2159
+
2160
+
2161
+ public function setEtag($etag)
2162
+ {
2163
+ $this->etag = $etag;
2164
+ }
2165
+ public function getEtag()
2166
+ {
2167
+ return $this->etag;
2168
+ }
2169
+ public function setItems($items)
2170
+ {
2171
+ $this->items = $items;
2172
+ }
2173
+ public function getItems()
2174
+ {
2175
+ return $this->items;
2176
+ }
2177
+ public function setKind($kind)
2178
+ {
2179
+ $this->kind = $kind;
2180
+ }
2181
+ public function getKind()
2182
+ {
2183
+ return $this->kind;
2184
+ }
2185
+ public function setNextPageToken($nextPageToken)
2186
+ {
2187
+ $this->nextPageToken = $nextPageToken;
2188
+ }
2189
+ public function getNextPageToken()
2190
+ {
2191
+ return $this->nextPageToken;
2192
+ }
2193
+ public function setNextSyncToken($nextSyncToken)
2194
+ {
2195
+ $this->nextSyncToken = $nextSyncToken;
2196
+ }
2197
+ public function getNextSyncToken()
2198
+ {
2199
+ return $this->nextSyncToken;
2200
+ }
2201
+ }
2202
+
2203
+ class Google_Service_Calendar_CalendarListEntry extends Google_Collection
2204
+ {
2205
+ protected $collection_key = 'defaultReminders';
2206
+ protected $internal_gapi_mappings = array(
2207
+ );
2208
+ public $accessRole;
2209
+ public $backgroundColor;
2210
+ public $colorId;
2211
+ protected $defaultRemindersType = 'Google_Service_Calendar_EventReminder';
2212
+ protected $defaultRemindersDataType = 'array';
2213
+ public $deleted;
2214
+ public $description;
2215
+ public $etag;
2216
+ public $foregroundColor;
2217
+ public $hidden;
2218
+ public $id;
2219
+ public $kind;
2220
+ public $location;
2221
+ protected $notificationSettingsType = 'Google_Service_Calendar_CalendarListEntryNotificationSettings';
2222
+ protected $notificationSettingsDataType = '';
2223
+ public $primary;
2224
+ public $selected;
2225
+ public $summary;
2226
+ public $summaryOverride;
2227
+ public $timeZone;
2228
+
2229
+
2230
+ public function setAccessRole($accessRole)
2231
+ {
2232
+ $this->accessRole = $accessRole;
2233
+ }
2234
+ public function getAccessRole()
2235
+ {
2236
+ return $this->accessRole;
2237
+ }
2238
+ public function setBackgroundColor($backgroundColor)
2239
+ {
2240
+ $this->backgroundColor = $backgroundColor;
2241
+ }
2242
+ public function getBackgroundColor()
2243
+ {
2244
+ return $this->backgroundColor;
2245
+ }
2246
+ public function setColorId($colorId)
2247
+ {
2248
+ $this->colorId = $colorId;
2249
+ }
2250
+ public function getColorId()
2251
+ {
2252
+ return $this->colorId;
2253
+ }
2254
+ public function setDefaultReminders($defaultReminders)
2255
+ {
2256
+ $this->defaultReminders = $defaultReminders;
2257
+ }
2258
+ public function getDefaultReminders()
2259
+ {
2260
+ return $this->defaultReminders;
2261
+ }
2262
+ public function setDeleted($deleted)
2263
+ {
2264
+ $this->deleted = $deleted;
2265
+ }
2266
+ public function getDeleted()
2267
+ {
2268
+ return $this->deleted;
2269
+ }
2270
+ public function setDescription($description)
2271
+ {
2272
+ $this->description = $description;
2273
+ }
2274
+ public function getDescription()
2275
+ {
2276
+ return $this->description;
2277
+ }
2278
+ public function setEtag($etag)
2279
+ {
2280
+ $this->etag = $etag;
2281
+ }
2282
+ public function getEtag()
2283
+ {
2284
+ return $this->etag;
2285
+ }
2286
+ public function setForegroundColor($foregroundColor)
2287
+ {
2288
+ $this->foregroundColor = $foregroundColor;
2289
+ }
2290
+ public function getForegroundColor()
2291
+ {
2292
+ return $this->foregroundColor;
2293
+ }
2294
+ public function setHidden($hidden)
2295
+ {
2296
+ $this->hidden = $hidden;
2297
+ }
2298
+ public function getHidden()
2299
+ {
2300
+ return $this->hidden;
2301
+ }
2302
+ public function setId($id)
2303
+ {
2304
+ $this->id = $id;
2305
+ }
2306
+ public function getId()
2307
+ {
2308
+ return $this->id;
2309
+ }
2310
+ public function setKind($kind)
2311
+ {
2312
+ $this->kind = $kind;
2313
+ }
2314
+ public function getKind()
2315
+ {
2316
+ return $this->kind;
2317
+ }
2318
+ public function setLocation($location)
2319
+ {
2320
+ $this->location = $location;
2321
+ }
2322
+ public function getLocation()
2323
+ {
2324
+ return $this->location;
2325
+ }
2326
+ public function setNotificationSettings(Google_Service_Calendar_CalendarListEntryNotificationSettings $notificationSettings)
2327
+ {
2328
+ $this->notificationSettings = $notificationSettings;
2329
+ }
2330
+ public function getNotificationSettings()
2331
+ {
2332
+ return $this->notificationSettings;
2333
+ }
2334
+ public function setPrimary($primary)
2335
+ {
2336
+ $this->primary = $primary;
2337
+ }
2338
+ public function getPrimary()
2339
+ {
2340
+ return $this->primary;
2341
+ }
2342
+ public function setSelected($selected)
2343
+ {
2344
+ $this->selected = $selected;
2345
+ }
2346
+ public function getSelected()
2347
+ {
2348
+ return $this->selected;
2349
+ }
2350
+ public function setSummary($summary)
2351
+ {
2352
+ $this->summary = $summary;
2353
+ }
2354
+ public function getSummary()
2355
+ {
2356
+ return $this->summary;
2357
+ }
2358
+ public function setSummaryOverride($summaryOverride)
2359
+ {
2360
+ $this->summaryOverride = $summaryOverride;
2361
+ }
2362
+ public function getSummaryOverride()
2363
+ {
2364
+ return $this->summaryOverride;
2365
+ }
2366
+ public function setTimeZone($timeZone)
2367
+ {
2368
+ $this->timeZone = $timeZone;
2369
+ }
2370
+ public function getTimeZone()
2371
+ {
2372
+ return $this->timeZone;
2373
+ }
2374
+ }
2375
+
2376
+ class Google_Service_Calendar_CalendarListEntryNotificationSettings extends Google_Collection
2377
+ {
2378
+ protected $collection_key = 'notifications';
2379
+ protected $internal_gapi_mappings = array(
2380
+ );
2381
+ protected $notificationsType = 'Google_Service_Calendar_CalendarNotification';
2382
+ protected $notificationsDataType = 'array';
2383
+
2384
+
2385
+ public function setNotifications($notifications)
2386
+ {
2387
+ $this->notifications = $notifications;
2388
+ }
2389
+ public function getNotifications()
2390
+ {
2391
+ return $this->notifications;
2392
+ }
2393
+ }
2394
+
2395
+ class Google_Service_Calendar_CalendarNotification extends Google_Model
2396
+ {
2397
+ protected $internal_gapi_mappings = array(
2398
+ );
2399
+ public $method;
2400
+ public $type;
2401
+
2402
+
2403
+ public function setMethod($method)
2404
+ {
2405
+ $this->method = $method;
2406
+ }
2407
+ public function getMethod()
2408
+ {
2409
+ return $this->method;
2410
+ }
2411
+ public function setType($type)
2412
+ {
2413
+ $this->type = $type;
2414
+ }
2415
+ public function getType()
2416
+ {
2417
+ return $this->type;
2418
+ }
2419
+ }
2420
+
2421
+ class Google_Service_Calendar_Channel extends Google_Model
2422
+ {
2423
+ protected $internal_gapi_mappings = array(
2424
+ );
2425
+ public $address;
2426
+ public $expiration;
2427
+ public $id;
2428
+ public $kind;
2429
+ public $params;
2430
+ public $payload;
2431
+ public $resourceId;
2432
+ public $resourceUri;
2433
+ public $token;
2434
+ public $type;
2435
+
2436
+
2437
+ public function setAddress($address)
2438
+ {
2439
+ $this->address = $address;
2440
+ }
2441
+ public function getAddress()
2442
+ {
2443
+ return $this->address;
2444
+ }
2445
+ public function setExpiration($expiration)
2446
+ {
2447
+ $this->expiration = $expiration;
2448
+ }
2449
+ public function getExpiration()
2450
+ {
2451
+ return $this->expiration;
2452
+ }
2453
+ public function setId($id)
2454
+ {
2455
+ $this->id = $id;
2456
+ }
2457
+ public function getId()
2458
+ {
2459
+ return $this->id;
2460
+ }
2461
+ public function setKind($kind)
2462
+ {
2463
+ $this->kind = $kind;
2464
+ }
2465
+ public function getKind()
2466
+ {
2467
+ return $this->kind;
2468
+ }
2469
+ public function setParams($params)
2470
+ {
2471
+ $this->params = $params;
2472
+ }
2473
+ public function getParams()
2474
+ {
2475
+ return $this->params;
2476
+ }
2477
+ public function setPayload($payload)
2478
+ {
2479
+ $this->payload = $payload;
2480
+ }
2481
+ public function getPayload()
2482
+ {
2483
+ return $this->payload;
2484
+ }
2485
+ public function setResourceId($resourceId)
2486
+ {
2487
+ $this->resourceId = $resourceId;
2488
+ }
2489
+ public function getResourceId()
2490
+ {
2491
+ return $this->resourceId;
2492
+ }
2493
+ public function setResourceUri($resourceUri)
2494
+ {
2495
+ $this->resourceUri = $resourceUri;
2496
+ }
2497
+ public function getResourceUri()
2498
+ {
2499
+ return $this->resourceUri;
2500
+ }
2501
+ public function setToken($token)
2502
+ {
2503
+ $this->token = $token;
2504
+ }
2505
+ public function getToken()
2506
+ {
2507
+ return $this->token;
2508
+ }
2509
+ public function setType($type)
2510
+ {
2511
+ $this->type = $type;
2512
+ }
2513
+ public function getType()
2514
+ {
2515
+ return $this->type;
2516
+ }
2517
+ }
2518
+
2519
+ class Google_Service_Calendar_ColorDefinition extends Google_Model
2520
+ {
2521
+ protected $internal_gapi_mappings = array(
2522
+ );
2523
+ public $background;
2524
+ public $foreground;
2525
+
2526
+
2527
+ public function setBackground($background)
2528
+ {
2529
+ $this->background = $background;
2530
+ }
2531
+ public function getBackground()
2532
+ {
2533
+ return $this->background;
2534
+ }
2535
+ public function setForeground($foreground)
2536
+ {
2537
+ $this->foreground = $foreground;
2538
+ }
2539
+ public function getForeground()
2540
+ {
2541
+ return $this->foreground;
2542
+ }
2543
+ }
2544
+
2545
+ class Google_Service_Calendar_Colors extends Google_Model
2546
+ {
2547
+ protected $internal_gapi_mappings = array(
2548
+ );
2549
+ protected $calendarType = 'Google_Service_Calendar_ColorDefinition';
2550
+ protected $calendarDataType = 'map';
2551
+ protected $eventType = 'Google_Service_Calendar_ColorDefinition';
2552
+ protected $eventDataType = 'map';
2553
+ public $kind;
2554
+ public $updated;
2555
+
2556
+
2557
+ public function setCalendar($calendar)
2558
+ {
2559
+ $this->calendar = $calendar;
2560
+ }
2561
+ public function getCalendar()
2562
+ {
2563
+ return $this->calendar;
2564
+ }
2565
+ public function setEvent($event)
2566
+ {
2567
+ $this->event = $event;
2568
+ }
2569
+ public function getEvent()
2570
+ {
2571
+ return $this->event;
2572
+ }
2573
+ public function setKind($kind)
2574
+ {
2575
+ $this->kind = $kind;
2576
+ }
2577
+ public function getKind()
2578
+ {
2579
+ return $this->kind;
2580
+ }
2581
+ public function setUpdated($updated)
2582
+ {
2583
+ $this->updated = $updated;
2584
+ }
2585
+ public function getUpdated()
2586
+ {
2587
+ return $this->updated;
2588
+ }
2589
+ }
2590
+
2591
+ class Google_Service_Calendar_Error extends Google_Model
2592
+ {
2593
+ protected $internal_gapi_mappings = array(
2594
+ );
2595
+ public $domain;
2596
+ public $reason;
2597
+
2598
+
2599
+ public function setDomain($domain)
2600
+ {
2601
+ $this->domain = $domain;
2602
+ }
2603
+ public function getDomain()
2604
+ {
2605
+ return $this->domain;
2606
+ }
2607
+ public function setReason($reason)
2608
+ {
2609
+ $this->reason = $reason;
2610
+ }
2611
+ public function getReason()
2612
+ {
2613
+ return $this->reason;
2614
+ }
2615
+ }
2616
+
2617
+ class Google_Service_Calendar_Event extends Google_Collection
2618
+ {
2619
+ protected $collection_key = 'recurrence';
2620
+ protected $internal_gapi_mappings = array(
2621
+ );
2622
+ public $anyoneCanAddSelf;
2623
+ protected $attachmentsType = 'Google_Service_Calendar_EventAttachment';
2624
+ protected $attachmentsDataType = 'array';
2625
+ protected $attendeesType = 'Google_Service_Calendar_EventAttendee';
2626
+ protected $attendeesDataType = 'array';
2627
+ public $attendeesOmitted;
2628
+ public $colorId;
2629
+ public $created;
2630
+ protected $creatorType = 'Google_Service_Calendar_EventCreator';
2631
+ protected $creatorDataType = '';
2632
+ public $description;
2633
+ protected $endType = 'Google_Service_Calendar_EventDateTime';
2634
+ protected $endDataType = '';
2635
+ public $endTimeUnspecified;
2636
+ public $etag;
2637
+ protected $extendedPropertiesType = 'Google_Service_Calendar_EventExtendedProperties';
2638
+ protected $extendedPropertiesDataType = '';
2639
+ protected $gadgetType = 'Google_Service_Calendar_EventGadget';
2640
+ protected $gadgetDataType = '';
2641
+ public $guestsCanInviteOthers;
2642
+ public $guestsCanModify;
2643
+ public $guestsCanSeeOtherGuests;
2644
+ public $hangoutLink;
2645
+ public $htmlLink;
2646
+ public $iCalUID;
2647
+ public $id;
2648
+ public $kind;
2649
+ public $location;
2650
+ public $locked;
2651
+ protected $organizerType = 'Google_Service_Calendar_EventOrganizer';
2652
+ protected $organizerDataType = '';
2653
+ protected $originalStartTimeType = 'Google_Service_Calendar_EventDateTime';
2654
+ protected $originalStartTimeDataType = '';
2655
+ public $privateCopy;
2656
+ public $recurrence;
2657
+ public $recurringEventId;
2658
+ protected $remindersType = 'Google_Service_Calendar_EventReminders';
2659
+ protected $remindersDataType = '';
2660
+ public $sequence;
2661
+ protected $sourceType = 'Google_Service_Calendar_EventSource';
2662
+ protected $sourceDataType = '';
2663
+ protected $startType = 'Google_Service_Calendar_EventDateTime';
2664
+ protected $startDataType = '';
2665
+ public $status;
2666
+ public $summary;
2667
+ public $transparency;
2668
+ public $updated;
2669
+ public $visibility;
2670
+
2671
+
2672
+ public function setAnyoneCanAddSelf($anyoneCanAddSelf)
2673
+ {
2674
+ $this->anyoneCanAddSelf = $anyoneCanAddSelf;
2675
+ }
2676
+ public function getAnyoneCanAddSelf()
2677
+ {
2678
+ return $this->anyoneCanAddSelf;
2679
+ }
2680
+ public function setAttachments($attachments)
2681
+ {
2682
+ $this->attachments = $attachments;
2683
+ }
2684
+ public function getAttachments()
2685
+ {
2686
+ return $this->attachments;
2687
+ }
2688
+ public function setAttendees($attendees)
2689
+ {
2690
+ $this->attendees = $attendees;
2691
+ }
2692
+ public function getAttendees()
2693
+ {
2694
+ return $this->attendees;
2695
+ }
2696
+ public function setAttendeesOmitted($attendeesOmitted)
2697
+ {
2698
+ $this->attendeesOmitted = $attendeesOmitted;
2699
+ }
2700
+ public function getAttendeesOmitted()
2701
+ {
2702
+ return $this->attendeesOmitted;
2703
+ }
2704
+ public function setColorId($colorId)
2705
+ {
2706
+ $this->colorId = $colorId;
2707
+ }
2708
+ public function getColorId()
2709
+ {
2710
+ return $this->colorId;
2711
+ }
2712
+ public function setCreated($created)
2713
+ {
2714
+ $this->created = $created;
2715
+ }
2716
+ public function getCreated()
2717
+ {
2718
+ return $this->created;
2719
+ }
2720
+ public function setCreator(Google_Service_Calendar_EventCreator $creator)
2721
+ {
2722
+ $this->creator = $creator;
2723
+ }
2724
+ public function getCreator()
2725
+ {
2726
+ return $this->creator;
2727
+ }
2728
+ public function setDescription($description)
2729
+ {
2730
+ $this->description = $description;
2731
+ }
2732
+ public function getDescription()
2733
+ {
2734
+ return $this->description;
2735
+ }
2736
+ public function setEnd(Google_Service_Calendar_EventDateTime $end)
2737
+ {
2738
+ $this->end = $end;
2739
+ }
2740
+ public function getEnd()
2741
+ {
2742
+ return $this->end;
2743
+ }
2744
+ public function setEndTimeUnspecified($endTimeUnspecified)
2745
+ {
2746
+ $this->endTimeUnspecified = $endTimeUnspecified;
2747
+ }
2748
+ public function getEndTimeUnspecified()
2749
+ {
2750
+ return $this->endTimeUnspecified;
2751
+ }
2752
+ public function setEtag($etag)
2753
+ {
2754
+ $this->etag = $etag;
2755
+ }
2756
+ public function getEtag()
2757
+ {
2758
+ return $this->etag;
2759
+ }
2760
+ public function setExtendedProperties(Google_Service_Calendar_EventExtendedProperties $extendedProperties)
2761
+ {
2762
+ $this->extendedProperties = $extendedProperties;
2763
+ }
2764
+ public function getExtendedProperties()
2765
+ {
2766
+ return $this->extendedProperties;
2767
+ }
2768
+ public function setGadget(Google_Service_Calendar_EventGadget $gadget)
2769
+ {
2770
+ $this->gadget = $gadget;
2771
+ }
2772
+ public function getGadget()
2773
+ {
2774
+ return $this->gadget;
2775
+ }
2776
+ public function setGuestsCanInviteOthers($guestsCanInviteOthers)
2777
+ {
2778
+ $this->guestsCanInviteOthers = $guestsCanInviteOthers;
2779
+ }
2780
+ public function getGuestsCanInviteOthers()
2781
+ {
2782
+ return $this->guestsCanInviteOthers;
2783
+ }
2784
+ public function setGuestsCanModify($guestsCanModify)
2785
+ {
2786
+ $this->guestsCanModify = $guestsCanModify;
2787
+ }
2788
+ public function getGuestsCanModify()
2789
+ {
2790
+ return $this->guestsCanModify;
2791
+ }
2792
+ public function setGuestsCanSeeOtherGuests($guestsCanSeeOtherGuests)
2793
+ {
2794
+ $this->guestsCanSeeOtherGuests = $guestsCanSeeOtherGuests;
2795
+ }
2796
+ public function getGuestsCanSeeOtherGuests()
2797
+ {
2798
+ return $this->guestsCanSeeOtherGuests;
2799
+ }
2800
+ public function setHangoutLink($hangoutLink)
2801
+ {
2802
+ $this->hangoutLink = $hangoutLink;
2803
+ }
2804
+ public function getHangoutLink()
2805
+ {
2806
+ return $this->hangoutLink;
2807
+ }
2808
+ public function setHtmlLink($htmlLink)
2809
+ {
2810
+ $this->htmlLink = $htmlLink;
2811
+ }
2812
+ public function getHtmlLink()
2813
+ {
2814
+ return $this->htmlLink;
2815
+ }
2816
+ public function setICalUID($iCalUID)
2817
+ {
2818
+ $this->iCalUID = $iCalUID;
2819
+ }
2820
+ public function getICalUID()
2821
+ {
2822
+ return $this->iCalUID;
2823
+ }
2824
+ public function setId($id)
2825
+ {
2826
+ $this->id = $id;
2827
+ }
2828
+ public function getId()
2829
+ {
2830
+ return $this->id;
2831
+ }
2832
+ public function setKind($kind)
2833
+ {
2834
+ $this->kind = $kind;
2835
+ }
2836
+ public function getKind()
2837
+ {
2838
+ return $this->kind;
2839
+ }
2840
+ public function setLocation($location)
2841
+ {
2842
+ $this->location = $location;
2843
+ }
2844
+ public function getLocation()
2845
+ {
2846
+ return $this->location;
2847
+ }
2848
+ public function setLocked($locked)
2849
+ {
2850
+ $this->locked = $locked;
2851
+ }
2852
+ public function getLocked()
2853
+ {
2854
+ return $this->locked;
2855
+ }
2856
+ public function setOrganizer(Google_Service_Calendar_EventOrganizer $organizer)
2857
+ {
2858
+ $this->organizer = $organizer;
2859
+ }
2860
+ public function getOrganizer()
2861
+ {
2862
+ return $this->organizer;
2863
+ }
2864
+ public function setOriginalStartTime(Google_Service_Calendar_EventDateTime $originalStartTime)
2865
+ {
2866
+ $this->originalStartTime = $originalStartTime;
2867
+ }
2868
+ public function getOriginalStartTime()
2869
+ {
2870
+ return $this->originalStartTime;
2871
+ }
2872
+ public function setPrivateCopy($privateCopy)
2873
+ {
2874
+ $this->privateCopy = $privateCopy;
2875
+ }
2876
+ public function getPrivateCopy()
2877
+ {
2878
+ return $this->privateCopy;
2879
+ }
2880
+ public function setRecurrence($recurrence)
2881
+ {
2882
+ $this->recurrence = $recurrence;
2883
+ }
2884
+ public function getRecurrence()
2885
+ {
2886
+ return $this->recurrence;
2887
+ }
2888
+ public function setRecurringEventId($recurringEventId)
2889
+ {
2890
+ $this->recurringEventId = $recurringEventId;
2891
+ }
2892
+ public function getRecurringEventId()
2893
+ {
2894
+ return $this->recurringEventId;
2895
+ }
2896
+ public function setReminders(Google_Service_Calendar_EventReminders $reminders)
2897
+ {
2898
+ $this->reminders = $reminders;
2899
+ }
2900
+ public function getReminders()
2901
+ {
2902
+ return $this->reminders;
2903
+ }
2904
+ public function setSequence($sequence)
2905
+ {
2906
+ $this->sequence = $sequence;
2907
+ }
2908
+ public function getSequence()
2909
+ {
2910
+ return $this->sequence;
2911
+ }
2912
+ public function setSource(Google_Service_Calendar_EventSource $source)
2913
+ {
2914
+ $this->source = $source;
2915
+ }
2916
+ public function getSource()
2917
+ {
2918
+ return $this->source;
2919
+ }
2920
+ public function setStart(Google_Service_Calendar_EventDateTime $start)
2921
+ {
2922
+ $this->start = $start;
2923
+ }
2924
+ public function getStart()
2925
+ {
2926
+ return $this->start;
2927
+ }
2928
+ public function setStatus($status)
2929
+ {
2930
+ $this->status = $status;
2931
+ }
2932
+ public function getStatus()
2933
+ {
2934
+ return $this->status;
2935
+ }
2936
+ public function setSummary($summary)
2937
+ {
2938
+ $this->summary = $summary;
2939
+ }
2940
+ public function getSummary()
2941
+ {
2942
+ return $this->summary;
2943
+ }
2944
+ public function setTransparency($transparency)
2945
+ {
2946
+ $this->transparency = $transparency;
2947
+ }
2948
+ public function getTransparency()
2949
+ {
2950
+ return $this->transparency;
2951
+ }
2952
+ public function setUpdated($updated)
2953
+ {
2954
+ $this->updated = $updated;
2955
+ }
2956
+ public function getUpdated()
2957
+ {
2958
+ return $this->updated;
2959
+ }
2960
+ public function setVisibility($visibility)
2961
+ {
2962
+ $this->visibility = $visibility;
2963
+ }
2964
+ public function getVisibility()
2965
+ {
2966
+ return $this->visibility;
2967
+ }
2968
+ }
2969
+
2970
+ class Google_Service_Calendar_EventAttachment extends Google_Model
2971
+ {
2972
+ protected $internal_gapi_mappings = array(
2973
+ );
2974
+ public $fileId;
2975
+ public $fileUrl;
2976
+ public $iconLink;
2977
+ public $mimeType;
2978
+ public $title;
2979
+
2980
+
2981
+ public function setFileId($fileId)
2982
+ {
2983
+ $this->fileId = $fileId;
2984
+ }
2985
+ public function getFileId()
2986
+ {
2987
+ return $this->fileId;
2988
+ }
2989
+ public function setFileUrl($fileUrl)
2990
+ {
2991
+ $this->fileUrl = $fileUrl;
2992
+ }
2993
+ public function getFileUrl()
2994
+ {
2995
+ return $this->fileUrl;
2996
+ }
2997
+ public function setIconLink($iconLink)
2998
+ {
2999
+ $this->iconLink = $iconLink;
3000
+ }
3001
+ public function getIconLink()
3002
+ {
3003
+ return $this->iconLink;
3004
+ }
3005
+ public function setMimeType($mimeType)
3006
+ {
3007
+ $this->mimeType = $mimeType;
3008
+ }
3009
+ public function getMimeType()
3010
+ {
3011
+ return $this->mimeType;
3012
+ }
3013
+ public function setTitle($title)
3014
+ {
3015
+ $this->title = $title;
3016
+ }
3017
+ public function getTitle()
3018
+ {
3019
+ return $this->title;
3020
+ }
3021
+ }
3022
+
3023
+ class Google_Service_Calendar_EventAttendee extends Google_Model
3024
+ {
3025
+ protected $internal_gapi_mappings = array(
3026
+ );
3027
+ public $additionalGuests;
3028
+ public $comment;
3029
+ public $displayName;
3030
+ public $email;
3031
+ public $id;
3032
+ public $optional;
3033
+ public $organizer;
3034
+ public $resource;
3035
+ public $responseStatus;
3036
+ public $self;
3037
+
3038
+
3039
+ public function setAdditionalGuests($additionalGuests)
3040
+ {
3041
+ $this->additionalGuests = $additionalGuests;
3042
+ }
3043
+ public function getAdditionalGuests()
3044
+ {
3045
+ return $this->additionalGuests;
3046
+ }
3047
+ public function setComment($comment)
3048
+ {
3049
+ $this->comment = $comment;
3050
+ }
3051
+ public function getComment()
3052
+ {
3053
+ return $this->comment;
3054
+ }
3055
+ public function setDisplayName($displayName)
3056
+ {
3057
+ $this->displayName = $displayName;
3058
+ }
3059
+ public function getDisplayName()
3060
+ {
3061
+ return $this->displayName;
3062
+ }
3063
+ public function setEmail($email)
3064
+ {
3065
+ $this->email = $email;
3066
+ }
3067
+ public function getEmail()
3068
+ {
3069
+ return $this->email;
3070
+ }
3071
+ public function setId($id)
3072
+ {
3073
+ $this->id = $id;
3074
+ }
3075
+ public function getId()
3076
+ {
3077
+ return $this->id;
3078
+ }
3079
+ public function setOptional($optional)
3080
+ {
3081
+ $this->optional = $optional;
3082
+ }
3083
+ public function getOptional()
3084
+ {
3085
+ return $this->optional;
3086
+ }
3087
+ public function setOrganizer($organizer)
3088
+ {
3089
+ $this->organizer = $organizer;
3090
+ }
3091
+ public function getOrganizer()
3092
+ {
3093
+ return $this->organizer;
3094
+ }
3095
+ public function setResource($resource)
3096
+ {
3097
+ $this->resource = $resource;
3098
+ }
3099
+ public function getResource()
3100
+ {
3101
+ return $this->resource;
3102
+ }
3103
+ public function setResponseStatus($responseStatus)
3104
+ {
3105
+ $this->responseStatus = $responseStatus;
3106
+ }
3107
+ public function getResponseStatus()
3108
+ {
3109
+ return $this->responseStatus;
3110
+ }
3111
+ public function setSelf($self)
3112
+ {
3113
+ $this->self = $self;
3114
+ }
3115
+ public function getSelf()
3116
+ {
3117
+ return $this->self;
3118
+ }
3119
+ }
3120
+
3121
+ class Google_Service_Calendar_EventCreator extends Google_Model
3122
+ {
3123
+ protected $internal_gapi_mappings = array(
3124
+ );
3125
+ public $displayName;
3126
+ public $email;
3127
+ public $id;
3128
+ public $self;
3129
+
3130
+
3131
+ public function setDisplayName($displayName)
3132
+ {
3133
+ $this->displayName = $displayName;
3134
+ }
3135
+ public function getDisplayName()
3136
+ {
3137
+ return $this->displayName;
3138
+ }
3139
+ public function setEmail($email)
3140
+ {
3141
+ $this->email = $email;
3142
+ }
3143
+ public function getEmail()
3144
+ {
3145
+ return $this->email;
3146
+ }
3147
+ public function setId($id)
3148
+ {
3149
+ $this->id = $id;
3150
+ }
3151
+ public function getId()
3152
+ {
3153
+ return $this->id;
3154
+ }
3155
+ public function setSelf($self)
3156
+ {
3157
+ $this->self = $self;
3158
+ }
3159
+ public function getSelf()
3160
+ {
3161
+ return $this->self;
3162
+ }
3163
+ }
3164
+
3165
+ class Google_Service_Calendar_EventDateTime extends Google_Model
3166
+ {
3167
+ protected $internal_gapi_mappings = array(
3168
+ );
3169
+ public $date;
3170
+ public $dateTime;
3171
+ public $timeZone;
3172
+
3173
+
3174
+ public function setDate($date)
3175
+ {
3176
+ $this->date = $date;
3177
+ }
3178
+ public function getDate()
3179
+ {
3180
+ return $this->date;
3181
+ }
3182
+ public function setDateTime($dateTime)
3183
+ {
3184
+ $this->dateTime = $dateTime;
3185
+ }
3186
+ public function getDateTime()
3187
+ {
3188
+ return $this->dateTime;
3189
+ }
3190
+ public function setTimeZone($timeZone)
3191
+ {
3192
+ $this->timeZone = $timeZone;
3193
+ }
3194
+ public function getTimeZone()
3195
+ {
3196
+ return $this->timeZone;
3197
+ }
3198
+ }
3199
+
3200
+ class Google_Service_Calendar_EventExtendedProperties extends Google_Model
3201
+ {
3202
+ protected $internal_gapi_mappings = array(
3203
+ );
3204
+ public $private;
3205
+ public $shared;
3206
+
3207
+
3208
+ public function setPrivate($private)
3209
+ {
3210
+ $this->private = $private;
3211
+ }
3212
+ public function getPrivate()
3213
+ {
3214
+ return $this->private;
3215
+ }
3216
+ public function setShared($shared)
3217
+ {
3218
+ $this->shared = $shared;
3219
+ }
3220
+ public function getShared()
3221
+ {
3222
+ return $this->shared;
3223
+ }
3224
+ }
3225
+
3226
+ class Google_Service_Calendar_EventGadget extends Google_Model
3227
+ {
3228
+ protected $internal_gapi_mappings = array(
3229
+ );
3230
+ public $display;
3231
+ public $height;
3232
+ public $iconLink;
3233
+ public $link;
3234
+ public $preferences;
3235
+ public $title;
3236
+ public $type;
3237
+ public $width;
3238
+
3239
+
3240
+ public function setDisplay($display)
3241
+ {
3242
+ $this->display = $display;
3243
+ }
3244
+ public function getDisplay()
3245
+ {
3246
+ return $this->display;
3247
+ }
3248
+ public function setHeight($height)
3249
+ {
3250
+ $this->height = $height;
3251
+ }
3252
+ public function getHeight()
3253
+ {
3254
+ return $this->height;
3255
+ }
3256
+ public function setIconLink($iconLink)
3257
+ {
3258
+ $this->iconLink = $iconLink;
3259
+ }
3260
+ public function getIconLink()
3261
+ {
3262
+ return $this->iconLink;
3263
+ }
3264
+ public function setLink($link)
3265
+ {
3266
+ $this->link = $link;
3267
+ }
3268
+ public function getLink()
3269
+ {
3270
+ return $this->link;
3271
+ }
3272
+ public function setPreferences($preferences)
3273
+ {
3274
+ $this->preferences = $preferences;
3275
+ }
3276
+ public function getPreferences()
3277
+ {
3278
+ return $this->preferences;
3279
+ }
3280
+ public function setTitle($title)
3281
+ {
3282
+ $this->title = $title;
3283
+ }
3284
+ public function getTitle()
3285
+ {
3286
+ return $this->title;
3287
+ }
3288
+ public function setType($type)
3289
+ {
3290
+ $this->type = $type;
3291
+ }
3292
+ public function getType()
3293
+ {
3294
+ return $this->type;
3295
+ }
3296
+ public function setWidth($width)
3297
+ {
3298
+ $this->width = $width;
3299
+ }
3300
+ public function getWidth()
3301
+ {
3302
+ return $this->width;
3303
+ }
3304
+ }
3305
+
3306
+ class Google_Service_Calendar_EventOrganizer extends Google_Model
3307
+ {
3308
+ protected $internal_gapi_mappings = array(
3309
+ );
3310
+ public $displayName;
3311
+ public $email;
3312
+ public $id;
3313
+ public $self;
3314
+
3315
+
3316
+ public function setDisplayName($displayName)
3317
+ {
3318
+ $this->displayName = $displayName;
3319
+ }
3320
+ public function getDisplayName()
3321
+ {
3322
+ return $this->displayName;
3323
+ }
3324
+ public function setEmail($email)
3325
+ {
3326
+ $this->email = $email;
3327
+ }
3328
+ public function getEmail()
3329
+ {
3330
+ return $this->email;
3331
+ }
3332
+ public function setId($id)
3333
+ {
3334
+ $this->id = $id;
3335
+ }
3336
+ public function getId()
3337
+ {
3338
+ return $this->id;
3339
+ }
3340
+ public function setSelf($self)
3341
+ {
3342
+ $this->self = $self;
3343
+ }
3344
+ public function getSelf()
3345
+ {
3346
+ return $this->self;
3347
+ }
3348
+ }
3349
+
3350
+ class Google_Service_Calendar_EventReminder extends Google_Model
3351
+ {
3352
+ protected $internal_gapi_mappings = array(
3353
+ );
3354
+ public $method;
3355
+ public $minutes;
3356
+
3357
+
3358
+ public function setMethod($method)
3359
+ {
3360
+ $this->method = $method;
3361
+ }
3362
+ public function getMethod()
3363
+ {
3364
+ return $this->method;
3365
+ }
3366
+ public function setMinutes($minutes)
3367
+ {
3368
+ $this->minutes = $minutes;
3369
+ }
3370
+ public function getMinutes()
3371
+ {
3372
+ return $this->minutes;
3373
+ }
3374
+ }
3375
+
3376
+ class Google_Service_Calendar_EventReminders extends Google_Collection
3377
+ {
3378
+ protected $collection_key = 'overrides';
3379
+ protected $internal_gapi_mappings = array(
3380
+ );
3381
+ protected $overridesType = 'Google_Service_Calendar_EventReminder';
3382
+ protected $overridesDataType = 'array';
3383
+ public $useDefault;
3384
+
3385
+
3386
+ public function setOverrides($overrides)
3387
+ {
3388
+ $this->overrides = $overrides;
3389
+ }
3390
+ public function getOverrides()
3391
+ {
3392
+ return $this->overrides;
3393
+ }
3394
+ public function setUseDefault($useDefault)
3395
+ {
3396
+ $this->useDefault = $useDefault;
3397
+ }
3398
+ public function getUseDefault()
3399
+ {
3400
+ return $this->useDefault;
3401
+ }
3402
+ }
3403
+
3404
+ class Google_Service_Calendar_EventSource extends Google_Model
3405
+ {
3406
+ protected $internal_gapi_mappings = array(
3407
+ );
3408
+ public $title;
3409
+ public $url;
3410
+
3411
+
3412
+ public function setTitle($title)
3413
+ {
3414
+ $this->title = $title;
3415
+ }
3416
+ public function getTitle()
3417
+ {
3418
+ return $this->title;
3419
+ }
3420
+ public function setUrl($url)
3421
+ {
3422
+ $this->url = $url;
3423
+ }
3424
+ public function getUrl()
3425
+ {
3426
+ return $this->url;
3427
+ }
3428
+ }
3429
+
3430
+ class Google_Service_Calendar_Events extends Google_Collection
3431
+ {
3432
+ protected $collection_key = 'items';
3433
+ protected $internal_gapi_mappings = array(
3434
+ );
3435
+ public $accessRole;
3436
+ protected $defaultRemindersType = 'Google_Service_Calendar_EventReminder';
3437
+ protected $defaultRemindersDataType = 'array';
3438
+ public $description;
3439
+ public $etag;
3440
+ protected $itemsType = 'Google_Service_Calendar_Event';
3441
+ protected $itemsDataType = 'array';
3442
+ public $kind;
3443
+ public $nextPageToken;
3444
+ public $nextSyncToken;
3445
+ public $summary;
3446
+ public $timeZone;
3447
+ public $updated;
3448
+
3449
+
3450
+ public function setAccessRole($accessRole)
3451
+ {
3452
+ $this->accessRole = $accessRole;
3453
+ }
3454
+ public function getAccessRole()
3455
+ {
3456
+ return $this->accessRole;
3457
+ }
3458
+ public function setDefaultReminders($defaultReminders)
3459
+ {
3460
+ $this->defaultReminders = $defaultReminders;
3461
+ }
3462
+ public function getDefaultReminders()
3463
+ {
3464
+ return $this->defaultReminders;
3465
+ }
3466
+ public function setDescription($description)
3467
+ {
3468
+ $this->description = $description;
3469
+ }
3470
+ public function getDescription()
3471
+ {
3472
+ return $this->description;
3473
+ }
3474
+ public function setEtag($etag)
3475
+ {
3476
+ $this->etag = $etag;
3477
+ }
3478
+ public function getEtag()
3479
+ {
3480
+ return $this->etag;
3481
+ }
3482
+ public function setItems($items)
3483
+ {
3484
+ $this->items = $items;
3485
+ }
3486
+ public function getItems()
3487
+ {
3488
+ return $this->items;
3489
+ }
3490
+ public function setKind($kind)
3491
+ {
3492
+ $this->kind = $kind;
3493
+ }
3494
+ public function getKind()
3495
+ {
3496
+ return $this->kind;
3497
+ }
3498
+ public function setNextPageToken($nextPageToken)
3499
+ {
3500
+ $this->nextPageToken = $nextPageToken;
3501
+ }
3502
+ public function getNextPageToken()
3503
+ {
3504
+ return $this->nextPageToken;
3505
+ }
3506
+ public function setNextSyncToken($nextSyncToken)
3507
+ {
3508
+ $this->nextSyncToken = $nextSyncToken;
3509
+ }
3510
+ public function getNextSyncToken()
3511
+ {
3512
+ return $this->nextSyncToken;
3513
+ }
3514
+ public function setSummary($summary)
3515
+ {
3516
+ $this->summary = $summary;
3517
+ }
3518
+ public function getSummary()
3519
+ {
3520
+ return $this->summary;
3521
+ }
3522
+ public function setTimeZone($timeZone)
3523
+ {
3524
+ $this->timeZone = $timeZone;
3525
+ }
3526
+ public function getTimeZone()
3527
+ {
3528
+ return $this->timeZone;
3529
+ }
3530
+ public function setUpdated($updated)
3531
+ {
3532
+ $this->updated = $updated;
3533
+ }
3534
+ public function getUpdated()
3535
+ {
3536
+ return $this->updated;
3537
+ }
3538
+ }
3539
+
3540
+ class Google_Service_Calendar_FreeBusyCalendar extends Google_Collection
3541
+ {
3542
+ protected $collection_key = 'errors';
3543
+ protected $internal_gapi_mappings = array(
3544
+ );
3545
+ protected $busyType = 'Google_Service_Calendar_TimePeriod';
3546
+ protected $busyDataType = 'array';
3547
+ protected $errorsType = 'Google_Service_Calendar_Error';
3548
+ protected $errorsDataType = 'array';
3549
+
3550
+
3551
+ public function setBusy($busy)
3552
+ {
3553
+ $this->busy = $busy;
3554
+ }
3555
+ public function getBusy()
3556
+ {
3557
+ return $this->busy;
3558
+ }
3559
+ public function setErrors($errors)
3560
+ {
3561
+ $this->errors = $errors;
3562
+ }
3563
+ public function getErrors()
3564
+ {
3565
+ return $this->errors;
3566
+ }
3567
+ }
3568
+
3569
+ class Google_Service_Calendar_FreeBusyGroup extends Google_Collection
3570
+ {
3571
+ protected $collection_key = 'errors';
3572
+ protected $internal_gapi_mappings = array(
3573
+ );
3574
+ public $calendars;
3575
+ protected $errorsType = 'Google_Service_Calendar_Error';
3576
+ protected $errorsDataType = 'array';
3577
+
3578
+
3579
+ public function setCalendars($calendars)
3580
+ {
3581
+ $this->calendars = $calendars;
3582
+ }
3583
+ public function getCalendars()
3584
+ {
3585
+ return $this->calendars;
3586
+ }
3587
+ public function setErrors($errors)
3588
+ {
3589
+ $this->errors = $errors;
3590
+ }
3591
+ public function getErrors()
3592
+ {
3593
+ return $this->errors;
3594
+ }
3595
+ }
3596
+
3597
+ class Google_Service_Calendar_FreeBusyRequest extends Google_Collection
3598
+ {
3599
+ protected $collection_key = 'items';
3600
+ protected $internal_gapi_mappings = array(
3601
+ );
3602
+ public $calendarExpansionMax;
3603
+ public $groupExpansionMax;
3604
+ protected $itemsType = 'Google_Service_Calendar_FreeBusyRequestItem';
3605
+ protected $itemsDataType = 'array';
3606
+ public $timeMax;
3607
+ public $timeMin;
3608
+ public $timeZone;
3609
+
3610
+
3611
+ public function setCalendarExpansionMax($calendarExpansionMax)
3612
+ {
3613
+ $this->calendarExpansionMax = $calendarExpansionMax;
3614
+ }
3615
+ public function getCalendarExpansionMax()
3616
+ {
3617
+ return $this->calendarExpansionMax;
3618
+ }
3619
+ public function setGroupExpansionMax($groupExpansionMax)
3620
+ {
3621
+ $this->groupExpansionMax = $groupExpansionMax;
3622
+ }
3623
+ public function getGroupExpansionMax()
3624
+ {
3625
+ return $this->groupExpansionMax;
3626
+ }
3627
+ public function setItems($items)
3628
+ {
3629
+ $this->items = $items;
3630
+ }
3631
+ public function getItems()
3632
+ {
3633
+ return $this->items;
3634
+ }
3635
+ public function setTimeMax($timeMax)
3636
+ {
3637
+ $this->timeMax = $timeMax;
3638
+ }
3639
+ public function getTimeMax()
3640
+ {
3641
+ return $this->timeMax;
3642
+ }
3643
+ public function setTimeMin($timeMin)
3644
+ {
3645
+ $this->timeMin = $timeMin;
3646
+ }
3647
+ public function getTimeMin()
3648
+ {
3649
+ return $this->timeMin;
3650
+ }
3651
+ public function setTimeZone($timeZone)
3652
+ {
3653
+ $this->timeZone = $timeZone;
3654
+ }
3655
+ public function getTimeZone()
3656
+ {
3657
+ return $this->timeZone;
3658
+ }
3659
+ }
3660
+
3661
+ class Google_Service_Calendar_FreeBusyRequestItem extends Google_Model
3662
+ {
3663
+ protected $internal_gapi_mappings = array(
3664
+ );
3665
+ public $id;
3666
+
3667
+
3668
+ public function setId($id)
3669
+ {
3670
+ $this->id = $id;
3671
+ }
3672
+ public function getId()
3673
+ {
3674
+ return $this->id;
3675
+ }
3676
+ }
3677
+
3678
+ class Google_Service_Calendar_FreeBusyResponse extends Google_Model
3679
+ {
3680
+ protected $internal_gapi_mappings = array(
3681
+ );
3682
+ protected $calendarsType = 'Google_Service_Calendar_FreeBusyCalendar';
3683
+ protected $calendarsDataType = 'map';
3684
+ protected $groupsType = 'Google_Service_Calendar_FreeBusyGroup';
3685
+ protected $groupsDataType = 'map';
3686
+ public $kind;
3687
+ public $timeMax;
3688
+ public $timeMin;
3689
+
3690
+
3691
+ public function setCalendars($calendars)
3692
+ {
3693
+ $this->calendars = $calendars;
3694
+ }
3695
+ public function getCalendars()
3696
+ {
3697
+ return $this->calendars;
3698
+ }
3699
+ public function setGroups($groups)
3700
+ {
3701
+ $this->groups = $groups;
3702
+ }
3703
+ public function getGroups()
3704
+ {
3705
+ return $this->groups;
3706
+ }
3707
+ public function setKind($kind)
3708
+ {
3709
+ $this->kind = $kind;
3710
+ }
3711
+ public function getKind()
3712
+ {
3713
+ return $this->kind;
3714
+ }
3715
+ public function setTimeMax($timeMax)
3716
+ {
3717
+ $this->timeMax = $timeMax;
3718
+ }
3719
+ public function getTimeMax()
3720
+ {
3721
+ return $this->timeMax;
3722
+ }
3723
+ public function setTimeMin($timeMin)
3724
+ {
3725
+ $this->timeMin = $timeMin;
3726
+ }
3727
+ public function getTimeMin()
3728
+ {
3729
+ return $this->timeMin;
3730
+ }
3731
+ }
3732
+
3733
+ class Google_Service_Calendar_Setting extends Google_Model
3734
+ {
3735
+ protected $internal_gapi_mappings = array(
3736
+ );
3737
+ public $etag;
3738
+ public $id;
3739
+ public $kind;
3740
+ public $value;
3741
+
3742
+
3743
+ public function setEtag($etag)
3744
+ {
3745
+ $this->etag = $etag;
3746
+ }
3747
+ public function getEtag()
3748
+ {
3749
+ return $this->etag;
3750
+ }
3751
+ public function setId($id)
3752
+ {
3753
+ $this->id = $id;
3754
+ }
3755
+ public function getId()
3756
+ {
3757
+ return $this->id;
3758
+ }
3759
+ public function setKind($kind)
3760
+ {
3761
+ $this->kind = $kind;
3762
+ }
3763
+ public function getKind()
3764
+ {
3765
+ return $this->kind;
3766
+ }
3767
+ public function setValue($value)
3768
+ {
3769
+ $this->value = $value;
3770
+ }
3771
+ public function getValue()
3772
+ {
3773
+ return $this->value;
3774
+ }
3775
+ }
3776
+
3777
+ class Google_Service_Calendar_Settings extends Google_Collection
3778
+ {
3779
+ protected $collection_key = 'items';
3780
+ protected $internal_gapi_mappings = array(
3781
+ );
3782
+ public $etag;
3783
+ protected $itemsType = 'Google_Service_Calendar_Setting';
3784
+ protected $itemsDataType = 'array';
3785
+ public $kind;
3786
+ public $nextPageToken;
3787
+ public $nextSyncToken;
3788
+
3789
+
3790
+ public function setEtag($etag)
3791
+ {
3792
+ $this->etag = $etag;
3793
+ }
3794
+ public function getEtag()
3795
+ {
3796
+ return $this->etag;
3797
+ }
3798
+ public function setItems($items)
3799
+ {
3800
+ $this->items = $items;
3801
+ }
3802
+ public function getItems()
3803
+ {
3804
+ return $this->items;
3805
+ }
3806
+ public function setKind($kind)
3807
+ {
3808
+ $this->kind = $kind;
3809
+ }
3810
+ public function getKind()
3811
+ {
3812
+ return $this->kind;
3813
+ }
3814
+ public function setNextPageToken($nextPageToken)
3815
+ {
3816
+ $this->nextPageToken = $nextPageToken;
3817
+ }
3818
+ public function getNextPageToken()
3819
+ {
3820
+ return $this->nextPageToken;
3821
+ }
3822
+ public function setNextSyncToken($nextSyncToken)
3823
+ {
3824
+ $this->nextSyncToken = $nextSyncToken;
3825
+ }
3826
+ public function getNextSyncToken()
3827
+ {
3828
+ return $this->nextSyncToken;
3829
+ }
3830
+ }
3831
+
3832
+ class Google_Service_Calendar_TimePeriod extends Google_Model
3833
+ {
3834
+ protected $internal_gapi_mappings = array(
3835
+ );
3836
+ public $end;
3837
+ public $start;
3838
+
3839
+
3840
+ public function setEnd($end)
3841
+ {
3842
+ $this->end = $end;
3843
+ }
3844
+ public function getEnd()
3845
+ {
3846
+ return $this->end;
3847
+ }
3848
+ public function setStart($start)
3849
+ {
3850
+ $this->start = $start;
3851
+ }
3852
+ public function getStart()
3853
+ {
3854
+ return $this->start;
3855
+ }
3856
+ }
app/api/Google/Service/Exception.php ADDED
@@ -0,0 +1,105 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2014 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ if (!class_exists('Google_Client')) {
19
+ require_once dirname(__FILE__) . '/../autoload.php';
20
+ }
21
+
22
+ class Google_Service_Exception extends Google_Exception implements Google_Task_Retryable
23
+ {
24
+ /**
25
+ * Optional list of errors returned in a JSON body of an HTTP error response.
26
+ */
27
+ protected $errors = array();
28
+
29
+ /**
30
+ * @var array $retryMap Map of errors with retry counts.
31
+ */
32
+ private $retryMap = array();
33
+
34
+ /**
35
+ * Override default constructor to add the ability to set $errors and a retry
36
+ * map.
37
+ *
38
+ * @param string $message
39
+ * @param int $code
40
+ * @param Exception|null $previous
41
+ * @param [{string, string}] errors List of errors returned in an HTTP
42
+ * response. Defaults to [].
43
+ * @param array|null $retryMap Map of errors with retry counts.
44
+ */
45
+ public function __construct(
46
+ $message,
47
+ $code = 0,
48
+ Exception $previous = null,
49
+ $errors = array(),
50
+ array $retryMap = null
51
+ ) {
52
+ if (version_compare(PHP_VERSION, '5.3.0') >= 0) {
53
+ parent::__construct($message, $code, $previous);
54
+ } else {
55
+ parent::__construct($message, $code);
56
+ }
57
+
58
+ $this->errors = $errors;
59
+
60
+ if (is_array($retryMap)) {
61
+ $this->retryMap = $retryMap;
62
+ }
63
+ }
64
+
65
+ /**
66
+ * An example of the possible errors returned.
67
+ *
68
+ * {
69
+ * "domain": "global",
70
+ * "reason": "authError",
71
+ * "message": "Invalid Credentials",
72
+ * "locationType": "header",
73
+ * "location": "Authorization",
74
+ * }
75
+ *
76
+ * @return [{string, string}] List of errors return in an HTTP response or [].
77
+ */
78
+ public function getErrors()
79
+ {
80
+ return $this->errors;
81
+ }
82
+
83
+ /**
84
+ * Gets the number of times the associated task can be retried.
85
+ *
86
+ * NOTE: -1 is returned if the task can be retried indefinitely
87
+ *
88
+ * @return integer
89
+ */
90
+ public function allowedRetries()
91
+ {
92
+ if (isset($this->retryMap[$this->code])) {
93
+ return $this->retryMap[$this->code];
94
+ }
95
+
96
+ $errors = $this->getErrors();
97
+
98
+ if (!empty($errors) && isset($errors[0]['reason']) &&
99
+ isset($this->retryMap[$errors[0]['reason']])) {
100
+ return $this->retryMap[$errors[0]['reason']];
101
+ }
102
+
103
+ return 0;
104
+ }
105
+ }
app/api/Google/Service/Resource.php ADDED
@@ -0,0 +1,255 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright 2010 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ if (!class_exists('Google_Client')) {
19
+ require_once dirname(__FILE__) . '/../autoload.php';
20
+ }
21
+
22
+ /**
23
+ * Implements the actual methods/resources of the discovered Google API using magic function
24
+ * calling overloading (__call()), which on call will see if the method name (plus.activities.list)
25
+ * is available in this service, and if so construct an apiHttpRequest representing it.
26
+ *
27
+ */
28
+ class Google_Service_Resource
29
+ {
30
+ // Valid query parameters that work, but don't appear in discovery.
31
+ private $stackParameters = array(
32
+ 'alt' => array('type' => 'string', 'location' => 'query'),
33
+ 'fields' => array('type' => 'string', 'location' => 'query'),
34
+ 'trace' => array('type' => 'string', 'location' => 'query'),
35
+ 'userIp' => array('type' => 'string', 'location' => 'query'),
36
+ 'quotaUser' => array('type' => 'string', 'location' => 'query'),
37
+ 'data' => array('type' => 'string', 'location' => 'body'),
38
+ 'mimeType' => array('type' => 'string', 'location' => 'header'),
39
+ 'uploadType' => array('type' => 'string', 'location' => 'query'),
40
+ 'mediaUpload' => array('type' => 'complex', 'location' => 'query'),
41
+ 'prettyPrint' => array('type' => 'string', 'location' => 'query'),
42
+ );
43
+
44
+ /** @var string $rootUrl */
45
+ private $rootUrl;
46
+
47
+ /** @var Google_Client $client */
48
+ private $client;
49
+
50
+ /** @var string $serviceName */
51
+ private $serviceName;
52
+
53
+ /** @var string $servicePath */
54
+ private $servicePath;
55
+
56
+ /** @var string $resourceName */
57
+ private $resourceName;
58
+
59
+ /** @var array $methods */
60
+ private $methods;
61
+
62
+ public function __construct($service, $serviceName, $resourceName, $resource)
63
+ {
64
+ $this->rootUrl = $service->rootUrl;
65
+ $this->client = $service->getClient();
66
+ $this->servicePath = $service->servicePath;
67
+ $this->serviceName = $serviceName;
68
+ $this->resourceName = $resourceName;
69
+ $this->methods = is_array($resource) && isset($resource['methods']) ?
70
+ $resource['methods'] :
71
+ array($resourceName => $resource);
72
+ }
73
+
74
+ /**
75
+ * TODO: This function needs simplifying.
76
+ * @param $name
77
+ * @param $arguments
78
+ * @param $expected_class - optional, the expected class name
79
+ * @return Google_Http_Request|expected_class
80
+ * @throws Google_Exception
81
+ */
82
+ public function call($name, $arguments, $expected_class = null)
83
+ {
84
+ if (! isset($this->methods[$name])) {
85
+ $this->client->getLogger()->error(
86
+ 'Service method unknown',
87
+ array(
88
+ 'service' => $this->serviceName,
89
+ 'resource' => $this->resourceName,
90
+ 'method' => $name
91
+ )
92
+ );
93
+
94
+ throw new Google_Exception(
95
+ "Unknown function: " .
96
+ "{$this->serviceName}->{$this->resourceName}->{$name}()"
97
+ );
98
+ }
99
+ $method = $this->methods[$name];
100
+ $parameters = $arguments[0];
101
+
102
+ // postBody is a special case since it's not defined in the discovery
103
+ // document as parameter, but we abuse the param entry for storing it.
104
+ $postBody = null;
105
+ if (isset($parameters['postBody'])) {
106
+ if ($parameters['postBody'] instanceof Google_Model) {
107
+ // In the cases the post body is an existing object, we want
108
+ // to use the smart method to create a simple object for
109
+ // for JSONification.
110
+ $parameters['postBody'] = $parameters['postBody']->toSimpleObject();
111
+ } else if (is_object($parameters['postBody'])) {
112
+ // If the post body is another kind of object, we will try and
113
+ // wrangle it into a sensible format.
114
+ $parameters['postBody'] =
115
+ $this->convertToArrayAndStripNulls($parameters['postBody']);
116
+ }
117
+ $postBody = json_encode($parameters['postBody']);
118
+ if ($postBody === false && $parameters['postBody'] !== false) {
119
+ throw new Google_Exception("JSON encoding failed. Ensure all strings in the request are UTF-8 encoded.");
120
+ }
121
+ unset($parameters['postBody']);
122
+ }
123
+
124
+ // TODO: optParams here probably should have been
125
+ // handled already - this may well be redundant code.
126
+ if (isset($parameters['optParams'])) {
127
+ $optParams = $parameters['optParams'];
128
+ unset($parameters['optParams']);
129
+ $parameters = array_merge($parameters, $optParams);
130
+ }
131
+
132
+ if (!isset($method['parameters'])) {
133
+ $method['parameters'] = array();
134
+ }
135
+
136
+ $method['parameters'] = array_merge(
137
+ $this->stackParameters,
138
+ $method['parameters']
139
+ );
140
+ foreach ($parameters as $key => $val) {
141
+ if ($key != 'postBody' && ! isset($method['parameters'][$key])) {
142
+ $this->client->getLogger()->error(
143
+ 'Service parameter unknown',
144
+ array(
145
+ 'service' => $this->serviceName,
146
+ 'resource' => $this->resourceName,
147
+ 'method' => $name,
148
+ 'parameter' => $key
149
+ )
150
+ );
151
+ throw new Google_Exception("($name) unknown parameter: '$key'");
152
+ }
153
+ }
154
+
155
+ foreach ($method['parameters'] as $paramName => $paramSpec) {
156
+ if (isset($paramSpec['required']) &&
157
+ $paramSpec['required'] &&
158
+ ! isset($parameters[$paramName])
159
+ ) {
160
+ $this->client->getLogger()->error(
161
+ 'Service parameter missing',
162
+ array(
163
+ 'service' => $this->serviceName,
164
+ 'resource' => $this->resourceName,
165
+ 'method' => $name,
166
+ 'parameter' => $paramName
167
+ )
168
+ );
169
+ throw new Google_Exception("($name) missing required param: '$paramName'");
170
+ }
171
+ if (isset($parameters[$paramName])) {
172
+ $value = $parameters[$paramName];
173
+ $parameters[$paramName] = $paramSpec;
174
+ $parameters[$paramName]['value'] = $value;
175
+ unset($parameters[$paramName]['required']);
176
+ } else {
177
+ // Ensure we don't pass nulls.
178
+ unset($parameters[$paramName]);
179
+ }
180
+ }
181
+
182
+ $this->client->getLogger()->info(
183
+ 'Service Call',
184
+ array(
185
+ 'service' => $this->serviceName,
186
+ 'resource' => $this->resourceName,
187
+ 'method' => $name,
188
+ 'arguments' => $parameters,
189
+ )
190
+ );
191
+
192
+ $url = Google_Http_REST::createRequestUri(
193
+ $this->servicePath,
194
+ $method['path'],
195
+ $parameters
196
+ );
197
+ $httpRequest = new Google_Http_Request(
198
+ $url,
199
+ $method['httpMethod'],
200
+ null,
201
+ $postBody
202
+ );
203
+
204
+ if ($this->rootUrl) {
205
+ $httpRequest->setBaseComponent($this->rootUrl);
206
+ } else {
207
+ $httpRequest->setBaseComponent($this->client->getBasePath());
208
+ }
209
+
210
+ if ($postBody) {
211
+ $contentTypeHeader = array();
212
+ $contentTypeHeader['content-type'] = 'application/json; charset=UTF-8';
213
+ $httpRequest->setRequestHeaders($contentTypeHeader);
214
+ $httpRequest->setPostBody($postBody);
215
+ }
216
+
217
+ $httpRequest = $this->client->getAuth()->sign($httpRequest);
218
+ $httpRequest->setExpectedClass($expected_class);
219
+
220
+ if (isset($parameters['data']) &&
221
+ ($parameters['uploadType']['value'] == 'media' || $parameters['uploadType']['value'] == 'multipart')) {
222
+ // If we are doing a simple media upload, trigger that as a convenience.
223
+ $mfu = new Google_Http_MediaFileUpload(
224
+ $this->client,
225
+ $httpRequest,
226
+ isset($parameters['mimeType']) ? $parameters['mimeType']['value'] : 'application/octet-stream',
227
+ $parameters['data']['value']
228
+ );
229
+ }
230
+
231
+ if (isset($parameters['alt']) && $parameters['alt']['value'] == 'media') {
232
+ $httpRequest->enableExpectedRaw();
233
+ }
234
+
235
+ if ($this->client->shouldDefer()) {
236
+ // If we are in batch or upload mode, return the raw request.
237
+ return $httpRequest;
238
+ }
239
+
240
+ return $this->client->execute($httpRequest);
241
+ }
242
+
243
+ protected function convertToArrayAndStripNulls($o)
244
+ {
245
+ $o = (array) $o;
246
+ foreach ($o as $k => $v) {
247
+ if ($v === null) {
248
+ unset($o[$k]);
249
+ } elseif (is_object($v) || is_array($v)) {
250
+ $o[$k] = $this->convertToArrayAndStripNulls($o[$k]);
251
+ }
252
+ }
253
+ return $o;
254
+ }
255
+ }
app/api/Google/Signer/Abstract.php ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2011 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ /**
19
+ * Signs data.
20
+ *
21
+ * @author Brian Eaton <beaton@google.com>
22
+ */
23
+ abstract class Google_Signer_Abstract
24
+ {
25
+ /**
26
+ * Signs data, returns the signature as binary data.
27
+ */
28
+ abstract public function sign($data);
29
+ }
app/api/Google/Signer/P12.php ADDED
@@ -0,0 +1,94 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2011 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ if (!class_exists('Google_Client')) {
19
+ require_once dirname(__FILE__) . '/../autoload.php';
20
+ }
21
+
22
+ /**
23
+ * Signs data.
24
+ *
25
+ * Only used for testing.
26
+ *
27
+ * @author Brian Eaton <beaton@google.com>
28
+ */
29
+ class Google_Signer_P12 extends Google_Signer_Abstract
30
+ {
31
+ // OpenSSL private key resource
32
+ private $privateKey;
33
+
34
+ // Creates a new signer from a .p12 file.
35
+ public function __construct($p12, $password)
36
+ {
37
+ if (!function_exists('openssl_x509_read')) {
38
+ throw new Google_Exception(
39
+ 'The Google PHP API library needs the openssl PHP extension'
40
+ );
41
+ }
42
+
43
+ // If the private key is provided directly, then this isn't in the p12
44
+ // format. Different versions of openssl support different p12 formats
45
+ // and the key from google wasn't being accepted by the version available
46
+ // at the time.
47
+ if (!$password && strpos($p12, "-----BEGIN RSA PRIVATE KEY-----") !== false) {
48
+ $this->privateKey = openssl_pkey_get_private($p12);
49
+ } elseif ($password === 'notasecret' && strpos($p12, "-----BEGIN PRIVATE KEY-----") !== false) {
50
+ $this->privateKey = openssl_pkey_get_private($p12);
51
+ } else {
52
+ // This throws on error
53
+ $certs = array();
54
+ if (!openssl_pkcs12_read($p12, $certs, $password)) {
55
+ throw new Google_Auth_Exception(
56
+ "Unable to parse the p12 file. " .
57
+ "Is this a .p12 file? Is the password correct? OpenSSL error: " .
58
+ openssl_error_string()
59
+ );
60
+ }
61
+ // TODO(beaton): is this part of the contract for the openssl_pkcs12_read
62
+ // method? What happens if there are multiple private keys? Do we care?
63
+ if (!array_key_exists("pkey", $certs) || !$certs["pkey"]) {
64
+ throw new Google_Auth_Exception("No private key found in p12 file.");
65
+ }
66
+ $this->privateKey = openssl_pkey_get_private($certs['pkey']);
67
+ }
68
+
69
+ if (!$this->privateKey) {
70
+ throw new Google_Auth_Exception("Unable to load private key");
71
+ }
72
+ }
73
+
74
+ public function __destruct()
75
+ {
76
+ if ($this->privateKey) {
77
+ openssl_pkey_free($this->privateKey);
78
+ }
79
+ }
80
+
81
+ public function sign($data)
82
+ {
83
+ if (version_compare(PHP_VERSION, '5.3.0') < 0) {
84
+ throw new Google_Auth_Exception(
85
+ "PHP 5.3.0 or higher is required to use service accounts."
86
+ );
87
+ }
88
+ $hash = defined("OPENSSL_ALGO_SHA256") ? OPENSSL_ALGO_SHA256 : "sha256";
89
+ if (!openssl_sign($data, $signature, $this->privateKey, $hash)) {
90
+ throw new Google_Auth_Exception("Unable to sign data");
91
+ }
92
+ return $signature;
93
+ }
94
+ }
app/api/Google/Task/Exception.php ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2014 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ if (!class_exists('Google_Client')) {
19
+ require_once dirname(__FILE__) . '/../autoload.php';
20
+ }
21
+
22
+ class Google_Task_Exception extends Google_Exception
23
+ {
24
+ }
app/api/Google/Task/Retryable.php ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2014 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ if (!class_exists('Google_Client')) {
19
+ require_once dirname(__FILE__) . '/../autoload.php';
20
+ }
21
+
22
+ /**
23
+ * Interface for checking how many times a given task can be retried following
24
+ * a failure.
25
+ */
26
+ interface Google_Task_Retryable
27
+ {
28
+ /**
29
+ * Gets the number of times the associated task can be retried.
30
+ *
31
+ * NOTE: -1 is returned if the task can be retried indefinitely
32
+ *
33
+ * @return integer
34
+ */
35
+ public function allowedRetries();
36
+ }
app/api/Google/Task/Runner.php ADDED
@@ -0,0 +1,257 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2014 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ if (!class_exists('Google_Client')) {
19
+ require_once dirname(__FILE__) . '/../autoload.php';
20
+ }
21
+
22
+ /**
23
+ * A task runner with exponential backoff support.
24
+ *
25
+ * @see https://developers.google.com/drive/web/handle-errors#implementing_exponential_backoff
26
+ */
27
+ class Google_Task_Runner
28
+ {
29
+ /**
30
+ * @var integer $maxDelay The max time (in seconds) to wait before a retry.
31
+ */
32
+ private $maxDelay = 60;
33
+ /**
34
+ * @var integer $delay The previous delay from which the next is calculated.
35
+ */
36
+ private $delay = 1;
37
+
38
+ /**
39
+ * @var integer $factor The base number for the exponential back off.
40
+ */
41
+ private $factor = 2;
42
+ /**
43
+ * @var float $jitter A random number between -$jitter and $jitter will be
44
+ * added to $factor on each iteration to allow for a better distribution of
45
+ * retries.
46
+ */
47
+ private $jitter = 0.5;
48
+
49
+ /**
50
+ * @var integer $attempts The number of attempts that have been tried so far.
51
+ */
52
+ private $attempts = 0;
53
+ /**
54
+ * @var integer $maxAttempts The max number of attempts allowed.
55
+ */
56
+ private $maxAttempts = 1;
57
+
58
+ /**
59
+ * @var Google_Client $client The current API client.
60
+ */
61
+ private $client;
62
+
63
+ /**
64
+ * @var string $name The name of the current task (used for logging).
65
+ */
66
+ private $name;
67
+ /**
68
+ * @var callable $action The task to run and possibly retry.
69
+ */
70
+ private $action;
71
+ /**
72
+ * @var array $arguments The task arguments.
73
+ */
74
+ private $arguments;
75
+
76
+ /**
77
+ * Creates a new task runner with exponential backoff support.
78
+ *
79
+ * @param Google_Client $client The current API client
80
+ * @param string $name The name of the current task (used for logging)
81
+ * @param callable $action The task to run and possibly retry
82
+ * @param array $arguments The task arguments
83
+ * @throws Google_Task_Exception when misconfigured
84
+ */
85
+ public function __construct(
86
+ Google_Client $client,
87
+ $name,
88
+ $action,
89
+ array $arguments = array()
90
+ ) {
91
+ $config = (array) $client->getClassConfig('Google_Task_Runner');
92
+
93
+ if (isset($config['initial_delay'])) {
94
+ if ($config['initial_delay'] < 0) {
95
+ throw new Google_Task_Exception(
96
+ 'Task configuration `initial_delay` must not be negative.'
97
+ );
98
+ }
99
+
100
+ $this->delay = $config['initial_delay'];
101
+ }
102
+
103
+ if (isset($config['max_delay'])) {
104
+ if ($config['max_delay'] <= 0) {
105
+ throw new Google_Task_Exception(
106
+ 'Task configuration `max_delay` must be greater than 0.'
107
+ );
108
+ }
109
+
110
+ $this->maxDelay = $config['max_delay'];
111
+ }
112
+
113
+ if (isset($config['factor'])) {
114
+ if ($config['factor'] <= 0) {
115
+ throw new Google_Task_Exception(
116
+ 'Task configuration `factor` must be greater than 0.'
117
+ );
118
+ }
119
+
120
+ $this->factor = $config['factor'];
121
+ }
122
+
123
+ if (isset($config['jitter'])) {
124
+ if ($config['jitter'] <= 0) {
125
+ throw new Google_Task_Exception(
126
+ 'Task configuration `jitter` must be greater than 0.'
127
+ );
128
+ }
129
+
130
+ $this->jitter = $config['jitter'];
131
+ }
132
+
133
+ if (isset($config['retries'])) {
134
+ if ($config['retries'] < 0) {
135
+ throw new Google_Task_Exception(
136
+ 'Task configuration `retries` must not be negative.'
137
+ );
138
+ }
139
+ $this->maxAttempts += $config['retries'];
140
+ }
141
+
142
+ if (!is_callable($action)) {
143
+ throw new Google_Task_Exception(
144
+ 'Task argument `$action` must be a valid callable.'
145
+ );
146
+ }
147
+
148
+ $this->name = $name;
149
+ $this->client = $client;
150
+ $this->action = $action;
151
+ $this->arguments = $arguments;
152
+ }
153
+
154
+ /**
155
+ * Checks if a retry can be attempted.
156
+ *
157
+ * @return boolean
158
+ */
159
+ public function canAttmpt()
160
+ {
161
+ return $this->attempts < $this->maxAttempts;
162
+ }
163
+
164
+ /**
165
+ * Runs the task and (if applicable) automatically retries when errors occur.
166
+ *
167
+ * @return mixed
168
+ * @throws Google_Task_Retryable on failure when no retries are available.
169
+ */
170
+ public function run()
171
+ {
172
+ while ($this->attempt()) {
173
+ try {
174
+ return call_user_func_array($this->action, $this->arguments);
175
+ } catch (Google_Task_Retryable $exception) {
176
+ $allowedRetries = $exception->allowedRetries();
177
+
178
+ if (!$this->canAttmpt() || !$allowedRetries) {
179
+ throw $exception;
180
+ }
181
+
182
+ if ($allowedRetries > 0) {
183
+ $this->maxAttempts = min(
184
+ $this->maxAttempts,
185
+ $this->attempts + $allowedRetries
186
+ );
187
+ }
188
+ }
189
+ }
190
+ }
191
+
192
+ /**
193
+ * Runs a task once, if possible. This is useful for bypassing the `run()`
194
+ * loop.
195
+ *
196
+ * NOTE: If this is not the first attempt, this function will sleep in
197
+ * accordance to the backoff configurations before running the task.
198
+ *
199
+ * @return boolean
200
+ */
201
+ public function attempt()
202
+ {
203
+ if (!$this->canAttmpt()) {
204
+ return false;
205
+ }
206
+
207
+ if ($this->attempts > 0) {
208
+ $this->backOff();
209
+ }
210
+
211
+ $this->attempts++;
212
+ return true;
213
+ }
214
+
215
+ /**
216
+ * Sleeps in accordance to the backoff configurations.
217
+ */
218
+ private function backOff()
219
+ {
220
+ $delay = $this->getDelay();
221
+
222
+ $this->client->getLogger()->debug(
223
+ 'Retrying task with backoff',
224
+ array(
225
+ 'request' => $this->name,
226
+ 'retry' => $this->attempts,
227
+ 'backoff_seconds' => $delay
228
+ )
229
+ );
230
+
231
+ usleep($delay * 1000000);
232
+ }
233
+
234
+ /**
235
+ * Gets the delay (in seconds) for the current backoff period.
236
+ *
237
+ * @return float
238
+ */
239
+ private function getDelay()
240
+ {
241
+ $jitter = $this->getJitter();
242
+ $factor = $this->attempts > 1 ? $this->factor + $jitter : 1 + abs($jitter);
243
+
244
+ return $this->delay = min($this->maxDelay, $this->delay * $factor);
245
+ }
246
+
247
+ /**
248
+ * Gets the current jitter (random number between -$this->jitter and
249
+ * $this->jitter).
250
+ *
251
+ * @return float
252
+ */
253
+ private function getJitter()
254
+ {
255
+ return $this->jitter * 2 * mt_rand() / mt_getrandmax() - $this->jitter;
256
+ }
257
+ }
app/api/Google/Utils.php ADDED
@@ -0,0 +1,133 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2011 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ /**
19
+ * Collection of static utility methods used for convenience across
20
+ * the client library.
21
+ */
22
+ class Google_Utils
23
+ {
24
+ public static function urlSafeB64Encode($data)
25
+ {
26
+ $b64 = base64_encode($data);
27
+ $b64 = str_replace(
28
+ array('+', '/', '\r', '\n', '='),
29
+ array('-', '_'),
30
+ $b64
31
+ );
32
+ return $b64;
33
+ }
34
+
35
+ public static function urlSafeB64Decode($b64)
36
+ {
37
+ $b64 = str_replace(
38
+ array('-', '_'),
39
+ array('+', '/'),
40
+ $b64
41
+ );
42
+ return base64_decode($b64);
43
+ }
44
+
45
+ /**
46
+ * Misc function used to count the number of bytes in a post body, in the
47
+ * world of multi-byte chars and the unpredictability of
48
+ * strlen/mb_strlen/sizeof, this is the only way to do that in a sane
49
+ * manner at the moment.
50
+ *
51
+ * This algorithm was originally developed for the
52
+ * Solar Framework by Paul M. Jones
53
+ *
54
+ * @link http://solarphp.com/
55
+ * @link http://svn.solarphp.com/core/trunk/Solar/Json.php
56
+ * @link http://framework.zend.com/svn/framework/standard/trunk/library/Zend/Json/Decoder.php
57
+ * @param string $str
58
+ * @return int The number of bytes in a string.
59
+ */
60
+ public static function getStrLen($str)
61
+ {
62
+ $strlenVar = strlen($str);
63
+ $d = $ret = 0;
64
+ for ($count = 0; $count < $strlenVar; ++ $count) {
65
+ $ordinalValue = ord($str{$ret});
66
+ switch (true) {
67
+ case (($ordinalValue >= 0x20) && ($ordinalValue <= 0x7F)):
68
+ // characters U-00000000 - U-0000007F (same as ASCII)
69
+ $ret ++;
70
+ break;
71
+ case (($ordinalValue & 0xE0) == 0xC0):
72
+ // characters U-00000080 - U-000007FF, mask 110XXXXX
73
+ // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
74
+ $ret += 2;
75
+ break;
76
+ case (($ordinalValue & 0xF0) == 0xE0):
77
+ // characters U-00000800 - U-0000FFFF, mask 1110XXXX
78
+ // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
79
+ $ret += 3;
80
+ break;
81
+ case (($ordinalValue & 0xF8) == 0xF0):
82
+ // characters U-00010000 - U-001FFFFF, mask 11110XXX
83
+ // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
84
+ $ret += 4;
85
+ break;
86
+ case (($ordinalValue & 0xFC) == 0xF8):
87
+ // characters U-00200000 - U-03FFFFFF, mask 111110XX
88
+ // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
89
+ $ret += 5;
90
+ break;
91
+ case (($ordinalValue & 0xFE) == 0xFC):
92
+ // characters U-04000000 - U-7FFFFFFF, mask 1111110X
93
+ // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
94
+ $ret += 6;
95
+ break;
96
+ default:
97
+ $ret ++;
98
+ }
99
+ }
100
+ return $ret;
101
+ }
102
+
103
+ /**
104
+ * Normalize all keys in an array to lower-case.
105
+ * @param array $arr
106
+ * @return array Normalized array.
107
+ */
108
+ public static function normalize($arr)
109
+ {
110
+ if (!is_array($arr)) {
111
+ return array();
112
+ }
113
+
114
+ $normalized = array();
115
+ foreach ($arr as $key => $val) {
116
+ $normalized[strtolower($key)] = $val;
117
+ }
118
+ return $normalized;
119
+ }
120
+
121
+ /**
122
+ * Convert a string to camelCase
123
+ * @param string $value
124
+ * @return string
125
+ */
126
+ public static function camelCase($value)
127
+ {
128
+ $value = ucwords(str_replace(array('-', '_'), ' ', $value));
129
+ $value = str_replace(' ', '', $value);
130
+ $value[0] = strtolower($value[0]);
131
+ return $value;
132
+ }
133
+ }
app/api/Google/Utils/URITemplate.php ADDED
@@ -0,0 +1,333 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2013 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ /**
19
+ * Implementation of levels 1-3 of the URI Template spec.
20
+ * @see http://tools.ietf.org/html/rfc6570
21
+ */
22
+ class Google_Utils_URITemplate
23
+ {
24
+ const TYPE_MAP = "1";
25
+ const TYPE_LIST = "2";
26
+ const TYPE_SCALAR = "4";
27
+
28
+ /**
29
+ * @var $operators array
30
+ * These are valid at the start of a template block to
31
+ * modify the way in which the variables inside are
32
+ * processed.
33
+ */
34
+ private $operators = array(
35
+ "+" => "reserved",
36
+ "/" => "segments",
37
+ "." => "dotprefix",
38
+ "#" => "fragment",
39
+ ";" => "semicolon",
40
+ "?" => "form",
41
+ "&" => "continuation"
42
+ );
43
+
44
+ /**
45
+ * @var reserved array
46
+ * These are the characters which should not be URL encoded in reserved
47
+ * strings.
48
+ */
49
+ private $reserved = array(
50
+ "=", ",", "!", "@", "|", ":", "/", "?", "#",
51
+ "[", "]",'$', "&", "'", "(", ")", "*", "+", ";"
52
+ );
53
+ private $reservedEncoded = array(
54
+ "%3D", "%2C", "%21", "%40", "%7C", "%3A", "%2F", "%3F",
55
+ "%23", "%5B", "%5D", "%24", "%26", "%27", "%28", "%29",
56
+ "%2A", "%2B", "%3B"
57
+ );
58
+
59
+ public function parse($string, array $parameters)
60
+ {
61
+ return $this->resolveNextSection($string, $parameters);
62
+ }
63
+
64
+ /**
65
+ * This function finds the first matching {...} block and
66
+ * executes the replacement. It then calls itself to find
67
+ * subsequent blocks, if any.
68
+ */
69
+ private function resolveNextSection($string, $parameters)
70
+ {
71
+ $start = strpos($string, "{");
72
+ if ($start === false) {
73
+ return $string;
74
+ }
75
+ $end = strpos($string, "}");
76
+ if ($end === false) {
77
+ return $string;
78
+ }
79
+ $string = $this->replace($string, $start, $end, $parameters);
80
+ return $this->resolveNextSection($string, $parameters);
81
+ }
82
+
83
+ private function replace($string, $start, $end, $parameters)
84
+ {
85
+ // We know a data block will have {} round it, so we can strip that.
86
+ $data = substr($string, $start + 1, $end - $start - 1);
87
+
88
+ // If the first character is one of the reserved operators, it effects
89
+ // the processing of the stream.
90
+ if (isset($this->operators[$data[0]])) {
91
+ $op = $this->operators[$data[0]];
92
+ $data = substr($data, 1);
93
+ $prefix = "";
94
+ $prefix_on_missing = false;
95
+
96
+ switch ($op) {
97
+ case "reserved":
98
+ // Reserved means certain characters should not be URL encoded
99
+ $data = $this->replaceVars($data, $parameters, ",", null, true);
100
+ break;
101
+ case "fragment":
102
+ // Comma separated with fragment prefix. Bare values only.
103
+ $prefix = "#";
104
+ $prefix_on_missing = true;
105
+ $data = $this->replaceVars($data, $parameters, ",", null, true);
106
+ break;
107
+ case "segments":
108
+ // Slash separated data. Bare values only.
109
+ $prefix = "/";
110
+ $data =$this->replaceVars($data, $parameters, "/");
111
+ break;
112
+ case "dotprefix":
113
+ // Dot separated data. Bare values only.
114
+ $prefix = ".";
115
+ $prefix_on_missing = true;
116
+ $data = $this->replaceVars($data, $parameters, ".");
117
+ break;
118
+ case "semicolon":
119
+ // Semicolon prefixed and separated. Uses the key name
120
+ $prefix = ";";
121
+ $data = $this->replaceVars($data, $parameters, ";", "=", false, true, false);
122
+ break;
123
+ case "form":
124
+ // Standard URL format. Uses the key name
125
+ $prefix = "?";
126
+ $data = $this->replaceVars($data, $parameters, "&", "=");
127
+ break;
128
+ case "continuation":
129
+ // Standard URL, but with leading ampersand. Uses key name.
130
+ $prefix = "&";
131
+ $data = $this->replaceVars($data, $parameters, "&", "=");
132
+ break;
133
+ }
134
+
135
+ // Add the initial prefix character if data is valid.
136
+ if ($data || ($data !== false && $prefix_on_missing)) {
137
+ $data = $prefix . $data;
138
+ }
139
+
140
+ } else {
141
+ // If no operator we replace with the defaults.
142
+ $data = $this->replaceVars($data, $parameters);
143
+ }
144
+ // This is chops out the {...} and replaces with the new section.
145
+ return substr($string, 0, $start) . $data . substr($string, $end + 1);
146
+ }
147
+
148
+ private function replaceVars(
149
+ $section,
150
+ $parameters,
151
+ $sep = ",",
152
+ $combine = null,
153
+ $reserved = false,
154
+ $tag_empty = false,
155
+ $combine_on_empty = true
156
+ ) {
157
+ if (strpos($section, ",") === false) {
158
+ // If we only have a single value, we can immediately process.
159
+ return $this->combine(
160
+ $section,
161
+ $parameters,
162
+ $sep,
163
+ $combine,
164
+ $reserved,
165
+ $tag_empty,
166
+ $combine_on_empty
167
+ );
168
+ } else {
169
+ // If we have multiple values, we need to split and loop over them.
170
+ // Each is treated individually, then glued together with the
171
+ // separator character.
172
+ $vars = explode(",", $section);
173
+ return $this->combineList(
174
+ $vars,
175
+ $sep,
176
+ $parameters,
177
+ $combine,
178
+ $reserved,
179
+ false, // Never emit empty strings in multi-param replacements
180
+ $combine_on_empty
181
+ );
182
+ }
183
+ }
184
+
185
+ public function combine(
186
+ $key,
187
+ $parameters,
188
+ $sep,
189
+ $combine,
190
+ $reserved,
191
+ $tag_empty,
192
+ $combine_on_empty
193
+ ) {
194
+ $length = false;
195
+ $explode = false;
196
+ $skip_final_combine = false;
197
+ $value = false;
198
+
199
+ // Check for length restriction.
200
+ if (strpos($key, ":") !== false) {
201
+ list($key, $length) = explode(":", $key);
202
+ }
203
+
204
+ // Check for explode parameter.
205
+ if ($key[strlen($key) - 1] == "*") {
206
+ $explode = true;
207
+ $key = substr($key, 0, -1);
208
+ $skip_final_combine = true;
209
+ }
210
+
211
+ // Define the list separator.
212
+ $list_sep = $explode ? $sep : ",";
213
+
214
+ if (isset($parameters[$key])) {
215
+ $data_type = $this->getDataType($parameters[$key]);
216
+ switch ($data_type) {
217
+ case self::TYPE_SCALAR:
218
+ $value = $this->getValue($parameters[$key], $length);
219
+ break;
220
+ case self::TYPE_LIST:
221
+ $values = array();
222
+ foreach ($parameters[$key] as $pkey => $pvalue) {
223
+ $pvalue = $this->getValue($pvalue, $length);
224
+ if ($combine && $explode) {
225
+ $values[$pkey] = $key . $combine . $pvalue;
226
+ } else {
227
+ $values[$pkey] = $pvalue;
228
+ }
229
+ }
230
+ $value = implode($list_sep, $values);
231
+ if ($value == '') {
232
+ return '';
233
+ }
234
+ break;
235
+ case self::TYPE_MAP:
236
+ $values = array();
237
+ foreach ($parameters[$key] as $pkey => $pvalue) {
238
+ $pvalue = $this->getValue($pvalue, $length);
239
+ if ($explode) {
240
+ $pkey = $this->getValue($pkey, $length);
241
+ $values[] = $pkey . "=" . $pvalue; // Explode triggers = combine.
242
+ } else {
243
+ $values[] = $pkey;
244
+ $values[] = $pvalue;
245
+ }
246
+ }
247
+ $value = implode($list_sep, $values);
248
+ if ($value == '') {
249
+ return false;
250
+ }
251
+ break;
252
+ }
253
+ } else if ($tag_empty) {
254
+ // If we are just indicating empty values with their key name, return that.
255
+ return $key;
256
+ } else {
257
+ // Otherwise we can skip this variable due to not being defined.
258
+ return false;
259
+ }
260
+
261
+ if ($reserved) {
262
+ $value = str_replace($this->reservedEncoded, $this->reserved, $value);
263
+ }
264
+
265
+ // If we do not need to include the key name, we just return the raw
266
+ // value.
267
+ if (!$combine || $skip_final_combine) {
268
+ return $value;
269
+ }
270
+
271
+ // Else we combine the key name: foo=bar, if value is not the empty string.
272
+ return $key . ($value != '' || $combine_on_empty ? $combine . $value : '');
273
+ }
274
+
275
+ /**
276
+ * Return the type of a passed in value
277
+ */
278
+ private function getDataType($data)
279
+ {
280
+ if (is_array($data)) {
281
+ reset($data);
282
+ if (key($data) !== 0) {
283
+ return self::TYPE_MAP;
284
+ }
285
+ return self::TYPE_LIST;
286
+ }
287
+ return self::TYPE_SCALAR;
288
+ }
289
+
290
+ /**
291
+ * Utility function that merges multiple combine calls
292
+ * for multi-key templates.
293
+ */
294
+ private function combineList(
295
+ $vars,
296
+ $sep,
297
+ $parameters,
298
+ $combine,
299
+ $reserved,
300
+ $tag_empty,
301
+ $combine_on_empty
302
+ ) {
303
+ $ret = array();
304
+ foreach ($vars as $var) {
305
+ $response = $this->combine(
306
+ $var,
307
+ $parameters,
308
+ $sep,
309
+ $combine,
310
+ $reserved,
311
+ $tag_empty,
312
+ $combine_on_empty
313
+ );
314
+ if ($response === false) {
315
+ continue;
316
+ }
317
+ $ret[] = $response;
318
+ }
319
+ return implode($sep, $ret);
320
+ }
321
+
322
+ /**
323
+ * Utility function to encode and trim values
324
+ */
325
+ private function getValue($value, $length)
326
+ {
327
+ if ($length) {
328
+ $value = substr($value, 0, $length);
329
+ }
330
+ $value = rawurlencode($value);
331
+ return $value;
332
+ }
333
+ }
app/api/Google/Verifier/Abstract.php ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2011 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ /**
19
+ * Verifies signatures.
20
+ *
21
+ * @author Brian Eaton <beaton@google.com>
22
+ */
23
+ abstract class Google_Verifier_Abstract
24
+ {
25
+ /**
26
+ * Checks a signature, returns true if the signature is correct,
27
+ * false otherwise.
28
+ */
29
+ abstract public function verify($data, $signature);
30
+ }
app/api/Google/Verifier/Pem.php ADDED
@@ -0,0 +1,75 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2011 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ if (!class_exists('Google_Client')) {
19
+ require_once dirname(__FILE__) . '/../autoload.php';
20
+ }
21
+
22
+ /**
23
+ * Verifies signatures using PEM encoded certificates.
24
+ *
25
+ * @author Brian Eaton <beaton@google.com>
26
+ */
27
+ class Google_Verifier_Pem extends Google_Verifier_Abstract
28
+ {
29
+ private $publicKey;
30
+
31
+ /**
32
+ * Constructs a verifier from the supplied PEM-encoded certificate.
33
+ *
34
+ * $pem: a PEM encoded certificate (not a file).
35
+ * @param $pem
36
+ * @throws Google_Auth_Exception
37
+ * @throws Google_Exception
38
+ */
39
+ public function __construct($pem)
40
+ {
41
+ if (!function_exists('openssl_x509_read')) {
42
+ throw new Google_Exception('Google API PHP client needs the openssl PHP extension');
43
+ }
44
+ $this->publicKey = openssl_x509_read($pem);
45
+ if (!$this->publicKey) {
46
+ throw new Google_Auth_Exception("Unable to parse PEM: $pem");
47
+ }
48
+ }
49
+
50
+ public function __destruct()
51
+ {
52
+ if ($this->publicKey) {
53
+ openssl_x509_free($this->publicKey);
54
+ }
55
+ }
56
+
57
+ /**
58
+ * Verifies the signature on data.
59
+ *
60
+ * Returns true if the signature is valid, false otherwise.
61
+ * @param $data
62
+ * @param $signature
63
+ * @throws Google_Auth_Exception
64
+ * @return bool
65
+ */
66
+ public function verify($data, $signature)
67
+ {
68
+ $hash = defined("OPENSSL_ALGO_SHA256") ? OPENSSL_ALGO_SHA256 : "sha256";
69
+ $status = openssl_verify($data, $signature, $this->publicKey, $hash);
70
+ if ($status === -1) {
71
+ throw new Google_Auth_Exception('Signature verification error: ' . openssl_error_string());
72
+ }
73
+ return $status === 1;
74
+ }
75
+ }
app/api/Google/autoload.php ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright 2014 Google Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ function mec_google_api_php_client_autoload($className)
19
+ {
20
+ $classPath = explode('_', $className);
21
+
22
+ if($classPath[0] != 'Google')
23
+ {
24
+ return;
25
+ }
26
+
27
+ // Drop 'Google', and maximum class file path depth in this project is 3.
28
+ $classPath = array_slice($classPath, 1, 2);
29
+ $filePath = dirname(__FILE__) . DS . implode(DS, $classPath) . '.php';
30
+
31
+ if(file_exists($filePath))
32
+ {
33
+ require_once($filePath);
34
+ }
35
+ }
36
+
37
+ spl_autoload_register('mec_google_api_php_client_autoload');
app/api/Google/index.html ADDED
File without changes
app/api/Stripe/Account.php ADDED
@@ -0,0 +1,131 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class Account
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property mixed $business_logo
11
+ * @property string $business_name
12
+ * @property mixed $business_url
13
+ * @property bool $charges_enabled
14
+ * @property string $country
15
+ * @property bool $debit_negative_balances
16
+ * @property mixed $decline_charge_on
17
+ * @property string $default_currency
18
+ * @property bool $details_submitted
19
+ * @property string $display_name
20
+ * @property string $email
21
+ * @property mixed $external_accounts
22
+ * @property mixed $legal_entity
23
+ * @property bool $managed
24
+ * @property mixed $product_description
25
+ * @property mixed $statement_descriptor
26
+ * @property mixed $support_email
27
+ * @property mixed $support_phone
28
+ * @property string $timezone
29
+ * @property mixed $tos_acceptance
30
+ * @property mixed $transfer_schedule
31
+ * @property bool $transfers_enabled
32
+ * @property mixed $verification
33
+ * @property mixed $keys
34
+ *
35
+ * @package Stripe
36
+ */
37
+ class Account extends ApiResource
38
+ {
39
+ public function instanceUrl()
40
+ {
41
+ if ($this['id'] === null) {
42
+ return '/v1/account';
43
+ } else {
44
+ return parent::instanceUrl();
45
+ }
46
+ }
47
+
48
+ /**
49
+ * @param string|null $id
50
+ * @param array|string|null $opts
51
+ *
52
+ * @return Account
53
+ */
54
+ public static function retrieve($id = null, $opts = null)
55
+ {
56
+ if (!$opts && is_string($id) && substr($id, 0, 3) === 'sk_') {
57
+ $opts = $id;
58
+ $id = null;
59
+ }
60
+ return self::_retrieve($id, $opts);
61
+ }
62
+
63
+ /**
64
+ * @param array|null $params
65
+ * @param array|string|null $opts
66
+ *
67
+ * @return Account
68
+ */
69
+ public static function create($params = null, $opts = null)
70
+ {
71
+ return self::_create($params, $opts);
72
+ }
73
+
74
+ /**
75
+ * @param string $id The ID of the account to update.
76
+ * @param array|null $params
77
+ * @param array|string|null $options
78
+ *
79
+ * @return Account The updated account.
80
+ */
81
+ public static function update($id, $params = null, $options = null)
82
+ {
83
+ return self::_update($id, $params, $options);
84
+ }
85
+
86
+ /**
87
+ * @param array|string|null $opts
88
+ *
89
+ * @return Account
90
+ */
91
+ public function save($opts = null)
92
+ {
93
+ return $this->_save($opts);
94
+ }
95
+
96
+ /**
97
+ * @param array|null $params
98
+ * @param array|string|null $opts
99
+ *
100
+ * @return Account The deleted account.
101
+ */
102
+ public function delete($params = null, $opts = null)
103
+ {
104
+ return $this->_delete($params, $opts);
105
+ }
106
+
107
+ /**
108
+ * @param array|null $params
109
+ * @param array|string|null $opts
110
+ *
111
+ * @return Account The rejected account.
112
+ */
113
+ public function reject($params = null, $opts = null)
114
+ {
115
+ $url = $this->instanceUrl() . '/reject';
116
+ list($response, $opts) = $this->_request('post', $url, $params, $opts);
117
+ $this->refreshFrom($response, $opts);
118
+ return $this;
119
+ }
120
+
121
+ /**
122
+ * @param array|null $params
123
+ * @param array|string|null $opts
124
+ *
125
+ * @return Collection of Accounts
126
+ */
127
+ public static function all($params = null, $opts = null)
128
+ {
129
+ return self::_all($params, $opts);
130
+ }
131
+ }
app/api/Stripe/AlipayAccount.php ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class AlipayAccount
7
+ *
8
+ * @package Stripe
9
+ */
10
+ class AlipayAccount extends ExternalAccount
11
+ {
12
+
13
+ }
app/api/Stripe/ApiRequestor.php ADDED
@@ -0,0 +1,283 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class ApiRequestor
7
+ *
8
+ * @package Stripe
9
+ */
10
+ class ApiRequestor
11
+ {
12
+ private $_apiKey;
13
+
14
+ private $_apiBase;
15
+
16
+ private static $_httpClient;
17
+
18
+ public function __construct($apiKey = null, $apiBase = null)
19
+ {
20
+ $this->_apiKey = $apiKey;
21
+ if (!$apiBase) {
22
+ $apiBase = Stripe::$apiBase;
23
+ }
24
+ $this->_apiBase = $apiBase;
25
+ }
26
+
27
+ private static function _encodeObjects($d)
28
+ {
29
+ if ($d instanceof ApiResource) {
30
+ return Util\Util::utf8($d->id);
31
+ } elseif ($d === true) {
32
+ return 'true';
33
+ } elseif ($d === false) {
34
+ return 'false';
35
+ } elseif (is_array($d)) {
36
+ $res = array();
37
+ foreach ($d as $k => $v) {
38
+ $res[$k] = self::_encodeObjects($v);
39
+ }
40
+ return $res;
41
+ } else {
42
+ return Util\Util::utf8($d);
43
+ }
44
+ }
45
+
46
+ /**
47
+ * @param string $method
48
+ * @param string $url
49
+ * @param array|null $params
50
+ * @param array|null $headers
51
+ *
52
+ * @return array An array whose first element is an API response and second
53
+ * element is the API key used to make the request.
54
+ */
55
+ public function request($method, $url, $params = null, $headers = null)
56
+ {
57
+ if (!$params) {
58
+ $params = array();
59
+ }
60
+ if (!$headers) {
61
+ $headers = array();
62
+ }
63
+ list($rbody, $rcode, $rheaders, $myApiKey) =
64
+ $this->_requestRaw($method, $url, $params, $headers);
65
+ $json = $this->_interpretResponse($rbody, $rcode, $rheaders);
66
+ $resp = new ApiResponse($rbody, $rcode, $rheaders, $json);
67
+ return array($resp, $myApiKey);
68
+ }
69
+
70
+ /**
71
+ * @param string $rbody A JSON string.
72
+ * @param int $rcode
73
+ * @param array $rheaders
74
+ * @param array $resp
75
+ *
76
+ * @throws Error\InvalidRequest if the error is caused by the user.
77
+ * @throws Error\Authentication if the error is caused by a lack of
78
+ * permissions.
79
+ * @throws Error\Permission if the error is caused by insufficient
80
+ * permissions.
81
+ * @throws Error\Card if the error is the error code is 402 (payment
82
+ * required)
83
+ * @throws Error\RateLimit if the error is caused by too many requests
84
+ * hitting the API.
85
+ * @throws Error\Api otherwise.
86
+ */
87
+ public function handleApiError($rbody, $rcode, $rheaders, $resp)
88
+ {
89
+ if (!is_array($resp) || !isset($resp['error'])) {
90
+ $msg = "Invalid response object from API: $rbody "
91
+ . "(HTTP response code was $rcode)";
92
+ throw new Error\Api($msg, $rcode, $rbody, $resp, $rheaders);
93
+ }
94
+
95
+ $error = $resp['error'];
96
+ $msg = isset($error['message']) ? $error['message'] : null;
97
+ $param = isset($error['param']) ? $error['param'] : null;
98
+ $code = isset($error['code']) ? $error['code'] : null;
99
+
100
+ switch ($rcode) {
101
+ case 400:
102
+ // 'rate_limit' code is deprecated, but left here for backwards compatibility
103
+ // for API versions earlier than 2015-09-08
104
+ if ($code == 'rate_limit') {
105
+ throw new Error\RateLimit($msg, $param, $rcode, $rbody, $resp, $rheaders);
106
+ }
107
+
108
+ // intentional fall-through
109
+ case 404:
110
+ throw new Error\InvalidRequest($msg, $param, $rcode, $rbody, $resp, $rheaders);
111
+ case 401:
112
+ throw new Error\Authentication($msg, $rcode, $rbody, $resp, $rheaders);
113
+ case 402:
114
+ throw new Error\Card($msg, $param, $code, $rcode, $rbody, $resp, $rheaders);
115
+ case 403:
116
+ throw new Error\Permission($msg, $rcode, $rbody, $resp, $rheaders);
117
+ case 429:
118
+ throw new Error\RateLimit($msg, $param, $rcode, $rbody, $resp, $rheaders);
119
+ default:
120
+ throw new Error\Api($msg, $rcode, $rbody, $resp, $rheaders);
121
+ }
122
+ }
123
+
124
+ private static function _formatAppInfo($appInfo)
125
+ {
126
+ if ($appInfo !== null) {
127
+ $string = $appInfo['name'];
128
+ if ($appInfo['version'] !== null) {
129
+ $string .= '/' . $appInfo['version'];
130
+ }
131
+ if ($appInfo['url'] !== null) {
132
+ $string .= ' (' . $appInfo['url'] . ')';
133
+ }
134
+ return $string;
135
+ } else {
136
+ return null;
137
+ }
138
+ }
139
+
140
+ private static function _defaultHeaders($apiKey)
141
+ {
142
+ $appInfo = Stripe::getAppInfo();
143
+
144
+ $uaString = 'Stripe/v1 PhpBindings/' . Stripe::VERSION;
145
+
146
+ $langVersion = phpversion();
147
+ $uname = php_uname();
148
+ $curlVersion = curl_version();
149
+ $appInfo = Stripe::getAppInfo();
150
+ $ua = array(
151
+ 'bindings_version' => Stripe::VERSION,
152
+ 'lang' => 'php',
153
+ 'lang_version' => $langVersion,
154
+ 'publisher' => 'stripe',
155
+ 'uname' => $uname,
156
+ 'httplib' => 'curl ' . $curlVersion['version'],
157
+ 'ssllib' => $curlVersion['ssl_version'],
158
+ );
159
+ if ($appInfo !== null) {
160
+ $uaString .= ' ' . self::_formatAppInfo($appInfo);
161
+ $ua['application'] = $appInfo;
162
+ }
163
+
164
+ $defaultHeaders = array(
165
+ 'X-Stripe-Client-User-Agent' => json_encode($ua),
166
+ 'User-Agent' => $uaString,
167
+ 'Authorization' => 'Bearer ' . $apiKey,
168
+ );
169
+ return $defaultHeaders;
170
+ }
171
+
172
+ private function _requestRaw($method, $url, $params, $headers)
173
+ {
174
+ $myApiKey = $this->_apiKey;
175
+ if (!$myApiKey) {
176
+ $myApiKey = Stripe::$apiKey;
177
+ }
178
+
179
+ if (!$myApiKey) {
180
+ $msg = 'No API key provided. (HINT: set your API key using '
181
+ . '"Stripe::setApiKey(<API-KEY>)". You can generate API keys from '
182
+ . 'the Stripe web interface. See https://stripe.com/api for '
183
+ . 'details, or email support@stripe.com if you have any questions.';
184
+ throw new Error\Authentication($msg);
185
+ }
186
+
187
+ $absUrl = $this->_apiBase.$url;
188
+ $params = self::_encodeObjects($params);
189
+ $defaultHeaders = $this->_defaultHeaders($myApiKey);
190
+ if (Stripe::$apiVersion) {
191
+ $defaultHeaders['Stripe-Version'] = Stripe::$apiVersion;
192
+ }
193
+
194
+ if (Stripe::$accountId) {
195
+ $defaultHeaders['Stripe-Account'] = Stripe::$accountId;
196
+ }
197
+
198
+ $hasFile = false;
199
+ $hasCurlFile = class_exists('\CURLFile', false);
200
+ foreach ($params as $k => $v) {
201
+ if (is_resource($v)) {
202
+ $hasFile = true;
203
+ $params[$k] = self::_processResourceParam($v, $hasCurlFile);
204
+ } elseif ($hasCurlFile && $v instanceof \CURLFile) {
205
+ $hasFile = true;
206
+ }
207
+ }
208
+
209
+ if ($hasFile) {
210
+ $defaultHeaders['Content-Type'] = 'multipart/form-data';
211
+ } else {
212
+ $defaultHeaders['Content-Type'] = 'application/x-www-form-urlencoded';
213
+ }
214
+
215
+ $combinedHeaders = array_merge($defaultHeaders, $headers);
216
+ $rawHeaders = array();
217
+
218
+ foreach ($combinedHeaders as $header => $value) {
219
+ $rawHeaders[] = $header . ': ' . $value;
220
+ }
221
+
222
+ list($rbody, $rcode, $rheaders) = $this->httpClient()->request(
223
+ $method,
224
+ $absUrl,
225
+ $rawHeaders,
226
+ $params,
227
+ $hasFile
228
+ );
229
+ return array($rbody, $rcode, $rheaders, $myApiKey);
230
+ }
231
+
232
+ private function _processResourceParam($resource, $hasCurlFile)
233
+ {
234
+ if (get_resource_type($resource) !== 'stream') {
235
+ throw new Error\Api(
236
+ 'Attempted to upload a resource that is not a stream'
237
+ );
238
+ }
239
+
240
+ $metaData = stream_get_meta_data($resource);
241
+ if ($metaData['wrapper_type'] !== 'plainfile') {
242
+ throw new Error\Api(
243
+ 'Only plainfile resource streams are supported'
244
+ );
245
+ }
246
+
247
+ if ($hasCurlFile) {
248
+ // We don't have the filename or mimetype, but the API doesn't care
249
+ return new \CURLFile($metaData['uri']);
250
+ } else {
251
+ return '@'.$metaData['uri'];
252
+ }
253
+ }
254
+
255
+ private function _interpretResponse($rbody, $rcode, $rheaders)
256
+ {
257
+ try {
258
+ $resp = json_decode($rbody, true);
259
+ } catch (Exception $e) {
260
+ $msg = "Invalid response body from API: $rbody "
261
+ . "(HTTP response code was $rcode)";
262
+ throw new Error\Api($msg, $rcode, $rbody);
263
+ }
264
+
265
+ if ($rcode < 200 || $rcode >= 300) {
266
+ $this->handleApiError($rbody, $rcode, $rheaders, $resp);
267
+ }
268
+ return $resp;
269
+ }
270
+
271
+ public static function setHttpClient($client)
272
+ {
273
+ self::$_httpClient = $client;
274
+ }
275
+
276
+ private function httpClient()
277
+ {
278
+ if (!self::$_httpClient) {
279
+ self::$_httpClient = HttpClient\CurlClient::instance();
280
+ }
281
+ return self::$_httpClient;
282
+ }
283
+ }
app/api/Stripe/ApiResource.php ADDED
@@ -0,0 +1,205 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class ApiResource
7
+ *
8
+ * @package Stripe
9
+ */
10
+ abstract class ApiResource extends StripeObject
11
+ {
12
+ private static $HEADERS_TO_PERSIST = array('Stripe-Account' => true, 'Stripe-Version' => true);
13
+
14
+ public static function baseUrl()
15
+ {
16
+ return Stripe::$apiBase;
17
+ }
18
+
19
+ /**
20
+ * @return ApiResource The refreshed resource.
21
+ */
22
+ public function refresh()
23
+ {
24
+ $requestor = new ApiRequestor($this->_opts->apiKey, static::baseUrl());
25
+ $url = $this->instanceUrl();
26
+
27
+ list($response, $this->_opts->apiKey) = $requestor->request(
28
+ 'get',
29
+ $url,
30
+ $this->_retrieveOptions,
31
+ $this->_opts->headers
32
+ );
33
+ $this->setLastResponse($response);
34
+ $this->refreshFrom($response->json, $this->_opts);
35
+ return $this;
36
+ }
37
+
38
+ /**
39
+ * @return string The name of the class, with namespacing and underscores
40
+ * stripped.
41
+ */
42
+ public static function className()
43
+ {
44
+ $class = get_called_class();
45
+ // Useful for namespaces: Foo\Charge
46
+ if ($postfixNamespaces = strrchr($class, '\\')) {
47
+ $class = substr($postfixNamespaces, 1);
48
+ }
49
+ // Useful for underscored 'namespaces': Foo_Charge
50
+ if ($postfixFakeNamespaces = strrchr($class, '')) {
51
+ $class = $postfixFakeNamespaces;
52
+ }
53
+ if (substr($class, 0, strlen('Stripe')) == 'Stripe') {
54
+ $class = substr($class, strlen('Stripe'));
55
+ }
56
+ $class = str_replace('_', '', $class);
57
+ $name = urlencode($class);
58
+ $name = strtolower($name);
59
+ return $name;
60
+ }
61
+
62
+ /**
63
+ * @return string The endpoint URL for the given class.
64
+ */
65
+ public static function classUrl()
66
+ {
67
+ $base = static::className();
68
+ return "/v1/${base}s";
69
+ }
70
+
71
+ /**
72
+ * @return string The instance endpoint URL for the given class.
73
+ */
74
+ public static function resourceUrl($id)
75
+ {
76
+ if ($id === null) {
77
+ $class = get_called_class();
78
+ $message = "Could not determine which URL to request: "
79
+ . "$class instance has invalid ID: $id";
80
+ throw new Error\InvalidRequest($message, null);
81
+ }
82
+ $id = Util\Util::utf8($id);
83
+ $base = static::classUrl();
84
+ $extn = urlencode($id);
85
+ return "$base/$extn";
86
+ }
87
+
88
+ /**
89
+ * @return string The full API URL for this API resource.
90
+ */
91
+ public function instanceUrl()
92
+ {
93
+ return static::resourceUrl($this['id']);
94
+ }
95
+
96
+ private static function _validateParams($params = null)
97
+ {
98
+ if ($params && !is_array($params)) {
99
+ $message = "You must pass an array as the first argument to Stripe API "
100
+ . "method calls. (HINT: an example call to create a charge "
101
+ . "would be: \"Stripe\\Charge::create(array('amount' => 100, "
102
+ . "'currency' => 'usd', 'card' => array('number' => "
103
+ . "4242424242424242, 'exp_month' => 5, 'exp_year' => 2015)))\")";
104
+ throw new Error\Api($message);
105
+ }
106
+ }
107
+
108
+ protected function _request($method, $url, $params = array(), $options = null)
109
+ {
110
+ $opts = $this->_opts->merge($options);
111
+ list($resp, $options) = static::_staticRequest($method, $url, $params, $opts);
112
+ $this->setLastResponse($resp);
113
+ return array($resp->json, $options);
114
+ }
115
+
116
+ protected static function _staticRequest($method, $url, $params, $options)
117
+ {
118
+ $opts = Util\RequestOptions::parse($options);
119
+ $requestor = new ApiRequestor($opts->apiKey, static::baseUrl());
120
+ list($response, $opts->apiKey) = $requestor->request($method, $url, $params, $opts->headers);
121
+ foreach ($opts->headers as $k => $v) {
122
+ if (!array_key_exists($k, self::$HEADERS_TO_PERSIST)) {
123
+ unset($opts->headers[$k]);
124
+ }
125
+ }
126
+ return array($response, $opts);
127
+ }
128
+
129
+ protected static function _retrieve($id, $options = null)
130
+ {
131
+ $opts = Util\RequestOptions::parse($options);
132
+ $instance = new static($id, $opts);
133
+ $instance->refresh();
134
+ return $instance;
135
+ }
136
+
137
+ protected static function _all($params = null, $options = null)
138
+ {
139
+ self::_validateParams($params);
140
+ $url = static::classUrl();
141
+
142
+ list($response, $opts) = static::_staticRequest('get', $url, $params, $options);
143
+ $obj = Util\Util::convertToStripeObject($response->json, $opts);
144
+ if (!is_a($obj, 'Stripe\\Collection')) {
145
+ $class = get_class($obj);
146
+ $message = "Expected type \"Stripe\\Collection\", got \"$class\" instead";
147
+ throw new Error\Api($message);
148
+ }
149
+ $obj->setLastResponse($response);
150
+ $obj->setRequestParams($params);
151
+ return $obj;
152
+ }
153
+
154
+ protected static function _create($params = null, $options = null)
155
+ {
156
+ self::_validateParams($params);
157
+ $base = static::baseUrl();
158
+ $url = static::classUrl();
159
+
160
+ list($response, $opts) = static::_staticRequest('post', $url, $params, $options);
161
+ $obj = Util\Util::convertToStripeObject($response->json, $opts);
162
+ $obj->setLastResponse($response);
163
+ return $obj;
164
+ }
165
+
166
+ /**
167
+ * @param string $id The ID of the API resource to update.
168
+ * @param array|null $params
169
+ * @param array|string|null $opts
170
+ *
171
+ * @return ApiResource the updated API resource
172
+ */
173
+ protected static function _update($id, $params = null, $options = null)
174
+ {
175
+ self::_validateParams($params);
176
+ $base = static::baseUrl();
177
+ $url = static::resourceUrl($id);
178
+
179
+ list($response, $opts) = static::_staticRequest('post', $url, $params, $options);
180
+ $obj = Util\Util::convertToStripeObject($response->json, $opts);
181
+ $obj->setLastResponse($response);
182
+ return $obj;
183
+ }
184
+
185
+ protected function _save($options = null)
186
+ {
187
+ $params = $this->serializeParameters();
188
+ if (count($params) > 0) {
189
+ $url = $this->instanceUrl();
190
+ list($response, $opts) = $this->_request('post', $url, $params, $options);
191
+ $this->refreshFrom($response, $opts);
192
+ }
193
+ return $this;
194
+ }
195
+
196
+ protected function _delete($params = null, $options = null)
197
+ {
198
+ self::_validateParams($params);
199
+
200
+ $url = $this->instanceUrl();
201
+ list($response, $opts) = $this->_request('delete', $url, $params, $options);
202
+ $this->refreshFrom($response, $opts);
203
+ return $this;
204
+ }
205
+ }
app/api/Stripe/ApiResponse.php ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class ApiResponse
7
+ *
8
+ * @package Stripe
9
+ */
10
+ class ApiResponse
11
+ {
12
+ public $headers;
13
+ public $body;
14
+ public $json;
15
+ public $code;
16
+
17
+ /**
18
+ * @param string $body
19
+ * @param integer $code
20
+ * @param array|null $headers
21
+ * @param array|null $json
22
+ *
23
+ * @return obj An APIResponse
24
+ */
25
+ public function __construct($body, $code, $headers, $json)
26
+ {
27
+ $this->body = $body;
28
+ $this->code = $code;
29
+ $this->headers = $headers;
30
+ $this->json = $json;
31
+ }
32
+ }
app/api/Stripe/ApplePayDomain.php ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class ApplePayDomain
7
+ *
8
+ * @package Stripe
9
+ */
10
+ class ApplePayDomain extends ApiResource
11
+ {
12
+
13
+ /**
14
+ * @return string The class URL for this resource. It needs to be special
15
+ * cased because it doesn't fit into the standard resource pattern.
16
+ */
17
+ public static function classUrl()
18
+ {
19
+ return '/v1/apple_pay/domains';
20
+ }
21
+
22
+ /**
23
+ * @param string $id The ID of the domain to retrieve.
24
+ * @param array|string|null $opts
25
+ *
26
+ * @return ApplePayDomain
27
+ */
28
+ public static function retrieve($id, $opts = null)
29
+ {
30
+ return self::_retrieve($id, $opts);
31
+ }
32
+
33
+ /**
34
+ * @param array|null $params
35
+ * @param array|string|null $opts
36
+ *
37
+ * @return ApplePayDomain The created domain.
38
+ */
39
+ public static function create($params = null, $opts = null)
40
+ {
41
+ return self::_create($params, $opts);
42
+ }
43
+
44
+ /**
45
+ * @param array|null $params
46
+ * @param array|string|null $opts
47
+ *
48
+ * @return ApplePayDomain The deleted domain.
49
+ */
50
+ public function delete($params = null, $opts = null)
51
+ {
52
+ return $this->_delete($params, $opts);
53
+ }
54
+
55
+ /**
56
+ * @param array|null $params
57
+ * @param array|string|null $opts
58
+ *
59
+ * @return Collection of ApplePayDomains
60
+ */
61
+ public static function all($params = null, $opts = null)
62
+ {
63
+ return self::_all($params, $opts);
64
+ }
65
+ }
app/api/Stripe/ApplicationFee.php ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class ApplicationFee
7
+ *
8
+ * @package Stripe
9
+ */
10
+ class ApplicationFee extends ApiResource
11
+ {
12
+ /**
13
+ * This is a special case because the application fee endpoint has an
14
+ * underscore in it. The parent `className` function strips underscores.
15
+ *
16
+ * @return string The name of the class.
17
+ */
18
+ public static function className()
19
+ {
20
+ return 'application_fee';
21
+ }
22
+
23
+ /**
24
+ * @param string $id The ID of the application fee to retrieve.
25
+ * @param array|string|null $opts
26
+ *
27
+ * @return ApplicationFee
28
+ */
29
+ public static function retrieve($id, $opts = null)
30
+ {
31
+ return self::_retrieve($id, $opts);
32
+ }
33
+
34
+ /**
35
+ * @param string $id The ID of the application fee to update.
36
+ * @param array|null $params
37
+ * @param array|string|null $options
38
+ *
39
+ * @return ApplicationFee The updated application fee.
40
+ */
41
+ public static function update($id, $params = null, $options = null)
42
+ {
43
+ return self::_update($id, $params, $options);
44
+ }
45
+
46
+ /**
47
+ * @param array|null $params
48
+ * @param array|string|null $opts
49
+ *
50
+ * @return Collection of ApplicationFees
51
+ */
52
+ public static function all($params = null, $opts = null)
53
+ {
54
+ return self::_all($params, $opts);
55
+ }
56
+
57
+ /**
58
+ * @param array|null $params
59
+ * @param array|string|null $opts
60
+ *
61
+ * @return ApplicationFee The refunded application fee.
62
+ */
63
+ public function refund($params = null, $opts = null)
64
+ {
65
+ $this->refunds->create($params, $opts);
66
+ $this->refresh();
67
+ return $this;
68
+ }
69
+ }
app/api/Stripe/ApplicationFeeRefund.php ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class ApplicationFeeRefund
7
+ *
8
+ * @package Stripe
9
+ */
10
+ class ApplicationFeeRefund extends ApiResource
11
+ {
12
+ /**
13
+ * @return string The API URL for this Stripe refund.
14
+ */
15
+ public function instanceUrl()
16
+ {
17
+ $id = $this['id'];
18
+ $fee = $this['fee'];
19
+ if (!$id) {
20
+ throw new Error\InvalidRequest(
21
+ "Could not determine which URL to request: " .
22
+ "class instance has invalid ID: $id",
23
+ null
24
+ );
25
+ }
26
+ $id = Util\Util::utf8($id);
27
+ $fee = Util\Util::utf8($fee);
28
+
29
+ $base = ApplicationFee::classUrl();
30
+ $feeExtn = urlencode($fee);
31
+ $extn = urlencode($id);
32
+ return "$base/$feeExtn/refunds/$extn";
33
+ }
34
+
35
+ /**
36
+ * @param array|string|null $opts
37
+ *
38
+ * @return ApplicationFeeRefund The saved refund.
39
+ */
40
+ public function save($opts = null)
41
+ {
42
+ return $this->_save($opts);
43
+ }
44
+ }
app/api/Stripe/AttachedObject.php ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class AttachedObject
7
+ *
8
+ * e.g. metadata on Stripe objects.
9
+ *
10
+ * @package Stripe
11
+ */
12
+ class AttachedObject extends StripeObject
13
+ {
14
+ /**
15
+ * Updates this object.
16
+ *
17
+ * @param array $properties A mapping of properties to update on this object.
18
+ */
19
+ public function replaceWith($properties)
20
+ {
21
+ $removed = array_diff(array_keys($this->_values), array_keys($properties));
22
+ // Don't unset, but rather set to null so we send up '' for deletion.
23
+ foreach ($removed as $k) {
24
+ $this->$k = null;
25
+ }
26
+
27
+ foreach ($properties as $k => $v) {
28
+ $this->$k = $v;
29
+ }
30
+ }
31
+ }
app/api/Stripe/Balance.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class Balance
7
+ *
8
+ * @property string $object
9
+ * @property mixed $available
10
+ * @property bool $livedmode
11
+ * @property mixed $pending
12
+ *
13
+ * @package Stripe
14
+ */
15
+ class Balance extends SingletonApiResource
16
+ {
17
+ /**
18
+ * @param array|string|null $opts
19
+ *
20
+ * @return Balance
21
+ */
22
+ public static function retrieve($opts = null)
23
+ {
24
+ return self::_singletonRetrieve($opts);
25
+ }
26
+ }
app/api/Stripe/BalanceTransaction.php ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class BalanceTransaction
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property int $amount
11
+ * @property int $available_on
12
+ * @property int $created
13
+ * @property string $currency
14
+ * @property string $description
15
+ * @property int $fee
16
+ * @property mixed $fee_details
17
+ * @property int $net
18
+ * @property string $source
19
+ * @property mixed $sourced_transfers
20
+ * @property string $status
21
+ * @property string $type
22
+ *
23
+ * @package Stripe
24
+ */
25
+ class BalanceTransaction extends ApiResource
26
+ {
27
+ /**
28
+ * @return string The class URL for this resource. It needs to be special
29
+ * cased because it doesn't fit into the standard resource pattern.
30
+ */
31
+ public static function classUrl()
32
+ {
33
+ return "/v1/balance/history";
34
+ }
35
+
36
+ /**
37
+ * @param string $id The ID of the balance transaction to retrieve.
38
+ * @param array|string|null $opts
39
+ *
40
+ * @return BalanceTransaction
41
+ */
42
+ public static function retrieve($id, $opts = null)
43
+ {
44
+ return self::_retrieve($id, $opts);
45
+ }
46
+
47
+ /**
48
+ * @param array|null $params
49
+ * @param array|string|null $opts
50
+ *
51
+ * @return Collection of BalanceTransactions
52
+ */
53
+ public static function all($params = null, $opts = null)
54
+ {
55
+ return self::_all($params, $opts);
56
+ }
57
+ }
app/api/Stripe/BankAccount.php ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class BankAccount
7
+ *
8
+ * @package Stripe
9
+ */
10
+ class BankAccount extends ExternalAccount
11
+ {
12
+ /**
13
+ * @param array|null $params
14
+ * @param array|string|null $options
15
+ *
16
+ * @return BankAccount The verified bank account.
17
+ */
18
+ public function verify($params = null, $options = null)
19
+ {
20
+ $url = $this->instanceUrl() . '/verify';
21
+ list($response, $opts) = $this->_request('post', $url, $params, $options);
22
+ $this->refreshFrom($response, $opts);
23
+ return $this;
24
+ }
25
+ }
app/api/Stripe/BitcoinReceiver.php ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class BitcoinReceiver
7
+ *
8
+ * @package Stripe
9
+ */
10
+ class BitcoinReceiver extends ExternalAccount
11
+ {
12
+ /**
13
+ * @return string The class URL for this resource. It needs to be special
14
+ * cased because it doesn't fit into the standard resource pattern.
15
+ */
16
+ public static function classUrl()
17
+ {
18
+ return "/v1/bitcoin/receivers";
19
+ }
20
+
21
+ /**
22
+ * @return string The instance URL for this resource. It needs to be special
23
+ * cased because it doesn't fit into the standard resource pattern.
24
+ */
25
+ public function instanceUrl()
26
+ {
27
+ $result = parent::instanceUrl();
28
+ if ($result) {
29
+ return $result;
30
+ } else {
31
+ $id = $this['id'];
32
+ $id = Util\Util::utf8($id);
33
+ $extn = urlencode($id);
34
+ $base = BitcoinReceiver::classUrl();
35
+ return "$base/$extn";
36
+ }
37
+ }
38
+
39
+ /**
40
+ * @param string $id The ID of the Bitcoin Receiver to retrieve.
41
+ * @param array|string|null $opts
42
+ *
43
+ * @return BitcoinReceiver
44
+ */
45
+ public static function retrieve($id, $opts = null)
46
+ {
47
+ return self::_retrieve($id, $opts);
48
+ }
49
+
50
+ /**
51
+ * @param array|null $params
52
+ * @param array|string|null $opts
53
+ *
54
+ * @return Collection of BitcoinReceivers
55
+ */
56
+ public static function all($params = null, $opts = null)
57
+ {
58
+ return self::_all($params, $opts);
59
+ }
60
+
61
+ /**
62
+ * @param array|null $params
63
+ * @param array|string|null $opts
64
+ *
65
+ * @return BitcoinReceiver The created Bitcoin Receiver item.
66
+ */
67
+ public static function create($params = null, $opts = null)
68
+ {
69
+ return self::_create($params, $opts);
70
+ }
71
+
72
+ /**
73
+ * @param array|null $params
74
+ * @param array|string|null $options
75
+ *
76
+ * @return BitcoinReceiver The refunded Bitcoin Receiver item.
77
+ */
78
+ public function refund($params = null, $options = null)
79
+ {
80
+ $url = $this->instanceUrl() . '/refund';
81
+ list($response, $opts) = $this->_request('post', $url, $params, $options);
82
+ $this->refreshFrom($response, $opts);
83
+ return $this;
84
+ }
85
+ }
app/api/Stripe/BitcoinTransaction.php ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class BitcoinTransaction
7
+ *
8
+ * @package Stripe
9
+ */
10
+ class BitcoinTransaction extends ApiResource
11
+ {
12
+
13
+ }
app/api/Stripe/Card.php ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class Card
7
+ *
8
+ * @package Stripe
9
+ */
10
+ class Card extends ExternalAccount
11
+ {
12
+
13
+ }
app/api/Stripe/Charge.php ADDED
@@ -0,0 +1,184 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class Charge
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property int $amount
11
+ * @property int $amount_refunded
12
+ * @property mixed $application_fee
13
+ * @property string $balance_transaction
14
+ * @property bool $captured
15
+ * @property int $created
16
+ * @property string $currency
17
+ * @property string $customer
18
+ * @property mixed $description
19
+ * @property mixed $destination
20
+ * @property mixed $dispute
21
+ * @property mixed $failure_code
22
+ * @property mixed $failure_message
23
+ * @property mixed $fraud_details
24
+ * @property mixed $invoice
25
+ * @property bool $livemode
26
+ * @property mixed $metadata
27
+ * @property mixed $order
28
+ * @property bool $paid
29
+ * @property mixed $receipt_email
30
+ * @property mixed $receipt_number
31
+ * @property bool $refunded
32
+ * @property mixed $refunds
33
+ * @property mixed $shipping
34
+ * @property mixed $source
35
+ * @property mixed $source_transfer
36
+ * @property mixed $statement_descriptor
37
+ * @property string $status
38
+ *
39
+ * @package Stripe
40
+ */
41
+ class Charge extends ApiResource
42
+ {
43
+ /**
44
+ * @param string $id The ID of the charge to retrieve.
45
+ * @param array|string|null $options
46
+ *
47
+ * @return Charge
48
+ */
49
+ public static function retrieve($id, $options = null)
50
+ {
51
+ return self::_retrieve($id, $options);
52
+ }
53
+
54
+ /**
55
+ * @param array|null $params
56
+ * @param array|string|null $options
57
+ *
58
+ * @return Collection of Charges
59
+ */
60
+ public static function all($params = null, $options = null)
61
+ {
62
+ return self::_all($params, $options);
63
+ }
64
+
65
+ /**
66
+ * @param array|null $params
67
+ * @param array|string|null $options
68
+ *
69
+ * @return Charge The created charge.
70
+ */
71
+ public static function create($params = null, $options = null)
72
+ {
73
+ return self::_create($params, $options);
74
+ }
75
+
76
+ /**
77
+ * @param string $id The ID of the charge to update.
78
+ * @param array|null $params
79
+ * @param array|string|null $options
80
+ *
81
+ * @return Charge The updated charge.
82
+ */
83
+ public static function update($id, $params = null, $options = null)
84
+ {
85
+ return self::_update($id, $params, $options);
86
+ }
87
+
88
+ /**
89
+ * @param array|string|null $options
90
+ *
91
+ * @return Charge The saved charge.
92
+ */
93
+ public function save($options = null)
94
+ {
95
+ return $this->_save($options);
96
+ }
97
+
98
+ /**
99
+ * @param array|null $params
100
+ * @param array|string|null $options
101
+ *
102
+ * @return Charge The refunded charge.
103
+ */
104
+ public function refund($params = null, $options = null)
105
+ {
106
+ $url = $this->instanceUrl() . '/refund';
107
+ list($response, $opts) = $this->_request('post', $url, $params, $options);
108
+ $this->refreshFrom($response, $opts);
109
+ return $this;
110
+ }
111
+
112
+ /**
113
+ * @param array|null $params
114
+ * @param array|string|null $options
115
+ *
116
+ * @return Charge The captured charge.
117
+ */
118
+ public function capture($params = null, $options = null)
119
+ {
120
+ $url = $this->instanceUrl() . '/capture';
121
+ list($response, $opts) = $this->_request('post', $url, $params, $options);
122
+ $this->refreshFrom($response, $opts);
123
+ return $this;
124
+ }
125
+
126
+ /**
127
+ * @param array|null $params
128
+ * @param array|string|null $options
129
+ *
130
+ * @deprecated Use the `save` method on the Dispute object
131
+ *
132
+ * @return array The updated dispute.
133
+ */
134
+ public function updateDispute($params = null, $options = null)
135
+ {
136
+ $url = $this->instanceUrl() . '/dispute';
137
+ list($response, $opts) = $this->_request('post', $url, $params, $options);
138
+ $this->refreshFrom(array('dispute' => $response), $opts, true);
139
+ return $this->dispute;
140
+ }
141
+
142
+ /**
143
+ * @param array|string|null $options
144
+ *
145
+ * @deprecated Use the `close` method on the Dispute object
146
+ *
147
+ * @return Charge The updated charge.
148
+ */
149
+ public function closeDispute($options = null)
150
+ {
151
+ $url = $this->instanceUrl() . '/dispute/close';
152
+ list($response, $opts) = $this->_request('post', $url, null, $options);
153
+ $this->refreshFrom($response, $opts);
154
+ return $this;
155
+ }
156
+
157
+ /**
158
+ * @param array|string|null $opts
159
+ *
160
+ * @return Charge The updated charge.
161
+ */
162
+ public function markAsFraudulent($opts = null)
163
+ {
164
+ $params = array('fraud_details' => array('user_report' => 'fraudulent'));
165
+ $url = $this->instanceUrl();
166
+ list($response, $opts) = $this->_request('post', $url, $params, $opts);
167
+ $this->refreshFrom($response, $opts);
168
+ return $this;
169
+ }
170
+
171
+ /**
172
+ * @param array|string|null $opts
173
+ *
174
+ * @return Charge The updated charge.
175
+ */
176
+ public function markAsSafe($opts = null)
177
+ {
178
+ $params = array('fraud_details' => array('user_report' => 'safe'));
179
+ $url = $this->instanceUrl();
180
+ list($response, $opts) = $this->_request('post', $url, $params, $opts);
181
+ $this->refreshFrom($response, $opts);
182
+ return $this;
183
+ }
184
+ }
app/api/Stripe/Collection.php ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class Collection
7
+ *
8
+ * @property string $object
9
+ * @property string $url
10
+ * @property bool $has_more
11
+ * @property mixed $data
12
+ *
13
+ * @package Stripe
14
+ */
15
+ class Collection extends ApiResource
16
+ {
17
+ protected $_requestParams = array();
18
+
19
+ public function setRequestParams($params)
20
+ {
21
+ $this->_requestParams = $params;
22
+ }
23
+
24
+ public function all($params = null, $opts = null)
25
+ {
26
+ list($url, $params) = $this->extractPathAndUpdateParams($params);
27
+
28
+ list($response, $opts) = $this->_request('get', $url, $params, $opts);
29
+ $this->_requestParams = $params;
30
+ return Util\Util::convertToStripeObject($response, $opts);
31
+ }
32
+
33
+ public function create($params = null, $opts = null)
34
+ {
35
+ list($url, $params) = $this->extractPathAndUpdateParams($params);
36
+
37
+ list($response, $opts) = $this->_request('post', $url, $params, $opts);
38
+ $this->_requestParams = $params;
39
+ return Util\Util::convertToStripeObject($response, $opts);
40
+ }
41
+
42
+ public function retrieve($id, $params = null, $opts = null)
43
+ {
44
+ list($url, $params) = $this->extractPathAndUpdateParams($params);
45
+
46
+ $id = Util\Util::utf8($id);
47
+ $extn = urlencode($id);
48
+ list($response, $opts) = $this->_request(
49
+ 'get',
50
+ "$url/$extn",
51
+ $params,
52
+ $opts
53
+ );
54
+ $this->_requestParams = $params;
55
+ return Util\Util::convertToStripeObject($response, $opts);
56
+ }
57
+
58
+ /**
59
+ * @return AutoPagingIterator An iterator that can be used to iterate
60
+ * across all objects across all pages. As page boundaries are
61
+ * encountered, the next page will be fetched automatically for
62
+ * continued iteration.
63
+ */
64
+ public function autoPagingIterator()
65
+ {
66
+ return new Util\AutoPagingIterator($this, $this->_requestParams);
67
+ }
68
+
69
+ private function extractPathAndUpdateParams($params)
70
+ {
71
+ $url = parse_url($this->url);
72
+ if (!isset($url['path'])) {
73
+ throw new Error\Api("Could not parse list url into parts: $url");
74
+ }
75
+
76
+ if (isset($url['query'])) {
77
+ // If the URL contains a query param, parse it out into $params so they
78
+ // don't interact weirdly with each other.
79
+ $query = array();
80
+ parse_str($url['query'], $query);
81
+ // PHP 5.2 doesn't support the ?: operator :(
82
+ $params = array_merge($params ? $params : array(), $query);
83
+ }
84
+
85
+ return array($url['path'], $params);
86
+ }
87
+ }
app/api/Stripe/CountrySpec.php ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class CountrySpec
7
+ *
8
+ * @package Stripe
9
+ */
10
+ class CountrySpec extends ApiResource
11
+ {
12
+ /**
13
+ * This is a special case because the country specs endpoint has an
14
+ * underscore in it. The parent `className` function strips underscores.
15
+ *
16
+ * @return string The name of the class.
17
+ */
18
+ public static function className()
19
+ {
20
+ return 'country_spec';
21
+ }
22
+
23
+ /**
24
+ * @param string $country The ISO country code of the country we retrieve the CountrySpec for.
25
+ * @param array|string|null $opts
26
+ *
27
+ * @return CountrySpec
28
+ */
29
+ public static function retrieve($country, $opts = null)
30
+ {
31
+ return self::_retrieve($country, $opts);
32
+ }
33
+
34
+ /**
35
+ * @param array|null $params
36
+ * @param array|string|null $opts
37
+ *
38
+ * @return Collection of CountrySpecs
39
+ */
40
+ public static function all($params = null, $opts = null)
41
+ {
42
+ return self::_all($params, $opts);
43
+ }
44
+ }
app/api/Stripe/Coupon.php ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class Coupon
7
+ *
8
+ * @package Stripe
9
+ */
10
+ class Coupon extends ApiResource
11
+ {
12
+ /**
13
+ * @param string $id The ID of the coupon to retrieve.
14
+ * @param array|string|null $opts
15
+ *
16
+ * @return Coupon
17
+ */
18
+ public static function retrieve($id, $opts = null)
19
+ {
20
+ return self::_retrieve($id, $opts);
21
+ }
22
+
23
+ /**
24
+ * @param array|null $params
25
+ * @param array|string|null $opts
26
+ *
27
+ * @return Coupon The created coupon.
28
+ */
29
+ public static function create($params = null, $opts = null)
30
+ {
31
+ return self::_create($params, $opts);
32
+ }
33
+
34
+ /**
35
+ * @param string $id The ID of the coupon to update.
36
+ * @param array|null $params
37
+ * @param array|string|null $options
38
+ *
39
+ * @return Coupon The updated coupon.
40
+ */
41
+ public static function update($id, $params = null, $options = null)
42
+ {
43
+ return self::_update($id, $params, $options);
44
+ }
45
+
46
+ /**
47
+ * @param array|null $params
48
+ * @param array|string|null $opts
49
+ *
50
+ * @return Coupon The deleted coupon.
51
+ */
52
+ public function delete($params = null, $opts = null)
53
+ {
54
+ return $this->_delete($params, $opts);
55
+ }
56
+
57
+ /**
58
+ * @param array|string|null $opts
59
+ *
60
+ * @return Coupon The saved coupon.
61
+ */
62
+ public function save($opts = null)
63
+ {
64
+ return $this->_save($opts);
65
+ }
66
+
67
+ /**
68
+ * @param array|null $params
69
+ * @param array|string|null $opts
70
+ *
71
+ * @return Collection of Coupons
72
+ */
73
+ public static function all($params = null, $opts = null)
74
+ {
75
+ return self::_all($params, $opts);
76
+ }
77
+ }
app/api/Stripe/Customer.php ADDED
@@ -0,0 +1,190 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class Customer
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property int $account_balance
11
+ * @property string $business_vat_id
12
+ * @property string $created
13
+ * @property string $currency
14
+ * @property string $default_source
15
+ * @property bool $delinquent
16
+ * @property string $description
17
+ * @property mixed $discount
18
+ * @property string $email
19
+ * @property bool $livemode
20
+ * @property array $metadata
21
+ * @property mixed $shipping
22
+ * @property Collection $sources
23
+ * @property Collection $subscriptions
24
+ *
25
+ * @package Stripe
26
+ */
27
+ class Customer extends ApiResource
28
+ {
29
+ /**
30
+ * @param string $id The ID of the customer to retrieve.
31
+ * @param array|string|null $opts
32
+ *
33
+ * @return Customer
34
+ */
35
+ public static function retrieve($id, $opts = null)
36
+ {
37
+ return self::_retrieve($id, $opts);
38
+ }
39
+
40
+ /**
41
+ * @param array|null $params
42
+ * @param array|string|null $opts
43
+ *
44
+ * @return Collection of Customers
45
+ */
46
+ public static function all($params = null, $opts = null)
47
+ {
48
+ return self::_all($params, $opts);
49
+ }
50
+
51
+ /**
52
+ * @param array|null $params
53
+ * @param array|string|null $opts
54
+ *
55
+ * @return Customer The created customer.
56
+ */
57
+ public static function create($params = null, $opts = null)
58
+ {
59
+ return self::_create($params, $opts);
60
+ }
61
+
62
+ /**
63
+ * @param string $id The ID of the customer to update.
64
+ * @param array|null $params
65
+ * @param array|string|null $options
66
+ *
67
+ * @return Customer The updated customer.
68
+ */
69
+ public static function update($id, $params = null, $options = null)
70
+ {
71
+ return self::_update($id, $params, $options);
72
+ }
73
+
74
+ /**
75
+ * @param array|string|null $opts
76
+ *
77
+ * @return Customer The saved customer.
78
+ */
79
+ public function save($opts = null)
80
+ {
81
+ return $this->_save($opts);
82
+ }
83
+
84
+ /**
85
+ * @param array|null $params
86
+ * @param array|string|null $opts
87
+ *
88
+ * @return Customer The deleted customer.
89
+ */
90
+ public function delete($params = null, $opts = null)
91
+ {
92
+ return $this->_delete($params, $opts);
93
+ }
94
+
95
+ /**
96
+ * @param array|null $params
97
+ *
98
+ * @return InvoiceItem The resulting invoice item.
99
+ */
100
+ public function addInvoiceItem($params = null)
101
+ {
102
+ if (!$params) {
103
+ $params = array();
104
+ }
105
+ $params['customer'] = $this->id;
106
+ $ii = InvoiceItem::create($params, $this->_opts);
107
+ return $ii;
108
+ }
109
+
110
+ /**
111
+ * @param array|null $params
112
+ *
113
+ * @return array An array of the customer's Invoices.
114
+ */
115
+ public function invoices($params = null)
116
+ {
117
+ if (!$params) {
118
+ $params = array();
119
+ }
120
+ $params['customer'] = $this->id;
121
+ $invoices = Invoice::all($params, $this->_opts);
122
+ return $invoices;
123
+ }
124
+
125
+ /**
126
+ * @param array|null $params
127
+ *
128
+ * @return array An array of the customer's InvoiceItems.
129
+ */
130
+ public function invoiceItems($params = null)
131
+ {
132
+ if (!$params) {
133
+ $params = array();
134
+ }
135
+ $params['customer'] = $this->id;
136
+ $iis = InvoiceItem::all($params, $this->_opts);
137
+ return $iis;
138
+ }
139
+
140
+ /**
141
+ * @param array|null $params
142
+ *
143
+ * @return array An array of the customer's Charges.
144
+ */
145
+ public function charges($params = null)
146
+ {
147
+ if (!$params) {
148
+ $params = array();
149
+ }
150
+ $params['customer'] = $this->id;
151
+ $charges = Charge::all($params, $this->_opts);
152
+ return $charges;
153
+ }
154
+
155
+ /**
156
+ * @param array|null $params
157
+ *
158
+ * @return Subscription The updated subscription.
159
+ */
160
+ public function updateSubscription($params = null)
161
+ {
162
+ $url = $this->instanceUrl() . '/subscription';
163
+ list($response, $opts) = $this->_request('post', $url, $params);
164
+ $this->refreshFrom(array('subscription' => $response), $opts, true);
165
+ return $this->subscription;
166
+ }
167
+
168
+ /**
169
+ * @param array|null $params
170
+ *
171
+ * @return Subscription The cancelled subscription.
172
+ */
173
+ public function cancelSubscription($params = null)
174
+ {
175
+ $url = $this->instanceUrl() . '/subscription';
176
+ list($response, $opts) = $this->_request('delete', $url, $params);
177
+ $this->refreshFrom(array('subscription' => $response), $opts, true);
178
+ return $this->subscription;
179
+ }
180
+
181
+ /**
182
+ * @return Customer The updated customer.
183
+ */
184
+ public function deleteDiscount()
185
+ {
186
+ $url = $this->instanceUrl() . '/discount';
187
+ list($response, $opts) = $this->_request('delete', $url);
188
+ $this->refreshFrom(array('discount' => null), $opts, true);
189
+ }
190
+ }
app/api/Stripe/Dispute.php ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class Dispute
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property int $amount
11
+ * @property mixed $balance_transactions
12
+ * @property string $charge
13
+ * @property int $created
14
+ * @property string $currency
15
+ * @property mixed $evidence
16
+ * @property mixed $evidence_details
17
+ * @property bool $is_charge_refundable
18
+ * @property bool $livemode
19
+ * @property mixed $metadata
20
+ * @property string $reason
21
+ * @property string $status
22
+ *
23
+ * @package Stripe
24
+ */
25
+ class Dispute extends ApiResource
26
+ {
27
+ /**
28
+ * @param string $id The ID of the dispute to retrieve.
29
+ * @param array|string|null $options
30
+ *
31
+ * @return Dispute
32
+ */
33
+ public static function retrieve($id, $options = null)
34
+ {
35
+ return self::_retrieve($id, $options);
36
+ }
37
+
38
+ /**
39
+ * @param array|null $params
40
+ * @param array|string|null $options
41
+ *
42
+ * @return array An array of Disputes.
43
+ */
44
+ public static function all($params = null, $options = null)
45
+ {
46
+ return self::_all($params, $options);
47
+ }
48
+
49
+ /**
50
+ * @param string $id The ID of the dispute to update.
51
+ * @param array|null $params
52
+ * @param array|string|null $options
53
+ *
54
+ * @return Dispute The updated dispute.
55
+ */
56
+ public static function update($id, $params = null, $options = null)
57
+ {
58
+ return self::_update($id, $params, $options);
59
+ }
60
+
61
+ /**
62
+ * @param array|string|null $options
63
+ *
64
+ * @return Dispute The saved charge.
65
+ */
66
+ public function save($options = null)
67
+ {
68
+ return $this->_save($options);
69
+ }
70
+
71
+ /**
72
+ * @param array|string|null $options
73
+ *
74
+ * @return Dispute The closed dispute.
75
+ */
76
+ public function close($options = null)
77
+ {
78
+ $url = $this->instanceUrl() . '/close';
79
+ list($response, $opts) = $this->_request('post', $url, null, $options);
80
+ $this->refreshFrom($response, $opts);
81
+ return $this;
82
+ }
83
+ }
app/api/Stripe/Error/Api.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\Error;
4
+
5
+ class Api extends Base
6
+ {
7
+ }
app/api/Stripe/Error/ApiConnection.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\Error;
4
+
5
+ class ApiConnection extends Base
6
+ {
7
+ }
app/api/Stripe/Error/Authentication.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\Error;
4
+
5
+ class Authentication extends Base
6
+ {
7
+ }
app/api/Stripe/Error/Base.php ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\Error;
4
+
5
+ use Exception;
6
+
7
+ abstract class Base extends Exception
8
+ {
9
+ public function __construct(
10
+ $message,
11
+ $httpStatus = null,
12
+ $httpBody = null,
13
+ $jsonBody = null,
14
+ $httpHeaders = null
15
+ ) {
16
+ parent::__construct($message);
17
+ $this->httpStatus = $httpStatus;
18
+ $this->httpBody = $httpBody;
19
+ $this->jsonBody = $jsonBody;
20
+ $this->httpHeaders = $httpHeaders;
21
+ $this->requestId = null;
22
+
23
+ if ($httpHeaders && isset($httpHeaders['Request-Id'])) {
24
+ $this->requestId = $httpHeaders['Request-Id'];
25
+ }
26
+ }
27
+
28
+ public function getHttpStatus()
29
+ {
30
+ return $this->httpStatus;
31
+ }
32
+
33
+ public function getHttpBody()
34
+ {
35
+ return $this->httpBody;
36
+ }
37
+
38
+ public function getJsonBody()
39
+ {
40
+ return $this->jsonBody;
41
+ }
42
+
43
+ public function getHttpHeaders()
44
+ {
45
+ return $this->httpHeaders;
46
+ }
47
+
48
+ public function getRequestId()
49
+ {
50
+ return $this->requestId;
51
+ }
52
+
53
+ public function __toString()
54
+ {
55
+ $id = $this->requestId ? " from API request '{$this->requestId}'": "";
56
+ $message = explode("\n", parent::__toString());
57
+ $message[0] .= $id;
58
+ return implode("\n", $message);
59
+ }
60
+ }
app/api/Stripe/Error/Card.php ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\Error;
4
+
5
+ class Card extends Base
6
+ {
7
+ public function __construct(
8
+ $message,
9
+ $stripeParam,
10
+ $stripeCode,
11
+ $httpStatus,
12
+ $httpBody,
13
+ $jsonBody,
14
+ $httpHeaders = null
15
+ ) {
16
+ parent::__construct($message, $httpStatus, $httpBody, $jsonBody, $httpHeaders);
17
+ $this->stripeParam = $stripeParam;
18
+ $this->stripeCode = $stripeCode;
19
+
20
+ // This one is not like the others because it was added later and we're
21
+ // trying to do our best not to change the public interface of this class'
22
+ // constructor. We should consider changing its implementation on the
23
+ // next major version bump of this library.
24
+ $this->declineCode = isset($jsonBody["error"]["decline_code"]) ? $jsonBody["error"]["decline_code"] : null;
25
+ }
26
+
27
+ public function getDeclineCode()
28
+ {
29
+ return $this->declineCode;
30
+ }
31
+
32
+ public function getStripeCode()
33
+ {
34
+ return $this->stripeCode;
35
+ }
36
+
37
+ public function getStripeParam()
38
+ {
39
+ return $this->stripeParam;
40
+ }
41
+ }
app/api/Stripe/Error/InvalidRequest.php ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\Error;
4
+
5
+ class InvalidRequest extends Base
6
+ {
7
+ public function __construct(
8
+ $message,
9
+ $stripeParam,
10
+ $httpStatus = null,
11
+ $httpBody = null,
12
+ $jsonBody = null,
13
+ $httpHeaders = null
14
+ ) {
15
+ parent::__construct($message, $httpStatus, $httpBody, $jsonBody, $httpHeaders);
16
+ $this->stripeParam = $stripeParam;
17
+ }
18
+
19
+ public function getStripeParam()
20
+ {
21
+ return $this->stripeParam;
22
+ }
23
+ }
app/api/Stripe/Error/Permission.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\Error;
4
+
5
+ class Permission extends Base
6
+ {
7
+ }
app/api/Stripe/Error/RateLimit.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\Error;
4
+
5
+ class RateLimit extends InvalidRequest
6
+ {
7
+ }
app/api/Stripe/Event.php ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class Event
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property string $api_version
11
+ * @property int $created
12
+ * @property mixed $data
13
+ * @property bool $livemode
14
+ * @property int $pending_webhooks
15
+ * @property string $request
16
+ * @property string $type
17
+ *
18
+ * @package Stripe
19
+ */
20
+ class Event extends ApiResource
21
+ {
22
+ /**
23
+ * @param string $id The ID of the event to retrieve.
24
+ * @param array|string|null $opts
25
+ *
26
+ * @return Event
27
+ */
28
+ public static function retrieve($id, $opts = null)
29
+ {
30
+ return self::_retrieve($id, $opts);
31
+ }
32
+
33
+ /**
34
+ * @param array|null $params
35
+ * @param array|string|null $opts
36
+ *
37
+ * @return Collection of Events
38
+ */
39
+ public static function all($params = null, $opts = null)
40
+ {
41
+ return self::_all($params, $opts);
42
+ }
43
+ }
app/api/Stripe/ExternalAccount.php ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class ExternalAccount
7
+ *
8
+ * @package Stripe
9
+ */
10
+ abstract class ExternalAccount extends ApiResource
11
+ {
12
+ /**
13
+ * @return string The instance URL for this resource. It needs to be special
14
+ * cased because it doesn't fit into the standard resource pattern.
15
+ */
16
+ public function instanceUrl()
17
+ {
18
+ $id = $this['id'];
19
+ if (!$id) {
20
+ $class = get_class($this);
21
+ $msg = "Could not determine which URL to request: $class instance "
22
+ . "has invalid ID: $id";
23
+ throw new Error\InvalidRequest($msg, null);
24
+ }
25
+
26
+ if ($this['customer']) {
27
+ $parent = $this['customer'];
28
+ $base = Customer::classUrl();
29
+ $path = 'sources';
30
+ } elseif ($this['account']) {
31
+ $parent = $this['account'];
32
+ $base = Account::classUrl();
33
+ $path = 'external_accounts';
34
+ } elseif ($this['recipient']) {
35
+ $parent = $this['recipient'];
36
+ $base = Recipient::classUrl();
37
+ $path = 'cards';
38
+ } else {
39
+ return null;
40
+ }
41
+
42
+ $parent = Util\Util::utf8($parent);
43
+ $id = Util\Util::utf8($id);
44
+
45
+ $parentExtn = urlencode($parent);
46
+ $extn = urlencode($id);
47
+ return "$base/$parentExtn/$path/$extn";
48
+ }
49
+
50
+ /**
51
+ * @param array|null $params
52
+ * @param array|string|null $opts
53
+ *
54
+ * @return ExternalAccount The deleted external account.
55
+ */
56
+ public function delete($params = null, $opts = null)
57
+ {
58
+ return $this->_delete($params, $opts);
59
+ }
60
+
61
+ /**
62
+ * @param array|string|null $opts
63
+ *
64
+ * @return ExternalAccount The saved external account.
65
+ */
66
+ public function save($opts = null)
67
+ {
68
+ return $this->_save($opts);
69
+ }
70
+
71
+ /**
72
+ * @param array|null $params
73
+ * @param array|string|null $opts
74
+ *
75
+ * @return ExternalAccount The verified (or not) external account.
76
+ */
77
+ public function verify($params = null, $opts = null)
78
+ {
79
+ if ($this['customer']) {
80
+ $url = $this->instanceUrl() . '/verify';
81
+ list($response, $options) = $this->_request('post', $url, $params, $opts);
82
+ $this->refreshFrom($response, $options);
83
+ return $this;
84
+ } else {
85
+ $message = 'Only customer external accounts can be verified in this manner.';
86
+ throw new Error\Api($message);
87
+ }
88
+ }
89
+ }
app/api/Stripe/FileUpload.php ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class FileUpload
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property int $created
11
+ * @property string $purpose
12
+ * @property int $size
13
+ * @property string $type
14
+ *
15
+ * @package Stripe
16
+ */
17
+ class FileUpload extends ApiResource
18
+ {
19
+ public static function baseUrl()
20
+ {
21
+ return Stripe::$apiUploadBase;
22
+ }
23
+
24
+ public static function className()
25
+ {
26
+ return 'file';
27
+ }
28
+
29
+ /**
30
+ * @param string $id The ID of the file upload to retrieve.
31
+ * @param array|string|null $opts
32
+ *
33
+ * @return FileUpload
34
+ */
35
+ public static function retrieve($id, $opts = null)
36
+ {
37
+ return self::_retrieve($id, $opts);
38
+ }
39
+
40
+ /**
41
+ * @param array|null $params
42
+ * @param array|string|null $opts
43
+ *
44
+ * @return FileUpload The created file upload.
45
+ */
46
+ public static function create($params = null, $opts = null)
47
+ {
48
+ return self::_create($params, $opts);
49
+ }
50
+
51
+ /**
52
+ * @param array|null $params
53
+ * @param array|string|null $opts
54
+ *
55
+ * @return Collection of FileUploads
56
+ */
57
+ public static function all($params = null, $opts = null)
58
+ {
59
+ return self::_all($params, $opts);
60
+ }
61
+ }
app/api/Stripe/HttpClient/ClientInterface.php ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\HttpClient;
4
+
5
+ interface ClientInterface
6
+ {
7
+ /**
8
+ * @param string $method The HTTP method being used
9
+ * @param string $absUrl The URL being requested, including domain and protocol
10
+ * @param array $headers Headers to be used in the request (full strings, not KV pairs)
11
+ * @param array $params KV pairs for parameters. Can be nested for arrays and hashes
12
+ * @param boolean $hasFile Whether or not $params references a file (via an @ prefix or
13
+ * CurlFile)
14
+ * @throws Error\Api & Error\ApiConnection
15
+ * @return array($rawBody, $httpStatusCode, $httpHeader)
16
+ */
17
+ public function request($method, $absUrl, $headers, $params, $hasFile);
18
+ }
app/api/Stripe/HttpClient/CurlClient.php ADDED
@@ -0,0 +1,282 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\HttpClient;
4
+
5
+ use Stripe\Stripe;
6
+ use Stripe\Error;
7
+ use Stripe\Util;
8
+
9
+ // cURL constants are not defined in PHP < 5.5
10
+
11
+ // @codingStandardsIgnoreStart
12
+ // PSR2 requires all constants be upper case. Sadly, the CURL_SSLVERSION
13
+ // constants do not abide by those rules.
14
+
15
+ // Note the values 1 and 6 come from their position in the enum that
16
+ // defines them in cURL's source code.
17
+ if (!defined('CURL_SSLVERSION_TLSv1')) {
18
+ define('CURL_SSLVERSION_TLSv1', 1);
19
+ }
20
+ if (!defined('CURL_SSLVERSION_TLSv1_2')) {
21
+ define('CURL_SSLVERSION_TLSv1_2', 6);
22
+ }
23
+ // @codingStandardsIgnoreEnd
24
+
25
+ class CurlClient implements ClientInterface
26
+ {
27
+ private static $instance;
28
+
29
+ public static function instance()
30
+ {
31
+ if (!self::$instance) {
32
+ self::$instance = new self();
33
+ }
34
+ return self::$instance;
35
+ }
36
+
37
+ protected $defaultOptions;
38
+
39
+ /**
40
+ * CurlClient constructor.
41
+ *
42
+ * Pass in a callable to $defaultOptions that returns an array of CURLOPT_* values to start
43
+ * off a request with, or an flat array with the same format used by curl_setopt_array() to
44
+ * provide a static set of options. Note that many options are overridden later in the request
45
+ * call, including timeouts, which can be set via setTimeout() and setConnectTimeout().
46
+ *
47
+ * Note that request() will silently ignore a non-callable, non-array $defaultOptions, and will
48
+ * throw an exception if $defaultOptions returns a non-array value.
49
+ *
50
+ * @param array|callable|null $defaultOptions
51
+ */
52
+ public function __construct($defaultOptions = null)
53
+ {
54
+ $this->defaultOptions = $defaultOptions;
55
+ }
56
+
57
+ public function getDefaultOptions()
58
+ {
59
+ return $this->defaultOptions;
60
+ }
61
+
62
+ // USER DEFINED TIMEOUTS
63
+
64
+ const DEFAULT_TIMEOUT = 80;
65
+ const DEFAULT_CONNECT_TIMEOUT = 30;
66
+
67
+ private $timeout = self::DEFAULT_TIMEOUT;
68
+ private $connectTimeout = self::DEFAULT_CONNECT_TIMEOUT;
69
+
70
+ public function setTimeout($seconds)
71
+ {
72
+ $this->timeout = (int) max($seconds, 0);
73
+ return $this;
74
+ }
75
+
76
+ public function setConnectTimeout($seconds)
77
+ {
78
+ $this->connectTimeout = (int) max($seconds, 0);
79
+ return $this;
80
+ }
81
+
82
+ public function getTimeout()
83
+ {
84
+ return $this->timeout;
85
+ }
86
+
87
+ public function getConnectTimeout()
88
+ {
89
+ return $this->connectTimeout;
90
+ }
91
+
92
+ // END OF USER DEFINED TIMEOUTS
93
+
94
+ public function request($method, $absUrl, $headers, $params, $hasFile)
95
+ {
96
+ $curl = curl_init();
97
+ $method = strtolower($method);
98
+
99
+ $opts = array();
100
+ if (is_callable($this->defaultOptions)) { // call defaultOptions callback, set options to return value
101
+ $opts = call_user_func_array($this->defaultOptions, func_get_args());
102
+ if (!is_array($opts)) {
103
+ throw new Error\Api("Non-array value returned by defaultOptions CurlClient callback");
104
+ }
105
+ } elseif (is_array($this->defaultOptions)) { // set default curlopts from array
106
+ $opts = $this->defaultOptions;
107
+ }
108
+
109
+ if ($method == 'get') {
110
+ if ($hasFile) {
111
+ throw new Error\Api(
112
+ "Issuing a GET request with a file parameter"
113
+ );
114
+ }
115
+ $opts[CURLOPT_HTTPGET] = 1;
116
+ if (count($params) > 0) {
117
+ $encoded = self::encode($params);
118
+ $absUrl = "$absUrl?$encoded";
119
+ }
120
+ } elseif ($method == 'post') {
121
+ $opts[CURLOPT_POST] = 1;
122
+ $opts[CURLOPT_POSTFIELDS] = $hasFile ? $params : self::encode($params);
123
+ } elseif ($method == 'delete') {
124
+ $opts[CURLOPT_CUSTOMREQUEST] = 'DELETE';
125
+ if (count($params) > 0) {
126
+ $encoded = self::encode($params);
127
+ $absUrl = "$absUrl?$encoded";
128
+ }
129
+ } else {
130
+ throw new Error\Api("Unrecognized method $method");
131
+ }
132
+
133
+ // Create a callback to capture HTTP headers for the response
134
+ $rheaders = array();
135
+ $headerCallback = function ($curl, $header_line) use (&$rheaders) {
136
+ // Ignore the HTTP request line (HTTP/1.1 200 OK)
137
+ if (strpos($header_line, ":") === false) {
138
+ return strlen($header_line);
139
+ }
140
+ list($key, $value) = explode(":", trim($header_line), 2);
141
+ $rheaders[trim($key)] = trim($value);
142
+ return strlen($header_line);
143
+ };
144
+
145
+ // By default for large request body sizes (> 1024 bytes), cURL will
146
+ // send a request without a body and with a `Expect: 100-continue`
147
+ // header, which gives the server a chance to respond with an error
148
+ // status code in cases where one can be determined right away (say
149
+ // on an authentication problem for example), and saves the "large"
150
+ // request body from being ever sent.
151
+ //
152
+ // Unfortunately, the bindings don't currently correctly handle the
153
+ // success case (in which the server sends back a 100 CONTINUE), so
154
+ // we'll error under that condition. To compensate for that problem
155
+ // for the time being, override cURL's behavior by simply always
156
+ // sending an empty `Expect:` header.
157
+ array_push($headers, 'Expect: ');
158
+
159
+ $absUrl = Util\Util::utf8($absUrl);
160
+ $opts[CURLOPT_URL] = $absUrl;
161
+ $opts[CURLOPT_RETURNTRANSFER] = true;
162
+ $opts[CURLOPT_CONNECTTIMEOUT] = $this->connectTimeout;
163
+ $opts[CURLOPT_TIMEOUT] = $this->timeout;
164
+ $opts[CURLOPT_HEADERFUNCTION] = $headerCallback;
165
+ $opts[CURLOPT_HTTPHEADER] = $headers;
166
+ if (!Stripe::$verifySslCerts) {
167
+ $opts[CURLOPT_SSL_VERIFYPEER] = false;
168
+ }
169
+
170
+ curl_setopt_array($curl, $opts);
171
+ $rbody = curl_exec($curl);
172
+
173
+ if (!defined('CURLE_SSL_CACERT_BADFILE')) {
174
+ define('CURLE_SSL_CACERT_BADFILE', 77); // constant not defined in PHP
175
+ }
176
+
177
+ $errno = curl_errno($curl);
178
+ if ($errno == CURLE_SSL_CACERT ||
179
+ $errno == CURLE_SSL_PEER_CERTIFICATE ||
180
+ $errno == CURLE_SSL_CACERT_BADFILE
181
+ ) {
182
+ array_push(
183
+ $headers,
184
+ 'X-Stripe-Client-Info: {"ca":"using Stripe-supplied CA bundle"}'
185
+ );
186
+ $cert = self::caBundle();
187
+ curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
188
+ curl_setopt($curl, CURLOPT_CAINFO, $cert);
189
+ $rbody = curl_exec($curl);
190
+ }
191
+
192
+ if ($rbody === false) {
193
+ $errno = curl_errno($curl);
194
+ $message = curl_error($curl);
195
+ curl_close($curl);
196
+ $this->handleCurlError($absUrl, $errno, $message);
197
+ }
198
+
199
+ $rcode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
200
+ curl_close($curl);
201
+ return array($rbody, $rcode, $rheaders);
202
+ }
203
+
204
+ /**
205
+ * @param number $errno
206
+ * @param string $message
207
+ * @throws Error\ApiConnection
208
+ */
209
+ private function handleCurlError($url, $errno, $message)
210
+ {
211
+ switch ($errno) {
212
+ case CURLE_COULDNT_CONNECT:
213
+ case CURLE_COULDNT_RESOLVE_HOST:
214
+ case CURLE_OPERATION_TIMEOUTED:
215
+ $msg = "Could not connect to Stripe ($url). Please check your "
216
+ . "internet connection and try again. If this problem persists, "
217
+ . "you should check Stripe's service status at "
218
+ . "https://twitter.com/stripestatus, or";
219
+ break;
220
+ case CURLE_SSL_CACERT:
221
+ case CURLE_SSL_PEER_CERTIFICATE:
222
+ $msg = "Could not verify Stripe's SSL certificate. Please make sure "
223
+ . "that your network is not intercepting certificates. "
224
+ . "(Try going to $url in your browser.) "
225
+ . "If this problem persists,";
226
+ break;
227
+ default:
228
+ $msg = "Unexpected error communicating with Stripe. "
229
+ . "If this problem persists,";
230
+ }
231
+ $msg .= " let us know at support@stripe.com.";
232
+
233
+ $msg .= "\n\n(Network error [errno $errno]: $message)";
234
+ throw new Error\ApiConnection($msg);
235
+ }
236
+
237
+ private static function caBundle()
238
+ {
239
+ return dirname(__FILE__) . '/data/ca-certificates.crt';
240
+ }
241
+
242
+ /**
243
+ * @param array $arr An map of param keys to values.
244
+ * @param string|null $prefix
245
+ *
246
+ * Only public for testability, should not be called outside of CurlClient
247
+ *
248
+ * @return string A querystring, essentially.
249
+ */
250
+ public static function encode($arr, $prefix = null)
251
+ {
252
+ if (!is_array($arr)) {
253
+ return $arr;
254
+ }
255
+
256
+ $r = array();
257
+ foreach ($arr as $k => $v) {
258
+ if (is_null($v)) {
259
+ continue;
260
+ }
261
+
262
+ if ($prefix) {
263
+ if ($k !== null && (!is_int($k) || is_array($v))) {
264
+ $k = $prefix."[".$k."]";
265
+ } else {
266
+ $k = $prefix."[]";
267
+ }
268
+ }
269
+
270
+ if (is_array($v)) {
271
+ $enc = self::encode($v, $k);
272
+ if ($enc) {
273
+ $r[] = $enc;
274
+ }
275
+ } else {
276
+ $r[] = urlencode($k)."=".urlencode($v);
277
+ }
278
+ }
279
+
280
+ return implode("&", $r);
281
+ }
282
+ }
app/api/Stripe/HttpClient/data/ca-certificates.crt ADDED
@@ -0,0 +1,3919 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ##
2
+ ## Bundle of CA Root Certificates
3
+ ##
4
+ ## Certificate data from Mozilla as of: Fri Jan 22 20:39:57 2016
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: 0ab47e2f41518f8d223eab517cb799e5b071231e
18
+ ##
19
+
20
+
21
+ GlobalSign Root CA
22
+ ==================
23
+ -----BEGIN CERTIFICATE-----
24
+ MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx
25
+ GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds
26
+ b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV
27
+ BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD
28
+ VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa
29
+ DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc
30
+ THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb
31
+ Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP
32
+ c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX
33
+ gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
34
+ HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF
35
+ AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj
36
+ Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG
37
+ j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH
38
+ hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC
39
+ X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
40
+ -----END CERTIFICATE-----
41
+
42
+ GlobalSign Root CA - R2
43
+ =======================
44
+ -----BEGIN CERTIFICATE-----
45
+ MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv
46
+ YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
47
+ bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
48
+ aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
49
+ bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6
50
+ ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp
51
+ s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN
52
+ S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL
53
+ TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C
54
+ ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
55
+ FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i
56
+ YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN
57
+ BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp
58
+ 9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu
59
+ 01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7
60
+ 9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
61
+ TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
62
+ -----END CERTIFICATE-----
63
+
64
+ Verisign Class 3 Public Primary Certification Authority - G3
65
+ ============================================================
66
+ -----BEGIN CERTIFICATE-----
67
+ MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
68
+ UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
69
+ cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
70
+ IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
71
+ dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
72
+ CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
73
+ dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
74
+ cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg
75
+ Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
76
+ ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1
77
+ EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc
78
+ cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw
79
+ EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj
80
+ 055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
81
+ ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f
82
+ j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
83
+ /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0
84
+ xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa
85
+ t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
86
+ -----END CERTIFICATE-----
87
+
88
+ Entrust.net Premium 2048 Secure Server CA
89
+ =========================================
90
+ -----BEGIN CERTIFICATE-----
91
+ MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
92
+ ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp
93
+ bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
94
+ BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx
95
+ NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
96
+ d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
97
+ MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u
98
+ ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
99
+ MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL
100
+ Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr
101
+ hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW
102
+ nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi
103
+ VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E
104
+ BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ
105
+ KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy
106
+ T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
107
+ zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT
108
+ J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e
109
+ nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE=
110
+ -----END CERTIFICATE-----
111
+
112
+ Baltimore CyberTrust Root
113
+ =========================
114
+ -----BEGIN CERTIFICATE-----
115
+ MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE
116
+ ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li
117
+ ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC
118
+ SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs
119
+ dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME
120
+ uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB
121
+ UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C
122
+ G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9
123
+ XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr
124
+ l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI
125
+ VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB
126
+ BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh
127
+ cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5
128
+ hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa
129
+ Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H
130
+ RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
131
+ -----END CERTIFICATE-----
132
+
133
+ AddTrust Low-Value Services Root
134
+ ================================
135
+ -----BEGIN CERTIFICATE-----
136
+ MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
137
+ QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU
138
+ cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw
139
+ CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO
140
+ ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB
141
+ AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6
142
+ 54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr
143
+ oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1
144
+ Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui
145
+ GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w
146
+ HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD
147
+ AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT
148
+ RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw
149
+ HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt
150
+ ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph
151
+ iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
152
+ eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr
153
+ mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj
154
+ ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
155
+ -----END CERTIFICATE-----
156
+
157
+ AddTrust External Root
158
+ ======================
159
+ -----BEGIN CERTIFICATE-----
160
+ MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
161
+ QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD
162
+ VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw
163
+ NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU
164
+ cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg
165
+ Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821
166
+ +iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw
167
+ Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo
168
+ aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy
169
+ 2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7
170
+ 7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P
171
+ BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL
172
+ VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk
173
+ VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB
174
+ IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl
175
+ j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
176
+ 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355
177
+ e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u
178
+ G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
179
+ -----END CERTIFICATE-----
180
+
181
+ AddTrust Public Services Root
182
+ =============================
183
+ -----BEGIN CERTIFICATE-----
184
+ MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
185
+ QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU
186
+ cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ
187
+ BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l
188
+ dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF
189
+ AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu
190
+ nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i
191
+ d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG
192
+ Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw
193
+ HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G
194
+ A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
195
+ /zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux
196
+ FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G
197
+ A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4
198
+ JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL
199
+ +YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao
200
+ GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9
201
+ Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H
202
+ EufOX1362KqxMy3ZdvJOOjMMK7MtkAY=
203
+ -----END CERTIFICATE-----
204
+
205
+ AddTrust Qualified Certificates Root
206
+ ====================================
207
+ -----BEGIN CERTIFICATE-----
208
+ MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
209
+ QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU
210
+ cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx
211
+ CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ
212
+ IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG
213
+ 9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx
214
+ 64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3
215
+ KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o
216
+ L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR
217
+ wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU
218
+ MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/
219
+ BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE
220
+ BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y
221
+ azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD
222
+ ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG
223
+ GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X
224
+ dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze
225
+ RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB
226
+ iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE=
227
+ -----END CERTIFICATE-----
228
+
229
+ Entrust Root Certification Authority
230
+ ====================================
231
+ -----BEGIN CERTIFICATE-----
232
+ MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV
233
+ BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw
234
+ b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG
235
+ A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0
236
+ MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu
237
+ MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu
238
+ Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v
239
+ dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
240
+ ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz
241
+ A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww
242
+ Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68
243
+ j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN
244
+ rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw
245
+ DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1
246
+ MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH
247
+ hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
248
+ A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM
249
+ Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa
250
+ v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS
251
+ W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0
252
+ tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8
253
+ -----END CERTIFICATE-----
254
+
255
+ RSA Security 2048 v3
256
+ ====================
257
+ -----BEGIN CERTIFICATE-----
258
+ MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK
259
+ ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy
260
+ MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb
261
+ BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
262
+ AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7
263
+ Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb
264
+ WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH
265
+ KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP
266
+ +Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/
267
+ MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E
268
+ FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY
269
+ v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj
270
+ 0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj
271
+ VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395
272
+ nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA
273
+ pKnXwiJPZ9d37CAFYd4=
274
+ -----END CERTIFICATE-----
275
+
276
+ GeoTrust Global CA
277
+ ==================
278
+ -----BEGIN CERTIFICATE-----
279
+ MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
280
+ Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw
281
+ MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
282
+ LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
283
+ CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo
284
+ BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet
285
+ 8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc
286
+ T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU
287
+ vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD
288
+ AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk
289
+ DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q
290
+ zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4
291
+ d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2
292
+ mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p
293
+ XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm
294
+ Mw==
295
+ -----END CERTIFICATE-----
296
+
297
+ GeoTrust Global CA 2
298
+ ====================
299
+ -----BEGIN CERTIFICATE-----
300
+ MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
301
+ R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw
302
+ MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
303
+ LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
304
+ ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/
305
+ NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k
306
+ LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA
307
+ Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b
308
+ HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF
309
+ MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH
310
+ K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7
311
+ srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh
312
+ ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL
313
+ OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC
314
+ x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF
315
+ H4z1Ir+rzoPz4iIprn2DQKi6bA==
316
+ -----END CERTIFICATE-----
317
+
318
+ GeoTrust Universal CA
319
+ =====================
320
+ -----BEGIN CERTIFICATE-----
321
+ MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
322
+ R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1
323
+ MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu
324
+ Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
325
+ ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t
326
+ JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e
327
+ RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs
328
+ 7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d
329
+ 8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V
330
+ qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga
331
+ Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB
332
+ Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu
333
+ KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08
334
+ ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0
335
+ XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB
336
+ hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
337
+ aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2
338
+ qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL
339
+ oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK
340
+ xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF
341
+ KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2
342
+ DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK
343
+ xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU
344
+ p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI
345
+ P/rmMuGNG2+k5o7Y+SlIis5z/iw=
346
+ -----END CERTIFICATE-----
347
+
348
+ GeoTrust Universal CA 2
349
+ =======================
350
+ -----BEGIN CERTIFICATE-----
351
+ MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
352
+ R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0
353
+ MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg
354
+ SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA
355
+ A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0
356
+ DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17
357
+ j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q
358
+ JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a
359
+ QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2
360
+ WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP
361
+ 20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn
362
+ ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC
363
+ SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG
364
+ 8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2
365
+ +/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E
366
+ BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
367
+ dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ
368
+ 4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+
369
+ mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq
370
+ A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg
371
+ Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP
372
+ pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d
373
+ FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp
374
+ gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm
375
+ X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
376
+ -----END CERTIFICATE-----
377
+
378
+ Visa eCommerce Root
379
+ ===================
380
+ -----BEGIN CERTIFICATE-----
381
+ MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG
382
+ EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug
383
+ QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2
384
+ WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm
385
+ VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
386
+ bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL
387
+ F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b
388
+ RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0
389
+ TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI
390
+ /k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs
391
+ GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG
392
+ MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc
393
+ CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW
394
+ YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz
395
+ zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu
396
+ YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
397
+ 398znM/jra6O1I7mT1GvFpLgXPYHDw==
398
+ -----END CERTIFICATE-----
399
+
400
+ Certum Root CA
401
+ ==============
402
+ -----BEGIN CERTIFICATE-----
403
+ MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK
404
+ ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla
405
+ Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u
406
+ by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x
407
+ wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL
408
+ kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ
409
+ 89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K
410
+ Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P
411
+ NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq
412
+ hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+
413
+ GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg
414
+ GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/
415
+ 0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS
416
+ qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw==
417
+ -----END CERTIFICATE-----
418
+
419
+ Comodo AAA Services root
420
+ ========================
421
+ -----BEGIN CERTIFICATE-----
422
+ MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
423
+ R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
424
+ TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw
425
+ MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl
426
+ c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
427
+ BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
428
+ ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG
429
+ C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs
430
+ i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW
431
+ Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH
432
+ Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK
433
+ Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f
434
+ BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl
435
+ cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz
436
+ LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm
437
+ 7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
438
+ Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z
439
+ 8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C
440
+ 12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
441
+ -----END CERTIFICATE-----
442
+
443
+ Comodo Secure Services root
444
+ ===========================
445
+ -----BEGIN CERTIFICATE-----
446
+ MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
447
+ R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
448
+ TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw
449
+ MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu
450
+ Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi
451
+ BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
452
+ ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP
453
+ 9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc
454
+ rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC
455
+ oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V
456
+ p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E
457
+ FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w
458
+ gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj
459
+ YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm
460
+ aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm
461
+ 4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj
462
+ Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL
463
+ DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw
464
+ pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H
465
+ RR3B7Hzs/Sk=
466
+ -----END CERTIFICATE-----
467
+
468
+ Comodo Trusted Services root
469
+ ============================
470
+ -----BEGIN CERTIFICATE-----
471
+ MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
472
+ R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
473
+ TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw
474
+ MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h
475
+ bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw
476
+ IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC
477
+ AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7
478
+ 3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y
479
+ /9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6
480
+ juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS
481
+ ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud
482
+ DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
483
+ /zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp
484
+ ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl
485
+ cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw
486
+ uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32
487
+ pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA
488
+ BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l
489
+ R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O
490
+ 9y5Xt5hwXsjEeLBi
491
+ -----END CERTIFICATE-----
492
+
493
+ QuoVadis Root CA
494
+ ================
495
+ -----BEGIN CERTIFICATE-----
496
+ MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE
497
+ ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
498
+ eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz
499
+ MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp
500
+ cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD
501
+ EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
502
+ AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk
503
+ J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL
504
+ F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL
505
+ YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen
506
+ AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w
507
+ PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y
508
+ ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7
509
+ MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj
510
+ YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs
511
+ ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
512
+ Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW
513
+ Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu
514
+ BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw
515
+ FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0
516
+ aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6
517
+ tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo
518
+ fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul
519
+ LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x
520
+ gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi
521
+ 5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi
522
+ 5nrQNiOKSnQ2+Q==
523
+ -----END CERTIFICATE-----
524
+
525
+ QuoVadis Root CA 2
526
+ ==================
527
+ -----BEGIN CERTIFICATE-----
528
+ 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
554
+ -----END CERTIFICATE-----
555
+
556
+ QuoVadis Root CA 3
557
+ ==================
558
+ -----BEGIN CERTIFICATE-----
559
+ MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
560
+ EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx
561
+ OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
562
+ aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
563
+ DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg
564
+ DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij
565
+ KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K
566
+ DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv
567
+ BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp
568
+ p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8
569
+ nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX
570
+ MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM
571
+ Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz
572
+ uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT
573
+ BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj
574
+ YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
575
+ aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB
576
+ BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD
577
+ VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4
578
+ ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE
579
+ AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV
580
+ qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s
581
+ hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z
582
+ POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2
583
+ Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp
584
+ 8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC
585
+ bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu
586
+ g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p
587
+ vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr
588
+ qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=
589
+ -----END CERTIFICATE-----
590
+
591
+ Security Communication Root CA
592
+ ==============================
593
+ -----BEGIN CERTIFICATE-----
594
+ MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
595
+ U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
596
+ HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
597
+ U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
598
+ ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw
599
+ 8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM
600
+ DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX
601
+ 5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd
602
+ DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2
603
+ JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw
604
+ DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g
605
+ 0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a
606
+ mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ
607
+ s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ
608
+ 6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi
609
+ FL39vmwLAw==
610
+ -----END CERTIFICATE-----
611
+
612
+ Sonera Class 2 Root CA
613
+ ======================
614
+ -----BEGIN CERTIFICATE-----
615
+ MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
616
+ U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw
617
+ NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
618
+ IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3
619
+ /Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT
620
+ dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG
621
+ f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P
622
+ tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH
623
+ nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT
624
+ XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt
625
+ 0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI
626
+ cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph
627
+ Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx
628
+ EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH
629
+ llpwrN9M
630
+ -----END CERTIFICATE-----
631
+
632
+ Staat der Nederlanden Root CA
633
+ =============================
634
+ -----BEGIN CERTIFICATE-----
635
+ MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE
636
+ ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g
637
+ Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w
638
+ HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh
639
+ bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt
640
+ vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P
641
+ jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca
642
+ C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth
643
+ vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6
644
+ 22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV
645
+ HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v
646
+ dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN
647
+ BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR
648
+ EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw
649
+ MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y
650
+ nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR
651
+ iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw==
652
+ -----END CERTIFICATE-----
653
+
654
+ UTN USERFirst Hardware Root CA
655
+ ==============================
656
+ -----BEGIN CERTIFICATE-----
657
+ MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE
658
+ BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
659
+ IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd
660
+ BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx
661
+ OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0
662
+ eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz
663
+ ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3
664
+ DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI
665
+ wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd
666
+ tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8
667
+ i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf
668
+ Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw
669
+ gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF
670
+ lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF
671
+ UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF
672
+ BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
673
+ //bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW
674
+ XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2
675
+ lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn
676
+ iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67
677
+ nfhmqA==
678
+ -----END CERTIFICATE-----
679
+
680
+ Camerfirma Chambers of Commerce Root
681
+ ====================================
682
+ -----BEGIN CERTIFICATE-----
683
+ MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
684
+ QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
685
+ ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx
686
+ NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp
687
+ cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn
688
+ MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC
689
+ AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU
690
+ xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH
691
+ NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW
692
+ DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV
693
+ d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud
694
+ EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v
695
+ cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P
696
+ AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh
697
+ bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD
698
+ VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz
699
+ aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi
700
+ fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD
701
+ L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN
702
+ UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n
703
+ ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1
704
+ erfutGWaIZDgqtCYvDi1czyL+Nw=
705
+ -----END CERTIFICATE-----
706
+
707
+ Camerfirma Global Chambersign Root
708
+ ==================================
709
+ -----BEGIN CERTIFICATE-----
710
+ MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
711
+ QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
712
+ ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx
713
+ NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt
714
+ YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg
715
+ MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw
716
+ ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J
717
+ 1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O
718
+ by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl
719
+ 6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c
720
+ 8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/
721
+ BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j
722
+ aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B
723
+ Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj
724
+ aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y
725
+ ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh
726
+ bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA
727
+ PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y
728
+ gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ
729
+ PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4
730
+ IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes
731
+ t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==
732
+ -----END CERTIFICATE-----
733
+
734
+ NetLock Notary (Class A) Root
735
+ =============================
736
+ -----BEGIN CERTIFICATE-----
737
+ MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI
738
+ EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6
739
+ dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j
740
+ ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX
741
+ DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH
742
+ EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD
743
+ VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz
744
+ cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM
745
+ D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ
746
+ z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC
747
+ /tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7
748
+ tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6
749
+ 4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG
750
+ A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC
751
+ Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv
752
+ bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu
753
+ IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn
754
+ LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0
755
+ ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz
756
+ IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh
757
+ IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu
758
+ b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh
759
+ bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg
760
+ Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp
761
+ bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5
762
+ ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP
763
+ ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB
764
+ CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr
765
+ KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM
766
+ 8CgHrTwXZoi1/baI
767
+ -----END CERTIFICATE-----
768
+
769
+ XRamp Global CA Root
770
+ ====================
771
+ -----BEGIN CERTIFICATE-----
772
+ MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE
773
+ BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj
774
+ dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
775
+ dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx
776
+ HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg
777
+ U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
778
+ dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu
779
+ IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx
780
+ foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE
781
+ zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs
782
+ AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry
783
+ xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
784
+ EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap
785
+ oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC
786
+ AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc
787
+ /Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
788
+ qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n
789
+ nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz
790
+ 8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=
791
+ -----END CERTIFICATE-----
792
+
793
+ Go Daddy Class 2 CA
794
+ ===================
795
+ -----BEGIN CERTIFICATE-----
796
+ MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY
797
+ VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp
798
+ ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG
799
+ A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
800
+ RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD
801
+ ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
802
+ 2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32
803
+ qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j
804
+ YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY
805
+ vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O
806
+ BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o
807
+ atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu
808
+ MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG
809
+ A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim
810
+ PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt
811
+ I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
812
+ HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI
813
+ Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b
814
+ vZ8=
815
+ -----END CERTIFICATE-----
816
+
817
+ Starfield Class 2 CA
818
+ ====================
819
+ -----BEGIN CERTIFICATE-----
820
+ MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc
821
+ U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg
822
+ Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo
823
+ MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG
824
+ A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG
825
+ SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY
826
+ bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ
827
+ JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm
828
+ epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN
829
+ F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF
830
+ MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f
831
+ hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo
832
+ bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g
833
+ QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs
834
+ afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM
835
+ PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
836
+ xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD
837
+ KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3
838
+ QBFGmh95DmK/D5fs4C8fF5Q=
839
+ -----END CERTIFICATE-----
840
+
841
+ StartCom Certification Authority
842
+ ================================
843
+ -----BEGIN CERTIFICATE-----
844
+ MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
845
+ U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
846
+ ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
847
+ NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
848
+ LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
849
+ U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
850
+ ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
851
+ o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
852
+ Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
853
+ eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
854
+ 2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
855
+ 6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
856
+ osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
857
+ untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
858
+ UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
859
+ 37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
860
+ FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0
861
+ Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj
862
+ YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH
863
+ AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw
864
+ Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg
865
+ U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5
866
+ LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl
867
+ cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh
868
+ cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT
869
+ dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC
870
+ AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh
871
+ 3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm
872
+ vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk
873
+ fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3
874
+ fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ
875
+ EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
876
+ yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl
877
+ 1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/
878
+ lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro
879
+ g14=
880
+ -----END CERTIFICATE-----
881
+
882
+ Taiwan GRCA
883
+ ===========
884
+ -----BEGIN CERTIFICATE-----
885
+ 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
910
+ -----END CERTIFICATE-----
911
+
912
+ Swisscom Root CA 1
913
+ ==================
914
+ -----BEGIN CERTIFICATE-----
915
+ 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
941
+ NY6E0F/6MBr1mmz0DlP5OlvRHA==
942
+ -----END CERTIFICATE-----
943
+
944
+ DigiCert Assured ID Root CA
945
+ ===========================
946
+ -----BEGIN CERTIFICATE-----
947
+ MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG
948
+ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
949
+ IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx
950
+ MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
951
+ ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew
952
+ ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO
953
+ 9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy
954
+ UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW
955
+ /lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy
956
+ oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf
957
+ GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF
958
+ 66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq
959
+ hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc
960
+ EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn
961
+ SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i
962
+ 8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
963
+ +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
964
+ -----END CERTIFICATE-----
965
+
966
+ DigiCert Global Root CA
967
+ =======================
968
+ -----BEGIN CERTIFICATE-----
969
+ MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG
970
+ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
971
+ HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw
972
+ MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
973
+ dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq
974
+ hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn
975
+ TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5
976
+ BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H
977
+ 4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y
978
+ 7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB
979
+ o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm
980
+ 8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF
981
+ BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr
982
+ EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt
983
+ tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886
984
+ UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
985
+ CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
986
+ -----END CERTIFICATE-----
987
+
988
+ DigiCert High Assurance EV Root CA
989
+ ==================================
990
+ -----BEGIN CERTIFICATE-----
991
+ MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
992
+ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
993
+ KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
994
+ MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
995
+ MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
996
+ Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
997
+ Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
998
+ OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
999
+ MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
1000
+ NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
1001
+ h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
1002
+ Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
1003
+ JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
1004
+ V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
1005
+ myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
1006
+ mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
1007
+ vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
1008
+ -----END CERTIFICATE-----
1009
+
1010
+ Certplus Class 2 Primary CA
1011
+ ===========================
1012
+ -----BEGIN CERTIFICATE-----
1013
+ MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE
1014
+ BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN
1015
+ OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy
1016
+ dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP
1017
+ ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR
1018
+ 5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ
1019
+ Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO
1020
+ YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e
1021
+ e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME
1022
+ CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ
1023
+ YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t
1024
+ L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD
1025
+ P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R
1026
+ TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+
1027
+ 7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW
1028
+ //1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
1029
+ l7+ijrRU
1030
+ -----END CERTIFICATE-----
1031
+
1032
+ DST Root CA X3
1033
+ ==============
1034
+ -----BEGIN CERTIFICATE-----
1035
+ MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK
1036
+ ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X
1037
+ DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1
1038
+ cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD
1039
+ ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT
1040
+ rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9
1041
+ UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy
1042
+ xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d
1043
+ utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T
1044
+ AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ
1045
+ MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug
1046
+ dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE
1047
+ GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw
1048
+ RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS
1049
+ fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
1050
+ -----END CERTIFICATE-----
1051
+
1052
+ DST ACES CA X6
1053
+ ==============
1054
+ -----BEGIN CERTIFICATE-----
1055
+ MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG
1056
+ EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT
1057
+ MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha
1058
+ MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE
1059
+ CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC
1060
+ AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI
1061
+ DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa
1062
+ pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow
1063
+ GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy
1064
+ MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud
1065
+ EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu
1066
+ Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy
1067
+ dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU
1068
+ CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2
1069
+ 5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t
1070
+ Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq
1071
+ nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs
1072
+ vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3
1073
+ oKfN5XozNmr6mis=
1074
+ -----END CERTIFICATE-----
1075
+
1076
+ SwissSign Gold CA - G2
1077
+ ======================
1078
+ -----BEGIN CERTIFICATE-----
1079
+ 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
1105
+ -----END CERTIFICATE-----
1106
+
1107
+ SwissSign Silver CA - G2
1108
+ ========================
1109
+ -----BEGIN CERTIFICATE-----
1110
+ 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
1136
+ -----END CERTIFICATE-----
1137
+
1138
+ GeoTrust Primary Certification Authority
1139
+ ========================================
1140
+ -----BEGIN CERTIFICATE-----
1141
+ MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG
1142
+ EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD
1143
+ ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx
1144
+ CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ
1145
+ cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
1146
+ CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN
1147
+ b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9
1148
+ nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge
1149
+ RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt
1150
+ tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
1151
+ AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI
1152
+ hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K
1153
+ Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN
1154
+ NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa
1155
+ Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG
1156
+ 1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
1157
+ -----END CERTIFICATE-----
1158
+
1159
+ thawte Primary Root CA
1160
+ ======================
1161
+ -----BEGIN CERTIFICATE-----
1162
+ MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE
1163
+ BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
1164
+ aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
1165
+ cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3
1166
+ MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg
1167
+ SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv
1168
+ KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT
1169
+ FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs
1170
+ oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ
1171
+ 1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc
1172
+ q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K
1173
+ aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p
1174
+ afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD
1175
+ VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF
1176
+ AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE
1177
+ uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
1178
+ xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89
1179
+ jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH
1180
+ z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==
1181
+ -----END CERTIFICATE-----
1182
+
1183
+ VeriSign Class 3 Public Primary Certification Authority - G5
1184
+ ============================================================
1185
+ -----BEGIN CERTIFICATE-----
1186
+ MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
1187
+ BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
1188
+ ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
1189
+ IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp
1190
+ ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB
1191
+ yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln
1192
+ biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh
1193
+ dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt
1194
+ YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
1195
+ ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz
1196
+ j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD
1197
+ Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/
1198
+ Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r
1199
+ fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/
1200
+ BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv
1201
+ Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
1202
+ aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
1203
+ SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+
1204
+ X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE
1205
+ KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC
1206
+ Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE
1207
+ ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
1208
+ -----END CERTIFICATE-----
1209
+
1210
+ SecureTrust CA
1211
+ ==============
1212
+ -----BEGIN CERTIFICATE-----
1213
+ MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG
1214
+ EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy
1215
+ dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe
1216
+ BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC
1217
+ ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX
1218
+ OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t
1219
+ DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH
1220
+ GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b
1221
+ 01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH
1222
+ ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/
1223
+ BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj
1224
+ aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
1225
+ KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu
1226
+ SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf
1227
+ mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ
1228
+ nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
1229
+ 3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
1230
+ -----END CERTIFICATE-----
1231
+
1232
+ Secure Global CA
1233
+ ================
1234
+ -----BEGIN CERTIFICATE-----
1235
+ MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG
1236
+ EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH
1237
+ bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg
1238
+ MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg
1239
+ Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx
1240
+ YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ
1241
+ bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g
1242
+ 8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV
1243
+ HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi
1244
+ 0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
1245
+ EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn
1246
+ oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA
1247
+ MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+
1248
+ OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn
1249
+ CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5
1250
+ 3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
1251
+ f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
1252
+ -----END CERTIFICATE-----
1253
+
1254
+ COMODO Certification Authority
1255
+ ==============================
1256
+ -----BEGIN CERTIFICATE-----
1257
+ MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE
1258
+ BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
1259
+ A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1
1260
+ dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb
1261
+ MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD
1262
+ T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
1263
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH
1264
+ +7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww
1265
+ xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV
1266
+ 4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA
1267
+ 1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI
1268
+ rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E
1269
+ BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k
1270
+ b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC
1271
+ AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP
1272
+ OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
1273
+ RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc
1274
+ IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN
1275
+ +8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==
1276
+ -----END CERTIFICATE-----
1277
+
1278
+ Network Solutions Certificate Authority
1279
+ =======================================
1280
+ -----BEGIN CERTIFICATE-----
1281
+ MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG
1282
+ EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr
1283
+ IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx
1284
+ MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
1285
+ MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
1286
+ CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx
1287
+ jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT
1288
+ aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT
1289
+ crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc
1290
+ /Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB
1291
+ AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP
1292
+ BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv
1293
+ bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA
1294
+ A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q
1295
+ 4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/
1296
+ GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
1297
+ wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD
1298
+ ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
1299
+ -----END CERTIFICATE-----
1300
+
1301
+ WellsSecure Public Root Certificate Authority
1302
+ =============================================
1303
+ -----BEGIN CERTIFICATE-----
1304
+ MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM
1305
+ F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw
1306
+ NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
1307
+ MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl
1308
+ bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD
1309
+ VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
1310
+ CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1
1311
+ iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13
1312
+ i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8
1313
+ bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB
1314
+ K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB
1315
+ AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu
1316
+ cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm
1317
+ lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB
1318
+ i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww
1319
+ GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg
1320
+ Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI
1321
+ K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0
1322
+ bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj
1323
+ qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es
1324
+ E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ
1325
+ tylv2G0xffX8oRAHh84vWdw+WNs=
1326
+ -----END CERTIFICATE-----
1327
+
1328
+ COMODO ECC Certification Authority
1329
+ ==================================
1330
+ -----BEGIN CERTIFICATE-----
1331
+ MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC
1332
+ R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
1333
+ ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB
1334
+ dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix
1335
+ GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
1336
+ Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo
1337
+ b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X
1338
+ 4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni
1339
+ wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E
1340
+ BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG
1341
+ FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA
1342
+ U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
1343
+ -----END CERTIFICATE-----
1344
+
1345
+ IGC/A
1346
+ =====
1347
+ -----BEGIN CERTIFICATE-----
1348
+ MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD
1349
+ VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE
1350
+ Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy
1351
+ MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI
1352
+ EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT
1353
+ STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB
1354
+ IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2
1355
+ TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW
1356
+ So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy
1357
+ HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd
1358
+ frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ
1359
+ tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB
1360
+ egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC
1361
+ iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK
1362
+ q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q
1363
+ MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg
1364
+ Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI
1365
+ lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF
1366
+ 0mBWWg==
1367
+ -----END CERTIFICATE-----
1368
+
1369
+ Security Communication EV RootCA1
1370
+ =================================
1371
+ -----BEGIN CERTIFICATE-----
1372
+ MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
1373
+ U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh
1374
+ dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE
1375
+ BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl
1376
+ Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
1377
+ AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO
1378
+ /VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX
1379
+ WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z
1380
+ ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4
1381
+ bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK
1382
+ 9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
1383
+ SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm
1384
+ iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG
1385
+ Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW
1386
+ mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW
1387
+ T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490
1388
+ -----END CERTIFICATE-----
1389
+
1390
+ OISTE WISeKey Global Root GA CA
1391
+ ===============================
1392
+ -----BEGIN CERTIFICATE-----
1393
+ MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE
1394
+ BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG
1395
+ A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH
1396
+ bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD
1397
+ VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw
1398
+ IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5
1399
+ IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9
1400
+ Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg
1401
+ Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD
1402
+ d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ
1403
+ /yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R
1404
+ LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
1405
+ AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
1406
+ KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm
1407
+ MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4
1408
+ +vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
1409
+ hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY
1410
+ okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=
1411
+ -----END CERTIFICATE-----
1412
+
1413
+ Microsec e-Szigno Root CA
1414
+ =========================
1415
+ -----BEGIN CERTIFICATE-----
1416
+ MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE
1417
+ BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL
1418
+ EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0
1419
+ MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz
1420
+ dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT
1421
+ GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
1422
+ AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG
1423
+ d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N
1424
+ oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc
1425
+ QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ
1426
+ PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb
1427
+ MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG
1428
+ IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD
1429
+ VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3
1430
+ LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A
1431
+ dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn
1432
+ AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA
1433
+ 4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg
1434
+ AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA
1435
+ egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6
1436
+ Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO
1437
+ PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv
1438
+ c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h
1439
+ cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw
1440
+ IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT
1441
+ WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV
1442
+ MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER
1443
+ MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp
1444
+ Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal
1445
+ HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT
1446
+ nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE
1447
+ aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a
1448
+ 86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK
1449
+ yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB
1450
+ S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU=
1451
+ -----END CERTIFICATE-----
1452
+
1453
+ Certigna
1454
+ ========
1455
+ -----BEGIN CERTIFICATE-----
1456
+ MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw
1457
+ EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3
1458
+ MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI
1459
+ Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q
1460
+ XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH
1461
+ GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p
1462
+ ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg
1463
+ DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf
1464
+ Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ
1465
+ tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ
1466
+ BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J
1467
+ SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA
1468
+ hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+
1469
+ ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu
1470
+ PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY
1471
+ 1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
1472
+ WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
1473
+ -----END CERTIFICATE-----
1474
+
1475
+ Deutsche Telekom Root CA 2
1476
+ ==========================
1477
+ -----BEGIN CERTIFICATE-----
1478
+ MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT
1479
+ RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG
1480
+ A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5
1481
+ MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G
1482
+ A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS
1483
+ b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5
1484
+ bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI
1485
+ KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY
1486
+ AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK
1487
+ Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV
1488
+ jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV
1489
+ HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr
1490
+ E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy
1491
+ zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8
1492
+ rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G
1493
+ dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
1494
+ Cm26OWMohpLzGITY+9HPBVZkVw==
1495
+ -----END CERTIFICATE-----
1496
+
1497
+ Cybertrust Global Root
1498
+ ======================
1499
+ -----BEGIN CERTIFICATE-----
1500
+ MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li
1501
+ ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4
1502
+ MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD
1503
+ ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
1504
+ +Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW
1505
+ 0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL
1506
+ AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin
1507
+ 89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT
1508
+ 8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP
1509
+ BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2
1510
+ MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G
1511
+ A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO
1512
+ lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi
1513
+ 5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2
1514
+ hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T
1515
+ X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
1516
+ WL1WMRJOEcgh4LMRkWXbtKaIOM5V
1517
+ -----END CERTIFICATE-----
1518
+
1519
+ ePKI Root Certification Authority
1520
+ =================================
1521
+ -----BEGIN CERTIFICATE-----
1522
+ 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
1548
+ -----END CERTIFICATE-----
1549
+
1550
+ 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
1551
+ =============================================================================================================================
1552
+ -----BEGIN CERTIFICATE-----
1553
+ MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH
1554
+ DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q
1555
+ aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry
1556
+ b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV
1557
+ BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg
1558
+ S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4
1559
+ MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl
1560
+ IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF
1561
+ n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl
1562
+ IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft
1563
+ dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl
1564
+ cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B
1565
+ AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO
1566
+ Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1
1567
+ xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR
1568
+ 6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL
1569
+ hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd
1570
+ BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
1571
+ MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4
1572
+ N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT
1573
+ y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh
1574
+ LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M
1575
+ dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI=
1576
+ -----END CERTIFICATE-----
1577
+
1578
+ Buypass Class 2 CA 1
1579
+ ====================
1580
+ -----BEGIN CERTIFICATE-----
1581
+ MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
1582
+ QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2
1583
+ MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
1584
+ c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI
1585
+ hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M
1586
+ cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83
1587
+ 0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4
1588
+ 0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R
1589
+ uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC
1590
+ MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P
1591
+ AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV
1592
+ 1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt
1593
+ 7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2
1594
+ fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w
1595
+ wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho
1596
+ -----END CERTIFICATE-----
1597
+
1598
+ EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1
1599
+ ==========================================================================
1600
+ -----BEGIN CERTIFICATE-----
1601
+ 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
1628
+ -----END CERTIFICATE-----
1629
+
1630
+ certSIGN ROOT CA
1631
+ ================
1632
+ -----BEGIN CERTIFICATE-----
1633
+ MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD
1634
+ VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa
1635
+ Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE
1636
+ CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I
1637
+ JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH
1638
+ rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2
1639
+ ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD
1640
+ 0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943
1641
+ AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B
1642
+ Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB
1643
+ AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8
1644
+ SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0
1645
+ x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt
1646
+ vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz
1647
+ TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD
1648
+ -----END CERTIFICATE-----
1649
+
1650
+ CNNIC ROOT
1651
+ ==========
1652
+ -----BEGIN CERTIFICATE-----
1653
+ MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE
1654
+ ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw
1655
+ OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw
1656
+ ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD
1657
+ o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz
1658
+ VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT
1659
+ VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or
1660
+ czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK
1661
+ y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC
1662
+ wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S
1663
+ lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5
1664
+ Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM
1665
+ O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8
1666
+ BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2
1667
+ G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m
1668
+ mxE=
1669
+ -----END CERTIFICATE-----
1670
+
1671
+ ApplicationCA - Japanese Government
1672
+ ===================================
1673
+ -----BEGIN CERTIFICATE-----
1674
+ MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT
1675
+ SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw
1676
+ MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl
1677
+ cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
1678
+ CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4
1679
+ fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN
1680
+ wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE
1681
+ jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu
1682
+ nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU
1683
+ WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV
1684
+ BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD
1685
+ vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs
1686
+ o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g
1687
+ /DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD
1688
+ io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW
1689
+ dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL
1690
+ rosot4LKGAfmt1t06SAZf7IbiVQ=
1691
+ -----END CERTIFICATE-----
1692
+
1693
+ GeoTrust Primary Certification Authority - G3
1694
+ =============================================
1695
+ -----BEGIN CERTIFICATE-----
1696
+ MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE
1697
+ BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0
1698
+ IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy
1699
+ eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz
1700
+ NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo
1701
+ YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT
1702
+ LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI
1703
+ hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j
1704
+ K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE
1705
+ c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C
1706
+ IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu
1707
+ dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC
1708
+ MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr
1709
+ 2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9
1710
+ cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE
1711
+ Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
1712
+ AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s
1713
+ t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt
1714
+ -----END CERTIFICATE-----
1715
+
1716
+ thawte Primary Root CA - G2
1717
+ ===========================
1718
+ -----BEGIN CERTIFICATE-----
1719
+ MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC
1720
+ VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu
1721
+ IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg
1722
+ Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV
1723
+ MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG
1724
+ b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt
1725
+ IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS
1726
+ LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5
1727
+ 8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU
1728
+ mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN
1729
+ G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K
1730
+ rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
1731
+ -----END CERTIFICATE-----
1732
+
1733
+ thawte Primary Root CA - G3
1734
+ ===========================
1735
+ -----BEGIN CERTIFICATE-----
1736
+ MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE
1737
+ BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
1738
+ aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
1739
+ cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w
1740
+ ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
1741
+ d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD
1742
+ VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG
1743
+ A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
1744
+ MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At
1745
+ P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC
1746
+ +BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY
1747
+ 7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW
1748
+ vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E
1749
+ BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ
1750
+ KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK
1751
+ A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
1752
+ t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC
1753
+ 8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm
1754
+ er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A=
1755
+ -----END CERTIFICATE-----
1756
+
1757
+ GeoTrust Primary Certification Authority - G2
1758
+ =============================================
1759
+ -----BEGIN CERTIFICATE-----
1760
+ MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC
1761
+ VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu
1762
+ Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD
1763
+ ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1
1764
+ OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
1765
+ MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl
1766
+ b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG
1767
+ BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc
1768
+ KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD
1769
+ VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+
1770
+ EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m
1771
+ ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2
1772
+ npaqBA+K
1773
+ -----END CERTIFICATE-----
1774
+
1775
+ VeriSign Universal Root Certification Authority
1776
+ ===============================================
1777
+ -----BEGIN CERTIFICATE-----
1778
+ MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE
1779
+ BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
1780
+ ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
1781
+ IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u
1782
+ IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV
1783
+ UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
1784
+ cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
1785
+ IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0
1786
+ aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj
1787
+ 1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP
1788
+ MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72
1789
+ 9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I
1790
+ AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR
1791
+ tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G
1792
+ CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O
1793
+ a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
1794
+ DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3
1795
+ Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx
1796
+ Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx
1797
+ P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P
1798
+ wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4
1799
+ mJO37M2CYfE45k+XmCpajQ==
1800
+ -----END CERTIFICATE-----
1801
+
1802
+ VeriSign Class 3 Public Primary Certification Authority - G4
1803
+ ============================================================
1804
+ -----BEGIN CERTIFICATE-----
1805
+ MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC
1806
+ VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3
1807
+ b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz
1808
+ ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj
1809
+ YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL
1810
+ MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU
1811
+ cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo
1812
+ b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5
1813
+ IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8
1814
+ Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz
1815
+ rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB
1816
+ /zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw
1817
+ HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u
1818
+ Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD
1819
+ A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx
1820
+ AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
1821
+ -----END CERTIFICATE-----
1822
+
1823
+ NetLock Arany (Class Gold) Főtanúsítvány
1824
+ ============================================
1825
+ -----BEGIN CERTIFICATE-----
1826
+ MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G
1827
+ A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610
1828
+ dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB
1829
+ cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx
1830
+ MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO
1831
+ ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv
1832
+ biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6
1833
+ c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu
1834
+ 0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw
1835
+ /HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk
1836
+ H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw
1837
+ fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1
1838
+ neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB
1839
+ BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW
1840
+ qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta
1841
+ YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
1842
+ bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna
1843
+ NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu
1844
+ dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
1845
+ -----END CERTIFICATE-----
1846
+
1847
+ Staat der Nederlanden Root CA - G2
1848
+ ==================================
1849
+ -----BEGIN CERTIFICATE-----
1850
+ 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
1876
+ 66+KAQ==
1877
+ -----END CERTIFICATE-----
1878
+
1879
+ CA Disig
1880
+ ========
1881
+ -----BEGIN CERTIFICATE-----
1882
+ MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK
1883
+ QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw
1884
+ MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz
1885
+ bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3
1886
+ DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm
1887
+ GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD
1888
+ Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo
1889
+ hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt
1890
+ ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w
1891
+ gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P
1892
+ AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz
1893
+ aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff
1894
+ ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa
1895
+ BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t
1896
+ WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3
1897
+ mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/
1898
+ CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K
1899
+ ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA
1900
+ 4Z7CRneC9VkGjCFMhwnN5ag=
1901
+ -----END CERTIFICATE-----
1902
+
1903
+ Juur-SK
1904
+ =======
1905
+ -----BEGIN CERTIFICATE-----
1906
+ MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA
1907
+ c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw
1908
+ DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG
1909
+ SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy
1910
+ aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
1911
+ ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf
1912
+ TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC
1913
+ +Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw
1914
+ UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa
1915
+ Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF
1916
+ MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD
1917
+ HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh
1918
+ AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA
1919
+ cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr
1920
+ AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw
1921
+ cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE
1922
+ FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G
1923
+ A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo
1924
+ ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL
1925
+ abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678
1926
+ IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh
1927
+ Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2
1928
+ yyqcjg==
1929
+ -----END CERTIFICATE-----
1930
+
1931
+ Hongkong Post Root CA 1
1932
+ =======================
1933
+ -----BEGIN CERTIFICATE-----
1934
+ MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT
1935
+ DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx
1936
+ NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n
1937
+ IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF
1938
+ AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1
1939
+ ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr
1940
+ auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh
1941
+ qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY
1942
+ V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV
1943
+ HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i
1944
+ h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio
1945
+ l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei
1946
+ IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps
1947
+ T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT
1948
+ c4afU9hDDl3WY4JxHYB0yvbiAmvZWg==
1949
+ -----END CERTIFICATE-----
1950
+
1951
+ SecureSign RootCA11
1952
+ ===================
1953
+ -----BEGIN CERTIFICATE-----
1954
+ MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi
1955
+ SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS
1956
+ b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw
1957
+ KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1
1958
+ cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL
1959
+ TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO
1960
+ wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq
1961
+ g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP
1962
+ O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA
1963
+ bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX
1964
+ t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh
1965
+ OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r
1966
+ bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ
1967
+ Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01
1968
+ y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061
1969
+ lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=
1970
+ -----END CERTIFICATE-----
1971
+
1972
+ ACEDICOM Root
1973
+ =============
1974
+ -----BEGIN CERTIFICATE-----
1975
+ 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
2001
+ -----END CERTIFICATE-----
2002
+
2003
+ Microsec e-Szigno Root CA 2009
2004
+ ==============================
2005
+ -----BEGIN CERTIFICATE-----
2006
+ MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER
2007
+ MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv
2008
+ c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
2009
+ dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE
2010
+ BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt
2011
+ U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw
2012
+ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA
2013
+ fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG
2014
+ 0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA
2015
+ pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm
2016
+ 1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC
2017
+ AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf
2018
+ QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE
2019
+ FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o
2020
+ lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX
2021
+ I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
2022
+ tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02
2023
+ yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi
2024
+ LXpUq3DDfSJlgnCW
2025
+ -----END CERTIFICATE-----
2026
+
2027
+ GlobalSign Root CA - R3
2028
+ =======================
2029
+ -----BEGIN CERTIFICATE-----
2030
+ MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv
2031
+ YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
2032
+ bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
2033
+ aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
2034
+ bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt
2035
+ iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ
2036
+ 0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3
2037
+ rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl
2038
+ OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2
2039
+ xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
2040
+ FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7
2041
+ lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8
2042
+ EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E
2043
+ bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18
2044
+ YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r
2045
+ kpeDMdmztcpHWD9f
2046
+ -----END CERTIFICATE-----
2047
+
2048
+ Autoridad de Certificacion Firmaprofesional CIF A62634068
2049
+ =========================================================
2050
+ -----BEGIN CERTIFICATE-----
2051
+ MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA
2052
+ BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
2053
+ MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw
2054
+ QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB
2055
+ NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD
2056
+ Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P
2057
+ B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY
2058
+ 7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH
2059
+ ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI
2060
+ plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX
2061
+ MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX
2062
+ LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK
2063
+ bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU
2064
+ vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud
2065
+ EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH
2066
+ DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
2067
+ cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA
2068
+ bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx
2069
+ ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx
2070
+ 51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk
2071
+ R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP
2072
+ T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f
2073
+ Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl
2074
+ osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR
2075
+ crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR
2076
+ saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD
2077
+ KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi
2078
+ 6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
2079
+ -----END CERTIFICATE-----
2080
+
2081
+ Izenpe.com
2082
+ ==========
2083
+ -----BEGIN CERTIFICATE-----
2084
+ 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
2111
+ -----END CERTIFICATE-----
2112
+
2113
+ Chambers of Commerce Root - 2008
2114
+ ================================
2115
+ -----BEGIN CERTIFICATE-----
2116
+ MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD
2117
+ MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
2118
+ bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
2119
+ QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy
2120
+ Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl
2121
+ ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF
2122
+ EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl
2123
+ cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
2124
+ AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA
2125
+ XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj
2126
+ h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/
2127
+ ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk
2128
+ NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g
2129
+ D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331
2130
+ lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ
2131
+ 0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
2132
+ ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2
2133
+ EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI
2134
+ G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ
2135
+ BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh
2136
+ bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh
2137
+ bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC
2138
+ CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH
2139
+ AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1
2140
+ wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH
2141
+ 3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU
2142
+ RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6
2143
+ M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1
2144
+ YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF
2145
+ 9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK
2146
+ zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG
2147
+ nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
2148
+ OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ
2149
+ -----END CERTIFICATE-----
2150
+
2151
+ Global Chambersign Root - 2008
2152
+ ==============================
2153
+ -----BEGIN CERTIFICATE-----
2154
+ MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD
2155
+ MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
2156
+ bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
2157
+ QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx
2158
+ NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg
2159
+ Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ
2160
+ QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
2161
+ aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf
2162
+ VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf
2163
+ XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0
2164
+ ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB
2165
+ /gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA
2166
+ TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M
2167
+ H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe
2168
+ Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF
2169
+ HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
2170
+ wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB
2171
+ AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT
2172
+ BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE
2173
+ BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm
2174
+ aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm
2175
+ aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp
2176
+ 1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0
2177
+ dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG
2178
+ /5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6
2179
+ ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s
2180
+ dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg
2181
+ 9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH
2182
+ foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du
2183
+ qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr
2184
+ P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq
2185
+ c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
2186
+ 09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
2187
+ -----END CERTIFICATE-----
2188
+
2189
+ Go Daddy Root Certificate Authority - G2
2190
+ ========================================
2191
+ -----BEGIN CERTIFICATE-----
2192
+ MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
2193
+ B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu
2194
+ MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
2195
+ MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
2196
+ b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G
2197
+ A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
2198
+ hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq
2199
+ 9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD
2200
+ +qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd
2201
+ fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl
2202
+ NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC
2203
+ MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9
2204
+ BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac
2205
+ vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r
2206
+ 5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV
2207
+ N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
2208
+ LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1
2209
+ -----END CERTIFICATE-----
2210
+
2211
+ Starfield Root Certificate Authority - G2
2212
+ =========================================
2213
+ -----BEGIN CERTIFICATE-----
2214
+ MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
2215
+ B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
2216
+ b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
2217
+ eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw
2218
+ DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg
2219
+ VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB
2220
+ dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv
2221
+ W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs
2222
+ bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk
2223
+ N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf
2224
+ ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU
2225
+ JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
2226
+ AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol
2227
+ TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx
2228
+ 4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw
2229
+ F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
2230
+ pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ
2231
+ c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
2232
+ -----END CERTIFICATE-----
2233
+
2234
+ Starfield Services Root Certificate Authority - G2
2235
+ ==================================================
2236
+ -----BEGIN CERTIFICATE-----
2237
+ MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
2238
+ B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
2239
+ b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl
2240
+ IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV
2241
+ BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT
2242
+ dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg
2243
+ Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
2244
+ AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2
2245
+ h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa
2246
+ hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP
2247
+ LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB
2248
+ rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
2249
+ AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG
2250
+ SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP
2251
+ E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy
2252
+ xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
2253
+ iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza
2254
+ YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6
2255
+ -----END CERTIFICATE-----
2256
+
2257
+ AffirmTrust Commercial
2258
+ ======================
2259
+ -----BEGIN CERTIFICATE-----
2260
+ MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS
2261
+ BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw
2262
+ MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
2263
+ bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF
2264
+ AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb
2265
+ DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV
2266
+ C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6
2267
+ BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww
2268
+ MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV
2269
+ HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
2270
+ AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG
2271
+ hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi
2272
+ qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv
2273
+ 0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh
2274
+ sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
2275
+ -----END CERTIFICATE-----
2276
+
2277
+ AffirmTrust Networking
2278
+ ======================
2279
+ -----BEGIN CERTIFICATE-----
2280
+ MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS
2281
+ BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw
2282
+ MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
2283
+ bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF
2284
+ AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE
2285
+ Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI
2286
+ dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24
2287
+ /PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb
2288
+ h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV
2289
+ HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
2290
+ AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu
2291
+ UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6
2292
+ 12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23
2293
+ WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9
2294
+ /ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
2295
+ -----END CERTIFICATE-----
2296
+
2297
+ AffirmTrust Premium
2298
+ ===================
2299
+ -----BEGIN CERTIFICATE-----
2300
+ MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS
2301
+ BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy
2302
+ OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy
2303
+ dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
2304
+ MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn
2305
+ BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV
2306
+ 5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs
2307
+ +7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd
2308
+ GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R
2309
+ p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI
2310
+ S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04
2311
+ 6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5
2312
+ /bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo
2313
+ +Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB
2314
+ /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv
2315
+ MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
2316
+ Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC
2317
+ 6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S
2318
+ L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK
2319
+ +4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV
2320
+ BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg
2321
+ IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60
2322
+ g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb
2323
+ zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw==
2324
+ -----END CERTIFICATE-----
2325
+
2326
+ AffirmTrust Premium ECC
2327
+ =======================
2328
+ -----BEGIN CERTIFICATE-----
2329
+ MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV
2330
+ BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx
2331
+ MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U
2332
+ cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA
2333
+ IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ
2334
+ N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW
2335
+ BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK
2336
+ BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X
2337
+ 57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM
2338
+ eQ==
2339
+ -----END CERTIFICATE-----
2340
+
2341
+ Certum Trusted Network CA
2342
+ =========================
2343
+ -----BEGIN CERTIFICATE-----
2344
+ MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK
2345
+ ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv
2346
+ biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy
2347
+ MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU
2348
+ ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
2349
+ MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
2350
+ AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC
2351
+ l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J
2352
+ J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4
2353
+ fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0
2354
+ cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB
2355
+ Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw
2356
+ DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj
2357
+ jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1
2358
+ mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj
2359
+ Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
2360
+ 03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
2361
+ -----END CERTIFICATE-----
2362
+
2363
+ Certinomis - Autorité Racine
2364
+ =============================
2365
+ -----BEGIN CERTIFICATE-----
2366
+ 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
2391
+ vgt2Fl43N+bYdJeimUV5
2392
+ -----END CERTIFICATE-----
2393
+
2394
+ Root CA Generalitat Valenciana
2395
+ ==============================
2396
+ -----BEGIN CERTIFICATE-----
2397
+ MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE
2398
+ ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290
2399
+ IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3
2400
+ WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE
2401
+ CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G
2402
+ CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2
2403
+ F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B
2404
+ ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ
2405
+ D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte
2406
+ JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB
2407
+ AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n
2408
+ dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB
2409
+ ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl
2410
+ AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA
2411
+ YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy
2412
+ AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA
2413
+ aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt
2414
+ AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA
2415
+ YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu
2416
+ AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA
2417
+ OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0
2418
+ dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV
2419
+ BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G
2420
+ A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S
2421
+ b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh
2422
+ TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz
2423
+ Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63
2424
+ NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH
2425
+ iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt
2426
+ +GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM=
2427
+ -----END CERTIFICATE-----
2428
+
2429
+ TWCA Root Certification Authority
2430
+ =================================
2431
+ -----BEGIN CERTIFICATE-----
2432
+ MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ
2433
+ VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh
2434
+ dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG
2435
+ EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB
2436
+ IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
2437
+ AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx
2438
+ QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC
2439
+ oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP
2440
+ 4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r
2441
+ y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB
2442
+ BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG
2443
+ 9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC
2444
+ mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW
2445
+ QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY
2446
+ T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny
2447
+ Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
2448
+ -----END CERTIFICATE-----
2449
+
2450
+ Security Communication RootCA2
2451
+ ==============================
2452
+ -----BEGIN CERTIFICATE-----
2453
+ MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
2454
+ U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh
2455
+ dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC
2456
+ SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy
2457
+ aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
2458
+ ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++
2459
+ +T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R
2460
+ 3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV
2461
+ spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K
2462
+ EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8
2463
+ QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB
2464
+ CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj
2465
+ u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk
2466
+ 3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q
2467
+ tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29
2468
+ mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
2469
+ -----END CERTIFICATE-----
2470
+
2471
+ EC-ACC
2472
+ ======
2473
+ -----BEGIN CERTIFICATE-----
2474
+ MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE
2475
+ BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w
2476
+ ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD
2477
+ VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE
2478
+ CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT
2479
+ BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7
2480
+ MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt
2481
+ SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl
2482
+ Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh
2483
+ cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND
2484
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK
2485
+ w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT
2486
+ ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4
2487
+ HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a
2488
+ E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw
2489
+ 0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E
2490
+ BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD
2491
+ VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0
2492
+ Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l
2493
+ dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ
2494
+ lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa
2495
+ Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe
2496
+ l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2
2497
+ E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D
2498
+ 5EI=
2499
+ -----END CERTIFICATE-----
2500
+
2501
+ Hellenic Academic and Research Institutions RootCA 2011
2502
+ =======================================================
2503
+ -----BEGIN CERTIFICATE-----
2504
+ MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT
2505
+ O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y
2506
+ aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
2507
+ IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT
2508
+ AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
2509
+ IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo
2510
+ IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
2511
+ AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI
2512
+ 1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa
2513
+ 71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u
2514
+ 8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH
2515
+ 3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/
2516
+ MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8
2517
+ MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu
2518
+ b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt
2519
+ XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8
2520
+ TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD
2521
+ /md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N
2522
+ 7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4
2523
+ -----END CERTIFICATE-----
2524
+
2525
+ Actalis Authentication Root CA
2526
+ ==============================
2527
+ -----BEGIN CERTIFICATE-----
2528
+ MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM
2529
+ BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE
2530
+ AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky
2531
+ MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz
2532
+ IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
2533
+ IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ
2534
+ wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa
2535
+ by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6
2536
+ zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f
2537
+ YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2
2538
+ oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l
2539
+ EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7
2540
+ hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8
2541
+ EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5
2542
+ jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY
2543
+ iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
2544
+ ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI
2545
+ WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0
2546
+ JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx
2547
+ K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+
2548
+ Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC
2549
+ 4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo
2550
+ 2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz
2551
+ lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem
2552
+ OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9
2553
+ vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
2554
+ -----END CERTIFICATE-----
2555
+
2556
+ Trustis FPS Root CA
2557
+ ===================
2558
+ -----BEGIN CERTIFICATE-----
2559
+ MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG
2560
+ EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290
2561
+ IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV
2562
+ BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ
2563
+ KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ
2564
+ RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk
2565
+ H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa
2566
+ cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt
2567
+ o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA
2568
+ AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd
2569
+ BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c
2570
+ GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC
2571
+ yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P
2572
+ 8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV
2573
+ l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl
2574
+ iB6XzCGcKQENZetX2fNXlrtIzYE=
2575
+ -----END CERTIFICATE-----
2576
+
2577
+ StartCom Certification Authority
2578
+ ================================
2579
+ -----BEGIN CERTIFICATE-----
2580
+ MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
2581
+ U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
2582
+ ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
2583
+ NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
2584
+ LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
2585
+ U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
2586
+ ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
2587
+ o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
2588
+ Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
2589
+ eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
2590
+ 2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
2591
+ 6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
2592
+ osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
2593
+ untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
2594
+ UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
2595
+ 37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
2596
+ VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ
2597
+ Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0
2598
+ dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu
2599
+ c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv
2600
+ bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0
2601
+ aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0
2602
+ aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t
2603
+ L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG
2604
+ cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5
2605
+ fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm
2606
+ N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN
2607
+ Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T
2608
+ tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX
2609
+ e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA
2610
+ 2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs
2611
+ HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE
2612
+ JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib
2613
+ D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8=
2614
+ -----END CERTIFICATE-----
2615
+
2616
+ StartCom Certification Authority G2
2617
+ ===================================
2618
+ -----BEGIN CERTIFICATE-----
2619
+ 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
2643
+ obp573PYtlNXLfbQ4ddI
2644
+ -----END CERTIFICATE-----
2645
+
2646
+ Buypass Class 2 Root CA
2647
+ =======================
2648
+ -----BEGIN CERTIFICATE-----
2649
+ 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
2673
+ rJgWVqA=
2674
+ -----END CERTIFICATE-----
2675
+
2676
+ Buypass Class 3 Root CA
2677
+ =======================
2678
+ -----BEGIN CERTIFICATE-----
2679
+ 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
2703
+ Cp/HuZc=
2704
+ -----END CERTIFICATE-----
2705
+
2706
+ T-TeleSec GlobalRoot Class 3
2707
+ ============================
2708
+ -----BEGIN CERTIFICATE-----
2709
+ MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
2710
+ IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
2711
+ cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx
2712
+ MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
2713
+ dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
2714
+ ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3
2715
+ DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK
2716
+ 9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU
2717
+ NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF
2718
+ iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W
2719
+ 0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA
2720
+ MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr
2721
+ AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb
2722
+ fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT
2723
+ ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h
2724
+ P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
2725
+ e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw==
2726
+ -----END CERTIFICATE-----
2727
+
2728
+ EE Certification Centre Root CA
2729
+ ===============================
2730
+ -----BEGIN CERTIFICATE-----
2731
+ MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
2732
+ EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy
2733
+ dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw
2734
+ MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB
2735
+ UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy
2736
+ ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB
2737
+ DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM
2738
+ TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2
2739
+ rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw
2740
+ 93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN
2741
+ P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T
2742
+ AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ
2743
+ MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF
2744
+ BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj
2745
+ xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM
2746
+ lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u
2747
+ uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU
2748
+ 3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM
2749
+ dcGWxZ0=
2750
+ -----END CERTIFICATE-----
2751
+
2752
+ TURKTRUST Certificate Services Provider Root 2007
2753
+ =================================================
2754
+ -----BEGIN CERTIFICATE-----
2755
+ MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF
2756
+ bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP
2757
+ MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
2758
+ QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X
2759
+ DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl
2760
+ a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN
2761
+ BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp
2762
+ bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw
2763
+ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N
2764
+ YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv
2765
+ KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya
2766
+ KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT
2767
+ rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC
2768
+ AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP
2769
+ BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s
2770
+ Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I
2771
+ aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO
2772
+ Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb
2773
+ BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK
2774
+ poRq0Tl9
2775
+ -----END CERTIFICATE-----
2776
+
2777
+ D-TRUST Root Class 3 CA 2 2009
2778
+ ==============================
2779
+ -----BEGIN CERTIFICATE-----
2780
+ MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK
2781
+ DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe
2782
+ Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE
2783
+ LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw
2784
+ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD
2785
+ ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA
2786
+ BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv
2787
+ KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z
2788
+ p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC
2789
+ AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ
2790
+ 4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y
2791
+ eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw
2792
+ MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G
2793
+ PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw
2794
+ OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm
2795
+ 2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0
2796
+ o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV
2797
+ dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph
2798
+ X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I=
2799
+ -----END CERTIFICATE-----
2800
+
2801
+ D-TRUST Root Class 3 CA 2 EV 2009
2802
+ =================================
2803
+ -----BEGIN CERTIFICATE-----
2804
+ MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
2805
+ DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
2806
+ OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
2807
+ DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
2808
+ OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS
2809
+ egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh
2810
+ zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T
2811
+ 7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60
2812
+ sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35
2813
+ 11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv
2814
+ cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v
2815
+ ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El
2816
+ MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp
2817
+ b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh
2818
+ c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+
2819
+ PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05
2820
+ nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX
2821
+ ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA
2822
+ NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv
2823
+ w9y4AyHqnxbxLFS1
2824
+ -----END CERTIFICATE-----
2825
+
2826
+ PSCProcert
2827
+ ==========
2828
+ -----BEGIN CERTIFICATE-----
2829
+ MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1dG9yaWRhZCBk
2830
+ ZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9sYW5vMQswCQYDVQQGEwJWRTEQ
2831
+ MA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlzdHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lz
2832
+ dGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBl
2833
+ cmludGVuZGVuY2lhIGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUw
2834
+ IwYJKoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEwMFoXDTIw
2835
+ MTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHByb2NlcnQubmV0LnZlMQ8w
2836
+ DQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGExKjAoBgNVBAsTIVByb3ZlZWRvciBkZSBD
2837
+ ZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZp
2838
+ Y2FjaW9uIEVsZWN0cm9uaWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIw
2839
+ DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo97BVC
2840
+ wfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74BCXfgI8Qhd19L3uA
2841
+ 3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38GieU89RLAu9MLmV+QfI4tL3czkkoh
2842
+ RqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmO
2843
+ EO8GqQKJ/+MMbpfg353bIdD0PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG2
2844
+ 0qCZyFSTXai20b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH
2845
+ 0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/6mnbVSKVUyqU
2846
+ td+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1mv6JpIzi4mWCZDlZTOpx+FIyw
2847
+ Bm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvp
2848
+ r2uKGcfLFFb14dq12fy/czja+eevbqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/
2849
+ AgEBMDcGA1UdEgQwMC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAz
2850
+ Ni0wMB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFDgBStuyId
2851
+ xuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0b3JpZGFkIGRlIENlcnRp
2852
+ ZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xhbm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQH
2853
+ EwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5h
2854
+ Y2lvbmFsIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5k
2855
+ ZW5jaWEgZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkqhkiG
2856
+ 9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQDAgEGME0GA1UdEQRG
2857
+ MESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0wMDAwMDKgGwYFYIZeAgKgEgwQUklG
2858
+ LUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEagRKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52
2859
+ ZS9sY3IvQ0VSVElGSUNBRE8tUkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNy
2860
+ YWl6LnN1c2NlcnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v
2861
+ Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsGAQUFBwIBFh5o
2862
+ dHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcNAQELBQADggIBACtZ6yKZu4Sq
2863
+ T96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmN
2864
+ g7+mvTV+LFwxNG9s2/NkAZiqlCxB3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4q
2865
+ uxtxj7mkoP3YldmvWb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1
2866
+ n8GhHVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHmpHmJWhSn
2867
+ FFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXzsOfIt+FTvZLm8wyWuevo
2868
+ 5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bEqCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq
2869
+ 3TNWOByyrYDT13K9mmyZY+gAu0F2BbdbmRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5
2870
+ poLWccret9W6aAjtmcz9opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3Y
2871
+ eMLEYC/HYvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km
2872
+ -----END CERTIFICATE-----
2873
+
2874
+ China Internet Network Information Center EV Certificates Root
2875
+ ==============================================================
2876
+ -----BEGIN CERTIFICATE-----
2877
+ MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCQ04xMjAwBgNV
2878
+ BAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyMUcwRQYDVQQDDD5D
2879
+ aGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMg
2880
+ Um9vdDAeFw0xMDA4MzEwNzExMjVaFw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAG
2881
+ A1UECgwpQ2hpbmEgSW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMM
2882
+ PkNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRpZmljYXRl
2883
+ cyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z7r07eKpkQ0H1UN+U8i6y
2884
+ jUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA//DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV
2885
+ 98YPjUesWgbdYavi7NifFy2cyjw1l1VxzUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2H
2886
+ klY0bBoQCxfVWhyXWIQ8hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23
2887
+ KzhmBsUs4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54ugQEC
2888
+ 7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oYNJKiyoOCWTAPBgNV
2889
+ HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUfHJLOcfA22KlT5uqGDSSosqD
2890
+ glkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd5
2891
+ 0XPFtQO3WKwMVC/GVhMPMdoG52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM
2892
+ 7+czV0I664zBechNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws
2893
+ ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrIzo9uoV1/A3U0
2894
+ 5K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATywy39FCqQmbkHzJ8=
2895
+ -----END CERTIFICATE-----
2896
+
2897
+ Swisscom Root CA 2
2898
+ ==================
2899
+ -----BEGIN CERTIFICATE-----
2900
+ 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
2926
+ 5OfNeOI5wSsSnqaeG8XmDtkx2Q==
2927
+ -----END CERTIFICATE-----
2928
+
2929
+ Swisscom Root EV CA 2
2930
+ =====================
2931
+ -----BEGIN CERTIFICATE-----
2932
+ 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
2958
+ l8PVP3wbI+2ksx0WckNLIOFZfsLorSa/ovc=
2959
+ -----END CERTIFICATE-----
2960
+
2961
+ CA Disig Root R1
2962
+ ================
2963
+ -----BEGIN CERTIFICATE-----
2964
+ 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
2988
+ a7+h89n07eLw4+1knj0vllJPgFOL
2989
+ -----END CERTIFICATE-----
2990
+
2991
+ CA Disig Root R2
2992
+ ================
2993
+ -----BEGIN CERTIFICATE-----
2994
+ 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
3018
+ 7+ZtsH8tZ/3zbBt1RqPlShfppNcL
3019
+ -----END CERTIFICATE-----
3020
+
3021
+ ACCVRAIZ1
3022
+ =========
3023
+ -----BEGIN CERTIFICATE-----
3024
+ MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB
3025
+ SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1
3026
+ MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH
3027
+ UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
3028
+ DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM
3029
+ jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0
3030
+ RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD
3031
+ aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ
3032
+ 0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG
3033
+ WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7
3034
+ 8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR
3035
+ 5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J
3036
+ 9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK
3037
+ Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw
3038
+ Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu
3039
+ Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2
3040
+ VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM
3041
+ Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA
3042
+ QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh
3043
+ AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA
3044
+ YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj
3045
+ AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA
3046
+ IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk
3047
+ aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0
3048
+ dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2
3049
+ MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI
3050
+ hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E
3051
+ R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN
3052
+ YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49
3053
+ nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ
3054
+ TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3
3055
+ sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h
3056
+ I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg
3057
+ Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd
3058
+ 3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p
3059
+ EfbRD0tVNEYqi4Y7
3060
+ -----END CERTIFICATE-----
3061
+
3062
+ TWCA Global Root CA
3063
+ ===================
3064
+ -----BEGIN CERTIFICATE-----
3065
+ MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT
3066
+ CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD
3067
+ QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK
3068
+ EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg
3069
+ Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C
3070
+ nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV
3071
+ r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR
3072
+ Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV
3073
+ tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W
3074
+ KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99
3075
+ sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p
3076
+ yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn
3077
+ kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI
3078
+ zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC
3079
+ AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g
3080
+ cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn
3081
+ LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M
3082
+ 8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg
3083
+ /eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg
3084
+ lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP
3085
+ A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m
3086
+ i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8
3087
+ EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3
3088
+ zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0=
3089
+ -----END CERTIFICATE-----
3090
+
3091
+ TeliaSonera Root CA v1
3092
+ ======================
3093
+ -----BEGIN CERTIFICATE-----
3094
+ MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE
3095
+ CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4
3096
+ MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW
3097
+ VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+
3098
+ 6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA
3099
+ 3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k
3100
+ B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn
3101
+ Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH
3102
+ oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3
3103
+ F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ
3104
+ oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7
3105
+ gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc
3106
+ TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB
3107
+ AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW
3108
+ DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm
3109
+ zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx
3110
+ 0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW
3111
+ pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV
3112
+ G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc
3113
+ c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT
3114
+ JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2
3115
+ qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6
3116
+ Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems
3117
+ WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=
3118
+ -----END CERTIFICATE-----
3119
+
3120
+ E-Tugra Certification Authority
3121
+ ===============================
3122
+ -----BEGIN CERTIFICATE-----
3123
+ MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w
3124
+ DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls
3125
+ ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN
3126
+ ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw
3127
+ NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx
3128
+ QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl
3129
+ cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD
3130
+ DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
3131
+ MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd
3132
+ hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K
3133
+ CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g
3134
+ ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ
3135
+ BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0
3136
+ E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz
3137
+ rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq
3138
+ jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn
3139
+ rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5
3140
+ dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB
3141
+ /wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG
3142
+ MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK
3143
+ kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO
3144
+ XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807
3145
+ VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo
3146
+ a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc
3147
+ dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV
3148
+ KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT
3149
+ Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0
3150
+ 8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G
3151
+ C7TbO6Orb1wdtn7os4I07QZcJA==
3152
+ -----END CERTIFICATE-----
3153
+
3154
+ T-TeleSec GlobalRoot Class 2
3155
+ ============================
3156
+ -----BEGIN CERTIFICATE-----
3157
+ MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
3158
+ IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
3159
+ cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx
3160
+ MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
3161
+ dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
3162
+ ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3
3163
+ DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ
3164
+ SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F
3165
+ vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970
3166
+ 2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV
3167
+ WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA
3168
+ MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy
3169
+ YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4
3170
+ r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf
3171
+ vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR
3172
+ 3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN
3173
+ 9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg==
3174
+ -----END CERTIFICATE-----
3175
+
3176
+ Atos TrustedRoot 2011
3177
+ =====================
3178
+ -----BEGIN CERTIFICATE-----
3179
+ MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU
3180
+ cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4
3181
+ MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG
3182
+ A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV
3183
+ hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr
3184
+ 54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+
3185
+ DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320
3186
+ HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR
3187
+ z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R
3188
+ l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ
3189
+ bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB
3190
+ CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h
3191
+ k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh
3192
+ TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9
3193
+ 61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G
3194
+ 3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed
3195
+ -----END CERTIFICATE-----
3196
+
3197
+ QuoVadis Root CA 1 G3
3198
+ =====================
3199
+ -----BEGIN CERTIFICATE-----
3200
+ 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
3224
+ hMJKzRwuJIczYOXD
3225
+ -----END CERTIFICATE-----
3226
+
3227
+ QuoVadis Root CA 2 G3
3228
+ =====================
3229
+ -----BEGIN CERTIFICATE-----
3230
+ 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
3254
+ O3jtZsSOeWmD3n+M
3255
+ -----END CERTIFICATE-----
3256
+
3257
+ QuoVadis Root CA 3 G3
3258
+ =====================
3259
+ -----BEGIN CERTIFICATE-----
3260
+ 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
3284
+ PpxxVJkES/1Y+Zj0
3285
+ -----END CERTIFICATE-----
3286
+
3287
+ DigiCert Assured ID Root G2
3288
+ ===========================
3289
+ -----BEGIN CERTIFICATE-----
3290
+ MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG
3291
+ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
3292
+ IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw
3293
+ MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
3294
+ ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw
3295
+ ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH
3296
+ 35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq
3297
+ bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw
3298
+ VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP
3299
+ YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn
3300
+ lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO
3301
+ w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv
3302
+ 0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz
3303
+ d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW
3304
+ hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M
3305
+ jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo
3306
+ IhNzbM8m9Yop5w==
3307
+ -----END CERTIFICATE-----
3308
+
3309
+ DigiCert Assured ID Root G3
3310
+ ===========================
3311
+ -----BEGIN CERTIFICATE-----
3312
+ MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV
3313
+ UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD
3314
+ VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1
3315
+ MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
3316
+ d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ
3317
+ BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb
3318
+ RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs
3319
+ KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF
3320
+ UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy
3321
+ YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy
3322
+ 1vUhZscv6pZjamVFkpUBtA==
3323
+ -----END CERTIFICATE-----
3324
+
3325
+ DigiCert Global Root G2
3326
+ =======================
3327
+ -----BEGIN CERTIFICATE-----
3328
+ MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG
3329
+ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
3330
+ HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx
3331
+ MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
3332
+ dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq
3333
+ hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ
3334
+ kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO
3335
+ 3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV
3336
+ BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM
3337
+ UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB
3338
+ o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu
3339
+ 5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr
3340
+ F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U
3341
+ WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH
3342
+ QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/
3343
+ iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl
3344
+ MrY=
3345
+ -----END CERTIFICATE-----
3346
+
3347
+ DigiCert Global Root G3
3348
+ =======================
3349
+ -----BEGIN CERTIFICATE-----
3350
+ MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV
3351
+ UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD
3352
+ VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw
3353
+ MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k
3354
+ aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C
3355
+ AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O
3356
+ YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP
3357
+ BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp
3358
+ Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y
3359
+ 3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34
3360
+ VOKa5Vt8sycX
3361
+ -----END CERTIFICATE-----
3362
+
3363
+ DigiCert Trusted Root G4
3364
+ ========================
3365
+ -----BEGIN CERTIFICATE-----
3366
+ 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
3391
+ 82Z+
3392
+ -----END CERTIFICATE-----
3393
+
3394
+ WoSign
3395
+ ======
3396
+ -----BEGIN CERTIFICATE-----
3397
+ MIIFdjCCA16gAwIBAgIQXmjWEXGUY1BWAGjzPsnFkTANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQG
3398
+ EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNVBAMTIUNlcnRpZmljYXRpb24g
3399
+ QXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMFUxCzAJ
3400
+ BgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEqMCgGA1UEAxMhQ2VydGlmaWNh
3401
+ dGlvbiBBdXRob3JpdHkgb2YgV29TaWduMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA
3402
+ vcqNrLiRFVaXe2tcesLea9mhsMMQI/qnobLMMfo+2aYpbxY94Gv4uEBf2zmoAHqLoE1UfcIiePyO
3403
+ CbiohdfMlZdLdNiefvAA5A6JrkkoRBoQmTIPJYhTpA2zDxIIFgsDcSccf+Hb0v1naMQFXQoOXXDX
3404
+ 2JegvFNBmpGN9J42Znp+VsGQX+axaCA2pIwkLCxHC1l2ZjC1vt7tj/id07sBMOby8w7gLJKA84X5
3405
+ KIq0VC6a7fd2/BVoFutKbOsuEo/Uz/4Mx1wdC34FMr5esAkqQtXJTpCzWQ27en7N1QhatH/YHGkR
3406
+ +ScPewavVIMYe+HdVHpRaG53/Ma/UkpmRqGyZxq7o093oL5d//xWC0Nyd5DKnvnyOfUNqfTq1+ez
3407
+ EC8wQjchzDBwyYaYD8xYTYO7feUapTeNtqwylwA6Y3EkHp43xP901DfA4v6IRmAR3Qg/UDaruHqk
3408
+ lWJqbrDKaiFaafPz+x1wOZXzp26mgYmhiMU7ccqjUu6Du/2gd/Tkb+dC221KmYo0SLwX3OSACCK2
3409
+ 8jHAPwQ+658geda4BmRkAjHXqc1S+4RFaQkAKtxVi8QGRkvASh0JWzko/amrzgD5LkhLJuYwTKVY
3410
+ yrREgk/nkR4zw7CT/xH8gdLKH3Ep3XZPkiWvHYG3Dy+MwwbMLyejSuQOmbp8HkUff6oZRZb9/D0C
3411
+ AwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOFmzw7R
3412
+ 8bNLtwYgFP6HEtX2/vs+MA0GCSqGSIb3DQEBBQUAA4ICAQCoy3JAsnbBfnv8rWTjMnvMPLZdRtP1
3413
+ LOJwXcgu2AZ9mNELIaCJWSQBnfmvCX0KI4I01fx8cpm5o9dU9OpScA7F9dY74ToJMuYhOZO9sxXq
3414
+ T2r09Ys/L3yNWC7F4TmgPsc9SnOeQHrAK2GpZ8nzJLmzbVUsWh2eJXLOC62qx1ViC777Y7NhRCOj
3415
+ y+EaDveaBk3e1CNOIZZbOVtXHS9dCF4Jef98l7VNg64N1uajeeAz0JmWAjCnPv/So0M/BVoG6kQC
3416
+ 2nz4SNAzqfkHx5Xh9T71XXG68pWpdIhhWeO/yloTunK0jF02h+mmxTwTv97QRCbut+wucPrXnbes
3417
+ 5cVAWubXbHssw1abR80LzvobtCHXt2a49CUwi1wNuepnsvRtrtWhnk/Yn+knArAdBtaP4/tIEp9/
3418
+ EaEQPkxROpaw0RPxx9gmrjrKkcRpnd8BKWRRb2jaFOwIQZeQjdCygPLPwj2/kWjFgGcexGATVdVh
3419
+ mVd8upUPYUk6ynW8yQqTP2cOEvIo4jEbwFcW3wh8GcF+Dx+FHgo2fFt+J7x6v+Db9NpSvd4MVHAx
3420
+ kUOVyLzwPt0JfjBkUO1/AaQzZ01oT74V77D2AhGiGxMlOtzCWfHjXEa7ZywCRuoeSKbmW9m1vFGi
3421
+ kpbbqsY3Iqb+zCB0oy2pLmvLwIIRIbWTee5Ehr7XHuQe+w==
3422
+ -----END CERTIFICATE-----
3423
+
3424
+ WoSign China
3425
+ ============
3426
+ -----BEGIN CERTIFICATE-----
3427
+ MIIFWDCCA0CgAwIBAgIQUHBrzdgT/BtOOzNy0hFIjTANBgkqhkiG9w0BAQsFADBGMQswCQYDVQQG
3428
+ EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMMEkNBIOayg+mAmuagueiv
3429
+ geS5pjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMEYxCzAJBgNVBAYTAkNOMRowGAYD
3430
+ VQQKExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAwwSQ0Eg5rKD6YCa5qC56K+B5LmmMIICIjAN
3431
+ BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0EkhHiX8h8EqwqzbdoYGTufQdDTc7WU1/FDWiD+k
3432
+ 8H/rD195L4mx/bxjWDeTmzj4t1up+thxx7S8gJeNbEvxUNUqKaqoGXqW5pWOdO2XCld19AXbbQs5
3433
+ uQF/qvbW2mzmBeCkTVL829B0txGMe41P/4eDrv8FAxNXUDf+jJZSEExfv5RxadmWPgxDT74wwJ85
3434
+ dE8GRV2j1lY5aAfMh09Qd5Nx2UQIsYo06Yms25tO4dnkUkWMLhQfkWsZHWgpLFbE4h4TV2TwYeO5
3435
+ Ed+w4VegG63XX9Gv2ystP9Bojg/qnw+LNVgbExz03jWhCl3W6t8Sb8D7aQdGctyB9gQjF+BNdeFy
3436
+ b7Ao65vh4YOhn0pdr8yb+gIgthhid5E7o9Vlrdx8kHccREGkSovrlXLp9glk3Kgtn3R46MGiCWOc
3437
+ 76DbT52VqyBPt7D3h1ymoOQ3OMdc4zUPLK2jgKLsLl3Az+2LBcLmc272idX10kaO6m1jGx6KyX2m
3438
+ +Jzr5dVjhU1zZmkR/sgO9MHHZklTfuQZa/HpelmjbX7FF+Ynxu8b22/8DU0GAbQOXDBGVWCvOGU6
3439
+ yke6rCzMRh+yRpY/8+0mBe53oWprfi1tWFxK1I5nuPHa1UaKJ/kR8slC/k7e3x9cxKSGhxYzoacX
3440
+ GKUN5AXlK8IrC6KVkLn9YDxOiT7nnO4fuwECAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud
3441
+ EwEB/wQFMAMBAf8wHQYDVR0OBBYEFOBNv9ybQV0T6GTwp+kVpOGBwboxMA0GCSqGSIb3DQEBCwUA
3442
+ A4ICAQBqinA4WbbaixjIvirTthnVZil6Xc1bL3McJk6jfW+rtylNpumlEYOnOXOvEESS5iVdT2H6
3443
+ yAa+Tkvv/vMx/sZ8cApBWNromUuWyXi8mHwCKe0JgOYKOoICKuLJL8hWGSbueBwj/feTZU7n85iY
3444
+ r83d2Z5AiDEoOqsuC7CsDCT6eiaY8xJhEPRdF/d+4niXVOKM6Cm6jBAyvd0zaziGfjk9DgNyp115
3445
+ j0WKWa5bIW4xRtVZjc8VX90xJc/bYNaBRHIpAlf2ltTW/+op2znFuCyKGo3Oy+dCMYYFaA6eFN0A
3446
+ kLppRQjbbpCBhqcqBT/mhDn4t/lXX0ykeVoQDF7Va/81XwVRHmyjdanPUIPTfPRm94KNPQx96N97
3447
+ qA4bLJyuQHCH2u2nFoJavjVsIE4iYdm8UXrNemHcSxH5/mc0zy4EZmFcV5cjjPOGG0jfKq+nwf/Y
3448
+ jj4Du9gqsPoUJbJRa4ZDhS4HIxaAjUz7tGM7zMN07RujHv41D198HRaG9Q7DlfEvr10lO1Hm13ZB
3449
+ ONFLAzkopR6RctR9q5czxNM+4Gm2KHmgCY0c0f9BckgG/Jou5yD5m6Leie2uPAmvylezkolwQOQv
3450
+ T8Jwg0DXJCxr5wkf09XHwQj02w47HAcLQxGEIYbpgNR12KvxAmLBsX5VYc8T1yaw15zLKYs4SgsO
3451
+ kI26oQ==
3452
+ -----END CERTIFICATE-----
3453
+
3454
+ COMODO RSA Certification Authority
3455
+ ==================================
3456
+ -----BEGIN CERTIFICATE-----
3457
+ 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
3483
+ LaZRfyHBNVOFBkpdn627G190
3484
+ -----END CERTIFICATE-----
3485
+
3486
+ USERTrust RSA Certification Authority
3487
+ =====================================
3488
+ -----BEGIN CERTIFICATE-----
3489
+ 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
3515
+ Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9
3516
+ -----END CERTIFICATE-----
3517
+
3518
+ USERTrust ECC Certification Authority
3519
+ =====================================
3520
+ -----BEGIN CERTIFICATE-----
3521
+ MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC
3522
+ VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
3523
+ aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv
3524
+ biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC
3525
+ VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
3526
+ aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv
3527
+ biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2
3528
+ 0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez
3529
+ nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV
3530
+ HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB
3531
+ HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu
3532
+ 9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=
3533
+ -----END CERTIFICATE-----
3534
+
3535
+ GlobalSign ECC Root CA - R4
3536
+ ===========================
3537
+ -----BEGIN CERTIFICATE-----
3538
+ MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb
3539
+ R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
3540
+ EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb
3541
+ R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
3542
+ EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl
3543
+ OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P
3544
+ AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV
3545
+ MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF
3546
+ JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q=
3547
+ -----END CERTIFICATE-----
3548
+
3549
+ GlobalSign ECC Root CA - R5
3550
+ ===========================
3551
+ -----BEGIN CERTIFICATE-----
3552
+ MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb
3553
+ R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
3554
+ EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb
3555
+ R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
3556
+ EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6
3557
+ SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS
3558
+ h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd
3559
+ BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx
3560
+ uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7
3561
+ yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3
3562
+ -----END CERTIFICATE-----
3563
+
3564
+ Staat der Nederlanden Root CA - G3
3565
+ ==================================
3566
+ -----BEGIN CERTIFICATE-----
3567
+ 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
3592
+ -----END CERTIFICATE-----
3593
+
3594
+ Staat der Nederlanden EV Root CA
3595
+ ================================
3596
+ -----BEGIN CERTIFICATE-----
3597
+ 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
3621
+ eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg==
3622
+ -----END CERTIFICATE-----
3623
+
3624
+ IdenTrust Commercial Root CA 1
3625
+ ==============================
3626
+ -----BEGIN CERTIFICATE-----
3627
+ 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
3651
+ cGzM7vRX+Bi6hG6H
3652
+ -----END CERTIFICATE-----
3653
+
3654
+ IdenTrust Public Sector Root CA 1
3655
+ =================================
3656
+ -----BEGIN CERTIFICATE-----
3657
+ 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
3681
+ 3Wl9af0AVqW3rLatt8o+Ae+c
3682
+ -----END CERTIFICATE-----
3683
+
3684
+ Entrust Root Certification Authority - G2
3685
+ =========================================
3686
+ -----BEGIN CERTIFICATE-----
3687
+ MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV
3688
+ BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy
3689
+ bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug
3690
+ b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw
3691
+ HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT
3692
+ DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx
3693
+ OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s
3694
+ eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi
3695
+ MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP
3696
+ /vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz
3697
+ HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU
3698
+ s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y
3699
+ TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx
3700
+ AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6
3701
+ 0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z
3702
+ iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ
3703
+ Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi
3704
+ nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+
3705
+ vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO
3706
+ e4pIb4tF9g==
3707
+ -----END CERTIFICATE-----
3708
+
3709
+ Entrust Root Certification Authority - EC1
3710
+ ==========================================
3711
+ -----BEGIN CERTIFICATE-----
3712
+ MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx
3713
+ FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn
3714
+ YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl
3715
+ ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
3716
+ IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw
3717
+ FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs
3718
+ LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg
3719
+ dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt
3720
+ IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy
3721
+ AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef
3722
+ 9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
3723
+ FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h
3724
+ vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8
3725
+ kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G
3726
+ -----END CERTIFICATE-----
3727
+
3728
+ CFCA EV ROOT
3729
+ ============
3730
+ -----BEGIN CERTIFICATE-----
3731
+ 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
3756
+ -----END CERTIFICATE-----
3757
+
3758
+ TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5
3759
+ =========================================================
3760
+ -----BEGIN CERTIFICATE-----
3761
+ MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UEBhMCVFIxDzAN
3762
+ BgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp
3763
+ bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1Qg
3764
+ RWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAw
3765
+ ODA3MDFaFw0yMzA0MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0w
3766
+ SwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnE
3767
+ n2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRp
3768
+ ZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
3769
+ CgKCAQEApCUZ4WWe60ghUEoI5RHwWrom/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537
3770
+ jVJp45wnEFPzpALFp/kRGml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1m
3771
+ ep5Fimh34khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z5UNP
3772
+ 9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0hO8EuPbJbKoCPrZV
3773
+ 4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QIDAQABo0IwQDAdBgNVHQ4EFgQUVpkH
3774
+ HtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI
3775
+ hvcNAQELBQADggEBAJ5FdnsXSDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPo
3776
+ BP5yCccLqh0lVX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq
3777
+ URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nfpeYVhDfwwvJl
3778
+ lpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CFYv4HAqGEVka+lgqaE9chTLd8
3779
+ B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW+qtB4Uu2NQvAmxU=
3780
+ -----END CERTIFICATE-----
3781
+
3782
+ TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H6
3783
+ =========================================================
3784
+ -----BEGIN CERTIFICATE-----
3785
+ MIIEJjCCAw6gAwIBAgIGfaHyZeyKMA0GCSqGSIb3DQEBCwUAMIGxMQswCQYDVQQGEwJUUjEPMA0G
3786
+ A1UEBwwGQW5rYXJhMU0wSwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls
3787
+ acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF
3788
+ bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg2MB4XDTEzMTIxODA5
3789
+ MDQxMFoXDTIzMTIxNjA5MDQxMFowgbExCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExTTBL
3790
+ BgNVBAoMRFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSf
3791
+ aSBIaXptZXRsZXJpIEEuxZ4uMUIwQAYDVQQDDDlUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2VydGlm
3792
+ aWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLEgSDYwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
3793
+ AoIBAQCdsGjW6L0UlqMACprx9MfMkU1xeHe59yEmFXNRFpQJRwXiM/VomjX/3EsvMsew7eKC5W/a
3794
+ 2uqsxgbPJQ1BgfbBOCK9+bGlprMBvD9QFyv26WZV1DOzXPhDIHiTVRZwGTLmiddk671IUP320EED
3795
+ wnS3/faAz1vFq6TWlRKb55cTMgPp1KtDWxbtMyJkKbbSk60vbNg9tvYdDjTu0n2pVQ8g9P0pu5Fb
3796
+ HH3GQjhtQiht1AH7zYiXSX6484P4tZgvsycLSF5W506jM7NE1qXyGJTtHB6plVxiSvgNZ1GpryHV
3797
+ +DKdeboaX+UEVU0TRv/yz3THGmNtwx8XEsMeED5gCLMxAgMBAAGjQjBAMB0GA1UdDgQWBBTdVRcT
3798
+ 9qzoSCHK77Wv0QAy7Z6MtTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG
3799
+ 9w0BAQsFAAOCAQEAb1gNl0OqFlQ+v6nfkkU/hQu7VtMMUszIv3ZnXuaqs6fvuay0EBQNdH49ba3R
3800
+ fdCaqaXKGDsCQC4qnFAUi/5XfldcEQlLNkVS9z2sFP1E34uXI9TDwe7UU5X+LEr+DXCqu4svLcsy
3801
+ o4LyVN/Y8t3XSHLuSqMplsNEzm61kod2pLv0kmzOLBQJZo6NrRa1xxsJYTvjIKIDgI6tflEATseW
3802
+ hvtDmHd9KMeP2Cpu54Rvl0EpABZeTeIT6lnAY2c6RPuY/ATTMHKm9ocJV612ph1jmv3XZch4gyt1
3803
+ O6VbuA1df74jrlZVlFjvH4GMKrLN5ptjnhi85WsGtAuYSyher4hYyw==
3804
+ -----END CERTIFICATE-----
3805
+
3806
+ Certinomis - Root CA
3807
+ ====================
3808
+ -----BEGIN CERTIFICATE-----
3809
+ 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
3834
+ hkIGuUE=
3835
+ -----END CERTIFICATE-----
3836
+
3837
+ OISTE WISeKey Global Root GB CA
3838
+ ===============================
3839
+ -----BEGIN CERTIFICATE-----
3840
+ MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG
3841
+ EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl
3842
+ ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw
3843
+ MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD
3844
+ VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds
3845
+ b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX
3846
+ scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP
3847
+ rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk
3848
+ 9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o
3849
+ Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg
3850
+ GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
3851
+ /zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI
3852
+ hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD
3853
+ dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0
3854
+ VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui
3855
+ HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic
3856
+ Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM=
3857
+ -----END CERTIFICATE-----
3858
+
3859
+ Certification Authority of WoSign G2
3860
+ ====================================
3861
+ -----BEGIN CERTIFICATE-----
3862
+ MIIDfDCCAmSgAwIBAgIQayXaioidfLwPBbOxemFFRDANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQG
3863
+ EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxLTArBgNVBAMTJENlcnRpZmljYXRpb24g
3864
+ QXV0aG9yaXR5IG9mIFdvU2lnbiBHMjAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMFgx
3865
+ CzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEtMCsGA1UEAxMkQ2VydGlm
3866
+ aWNhdGlvbiBBdXRob3JpdHkgb2YgV29TaWduIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
3867
+ CgKCAQEAvsXEoCKASU+/2YcRxlPhuw+9YH+v9oIOH9ywjj2X4FA8jzrvZjtFB5sg+OPXJYY1kBai
3868
+ XW8wGQiHC38Gsp1ij96vkqVg1CuAmlI/9ZqD6TRay9nVYlzmDuDfBpgOgHzKtB0TiGsOqCR3A9Du
3869
+ W/PKaZE1OVbFbeP3PU9ekzgkyhjpJMuSA93MHD0JcOQg5PGurLtzaaNjOg9FD6FKmsLRY6zLEPg9
3870
+ 5k4ot+vElbGs/V6r+kHLXZ1L3PR8du9nfwB6jdKgGlxNIuG12t12s9R23164i5jIFFTMaxeSt+BK
3871
+ v0mUYQs4kI9dJGwlezt52eJ+na2fmKEG/HgUYFf47oB3sQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC
3872
+ AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU+mCp62XF3RYUCE4MD42b4Pdkr2cwDQYJKoZI
3873
+ hvcNAQELBQADggEBAFfDejaCnI2Y4qtAqkePx6db7XznPWZaOzG73/MWM5H8fHulwqZm46qwtyeY
3874
+ P0nXYGdnPzZPSsvxFPpahygc7Y9BMsaV+X3avXtbwrAh449G3CE4Q3RM+zD4F3LBMvzIkRfEzFg3
3875
+ TgvMWvchNSiDbGAtROtSjFA9tWwS1/oJu2yySrHFieT801LYYRf+epSEj3m2M1m6D8QL4nCgS3gu
3876
+ +sif/a+RZQp4OBXllxcU3fngLDT4ONCEIgDAFFEYKwLcMFrw6AF8NTojrwjkr6qOKEJJLvD1mTS+
3877
+ 7Q9LGOHSJDy7XUe3IfKN0QqZjuNuPq1w4I+5ysxugTH2e5x6eeRncRg=
3878
+ -----END CERTIFICATE-----
3879
+
3880
+ CA WoSign ECC Root
3881
+ ==================
3882
+ -----BEGIN CERTIFICATE-----
3883
+ MIICCTCCAY+gAwIBAgIQaEpYcIBr8I8C+vbe6LCQkDAKBggqhkjOPQQDAzBGMQswCQYDVQQGEwJD
3884
+ TjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMTEkNBIFdvU2lnbiBFQ0MgUm9v
3885
+ dDAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQK
3886
+ ExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAxMSQ0EgV29TaWduIEVDQyBSb290MHYwEAYHKoZI
3887
+ zj0CAQYFK4EEACIDYgAE4f2OuEMkq5Z7hcK6C62N4DrjJLnSsb6IOsq/Srj57ywvr1FQPEd1bPiU
3888
+ t5v8KB7FVMxjnRZLU8HnIKvNrCXSf4/CwVqCXjCLelTOA7WRf6qU0NGKSMyCBSah1VES1ns2o0Iw
3889
+ QDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUqv3VWqP2h4syhf3R
3890
+ MluARZPzA7gwCgYIKoZIzj0EAwMDaAAwZQIxAOSkhLCB1T2wdKyUpOgOPQB0TKGXa/kNUTyh2Tv0
3891
+ Daupn75OcsqF1NnstTJFGG+rrQIwfcf3aWMvoeGY7xMQ0Xk/0f7qO3/eVvSQsRUR2LIiFdAvwyYu
3892
+ a/GRspBl9JrmkO5K
3893
+ -----END CERTIFICATE-----
3894
+
3895
+ ================================================================
3896
+ C: US
3897
+ O: GTE Corporation
3898
+ OU: GTE CyberTrust Solutions, Inc.
3899
+ CN: GTE CyberTrust Global Root
3900
+ --
3901
+ Not Before: 1998-08-13
3902
+ Not After: 2018-08-13
3903
+ Signature: md5WithRSAEncryption
3904
+ Key: RSA:1024
3905
+ -----BEGIN CERTIFICATE-----
3906
+ MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD
3907
+ VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv
3908
+ bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv
3909
+ b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV
3910
+ UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU
3911
+ cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds
3912
+ b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH
3913
+ iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS
3914
+ r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4
3915
+ 04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r
3916
+ GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9
3917
+ 3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P
3918
+ lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/
3919
+ -----END CERTIFICATE-----
app/api/Stripe/HttpClient/data/test.png ADDED
Binary file
app/api/Stripe/Invoice.php ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class Invoice
7
+ *
8
+ * @package Stripe
9
+ */
10
+ class Invoice extends ApiResource
11
+ {
12
+ /**
13
+ * @param array|null $params
14
+ * @param array|string|null $opts
15
+ *
16
+ * @return Invoice The created invoice.
17
+ */
18
+ public static function create($params = null, $opts = null)
19
+ {
20
+ return self::_create($params, $opts);
21
+ }
22
+
23
+ /**
24
+ * @param string $id The ID of the invoice to retrieve.
25
+ * @param array|string|null $opts
26
+ *
27
+ * @return Invoice
28
+ */
29
+ public static function retrieve($id, $opts = null)
30
+ {
31
+ return self::_retrieve($id, $opts);
32
+ }
33
+
34
+ /**
35
+ * @param array|null $params
36
+ * @param array|string|null $opts
37
+ *
38
+ * @return Collection of Invoices
39
+ */
40
+ public static function all($params = null, $opts = null)
41
+ {
42
+ return self::_all($params, $opts);
43
+ }
44
+
45
+ /**
46
+ * @param string $id The ID of the invoice to update.
47
+ * @param array|null $params
48
+ * @param array|string|null $options
49
+ *
50
+ * @return Invoice The updated invoice.
51
+ */
52
+ public static function update($id, $params = null, $options = null)
53
+ {
54
+ return self::_update($id, $params, $options);
55
+ }
56
+
57
+ /**
58
+ * @param array|null $params
59
+ * @param array|string|null $opts
60
+ *
61
+ * @return Invoice The upcoming invoice.
62
+ */
63
+ public static function upcoming($params = null, $opts = null)
64
+ {
65
+ $url = static::classUrl() . '/upcoming';
66
+ list($response, $opts) = static::_staticRequest('get', $url, $params, $opts);
67
+ $obj = Util\Util::convertToStripeObject($response->json, $opts);
68
+ $obj->setLastResponse($response);
69
+ return $obj;
70
+ }
71
+
72
+ /**
73
+ * @param array|string|null $opts
74
+ *
75
+ * @return Invoice The saved invoice.
76
+ */
77
+ public function save($opts = null)
78
+ {
79
+ return $this->_save($opts);
80
+ }
81
+
82
+ /**
83
+ * @return Invoice The paid invoice.
84
+ */
85
+ public function pay($opts = null)
86
+ {
87
+ $url = $this->instanceUrl() . '/pay';
88
+ list($response, $opts) = $this->_request('post', $url, null, $opts);
89
+ $this->refreshFrom($response, $opts);
90
+ return $this;
91
+ }
92
+ }
app/api/Stripe/InvoiceItem.php ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class InvoiceItem
7
+ *
8
+ * @package Stripe
9
+ */
10
+ class InvoiceItem extends ApiResource
11
+ {
12
+ /**
13
+ * @param string $id The ID of the invoice item to retrieve.
14
+ * @param array|string|null $opts
15
+ *
16
+ * @return InvoiceItem
17
+ */
18
+ public static function retrieve($id, $opts = null)
19
+ {
20
+ return self::_retrieve($id, $opts);
21
+ }
22
+
23
+ /**
24
+ * @param array|null $params
25
+ * @param array|string|null $opts
26
+ *
27
+ * @return Collection of InvoiceItems
28
+ */
29
+ public static function all($params = null, $opts = null)
30
+ {
31
+ return self::_all($params, $opts);
32
+ }
33
+
34
+ /**
35
+ * @param array|null $params
36
+ * @param array|string|null $opts
37
+ *
38
+ * @return InvoiceItem The created invoice item.
39
+ */
40
+ public static function create($params = null, $opts = null)
41
+ {
42
+ return self::_create($params, $opts);
43
+ }
44
+
45
+ /**
46
+ * @param string $id The ID of the invoice item to update.
47
+ * @param array|null $params
48
+ * @param array|string|null $options
49
+ *
50
+ * @return InvoiceItem The updated invoice item.
51
+ */
52
+ public static function update($id, $params = null, $options = null)
53
+ {
54
+ return self::_update($id, $params, $options);
55
+ }
56
+
57
+ /**
58
+ * @param array|string|null $opts
59
+ *
60
+ * @return InvoiceItem The saved invoice item.
61
+ */
62
+ public function save($opts = null)
63
+ {
64
+ return $this->_save($opts);
65
+ }
66
+
67
+ /**
68
+ * @param array|null $params
69
+ * @param array|string|null $opts
70
+ *
71
+ * @return InvoiceItem The deleted invoice item.
72
+ */
73
+ public function delete($params = null, $opts = null)
74
+ {
75
+ return $this->_delete($params, $opts);
76
+ }
77
+ }
app/api/Stripe/JsonSerializable.php ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ // JsonSerializable only exists in PHP 5.4+. Stub if out if it doesn't exist
6
+ if (interface_exists('\JsonSerializable', false)) {
7
+ interface JsonSerializable extends \JsonSerializable
8
+ {
9
+ }
10
+ } else {
11
+ // PSR2 wants each interface to have its own file.
12
+ // @codingStandardsIgnoreStart
13
+ interface JsonSerializable
14
+ {
15
+ // @codingStandardsIgnoreEnd
16
+ public function jsonSerialize();
17
+ }
18
+ }
app/api/Stripe/Order.php ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class Order
7
+ *
8
+ * @package Stripe
9
+ */
10
+ class Order extends ApiResource
11
+ {
12
+ /**
13
+ * @param string $id The ID of the Order to retrieve.
14
+ * @param array|string|null $opts
15
+ *
16
+ * @return Order
17
+ */
18
+ public static function retrieve($id, $opts = null)
19
+ {
20
+ return self::_retrieve($id, $opts);
21
+ }
22
+
23
+ /**
24
+ * @param array|null $params
25
+ * @param array|string|null $opts
26
+ *
27
+ * @return Order The created Order.
28
+ */
29
+ public static function create($params = null, $opts = null)
30
+ {
31
+ return self::_create($params, $opts);
32
+ }
33
+
34
+ /**
35
+ * @param string $id The ID of the order to update.
36
+ * @param array|null $params
37
+ * @param array|string|null $options
38
+ *
39
+ * @return Order The updated order.
40
+ */
41
+ public static function update($id, $params = null, $options = null)
42
+ {
43
+ return self::_update($id, $params, $options);
44
+ }
45
+
46
+ /**
47
+ * @param array|string|null $opts
48
+ *
49
+ * @return Order The saved Order.
50
+ */
51
+ public function save($opts = null)
52
+ {
53
+ return $this->_save($opts);
54
+ }
55
+
56
+ /**
57
+ * @param array|null $params
58
+ * @param array|string|null $opts
59
+ *
60
+ * @return Collection of Orders
61
+ */
62
+ public static function all($params = null, $opts = null)
63
+ {
64
+ return self::_all($params, $opts);
65
+ }
66
+
67
+ /**
68
+ * @return Order The paid order.
69
+ */
70
+ public function pay($params = null, $opts = null)
71
+ {
72
+ $url = $this->instanceUrl() . '/pay';
73
+ list($response, $opts) = $this->_request('post', $url, $params, $opts);
74
+ $this->refreshFrom($response, $opts);
75
+ return $this;
76
+ }
77
+
78
+ /**
79
+ * @return OrderReturn The newly created return.
80
+ */
81
+ public function returnOrder($params = null, $opts = null)
82
+ {
83
+ $url = $this->instanceUrl() . '/returns';
84
+ list($response, $opts) = $this->_request('post', $url, $params, $opts);
85
+ return Util\Util::convertToStripeObject($response, $opts);
86
+ }
87
+ }
app/api/Stripe/OrderReturn.php ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class OrderReturn
7
+ *
8
+ * @package Stripe
9
+ */
10
+ class OrderReturn extends ApiResource
11
+ {
12
+ /**
13
+ * @param string $id The ID of the OrderReturn to retrieve.
14
+ * @param array|string|null $opts
15
+ *
16
+ * @return Order
17
+ */
18
+ public static function retrieve($id, $opts = null)
19
+ {
20
+ return self::_retrieve($id, $opts);
21
+ }
22
+
23
+ /**
24
+ * @param array|null $params
25
+ * @param array|string|null $opts
26
+ *
27
+ * @return Collection of OrderReturns
28
+ */
29
+ public static function all($params = null, $opts = null)
30
+ {
31
+ return self::_all($params, $opts);
32
+ }
33
+ }
app/api/Stripe/Plan.php ADDED
@@ -0,0 +1,90 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class Plan
7
+ *
8
+ * @package Stripe
9
+ *
10
+ * @property $id
11
+ * @property $object
12
+ * @property $amount
13
+ * @property $created
14
+ * @property $currency
15
+ * @property $interval
16
+ * @property $interval_count
17
+ * @property $livemode
18
+ * @property AttachedObject $metadata
19
+ * @property $name
20
+ * @property $statement_descriptor
21
+ * @property $trial_period_days
22
+ */
23
+ class Plan extends ApiResource
24
+ {
25
+ /**
26
+ * @param string $id The ID of the plan to retrieve.
27
+ * @param array|string|null $opts
28
+ *
29
+ * @return Plan
30
+ */
31
+ public static function retrieve($id, $opts = null)
32
+ {
33
+ return self::_retrieve($id, $opts);
34
+ }
35
+
36
+ /**
37
+ * @param array|null $params
38
+ * @param array|string|null $opts
39
+ *
40
+ * @return Plan The created plan.
41
+ */
42
+ public static function create($params = null, $opts = null)
43
+ {
44
+ return self::_create($params, $opts);
45
+ }
46
+
47
+ /**
48
+ * @param string $id The ID of the plan to update.
49
+ * @param array|null $params
50
+ * @param array|string|null $options
51
+ *
52
+ * @return Plan The updated plan.
53
+ */
54
+ public static function update($id, $params = null, $options = null)
55
+ {
56
+ return self::_update($id, $params, $options);
57
+ }
58
+
59
+ /**
60
+ * @param array|null $params
61
+ * @param array|string|null $opts
62
+ *
63
+ * @return Plan The deleted plan.
64
+ */
65
+ public function delete($params = null, $opts = null)
66
+ {
67
+ return $this->_delete($params, $opts);
68
+ }
69
+
70
+ /**
71
+ * @param array|string|null $opts
72
+ *
73
+ * @return Plan The saved plan.
74
+ */
75
+ public function save($opts = null)
76
+ {
77
+ return $this->_save($opts);
78
+ }
79
+
80
+ /**
81
+ * @param array|null $params
82
+ * @param array|string|null $opts
83
+ *
84
+ * @return Collection of Plans
85
+ */
86
+ public static function all($params = null, $opts = null)
87
+ {
88
+ return self::_all($params, $opts);
89
+ }
90
+ }
app/api/Stripe/Product.php ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class Product
7
+ *
8
+ * @package Stripe
9
+ */
10
+ class Product extends ApiResource
11
+ {
12
+ /**
13
+ * @param string $id The ID of the Product to retrieve.
14
+ * @param array|string|null $opts
15
+ *
16
+ * @return Product
17
+ */
18
+ public static function retrieve($id, $opts = null)
19
+ {
20
+ return self::_retrieve($id, $opts);
21
+ }
22
+
23
+ /**
24
+ * @param array|null $params
25
+ * @param array|string|null $opts
26
+ *
27
+ * @return Product The created Product.
28
+ */
29
+ public static function create($params = null, $opts = null)
30
+ {
31
+ return self::_create($params, $opts);
32
+ }
33
+
34
+ /**
35
+ * @param string $id The ID of the product to update.
36
+ * @param array|null $params
37
+ * @param array|string|null $options
38
+ *
39
+ * @return Product The updated product.
40
+ */
41
+ public static function update($id, $params = null, $options = null)
42
+ {
43
+ return self::_update($id, $params, $options);
44
+ }
45
+
46
+ /**
47
+ * @param array|string|null $opts
48
+ *
49
+ * @return Product The saved Product.
50
+ */
51
+ public function save($opts = null)
52
+ {
53
+ return $this->_save($opts);
54
+ }
55
+
56
+ /**
57
+ * @param array|null $params
58
+ * @param array|string|null $opts
59
+ *
60
+ * @return Collection of Products
61
+ */
62
+ public static function all($params = null, $opts = null)
63
+ {
64
+ return self::_all($params, $opts);
65
+ }
66
+
67
+ /**
68
+ * @param array|null $params
69
+ * @param array|string|null $opts
70
+ *
71
+ * @return Product The deleted product.
72
+ */
73
+ public function delete($params = null, $opts = null)
74
+ {
75
+ return $this->_delete($params, $opts);
76
+ }
77
+ }
app/api/Stripe/Recipient.php ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class Recipient
7
+ *
8
+ * @package Stripe
9
+ */
10
+ class Recipient extends ApiResource
11
+ {
12
+ /**
13
+ * @param string $id The ID of the recipient to retrieve.
14
+ * @param array|string|null $opts
15
+ *
16
+ * @return Recipient
17
+ */
18
+ public static function retrieve($id, $opts = null)
19
+ {
20
+ return self::_retrieve($id, $opts);
21
+ }
22
+
23
+ /**
24
+ * @param array|null $params
25
+ * @param array|string|null $opts
26
+ *
27
+ * @return Collection of Recipients
28
+ */
29
+ public static function all($params = null, $opts = null)
30
+ {
31
+ return self::_all($params, $opts);
32
+ }
33
+
34
+ /**
35
+ * @param array|null $params
36
+ * @param array|string|null $opts
37
+ *
38
+ * @return Recipient The created recipient.
39
+ */
40
+ public static function create($params = null, $opts = null)
41
+ {
42
+ return self::_create($params, $opts);
43
+ }
44
+
45
+ /**
46
+ * @param string $id The ID of the recipient to update.
47
+ * @param array|null $params
48
+ * @param array|string|null $options
49
+ *
50
+ * @return Recipient The updated recipient.
51
+ */
52
+ public static function update($id, $params = null, $options = null)
53
+ {
54
+ return self::_update($id, $params, $options);
55
+ }
56
+
57
+ /**
58
+ * @param array|string|null $opts
59
+ *
60
+ * @return Recipient The saved recipient.
61
+ */
62
+ public function save($opts = null)
63
+ {
64
+ return $this->_save($opts);
65
+ }
66
+
67
+ /**
68
+ * @param array|null $params
69
+ *
70
+ * @return Recipient The deleted recipient.
71
+ */
72
+ public function delete($params = null, $opts = null)
73
+ {
74
+ return $this->_delete($params, $opts);
75
+ }
76
+
77
+
78
+ /**
79
+ * @param array|null $params
80
+ *
81
+ * @return Collection of the Recipient's Transfers
82
+ */
83
+ public function transfers($params = null)
84
+ {
85
+ if ($params === null) {
86
+ $params = array();
87
+ }
88
+ $params['recipient'] = $this->id;
89
+ $transfers = Transfer::all($params, $this->_opts);
90
+ return $transfers;
91
+ }
92
+ }
app/api/Stripe/Refund.php ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class Refund
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property int $amount
11
+ * @property mixed $balance_transaction
12
+ * @property string $charge
13
+ * @property int $created
14
+ * @property string $currency
15
+ * @property mixed $metadata
16
+ * @property mixed $reason
17
+ * @property mixed $receipt_number
18
+ * @property string $status
19
+ *
20
+ * @package Stripe
21
+ */
22
+ class Refund extends ApiResource
23
+ {
24
+
25
+ /**
26
+ * @param string $id The ID of the refund to retrieve.
27
+ * @param array|string|null $options
28
+ *
29
+ * @return Refund
30
+ */
31
+ public static function retrieve($id, $options = null)
32
+ {
33
+ return self::_retrieve($id, $options);
34
+ }
35
+
36
+ /**
37
+ * @param string $id The ID of the refund to update.
38
+ * @param array|null $params
39
+ * @param array|string|null $options
40
+ *
41
+ * @return Refund The updated refund.
42
+ */
43
+ public static function update($id, $params = null, $options = null)
44
+ {
45
+ return self::_update($id, $params, $options);
46
+ }
47
+
48
+ /**
49
+ * @param array|null $params
50
+ * @param array|string|null $options
51
+ *
52
+ * @return Collection of Refunds
53
+ */
54
+ public static function all($params = null, $options = null)
55
+ {
56
+ return self::_all($params, $options);
57
+ }
58
+
59
+ /**
60
+ * @param array|null $params
61
+ * @param array|string|null $options
62
+ *
63
+ * @return Refund The created refund.
64
+ */
65
+ public static function create($params = null, $options = null)
66
+ {
67
+ return self::_create($params, $options);
68
+ }
69
+
70
+ /**
71
+ * @param array|string|null $opts
72
+ *
73
+ * @return Refund The saved refund.
74
+ */
75
+ public function save($opts = null)
76
+ {
77
+ return $this->_save($opts);
78
+ }
79
+ }
app/api/Stripe/SKU.php ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class SKU
7
+ *
8
+ * @package Stripe
9
+ */
10
+ class SKU extends ApiResource
11
+ {
12
+ /**
13
+ * @param string $id The ID of the SKU to retrieve.
14
+ * @param array|string|null $opts
15
+ *
16
+ * @return SKU
17
+ */
18
+ public static function retrieve($id, $opts = null)
19
+ {
20
+ return self::_retrieve($id, $opts);
21
+ }
22
+
23
+ /**
24
+ * @param array|null $params
25
+ * @param array|string|null $opts
26
+ *
27
+ * @return SKU The created SKU.
28
+ */
29
+ public static function create($params = null, $opts = null)
30
+ {
31
+ return self::_create($params, $opts);
32
+ }
33
+
34
+ /**
35
+ * @param string $id The ID of the SKU to update.
36
+ * @param array|null $params
37
+ * @param array|string|null $options
38
+ *
39
+ * @return SKU The updated SKU.
40
+ */
41
+ public static function update($id, $params = null, $options = null)
42
+ {
43
+ return self::_update($id, $params, $options);
44
+ }
45
+
46
+ /**
47
+ * @param array|string|null $opts
48
+ *
49
+ * @return SKU The saved SKU.
50
+ */
51
+ public function save($opts = null)
52
+ {
53
+ return $this->_save($opts);
54
+ }
55
+
56
+ /**
57
+ * @param array|null $params
58
+ * @param array|string|null $opts
59
+ *
60
+ * @return Collection of SKUs
61
+ */
62
+ public static function all($params = null, $opts = null)
63
+ {
64
+ return self::_all($params, $opts);
65
+ }
66
+
67
+ /**
68
+ * @param array|null $params
69
+ * @param array|string|null $opts
70
+ *
71
+ * @return SKU The deleted sku.
72
+ */
73
+ public function delete($params = null, $opts = null)
74
+ {
75
+ return $this->_delete($params, $opts);
76
+ }
77
+ }
app/api/Stripe/SingletonApiResource.php ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class SingletonApiResource
7
+ *
8
+ * @package Stripe
9
+ */
10
+ abstract class SingletonApiResource extends ApiResource
11
+ {
12
+ protected static function _singletonRetrieve($options = null)
13
+ {
14
+ $opts = Util\RequestOptions::parse($options);
15
+ $instance = new static(null, $opts);
16
+ $instance->refresh();
17
+ return $instance;
18
+ }
19
+
20
+ /**
21
+ * @return string The endpoint associated with this singleton class.
22
+ */
23
+ public static function classUrl()
24
+ {
25
+ $base = static::className();
26
+ return "/v1/${base}";
27
+ }
28
+
29
+ /**
30
+ * @return string The endpoint associated with this singleton API resource.
31
+ */
32
+ public function instanceUrl()
33
+ {
34
+ return static::classUrl();
35
+ }
36
+ }
app/api/Stripe/Source.php ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class Source
7
+ *
8
+ * @package Stripe
9
+ */
10
+ class Source extends ApiResource
11
+ {
12
+ /**
13
+ * @param string $id The ID of the Source to retrieve.
14
+ * @param array|string|null $opts
15
+ *
16
+ * @return Source
17
+ */
18
+ public static function retrieve($id, $opts = null)
19
+ {
20
+ return self::_retrieve($id, $opts);
21
+ }
22
+
23
+ /**
24
+ * @param array|null $params
25
+ * @param array|string|null $opts
26
+ *
27
+ * @return Collection of Sources
28
+ */
29
+ public static function all($params = null, $opts = null)
30
+ {
31
+ return self::_all($params, $opts);
32
+ }
33
+
34
+ /**
35
+ * @param array|null $params
36
+ * @param array|string|null $opts
37
+ *
38
+ * @return Source The created Source.
39
+ */
40
+ public static function create($params = null, $opts = null)
41
+ {
42
+ return self::_create($params, $opts);
43
+ }
44
+
45
+ /**
46
+ * @param array|null $params
47
+ * @param array|string|null $options
48
+ *
49
+ * @return BankAccount The verified bank account.
50
+ */
51
+ public function verify($params = null, $options = null)
52
+ {
53
+ $url = $this->instanceUrl() . '/verify';
54
+ list($response, $opts) = $this->_request('post', $url, $params, $options);
55
+ $this->refreshFrom($response, $opts);
56
+ return $this;
57
+ }
58
+ }
app/api/Stripe/Stripe.php ADDED
@@ -0,0 +1,126 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class Stripe
7
+ *
8
+ * @package Stripe
9
+ */
10
+ class Stripe
11
+ {
12
+ // @var string The Stripe API key to be used for requests.
13
+ public static $apiKey;
14
+
15
+ // @var string The base URL for the Stripe API.
16
+ public static $apiBase = 'https://api.stripe.com';
17
+
18
+ // @var string The base URL for the Stripe API uploads endpoint.
19
+ public static $apiUploadBase = 'https://uploads.stripe.com';
20
+
21
+ // @var string|null The version of the Stripe API to use for requests.
22
+ public static $apiVersion = null;
23
+
24
+ // @var string|null The account ID for connected accounts requests.
25
+ public static $accountId = null;
26
+
27
+ // @var boolean Defaults to true.
28
+ public static $verifySslCerts = true;
29
+
30
+ // @var array The application's information (name, version, URL)
31
+ public static $appInfo = null;
32
+
33
+ const VERSION = '4.3.0';
34
+
35
+ /**
36
+ * @return string The API key used for requests.
37
+ */
38
+ public static function getApiKey()
39
+ {
40
+ return self::$apiKey;
41
+ }
42
+
43
+ /**
44
+ * Sets the API key to be used for requests.
45
+ *
46
+ * @param string $apiKey
47
+ */
48
+ public static function setApiKey($apiKey)
49
+ {
50
+ self::$apiKey = $apiKey;
51
+ }
52
+
53
+ /**
54
+ * @return string The API version used for requests. null if we're using the
55
+ * latest version.
56
+ */
57
+ public static function getApiVersion()
58
+ {
59
+ return self::$apiVersion;
60
+ }
61
+
62
+ /**
63
+ * @param string $apiVersion The API version to use for requests.
64
+ */
65
+ public static function setApiVersion($apiVersion)
66
+ {
67
+ self::$apiVersion = $apiVersion;
68
+ }
69
+
70
+ /**
71
+ * @return boolean
72
+ */
73
+ public static function getVerifySslCerts()
74
+ {
75
+ return self::$verifySslCerts;
76
+ }
77
+
78
+ /**
79
+ * @param boolean $verify
80
+ */
81
+ public static function setVerifySslCerts($verify)
82
+ {
83
+ self::$verifySslCerts = $verify;
84
+ }
85
+
86
+ /**
87
+ * @return string | null The Stripe account ID for connected account
88
+ * requests.
89
+ */
90
+ public static function getAccountId()
91
+ {
92
+ return self::$accountId;
93
+ }
94
+
95
+ /**
96
+ * @param string $accountId The Stripe account ID to set for connected
97
+ * account requests.
98
+ */
99
+ public static function setAccountId($accountId)
100
+ {
101
+ self::$accountId = $accountId;
102
+ }
103
+
104
+ /**
105
+ * @return array | null The application's information
106
+ */
107
+ public static function getAppInfo()
108
+ {
109
+ return self::$appInfo;
110
+ }
111
+
112
+ /**
113
+ * @param string $appName The application's name
114
+ * @param string $appVersion The application's version
115
+ * @param string $appUrl The application's URL
116
+ */
117
+ public static function setAppInfo($appName, $appVersion = null, $appUrl = null)
118
+ {
119
+ if (self::$appInfo === null) {
120
+ self::$appInfo = array();
121
+ }
122
+ self::$appInfo['name'] = $appName;
123
+ self::$appInfo['version'] = $appVersion;
124
+ self::$appInfo['url'] = $appUrl;
125
+ }
126
+ }
app/api/Stripe/StripeObject.php ADDED
@@ -0,0 +1,293 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ use ArrayAccess;
6
+ use InvalidArgumentException;
7
+
8
+ /**
9
+ * Class StripeObject
10
+ *
11
+ * @package Stripe
12
+ */
13
+ class StripeObject implements ArrayAccess, JsonSerializable
14
+ {
15
+ /**
16
+ * @var Util\Set Attributes that should not be sent to the API because
17
+ * they're not updatable (e.g. API key, ID).
18
+ */
19
+ public static $permanentAttributes;
20
+ /**
21
+ * @var Util\Set Attributes that are nested but still updatable from
22
+ * the parent class's URL (e.g. metadata).
23
+ */
24
+ public static $nestedUpdatableAttributes;
25
+
26
+ public static function init()
27
+ {
28
+ self::$permanentAttributes = new Util\Set(array('_opts', 'id'));
29
+ self::$nestedUpdatableAttributes = new Util\Set(array(
30
+ 'metadata', 'legal_entity', 'address', 'dob', 'transfer_schedule', 'verification',
31
+ 'tos_acceptance', 'personal_address',
32
+ // will make the array into an AttachedObject: weird, but works for now
33
+ 'additional_owners', 0, 1, 2, 3, 4, // Max 3, but leave the 4th so errors work properly
34
+ 'inventory'
35
+ ));
36
+ }
37
+
38
+ /**
39
+ * @return object The last response from the Stripe API
40
+ */
41
+ public function getLastResponse()
42
+ {
43
+ return $this->_lastResponse;
44
+ }
45
+
46
+ /**
47
+ * @param ApiResponse
48
+ *
49
+ * @return void Set the last response from the Stripe API
50
+ */
51
+ public function setLastResponse($resp)
52
+ {
53
+ $this->_lastResponse = $resp;
54
+ }
55
+
56
+ protected $_opts;
57
+ protected $_values;
58
+ protected $_unsavedValues;
59
+ protected $_transientValues;
60
+ protected $_retrieveOptions;
61
+ protected $_lastResponse;
62
+
63
+ public function __construct($id = null, $opts = null)
64
+ {
65
+ $this->_opts = $opts ? $opts : new Util\RequestOptions();
66
+ $this->_values = array();
67
+ $this->_unsavedValues = new Util\Set();
68
+ $this->_transientValues = new Util\Set();
69
+
70
+ $this->_retrieveOptions = array();
71
+ if (is_array($id)) {
72
+ foreach ($id as $key => $value) {
73
+ if ($key != 'id') {
74
+ $this->_retrieveOptions[$key] = $value;
75
+ }
76
+ }
77
+ $id = $id['id'];
78
+ }
79
+
80
+ if ($id !== null) {
81
+ $this->id = $id;
82
+ }
83
+ }
84
+
85
+ // Standard accessor magic methods
86
+ public function __set($k, $v)
87
+ {
88
+ if ($v === "") {
89
+ throw new InvalidArgumentException(
90
+ 'You cannot set \''.$k.'\'to an empty string. '
91
+ .'We interpret empty strings as NULL in requests. '
92
+ .'You may set obj->'.$k.' = NULL to delete the property'
93
+ );
94
+ }
95
+
96
+ if (self::$nestedUpdatableAttributes->includes($k)
97
+ && isset($this->$k) && $this->$k instanceof AttachedObject && is_array($v)) {
98
+ $this->$k->replaceWith($v);
99
+ } else {
100
+ // TODO: may want to clear from $_transientValues (Won't be user-visible).
101
+ $this->_values[$k] = $v;
102
+ }
103
+ if (!self::$permanentAttributes->includes($k)) {
104
+ $this->_unsavedValues->add($k);
105
+ }
106
+ }
107
+
108
+ public function __isset($k)
109
+ {
110
+ return isset($this->_values[$k]);
111
+ }
112
+ public function __unset($k)
113
+ {
114
+ unset($this->_values[$k]);
115
+ $this->_transientValues->add($k);
116
+ $this->_unsavedValues->discard($k);
117
+ }
118
+ public function &__get($k)
119
+ {
120
+ // function should return a reference, using $nullval to return a reference to null
121
+ $nullval = null;
122
+ if (!empty($this->_values) && array_key_exists($k, $this->_values)) {
123
+ return $this->_values[$k];
124
+ } else if (!empty($this->_transientValues) && $this->_transientValues->includes($k)) {
125
+ $class = get_class($this);
126
+ $attrs = join(', ', array_keys($this->_values));
127
+ $message = "Stripe Notice: Undefined property of $class instance: $k. "
128
+ . "HINT: The $k attribute was set in the past, however. "
129
+ . "It was then wiped when refreshing the object "
130
+ . "with the result returned by Stripe's API, "
131
+ . "probably as a result of a save(). The attributes currently "
132
+ . "available on this object are: $attrs";
133
+ error_log($message);
134
+ return $nullval;
135
+ } else {
136
+ $class = get_class($this);
137
+ error_log("Stripe Notice: Undefined property of $class instance: $k");
138
+ return $nullval;
139
+ }
140
+ }
141
+
142
+ // ArrayAccess methods
143
+ public function offsetSet($k, $v)
144
+ {
145
+ $this->$k = $v;
146
+ }
147
+
148
+ public function offsetExists($k)
149
+ {
150
+ return array_key_exists($k, $this->_values);
151
+ }
152
+
153
+ public function offsetUnset($k)
154
+ {
155
+ unset($this->$k);
156
+ }
157
+ public function offsetGet($k)
158
+ {
159
+ return array_key_exists($k, $this->_values) ? $this->_values[$k] : null;
160
+ }
161
+
162
+ public function keys()
163
+ {
164
+ return array_keys($this->_values);
165
+ }
166
+
167
+ /**
168
+ * This unfortunately needs to be public to be used in Util\Util
169
+ *
170
+ * @param array $values
171
+ * @param array $opts
172
+ *
173
+ * @return StripeObject The object constructed from the given values.
174
+ */
175
+ public static function constructFrom($values, $opts)
176
+ {
177
+ $obj = new static(isset($values['id']) ? $values['id'] : null);
178
+ $obj->refreshFrom($values, $opts);
179
+ return $obj;
180
+ }
181
+
182
+ /**
183
+ * Refreshes this object using the provided values.
184
+ *
185
+ * @param array $values
186
+ * @param array|Util\RequestOptions $opts
187
+ * @param boolean $partial Defaults to false.
188
+ */
189
+ public function refreshFrom($values, $opts, $partial = false)
190
+ {
191
+ if (is_array($opts)) {
192
+ $opts = Util\RequestOptions::parse($opts);
193
+ }
194
+
195
+ $this->_opts = $opts;
196
+
197
+ // Wipe old state before setting new. This is useful for e.g. updating a
198
+ // customer, where there is no persistent card parameter. Mark those values
199
+ // which don't persist as transient
200
+ if ($partial) {
201
+ $removed = new Util\Set();
202
+ } else {
203
+ $removed = array_diff(array_keys($this->_values), array_keys($values));
204
+ }
205
+
206
+ foreach ($removed as $k) {
207
+ if (self::$permanentAttributes->includes($k)) {
208
+ continue;
209
+ }
210
+
211
+ unset($this->$k);
212
+ }
213
+
214
+ foreach ($values as $k => $v) {
215
+ if (self::$permanentAttributes->includes($k) && isset($this[$k])) {
216
+ continue;
217
+ }
218
+
219
+ if (self::$nestedUpdatableAttributes->includes($k) && is_array($v)) {
220
+ $this->_values[$k] = AttachedObject::constructFrom($v, $opts);
221
+ } else {
222
+ $this->_values[$k] = Util\Util::convertToStripeObject($v, $opts);
223
+ }
224
+
225
+ $this->_transientValues->discard($k);
226
+ $this->_unsavedValues->discard($k);
227
+ }
228
+ }
229
+
230
+ /**
231
+ * @return array A recursive mapping of attributes to values for this object,
232
+ * including the proper value for deleted attributes.
233
+ */
234
+ public function serializeParameters()
235
+ {
236
+ $params = array();
237
+ if ($this->_unsavedValues) {
238
+ foreach ($this->_unsavedValues->toArray() as $k) {
239
+ $v = $this->$k;
240
+ if ($v === null) {
241
+ $v = '';
242
+ }
243
+
244
+ $params[$k] = $v;
245
+ }
246
+ }
247
+
248
+ // Get nested updates.
249
+ foreach (self::$nestedUpdatableAttributes->toArray() as $property) {
250
+ if (isset($this->$property)) {
251
+ if ($this->$property instanceof StripeObject) {
252
+ $serialized = $this->$property->serializeParameters();
253
+ if ($serialized) {
254
+ $params[$property] = $serialized;
255
+ }
256
+ }
257
+ }
258
+ }
259
+
260
+ return $params;
261
+ }
262
+
263
+ public function jsonSerialize()
264
+ {
265
+ return $this->__toArray(true);
266
+ }
267
+
268
+ public function __toJSON()
269
+ {
270
+ if (defined('JSON_PRETTY_PRINT')) {
271
+ return json_encode($this->__toArray(true), JSON_PRETTY_PRINT);
272
+ } else {
273
+ return json_encode($this->__toArray(true));
274
+ }
275
+ }
276
+
277
+ public function __toString()
278
+ {
279
+ $class = get_class($this);
280
+ return $class . ' JSON: ' . $this->__toJSON();
281
+ }
282
+
283
+ public function __toArray($recursive = false)
284
+ {
285
+ if ($recursive) {
286
+ return Util\Util::convertStripeObjectToArray($this->_values);
287
+ } else {
288
+ return $this->_values;
289
+ }
290
+ }
291
+ }
292
+
293
+ StripeObject::init();
app/api/Stripe/Subscription.php ADDED
@@ -0,0 +1,97 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class Subscription
7
+ *
8
+ * @package Stripe
9
+ */
10
+ class Subscription extends ApiResource
11
+ {
12
+ /**
13
+ * These constants are possible representations of the status field.
14
+ *
15
+ * @link https://stripe.com/docs/api#subscription_object-status
16
+ */
17
+ const STATUS_ACTIVE = 'active';
18
+ const STATUS_CANCELED = 'canceled';
19
+ const STATUS_PAST_DUE = 'past_due';
20
+ const STATUS_TRIALING = 'trialing';
21
+ const STATUS_UNPAID = 'unpaid';
22
+
23
+ /**
24
+ * @param string $id The ID of the subscription to retrieve.
25
+ * @param array|string|null $opts
26
+ *
27
+ * @return Subscription
28
+ */
29
+ public static function retrieve($id, $opts = null)
30
+ {
31
+ return self::_retrieve($id, $opts);
32
+ }
33
+
34
+ /**
35
+ * @param array|null $params
36
+ * @param array|string|null $opts
37
+ *
38
+ * @return Collection of Subscriptions
39
+ */
40
+ public static function all($params = null, $opts = null)
41
+ {
42
+ return self::_all($params, $opts);
43
+ }
44
+
45
+ /**
46
+ * @param array|null $params
47
+ * @param array|string|null $opts
48
+ *
49
+ * @return Subscription The created subscription.
50
+ */
51
+ public static function create($params = null, $opts = null)
52
+ {
53
+ return self::_create($params, $opts);
54
+ }
55
+
56
+ /**
57
+ * @param string $id The ID of the subscription to retrieve.
58
+ * @param array|null $params
59
+ * @param array|string|null $options
60
+ *
61
+ * @return Subscription The updated subscription.
62
+ */
63
+ public static function update($id, $params = null, $options = null)
64
+ {
65
+ return self::_update($id, $params, $options);
66
+ }
67
+
68
+ /**
69
+ * @param array|null $params
70
+ *
71
+ * @return Subscription The deleted subscription.
72
+ */
73
+ public function cancel($params = null, $opts = null)
74
+ {
75
+ return $this->_delete($params, $opts);
76
+ }
77
+
78
+ /**
79
+ * @param array|string|null $opts
80
+ *
81
+ * @return Subscription The saved subscription.
82
+ */
83
+ public function save($opts = null)
84
+ {
85
+ return $this->_save($opts);
86
+ }
87
+
88
+ /**
89
+ * @return Subscription The updated subscription.
90
+ */
91
+ public function deleteDiscount()
92
+ {
93
+ $url = $this->instanceUrl() . '/discount';
94
+ list($response, $opts) = $this->_request('delete', $url);
95
+ $this->refreshFrom(array('discount' => null), $opts, true);
96
+ }
97
+ }
app/api/Stripe/SubscriptionItem.php ADDED
@@ -0,0 +1,88 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class SubscriptionItem
7
+ *
8
+ * @package Stripe
9
+ */
10
+ class SubscriptionItem extends ApiResource
11
+ {
12
+ /**
13
+ * This is a special case because the subscription items endpoint has an
14
+ * underscore in it. The parent `className` function strips underscores.
15
+ *
16
+ * @return string The name of the class.
17
+ */
18
+ public static function className()
19
+ {
20
+ return 'subscription_item';
21
+ }
22
+
23
+ /**
24
+ * @param string $id The ID of the subscription item to retrieve.
25
+ * @param array|string|null $opts
26
+ *
27
+ * @return SubscriptionItem
28
+ */
29
+ public static function retrieve($id, $opts = null)
30
+ {
31
+ return self::_retrieve($id, $opts);
32
+ }
33
+
34
+ /**
35
+ * @param array|null $params
36
+ * @param array|string|null $opts
37
+ *
38
+ * @return Collection of SubscriptionItems
39
+ */
40
+ public static function all($params = null, $opts = null)
41
+ {
42
+ return self::_all($params, $opts);
43
+ }
44
+
45
+ /**
46
+ * @param array|null $params
47
+ * @param array|string|null $opts
48
+ *
49
+ * @return SubscriptionItem The created subscription item.
50
+ */
51
+ public static function create($params = null, $opts = null)
52
+ {
53
+ return self::_create($params, $opts);
54
+ }
55
+
56
+ /**
57
+ * @param string $id The ID of the subscription item to update.
58
+ * @param array|null $params
59
+ * @param array|string|null $options
60
+ *
61
+ * @return SubscriptionItem The updated subscription item.
62
+ */
63
+ public static function update($id, $params = null, $options = null)
64
+ {
65
+ return self::_update($id, $params, $options);
66
+ }
67
+
68
+ /**
69
+ * @param array|string|null $opts
70
+ *
71
+ * @return SubscriptionItem The saved subscription item.
72
+ */
73
+ public function save($opts = null)
74
+ {
75
+ return $this->_save($opts);
76
+ }
77
+
78
+ /**
79
+ * @param array|null $params
80
+ * @param array|string|null $opts
81
+ *
82
+ * @return SubscriptionItem The deleted subscription item.
83
+ */
84
+ public function delete($params = null, $opts = null)
85
+ {
86
+ return $this->_delete($params, $opts);
87
+ }
88
+ }
app/api/Stripe/ThreeDSecure.php ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ class ThreeDSecure extends ApiResource
6
+ {
7
+ /**
8
+ * @return string The endpoint URL for the given class.
9
+ */
10
+ public static function classUrl()
11
+ {
12
+ return "/v1/3d_secure";
13
+ }
14
+
15
+ /**
16
+ * @param string $id The ID of the 3DS auth to retrieve.
17
+ * @param array|string|null $options
18
+ *
19
+ * @return ThreeDSecure
20
+ */
21
+ public static function retrieve($id, $options = null)
22
+ {
23
+ return self::_retrieve($id, $options);
24
+ }
25
+
26
+ /**
27
+ * @param array|null $params
28
+ * @param array|string|null $opts
29
+ *
30
+ * @return ThreeDSecure The created 3D Secure object.
31
+ */
32
+ public static function create($params = null, $opts = null)
33
+ {
34
+ return self::_create($params, $opts);
35
+ }
36
+ }
app/api/Stripe/Token.php ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class Token
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property mixed $bank_account
11
+ * @property mixed $card
12
+ * @property mixed $client_ip
13
+ * @property int $created
14
+ * @property bool $livemode
15
+ * @property string $type
16
+ * @property bool $used
17
+ *
18
+ * @package Stripe
19
+ */
20
+ class Token extends ApiResource
21
+ {
22
+ /**
23
+ * @param string $id The ID of the token to retrieve.
24
+ * @param array|string|null $opts
25
+ *
26
+ * @return Token
27
+ */
28
+ public static function retrieve($id, $opts = null)
29
+ {
30
+ return self::_retrieve($id, $opts);
31
+ }
32
+
33
+ /**
34
+ * @param array|null $params
35
+ * @param array|string|null $opts
36
+ *
37
+ * @return Token The created token.
38
+ */
39
+ public static function create($params = null, $opts = null)
40
+ {
41
+ return self::_create($params, $opts);
42
+ }
43
+ }
app/api/Stripe/Transfer.php ADDED
@@ -0,0 +1,115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class Transfer
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property int $amount
11
+ * @property int $amount_reversed
12
+ * @property mixed $application_fee
13
+ * @property string $balance_transaction
14
+ * @property int $created
15
+ * @property string $currency
16
+ * @property int $date
17
+ * @property mixed $description
18
+ * @property mixed $destination
19
+ * @property mixed $destination_payment
20
+ * @property mixed $failure_code
21
+ * @property mixed $failure_message
22
+ * @property mixed $fraud_details
23
+ * @property mixed $invoice
24
+ * @property bool $livemode
25
+ * @property mixed $metadata
26
+ * @property mixed $recipient
27
+ * @property mixed $reversals
28
+ * @property bool $reversed
29
+ * @property mixed $source_transaction
30
+ * @property string $source_type
31
+ * @property mixed $statement_descriptor
32
+ * @property string $status
33
+ * @property string $type
34
+ *
35
+ * @package Stripe
36
+ */
37
+ class Transfer extends ApiResource
38
+ {
39
+ /**
40
+ * @param string $id The ID of the transfer to retrieve.
41
+ * @param array|string|null $opts
42
+ *
43
+ * @return Transfer
44
+ */
45
+ public static function retrieve($id, $opts = null)
46
+ {
47
+ return self::_retrieve($id, $opts);
48
+ }
49
+
50
+ /**
51
+ * @param array|null $params
52
+ * @param array|string|null $opts
53
+ *
54
+ * @return Collection of Transfers
55
+ */
56
+ public static function all($params = null, $opts = null)
57
+ {
58
+ return self::_all($params, $opts);
59
+ }
60
+
61
+ /**
62
+ * @param array|null $params
63
+ * @param array|string|null $opts
64
+ *
65
+ * @return Transfer The created transfer.
66
+ */
67
+ public static function create($params = null, $opts = null)
68
+ {
69
+ return self::_create($params, $opts);
70
+ }
71
+
72
+ /**
73
+ * @param string $id The ID of the transfer to update.
74
+ * @param array|null $params
75
+ * @param array|string|null $options
76
+ *
77
+ * @return Transfer The updated transfer.
78
+ */
79
+ public static function update($id, $params = null, $options = null)
80
+ {
81
+ return self::_update($id, $params, $options);
82
+ }
83
+
84
+ /**
85
+ * @return TransferReversal The created transfer reversal.
86
+ */
87
+ public function reverse($params = null, $opts = null)
88
+ {
89
+ $url = $this->instanceUrl() . '/reversals';
90
+ list($response, $opts) = $this->_request('post', $url, $params, $opts);
91
+ $this->refreshFrom($response, $opts);
92
+ return $this;
93
+ }
94
+
95
+ /**
96
+ * @return Transfer The canceled transfer.
97
+ */
98
+ public function cancel()
99
+ {
100
+ $url = $this->instanceUrl() . '/cancel';
101
+ list($response, $opts) = $this->_request('post', $url);
102
+ $this->refreshFrom($response, $opts);
103
+ return $this;
104
+ }
105
+
106
+ /**
107
+ * @param array|string|null $opts
108
+ *
109
+ * @return Transfer The saved transfer.
110
+ */
111
+ public function save($opts = null)
112
+ {
113
+ return $this->_save($opts);
114
+ }
115
+ }
app/api/Stripe/TransferReversal.php ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe;
4
+
5
+ /**
6
+ * Class TransferReversal
7
+ *
8
+ * @property string $id
9
+ * @property string $object
10
+ * @property int $amount
11
+ * @property string $balance_transaction
12
+ * @property int $created
13
+ * @property string $currency
14
+ * @property mixed $metadata
15
+ * @property string $transfer
16
+ *
17
+ * @package Stripe
18
+ */
19
+ class TransferReversal extends ApiResource
20
+ {
21
+ /**
22
+ * @return string The API URL for this Stripe transfer reversal.
23
+ */
24
+ public function instanceUrl()
25
+ {
26
+ $id = $this['id'];
27
+ $transfer = $this['transfer'];
28
+ if (!$id) {
29
+ throw new Error\InvalidRequest(
30
+ "Could not determine which URL to request: " .
31
+ "class instance has invalid ID: $id",
32
+ null
33
+ );
34
+ }
35
+ $id = Util\Util::utf8($id);
36
+ $transfer = Util\Util::utf8($transfer);
37
+
38
+ $base = Transfer::classUrl();
39
+ $transferExtn = urlencode($transfer);
40
+ $extn = urlencode($id);
41
+ return "$base/$transferExtn/reversals/$extn";
42
+ }
43
+
44
+ /**
45
+ * @param array|string|null $opts
46
+ *
47
+ * @return TransferReversal The saved reversal.
48
+ */
49
+ public function save($opts = null)
50
+ {
51
+ return $this->_save($opts);
52
+ }
53
+ }
app/api/Stripe/Util/AutoPagingIterator.php ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\Util;
4
+
5
+ class AutoPagingIterator implements \Iterator
6
+ {
7
+ private $lastId = null;
8
+ private $page = null;
9
+ private $pageOffset = 0;
10
+ private $params = array();
11
+
12
+ public function __construct($collection, $params)
13
+ {
14
+ $this->page = $collection;
15
+ $this->params = $params;
16
+ }
17
+
18
+ public function rewind()
19
+ {
20
+ // Actually rewinding would require making a copy of the original page.
21
+ }
22
+
23
+ public function current()
24
+ {
25
+ $item = current($this->page->data);
26
+ $this->lastId = $item !== false ? $item['id'] : null;
27
+
28
+ return $item;
29
+ }
30
+
31
+ public function key()
32
+ {
33
+ return key($this->page->data) + $this->pageOffset;
34
+ }
35
+
36
+ public function next()
37
+ {
38
+ $item = next($this->page->data);
39
+ if ($item === false) {
40
+ // If we've run out of data on the current page, try to fetch another one
41
+ // and increase the offset the new page would start at
42
+ $this->pageOffset += count($this->page->data);
43
+ if ($this->page['has_more']) {
44
+ $this->params = array_merge(
45
+ $this->params ? $this->params : array(),
46
+ array('starting_after' => $this->lastId)
47
+ );
48
+ $this->page = $this->page->all($this->params);
49
+ } else {
50
+ return false;
51
+ }
52
+ }
53
+ }
54
+
55
+ public function valid()
56
+ {
57
+ $key = key($this->page->data);
58
+ $valid = ($key !== null && $key !== false);
59
+ return $valid;
60
+ }
61
+ }
app/api/Stripe/Util/RequestOptions.php ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\Util;
4
+
5
+ use Stripe\Error;
6
+
7
+ class RequestOptions
8
+ {
9
+ public $headers;
10
+ public $apiKey;
11
+
12
+ public function __construct($key = null, $headers = array())
13
+ {
14
+ $this->apiKey = $key;
15
+ $this->headers = $headers;
16
+ }
17
+
18
+ /**
19
+ * Unpacks an options array and merges it into the existing RequestOptions
20
+ * object.
21
+ * @param array|string|null $options a key => value array
22
+ *
23
+ * @return RequestOptions
24
+ */
25
+ public function merge($options)
26
+ {
27
+ $other_options = self::parse($options);
28
+ if ($other_options->apiKey === null) {
29
+ $other_options->apiKey = $this->apiKey;
30
+ }
31
+ $other_options->headers = array_merge($this->headers, $other_options->headers);
32
+ return $other_options;
33
+ }
34
+
35
+ /**
36
+ * Unpacks an options array into an RequestOptions object
37
+ * @param array|string|null $options a key => value array
38
+ *
39
+ * @return RequestOptions
40
+ */
41
+ public static function parse($options)
42
+ {
43
+ if ($options instanceof self) {
44
+ return $options;
45
+ }
46
+
47
+ if (is_null($options)) {
48
+ return new RequestOptions(null, array());
49
+ }
50
+
51
+ if (is_string($options)) {
52
+ return new RequestOptions($options, array());
53
+ }
54
+
55
+ if (is_array($options)) {
56
+ $headers = array();
57
+ $key = null;
58
+ if (array_key_exists('api_key', $options)) {
59
+ $key = $options['api_key'];
60
+ }
61
+ if (array_key_exists('idempotency_key', $options)) {
62
+ $headers['Idempotency-Key'] = $options['idempotency_key'];
63
+ }
64
+ if (array_key_exists('stripe_account', $options)) {
65
+ $headers['Stripe-Account'] = $options['stripe_account'];
66
+ }
67
+ if (array_key_exists('stripe_version', $options)) {
68
+ $headers['Stripe-Version'] = $options['stripe_version'];
69
+ }
70
+ return new RequestOptions($key, $headers);
71
+ }
72
+
73
+ $message = 'The second argument to Stripe API method calls is an '
74
+ . 'optional per-request apiKey, which must be a string, or '
75
+ . 'per-request options, which must be an array. (HINT: you can set '
76
+ . 'a global apiKey by "Stripe::setApiKey(<apiKey>)")';
77
+ throw new Error\Api($message);
78
+ }
79
+ }
app/api/Stripe/Util/Set.php ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\Util;
4
+
5
+ use IteratorAggregate;
6
+ use ArrayIterator;
7
+
8
+ class Set implements IteratorAggregate
9
+ {
10
+ private $_elts;
11
+
12
+ public function __construct($members = array())
13
+ {
14
+ $this->_elts = array();
15
+ foreach ($members as $item) {
16
+ $this->_elts[$item] = true;
17
+ }
18
+ }
19
+
20
+ public function includes($elt)
21
+ {
22
+ return isset($this->_elts[$elt]);
23
+ }
24
+
25
+ public function add($elt)
26
+ {
27
+ $this->_elts[$elt] = true;
28
+ }
29
+
30
+ public function discard($elt)
31
+ {
32
+ unset($this->_elts[$elt]);
33
+ }
34
+
35
+ public function toArray()
36
+ {
37
+ return array_keys($this->_elts);
38
+ }
39
+
40
+ public function getIterator()
41
+ {
42
+ return new ArrayIterator($this->toArray());
43
+ }
44
+ }
app/api/Stripe/Util/Util.php ADDED
@@ -0,0 +1,144 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Stripe\Util;
4
+
5
+ use Stripe\StripeObject;
6
+
7
+ abstract class Util
8
+ {
9
+ private static $isMbstringAvailable = null;
10
+
11
+ /**
12
+ * Whether the provided array (or other) is a list rather than a dictionary.
13
+ *
14
+ * @param array|mixed $array
15
+ * @return boolean True if the given object is a list.
16
+ */
17
+ public static function isList($array)
18
+ {
19
+ if (!is_array($array)) {
20
+ return false;
21
+ }
22
+
23
+ // TODO: generally incorrect, but it's correct given Stripe's response
24
+ foreach (array_keys($array) as $k) {
25
+ if (!is_numeric($k)) {
26
+ return false;
27
+ }
28
+ }
29
+ return true;
30
+ }
31
+
32
+ /**
33
+ * Recursively converts the PHP Stripe object to an array.
34
+ *
35
+ * @param array $values The PHP Stripe object to convert.
36
+ * @return array
37
+ */
38
+ public static function convertStripeObjectToArray($values)
39
+ {
40
+ $results = array();
41
+ foreach ($values as $k => $v) {
42
+ // FIXME: this is an encapsulation violation
43
+ if ($k[0] == '_') {
44
+ continue;
45
+ }
46
+ if ($v instanceof StripeObject) {
47
+ $results[$k] = $v->__toArray(true);
48
+ } elseif (is_array($v)) {
49
+ $results[$k] = self::convertStripeObjectToArray($v);
50
+ } else {
51
+ $results[$k] = $v;
52
+ }
53
+ }
54
+ return $results;
55
+ }
56
+
57
+ /**
58
+ * Converts a response from the Stripe API to the corresponding PHP object.
59
+ *
60
+ * @param array $resp The response from the Stripe API.
61
+ * @param array $opts
62
+ * @return StripeObject|array
63
+ */
64
+ public static function convertToStripeObject($resp, $opts)
65
+ {
66
+ $types = array(
67
+ 'account' => 'Stripe\\Account',
68
+ 'alipay_account' => 'Stripe\\AlipayAccount',
69
+ 'apple_pay_domain' => 'Stripe\\ApplePayDomain',
70
+ 'bank_account' => 'Stripe\\BankAccount',
71
+ 'balance_transaction' => 'Stripe\\BalanceTransaction',
72
+ 'card' => 'Stripe\\Card',
73
+ 'charge' => 'Stripe\\Charge',
74
+ 'country_spec' => 'Stripe\\CountrySpec',
75
+ 'coupon' => 'Stripe\\Coupon',
76
+ 'customer' => 'Stripe\\Customer',
77
+ 'dispute' => 'Stripe\\Dispute',
78
+ 'list' => 'Stripe\\Collection',
79
+ 'invoice' => 'Stripe\\Invoice',
80
+ 'invoiceitem' => 'Stripe\\InvoiceItem',
81
+ 'event' => 'Stripe\\Event',
82
+ 'file' => 'Stripe\\FileUpload',
83
+ 'token' => 'Stripe\\Token',
84
+ 'transfer' => 'Stripe\\Transfer',
85
+ 'transfer_reversal' => 'Stripe\\TransferReversal',
86
+ 'order' => 'Stripe\\Order',
87
+ 'order_return' => 'Stripe\\OrderReturn',
88
+ 'plan' => 'Stripe\\Plan',
89
+ 'product' => 'Stripe\\Product',
90
+ 'recipient' => 'Stripe\\Recipient',
91
+ 'refund' => 'Stripe\\Refund',
92
+ 'sku' => 'Stripe\\SKU',
93
+ 'source' => 'Stripe\\Source',
94
+ 'subscription' => 'Stripe\\Subscription',
95
+ 'subscription_item' => 'Stripe\\SubscriptionItem',
96
+ 'three_d_secure' => 'Stripe\\ThreeDSecure',
97
+ 'fee_refund' => 'Stripe\\ApplicationFeeRefund',
98
+ 'bitcoin_receiver' => 'Stripe\\BitcoinReceiver',
99
+ 'bitcoin_transaction' => 'Stripe\\BitcoinTransaction',
100
+ );
101
+ if (self::isList($resp)) {
102
+ $mapped = array();
103
+ foreach ($resp as $i) {
104
+ array_push($mapped, self::convertToStripeObject($i, $opts));
105
+ }
106
+ return $mapped;
107
+ } elseif (is_array($resp)) {
108
+ if (isset($resp['object']) && is_string($resp['object']) && isset($types[$resp['object']])) {
109
+ $class = $types[$resp['object']];
110
+ } else {
111
+ $class = 'Stripe\\StripeObject';
112
+ }
113
+ return $class::constructFrom($resp, $opts);
114
+ } else {
115
+ return $resp;
116
+ }
117
+ }
118
+
119
+ /**
120
+ * @param string|mixed $value A string to UTF8-encode.
121
+ *
122
+ * @return string|mixed The UTF8-encoded string, or the object passed in if
123
+ * it wasn't a string.
124
+ */
125
+ public static function utf8($value)
126
+ {
127
+ if (self::$isMbstringAvailable === null) {
128
+ self::$isMbstringAvailable = function_exists('mb_detect_encoding');
129
+
130
+ if (!self::$isMbstringAvailable) {
131
+ trigger_error("It looks like the mbstring extension is not enabled. " .
132
+ "UTF-8 strings will not properly be encoded. Ask your system " .
133
+ "administrator to enable the mbstring extension, or write to " .
134
+ "support@stripe.com if you have any questions.", E_USER_WARNING);
135
+ }
136
+ }
137
+
138
+ if (is_string($value) && self::$isMbstringAvailable && mb_detect_encoding($value, "UTF-8", true) != "UTF-8") {
139
+ return utf8_encode($value);
140
+ } else {
141
+ return $value;
142
+ }
143
+ }
144
+ }
app/api/Stripe/autoload.php ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Stripe;
3
+
4
+ function mec_stripe_api_php_client_autoload($className)
5
+ {
6
+ $classPath = explode('\\', $className);
7
+ if($classPath[0] != 'Stripe')
8
+ {
9
+ return;
10
+ }
11
+
12
+ // Drop first Stripe
13
+ $classPath = array_slice($classPath, 1);
14
+ $filePath = dirname(__FILE__) . DS . implode(DS, $classPath) . '.php';
15
+
16
+ if(file_exists($filePath))
17
+ {
18
+ require_once $filePath;
19
+ }
20
+ }
21
+
22
+ spl_autoload_register(__NAMESPACE__.'\mec_stripe_api_php_client_autoload');
app/api/TFPDF/font/courier.php ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $type = 'Core';
3
+ $name = 'Courier';
4
+ $up = -100;
5
+ $ut = 50;
6
+ for($i=0;$i<=255;$i++)
7
+ $cw[chr($i)] = 600;
8
+ ?>
app/api/TFPDF/font/courierb.php ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $type = 'Core';
3
+ $name = 'Courier-Bold';
4
+ $up = -100;
5
+ $ut = 50;
6
+ for($i=0;$i<=255;$i++)
7
+ $cw[chr($i)] = 600;
8
+ ?>
app/api/TFPDF/font/courierbi.php ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $type = 'Core';
3
+ $name = 'Courier-BoldOblique';
4
+ $up = -100;
5
+ $ut = 50;
6
+ for($i=0;$i<=255;$i++)
7
+ $cw[chr($i)] = 600;
8
+ ?>
app/api/TFPDF/font/courieri.php ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $type = 'Core';
3
+ $name = 'Courier-Oblique';
4
+ $up = -100;
5
+ $ut = 50;
6
+ for($i=0;$i<=255;$i++)
7
+ $cw[chr($i)] = 600;
8
+ ?>
app/api/TFPDF/font/helvetica.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $type = 'Core';
3
+ $name = 'Helvetica';
4
+ $up = -100;
5
+ $ut = 50;
6
+ $cw = array(
7
+ chr(0)=>278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278,
8
+ chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>278,'"'=>355,'#'=>556,'$'=>556,'%'=>889,'&'=>667,'\''=>191,'('=>333,')'=>333,'*'=>389,'+'=>584,
9
+ ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>278,';'=>278,'<'=>584,'='=>584,'>'=>584,'?'=>556,'@'=>1015,'A'=>667,
10
+ 'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>500,'K'=>667,'L'=>556,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944,
11
+ 'X'=>667,'Y'=>667,'Z'=>611,'['=>278,'\\'=>278,']'=>278,'^'=>469,'_'=>556,'`'=>333,'a'=>556,'b'=>556,'c'=>500,'d'=>556,'e'=>556,'f'=>278,'g'=>556,'h'=>556,'i'=>222,'j'=>222,'k'=>500,'l'=>222,'m'=>833,
12
+ 'n'=>556,'o'=>556,'p'=>556,'q'=>556,'r'=>333,'s'=>500,'t'=>278,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>500,'{'=>334,'|'=>260,'}'=>334,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>222,chr(131)=>556,
13
+ chr(132)=>333,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>222,chr(146)=>222,chr(147)=>333,chr(148)=>333,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000,
14
+ chr(154)=>500,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>260,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333,
15
+ chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>556,chr(182)=>537,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667,
16
+ chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722,
17
+ chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>500,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>556,chr(241)=>556,
18
+ chr(242)=>556,chr(243)=>556,chr(244)=>556,chr(245)=>556,chr(246)=>556,chr(247)=>584,chr(248)=>611,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500);
19
+ ?>
app/api/TFPDF/font/helveticab.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $type = 'Core';
3
+ $name = 'Helvetica-Bold';
4
+ $up = -100;
5
+ $ut = 50;
6
+ $cw = array(
7
+ chr(0)=>278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278,
8
+ chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>333,'"'=>474,'#'=>556,'$'=>556,'%'=>889,'&'=>722,'\''=>238,'('=>333,')'=>333,'*'=>389,'+'=>584,
9
+ ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>333,';'=>333,'<'=>584,'='=>584,'>'=>584,'?'=>611,'@'=>975,'A'=>722,
10
+ 'B'=>722,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>556,'K'=>722,'L'=>611,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944,
11
+ 'X'=>667,'Y'=>667,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>584,'_'=>556,'`'=>333,'a'=>556,'b'=>611,'c'=>556,'d'=>611,'e'=>556,'f'=>333,'g'=>611,'h'=>611,'i'=>278,'j'=>278,'k'=>556,'l'=>278,'m'=>889,
12
+ 'n'=>611,'o'=>611,'p'=>611,'q'=>611,'r'=>389,'s'=>556,'t'=>333,'u'=>611,'v'=>556,'w'=>778,'x'=>556,'y'=>556,'z'=>500,'{'=>389,'|'=>280,'}'=>389,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>278,chr(131)=>556,
13
+ chr(132)=>500,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>278,chr(146)=>278,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000,
14
+ chr(154)=>556,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>280,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333,
15
+ chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>611,chr(182)=>556,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722,
16
+ chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722,
17
+ chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>556,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>611,chr(241)=>611,
18
+ chr(242)=>611,chr(243)=>611,chr(244)=>611,chr(245)=>611,chr(246)=>611,chr(247)=>584,chr(248)=>611,chr(249)=>611,chr(250)=>611,chr(251)=>611,chr(252)=>611,chr(253)=>556,chr(254)=>611,chr(255)=>556);
19
+ ?>
app/api/TFPDF/font/helveticabi.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $type = 'Core';
3
+ $name = 'Helvetica-BoldOblique';
4
+ $up = -100;
5
+ $ut = 50;
6
+ $cw = array(
7
+ chr(0)=>278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278,
8
+ chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>333,'"'=>474,'#'=>556,'$'=>556,'%'=>889,'&'=>722,'\''=>238,'('=>333,')'=>333,'*'=>389,'+'=>584,
9
+ ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>333,';'=>333,'<'=>584,'='=>584,'>'=>584,'?'=>611,'@'=>975,'A'=>722,
10
+ 'B'=>722,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>556,'K'=>722,'L'=>611,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944,
11
+ 'X'=>667,'Y'=>667,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>584,'_'=>556,'`'=>333,'a'=>556,'b'=>611,'c'=>556,'d'=>611,'e'=>556,'f'=>333,'g'=>611,'h'=>611,'i'=>278,'j'=>278,'k'=>556,'l'=>278,'m'=>889,
12
+ 'n'=>611,'o'=>611,'p'=>611,'q'=>611,'r'=>389,'s'=>556,'t'=>333,'u'=>611,'v'=>556,'w'=>778,'x'=>556,'y'=>556,'z'=>500,'{'=>389,'|'=>280,'}'=>389,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>278,chr(131)=>556,
13
+ chr(132)=>500,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>278,chr(146)=>278,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000,
14
+ chr(154)=>556,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>280,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333,
15
+ chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>611,chr(182)=>556,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722,
16
+ chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722,
17
+ chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>556,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>611,chr(241)=>611,
18
+ chr(242)=>611,chr(243)=>611,chr(244)=>611,chr(245)=>611,chr(246)=>611,chr(247)=>584,chr(248)=>611,chr(249)=>611,chr(250)=>611,chr(251)=>611,chr(252)=>611,chr(253)=>556,chr(254)=>611,chr(255)=>556);
19
+ ?>
app/api/TFPDF/font/helveticai.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $type = 'Core';
3
+ $name = 'Helvetica-Oblique';
4
+ $up = -100;
5
+ $ut = 50;
6
+ $cw = array(
7
+ chr(0)=>278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278,
8
+ chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>278,'"'=>355,'#'=>556,'$'=>556,'%'=>889,'&'=>667,'\''=>191,'('=>333,')'=>333,'*'=>389,'+'=>584,
9
+ ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>278,';'=>278,'<'=>584,'='=>584,'>'=>584,'?'=>556,'@'=>1015,'A'=>667,
10
+ 'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>500,'K'=>667,'L'=>556,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944,
11
+ 'X'=>667,'Y'=>667,'Z'=>611,'['=>278,'\\'=>278,']'=>278,'^'=>469,'_'=>556,'`'=>333,'a'=>556,'b'=>556,'c'=>500,'d'=>556,'e'=>556,'f'=>278,'g'=>556,'h'=>556,'i'=>222,'j'=>222,'k'=>500,'l'=>222,'m'=>833,
12
+ 'n'=>556,'o'=>556,'p'=>556,'q'=>556,'r'=>333,'s'=>500,'t'=>278,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>500,'{'=>334,'|'=>260,'}'=>334,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>222,chr(131)=>556,
13
+ chr(132)=>333,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>222,chr(146)=>222,chr(147)=>333,chr(148)=>333,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000,
14
+ chr(154)=>500,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>260,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333,
15
+ chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>556,chr(182)=>537,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667,
16
+ chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722,
17
+ chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>500,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>556,chr(241)=>556,
18
+ chr(242)=>556,chr(243)=>556,chr(244)=>556,chr(245)=>556,chr(246)=>556,chr(247)=>584,chr(248)=>611,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500);
19
+ ?>
app/api/TFPDF/font/symbol.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $type = 'Core';
3
+ $name = 'Symbol';
4
+ $up = -100;
5
+ $ut = 50;
6
+ $cw = array(
7
+ chr(0)=>250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250,
8
+ chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>713,'#'=>500,'$'=>549,'%'=>833,'&'=>778,'\''=>439,'('=>333,')'=>333,'*'=>500,'+'=>549,
9
+ ','=>250,'-'=>549,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>278,';'=>278,'<'=>549,'='=>549,'>'=>549,'?'=>444,'@'=>549,'A'=>722,
10
+ 'B'=>667,'C'=>722,'D'=>612,'E'=>611,'F'=>763,'G'=>603,'H'=>722,'I'=>333,'J'=>631,'K'=>722,'L'=>686,'M'=>889,'N'=>722,'O'=>722,'P'=>768,'Q'=>741,'R'=>556,'S'=>592,'T'=>611,'U'=>690,'V'=>439,'W'=>768,
11
+ 'X'=>645,'Y'=>795,'Z'=>611,'['=>333,'\\'=>863,']'=>333,'^'=>658,'_'=>500,'`'=>500,'a'=>631,'b'=>549,'c'=>549,'d'=>494,'e'=>439,'f'=>521,'g'=>411,'h'=>603,'i'=>329,'j'=>603,'k'=>549,'l'=>549,'m'=>576,
12
+ 'n'=>521,'o'=>549,'p'=>549,'q'=>521,'r'=>549,'s'=>603,'t'=>439,'u'=>576,'v'=>713,'w'=>686,'x'=>493,'y'=>686,'z'=>494,'{'=>480,'|'=>200,'}'=>480,'~'=>549,chr(127)=>0,chr(128)=>0,chr(129)=>0,chr(130)=>0,chr(131)=>0,
13
+ chr(132)=>0,chr(133)=>0,chr(134)=>0,chr(135)=>0,chr(136)=>0,chr(137)=>0,chr(138)=>0,chr(139)=>0,chr(140)=>0,chr(141)=>0,chr(142)=>0,chr(143)=>0,chr(144)=>0,chr(145)=>0,chr(146)=>0,chr(147)=>0,chr(148)=>0,chr(149)=>0,chr(150)=>0,chr(151)=>0,chr(152)=>0,chr(153)=>0,
14
+ chr(154)=>0,chr(155)=>0,chr(156)=>0,chr(157)=>0,chr(158)=>0,chr(159)=>0,chr(160)=>750,chr(161)=>620,chr(162)=>247,chr(163)=>549,chr(164)=>167,chr(165)=>713,chr(166)=>500,chr(167)=>753,chr(168)=>753,chr(169)=>753,chr(170)=>753,chr(171)=>1042,chr(172)=>987,chr(173)=>603,chr(174)=>987,chr(175)=>603,
15
+ chr(176)=>400,chr(177)=>549,chr(178)=>411,chr(179)=>549,chr(180)=>549,chr(181)=>713,chr(182)=>494,chr(183)=>460,chr(184)=>549,chr(185)=>549,chr(186)=>549,chr(187)=>549,chr(188)=>1000,chr(189)=>603,chr(190)=>1000,chr(191)=>658,chr(192)=>823,chr(193)=>686,chr(194)=>795,chr(195)=>987,chr(196)=>768,chr(197)=>768,
16
+ chr(198)=>823,chr(199)=>768,chr(200)=>768,chr(201)=>713,chr(202)=>713,chr(203)=>713,chr(204)=>713,chr(205)=>713,chr(206)=>713,chr(207)=>713,chr(208)=>768,chr(209)=>713,chr(210)=>790,chr(211)=>790,chr(212)=>890,chr(213)=>823,chr(214)=>549,chr(215)=>250,chr(216)=>713,chr(217)=>603,chr(218)=>603,chr(219)=>1042,
17
+ chr(220)=>987,chr(221)=>603,chr(222)=>987,chr(223)=>603,chr(224)=>494,chr(225)=>329,chr(226)=>790,chr(227)=>790,chr(228)=>786,chr(229)=>713,chr(230)=>384,chr(231)=>384,chr(232)=>384,chr(233)=>384,chr(234)=>384,chr(235)=>384,chr(236)=>494,chr(237)=>494,chr(238)=>494,chr(239)=>494,chr(240)=>0,chr(241)=>329,
18
+ chr(242)=>274,chr(243)=>686,chr(244)=>686,chr(245)=>686,chr(246)=>384,chr(247)=>384,chr(248)=>384,chr(249)=>384,chr(250)=>384,chr(251)=>384,chr(252)=>494,chr(253)=>494,chr(254)=>494,chr(255)=>0);
19
+ ?>
app/api/TFPDF/font/times.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $type = 'Core';
3
+ $name = 'Times-Roman';
4
+ $up = -100;
5
+ $ut = 50;
6
+ $cw = array(
7
+ chr(0)=>250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250,
8
+ chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>408,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>180,'('=>333,')'=>333,'*'=>500,'+'=>564,
9
+ ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>278,';'=>278,'<'=>564,'='=>564,'>'=>564,'?'=>444,'@'=>921,'A'=>722,
10
+ 'B'=>667,'C'=>667,'D'=>722,'E'=>611,'F'=>556,'G'=>722,'H'=>722,'I'=>333,'J'=>389,'K'=>722,'L'=>611,'M'=>889,'N'=>722,'O'=>722,'P'=>556,'Q'=>722,'R'=>667,'S'=>556,'T'=>611,'U'=>722,'V'=>722,'W'=>944,
11
+ 'X'=>722,'Y'=>722,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>469,'_'=>500,'`'=>333,'a'=>444,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>333,'g'=>500,'h'=>500,'i'=>278,'j'=>278,'k'=>500,'l'=>278,'m'=>778,
12
+ 'n'=>500,'o'=>500,'p'=>500,'q'=>500,'r'=>333,'s'=>389,'t'=>278,'u'=>500,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>444,'{'=>480,'|'=>200,'}'=>480,'~'=>541,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500,
13
+ chr(132)=>444,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>889,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>444,chr(148)=>444,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>980,
14
+ chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>444,chr(159)=>722,chr(160)=>250,chr(161)=>333,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>200,chr(167)=>500,chr(168)=>333,chr(169)=>760,chr(170)=>276,chr(171)=>500,chr(172)=>564,chr(173)=>333,chr(174)=>760,chr(175)=>333,
15
+ chr(176)=>400,chr(177)=>564,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>500,chr(182)=>453,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>310,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>444,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722,
16
+ chr(198)=>889,chr(199)=>667,chr(200)=>611,chr(201)=>611,chr(202)=>611,chr(203)=>611,chr(204)=>333,chr(205)=>333,chr(206)=>333,chr(207)=>333,chr(208)=>722,chr(209)=>722,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>564,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722,
17
+ chr(220)=>722,chr(221)=>722,chr(222)=>556,chr(223)=>500,chr(224)=>444,chr(225)=>444,chr(226)=>444,chr(227)=>444,chr(228)=>444,chr(229)=>444,chr(230)=>667,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>500,
18
+ chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>564,chr(248)=>500,chr(249)=>500,chr(250)=>500,chr(251)=>500,chr(252)=>500,chr(253)=>500,chr(254)=>500,chr(255)=>500);
19
+ ?>
app/api/TFPDF/font/timesb.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $type = 'Core';
3
+ $name = 'Times-Bold';
4
+ $up = -100;
5
+ $ut = 50;
6
+ $cw = array(
7
+ chr(0)=>250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250,
8
+ chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>555,'#'=>500,'$'=>500,'%'=>1000,'&'=>833,'\''=>278,'('=>333,')'=>333,'*'=>500,'+'=>570,
9
+ ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>570,'='=>570,'>'=>570,'?'=>500,'@'=>930,'A'=>722,
10
+ 'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>778,'I'=>389,'J'=>500,'K'=>778,'L'=>667,'M'=>944,'N'=>722,'O'=>778,'P'=>611,'Q'=>778,'R'=>722,'S'=>556,'T'=>667,'U'=>722,'V'=>722,'W'=>1000,
11
+ 'X'=>722,'Y'=>722,'Z'=>667,'['=>333,'\\'=>278,']'=>333,'^'=>581,'_'=>500,'`'=>333,'a'=>500,'b'=>556,'c'=>444,'d'=>556,'e'=>444,'f'=>333,'g'=>500,'h'=>556,'i'=>278,'j'=>333,'k'=>556,'l'=>278,'m'=>833,
12
+ 'n'=>556,'o'=>500,'p'=>556,'q'=>556,'r'=>444,'s'=>389,'t'=>333,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>444,'{'=>394,'|'=>220,'}'=>394,'~'=>520,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500,
13
+ chr(132)=>500,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>667,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>1000,
14
+ chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>444,chr(159)=>722,chr(160)=>250,chr(161)=>333,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>220,chr(167)=>500,chr(168)=>333,chr(169)=>747,chr(170)=>300,chr(171)=>500,chr(172)=>570,chr(173)=>333,chr(174)=>747,chr(175)=>333,
15
+ chr(176)=>400,chr(177)=>570,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>556,chr(182)=>540,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>330,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722,
16
+ chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>389,chr(205)=>389,chr(206)=>389,chr(207)=>389,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>570,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722,
17
+ chr(220)=>722,chr(221)=>722,chr(222)=>611,chr(223)=>556,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>722,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>556,
18
+ chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>570,chr(248)=>500,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500);
19
+ ?>
app/api/TFPDF/font/timesbi.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $type = 'Core';
3
+ $name = 'Times-BoldItalic';
4
+ $up = -100;
5
+ $ut = 50;
6
+ $cw = array(
7
+ chr(0)=>250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250,
8
+ chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>389,'"'=>555,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>278,'('=>333,')'=>333,'*'=>500,'+'=>570,
9
+ ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>570,'='=>570,'>'=>570,'?'=>500,'@'=>832,'A'=>667,
10
+ 'B'=>667,'C'=>667,'D'=>722,'E'=>667,'F'=>667,'G'=>722,'H'=>778,'I'=>389,'J'=>500,'K'=>667,'L'=>611,'M'=>889,'N'=>722,'O'=>722,'P'=>611,'Q'=>722,'R'=>667,'S'=>556,'T'=>611,'U'=>722,'V'=>667,'W'=>889,
11
+ 'X'=>667,'Y'=>611,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>570,'_'=>500,'`'=>333,'a'=>500,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>333,'g'=>500,'h'=>556,'i'=>278,'j'=>278,'k'=>500,'l'=>278,'m'=>778,
12
+ 'n'=>556,'o'=>500,'p'=>500,'q'=>500,'r'=>389,'s'=>389,'t'=>278,'u'=>556,'v'=>444,'w'=>667,'x'=>500,'y'=>444,'z'=>389,'{'=>348,'|'=>220,'}'=>348,'~'=>570,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500,
13
+ chr(132)=>500,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>944,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>1000,
14
+ chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>389,chr(159)=>611,chr(160)=>250,chr(161)=>389,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>220,chr(167)=>500,chr(168)=>333,chr(169)=>747,chr(170)=>266,chr(171)=>500,chr(172)=>606,chr(173)=>333,chr(174)=>747,chr(175)=>333,
15
+ chr(176)=>400,chr(177)=>570,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>576,chr(182)=>500,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>300,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667,
16
+ chr(198)=>944,chr(199)=>667,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>389,chr(205)=>389,chr(206)=>389,chr(207)=>389,chr(208)=>722,chr(209)=>722,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>570,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722,
17
+ chr(220)=>722,chr(221)=>611,chr(222)=>611,chr(223)=>500,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>722,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>556,
18
+ chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>570,chr(248)=>500,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>444,chr(254)=>500,chr(255)=>444);
19
+ ?>
app/api/TFPDF/font/timesi.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $type = 'Core';
3
+ $name = 'Times-Italic';
4
+ $up = -100;
5
+ $ut = 50;
6
+ $cw = array(
7
+ chr(0)=>250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250,
8
+ chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>420,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>214,'('=>333,')'=>333,'*'=>500,'+'=>675,
9
+ ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>675,'='=>675,'>'=>675,'?'=>500,'@'=>920,'A'=>611,
10
+ 'B'=>611,'C'=>667,'D'=>722,'E'=>611,'F'=>611,'G'=>722,'H'=>722,'I'=>333,'J'=>444,'K'=>667,'L'=>556,'M'=>833,'N'=>667,'O'=>722,'P'=>611,'Q'=>722,'R'=>611,'S'=>500,'T'=>556,'U'=>722,'V'=>611,'W'=>833,
11
+ 'X'=>611,'Y'=>556,'Z'=>556,'['=>389,'\\'=>278,']'=>389,'^'=>422,'_'=>500,'`'=>333,'a'=>500,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>278,'g'=>500,'h'=>500,'i'=>278,'j'=>278,'k'=>444,'l'=>278,'m'=>722,
12
+ 'n'=>500,'o'=>500,'p'=>500,'q'=>500,'r'=>389,'s'=>389,'t'=>278,'u'=>500,'v'=>444,'w'=>667,'x'=>444,'y'=>444,'z'=>389,'{'=>400,'|'=>275,'}'=>400,'~'=>541,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500,
13
+ chr(132)=>556,chr(133)=>889,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>500,chr(139)=>333,chr(140)=>944,chr(141)=>350,chr(142)=>556,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>556,chr(148)=>556,chr(149)=>350,chr(150)=>500,chr(151)=>889,chr(152)=>333,chr(153)=>980,
14
+ chr(154)=>389,chr(155)=>333,chr(156)=>667,chr(157)=>350,chr(158)=>389,chr(159)=>556,chr(160)=>250,chr(161)=>389,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>275,chr(167)=>500,chr(168)=>333,chr(169)=>760,chr(170)=>276,chr(171)=>500,chr(172)=>675,chr(173)=>333,chr(174)=>760,chr(175)=>333,
15
+ chr(176)=>400,chr(177)=>675,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>500,chr(182)=>523,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>310,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>611,chr(193)=>611,chr(194)=>611,chr(195)=>611,chr(196)=>611,chr(197)=>611,
16
+ chr(198)=>889,chr(199)=>667,chr(200)=>611,chr(201)=>611,chr(202)=>611,chr(203)=>611,chr(204)=>333,chr(205)=>333,chr(206)=>333,chr(207)=>333,chr(208)=>722,chr(209)=>667,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>675,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722,
17
+ chr(220)=>722,chr(221)=>556,chr(222)=>611,chr(223)=>500,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>667,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>500,
18
+ chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>675,chr(248)=>500,chr(249)=>500,chr(250)=>500,chr(251)=>500,chr(252)=>500,chr(253)=>444,chr(254)=>500,chr(255)=>444);
19
+ ?>
app/api/TFPDF/font/unifont/DejaVuSans.ttf ADDED
Binary file
app/api/TFPDF/font/unifont/DejaVuSansCondensed-Bold.ttf ADDED
Binary file
app/api/TFPDF/font/unifont/DejaVuSansCondensed.ttf ADDED
Binary file
app/api/TFPDF/font/unifont/ttfonts.php ADDED
@@ -0,0 +1,1083 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /** no direct access **/
3
+ defined('MECEXEC') or die();
4
+
5
+ /**
6
+ * TTFontFile class
7
+ *
8
+ * This class is based on The ReportLab Open Source PDF library
9
+ * written in Python - http://www.reportlab.com/software/opensource/
10
+ * together with ideas from the OpenOffice source code and others.
11
+ *
12
+ * Version: 1.04
13
+ * Date: 2011-09-18
14
+ * Author: Ian Back <ianb@bpm1.com>
15
+ * License: LGPL
16
+ * Copyright (c) Ian Back, 2010
17
+ * This header must be retained in any redistribution or
18
+ * modification of the file.
19
+ *
20
+ */
21
+
22
+ // Define the value used in the "head" table of a created TTF file
23
+ // 0x74727565 "true" for Mac
24
+ // 0x00010000 for Windows
25
+ // Either seems to work for a font embedded in a PDF file
26
+ // when read by Adobe Reader on a Windows PC(!)
27
+ define("_TTF_MAC_HEADER", false);
28
+
29
+
30
+ // TrueType Font Glyph operators
31
+ define("GF_WORDS",(1 << 0));
32
+ define("GF_SCALE",(1 << 3));
33
+ define("GF_MORE",(1 << 5));
34
+ define("GF_XYSCALE",(1 << 6));
35
+ define("GF_TWOBYTWO",(1 << 7));
36
+
37
+
38
+
39
+ class TTFontFile {
40
+
41
+ var $maxUni;
42
+ var $_pos;
43
+ var $numTables;
44
+ var $searchRange;
45
+ var $entrySelector;
46
+ var $rangeShift;
47
+ var $tables;
48
+ var $otables;
49
+ var $filename;
50
+ var $fh;
51
+ var $hmetrics;
52
+ var $glyphPos;
53
+ var $charToGlyph;
54
+ var $ascent;
55
+ var $descent;
56
+ var $name;
57
+ var $familyName;
58
+ var $styleName;
59
+ var $fullName;
60
+ var $uniqueFontID;
61
+ var $unitsPerEm;
62
+ var $bbox;
63
+ var $capHeight;
64
+ var $stemV;
65
+ var $italicAngle;
66
+ var $flags;
67
+ var $underlinePosition;
68
+ var $underlineThickness;
69
+ var $charWidths;
70
+ var $defaultWidth;
71
+ var $maxStrLenRead;
72
+
73
+ function __construct() {
74
+ $this->maxStrLenRead = 200000; // Maximum size of glyf table to read in as string (otherwise reads each glyph from file)
75
+ }
76
+
77
+
78
+ function getMetrics($file) {
79
+ $this->filename = $file;
80
+ $this->fh = fopen($file,'rb') or die('Can\'t open file ' . $file);
81
+ $this->_pos = 0;
82
+ $this->charWidths = '';
83
+ $this->glyphPos = array();
84
+ $this->charToGlyph = array();
85
+ $this->tables = array();
86
+ $this->otables = array();
87
+ $this->ascent = 0;
88
+ $this->descent = 0;
89
+ $this->TTCFonts = array();
90
+ $this->version = $version = $this->read_ulong();
91
+ if ($version==0x4F54544F)
92
+ die("Postscript outlines are not supported");
93
+ if ($version==0x74746366)
94
+ die("ERROR - TrueType Fonts Collections not supported");
95
+ if (!in_array($version, array(0x00010000,0x74727565)))
96
+ die("Not a TrueType font: version=".$version);
97
+ $this->readTableDirectory();
98
+ $this->extractInfo();
99
+ fclose($this->fh);
100
+ }
101
+
102
+
103
+ function readTableDirectory() {
104
+ $this->numTables = $this->read_ushort();
105
+ $this->searchRange = $this->read_ushort();
106
+ $this->entrySelector = $this->read_ushort();
107
+ $this->rangeShift = $this->read_ushort();
108
+ $this->tables = array();
109
+ for ($i=0;$i<$this->numTables;$i++) {
110
+ $record = array();
111
+ $record['tag'] = $this->read_tag();
112
+ $record['checksum'] = array($this->read_ushort(),$this->read_ushort());
113
+ $record['offset'] = $this->read_ulong();
114
+ $record['length'] = $this->read_ulong();
115
+ $this->tables[$record['tag']] = $record;
116
+ }
117
+ }
118
+
119
+
120
+ function sub32($x, $y) {
121
+ $xlo = $x[1];
122
+ $xhi = $x[0];
123
+ $ylo = $y[1];
124
+ $yhi = $y[0];
125
+ if ($ylo > $xlo) { $xlo += 1 << 16; $yhi += 1; }
126
+ $reslo = $xlo-$ylo;
127
+ if ($yhi > $xhi) { $xhi += 1 << 16; }
128
+ $reshi = $xhi-$yhi;
129
+ $reshi = $reshi & 0xFFFF;
130
+ return array($reshi, $reslo);
131
+ }
132
+
133
+ function calcChecksum($data) {
134
+ if (strlen($data) % 4) { $data .= str_repeat("\0",(4-(strlen($data) % 4))); }
135
+ $hi=0x0000;
136
+ $lo=0x0000;
137
+ for($i=0;$i<strlen($data);$i+=4) {
138
+ $hi += (ord($data[$i])<<8) + ord($data[$i+1]);
139
+ $lo += (ord($data[$i+2])<<8) + ord($data[$i+3]);
140
+ $hi += $lo >> 16;
141
+ $lo = $lo & 0xFFFF;
142
+ $hi = $hi & 0xFFFF;
143
+ }
144
+ return array($hi, $lo);
145
+ }
146
+
147
+ function get_table_pos($tag) {
148
+ $offset = $this->tables[$tag]['offset'];
149
+ $length = $this->tables[$tag]['length'];
150
+ return array($offset, $length);
151
+ }
152
+
153
+ function seek($pos) {
154
+ $this->_pos = $pos;
155
+ fseek($this->fh,$this->_pos);
156
+ }
157
+
158
+ function skip($delta) {
159
+ $this->_pos = $this->_pos + $delta;
160
+ fseek($this->fh,$this->_pos);
161
+ }
162
+
163
+ function seek_table($tag, $offset_in_table = 0) {
164
+ $tpos = $this->get_table_pos($tag);
165
+ $this->_pos = $tpos[0] + $offset_in_table;
166
+ fseek($this->fh, $this->_pos);
167
+ return $this->_pos;
168
+ }
169
+
170
+ function read_tag() {
171
+ $this->_pos += 4;
172
+ return fread($this->fh,4);
173
+ }
174
+
175
+ function read_short() {
176
+ $this->_pos += 2;
177
+ $s = fread($this->fh,2);
178
+ $a = (ord($s[0])<<8) + ord($s[1]);
179
+ if ($a & (1 << 15) ) { $a = ($a - (1 << 16)) ; }
180
+ return $a;
181
+ }
182
+
183
+ function unpack_short($s) {
184
+ $a = (ord($s[0])<<8) + ord($s[1]);
185
+ if ($a & (1 << 15) ) {
186
+ $a = ($a - (1 << 16));
187
+ }
188
+ return $a;
189
+ }
190
+
191
+ function read_ushort() {
192
+ $this->_pos += 2;
193
+ $s = fread($this->fh,2);
194
+ return (ord($s[0])<<8) + ord($s[1]);
195
+ }
196
+
197
+ function read_ulong() {
198
+ $this->_pos += 4;
199
+ $s = fread($this->fh,4);
200
+ // if large uInt32 as an integer, PHP converts it to -ve
201
+ return (ord($s[0])*16777216) + (ord($s[1])<<16) + (ord($s[2])<<8) + ord($s[3]); // 16777216 = 1<<24
202
+ }
203
+
204
+ function get_ushort($pos) {
205
+ fseek($this->fh,$pos);
206
+ $s = fread($this->fh,2);
207
+ return (ord($s[0])<<8) + ord($s[1]);
208
+ }
209
+
210
+ function get_ulong($pos) {
211
+ fseek($this->fh,$pos);
212
+ $s = fread($this->fh,4);
213
+ // iF large uInt32 as an integer, PHP converts it to -ve
214
+ return (ord($s[0])*16777216) + (ord($s[1])<<16) + (ord($s[2])<<8) + ord($s[3]); // 16777216 = 1<<24
215
+ }
216
+
217
+ function pack_short($val) {
218
+ if ($val<0) {
219
+ $val = abs($val);
220
+ $val = ~$val;
221
+ $val += 1;
222
+ }
223
+ return pack("n",$val);
224
+ }
225
+
226
+ function splice($stream, $offset, $value) {
227
+ return substr($stream,0,$offset) . $value . substr($stream,$offset+strlen($value));
228
+ }
229
+
230
+ function _set_ushort($stream, $offset, $value) {
231
+ $up = pack("n", $value);
232
+ return $this->splice($stream, $offset, $up);
233
+ }
234
+
235
+ function _set_short($stream, $offset, $val) {
236
+ if ($val<0) {
237
+ $val = abs($val);
238
+ $val = ~$val;
239
+ $val += 1;
240
+ }
241
+ $up = pack("n",$val);
242
+ return $this->splice($stream, $offset, $up);
243
+ }
244
+
245
+ function get_chunk($pos, $length) {
246
+ fseek($this->fh,$pos);
247
+ if ($length <1) { return ''; }
248
+ return (fread($this->fh,$length));
249
+ }
250
+
251
+ function get_table($tag) {
252
+ list($pos, $length) = $this->get_table_pos($tag);
253
+ if ($length == 0) { die('Truetype font ('.$this->filename.'): error reading table: '.$tag); }
254
+ fseek($this->fh,$pos);
255
+ return (fread($this->fh,$length));
256
+ }
257
+
258
+ function add($tag, $data) {
259
+ if ($tag == 'head') {
260
+ $data = $this->splice($data, 8, "\0\0\0\0");
261
+ }
262
+ $this->otables[$tag] = $data;
263
+ }
264
+
265
+
266
+
267
+ /////////////////////////////////////////////////////////////////////////////////////////
268
+ /////////////////////////////////////////////////////////////////////////////////////////
269
+
270
+ /////////////////////////////////////////////////////////////////////////////////////////
271
+
272
+ function extractInfo() {
273
+ ///////////////////////////////////
274
+ // name - Naming table
275
+ ///////////////////////////////////
276
+ $this->sFamilyClass = 0;
277
+ $this->sFamilySubClass = 0;
278
+
279
+ $name_offset = $this->seek_table("name");
280
+ $format = $this->read_ushort();
281
+ if ($format != 0)
282
+ die("Unknown name table format ".$format);
283
+ $numRecords = $this->read_ushort();
284
+ $string_data_offset = $name_offset + $this->read_ushort();
285
+ $names = array(1=>'',2=>'',3=>'',4=>'',6=>'');
286
+ $K = array_keys($names);
287
+ $nameCount = count($names);
288
+ for ($i=0;$i<$numRecords; $i++) {
289
+ $platformId = $this->read_ushort();
290
+ $encodingId = $this->read_ushort();
291
+ $languageId = $this->read_ushort();
292
+ $nameId = $this->read_ushort();
293
+ $length = $this->read_ushort();
294
+ $offset = $this->read_ushort();
295
+ if (!in_array($nameId,$K)) continue;
296
+ $N = '';
297
+ if ($platformId == 3 && $encodingId == 1 && $languageId == 0x409) { // Microsoft, Unicode, US English, PS Name
298
+ $opos = $this->_pos;
299
+ $this->seek($string_data_offset + $offset);
300
+ if ($length % 2 != 0)
301
+ die("PostScript name is UTF-16BE string of odd length");
302
+ $length /= 2;
303
+ $N = '';
304
+ while ($length > 0) {
305
+ $char = $this->read_ushort();
306
+ $N .= (chr($char));
307
+ $length -= 1;
308
+ }
309
+ $this->_pos = $opos;
310
+ $this->seek($opos);
311
+ }
312
+ else if ($platformId == 1 && $encodingId == 0 && $languageId == 0) { // Macintosh, Roman, English, PS Name
313
+ $opos = $this->_pos;
314
+ $N = $this->get_chunk($string_data_offset + $offset, $length);
315
+ $this->_pos = $opos;
316
+ $this->seek($opos);
317
+ }
318
+ if ($N && $names[$nameId]=='') {
319
+ $names[$nameId] = $N;
320
+ $nameCount -= 1;
321
+ if ($nameCount==0) break;
322
+ }
323
+ }
324
+ if ($names[6])
325
+ $psName = $names[6];
326
+ else if ($names[4])
327
+ $psName = preg_replace('/ /','-',$names[4]);
328
+ else if ($names[1])
329
+ $psName = preg_replace('/ /','-',$names[1]);
330
+ else
331
+ $psName = '';
332
+ if (!$psName)
333
+ die("Could not find PostScript font name");
334
+ $this->name = $psName;
335
+ if ($names[1]) { $this->familyName = $names[1]; } else { $this->familyName = $psName; }
336
+ if ($names[2]) { $this->styleName = $names[2]; } else { $this->styleName = 'Regular'; }
337
+ if ($names[4]) { $this->fullName = $names[4]; } else { $this->fullName = $psName; }
338
+ if ($names[3]) { $this->uniqueFontID = $names[3]; } else { $this->uniqueFontID = $psName; }
339
+ if ($names[6]) { $this->fullName = $names[6]; }
340
+
341
+ ///////////////////////////////////
342
+ // head - Font header table
343
+ ///////////////////////////////////
344
+ $this->seek_table("head");
345
+ $this->skip(18);
346
+ $this->unitsPerEm = $unitsPerEm = $this->read_ushort();
347
+ $scale = 1000 / $unitsPerEm;
348
+ $this->skip(16);
349
+ $xMin = $this->read_short();
350
+ $yMin = $this->read_short();
351
+ $xMax = $this->read_short();
352
+ $yMax = $this->read_short();
353
+ $this->bbox = array(($xMin*$scale), ($yMin*$scale), ($xMax*$scale), ($yMax*$scale));
354
+ $this->skip(3*2);
355
+ $indexToLocFormat = $this->read_ushort();
356
+ $glyphDataFormat = $this->read_ushort();
357
+ if ($glyphDataFormat != 0)
358
+ die('Unknown glyph data format '.$glyphDataFormat);
359
+
360
+ ///////////////////////////////////
361
+ // hhea metrics table
362
+ ///////////////////////////////////
363
+ // ttf2t1 seems to use this value rather than the one in OS/2 - so put in for compatibility
364
+ if (isset($this->tables["hhea"])) {
365
+ $this->seek_table("hhea");
366
+ $this->skip(4);
367
+ $hheaAscender = $this->read_short();
368
+ $hheaDescender = $this->read_short();
369
+ $this->ascent = ($hheaAscender *$scale);
370
+ $this->descent = ($hheaDescender *$scale);
371
+ }
372
+
373
+ ///////////////////////////////////
374
+ // OS/2 - OS/2 and Windows metrics table
375
+ ///////////////////////////////////
376
+ if (isset($this->tables["OS/2"])) {
377
+ $this->seek_table("OS/2");
378
+ $version = $this->read_ushort();
379
+ $this->skip(2);
380
+ $usWeightClass = $this->read_ushort();
381
+ $this->skip(2);
382
+ $fsType = $this->read_ushort();
383
+ if ($fsType == 0x0002 || ($fsType & 0x0300) != 0) {
384
+ die('ERROR - Font file '.$this->filename.' cannot be embedded due to copyright restrictions.');
385
+ $this->restrictedUse = true;
386
+ }
387
+ $this->skip(20);
388
+ $sF = $this->read_short();
389
+ $this->sFamilyClass = ($sF >> 8);
390
+ $this->sFamilySubClass = ($sF & 0xFF);
391
+ $this->_pos += 10; //PANOSE = 10 byte length
392
+ $panose = fread($this->fh,10);
393
+ $this->skip(26);
394
+ $sTypoAscender = $this->read_short();
395
+ $sTypoDescender = $this->read_short();
396
+ if (!$this->ascent) $this->ascent = ($sTypoAscender*$scale);
397
+ if (!$this->descent) $this->descent = ($sTypoDescender*$scale);
398
+ if ($version > 1) {
399
+ $this->skip(16);
400
+ $sCapHeight = $this->read_short();
401
+ $this->capHeight = ($sCapHeight*$scale);
402
+ }
403
+ else {
404
+ $this->capHeight = $this->ascent;
405
+ }
406
+ }
407
+ else {
408
+ $usWeightClass = 500;
409
+ if (!$this->ascent) $this->ascent = ($yMax*$scale);
410
+ if (!$this->descent) $this->descent = ($yMin*$scale);
411
+ $this->capHeight = $this->ascent;
412
+ }
413
+ $this->stemV = 50 + intval(pow(($usWeightClass / 65.0),2));
414
+
415
+ ///////////////////////////////////
416
+ // post - PostScript table
417
+ ///////////////////////////////////
418
+ $this->seek_table("post");
419
+ $this->skip(4);
420
+ $this->italicAngle = $this->read_short() + $this->read_ushort() / 65536.0;
421
+ $this->underlinePosition = $this->read_short() * $scale;
422
+ $this->underlineThickness = $this->read_short() * $scale;
423
+ $isFixedPitch = $this->read_ulong();
424
+
425
+ $this->flags = 4;
426
+
427
+ if ($this->italicAngle!= 0)
428
+ $this->flags = $this->flags | 64;
429
+ if ($usWeightClass >= 600)
430
+ $this->flags = $this->flags | 262144;
431
+ if ($isFixedPitch)
432
+ $this->flags = $this->flags | 1;
433
+
434
+ ///////////////////////////////////
435
+ // hhea - Horizontal header table
436
+ ///////////////////////////////////
437
+ $this->seek_table("hhea");
438
+ $this->skip(32);
439
+ $metricDataFormat = $this->read_ushort();
440
+ if ($metricDataFormat != 0)
441
+ die('Unknown horizontal metric data format '.$metricDataFormat);
442
+ $numberOfHMetrics = $this->read_ushort();
443
+ if ($numberOfHMetrics == 0)
444
+ die('Number of horizontal metrics is 0');
445
+
446
+ ///////////////////////////////////
447
+ // maxp - Maximum profile table
448
+ ///////////////////////////////////
449
+ $this->seek_table("maxp");
450
+ $this->skip(4);
451
+ $numGlyphs = $this->read_ushort();
452
+
453
+
454
+ ///////////////////////////////////
455
+ // cmap - Character to glyph index mapping table
456
+ ///////////////////////////////////
457
+ $cmap_offset = $this->seek_table("cmap");
458
+ $this->skip(2);
459
+ $cmapTableCount = $this->read_ushort();
460
+ $unicode_cmap_offset = 0;
461
+ for ($i=0;$i<$cmapTableCount;$i++) {
462
+ $platformID = $this->read_ushort();
463
+ $encodingID = $this->read_ushort();
464
+ $offset = $this->read_ulong();
465
+ $save_pos = $this->_pos;
466
+ if (($platformID == 3 && $encodingID == 1) || $platformID == 0) { // Microsoft, Unicode
467
+ $format = $this->get_ushort($cmap_offset + $offset);
468
+ if ($format == 4) {
469
+ if (!$unicode_cmap_offset) $unicode_cmap_offset = $cmap_offset + $offset;
470
+ break;
471
+ }
472
+ }
473
+ $this->seek($save_pos );
474
+ }
475
+ if (!$unicode_cmap_offset)
476
+ die('Font ('.$this->filename .') does not have cmap for Unicode (platform 3, encoding 1, format 4, or platform 0, any encoding, format 4)');
477
+
478
+
479
+ $glyphToChar = array();
480
+ $charToGlyph = array();
481
+ $this->getCMAP4($unicode_cmap_offset, $glyphToChar, $charToGlyph );
482
+
483
+ ///////////////////////////////////
484
+ // hmtx - Horizontal metrics table
485
+ ///////////////////////////////////
486
+ $this->getHMTX($numberOfHMetrics, $numGlyphs, $glyphToChar, $scale);
487
+
488
+ }
489
+
490
+
491
+ /////////////////////////////////////////////////////////////////////////////////////////
492
+ /////////////////////////////////////////////////////////////////////////////////////////
493
+
494
+
495
+ function makeSubset($file, &$subset) {
496
+ $this->filename = $file;
497
+ $this->fh = fopen($file ,'rb') or die('Can\'t open file ' . $file);
498
+ $this->_pos = 0;
499
+ $this->charWidths = '';
500
+ $this->glyphPos = array();
501
+ $this->charToGlyph = array();
502
+ $this->tables = array();
503
+ $this->otables = array();
504
+ $this->ascent = 0;
505
+ $this->descent = 0;
506
+ $this->skip(4);
507
+ $this->maxUni = 0;
508
+ $this->readTableDirectory();
509
+
510
+
511
+ ///////////////////////////////////
512
+ // head - Font header table
513
+ ///////////////////////////////////
514
+ $this->seek_table("head");
515
+ $this->skip(50);
516
+ $indexToLocFormat = $this->read_ushort();
517
+ $glyphDataFormat = $this->read_ushort();
518
+
519
+ ///////////////////////////////////
520
+ // hhea - Horizontal header table
521
+ ///////////////////////////////////
522
+ $this->seek_table("hhea");
523
+ $this->skip(32);
524
+ $metricDataFormat = $this->read_ushort();
525
+ $orignHmetrics = $numberOfHMetrics = $this->read_ushort();
526
+
527
+ ///////////////////////////////////
528
+ // maxp - Maximum profile table
529
+ ///////////////////////////////////
530
+ $this->seek_table("maxp");
531
+ $this->skip(4);
532
+ $numGlyphs = $this->read_ushort();
533
+
534
+
535
+ ///////////////////////////////////
536
+ // cmap - Character to glyph index mapping table
537
+ ///////////////////////////////////
538
+ $cmap_offset = $this->seek_table("cmap");
539
+ $this->skip(2);
540
+ $cmapTableCount = $this->read_ushort();
541
+ $unicode_cmap_offset = 0;
542
+ for ($i=0;$i<$cmapTableCount;$i++) {
543
+ $platformID = $this->read_ushort();
544
+ $encodingID = $this->read_ushort();
545
+ $offset = $this->read_ulong();
546
+ $save_pos = $this->_pos;
547
+ if (($platformID == 3 && $encodingID == 1) || $platformID == 0) { // Microsoft, Unicode
548
+ $format = $this->get_ushort($cmap_offset + $offset);
549
+ if ($format == 4) {
550
+ $unicode_cmap_offset = $cmap_offset + $offset;
551
+ break;
552
+ }
553
+ }
554
+ $this->seek($save_pos );
555
+ }
556
+
557
+ if (!$unicode_cmap_offset)
558
+ die('Font ('.$this->filename .') does not have cmap for Unicode (platform 3, encoding 1, format 4, or platform 0, any encoding, format 4)');
559
+
560
+
561
+ $glyphToChar = array();
562
+ $charToGlyph = array();
563
+ $this->getCMAP4($unicode_cmap_offset, $glyphToChar, $charToGlyph );
564
+
565
+ $this->charToGlyph = $charToGlyph;
566
+
567
+ ///////////////////////////////////
568
+ // hmtx - Horizontal metrics table
569
+ ///////////////////////////////////
570
+ $scale = 1; // not used
571
+ $this->getHMTX($numberOfHMetrics, $numGlyphs, $glyphToChar, $scale);
572
+
573
+ ///////////////////////////////////
574
+ // loca - Index to location
575
+ ///////////////////////////////////
576
+ $this->getLOCA($indexToLocFormat, $numGlyphs);
577
+
578
+ $subsetglyphs = array(0=>0);
579
+ $subsetCharToGlyph = array();
580
+ foreach($subset AS $code) {
581
+ if (isset($this->charToGlyph[$code])) {
582
+ $subsetglyphs[$this->charToGlyph[$code]] = $code; // Old Glyph ID => Unicode
583
+ $subsetCharToGlyph[$code] = $this->charToGlyph[$code]; // Unicode to old GlyphID
584
+
585
+ }
586
+ $this->maxUni = max($this->maxUni, $code);
587
+ }
588
+
589
+ list($start,$dummy) = $this->get_table_pos('glyf');
590
+
591
+ $glyphSet = array();
592
+ ksort($subsetglyphs);
593
+ $n = 0;
594
+ $fsLastCharIndex = 0; // maximum Unicode index (character code) in this font, according to the cmap subtable for platform ID 3 and platform- specific encoding ID 0 or 1.
595
+ foreach($subsetglyphs AS $originalGlyphIdx => $uni) {
596
+ $fsLastCharIndex = max($fsLastCharIndex , $uni);
597
+ $glyphSet[$originalGlyphIdx] = $n; // old glyphID to new glyphID
598
+ $n++;
599
+ }
600
+
601
+ ksort($subsetCharToGlyph);
602
+ foreach($subsetCharToGlyph AS $uni => $originalGlyphIdx) {
603
+ $codeToGlyph[$uni] = $glyphSet[$originalGlyphIdx] ;
604
+ }
605
+ $this->codeToGlyph = $codeToGlyph;
606
+
607
+ ksort($subsetglyphs);
608
+ foreach($subsetglyphs AS $originalGlyphIdx => $uni) {
609
+ $this->getGlyphs($originalGlyphIdx, $start, $glyphSet, $subsetglyphs);
610
+ }
611
+
612
+ $numGlyphs = $numberOfHMetrics = count($subsetglyphs );
613
+
614
+ //tables copied from the original
615
+ $tags = array ('name');
616
+ foreach($tags AS $tag) { $this->add($tag, $this->get_table($tag)); }
617
+ $tags = array ('cvt ', 'fpgm', 'prep', 'gasp');
618
+ foreach($tags AS $tag) {
619
+ if (isset($this->tables[$tag])) { $this->add($tag, $this->get_table($tag)); }
620
+ }
621
+
622
+ // post - PostScript
623
+ $opost = $this->get_table('post');
624
+ $post = "\x00\x03\x00\x00" . substr($opost,4,12) . "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
625
+ $this->add('post', $post);
626
+
627
+ // Sort CID2GID map into segments of contiguous codes
628
+ ksort($codeToGlyph);
629
+ unset($codeToGlyph[0]);
630
+ //unset($codeToGlyph[65535]);
631
+ $rangeid = 0;
632
+ $range = array();
633
+ $prevcid = -2;
634
+ $prevglidx = -1;
635
+ // for each character
636
+ foreach ($codeToGlyph as $cid => $glidx) {
637
+ if ($cid == ($prevcid + 1) && $glidx == ($prevglidx + 1)) {
638
+ $range[$rangeid][] = $glidx;
639
+ } else {
640
+ // new range
641
+ $rangeid = $cid;
642
+ $range[$rangeid] = array();
643
+ $range[$rangeid][] = $glidx;
644
+ }
645
+ $prevcid = $cid;
646
+ $prevglidx = $glidx;
647
+ }
648
+
649
+ // cmap - Character to glyph mapping - Format 4 (MS / )
650
+ $segCount = count($range) + 1; // + 1 Last segment has missing character 0xFFFF
651
+ $searchRange = 1;
652
+ $entrySelector = 0;
653
+ while ($searchRange * 2 <= $segCount ) {
654
+ $searchRange = $searchRange * 2;
655
+ $entrySelector = $entrySelector + 1;
656
+ }
657
+ $searchRange = $searchRange * 2;
658
+ $rangeShift = $segCount * 2 - $searchRange;
659
+ $length = 16 + (8*$segCount ) + ($numGlyphs+1);
660
+ $cmap = array(0, 1, // Index : version, number of encoding subtables
661
+ 3, 1, // Encoding Subtable : platform (MS=3), encoding (Unicode)
662
+ 0, 12, // Encoding Subtable : offset (hi,lo)
663
+ 4, $length, 0, // Format 4 Mapping subtable: format, length, language
664
+ $segCount*2,
665
+ $searchRange,
666
+ $entrySelector,
667
+ $rangeShift);
668
+
669
+ // endCode(s)
670
+ foreach($range AS $start=>$subrange) {
671
+ $endCode = $start + (count($subrange)-1);
672
+ $cmap[] = $endCode; // endCode(s)
673
+ }
674
+ $cmap[] = 0xFFFF; // endCode of last Segment
675
+ $cmap[] = 0; // reservedPad
676
+
677
+ // startCode(s)
678
+ foreach($range AS $start=>$subrange) {
679
+ $cmap[] = $start; // startCode(s)
680
+ }
681
+ $cmap[] = 0xFFFF; // startCode of last Segment
682
+ // idDelta(s)
683
+ foreach($range AS $start=>$subrange) {
684
+ $idDelta = -($start-$subrange[0]);
685
+ $n += count($subrange);
686
+ $cmap[] = $idDelta; // idDelta(s)
687
+ }
688
+ $cmap[] = 1; // idDelta of last Segment
689
+ // idRangeOffset(s)
690
+ foreach($range AS $subrange) {
691
+ $cmap[] = 0; // idRangeOffset[segCount] Offset in bytes to glyph indexArray, or 0
692
+
693
+ }
694
+ $cmap[] = 0; // idRangeOffset of last Segment
695
+ foreach($range AS $subrange) {
696
+ foreach($subrange AS $glidx) {
697
+ $cmap[] = $glidx;
698
+ }
699
+ }
700
+ $cmap[] = 0; // Mapping for last character
701
+ $cmapstr = '';
702
+ foreach($cmap AS $cm) { $cmapstr .= pack("n",$cm); }
703
+ $this->add('cmap', $cmapstr);
704
+
705
+
706
+ // glyf - Glyph data
707
+ list($glyfOffset,$glyfLength) = $this->get_table_pos('glyf');
708
+ if ($glyfLength < $this->maxStrLenRead) {
709
+ $glyphData = $this->get_table('glyf');
710
+ }
711
+
712
+ $offsets = array();
713
+ $glyf = '';
714
+ $pos = 0;
715
+
716
+ $hmtxstr = '';
717
+ $xMinT = 0;
718
+ $yMinT = 0;
719
+ $xMaxT = 0;
720
+ $yMaxT = 0;
721
+ $advanceWidthMax = 0;
722
+ $minLeftSideBearing = 0;
723
+ $minRightSideBearing = 0;
724
+ $xMaxExtent = 0;
725
+ $maxPoints = 0; // points in non-compound glyph
726
+ $maxContours = 0; // contours in non-compound glyph
727
+ $maxComponentPoints = 0; // points in compound glyph
728
+ $maxComponentContours = 0; // contours in compound glyph
729
+ $maxComponentElements = 0; // number of glyphs referenced at top level
730
+ $maxComponentDepth = 0; // levels of recursion, set to 0 if font has only simple glyphs
731
+ $this->glyphdata = array();
732
+
733
+ foreach($subsetglyphs AS $originalGlyphIdx => $uni) {
734
+ // hmtx - Horizontal Metrics
735
+ $hm = $this->getHMetric($orignHmetrics, $originalGlyphIdx);
736
+ $hmtxstr .= $hm;
737
+
738
+ $offsets[] = $pos;
739
+ $glyphPos = $this->glyphPos[$originalGlyphIdx];
740
+ $glyphLen = $this->glyphPos[$originalGlyphIdx + 1] - $glyphPos;
741
+ if ($glyfLength < $this->maxStrLenRead) {
742
+ $data = substr($glyphData,$glyphPos,$glyphLen);
743
+ }
744
+ else {
745
+ if ($glyphLen > 0) $data = $this->get_chunk($glyfOffset+$glyphPos,$glyphLen);
746
+ else $data = '';
747
+ }
748
+
749
+ if ($glyphLen > 0) {
750
+ $up = unpack("n", substr($data,0,2));
751
+ }
752
+
753
+ if ($glyphLen > 2 && ($up[1] & (1 << 15)) ) { // If number of contours <= -1 i.e. composiste glyph
754
+ $pos_in_glyph = 10;
755
+ $flags = GF_MORE;
756
+ $nComponentElements = 0;
757
+ while ($flags & GF_MORE) {
758
+ $nComponentElements += 1; // number of glyphs referenced at top level
759
+ $up = unpack("n", substr($data,$pos_in_glyph,2));
760
+ $flags = $up[1];
761
+ $up = unpack("n", substr($data,$pos_in_glyph+2,2));
762
+ $glyphIdx = $up[1];
763
+ $this->glyphdata[$originalGlyphIdx]['compGlyphs'][] = $glyphIdx;
764
+ $data = $this->_set_ushort($data, $pos_in_glyph + 2, $glyphSet[$glyphIdx]);
765
+ $pos_in_glyph += 4;
766
+ if ($flags & GF_WORDS) { $pos_in_glyph += 4; }
767
+ else { $pos_in_glyph += 2; }
768
+ if ($flags & GF_SCALE) { $pos_in_glyph += 2; }
769
+ else if ($flags & GF_XYSCALE) { $pos_in_glyph += 4; }
770
+ else if ($flags & GF_TWOBYTWO) { $pos_in_glyph += 8; }
771
+ }
772
+ $maxComponentElements = max($maxComponentElements, $nComponentElements);
773
+ }
774
+
775
+ $glyf .= $data;
776
+ $pos += $glyphLen;
777
+ if ($pos % 4 != 0) {
778
+ $padding = 4 - ($pos % 4);
779
+ $glyf .= str_repeat("\0",$padding);
780
+ $pos += $padding;
781
+ }
782
+ }
783
+
784
+ $offsets[] = $pos;
785
+ $this->add('glyf', $glyf);
786
+
787
+ // hmtx - Horizontal Metrics
788
+ $this->add('hmtx', $hmtxstr);
789
+
790
+ // loca - Index to location
791
+ $locastr = '';
792
+ if ((($pos + 1) >> 1) > 0xFFFF) {
793
+ $indexToLocFormat = 1; // long format
794
+ foreach($offsets AS $offset) { $locastr .= pack("N",$offset); }
795
+ }
796
+ else {
797
+ $indexToLocFormat = 0; // short format
798
+ foreach($offsets AS $offset) { $locastr .= pack("n",($offset/2)); }
799
+ }
800
+ $this->add('loca', $locastr);
801
+
802
+ // head - Font header
803
+ $head = $this->get_table('head');
804
+ $head = $this->_set_ushort($head, 50, $indexToLocFormat);
805
+ $this->add('head', $head);
806
+
807
+
808
+ // hhea - Horizontal Header
809
+ $hhea = $this->get_table('hhea');
810
+ $hhea = $this->_set_ushort($hhea, 34, $numberOfHMetrics);
811
+ $this->add('hhea', $hhea);
812
+
813
+ // maxp - Maximum Profile
814
+ $maxp = $this->get_table('maxp');
815
+ $maxp = $this->_set_ushort($maxp, 4, $numGlyphs);
816
+ $this->add('maxp', $maxp);
817
+
818
+
819
+ // OS/2 - OS/2
820
+ $os2 = $this->get_table('OS/2');
821
+ $this->add('OS/2', $os2 );
822
+
823
+ fclose($this->fh);
824
+
825
+ // Put the TTF file together
826
+ $stm = '';
827
+ $this->endTTFile($stm);
828
+ return $stm ;
829
+ }
830
+
831
+ //////////////////////////////////////////////////////////////////////////////////
832
+ // Recursively get composite glyph data
833
+ function getGlyphData($originalGlyphIdx, &$maxdepth, &$depth, &$points, &$contours) {
834
+ $depth++;
835
+ $maxdepth = max($maxdepth, $depth);
836
+ if (count($this->glyphdata[$originalGlyphIdx]['compGlyphs'])) {
837
+ foreach($this->glyphdata[$originalGlyphIdx]['compGlyphs'] AS $glyphIdx) {
838
+ $this->getGlyphData($glyphIdx, $maxdepth, $depth, $points, $contours);
839
+ }
840
+ }
841
+ else if (($this->glyphdata[$originalGlyphIdx]['nContours'] > 0) && $depth > 0) { // simple
842
+ $contours += $this->glyphdata[$originalGlyphIdx]['nContours'];
843
+ $points += $this->glyphdata[$originalGlyphIdx]['nPoints'];
844
+ }
845
+ $depth--;
846
+ }
847
+
848
+
849
+ //////////////////////////////////////////////////////////////////////////////////
850
+ // Recursively get composite glyphs
851
+ function getGlyphs($originalGlyphIdx, &$start, &$glyphSet, &$subsetglyphs) {
852
+ $glyphPos = $this->glyphPos[$originalGlyphIdx];
853
+ $glyphLen = $this->glyphPos[$originalGlyphIdx + 1] - $glyphPos;
854
+ if (!$glyphLen) {
855
+ return;
856
+ }
857
+ $this->seek($start + $glyphPos);
858
+ $numberOfContours = $this->read_short();
859
+ if ($numberOfContours < 0) {
860
+ $this->skip(8);
861
+ $flags = GF_MORE;
862
+ while ($flags & GF_MORE) {
863
+ $flags = $this->read_ushort();
864
+ $glyphIdx = $this->read_ushort();
865
+ if (!isset($glyphSet[$glyphIdx])) {
866
+ $glyphSet[$glyphIdx] = count($subsetglyphs); // old glyphID to new glyphID
867
+ $subsetglyphs[$glyphIdx] = true;
868
+ }
869
+ $savepos = ftell($this->fh);
870
+ $this->getGlyphs($glyphIdx, $start, $glyphSet, $subsetglyphs);
871
+ $this->seek($savepos);
872
+ if ($flags & GF_WORDS)
873
+ $this->skip(4);
874
+ else
875
+ $this->skip(2);
876
+ if ($flags & GF_SCALE)
877
+ $this->skip(2);
878
+ else if ($flags & GF_XYSCALE)
879
+ $this->skip(4);
880
+ else if ($flags & GF_TWOBYTWO)
881
+ $this->skip(8);
882
+ }
883
+ }
884
+ }
885
+
886
+ //////////////////////////////////////////////////////////////////////////////////
887
+
888
+ function getHMTX($numberOfHMetrics, $numGlyphs, &$glyphToChar, $scale) {
889
+ $start = $this->seek_table("hmtx");
890
+ $aw = 0;
891
+ $this->charWidths = str_pad('', 256*256*2, "\x00");
892
+ $nCharWidths = 0;
893
+ if (($numberOfHMetrics*4) < $this->maxStrLenRead) {
894
+ $data = $this->get_chunk($start,($numberOfHMetrics*4));
895
+ $arr = unpack("n*", $data);
896
+ }
897
+ else { $this->seek($start); }
898
+ for( $glyph=0; $glyph<$numberOfHMetrics; $glyph++) {
899
+
900
+ if (($numberOfHMetrics*4) < $this->maxStrLenRead) {
901
+ $aw = $arr[($glyph*2)+1];
902
+ }
903
+ else {
904
+ $aw = $this->read_ushort();
905
+ $lsb = $this->read_ushort();
906
+ }
907
+ if (isset($glyphToChar[$glyph]) || $glyph == 0) {
908
+
909
+ if ($aw >= (1 << 15) ) { $aw = 0; } // 1.03 Some (arabic) fonts have -ve values for width
910
+ // although should be unsigned value - comes out as e.g. 65108 (intended -50)
911
+ if ($glyph == 0) {
912
+ $this->defaultWidth = $scale*$aw;
913
+ continue;
914
+ }
915
+ foreach($glyphToChar[$glyph] AS $char) {
916
+ if ($char != 0 && $char != 65535) {
917
+ $w = intval(round($scale*$aw));
918
+ if ($w == 0) { $w = 65535; }
919
+ if ($char < 196608) {
920
+ $this->charWidths[$char*2] = chr($w >> 8);
921
+ $this->charWidths[$char*2 + 1] = chr($w & 0xFF);
922
+ $nCharWidths++;
923
+ }
924
+ }
925
+ }
926
+ }
927
+ }
928
+ $data = $this->get_chunk(($start+$numberOfHMetrics*4),($numGlyphs*2));
929
+ $arr = unpack("n*", $data);
930
+ $diff = $numGlyphs-$numberOfHMetrics;
931
+ for( $pos=0; $pos<$diff; $pos++) {
932
+ $glyph = $pos + $numberOfHMetrics;
933
+ if (isset($glyphToChar[$glyph])) {
934
+ foreach($glyphToChar[$glyph] AS $char) {
935
+ if ($char != 0 && $char != 65535) {
936
+ $w = intval(round($scale*$aw));
937
+ if ($w == 0) { $w = 65535; }
938
+ if ($char < 196608) {
939
+ $this->charWidths[$char*2] = chr($w >> 8);
940
+ $this->charWidths[$char*2 + 1] = chr($w & 0xFF);
941
+ $nCharWidths++;
942
+ }
943
+ }
944
+ }
945
+ }
946
+ }
947
+ // NB 65535 is a set width of 0
948
+ // First bytes define number of chars in font
949
+ $this->charWidths[0] = chr($nCharWidths >> 8);
950
+ $this->charWidths[1] = chr($nCharWidths & 0xFF);
951
+ }
952
+
953
+ function getHMetric($numberOfHMetrics, $gid) {
954
+ $start = $this->seek_table("hmtx");
955
+ if ($gid < $numberOfHMetrics) {
956
+ $this->seek($start+($gid*4));
957
+ $hm = fread($this->fh,4);
958
+ }
959
+ else {
960
+ $this->seek($start+(($numberOfHMetrics-1)*4));
961
+ $hm = fread($this->fh,2);
962
+ $this->seek($start+($numberOfHMetrics*2)+($gid*2));
963
+ $hm .= fread($this->fh,2);
964
+ }
965
+ return $hm;
966
+ }
967
+
968
+ function getLOCA($indexToLocFormat, $numGlyphs) {
969
+ $start = $this->seek_table('loca');
970
+ $this->glyphPos = array();
971
+ if ($indexToLocFormat == 0) {
972
+ $data = $this->get_chunk($start,($numGlyphs*2)+2);
973
+ $arr = unpack("n*", $data);
974
+ for ($n=0; $n<=$numGlyphs; $n++) {
975
+ $this->glyphPos[] = ($arr[$n+1] * 2);
976
+ }
977
+ }
978
+ else if ($indexToLocFormat == 1) {
979
+ $data = $this->get_chunk($start,($numGlyphs*4)+4);
980
+ $arr = unpack("N*", $data);
981
+ for ($n=0; $n<=$numGlyphs; $n++) {
982
+ $this->glyphPos[] = ($arr[$n+1]);
983
+ }
984
+ }
985
+ else
986
+ die('Unknown location table format '.$indexToLocFormat);
987
+ }
988
+
989
+
990
+ // CMAP Format 4
991
+ function getCMAP4($unicode_cmap_offset, &$glyphToChar, &$charToGlyph ) {
992
+ $this->maxUniChar = 0;
993
+ $this->seek($unicode_cmap_offset + 2);
994
+ $length = $this->read_ushort();
995
+ $limit = $unicode_cmap_offset + $length;
996
+ $this->skip(2);
997
+
998
+ $segCount = $this->read_ushort() / 2;
999
+ $this->skip(6);
1000
+ $endCount = array();
1001
+ for($i=0; $i<$segCount; $i++) { $endCount[] = $this->read_ushort(); }
1002
+ $this->skip(2);
1003
+ $startCount = array();
1004
+ for($i=0; $i<$segCount; $i++) { $startCount[] = $this->read_ushort(); }
1005
+ $idDelta = array();
1006
+ for($i=0; $i<$segCount; $i++) { $idDelta[] = $this->read_short(); } // ???? was unsigned short
1007
+ $idRangeOffset_start = $this->_pos;
1008
+ $idRangeOffset = array();
1009
+ for($i=0; $i<$segCount; $i++) { $idRangeOffset[] = $this->read_ushort(); }
1010
+
1011
+ for ($n=0;$n<$segCount;$n++) {
1012
+ $endpoint = ($endCount[$n] + 1);
1013
+ for ($unichar=$startCount[$n];$unichar<$endpoint;$unichar++) {
1014
+ if ($idRangeOffset[$n] == 0)
1015
+ $glyph = ($unichar + $idDelta[$n]) & 0xFFFF;
1016
+ else {
1017
+ $offset = ($unichar - $startCount[$n]) * 2 + $idRangeOffset[$n];
1018
+ $offset = $idRangeOffset_start + 2 * $n + $offset;
1019
+ if ($offset >= $limit)
1020
+ $glyph = 0;
1021
+ else {
1022
+ $glyph = $this->get_ushort($offset);
1023
+ if ($glyph != 0)
1024
+ $glyph = ($glyph + $idDelta[$n]) & 0xFFFF;
1025
+ }
1026
+ }
1027
+ $charToGlyph[$unichar] = $glyph;
1028
+ if ($unichar < 196608) { $this->maxUniChar = max($unichar,$this->maxUniChar); }
1029
+ $glyphToChar[$glyph][] = $unichar;
1030
+ }
1031
+ }
1032
+ }
1033
+
1034
+
1035
+ // Put the TTF file together
1036
+ function endTTFile(&$stm) {
1037
+ $stm = '';
1038
+ $numTables = count($this->otables);
1039
+ $searchRange = 1;
1040
+ $entrySelector = 0;
1041
+ while ($searchRange * 2 <= $numTables) {
1042
+ $searchRange = $searchRange * 2;
1043
+ $entrySelector = $entrySelector + 1;
1044
+ }
1045
+ $searchRange = $searchRange * 16;
1046
+ $rangeShift = $numTables * 16 - $searchRange;
1047
+
1048
+ // Header
1049
+ if (_TTF_MAC_HEADER) {
1050
+ $stm .= (pack("Nnnnn", 0x74727565, $numTables, $searchRange, $entrySelector, $rangeShift)); // Mac
1051
+ }
1052
+ else {
1053
+ $stm .= (pack("Nnnnn", 0x00010000 , $numTables, $searchRange, $entrySelector, $rangeShift)); // Windows
1054
+ }
1055
+
1056
+ // Table directory
1057
+ $tables = $this->otables;
1058
+
1059
+ ksort ($tables);
1060
+ $offset = 12 + $numTables * 16;
1061
+ foreach ($tables AS $tag=>$data) {
1062
+ if ($tag == 'head') { $head_start = $offset; }
1063
+ $stm .= $tag;
1064
+ $checksum = $this->calcChecksum($data);
1065
+ $stm .= pack("nn", $checksum[0],$checksum[1]);
1066
+ $stm .= pack("NN", $offset, strlen($data));
1067
+ $paddedLength = (strlen($data)+3)&~3;
1068
+ $offset = $offset + $paddedLength;
1069
+ }
1070
+
1071
+ // Table data
1072
+ foreach ($tables AS $tag=>$data) {
1073
+ $data .= "\0\0\0";
1074
+ $stm .= substr($data,0,(strlen($data)&~3));
1075
+ }
1076
+
1077
+ $checksum = $this->calcChecksum($stm);
1078
+ $checksum = $this->sub32(array(0xB1B0,0xAFBA), $checksum);
1079
+ $chk = pack("nn", $checksum[0],$checksum[1]);
1080
+ $stm = $this->splice($stm,($head_start + 8),$chk);
1081
+ return $stm ;
1082
+ }
1083
+ }
app/api/TFPDF/font/zapfdingbats.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $type = 'Core';
3
+ $name = 'ZapfDingbats';
4
+ $up = -100;
5
+ $ut = 50;
6
+ $cw = array(
7
+ chr(0)=>0,chr(1)=>0,chr(2)=>0,chr(3)=>0,chr(4)=>0,chr(5)=>0,chr(6)=>0,chr(7)=>0,chr(8)=>0,chr(9)=>0,chr(10)=>0,chr(11)=>0,chr(12)=>0,chr(13)=>0,chr(14)=>0,chr(15)=>0,chr(16)=>0,chr(17)=>0,chr(18)=>0,chr(19)=>0,chr(20)=>0,chr(21)=>0,
8
+ chr(22)=>0,chr(23)=>0,chr(24)=>0,chr(25)=>0,chr(26)=>0,chr(27)=>0,chr(28)=>0,chr(29)=>0,chr(30)=>0,chr(31)=>0,' '=>278,'!'=>974,'"'=>961,'#'=>974,'$'=>980,'%'=>719,'&'=>789,'\''=>790,'('=>791,')'=>690,'*'=>960,'+'=>939,
9
+ ','=>549,'-'=>855,'.'=>911,'/'=>933,'0'=>911,'1'=>945,'2'=>974,'3'=>755,'4'=>846,'5'=>762,'6'=>761,'7'=>571,'8'=>677,'9'=>763,':'=>760,';'=>759,'<'=>754,'='=>494,'>'=>552,'?'=>537,'@'=>577,'A'=>692,
10
+ 'B'=>786,'C'=>788,'D'=>788,'E'=>790,'F'=>793,'G'=>794,'H'=>816,'I'=>823,'J'=>789,'K'=>841,'L'=>823,'M'=>833,'N'=>816,'O'=>831,'P'=>923,'Q'=>744,'R'=>723,'S'=>749,'T'=>790,'U'=>792,'V'=>695,'W'=>776,
11
+ 'X'=>768,'Y'=>792,'Z'=>759,'['=>707,'\\'=>708,']'=>682,'^'=>701,'_'=>826,'`'=>815,'a'=>789,'b'=>789,'c'=>707,'d'=>687,'e'=>696,'f'=>689,'g'=>786,'h'=>787,'i'=>713,'j'=>791,'k'=>785,'l'=>791,'m'=>873,
12
+ 'n'=>761,'o'=>762,'p'=>762,'q'=>759,'r'=>759,'s'=>892,'t'=>892,'u'=>788,'v'=>784,'w'=>438,'x'=>138,'y'=>277,'z'=>415,'{'=>392,'|'=>392,'}'=>668,'~'=>668,chr(127)=>0,chr(128)=>390,chr(129)=>390,chr(130)=>317,chr(131)=>317,
13
+ chr(132)=>276,chr(133)=>276,chr(134)=>509,chr(135)=>509,chr(136)=>410,chr(137)=>410,chr(138)=>234,chr(139)=>234,chr(140)=>334,chr(141)=>334,chr(142)=>0,chr(143)=>0,chr(144)=>0,chr(145)=>0,chr(146)=>0,chr(147)=>0,chr(148)=>0,chr(149)=>0,chr(150)=>0,chr(151)=>0,chr(152)=>0,chr(153)=>0,
14
+ chr(154)=>0,chr(155)=>0,chr(156)=>0,chr(157)=>0,chr(158)=>0,chr(159)=>0,chr(160)=>0,chr(161)=>732,chr(162)=>544,chr(163)=>544,chr(164)=>910,chr(165)=>667,chr(166)=>760,chr(167)=>760,chr(168)=>776,chr(169)=>595,chr(170)=>694,chr(171)=>626,chr(172)=>788,chr(173)=>788,chr(174)=>788,chr(175)=>788,
15
+ chr(176)=>788,chr(177)=>788,chr(178)=>788,chr(179)=>788,chr(180)=>788,chr(181)=>788,chr(182)=>788,chr(183)=>788,chr(184)=>788,chr(185)=>788,chr(186)=>788,chr(187)=>788,chr(188)=>788,chr(189)=>788,chr(190)=>788,chr(191)=>788,chr(192)=>788,chr(193)=>788,chr(194)=>788,chr(195)=>788,chr(196)=>788,chr(197)=>788,
16
+ chr(198)=>788,chr(199)=>788,chr(200)=>788,chr(201)=>788,chr(202)=>788,chr(203)=>788,chr(204)=>788,chr(205)=>788,chr(206)=>788,chr(207)=>788,chr(208)=>788,chr(209)=>788,chr(210)=>788,chr(211)=>788,chr(212)=>894,chr(213)=>838,chr(214)=>1016,chr(215)=>458,chr(216)=>748,chr(217)=>924,chr(218)=>748,chr(219)=>918,
17
+ chr(220)=>927,chr(221)=>928,chr(222)=>928,chr(223)=>834,chr(224)=>873,chr(225)=>828,chr(226)=>924,chr(227)=>924,chr(228)=>917,chr(229)=>930,chr(230)=>931,chr(231)=>463,chr(232)=>883,chr(233)=>836,chr(234)=>836,chr(235)=>867,chr(236)=>867,chr(237)=>696,chr(238)=>696,chr(239)=>874,chr(240)=>0,chr(241)=>874,
18
+ chr(242)=>760,chr(243)=>946,chr(244)=>771,chr(245)=>865,chr(246)=>771,chr(247)=>888,chr(248)=>967,chr(249)=>888,chr(250)=>831,chr(251)=>873,chr(252)=>927,chr(253)=>970,chr(254)=>918,chr(255)=>0);
19
+ ?>
app/api/TFPDF/tfpdf.php ADDED
@@ -0,0 +1,2299 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /** no direct access **/
3
+ defined('MECEXEC') or die();
4
+
5
+ /**
6
+ * tFPDF (based on FPDF 1.7)
7
+ *
8
+ * Version: 1.24
9
+ * Date: 2011-09-24
10
+ * Author: Ian Back <ianb@bpm1.com>
11
+ * License: LGPL
12
+ */
13
+
14
+ define('tFPDF_VERSION','1.24');
15
+
16
+ class tFPDF
17
+ {
18
+ var $unifontSubset;
19
+ var $page; // current page number
20
+ var $n; // current object number
21
+ var $offsets; // array of object offsets
22
+ var $buffer; // buffer holding in-memory PDF
23
+ var $pages; // array containing pages
24
+ var $state; // current document state
25
+ var $compress; // compression flag
26
+ var $k; // scale factor (number of points in user unit)
27
+ var $DefOrientation; // default orientation
28
+ var $CurOrientation; // current orientation
29
+ var $StdPageSizes; // standard page sizes
30
+ var $DefPageSize; // default page size
31
+ var $CurPageSize; // current page size
32
+ var $PageSizes; // used for pages with non default sizes or orientations
33
+ var $wPt, $hPt; // dimensions of current page in points
34
+ var $w, $h; // dimensions of current page in user unit
35
+ var $lMargin; // left margin
36
+ var $tMargin; // top margin
37
+ var $rMargin; // right margin
38
+ var $bMargin; // page break margin
39
+ var $cMargin; // cell margin
40
+ var $x, $y; // current position in user unit
41
+ var $lasth; // height of last printed cell
42
+ var $LineWidth; // line width in user unit
43
+ var $fontpath; // path containing fonts
44
+ var $CoreFonts; // array of core font names
45
+ var $fonts; // array of used fonts
46
+ var $FontFiles; // array of font files
47
+ var $diffs; // array of encoding differences
48
+ var $FontFamily; // current font family
49
+ var $FontStyle; // current font style
50
+ var $underline; // underlining flag
51
+ var $CurrentFont; // current font info
52
+ var $FontSizePt; // current font size in points
53
+ var $FontSize; // current font size in user unit
54
+ var $DrawColor; // commands for drawing color
55
+ var $FillColor; // commands for filling color
56
+ var $TextColor; // commands for text color
57
+ var $ColorFlag; // indicates whether fill and text colors are different
58
+ var $ws; // word spacing
59
+ var $images; // array of used images
60
+ var $PageLinks; // array of links in pages
61
+ var $links; // array of internal links
62
+ var $AutoPageBreak; // automatic page breaking
63
+ var $PageBreakTrigger; // threshold used to trigger page breaks
64
+ var $InHeader; // flag set when processing header
65
+ var $InFooter; // flag set when processing footer
66
+ var $ZoomMode; // zoom display mode
67
+ var $LayoutMode; // layout display mode
68
+ var $title; // title
69
+ var $subject; // subject
70
+ var $author; // author
71
+ var $keywords; // keywords
72
+ var $creator; // creator
73
+ var $AliasNbPages; // alias for total number of pages
74
+ var $PDFVersion; // PDF version number
75
+
76
+ /*******************************************************************************
77
+ * *
78
+ * Public methods *
79
+ * *
80
+ *******************************************************************************/
81
+ function __construct($orientation='P', $unit='mm', $size='A4')
82
+ {
83
+ // Some checks
84
+ $this->_dochecks();
85
+ // Initialization of properties
86
+ $this->page = 0;
87
+ $this->n = 2;
88
+ $this->buffer = '';
89
+ $this->pages = array();
90
+ $this->PageSizes = array();
91
+ $this->state = 0;
92
+ $this->fonts = array();
93
+ $this->FontFiles = array();
94
+ $this->diffs = array();
95
+ $this->images = array();
96
+ $this->links = array();
97
+ $this->InHeader = false;
98
+ $this->InFooter = false;
99
+ $this->lasth = 0;
100
+ $this->FontFamily = '';
101
+ $this->FontStyle = '';
102
+ $this->FontSizePt = 12;
103
+ $this->underline = false;
104
+ $this->DrawColor = '0 G';
105
+ $this->FillColor = '0 g';
106
+ $this->TextColor = '0 g';
107
+ $this->ColorFlag = false;
108
+ $this->ws = 0;
109
+ // Font path
110
+ if(defined('FPDF_FONTPATH'))
111
+ {
112
+ $this->fontpath = FPDF_FONTPATH;
113
+ if(substr($this->fontpath,-1)!='/' && substr($this->fontpath,-1)!='\\')
114
+ $this->fontpath .= '/';
115
+ }
116
+ elseif(is_dir(dirname(__FILE__).'/font'))
117
+ $this->fontpath = dirname(__FILE__).'/font/';
118
+ else
119
+ $this->fontpath = '';
120
+ // Core fonts
121
+ $this->CoreFonts = array('courier', 'helvetica', 'times', 'symbol', 'zapfdingbats');
122
+ // Scale factor
123
+ if($unit=='pt')
124
+ $this->k = 1;
125
+ elseif($unit=='mm')
126
+ $this->k = 72/25.4;
127
+ elseif($unit=='cm')
128
+ $this->k = 72/2.54;
129
+ elseif($unit=='in')
130
+ $this->k = 72;
131
+ else
132
+ $this->Error('Incorrect unit: '.$unit);
133
+ // Page sizes
134
+ $this->StdPageSizes = array('a3'=>array(841.89,1190.55), 'a4'=>array(595.28,841.89), 'a5'=>array(420.94,595.28),
135
+ 'letter'=>array(612,792), 'legal'=>array(612,1008));
136
+ $size = $this->_getpagesize($size);
137
+ $this->DefPageSize = $size;
138
+ $this->CurPageSize = $size;
139
+ // Page orientation
140
+ $orientation = strtolower($orientation);
141
+ if($orientation=='p' || $orientation=='portrait')
142
+ {
143
+ $this->DefOrientation = 'P';
144
+ $this->w = $size[0];
145
+ $this->h = $size[1];
146
+ }
147
+ elseif($orientation=='l' || $orientation=='landscape')
148
+ {
149
+ $this->DefOrientation = 'L';
150
+ $this->w = $size[1];
151
+ $this->h = $size[0];
152
+ }
153
+ else
154
+ $this->Error('Incorrect orientation: '.$orientation);
155
+ $this->CurOrientation = $this->DefOrientation;
156
+ $this->wPt = $this->w*$this->k;
157
+ $this->hPt = $this->h*$this->k;
158
+ // Page margins (1 cm)
159
+ $margin = 28.35/$this->k;
160
+ $this->SetMargins($margin,$margin);
161
+ // Interior cell margin (1 mm)
162
+ $this->cMargin = $margin/10;
163
+ // Line width (0.2 mm)
164
+ $this->LineWidth = .567/$this->k;
165
+ // Automatic page break
166
+ $this->SetAutoPageBreak(true,2*$margin);
167
+ // Default display mode
168
+ $this->SetDisplayMode('default');
169
+ // Enable compression
170
+ $this->SetCompression(true);
171
+ // Set default PDF version number
172
+ $this->PDFVersion = '1.3';
173
+ }
174
+
175
+ function SetMargins($left, $top, $right=null)
176
+ {
177
+ // Set left, top and right margins
178
+ $this->lMargin = $left;
179
+ $this->tMargin = $top;
180
+ if($right===null)
181
+ $right = $left;
182
+ $this->rMargin = $right;
183
+ }
184
+
185
+ function SetLeftMargin($margin)
186
+ {
187
+ // Set left margin
188
+ $this->lMargin = $margin;
189
+ if($this->page>0 && $this->x<$margin)
190
+ $this->x = $margin;
191
+ }
192
+
193
+ function SetTopMargin($margin)
194
+ {
195
+ // Set top margin
196
+ $this->tMargin = $margin;
197
+ }
198
+
199
+ function SetRightMargin($margin)
200
+ {
201
+ // Set right margin
202
+ $this->rMargin = $margin;
203
+ }
204
+
205
+ function SetAutoPageBreak($auto, $margin=0)
206
+ {
207
+ // Set auto page break mode and triggering margin
208
+ $this->AutoPageBreak = $auto;
209
+ $this->bMargin = $margin;
210
+ $this->PageBreakTrigger = $this->h-$margin;
211
+ }
212
+
213
+ function SetDisplayMode($zoom, $layout='default')
214
+ {
215
+ // Set display mode in viewer
216
+ if($zoom=='fullpage' || $zoom=='fullwidth' || $zoom=='real' || $zoom=='default' || !is_string($zoom))
217
+ $this->ZoomMode = $zoom;
218
+ else
219
+ $this->Error('Incorrect zoom display mode: '.$zoom);
220
+ if($layout=='single' || $layout=='continuous' || $layout=='two' || $layout=='default')
221
+ $this->LayoutMode = $layout;
222
+ else
223
+ $this->Error('Incorrect layout display mode: '.$layout);
224
+ }
225
+
226
+ function SetCompression($compress)
227
+ {
228
+ // Set page compression
229
+ if(function_exists('gzcompress'))
230
+ $this->compress = $compress;
231
+ else
232
+ $this->compress = false;
233
+ }
234
+
235
+ function SetTitle($title, $isUTF8=false)
236
+ {
237
+ // Title of document
238
+ if($isUTF8)
239
+ $title = $this->_UTF8toUTF16($title);
240
+ $this->title = $title;
241
+ }
242
+
243
+ function SetSubject($subject, $isUTF8=false)
244
+ {
245
+ // Subject of document
246
+ if($isUTF8)
247
+ $subject = $this->_UTF8toUTF16($subject);
248
+ $this->subject = $subject;
249
+ }
250
+
251
+ function SetAuthor($author, $isUTF8=false)
252
+ {
253
+ // Author of document
254
+ if($isUTF8)
255
+ $author = $this->_UTF8toUTF16($author);
256
+ $this->author = $author;
257
+ }
258
+
259
+ function SetKeywords($keywords, $isUTF8=false)
260
+ {
261
+ // Keywords of document
262
+ if($isUTF8)
263
+ $keywords = $this->_UTF8toUTF16($keywords);
264
+ $this->keywords = $keywords;
265
+ }
266
+
267
+ function SetCreator($creator, $isUTF8=false)
268
+ {
269
+ // Creator of document
270
+ if($isUTF8)
271
+ $creator = $this->_UTF8toUTF16($creator);
272
+ $this->creator = $creator;
273
+ }
274
+
275
+ function AliasNbPages($alias='{nb}')
276
+ {
277
+ // Define an alias for total number of pages
278
+ $this->AliasNbPages = $alias;
279
+ }
280
+
281
+ function Error($msg)
282
+ {
283
+ // Fatal error
284
+ die('<b>FPDF error:</b> '.$msg);
285
+ }
286
+
287
+ function Open()
288
+ {
289
+ // Begin document
290
+ $this->state = 1;
291
+ }
292
+
293
+ function Close()
294
+ {
295
+ // Terminate document
296
+ if($this->state==3)
297
+ return;
298
+ if($this->page==0)
299
+ $this->AddPage();
300
+ // Page footer
301
+ $this->InFooter = true;
302
+ $this->Footer();
303
+ $this->InFooter = false;
304
+ // Close page
305
+ $this->_endpage();
306
+ // Close document
307
+ $this->_enddoc();
308
+ }
309
+
310
+ function AddPage($orientation='', $size='')
311
+ {
312
+ // Start a new page
313
+ if($this->state==0)
314
+ $this->Open();
315
+ $family = $this->FontFamily;
316
+ $style = $this->FontStyle.($this->underline ? 'U' : '');
317
+ $fontsize = $this->FontSizePt;
318
+ $lw = $this->LineWidth;
319
+ $dc = $this->DrawColor;
320
+ $fc = $this->FillColor;
321
+ $tc = $this->TextColor;
322
+ $cf = $this->ColorFlag;
323
+ if($this->page>0)
324
+ {
325
+ // Page footer
326
+ $this->InFooter = true;
327
+ $this->Footer();
328
+ $this->InFooter = false;
329
+ // Close page
330
+ $this->_endpage();
331
+ }
332
+ // Start new page
333
+ $this->_beginpage($orientation,$size);
334
+ // Set line cap style to square
335
+ $this->_out('2 J');
336
+ // Set line width
337
+ $this->LineWidth = $lw;
338
+ $this->_out(sprintf('%.2F w',$lw*$this->k));
339
+ // Set font
340
+ if($family)
341
+ $this->SetFont($family,$style,$fontsize);
342
+ // Set colors
343
+ $this->DrawColor = $dc;
344
+ if($dc!='0 G')
345
+ $this->_out($dc);
346
+ $this->FillColor = $fc;
347
+ if($fc!='0 g')
348
+ $this->_out($fc);
349
+ $this->TextColor = $tc;
350
+ $this->ColorFlag = $cf;
351
+ // Page header
352
+ $this->InHeader = true;
353
+ $this->Header();
354
+ $this->InHeader = false;
355
+ // Restore line width
356
+ if($this->LineWidth!=$lw)
357
+ {
358
+ $this->LineWidth = $lw;
359
+ $this->_out(sprintf('%.2F w',$lw*$this->k));
360
+ }
361
+ // Restore font
362
+ if($family)
363
+ $this->SetFont($family,$style,$fontsize);
364
+ // Restore colors
365
+ if($this->DrawColor!=$dc)
366
+ {
367
+ $this->DrawColor = $dc;
368
+ $this->_out($dc);
369
+ }
370
+ if($this->FillColor!=$fc)
371
+ {
372
+ $this->FillColor = $fc;
373
+ $this->_out($fc);
374
+ }
375
+ $this->TextColor = $tc;
376
+ $this->ColorFlag = $cf;
377
+ }
378
+
379
+ function Header()
380
+ {
381
+ // To be implemented in your own inherited class
382
+ }
383
+
384
+ function Footer()
385
+ {
386
+ // To be implemented in your own inherited class
387
+ }
388
+
389
+ function PageNo()
390
+ {
391
+ // Get current page number
392
+ return $this->page;
393
+ }
394
+
395
+ function SetDrawColor($r, $g=null, $b=null)
396
+ {
397
+ // Set color for all stroking operations
398
+ if(($r==0 && $g==0 && $b==0) || $g===null)
399
+ $this->DrawColor = sprintf('%.3F G',$r/255);
400
+ else
401
+ $this->DrawColor = sprintf('%.3F %.3F %.3F RG',$r/255,$g/255,$b/255);
402
+ if($this->page>0)
403
+ $this->_out($this->DrawColor);
404
+ }
405
+
406
+ function SetFillColor($r, $g=null, $b=null)
407
+ {
408
+ // Set color for all filling operations
409
+ if(($r==0 && $g==0 && $b==0) || $g===null)
410
+ $this->FillColor = sprintf('%.3F g',$r/255);
411
+ else
412
+ $this->FillColor = sprintf('%.3F %.3F %.3F rg',$r/255,$g/255,$b/255);
413
+ $this->ColorFlag = ($this->FillColor!=$this->TextColor);
414
+ if($this->page>0)
415
+ $this->_out($this->FillColor);
416
+ }
417
+
418
+ function SetTextColor($r, $g=null, $b=null)
419
+ {
420
+ // Set color for text
421
+ if(($r==0 && $g==0 && $b==0) || $g===null)
422
+ $this->TextColor = sprintf('%.3F g',$r/255);
423
+ else
424
+ $this->TextColor = sprintf('%.3F %.3F %.3F rg',$r/255,$g/255,$b/255);
425
+ $this->ColorFlag = ($this->FillColor!=$this->TextColor);
426
+ }
427
+
428
+ function GetStringWidth($s)
429
+ {
430
+ // Get width of a string in the current font
431
+ $s = (string)$s;
432
+ $cw = &$this->CurrentFont['cw'];
433
+ $w=0;
434
+ if ($this->unifontSubset) {
435
+ $unicode = $this->UTF8StringToArray($s);
436
+ foreach($unicode as $char) {
437
+ if (isset($cw[$char])) { $w += (ord($cw[2*$char])<<8) + ord($cw[2*$char+1]); }
438
+ else if($char>0 && $char<128 && isset($cw[chr($char)])) { $w += $cw[chr($char)]; }
439
+ else if(isset($this->CurrentFont['desc']['MissingWidth'])) { $w += $this->CurrentFont['desc']['MissingWidth']; }
440
+ else if(isset($this->CurrentFont['MissingWidth'])) { $w += $this->CurrentFont['MissingWidth']; }
441
+ else { $w += 500; }
442
+ }
443
+ }
444
+ else {
445
+ $l = strlen($s);
446
+ for($i=0;$i<$l;$i++)
447
+ $w += $cw[$s[$i]];
448
+ }
449
+ return $w*$this->FontSize/1000;
450
+ }
451
+
452
+ function SetLineWidth($width)
453
+ {
454
+ // Set line width
455
+ $this->LineWidth = $width;
456
+ if($this->page>0)
457
+ $this->_out(sprintf('%.2F w',$width*$this->k));
458
+ }
459
+
460
+ function Line($x1, $y1, $x2, $y2)
461
+ {
462
+ // Draw a line
463
+ $this->_out(sprintf('%.2F %.2F m %.2F %.2F l S',$x1*$this->k,($this->h-$y1)*$this->k,$x2*$this->k,($this->h-$y2)*$this->k));
464
+ }
465
+
466
+ function Rect($x, $y, $w, $h, $style='')
467
+ {
468
+ // Draw a rectangle
469
+ if($style=='F')
470
+ $op = 'f';
471
+ elseif($style=='FD' || $style=='DF')
472
+ $op = 'B';
473
+ else
474
+ $op = 'S';
475
+ $this->_out(sprintf('%.2F %.2F %.2F %.2F re %s',$x*$this->k,($this->h-$y)*$this->k,$w*$this->k,-$h*$this->k,$op));
476
+ }
477
+
478
+ function AddFont($family, $style='', $file='', $uni=false)
479
+ {
480
+ // Add a TrueType, OpenType or Type1 font
481
+ $family = strtolower($family);
482
+ $style = strtoupper($style);
483
+ if($style=='IB')
484
+ $style='BI';
485
+ if($file=='') {
486
+ if ($uni) {
487
+ $file = str_replace(' ','',$family).strtolower($style).'.ttf';
488
+ }
489
+ else {
490
+ $file = str_replace(' ','',$family).strtolower($style).'.php';
491
+ }
492
+ }
493
+ $fontkey = $family.$style;
494
+ if(isset($this->fonts[$fontkey]))
495
+ return;
496
+
497
+ if ($uni) {
498
+ if (defined("_SYSTEM_TTFONTS") && file_exists(_SYSTEM_TTFONTS.$file )) { $ttffilename = _SYSTEM_TTFONTS.$file ; }
499
+ else { $ttffilename = $this->_getfontpath().'unifont/'.$file ; }
500
+ $unifilename = $this->_getfontpath().'unifont/'.strtolower(substr($file ,0,(strpos($file ,'.'))));
501
+ $name = '';
502
+ $originalsize = 0;
503
+ $ttfstat = stat($ttffilename);
504
+ if (file_exists($unifilename.'.mtx.php')) {
505
+ include($unifilename.'.mtx.php');
506
+ }
507
+ if (!isset($type) || !isset($name) || $originalsize != $ttfstat['size']) {
508
+ $ttffile = $ttffilename;
509
+ require_once($this->_getfontpath().'unifont/ttfonts.php');
510
+ $ttf = new TTFontFile();
511
+ $ttf->getMetrics($ttffile);
512
+ $cw = $ttf->charWidths;
513
+ $name = preg_replace('/[ ()]/','',$ttf->fullName);
514
+
515
+ $desc= array('Ascent'=>round($ttf->ascent),
516
+ 'Descent'=>round($ttf->descent),
517
+ 'CapHeight'=>round($ttf->capHeight),
518
+ 'Flags'=>$ttf->flags,
519
+ 'FontBBox'=>'['.round($ttf->bbox[0])." ".round($ttf->bbox[1])." ".round($ttf->bbox[2])." ".round($ttf->bbox[3]).']',
520
+ 'ItalicAngle'=>$ttf->italicAngle,
521
+ 'StemV'=>round($ttf->stemV),
522
+ 'MissingWidth'=>round($ttf->defaultWidth));
523
+ $up = round($ttf->underlinePosition);
524
+ $ut = round($ttf->underlineThickness);
525
+ $originalsize = $ttfstat['size']+0;
526
+ $type = 'TTF';
527
+ // Generate metrics .php file
528
+ $s='<?php'."\n";
529
+ $s.='$name=\''.$name."';\n";
530
+ $s.='$type=\''.$type."';\n";
531
+ $s.='$desc='.var_export($desc,true).";\n";
532
+ $s.='$up='.$up.";\n";
533
+ $s.='$ut='.$ut.";\n";
534
+ $s.='$ttffile=\''.$ttffile."';\n";
535
+ $s.='$originalsize='.$originalsize.";\n";
536
+ $s.='$fontkey=\''.$fontkey."';\n";
537
+ $s.="?>";
538
+ if (is_writable(dirname($this->_getfontpath().'unifont/'.'x'))) {
539
+ $fh = fopen($unifilename.'.mtx.php',"w");
540
+ fwrite($fh,$s,strlen($s));
541
+ fclose($fh);
542
+ $fh = fopen($unifilename.'.cw.dat',"wb");
543
+ fwrite($fh,$cw,strlen($cw));
544
+ fclose($fh);
545
+ @unlink($unifilename.'.cw127.php');
546
+ }
547
+ unset($ttf);
548
+ }
549
+ else {
550
+ $cw = @file_get_contents($unifilename.'.cw.dat');
551
+ }
552
+ $i = count($this->fonts)+1;
553
+ if(!empty($this->AliasNbPages))
554
+ $sbarr = range(0,57);
555
+ else
556
+ $sbarr = range(0,32);
557
+ $this->fonts[$fontkey] = array('i'=>$i, 'type'=>$type, 'name'=>$name, 'desc'=>$desc, 'up'=>$up, 'ut'=>$ut, 'cw'=>$cw, 'ttffile'=>$ttffile, 'fontkey'=>$fontkey, 'subset'=>$sbarr, 'unifilename'=>$unifilename);
558
+
559
+ $this->FontFiles[$fontkey]=array('length1'=>$originalsize, 'type'=>"TTF", 'ttffile'=>$ttffile);
560
+ $this->FontFiles[$file]=array('type'=>"TTF");
561
+ unset($cw);
562
+ }
563
+ else {
564
+ $info = $this->_loadfont($file);
565
+ $info['i'] = count($this->fonts)+1;
566
+ if(!empty($info['diff']))
567
+ {
568
+ // Search existing encodings
569
+ $n = array_search($info['diff'],$this->diffs);
570
+ if(!$n)
571
+ {
572
+ $n = count($this->diffs)+1;
573
+ $this->diffs[$n] = $info['diff'];
574
+ }
575
+ $info['diffn'] = $n;
576
+ }
577
+ if(!empty($info['file']))
578
+ {
579
+ // Embedded font
580
+ if($info['type']=='TrueType')
581
+ $this->FontFiles[$info['file']] = array('length1'=>$info['originalsize']);
582
+ else
583
+ $this->FontFiles[$info['file']] = array('length1'=>$info['size1'], 'length2'=>$info['size2']);
584
+ }
585
+ $this->fonts[$fontkey] = $info;
586
+ }
587
+ }
588
+
589
+ function SetFont($family, $style='', $size=0)
590
+ {
591
+ // Select a font; size given in points
592
+ if($family=='')
593
+ $family = $this->FontFamily;
594
+ else
595
+ $family = strtolower($family);
596
+ $style = strtoupper($style);
597
+ if(strpos($style,'U')!==false)
598
+ {
599
+ $this->underline = true;
600
+ $style = str_replace('U','',$style);
601
+ }
602
+ else
603
+ $this->underline = false;
604
+ if($style=='IB')
605
+ $style = 'BI';
606
+ if($size==0)
607
+ $size = $this->FontSizePt;
608
+ // Test if font is already selected
609
+ if($this->FontFamily==$family && $this->FontStyle==$style && $this->FontSizePt==$size)
610
+ return;
611
+ // Test if font is already loaded
612
+ $fontkey = $family.$style;
613
+ if(!isset($this->fonts[$fontkey]))
614
+ {
615
+ // Test if one of the core fonts
616
+ if($family=='arial')
617
+ $family = 'helvetica';
618
+ if(in_array($family,$this->CoreFonts))
619
+ {
620
+ if($family=='symbol' || $family=='zapfdingbats')
621
+ $style = '';
622
+ $fontkey = $family.$style;
623
+ if(!isset($this->fonts[$fontkey]))
624
+ $this->AddFont($family,$style);
625
+ }
626
+ else
627
+ $this->Error('Undefined font: '.$family.' '.$style);
628
+ }
629
+ // Select it
630
+ $this->FontFamily = $family;
631
+ $this->FontStyle = $style;
632
+ $this->FontSizePt = $size;
633
+ $this->FontSize = $size/$this->k;
634
+ $this->CurrentFont = &$this->fonts[$fontkey];
635
+ if ($this->fonts[$fontkey]['type']=='TTF') { $this->unifontSubset = true; }
636
+ else { $this->unifontSubset = false; }
637
+ if($this->page>0)
638
+ $this->_out(sprintf('BT /F%d %.2F Tf ET',$this->CurrentFont['i'],$this->FontSizePt));
639
+ }
640
+
641
+ function SetFontSize($size)
642
+ {
643
+ // Set font size in points
644
+ if($this->FontSizePt==$size)
645
+ return;
646
+ $this->FontSizePt = $size;
647
+ $this->FontSize = $size/$this->k;
648
+ if($this->page>0)
649
+ $this->_out(sprintf('BT /F%d %.2F Tf ET',$this->CurrentFont['i'],$this->FontSizePt));
650
+ }
651
+
652
+ function AddLink()
653
+ {
654
+ // Create a new internal link
655
+ $n = count($this->links)+1;
656
+ $this->links[$n] = array(0, 0);
657
+ return $n;
658
+ }
659
+
660
+ function SetLink($link, $y=0, $page=-1)
661
+ {
662
+ // Set destination of internal link
663
+ if($y==-1)
664
+ $y = $this->y;
665
+ if($page==-1)
666
+ $page = $this->page;
667
+ $this->links[$link] = array($page, $y);
668
+ }
669
+
670
+ function Link($x, $y, $w, $h, $link)
671
+ {
672
+ // Put a link on the page
673
+ $this->PageLinks[$this->page][] = array($x*$this->k, $this->hPt-$y*$this->k, $w*$this->k, $h*$this->k, $link);
674
+ }
675
+
676
+ function Text($x, $y, $txt)
677
+ {
678
+ // Output a string
679
+ if ($this->unifontSubset)
680
+ {
681
+ $txt2 = '('.$this->_escape($this->UTF8ToUTF16BE($txt, false)).')';
682
+ foreach($this->UTF8StringToArray($txt) as $uni)
683
+ $this->CurrentFont['subset'][$uni] = $uni;
684
+ }
685
+ else
686
+ $txt2 = '('.$this->_escape($txt).')';
687
+ $s = sprintf('BT %.2F %.2F Td %s Tj ET',$x*$this->k,($this->h-$y)*$this->k,$txt2);
688
+ if($this->underline && $txt!='')
689
+ $s .= ' '.$this->_dounderline($x,$y,$txt);
690
+ if($this->ColorFlag)
691
+ $s = 'q '.$this->TextColor.' '.$s.' Q';
692
+ $this->_out($s);
693
+ }
694
+
695
+ function AcceptPageBreak()
696
+ {
697
+ // Accept automatic page break or not
698
+ return $this->AutoPageBreak;
699
+ }
700
+
701
+ function Cell($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='')
702
+ {
703
+ // Output a cell
704
+ $k = $this->k;
705
+ if($this->y+$h>$this->PageBreakTrigger && !$this->InHeader && !$this->InFooter && $this->AcceptPageBreak())
706
+ {
707
+ // Automatic page break
708
+ $x = $this->x;
709
+ $ws = $this->ws;
710
+ if($ws>0)
711
+ {
712
+ $this->ws = 0;
713
+ $this->_out('0 Tw');
714
+ }
715
+ $this->AddPage($this->CurOrientation,$this->CurPageSize);
716
+ $this->x = $x;
717
+ if($ws>0)
718
+ {
719
+ $this->ws = $ws;
720
+ $this->_out(sprintf('%.3F Tw',$ws*$k));
721
+ }
722
+ }
723
+ if($w==0)
724
+ $w = $this->w-$this->rMargin-$this->x;
725
+ $s = '';
726
+ if($fill || $border==1)
727
+ {
728
+ if($fill)
729
+ $op = ($border==1) ? 'B' : 'f';
730
+ else
731
+ $op = 'S';
732
+ $s = sprintf('%.2F %.2F %.2F %.2F re %s ',$this->x*$k,($this->h-$this->y)*$k,$w*$k,-$h*$k,$op);
733
+ }
734
+ if(is_string($border))
735
+ {
736
+ $x = $this->x;
737
+ $y = $this->y;
738
+ if(strpos($border,'L')!==false)
739
+ $s .= sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-$y)*$k,$x*$k,($this->h-($y+$h))*$k);
740
+ if(strpos($border,'T')!==false)
741
+ $s .= sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-$y)*$k);
742
+ if(strpos($border,'R')!==false)
743
+ $s .= sprintf('%.2F %.2F m %.2F %.2F l S ',($x+$w)*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-($y+$h))*$k);
744
+ if(strpos($border,'B')!==false)
745
+ $s .= sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-($y+$h))*$k,($x+$w)*$k,($this->h-($y+$h))*$k);
746
+ }
747
+ if($txt!=='')
748
+ {
749
+ if($align=='R')
750
+ $dx = $w-$this->cMargin-$this->GetStringWidth($txt);
751
+ elseif($align=='C')
752
+ $dx = ($w-$this->GetStringWidth($txt))/2;
753
+ else
754
+ $dx = $this->cMargin;
755
+ if($this->ColorFlag)
756
+ $s .= 'q '.$this->TextColor.' ';
757
+
758
+ // If multibyte, Tw has no effect - do word spacing using an adjustment before each space
759
+ if ($this->ws && $this->unifontSubset) {
760
+ foreach($this->UTF8StringToArray($txt) as $uni)
761
+ $this->CurrentFont['subset'][$uni] = $uni;
762
+ $space = $this->_escape($this->UTF8ToUTF16BE(' ', false));
763
+ $s .= sprintf('BT 0 Tw %.2F %.2F Td [',($this->x+$dx)*$k,($this->h-($this->y+.5*$h+.3*$this->FontSize))*$k);
764
+ $t = explode(' ',$txt);
765
+ $numt = count($t);
766
+ for($i=0;$i<$numt;$i++) {
767
+ $tx = $t[$i];
768
+ $tx = '('.$this->_escape($this->UTF8ToUTF16BE($tx, false)).')';
769
+ $s .= sprintf('%s ',$tx);
770
+ if (($i+1)<$numt) {
771
+ $adj = -($this->ws*$this->k)*1000/$this->FontSizePt;
772
+ $s .= sprintf('%d(%s) ',$adj,$space);
773
+ }
774
+ }
775
+ $s .= '] TJ';
776
+ $s .= ' ET';
777
+ }
778
+ else {
779
+ if ($this->unifontSubset)
780
+ {
781
+ $txt2 = '('.$this->_escape($this->UTF8ToUTF16BE($txt, false)).')';
782
+ foreach($this->UTF8StringToArray($txt) as $uni)
783
+ $this->CurrentFont['subset'][$uni] = $uni;
784
+ }
785
+ else
786
+ $txt2='('.str_replace(')','\\)',str_replace('(','\\(',str_replace('\\','\\\\',$txt))).')';
787
+ $s .= sprintf('BT %.2F %.2F Td %s Tj ET',($this->x+$dx)*$k,($this->h-($this->y+.5*$h+.3*$this->FontSize))*$k,$txt2);
788
+ }
789
+ if($this->underline)
790
+ $s .= ' '.$this->_dounderline($this->x+$dx,$this->y+.5*$h+.3*$this->FontSize,$txt);
791
+ if($this->ColorFlag)
792
+ $s .= ' Q';
793
+ if($link)
794
+ $this->Link($this->x+$dx,$this->y+.5*$h-.5*$this->FontSize,$this->GetStringWidth($txt),$this->FontSize,$link);
795
+ }
796
+ if($s)
797
+ $this->_out($s);
798
+ $this->lasth = $h;
799
+ if($ln>0)
800
+ {
801
+ // Go to next line
802
+ $this->y += $h;
803
+ if($ln==1)
804
+ $this->x = $this->lMargin;
805
+ }
806
+ else
807
+ $this->x += $w;
808
+ }
809
+
810
+ function MultiCell($w, $h, $txt, $border=0, $align='J', $fill=false)
811
+ {
812
+ // Output text with automatic or explicit line breaks
813
+ $cw = &$this->CurrentFont['cw'];
814
+ if($w==0)
815
+ $w = $this->w-$this->rMargin-$this->x;
816
+ $wmax = ($w-2*$this->cMargin);
817
+ $s = str_replace("\r",'',$txt);
818
+ if ($this->unifontSubset) {
819
+ $nb=mb_strlen($s, 'utf-8');
820
+ while($nb>0 && mb_substr($s,$nb-1,1,'utf-8')=="\n") $nb--;
821
+ }
822
+ else {
823
+ $nb = strlen($s);
824
+ if($nb>0 && $s[$nb-1]=="\n")
825
+ $nb--;
826
+ }
827
+ $b = 0;
828
+ if($border)
829
+ {
830
+ if($border==1)
831
+ {
832
+ $border = 'LTRB';
833
+ $b = 'LRT';
834
+ $b2 = 'LR';
835
+ }
836
+ else
837
+ {
838
+ $b2 = '';
839
+ if(strpos($border,'L')!==false)
840
+ $b2 .= 'L';
841
+ if(strpos($border,'R')!==false)
842
+ $b2 .= 'R';
843
+ $b = (strpos($border,'T')!==false) ? $b2.'T' : $b2;
844
+ }
845
+ }
846
+ $sep = -1;
847
+ $i = 0;
848
+ $j = 0;
849
+ $l = 0;
850
+ $ns = 0;
851
+ $nl = 1;
852
+ while($i<$nb)
853
+ {
854
+ // Get next character
855
+ if ($this->unifontSubset) {
856
+ $c = mb_substr($s,$i,1,'UTF-8');
857
+ }
858
+ else {
859
+ $c=$s[$i];
860
+ }
861
+ if($c=="\n")
862
+ {
863
+ // Explicit line break
864
+ if($this->ws>0)
865
+ {
866
+ $this->ws = 0;
867
+ $this->_out('0 Tw');
868
+ }
869
+ if ($this->unifontSubset) {
870
+ $this->Cell($w,$h,mb_substr($s,$j,$i-$j,'UTF-8'),$b,2,$align,$fill);
871
+ }
872
+ else {
873
+ $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill);
874
+ }
875
+ $i++;
876
+ $sep = -1;
877
+ $j = $i;
878
+ $l = 0;
879
+ $ns = 0;
880
+ $nl++;
881
+ if($border && $nl==2)
882
+ $b = $b2;
883
+ continue;
884
+ }
885
+ if($c==' ')
886
+ {
887
+ $sep = $i;
888
+ $ls = $l;
889
+ $ns++;
890
+ }
891
+
892
+ if ($this->unifontSubset) { $l += $this->GetStringWidth($c); }
893
+ else { $l += $cw[$c]*$this->FontSize/1000; }
894
+
895
+ if($l>$wmax)
896
+ {
897
+ // Automatic line break
898
+ if($sep==-1)
899
+ {
900
+ if($i==$j)
901
+ $i++;
902
+ if($this->ws>0)
903
+ {
904
+ $this->ws = 0;
905
+ $this->_out('0 Tw');
906
+ }
907
+ if ($this->unifontSubset) {
908
+ $this->Cell($w,$h,mb_substr($s,$j,$i-$j,'UTF-8'),$b,2,$align,$fill);
909
+ }
910
+ else {
911
+ $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill);
912
+ }
913
+ }
914
+ else
915
+ {
916
+ if($align=='J')
917
+ {
918
+ $this->ws = ($ns>1) ? ($wmax-$ls)/($ns-1) : 0;
919
+ $this->_out(sprintf('%.3F Tw',$this->ws*$this->k));
920
+ }
921
+ if ($this->unifontSubset) {
922
+ $this->Cell($w,$h,mb_substr($s,$j,$sep-$j,'UTF-8'),$b,2,$align,$fill);
923
+ }
924
+ else {
925
+ $this->Cell($w,$h,substr($s,$j,$sep-$j),$b,2,$align,$fill);
926
+ }
927
+ $i = $sep+1;
928
+ }
929
+ $sep = -1;
930
+ $j = $i;
931
+ $l = 0;
932
+ $ns = 0;
933
+ $nl++;
934
+ if($border && $nl==2)
935
+ $b = $b2;
936
+ }
937
+ else
938
+ $i++;
939
+ }
940
+ // Last chunk
941
+ if($this->ws>0)
942
+ {
943
+ $this->ws = 0;
944
+ $this->_out('0 Tw');
945
+ }
946
+ if($border && strpos($border,'B')!==false)
947
+ $b .= 'B';
948
+ if ($this->unifontSubset) {
949
+ $this->Cell($w,$h,mb_substr($s,$j,$i-$j,'UTF-8'),$b,2,$align,$fill);
950
+ }
951
+ else {
952
+ $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill);
953
+ }
954
+ $this->x = $this->lMargin;
955
+ }
956
+
957
+ function Write($h, $txt, $link='')
958
+ {
959
+ // Output text in flowing mode
960
+ $cw = &$this->CurrentFont['cw'];
961
+ $w = $this->w-$this->rMargin-$this->x;
962
+
963
+ $wmax = ($w-2*$this->cMargin);
964
+ $s = str_replace("\r",'',$txt);
965
+ if ($this->unifontSubset) {
966
+ $nb = mb_strlen($s, 'UTF-8');
967
+ if($nb==1 && $s==" ") {
968
+ $this->x += $this->GetStringWidth($s);
969
+ return;
970
+ }
971
+ }
972
+ else {
973
+ $nb = strlen($s);
974
+ }
975
+ $sep = -1;
976
+ $i = 0;
977
+ $j = 0;
978
+ $l = 0;
979
+ $nl = 1;
980
+ while($i<$nb)
981
+ {
982
+ // Get next character
983
+ if ($this->unifontSubset) {
984
+ $c = mb_substr($s,$i,1,'UTF-8');
985
+ }
986
+ else {
987
+ $c = $s[$i];
988
+ }
989
+ if($c=="\n")
990
+ {
991
+ // Explicit line break
992
+ if ($this->unifontSubset) {
993
+ $this->Cell($w,$h,mb_substr($s,$j,$i-$j,'UTF-8'),0,2,'',0,$link);
994
+ }
995
+ else {
996
+ $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link);
997
+ }
998
+ $i++;
999
+ $sep = -1;
1000
+ $j = $i;
1001
+ $l = 0;
1002
+ if($nl==1)
1003
+ {
1004
+ $this->x = $this->lMargin;
1005
+ $w = $this->w-$this->rMargin-$this->x;
1006
+ $wmax = ($w-2*$this->cMargin);
1007
+ }
1008
+ $nl++;
1009
+ continue;
1010
+ }
1011
+ if($c==' ')
1012
+ $sep = $i;
1013
+
1014
+ if ($this->unifontSubset) { $l += $this->GetStringWidth($c); }
1015
+ else { $l += $cw[$c]*$this->FontSize/1000; }
1016
+
1017
+ if($l>$wmax)
1018
+ {
1019
+ // Automatic line break
1020
+ if($sep==-1)
1021
+ {
1022
+ if($this->x>$this->lMargin)
1023
+ {
1024
+ // Move to next line
1025
+ $this->x = $this->lMargin;
1026
+ $this->y += $h;
1027
+ $w = $this->w-$this->rMargin-$this->x;
1028
+ $wmax = ($w-2*$this->cMargin);
1029
+ $i++;
1030
+ $nl++;
1031
+ continue;
1032
+ }
1033
+ if($i==$j)
1034
+ $i++;
1035
+ if ($this->unifontSubset) {
1036
+ $this->Cell($w,$h,mb_substr($s,$j,$i-$j,'UTF-8'),0,2,'',0,$link);
1037
+ }
1038
+ else {
1039
+ $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link);
1040
+ }
1041
+ }
1042
+ else
1043
+ {
1044
+ if ($this->unifontSubset) {
1045
+ $this->Cell($w,$h,mb_substr($s,$j,$sep-$j,'UTF-8'),0,2,'',0,$link);
1046
+ }
1047
+ else {
1048
+ $this->Cell($w,$h,substr($s,$j,$sep-$j),0,2,'',0,$link);
1049
+ }
1050
+ $i = $sep+1;
1051
+ }
1052
+ $sep = -1;
1053
+ $j = $i;
1054
+ $l = 0;
1055
+ if($nl==1)
1056
+ {
1057
+ $this->x = $this->lMargin;
1058
+ $w = $this->w-$this->rMargin-$this->x;
1059
+ $wmax = ($w-2*$this->cMargin);
1060
+ }
1061
+ $nl++;
1062
+ }
1063
+ else
1064
+ $i++;
1065
+ }
1066
+ // Last chunk
1067
+ if($i!=$j) {
1068
+ if ($this->unifontSubset) {
1069
+ $this->Cell($l,$h,mb_substr($s,$j,$i-$j,'UTF-8'),0,0,'',0,$link);
1070
+ }
1071
+ else {
1072
+ $this->Cell($l,$h,substr($s,$j),0,0,'',0,$link);
1073
+ }
1074
+ }
1075
+ }
1076
+
1077
+ function Ln($h=null)
1078
+ {
1079
+ // Line feed; default value is last cell height
1080
+ $this->x = $this->lMargin;
1081
+ if($h===null)
1082
+ $this->y += $this->lasth;
1083
+ else
1084
+ $this->y += $h;
1085
+ }
1086
+
1087
+ function Image($file, $x=null, $y=null, $w=0, $h=0, $type='', $link='')
1088
+ {
1089
+ // Put an image on the page
1090
+ if(!isset($this->images[$file]))
1091
+ {
1092
+ // First use of this image, get info
1093
+ if($type=='')
1094
+ {
1095
+ $pos = strrpos($file,'.');
1096
+ if(!$pos)
1097
+ $this->Error('Image file has no extension and no type was specified: '.$file);
1098
+ $type = substr($file,$pos+1);
1099
+ }
1100
+ $type = strtolower($type);
1101
+ if($type=='jpeg')
1102
+ $type = 'jpg';
1103
+ $mtd = '_parse'.$type;
1104
+ if(!method_exists($this,$mtd))
1105
+ $this->Error('Unsupported image type: '.$type);
1106
+ $info = $this->$mtd($file);
1107
+ $info['i'] = count($this->images)+1;
1108
+ $this->images[$file] = $info;
1109
+ }
1110
+ else
1111
+ $info = $this->images[$file];
1112
+
1113
+ // Automatic width and height calculation if needed
1114
+ if($w==0 && $h==0)
1115
+ {
1116
+ // Put image at 96 dpi
1117
+ $w = -96;
1118
+ $h = -96;
1119
+ }
1120
+ if($w<0)
1121
+ $w = -$info['w']*72/$w/$this->k;
1122
+ if($h<0)
1123
+ $h = -$info['h']*72/$h/$this->k;
1124
+ if($w==0)
1125
+ $w = $h*$info['w']/$info['h'];
1126
+ if($h==0)
1127
+ $h = $w*$info['h']/$info['w'];
1128
+
1129
+ // Flowing mode
1130
+ if($y===null)
1131
+ {
1132
+ if($this->y+$h>$this->PageBreakTrigger && !$this->InHeader && !$this->InFooter && $this->AcceptPageBreak())
1133
+ {
1134
+ // Automatic page break
1135
+ $x2 = $this->x;
1136
+ $this->AddPage($this->CurOrientation,$this->CurPageSize);
1137
+ $this->x = $x2;
1138
+ }
1139
+ $y = $this->y;
1140
+ $this->y += $h;
1141
+ }
1142
+
1143
+ if($x===null)
1144
+ $x = $this->x;
1145
+ $this->_out(sprintf('q %.2F 0 0 %.2F %.2F %.2F cm /I%d Do Q',$w*$this->k,$h*$this->k,$x*$this->k,($this->h-($y+$h))*$this->k,$info['i']));
1146
+ if($link)
1147
+ $this->Link($x,$y,$w,$h,$link);
1148
+ }
1149
+
1150
+ function GetX()
1151
+ {
1152
+ // Get x position
1153
+ return $this->x;
1154
+ }
1155
+
1156
+ function SetX($x)
1157
+ {
1158
+ // Set x position
1159
+ if($x>=0)
1160
+ $this->x = $x;
1161
+ else
1162
+ $this->x = $this->w+$x;
1163
+ }
1164
+
1165
+ function GetY()
1166
+ {
1167
+ // Get y position
1168
+ return $this->y;
1169
+ }
1170
+
1171
+ function SetY($y)
1172
+ {
1173
+ // Set y position and reset x
1174
+ $this->x = $this->lMargin;
1175
+ if($y>=0)
1176
+ $this->y = $y;
1177
+ else
1178
+ $this->y = $this->h+$y;
1179
+ }
1180
+
1181
+ function SetXY($x, $y)
1182
+ {
1183
+ // Set x and y positions
1184
+ $this->SetY($y);
1185
+ $this->SetX($x);
1186
+ }
1187
+
1188
+ function Output($name='', $dest='')
1189
+ {
1190
+ // Output PDF to some destination
1191
+ if($this->state<3)
1192
+ $this->Close();
1193
+ $dest = strtoupper($dest);
1194
+ if($dest=='')
1195
+ {
1196
+ if($name=='')
1197
+ {
1198
+ $name = 'doc.pdf';
1199
+ $dest = 'I';
1200
+ }
1201
+ else
1202
+ $dest = 'F';
1203
+ }
1204
+ switch($dest)
1205
+ {
1206
+ case 'I':
1207
+ // Send to standard output
1208
+ $this->_checkoutput();
1209
+ if(PHP_SAPI!='cli')
1210
+ {
1211
+ // We send to a browser
1212
+ header('Content-Type: application/pdf');
1213
+ header('Content-Disposition: inline; filename="'.$name.'"');
1214
+ header('Cache-Control: private, max-age=0, must-revalidate');
1215
+ header('Pragma: public');
1216
+ }
1217
+ echo $this->buffer;
1218
+ break;
1219
+ case 'D':
1220
+ // Download file
1221
+ $this->_checkoutput();
1222
+ header('Content-Type: application/x-download');
1223
+ header('Content-Disposition: attachment; filename="'.$name.'"');
1224
+ header('Cache-Control: private, max-age=0, must-revalidate');
1225
+ header('Pragma: public');
1226
+ echo $this->buffer;
1227
+ break;
1228
+ case 'F':
1229
+ // Save to local file
1230
+ $f = fopen($name,'wb');
1231
+ if(!$f)
1232
+ $this->Error('Unable to create output file: '.$name);
1233
+ fwrite($f,$this->buffer,strlen($this->buffer));
1234
+ fclose($f);
1235
+ break;
1236
+ case 'S':
1237
+ // Return as a string
1238
+ return $this->buffer;
1239
+ default:
1240
+ $this->Error('Incorrect output destination: '.$dest);
1241
+ }
1242
+ return '';
1243
+ }
1244
+
1245
+ /*******************************************************************************
1246
+ * *
1247
+ * Protected methods *
1248
+ * *
1249
+ *******************************************************************************/
1250
+ function _dochecks()
1251
+ {
1252
+ // Check availability of %F
1253
+ if(sprintf('%.1F',1.0)!='1.0')
1254
+ $this->Error('This version of PHP is not supported');
1255
+ // Check availability of mbstring
1256
+ if(!function_exists('mb_strlen'))
1257
+ $this->Error('mbstring extension is not available');
1258
+ // Check mbstring overloading
1259
+ if(ini_get('mbstring.func_overload') & 2)
1260
+ $this->Error('mbstring overloading must be disabled');
1261
+ // Ensure runtime magic quotes are disabled
1262
+ if(get_magic_quotes_runtime())
1263
+ @set_magic_quotes_runtime(0);
1264
+ }
1265
+
1266
+ function _getfontpath()
1267
+ {
1268
+ return $this->fontpath;
1269
+ }
1270
+
1271
+ function _checkoutput()
1272
+ {
1273
+ if(PHP_SAPI!='cli')
1274
+ {
1275
+ if(headers_sent($file,$line))
1276
+ $this->Error("Some data has already been output, can't send PDF file (output started at $file:$line)");
1277
+ }
1278
+ if(ob_get_length())
1279
+ {
1280
+ // The output buffer is not empty
1281
+ if(preg_match('/^(\xEF\xBB\xBF)?\s*$/',ob_get_contents()))
1282
+ {
1283
+ // It contains only a UTF-8 BOM and/or whitespace, let's clean it
1284
+ ob_clean();
1285
+ }
1286
+ else
1287
+ $this->Error("Some data has already been output, can't send PDF file");
1288
+ }
1289
+ }
1290
+
1291
+ function _getpagesize($size)
1292
+ {
1293
+ if(is_string($size))
1294
+ {
1295
+ $size = strtolower($size);
1296
+ if(!isset($this->StdPageSizes[$size]))
1297
+ $this->Error('Unknown page size: '.$size);
1298
+ $a = $this->StdPageSizes[$size];
1299
+ return array($a[0]/$this->k, $a[1]/$this->k);
1300
+ }
1301
+ else
1302
+ {
1303
+ if($size[0]>$size[1])
1304
+ return array($size[1], $size[0]);
1305
+ else
1306
+ return $size;
1307
+ }
1308
+ }
1309
+
1310
+ function _beginpage($orientation, $size)
1311
+ {
1312
+ $this->page++;
1313
+ $this->pages[$this->page] = '';
1314
+ $this->state = 2;
1315
+ $this->x = $this->lMargin;
1316
+ $this->y = $this->tMargin;
1317
+ $this->FontFamily = '';
1318
+ // Check page size and orientation
1319
+ if($orientation=='')
1320
+ $orientation = $this->DefOrientation;
1321
+ else
1322
+ $orientation = strtoupper($orientation[0]);
1323
+ if($size=='')
1324
+ $size = $this->DefPageSize;
1325
+ else
1326
+ $size = $this->_getpagesize($size);
1327
+ if($orientation!=$this->CurOrientation || $size[0]!=$this->CurPageSize[0] || $size[1]!=$this->CurPageSize[1])
1328
+ {
1329
+ // New size or orientation
1330
+ if($orientation=='P')
1331
+ {
1332
+ $this->w = $size[0];
1333
+ $this->h = $size[1];
1334
+ }
1335
+ else
1336
+ {
1337
+ $this->w = $size[1];
1338
+ $this->h = $size[0];
1339
+ }
1340
+ $this->wPt = $this->w*$this->k;
1341
+ $this->hPt = $this->h*$this->k;
1342
+ $this->PageBreakTrigger = $this->h-$this->bMargin;
1343
+ $this->CurOrientation = $orientation;
1344
+ $this->CurPageSize = $size;
1345
+ }
1346
+ if($orientation!=$this->DefOrientation || $size[0]!=$this->DefPageSize[0] || $size[1]!=$this->DefPageSize[1])
1347
+ $this->PageSizes[$this->page] = array($this->wPt, $this->hPt);
1348
+ }
1349
+
1350
+ function _endpage()
1351
+ {
1352
+ $this->state = 1;
1353
+ }
1354
+
1355
+ function _loadfont($font)
1356
+ {
1357
+ // Load a font definition file from the font directory
1358
+ include($this->fontpath.$font);
1359
+ $a = get_defined_vars();
1360
+ if(!isset($a['name']))
1361
+ $this->Error('Could not include font definition file');
1362
+ return $a;
1363
+ }
1364
+
1365
+ function _escape($s)
1366
+ {
1367
+ // Escape special characters in strings
1368
+ $s = str_replace('\\','\\\\',$s);
1369
+ $s = str_replace('(','\\(',$s);
1370
+ $s = str_replace(')','\\)',$s);
1371
+ $s = str_replace("\r",'\\r',$s);
1372
+ return $s;
1373
+ }
1374
+
1375
+ function _textstring($s)
1376
+ {
1377
+ // Format a text string
1378
+ return '('.$this->_escape($s).')';
1379
+ }
1380
+
1381
+ function _UTF8toUTF16($s)
1382
+ {
1383
+ // Convert UTF-8 to UTF-16BE with BOM
1384
+ $res = "\xFE\xFF";
1385
+ $nb = strlen($s);
1386
+ $i = 0;
1387
+ while($i<$nb)
1388
+ {
1389
+ $c1 = ord($s[$i++]);
1390
+ if($c1>=224)
1391
+ {
1392
+ // 3-byte character
1393
+ $c2 = ord($s[$i++]);
1394
+ $c3 = ord($s[$i++]);
1395
+ $res .= chr((($c1 & 0x0F)<<4) + (($c2 & 0x3C)>>2));
1396
+ $res .= chr((($c2 & 0x03)<<6) + ($c3 & 0x3F));
1397
+ }
1398
+ elseif($c1>=192)
1399
+ {
1400
+ // 2-byte character
1401
+ $c2 = ord($s[$i++]);
1402
+ $res .= chr(($c1 & 0x1C)>>2);
1403
+ $res .= chr((($c1 & 0x03)<<6) + ($c2 & 0x3F));
1404
+ }
1405
+ else
1406
+ {
1407
+ // Single-byte character
1408
+ $res .= "\0".chr($c1);
1409
+ }
1410
+ }
1411
+ return $res;
1412
+ }
1413
+
1414
+ function _dounderline($x, $y, $txt)
1415
+ {
1416
+ // Underline text
1417
+ $up = $this->CurrentFont['up'];
1418
+ $ut = $this->CurrentFont['ut'];
1419
+ $w = $this->GetStringWidth($txt)+$this->ws*substr_count($txt,' ');
1420
+ return sprintf('%.2F %.2F %.2F %.2F re f',$x*$this->k,($this->h-($y-$up/1000*$this->FontSize))*$this->k,$w*$this->k,-$ut/1000*$this->FontSizePt);
1421
+ }
1422
+
1423
+ function _parsejpg($file)
1424
+ {
1425
+ // Extract info from a JPEG file
1426
+ $a = getimagesize($file);
1427
+ if(!$a)
1428
+ $this->Error('Missing or incorrect image file: '.$file);
1429
+ if($a[2]!=2)
1430
+ $this->Error('Not a JPEG file: '.$file);
1431
+ if(!isset($a['channels']) || $a['channels']==3)
1432
+ $colspace = 'DeviceRGB';
1433
+ elseif($a['channels']==4)
1434
+ $colspace = 'DeviceCMYK';
1435
+ else
1436
+ $colspace = 'DeviceGray';
1437
+ $bpc = isset($a['bits']) ? $a['bits'] : 8;
1438
+ $data = file_get_contents($file);
1439
+ return array('w'=>$a[0], 'h'=>$a[1], 'cs'=>$colspace, 'bpc'=>$bpc, 'f'=>'DCTDecode', 'data'=>$data);
1440
+ }
1441
+
1442
+ function _parsepng($file)
1443
+ {
1444
+ // Extract info from a PNG file
1445
+ $f = fopen($file,'rb');
1446
+ if(!$f)
1447
+ $this->Error('Can\'t open image file: '.$file);
1448
+ $info = $this->_parsepngstream($f,$file);
1449
+ fclose($f);
1450
+ return $info;
1451
+ }
1452
+
1453
+ function _parsepngstream($f, $file)
1454
+ {
1455
+ // Check signature
1456
+ if($this->_readstream($f,8)!=chr(137).'PNG'.chr(13).chr(10).chr(26).chr(10))
1457
+ $this->Error('Not a PNG file: '.$file);
1458
+
1459
+ // Read header chunk
1460
+ $this->_readstream($f,4);
1461
+ if($this->_readstream($f,4)!='IHDR')
1462
+ $this->Error('Incorrect PNG file: '.$file);
1463
+ $w = $this->_readint($f);
1464
+ $h = $this->_readint($f);
1465
+ $bpc = ord($this->_readstream($f,1));
1466
+ if($bpc>8)
1467
+ $this->Error('16-bit depth not supported: '.$file);
1468
+ $ct = ord($this->_readstream($f,1));
1469
+ if($ct==0 || $ct==4)
1470
+ $colspace = 'DeviceGray';
1471
+ elseif($ct==2 || $ct==6)
1472
+ $colspace = 'DeviceRGB';
1473
+ elseif($ct==3)
1474
+ $colspace = 'Indexed';
1475
+ else
1476
+ $this->Error('Unknown color type: '.$file);
1477
+ if(ord($this->_readstream($f,1))!=0)
1478
+ $this->Error('Unknown compression method: '.$file);
1479
+ if(ord($this->_readstream($f,1))!=0)
1480
+ $this->Error('Unknown filter method: '.$file);
1481
+ if(ord($this->_readstream($f,1))!=0)
1482
+ $this->Error('Interlacing not supported: '.$file);
1483
+ $this->_readstream($f,4);
1484
+ $dp = '/Predictor 15 /Colors '.($colspace=='DeviceRGB' ? 3 : 1).' /BitsPerComponent '.$bpc.' /Columns '.$w;
1485
+
1486
+ // Scan chunks looking for palette, transparency and image data
1487
+ $pal = '';
1488
+ $trns = '';
1489
+ $data = '';
1490
+ do
1491
+ {
1492
+ $n = $this->_readint($f);
1493
+ $type = $this->_readstream($f,4);
1494
+ if($type=='PLTE')
1495
+ {
1496
+ // Read palette
1497
+ $pal = $this->_readstream($f,$n);
1498
+ $this->_readstream($f,4);
1499
+ }
1500
+ elseif($type=='tRNS')
1501
+ {
1502
+ // Read transparency info
1503
+ $t = $this->_readstream($f,$n);
1504
+ if($ct==0)
1505
+ $trns = array(ord(substr($t,1,1)));
1506
+ elseif($ct==2)
1507
+ $trns = array(ord(substr($t,1,1)), ord(substr($t,3,1)), ord(substr($t,5,1)));
1508
+ else
1509
+ {
1510
+ $pos = strpos($t,chr(0));
1511
+ if($pos!==false)
1512
+ $trns = array($pos);
1513
+ }
1514
+ $this->_readstream($f,4);
1515
+ }
1516
+ elseif($type=='IDAT')
1517
+ {
1518
+ // Read image data block
1519
+ $data .= $this->_readstream($f,$n);
1520
+ $this->_readstream($f,4);
1521
+ }
1522
+ elseif($type=='IEND')
1523
+ break;
1524
+ else
1525
+ $this->_readstream($f,$n+4);
1526
+ }
1527
+ while($n);
1528
+
1529
+ if($colspace=='Indexed' && empty($pal))
1530
+ $this->Error('Missing palette in '.$file);
1531
+ $info = array('w'=>$w, 'h'=>$h, 'cs'=>$colspace, 'bpc'=>$bpc, 'f'=>'FlateDecode', 'dp'=>$dp, 'pal'=>$pal, 'trns'=>$trns);
1532
+ if($ct>=4)
1533
+ {
1534
+ // Extract alpha channel
1535
+ if(!function_exists('gzuncompress'))
1536
+ $this->Error('Zlib not available, can\'t handle alpha channel: '.$file);
1537
+ $data = gzuncompress($data);
1538
+ $color = '';
1539
+ $alpha = '';
1540
+ if($ct==4)
1541
+ {
1542
+ // Gray image
1543
+ $len = 2*$w;
1544
+ for($i=0;$i<$h;$i++)
1545
+ {
1546
+ $pos = (1+$len)*$i;
1547
+ $color .= $data[$pos];
1548
+ $alpha .= $data[$pos];
1549
+ $line = substr($data,$pos+1,$len);
1550
+ $color .= preg_replace('/(.)./s','$1',$line);
1551
+ $alpha .= preg_replace('/.(.)/s','$1',$line);
1552
+ }
1553
+ }
1554
+ else
1555
+ {
1556
+ // RGB image
1557
+ $len = 4*$w;
1558
+ for($i=0;$i<$h;$i++)
1559
+ {
1560
+ $pos = (1+$len)*$i;
1561
+ $color .= $data[$pos];
1562
+ $alpha .= $data[$pos];
1563
+ $line = substr($data,$pos+1,$len);
1564
+ $color .= preg_replace('/(.{3})./s','$1',$line);
1565
+ $alpha .= preg_replace('/.{3}(.)/s','$1',$line);
1566
+ }
1567
+ }
1568
+ unset($data);
1569
+ $data = gzcompress($color);
1570
+ $info['smask'] = gzcompress($alpha);
1571
+ if($this->PDFVersion<'1.4')
1572
+ $this->PDFVersion = '1.4';
1573
+ }
1574
+ $info['data'] = $data;
1575
+ return $info;
1576
+ }
1577
+
1578
+ function _readstream($f, $n)
1579
+ {
1580
+ // Read n bytes from stream
1581
+ $res = '';
1582
+ while($n>0 && !feof($f))
1583
+ {
1584
+ $s = fread($f,$n);
1585
+ if($s===false)
1586
+ $this->Error('Error while reading stream');
1587
+ $n -= strlen($s);
1588
+ $res .= $s;
1589
+ }
1590
+ if($n>0)
1591
+ $this->Error('Unexpected end of stream');
1592
+ return $res;
1593
+ }
1594
+
1595
+ function _readint($f)
1596
+ {
1597
+ // Read a 4-byte integer from stream
1598
+ $a = unpack('Ni',$this->_readstream($f,4));
1599
+ return $a['i'];
1600
+ }
1601
+
1602
+ function _parsegif($file)
1603
+ {
1604
+ // Extract info from a GIF file (via PNG conversion)
1605
+ if(!function_exists('imagepng'))
1606
+ $this->Error('GD extension is required for GIF support');
1607
+ if(!function_exists('imagecreatefromgif'))
1608
+ $this->Error('GD has no GIF read support');
1609
+ $im = imagecreatefromgif($file);
1610
+ if(!$im)
1611
+ $this->Error('Missing or incorrect image file: '.$file);
1612
+ imageinterlace($im,0);
1613
+ $f = @fopen('php://temp','rb+');
1614
+ if($f)
1615
+ {
1616
+ // Perform conversion in memory
1617
+ ob_start();
1618
+ imagepng($im);
1619
+ $data = ob_get_clean();
1620
+ imagedestroy($im);
1621
+ fwrite($f,$data);
1622
+ rewind($f);
1623
+ $info = $this->_parsepngstream($f,$file);
1624
+ fclose($f);
1625
+ }
1626
+ else
1627
+ {
1628
+ // Use temporary file
1629
+ $tmp = tempnam('.','gif');
1630
+ if(!$tmp)
1631
+ $this->Error('Unable to create a temporary file');
1632
+ if(!imagepng($im,$tmp))
1633
+ $this->Error('Error while saving to temporary file');
1634
+ imagedestroy($im);
1635
+ $info = $this->_parsepng($tmp);
1636
+ unlink($tmp);
1637
+ }
1638
+ return $info;
1639
+ }
1640
+
1641
+ function _newobj()
1642
+ {
1643
+ // Begin a new object
1644
+ $this->n++;
1645
+ $this->offsets[$this->n] = strlen($this->buffer);
1646
+ $this->_out($this->n.' 0 obj');
1647
+ }
1648
+
1649
+ function _putstream($s)
1650
+ {
1651
+ $this->_out('stream');
1652
+ $this->_out($s);
1653
+ $this->_out('endstream');
1654
+ }
1655
+
1656
+ function _out($s)
1657
+ {
1658
+ // Add a line to the document
1659
+ if($this->state==2)
1660
+ $this->pages[$this->page] .= $s."\n";
1661
+ else
1662
+ $this->buffer .= $s."\n";
1663
+ }
1664
+
1665
+ function _putpages()
1666
+ {
1667
+ $nb = $this->page;
1668
+ if(!empty($this->AliasNbPages))
1669
+ {
1670
+ // Replace number of pages in fonts using subsets
1671
+ $alias = $this->UTF8ToUTF16BE($this->AliasNbPages, false);
1672
+ $r = $this->UTF8ToUTF16BE("$nb", false);
1673
+ for($n=1;$n<=$nb;$n++)
1674
+ $this->pages[$n] = str_replace($alias,$r,$this->pages[$n]);
1675
+ // Now repeat for no pages in non-subset fonts
1676
+ for($n=1;$n<=$nb;$n++)
1677
+ $this->pages[$n] = str_replace($this->AliasNbPages,$nb,$this->pages[$n]);
1678
+ }
1679
+ if($this->DefOrientation=='P')
1680
+ {
1681
+ $wPt = $this->DefPageSize[0]*$this->k;
1682
+ $hPt = $this->DefPageSize[1]*$this->k;
1683
+ }
1684
+ else
1685
+ {
1686
+ $wPt = $this->DefPageSize[1]*$this->k;
1687
+ $hPt = $this->DefPageSize[0]*$this->k;
1688
+ }
1689
+ $filter = ($this->compress) ? '/Filter /FlateDecode ' : '';
1690
+ for($n=1;$n<=$nb;$n++)
1691
+ {
1692
+ // Page
1693
+ $this->_newobj();
1694
+ $this->_out('<</Type /Page');
1695
+ $this->_out('/Parent 1 0 R');
1696
+ if(isset($this->PageSizes[$n]))
1697
+ $this->_out(sprintf('/MediaBox [0 0 %.2F %.2F]',$this->PageSizes[$n][0],$this->PageSizes[$n][1]));
1698
+ $this->_out('/Resources 2 0 R');
1699
+ if(isset($this->PageLinks[$n]))
1700
+ {
1701
+ // Links
1702
+ $annots = '/Annots [';
1703
+ foreach($this->PageLinks[$n] as $pl)
1704
+ {
1705
+ $rect = sprintf('%.2F %.2F %.2F %.2F',$pl[0],$pl[1],$pl[0]+$pl[2],$pl[1]-$pl[3]);
1706
+ $annots .= '<</Type /Annot /Subtype /Link /Rect ['.$rect.'] /Border [0 0 0] ';
1707
+ if(is_string($pl[4]))
1708
+ $annots .= '/A <</S /URI /URI '.$this->_textstring($pl[4]).'>>>>';
1709
+ else
1710
+ {
1711
+ $l = $this->links[$pl[4]];
1712
+ $h = isset($this->PageSizes[$l[0]]) ? $this->PageSizes[$l[0]][1] : $hPt;
1713
+ $annots .= sprintf('/Dest [%d 0 R /XYZ 0 %.2F null]>>',1+2*$l[0],$h-$l[1]*$this->k);
1714
+ }
1715
+ }
1716
+ $this->_out($annots.']');
1717
+ }
1718
+ if($this->PDFVersion>'1.3')
1719
+ $this->_out('/Group <</Type /Group /S /Transparency /CS /DeviceRGB>>');
1720
+ $this->_out('/Contents '.($this->n+1).' 0 R>>');
1721
+ $this->_out('endobj');
1722
+ // Page content
1723
+ $p = ($this->compress) ? gzcompress($this->pages[$n]) : $this->pages[$n];
1724
+ $this->_newobj();
1725
+ $this->_out('<<'.$filter.'/Length '.strlen($p).'>>');
1726
+ $this->_putstream($p);
1727
+ $this->_out('endobj');
1728
+ }
1729
+ // Pages root
1730
+ $this->offsets[1] = strlen($this->buffer);
1731
+ $this->_out('1 0 obj');
1732
+ $this->_out('<</Type /Pages');
1733
+ $kids = '/Kids [';
1734
+ for($i=0;$i<$nb;$i++)
1735
+ $kids .= (3+2*$i).' 0 R ';
1736
+ $this->_out($kids.']');
1737
+ $this->_out('/Count '.$nb);
1738
+ $this->_out(sprintf('/MediaBox [0 0 %.2F %.2F]',$wPt,$hPt));
1739
+ $this->_out('>>');
1740
+ $this->_out('endobj');
1741
+ }
1742
+
1743
+ function _putfonts()
1744
+ {
1745
+ $nf=$this->n;
1746
+ foreach($this->diffs as $diff)
1747
+ {
1748
+ // Encodings
1749
+ $this->_newobj();
1750
+ $this->_out('<</Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences ['.$diff.']>>');
1751
+ $this->_out('endobj');
1752
+ }
1753
+ foreach($this->FontFiles as $file=>$info)
1754
+ {
1755
+ if (!isset($info['type']) || $info['type']!='TTF') {
1756
+ // Font file embedding
1757
+ $this->_newobj();
1758
+ $this->FontFiles[$file]['n']=$this->n;
1759
+ $font='';
1760
+ $f=fopen($this->_getfontpath().$file,'rb',1);
1761
+ if(!$f)
1762
+ $this->Error('Font file not found');
1763
+ while(!feof($f))
1764
+ $font.=fread($f,8192);
1765
+ fclose($f);
1766
+ $compressed=(substr($file,-2)=='.z');
1767
+ if(!$compressed && isset($info['length2']))
1768
+ {
1769
+ $header=(ord($font[0])==128);
1770
+ if($header)
1771
+ {
1772
+ // Strip first binary header
1773
+ $font=substr($font,6);
1774
+ }
1775
+ if($header && ord($font[$info['length1']])==128)
1776
+ {
1777
+ // Strip second binary header
1778
+ $font=substr($font,0,$info['length1']).substr($font,$info['length1']+6);
1779
+ }
1780
+ }
1781
+ $this->_out('<</Length '.strlen($font));
1782
+ if($compressed)
1783
+ $this->_out('/Filter /FlateDecode');
1784
+ $this->_out('/Length1 '.$info['length1']);
1785
+ if(isset($info['length2']))
1786
+ $this->_out('/Length2 '.$info['length2'].' /Length3 0');
1787
+ $this->_out('>>');
1788
+ $this->_putstream($font);
1789
+ $this->_out('endobj');
1790
+ }
1791
+ }
1792
+ foreach($this->fonts as $k=>$font)
1793
+ {
1794
+ // Font objects
1795
+ //$this->fonts[$k]['n']=$this->n+1;
1796
+ $type = $font['type'];
1797
+ $name = $font['name'];
1798
+ if($type=='Core')
1799
+ {
1800
+ // Standard font
1801
+ $this->fonts[$k]['n']=$this->n+1;
1802
+ $this->_newobj();
1803
+ $this->_out('<</Type /Font');
1804
+ $this->_out('/BaseFont /'.$name);
1805
+ $this->_out('/Subtype /Type1');
1806
+ if($name!='Symbol' && $name!='ZapfDingbats')
1807
+ $this->_out('/Encoding /WinAnsiEncoding');
1808
+ $this->_out('>>');
1809
+ $this->_out('endobj');
1810
+ }
1811
+ elseif($type=='Type1' || $type=='TrueType')
1812
+ {
1813
+ // Additional Type1 or TrueType font
1814
+ $this->fonts[$k]['n']=$this->n+1;
1815
+ $this->_newobj();
1816
+ $this->_out('<</Type /Font');
1817
+ $this->_out('/BaseFont /'.$name);
1818
+ $this->_out('/Subtype /'.$type);
1819
+ $this->_out('/FirstChar 32 /LastChar 255');
1820
+ $this->_out('/Widths '.($this->n+1).' 0 R');
1821
+ $this->_out('/FontDescriptor '.($this->n+2).' 0 R');
1822
+ if($font['enc'])
1823
+ {
1824
+ if(isset($font['diff']))
1825
+ $this->_out('/Encoding '.($nf+$font['diff']).' 0 R');
1826
+ else
1827
+ $this->_out('/Encoding /WinAnsiEncoding');
1828
+ }
1829
+ $this->_out('>>');
1830
+ $this->_out('endobj');
1831
+ // Widths
1832
+ $this->_newobj();
1833
+ $cw=&$font['cw'];
1834
+ $s='[';
1835
+ for($i=32;$i<=255;$i++)
1836
+ $s.=$cw[chr($i)].' ';
1837
+ $this->_out($s.']');
1838
+ $this->_out('endobj');
1839
+ // Descriptor
1840
+ $this->_newobj();
1841
+ $s='<</Type /FontDescriptor /FontName /'.$name;
1842
+ foreach($font['desc'] as $k=>$v)
1843
+ $s.=' /'.$k.' '.$v;
1844
+ $file=$font['file'];
1845
+ if($file)
1846
+ $s.=' /FontFile'.($type=='Type1' ? '' : '2').' '.$this->FontFiles[$file]['n'].' 0 R';
1847
+ $this->_out($s.'>>');
1848
+ $this->_out('endobj');
1849
+ }
1850
+ // TrueType embedded SUBSETS or FULL
1851
+ else if ($type=='TTF') {
1852
+ $this->fonts[$k]['n']=$this->n+1;
1853
+ require_once($this->_getfontpath().'unifont/ttfonts.php');
1854
+ $ttf = new TTFontFile();
1855
+ $fontname = 'MPDFAA'.'+'.$font['name'];
1856
+ $subset = $font['subset'];
1857
+ unset($subset[0]);
1858
+ $ttfontstream = $ttf->makeSubset($font['ttffile'], $subset);
1859
+ $ttfontsize = strlen($ttfontstream);
1860
+ $fontstream = gzcompress($ttfontstream);
1861
+ $codeToGlyph = $ttf->codeToGlyph;
1862
+ unset($codeToGlyph[0]);
1863
+
1864
+ // Type0 Font
1865
+ // A composite font - a font composed of other fonts, organized hierarchically
1866
+ $this->_newobj();
1867
+ $this->_out('<</Type /Font');
1868
+ $this->_out('/Subtype /Type0');
1869
+ $this->_out('/BaseFont /'.$fontname.'');
1870
+ $this->_out('/Encoding /Identity-H');
1871
+ $this->_out('/DescendantFonts ['.($this->n + 1).' 0 R]');
1872
+ $this->_out('/ToUnicode '.($this->n + 2).' 0 R');
1873
+ $this->_out('>>');
1874
+ $this->_out('endobj');
1875
+
1876
+ // CIDFontType2
1877
+ // A CIDFont whose glyph descriptions are based on TrueType font technology
1878
+ $this->_newobj();
1879
+ $this->_out('<</Type /Font');
1880
+ $this->_out('/Subtype /CIDFontType2');
1881
+ $this->_out('/BaseFont /'.$fontname.'');
1882
+ $this->_out('/CIDSystemInfo '.($this->n + 2).' 0 R');
1883
+ $this->_out('/FontDescriptor '.($this->n + 3).' 0 R');
1884
+ if (isset($font['desc']['MissingWidth'])){
1885
+ $this->_out('/DW '.$font['desc']['MissingWidth'].'');
1886
+ }
1887
+
1888
+ $this->_putTTfontwidths($font, $ttf->maxUni);
1889
+
1890
+ $this->_out('/CIDToGIDMap '.($this->n + 4).' 0 R');
1891
+ $this->_out('>>');
1892
+ $this->_out('endobj');
1893
+
1894
+ // ToUnicode
1895
+ $this->_newobj();
1896
+ $toUni = "/CIDInit /ProcSet findresource begin\n";
1897
+ $toUni .= "12 dict begin\n";
1898
+ $toUni .= "begincmap\n";
1899
+ $toUni .= "/CIDSystemInfo\n";
1900
+ $toUni .= "<</Registry (Adobe)\n";
1901
+ $toUni .= "/Ordering (UCS)\n";
1902
+ $toUni .= "/Supplement 0\n";
1903
+ $toUni .= ">> def\n";
1904
+ $toUni .= "/CMapName /Adobe-Identity-UCS def\n";
1905
+ $toUni .= "/CMapType 2 def\n";
1906
+ $toUni .= "1 begincodespacerange\n";
1907
+ $toUni .= "<0000> <FFFF>\n";
1908
+ $toUni .= "endcodespacerange\n";
1909
+ $toUni .= "1 beginbfrange\n";
1910
+ $toUni .= "<0000> <FFFF> <0000>\n";
1911
+ $toUni .= "endbfrange\n";
1912
+ $toUni .= "endcmap\n";
1913
+ $toUni .= "CMapName currentdict /CMap defineresource pop\n";
1914
+ $toUni .= "end\n";
1915
+ $toUni .= "end";
1916
+ $this->_out('<</Length '.(strlen($toUni)).'>>');
1917
+ $this->_putstream($toUni);
1918
+ $this->_out('endobj');
1919
+
1920
+ // CIDSystemInfo dictionary
1921
+ $this->_newobj();
1922
+ $this->_out('<</Registry (Adobe)');
1923
+ $this->_out('/Ordering (UCS)');
1924
+ $this->_out('/Supplement 0');
1925
+ $this->_out('>>');
1926
+ $this->_out('endobj');
1927
+
1928
+ // Font descriptor
1929
+ $this->_newobj();
1930
+ $this->_out('<</Type /FontDescriptor');
1931
+ $this->_out('/FontName /'.$fontname);
1932
+ foreach($font['desc'] as $kd=>$v) {
1933
+ if ($kd == 'Flags') { $v = $v | 4; $v = $v & ~32; } // SYMBOLIC font flag
1934
+ $this->_out(' /'.$kd.' '.$v);
1935
+ }
1936
+ $this->_out('/FontFile2 '.($this->n + 2).' 0 R');
1937
+ $this->_out('>>');
1938
+ $this->_out('endobj');
1939
+
1940
+ // Embed CIDToGIDMap
1941
+ // A specification of the mapping from CIDs to glyph indices
1942
+ $cidtogidmap = '';
1943
+ $cidtogidmap = str_pad('', 256*256*2, "\x00");
1944
+ foreach($codeToGlyph as $cc=>$glyph) {
1945
+ $cidtogidmap[$cc*2] = chr($glyph >> 8);
1946
+ $cidtogidmap[$cc*2 + 1] = chr($glyph & 0xFF);
1947
+ }
1948
+ $cidtogidmap = gzcompress($cidtogidmap);
1949
+ $this->_newobj();
1950
+ $this->_out('<</Length '.strlen($cidtogidmap).'');
1951
+ $this->_out('/Filter /FlateDecode');
1952
+ $this->_out('>>');
1953
+ $this->_putstream($cidtogidmap);
1954
+ $this->_out('endobj');
1955
+
1956
+ //Font file
1957
+ $this->_newobj();
1958
+ $this->_out('<</Length '.strlen($fontstream));
1959
+ $this->_out('/Filter /FlateDecode');
1960
+ $this->_out('/Length1 '.$ttfontsize);
1961
+ $this->_out('>>');
1962
+ $this->_putstream($fontstream);
1963
+ $this->_out('endobj');
1964
+ unset($ttf);
1965
+ }
1966
+ else
1967
+ {
1968
+ // Allow for additional types
1969
+ $this->fonts[$k]['n'] = $this->n+1;
1970
+ $mtd='_put'.strtolower($type);
1971
+ if(!method_exists($this,$mtd))
1972
+ $this->Error('Unsupported font type: '.$type);
1973
+ $this->$mtd($font);
1974
+ }
1975
+ }
1976
+ }
1977
+
1978
+ function _putTTfontwidths(&$font, $maxUni) {
1979
+ if (file_exists($font['unifilename'].'.cw127.php')) {
1980
+ include($font['unifilename'].'.cw127.php') ;
1981
+ $startcid = 128;
1982
+ }
1983
+ else {
1984
+ $rangeid = 0;
1985
+ $range = array();
1986
+ $prevcid = -2;
1987
+ $prevwidth = -1;
1988
+ $interval = false;
1989
+ $startcid = 1;
1990
+ }
1991
+ $cwlen = $maxUni + 1;
1992
+
1993
+ // for each character
1994
+ for ($cid=$startcid; $cid<$cwlen; $cid++) {
1995
+ if ($cid==128 && (!file_exists($font['unifilename'].'.cw127.php'))) {
1996
+ if (is_writable(dirname($this->_getfontpath().'unifont/x'))) {
1997
+ $fh = fopen($font['unifilename'].'.cw127.php',"wb");
1998
+ $cw127='<?php'."\n";
1999
+ $cw127.='$rangeid='.$rangeid.";\n";
2000
+ $cw127.='$prevcid='.$prevcid.";\n";
2001
+ $cw127.='$prevwidth='.$prevwidth.";\n";
2002
+ if ($interval) { $cw127.='$interval=true'.";\n"; }
2003
+ else { $cw127.='$interval=false'.";\n"; }
2004
+ $cw127.='$range='.var_export($range,true).";\n";
2005
+ $cw127.="?>";
2006
+ fwrite($fh,$cw127,strlen($cw127));
2007
+ fclose($fh);
2008
+ }
2009
+ }
2010
+ if ($font['cw'][$cid*2] == "\00" && $font['cw'][$cid*2+1] == "\00") { continue; }
2011
+ $width = (ord($font['cw'][$cid*2]) << 8) + ord($font['cw'][$cid*2+1]);
2012
+ if ($width == 65535) { $width = 0; }
2013
+ if ($cid > 255 && (!isset($font['subset'][$cid]) || !$font['subset'][$cid])) { continue; }
2014
+ if (!isset($font['dw']) || (isset($font['dw']) && $width != $font['dw'])) {
2015
+ if ($cid == ($prevcid + 1)) {
2016
+ if ($width == $prevwidth) {
2017
+ if ($width == $range[$rangeid][0]) {
2018
+ $range[$rangeid][] = $width;
2019
+ }
2020
+ else {
2021
+ array_pop($range[$rangeid]);
2022
+ // new range
2023
+ $rangeid = $prevcid;
2024
+ $range[$rangeid] = array();
2025
+ $range[$rangeid][] = $prevwidth;
2026
+ $range[$rangeid][] = $width;
2027
+ }
2028
+ $interval = true;
2029
+ $range[$rangeid]['interval'] = true;
2030
+ } else {
2031
+ if ($interval) {
2032
+ // new range
2033
+ $rangeid = $cid;
2034
+ $range[$rangeid] = array();
2035
+ $range[$rangeid][] = $width;
2036
+ }
2037
+ else { $range[$rangeid][] = $width; }
2038
+ $interval = false;
2039
+ }
2040
+ } else {
2041
+ $rangeid = $cid;
2042
+ $range[$rangeid] = array();
2043
+ $range[$rangeid][] = $width;
2044
+ $interval = false;
2045
+ }
2046
+ $prevcid = $cid;
2047
+ $prevwidth = $width;
2048
+ }
2049
+ }
2050
+ $prevk = -1;
2051
+ $nextk = -1;
2052
+ $prevint = false;
2053
+ foreach ($range as $k => $ws) {
2054
+ $cws = count($ws);
2055
+ if (($k == $nextk) AND (!$prevint) AND ((!isset($ws['interval'])) OR ($cws < 4))) {
2056
+ if (isset($range[$k]['interval'])) { unset($range[$k]['interval']); }
2057
+ $range[$prevk] = array_merge($range[$prevk], $range[$k]);
2058
+ unset($range[$k]);
2059
+ }
2060
+ else { $prevk = $k; }
2061
+ $nextk = $k + $cws;
2062
+ if (isset($ws['interval'])) {
2063
+ if ($cws > 3) { $prevint = true; }
2064
+ else { $prevint = false; }
2065
+ unset($range[$k]['interval']);
2066
+ --$nextk;
2067
+ }
2068
+ else { $prevint = false; }
2069
+ }
2070
+ $w = '';
2071
+ foreach ($range as $k => $ws) {
2072
+ if (count(array_count_values($ws)) == 1) { $w .= ' '.$k.' '.($k + count($ws) - 1).' '.$ws[0]; }
2073
+ else { $w .= ' '.$k.' [ '.implode(' ', $ws).' ]' . "\n"; }
2074
+ }
2075
+ $this->_out('/W ['.$w.' ]');
2076
+ }
2077
+
2078
+ function _putimages()
2079
+ {
2080
+ foreach(array_keys($this->images) as $file)
2081
+ {
2082
+ $this->_putimage($this->images[$file]);
2083
+ unset($this->images[$file]['data']);
2084
+ unset($this->images[$file]['smask']);
2085
+ }
2086
+ }
2087
+
2088
+ function _putimage(&$info)
2089
+ {
2090
+ $this->_newobj();
2091
+ $info['n'] = $this->n;
2092
+ $this->_out('<</Type /XObject');
2093
+ $this->_out('/Subtype /Image');
2094
+ $this->_out('/Width '.$info['w']);
2095
+ $this->_out('/Height '.$info['h']);
2096
+ if($info['cs']=='Indexed')
2097
+ $this->_out('/ColorSpace [/Indexed /DeviceRGB '.(strlen($info['pal'])/3-1).' '.($this->n+1).' 0 R]');
2098
+ else
2099
+ {
2100
+ $this->_out('/ColorSpace /'.$info['cs']);
2101
+ if($info['cs']=='DeviceCMYK')
2102
+ $this->_out('/Decode [1 0 1 0 1 0 1 0]');
2103
+ }
2104
+ $this->_out('/BitsPerComponent '.$info['bpc']);
2105
+ if(isset($info['f']))
2106
+ $this->_out('/Filter /'.$info['f']);
2107
+ if(isset($info['dp']))
2108
+ $this->_out('/DecodeParms <<'.$info['dp'].'>>');
2109
+ if(isset($info['trns']) && is_array($info['trns']))
2110
+ {
2111
+ $trns = '';
2112
+ for($i=0;$i<count($info['trns']);$i++)
2113
+ $trns .= $info['trns'][$i].' '.$info['trns'][$i].' ';
2114
+ $this->_out('/Mask ['.$trns.']');
2115
+ }
2116
+ if(isset($info['smask']))
2117
+ $this->_out('/SMask '.($this->n+1).' 0 R');
2118
+ $this->_out('/Length '.strlen($info['data']).'>>');
2119
+ $this->_putstream($info['data']);
2120
+ $this->_out('endobj');
2121
+ // Soft mask
2122
+ if(isset($info['smask']))
2123
+ {
2124
+ $dp = '/Predictor 15 /Colors 1 /BitsPerComponent 8 /Columns '.$info['w'];
2125
+ $smask = array('w'=>$info['w'], 'h'=>$info['h'], 'cs'=>'DeviceGray', 'bpc'=>8, 'f'=>$info['f'], 'dp'=>$dp, 'data'=>$info['smask']);
2126
+ $this->_putimage($smask);
2127
+ }
2128
+ // Palette
2129
+ if($info['cs']=='Indexed')
2130
+ {
2131
+ $filter = ($this->compress) ? '/Filter /FlateDecode ' : '';
2132
+ $pal = ($this->compress) ? gzcompress($info['pal']) : $info['pal'];
2133
+ $this->_newobj();
2134
+ $this->_out('<<'.$filter.'/Length '.strlen($pal).'>>');
2135
+ $this->_putstream($pal);
2136
+ $this->_out('endobj');
2137
+ }
2138
+ }
2139
+
2140
+ function _putxobjectdict()
2141
+ {
2142
+ foreach($this->images as $image)
2143
+ $this->_out('/I'.$image['i'].' '.$image['n'].' 0 R');
2144
+ }
2145
+
2146
+ function _putresourcedict()
2147
+ {
2148
+ $this->_out('/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]');
2149
+ $this->_out('/Font <<');
2150
+ foreach($this->fonts as $font) {
2151
+ $this->_out('/F'.$font['i'].' '.$font['n'].' 0 R');
2152
+ }
2153
+ $this->_out('>>');
2154
+ $this->_out('/XObject <<');
2155
+ $this->_putxobjectdict();
2156
+ $this->_out('>>');
2157
+ }
2158
+
2159
+ function _putresources()
2160
+ {
2161
+ $this->_putfonts();
2162
+ $this->_putimages();
2163
+ // Resource dictionary
2164
+ $this->offsets[2] = strlen($this->buffer);
2165
+ $this->_out('2 0 obj');
2166
+ $this->_out('<<');
2167
+ $this->_putresourcedict();
2168
+ $this->_out('>>');
2169
+ $this->_out('endobj');
2170
+ }
2171
+
2172
+ function _putinfo()
2173
+ {
2174
+ $this->_out('/Producer '.$this->_textstring('tFPDF '.tFPDF_VERSION));
2175
+ if(!empty($this->title))
2176
+ $this->_out('/Title '.$this->_textstring($this->title));
2177
+ if(!empty($this->subject))
2178
+ $this->_out('/Subject '.$this->_textstring($this->subject));
2179
+ if(!empty($this->author))
2180
+ $this->_out('/Author '.$this->_textstring($this->author));
2181
+ if(!empty($this->keywords))
2182
+ $this->_out('/Keywords '.$this->_textstring($this->keywords));
2183
+ if(!empty($this->creator))
2184
+ $this->_out('/Creator '.$this->_textstring($this->creator));
2185
+ $this->_out('/CreationDate '.$this->_textstring('D:'.@date('YmdHis')));
2186
+ }
2187
+
2188
+ function _putcatalog()
2189
+ {
2190
+ $this->_out('/Type /Catalog');
2191
+ $this->_out('/Pages 1 0 R');
2192
+ if($this->ZoomMode=='fullpage')
2193
+ $this->_out('/OpenAction [3 0 R /Fit]');
2194
+ elseif($this->ZoomMode=='fullwidth')
2195
+ $this->_out('/OpenAction [3 0 R /FitH null]');
2196
+ elseif($this->ZoomMode=='real')
2197
+ $this->_out('/OpenAction [3 0 R /XYZ null null 1]');
2198
+ elseif(!is_string($this->ZoomMode))
2199
+ $this->_out('/OpenAction [3 0 R /XYZ null null '.sprintf('%.2F',$this->ZoomMode/100).']');
2200
+ if($this->LayoutMode=='single')
2201
+ $this->_out('/PageLayout /SinglePage');
2202
+ elseif($this->LayoutMode=='continuous')
2203
+ $this->_out('/PageLayout /OneColumn');
2204
+ elseif($this->LayoutMode=='two')
2205
+ $this->_out('/PageLayout /TwoColumnLeft');
2206
+ }
2207
+
2208
+ function _putheader()
2209
+ {
2210
+ $this->_out('%PDF-'.$this->PDFVersion);
2211
+ }
2212
+
2213
+ function _puttrailer()
2214
+ {
2215
+ $this->_out('/Size '.($this->n+1));
2216
+ $this->_out('/Root '.$this->n.' 0 R');
2217
+ $this->_out('/Info '.($this->n-1).' 0 R');
2218
+ }
2219
+
2220
+ function _enddoc()
2221
+ {
2222
+ $this->_putheader();
2223
+ $this->_putpages();
2224
+ $this->_putresources();
2225
+ // Info
2226
+ $this->_newobj();
2227
+ $this->_out('<<');
2228
+ $this->_putinfo();
2229
+ $this->_out('>>');
2230
+ $this->_out('endobj');
2231
+ // Catalog
2232
+ $this->_newobj();
2233
+ $this->_out('<<');
2234
+ $this->_putcatalog();
2235
+ $this->_out('>>');
2236
+ $this->_out('endobj');
2237
+ // Cross-ref
2238
+ $o = strlen($this->buffer);
2239
+ $this->_out('xref');
2240
+ $this->_out('0 '.($this->n+1));
2241
+ $this->_out('0000000000 65535 f ');
2242
+ for($i=1;$i<=$this->n;$i++)
2243
+ $this->_out(sprintf('%010d 00000 n ',$this->offsets[$i]));
2244
+ // Trailer
2245
+ $this->_out('trailer');
2246
+ $this->_out('<<');
2247
+ $this->_puttrailer();
2248
+ $this->_out('>>');
2249
+ $this->_out('startxref');
2250
+ $this->_out($o);
2251
+ $this->_out('%%EOF');
2252
+ $this->state = 3;
2253
+ }
2254
+
2255
+ // ********* NEW FUNCTIONS *********
2256
+ // Converts UTF-8 strings to UTF16-BE.
2257
+ function UTF8ToUTF16BE($str, $setbom=true) {
2258
+ $outstr = "";
2259
+ if ($setbom) {
2260
+ $outstr .= "\xFE\xFF"; // Byte Order Mark (BOM)
2261
+ }
2262
+ $outstr .= mb_convert_encoding($str, 'UTF-16BE', 'UTF-8');
2263
+ return $outstr;
2264
+ }
2265
+
2266
+ // Converts UTF-8 strings to codepoints array
2267
+ function UTF8StringToArray($str) {
2268
+ $out = array();
2269
+ $len = strlen($str);
2270
+ for ($i = 0; $i < $len; $i++) {
2271
+ $uni = -1;
2272
+ $h = ord($str[$i]);
2273
+ if ( $h <= 0x7F )
2274
+ $uni = $h;
2275
+ elseif ( $h >= 0xC2 ) {
2276
+ if ( ($h <= 0xDF) && ($i < $len -1) )
2277
+ $uni = ($h & 0x1F) << 6 | (ord($str[++$i]) & 0x3F);
2278
+ elseif ( ($h <= 0xEF) && ($i < $len -2) )
2279
+ $uni = ($h & 0x0F) << 12 | (ord($str[++$i]) & 0x3F) << 6
2280
+ | (ord($str[++$i]) & 0x3F);
2281
+ elseif ( ($h <= 0xF4) && ($i < $len -3) )
2282
+ $uni = ($h & 0x0F) << 18 | (ord($str[++$i]) & 0x3F) << 12
2283
+ | (ord($str[++$i]) & 0x3F) << 6
2284
+ | (ord($str[++$i]) & 0x3F);
2285
+ }
2286
+ if ($uni >= 0) {
2287
+ $out[] = $uni;
2288
+ }
2289
+ }
2290
+ return $out;
2291
+ }
2292
+ }
2293
+
2294
+ // Handle special IE contype request
2295
+ if(isset($_SERVER['HTTP_USER_AGENT']) && $_SERVER['HTTP_USER_AGENT'] == 'contype')
2296
+ {
2297
+ header('Content-Type: application/pdf');
2298
+ exit;
2299
+ }
app/api/index.html ADDED
File without changes
app/controller.php ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /** no direct access **/
3
+ defined('MECEXEC') or die();
4
+
5
+ /**
6
+ * Webnus MEC controller class.
7
+ * @author Webnus <info@webnus.biz>
8
+ */
9
+ class MEC_controller extends MEC_base
10
+ {
11
+ /**
12
+ * Constructor method
13
+ * @author Webnus <info@webnus.biz>
14
+ */
15
+ public function __construct()
16
+ {
17
+ }
18
+ }
app/crons/index.html ADDED
File without changes
app/features/colors.php ADDED
@@ -0,0 +1,104 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /** no direct access **/
3
+ defined('MECEXEC') or die();
4
+
5
+ /**
6
+ * Webnus MEC colors class.
7
+ * @author Webnus <info@webnus.biz>
8
+ */
9
+ class MEC_feature_colors extends MEC_base
10
+ {
11
+ /**
12
+ * @var MEC_factory
13
+ */
14
+ public $factory;
15
+
16
+ /**
17
+ * @var MEC_main
18
+ */
19
+ public $main;
20
+
21
+ /**
22
+ * Constructor method
23
+ * @author Webnus <info@webnus.biz>
24
+ */
25
+ public function __construct()
26
+ {
27
+ // Import MEC Factory
28
+ $this->factory = $this->getFactory();
29
+
30
+ // Import MEC Main
31
+ $this->main = $this->getMain();
32
+ }
33
+
34
+ /**
35
+ * Initialize colors feature
36
+ * @author Webnus <info@webnus.biz>
37
+ */
38
+ public function init()
39
+ {
40
+ $this->factory->action('add_meta_boxes', array($this, 'register_meta_boxes'));
41
+ $this->factory->action('save_post', array($this, 'save_event'), 3);
42
+ }
43
+
44
+ /**
45
+ * Registers color meta box
46
+ * @author Webnus <info@webnus.biz>
47
+ */
48
+ public function register_meta_boxes()
49
+ {
50
+ add_meta_box('mec_metabox_color', __('Event Color', 'mec'), array($this, 'meta_box_colors'), $this->main->get_main_post_type(), 'side');
51
+ }
52
+
53
+ /**
54
+ * Show color meta box content
55
+ * @author Webnus <info@webnus.biz>
56
+ * @param object $post
57
+ */
58
+ public function meta_box_colors($post)
59
+ {
60
+ $color = get_post_meta($post->ID, 'mec_color', true);
61
+ $available_colors = $this->main->get_available_colors();
62
+
63
+ if(!trim($color)) $color = $available_colors[0];
64
+ ?>
65
+ <div class="mec-meta-box-colors-container">
66
+ <div class="mec-form-row">
67
+ <input type="text" id="mec_event_color" name="mec[color]" value="#<?php echo $color; ?>" data-default-color="#<?php echo $color; ?>" class="mec-color-picker" />
68
+ </div>
69
+ <div class="mec-form-row mec-available-color-row">
70
+ <?php foreach($available_colors as $available_color): ?>
71
+ <span class="mec-color" onclick="mec_set_event_color('<?php echo $available_color; ?>');" style="background-color: #<?php echo $available_color; ?>"></span>
72
+ <?php endforeach; ?>
73
+ </div>
74
+ </div>
75
+ <?php
76
+ }
77
+
78
+ /**
79
+ * Save color of event
80
+ * @author Webnus <info@webnus.biz>
81
+ * @param int $post_id
82
+ * @return void
83
+ */
84
+ public function save_event($post_id)
85
+ {
86
+ // Check if our nonce is set.
87
+ if(!isset($_POST['mec_event_nonce'])) return;
88
+
89
+ // Verify that the nonce is valid.
90
+ if(!wp_verify_nonce(sanitize_text_field($_POST['mec_event_nonce']), 'mec_event_data')) return;
91
+
92
+ // If this is an autosave, our form has not been submitted, so we don't want to do anything.
93
+ if(defined('DOING_AUTOSAVE') and DOING_AUTOSAVE) return;
94
+
95
+ // Get Modern Events Calendar Data
96
+ $_mec = isset($_POST['mec']) ? $_POST['mec'] : array();
97
+
98
+ $color = isset($_mec['color']) ? trim(sanitize_text_field($_mec['color']), '# ') : '';
99
+ update_post_meta($post_id, 'mec_color', $color);
100
+
101
+ // Add the new color to available colors
102
+ if(trim($color)) $this->main->add_to_available_colors($color);
103
+ }
104
+ }
app/features/compatibility.php ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /** no direct access **/
3
+ defined('MECEXEC') or die();
4
+
5
+ /**
6
+ * Webnus MEC compatibility class.
7
+ * @author Webnus <info@webnus.biz>
8
+ */
9
+ class MEC_feature_compatibility extends MEC_base
10
+ {
11
+ /**
12
+ * @var MEC_factory
13
+ */
14
+ public $factory;
15
+
16
+ /**
17
+ * @var MEC_main
18
+ */
19
+ public $main;
20
+
21
+ /**
22
+ * To Override default HTML ID of MEC template files
23
+ * @var string
24
+ */
25
+ public $html_id = '';
26
+
27
+ /**
28
+ * To add HTML Classes to MEC template files
29
+ * @var array
30
+ */
31
+ public $html_class = array();
32
+
33
+ /**
34
+ * Constructor method
35
+ * @author Webnus <info@webnus.biz>
36
+ */
37
+ public function __construct()
38
+ {
39
+ // Import MEC Factory
40
+ $this->factory = $this->getFactory();
41
+
42
+ // Import