Creative Mail – Easier WordPress & WooCommerce Email Marketing - Version 1.6.6

Version Description

Download this release

Release Info

Developer constantcontact
Plugin Icon 128x128 Creative Mail – Easier WordPress & WooCommerce Email Marketing
Version 1.6.6
Comparing to
See all releases

Code changes from version 1.6.5 to 1.6.6

Files changed (209) hide show
  1. CHANGELOG.md +3 -0
  2. README.md +2 -1
  3. composer.json +2 -2
  4. composer.lock +116 -21
  5. creative-mail-plugin.php +4 -4
  6. readme.txt +2 -1
  7. src/Helpers/EncryptionHelper.php +11 -2
  8. src/Managers/AdminManager.php +2 -1
  9. src/Managers/CheckoutManager.php +7 -7
  10. src/Managers/EmailManager.php +7 -6
  11. src/Managers/FormManager.php +2 -1
  12. src/Managers/IntegrationManager.php +2 -1
  13. src/Managers/Logs/DatadogHandler.php +153 -0
  14. src/Managers/Logs/DatadogManager.php +154 -0
  15. src/Modules/Contacts/Handlers/BlueHostBuilderPluginHandler.php +3 -3
  16. src/Modules/Contacts/Handlers/CalderaPluginHandler.php +3 -3
  17. src/Modules/Contacts/Handlers/ContactFormSevenPluginHandler.php +3 -3
  18. src/Modules/Contacts/Handlers/CreativeMailPluginHandler.php +3 -3
  19. src/Modules/Contacts/Handlers/ElementorPluginHandler.php +2 -2
  20. src/Modules/Contacts/Handlers/FormidablePluginHandler.php +10 -10
  21. src/Modules/Contacts/Handlers/GravityFormsPluginHandler.php +3 -3
  22. src/Modules/Contacts/Handlers/JetpackPluginHandler.php +3 -3
  23. src/Modules/Contacts/Handlers/NewsLetterContactFormPluginHandler.php +3 -3
  24. src/Modules/Contacts/Handlers/NinjaFormsPluginHandler.php +4 -4
  25. src/Modules/Contacts/Handlers/WooCommercePluginHandler.php +2 -2
  26. src/Modules/Contacts/Handlers/WpFormsPluginHandler.php +3 -3
  27. src/Modules/Contacts/Models/FormidableContactForm.php +1 -1
  28. src/Modules/Contacts/Processors/ContactsSyncBackgroundProcessor.php +3 -3
  29. src/Modules/Contacts/Services/ContactsSyncService.php +20 -20
  30. src/Modules/DashboardWidgetModule.php +3 -3
  31. src/Modules/FeedbackNoticeModule.php +2 -2
  32. src/views/available-integrations.php +10 -10
  33. src/views/settings.php +6 -11
  34. vendor/autoload.php +1 -1
  35. vendor/composer/autoload_classmap.php +128 -11
  36. vendor/composer/autoload_namespaces.php +0 -1
  37. vendor/composer/autoload_psr4.php +2 -0
  38. vendor/composer/autoload_real.php +4 -4
  39. vendor/composer/autoload_static.php +148 -26
  40. vendor/composer/installed.json +119 -22
  41. vendor/mindscape/raygun4php/.gitattributes +0 -22
  42. vendor/mindscape/raygun4php/.gitignore +0 -168
  43. vendor/mindscape/raygun4php/.travis.yml +0 -12
  44. vendor/mindscape/raygun4php/CodeIgniterInstructions.md +0 -71
  45. vendor/mindscape/raygun4php/LICENSE +0 -15
  46. vendor/mindscape/raygun4php/Laravel5Instructions.md +0 -41
  47. vendor/mindscape/raygun4php/README.md +0 -337
  48. vendor/mindscape/raygun4php/SymfonyInstructions.md +0 -46
  49. vendor/mindscape/raygun4php/composer.json +0 -27
  50. vendor/mindscape/raygun4php/phpunit.xml +0 -14
  51. vendor/mindscape/raygun4php/sample-apps/.gitignore +0 -2
  52. vendor/mindscape/raygun4php/sample-apps/async-example/README.md +0 -6
  53. vendor/mindscape/raygun4php/sample-apps/async-example/composer.json +0 -6
  54. vendor/mindscape/raygun4php/sample-apps/async-example/config-sample.php +0 -2
  55. vendor/mindscape/raygun4php/sample-apps/async-example/index.php +0 -46
  56. vendor/mindscape/raygun4php/sample-apps/async-example/partials/head.php +0 -15
  57. vendor/mindscape/raygun4php/sample-apps/async-example/raygunSetup.php +0 -37
  58. vendor/mindscape/raygun4php/sample-apps/async-example/viewData.php +0 -76
  59. vendor/mindscape/raygun4php/src/Raygun4php/Exception/UnsatisfiedDependencyException.php +0 -20
  60. vendor/mindscape/raygun4php/src/Raygun4php/Exception/UnsupportedOperationException.php +0 -19
  61. vendor/mindscape/raygun4php/src/Raygun4php/Raygun4PhpException.php +0 -7
  62. vendor/mindscape/raygun4php/src/Raygun4php/RaygunClient.php +0 -565
  63. vendor/mindscape/raygun4php/src/Raygun4php/RaygunClientMessage.php +0 -17
  64. vendor/mindscape/raygun4php/src/Raygun4php/RaygunEnvironmentMessage.php +0 -19
  65. vendor/mindscape/raygun4php/src/Raygun4php/RaygunExceptionMessage.php +0 -155
  66. vendor/mindscape/raygun4php/src/Raygun4php/RaygunExceptionTraceLineMessage.php +0 -19
  67. vendor/mindscape/raygun4php/src/Raygun4php/RaygunIdentifier.php +0 -28
  68. vendor/mindscape/raygun4php/src/Raygun4php/RaygunMessage.php +0 -33
  69. vendor/mindscape/raygun4php/src/Raygun4php/RaygunMessageDetails.php +0 -18
  70. vendor/mindscape/raygun4php/src/Raygun4php/RaygunRequestMessage.php +0 -119
  71. vendor/mindscape/raygun4php/src/Raygun4php/Uuid.php +0 -1172
  72. vendor/mindscape/raygun4php/src/Raygun4php/cacert.crt +0 -3895
  73. vendor/mindscape/raygun4php/testbootstrap.php +0 -3
  74. vendor/mindscape/raygun4php/tests/RaygunClientTest.php +0 -128
  75. vendor/mindscape/raygun4php/tests/RaygunMessageTest.php +0 -30
  76. vendor/monolog/monolog/CHANGELOG.md +608 -0
  77. vendor/monolog/monolog/LICENSE +19 -0
  78. vendor/monolog/monolog/README.md +112 -0
  79. vendor/monolog/monolog/UPGRADE.md +72 -0
  80. vendor/monolog/monolog/composer.json +81 -0
  81. vendor/monolog/monolog/src/Monolog/Attribute/AsMonologProcessor.php +46 -0
  82. vendor/monolog/monolog/src/Monolog/DateTimeImmutable.php +49 -0
  83. vendor/monolog/monolog/src/Monolog/ErrorHandler.php +307 -0
  84. vendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php +83 -0
  85. vendor/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php +89 -0
  86. vendor/monolog/monolog/src/Monolog/Formatter/ElasticsearchFormatter.php +89 -0
  87. vendor/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php +111 -0
  88. vendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php +88 -0
  89. vendor/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php +42 -0
  90. vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php +160 -0
  91. vendor/monolog/monolog/src/Monolog/Formatter/GoogleCloudLoggingFormatter.php +39 -0
  92. vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php +142 -0
  93. vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php +224 -0
  94. vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php +246 -0
  95. vendor/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php +45 -0
  96. vendor/monolog/monolog/src/Monolog/Formatter/LogmaticFormatter.php +66 -0
  97. vendor/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php +101 -0
  98. vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php +162 -0
  99. vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php +287 -0
  100. vendor/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php +51 -0
  101. vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php +139 -0
  102. vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php +112 -0
  103. vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php +69 -0
  104. vendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php +106 -0
  105. vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php +170 -0
  106. vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php +293 -0
  107. vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php +167 -0
  108. vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php +196 -0
  109. vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php +77 -0
  110. vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php +167 -0
  111. vendor/monolog/monolog/src/Monolog/Handler/Curl/Util.php +71 -0
  112. vendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php +186 -0
  113. vendor/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php +47 -0
  114. vendor/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php +104 -0
  115. vendor/monolog/monolog/src/Monolog/Handler/ElasticaHandler.php +129 -0
  116. vendor/monolog/monolog/src/Monolog/Handler/ElasticsearchHandler.php +218 -0
  117. vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php +91 -0
  118. vendor/monolog/monolog/src/Monolog/Handler/FallbackGroupHandler.php +71 -0
  119. vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php +212 -0
  120. vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php +29 -0
  121. vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php +77 -0
  122. vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php +46 -0
  123. vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php +252 -0
  124. vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php +180 -0
  125. vendor/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php +135 -0
  126. vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php +132 -0
  127. vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerInterface.php +37 -0
  128. vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerTrait.php +60 -0
  129. vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php +57 -0
  130. vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php +132 -0
  131. vendor/monolog/monolog/src/Monolog/Handler/Handler.php +62 -0
  132. vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php +85 -0
  133. vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php +136 -0
  134. vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php +74 -0
  135. vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php +76 -0
  136. vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php +70 -0
  137. vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php +160 -0
  138. vendor/monolog/monolog/src/Monolog/Handler/LogmaticHandler.php +106 -0
  139. vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php +95 -0
  140. vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php +83 -0
  141. vendor/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php +21 -0
  142. vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php +86 -0
  143. vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php +174 -0
  144. vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php +199 -0
  145. vendor/monolog/monolog/src/Monolog/Handler/NoopHandler.php +40 -0
  146. vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php +60 -0
  147. vendor/monolog/monolog/src/Monolog/Handler/OverflowHandler.php +149 -0
  148. vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php +263 -0
  149. vendor/monolog/monolog/src/Monolog/Handler/ProcessHandler.php +191 -0
  150. vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerInterface.php +44 -0
  151. vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerTrait.php +77 -0
  152. vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php +95 -0
  153. vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php +246 -0
  154. vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php +101 -0
  155. vendor/monolog/monolog/src/Monolog/Handler/RedisPubSubHandler.php +67 -0
  156. vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php +131 -0
  157. vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php +207 -0
  158. vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php +132 -0
  159. vendor/monolog/monolog/src/Monolog/Handler/SendGridHandler.php +102 -0
  160. vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php +387 -0
  161. vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php +256 -0
  162. vendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php +130 -0
  163. vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php +448 -0
  164. vendor/monolog/monolog/src/Monolog/Handler/SqsHandler.php +62 -0
  165. vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php +221 -0
  166. vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php +115 -0
  167. vendor/monolog/monolog/src/Monolog/Handler/SymfonyMailerHandler.php +111 -0
  168. vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php +68 -0
  169. vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php +88 -0
  170. vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php +150 -0
  171. vendor/monolog/monolog/src/Monolog/Handler/TelegramBotHandler.php +274 -0
  172. vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php +231 -0
  173. vendor/monolog/monolog/src/Monolog/Handler/WebRequestRecognizerTrait.php +24 -0
  174. vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php +67 -0
  175. vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php +101 -0
  176. vendor/monolog/monolog/src/Monolog/LogRecord.php +34 -0
  177. vendor/monolog/monolog/src/Monolog/Logger.php +701 -0
  178. vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php +77 -0
  179. vendor/monolog/monolog/src/Monolog/Processor/HostnameProcessor.php +36 -0
  180. vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php +123 -0
  181. vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php +37 -0
  182. vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php +61 -0
  183. vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php +37 -0
  184. vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php +77 -0
  185. vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php +30 -0
  186. vendor/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php +30 -0
  187. vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php +86 -0
  188. vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php +61 -0
  189. vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php +59 -0
  190. vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php +111 -0
  191. vendor/monolog/monolog/src/Monolog/Registry.php +134 -0
  192. vendor/monolog/monolog/src/Monolog/ResettableInterface.php +34 -0
  193. vendor/monolog/monolog/src/Monolog/SignalHandler.php +120 -0
  194. vendor/monolog/monolog/src/Monolog/Test/TestCase.php +85 -0
  195. vendor/monolog/monolog/src/Monolog/Utils.php +284 -0
  196. vendor/psr/log/LICENSE +19 -0
  197. vendor/psr/log/Psr/Log/AbstractLogger.php +128 -0
  198. vendor/psr/log/Psr/Log/InvalidArgumentException.php +7 -0
  199. vendor/psr/log/Psr/Log/LogLevel.php +18 -0
  200. vendor/psr/log/Psr/Log/LoggerAwareInterface.php +18 -0
  201. vendor/psr/log/Psr/Log/LoggerAwareTrait.php +26 -0
  202. vendor/psr/log/Psr/Log/LoggerInterface.php +125 -0
  203. vendor/psr/log/Psr/Log/LoggerTrait.php +142 -0
  204. vendor/psr/log/Psr/Log/NullLogger.php +30 -0
  205. vendor/psr/log/Psr/Log/Test/DummyTest.php +18 -0
  206. vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php +138 -0
  207. vendor/psr/log/Psr/Log/Test/TestLogger.php +147 -0
  208. vendor/psr/log/README.md +58 -0
  209. vendor/psr/log/composer.json +26 -0
CHANGELOG.md CHANGED
@@ -1,5 +1,8 @@
1
  Changelog
2
  =========
 
 
 
3
  #### 1.6.5 - November 30th, 2022
4
  - Abandoned Cart improvements
5
 
1
  Changelog
2
  =========
3
+ #### 1.6.6 - December 14th, 2022
4
+ - Better security fixes
5
+
6
  #### 1.6.5 - November 30th, 2022
7
  - Abandoned Cart improvements
8
 
README.md CHANGED
@@ -3,7 +3,7 @@ Contributors: Newfold Digital
3
  Tags: email, marketing, newsletter, subscribe, contact form, crm, automations, campaigns, ecommerce, promotion, offers, retargeting, newfold, newfold digital, correo electronico
4
  Requires at least: 4.9
5
  Tested up to: 6.1
6
- Stable tag: 1.6.5
7
  License: GPLv2 or later
8
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
  Requires PHP: 7.2
@@ -92,6 +92,7 @@ Creative Mail [Privacy Notice](https://newfold.com/privacy-center)
92
  6. Enhance your brand with LogoBuilder
93
 
94
  == Changelog ==
 
95
  * 1.6.5 - Abandoned Cart improvements
96
  * 1.6.4 - Branding refactor
97
  * 1.6.3 - Hotfix: Fixed a bug where the plugin was not working on some servers.
3
  Tags: email, marketing, newsletter, subscribe, contact form, crm, automations, campaigns, ecommerce, promotion, offers, retargeting, newfold, newfold digital, correo electronico
4
  Requires at least: 4.9
5
  Tested up to: 6.1
6
+ Stable tag: 1.6.6
7
  License: GPLv2 or later
8
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
  Requires PHP: 7.2
92
  6. Enhance your brand with LogoBuilder
93
 
94
  == Changelog ==
95
+ * 1.6.6 - Better security fixes
96
  * 1.6.5 - Abandoned Cart improvements
97
  * 1.6.4 - Branding refactor
98
  * 1.6.3 - Hotfix: Fixed a bug where the plugin was not working on some servers.
composer.json CHANGED
@@ -9,9 +9,9 @@
9
  "ext-json": "*",
10
  "a5hleyrich/wp-background-processing": "^1.0",
11
  "ext-zip": "*",
12
- "mindscape/raygun4php": "1.*",
13
  "squizlabs/php_codesniffer": "*",
14
- "phpcompatibility/php-compatibility": "^9.3"
 
15
  },
16
  "autoload": {
17
  "psr-4": {
9
  "ext-json": "*",
10
  "a5hleyrich/wp-background-processing": "^1.0",
11
  "ext-zip": "*",
 
12
  "squizlabs/php_codesniffer": "*",
13
+ "phpcompatibility/php-compatibility": "^9.3",
14
+ "monolog/monolog": "^2.8"
15
  },
16
  "autoload": {
17
  "psr-4": {
composer.lock CHANGED
@@ -4,7 +4,7 @@
4
  "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
5
  "This file is @generated automatically"
6
  ],
7
- "content-hash": "5ad81651576102a4444707540c3dfb6c",
8
  "packages": [
9
  {
10
  "name": "a5hleyrich/wp-background-processing",
@@ -161,32 +161,71 @@
161
  "time": "2021-11-08T20:18:51+00:00"
162
  },
163
  {
164
- "name": "mindscape/raygun4php",
165
- "version": "v1.8.5",
166
  "source": {
167
  "type": "git",
168
- "url": "https://github.com/MindscapeHQ/raygun4php.git",
169
- "reference": "ab5401d7bd042ce69810763274d250ac9c10068a"
170
  },
171
  "dist": {
172
  "type": "zip",
173
- "url": "https://api.github.com/repos/MindscapeHQ/raygun4php/zipball/ab5401d7bd042ce69810763274d250ac9c10068a",
174
- "reference": "ab5401d7bd042ce69810763274d250ac9c10068a",
175
  "shasum": ""
176
  },
177
  "require": {
178
- "php": ">=5.3.0"
 
 
 
 
179
  },
180
  "require-dev": {
181
- "phpunit/phpunit": "^4.8.16"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
182
  },
183
  "suggest": {
184
- "ext-curl": "*"
 
 
 
 
 
 
 
 
 
 
 
 
 
185
  },
186
  "type": "library",
 
 
 
 
 
187
  "autoload": {
188
- "psr-0": {
189
- "Raygun4php": "src/"
190
  }
191
  },
192
  "notification-url": "https://packagist.org/downloads/",
@@ -195,20 +234,29 @@
195
  ],
196
  "authors": [
197
  {
198
- "name": "Mindscape",
199
- "email": "contact@mindscape.co.nz",
200
- "homepage": "http://www.mindscapehq.com"
201
  }
202
  ],
203
- "description": "Raygun.io client for PHP 5.3, to send errors and exceptions automatically.",
204
- "homepage": "http://raygun.io",
205
  "keywords": [
206
- "errors",
207
- "exceptions",
208
  "logging",
209
- "raygun"
 
 
 
 
 
 
 
 
 
 
210
  ],
211
- "time": "2022-07-11T22:19:37+00:00"
212
  },
213
  {
214
  "name": "paragonie/random_compat",
@@ -313,6 +361,53 @@
313
  ],
314
  "time": "2019-12-27T09:44:58+00:00"
315
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
316
  {
317
  "name": "squizlabs/php_codesniffer",
318
  "version": "3.7.1",
4
  "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
5
  "This file is @generated automatically"
6
  ],
7
+ "content-hash": "6b0d02223fe213ac12e7f86b37369ff6",
8
  "packages": [
9
  {
10
  "name": "a5hleyrich/wp-background-processing",
161
  "time": "2021-11-08T20:18:51+00:00"
162
  },
163
  {
164
+ "name": "monolog/monolog",
165
+ "version": "2.8.0",
166
  "source": {
167
  "type": "git",
168
+ "url": "https://github.com/Seldaek/monolog.git",
169
+ "reference": "720488632c590286b88b80e62aa3d3d551ad4a50"
170
  },
171
  "dist": {
172
  "type": "zip",
173
+ "url": "https://api.github.com/repos/Seldaek/monolog/zipball/720488632c590286b88b80e62aa3d3d551ad4a50",
174
+ "reference": "720488632c590286b88b80e62aa3d3d551ad4a50",
175
  "shasum": ""
176
  },
177
  "require": {
178
+ "php": ">=7.2",
179
+ "psr/log": "^1.0.1 || ^2.0 || ^3.0"
180
+ },
181
+ "provide": {
182
+ "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0"
183
  },
184
  "require-dev": {
185
+ "aws/aws-sdk-php": "^2.4.9 || ^3.0",
186
+ "doctrine/couchdb": "~1.0@dev",
187
+ "elasticsearch/elasticsearch": "^7 || ^8",
188
+ "ext-json": "*",
189
+ "graylog2/gelf-php": "^1.4.2",
190
+ "guzzlehttp/guzzle": "^7.4",
191
+ "guzzlehttp/psr7": "^2.2",
192
+ "mongodb/mongodb": "^1.8",
193
+ "php-amqplib/php-amqplib": "~2.4 || ^3",
194
+ "phpspec/prophecy": "^1.15",
195
+ "phpstan/phpstan": "^0.12.91",
196
+ "phpunit/phpunit": "^8.5.14",
197
+ "predis/predis": "^1.1 || ^2.0",
198
+ "rollbar/rollbar": "^1.3 || ^2 || ^3",
199
+ "ruflin/elastica": "^7",
200
+ "swiftmailer/swiftmailer": "^5.3|^6.0",
201
+ "symfony/mailer": "^5.4 || ^6",
202
+ "symfony/mime": "^5.4 || ^6"
203
  },
204
  "suggest": {
205
+ "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
206
+ "doctrine/couchdb": "Allow sending log messages to a CouchDB server",
207
+ "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client",
208
+ "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
209
+ "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler",
210
+ "ext-mbstring": "Allow to work properly with unicode symbols",
211
+ "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)",
212
+ "ext-openssl": "Required to send log messages using SSL",
213
+ "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)",
214
+ "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
215
+ "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)",
216
+ "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
217
+ "rollbar/rollbar": "Allow sending log messages to Rollbar",
218
+ "ruflin/elastica": "Allow sending log messages to an Elastic Search server"
219
  },
220
  "type": "library",
221
+ "extra": {
222
+ "branch-alias": {
223
+ "dev-main": "2.x-dev"
224
+ }
225
+ },
226
  "autoload": {
227
+ "psr-4": {
228
+ "Monolog\\": "src/Monolog"
229
  }
230
  },
231
  "notification-url": "https://packagist.org/downloads/",
234
  ],
235
  "authors": [
236
  {
237
+ "name": "Jordi Boggiano",
238
+ "email": "j.boggiano@seld.be",
239
+ "homepage": "https://seld.be"
240
  }
241
  ],
242
+ "description": "Sends your logs to files, sockets, inboxes, databases and various web services",
243
+ "homepage": "https://github.com/Seldaek/monolog",
244
  "keywords": [
245
+ "log",
 
246
  "logging",
247
+ "psr-3"
248
+ ],
249
+ "funding": [
250
+ {
251
+ "url": "https://github.com/Seldaek",
252
+ "type": "github"
253
+ },
254
+ {
255
+ "url": "https://tidelift.com/funding/github/packagist/monolog/monolog",
256
+ "type": "tidelift"
257
+ }
258
  ],
259
+ "time": "2022-07-24T11:55:47+00:00"
260
  },
261
  {
262
  "name": "paragonie/random_compat",
361
  ],
362
  "time": "2019-12-27T09:44:58+00:00"
363
  },
364
+ {
365
+ "name": "psr/log",
366
+ "version": "1.1.4",
367
+ "source": {
368
+ "type": "git",
369
+ "url": "https://github.com/php-fig/log.git",
370
+ "reference": "d49695b909c3b7628b6289db5479a1c204601f11"
371
+ },
372
+ "dist": {
373
+ "type": "zip",
374
+ "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11",
375
+ "reference": "d49695b909c3b7628b6289db5479a1c204601f11",
376
+ "shasum": ""
377
+ },
378
+ "require": {
379
+ "php": ">=5.3.0"
380
+ },
381
+ "type": "library",
382
+ "extra": {
383
+ "branch-alias": {
384
+ "dev-master": "1.1.x-dev"
385
+ }
386
+ },
387
+ "autoload": {
388
+ "psr-4": {
389
+ "Psr\\Log\\": "Psr/Log/"
390
+ }
391
+ },
392
+ "notification-url": "https://packagist.org/downloads/",
393
+ "license": [
394
+ "MIT"
395
+ ],
396
+ "authors": [
397
+ {
398
+ "name": "PHP-FIG",
399
+ "homepage": "https://www.php-fig.org/"
400
+ }
401
+ ],
402
+ "description": "Common interface for logging libraries",
403
+ "homepage": "https://github.com/php-fig/log",
404
+ "keywords": [
405
+ "log",
406
+ "psr",
407
+ "psr-3"
408
+ ],
409
+ "time": "2021-05-03T11:20:27+00:00"
410
+ },
411
  {
412
  "name": "squizlabs/php_codesniffer",
413
  "version": "3.7.1",
creative-mail-plugin.php CHANGED
@@ -9,7 +9,7 @@
9
  * Plugin URI: https://wordpress.org/plugins/creative-mail-by-constant-contact/
10
  * Description: Free email marketing designed specifically for WordPress, Jetpack and WooCommerce. Send newsletters, promotions, updates and transactional e-commerce emails. Simple and easy, powered by Newfold Digital’s rock solid reliability.
11
  * Author: Newfold Digital
12
- * Version: 1.6.5
13
  * Author URI: https://newfold.com/
14
  * WC requires at least: 3.6.0
15
  * WC tested up to: 6.8.2
@@ -20,7 +20,7 @@ use CreativeMail\Blocks\LoadBlock;
20
  define('CE4WP_PLUGIN_DIR', __DIR__ . '/');
21
  define('CE4WP_PLUGIN_URL', plugin_dir_url(__FILE__) . '/');
22
  define('CE4WP_PLUGIN_FILE', __FILE__);
23
- define('CE4WP_PLUGIN_VERSION', '1.6.5');
24
  define('CE4WP_INSTANCE_UUID_KEY', 'ce4wp_instance_uuid');
25
  define('CE4WP_INSTANCE_HANDSHAKE_TOKEN', 'ce4wp_handshake_token');
26
  define('CE4WP_INSTANCE_HANDSHAKE_EXPIRATION', 'ce4wp_handshake_expiration');
@@ -37,8 +37,8 @@ define('CE4WP_CHECKOUT_CHECKBOX_ENABLED', 'ce4wp_checkout_checkbox_enabled');
37
  define('CE4WP_APP_GATEWAY_URL', 'https://app-gateway.creativemail.com/');
38
  define('CE4WP_APP_URL', 'https://app.creativemail.com/');
39
  define('CE4WP_ENVIRONMENT', 'PRODUCTION');
40
- define('CE4WP_BUILD_NUMBER', '1987');
41
- define('CE4WP_RAYGUN_PHP_KEY', 'Z85xL3mkgnW13Ri9DajGUg');
42
  define('CE4WP_BATCH_SIZE', 500);
43
  define('CE4WP_WC_API_KEY_ID', 'ce4wp_woocommerce_api_key_id');
44
  define('CE4WP_WC_API_CONSUMER_KEY', 'ce4wp_woocommerce_consumer_key');
9
  * Plugin URI: https://wordpress.org/plugins/creative-mail-by-constant-contact/
10
  * Description: Free email marketing designed specifically for WordPress, Jetpack and WooCommerce. Send newsletters, promotions, updates and transactional e-commerce emails. Simple and easy, powered by Newfold Digital’s rock solid reliability.
11
  * Author: Newfold Digital
12
+ * Version: 1.6.6
13
  * Author URI: https://newfold.com/
14
  * WC requires at least: 3.6.0
15
  * WC tested up to: 6.8.2
20
  define('CE4WP_PLUGIN_DIR', __DIR__ . '/');
21
  define('CE4WP_PLUGIN_URL', plugin_dir_url(__FILE__) . '/');
22
  define('CE4WP_PLUGIN_FILE', __FILE__);
23
+ define('CE4WP_PLUGIN_VERSION', '1.6.6');
24
  define('CE4WP_INSTANCE_UUID_KEY', 'ce4wp_instance_uuid');
25
  define('CE4WP_INSTANCE_HANDSHAKE_TOKEN', 'ce4wp_handshake_token');
26
  define('CE4WP_INSTANCE_HANDSHAKE_EXPIRATION', 'ce4wp_handshake_expiration');
37
  define('CE4WP_APP_GATEWAY_URL', 'https://app-gateway.creativemail.com/');
38
  define('CE4WP_APP_URL', 'https://app.creativemail.com/');
39
  define('CE4WP_ENVIRONMENT', 'PRODUCTION');
40
+ define('CE4WP_BUILD_NUMBER', '2004');
41
+ define('CE4WP_DATADOG_API_KEY', 'pub0da48851ee228f7358831087e7652909');
42
  define('CE4WP_BATCH_SIZE', 500);
43
  define('CE4WP_WC_API_KEY_ID', 'ce4wp_woocommerce_api_key_id');
44
  define('CE4WP_WC_API_CONSUMER_KEY', 'ce4wp_woocommerce_consumer_key');
readme.txt CHANGED
@@ -3,7 +3,7 @@ Contributors: Newfold Digital
3
  Tags: email, marketing, newsletter, subscribe, contact form, crm, automations, campaigns, ecommerce, promotion, offers, retargeting, newfold, newfold digital, correo electronico
4
  Requires at least: 4.9
5
  Tested up to: 6.1
6
- Stable tag: 1.6.5
7
  License: GPLv2 or later
8
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
  Requires PHP: 7.2
@@ -101,6 +101,7 @@ Creative Mail [Privacy Notice](https://newfold.com/privacy-center)
101
  6. Enhance your brand with LogoBuilder
102
 
103
  == Changelog ==
 
104
  * 1.6.5 - Abandoned Cart improvements
105
  * 1.6.4 - Branding refactor
106
  * 1.6.3 - Hotfix: Fixed a bug where the plugin was not working on some servers.
3
  Tags: email, marketing, newsletter, subscribe, contact form, crm, automations, campaigns, ecommerce, promotion, offers, retargeting, newfold, newfold digital, correo electronico
4
  Requires at least: 4.9
5
  Tested up to: 6.1
6
+ Stable tag: 1.6.6
7
  License: GPLv2 or later
8
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
  Requires PHP: 7.2
101
  6. Enhance your brand with LogoBuilder
102
 
103
  == Changelog ==
104
+ * 1.6.6 - Better security fixes
105
  * 1.6.5 - Abandoned Cart improvements
106
  * 1.6.4 - Branding refactor
107
  * 1.6.3 - Hotfix: Fixed a bug where the plugin was not working on some servers.
src/Helpers/EncryptionHelper.php CHANGED
@@ -3,7 +3,7 @@
3
 
4
  namespace CreativeMail\Helpers;
5
 
6
- use CreativeMail\Managers\RaygunManager;
7
  use Defuse\Crypto\Crypto;
8
  use Defuse\Crypto\Exception\BadFormatException;
9
  use Defuse\Crypto\Exception\EnvironmentIsBrokenException;
@@ -81,10 +81,19 @@ final class EncryptionHelper {
81
  return Crypto::decrypt($encrypted, self::get_encryption_key());
82
  }
83
  } catch ( Exception $e ) {
84
- RaygunManager::get_instance()->exception_handler($e);
85
  }
86
  }
87
 
88
  return $encrypted;
89
  }
 
 
 
 
 
 
 
 
 
90
  }
3
 
4
  namespace CreativeMail\Helpers;
5
 
6
+ use CreativeMail\Managers\Logs\DatadogManager;
7
  use Defuse\Crypto\Crypto;
8
  use Defuse\Crypto\Exception\BadFormatException;
9
  use Defuse\Crypto\Exception\EnvironmentIsBrokenException;
81
  return Crypto::decrypt($encrypted, self::get_encryption_key());
82
  }
83
  } catch ( Exception $e ) {
84
+ DatadogManager::get_instance()->exception_handler($e);
85
  }
86
  }
87
 
88
  return $encrypted;
89
  }
90
+
91
+ public static function generate_x_builder_id() {
92
+ $builder_id = sprintf('%04X%04X-%04X-%04X-%04X-%04X%04X%04X', wp_rand(0, 65535), wp_rand(0, 65535), wp_rand(0, 65535), wp_rand(16384, 20479), wp_rand(32768, 49151), wp_rand(0, 65535), wp_rand(0, 65535), wp_rand(0, 65535));
93
+
94
+ if ( function_exists('com_create_guid') === true ) {
95
+ $builder_id = trim(com_create_guid(), '{}');
96
+ }
97
+ return $builder_id;
98
+ }
99
  }
src/Managers/AdminManager.php CHANGED
@@ -6,6 +6,7 @@ use CreativeMail\CreativeMail;
6
  use CreativeMail\Helpers\EnvironmentHelper;
7
  use CreativeMail\Helpers\OptionsHelper;
8
  use CreativeMail\Helpers\SsoHelper;
 
9
  use CreativeMail\Models\Response;
10
  use CreativeMail\Modules\DashboardWidgetModule;
11
  use CreativeMail\Modules\FeedbackNoticeModule;
@@ -693,7 +694,7 @@ final class AdminManager {
693
  try {
694
  return SsoHelper::generate_sso_link($instance_id, $instance_api_key, $connected_account_id, $linkReference, $linkParameters);
695
  } catch ( Exception $ex ) {
696
- RaygunManager::get_instance()->exception_handler($ex);
697
  }
698
  }
699
 
6
  use CreativeMail\Helpers\EnvironmentHelper;
7
  use CreativeMail\Helpers\OptionsHelper;
8
  use CreativeMail\Helpers\SsoHelper;
9
+ use CreativeMail\Managers\Logs\DatadogManager;
10
  use CreativeMail\Models\Response;
11
  use CreativeMail\Modules\DashboardWidgetModule;
12
  use CreativeMail\Modules\FeedbackNoticeModule;
694
  try {
695
  return SsoHelper::generate_sso_link($instance_id, $instance_api_key, $connected_account_id, $linkReference, $linkParameters);
696
  } catch ( Exception $ex ) {
697
+ DatadogManager::get_instance()->exception_handler($ex);
698
  }
699
  }
700
 
src/Managers/CheckoutManager.php CHANGED
@@ -5,13 +5,13 @@ namespace CreativeMail\Managers;
5
  use CreativeMail\CreativeMail;
6
  use CreativeMail\Helpers\EnvironmentHelper;
7
  use CreativeMail\Helpers\OptionsHelper;
 
8
  use CreativeMail\Models\CartData;
9
  use CreativeMail\Models\Checkout;
10
  use CreativeMail\Models\CheckoutSave;
11
  use CreativeMail\Models\Coupon;
12
  use CreativeMail\Models\OrderBillingPaymentDetails;
13
  use CreativeMail\Models\OrderLineItem;
14
- use CreativeMail\Models\User;
15
  use CreativeMail\Modules\Contacts\Models\OptActionBy;
16
  use CreativeMail\Models\Order;
17
  use CreativeMail\Models\OrderBilling;
@@ -211,7 +211,7 @@ final class CheckoutManager {
211
  CreativeMail::get_instance()->get_database_manager()->remove_checkout_data($checkout_data->checkout_uuid);
212
  }
213
  } catch ( Exception $e ) {
214
- RaygunManager::get_instance()->exception_handler($e);
215
  }
216
  }
217
 
@@ -566,7 +566,7 @@ final class CheckoutManager {
566
  }
567
  }
568
  } catch ( Exception $e ) {
569
- RaygunManager::get_instance()->exception_handler( $e );
570
  }
571
 
572
  return $data;
@@ -744,7 +744,7 @@ final class CheckoutManager {
744
  );
745
  }
746
  } catch ( Exception $e ) {
747
- RaygunManager::get_instance()->exception_handler( $e );
748
  }
749
  }
750
 
@@ -767,7 +767,7 @@ final class CheckoutManager {
767
  )
768
  );
769
  } catch ( Exception $e ) {
770
- RaygunManager::get_instance()->exception_handler( $e );
771
  }
772
  }
773
 
@@ -978,7 +978,7 @@ final class CheckoutManager {
978
  }
979
  }
980
  } catch ( Exception $ex ) {
981
- RaygunManager::get_instance()->exception_handler( $ex );
982
  }
983
 
984
  $src = wc_placeholder_img_src();
@@ -1018,7 +1018,7 @@ final class CheckoutManager {
1018
  )
1019
  );
1020
  } catch ( Exception $e ) {
1021
- RaygunManager::get_instance()->exception_handler( $e );
1022
  }
1023
  }
1024
 
5
  use CreativeMail\CreativeMail;
6
  use CreativeMail\Helpers\EnvironmentHelper;
7
  use CreativeMail\Helpers\OptionsHelper;
8
+ use CreativeMail\Managers\Logs\DatadogManager;
9
  use CreativeMail\Models\CartData;
10
  use CreativeMail\Models\Checkout;
11
  use CreativeMail\Models\CheckoutSave;
12
  use CreativeMail\Models\Coupon;
13
  use CreativeMail\Models\OrderBillingPaymentDetails;
14
  use CreativeMail\Models\OrderLineItem;
 
15
  use CreativeMail\Modules\Contacts\Models\OptActionBy;
16
  use CreativeMail\Models\Order;
17
  use CreativeMail\Models\OrderBilling;
211
  CreativeMail::get_instance()->get_database_manager()->remove_checkout_data($checkout_data->checkout_uuid);
212
  }
213
  } catch ( Exception $e ) {
214
+ DatadogManager::get_instance()->exception_handler($e);
215
  }
216
  }
217
 
566
  }
567
  }
568
  } catch ( Exception $e ) {
569
+ DatadogManager::get_instance()->exception_handler( $e );
570
  }
571
 
572
  return $data;
744
  );
745
  }
746
  } catch ( Exception $e ) {
747
+ DatadogManager::get_instance()->exception_handler( $e );
748
  }
749
  }
750
 
767
  )
768
  );
769
  } catch ( Exception $e ) {
770
+ DatadogManager::get_instance()->exception_handler( $e );
771
  }
772
  }
773
 
978
  }
979
  }
980
  } catch ( Exception $ex ) {
981
+ DatadogManager::get_instance()->exception_handler( $ex );
982
  }
983
 
984
  $src = wc_placeholder_img_src();
1018
  )
1019
  );
1020
  } catch ( Exception $e ) {
1021
+ DatadogManager::get_instance()->exception_handler( $e );
1022
  }
1023
  }
1024
 
src/Managers/EmailManager.php CHANGED
@@ -4,6 +4,7 @@
4
  namespace CreativeMail\Managers;
5
 
6
  use CreativeMail\CreativeMail;
 
7
  use CreativeMail\Models\CustomerNewAccount;
8
  use CreativeMail\Models\CustomerNote;
9
  use CreativeMail\Models\CustomerResetPassword;
@@ -284,7 +285,7 @@ class EmailManager {
284
  $data->salt = bin2hex( is_string($salt) ? $salt : '' );
285
  $data->generated_password = base64_encode( is_string($gp) ? $gp : '' );
286
  } catch ( Exception $ex ) {
287
- RaygunManager::get_instance()->exception_handler( $ex );
288
  }
289
  }
290
 
@@ -499,7 +500,7 @@ class EmailManager {
499
  }
500
  }
501
  } catch ( Exception $ex ) {
502
- RaygunManager::get_instance()->exception_handler( $ex );
503
  }
504
 
505
  $src = wc_placeholder_img_src();
@@ -573,7 +574,7 @@ class EmailManager {
573
  $data->order = $order_data;
574
  $with_data = true;
575
  } catch ( Exception $ex ) {
576
- RaygunManager::get_instance()->exception_handler( $ex );
577
  $with_data = false;
578
  }
579
  }
@@ -776,7 +777,7 @@ class EmailManager {
776
  return $order->get_view_order_url();
777
  }
778
  } catch ( Exception $exception ) {
779
- RaygunManager::get_instance()->exception_handler( $exception );
780
  }
781
 
782
  return null;
@@ -786,7 +787,7 @@ class EmailManager {
786
  try {
787
  return wc_get_page_permalink( 'myaccount' );
788
  } catch ( Exception $exception ) {
789
- RaygunManager::get_instance()->exception_handler( $exception );
790
  }
791
 
792
  return null;
@@ -812,7 +813,7 @@ class EmailManager {
812
 
813
  return $data;
814
  } catch ( Exception $exception ) {
815
- RaygunManager::get_instance()->exception_handler( $exception );
816
  }
817
  return null;
818
  }
4
  namespace CreativeMail\Managers;
5
 
6
  use CreativeMail\CreativeMail;
7
+ use CreativeMail\Managers\Logs\DatadogManager;
8
  use CreativeMail\Models\CustomerNewAccount;
9
  use CreativeMail\Models\CustomerNote;
10
  use CreativeMail\Models\CustomerResetPassword;
285
  $data->salt = bin2hex( is_string($salt) ? $salt : '' );
286
  $data->generated_password = base64_encode( is_string($gp) ? $gp : '' );
287
  } catch ( Exception $ex ) {
288
+ DatadogManager::get_instance()->exception_handler( $ex );
289
  }
290
  }
291
 
500
  }
501
  }
502
  } catch ( Exception $ex ) {
503
+ DatadogManager::get_instance()->exception_handler( $ex );
504
  }
505
 
506
  $src = wc_placeholder_img_src();
574
  $data->order = $order_data;
575
  $with_data = true;
576
  } catch ( Exception $ex ) {
577
+ DatadogManager::get_instance()->exception_handler( $ex );
578
  $with_data = false;
579
  }
580
  }
777
  return $order->get_view_order_url();
778
  }
779
  } catch ( Exception $exception ) {
780
+ DatadogManager::get_instance()->exception_handler( $exception );
781
  }
782
 
783
  return null;
787
  try {
788
  return wc_get_page_permalink( 'myaccount' );
789
  } catch ( Exception $exception ) {
790
+ DatadogManager::get_instance()->exception_handler( $exception );
791
  }
792
 
793
  return null;
813
 
814
  return $data;
815
  } catch ( Exception $exception ) {
816
+ DatadogManager::get_instance()->exception_handler( $exception );
817
  }
818
  return null;
819
  }
src/Managers/FormManager.php CHANGED
@@ -6,6 +6,7 @@ namespace CreativeMail\Managers;
6
  use CreativeMail\CreativeMail;
7
  use CreativeMail\Clients\CreativeMailClient;
8
  use CreativeMail\Helpers\OptionsHelper;
 
9
  use Exception;
10
 
11
  /**
@@ -72,7 +73,7 @@ class FormManager {
72
  // Insert submission into database.
73
  CreativeMail::get_instance()->get_database_manager()->insert_contact($data);
74
  } catch ( Exception $exception ) {
75
- RaygunManager::get_instance()->exception_handler($exception);
76
  }
77
 
78
  wp_send_json_success();
6
  use CreativeMail\CreativeMail;
7
  use CreativeMail\Clients\CreativeMailClient;
8
  use CreativeMail\Helpers\OptionsHelper;
9
+ use CreativeMail\Managers\Logs\DatadogManager;
10
  use Exception;
11
 
12
  /**
73
  // Insert submission into database.
74
  CreativeMail::get_instance()->get_database_manager()->insert_contact($data);
75
  } catch ( Exception $exception ) {
76
+ DatadogManager::get_instance()->exception_handler($exception);
77
  }
78
 
79
  wp_send_json_success();
src/Managers/IntegrationManager.php CHANGED
@@ -6,6 +6,7 @@ namespace CreativeMail\Managers;
6
  use CreativeMail\Helpers\EnvironmentHelper;
7
  use CreativeMail\Helpers\OptionsHelper;
8
  use CreativeMail\Integrations\Integration;
 
9
  use CreativeMail\Modules\Contacts\Handlers\BlueHostBuilderPluginHandler;
10
  use CreativeMail\Modules\Contacts\Handlers\ContactFormSevenPluginHandler;
11
  use CreativeMail\Modules\Contacts\Handlers\ElementorPluginHandler;
@@ -72,7 +73,7 @@ class IntegrationManager {
72
  // Register hooks for integration class.
73
  $this->active_integrations[ $active_plugin->get_slug() ]->registerHooks();
74
  } catch ( Exception $e ) {
75
- RaygunManager::get_instance()->exception_handler($e);
76
  }
77
  }
78
  }
6
  use CreativeMail\Helpers\EnvironmentHelper;
7
  use CreativeMail\Helpers\OptionsHelper;
8
  use CreativeMail\Integrations\Integration;
9
+ use CreativeMail\Managers\Logs\DatadogManager;
10
  use CreativeMail\Modules\Contacts\Handlers\BlueHostBuilderPluginHandler;
11
  use CreativeMail\Modules\Contacts\Handlers\ContactFormSevenPluginHandler;
12
  use CreativeMail\Modules\Contacts\Handlers\ElementorPluginHandler;
73
  // Register hooks for integration class.
74
  $this->active_integrations[ $active_plugin->get_slug() ]->registerHooks();
75
  } catch ( Exception $e ) {
76
+ DatadogManager::get_instance()->exception_handler($e);
77
  }
78
  }
79
  }
src/Managers/Logs/DatadogHandler.php ADDED
@@ -0,0 +1,153 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace CreativeMail\Managers\Logs;
4
+
5
+ use Exception;
6
+ use Monolog\Handler\MissingExtensionException;
7
+ use Monolog\Logger;
8
+ use Monolog\Handler\AbstractProcessingHandler;
9
+ use Monolog\Formatter\JsonFormatter;
10
+
11
+ /**
12
+ * Updated from the https://github.com/guspio/monolog-datadog
13
+ * Sends logs to Datadog Logs using Curl integrations
14
+ *
15
+ * You'll need a Datadog account to use this handler.
16
+ *
17
+ * @see https://docs.datadoghq.com/logs/ Datadog Logs Documentation
18
+ * @author Gusp <contact@gusp.io>
19
+ */
20
+ class DatadogHandler extends AbstractProcessingHandler {
21
+
22
+ /**
23
+ * Datadog Api Key access.
24
+ *
25
+ * @var string
26
+ */
27
+ protected const DATADOG_LOG_HOST = 'https://http-intake.logs.datadoghq.com';
28
+
29
+ /**
30
+ * Datadog Api Key access.
31
+ *
32
+ * @var string
33
+ */
34
+ private string $apiKey;
35
+
36
+ /**
37
+ * Datadog's optionals attributes.
38
+ *
39
+ * @var array
40
+ */
41
+ private array $attributes;
42
+
43
+ /**
44
+ * DatadogHandler constructor.
45
+ *
46
+ * @param string $apiKey Datadog Api Key access.
47
+ * @param array $attributes Some options fore Datadog Logs.
48
+ * @param int $level The minimum logging level at which this handler will be triggered.
49
+ * @param bool $bubble Whether the messages that are handled can bubble up the stack or not.
50
+ *
51
+ * @throws Exception If the Datadog API Key is not set.
52
+ * @throws MissingExtensionException If the cURL extension is not installed.
53
+ */
54
+ public function __construct(
55
+ string $apiKey,
56
+ array $attributes = array(),
57
+ int $level = Logger::DEBUG,
58
+ bool $bubble = true
59
+ ) {
60
+ parent::__construct($level, $bubble);
61
+ $this->apiKey = $this->getApiKey($apiKey);
62
+ $this->attributes = $attributes;
63
+ }
64
+
65
+ /**
66
+ * Handles a log record
67
+ *
68
+ * @param array $record The record to handle.
69
+ */
70
+ protected function write( array $record ): void {
71
+ $this->send($record['formatted']);
72
+ }
73
+
74
+ /**
75
+ * Send request to @link https://http-intake.logs.datadoghq.com on send action.
76
+ *
77
+ * @param string $record The record to handle.
78
+ */
79
+ protected function send( string $record ) {
80
+ $headers = array( 'Content-Type' => 'application/json' );
81
+ $source = $this->getSource();
82
+ $hostname = $this->getHostname();
83
+ $service = $this->getService($record);
84
+
85
+ $url = self::DATADOG_LOG_HOST . '/v1/input/';
86
+ $url .= $this->apiKey;
87
+ $url .= '?ddsource=' . $source . '&service=' . $service . '&hostname=' . $hostname;
88
+
89
+ $args = array(
90
+ 'headers' => $headers,
91
+ 'body' => $record,
92
+ 'sslverify' => true,
93
+ );
94
+
95
+ wp_remote_post($url, $args);
96
+ }
97
+
98
+ /**
99
+ * Get Datadog Api Key from $attributes params.
100
+ *
101
+ * @param string $apiKey Datadog Api Key access.
102
+ *
103
+ * @return string
104
+ *
105
+ * @throws Exception If the apiKey is not set.
106
+ */
107
+ protected function getApiKey( string $apiKey ): string {
108
+ if ( $apiKey ) {
109
+ return $apiKey;
110
+ } else {
111
+ throw new Exception('The Datadog Api Key is required');
112
+ }
113
+ }
114
+
115
+ /**
116
+ * Get Datadog Source from $attributes params.
117
+ *
118
+ * @return string
119
+ */
120
+ protected function getSource(): string {
121
+ return ! empty($this->attributes['source']) ? $this->attributes['source'] : 'php';
122
+ }
123
+
124
+ /**
125
+ * Get Datadog Service from $attributes params.
126
+ *
127
+ * @param string $record The record to handle.
128
+ *
129
+ * @return string
130
+ */
131
+ protected function getService( string $record ): string {
132
+ $channel = json_decode($record, true);
133
+ return ! empty($this->attributes['service']) ? $this->attributes['service'] : $channel['channel'];
134
+ }
135
+
136
+ /**
137
+ * Get Datadog Hostname from $attributes params.
138
+ *
139
+ * @return string
140
+ */
141
+ protected function getHostname(): string {
142
+ return ! empty($this->attributes['hostname']) ? $this->attributes['hostname'] : gethostname();
143
+ }
144
+
145
+ /**
146
+ * Returns the default formatter to use with this handler.
147
+ *
148
+ * @return JsonFormatter
149
+ */
150
+ protected function getDefaultFormatter(): JsonFormatter {
151
+ return new JsonFormatter();
152
+ }
153
+ }
src/Managers/Logs/DatadogManager.php ADDED
@@ -0,0 +1,154 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace CreativeMail\Managers\Logs;
3
+
4
+ use CreativeMail\Helpers\EncryptionHelper;
5
+ use Exception;
6
+ use Monolog\Logger;
7
+
8
+ /**
9
+ * Class DatadogManager
10
+ */
11
+ final class DatadogManager {
12
+ /**
13
+ * Holds the instance of the DatadogManager class.
14
+ *
15
+ * @var self
16
+ */
17
+ private static $instance;
18
+ /**
19
+ * Holds the Datadog Handler instance.
20
+ *
21
+ * @var DatadogHandler
22
+ */
23
+ private DatadogHandler $datadog_handler;
24
+ /**
25
+ * Holds the Datadog Logger instance.
26
+ *
27
+ * @var Logger
28
+ */
29
+ private Logger $logger;
30
+ /**
31
+ * Holds the attributes for the Datadog Logger.
32
+ *
33
+ * @var array
34
+ */
35
+ private array $attributes = array();
36
+
37
+ /**
38
+ * Obtain the Logger structure.
39
+ *
40
+ * @param int $level The minimum logging level at which this handler will be triggered.
41
+ *
42
+ * @return void
43
+ */
44
+ private function get_logger( int $level = Logger::INFO ): void {
45
+ $builder_tracking_id = EncryptionHelper::generate_x_builder_id();
46
+ $log_level = ucwords(strtolower(Logger::getLevelName($level)));
47
+ $host = gethostname();
48
+
49
+ $this->attributes = array(
50
+ 'platform' => 'appmachine',
51
+ 'channel' => 'CE4WP',
52
+ 'hostname' => $host,
53
+ 'source' => 'php',
54
+ 'service' => 'ce4wp',
55
+ 'role' => 'plugin',
56
+ 'repo' => 'creativ-email-wordpress-plugin',
57
+ 'level' => $log_level,
58
+ 'business-unit' => 'addons',
59
+ 'properties' => array(
60
+ 'php' => phpversion(),
61
+ 'wordpress' => get_bloginfo('version'),
62
+ 'plugin-version' => CE4WP_PLUGIN_VERSION,
63
+ 'platform' => 'wordpress',
64
+ 'env' => strtolower(CE4WP_ENVIRONMENT),
65
+ 'host' => $host,
66
+ 'Loglevel' => $log_level,
67
+ 'BuilderTrackingId' => $builder_tracking_id,
68
+ 'service-group' => 'wordpress',
69
+ 'service-app' => 'ce4wp',
70
+ 'team' => 'Avengers',
71
+ 'TrackingContext' => array(
72
+ 'BuilderTrackingId' => $builder_tracking_id,
73
+ ),
74
+ ),
75
+ 'Timestamp' => gmdate('Y-m-d H:i:s'),
76
+ );
77
+
78
+ $this->logger = new Logger('plugin-creative-mail');
79
+ try {
80
+ $this->datadog_handler = new DatadogHandler(CE4WP_DATADOG_API_KEY, $this->attributes, $level);
81
+ // @codingStandardsIgnoreLine
82
+ } catch ( Exception $e ) {
83
+ // Empty catch to avoid breaking.
84
+ }
85
+ $this->logger->pushHandler($this->datadog_handler);
86
+ }
87
+
88
+ /**
89
+ * Sends an info message to Datadog.
90
+ *
91
+ * @param string $message The message to be sent.
92
+ */
93
+ public function send_info( string $message ) {
94
+ $this->get_logger();
95
+ $this->logger->info($message, $this->attributes);
96
+ }
97
+
98
+ /**
99
+ * Sends a warning message to Datadog.
100
+ *
101
+ * @param string $message The message to be sent.
102
+ */
103
+ public function send_warning( string $message ) {
104
+ $this->get_logger(Logger::WARNING);
105
+ $this->logger->warning($message, $this->attributes);
106
+ }
107
+
108
+ /**
109
+ * Sends an error message to Datadog.
110
+ *
111
+ * @param string $message The message to be sent.
112
+ * @param string|null $stacktrace The stacktrace to be sent.
113
+ */
114
+ public function send_error( string $message, string $stacktrace = null ) {
115
+ $this->get_logger(Logger::ERROR);
116
+ if ( ! empty($stacktrace) ) {
117
+ $this->attributes['stacktrace'] = $stacktrace;
118
+ }
119
+ $this->logger->error($message, $this->attributes);
120
+ }
121
+
122
+ /**
123
+ * Sends a debug message to Datadog.
124
+ *
125
+ * @param string $message The message to be sent.
126
+ */
127
+ public function send_debug( string $message ) {
128
+ $this->get_logger(Logger::DEBUG);
129
+ $this->logger->debug($message, $this->attributes);
130
+ }
131
+
132
+ /**
133
+ * Captures exceptions and send them to Datadog.
134
+ *
135
+ * @param Exception $exception The exception to be sent.
136
+ */
137
+ public function exception_handler( Exception $exception ) {
138
+ $message = $exception->getMessage();
139
+ $this->send_error($message, $exception->getTraceAsString());
140
+ }
141
+
142
+ /**
143
+ * DatadogManager instance.
144
+ *
145
+ * @return DatadogManager
146
+ */
147
+ public static function get_instance() {
148
+ if ( null === self::$instance ) {
149
+ self::$instance = new self();
150
+ }
151
+
152
+ return self::$instance;
153
+ }
154
+ }
src/Modules/Contacts/Handlers/BlueHostBuilderPluginHandler.php CHANGED
@@ -4,7 +4,7 @@ namespace CreativeMail\Modules\Contacts\Handlers;
4
 
5
  define('CE4WP_WB4WP_EVENTTYPE', 'WordPress - BlueHost Builder');
6
 
7
- use CreativeMail\Managers\RaygunManager;
8
  use CreativeMail\Modules\Contacts\Models\ContactModel;
9
  use CreativeMail\Modules\Contacts\Models\OptActionBy;
10
  use Exception;
@@ -57,7 +57,7 @@ class BlueHostBuilderPluginHandler extends BaseContactFormPluginHandler {
57
  }
58
  $this->upsertContact($this->convertToContactModel($contact));
59
  } catch ( Exception $exception ) {
60
- RaygunManager::get_instance()->exception_handler($exception);
61
  }
62
  }
63
 
@@ -88,7 +88,7 @@ class BlueHostBuilderPluginHandler extends BaseContactFormPluginHandler {
88
  try {
89
  $contactModel = $this->convertToContactModel($contact);
90
  } catch ( Exception $exception ) {
91
- RaygunManager::get_instance()->exception_handler($exception);
92
  continue;
93
  }
94
  if ( ! empty($contactModel) ) {
4
 
5
  define('CE4WP_WB4WP_EVENTTYPE', 'WordPress - BlueHost Builder');
6
 
7
+ use CreativeMail\Managers\Logs\DatadogManager;
8
  use CreativeMail\Modules\Contacts\Models\ContactModel;
9
  use CreativeMail\Modules\Contacts\Models\OptActionBy;
10
  use Exception;
57
  }
58
  $this->upsertContact($this->convertToContactModel($contact));
59
  } catch ( Exception $exception ) {
60
+ DatadogManager::get_instance()->exception_handler($exception);
61
  }
62
  }
63
 
88
  try {
89
  $contactModel = $this->convertToContactModel($contact);
90
  } catch ( Exception $exception ) {
91
+ DatadogManager::get_instance()->exception_handler($exception);
92
  continue;
93
  }
94
  if ( ! empty($contactModel) ) {
src/Modules/Contacts/Handlers/CalderaPluginHandler.php CHANGED
@@ -4,7 +4,7 @@ namespace CreativeMail\Modules\Contacts\Handlers;
4
 
5
  define('CE4WP_CAL_EVENTTYPE', 'WordPress - Caldera Forms');
6
 
7
- use CreativeMail\Managers\RaygunManager;
8
  use CreativeMail\Modules\Contacts\Models\ContactModel;
9
  use CreativeMail\Modules\Contacts\Models\OptActionBy;
10
  use Exception;
@@ -111,7 +111,7 @@ class CalderaPluginHandler extends BaseContactFormPluginHandler {
111
  }
112
  $this->upsertContact($this->convertToContactModel($calderaContact));
113
  } catch ( Exception $exception ) {
114
- RaygunManager::get_instance()->exception_handler($exception);
115
  }
116
  }
117
 
@@ -161,7 +161,7 @@ class CalderaPluginHandler extends BaseContactFormPluginHandler {
161
  try {
162
  $contactModel = $this->convertToContactModel($contact);
163
  } catch ( Exception $exception ) {
164
- RaygunManager::get_instance()->exception_handler($exception);
165
  continue;
166
  }
167
 
4
 
5
  define('CE4WP_CAL_EVENTTYPE', 'WordPress - Caldera Forms');
6
 
7
+ use CreativeMail\Managers\Logs\DatadogManager;
8
  use CreativeMail\Modules\Contacts\Models\ContactModel;
9
  use CreativeMail\Modules\Contacts\Models\OptActionBy;
10
  use Exception;
111
  }
112
  $this->upsertContact($this->convertToContactModel($calderaContact));
113
  } catch ( Exception $exception ) {
114
+ DatadogManager::get_instance()->exception_handler($exception);
115
  }
116
  }
117
 
161
  try {
162
  $contactModel = $this->convertToContactModel($contact);
163
  } catch ( Exception $exception ) {
164
+ DatadogManager::get_instance()->exception_handler($exception);
165
  continue;
166
  }
167
 
src/Modules/Contacts/Handlers/ContactFormSevenPluginHandler.php CHANGED
@@ -4,7 +4,7 @@ namespace CreativeMail\Modules\Contacts\Handlers;
4
 
5
  define('CE4WP_CF7_EVENTTYPE', 'WordPress - Contact Form 7');
6
 
7
- use CreativeMail\Managers\RaygunManager;
8
  use CreativeMail\Modules\Contacts\Models\ContactFormSevenSubmission;
9
  use CreativeMail\Modules\Contacts\Models\ContactModel;
10
  use CreativeMail\Modules\Contacts\Models\ContactAddressModel;
@@ -178,7 +178,7 @@ class ContactFormSevenPluginHandler extends BaseContactFormPluginHandler {
178
  $contactModel->setBirthday($birthday);
179
  }
180
  } catch ( Exception $exception ) {
181
- RaygunManager::get_instance()->exception_handler($exception);
182
  continue;
183
  }
184
 
@@ -200,7 +200,7 @@ class ContactFormSevenPluginHandler extends BaseContactFormPluginHandler {
200
  try {
201
  $this->upsertContact($this->convertToContactModel($contact_form));
202
  } catch ( Exception $exception ) {
203
- RaygunManager::get_instance()->exception_handler($exception);
204
  }
205
  }
206
 
4
 
5
  define('CE4WP_CF7_EVENTTYPE', 'WordPress - Contact Form 7');
6
 
7
+ use CreativeMail\Managers\Logs\DatadogManager;
8
  use CreativeMail\Modules\Contacts\Models\ContactFormSevenSubmission;
9
  use CreativeMail\Modules\Contacts\Models\ContactModel;
10
  use CreativeMail\Modules\Contacts\Models\ContactAddressModel;
178
  $contactModel->setBirthday($birthday);
179
  }
180
  } catch ( Exception $exception ) {
181
+ DatadogManager::get_instance()->exception_handler($exception);
182
  continue;
183
  }
184
 
200
  try {
201
  $this->upsertContact($this->convertToContactModel($contact_form));
202
  } catch ( Exception $exception ) {
203
+ DatadogManager::get_instance()->exception_handler($exception);
204
  }
205
  }
206
 
src/Modules/Contacts/Handlers/CreativeMailPluginHandler.php CHANGED
@@ -4,7 +4,7 @@ namespace CreativeMail\Modules\Contacts\Handlers;
4
 
5
  define('CE4WP_CE_EVENTTYPE', 'WordPress - Creative Mail Form');
6
 
7
- use CreativeMail\Managers\RaygunManager;
8
  use CreativeMail\Modules\Contacts\Models\ContactModel;
9
  use CreativeMail\Modules\Contacts\Models\OptActionBy;
10
  use Exception;
@@ -46,7 +46,7 @@ class CreativeMailPluginHandler extends BaseContactFormPluginHandler {
46
  try {
47
  $this->upsertContact($this->convertToContactModel($data));
48
  } catch ( Exception $exception ) {
49
- RaygunManager::get_instance()->exception_handler($exception);
50
  }
51
  }
52
 
@@ -79,7 +79,7 @@ class CreativeMailPluginHandler extends BaseContactFormPluginHandler {
79
  array_push($contactsArray, $contact);
80
  }
81
  } catch ( Exception $exception ) {
82
- RaygunManager::get_instance()->exception_handler($exception);
83
  continue;
84
  }
85
  if ( isset($limit) && count($contactsArray) >= $limit ) {
4
 
5
  define('CE4WP_CE_EVENTTYPE', 'WordPress - Creative Mail Form');
6
 
7
+ use CreativeMail\Managers\Logs\DatadogManager;
8
  use CreativeMail\Modules\Contacts\Models\ContactModel;
9
  use CreativeMail\Modules\Contacts\Models\OptActionBy;
10
  use Exception;
46
  try {
47
  $this->upsertContact($this->convertToContactModel($data));
48
  } catch ( Exception $exception ) {
49
+ DatadogManager::get_instance()->exception_handler($exception);
50
  }
51
  }
52
 
79
  array_push($contactsArray, $contact);
80
  }
81
  } catch ( Exception $exception ) {
82
+ DatadogManager::get_instance()->exception_handler($exception);
83
  continue;
84
  }
85
  if ( isset($limit) && count($contactsArray) >= $limit ) {
src/Modules/Contacts/Handlers/ElementorPluginHandler.php CHANGED
@@ -4,7 +4,7 @@ namespace CreativeMail\Modules\Contacts\Handlers;
4
 
5
  define('CE4WP_EL_EVENTTYPE', 'WordPress - Elementor');
6
 
7
- use CreativeMail\Managers\RaygunManager;
8
  use CreativeMail\Modules\Contacts\Models\ContactModel;
9
  use CreativeMail\Modules\Contacts\Models\OptActionBy;
10
  use Exception;
@@ -84,7 +84,7 @@ class ElementorPluginHandler extends BaseContactFormPluginHandler {
84
 
85
  $this->upsertContact($this->convertToContactModel($elemContact));
86
  } catch ( Exception $exception ) {
87
- RaygunManager::get_instance()->exception_handler($exception);
88
  }
89
  }
90
 
4
 
5
  define('CE4WP_EL_EVENTTYPE', 'WordPress - Elementor');
6
 
7
+ use CreativeMail\Managers\Logs\DatadogManager;
8
  use CreativeMail\Modules\Contacts\Models\ContactModel;
9
  use CreativeMail\Modules\Contacts\Models\OptActionBy;
10
  use Exception;
84
 
85
  $this->upsertContact($this->convertToContactModel($elemContact));
86
  } catch ( Exception $exception ) {
87
+ DatadogManager::get_instance()->exception_handler($exception);
88
  }
89
  }
90
 
src/Modules/Contacts/Handlers/FormidablePluginHandler.php CHANGED
@@ -5,7 +5,7 @@ namespace CreativeMail\Modules\Contacts\Handlers;
5
  define('CE4WP_FRM_EVENTTYPE', 'WordPress - Formidable');
6
 
7
  use CreativeMail\Exceptions\CreativeMailException;
8
- use CreativeMail\Managers\RaygunManager;
9
  use CreativeMail\Modules\Contacts\Models\ContactModel;
10
  use CreativeMail\Modules\Contacts\Models\FormidableContactForm;
11
  use CreativeMail\Modules\Contacts\Models\OptActionBy;
@@ -31,7 +31,7 @@ class FormidablePluginHandler extends BaseContactFormPluginHandler {
31
  *
32
  * @param ?array $entry The entry form data.
33
  * @param FormidableContactForm $formidableContact The contact container to hold the data.
34
- *
35
  * @return void|null
36
  */
37
  private function FindEntryValues( ?array $entry, FormidableContactForm $formidableContact ) {
@@ -58,9 +58,9 @@ class FormidablePluginHandler extends BaseContactFormPluginHandler {
58
  * Prepare the data and send it as a ContactModel.
59
  *
60
  * @param FormidableContactForm $contact The contact container to hold the data.
61
- *
62
  * @return ContactModel
63
- *
64
  * @throws Exception If the contact is not valid.
65
  */
66
  public function convertToContactModel( $contact ) {
@@ -97,7 +97,7 @@ class FormidablePluginHandler extends BaseContactFormPluginHandler {
97
  *
98
  * @param int $entry_id The entry ID.
99
  * @param int $form_id The form ID.
100
- *
101
  * @return void
102
  */
103
  public function ceHandleFormidableFormSubmission( int $entry_id, int $form_id ) {
@@ -118,7 +118,7 @@ class FormidablePluginHandler extends BaseContactFormPluginHandler {
118
  }
119
  if ( empty ($form_nonce) || empty($post_key) ) {
120
  $exception = new CreativeMailException('Formidable Form Integration - Nonce not found');
121
- RaygunManager::get_instance()->exception_handler($exception);
122
  return;
123
  }
124
 
@@ -145,7 +145,7 @@ class FormidablePluginHandler extends BaseContactFormPluginHandler {
145
  }
146
  $this->upsertContact($this->convertToContactModel($formidableContact));
147
  } catch ( Exception $exception ) {
148
- RaygunManager::get_instance()->exception_handler($exception);
149
  }
150
  }
151
 
@@ -171,7 +171,7 @@ class FormidablePluginHandler extends BaseContactFormPluginHandler {
171
  * Get the contacts from the Form Plugin
172
  *
173
  * @param ?int $limit The limit of contacts to return.
174
- *
175
  * @return array|void|null
176
  */
177
  public function get_contacts( $limit = null ) {
@@ -210,7 +210,7 @@ class FormidablePluginHandler extends BaseContactFormPluginHandler {
210
  $contactModel = null;
211
  $contactModel = $this->convertToContactModel($formidableContact);
212
  } catch ( Exception $exception ) {
213
- RaygunManager::get_instance()->exception_handler($exception);
214
  continue;
215
  }
216
  if ( ! empty($contactModel->email) ) {
@@ -233,7 +233,7 @@ class FormidablePluginHandler extends BaseContactFormPluginHandler {
233
  * Combine the entry data into a single array.
234
  *
235
  * @param array $entryResults The entry results.
236
- *
237
  * @return array
238
  */
239
  private function CombineEntryData( array $entryResults ) {
5
  define('CE4WP_FRM_EVENTTYPE', 'WordPress - Formidable');
6
 
7
  use CreativeMail\Exceptions\CreativeMailException;
8
+ use CreativeMail\Managers\Logs\DatadogManager;
9
  use CreativeMail\Modules\Contacts\Models\ContactModel;
10
  use CreativeMail\Modules\Contacts\Models\FormidableContactForm;
11
  use CreativeMail\Modules\Contacts\Models\OptActionBy;
31
  *
32
  * @param ?array $entry The entry form data.
33
  * @param FormidableContactForm $formidableContact The contact container to hold the data.
34
+ *
35
  * @return void|null
36
  */
37
  private function FindEntryValues( ?array $entry, FormidableContactForm $formidableContact ) {
58
  * Prepare the data and send it as a ContactModel.
59
  *
60
  * @param FormidableContactForm $contact The contact container to hold the data.
61
+ *
62
  * @return ContactModel
63
+ *
64
  * @throws Exception If the contact is not valid.
65
  */
66
  public function convertToContactModel( $contact ) {
97
  *
98
  * @param int $entry_id The entry ID.
99
  * @param int $form_id The form ID.
100
+ *
101
  * @return void
102
  */
103
  public function ceHandleFormidableFormSubmission( int $entry_id, int $form_id ) {
118
  }
119
  if ( empty ($form_nonce) || empty($post_key) ) {
120
  $exception = new CreativeMailException('Formidable Form Integration - Nonce not found');
121
+ DatadogManager::get_instance()->exception_handler($exception);
122
  return;
123
  }
124
 
145
  }
146
  $this->upsertContact($this->convertToContactModel($formidableContact));
147
  } catch ( Exception $exception ) {
148
+ DatadogManager::get_instance()->exception_handler($exception);
149
  }
150
  }
151
 
171
  * Get the contacts from the Form Plugin
172
  *
173
  * @param ?int $limit The limit of contacts to return.
174
+ *
175
  * @return array|void|null
176
  */
177
  public function get_contacts( $limit = null ) {
210
  $contactModel = null;
211
  $contactModel = $this->convertToContactModel($formidableContact);
212
  } catch ( Exception $exception ) {
213
+ DatadogManager::get_instance()->exception_handler($exception);
214
  continue;
215
  }
216
  if ( ! empty($contactModel->email) ) {
233
  * Combine the entry data into a single array.
234
  *
235
  * @param array $entryResults The entry results.
236
+ *
237
  * @return array
238
  */
239
  private function CombineEntryData( array $entryResults ) {
src/Modules/Contacts/Handlers/GravityFormsPluginHandler.php CHANGED
@@ -4,7 +4,7 @@ namespace CreativeMail\Modules\Contacts\Handlers;
4
 
5
  define('CE4WP_GF_EVENTTYPE', 'WordPress - GravityForms');
6
 
7
- use CreativeMail\Managers\RaygunManager;
8
  use CreativeMail\Modules\Contacts\Models\ContactModel;
9
  use CreativeMail\Modules\Contacts\Models\OptActionBy;
10
  use Exception;
@@ -177,7 +177,7 @@ final class GravityFormsPluginHandler extends BaseContactFormPluginHandler {
177
  $contact->isSync = false;
178
  $this->upsertContact($this->convertToContactModel($contact));
179
  } catch ( Exception $exception ) {
180
- RaygunManager::get_instance()->exception_handler($exception);
181
  }
182
  }
183
 
@@ -241,7 +241,7 @@ final class GravityFormsPluginHandler extends BaseContactFormPluginHandler {
241
  try {
242
  $contactModel = $this->convertToContactModel($contact);
243
  } catch ( Exception $exception ) {
244
- RaygunManager::get_instance()->exception_handler($exception);
245
  continue;
246
  }
247
 
4
 
5
  define('CE4WP_GF_EVENTTYPE', 'WordPress - GravityForms');
6
 
7
+ use CreativeMail\Managers\Logs\DatadogManager;
8
  use CreativeMail\Modules\Contacts\Models\ContactModel;
9
  use CreativeMail\Modules\Contacts\Models\OptActionBy;
10
  use Exception;
177
  $contact->isSync = false;
178
  $this->upsertContact($this->convertToContactModel($contact));
179
  } catch ( Exception $exception ) {
180
+ DatadogManager::get_instance()->exception_handler($exception);
181
  }
182
  }
183
 
241
  try {
242
  $contactModel = $this->convertToContactModel($contact);
243
  } catch ( Exception $exception ) {
244
+ DatadogManager::get_instance()->exception_handler($exception);
245
  continue;
246
  }
247
 
src/Modules/Contacts/Handlers/JetpackPluginHandler.php CHANGED
@@ -4,7 +4,7 @@ namespace CreativeMail\Modules\Contacts\Handlers;
4
 
5
  define('CE4WP_JP_EVENTTYPE', 'WordPress - Jetpack');
6
 
7
- use CreativeMail\Managers\RaygunManager;
8
  use CreativeMail\Modules\Contacts\Models\ContactModel;
9
  use CreativeMail\Modules\Contacts\Models\OptActionBy;
10
  use Exception;
@@ -112,7 +112,7 @@ final class JetpackPluginHandler extends BaseContactFormPluginHandler {
112
 
113
  $this->upsertContact($this->convertToContactModel($contact));
114
  } catch ( Exception $exception ) {
115
- RaygunManager::get_instance()->exception_handler($exception);
116
  }
117
  }
118
 
@@ -206,7 +206,7 @@ final class JetpackPluginHandler extends BaseContactFormPluginHandler {
206
  try {
207
  $contactModel = $this->convertToContactModel($contact);
208
  } catch ( Exception $exception ) {
209
- RaygunManager::get_instance()->exception_handler($exception);
210
  continue;
211
  }
212
 
4
 
5
  define('CE4WP_JP_EVENTTYPE', 'WordPress - Jetpack');
6
 
7
+ use CreativeMail\Managers\Logs\DatadogManager;
8
  use CreativeMail\Modules\Contacts\Models\ContactModel;
9
  use CreativeMail\Modules\Contacts\Models\OptActionBy;
10
  use Exception;
112
 
113
  $this->upsertContact($this->convertToContactModel($contact));
114
  } catch ( Exception $exception ) {
115
+ DatadogManager::get_instance()->exception_handler($exception);
116
  }
117
  }
118
 
206
  try {
207
  $contactModel = $this->convertToContactModel($contact);
208
  } catch ( Exception $exception ) {
209
+ DatadogManager::get_instance()->exception_handler($exception);
210
  continue;
211
  }
212
 
src/Modules/Contacts/Handlers/NewsLetterContactFormPluginHandler.php CHANGED
@@ -4,7 +4,7 @@ namespace CreativeMail\Modules\Contacts\Handlers;
4
 
5
  define('CE4WP_NL_EVENTTYPE', 'WordPress - NewsLetter');
6
 
7
- use CreativeMail\Managers\RaygunManager;
8
  use CreativeMail\Modules\Contacts\Models\ContactModel;
9
  use CreativeMail\Modules\Contacts\Models\OptActionBy;
10
  use Exception;
@@ -61,7 +61,7 @@ final class NewsLetterContactFormPluginHandler extends BaseContactFormPluginHand
61
  try {
62
  $this->upsertContact($this->convertToContactModel($user));
63
  } catch ( Exception $exception ) {
64
- RaygunManager::get_instance()->exception_handler($exception);
65
  }
66
  }
67
 
@@ -119,7 +119,7 @@ final class NewsLetterContactFormPluginHandler extends BaseContactFormPluginHand
119
  $contactModel->setLastName($surname);
120
  }
121
  } catch ( Exception $exception ) {
122
- RaygunManager::get_instance()->exception_handler($exception);
123
  continue;
124
  }
125
 
4
 
5
  define('CE4WP_NL_EVENTTYPE', 'WordPress - NewsLetter');
6
 
7
+ use CreativeMail\Managers\Logs\DatadogManager;
8
  use CreativeMail\Modules\Contacts\Models\ContactModel;
9
  use CreativeMail\Modules\Contacts\Models\OptActionBy;
10
  use Exception;
61
  try {
62
  $this->upsertContact($this->convertToContactModel($user));
63
  } catch ( Exception $exception ) {
64
+ DatadogManager::get_instance()->exception_handler($exception);
65
  }
66
  }
67
 
119
  $contactModel->setLastName($surname);
120
  }
121
  } catch ( Exception $exception ) {
122
+ DatadogManager::get_instance()->exception_handler($exception);
123
  continue;
124
  }
125
 
src/Modules/Contacts/Handlers/NinjaFormsPluginHandler.php CHANGED
@@ -4,7 +4,7 @@ namespace CreativeMail\Modules\Contacts\Handlers;
4
 
5
  define('CE4WP_NF_EVENTTYPE', 'WordPress - NinjaForms');
6
 
7
- use CreativeMail\Managers\RaygunManager;
8
  use CreativeMail\Modules\Contacts\Models\ContactModel;
9
  use CreativeMail\Modules\Contacts\Models\OptActionBy;
10
  use Exception;
@@ -165,7 +165,7 @@ final class NinjaFormsPluginHandler extends BaseContactFormPluginHandler {
165
 
166
  $this->upsertContact($this->convertToContactModel($ninjaContact));
167
  } catch ( Exception $exception ) {
168
- RaygunManager::get_instance()->exception_handler($exception);
169
  }
170
  }
171
 
@@ -262,7 +262,7 @@ final class NinjaFormsPluginHandler extends BaseContactFormPluginHandler {
262
  array_push($contactsArray, $contactModel);
263
  }
264
  } catch ( Exception $exception ) {
265
- RaygunManager::get_instance()->exception_handler($exception);
266
  continue;
267
  }
268
  if ( isset($limit) && count($contactsArray) >= $limit ) {
@@ -282,7 +282,7 @@ final class NinjaFormsPluginHandler extends BaseContactFormPluginHandler {
282
  }
283
  }
284
  } catch ( Exception $exception ) {
285
- RaygunManager::get_instance()->exception_handler($exception);
286
  }
287
  return null;
288
  }
4
 
5
  define('CE4WP_NF_EVENTTYPE', 'WordPress - NinjaForms');
6
 
7
+ use CreativeMail\Managers\Logs\DatadogManager;
8
  use CreativeMail\Modules\Contacts\Models\ContactModel;
9
  use CreativeMail\Modules\Contacts\Models\OptActionBy;
10
  use Exception;
165
 
166
  $this->upsertContact($this->convertToContactModel($ninjaContact));
167
  } catch ( Exception $exception ) {
168
+ DatadogManager::get_instance()->exception_handler($exception);
169
  }
170
  }
171
 
262
  array_push($contactsArray, $contactModel);
263
  }
264
  } catch ( Exception $exception ) {
265
+ DatadogManager::get_instance()->exception_handler($exception);
266
  continue;
267
  }
268
  if ( isset($limit) && count($contactsArray) >= $limit ) {
282
  }
283
  }
284
  } catch ( Exception $exception ) {
285
+ DatadogManager::get_instance()->exception_handler($exception);
286
  }
287
  return null;
288
  }
src/Modules/Contacts/Handlers/WooCommercePluginHandler.php CHANGED
@@ -4,7 +4,7 @@ namespace CreativeMail\Modules\Contacts\Handlers;
4
 
5
  define('CE4WP_WC_EVENTTYPE', 'WordPress - WooCommerce');
6
 
7
- use CreativeMail\Managers\RaygunManager;
8
  use CreativeMail\Modules\Contacts\Models\ContactAddressModel;
9
  use CreativeMail\Modules\Contacts\Models\ContactModel;
10
  use Exception;
@@ -181,7 +181,7 @@ final class WooCommercePluginHandler extends BaseContactFormPluginHandler {
181
  $this->upsertContact($this->convertToContactModel($order->get_id()));
182
  }
183
  } catch ( Exception $exception ) {
184
- RaygunManager::get_instance()->exception_handler($exception);
185
  }
186
  }
187
 
4
 
5
  define('CE4WP_WC_EVENTTYPE', 'WordPress - WooCommerce');
6
 
7
+ use CreativeMail\Managers\Logs\DatadogManager;
8
  use CreativeMail\Modules\Contacts\Models\ContactAddressModel;
9
  use CreativeMail\Modules\Contacts\Models\ContactModel;
10
  use Exception;
181
  $this->upsertContact($this->convertToContactModel($order->get_id()));
182
  }
183
  } catch ( Exception $exception ) {
184
+ DatadogManager::get_instance()->exception_handler($exception);
185
  }
186
  }
187
 
src/Modules/Contacts/Handlers/WpFormsPluginHandler.php CHANGED
@@ -4,7 +4,7 @@ namespace CreativeMail\Modules\Contacts\Handlers;
4
 
5
  define('CE4WP_WPF_EVENTTYPE', 'WordPress - WPForms');
6
 
7
- use CreativeMail\Managers\RaygunManager;
8
  use CreativeMail\Modules\Contacts\Models\ContactModel;
9
  use CreativeMail\Modules\Contacts\Models\OptActionBy;
10
  use Exception;
@@ -145,7 +145,7 @@ final class WpFormsPluginHandler extends BaseContactFormPluginHandler {
145
  try {
146
  $this->upsertContact($this->convertToContactModel($fields));
147
  } catch ( Exception $exception ) {
148
- RaygunManager::get_instance()->exception_handler($exception);
149
  }
150
  }
151
 
@@ -199,7 +199,7 @@ final class WpFormsPluginHandler extends BaseContactFormPluginHandler {
199
  array_push($contactsArray, $contact);
200
  }
201
  } catch ( Exception $exception ) {
202
- RaygunManager::get_instance()->exception_handler($exception);
203
  continue;
204
  }
205
 
4
 
5
  define('CE4WP_WPF_EVENTTYPE', 'WordPress - WPForms');
6
 
7
+ use CreativeMail\Managers\Logs\DatadogManager;
8
  use CreativeMail\Modules\Contacts\Models\ContactModel;
9
  use CreativeMail\Modules\Contacts\Models\OptActionBy;
10
  use Exception;
145
  try {
146
  $this->upsertContact($this->convertToContactModel($fields));
147
  } catch ( Exception $exception ) {
148
+ DatadogManager::get_instance()->exception_handler($exception);
149
  }
150
  }
151
 
199
  array_push($contactsArray, $contact);
200
  }
201
  } catch ( Exception $exception ) {
202
+ DatadogManager::get_instance()->exception_handler($exception);
203
  continue;
204
  }
205
 
src/Modules/Contacts/Models/FormidableContactForm.php CHANGED
@@ -8,5 +8,5 @@ class FormidableContactForm {
8
  public string $birthday;
9
  public string $phone;
10
  public string $email;
11
- public string $isSync;
12
  }
8
  public string $birthday;
9
  public string $phone;
10
  public string $email;
11
+ public string $isSync;
12
  }
src/Modules/Contacts/Processors/ContactsSyncBackgroundProcessor.php CHANGED
@@ -4,7 +4,7 @@ namespace CreativeMail\Modules\Contacts\Processors;
4
 
5
  use CreativeMail\Exceptions\CreativeMailException;
6
  use CreativeMail\Managers\IntegrationManager;
7
- use CreativeMail\Managers\RaygunManager;
8
  use CreativeMail\Modules\Contacts\Services\ContactsSyncService;
9
  use CreativeMail\Integrations\Integration;
10
  use Exception;
@@ -38,7 +38,7 @@ class ContactsSyncBackgroundProcessor extends WP_Background_Process {
38
  $this->start_contacts_sync_for_all_integrations($activated_integrations);
39
  }
40
  } catch ( Exception $exception ) {
41
- RaygunManager::get_instance()->exception_handler($exception);
42
  }
43
 
44
  return false;
@@ -56,7 +56,7 @@ class ContactsSyncBackgroundProcessor extends WP_Background_Process {
56
 
57
  if ( ! empty($activated_integrations) ) {
58
  $exception = new CreativeMailException('No activated integrations available');
59
- RaygunManager::get_instance()->exception_handler($exception);
60
  }
61
 
62
  // Get all contacts.
4
 
5
  use CreativeMail\Exceptions\CreativeMailException;
6
  use CreativeMail\Managers\IntegrationManager;
7
+ use CreativeMail\Managers\Logs\DatadogManager;
8
  use CreativeMail\Modules\Contacts\Services\ContactsSyncService;
9
  use CreativeMail\Integrations\Integration;
10
  use Exception;
38
  $this->start_contacts_sync_for_all_integrations($activated_integrations);
39
  }
40
  } catch ( Exception $exception ) {
41
+ DatadogManager::get_instance()->exception_handler($exception);
42
  }
43
 
44
  return false;
56
 
57
  if ( ! empty($activated_integrations) ) {
58
  $exception = new CreativeMailException('No activated integrations available');
59
+ DatadogManager::get_instance()->exception_handler($exception);
60
  }
61
 
62
  // Get all contacts.
src/Modules/Contacts/Services/ContactsSyncService.php CHANGED
@@ -6,7 +6,7 @@ use CreativeMail\CreativeMail;
6
  use CreativeMail\Exceptions\CreativeMailException;
7
  use CreativeMail\Helpers\EnvironmentHelper;
8
  use CreativeMail\Helpers\OptionsHelper;
9
- use CreativeMail\Managers\RaygunManager;
10
  use CreativeMail\Modules\Api\Models\ApiRequestItem;
11
  use CreativeMail\Modules\Contacts\Models\ContactModel;
12
  use Exception;
@@ -58,13 +58,13 @@ class ContactsSyncService {
58
  $creativ_email = CreativeMail::get_instance();
59
 
60
  $creativ_email->get_api_manager()->get_api_background_process()->push_to_queue(
61
- new ApiRequestItem(
62
- 'POST',
63
- 'application/json',
64
- '/v1.0/contacts',
65
- $jsonData
66
- )
67
- );
68
 
69
  // Start the queue.
70
  $creativ_email->get_api_manager()->get_api_background_process()->save()->dispatch();
@@ -75,7 +75,7 @@ class ContactsSyncService {
75
  try {
76
  if ( empty($contactModels) ) {
77
  $exception = new CreativeMailException('No contacts provided or empty Contact Model');
78
- RaygunManager::get_instance()->exception_handler($exception);
79
  }
80
 
81
  if ( count($contactModels) > self::FAST_LANE_LIMIT ) {
@@ -86,7 +86,7 @@ class ContactsSyncService {
86
  $this->fast_lane_contacts_sync($contactModels);
87
  }
88
  } catch ( Exception $exception ) {
89
- RaygunManager::get_instance()->exception_handler($exception);
90
  }
91
 
92
  return true;
@@ -95,7 +95,7 @@ class ContactsSyncService {
95
  private function fast_lane_contacts_sync( $contactModels ) {
96
  if ( empty( $contactModels ) ) {
97
  $exception = new CreativeMailException('No contacts provided or empty Contact Model');
98
- RaygunManager::get_instance()->exception_handler($exception);
99
  }
100
 
101
  $url = EnvironmentHelper::get_app_gateway_url('wordpress/v1.0/contacts');
@@ -117,7 +117,7 @@ class ContactsSyncService {
117
  private function slow_lane_contacts_sync( $contactModels ) {
118
  if ( empty($contactModels) ) {
119
  $exception = new CreativeMailException('No contacts provided or empty Contact Model');
120
- RaygunManager::get_instance()->exception_handler($exception);
121
  }
122
 
123
  // 1. Convert to csv file.
@@ -135,13 +135,13 @@ class ContactsSyncService {
135
  $csv_content = '';
136
  if ( empty($contactModels) ) {
137
  $exception = new CreativeMailException('Error trying to create the CSV to get the contacts data');
138
- RaygunManager::get_instance()->exception_handler($exception);
139
  }
140
 
141
  $fd = fopen('php://temp/maxmemory:' . self::CSV_FILE_MAX_MEMORY_SIZE, 'w');
142
  if ( false === $fd ) {
143
  $exception = new CreativeMailException('No contacts provided or empty Contact Model');
144
- RaygunManager::get_instance()->exception_handler($exception);
145
  }
146
 
147
  foreach ( $contactModels as $contactModel ) {
@@ -174,11 +174,11 @@ class ContactsSyncService {
174
 
175
  if ( is_wp_error($response) ) {
176
  $exception = new CreativeMailException('No contacts provided or empty Contact Model');
177
- RaygunManager::get_instance()->exception_handler($exception);
178
  }
179
  if ( ! $this->is_success_response($response) ) {
180
  $exception = new CreativeMailException('No contacts provided or empty Contact Model');
181
- RaygunManager::get_instance()->exception_handler($exception);
182
  }
183
 
184
  $json = json_decode(is_array($response) ? $response['body'] : '');
@@ -204,12 +204,12 @@ class ContactsSyncService {
204
 
205
  if ( is_wp_error($response) ) {
206
  $exception = new CreativeMailException('No contacts provided or empty Contact Model');
207
- RaygunManager::get_instance()->exception_handler($exception);
208
  }
209
 
210
  if ( ! $this->is_success_response($response) ) {
211
  $exception = new CreativeMailException('No contacts provided or empty Contact Model');
212
- RaygunManager::get_instance()->exception_handler($exception);
213
  }
214
  }
215
 
@@ -235,12 +235,12 @@ class ContactsSyncService {
235
 
236
  if ( is_wp_error($response) ) {
237
  $exception = new CreativeMailException('There was a WP_ERROR while trying to start import');
238
- RaygunManager::get_instance()->exception_handler($exception);
239
  }
240
 
241
  if ( ! $this->is_success_response($response) ) {
242
  $exception = new CreativeMailException('There was an error at the response.');
243
- RaygunManager::get_instance()->exception_handler($exception);
244
  }
245
  }
246
 
6
  use CreativeMail\Exceptions\CreativeMailException;
7
  use CreativeMail\Helpers\EnvironmentHelper;
8
  use CreativeMail\Helpers\OptionsHelper;
9
+ use CreativeMail\Managers\Logs\DatadogManager;
10
  use CreativeMail\Modules\Api\Models\ApiRequestItem;
11
  use CreativeMail\Modules\Contacts\Models\ContactModel;
12
  use Exception;
58
  $creativ_email = CreativeMail::get_instance();
59
 
60
  $creativ_email->get_api_manager()->get_api_background_process()->push_to_queue(
61
+ new ApiRequestItem(
62
+ 'POST',
63
+ 'application/json',
64
+ '/v1.0/contacts',
65
+ $jsonData
66
+ )
67
+ );
68
 
69
  // Start the queue.
70
  $creativ_email->get_api_manager()->get_api_background_process()->save()->dispatch();
75
  try {
76
  if ( empty($contactModels) ) {
77
  $exception = new CreativeMailException('No contacts provided or empty Contact Model');
78
+ DatadogManager::get_instance()->exception_handler($exception);
79
  }
80
 
81
  if ( count($contactModels) > self::FAST_LANE_LIMIT ) {
86
  $this->fast_lane_contacts_sync($contactModels);
87
  }
88
  } catch ( Exception $exception ) {
89
+ DatadogManager::get_instance()->exception_handler($exception);
90
  }
91
 
92
  return true;
95
  private function fast_lane_contacts_sync( $contactModels ) {
96
  if ( empty( $contactModels ) ) {
97
  $exception = new CreativeMailException('No contacts provided or empty Contact Model');
98
+ DatadogManager::get_instance()->exception_handler($exception);
99
  }
100
 
101
  $url = EnvironmentHelper::get_app_gateway_url('wordpress/v1.0/contacts');
117
  private function slow_lane_contacts_sync( $contactModels ) {
118
  if ( empty($contactModels) ) {
119
  $exception = new CreativeMailException('No contacts provided or empty Contact Model');
120
+ DatadogManager::get_instance()->exception_handler($exception);
121
  }
122
 
123
  // 1. Convert to csv file.
135
  $csv_content = '';
136
  if ( empty($contactModels) ) {
137
  $exception = new CreativeMailException('Error trying to create the CSV to get the contacts data');
138
+ DatadogManager::get_instance()->exception_handler($exception);
139
  }
140
 
141
  $fd = fopen('php://temp/maxmemory:' . self::CSV_FILE_MAX_MEMORY_SIZE, 'w');
142
  if ( false === $fd ) {
143
  $exception = new CreativeMailException('No contacts provided or empty Contact Model');
144
+ DatadogManager::get_instance()->exception_handler($exception);
145
  }
146
 
147
  foreach ( $contactModels as $contactModel ) {
174
 
175
  if ( is_wp_error($response) ) {
176
  $exception = new CreativeMailException('No contacts provided or empty Contact Model');
177
+ DatadogManager::get_instance()->exception_handler($exception);
178
  }
179
  if ( ! $this->is_success_response($response) ) {
180
  $exception = new CreativeMailException('No contacts provided or empty Contact Model');
181
+ DatadogManager::get_instance()->exception_handler($exception);
182
  }
183
 
184
  $json = json_decode(is_array($response) ? $response['body'] : '');
204
 
205
  if ( is_wp_error($response) ) {
206
  $exception = new CreativeMailException('No contacts provided or empty Contact Model');
207
+ DatadogManager::get_instance()->exception_handler($exception);
208
  }
209
 
210
  if ( ! $this->is_success_response($response) ) {
211
  $exception = new CreativeMailException('No contacts provided or empty Contact Model');
212
+ DatadogManager::get_instance()->exception_handler($exception);
213
  }
214
  }
215
 
235
 
236
  if ( is_wp_error($response) ) {
237
  $exception = new CreativeMailException('There was a WP_ERROR while trying to start import');
238
+ DatadogManager::get_instance()->exception_handler($exception);
239
  }
240
 
241
  if ( ! $this->is_success_response($response) ) {
242
  $exception = new CreativeMailException('There was an error at the response.');
243
+ DatadogManager::get_instance()->exception_handler($exception);
244
  }
245
  }
246
 
src/Modules/DashboardWidgetModule.php CHANGED
@@ -6,7 +6,7 @@ use CreativeMail\Clients\CreativeMailClient;
6
  use CreativeMail\CreativeMail;
7
  use CreativeMail\Exceptions\CreativeMailException;
8
  use CreativeMail\Helpers\OptionsHelper;
9
- use CreativeMail\Managers\RaygunManager;
10
  use Exception;
11
 
12
  class DashboardWidgetModule {
@@ -61,7 +61,7 @@ class DashboardWidgetModule {
61
  $this->show_woo_commerce();
62
  }
63
  } catch ( CreativeMailException $exception ) {
64
- RaygunManager::get_instance()->exception_handler($exception);
65
  $this->show_exception();
66
  }
67
  }
@@ -99,7 +99,7 @@ class DashboardWidgetModule {
99
  include CE4WP_PLUGIN_DIR . 'src/views/admin-dashboard-widget/no-woocommerce.php';
100
  }
101
  } catch ( Exception $ex ) {
102
- RaygunManager::get_instance()->exception_handler($ex);
103
  }
104
  }
105
 
6
  use CreativeMail\CreativeMail;
7
  use CreativeMail\Exceptions\CreativeMailException;
8
  use CreativeMail\Helpers\OptionsHelper;
9
+ use CreativeMail\Managers\Logs\DatadogManager;
10
  use Exception;
11
 
12
  class DashboardWidgetModule {
61
  $this->show_woo_commerce();
62
  }
63
  } catch ( CreativeMailException $exception ) {
64
+ DatadogManager::get_instance()->exception_handler($exception);
65
  $this->show_exception();
66
  }
67
  }
99
  include CE4WP_PLUGIN_DIR . 'src/views/admin-dashboard-widget/no-woocommerce.php';
100
  }
101
  } catch ( Exception $ex ) {
102
+ DatadogManager::get_instance()->exception_handler($ex);
103
  }
104
  }
105
 
src/Modules/FeedbackNoticeModule.php CHANGED
@@ -5,7 +5,7 @@ namespace CreativeMail\Modules;
5
  use CreativeMail\CreativeMail;
6
  use CreativeMail\Helpers\EnvironmentHelper;
7
  use CreativeMail\Helpers\OptionsHelper;
8
- use CreativeMail\Managers\RaygunManager;
9
  use Exception;
10
 
11
  class FeedbackNoticeModule {
@@ -65,7 +65,7 @@ class FeedbackNoticeModule {
65
  include CE4WP_PLUGIN_DIR . 'src/views/admin-feedback-notice/many-contacts.php';
66
  }
67
  } catch ( Exception $exception ) {
68
- RaygunManager::get_instance()->exception_handler($exception);
69
  }
70
  }
71
 
5
  use CreativeMail\CreativeMail;
6
  use CreativeMail\Helpers\EnvironmentHelper;
7
  use CreativeMail\Helpers\OptionsHelper;
8
+ use CreativeMail\Managers\Logs\DatadogManager;
9
  use Exception;
10
 
11
  class FeedbackNoticeModule {
65
  include CE4WP_PLUGIN_DIR . 'src/views/admin-feedback-notice/many-contacts.php';
66
  }
67
  } catch ( Exception $exception ) {
68
+ DatadogManager::get_instance()->exception_handler($exception);
69
  }
70
  }
71
 
src/views/available-integrations.php CHANGED
@@ -18,19 +18,19 @@ $title_class = 0 == $active_plugin_count ? 'ce4wp-body2' : 'ce4wp-plu
18
  }
19
  // Check if url is relative.
20
  if (url.indexOf('plugin-install.php') >= 0) {
21
- const ce4wpIframe = document.getElementById('plugin-store-iframe');
22
  document.getElementById('plugin-store-title').textContent = name;
23
  document.getElementById('plugin-store-modal').style.display = "block";
24
 
25
- ce4wpIframe.src = url;
26
- ce4wpIframe.title = name;
27
- ce4wpIframe.onload = function() {
28
- const ce4wpIframeInstallButton = ce4wpIframe
29
- .contentWindow
30
- .document
31
- .getElementById('plugin_install_from_iframe');
32
- ce4wpIframeInstallButton.replaceWith(ce4wpIframeInstallButton.cloneNode(true));
33
- };
34
  } else {
35
  let win = window.open(url, '_blank');
36
  win.focus();
18
  }
19
  // Check if url is relative.
20
  if (url.indexOf('plugin-install.php') >= 0) {
21
+ const ce4wpIframe = document.getElementById('plugin-store-iframe');
22
  document.getElementById('plugin-store-title').textContent = name;
23
  document.getElementById('plugin-store-modal').style.display = "block";
24
 
25
+ ce4wpIframe.src = url;
26
+ ce4wpIframe.title = name;
27
+ ce4wpIframe.onload = function() {
28
+ const ce4wpIframeInstallButton = ce4wpIframe
29
+ .contentWindow
30
+ .document
31
+ .getElementById('plugin_install_from_iframe');
32
+ ce4wpIframeInstallButton.replaceWith(ce4wpIframeInstallButton.cloneNode(true));
33
+ };
34
  } else {
35
  let win = window.open(url, '_blank');
36
  win.focus();
src/views/settings.php CHANGED
@@ -7,8 +7,7 @@ use CreativeMail\Helpers\OptionsHelper;
7
  if ( isset ( $_SERVER['REQUEST_METHOD'] ) && 'POST' === $_SERVER['REQUEST_METHOD'] && isset ( $_POST['action'] ) ) {
8
  if ( 'disconnect' === $_POST['action']
9
  && isset( $_POST['disconnect_nonce'] )
10
- && wp_verify_nonce( sanitize_text_field ( wp_unslash ( $_POST['disconnect_nonce'] ) ), 'disconnect' ) )
11
- {
12
  OptionsHelper::clear_options(true);
13
  // @phpstan-ignore-next-line
14
  $this->instance_id = null;
@@ -17,8 +16,7 @@ if ( isset ( $_SERVER['REQUEST_METHOD'] ) && 'POST' === $_SERVER['REQUEST_METHOD
17
  if ( 'change_activated_plugins' === $_POST['action']
18
  && isset ( $_POST['activated_plugins_nonce'] )
19
  && wp_verify_nonce(
20
- sanitize_text_field ( wp_unslash ( $_POST['activated_plugins_nonce'] ) ), 'activated_plugins' ) )
21
- {
22
  $activated_plugins = array();
23
  if ( isset($_POST['activated_plugins']) ) {
24
  $activated_plugins = array_map( 'sanitize_text_field', wp_unslash( $_POST['activated_plugins'] ) );
@@ -29,19 +27,16 @@ if ( isset ( $_SERVER['REQUEST_METHOD'] ) && 'POST' === $_SERVER['REQUEST_METHOD
29
  if ( 'change_marketing_information' === $_POST['action']
30
  && isset ( $_POST['marketing_consent_nonce'] )
31
  && wp_verify_nonce(
32
- sanitize_text_field( wp_unslash($_POST['marketing_consent_nonce']) ), 'marketing_consent' ) )
33
- {
34
  if ( array_key_exists( 'ce4wp_show_marketing_checkbox', $_POST )
35
- && sanitize_key( $_POST['ce4wp_show_marketing_checkbox'] ) === 'on' )
36
- {
37
  OptionsHelper::set_checkout_checkbox_enabled('1');
38
- } else
39
- {
40
  OptionsHelper::set_checkout_checkbox_enabled('0');
41
  }
42
  OptionsHelper::set_checkout_checkbox_text(
43
  sanitize_text_field( wp_unslash( $_POST['ce4wp_checkbox_text'] ?? '' ) )
44
- );
45
  }
46
  }
47
 
7
  if ( isset ( $_SERVER['REQUEST_METHOD'] ) && 'POST' === $_SERVER['REQUEST_METHOD'] && isset ( $_POST['action'] ) ) {
8
  if ( 'disconnect' === $_POST['action']
9
  && isset( $_POST['disconnect_nonce'] )
10
+ && wp_verify_nonce( sanitize_text_field ( wp_unslash ( $_POST['disconnect_nonce'] ) ), 'disconnect' ) ) {
 
11
  OptionsHelper::clear_options(true);
12
  // @phpstan-ignore-next-line
13
  $this->instance_id = null;
16
  if ( 'change_activated_plugins' === $_POST['action']
17
  && isset ( $_POST['activated_plugins_nonce'] )
18
  && wp_verify_nonce(
19
+ sanitize_text_field ( wp_unslash ( $_POST['activated_plugins_nonce'] ) ), 'activated_plugins' ) ) {
 
20
  $activated_plugins = array();
21
  if ( isset($_POST['activated_plugins']) ) {
22
  $activated_plugins = array_map( 'sanitize_text_field', wp_unslash( $_POST['activated_plugins'] ) );
27
  if ( 'change_marketing_information' === $_POST['action']
28
  && isset ( $_POST['marketing_consent_nonce'] )
29
  && wp_verify_nonce(
30
+ sanitize_text_field( wp_unslash($_POST['marketing_consent_nonce']) ), 'marketing_consent' ) ) {
 
31
  if ( array_key_exists( 'ce4wp_show_marketing_checkbox', $_POST )
32
+ && sanitize_key( $_POST['ce4wp_show_marketing_checkbox'] ) === 'on' ) {
 
33
  OptionsHelper::set_checkout_checkbox_enabled('1');
34
+ } else {
 
35
  OptionsHelper::set_checkout_checkbox_enabled('0');
36
  }
37
  OptionsHelper::set_checkout_checkbox_text(
38
  sanitize_text_field( wp_unslash( $_POST['ce4wp_checkbox_text'] ?? '' ) )
39
+ );
40
  }
41
  }
42
 
vendor/autoload.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
- return ComposerAutoloaderInitebbc9dc47677799e98f2198d432a27a0::getLoader();
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
+ return ComposerAutoloaderInit276f66d40e54e142b524f0f17c50ae75::getLoader();
vendor/composer/autoload_classmap.php CHANGED
@@ -25,7 +25,8 @@ return array(
25
  'CreativeMail\\Managers\\FormManager' => $baseDir . '/src/Managers/FormManager.php',
26
  'CreativeMail\\Managers\\InstanceManager' => $baseDir . '/src/Managers/InstanceManager.php',
27
  'CreativeMail\\Managers\\IntegrationManager' => $baseDir . '/src/Managers/IntegrationManager.php',
28
- 'CreativeMail\\Managers\\RaygunManager' => $baseDir . '/src/Managers/RaygunManager.php',
 
29
  'CreativeMail\\Models\\ApiSchema' => $baseDir . '/src/Models/ApiSchema.php',
30
  'CreativeMail\\Models\\Campaign' => $baseDir . '/src/Models/Campaign.php',
31
  'CreativeMail\\Models\\CartData' => $baseDir . '/src/Models/CartData.php',
@@ -101,16 +102,132 @@ return array(
101
  'Firebase\\JWT\\JWT' => $vendorDir . '/firebase/php-jwt/src/JWT.php',
102
  'Firebase\\JWT\\Key' => $vendorDir . '/firebase/php-jwt/src/Key.php',
103
  'Firebase\\JWT\\SignatureInvalidException' => $vendorDir . '/firebase/php-jwt/src/SignatureInvalidException.php',
104
- 'Raygun4php\\Raygun4PhpException' => $vendorDir . '/mindscape/raygun4php/src/Raygun4php/Raygun4PhpException.php',
105
- 'Raygun4php\\RaygunClient' => $vendorDir . '/mindscape/raygun4php/src/Raygun4php/RaygunClient.php',
106
- 'Raygun4php\\RaygunClientMessage' => $vendorDir . '/mindscape/raygun4php/src/Raygun4php/RaygunClientMessage.php',
107
- 'Raygun4php\\RaygunEnvironmentMessage' => $vendorDir . '/mindscape/raygun4php/src/Raygun4php/RaygunEnvironmentMessage.php',
108
- 'Raygun4php\\RaygunExceptionMessage' => $vendorDir . '/mindscape/raygun4php/src/Raygun4php/RaygunExceptionMessage.php',
109
- 'Raygun4php\\RaygunExceptionTraceLineMessage' => $vendorDir . '/mindscape/raygun4php/src/Raygun4php/RaygunExceptionTraceLineMessage.php',
110
- 'Raygun4php\\RaygunIdentifier' => $vendorDir . '/mindscape/raygun4php/src/Raygun4php/RaygunIdentifier.php',
111
- 'Raygun4php\\RaygunMessage' => $vendorDir . '/mindscape/raygun4php/src/Raygun4php/RaygunMessage.php',
112
- 'Raygun4php\\RaygunMessageDetails' => $vendorDir . '/mindscape/raygun4php/src/Raygun4php/RaygunMessageDetails.php',
113
- 'Raygun4php\\RaygunRequestMessage' => $vendorDir . '/mindscape/raygun4php/src/Raygun4php/RaygunRequestMessage.php',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
114
  'WP_Async_Request' => $vendorDir . '/a5hleyrich/wp-background-processing/classes/wp-async-request.php',
115
  'WP_Background_Process' => $vendorDir . '/a5hleyrich/wp-background-processing/classes/wp-background-process.php',
116
  );
25
  'CreativeMail\\Managers\\FormManager' => $baseDir . '/src/Managers/FormManager.php',
26
  'CreativeMail\\Managers\\InstanceManager' => $baseDir . '/src/Managers/InstanceManager.php',
27
  'CreativeMail\\Managers\\IntegrationManager' => $baseDir . '/src/Managers/IntegrationManager.php',
28
+ 'CreativeMail\\Managers\\Logs\\DatadogHandler' => $baseDir . '/src/Managers/Logs/DatadogHandler.php',
29
+ 'CreativeMail\\Managers\\Logs\\DatadogManager' => $baseDir . '/src/Managers/Logs/DatadogManager.php',
30
  'CreativeMail\\Models\\ApiSchema' => $baseDir . '/src/Models/ApiSchema.php',
31
  'CreativeMail\\Models\\Campaign' => $baseDir . '/src/Models/Campaign.php',
32
  'CreativeMail\\Models\\CartData' => $baseDir . '/src/Models/CartData.php',
102
  'Firebase\\JWT\\JWT' => $vendorDir . '/firebase/php-jwt/src/JWT.php',
103
  'Firebase\\JWT\\Key' => $vendorDir . '/firebase/php-jwt/src/Key.php',
104
  'Firebase\\JWT\\SignatureInvalidException' => $vendorDir . '/firebase/php-jwt/src/SignatureInvalidException.php',
105
+ 'Monolog\\Attribute\\AsMonologProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Attribute/AsMonologProcessor.php',
106
+ 'Monolog\\DateTimeImmutable' => $vendorDir . '/monolog/monolog/src/Monolog/DateTimeImmutable.php',
107
+ 'Monolog\\ErrorHandler' => $vendorDir . '/monolog/monolog/src/Monolog/ErrorHandler.php',
108
+ 'Monolog\\Formatter\\ChromePHPFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php',
109
+ 'Monolog\\Formatter\\ElasticaFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php',
110
+ 'Monolog\\Formatter\\ElasticsearchFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/ElasticsearchFormatter.php',
111
+ 'Monolog\\Formatter\\FlowdockFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php',
112
+ 'Monolog\\Formatter\\FluentdFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php',
113
+ 'Monolog\\Formatter\\FormatterInterface' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php',
114
+ 'Monolog\\Formatter\\GelfMessageFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php',
115
+ 'Monolog\\Formatter\\GoogleCloudLoggingFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/GoogleCloudLoggingFormatter.php',
116
+ 'Monolog\\Formatter\\HtmlFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php',
117
+ 'Monolog\\Formatter\\JsonFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php',
118
+ 'Monolog\\Formatter\\LineFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/LineFormatter.php',
119
+ 'Monolog\\Formatter\\LogglyFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php',
120
+ 'Monolog\\Formatter\\LogmaticFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/LogmaticFormatter.php',
121
+ 'Monolog\\Formatter\\LogstashFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php',
122
+ 'Monolog\\Formatter\\MongoDBFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php',
123
+ 'Monolog\\Formatter\\NormalizerFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php',
124
+ 'Monolog\\Formatter\\ScalarFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php',
125
+ 'Monolog\\Formatter\\WildfireFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php',
126
+ 'Monolog\\Handler\\AbstractHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/AbstractHandler.php',
127
+ 'Monolog\\Handler\\AbstractProcessingHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php',
128
+ 'Monolog\\Handler\\AbstractSyslogHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php',
129
+ 'Monolog\\Handler\\AmqpHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/AmqpHandler.php',
130
+ 'Monolog\\Handler\\BrowserConsoleHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php',
131
+ 'Monolog\\Handler\\BufferHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/BufferHandler.php',
132
+ 'Monolog\\Handler\\ChromePHPHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php',
133
+ 'Monolog\\Handler\\CouchDBHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php',
134
+ 'Monolog\\Handler\\CubeHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/CubeHandler.php',
135
+ 'Monolog\\Handler\\Curl\\Util' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/Curl/Util.php',
136
+ 'Monolog\\Handler\\DeduplicationHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php',
137
+ 'Monolog\\Handler\\DoctrineCouchDBHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php',
138
+ 'Monolog\\Handler\\DynamoDbHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php',
139
+ 'Monolog\\Handler\\ElasticaHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ElasticaHandler.php',
140
+ 'Monolog\\Handler\\ElasticsearchHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ElasticsearchHandler.php',
141
+ 'Monolog\\Handler\\ErrorLogHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php',
142
+ 'Monolog\\Handler\\FallbackGroupHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FallbackGroupHandler.php',
143
+ 'Monolog\\Handler\\FilterHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FilterHandler.php',
144
+ 'Monolog\\Handler\\FingersCrossedHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php',
145
+ 'Monolog\\Handler\\FingersCrossed\\ActivationStrategyInterface' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php',
146
+ 'Monolog\\Handler\\FingersCrossed\\ChannelLevelActivationStrategy' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php',
147
+ 'Monolog\\Handler\\FingersCrossed\\ErrorLevelActivationStrategy' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php',
148
+ 'Monolog\\Handler\\FirePHPHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php',
149
+ 'Monolog\\Handler\\FleepHookHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php',
150
+ 'Monolog\\Handler\\FlowdockHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php',
151
+ 'Monolog\\Handler\\FormattableHandlerInterface' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FormattableHandlerInterface.php',
152
+ 'Monolog\\Handler\\FormattableHandlerTrait' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FormattableHandlerTrait.php',
153
+ 'Monolog\\Handler\\GelfHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/GelfHandler.php',
154
+ 'Monolog\\Handler\\GroupHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/GroupHandler.php',
155
+ 'Monolog\\Handler\\Handler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/Handler.php',
156
+ 'Monolog\\Handler\\HandlerInterface' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/HandlerInterface.php',
157
+ 'Monolog\\Handler\\HandlerWrapper' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php',
158
+ 'Monolog\\Handler\\IFTTTHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php',
159
+ 'Monolog\\Handler\\InsightOpsHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php',
160
+ 'Monolog\\Handler\\LogEntriesHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php',
161
+ 'Monolog\\Handler\\LogglyHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/LogglyHandler.php',
162
+ 'Monolog\\Handler\\LogmaticHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/LogmaticHandler.php',
163
+ 'Monolog\\Handler\\MailHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/MailHandler.php',
164
+ 'Monolog\\Handler\\MandrillHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/MandrillHandler.php',
165
+ 'Monolog\\Handler\\MissingExtensionException' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php',
166
+ 'Monolog\\Handler\\MongoDBHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php',
167
+ 'Monolog\\Handler\\NativeMailerHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php',
168
+ 'Monolog\\Handler\\NewRelicHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php',
169
+ 'Monolog\\Handler\\NoopHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/NoopHandler.php',
170
+ 'Monolog\\Handler\\NullHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/NullHandler.php',
171
+ 'Monolog\\Handler\\OverflowHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/OverflowHandler.php',
172
+ 'Monolog\\Handler\\PHPConsoleHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php',
173
+ 'Monolog\\Handler\\ProcessHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ProcessHandler.php',
174
+ 'Monolog\\Handler\\ProcessableHandlerInterface' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ProcessableHandlerInterface.php',
175
+ 'Monolog\\Handler\\ProcessableHandlerTrait' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ProcessableHandlerTrait.php',
176
+ 'Monolog\\Handler\\PsrHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/PsrHandler.php',
177
+ 'Monolog\\Handler\\PushoverHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/PushoverHandler.php',
178
+ 'Monolog\\Handler\\RedisHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/RedisHandler.php',
179
+ 'Monolog\\Handler\\RedisPubSubHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/RedisPubSubHandler.php',
180
+ 'Monolog\\Handler\\RollbarHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/RollbarHandler.php',
181
+ 'Monolog\\Handler\\RotatingFileHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php',
182
+ 'Monolog\\Handler\\SamplingHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SamplingHandler.php',
183
+ 'Monolog\\Handler\\SendGridHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SendGridHandler.php',
184
+ 'Monolog\\Handler\\SlackHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SlackHandler.php',
185
+ 'Monolog\\Handler\\SlackWebhookHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php',
186
+ 'Monolog\\Handler\\Slack\\SlackRecord' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php',
187
+ 'Monolog\\Handler\\SocketHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SocketHandler.php',
188
+ 'Monolog\\Handler\\SqsHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SqsHandler.php',
189
+ 'Monolog\\Handler\\StreamHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/StreamHandler.php',
190
+ 'Monolog\\Handler\\SwiftMailerHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php',
191
+ 'Monolog\\Handler\\SymfonyMailerHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SymfonyMailerHandler.php',
192
+ 'Monolog\\Handler\\SyslogHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SyslogHandler.php',
193
+ 'Monolog\\Handler\\SyslogUdpHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php',
194
+ 'Monolog\\Handler\\SyslogUdp\\UdpSocket' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php',
195
+ 'Monolog\\Handler\\TelegramBotHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/TelegramBotHandler.php',
196
+ 'Monolog\\Handler\\TestHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/TestHandler.php',
197
+ 'Monolog\\Handler\\WebRequestRecognizerTrait' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/WebRequestRecognizerTrait.php',
198
+ 'Monolog\\Handler\\WhatFailureGroupHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php',
199
+ 'Monolog\\Handler\\ZendMonitorHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php',
200
+ 'Monolog\\LogRecord' => $vendorDir . '/monolog/monolog/src/Monolog/LogRecord.php',
201
+ 'Monolog\\Logger' => $vendorDir . '/monolog/monolog/src/Monolog/Logger.php',
202
+ 'Monolog\\Processor\\GitProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/GitProcessor.php',
203
+ 'Monolog\\Processor\\HostnameProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/HostnameProcessor.php',
204
+ 'Monolog\\Processor\\IntrospectionProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php',
205
+ 'Monolog\\Processor\\MemoryPeakUsageProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php',
206
+ 'Monolog\\Processor\\MemoryProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php',
207
+ 'Monolog\\Processor\\MemoryUsageProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php',
208
+ 'Monolog\\Processor\\MercurialProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php',
209
+ 'Monolog\\Processor\\ProcessIdProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php',
210
+ 'Monolog\\Processor\\ProcessorInterface' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php',
211
+ 'Monolog\\Processor\\PsrLogMessageProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php',
212
+ 'Monolog\\Processor\\TagProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/TagProcessor.php',
213
+ 'Monolog\\Processor\\UidProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/UidProcessor.php',
214
+ 'Monolog\\Processor\\WebProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/WebProcessor.php',
215
+ 'Monolog\\Registry' => $vendorDir . '/monolog/monolog/src/Monolog/Registry.php',
216
+ 'Monolog\\ResettableInterface' => $vendorDir . '/monolog/monolog/src/Monolog/ResettableInterface.php',
217
+ 'Monolog\\SignalHandler' => $vendorDir . '/monolog/monolog/src/Monolog/SignalHandler.php',
218
+ 'Monolog\\Test\\TestCase' => $vendorDir . '/monolog/monolog/src/Monolog/Test/TestCase.php',
219
+ 'Monolog\\Utils' => $vendorDir . '/monolog/monolog/src/Monolog/Utils.php',
220
+ 'Psr\\Log\\AbstractLogger' => $vendorDir . '/psr/log/Psr/Log/AbstractLogger.php',
221
+ 'Psr\\Log\\InvalidArgumentException' => $vendorDir . '/psr/log/Psr/Log/InvalidArgumentException.php',
222
+ 'Psr\\Log\\LogLevel' => $vendorDir . '/psr/log/Psr/Log/LogLevel.php',
223
+ 'Psr\\Log\\LoggerAwareInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerAwareInterface.php',
224
+ 'Psr\\Log\\LoggerAwareTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerAwareTrait.php',
225
+ 'Psr\\Log\\LoggerInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerInterface.php',
226
+ 'Psr\\Log\\LoggerTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerTrait.php',
227
+ 'Psr\\Log\\NullLogger' => $vendorDir . '/psr/log/Psr/Log/NullLogger.php',
228
+ 'Psr\\Log\\Test\\DummyTest' => $vendorDir . '/psr/log/Psr/Log/Test/DummyTest.php',
229
+ 'Psr\\Log\\Test\\LoggerInterfaceTest' => $vendorDir . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php',
230
+ 'Psr\\Log\\Test\\TestLogger' => $vendorDir . '/psr/log/Psr/Log/Test/TestLogger.php',
231
  'WP_Async_Request' => $vendorDir . '/a5hleyrich/wp-background-processing/classes/wp-async-request.php',
232
  'WP_Background_Process' => $vendorDir . '/a5hleyrich/wp-background-processing/classes/wp-background-process.php',
233
  );
vendor/composer/autoload_namespaces.php CHANGED
@@ -6,5 +6,4 @@ $vendorDir = dirname(dirname(__FILE__));
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
9
- 'Raygun4php' => array($vendorDir . '/mindscape/raygun4php/src'),
10
  );
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
 
9
  );
vendor/composer/autoload_psr4.php CHANGED
@@ -6,6 +6,8 @@ $vendorDir = dirname(dirname(__FILE__));
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
 
 
9
  'Firebase\\JWT\\' => array($vendorDir . '/firebase/php-jwt/src'),
10
  'Defuse\\Crypto\\' => array($vendorDir . '/defuse/php-encryption/src'),
11
  'CreativeMail\\Modules\\' => array($baseDir . '/src/modules'),
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
9
+ 'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),
10
+ 'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'),
11
  'Firebase\\JWT\\' => array($vendorDir . '/firebase/php-jwt/src'),
12
  'Defuse\\Crypto\\' => array($vendorDir . '/defuse/php-encryption/src'),
13
  'CreativeMail\\Modules\\' => array($baseDir . '/src/modules'),
vendor/composer/autoload_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInitebbc9dc47677799e98f2198d432a27a0
6
  {
7
  private static $loader;
8
 
@@ -22,15 +22,15 @@ class ComposerAutoloaderInitebbc9dc47677799e98f2198d432a27a0
22
  return self::$loader;
23
  }
24
 
25
- spl_autoload_register(array('ComposerAutoloaderInitebbc9dc47677799e98f2198d432a27a0', 'loadClassLoader'), true, true);
26
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
27
- spl_autoload_unregister(array('ComposerAutoloaderInitebbc9dc47677799e98f2198d432a27a0', 'loadClassLoader'));
28
 
29
  $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
30
  if ($useStaticLoader) {
31
  require_once __DIR__ . '/autoload_static.php';
32
 
33
- call_user_func(\Composer\Autoload\ComposerStaticInitebbc9dc47677799e98f2198d432a27a0::getInitializer($loader));
34
  } else {
35
  $map = require __DIR__ . '/autoload_namespaces.php';
36
  foreach ($map as $namespace => $path) {
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
+ class ComposerAutoloaderInit276f66d40e54e142b524f0f17c50ae75
6
  {
7
  private static $loader;
8
 
22
  return self::$loader;
23
  }
24
 
25
+ spl_autoload_register(array('ComposerAutoloaderInit276f66d40e54e142b524f0f17c50ae75', 'loadClassLoader'), true, true);
26
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
27
+ spl_autoload_unregister(array('ComposerAutoloaderInit276f66d40e54e142b524f0f17c50ae75', 'loadClassLoader'));
28
 
29
  $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
30
  if ($useStaticLoader) {
31
  require_once __DIR__ . '/autoload_static.php';
32
 
33
+ call_user_func(\Composer\Autoload\ComposerStaticInit276f66d40e54e142b524f0f17c50ae75::getInitializer($loader));
34
  } else {
35
  $map = require __DIR__ . '/autoload_namespaces.php';
36
  foreach ($map as $namespace => $path) {
vendor/composer/autoload_static.php CHANGED
@@ -4,9 +4,17 @@
4
 
5
  namespace Composer\Autoload;
6
 
7
- class ComposerStaticInitebbc9dc47677799e98f2198d432a27a0
8
  {
9
  public static $prefixLengthsPsr4 = array (
 
 
 
 
 
 
 
 
10
  'F' =>
11
  array (
12
  'Firebase\\JWT\\' => 13,
@@ -29,6 +37,14 @@ class ComposerStaticInitebbc9dc47677799e98f2198d432a27a0
29
  );
30
 
31
  public static $prefixDirsPsr4 = array (
 
 
 
 
 
 
 
 
32
  'Firebase\\JWT\\' =>
33
  array (
34
  0 => __DIR__ . '/..' . '/firebase/php-jwt/src',
@@ -71,16 +87,6 @@ class ComposerStaticInitebbc9dc47677799e98f2198d432a27a0
71
  ),
72
  );
73
 
74
- public static $prefixesPsr0 = array (
75
- 'R' =>
76
- array (
77
- 'Raygun4php' =>
78
- array (
79
- 0 => __DIR__ . '/..' . '/mindscape/raygun4php/src',
80
- ),
81
- ),
82
- );
83
-
84
  public static $classMap = array (
85
  'CreativeMail\\Blocks\\LoadBlock' => __DIR__ . '/../..' . '/src/blocks/LoadBlock.php',
86
  'CreativeMail\\Clients\\CreativeMailClient' => __DIR__ . '/../..' . '/src/Clients/CreativeMailClient.php',
@@ -101,7 +107,8 @@ class ComposerStaticInitebbc9dc47677799e98f2198d432a27a0
101
  'CreativeMail\\Managers\\FormManager' => __DIR__ . '/../..' . '/src/Managers/FormManager.php',
102
  'CreativeMail\\Managers\\InstanceManager' => __DIR__ . '/../..' . '/src/Managers/InstanceManager.php',
103
  'CreativeMail\\Managers\\IntegrationManager' => __DIR__ . '/../..' . '/src/Managers/IntegrationManager.php',
104
- 'CreativeMail\\Managers\\RaygunManager' => __DIR__ . '/../..' . '/src/Managers/RaygunManager.php',
 
105
  'CreativeMail\\Models\\ApiSchema' => __DIR__ . '/../..' . '/src/Models/ApiSchema.php',
106
  'CreativeMail\\Models\\Campaign' => __DIR__ . '/../..' . '/src/Models/Campaign.php',
107
  'CreativeMail\\Models\\CartData' => __DIR__ . '/../..' . '/src/Models/CartData.php',
@@ -177,16 +184,132 @@ class ComposerStaticInitebbc9dc47677799e98f2198d432a27a0
177
  'Firebase\\JWT\\JWT' => __DIR__ . '/..' . '/firebase/php-jwt/src/JWT.php',
178
  'Firebase\\JWT\\Key' => __DIR__ . '/..' . '/firebase/php-jwt/src/Key.php',
179
  'Firebase\\JWT\\SignatureInvalidException' => __DIR__ . '/..' . '/firebase/php-jwt/src/SignatureInvalidException.php',
180
- 'Raygun4php\\Raygun4PhpException' => __DIR__ . '/..' . '/mindscape/raygun4php/src/Raygun4php/Raygun4PhpException.php',
181
- 'Raygun4php\\RaygunClient' => __DIR__ . '/..' . '/mindscape/raygun4php/src/Raygun4php/RaygunClient.php',
182
- 'Raygun4php\\RaygunClientMessage' => __DIR__ . '/..' . '/mindscape/raygun4php/src/Raygun4php/RaygunClientMessage.php',
183
- 'Raygun4php\\RaygunEnvironmentMessage' => __DIR__ . '/..' . '/mindscape/raygun4php/src/Raygun4php/RaygunEnvironmentMessage.php',
184
- 'Raygun4php\\RaygunExceptionMessage' => __DIR__ . '/..' . '/mindscape/raygun4php/src/Raygun4php/RaygunExceptionMessage.php',
185
- 'Raygun4php\\RaygunExceptionTraceLineMessage' => __DIR__ . '/..' . '/mindscape/raygun4php/src/Raygun4php/RaygunExceptionTraceLineMessage.php',
186
- 'Raygun4php\\RaygunIdentifier' => __DIR__ . '/..' . '/mindscape/raygun4php/src/Raygun4php/RaygunIdentifier.php',
187
- 'Raygun4php\\RaygunMessage' => __DIR__ . '/..' . '/mindscape/raygun4php/src/Raygun4php/RaygunMessage.php',
188
- 'Raygun4php\\RaygunMessageDetails' => __DIR__ . '/..' . '/mindscape/raygun4php/src/Raygun4php/RaygunMessageDetails.php',
189
- 'Raygun4php\\RaygunRequestMessage' => __DIR__ . '/..' . '/mindscape/raygun4php/src/Raygun4php/RaygunRequestMessage.php',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
190
  'WP_Async_Request' => __DIR__ . '/..' . '/a5hleyrich/wp-background-processing/classes/wp-async-request.php',
191
  'WP_Background_Process' => __DIR__ . '/..' . '/a5hleyrich/wp-background-processing/classes/wp-background-process.php',
192
  );
@@ -194,10 +317,9 @@ class ComposerStaticInitebbc9dc47677799e98f2198d432a27a0
194
  public static function getInitializer(ClassLoader $loader)
195
  {
196
  return \Closure::bind(function () use ($loader) {
197
- $loader->prefixLengthsPsr4 = ComposerStaticInitebbc9dc47677799e98f2198d432a27a0::$prefixLengthsPsr4;
198
- $loader->prefixDirsPsr4 = ComposerStaticInitebbc9dc47677799e98f2198d432a27a0::$prefixDirsPsr4;
199
- $loader->prefixesPsr0 = ComposerStaticInitebbc9dc47677799e98f2198d432a27a0::$prefixesPsr0;
200
- $loader->classMap = ComposerStaticInitebbc9dc47677799e98f2198d432a27a0::$classMap;
201
 
202
  }, null, ClassLoader::class);
203
  }
4
 
5
  namespace Composer\Autoload;
6
 
7
+ class ComposerStaticInit276f66d40e54e142b524f0f17c50ae75
8
  {
9
  public static $prefixLengthsPsr4 = array (
10
+ 'P' =>
11
+ array (
12
+ 'Psr\\Log\\' => 8,
13
+ ),
14
+ 'M' =>
15
+ array (
16
+ 'Monolog\\' => 8,
17
+ ),
18
  'F' =>
19
  array (
20
  'Firebase\\JWT\\' => 13,
37
  );
38
 
39
  public static $prefixDirsPsr4 = array (
40
+ 'Psr\\Log\\' =>
41
+ array (
42
+ 0 => __DIR__ . '/..' . '/psr/log/Psr/Log',
43
+ ),
44
+ 'Monolog\\' =>
45
+ array (
46
+ 0 => __DIR__ . '/..' . '/monolog/monolog/src/Monolog',
47
+ ),
48
  'Firebase\\JWT\\' =>
49
  array (
50
  0 => __DIR__ . '/..' . '/firebase/php-jwt/src',
87
  ),
88
  );
89
 
 
 
 
 
 
 
 
 
 
 
90
  public static $classMap = array (
91
  'CreativeMail\\Blocks\\LoadBlock' => __DIR__ . '/../..' . '/src/blocks/LoadBlock.php',
92
  'CreativeMail\\Clients\\CreativeMailClient' => __DIR__ . '/../..' . '/src/Clients/CreativeMailClient.php',
107
  'CreativeMail\\Managers\\FormManager' => __DIR__ . '/../..' . '/src/Managers/FormManager.php',
108
  'CreativeMail\\Managers\\InstanceManager' => __DIR__ . '/../..' . '/src/Managers/InstanceManager.php',
109
  'CreativeMail\\Managers\\IntegrationManager' => __DIR__ . '/../..' . '/src/Managers/IntegrationManager.php',
110
+ 'CreativeMail\\Managers\\Logs\\DatadogHandler' => __DIR__ . '/../..' . '/src/Managers/Logs/DatadogHandler.php',
111
+ 'CreativeMail\\Managers\\Logs\\DatadogManager' => __DIR__ . '/../..' . '/src/Managers/Logs/DatadogManager.php',
112
  'CreativeMail\\Models\\ApiSchema' => __DIR__ . '/../..' . '/src/Models/ApiSchema.php',
113
  'CreativeMail\\Models\\Campaign' => __DIR__ . '/../..' . '/src/Models/Campaign.php',
114
  'CreativeMail\\Models\\CartData' => __DIR__ . '/../..' . '/src/Models/CartData.php',
184
  'Firebase\\JWT\\JWT' => __DIR__ . '/..' . '/firebase/php-jwt/src/JWT.php',
185
  'Firebase\\JWT\\Key' => __DIR__ . '/..' . '/firebase/php-jwt/src/Key.php',
186
  'Firebase\\JWT\\SignatureInvalidException' => __DIR__ . '/..' . '/firebase/php-jwt/src/SignatureInvalidException.php',
187
+ 'Monolog\\Attribute\\AsMonologProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Attribute/AsMonologProcessor.php',
188
+ 'Monolog\\DateTimeImmutable' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/DateTimeImmutable.php',
189
+ 'Monolog\\ErrorHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/ErrorHandler.php',
190
+ 'Monolog\\Formatter\\ChromePHPFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php',
191
+ 'Monolog\\Formatter\\ElasticaFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php',
192
+ 'Monolog\\Formatter\\ElasticsearchFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/ElasticsearchFormatter.php',
193
+ 'Monolog\\Formatter\\FlowdockFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php',
194
+ 'Monolog\\Formatter\\FluentdFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php',
195
+ 'Monolog\\Formatter\\FormatterInterface' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php',
196
+ 'Monolog\\Formatter\\GelfMessageFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php',
197
+ 'Monolog\\Formatter\\GoogleCloudLoggingFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/GoogleCloudLoggingFormatter.php',
198
+ 'Monolog\\Formatter\\HtmlFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php',
199
+ 'Monolog\\Formatter\\JsonFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php',
200
+ 'Monolog\\Formatter\\LineFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/LineFormatter.php',
201
+ 'Monolog\\Formatter\\LogglyFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php',
202
+ 'Monolog\\Formatter\\LogmaticFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/LogmaticFormatter.php',
203
+ 'Monolog\\Formatter\\LogstashFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php',
204
+ 'Monolog\\Formatter\\MongoDBFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php',
205
+ 'Monolog\\Formatter\\NormalizerFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php',
206
+ 'Monolog\\Formatter\\ScalarFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php',
207
+ 'Monolog\\Formatter\\WildfireFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php',
208
+ 'Monolog\\Handler\\AbstractHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/AbstractHandler.php',
209
+ 'Monolog\\Handler\\AbstractProcessingHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php',
210
+ 'Monolog\\Handler\\AbstractSyslogHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php',
211
+ 'Monolog\\Handler\\AmqpHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/AmqpHandler.php',
212
+ 'Monolog\\Handler\\BrowserConsoleHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php',
213
+ 'Monolog\\Handler\\BufferHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/BufferHandler.php',
214
+ 'Monolog\\Handler\\ChromePHPHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php',
215
+ 'Monolog\\Handler\\CouchDBHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php',
216
+ 'Monolog\\Handler\\CubeHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/CubeHandler.php',
217
+ 'Monolog\\Handler\\Curl\\Util' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/Curl/Util.php',
218
+ 'Monolog\\Handler\\DeduplicationHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php',
219
+ 'Monolog\\Handler\\DoctrineCouchDBHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php',
220
+ 'Monolog\\Handler\\DynamoDbHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php',
221
+ 'Monolog\\Handler\\ElasticaHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ElasticaHandler.php',
222
+ 'Monolog\\Handler\\ElasticsearchHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ElasticsearchHandler.php',
223
+ 'Monolog\\Handler\\ErrorLogHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php',
224
+ 'Monolog\\Handler\\FallbackGroupHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FallbackGroupHandler.php',
225
+ 'Monolog\\Handler\\FilterHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FilterHandler.php',
226
+ 'Monolog\\Handler\\FingersCrossedHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php',
227
+ 'Monolog\\Handler\\FingersCrossed\\ActivationStrategyInterface' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php',
228
+ 'Monolog\\Handler\\FingersCrossed\\ChannelLevelActivationStrategy' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php',
229
+ 'Monolog\\Handler\\FingersCrossed\\ErrorLevelActivationStrategy' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php',
230
+ 'Monolog\\Handler\\FirePHPHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php',
231
+ 'Monolog\\Handler\\FleepHookHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php',
232
+ 'Monolog\\Handler\\FlowdockHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php',
233
+ 'Monolog\\Handler\\FormattableHandlerInterface' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FormattableHandlerInterface.php',
234
+ 'Monolog\\Handler\\FormattableHandlerTrait' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FormattableHandlerTrait.php',
235
+ 'Monolog\\Handler\\GelfHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/GelfHandler.php',
236
+ 'Monolog\\Handler\\GroupHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/GroupHandler.php',
237
+ 'Monolog\\Handler\\Handler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/Handler.php',
238
+ 'Monolog\\Handler\\HandlerInterface' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/HandlerInterface.php',
239
+ 'Monolog\\Handler\\HandlerWrapper' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php',
240
+ 'Monolog\\Handler\\IFTTTHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php',
241
+ 'Monolog\\Handler\\InsightOpsHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php',
242
+ 'Monolog\\Handler\\LogEntriesHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php',
243
+ 'Monolog\\Handler\\LogglyHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/LogglyHandler.php',
244
+ 'Monolog\\Handler\\LogmaticHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/LogmaticHandler.php',
245
+ 'Monolog\\Handler\\MailHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/MailHandler.php',
246
+ 'Monolog\\Handler\\MandrillHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/MandrillHandler.php',
247
+ 'Monolog\\Handler\\MissingExtensionException' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php',
248
+ 'Monolog\\Handler\\MongoDBHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php',
249
+ 'Monolog\\Handler\\NativeMailerHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php',
250
+ 'Monolog\\Handler\\NewRelicHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php',
251
+ 'Monolog\\Handler\\NoopHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/NoopHandler.php',
252
+ 'Monolog\\Handler\\NullHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/NullHandler.php',
253
+ 'Monolog\\Handler\\OverflowHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/OverflowHandler.php',
254
+ 'Monolog\\Handler\\PHPConsoleHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php',
255
+ 'Monolog\\Handler\\ProcessHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ProcessHandler.php',
256
+ 'Monolog\\Handler\\ProcessableHandlerInterface' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ProcessableHandlerInterface.php',
257
+ 'Monolog\\Handler\\ProcessableHandlerTrait' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ProcessableHandlerTrait.php',
258
+ 'Monolog\\Handler\\PsrHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/PsrHandler.php',
259
+ 'Monolog\\Handler\\PushoverHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/PushoverHandler.php',
260
+ 'Monolog\\Handler\\RedisHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/RedisHandler.php',
261
+ 'Monolog\\Handler\\RedisPubSubHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/RedisPubSubHandler.php',
262
+ 'Monolog\\Handler\\RollbarHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/RollbarHandler.php',
263
+ 'Monolog\\Handler\\RotatingFileHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php',
264
+ 'Monolog\\Handler\\SamplingHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SamplingHandler.php',
265
+ 'Monolog\\Handler\\SendGridHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SendGridHandler.php',
266
+ 'Monolog\\Handler\\SlackHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SlackHandler.php',
267
+ 'Monolog\\Handler\\SlackWebhookHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php',
268
+ 'Monolog\\Handler\\Slack\\SlackRecord' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php',
269
+ 'Monolog\\Handler\\SocketHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SocketHandler.php',
270
+ 'Monolog\\Handler\\SqsHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SqsHandler.php',
271
+ 'Monolog\\Handler\\StreamHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/StreamHandler.php',
272
+ 'Monolog\\Handler\\SwiftMailerHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php',
273
+ 'Monolog\\Handler\\SymfonyMailerHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SymfonyMailerHandler.php',
274
+ 'Monolog\\Handler\\SyslogHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SyslogHandler.php',
275
+ 'Monolog\\Handler\\SyslogUdpHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php',
276
+ 'Monolog\\Handler\\SyslogUdp\\UdpSocket' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php',
277
+ 'Monolog\\Handler\\TelegramBotHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/TelegramBotHandler.php',
278
+ 'Monolog\\Handler\\TestHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/TestHandler.php',
279
+ 'Monolog\\Handler\\WebRequestRecognizerTrait' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/WebRequestRecognizerTrait.php',
280
+ 'Monolog\\Handler\\WhatFailureGroupHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php',
281
+ 'Monolog\\Handler\\ZendMonitorHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php',
282
+ 'Monolog\\LogRecord' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/LogRecord.php',
283
+ 'Monolog\\Logger' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Logger.php',
284
+ 'Monolog\\Processor\\GitProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/GitProcessor.php',
285
+ 'Monolog\\Processor\\HostnameProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/HostnameProcessor.php',
286
+ 'Monolog\\Processor\\IntrospectionProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php',
287
+ 'Monolog\\Processor\\MemoryPeakUsageProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php',
288
+ 'Monolog\\Processor\\MemoryProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php',
289
+ 'Monolog\\Processor\\MemoryUsageProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php',
290
+ 'Monolog\\Processor\\MercurialProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php',
291
+ 'Monolog\\Processor\\ProcessIdProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php',
292
+ 'Monolog\\Processor\\ProcessorInterface' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php',
293
+ 'Monolog\\Processor\\PsrLogMessageProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php',
294
+ 'Monolog\\Processor\\TagProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/TagProcessor.php',
295
+ 'Monolog\\Processor\\UidProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/UidProcessor.php',
296
+ 'Monolog\\Processor\\WebProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/WebProcessor.php',
297
+ 'Monolog\\Registry' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Registry.php',
298
+ 'Monolog\\ResettableInterface' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/ResettableInterface.php',
299
+ 'Monolog\\SignalHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/SignalHandler.php',
300
+ 'Monolog\\Test\\TestCase' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Test/TestCase.php',
301
+ 'Monolog\\Utils' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Utils.php',
302
+ 'Psr\\Log\\AbstractLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/AbstractLogger.php',
303
+ 'Psr\\Log\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/log/Psr/Log/InvalidArgumentException.php',
304
+ 'Psr\\Log\\LogLevel' => __DIR__ . '/..' . '/psr/log/Psr/Log/LogLevel.php',
305
+ 'Psr\\Log\\LoggerAwareInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerAwareInterface.php',
306
+ 'Psr\\Log\\LoggerAwareTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerAwareTrait.php',
307
+ 'Psr\\Log\\LoggerInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerInterface.php',
308
+ 'Psr\\Log\\LoggerTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerTrait.php',
309
+ 'Psr\\Log\\NullLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/NullLogger.php',
310
+ 'Psr\\Log\\Test\\DummyTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/DummyTest.php',
311
+ 'Psr\\Log\\Test\\LoggerInterfaceTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php',
312
+ 'Psr\\Log\\Test\\TestLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/TestLogger.php',
313
  'WP_Async_Request' => __DIR__ . '/..' . '/a5hleyrich/wp-background-processing/classes/wp-async-request.php',
314
  'WP_Background_Process' => __DIR__ . '/..' . '/a5hleyrich/wp-background-processing/classes/wp-background-process.php',
315
  );
317
  public static function getInitializer(ClassLoader $loader)
318
  {
319
  return \Closure::bind(function () use ($loader) {
320
+ $loader->prefixLengthsPsr4 = ComposerStaticInit276f66d40e54e142b524f0f17c50ae75::$prefixLengthsPsr4;
321
+ $loader->prefixDirsPsr4 = ComposerStaticInit276f66d40e54e142b524f0f17c50ae75::$prefixDirsPsr4;
322
+ $loader->classMap = ComposerStaticInit276f66d40e54e142b524f0f17c50ae75::$classMap;
 
323
 
324
  }, null, ClassLoader::class);
325
  }
vendor/composer/installed.json CHANGED
@@ -160,35 +160,74 @@
160
  ]
161
  },
162
  {
163
- "name": "mindscape/raygun4php",
164
- "version": "v1.8.5",
165
- "version_normalized": "1.8.5.0",
166
  "source": {
167
  "type": "git",
168
- "url": "https://github.com/MindscapeHQ/raygun4php.git",
169
- "reference": "ab5401d7bd042ce69810763274d250ac9c10068a"
170
  },
171
  "dist": {
172
  "type": "zip",
173
- "url": "https://api.github.com/repos/MindscapeHQ/raygun4php/zipball/ab5401d7bd042ce69810763274d250ac9c10068a",
174
- "reference": "ab5401d7bd042ce69810763274d250ac9c10068a",
175
  "shasum": ""
176
  },
177
  "require": {
178
- "php": ">=5.3.0"
 
 
 
 
179
  },
180
  "require-dev": {
181
- "phpunit/phpunit": "^4.8.16"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
182
  },
183
  "suggest": {
184
- "ext-curl": "*"
185
- },
186
- "time": "2022-07-11T22:19:37+00:00",
 
 
 
 
 
 
 
 
 
 
 
 
 
187
  "type": "library",
 
 
 
 
 
188
  "installation-source": "dist",
189
  "autoload": {
190
- "psr-0": {
191
- "Raygun4php": "src/"
192
  }
193
  },
194
  "notification-url": "https://packagist.org/downloads/",
@@ -197,18 +236,27 @@
197
  ],
198
  "authors": [
199
  {
200
- "name": "Mindscape",
201
- "email": "contact@mindscape.co.nz",
202
- "homepage": "http://www.mindscapehq.com"
203
  }
204
  ],
205
- "description": "Raygun.io client for PHP 5.3, to send errors and exceptions automatically.",
206
- "homepage": "http://raygun.io",
207
  "keywords": [
208
- "errors",
209
- "exceptions",
210
  "logging",
211
- "raygun"
 
 
 
 
 
 
 
 
 
 
212
  ]
213
  },
214
  {
@@ -318,6 +366,55 @@
318
  "standards"
319
  ]
320
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
321
  {
322
  "name": "squizlabs/php_codesniffer",
323
  "version": "3.7.1",
160
  ]
161
  },
162
  {
163
+ "name": "monolog/monolog",
164
+ "version": "2.8.0",
165
+ "version_normalized": "2.8.0.0",
166
  "source": {
167
  "type": "git",
168
+ "url": "https://github.com/Seldaek/monolog.git",
169
+ "reference": "720488632c590286b88b80e62aa3d3d551ad4a50"
170
  },
171
  "dist": {
172
  "type": "zip",
173
+ "url": "https://api.github.com/repos/Seldaek/monolog/zipball/720488632c590286b88b80e62aa3d3d551ad4a50",
174
+ "reference": "720488632c590286b88b80e62aa3d3d551ad4a50",
175
  "shasum": ""
176
  },
177
  "require": {
178
+ "php": ">=7.2",
179
+ "psr/log": "^1.0.1 || ^2.0 || ^3.0"
180
+ },
181
+ "provide": {
182
+ "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0"
183
  },
184
  "require-dev": {
185
+ "aws/aws-sdk-php": "^2.4.9 || ^3.0",
186
+ "doctrine/couchdb": "~1.0@dev",
187
+ "elasticsearch/elasticsearch": "^7 || ^8",
188
+ "ext-json": "*",
189
+ "graylog2/gelf-php": "^1.4.2",
190
+ "guzzlehttp/guzzle": "^7.4",
191
+ "guzzlehttp/psr7": "^2.2",
192
+ "mongodb/mongodb": "^1.8",
193
+ "php-amqplib/php-amqplib": "~2.4 || ^3",
194
+ "phpspec/prophecy": "^1.15",
195
+ "phpstan/phpstan": "^0.12.91",
196
+ "phpunit/phpunit": "^8.5.14",
197
+ "predis/predis": "^1.1 || ^2.0",
198
+ "rollbar/rollbar": "^1.3 || ^2 || ^3",
199
+ "ruflin/elastica": "^7",
200
+ "swiftmailer/swiftmailer": "^5.3|^6.0",
201
+ "symfony/mailer": "^5.4 || ^6",
202
+ "symfony/mime": "^5.4 || ^6"
203
  },
204
  "suggest": {
205
+ "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
206
+ "doctrine/couchdb": "Allow sending log messages to a CouchDB server",
207
+ "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client",
208
+ "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
209
+ "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler",
210
+ "ext-mbstring": "Allow to work properly with unicode symbols",
211
+ "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)",
212
+ "ext-openssl": "Required to send log messages using SSL",
213
+ "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)",
214
+ "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
215
+ "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)",
216
+ "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
217
+ "rollbar/rollbar": "Allow sending log messages to Rollbar",
218
+ "ruflin/elastica": "Allow sending log messages to an Elastic Search server"
219
+ },
220
+ "time": "2022-07-24T11:55:47+00:00",
221
  "type": "library",
222
+ "extra": {
223
+ "branch-alias": {
224
+ "dev-main": "2.x-dev"
225
+ }
226
+ },
227
  "installation-source": "dist",
228
  "autoload": {
229
+ "psr-4": {
230
+ "Monolog\\": "src/Monolog"
231
  }
232
  },
233
  "notification-url": "https://packagist.org/downloads/",
236
  ],
237
  "authors": [
238
  {
239
+ "name": "Jordi Boggiano",
240
+ "email": "j.boggiano@seld.be",
241
+ "homepage": "https://seld.be"
242
  }
243
  ],
244
+ "description": "Sends your logs to files, sockets, inboxes, databases and various web services",
245
+ "homepage": "https://github.com/Seldaek/monolog",
246
  "keywords": [
247
+ "log",
 
248
  "logging",
249
+ "psr-3"
250
+ ],
251
+ "funding": [
252
+ {
253
+ "url": "https://github.com/Seldaek",
254
+ "type": "github"
255
+ },
256
+ {
257
+ "url": "https://tidelift.com/funding/github/packagist/monolog/monolog",
258
+ "type": "tidelift"
259
+ }
260
  ]
261
  },
262
  {
366
  "standards"
367
  ]
368
  },
369
+ {
370
+ "name": "psr/log",
371
+ "version": "1.1.4",
372
+ "version_normalized": "1.1.4.0",
373
+ "source": {
374
+ "type": "git",
375
+ "url": "https://github.com/php-fig/log.git",
376
+ "reference": "d49695b909c3b7628b6289db5479a1c204601f11"
377
+ },
378
+ "dist": {
379
+ "type": "zip",
380
+ "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11",
381
+ "reference": "d49695b909c3b7628b6289db5479a1c204601f11",
382
+ "shasum": ""
383
+ },
384
+ "require": {
385
+ "php": ">=5.3.0"
386
+ },
387
+ "time": "2021-05-03T11:20:27+00:00",
388
+ "type": "library",
389
+ "extra": {
390
+ "branch-alias": {
391
+ "dev-master": "1.1.x-dev"
392
+ }
393
+ },
394
+ "installation-source": "dist",
395
+ "autoload": {
396
+ "psr-4": {
397
+ "Psr\\Log\\": "Psr/Log/"
398
+ }
399
+ },
400
+ "notification-url": "https://packagist.org/downloads/",
401
+ "license": [
402
+ "MIT"
403
+ ],
404
+ "authors": [
405
+ {
406
+ "name": "PHP-FIG",
407
+ "homepage": "https://www.php-fig.org/"
408
+ }
409
+ ],
410
+ "description": "Common interface for logging libraries",
411
+ "homepage": "https://github.com/php-fig/log",
412
+ "keywords": [
413
+ "log",
414
+ "psr",
415
+ "psr-3"
416
+ ]
417
+ },
418
  {
419
  "name": "squizlabs/php_codesniffer",
420
  "version": "3.7.1",
vendor/mindscape/raygun4php/.gitattributes DELETED
@@ -1,22 +0,0 @@
1
- # Auto detect text files and perform LF normalization
2
- * text=auto
3
-
4
- # Custom for Visual Studio
5
- *.cs diff=csharp
6
- *.sln merge=union
7
- *.csproj merge=union
8
- *.vbproj merge=union
9
- *.fsproj merge=union
10
- *.dbproj merge=union
11
-
12
- # Standard to msysgit
13
- *.doc diff=astextplain
14
- *.DOC diff=astextplain
15
- *.docx diff=astextplain
16
- *.DOCX diff=astextplain
17
- *.dot diff=astextplain
18
- *.DOT diff=astextplain
19
- *.pdf diff=astextplain
20
- *.PDF diff=astextplain
21
- *.rtf diff=astextplain
22
- *.RTF diff=astextplain
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/mindscape/raygun4php/.gitignore DELETED
@@ -1,168 +0,0 @@
1
- #################
2
- ## Eclipse
3
- #################
4
-
5
- *.pydevproject
6
- .project
7
- .metadata
8
- bin/
9
- tmp/
10
- *.tmp
11
- *.bak
12
- *.swp
13
- *~.nib
14
- local.properties
15
- .classpath
16
- .settings/
17
- .loadpath
18
-
19
- # External tool builders
20
- .externalToolBuilders/
21
-
22
- # Locally stored "Eclipse launch configurations"
23
- *.launch
24
-
25
- # CDT-specific
26
- .cproject
27
-
28
- # PDT-specific
29
- .buildpath
30
-
31
-
32
- #################
33
- ## Visual Studio
34
- #################
35
-
36
- ## Ignore Visual Studio temporary files, build results, and
37
- ## files generated by popular Visual Studio add-ons.
38
-
39
- # User-specific files
40
- *.suo
41
- *.user
42
- *.sln.docstates
43
-
44
- # Build results
45
- [Dd]ebug/
46
- [Rr]elease/
47
- *_i.c
48
- *_p.c
49
- *.ilk
50
- *.meta
51
- *.obj
52
- *.pch
53
- *.pdb
54
- *.pgc
55
- *.pgd
56
- *.rsp
57
- *.sbr
58
- *.tlb
59
- *.tli
60
- *.tlh
61
- *.tmp
62
- *.vspscc
63
- .builds
64
- *.dotCover
65
-
66
- ## TODO: If you have NuGet Package Restore enabled, uncomment this
67
- #packages/
68
-
69
- # Visual C++ cache files
70
- ipch/
71
- *.aps
72
- *.ncb
73
- *.opensdf
74
- *.sdf
75
-
76
- # Visual Studio profiler
77
- *.psess
78
- *.vsp
79
-
80
- # ReSharper is a .NET coding add-in
81
- _ReSharper*
82
-
83
- # Installshield output folder
84
- [Ee]xpress
85
-
86
- # DocProject is a documentation generator add-in
87
- DocProject/buildhelp/
88
- DocProject/Help/*.HxT
89
- DocProject/Help/*.HxC
90
- DocProject/Help/*.hhc
91
- DocProject/Help/*.hhk
92
- DocProject/Help/*.hhp
93
- DocProject/Help/Html2
94
- DocProject/Help/html
95
-
96
- # Click-Once directory
97
- publish
98
-
99
- # Others
100
- [Bb]in
101
- [Oo]bj
102
- sql
103
- TestResults
104
- *.Cache
105
- ClientBin
106
- stylecop.*
107
- ~$*
108
- *.dbmdl
109
- # RIA/Silverlight projects
110
- Generated_Code
111
-
112
- # Backup & report files from converting an old project file to a newer
113
- # Visual Studio version. Backup files are not needed, because we have git ;-)
114
- _UpgradeReport_Files/
115
- Backup*/
116
- UpgradeLog*.XML
117
-
118
-
119
-
120
- ############
121
- ## Windows
122
- ############
123
-
124
- # Windows image file caches
125
- Thumbs.db
126
-
127
- # Folder config file
128
- Desktop.ini
129
-
130
-
131
- #############
132
- ## Python
133
- #############
134
-
135
- *.py[co]
136
-
137
- # Packages
138
- *.egg
139
- *.egg-info
140
- dist
141
- build
142
- eggs
143
- parts
144
- bin
145
- var
146
- sdist
147
- develop-eggs
148
- .installed.cfg
149
-
150
- # Installer logs
151
- pip-log.txt
152
-
153
- # Unit test / coverage reports
154
- .coverage
155
- .tox
156
-
157
- #Translations
158
- *.mo
159
-
160
- #Mr Developer
161
- .mr.developer.cfg
162
-
163
- # Mac crap
164
- .DS_Store
165
-
166
- .idea
167
- vendor/
168
- composer.lock
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/mindscape/raygun4php/.travis.yml DELETED
@@ -1,12 +0,0 @@
1
- language: php
2
-
3
- dist: trusty
4
-
5
- php: [5.4, 5.5, 5.6, 7.0, 7.1, 7.2, 7.3, 7.4]
6
-
7
- before_script:
8
- - composer self-update
9
- - if [[ ${TRAVIS_PHP_VERSION:0:3} =~ ^7\.[234]$ ]] ; then composer require --dev phpunit/phpunit:"^5.7.27" ; fi
10
- - composer install --prefer-source --no-interaction --no-progress
11
-
12
- script: 'vendor/bin/phpunit tests'
 
 
 
 
 
 
 
 
 
 
 
 
vendor/mindscape/raygun4php/CodeIgniterInstructions.md DELETED
@@ -1,71 +0,0 @@
1
- ## Raygun4PHP CodeIgniter installation instructions
2
-
3
- ### Step 1: Install Raygun4PHP with Composer (see README.md)
4
-
5
- ### Step 2: Enable hooks
6
-
7
- In `/application/config/config.php` set *enable_hooks* to true:
8
-
9
- ```
10
- $config['enable_hooks'] = TRUE;
11
- ```
12
-
13
- ### Step 3: Create the file: `/application/hooks/RaygunSetup.php` with the following content:
14
-
15
- ```
16
- <?php namespace
17
- {
18
- require_once FCPATH . 'vendor/autoload.php';
19
-
20
- class RaygunSetup {
21
- private $client;
22
-
23
- public function __construct()
24
- {
25
- $this->client = new \Raygun4php\RaygunClient("API_KEY");
26
- }
27
-
28
- public function set_exception_handler()
29
- {
30
- set_exception_handler( array( $this,'exception_handler' ) );
31
- set_error_handler( array( $this, 'error_handler' ) );
32
- register_shutdown_function( array( $this, 'fatal_error_handler' ) );
33
- }
34
-
35
- function exception_handler($exception) {
36
- $this->client->SendException($exception);
37
- }
38
-
39
- function error_handler( $errno, $errstr, $errfile, $errline) {
40
- $this->client->SendError($errno, $errstr, $errfile, $errline);
41
- }
42
-
43
- // Handle fatal errors
44
- function fatal_error_handler() {
45
- $last_error = error_get_last();
46
-
47
- if (!is_null($last_error)) {
48
- $errno = $last_error['type'];
49
- $errstr = $last_error['message'];
50
- $errfile = $last_error['file'];
51
- $errline = $last_error['line'];
52
- $this->client->SendError($errno, $errstr, $errfile, $errline);
53
- }
54
- }
55
-
56
- }
57
- }
58
- ```
59
-
60
- **Important:** Make sure you change *API_KEY* to your Raygun API key.
61
-
62
- ### Step 4: In `/config/hooks.php`:
63
-
64
- ```
65
- $hook['pre_controller'][] = array(
66
- 'class' => 'RaygunSetup',
67
- 'function' => 'set_exception_handler',
68
- 'filename' => 'RaygunSetup.php',
69
- 'filepath' => 'hooks'
70
- );
71
- ```
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/mindscape/raygun4php/LICENSE DELETED
@@ -1,15 +0,0 @@
1
- Copyright (C) 2013 Mindscape
2
-
3
- Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
4
- documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
5
- rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
6
- permit persons to whom the Software is furnished to do so, subject to the following conditions:
7
-
8
- The above copyright notice and this permission notice shall be included in all copies or substantial portions
9
- of the Software.
10
-
11
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
12
- THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
13
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
14
- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
15
- SOFTWARE.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/mindscape/raygun4php/Laravel5Instructions.md DELETED
@@ -1,41 +0,0 @@
1
- ### Laravel 5 Setup Instructions
2
-
3
- #### Step 1. Install the *laravel-raygun* wrapper with Composer
4
-
5
- See instructions: https://github.com/davibennun/laravel-raygun
6
-
7
- #### Step 2. Add Raygun into your ExceptionHandler report method
8
-
9
- File: `app\Exceptions\Handler.php`
10
-
11
- Add this line before the class declaration:
12
-
13
- ```
14
- use Raygun;
15
- ```
16
-
17
- To send **all** exceptions to Raygun, add this line into the `report` method :
18
-
19
- ```
20
- public function report(Exception $e)
21
- {
22
- // Send all exceptions:
23
- Raygun::SendException($e);
24
-
25
- parent::report($e);
26
- }
27
- ```
28
-
29
- Alternatively, you can select which exceptions you want to send using the _instanceof_ operator:
30
-
31
- ```
32
- public function report(Exception $e)
33
- {
34
- // Send only a particular type of exception:
35
- if($e instanceof MyCustomException) {
36
- Raygun::SendException($e);
37
- }
38
-
39
- parent::report($e);
40
- }
41
- ```
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/mindscape/raygun4php/README.md DELETED
@@ -1,337 +0,0 @@
1
- Raygun4PHP
2
- ==========
3
-
4
- [Raygun.com](http://raygun.com) provider for PHP 5.3+
5
-
6
- [![Build
7
- Status](https://secure.travis-ci.org/MindscapeHQ/raygun4php.png?branch=master)](http://travis-ci.org/MindscapeHQ/raygun4php)
8
-
9
- ## Installation
10
-
11
- Firstly, ensure that **curl** is installed and enabled in your server's php.ini file.
12
-
13
- ### With Composer
14
-
15
- Composer is a package management tool for PHP which automatically fetches dependencies and also supports autoloading - this is a low-impact way to get Raygun4PHP into your site.
16
-
17
- 1. If you use a *nix environment, [follow the instructions](http://getcomposer.org/doc/01-basic-usage.md#installation) to install Composer. Windows users can run [this installer](https://github.com/johnstevenson/composer-setup) to automatically add it to the Path.
18
-
19
- 2. Inside your project's root directory create a composer.json file, containing:
20
- ```json
21
- {
22
- "require": {
23
- "mindscape/raygun4php": "1.*"
24
- }
25
- }
26
- ```
27
- 3. From your shell run `php composer.phar install` (*nix) or `composer install` (Windows). This will download Raygun4Php and create the appropriate autoload data.
28
-
29
- 4. Then in a PHP file just add:
30
- ```php
31
- require_once 'vendor/autoload.php';
32
- ```
33
- and the library will be imported ready for use.
34
-
35
- ### Manually with Git
36
-
37
- Clone this repository and copy src/Raygun4php into an appropriate subdirectory in your project, such as /vendor/Raygun4php. Add a `requires` definition that references the location of RaygunClient.php where you want to make a call to Send().
38
-
39
- ```php
40
- require __DIR__ . '/vendor/raygun4php/src/Raygun4php/RaygunClient.php';
41
- ```
42
- ## Usage
43
-
44
- You can send both PHP errors and object-oriented exceptions to Raygun. An easy way to accomplish this is to create a file containing exception and error handlers which make calls to the appropriate Raygun4PHP functions. As above, import Raygun4PHP - if you're using Composer, just add `require_once 'vendor/autoload.php'`, or if not manually import RaygunClient.php.
45
-
46
- Then, create handlers that look something like this:
47
-
48
- ```php
49
- namespace
50
- {
51
- // paste your 'requires' statement
52
-
53
- $client = new \Raygun4php\RaygunClient("apikey for your application");
54
-
55
- function error_handler($errno, $errstr, $errfile, $errline ) {
56
- global $client;
57
- $client->SendError($errno, $errstr, $errfile, $errline);
58
- }
59
-
60
- function exception_handler($exception)
61
- {
62
- global $client;
63
- $client->SendException($exception);
64
- }
65
-
66
- function fatal_error()
67
- {
68
- global $client;
69
- $last_error = error_get_last();
70
-
71
- if (!is_null($last_error)) {
72
- $errno = $last_error['type'];
73
- $errstr = $last_error['message'];
74
- $errfile = $last_error['file'];
75
- $errline = $last_error['line'];
76
- $client->SendError($errno, $errstr, $errfile, $errline);
77
- }
78
- }
79
-
80
- set_exception_handler('exception_handler');
81
- set_error_handler("error_handler");
82
- register_shutdown_function("fatal_error");
83
- }
84
- ```
85
-
86
- Note that if you are placing in inside a file with a namespace of your choosing, the above code should be declared to be within the global namespace (thus the `namespace { }` is required). You will also need whichever `requires` statement as above (autoload or manual) before the `$client` instantiation.
87
-
88
- Copy your application's API key from the Raygun.io dashboard, and place it in the constructor call as above (do not include the curly brackets).
89
-
90
- If the handlers reside in their own file, just import it in every file where you'd like exceptions and errors to be sent, and they will be delivered to Raygun.io.
91
-
92
- ## Configuration
93
-
94
- ### Sending method - async/sync
95
-
96
- Raygun4PHP has two algorithms which it can use to send your errors:
97
-
98
- * **Asynchronous**: POSTs the message and returns to your script immediately without waiting for the response from the Raygun API.
99
-
100
- * **Synchronous**: POSTs the message, blocks and receives the HTTP response from the Raygun API. This uses a socket connection which is still reasonably fast. This also allows the use of the debug mode to receive the HTTP response code; see below.
101
-
102
-
103
- This can be set by passing in a boolean as the 2nd parameter to the constructor:
104
-
105
- ```php
106
- $client = new \Raygun4php\RaygunClient("apiKey", $useAsyncSending);
107
- ```
108
- #### $useAsyncSending options
109
-
110
- Type: *boolean*
111
-
112
- Linux/OS X default: *true*
113
-
114
- Windows default: *false*
115
-
116
- * If **$useAsyncSending** is *true*, and the script is running on a *nix platform, the message will be delivered asynchronously. SendError() and SendException() will return 0 if all went well.
117
-
118
- * If **$useAsyncSending** is *false*, the script will block and receive the HTTP response.
119
-
120
- *false* is the only effective option on Windows due to platform and library limitations within the supported versions.
121
-
122
- ### Proxies
123
-
124
- A HTTP proxy can be set if your environment can't connect out through PHP or the `curl` binrary natively:
125
-
126
- ```php
127
- $client = new \Raygun4php\RaygunClient("apiKey");
128
- $client->setProxy('http://someproxy:8080');
129
- ```
130
-
131
- ### Debug mode
132
-
133
- The client offers a debug mode in which the HTTP response code can be returned after a POST attempt. This can be useful when adding Raygun to your site. This is accessed by passing in *true* as the third parameter in the client constructor:
134
-
135
- ```php
136
- $client = new \Raygun4php\RaygunClient("apiKey", $useAsyncSending, $debugMode);
137
- ```
138
-
139
- #### $debugMode options
140
-
141
- *Default: false*
142
-
143
- If true is passed in, and **$useAsyncSending** is set to *false*, client->SendException() or SendError() will return the HTTP status code of the POST attempt.
144
-
145
- **Note:** If $useAsyncSending is *true*, $debugMode is not available.
146
-
147
- #### Response codes
148
-
149
- * **202**: Message received by Raygun API correctly
150
- * **403**: Invalid API key. Copy it from your Raygun Application Settings, it should be of the form `new RaygunClient("A+nUc2dLh27vbh8abls7==")`
151
-
152
- ### Version numbers
153
-
154
- You can transmit the version number of your PHP project along with the message by calling `SetVersion()` on your RaygunClient after it is instantiated - this is optional but recommended as the version number is considered to be first-class data for a message.
155
-
156
- ### Adding Tags
157
-
158
- Tags can be added to error data to provide extra information and to help filtering errors within Raygun.
159
- They are provided as an array of strings or numbers passed as the `5th argument to the SendError function` and as the `2nd argument to the SendException function`.
160
-
161
- The declaration of the exception and error handlers using tags could look something like this:
162
-
163
- ```php
164
- $tags = array("testing-enviroment", "machine-4");
165
-
166
- function error_handler($errno, $errstr, $errfile, $errline) {
167
- global $client, $tags;
168
- $client->SendError($errno, $errstr, $errfile, $errline, $tags);
169
- }
170
-
171
- function exception_handler($exception) {
172
- global $client, $tags;
173
- $client->SendException($exception, $tags);
174
- }
175
-
176
- function fatal_error()
177
- {
178
- global $client;
179
- $last_error = error_get_last();
180
-
181
- if (!is_null($last_error)) {
182
- $errno = $last_error['type'];
183
- $errstr = $last_error['message'];
184
- $errfile = $last_error['file'];
185
- $errline = $last_error['line'];
186
- $client->SendError($errno, $errstr, $errfile, $errline, $tags);
187
- }
188
- }
189
- ```
190
-
191
- ### Affected user tracking
192
-
193
- **New in 1.5: additional data support**
194
-
195
- You can call $client->SetUser, passing in some or all of the following data, which will be used to provide an affected user count and reports:
196
-
197
- ```php
198
- SetUser($user = null, $firstName = null, $fullName = null, $email = null, $isAnonymous = null, $uuid = null)
199
- ```
200
-
201
- `$user` should be a unique identifier which is used to identify your users. If you set this to their email address, be sure to also set the $email parameter too.
202
-
203
- This feature and values are optional if you wish to disable it for privacy concerns. To do so, pass `true` in as the third parameter to the RaygunClient constructor.
204
-
205
- Note that this data is stored as cookies. If you do not call SetUser the default is to store a random UUID to represent the user.
206
-
207
- This feature can be used in CLI mode by calling SetUser() at the start of your session.
208
-
209
- ### Custom error grouping
210
-
211
- Control of how error instances are grouped together can achieved by passing a callback to the `SetGroupingKey` method on the client. If the callback returns a string, ideally 100 characters or less, errors matching that key will grouped together. Overriding the default automatic grouping. If the callback returns a non-string value then that error will be grouped automatically.
212
-
213
- ```php
214
- $client = new \Raygun4php\RaygunClient("apiKey");
215
- $client->SetGroupingKey(function($payload, $stackTrace) {
216
- // Inspect the above parameters and return a hash from the properties
217
-
218
- return $payload->Details->Error->Message; // Naive message-based grouping only
219
- });
220
- ```
221
-
222
- ### Filtering Sensitive Data
223
-
224
- Some error data will be too sensitive to transmit to an external service, such as credit card details or passwords. Since this data is very application specific, Raygun doesn't filter out anything by default. You can configure to either replace or otherwise transform specific values based on their keys. These transformations apply to form data (`$_POST`), custom user data, HTTP headers, and environment data (`$_SERVER`). It does not filter the URL or its `$_GET` parameters, or custom message strings. Since Raygun doesn't log method arguments in stack traces, those don't need filtering. All key comparisons are case insensitive.
225
-
226
- ```php
227
- $client = new \Raygun4php\RaygunClient("apiKey");
228
- $client->setFilterParams(array(
229
- 'password' => true,
230
- 'creditcardnumber' => true,
231
- 'ccv' => true,
232
- 'php_auth_pw' => true, // filters basic auth from $_SERVER
233
- ));
234
- // Example input: array('Username' => 'myuser','Password' => 'secret')
235
- // Example output: array('Username' => 'myuser','Password' => '[filtered]')
236
- ```
237
-
238
- You can also define keys as regular expressions:
239
-
240
- ```php
241
- $client = new \Raygun4php\RaygunClient("apiKey");
242
- $client->setFilterParams(array(
243
- '/^credit/i' => true,
244
- ));
245
- // Example input: array('CreditCardNumber' => '4111111111111111','CreditCardCcv' => '123')
246
- // Example output: array('CreditCardNumber' => '[filtered]','CreditCardCcv' => '[filtered]')
247
- ```
248
-
249
- In case you want to retain some hints on the data rather than removing it completely, you can also apply custom transformations through PHP's anonymous functions. The following example truncates all keys starting with "address".
250
-
251
- ```php
252
- $client = new \Raygun4php\RaygunClient("apiKey");
253
- $client->setFilterParams(array(
254
- 'Email' => function($key, $val) {return substr($val, 0, 5) . '...';}
255
- ));
256
- // Example input: array('Email' => 'test@test.com')
257
- // Example output: array('Email' => 'test@...')
258
- ```
259
-
260
- Note that when any filters are defined, the Raygun error will no longer contain the raw HTTP data, since there's no effective way to filter it.
261
-
262
- ### Updating Cookie options
263
-
264
- Cookies are used for the user tracking functionality of the Raygun4Php provider. In version 1.8 of the provider, the options passed to the `setcookie` method can now be customized to your needs.
265
-
266
- ```php
267
- $client = new \Raygun4php\RaygunClient("apiKey");
268
- $client->SetCookieOptions(array(
269
- 'expire' => 2592000, // 30 * 24 * 60 * 60
270
- 'path' => '/',
271
- 'domain' => '',
272
- 'secure' => false,
273
- 'httponly' => false
274
- ));
275
- ```
276
-
277
- ## Troubleshooting
278
-
279
- As above, enable debug mode by instantiating the client with
280
-
281
- ```php
282
- $client = new \Raygun4php\RaygunClient("apiKey", FALSE, TRUE);
283
- ```
284
-
285
- This will echo the HTTP response code. Check the list above, and create an issue or contact us if you continue to have problems.
286
-
287
- ### 400 from command-line Posix environments
288
-
289
- If, when running a PHP script from the command line on *nix operating systems, you receive a '400 Bad Request' error (when debug mode is enabled), check to see if you have any LESS_TERMCAP environment variables set. These are not compatible with the current version of Raygun4PHP. As a workaround, unset these variables before your script runs, then reset them afterwards.
290
-
291
-
292
- ### Error Control Operators (@)
293
-
294
- If you are using the setup as described above errors will be send to Raygun regardless of any lines prepended with an error control operator (the @ symbol). To stop these errors from being sent to Raygun you can call PHP's [error_reporting](http://php.net/manual/en/function.error-reporting.php) method which return 0 if the triggered error was preceded by an @ symbol.
295
-
296
- _Error handler example:_
297
- ```php
298
- function error_handler($errno, $errstr, $errfile, $errline ) {
299
- global $client;
300
- if(error_reporting() !== 0) {
301
- $client->SendError($errno, $errstr, $errfile, $errline);
302
- }
303
- }
304
- ```
305
-
306
- See the [Error Control Operators section on PHP.net](http://php.net/manual/en/language.operators.errorcontrol.php) for more information
307
-
308
- ## Changelog
309
- - 1.8.3: Remove the `--dev` option for composer installations as it's now deprecated
310
- - 1.8.2: No longer output warning when a socket connection fails
311
- - 1.8.1: Fix issue with error being raised with null bytes send with escapeshellarg method
312
- - 1.8.0: Bugfix with multiple cookies being set. Cookie options can be set via the setCookieOptions method
313
- - 1.7.1: Fixed illegal string offset
314
- - 1.7.0: Added custom error grouping
315
- - 1.6.1: Assign ClassName as exceptionClass
316
- - 1.6.0: Added HTTP proxy support, support X-Forwarded-For, null server var guards
317
- - 1.5.3: Unify property casing (internal change)
318
- - 1.5.2: Prevent error when query_string isn't present in $_SERVER
319
- - 1.5.1: Guard against intermittent user id cookie being null; overload for disabling user tracking
320
- - 1.5.0: Add enhanced user data support; fix null backtrace frames that could occur in 1.4
321
- - 1.4.0: Added Sensitive Data Filtering; improved Error backtraces; Travis CI enabled
322
- - 1.3.6: Move included Rhumsaa\Uuid lib into this namespace to prevent collisions if already included
323
- - 1.3.5: Fixed possible bug in async curl logic
324
- - 1.3.4: Bugfix in request message for testing
325
- - 1.3.3: Hotfix for script error in v1.3.2
326
- - 1.3.2: UTF-8 encoding routine from previous version updated to remove PHP 5.5 deprecated function
327
- - 1.3.1: Request data, specifically $_SERVER variables, are now correctly encoded in UTF-8
328
- - 1.3: Added debug mode to output HTTP response code when in socket mode
329
- - 1.2.6: Fixed a bug in previous release rendering the UTC offset fix ineffective (thanks @mrardon for spotting this)
330
- - 1.2.5: Request rawData (php://input) limited to 4096 bytes in line with other providers; clamp UTC offset to sane values as API was seeing some entries with max int offsets
331
- - 1.2.4: Merged in unit tests
332
- - 1.2.3: Fixed a bug where OccurredOn wasn't in correct ISO 8601 representation
333
- - 1.2.2: Minor formatting refactor
334
- - 1.2.1: Several bugfixes for user tracking and request processing
335
- - 1.2: Added new async sending function; removed cURL dependency
336
- - 1.1: Added user tracking support; improved experience in CLI mode; add user-specified timestamp support; fixed user data encoding error
337
- - 1.0: Initial commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/mindscape/raygun4php/SymfonyInstructions.md DELETED
@@ -1,46 +0,0 @@
1
- ## Raygun4PHP Symfony installation instructions
2
-
3
- ### Step 1: Install Raygun4PHP with Composer (see README.md)
4
-
5
- ### Step 2: Create the file: `src/AppBundle/EventListener/RaygunExceptionListener` with the following content:
6
-
7
- ```php
8
- <?php
9
-
10
- namespace AppBundle\EventListener;
11
-
12
- use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
13
- use Raygun;
14
-
15
- class RaygunExceptionListener
16
- {
17
-
18
- private $client;
19
-
20
- public function __construct()
21
- {
22
- $this->client = new \Raygun4php\RaygunClient("apiKey");
23
- }
24
-
25
- public function onKernelException(GetResponseForExceptionEvent $event)
26
- {
27
- // You get the exception object from the received event
28
- $exception = $event->getException();
29
- $this->client->SendException($exception);
30
- }
31
- }
32
-
33
- ?>
34
- ```
35
- **Important:** Make sure you change *apiKey* to your Raygun API key.
36
-
37
- ### Step 3: Register the hook service in `app/config/services.yml`
38
- ```
39
- app.exception_listener:
40
- class: AppBundle\EventListener\RaygunExceptionListener
41
- tags:
42
- - { name: kernel.event_listener, event: kernel.exception }
43
- ```
44
-
45
- ## Further Information:
46
- Information about the [Symfony Event Listeners can be located here](http://symfony.com/doc/current/cookbook/event_dispatcher/event_listener.html).
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/mindscape/raygun4php/composer.json DELETED
@@ -1,27 +0,0 @@
1
- {
2
- "name": "mindscape/raygun4php",
3
- "type": "library",
4
- "description": "Raygun.io client for PHP 5.3, to send errors and exceptions automatically.",
5
- "authors": [{
6
- "name": "Mindscape",
7
- "email": "contact@mindscape.co.nz",
8
- "homepage": "http://www.mindscapehq.com"
9
- }],
10
- "homepage": "http://raygun.io",
11
- "keywords": ["raygun", "errors", "exceptions", "logging"],
12
- "license": "MIT",
13
- "require": {
14
- "php": ">=5.3.0"
15
- },
16
- "require-dev": {
17
- "phpunit/phpunit": "^4.8.16"
18
- },
19
- "suggest": {
20
- "ext-curl": "*"
21
- },
22
- "autoload": {
23
- "psr-0": {
24
- "Raygun4php": "src/"
25
- }
26
- }
27
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/mindscape/raygun4php/phpunit.xml DELETED
@@ -1,14 +0,0 @@
1
- <phpunit
2
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3
- xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"
4
- backupGlobals="false"
5
- backupStaticAttributes="false"
6
- bootstrap="testbootstrap.php"
7
- colors="true"
8
- syntaxCheck="false">
9
- <testsuites>
10
- <testsuite name="Tests">
11
- <directory suffix=".php">tests</directory>
12
- </testsuite>
13
- </testsuites>
14
- </phpunit>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/mindscape/raygun4php/sample-apps/.gitignore DELETED
@@ -1,2 +0,0 @@
1
- debug.log
2
- config.php
 
 
vendor/mindscape/raygun4php/sample-apps/async-example/README.md DELETED
@@ -1,6 +0,0 @@
1
- ## Setup instructions
2
-
3
- 1. Install composer dependencies
4
- 2. Copy `config-sample.php` and rename to `config.php`
5
- 3. Insert your API key from Raygun into the `API_KEY` field
6
- 4. Submit the form with empty/zero values to trigger errors
 
 
 
 
 
 
vendor/mindscape/raygun4php/sample-apps/async-example/composer.json DELETED
@@ -1,6 +0,0 @@
1
- {
2
- "require": {
3
- "mindscape/raygun4php": "^1.0",
4
- "monolog/monolog": "2.0.2"
5
- }
6
- }
 
 
 
 
 
 
vendor/mindscape/raygun4php/sample-apps/async-example/config-sample.php DELETED
@@ -1,2 +0,0 @@
1
- <?php
2
- const API_KEY = 'INSERT_YOUR_API_KEY_HERE';
 
 
vendor/mindscape/raygun4php/sample-apps/async-example/index.php DELETED
@@ -1,46 +0,0 @@
1
- <?php
2
- require_once 'raygunSetup.php';
3
- require_once 'viewData.php';
4
-
5
- $viewData = new ViewData();
6
- ?>
7
-
8
- <!DOCTYPE html>
9
- <html lang="en">
10
- <head>
11
- <?php include 'partials/head.php' ?>
12
- </head>
13
- <body>
14
-
15
- <div class="grid-container">
16
- <div class="grid-x">
17
- <h2>Runner's pace calculator</h2>
18
- <div class="cell">
19
- <form method="post" action="index.php">
20
- <div class="grid-x grid-margin-x">
21
- <div class="cell medium-6">
22
- <label for="time">Time (minutes)</label>
23
- <input id="time" name="time" type="number" value="<?php echo $viewData->getTime(); ?>"/>
24
- </div>
25
- <div class="cell medium-6 grid-margin-x">
26
- <label for="distance">Distance (km) <strong>DANGER: DO NOT SET TO ZERO!!!</strong></label>
27
- <input id="distance" name="distance" type="number" step="0.1" value="<?php echo $viewData->getDistance(); ?>"/>
28
- </div>
29
- </div>
30
-
31
- <button type="submit" class="primary button">Calculate</button>
32
- </form>
33
-
34
- <?php if ($viewData->hasSentData()) : ?>
35
- <div class="callout success">
36
- <p><strong>Average pace:</strong> <?php echo $viewData->getAveragePace(); ?>mins/km</p>
37
- <p><strong>Average speed:</strong> <?php echo $viewData->getAverageSpeed(); ?>km/hr</p>
38
- </div>
39
- <?php endif; ?>
40
- </div>
41
- </div>
42
- </div>
43
-
44
- </body>
45
- </html>
46
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/mindscape/raygun4php/sample-apps/async-example/partials/head.php DELETED
@@ -1,15 +0,0 @@
1
- <meta charset="UTF-8">
2
- <title>Runner's pace calculator</title>
3
-
4
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/foundation-sites@6.4.3/dist/css/foundation.min.css"
5
- integrity="sha256-GSio8qamaXapM8Fq9JYdGNTvk/dgs+cMLgPeevOYEx0= sha384-wAweiGTn38CY2DSwAaEffed6iMeflc0FMiuptanbN4J+ib+342gKGpvYRWubPd/+ sha512-QHEb6jOC8SaGTmYmGU19u2FhIfeG+t/hSacIWPpDzOp5yygnthL3JwnilM7LM1dOAbJv62R+/FICfsrKUqv4Gg=="
6
- crossorigin="anonymous">
7
-
8
- <script
9
- src="https://code.jquery.com/jquery-3.4.1.min.js"
10
- integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="
11
- crossorigin="anonymous"></script>
12
-
13
- <script src="https://cdn.jsdelivr.net/npm/foundation-sites@6.4.3/dist/js/foundation.min.js"
14
- integrity="sha256-mRYlCu5EG+ouD07WxLF8v4ZAZYCA6WrmdIXyn1Bv9Vk= sha384-KzKofw4qqetd3kvuQ5AdapWPqV1ZI+CnfyfEwZQgPk8poOLWaabfgJOfmW7uI+AV sha512-0gHfaMkY+Do568TgjJC2iMAV0dQlY4NqbeZ4pr9lVUTXQzKu8qceyd6wg/3Uql9qA2+3X5NHv3IMb05wb387rA=="
15
- crossorigin="anonymous"></script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/mindscape/raygun4php/sample-apps/async-example/raygunSetup.php DELETED
@@ -1,37 +0,0 @@
1
- <?php
2
-
3
- namespace
4
- {
5
- require_once 'vendor/autoload.php';
6
-
7
- $client = new \Raygun4php\RaygunClient(API_KEY, true, false, false);
8
-
9
- function error_handler($errno, $errstr, $errfile, $errline ) {
10
- global $client;
11
- $client->SendError($errno, $errstr, $errfile, $errline);
12
- }
13
-
14
- function exception_handler($exception)
15
- {
16
- global $client;
17
- $client->SendException($exception);
18
- }
19
-
20
- function fatal_error()
21
- {
22
- global $client;
23
- $last_error = error_get_last();
24
-
25
- if (!is_null($last_error)) {
26
- $errno = $last_error['type'];
27
- $errstr = $last_error['message'];
28
- $errfile = $last_error['file'];
29
- $errline = $last_error['line'];
30
- $client->SendError($errno, $errstr, $errfile, $errline);
31
- }
32
- }
33
-
34
- set_exception_handler('exception_handler');
35
- set_error_handler("error_handler");
36
- register_shutdown_function("fatal_error");
37
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/mindscape/raygun4php/sample-apps/async-example/viewData.php DELETED
@@ -1,76 +0,0 @@
1
- <?php
2
-
3
- class ViewData
4
- {
5
- /**
6
- * @var int $time
7
- */
8
- private $time;
9
-
10
- /**
11
- * @var float $distance
12
- */
13
- private $distance;
14
-
15
- const SPEED_PRECISION = 2;
16
-
17
- public function __construct()
18
- {
19
- $this->time = $_POST['time'];
20
- $this->distance = $_POST['distance'];
21
- }
22
-
23
- /**
24
- * @return int
25
- */
26
- public function getTime()
27
- {
28
- return $this->time;
29
- }
30
-
31
- /**
32
- * @return float
33
- */
34
- public function getDistance()
35
- {
36
- return $this->distance;
37
- }
38
-
39
- /**
40
- * @return bool
41
- */
42
- public function hasSentData()
43
- {
44
- return isset($this->time) && isset($this->distance);
45
- }
46
-
47
- /**
48
- * @return string
49
- */
50
- public function getAveragePace()
51
- {
52
- return $this->decimalToMinuteString($this->time / $this->distance);
53
- }
54
-
55
- /**
56
- * @return string
57
- */
58
- public function getAverageSpeed()
59
- {
60
- return round($this->distance / ($this->time / 60), self::SPEED_PRECISION);
61
- }
62
-
63
- /**
64
- * @param float $timeAsDecimal
65
- * @return string
66
- */
67
- private function decimalToMinuteString($timeAsDecimal)
68
- {
69
- $whole = floor($timeAsDecimal);
70
- $decimal = $timeAsDecimal - $whole;
71
- $roundedMinutes = round($decimal * 60, 0);
72
- $minutes = str_pad($roundedMinutes, 2, "0", STR_PAD_LEFT);
73
-
74
- return "{$whole}:{$minutes}";
75
- }
76
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/mindscape/raygun4php/src/Raygun4php/Exception/UnsatisfiedDependencyException.php DELETED
@@ -1,20 +0,0 @@
1
- <?php
2
- /**
3
- * This file is part of the Rhumsaa\Uuid library
4
- *
5
- * For the full copyright and license information, please view the LICENSE
6
- * file that was distributed with this source code.
7
- *
8
- * @copyright Copyright (c) 2013 Ben Ramsey <http://benramsey.com>
9
- * @license http://opensource.org/licenses/MIT MIT
10
- */
11
-
12
- namespace Raygun4Php\Rhumsaa\Uuid\Exception;
13
-
14
- /**
15
- * Thrown to indicate that the requested operation has depencies that have not
16
- * been satisfied.
17
- */
18
- class UnsatisfiedDependencyException extends \RuntimeException
19
- {
20
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/mindscape/raygun4php/src/Raygun4php/Exception/UnsupportedOperationException.php DELETED
@@ -1,19 +0,0 @@
1
- <?php
2
- /**
3
- * This file is part of the Rhumsaa\Uuid library
4
- *
5
- * For the full copyright and license information, please view the LICENSE
6
- * file that was distributed with this source code.
7
- *
8
- * @copyright Copyright (c) 2013 Ben Ramsey <http://benramsey.com>
9
- * @license http://opensource.org/licenses/MIT MIT
10
- */
11
-
12
- namespace Raygun4Php\Rhumsaa\Uuid\Exception;
13
-
14
- /**
15
- * Thrown to indicate that the requested operation is not supported.
16
- */
17
- class UnsupportedOperationException extends \RuntimeException
18
- {
19
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/mindscape/raygun4php/src/Raygun4php/Raygun4PhpException.php DELETED
@@ -1,7 +0,0 @@
1
- <?php
2
- namespace Raygun4php
3
- {
4
- class Raygun4PhpException extends \Exception
5
- {
6
- }
7
- }
 
 
 
 
 
 
 
vendor/mindscape/raygun4php/src/Raygun4php/RaygunClient.php DELETED
@@ -1,565 +0,0 @@
1
- <?php
2
- namespace Raygun4php {
3
- require_once realpath(__DIR__ . '/RaygunMessage.php');
4
- require_once realpath(__DIR__ . '/RaygunIdentifier.php');
5
- require_once realpath(__DIR__ . '/Raygun4PhpException.php');
6
- require_once realpath(__DIR__ . '/Uuid.php');
7
-
8
- use Raygun4Php\Rhumsaa\Uuid\Uuid;
9
-
10
- class RaygunClient
11
- {
12
- protected $apiKey;
13
- protected $version;
14
- protected $tags;
15
- protected $user;
16
- protected $firstName;
17
- protected $fullName;
18
- protected $email;
19
- protected $isAnonymous;
20
- protected $uuid;
21
- protected $httpData;
22
- protected $useAsyncSending;
23
- protected $debug;
24
- protected $disableUserTracking;
25
- protected $proxy;
26
-
27
- protected $groupingKeyCallback;
28
-
29
- protected $cookieOptions = array(
30
- 'use' => true,
31
- 'expire' => 2592000, // 30 * 24 * 60 * 60
32
- 'path' => '/',
33
- 'domain' => '',
34
- 'secure' => false,
35
- 'httponly' => false
36
- );
37
-
38
- /**
39
- * @var array Parameter names to filter out of logged form data. Case insensitive.
40
- * Accepts regular expressions when the name starts with a forward slash.
41
- * Maps either to TRUE, or to a callable with $key and $value arguments.
42
- */
43
- protected $filterParams = array();
44
-
45
- private $host = 'api.raygun.io';
46
- private $path = '/entries';
47
- private $transport = 'ssl';
48
- private $port = 443;
49
-
50
- /**
51
- * Creates a new RaygunClient instance.
52
- *
53
- * @param bool $useAsyncSending If true, attempts to post rapidly and asynchronously the script by forking a
54
- * cURL process. RaygunClient cannot return the HTTP result when in async mode,
55
- * however. If false, sends using a blocking socket connection. This is the only
56
- * method available on Windows.
57
- * @param bool $debug If true, and $useAsyncSending is true, this will output the HTTP response code
58
- * from posting. Will also emit errors if the socket connection fails to send
59
- * through error messages. See the GitHub documentation for code meaning. This
60
- * param does nothing if useAsyncSending is set to true.
61
- * @param bool $disableUserTracking
62
- */
63
- public function __construct($key, $useAsyncSending = true, $debug = false, $disableUserTracking = false)
64
- {
65
- $this->apiKey = $key;
66
- $this->useAsyncSending = $useAsyncSending;
67
- $this->debug = $debug;
68
-
69
- if (!$disableUserTracking) {
70
- $this->SetUser();
71
- }
72
-
73
- $this->disableUserTracking = $disableUserTracking;
74
- }
75
-
76
- /**
77
- * Transmits an error to the Raygun.io API
78
- *
79
- * @param int $errno The error number
80
- * @param string $errstr The error string
81
- * @param string $errfile The file the error occurred in
82
- * @param int $errline The line the error occurred on
83
- * @param array $tags An optional array of string tags used to provide metadata for the message
84
- * @param array $userCustomData An optional associative array that can be used to place custom key-value
85
- * @param int $timestamp Current Unix timestamp in the local timezone, used to set when an error occurred.
86
- * data in the message payload
87
- * @return The HTTP status code of the result when transmitting the message to Raygun.io
88
- */
89
- public function SendError($errno, $errstr, $errfile, $errline, $tags = null, $userCustomData = null, $timestamp = null)
90
- {
91
- $message = $this->BuildMessage(new \ErrorException($errstr, $errno, 0, $errfile, $errline), $timestamp);
92
-
93
- if ($tags != null)
94
- {
95
- $this->AddTags($message, $tags);
96
- }
97
-
98
- if ($userCustomData != null)
99
- {
100
- $this->AddUserCustomData($message, $userCustomData);
101
- }
102
-
103
- $this->AddGroupingKey($message);
104
-
105
- return $this->Send($message);
106
- }
107
-
108
- /**
109
- * Transmits an exception to the Raygun.io API
110
- *
111
- * @param \Exception $exception An exception object to transmit
112
- * @param array $tags An optional array of string tags used to provide metadata for the message
113
- * @param array $userCustomData An optional associative array that can be used to place custom key-value
114
- * data in the message payload
115
- * @param int $timestamp Current Unix timestamp in the local timezone, used to set when an exception
116
- * occurred.
117
- * @return The HTTP status code of the result when transmitting the message to Raygun.io
118
- */
119
- public function SendException($exception, $tags = null, $userCustomData = null, $timestamp = null)
120
- {
121
- $message = $this->BuildMessage($exception, $timestamp);
122
-
123
- if ($tags != null)
124
- {
125
- $this->AddTags($message, $tags);
126
- }
127
-
128
- if ($userCustomData != null)
129
- {
130
- $this->AddUserCustomData($message, $userCustomData);
131
- }
132
-
133
- $this->AddGroupingKey($message);
134
-
135
- return $this->Send($message);
136
- }
137
-
138
- /**
139
- * Sets the version number of your project that will be transmitted to Raygun.com.
140
- *
141
- * @param string $version The version number in the form of x.x.x.x, where x is a positive integer.
142
- */
143
- public function SetVersion($version)
144
- {
145
- $this->version = $version;
146
- }
147
-
148
- /**
149
- * Stores the current user of the calling application. This will be added to any messages sent
150
- * by this provider. It is used in the dashboard to provide unique user tracking.
151
- * If it is an email address, the user's Gravatar can be displayed. This method is optional,
152
- * if it is not used a random identifier will be assigned to the current user.
153
- *
154
- * @param string $user A username, email address or other identifier for the current user
155
- * of the calling application.
156
- */
157
- public function SetUser($user = null, $firstName = null, $fullName = null, $email = null, $isAnonymous = null, $uuid = null)
158
- {
159
- $this->firstName = $this->StoreOrRetrieveUserCookie('rgfirstname', $firstName);
160
- $this->fullName = $this->StoreOrRetrieveUserCookie('rgfullname', $fullName);
161
- $this->email = $this->StoreOrRetrieveUserCookie('rgemail', $email);
162
-
163
- $this->uuid = $this->StoreOrRetrieveUserCookie('rguuidvalue', $uuid);
164
- $this->isAnonymous = $this->StoreOrRetrieveUserCookie('rgisanonymous', $isAnonymous ? 'true' : 'false') == 'true' ? true : false;
165
-
166
- if (is_string($user))
167
- {
168
- $this->user = $user;
169
-
170
- if (php_sapi_name() != 'cli' && !headers_sent())
171
- {
172
- $this->setCookie('rguserid', $user);
173
- $this->setCookie('rguuid', 'false');
174
- }
175
- }
176
- else
177
- {
178
- if (!array_key_exists('rguuid', $_COOKIE))
179
- {
180
- $this->user = (string)Uuid::uuid4();
181
-
182
- if (php_sapi_name() != 'cli' && !headers_sent())
183
- {
184
- $this->setCookie('rguserid', $this->user);
185
- $this->setCookie('rguuid', 'true');
186
- }
187
- }
188
- else if (array_key_exists('rguserid', $_COOKIE))
189
- {
190
- $this->user = $_COOKIE['rguserid'];
191
- }
192
-
193
- $this->isAnonymous = $this->StoreOrRetrieveUserCookie('rgisanonymous', 'true') == 'true';
194
- }
195
- }
196
-
197
- /*
198
- * Sets a callback to control how error instances are grouped together. The callback
199
- * is provided with the payload and stack trace of the error upon execution. If the
200
- * callback returns a string then error instances with a matching key will grouped together.
201
- * If the callback doesn't return a value, or the value is not a string, then automatic
202
- * grouping will be used.
203
- * @param function $callback
204
- *
205
- */
206
- public function SetGroupingKey($callback) {
207
- $this->groupingKeyCallback = $callback;
208
- }
209
-
210
- private function StoreOrRetrieveUserCookie($key, $value)
211
- {
212
- if (is_string($value))
213
- {
214
- if (php_sapi_name() != 'cli' && !headers_sent())
215
- {
216
- $this->setCookie($key, $value);
217
- }
218
-
219
- return $value;
220
- }
221
- else
222
- {
223
- if (array_key_exists($key, $_COOKIE))
224
- {
225
- if ($_COOKIE[$key] != $value && php_sapi_name() != 'cli' && !headers_sent())
226
- {
227
- $this->setCookie($key, $value);
228
- }
229
- return $_COOKIE[$key];
230
- }
231
- }
232
-
233
- return null;
234
- }
235
-
236
- /**
237
- * @param string $name
238
- * @param string $value
239
- */
240
- protected function setCookie($name, $value)
241
- {
242
- $options = $this->cookieOptions;
243
-
244
- if ($options['use'] === true) {
245
- setcookie($name, $value, time() + $options['expire'], $options['path'], $options['domain'], $options['secure'], $options['httponly']);
246
- }
247
- }
248
-
249
- /**
250
- * @param \Exception $errorException
251
- * @param int $timestamp
252
- * @return RaygunMessage
253
- */
254
- private function BuildMessage($errorException, $timestamp = null)
255
- {
256
- $message = new RaygunMessage($timestamp);
257
- $message->Build($errorException);
258
- $message->Details->Version = $this->version;
259
- $message->Details->Context = new RaygunIdentifier(session_id());
260
-
261
- if ($this->user != null)
262
- {
263
- $message->Details->User = new RaygunIdentifier($this->user, $this->firstName, $this->fullName, $this->email, $this->isAnonymous, $this->uuid);
264
- }
265
- else if (!$this->disableUserTracking && array_key_exists('rguserid', $_COOKIE))
266
- {
267
- $message->Details->User = new RaygunIdentifier($_COOKIE['rguserid']);
268
- }
269
-
270
- return $message;
271
- }
272
-
273
- /**
274
- * Sets a string array of tags relating to the message, used for identification. These will be transmitted along
275
- * with messages that are sent.
276
- *
277
- * @param RaygunMessage $message
278
- * @param array $tags The tags relating to your project's version
279
- * @throws Raygun4PhpException
280
- */
281
- private function AddTags(&$message, $tags)
282
- {
283
- if (is_array($tags))
284
- {
285
- $message->Details->Tags = $tags;
286
- }
287
- else
288
- {
289
- throw new \Raygun4php\Raygun4PhpException("Tags must be an array");
290
- }
291
- }
292
-
293
- private function AddUserCustomData(&$message, $userCustomData)
294
- {
295
- if ($this->is_assoc($userCustomData))
296
- {
297
- $message->Details->UserCustomData = $userCustomData;
298
- }
299
- else
300
- {
301
- throw new \Raygun4php\Raygun4PhpException("UserCustomData must be an associative array");
302
- }
303
- }
304
-
305
- private function AddGroupingKey(&$message) {
306
- if( is_callable( $this->groupingKeyCallback ) ) {
307
- $groupingKey = call_user_func( $this->groupingKeyCallback, $message, $message->Details->Error->StackTrace );
308
-
309
- if( is_string( $groupingKey ) ) {
310
- $message->Details->GroupingKey = $groupingKey;
311
- }
312
- }
313
- }
314
-
315
- private function is_assoc($array)
316
- {
317
- return (bool)count(array_filter(array_keys($array), 'is_string'));
318
- }
319
-
320
- /**
321
- * Transmits a RaygunMessage to the Raygun.io API. The default attempts to transmit asynchronously.
322
- * To disable this and transmit sync (blocking), pass false in as the 2nd parameter in RaygunClient's
323
- * constructor. This may be necessary on some Windows installations where the implementation is broken.
324
- * This is a lower level function used by SendException and SendError and one of those should be used preferrably.
325
- *
326
- * @param \Raygun4php\RaygunMessage $message A populated message to be posted to the Raygun API
327
- * @return int The HTTP status code of the result after transmitting the message to Raygun.io
328
- * 202 if accepted, 403 if invalid JSON payload
329
- * @throws Raygun4PhpException
330
- */
331
- public function Send($message)
332
- {
333
- if (empty($this->apiKey))
334
- {
335
- throw new \Raygun4php\Raygun4PhpException("API not valid, cannot send message to Raygun");
336
- }
337
-
338
- $message = $this->filterParamsFromMessage($message);
339
- $message = $this->toJsonRemoveUnicodeSequences($message);
340
- $message = $this->removeNullBytes($message);
341
-
342
- if(strlen($message) <= 0) {
343
- return null;
344
- }
345
-
346
- return $this->post($message, realpath(__DIR__ . '/cacert.crt'));
347
- }
348
-
349
- private function post($data_to_send, $cert_path)
350
- {
351
-
352
- if ($this->useAsyncSending && strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN')
353
- {
354
- $curlOpts = array(
355
- "-X POST",
356
- "-H 'Content-Type: application/json'",
357
- "-H 'X-ApiKey: " . $this->apiKey . "'",
358
- "-d " . escapeshellarg($data_to_send),
359
- "--cacert '" . realpath(__DIR__ . '/cacert.crt') . "'"
360
- );
361
- if ($this->proxy) {
362
- $curlOpts[] = "--proxy '" . $this->proxy . "'";
363
- }
364
- $cmd = "curl " . implode(' ', $curlOpts) . " 'https://{$this->host}:{$this->port}{$this->path}' > /dev/null 2>&1 &";
365
- $output = array();
366
- $exit;
367
- exec($cmd, $output, $exit);
368
- return $exit;
369
- }
370
- else
371
- {
372
- $remote = $this->transport . '://' . $this->host . ':' . $this->port;
373
- $context = stream_context_create();
374
- $result = stream_context_set_option($context, 'ssl', 'verify_host', true);
375
-
376
- if (!empty($cert_path))
377
- {
378
- $result = stream_context_set_option($context, 'ssl', 'cafile', $cert_path);
379
- $result = stream_context_set_option($context, 'ssl', 'verify_peer', true);
380
- }
381
- else
382
- {
383
- $result = stream_context_set_option($context, 'ssl', 'allow_self_signed', true);
384
- }
385
-
386
- if ($this->proxy) {
387
- $result = stream_context_set_option($context, 'http', 'proxy', $this->proxy);
388
- }
389
-
390
- $fp = stream_socket_client($remote, $err, $errstr, 10, STREAM_CLIENT_CONNECT, $context);
391
-
392
- if ($fp)
393
- {
394
- $req = '';
395
- $req .= "POST $this->path HTTP/1.1\r\n";
396
- $req .= "Host: $this->host\r\n";
397
- $req .= "X-ApiKey: " . $this->apiKey . "\r\n";
398
- $req .= 'Content-length: ' . strlen($data_to_send) . "\r\n";
399
- $req .= "Content-type: application/json\r\n";
400
- $req .= "Connection: close\r\n\r\n";
401
- fwrite($fp, $req);
402
- fwrite($fp, $data_to_send);
403
-
404
- $response = "";
405
- if ($this->debug)
406
- {
407
- while(!preg_match("/^HTTP\/[\d\.]* (\d{3})/", $response))
408
- {
409
- $response .= fgets($fp, 128);
410
- }
411
-
412
- fclose($fp);
413
-
414
- return $response;
415
- }
416
- else
417
- {
418
- fclose($fp);
419
-
420
- return 0;
421
- }
422
- }
423
- else
424
- {
425
- if($this->debug) {
426
- $errMsg = "<br/><br/>" . "<strong>Raygun Warning:</strong> Couldn't send error. ";
427
- $errMsg .= "Error number: " . $errno . "<br/><br/>";
428
- $errMsg .= "Error string: " . $errstr . "<br/><br/>";
429
- echo $errMsg;
430
- }
431
- trigger_error('httpPost error: ' . $errstr);
432
- return null;
433
- }
434
- }
435
- }
436
-
437
- function toJsonRemoveUnicodeSequences($struct) {
438
- return preg_replace_callback("/\\\\u([a-f0-9]{4})/", function($matches){ return iconv('UCS-4LE','UTF-8',pack('V', hexdec($matches[1]))); }, json_encode($struct));
439
- }
440
-
441
- function removeNullBytes($string) {
442
- return str_replace("\0", '', $string);
443
- }
444
-
445
- /**
446
- * Optionally applies a value transformation to every matching key, as defined by {@link FilterParams}.
447
- * Replaces the value by default, but also supports custom transformations through
448
- * anonymous functions. Applies to form data, environment data, HTTP headers.
449
- * Does not apply to GET parameters in the request URI.
450
- * Filters out raw HTTP data in case any filters are defined, since we can't accurately filter it.
451
- *
452
- * @param RaygunMessage $message
453
- * @param string $replace Value to be inserted by default (unless specified otherwise by custom transformations).
454
- * @return RaygunMessage
455
- */
456
- function filterParamsFromMessage($message, $replace = '[filtered]') {
457
- $filterParams = $this->getFilterParams();
458
-
459
- // Skip checks if none are defined
460
- if(!$filterParams) {
461
- return $message;
462
- }
463
-
464
- // Ensure all filters are callable
465
- foreach($filterParams as $filterKey => $filterFn) {
466
- if(!is_callable($filterFn)) {
467
- $filterParams[$filterKey] = function($key, $val) use ($replace) {return $replace;};
468
- }
469
- }
470
-
471
- $walkFn = function(&$val, $key) use ($filterParams) {
472
- foreach($filterParams as $filterKey => $filterFn) {
473
- if(
474
- (strpos($filterKey, '/') === 0 && preg_match($filterKey, $key))
475
- || (strpos($filterKey, '/') === FALSE && strtolower($filterKey) == strtolower($key))
476
- ) {
477
- $val = $filterFn($key, $val);
478
- }
479
- }
480
- };
481
-
482
- if($message->Details->Request->Form) {
483
- array_walk_recursive($message->Details->Request->Form, $walkFn);
484
- }
485
-
486
- if($message->Details->Request->Headers) {
487
- array_walk_recursive($message->Details->Request->Headers, $walkFn);
488
- }
489
-
490
- if($message->Details->Request->Data) {
491
- array_walk_recursive($message->Details->Request->Data, $walkFn);
492
- }
493
-
494
- if($message->Details->UserCustomData) {
495
- array_walk_recursive($message->Details->UserCustomData, $walkFn);
496
- }
497
-
498
- // Unset raw HTTP data since we can't accurately filter it
499
- if($message->Details->Request->RawData) {
500
- $message->Details->Request->RawData = null;
501
- }
502
-
503
- return $message;
504
- }
505
-
506
- /**
507
- * @param array $params
508
- * @return $this
509
- */
510
- function setFilterParams($params) {
511
- $this->filterParams = $params;
512
- return $this;
513
- }
514
-
515
- /**
516
- * @return array
517
- */
518
- function getFilterParams() {
519
- return $this->filterParams;
520
- }
521
-
522
- /**
523
- * Use a proxy for sending HTTP requests to Raygun.
524
- *
525
- * @param String $url URL including protocol and an optional port, e.g. http://myproxy:8080
526
- * @return $this
527
- */
528
- function setProxy($proxy) {
529
- $this->proxy = $proxy;
530
- return $this;
531
- }
532
-
533
- /**
534
- * Sets the given cookie options
535
- *
536
- * Existing values will be overridden. Values that are missing from the array being set will keep their current
537
- * values.
538
- *
539
- * The key names match the argument names on setcookie() (e.g. 'expire' or 'path'). Pass the default value according
540
- * to PHP's setcookie() function to ignore that parameter.
541
- *
542
- * @param array<string,mixed> $options
543
- */
544
- public function SetCookieOptions($options)
545
- {
546
- $this->cookieOptions = array_merge($this->cookieOptions, $options);
547
- }
548
-
549
- /**
550
- * @return String
551
- */
552
- function getProxy() {
553
- return $this->proxy;
554
- }
555
-
556
- public function __destruct()
557
- {
558
- if ($this->httpData)
559
- {
560
- curl_close($this->httpData);
561
- }
562
- }
563
-
564
- }
565
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/mindscape/raygun4php/src/Raygun4php/RaygunClientMessage.php DELETED
@@ -1,17 +0,0 @@
1
- <?php
2
- namespace Raygun4php
3
- {
4
- class RaygunClientMessage
5
- {
6
- public $Name;
7
- public $Version;
8
- public $ClientUrl;
9
-
10
- public function __construct()
11
- {
12
- $this->Name = "Raygun4php";
13
- $this->Version = "1.8.3";
14
- $this->ClientUrl = "https://github.com/MindscapeHQ/raygun4php";
15
- }
16
- }
17
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/mindscape/raygun4php/src/Raygun4php/RaygunEnvironmentMessage.php DELETED
@@ -1,19 +0,0 @@
1
- <?php
2
- namespace Raygun4php
3
- {
4
- class RaygunEnvironmentMessage
5
- {
6
- public $UtcOffset = 0;
7
-
8
- public function __construct()
9
- {
10
- if (ini_get('date.timezone'))
11
- {
12
- $this->UtcOffset = @date('Z') / 3600;
13
- }
14
-
15
- $this->UtcOffset = max($this->UtcOffset, -24);
16
- $this->UtcOffset = min($this->UtcOffset, 24);
17
- }
18
- }
19
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/mindscape/raygun4php/src/Raygun4php/RaygunExceptionMessage.php DELETED
@@ -1,155 +0,0 @@
1
- <?php
2
- namespace Raygun4php
3
- {
4
- require_once realpath(__DIR__.'/RaygunExceptionTraceLineMessage.php');
5
-
6
- class RaygunExceptionMessage
7
- {
8
- public $Message;
9
- public $ClassName;
10
- public $StackTrace = array();
11
- public $FileName;
12
- public $Data;
13
-
14
- public function __construct($exception)
15
- {
16
- $exceptionClass = get_class($exception);
17
-
18
- if ($exceptionClass != 'ErrorException')
19
- {
20
- $this->Message = $exceptionClass.': '.$exception->getMessage();
21
- $this->BuildStackTrace($exception);
22
- $this->ClassName = $exceptionClass;
23
- }
24
- else
25
- {
26
- $this->Message = 'Error: '.$exception->getMessage();
27
- $this->BuildErrorTrace($exception);
28
- }
29
-
30
- $this->FileName = baseName($exception->getFile());
31
- }
32
-
33
- private function BuildErrorTrace($error)
34
- {
35
- $traces = $error->getTrace();
36
- $lines = array();
37
-
38
- foreach ($traces as $trace) {
39
- $line = new RaygunExceptionTraceLineMessage();
40
-
41
- $fromManualSendError = false;
42
- if (array_key_exists('function', $trace) &&
43
- array_key_exists('class', $trace))
44
- {
45
- if ($trace['function'] == 'SendError' && $trace['class'] == 'Raygun4php\RaygunClient')
46
- {
47
- $fromManualSendError = true;
48
- }
49
- }
50
-
51
- if (array_key_exists('args', $trace) && $fromManualSendError == true) {
52
- $errorData = $trace['args'];
53
-
54
- if (count($errorData) >= 2) {
55
- $line->ClassName= $errorData[1];
56
- }
57
- if (count($errorData) >= 3) {
58
- $line->FileName= $errorData[2];
59
- }
60
- if (count($errorData) >= 4) {
61
- $line->LineNumber= $errorData[3];
62
- }
63
- }
64
- else
65
- {
66
- $line = $this->BuildLine($trace);
67
- }
68
-
69
- $lines[] = $line;
70
- }
71
-
72
- $this->StackTrace = $lines;
73
- }
74
-
75
- private function BuildStackTrace($exception)
76
- {
77
- $traces = $exception->getTrace();
78
- $lines = array();
79
-
80
- foreach ($traces as $trace)
81
- {
82
- $lines[] = $this->BuildLine($trace);
83
- }
84
-
85
- $this->StackTrace = $lines;
86
- }
87
-
88
- private function BuildLine($trace)
89
- {
90
- $line = new RaygunExceptionTraceLineMessage();
91
-
92
- if (array_key_exists('file', $trace))
93
- {
94
- $line->FileName = $trace['file'];
95
- }
96
- if (array_key_exists('class', $trace))
97
- {
98
- $line->ClassName = $trace['class'];
99
- }
100
- if (array_key_exists('function', $trace))
101
- {
102
- $line->MethodName = $trace['function'];
103
- }
104
- if (array_key_exists('line', $trace))
105
- {
106
- $line->LineNumber = $trace['line'];
107
- }
108
-
109
- return $line;
110
- }
111
-
112
- private function GetClassName()
113
- {
114
- $fp = fopen($this->fileName, 'r');
115
- $class = $namespace = $buffer = '';
116
- $i = 0;
117
- while (!$class) {
118
- if (feof($fp)) break;
119
-
120
- $buffer .= fread($fp, 512);
121
- $tokens = token_get_all($buffer);
122
-
123
- if (strpos($buffer, '{') === false) continue;
124
-
125
- for (;$i<count($tokens);$i++) {
126
- if ($tokens[$i][0] === T_NAMESPACE) {
127
- for ($j=$i+1;$j<count($tokens); $j++) {
128
- if ($tokens[$j][0] === T_STRING) {
129
- $namespace .= '\\'.$tokens[$j][1];
130
- } else if ($tokens[$j] === '{' || $tokens[$j] === ';') {
131
- break;
132
- }
133
- }
134
- }
135
-
136
- if ($tokens[$i][0] === T_CLASS) {
137
- for ($j=$i+1;$j<count($tokens);$j++) {
138
- if ($tokens[$j] === '{') {
139
- $class = $tokens[$i+2][1];
140
- }
141
- }
142
- }
143
- }
144
- }
145
- if ($class != '')
146
- {
147
- return $class;
148
- }
149
- else
150
- {
151
- return null;
152
- }
153
- }
154
- }
155
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/mindscape/raygun4php/src/Raygun4php/RaygunExceptionTraceLineMessage.php DELETED
@@ -1,19 +0,0 @@
1
- <?php
2
- namespace Raygun4php
3
- {
4
- class RaygunExceptionTraceLineMessage
5
- {
6
- public $LineNumber;
7
- public $ClassName;
8
- public $FileName;
9
- public $MethodName;
10
-
11
- public function __construct()
12
- {
13
- $this->FileName = "";
14
- $this->ClassName = "";
15
- $this->LineNumber = "0";
16
- $this->MethodName = "";
17
- }
18
- }
19
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/mindscape/raygun4php/src/Raygun4php/RaygunIdentifier.php DELETED
@@ -1,28 +0,0 @@
1
- <?php
2
- namespace Raygun4php
3
- {
4
- class RaygunIdentifier
5
- {
6
- public $Identifier;
7
-
8
- public $FirstName;
9
-
10
- public $FullName;
11
-
12
- public $Email;
13
-
14
- public $IsAnonymous;
15
-
16
- public $Uuid;
17
-
18
- public function __construct($id, $firstName = null, $fullName = null, $email = null, $isAnonymous = null, $uuid = null)
19
- {
20
- $this->Identifier = $id;
21
- $this->FirstName = $firstName;
22
- $this->FullName = $fullName;
23
- $this->Email = $email;
24
- $this->IsAnonymous = $isAnonymous;
25
- $this->Uuid = $uuid;
26
- }
27
- }
28
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/mindscape/raygun4php/src/Raygun4php/RaygunMessage.php DELETED
@@ -1,33 +0,0 @@
1
- <?php
2
- namespace Raygun4php
3
- {
4
- require_once realpath(__DIR__.'/RaygunMessageDetails.php');
5
- require_once realpath(__DIR__.'/RaygunExceptionMessage.php');
6
- require_once realpath(__DIR__.'/RaygunRequestMessage.php');
7
- require_once realpath(__DIR__.'/RaygunEnvironmentMessage.php');
8
- require_once realpath(__DIR__.'/RaygunClientMessage.php');
9
-
10
- class RaygunMessage
11
- {
12
- public $OccurredOn;
13
- public $Details;
14
-
15
- public function __construct($timestamp = null)
16
- {
17
- if ($timestamp === null) {
18
- $timestamp = time();
19
- }
20
- $this->OccurredOn = gmdate("Y-m-d\TH:i:s\Z", $timestamp);
21
- $this->Details = new RaygunMessageDetails();
22
- }
23
-
24
- public function Build($exception)
25
- {
26
- $this->Details->MachineName = gethostname();
27
- $this->Details->Error = new RaygunExceptionMessage($exception);
28
- $this->Details->Request = new RaygunRequestMessage();
29
- $this->Details->Environment = new RaygunEnvironmentMessage();
30
- $this->Details->Client = new RaygunClientMessage();
31
- }
32
- }
33
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/mindscape/raygun4php/src/Raygun4php/RaygunMessageDetails.php DELETED
@@ -1,18 +0,0 @@
1
- <?php
2
- namespace Raygun4php
3
- {
4
- class RaygunMessageDetails
5
- {
6
- public $Error;
7
- public $MachineName;
8
- public $Request;
9
- public $Environment;
10
- public $Client;
11
- public $Version;
12
- public $Tags;
13
- public $UserCustomData;
14
- public $User;
15
- public $Context;
16
- public $GroupingKey;
17
- }
18
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/mindscape/raygun4php/src/Raygun4php/RaygunRequestMessage.php DELETED
@@ -1,119 +0,0 @@
1
- <?php
2
- namespace Raygun4php
3
- {
4
- class RaygunRequestMessage
5
- {
6
- public $HostName;
7
- public $Url;
8
- public $HttpMethod;
9
- public $IpAddress;
10
- public $QueryString;
11
- public $Headers;
12
- public $Data;
13
- public $Form;
14
- public $RawData;
15
-
16
- public function __construct()
17
- {
18
- if (php_sapi_name() !== 'cli') {
19
- $this->HostName = (isset($_SERVER['HTTP_HOST'])) ? $_SERVER['HTTP_HOST'] : null;
20
- $this->HttpMethod = (isset($_SERVER['REQUEST_METHOD'])) ? $_SERVER['REQUEST_METHOD'] : null;
21
- $this->Url = (isset($_SERVER['REQUEST_URI'])) ? $_SERVER['REQUEST_URI'] : null;
22
- $this->IpAddress = $this->getRemoteAddr();
23
-
24
- if (array_key_exists('QUERY_STRING', $_SERVER))
25
- {
26
- parse_str($_SERVER['QUERY_STRING'], $this->QueryString);
27
-
28
- if (empty($this->QueryString))
29
- {
30
- $this->QueryString = null;
31
- }
32
- }
33
- }
34
-
35
- $this->Headers = $this->emu_getAllHeaders();
36
-
37
- $utf8_convert = function($value) use (&$utf8_convert) {
38
- return is_array($value) ?
39
- array_map($utf8_convert, $value) :
40
- iconv('UTF-8', 'UTF-8//IGNORE', $value);
41
- };
42
-
43
- $utf8_convert_server = function($value) use (&$utf8_convert_server) {
44
- return is_array($value) ?
45
- array_map($utf8_convert_server, $value) :
46
- iconv('UTF-8', 'UTF-8', utf8_encode($value));
47
- };
48
-
49
- $this->Form = array_map($utf8_convert, $_POST);
50
-
51
- $this->Data = array_map($utf8_convert_server, $_SERVER);
52
-
53
- if (php_sapi_name() !== 'cli')
54
- {
55
- $contentType = null;
56
- if (isset($_SERVER['CONTENT_TYPE']))
57
- {
58
- $contentType = $_SERVER['CONTENT_TYPE'];
59
- }
60
- else if (isset($_SERVER['HTTP_CONTENT_TYPE']))
61
- {
62
- $contentType = $_SERVER['HTTP_CONTENT_TYPE'];
63
- }
64
-
65
- if ($_SERVER['REQUEST_METHOD'] != 'GET' &&
66
- $contentType != null &&
67
- $contentType != 'application/x-www-form-urlencoded' &&
68
- $contentType != 'multipart/form-data' &&
69
- $contentType != 'text/html')
70
- {
71
- $raw = file_get_contents('php://input');
72
-
73
- if ($raw != null && strlen($raw) > 4096)
74
- {
75
- $raw = substr($raw, 0, 4095);
76
- }
77
-
78
- $this->RawData = iconv('UTF-8', 'UTF-8//IGNORE', $raw);
79
- }
80
- }
81
- }
82
-
83
- private function emu_getAllHeaders()
84
- {
85
- if (!function_exists('getallheaders'))
86
- {
87
- $headers = array();
88
- foreach ($_SERVER as $name => $value)
89
- {
90
- if (substr($name, 0, 5) == 'HTTP_')
91
- {
92
- $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
93
- }
94
- }
95
- return $headers;
96
- }
97
- else
98
- {
99
- return getallheaders();
100
- }
101
- }
102
-
103
- private function getRemoteAddr()
104
- {
105
- $ip = null;
106
-
107
- if (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
108
- {
109
- $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
110
- }
111
- else if (!empty($_SERVER['REMOTE_ADDR']))
112
- {
113
- $ip = $_SERVER['REMOTE_ADDR'];
114
- }
115
-
116
- return $ip;
117
- }
118
- }
119
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/mindscape/raygun4php/src/Raygun4php/Uuid.php DELETED
@@ -1,1172 +0,0 @@
1
- <?php
2
- /**
3
- * This file is part of the Rhumsaa\Uuid library
4
- *
5
- * For the full copyright and license information, please view the LICENSE
6
- * file that was distributed with this source code.
7
- *
8
- * @copyright Copyright (c) 2013 Ben Ramsey <http://benramsey.com>
9
- * @license http://opensource.org/licenses/MIT MIT
10
- */
11
-
12
- namespace Raygun4Php\Rhumsaa\Uuid;
13
-
14
- use InvalidArgumentException;
15
-
16
- /**
17
- * Represents a universally unique identifier (UUID), according to RFC 4122
18
- *
19
- * This class provides immutable UUID objects (the Uuid class) and the static
20
- * methods `uuid1()`, `uuid3()`, `uuid4()`, and `uuid5()` for generating version
21
- * 1, 3, 4, and 5 UUIDs as specified in RFC 4122.
22
- *
23
- * If all you want is a unique ID, you should probably call `uuid1()` or `uuid4()`.
24
- * Note that `uuid1()` may compromise privacy since it creates a UUID containing
25
- * the computer’s network address. `uuid4()` creates a random UUID.
26
- *
27
- * @link http://tools.ietf.org/html/rfc4122
28
- * @link http://en.wikipedia.org/wiki/Universally_unique_identifier
29
- * @link http://docs.python.org/3/library/uuid.html
30
- * @link http://docs.oracle.com/javase/6/docs/api/java/util/UUID.html
31
- */
32
- final class Uuid
33
- {
34
- /**
35
- * When this namespace is specified, the name string is a fully-qualified domain name.
36
- * @link http://tools.ietf.org/html/rfc4122#appendix-C
37
- */
38
- const NAMESPACE_DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
39
-
40
- /**
41
- * When this namespace is specified, the name string is a URL.
42
- * @link http://tools.ietf.org/html/rfc4122#appendix-C
43
- */
44
- const NAMESPACE_URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';
45
-
46
- /**
47
- * When this namespace is specified, the name string is an ISO OID.
48
- * @link http://tools.ietf.org/html/rfc4122#appendix-C
49
- */
50
- const NAMESPACE_OID = '6ba7b812-9dad-11d1-80b4-00c04fd430c8';
51
-
52
- /**
53
- * When this namespace is specified, the name string is an X.500 DN in DER or a text output format.
54
- * @link http://tools.ietf.org/html/rfc4122#appendix-C
55
- */
56
- const NAMESPACE_X500 = '6ba7b814-9dad-11d1-80b4-00c04fd430c8';
57
-
58
- /**
59
- * The nil UUID is special form of UUID that is specified to have all 128 bits set to zero.
60
- * @link http://tools.ietf.org/html/rfc4122#section-4.1.7
61
- */
62
- const NIL = '00000000-0000-0000-0000-000000000000';
63
-
64
- /**
65
- * Reserved for NCS compatibility.
66
- * @link http://tools.ietf.org/html/rfc4122#section-4.1.1
67
- */
68
- const RESERVED_NCS = 0;
69
-
70
- /**
71
- * Specifies the UUID layout given in RFC 4122.
72
- * @link http://tools.ietf.org/html/rfc4122#section-4.1.1
73
- */
74
- const RFC_4122 = 2;
75
-
76
- /**
77
- * Reserved for Microsoft compatibility.
78
- * @link http://tools.ietf.org/html/rfc4122#section-4.1.1
79
- */
80
- const RESERVED_MICROSOFT = 6;
81
-
82
- /**
83
- * Reserved for future definition.
84
- * @link http://tools.ietf.org/html/rfc4122#section-4.1.1
85
- */
86
- const RESERVED_FUTURE = 7;
87
-
88
- /**
89
- * For testing, 64-bit system override; if true, treat the system as 32-bit
90
- *
91
- * @var bool
92
- */
93
- public static $force32Bit = false;
94
-
95
- /**
96
- * For testing, Moontoast\Math\BigNumber override; if true, treat as if
97
- * BigNumber is not available
98
- *
99
- * @var bool
100
- */
101
- public static $forceNoBigNumber = false;
102
-
103
- /**
104
- * For testing, openssl_random_pseudo_bytes() override; if true, treat as
105
- * if openssl_random_pseudo_bytes() is not available
106
- *
107
- * @var bool
108
- */
109
- public static $forceNoOpensslRandomPseudoBytes = false;
110
-
111
- /**
112
- * For testing, sets time of day to a static, known value
113
- *
114
- * @var array
115
- */
116
- public static $timeOfDayTest;
117
-
118
- /**
119
- * For testing, system override to ignore generating node from hardware
120
- *
121
- * @var bool
122
- */
123
- public static $ignoreSystemNode = false;
124
-
125
- /**
126
- * The fields that make up this UUID
127
- *
128
- * This is initialized to the nil value.
129
- *
130
- * @var array
131
- * @link Rhumsaa.Uuid.Uuid.html#method_getFields
132
- */
133
- protected $fields = array(
134
- 'time_low' => '00000000',
135
- 'time_mid' => '0000',
136
- 'time_hi_and_version' => '0000',
137
- 'clock_seq_hi_and_reserved' => '00',
138
- 'clock_seq_low' => '00',
139
- 'node' => '000000000000',
140
- );
141
-
142
- /**
143
- * Creates a universally unique identifier (UUID) from an array of fields.
144
- *
145
- * Protected to prevent direct instantiation. Use static methods to create
146
- * UUIDs.
147
- *
148
- * @param array $fields
149
- * @link Rhumsaa.Uuid.Uuid.html#method_getFields
150
- */
151
- protected function __construct(array $fields)
152
- {
153
- $this->fields = $fields;
154
- }
155
-
156
- /**
157
- * Converts this UUID object to a string when the object is used in any
158
- * string context
159
- *
160
- * @return string
161
- * @link http://www.php.net/manual/en/language.oop5.magic.php#object.tostring
162
- */
163
- public function __toString()
164
- {
165
- return $this->toString();
166
- }
167
-
168
- /**
169
- * Compares this UUID with the specified UUID.
170
- *
171
- * The first of two UUIDs is greater than the second if the most
172
- * significant field in which the UUIDs differ is greater for the first
173
- * UUID.
174
- *
175
- * Q. What's the value of being able to sort UUIDs?<br>
176
- * A. Use them as keys in a B-Tree or similar mapping.
177
- *
178
- * @param Uuid $uuid UUID to which this UUID is to be compared
179
- * @return int -1, 0 or 1 as this UUID is less than, equal to, or greater than $uuid
180
- */
181
- public function compareTo(Uuid $uuid)
182
- {
183
- $comparison = null;
184
-
185
- if ($this->getMostSignificantBitsHex() < $uuid->getMostSignificantBitsHex()) {
186
- $comparison = -1;
187
- } elseif ($this->getMostSignificantBitsHex() > $uuid->getMostSignificantBitsHex()) {
188
- $comparison = 1;
189
- } elseif ($this->getLeastSignificantBitsHex() < $uuid->getLeastSignificantBitsHex()) {
190
- $comparison = -1;
191
- } elseif ($this->getLeastSignificantBitsHex() > $uuid->getLeastSignificantBitsHex()) {
192
- $comparison = 1;
193
- } else {
194
- $comparison = 0;
195
- }
196
-
197
- return $comparison;
198
- }
199
-
200
- /**
201
- * Compares this object to the specified object.
202
- *
203
- * The result is true if and only if the argument is not null, is a UUID
204
- * object, has the same variant, and contains the same value, bit for bit,
205
- * as this UUID.
206
- *
207
- * @param object $obj
208
- * @return bool True if $obj is equal to this UUID
209
- */
210
- public function equals($obj)
211
- {
212
- if (!($obj instanceof Uuid)) {
213
- return false;
214
- }
215
-
216
- return ($this->compareTo($obj) == 0);
217
- }
218
-
219
- /**
220
- * Returns the UUID as a 16-byte string (containing the six integer fields
221
- * in big-endian byte order)
222
- *
223
- * @return string
224
- */
225
- public function getBytes()
226
- {
227
- $bytes = '';
228
-
229
- $hex = $this->toString();
230
- $hex = str_replace('-', '', $hex);
231
-
232
- foreach (range(-2, -32, 2) as $step) {
233
- $bytes = chr(hexdec(substr($hex, $step, 2))) . $bytes;
234
- }
235
-
236
- return $bytes;
237
- }
238
-
239
- /**
240
- * Returns the high field of the clock sequence multiplexed with the variant
241
- * (bits 65-72 of the UUID).
242
- *
243
- * @return int Unsigned 8-bit integer value of clock_seq_hi_and_reserved
244
- */
245
- public function getClockSeqHiAndReserved()
246
- {
247
- return hexdec($this->getClockSeqHiAndReservedHex());
248
- }
249
-
250
- /**
251
- * Returns the high field of the clock sequence multiplexed with the variant
252
- * (bits 65-72 of the UUID).
253
- *
254
- * @return string Hexadecimal value of clock_seq_hi_and_reserved
255
- */
256
- public function getClockSeqHiAndReservedHex()
257
- {
258
- return $this->fields['clock_seq_hi_and_reserved'];
259
- }
260
-
261
- /**
262
- * Returns the low field of the clock sequence (bits 73-80 of the UUID).
263
- *
264
- * @return int Unsigned 8-bit integer value of clock_seq_low
265
- */
266
- public function getClockSeqLow()
267
- {
268
- return hexdec($this->getClockSeqLowHex());
269
- }
270
-
271
- /**
272
- * Returns the low field of the clock sequence (bits 73-80 of the UUID).
273
- *
274
- * @return string Hexadecimal value of clock_seq_low
275
- */
276
- public function getClockSeqLowHex()
277
- {
278
- return $this->fields['clock_seq_low'];
279
- }
280
-
281
- /**
282
- * Returns the clock sequence value associated with this UUID.
283
- *
284
- * For UUID version 1, the clock sequence is used to help avoid
285
- * duplicates that could arise when the clock is set backwards in time
286
- * or if the node ID changes.
287
- *
288
- * For UUID version 3 or 5, the clock sequence is a 14-bit value
289
- * constructed from a name as described in RFC 4122, Section 4.3.
290
- *
291
- * For UUID version 4, clock sequence is a randomly or pseudo-randomly
292
- * generated 14-bit value as described in RFC 4122, Section 4.4.
293
- *
294
- * @return int Unsigned 14-bit integer value of clock sequence
295
- * @link http://tools.ietf.org/html/rfc4122#section-4.1.5
296
- */
297
- public function getClockSequence()
298
- {
299
- return (($this->getClockSeqHiAndReserved() & 0x3f) << 8)
300
- | $this->getClockSeqLow();
301
- }
302
-
303
- /**
304
- * Returns the clock sequence value associated with this UUID.
305
- *
306
- * @return string Hexadecimal value of clock sequence
307
- */
308
- public function getClockSequenceHex()
309
- {
310
- return sprintf('%04x', $this->getClockSequence());
311
- }
312
-
313
- /**
314
- * Returns a PHP DateTime object representing the timestamp associated
315
- * with this UUID.
316
- *
317
- * The timestamp value is only meaningful in a time-based UUID, which
318
- * has version type 1. If this UUID is not a time-based UUID then
319
- * this method throws UnsupportedOperationException.
320
- *
321
- * @return \DateTime A PHP DateTime representation of the date
322
- * @throws Exception\UnsupportedOperationException If this UUID is not a version 1 UUID
323
- * @throws Exception\UnsatisfiedDependencyException if called on a 32-bit system and Moontoast\Math\BigNumber is not present
324
- */
325
- public function getDateTime()
326
- {
327
- if ($this->getVersion() != 1) {
328
- throw new Exception\UnsupportedOperationException('Not a time-based UUID');
329
- }
330
-
331
-
332
- if (self::is64BitSystem()) {
333
-
334
- $unixTime = ($this->getTimestamp() - 0x01b21dd213814000) / 1e7;
335
- $unixTime = number_format($unixTime, 0, '', '');
336
-
337
- } elseif (self::hasBigNumber()) {
338
-
339
- $time = \Moontoast\Math\BigNumber::baseConvert($this->getTimestampHex(), 16, 10);
340
-
341
- $ts = new \Moontoast\Math\BigNumber($time, 20);
342
- $ts->subtract('122192928000000000');
343
- $ts->divide('10000000.0');
344
- $ts->round();
345
- $unixTime = $ts->getValue();
346
-
347
- } else {
348
-
349
- throw new Exception\UnsatisfiedDependencyException(
350
- 'When calling ' . __METHOD__ . ' on a 32-bit system, '
351
- . 'Moontoast\Math\BigNumber must be present in order '
352
- . 'to extract DateTime from version 1 UUIDs'
353
- );
354
-
355
- }
356
-
357
- return new \DateTime("@{$unixTime}");
358
- }
359
-
360
- /**
361
- * Returns an array of the fields of this UUID, with keys named according
362
- * to the RFC 4122 names for the fields.
363
- *
364
- * * **time_low**: The low field of the timestamp, an unsigned 32-bit integer
365
- * * **time_mid**: The middle field of the timestamp, an unsigned 16-bit integer
366
- * * **time_hi_and_version**: The high field of the timestamp multiplexed with
367
- * the version number, an unsigned 16-bit integer
368
- * * **clock_seq_hi_and_reserved**: The high field of the clock sequence
369
- * multiplexed with the variant, an unsigned 8-bit integer
370
- * * **clock_seq_low**: The low field of the clock sequence, an unsigned
371
- * 8-bit integer
372
- * * **node**: The spatially unique node identifier, an unsigned 48-bit
373
- * integer
374
- *
375
- * @return array The UUID fields represented as integer values
376
- * @throws Exception\UnsatisfiedDependencyException if called on a 32-bit system
377
- * @link http://tools.ietf.org/html/rfc4122#section-4.1.2
378
- */
379
- public function getFields()
380
- {
381
- if (!self::is64BitSystem()) {
382
- throw new Exception\UnsatisfiedDependencyException(
383
- 'Cannot call ' . __METHOD__ . ' on a 32-bit system, since some '
384
- . 'values overflow the system max integer value'
385
- . '; consider calling getFieldsHex instead'
386
- );
387
- }
388
-
389
- return array(
390
- 'time_low' => $this->getTimeLow(),
391
- 'time_mid' => $this->getTimeMid(),
392
- 'time_hi_and_version' => $this->getTimeHiAndVersion(),
393
- 'clock_seq_hi_and_reserved' => $this->getClockSeqHiAndReserved(),
394
- 'clock_seq_low' => $this->getClockSeqLow(),
395
- 'node' => $this->getNode(),
396
- );
397
- }
398
-
399
- /**
400
- * Returns an array of the fields of this UUID, with keys named according
401
- * to the RFC 4122 names for the fields.
402
- *
403
- * * **time_low**: The low field of the timestamp, an unsigned 32-bit integer
404
- * * **time_mid**: The middle field of the timestamp, an unsigned 16-bit integer
405
- * * **time_hi_and_version**: The high field of the timestamp multiplexed with
406
- * the version number, an unsigned 16-bit integer
407
- * * **clock_seq_hi_and_reserved**: The high field of the clock sequence
408
- * multiplexed with the variant, an unsigned 8-bit integer
409
- * * **clock_seq_low**: The low field of the clock sequence, an unsigned
410
- * 8-bit integer
411
- * * **node**: The spatially unique node identifier, an unsigned 48-bit
412
- * integer
413
- *
414
- * @return array The UUID fields represented as hexadecimal values
415
- */
416
- public function getFieldsHex()
417
- {
418
- return $this->fields;
419
- }
420
-
421
- /**
422
- * Returns the least significant 64 bits of this UUID's 128 bit value
423
- *
424
- * @return \Moontoast\Math\BigNumber BigNumber representation of the unsigned 64-bit integer value
425
- * @throws Exception\UnsatisfiedDependencyException if Moontoast\Math\BigNumber is not present
426
- */
427
- public function getLeastSignificantBits()
428
- {
429
- if (!self::hasBigNumber()) {
430
- throw new Exception\UnsatisfiedDependencyException(
431
- 'Cannot call ' . __METHOD__ . ' without support for large '
432
- . 'integers, since least significant bits is an unsigned '
433
- . '64-bit integer; Moontoast\Math\BigNumber is required'
434
- . '; consider calling getLeastSignificantBitsHex instead'
435
- );
436
- }
437
-
438
- $number = \Moontoast\Math\BigNumber::baseConvert(
439
- $this->getLeastSignificantBitsHex(),
440
- 16,
441
- 10
442
- );
443
-
444
- return new \Moontoast\Math\BigNumber($number);
445
- }
446
-
447
- /**
448
- * Returns the least significant 64 bits of this UUID's 128 bit value
449
- *
450
- * @return string Hexadecimal value of least significant bits
451
- */
452
- public function getLeastSignificantBitsHex()
453
- {
454
- return sprintf(
455
- '%02s%02s%012s',
456
- $this->fields['clock_seq_hi_and_reserved'],
457
- $this->fields['clock_seq_low'],
458
- $this->fields['node']
459
- );
460
- }
461
-
462
- /**
463
- * Returns the most significant 64 bits of this UUID's 128 bit value
464
- *
465
- * @return \Moontoast\Math\BigNumber BigNumber representation of the unsigned 64-bit integer value
466
- * @throws Exception\UnsatisfiedDependencyException if Moontoast\Math\BigNumber is not present
467
- */
468
- public function getMostSignificantBits()
469
- {
470
- if (!self::hasBigNumber()) {
471
- throw new Exception\UnsatisfiedDependencyException(
472
- 'Cannot call ' . __METHOD__ . ' without support for large '
473
- . 'integers, since most significant bits is an unsigned '
474
- . '64-bit integer; Moontoast\Math\BigNumber is required'
475
- . '; consider calling getMostSignificantBitsHex instead'
476
- );
477
- }
478
-
479
- $number = \Moontoast\Math\BigNumber::baseConvert(
480
- $this->getMostSignificantBitsHex(),
481
- 16,
482
- 10
483
- );
484
-
485
- return new \Moontoast\Math\BigNumber($number);
486
- }
487
-
488
- /**
489
- * Returns the most significant 64 bits of this UUID's 128 bit value
490
- *
491
- * @return string Hexadecimal value of most significant bits
492
- */
493
- public function getMostSignificantBitsHex()
494
- {
495
- return sprintf(
496
- '%08s%04s%04s',
497
- $this->fields['time_low'],
498
- $this->fields['time_mid'],
499
- $this->fields['time_hi_and_version']
500
- );
501
- }
502
-
503
- /**
504
- * Returns the node value associated with this UUID
505
- *
506
- * For UUID version 1, the node field consists of an IEEE 802 MAC
507
- * address, usually the host address. For systems with multiple IEEE
508
- * 802 addresses, any available one can be used. The lowest addressed
509
- * octet (octet number 10) contains the global/local bit and the
510
- * unicast/multicast bit, and is the first octet of the address
511
- * transmitted on an 802.3 LAN.
512
- *
513
- * For systems with no IEEE address, a randomly or pseudo-randomly
514
- * generated value may be used; see RFC 4122, Section 4.5. The
515
- * multicast bit must be set in such addresses, in order that they
516
- * will never conflict with addresses obtained from network cards.
517
- *
518
- * For UUID version 3 or 5, the node field is a 48-bit value constructed
519
- * from a name as described in RFC 4122, Section 4.3.
520
- *
521
- * For UUID version 4, the node field is a randomly or pseudo-randomly
522
- * generated 48-bit value as described in RFC 4122, Section 4.4.
523
- *
524
- * @return int Unsigned 48-bit integer value of node
525
- * @link http://tools.ietf.org/html/rfc4122#section-4.1.6
526
- * @throws Exception\UnsatisfiedDependencyException if called on a 32-bit system
527
- */
528
- public function getNode()
529
- {
530
- if (!self::is64BitSystem()) {
531
- throw new Exception\UnsatisfiedDependencyException(
532
- 'Cannot call ' . __METHOD__ . ' on a 32-bit system, since node '
533
- . 'is an unsigned 48-bit integer and can overflow the system '
534
- . 'max integer value'
535
- . '; consider calling getNodeHex instead'
536
- );
537
- }
538
-
539
- return hexdec($this->getNodeHex());
540
- }
541
-
542
- /**
543
- * Returns the node value associated with this UUID
544
- *
545
- * For UUID version 1, the node field consists of an IEEE 802 MAC
546
- * address, usually the host address. For systems with multiple IEEE
547
- * 802 addresses, any available one can be used. The lowest addressed
548
- * octet (octet number 10) contains the global/local bit and the
549
- * unicast/multicast bit, and is the first octet of the address
550
- * transmitted on an 802.3 LAN.
551
- *
552
- * For systems with no IEEE address, a randomly or pseudo-randomly
553
- * generated value may be used; see RFC 4122, Section 4.5. The
554
- * multicast bit must be set in such addresses, in order that they
555
- * will never conflict with addresses obtained from network cards.
556
- *
557
- * For UUID version 3 or 5, the node field is a 48-bit value constructed
558
- * from a name as described in RFC 4122, Section 4.3.
559
- *
560
- * For UUID version 4, the node field is a randomly or pseudo-randomly
561
- * generated 48-bit value as described in RFC 4122, Section 4.4.
562
- *
563
- * @return string Hexadecimal value of node
564
- * @link http://tools.ietf.org/html/rfc4122#section-4.1.6
565
- */
566
- public function getNodeHex()
567
- {
568
- return $this->fields['node'];
569
- }
570
-
571
- /**
572
- * Returns the high field of the timestamp multiplexed with the version
573
- * number (bits 49-64 of the UUID).
574
- *
575
- * @return int Unsigned 16-bit integer value of time_hi_and_version
576
- */
577
- public function getTimeHiAndVersion()
578
- {
579
- return hexdec($this->getTimeHiAndVersionHex());
580
- }
581
-
582
- /**
583
- * Returns the high field of the timestamp multiplexed with the version
584
- * number (bits 49-64 of the UUID).
585
- *
586
- * @return string Hexadecimal value of time_hi_and_version
587
- */
588
- public function getTimeHiAndVersionHex()
589
- {
590
- return $this->fields['time_hi_and_version'];
591
- }
592
-
593
- /**
594
- * Returns the low field of the timestamp (the first 32 bits of the UUID).
595
- *
596
- * @return int Unsigned 32-bit integer value of time_low
597
- * @throws Exception\UnsatisfiedDependencyException if called on a 32-bit system
598
- */
599
- public function getTimeLow()
600
- {
601
- if (!self::is64BitSystem()) {
602
- throw new Exception\UnsatisfiedDependencyException(
603
- 'Cannot call ' . __METHOD__ . ' on a 32-bit system, since time_low '
604
- . 'is an unsigned 32-bit integer and can overflow the system '
605
- . 'max integer value'
606
- . '; consider calling getTimeLowHex instead'
607
- );
608
- }
609
-
610
- return hexdec($this->getTimeLowHex());
611
- }
612
-
613
- /**
614
- * Returns the low field of the timestamp (the first 32 bits of the UUID).
615
- *
616
- * @return string Hexadecimal value of time_low
617
- */
618
- public function getTimeLowHex()
619
- {
620
- return $this->fields['time_low'];
621
- }
622
-
623
- /**
624
- * Returns the middle field of the timestamp (bits 33-48 of the UUID).
625
- *
626
- * @return int Unsigned 16-bit integer value of time_mid
627
- */
628
- public function getTimeMid()
629
- {
630
- return hexdec($this->getTimeMidHex());
631
- }
632
-
633
- /**
634
- * Returns the middle field of the timestamp (bits 33-48 of the UUID).
635
- *
636
- * @return string Hexadecimal value of time_mid
637
- */
638
- public function getTimeMidHex()
639
- {
640
- return $this->fields['time_mid'];
641
- }
642
-
643
- /**
644
- * The timestamp value associated with this UUID
645
- *
646
- * The 60 bit timestamp value is constructed from the time_low,
647
- * time_mid, and time_hi fields of this UUID. The resulting
648
- * timestamp is measured in 100-nanosecond units since midnight,
649
- * October 15, 1582 UTC.
650
- *
651
- * The timestamp value is only meaningful in a time-based UUID, which
652
- * has version type 1. If this UUID is not a time-based UUID then
653
- * this method throws UnsupportedOperationException.
654
- *
655
- * @return int Unsigned 60-bit integer value of the timestamp
656
- * @throws Exception\UnsupportedOperationException If this UUID is not a version 1 UUID
657
- * @throws Exception\UnsatisfiedDependencyException if called on a 32-bit system
658
- * @link http://tools.ietf.org/html/rfc4122#section-4.1.4
659
- */
660
- public function getTimestamp()
661
- {
662
- if ($this->getVersion() != 1) {
663
- throw new Exception\UnsupportedOperationException('Not a time-based UUID');
664
- }
665
-
666
- if (!self::is64BitSystem()) {
667
- throw new Exception\UnsatisfiedDependencyException(
668
- 'Cannot call ' . __METHOD__ . ' on a 32-bit system, since timestamp '
669
- . 'is an unsigned 60-bit integer and can overflow the system '
670
- . 'max integer value'
671
- . '; consider calling getTimestampHex instead'
672
- );
673
- }
674
-
675
- return hexdec($this->getTimestampHex());
676
- }
677
-
678
- /**
679
- * The timestamp value associated with this UUID
680
- *
681
- * The 60 bit timestamp value is constructed from the time_low,
682
- * time_mid, and time_hi fields of this UUID. The resulting
683
- * timestamp is measured in 100-nanosecond units since midnight,
684
- * October 15, 1582 UTC.
685
- *
686
- * The timestamp value is only meaningful in a time-based UUID, which
687
- * has version type 1. If this UUID is not a time-based UUID then
688
- * this method throws UnsupportedOperationException.
689
- *
690
- * @return string Hexadecimal value of the timestamp
691
- * @throws Exception\UnsupportedOperationException If this UUID is not a version 1 UUID
692
- * @link http://tools.ietf.org/html/rfc4122#section-4.1.4
693
- */
694
- public function getTimestampHex()
695
- {
696
- if ($this->getVersion() != 1) {
697
- throw new Exception\UnsupportedOperationException('Not a time-based UUID');
698
- }
699
-
700
- return sprintf(
701
- '%03x%04s%08s',
702
- ($this->getTimeHiAndVersion() & 0x0fff),
703
- $this->fields['time_mid'],
704
- $this->fields['time_low']
705
- );
706
- }
707
-
708
- /**
709
- * Returns the string representation of the UUID as a URN.
710
- *
711
- * @return string
712
- * @link http://en.wikipedia.org/wiki/Uniform_Resource_Name
713
- */
714
- public function getUrn()
715
- {
716
- return 'urn:uuid:' . $this->toString();
717
- }
718
-
719
- /**
720
- * Returns the variant number associated with this UUID.
721
- *
722
- * The variant number describes the layout of the UUID. The variant
723
- * number has the following meaning:
724
- *
725
- * * 0 - Reserved for NCS backward compatibility
726
- * * 2 - The RFC 4122 variant (used by this class)
727
- * * 6 - Reserved, Microsoft Corporation backward compatibility
728
- * * 7 - Reserved for future definition
729
- *
730
- * @return int
731
- * @link http://tools.ietf.org/html/rfc4122#section-4.1.1
732
- */
733
- public function getVariant()
734
- {
735
- $clockSeq = $this->getClockSeqHiAndReserved();
736
- if (0 === ($clockSeq & 0x80)) {
737
- $variant = self::RESERVED_NCS;
738
- } elseif (0 === ($clockSeq & 0x40)) {
739
- $variant = self::RFC_4122;
740
- } elseif (0 === ($clockSeq & 0x20)) {
741
- $variant = self::RESERVED_MICROSOFT;
742
- } else {
743
- $variant = self::RESERVED_FUTURE;
744
- }
745
-
746
- return $variant;
747
- }
748
-
749
- /**
750
- * The version number associated with this UUID. The version
751
- * number describes how this UUID was generated.
752
- *
753
- * The version number has the following meaning:
754
- *
755
- * * 1 - Time-based UUID
756
- * * 2 - DCE security UUID
757
- * * 3 - Name-based UUID hashed with MD5
758
- * * 4 - Randomly generated UUID
759
- * * 5 - Name-based UUID hashed with SHA-1
760
- *
761
- * Returns null if this UUID is not an RFC 4122 variant, since version
762
- * is only meaningul for this variant.
763
- *
764
- * @return int|null
765
- * @link http://tools.ietf.org/html/rfc4122#section-4.1.3
766
- */
767
- public function getVersion()
768
- {
769
- if ($this->getVariant() == self::RFC_4122) {
770
- return (int) (($this->getTimeHiAndVersion() >> 12) & 0x0f);
771
- }
772
-
773
- return null;
774
- }
775
-
776
- /**
777
- * Converts this UUID into a string representation
778
- *
779
- * @return string
780
- */
781
- public function toString()
782
- {
783
- return vsprintf(
784
- '%08s-%04s-%04s-%02s%02s-%012s',
785
- $this->fields
786
- );
787
- }
788
-
789
- /**
790
- * Creates a UUID from a byte string.
791
- *
792
- * @param string $bytes
793
- * @return Uuid
794
- * @throws InvalidArgumentException If the $bytes string does not contain 16 characters
795
- */
796
- public static function fromBytes($bytes)
797
- {
798
- if (strlen($bytes) !== 16) {
799
- throw new InvalidArgumentException('$bytes string should contain 16 characters.');
800
- }
801
-
802
- $uuid = '';
803
- foreach (range(0, 15) as $step) {
804
- $uuid .= sprintf('%02x', ord($bytes[$step]));
805
-
806
- if (in_array($step, array(3, 5, 7, 9))) {
807
- $uuid .= '-';
808
- }
809
- }
810
-
811
- return Uuid::fromString($uuid);
812
- }
813
-
814
- /**
815
- * Creates a UUID from the string standard representation as described
816
- * in the toString() method.
817
- *
818
- * @param string $name A string that specifies a UUID
819
- * @return Uuid
820
- * @throws InvalidArgumentException If the $name isn't a valid UUID
821
- */
822
- public static function fromString($name)
823
- {
824
- $nameParsed = str_replace(array('urn:', 'uuid:', '{', '}', '-'), '', $name);
825
-
826
- // We have stripped out the dashes and are breaking up the string using
827
- // substr(). In this way, we can accept a full hex value that doesn't
828
- // contain dashes.
829
- $components = array(
830
- substr($nameParsed, 0, 8),
831
- substr($nameParsed, 8, 4),
832
- substr($nameParsed, 12, 4),
833
- substr($nameParsed, 16, 4),
834
- substr($nameParsed, 20),
835
- );
836
- $nameParsed = implode('-', $components);
837
-
838
- if (!self::isValid($nameParsed)) {
839
- throw new InvalidArgumentException('Invalid UUID string: ' . $name);
840
- }
841
-
842
- $fields = array(
843
- 'time_low' => sprintf('%08s', $components[0]),
844
- 'time_mid' => sprintf('%04s', $components[1]),
845
- 'time_hi_and_version' => sprintf('%04s', $components[2]),
846
- 'clock_seq_hi_and_reserved' => sprintf('%02s', substr($components[3], 0, 2)),
847
- 'clock_seq_low' => sprintf('%02s', substr($components[3], 2)),
848
- 'node' => sprintf('%012s', $components[4]),
849
- );
850
-
851
- return new self($fields);
852
- }
853
-
854
- /**
855
- * Check if a string is a valid uuid
856
- *
857
- * @param string $uuid The uuid to test
858
- * @return boolean
859
- */
860
- public static function isValid($uuid)
861
- {
862
- $uuid = str_replace(array('urn:', 'uuid:', '{', '}'), '', $uuid);
863
-
864
- if ($uuid == self::NIL) {
865
- return true;
866
- }
867
-
868
- if (!preg_match('/^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$/', $uuid)) {
869
- return false;
870
- }
871
- return true;
872
- }
873
-
874
- /**
875
- * Generate a version 1 UUID from a host ID, sequence number, and the current time.
876
- * If $node is not given, we will attempt to obtain the local hardware
877
- * address. If $clockSeq is given, it is used as the sequence number;
878
- * otherwise a random 14-bit sequence number is chosen.
879
- *
880
- * @param int|string $node A 48-bit number representing the hardware
881
- * address. This number may be represented as
882
- * an integer or a hexadecimal string.
883
- * @param int $clockSeq A 14-bit number used to help avoid duplicates that
884
- * could arise when the clock is set backwards in time
885
- * or if the node ID changes.
886
- * @return Uuid
887
- * @throws InvalidArgumentException if the $node is invalid
888
- */
889
- public static function uuid1($node = null, $clockSeq = null)
890
- {
891
- if ($node === null && !self::$ignoreSystemNode) {
892
- $node = self::getNodeFromSystem();
893
- }
894
-
895
- // if $node is still null (couldn't get from system), randomly generate
896
- // a node value, according to RFC 4122, Section 4.5
897
- if ($node === null) {
898
- $node = sprintf('%06x%06x', mt_rand(0, 1 << 24), mt_rand(0, 1 << 24));
899
- }
900
-
901
- // Convert the node to hex, if it is still an integer
902
- if (is_int($node)) {
903
- $node = sprintf('%012x', $node);
904
- }
905
-
906
- if (ctype_xdigit($node) && strlen($node) <= 12) {
907
- $node = strtolower(sprintf('%012s', $node));
908
- } else {
909
- throw new InvalidArgumentException('Invalid node value');
910
- }
911
-
912
- if ($clockSeq === null) {
913
- // Not using "stable storage"; see RFC 4122, Section 4.2.1.1
914
- $clockSeq = mt_rand(0, 1 << 14);
915
- }
916
-
917
- // Create a 60-bit time value as a count of 100-nanosecond intervals
918
- // since 00:00:00.00, 15 October 1582
919
- if (self::$timeOfDayTest === null) {
920
- $timeOfDay = gettimeofday();
921
- } else {
922
- $timeOfDay = self::$timeOfDayTest;
923
- }
924
- $uuidTime = self::calculateUuidTime($timeOfDay['sec'], $timeOfDay['usec']);
925
-
926
- // Set the version number to 1
927
- $timeHi = hexdec($uuidTime['hi']) & 0x0fff;
928
- $timeHi &= ~(0xf000);
929
- $timeHi |= 1 << 12;
930
-
931
- // Set the variant to RFC 4122
932
- $clockSeqHi = ($clockSeq >> 8) & 0x3f;
933
- $clockSeqHi &= ~(0xc0);
934
- $clockSeqHi |= 0x80;
935
-
936
- $fields = array(
937
- 'time_low' => $uuidTime['low'],
938
- 'time_mid' => $uuidTime['mid'],
939
- 'time_hi_and_version' => sprintf('%04x', $timeHi),
940
- 'clock_seq_hi_and_reserved' => sprintf('%02x', $clockSeqHi),
941
- 'clock_seq_low' => sprintf('%02x', $clockSeq & 0xff),
942
- 'node' => $node,
943
- );
944
-
945
- return new self($fields);
946
- }
947
-
948
- /**
949
- * Generate a version 3 UUID based on the MD5 hash of a namespace identifier (which
950
- * is a UUID) and a name (which is a string).
951
- *
952
- * @param Uuid|string $ns The UUID namespace in which to create the named UUID
953
- * @param string $name The name to create a UUID for
954
- * @return Uuid
955
- */
956
- public static function uuid3($ns, $name)
957
- {
958
- if (!($ns instanceof Uuid)) {
959
- $ns = self::fromString($ns);
960
- }
961
-
962
- $hash = md5($ns->getBytes() . $name);
963
-
964
- return self::uuidFromHashedName($hash, 3);
965
- }
966
-
967
- /**
968
- * Generate a version 4 (random) UUID.
969
- *
970
- * @return Uuid
971
- */
972
- public static function uuid4()
973
- {
974
- $bytes = self::generateBytes(16);
975
-
976
- // When converting the bytes to hex, it turns into a 32-character
977
- // hexadecimal string that looks a lot like an MD5 hash, so at this
978
- // point, we can just pass it to uuidFromHashedName.
979
- $hex = bin2hex($bytes);
980
- return self::uuidFromHashedName($hex, 4);
981
- }
982
-
983
- /**
984
- * Generate a version 5 UUID based on the SHA-1 hash of a namespace identifier (which
985
- * is a UUID) and a name (which is a string).
986
- *
987
- * @param Uuid|string $ns The UUID namespace in which to create the named UUID
988
- * @param string $name The name to create a UUID for
989
- * @return Uuid
990
- */
991
- public static function uuid5($ns, $name)
992
- {
993
- if (!($ns instanceof Uuid)) {
994
- $ns = self::fromString($ns);
995
- }
996
-
997
- $hash = sha1($ns->getBytes() . $name);
998
-
999
- return self::uuidFromHashedName($hash, 5);
1000
- }
1001
-
1002
- /**
1003
- * Calculates the UUID time fields from a UNIX timestamp
1004
- *
1005
- * UUID time is a 60-bit time value as a count of 100-nanosecond intervals
1006
- * since 00:00:00.00, 15 October 1582.
1007
- *
1008
- * @param int $sec Seconds since the Unix Epoch
1009
- * @param int $usec Microseconds
1010
- * @return array
1011
- * @throws Exception\UnsatisfiedDependencyException if called on a 32-bit system and Moontoast\Math\BigNumber is not present
1012
- */
1013
- protected static function calculateUuidTime($sec, $usec)
1014
- {
1015
- if (self::is64BitSystem()) {
1016
-
1017
- // 0x01b21dd213814000 is the number of 100-ns intervals between the
1018
- // UUID epoch 1582-10-15 00:00:00 and the Unix epoch 1970-01-01 00:00:00.
1019
- $uuidTime = ($sec * 10000000) + ($usec * 10) + 0x01b21dd213814000;
1020
-
1021
- return array(
1022
- 'low' => sprintf('%08x', $uuidTime & 0xffffffff),
1023
- 'mid' => sprintf('%04x', ($uuidTime >> 32) & 0xffff),
1024
- 'hi' => sprintf('%04x', ($uuidTime >> 48) & 0x0fff),
1025
- );
1026
- }
1027
-
1028
- if (self::hasBigNumber()) {
1029
-
1030
- $uuidTime = new \Moontoast\Math\BigNumber('0');
1031
-
1032
- $sec = new \Moontoast\Math\BigNumber($sec);
1033
- $sec->multiply('10000000');
1034
-
1035
- $usec = new \Moontoast\Math\BigNumber($usec);
1036
- $usec->multiply('10');
1037
-
1038
- $uuidTime->add($sec)
1039
- ->add($usec)
1040
- ->add('122192928000000000');
1041
-
1042
- $uuidTimeHex = sprintf('%016s', $uuidTime->convertToBase(16));
1043
-
1044
- return array(
1045
- 'low' => substr($uuidTimeHex, 8),
1046
- 'mid' => substr($uuidTimeHex, 4, 4),
1047
- 'hi' => substr($uuidTimeHex, 0, 4),
1048
- );
1049
- }
1050
-
1051
- throw new Exception\UnsatisfiedDependencyException(
1052
- 'When calling ' . __METHOD__ . ' on a 32-bit system, '
1053
- . 'Moontoast\Math\BigNumber must be present in order '
1054
- . 'to generate version 1 UUIDs'
1055
- );
1056
- }
1057
-
1058
- /**
1059
- * Get the hardware address as a 48-bit positive integer. If all attempts to
1060
- * obtain the hardware address fail, we choose a random 48-bit number with
1061
- * its eighth bit set to 1 as recommended in RFC 4122. "Hardware address"
1062
- * means the MAC address of a network interface, and on a machine with
1063
- * multiple network interfaces the MAC address of any one of them may be
1064
- * returned.
1065
- *
1066
- * @return string
1067
- * @todo Needs evaluation and possibly modification to ensure this works
1068
- * well across multiple platforms.
1069
- */
1070
- protected static function getNodeFromSystem()
1071
- {
1072
- // If we're on Windows, use ipconfig; otherwise use ifconfig
1073
- if (strtoupper(substr(php_uname('a'), 0, 3)) == 'WIN') {
1074
- $ifconfig = `ipconfig /all 2>&1`;
1075
- } else {
1076
- $ifconfig = `ifconfig 2>&1`;
1077
- }
1078
-
1079
- $node = null;
1080
- $pattern = '/[^:]([0-9A-Fa-f]{2}([:-])[0-9A-Fa-f]{2}(\2[0-9A-Fa-f]{2}){4})[^:]/';
1081
- $matches = array();
1082
-
1083
- // Search the ifconfig output for all MAC addresses and return
1084
- // the first one found
1085
- if (preg_match_all($pattern, $ifconfig, $matches, PREG_PATTERN_ORDER)) {
1086
- $node = $matches[1][0];
1087
- $node = str_replace(':', '', $node);
1088
- $node = str_replace('-', '', $node);
1089
- }
1090
-
1091
- return $node;
1092
- }
1093
-
1094
- /**
1095
- * Returns true if the system has Moontoast\Math\BigNumber
1096
- *
1097
- * @return bool
1098
- */
1099
- protected static function hasBigNumber()
1100
- {
1101
- return (class_exists('Moontoast\Math\BigNumber') && !self::$forceNoBigNumber);
1102
- }
1103
-
1104
- /**
1105
- * Returns true if the system has openssl_random_pseudo_bytes()
1106
- *
1107
- * @return bool
1108
- */
1109
- protected static function hasOpensslRandomPseudoBytes()
1110
- {
1111
- return (function_exists('openssl_random_pseudo_bytes') && !self::$forceNoOpensslRandomPseudoBytes);
1112
- }
1113
-
1114
- /**
1115
- * Returns true if the system is 64-bit, false otherwise
1116
- *
1117
- * @return bool
1118
- */
1119
- protected static function is64BitSystem()
1120
- {
1121
- return (PHP_INT_SIZE == 8 && !self::$force32Bit);
1122
- }
1123
-
1124
- /**
1125
- * Returns a version 3 or 5 UUID based on the hash (md5 or sha1) of a
1126
- * namespace identifier (which is a UUID) and a name (which is a string)
1127
- *
1128
- * @param string $hash The hash to use when creating the UUID
1129
- * @param int $version The UUID version to be generated
1130
- * @return Uuid
1131
- */
1132
- protected static function uuidFromHashedName($hash, $version)
1133
- {
1134
- // Set the version number
1135
- $timeHi = hexdec(substr($hash, 12, 4)) & 0x0fff;
1136
- $timeHi &= ~(0xf000);
1137
- $timeHi |= $version << 12;
1138
-
1139
- // Set the variant to RFC 4122
1140
- $clockSeqHi = hexdec(substr($hash, 16, 2)) & 0x3f;
1141
- $clockSeqHi &= ~(0xc0);
1142
- $clockSeqHi |= 0x80;
1143
-
1144
- $fields = array(
1145
- 'time_low' => substr($hash, 0, 8),
1146
- 'time_mid' => substr($hash, 8, 4),
1147
- 'time_hi_and_version' => sprintf('%04x', $timeHi),
1148
- 'clock_seq_hi_and_reserved' => sprintf('%02x', $clockSeqHi),
1149
- 'clock_seq_low' => substr($hash, 18, 2),
1150
- 'node' => substr($hash, 20, 12),
1151
- );
1152
-
1153
- return new self($fields);
1154
- }
1155
-
1156
- /**
1157
- * @param int $length
1158
- * @return string
1159
- */
1160
- private static function generateBytes($length)
1161
- {
1162
- if (self::hasOpensslRandomPseudoBytes()) {
1163
- return openssl_random_pseudo_bytes($length);
1164
- }
1165
-
1166
- $bytes = '';
1167
- foreach (range(1, $length) as $i) {
1168
- $bytes = chr(mt_rand(0, 256)) . $bytes;
1169
- }
1170
- return $bytes;
1171
- }
1172
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/mindscape/raygun4php/src/Raygun4php/cacert.crt DELETED
@@ -1,3895 +0,0 @@
1
- ##
2
- ## ca-bundle.crt -- Bundle of CA Root Certificates
3
- ##
4
- ## Certificate data from Mozilla as of: Sat Dec 29 20:03:40 2012
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://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1
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
-
17
- # @(#) $RCSfile: certdata.txt,v $ $Revision: 1.87 $ $Date: 2012/12/29 16:32:45 $
18
-
19
- GTE CyberTrust Global Root
20
- ==========================
21
- -----BEGIN CERTIFICATE-----
22
- MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg
23
- Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG
24
- A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz
25
- MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL
26
- Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0
27
- IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u
28
- sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql
29
- HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID
30
- AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW
31
- M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF
32
- NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/
33
- -----END CERTIFICATE-----
34
-
35
- Thawte Server CA
36
- ================
37
- -----BEGIN CERTIFICATE-----
38
- MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT
39
- DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs
40
- dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE
41
- AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j
42
- b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV
43
- BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u
44
- c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG
45
- A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0
46
- ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl
47
- /Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7
48
- 1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR
49
- MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J
50
- GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ
51
- GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc=
52
- -----END CERTIFICATE-----
53
-
54
- Thawte Premium Server CA
55
- ========================
56
- -----BEGIN CERTIFICATE-----
57
- MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT
58
- DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs
59
- dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE
60
- AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl
61
- ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT
62
- AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU
63
- VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2
64
- aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ
65
- cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2
66
- aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh
67
- Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/
68
- qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm
69
- SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf
70
- 8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t
71
- UCemDaYj+bvLpgcUQg==
72
- -----END CERTIFICATE-----
73
-
74
- Equifax Secure CA
75
- =================
76
- -----BEGIN CERTIFICATE-----
77
- MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE
78
- ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
79
- MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT
80
- B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB
81
- nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR
82
- fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW
83
- 8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG
84
- A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE
85
- CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG
86
- A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS
87
- spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB
88
- Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961
89
- zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB
90
- BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95
91
- 70+sB3c4
92
- -----END CERTIFICATE-----
93
-
94
- Digital Signature Trust Co. Global CA 1
95
- =======================================
96
- -----BEGIN CERTIFICATE-----
97
- MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE
98
- ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy
99
- MTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs
100
- IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA
101
- A4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE
102
- NySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i
103
- o74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo
104
- BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0
105
- dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw
106
- IoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY
107
- MBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM
108
- BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB
109
- ACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq
110
- kzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4
111
- RbyhkwS7hp86W0N6w4pl
112
- -----END CERTIFICATE-----
113
-
114
- Digital Signature Trust Co. Global CA 3
115
- =======================================
116
- -----BEGIN CERTIFICATE-----
117
- MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE
118
- ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy
119
- MDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs
120
- IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA
121
- A4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD
122
- VvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS
123
- xhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo
124
- BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0
125
- dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw
126
- IoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY
127
- MBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM
128
- BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB
129
- AEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi
130
- up/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1
131
- mPnHfxsb1gYgAlihw6ID
132
- -----END CERTIFICATE-----
133
-
134
- Verisign Class 3 Public Primary Certification Authority
135
- =======================================================
136
- -----BEGIN CERTIFICATE-----
137
- MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx
138
- FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
139
- IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow
140
- XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
141
- IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
142
- A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
143
- f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
144
- hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA
145
- TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah
146
- WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf
147
- Tqj/ZA1k
148
- -----END CERTIFICATE-----
149
-
150
- Verisign Class 1 Public Primary Certification Authority - G2
151
- ============================================================
152
- -----BEGIN CERTIFICATE-----
153
- MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT
154
- MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy
155
- eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
156
- biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
157
- dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT
158
- MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy
159
- eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
160
- biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
161
- dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgd
162
- k4xWArzZbxpvUjZudVYKVdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIq
163
- WpDBucSmFc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQIDAQAB
164
- MA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0Jh9ZrbWB85a7FkCMM
165
- XErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2uluIncrKTdcu1OofdPvAbT6shkdHvC
166
- lUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68DzFc6PLZ
167
- -----END CERTIFICATE-----
168
-
169
- Verisign Class 2 Public Primary Certification Authority - G2
170
- ============================================================
171
- -----BEGIN CERTIFICATE-----
172
- MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQswCQYDVQQGEwJV
173
- UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h
174
- cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp
175
- Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1
176
- c3QgTmV0d29yazAeFw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJV
177
- UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h
178
- cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp
179
- Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1
180
- c3QgTmV0d29yazCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjx
181
- nNuX6Zr8wgQGE75fUsjMHiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRC
182
- wiNPStjwDqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cCAwEA
183
- ATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9jinb3/7aHmZuovCfTK
184
- 1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAXrXfMSTWqz9iP0b63GJZHc2pUIjRk
185
- LbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnInjBJ7xUS0rg==
186
- -----END CERTIFICATE-----
187
-
188
- Verisign Class 3 Public Primary Certification Authority - G2
189
- ============================================================
190
- -----BEGIN CERTIFICATE-----
191
- MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT
192
- MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
193
- eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
194
- biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
195
- dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT
196
- MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
197
- eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
198
- biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
199
- dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO
200
- FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71
201
- lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB
202
- MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT
203
- 1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD
204
- Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9
205
- -----END CERTIFICATE-----
206
-
207
- GlobalSign Root CA
208
- ==================
209
- -----BEGIN CERTIFICATE-----
210
- MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx
211
- GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds
212
- b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV
213
- BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD
214
- VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa
215
- DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc
216
- THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb
217
- Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP
218
- c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX
219
- gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
220
- HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF
221
- AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj
222
- Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG
223
- j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH
224
- hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC
225
- X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
226
- -----END CERTIFICATE-----
227
-
228
- GlobalSign Root CA - R2
229
- =======================
230
- -----BEGIN CERTIFICATE-----
231
- MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv
232
- YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
233
- bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
234
- aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
235
- bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6
236
- ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp
237
- s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN
238
- S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL
239
- TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C
240
- ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
241
- FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i
242
- YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN
243
- BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp
244
- 9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu
245
- 01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7
246
- 9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
247
- TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
248
- -----END CERTIFICATE-----
249
-
250
- ValiCert Class 1 VA
251
- ===================
252
- -----BEGIN CERTIFICATE-----
253
- MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
254
- b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
255
- YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
256
- bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy
257
- MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
258
- d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg
259
- UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
260
- LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
261
- A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi
262
- GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm
263
- DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG
264
- lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX
265
- icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP
266
- Orf1LXLI
267
- -----END CERTIFICATE-----
268
-
269
- ValiCert Class 2 VA
270
- ===================
271
- -----BEGIN CERTIFICATE-----
272
- MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
273
- b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
274
- YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
275
- bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw
276
- MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
277
- d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg
278
- UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
279
- LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
280
- A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC
281
- CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf
282
- ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ
283
- SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV
284
- UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8
285
- W9ViH0Pd
286
- -----END CERTIFICATE-----
287
-
288
- RSA Root Certificate 1
289
- ======================
290
- -----BEGIN CERTIFICATE-----
291
- MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
292
- b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
293
- YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
294
- bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw
295
- MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
296
- d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg
297
- UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
298
- LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
299
- A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td
300
- 3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H
301
- BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs
302
- 3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF
303
- V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r
304
- on+jjBXu
305
- -----END CERTIFICATE-----
306
-
307
- Verisign Class 1 Public Primary Certification Authority - G3
308
- ============================================================
309
- -----BEGIN CERTIFICATE-----
310
- MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
311
- UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
312
- cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
313
- IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
314
- dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
315
- CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
316
- dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
317
- cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkg
318
- Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
319
- ggEBAN2E1Lm0+afY8wR4nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/E
320
- bRrsC+MO8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjVojYJ
321
- rKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjbPG7PoBMAGrgnoeS+
322
- Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP26KbqxzcSXKMpHgLZ2x87tNcPVkeB
323
- FQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vrn5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
324
- q2aN17O6x5q25lXQBfGfMY1aqtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/N
325
- y9Sn2WCVhDr4wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3
326
- ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrspSCAaWihT37h
327
- a88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4E1Z5T21Q6huwtVexN2ZYI/Pc
328
- D98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g==
329
- -----END CERTIFICATE-----
330
-
331
- Verisign Class 2 Public Primary Certification Authority - G3
332
- ============================================================
333
- -----BEGIN CERTIFICATE-----
334
- MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJBgNVBAYTAlVT
335
- MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29y
336
- azE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ug
337
- b25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0
338
- aW9uIEF1dGhvcml0eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJ
339
- BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1
340
- c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y
341
- aXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBD
342
- ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
343
- AQEArwoNwtUs22e5LeWUJ92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6
344
- tW8UvxDOJxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUYwZF7
345
- C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9okoqQHgiBVrKtaaNS
346
- 0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjNqWm6o+sdDZykIKbBoMXRRkwXbdKs
347
- Zj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/ESrg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0
348
- JhU8wI1NQ0kdvekhktdmnLfexbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf
349
- 0xwLRtxyID+u7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU
350
- sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RIsH/7NiXaldDx
351
- JBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTPcjnhsUPgKM+351psE2tJs//j
352
- GHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q
353
- -----END CERTIFICATE-----
354
-
355
- Verisign Class 3 Public Primary Certification Authority - G3
356
- ============================================================
357
- -----BEGIN CERTIFICATE-----
358
- MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
359
- UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
360
- cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
361
- IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
362
- dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
363
- CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
364
- dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
365
- cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg
366
- Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
367
- ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1
368
- EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc
369
- cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw
370
- EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj
371
- 055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
372
- ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f
373
- j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
374
- /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0
375
- xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa
376
- t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
377
- -----END CERTIFICATE-----
378
-
379
- Verisign Class 4 Public Primary Certification Authority - G3
380
- ============================================================
381
- -----BEGIN CERTIFICATE-----
382
- MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
383
- UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
384
- cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
385
- IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
386
- dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
387
- CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
388
- dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
389
- cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg
390
- Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
391
- ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS
392
- tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM
393
- 8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW
394
- Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX
395
- Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
396
- j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt
397
- mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
398
- fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd
399
- RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG
400
- UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
401
- -----END CERTIFICATE-----
402
-
403
- Entrust.net Secure Server CA
404
- ============================
405
- -----BEGIN CERTIFICATE-----
406
- MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV
407
- BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg
408
- cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl
409
- ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv
410
- cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG
411
- A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi
412
- eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p
413
- dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0
414
- aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ
415
- aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5
416
- gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw
417
- ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw
418
- CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l
419
- dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
420
- bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl
421
- cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
422
- dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw
423
- NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow
424
- HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA
425
- BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN
426
- Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9
427
- n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
428
- -----END CERTIFICATE-----
429
-
430
- Entrust.net Premium 2048 Secure Server CA
431
- =========================================
432
- -----BEGIN CERTIFICATE-----
433
- MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
434
- ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp
435
- bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
436
- BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx
437
- NzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
438
- d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
439
- MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u
440
- ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
441
- MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL
442
- Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr
443
- hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW
444
- nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi
445
- VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC
446
- AQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER
447
- gL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B
448
- AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo
449
- oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS
450
- o8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z
451
- 2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX
452
- OP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ==
453
- -----END CERTIFICATE-----
454
-
455
- Baltimore CyberTrust Root
456
- =========================
457
- -----BEGIN CERTIFICATE-----
458
- MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE
459
- ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li
460
- ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC
461
- SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs
462
- dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME
463
- uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB
464
- UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C
465
- G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9
466
- XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr
467
- l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI
468
- VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB
469
- BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh
470
- cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5
471
- hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa
472
- Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H
473
- RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
474
- -----END CERTIFICATE-----
475
-
476
- Equifax Secure Global eBusiness CA
477
- ==================================
478
- -----BEGIN CERTIFICATE-----
479
- MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
480
- RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp
481
- bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx
482
- HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds
483
- b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV
484
- PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN
485
- qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn
486
- hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j
487
- BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs
488
- MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN
489
- I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY
490
- NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV
491
- -----END CERTIFICATE-----
492
-
493
- Equifax Secure eBusiness CA 1
494
- =============================
495
- -----BEGIN CERTIFICATE-----
496
- MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
497
- RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB
498
- LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE
499
- ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz
500
- IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ
501
- 1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a
502
- IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk
503
- MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW
504
- Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF
505
- AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5
506
- lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+
507
- KpYrtWKmpj29f5JZzVoqgrI3eQ==
508
- -----END CERTIFICATE-----
509
-
510
- Equifax Secure eBusiness CA 2
511
- =============================
512
- -----BEGIN CERTIFICATE-----
513
- MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE
514
- ChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y
515
- MB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT
516
- DkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB
517
- nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn
518
- 2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5
519
- BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG
520
- A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx
521
- JjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG
522
- A1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e
523
- uSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB
524
- Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1
525
- jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia
526
- 78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm
527
- V+GRMOrN
528
- -----END CERTIFICATE-----
529
-
530
- AddTrust Low-Value Services Root
531
- ================================
532
- -----BEGIN CERTIFICATE-----
533
- MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
534
- QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU
535
- cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw
536
- CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO
537
- ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB
538
- AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6
539
- 54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr
540
- oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1
541
- Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui
542
- GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w
543
- HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD
544
- AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT
545
- RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw
546
- HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt
547
- ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph
548
- iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
549
- eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr
550
- mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj
551
- ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
552
- -----END CERTIFICATE-----
553
-
554
- AddTrust External Root
555
- ======================
556
- -----BEGIN CERTIFICATE-----
557
- MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
558
- QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD
559
- VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw
560
- NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU
561
- cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg
562
- Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821
563
- +iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw
564
- Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo
565
- aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy
566
- 2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7
567
- 7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P
568
- BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL
569
- VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk
570
- VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB
571
- IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl
572
- j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
573
- 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355
574
- e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u
575
- G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
576
- -----END CERTIFICATE-----
577
-
578
- AddTrust Public Services Root
579
- =============================
580
- -----BEGIN CERTIFICATE-----
581
- MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
582
- QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU
583
- cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ
584
- BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l
585
- dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF
586
- AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu
587
- nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i
588
- d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG
589
- Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw
590
- HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G
591
- A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
592
- /zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux
593
- FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G
594
- A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4
595
- JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL
596
- +YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao
597
- GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9
598
- Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H
599
- EufOX1362KqxMy3ZdvJOOjMMK7MtkAY=
600
- -----END CERTIFICATE-----
601
-
602
- AddTrust Qualified Certificates Root
603
- ====================================
604
- -----BEGIN CERTIFICATE-----
605
- MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
606
- QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU
607
- cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx
608
- CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ
609
- IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG
610
- 9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx
611
- 64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3
612
- KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o
613
- L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR
614
- wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU
615
- MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/
616
- BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE
617
- BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y
618
- azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD
619
- ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG
620
- GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X
621
- dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze
622
- RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB
623
- iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE=
624
- -----END CERTIFICATE-----
625
-
626
- Entrust Root Certification Authority
627
- ====================================
628
- -----BEGIN CERTIFICATE-----
629
- MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV
630
- BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw
631
- b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG
632
- A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0
633
- MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu
634
- MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu
635
- Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v
636
- dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
637
- ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz
638
- A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww
639
- Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68
640
- j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN
641
- rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw
642
- DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1
643
- MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH
644
- hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
645
- A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM
646
- Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa
647
- v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS
648
- W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0
649
- tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8
650
- -----END CERTIFICATE-----
651
-
652
- RSA Security 2048 v3
653
- ====================
654
- -----BEGIN CERTIFICATE-----
655
- MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK
656
- ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy
657
- MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb
658
- BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
659
- AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7
660
- Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb
661
- WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH
662
- KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP
663
- +Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/
664
- MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E
665
- FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY
666
- v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj
667
- 0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj
668
- VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395
669
- nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA
670
- pKnXwiJPZ9d37CAFYd4=
671
- -----END CERTIFICATE-----
672
-
673
- GeoTrust Global CA
674
- ==================
675
- -----BEGIN CERTIFICATE-----
676
- MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
677
- Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw
678
- MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
679
- LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
680
- CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo
681
- BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet
682
- 8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc
683
- T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU
684
- vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD
685
- AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk
686
- DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q
687
- zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4
688
- d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2
689
- mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p
690
- XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm
691
- Mw==
692
- -----END CERTIFICATE-----
693
-
694
- GeoTrust Global CA 2
695
- ====================
696
- -----BEGIN CERTIFICATE-----
697
- MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
698
- R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw
699
- MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
700
- LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
701
- ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/
702
- NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k
703
- LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA
704
- Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b
705
- HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF
706
- MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH
707
- K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7
708
- srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh
709
- ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL
710
- OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC
711
- x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF
712
- H4z1Ir+rzoPz4iIprn2DQKi6bA==
713
- -----END CERTIFICATE-----
714
-
715
- GeoTrust Universal CA
716
- =====================
717
- -----BEGIN CERTIFICATE-----
718
- MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
719
- R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1
720
- MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu
721
- Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
722
- ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t
723
- JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e
724
- RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs
725
- 7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d
726
- 8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V
727
- qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga
728
- Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB
729
- Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu
730
- KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08
731
- ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0
732
- XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB
733
- hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
734
- aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2
735
- qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL
736
- oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK
737
- xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF
738
- KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2
739
- DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK
740
- xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU
741
- p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI
742
- P/rmMuGNG2+k5o7Y+SlIis5z/iw=
743
- -----END CERTIFICATE-----
744
-
745
- GeoTrust Universal CA 2
746
- =======================
747
- -----BEGIN CERTIFICATE-----
748
- MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
749
- R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0
750
- MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg
751
- SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA
752
- A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0
753
- DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17
754
- j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q
755
- JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a
756
- QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2
757
- WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP
758
- 20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn
759
- ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC
760
- SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG
761
- 8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2
762
- +/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E
763
- BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
764
- dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ
765
- 4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+
766
- mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq
767
- A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg
768
- Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP
769
- pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d
770
- FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp
771
- gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm
772
- X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
773
- -----END CERTIFICATE-----
774
-
775
- UTN-USER First-Network Applications
776
- ===================================
777
- -----BEGIN CERTIFICATE-----
778
- MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCBozELMAkGA1UE
779
- BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
780
- IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzAp
781
- BgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5
782
- WhcNMTkwNzA5MTg1NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5T
783
- YWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
784
- dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBB
785
- cHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCz+5Gh5DZVhawGNFug
786
- mliy+LUPBXeDrjKxdpJo7CNKyXY/45y2N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4Cj
787
- DUeJT1FxL+78P/m4FoCHiZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXu
788
- Ozr0hAReYFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1axwi
789
- P8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6gyN7igEL66S/ozjIE
790
- j3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8w
791
- HQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPhahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9j
792
- cmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0G
793
- CSqGSIb3DQEBBQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y
794
- IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6LzsQCv4AdRWOOTK
795
- RIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4ZSfP1FMa8Kxun08FDAOBp4Qp
796
- xFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qMYEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAq
797
- DbUMo2s/rn9X9R+WfN9v3YIwLGUbQErNaLly7HF27FSOH4UMAWr6pjisH8SE
798
- -----END CERTIFICATE-----
799
-
800
- America Online Root Certification Authority 1
801
- =============================================
802
- -----BEGIN CERTIFICATE-----
803
- MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
804
- QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp
805
- Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG
806
- A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg
807
- T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD
808
- ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG
809
- v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z
810
- DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh
811
- sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP
812
- 8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T
813
- AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z
814
- o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf
815
- GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF
816
- VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft
817
- 3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g
818
- Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds
819
- sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7
820
- -----END CERTIFICATE-----
821
-
822
- America Online Root Certification Authority 2
823
- =============================================
824
- -----BEGIN CERTIFICATE-----
825
- MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
826
- QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp
827
- Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG
828
- A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg
829
- T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD
830
- ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en
831
- fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8
832
- f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO
833
- qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN
834
- RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0
835
- gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn
836
- 6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid
837
- FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6
838
- Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj
839
- B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op
840
- aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE
841
- AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY
842
- T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p
843
- +DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg
844
- JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy
845
- zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO
846
- ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh
847
- 1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf
848
- GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff
849
- Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP
850
- cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk=
851
- -----END CERTIFICATE-----
852
-
853
- Visa eCommerce Root
854
- ===================
855
- -----BEGIN CERTIFICATE-----
856
- MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG
857
- EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug
858
- QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2
859
- WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm
860
- VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
861
- bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL
862
- F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b
863
- RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0
864
- TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI
865
- /k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs
866
- GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG
867
- MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc
868
- CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW
869
- YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz
870
- zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu
871
- YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
872
- 398znM/jra6O1I7mT1GvFpLgXPYHDw==
873
- -----END CERTIFICATE-----
874
-
875
- Certum Root CA
876
- ==============
877
- -----BEGIN CERTIFICATE-----
878
- MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK
879
- ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla
880
- Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u
881
- by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x
882
- wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL
883
- kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ
884
- 89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K
885
- Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P
886
- NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq
887
- hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+
888
- GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg
889
- GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/
890
- 0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS
891
- qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw==
892
- -----END CERTIFICATE-----
893
-
894
- Comodo AAA Services root
895
- ========================
896
- -----BEGIN CERTIFICATE-----
897
- MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
898
- R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
899
- TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw
900
- MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl
901
- c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
902
- BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
903
- ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG
904
- C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs
905
- i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW
906
- Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH
907
- Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK
908
- Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f
909
- BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl
910
- cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz
911
- LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm
912
- 7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
913
- Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z
914
- 8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C
915
- 12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
916
- -----END CERTIFICATE-----
917
-
918
- Comodo Secure Services root
919
- ===========================
920
- -----BEGIN CERTIFICATE-----
921
- MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
922
- R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
923
- TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw
924
- MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu
925
- Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi
926
- BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
927
- ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP
928
- 9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc
929
- rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC
930
- oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V
931
- p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E
932
- FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w
933
- gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj
934
- YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm
935
- aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm
936
- 4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj
937
- Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL
938
- DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw
939
- pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H
940
- RR3B7Hzs/Sk=
941
- -----END CERTIFICATE-----
942
-
943
- Comodo Trusted Services root
944
- ============================
945
- -----BEGIN CERTIFICATE-----
946
- MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
947
- R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
948
- TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw
949
- MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h
950
- bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw
951
- IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC
952
- AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7
953
- 3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y
954
- /9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6
955
- juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS
956
- ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud
957
- DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
958
- /zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp
959
- ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl
960
- cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw
961
- uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32
962
- pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA
963
- BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l
964
- R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O
965
- 9y5Xt5hwXsjEeLBi
966
- -----END CERTIFICATE-----
967
-
968
- QuoVadis Root CA
969
- ================
970
- -----BEGIN CERTIFICATE-----
971
- MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE
972
- ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
973
- eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz
974
- MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp
975
- cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD
976
- EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
977
- AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk
978
- J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL
979
- F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL
980
- YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen
981
- AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w
982
- PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y
983
- ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7
984
- MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj
985
- YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs
986
- ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
987
- Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW
988
- Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu
989
- BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw
990
- FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0
991
- aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6
992
- tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo
993
- fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul
994
- LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x
995
- gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi
996
- 5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi
997
- 5nrQNiOKSnQ2+Q==
998
- -----END CERTIFICATE-----
999
-
1000
- QuoVadis Root CA 2
1001
- ==================
1002
- -----BEGIN CERTIFICATE-----
1003
- MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
1004
- EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx
1005
- ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
1006
- aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC
1007
- DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6
1008
- XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk
1009
- lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB
1010
- lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy
1011
- lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt
1012
- 66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn
1013
- wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh
1014
- D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy
1015
- BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie
1016
- J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud
1017
- DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU
1018
- a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
1019
- ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv
1020
- Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3
1021
- UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm
1022
- VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK
1023
- +JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW
1024
- IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1
1025
- WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X
1026
- f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II
1027
- 4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8
1028
- VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
1029
- -----END CERTIFICATE-----
1030
-
1031
- QuoVadis Root CA 3
1032
- ==================
1033
- -----BEGIN CERTIFICATE-----
1034
- MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
1035
- EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx
1036
- OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
1037
- aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
1038
- DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg
1039
- DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij
1040
- KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K
1041
- DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv
1042
- BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp
1043
- p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8
1044
- nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX
1045
- MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM
1046
- Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz
1047
- uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT
1048
- BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj
1049
- YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
1050
- aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB
1051
- BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD
1052
- VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4
1053
- ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE
1054
- AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV
1055
- qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s
1056
- hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z
1057
- POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2
1058
- Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp
1059
- 8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC
1060
- bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu
1061
- g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p
1062
- vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr
1063
- qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=
1064
- -----END CERTIFICATE-----
1065
-
1066
- Security Communication Root CA
1067
- ==============================
1068
- -----BEGIN CERTIFICATE-----
1069
- MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
1070
- U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
1071
- HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
1072
- U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
1073
- ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw
1074
- 8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM
1075
- DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX
1076
- 5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd
1077
- DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2
1078
- JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw
1079
- DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g
1080
- 0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a
1081
- mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ
1082
- s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ
1083
- 6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi
1084
- FL39vmwLAw==
1085
- -----END CERTIFICATE-----
1086
-
1087
- Sonera Class 1 Root CA
1088
- ======================
1089
- -----BEGIN CERTIFICATE-----
1090
- MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
1091
- U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAxMDQwNjEwNDkxM1oXDTIxMDQw
1092
- NjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
1093
- IENsYXNzMSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H88
1094
- 7dF+2rDNbS82rDTG29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9
1095
- EJUkoVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk3w0LBUXl
1096
- 0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBLqdReLjVQCfOAl/QMF645
1097
- 2F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIINnvmLVz5MxxftLItyM19yejhW1ebZrgUa
1098
- HXVFsculJRwSVzb9IjcCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZT
1099
- iFIwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE9
1100
- 28Jj2VuXZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0HDjxV
1101
- yhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VOTzF2nBBhjrZTOqMR
1102
- vq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2UvkVrCqIexVmiUefkl98HVrhq4uz2P
1103
- qYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4wzMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9Z
1104
- IRlXvVWa
1105
- -----END CERTIFICATE-----
1106
-
1107
- Sonera Class 2 Root CA
1108
- ======================
1109
- -----BEGIN CERTIFICATE-----
1110
- MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
1111
- U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw
1112
- NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
1113
- IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3
1114
- /Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT
1115
- dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG
1116
- f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P
1117
- tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH
1118
- nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT
1119
- XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt
1120
- 0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI
1121
- cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph
1122
- Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx
1123
- EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH
1124
- llpwrN9M
1125
- -----END CERTIFICATE-----
1126
-
1127
- Staat der Nederlanden Root CA
1128
- =============================
1129
- -----BEGIN CERTIFICATE-----
1130
- MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE
1131
- ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g
1132
- Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w
1133
- HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh
1134
- bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt
1135
- vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P
1136
- jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca
1137
- C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth
1138
- vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6
1139
- 22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV
1140
- HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v
1141
- dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN
1142
- BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR
1143
- EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw
1144
- MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y
1145
- nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR
1146
- iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw==
1147
- -----END CERTIFICATE-----
1148
-
1149
- TDC Internet Root CA
1150
- ====================
1151
- -----BEGIN CERTIFICATE-----
1152
- MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE
1153
- ChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx
1154
- NjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu
1155
- ZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
1156
- MIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j
1157
- xsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL
1158
- znWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc
1159
- 5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6
1160
- otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI
1161
- AYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM
1162
- VERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM
1163
- MTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC
1164
- AQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe
1165
- UAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G
1166
- CSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m
1167
- gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+
1168
- 2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb
1169
- O0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU
1170
- Cbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l
1171
- -----END CERTIFICATE-----
1172
-
1173
- TDC OCES Root CA
1174
- ================
1175
- -----BEGIN CERTIFICATE-----
1176
- MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJESzEMMAoGA1UE
1177
- ChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEwODM5MzBaFw0zNzAyMTEwOTA5
1178
- MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNUREMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIB
1179
- IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuH
1180
- nEz9pPPEXyG9VhDr2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0
1181
- zY0s2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItUGBxIYXvV
1182
- iGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKjdGqPqcNiKXEx5TukYBde
1183
- dObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+rTpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO
1184
- 3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB
1185
- 5DCB4TCB3gYIKoFQgSkBAQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5k
1186
- ay9yZXBvc2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRlciBm
1187
- cmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4xLiBDZXJ0aWZp
1188
- Y2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4x
1189
- LjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1UdHwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEM
1190
- MAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYm
1191
- aHR0cDovL2NybC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy
1192
- MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZJ2cdUBVLc647
1193
- +RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6
1194
- NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACromJkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4
1195
- A9G28kNBKWKnctj7fAXmMXAnVBhOinxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYsc
1196
- A+UYyAFMP8uXBV2YcaaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9
1197
- AOoBmbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQYqbsFbS1
1198
- AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9BKNDLdr8C2LqL19iUw==
1199
- -----END CERTIFICATE-----
1200
-
1201
- UTN DATACorp SGC Root CA
1202
- ========================
1203
- -----BEGIN CERTIFICATE-----
1204
- MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE
1205
- BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
1206
- IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ
1207
- BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa
1208
- MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w
1209
- HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy
1210
- dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC
1211
- AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys
1212
- raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo
1213
- wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA
1214
- 9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv
1215
- 33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud
1216
- DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9
1217
- BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD
1218
- LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3
1219
- DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft
1220
- Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0
1221
- I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx
1222
- EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP
1223
- DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI
1224
- -----END CERTIFICATE-----
1225
-
1226
- UTN USERFirst Email Root CA
1227
- ===========================
1228
- -----BEGIN CERTIFICATE-----
1229
- MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE
1230
- BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
1231
- IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0
1232
- BgNVBAMTLVVUTi1VU0VSRmlyc3QtQ2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05
1233
- OTA3MDkxNzI4NTBaFw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQx
1234
- FzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsx
1235
- ITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UEAxMtVVROLVVTRVJGaXJz
1236
- dC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWlsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
1237
- MIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3BYHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIx
1238
- B8dOtINknS4p1aJkxIW9hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8
1239
- om+rWV6lL8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLmSGHG
1240
- TPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM1tZUOt4KpLoDd7Nl
1241
- yP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws6wIDAQABo4G5MIG2MAsGA1UdDwQE
1242
- AwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNV
1243
- HR8EUTBPME2gS6BJhkdodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGll
1244
- bnRBdXRoZW50aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH
1245
- AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u7mFVbwQ+zzne
1246
- xRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0xtcgBEXkzYABurorbs6q15L+
1247
- 5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQrfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarV
1248
- NZ1yQAOJujEdxRBoUp7fooXFXAimeOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZ
1249
- w7JHpsIyYdfHb0gkUSeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ=
1250
- -----END CERTIFICATE-----
1251
-
1252
- UTN USERFirst Hardware Root CA
1253
- ==============================
1254
- -----BEGIN CERTIFICATE-----
1255
- MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE
1256
- BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
1257
- IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd
1258
- BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx
1259
- OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0
1260
- eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz
1261
- ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3
1262
- DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI
1263
- wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd
1264
- tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8
1265
- i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf
1266
- Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw
1267
- gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF
1268
- lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF
1269
- UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF
1270
- BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
1271
- //bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW
1272
- XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2
1273
- lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn
1274
- iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67
1275
- nfhmqA==
1276
- -----END CERTIFICATE-----
1277
-
1278
- UTN USERFirst Object Root CA
1279
- ============================
1280
- -----BEGIN CERTIFICATE-----
1281
- MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UE
1282
- BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
1283
- IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAb
1284
- BgNVBAMTFFVUTi1VU0VSRmlyc3QtT2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4NDAz
1285
- NlowgZUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkx
1286
- HjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3dy51c2Vy
1287
- dHJ1c3QuY29tMR0wGwYDVQQDExRVVE4tVVNFUkZpcnN0LU9iamVjdDCCASIwDQYJKoZIhvcNAQEB
1288
- BQADggEPADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicPHxzfOpuCaDDASmEd8S8O+r5596Uj71VR
1289
- loTN2+O5bj4x2AogZ8f02b+U60cEPgLOKqJdhwQJ9jCdGIqXsqoc/EHSoTbL+z2RuufZcDX65OeQ
1290
- w5ujm9M89RKZd7G3CeBo5hy485RjiGpq/gt2yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vu
1291
- lBe3/IW+pKvEHDHd17bR5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehbkkj7
1292
- RwvCbNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUCAwEAAaOBrzCBrDAL
1293
- BgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU2u1kdBScFDyr3ZmpvVsoTYs8
1294
- ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmly
1295
- c3QtT2JqZWN0LmNybDApBgNVHSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQw
1296
- DQYJKoZIhvcNAQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXFwfNfLEzIR1pp6ujw
1297
- NTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T7/yxSPlrJSUtUbYsbUXBmMiKVl0+7kNO
1298
- PmsnjtA6S4ULX9Ptaqd1y9Fahy85dRNacrACgZ++8A+EVCBibGnU4U3GDZlDAQ0Slox4nb9QorFE
1299
- qmrPF3rPbw/U+CRVX/A0FklmPlBGyWNxODFiuGK581OtbLUrohKqGU8J2l7nk8aOFAj+8DCAGKCG
1300
- hU3IfdeLA/5u1fedFqySLKAj5ZyRUh+U3xeUc8OzwcFxBSAAeL0TUh2oPs0AH8g=
1301
- -----END CERTIFICATE-----
1302
-
1303
- Camerfirma Chambers of Commerce Root
1304
- ====================================
1305
- -----BEGIN CERTIFICATE-----
1306
- MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
1307
- QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
1308
- ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx
1309
- NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp
1310
- cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn
1311
- MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC
1312
- AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU
1313
- xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH
1314
- NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW
1315
- DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV
1316
- d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud
1317
- EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v
1318
- cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P
1319
- AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh
1320
- bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD
1321
- VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz
1322
- aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi
1323
- fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD
1324
- L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN
1325
- UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n
1326
- ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1
1327
- erfutGWaIZDgqtCYvDi1czyL+Nw=
1328
- -----END CERTIFICATE-----
1329
-
1330
- Camerfirma Global Chambersign Root
1331
- ==================================
1332
- -----BEGIN CERTIFICATE-----
1333
- MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
1334
- QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
1335
- ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx
1336
- NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt
1337
- YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg
1338
- MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw
1339
- ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J
1340
- 1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O
1341
- by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl
1342
- 6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c
1343
- 8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/
1344
- BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j
1345
- aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B
1346
- Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj
1347
- aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y
1348
- ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh
1349
- bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA
1350
- PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y
1351
- gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ
1352
- PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4
1353
- IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes
1354
- t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==
1355
- -----END CERTIFICATE-----
1356
-
1357
- NetLock Qualified (Class QA) Root
1358
- =================================
1359
- -----BEGIN CERTIFICATE-----
1360
- MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUxETAPBgNVBAcT
1361
- CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
1362
- BAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQDEzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVn
1363
- eXpvaSAoQ2xhc3MgUUEpIFRhbnVzaXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0
1364
- bG9jay5odTAeFw0wMzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTER
1365
- MA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNhZ2kgS2Z0
1366
- LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5ldExvY2sgTWlub3NpdGV0
1367
- dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZhbnlraWFkbzEeMBwGCSqGSIb3DQEJARYP
1368
- aW5mb0BuZXRsb2NrLmh1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRV
1369
- CacbvWy5FPSKAtt2/GoqeKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e
1370
- 8ia6AFQer7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO53Lhb
1371
- m+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWdvLrqOU+L73Sa58XQ
1372
- 0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0lmT+1fMptsK6ZmfoIYOcZwvK9UdPM
1373
- 0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4ICwDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV
1374
- HQ8BAf8EBAMCAQYwggJ1BglghkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2
1375
- YW55IGEgTmV0TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh
1376
- biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQgZWxla3Ryb25p
1377
- a3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywgdmFsYW1pbnQgZWxmb2dhZGFz
1378
- YW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwg
1379
- YXogQWx0YWxhbm9zIFN6ZXJ6b2Rlc2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kg
1380
- ZWxqYXJhcyBtZWd0ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczov
1381
- L3d3dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0BuZXRsb2Nr
1382
- Lm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0
1383
- aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMg
1384
- YXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0
1385
- IGluZm9AbmV0bG9jay5uZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3
1386
- DQEBBQUAA4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQMznN
1387
- wNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+NFAwLvt/MpqNPfMg
1388
- W/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCRVCHnpgu0mfVRQdzNo0ci2ccBgcTc
1389
- R08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR
1390
- 5qq5aKrN9p2QdRLqOBrKROi3macqaJVmlaut74nLYKkGEsaUR+ko
1391
- -----END CERTIFICATE-----
1392
-
1393
- NetLock Notary (Class A) Root
1394
- =============================
1395
- -----BEGIN CERTIFICATE-----
1396
- MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI
1397
- EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6
1398
- dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j
1399
- ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX
1400
- DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH
1401
- EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD
1402
- VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz
1403
- cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM
1404
- D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ
1405
- z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC
1406
- /tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7
1407
- tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6
1408
- 4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG
1409
- A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC
1410
- Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv
1411
- bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu
1412
- IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn
1413
- LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0
1414
- ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz
1415
- IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh
1416
- IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu
1417
- b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh
1418
- bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg
1419
- Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp
1420
- bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5
1421
- ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP
1422
- ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB
1423
- CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr
1424
- KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM
1425
- 8CgHrTwXZoi1/baI
1426
- -----END CERTIFICATE-----
1427
-
1428
- NetLock Business (Class B) Root
1429
- ===============================
1430
- -----BEGIN CERTIFICATE-----
1431
- MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT
1432
- CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
1433
- BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg
1434
- VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD
1435
- VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv
1436
- bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg
1437
- VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
1438
- iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S
1439
- o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr
1440
- 1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV
1441
- HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ
1442
- RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh
1443
- dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0
1444
- ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv
1445
- c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg
1446
- YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh
1447
- c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz
1448
- Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA
1449
- bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl
1450
- IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2
1451
- YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj
1452
- cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM
1453
- 43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR
1454
- stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI
1455
- -----END CERTIFICATE-----
1456
-
1457
- NetLock Express (Class C) Root
1458
- ==============================
1459
- -----BEGIN CERTIFICATE-----
1460
- MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT
1461
- CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
1462
- BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD
1463
- KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ
1464
- BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6
1465
- dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j
1466
- ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB
1467
- jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z
1468
- W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63
1469
- euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw
1470
- DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN
1471
- RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn
1472
- YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB
1473
- IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i
1474
- aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0
1475
- ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs
1476
- ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo
1477
- dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y
1478
- emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k
1479
- IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ
1480
- UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg
1481
- YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2
1482
- xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW
1483
- gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A==
1484
- -----END CERTIFICATE-----
1485
-
1486
- XRamp Global CA Root
1487
- ====================
1488
- -----BEGIN CERTIFICATE-----
1489
- MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE
1490
- BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj
1491
- dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
1492
- dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx
1493
- HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg
1494
- U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
1495
- dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu
1496
- IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx
1497
- foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE
1498
- zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs
1499
- AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry
1500
- xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
1501
- EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap
1502
- oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC
1503
- AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc
1504
- /Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
1505
- qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n
1506
- nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz
1507
- 8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=
1508
- -----END CERTIFICATE-----
1509
-
1510
- Go Daddy Class 2 CA
1511
- ===================
1512
- -----BEGIN CERTIFICATE-----
1513
- MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY
1514
- VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp
1515
- ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG
1516
- A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
1517
- RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD
1518
- ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
1519
- 2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32
1520
- qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j
1521
- YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY
1522
- vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O
1523
- BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o
1524
- atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu
1525
- MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG
1526
- A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim
1527
- PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt
1528
- I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
1529
- HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI
1530
- Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b
1531
- vZ8=
1532
- -----END CERTIFICATE-----
1533
-
1534
- Starfield Class 2 CA
1535
- ====================
1536
- -----BEGIN CERTIFICATE-----
1537
- MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc
1538
- U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg
1539
- Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo
1540
- MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG
1541
- A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG
1542
- SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY
1543
- bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ
1544
- JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm
1545
- epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN
1546
- F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF
1547
- MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f
1548
- hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo
1549
- bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g
1550
- QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs
1551
- afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM
1552
- PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
1553
- xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD
1554
- KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3
1555
- QBFGmh95DmK/D5fs4C8fF5Q=
1556
- -----END CERTIFICATE-----
1557
-
1558
- StartCom Certification Authority
1559
- ================================
1560
- -----BEGIN CERTIFICATE-----
1561
- MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
1562
- U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
1563
- ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
1564
- NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
1565
- LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
1566
- U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
1567
- ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
1568
- o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
1569
- Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
1570
- eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
1571
- 2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
1572
- 6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
1573
- osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
1574
- untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
1575
- UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
1576
- 37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
1577
- FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0
1578
- Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj
1579
- YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH
1580
- AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw
1581
- Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg
1582
- U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5
1583
- LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl
1584
- cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh
1585
- cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT
1586
- dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC
1587
- AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh
1588
- 3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm
1589
- vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk
1590
- fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3
1591
- fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ
1592
- EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
1593
- yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl
1594
- 1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/
1595
- lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro
1596
- g14=
1597
- -----END CERTIFICATE-----
1598
-
1599
- Taiwan GRCA
1600
- ===========
1601
- -----BEGIN CERTIFICATE-----
1602
- MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG
1603
- EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X
1604
- DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv
1605
- dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD
1606
- ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN
1607
- w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5
1608
- BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O
1609
- 1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO
1610
- htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov
1611
- J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7
1612
- Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t
1613
- B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB
1614
- O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8
1615
- lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV
1616
- HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2
1617
- 09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ
1618
- TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj
1619
- Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2
1620
- Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU
1621
- D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz
1622
- DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk
1623
- Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk
1624
- 7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ
1625
- CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy
1626
- +fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS
1627
- -----END CERTIFICATE-----
1628
-
1629
- Firmaprofesional Root CA
1630
- ========================
1631
- -----BEGIN CERTIFICATE-----
1632
- MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMxIjAgBgNVBAcT
1633
- GUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZp
1634
- Y2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FA
1635
- ZmlybWFwcm9mZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTEL
1636
- MAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMT
1637
- OUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2
1638
- ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEB
1639
- AQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5V
1640
- j1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJH
1641
- lShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf
1642
- 3H5idPayBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8
1643
- NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMBAAGjgZ8wgZww
1644
- KgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lvbmFsLmNvbTASBgNVHRMBAf8ECDAG
1645
- AQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1Ud
1646
- DwEB/wQEAwIBBjAdBgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD
1647
- ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq
1648
- u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36mhoEyIwOdyPdf
1649
- wUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm
1650
- 7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YG
1651
- VM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA=
1652
- -----END CERTIFICATE-----
1653
-
1654
- Wells Fargo Root CA
1655
- ===================
1656
- -----BEGIN CERTIFICATE-----
1657
- MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV
1658
- BAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv
1659
- cml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
1660
- MDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl
1661
- bGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv
1662
- MC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG
1663
- SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX
1664
- x3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3
1665
- E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5
1666
- OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j
1667
- sNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj
1668
- YTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF
1669
- BwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD
1670
- ggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv
1671
- m+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R
1672
- OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx
1673
- x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023
1674
- tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s=
1675
- -----END CERTIFICATE-----
1676
-
1677
- Swisscom Root CA 1
1678
- ==================
1679
- -----BEGIN CERTIFICATE-----
1680
- MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG
1681
- EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy
1682
- dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4
1683
- MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln
1684
- aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC
1685
- IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM
1686
- MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF
1687
- NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe
1688
- AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC
1689
- b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn
1690
- 7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN
1691
- cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp
1692
- WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5
1693
- haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY
1694
- MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw
1695
- HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j
1696
- BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9
1697
- MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn
1698
- jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ
1699
- MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H
1700
- VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl
1701
- vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl
1702
- OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3
1703
- 1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq
1704
- nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy
1705
- x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW
1706
- NY6E0F/6MBr1mmz0DlP5OlvRHA==
1707
- -----END CERTIFICATE-----
1708
-
1709
- DigiCert Assured ID Root CA
1710
- ===========================
1711
- -----BEGIN CERTIFICATE-----
1712
- MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG
1713
- EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
1714
- IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx
1715
- MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
1716
- ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew
1717
- ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO
1718
- 9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy
1719
- UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW
1720
- /lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy
1721
- oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf
1722
- GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF
1723
- 66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq
1724
- hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc
1725
- EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn
1726
- SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i
1727
- 8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
1728
- +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
1729
- -----END CERTIFICATE-----
1730
-
1731
- DigiCert Global Root CA
1732
- =======================
1733
- -----BEGIN CERTIFICATE-----
1734
- MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG
1735
- EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
1736
- HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw
1737
- MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
1738
- dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq
1739
- hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn
1740
- TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5
1741
- BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H
1742
- 4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y
1743
- 7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB
1744
- o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm
1745
- 8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF
1746
- BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr
1747
- EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt
1748
- tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886
1749
- UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
1750
- CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
1751
- -----END CERTIFICATE-----
1752
-
1753
- DigiCert High Assurance EV Root CA
1754
- ==================================
1755
- -----BEGIN CERTIFICATE-----
1756
- MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
1757
- EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
1758
- KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
1759
- MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
1760
- MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
1761
- Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
1762
- Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
1763
- OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
1764
- MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
1765
- NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
1766
- h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
1767
- Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
1768
- JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
1769
- V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
1770
- myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
1771
- mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
1772
- vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
1773
- -----END CERTIFICATE-----
1774
-
1775
- Certplus Class 2 Primary CA
1776
- ===========================
1777
- -----BEGIN CERTIFICATE-----
1778
- MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE
1779
- BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN
1780
- OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy
1781
- dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP
1782
- ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR
1783
- 5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ
1784
- Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO
1785
- YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e
1786
- e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME
1787
- CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ
1788
- YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t
1789
- L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD
1790
- P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R
1791
- TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+
1792
- 7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW
1793
- //1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
1794
- l7+ijrRU
1795
- -----END CERTIFICATE-----
1796
-
1797
- DST Root CA X3
1798
- ==============
1799
- -----BEGIN CERTIFICATE-----
1800
- MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK
1801
- ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X
1802
- DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1
1803
- cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD
1804
- ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT
1805
- rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9
1806
- UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy
1807
- xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d
1808
- utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T
1809
- AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ
1810
- MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug
1811
- dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE
1812
- GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw
1813
- RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS
1814
- fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
1815
- -----END CERTIFICATE-----
1816
-
1817
- DST ACES CA X6
1818
- ==============
1819
- -----BEGIN CERTIFICATE-----
1820
- MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG
1821
- EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT
1822
- MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha
1823
- MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE
1824
- CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC
1825
- AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI
1826
- DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa
1827
- pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow
1828
- GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy
1829
- MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud
1830
- EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu
1831
- Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy
1832
- dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU
1833
- CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2
1834
- 5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t
1835
- Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq
1836
- nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs
1837
- vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3
1838
- oKfN5XozNmr6mis=
1839
- -----END CERTIFICATE-----
1840
-
1841
- TURKTRUST Certificate Services Provider Root 1
1842
- ==============================================
1843
- -----BEGIN CERTIFICATE-----
1844
- MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF
1845
- bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP
1846
- MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0
1847
- acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx
1848
- MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg
1849
- U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB
1850
- TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC
1851
- aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC
1852
- AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX
1853
- yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i
1854
- Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ
1855
- 8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4
1856
- W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME
1857
- BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46
1858
- sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE
1859
- q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy
1860
- B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY
1861
- nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H
1862
- -----END CERTIFICATE-----
1863
-
1864
- TURKTRUST Certificate Services Provider Root 2
1865
- ==============================================
1866
- -----BEGIN CERTIFICATE-----
1867
- MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF
1868
- bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP
1869
- MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
1870
- QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN
1871
- MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr
1872
- dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G
1873
- A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls
1874
- acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G
1875
- CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe
1876
- LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI
1877
- x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g
1878
- QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr
1879
- 5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB
1880
- AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G
1881
- A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt
1882
- Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4
1883
- Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+
1884
- hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P
1885
- 9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5
1886
- UrbnBEI=
1887
- -----END CERTIFICATE-----
1888
-
1889
- SwissSign Platinum CA - G2
1890
- ==========================
1891
- -----BEGIN CERTIFICATE-----
1892
- MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UEBhMCQ0gxFTAT
1893
- BgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWduIFBsYXRpbnVtIENBIC0gRzIw
1894
- HhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAwWjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMM
1895
- U3dpc3NTaWduIEFHMSMwIQYDVQQDExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJ
1896
- KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu
1897
- 669yIIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2HtnIuJpX+UF
1898
- eNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+6ixuEFGSzH7VozPY1kne
1899
- WCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5objM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIo
1900
- j5+saCB9bzuohTEJfwvH6GXp43gOCWcwizSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/6
1901
- 8++QHkwFix7qepF6w9fl+zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34T
1902
- aNhxKFrYzt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaPpZjy
1903
- domyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtFKwH3HBqi7Ri6Cr2D
1904
- +m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuWae5ogObnmLo2t/5u7Su9IPhlGdpV
1905
- CX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMBAAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud
1906
- EwEB/wQFMAMBAf8wHQYDVR0OBBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCv
1907
- zAeHFUdvOMW0ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW
1908
- IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUAA4ICAQAIhab1
1909
- Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0uMoI3LQwnkAHFmtllXcBrqS3
1910
- NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4
1911
- U99REJNi54Av4tHgvI42Rncz7Lj7jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8
1912
- KV2LwUvJ4ooTHbG/u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl
1913
- 9x8DYSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1puEa+S1B
1914
- aYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXaicYwu+uPyyIIoK6q8QNs
1915
- OktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbGDI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSY
1916
- Mdp08YSTcU1f+2BY0fvEwW2JorsgH51xkcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAci
1917
- IfNAChs0B0QTwoRqjt8ZWr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g==
1918
- -----END CERTIFICATE-----
1919
-
1920
- SwissSign Gold CA - G2
1921
- ======================
1922
- -----BEGIN CERTIFICATE-----
1923
- MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw
1924
- EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN
1925
- MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp
1926
- c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B
1927
- AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq
1928
- t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C
1929
- jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg
1930
- vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF
1931
- ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR
1932
- AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend
1933
- jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO
1934
- peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR
1935
- 7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi
1936
- GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw
1937
- AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64
1938
- OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
1939
- L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm
1940
- 5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr
1941
- 44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf
1942
- Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m
1943
- Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp
1944
- mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk
1945
- vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf
1946
- KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br
1947
- NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj
1948
- viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
1949
- -----END CERTIFICATE-----
1950
-
1951
- SwissSign Silver CA - G2
1952
- ========================
1953
- -----BEGIN CERTIFICATE-----
1954
- MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT
1955
- BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X
1956
- DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3
1957
- aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG
1958
- 9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644
1959
- N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm
1960
- +/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH
1961
- 6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu
1962
- MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h
1963
- qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5
1964
- FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs
1965
- ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc
1966
- celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X
1967
- CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
1968
- BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB
1969
- tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0
1970
- cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P
1971
- 4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F
1972
- kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L
1973
- 3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx
1974
- /uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa
1975
- DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP
1976
- e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu
1977
- WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ
1978
- DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub
1979
- DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u
1980
- -----END CERTIFICATE-----
1981
-
1982
- GeoTrust Primary Certification Authority
1983
- ========================================
1984
- -----BEGIN CERTIFICATE-----
1985
- MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG
1986
- EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD
1987
- ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx
1988
- CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ
1989
- cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
1990
- CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN
1991
- b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9
1992
- nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge
1993
- RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt
1994
- tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
1995
- AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI
1996
- hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K
1997
- Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN
1998
- NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa
1999
- Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG
2000
- 1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
2001
- -----END CERTIFICATE-----
2002
-
2003
- thawte Primary Root CA
2004
- ======================
2005
- -----BEGIN CERTIFICATE-----
2006
- MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE
2007
- BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
2008
- aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
2009
- cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3
2010
- MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg
2011
- SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv
2012
- KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT
2013
- FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs
2014
- oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ
2015
- 1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc
2016
- q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K
2017
- aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p
2018
- afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD
2019
- VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF
2020
- AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE
2021
- uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
2022
- xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89
2023
- jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH
2024
- z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==
2025
- -----END CERTIFICATE-----
2026
-
2027
- VeriSign Class 3 Public Primary Certification Authority - G5
2028
- ============================================================
2029
- -----BEGIN CERTIFICATE-----
2030
- MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
2031
- BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
2032
- ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
2033
- IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp
2034
- ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB
2035
- yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln
2036
- biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh
2037
- dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt
2038
- YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
2039
- ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz
2040
- j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD
2041
- Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/
2042
- Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r
2043
- fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/
2044
- BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv
2045
- Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
2046
- aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
2047
- SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+
2048
- X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE
2049
- KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC
2050
- Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE
2051
- ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
2052
- -----END CERTIFICATE-----
2053
-
2054
- SecureTrust CA
2055
- ==============
2056
- -----BEGIN CERTIFICATE-----
2057
- MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG
2058
- EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy
2059
- dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe
2060
- BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC
2061
- ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX
2062
- OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t
2063
- DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH
2064
- GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b
2065
- 01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH
2066
- ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/
2067
- BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj
2068
- aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
2069
- KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu
2070
- SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf
2071
- mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ
2072
- nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
2073
- 3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
2074
- -----END CERTIFICATE-----
2075
-
2076
- Secure Global CA
2077
- ================
2078
- -----BEGIN CERTIFICATE-----
2079
- MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG
2080
- EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH
2081
- bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg
2082
- MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg
2083
- Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx
2084
- YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ
2085
- bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g
2086
- 8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV
2087
- HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi
2088
- 0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
2089
- EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn
2090
- oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA
2091
- MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+
2092
- OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn
2093
- CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5
2094
- 3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
2095
- f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
2096
- -----END CERTIFICATE-----
2097
-
2098
- COMODO Certification Authority
2099
- ==============================
2100
- -----BEGIN CERTIFICATE-----
2101
- MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE
2102
- BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
2103
- A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1
2104
- dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb
2105
- MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD
2106
- T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
2107
- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH
2108
- +7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww
2109
- xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV
2110
- 4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA
2111
- 1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI
2112
- rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E
2113
- BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k
2114
- b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC
2115
- AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP
2116
- OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
2117
- RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc
2118
- IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN
2119
- +8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==
2120
- -----END CERTIFICATE-----
2121
-
2122
- Network Solutions Certificate Authority
2123
- =======================================
2124
- -----BEGIN CERTIFICATE-----
2125
- MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG
2126
- EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr
2127
- IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx
2128
- MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
2129
- MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
2130
- CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx
2131
- jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT
2132
- aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT
2133
- crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc
2134
- /Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB
2135
- AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP
2136
- BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv
2137
- bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA
2138
- A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q
2139
- 4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/
2140
- GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
2141
- wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD
2142
- ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
2143
- -----END CERTIFICATE-----
2144
-
2145
- WellsSecure Public Root Certificate Authority
2146
- =============================================
2147
- -----BEGIN CERTIFICATE-----
2148
- MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM
2149
- F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw
2150
- NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
2151
- MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl
2152
- bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD
2153
- VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
2154
- CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1
2155
- iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13
2156
- i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8
2157
- bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB
2158
- K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB
2159
- AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu
2160
- cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm
2161
- lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB
2162
- i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww
2163
- GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg
2164
- Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI
2165
- K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0
2166
- bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj
2167
- qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es
2168
- E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ
2169
- tylv2G0xffX8oRAHh84vWdw+WNs=
2170
- -----END CERTIFICATE-----
2171
-
2172
- COMODO ECC Certification Authority
2173
- ==================================
2174
- -----BEGIN CERTIFICATE-----
2175
- MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC
2176
- R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
2177
- ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB
2178
- dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix
2179
- GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
2180
- Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo
2181
- b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X
2182
- 4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni
2183
- wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E
2184
- BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG
2185
- FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA
2186
- U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
2187
- -----END CERTIFICATE-----
2188
-
2189
- IGC/A
2190
- =====
2191
- -----BEGIN CERTIFICATE-----
2192
- MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD
2193
- VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE
2194
- Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy
2195
- MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI
2196
- EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT
2197
- STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB
2198
- IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2
2199
- TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW
2200
- So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy
2201
- HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd
2202
- frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ
2203
- tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB
2204
- egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC
2205
- iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK
2206
- q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q
2207
- MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg
2208
- Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI
2209
- lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF
2210
- 0mBWWg==
2211
- -----END CERTIFICATE-----
2212
-
2213
- Security Communication EV RootCA1
2214
- =================================
2215
- -----BEGIN CERTIFICATE-----
2216
- MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
2217
- U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh
2218
- dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE
2219
- BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl
2220
- Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
2221
- AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO
2222
- /VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX
2223
- WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z
2224
- ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4
2225
- bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK
2226
- 9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
2227
- SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm
2228
- iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG
2229
- Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW
2230
- mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW
2231
- T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490
2232
- -----END CERTIFICATE-----
2233
-
2234
- OISTE WISeKey Global Root GA CA
2235
- ===============================
2236
- -----BEGIN CERTIFICATE-----
2237
- MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE
2238
- BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG
2239
- A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH
2240
- bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD
2241
- VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw
2242
- IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5
2243
- IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9
2244
- Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg
2245
- Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD
2246
- d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ
2247
- /yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R
2248
- LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
2249
- AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
2250
- KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm
2251
- MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4
2252
- +vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
2253
- hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY
2254
- okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=
2255
- -----END CERTIFICATE-----
2256
-
2257
- S-TRUST Authentication and Encryption Root CA 2005 PN
2258
- =====================================================
2259
- -----BEGIN CERTIFICATE-----
2260
- MIIEezCCA2OgAwIBAgIQNxkY5lNUfBq1uMtZWts1tzANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE
2261
- BhMCREUxIDAeBgNVBAgTF0JhZGVuLVd1ZXJ0dGVtYmVyZyAoQlcpMRIwEAYDVQQHEwlTdHV0dGdh
2262
- cnQxKTAnBgNVBAoTIERldXRzY2hlciBTcGFya2Fzc2VuIFZlcmxhZyBHbWJIMT4wPAYDVQQDEzVT
2263
- LVRSVVNUIEF1dGhlbnRpY2F0aW9uIGFuZCBFbmNyeXB0aW9uIFJvb3QgQ0EgMjAwNTpQTjAeFw0w
2264
- NTA2MjIwMDAwMDBaFw0zMDA2MjEyMzU5NTlaMIGuMQswCQYDVQQGEwJERTEgMB4GA1UECBMXQmFk
2265
- ZW4tV3VlcnR0ZW1iZXJnIChCVykxEjAQBgNVBAcTCVN0dXR0Z2FydDEpMCcGA1UEChMgRGV1dHNj
2266
- aGVyIFNwYXJrYXNzZW4gVmVybGFnIEdtYkgxPjA8BgNVBAMTNVMtVFJVU1QgQXV0aGVudGljYXRp
2267
- b24gYW5kIEVuY3J5cHRpb24gUm9vdCBDQSAyMDA1OlBOMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
2268
- MIIBCgKCAQEA2bVKwdMz6tNGs9HiTNL1toPQb9UY6ZOvJ44TzbUlNlA0EmQpoVXhOmCTnijJ4/Ob
2269
- 4QSwI7+Vio5bG0F/WsPoTUzVJBY+h0jUJ67m91MduwwA7z5hca2/OnpYH5Q9XIHV1W/fuJvS9eXL
2270
- g3KSwlOyggLrra1fFi2SU3bxibYs9cEv4KdKb6AwajLrmnQDaHgTncovmwsdvs91DSaXm8f1Xgqf
2271
- eN+zvOyauu9VjxuapgdjKRdZYgkqeQd3peDRF2npW932kKvimAoA0SVtnteFhy+S8dF2g08LOlk3
2272
- KC8zpxdQ1iALCvQm+Z845y2kuJuJja2tyWp9iRe79n+Ag3rm7QIDAQABo4GSMIGPMBIGA1UdEwEB
2273
- /wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMCkGA1UdEQQiMCCkHjAcMRowGAYDVQQDExFTVFJv
2274
- bmxpbmUxLTIwNDgtNTAdBgNVHQ4EFgQUD8oeXHngovMpttKFswtKtWXsa1IwHwYDVR0jBBgwFoAU
2275
- D8oeXHngovMpttKFswtKtWXsa1IwDQYJKoZIhvcNAQEFBQADggEBAK8B8O0ZPCjoTVy7pWMciDMD
2276
- pwCHpB8gq9Yc4wYfl35UvbfRssnV2oDsF9eK9XvCAPbpEW+EoFolMeKJ+aQAPzFoLtU96G7m1R08
2277
- P7K9n3frndOMusDXtk3sU5wPBG7qNWdX4wple5A64U8+wwCSersFiXOMy6ZNwPv2AtawB6MDwidA
2278
- nwzkhYItr5pCHdDHjfhA7p0GVxzZotiAFP7hYy0yh9WUUpY6RsZxlj33mA6ykaqP2vROJAA5Veit
2279
- F7nTNCtKqUDMFypVZUF0Qn71wK/Ik63yGFs9iQzbRzkk+OBM8h+wPQrKBU6JIRrjKpms/H+h8Q8b
2280
- Hz2eBIPdltkdOpQ=
2281
- -----END CERTIFICATE-----
2282
-
2283
- Microsec e-Szigno Root CA
2284
- =========================
2285
- -----BEGIN CERTIFICATE-----
2286
- MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE
2287
- BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL
2288
- EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0
2289
- MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz
2290
- dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT
2291
- GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
2292
- AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG
2293
- d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N
2294
- oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc
2295
- QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ
2296
- PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb
2297
- MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG
2298
- IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD
2299
- VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3
2300
- LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A
2301
- dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn
2302
- AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA
2303
- 4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg
2304
- AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA
2305
- egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6
2306
- Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO
2307
- PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv
2308
- c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h
2309
- cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw
2310
- IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT
2311
- WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV
2312
- MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER
2313
- MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp
2314
- Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal
2315
- HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT
2316
- nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE
2317
- aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a
2318
- 86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK
2319
- yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB
2320
- S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU=
2321
- -----END CERTIFICATE-----
2322
-
2323
- Certigna
2324
- ========
2325
- -----BEGIN CERTIFICATE-----
2326
- MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw
2327
- EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3
2328
- MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI
2329
- Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q
2330
- XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH
2331
- GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p
2332
- ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg
2333
- DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf
2334
- Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ
2335
- tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ
2336
- BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J
2337
- SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA
2338
- hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+
2339
- ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu
2340
- PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY
2341
- 1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
2342
- WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
2343
- -----END CERTIFICATE-----
2344
-
2345
- AC Ra\xC3\xADz Certic\xC3\xA1mara S.A.
2346
- ======================================
2347
- -----BEGIN CERTIFICATE-----
2348
- MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT
2349
- AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg
2350
- LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w
2351
- HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+
2352
- U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh
2353
- IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B
2354
- AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN
2355
- yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU
2356
- 2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3
2357
- 4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP
2358
- 2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm
2359
- 8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf
2360
- HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa
2361
- Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK
2362
- 5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b
2363
- czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
2364
- AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g
2365
- ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF
2366
- BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug
2367
- cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf
2368
- AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX
2369
- EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v
2370
- /zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3
2371
- MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4
2372
- 3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk
2373
- eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f
2374
- /RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h
2375
- RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU
2376
- Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ==
2377
- -----END CERTIFICATE-----
2378
-
2379
- TC TrustCenter Class 2 CA II
2380
- ============================
2381
- -----BEGIN CERTIFICATE-----
2382
- MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC
2383
- REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy
2384
- IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw
2385
- MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1
2386
- c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE
2387
- AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
2388
- AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw
2389
- IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2
2390
- xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ
2391
- Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u
2392
- SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB
2393
- /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB
2394
- 7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90
2395
- Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU
2396
- cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i
2397
- SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
2398
- TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G
2399
- dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ
2400
- KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj
2401
- TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP
2402
- JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk
2403
- vQ==
2404
- -----END CERTIFICATE-----
2405
-
2406
- TC TrustCenter Class 3 CA II
2407
- ============================
2408
- -----BEGIN CERTIFICATE-----
2409
- MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC
2410
- REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy
2411
- IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw
2412
- MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1
2413
- c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE
2414
- AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
2415
- AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W
2416
- yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo
2417
- 6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ
2418
- uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk
2419
- 2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB
2420
- /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB
2421
- 7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90
2422
- Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU
2423
- cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i
2424
- SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
2425
- TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE
2426
- O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8
2427
- yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9
2428
- IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal
2429
- 092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc
2430
- 5A==
2431
- -----END CERTIFICATE-----
2432
-
2433
- TC TrustCenter Universal CA I
2434
- =============================
2435
- -----BEGIN CERTIFICATE-----
2436
- MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC
2437
- REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy
2438
- IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN
2439
- MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg
2440
- VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw
2441
- JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD
2442
- ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC
2443
- qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv
2444
- xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw
2445
- ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O
2446
- gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j
2447
- BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
2448
- AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG
2449
- 1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy
2450
- vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3
2451
- ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT
2452
- ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a
2453
- 7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY
2454
- -----END CERTIFICATE-----
2455
-
2456
- Deutsche Telekom Root CA 2
2457
- ==========================
2458
- -----BEGIN CERTIFICATE-----
2459
- MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT
2460
- RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG
2461
- A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5
2462
- MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G
2463
- A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS
2464
- b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5
2465
- bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI
2466
- KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY
2467
- AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK
2468
- Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV
2469
- jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV
2470
- HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr
2471
- E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy
2472
- zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8
2473
- rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G
2474
- dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
2475
- Cm26OWMohpLzGITY+9HPBVZkVw==
2476
- -----END CERTIFICATE-----
2477
-
2478
- ComSign CA
2479
- ==========
2480
- -----BEGIN CERTIFICATE-----
2481
- MIIDkzCCAnugAwIBAgIQFBOWgxRVjOp7Y+X8NId3RDANBgkqhkiG9w0BAQUFADA0MRMwEQYDVQQD
2482
- EwpDb21TaWduIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0wNDAzMjQxMTMy
2483
- MThaFw0yOTAzMTkxNTAyMThaMDQxEzARBgNVBAMTCkNvbVNpZ24gQ0ExEDAOBgNVBAoTB0NvbVNp
2484
- Z24xCzAJBgNVBAYTAklMMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8ORUaSvTx49q
2485
- ROR+WCf4C9DklBKK8Rs4OC8fMZwG1Cyn3gsqrhqg455qv588x26i+YtkbDqthVVRVKU4VbirgwTy
2486
- P2Q298CNQ0NqZtH3FyrV7zb6MBBC11PN+fozc0yz6YQgitZBJzXkOPqUm7h65HkfM/sb2CEJKHxN
2487
- GGleZIp6GZPKfuzzcuc3B1hZKKxC+cX/zT/npfo4sdAMx9lSGlPWgcxCejVb7Us6eva1jsz/D3zk
2488
- YDaHL63woSV9/9JLEYhwVKZBqGdTUkJe5DSe5L6j7KpiXd3DTKaCQeQzC6zJMw9kglcq/QytNuEM
2489
- rkvF7zuZ2SOzW120V+x0cAwqTwIDAQABo4GgMIGdMAwGA1UdEwQFMAMBAf8wPQYDVR0fBDYwNDAy
2490
- oDCgLoYsaHR0cDovL2ZlZGlyLmNvbXNpZ24uY28uaWwvY3JsL0NvbVNpZ25DQS5jcmwwDgYDVR0P
2491
- AQH/BAQDAgGGMB8GA1UdIwQYMBaAFEsBmz5WGmU2dst7l6qSBe4y5ygxMB0GA1UdDgQWBBRLAZs+
2492
- VhplNnbLe5eqkgXuMucoMTANBgkqhkiG9w0BAQUFAAOCAQEA0Nmlfv4pYEWdfoPPbrxHbvUanlR2
2493
- QnG0PFg/LUAlQvaBnPGJEMgOqnhPOAlXsDzACPw1jvFIUY0McXS6hMTXcpuEfDhOZAYnKuGntewI
2494
- mbQKDdSFc8gS4TXt8QUxHXOZDOuWyt3T5oWq8Ir7dcHyCTxlZWTzTNity4hp8+SDtwy9F1qWF8pb
2495
- /627HOkthIDYIb6FUtnUdLlphbpN7Sgy6/lhSuTENh4Z3G+EER+V9YMoGKgzkkMn3V0TBEVPh9VG
2496
- zT2ouvDzuFYkRes3x+F2T3I5GN9+dHLHcy056mDmrRGiVod7w2ia/viMcKjfZTL0pECMocJEAw6U
2497
- AGegcQCCSA==
2498
- -----END CERTIFICATE-----
2499
-
2500
- ComSign Secured CA
2501
- ==================
2502
- -----BEGIN CERTIFICATE-----
2503
- MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE
2504
- AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w
2505
- NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD
2506
- QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
2507
- ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs
2508
- 49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH
2509
- 7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB
2510
- kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1
2511
- 9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw
2512
- AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t
2513
- U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA
2514
- j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC
2515
- AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a
2516
- BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp
2517
- FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP
2518
- 51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz
2519
- OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw==
2520
- -----END CERTIFICATE-----
2521
-
2522
- Cybertrust Global Root
2523
- ======================
2524
- -----BEGIN CERTIFICATE-----
2525
- MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li
2526
- ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4
2527
- MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD
2528
- ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
2529
- +Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW
2530
- 0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL
2531
- AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin
2532
- 89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT
2533
- 8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP
2534
- BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2
2535
- MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G
2536
- A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO
2537
- lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi
2538
- 5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2
2539
- hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T
2540
- X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
2541
- WL1WMRJOEcgh4LMRkWXbtKaIOM5V
2542
- -----END CERTIFICATE-----
2543
-
2544
- ePKI Root Certification Authority
2545
- =================================
2546
- -----BEGIN CERTIFICATE-----
2547
- MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG
2548
- EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg
2549
- Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx
2550
- MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq
2551
- MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B
2552
- AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs
2553
- IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi
2554
- lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv
2555
- qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX
2556
- 12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O
2557
- WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+
2558
- ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao
2559
- lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/
2560
- vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi
2561
- Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi
2562
- MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
2563
- ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0
2564
- 1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq
2565
- KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV
2566
- xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP
2567
- NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r
2568
- GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE
2569
- xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx
2570
- gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy
2571
- sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD
2572
- BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw=
2573
- -----END CERTIFICATE-----
2574
-
2575
- 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
2576
- =============================================================================================================================
2577
- -----BEGIN CERTIFICATE-----
2578
- MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH
2579
- DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q
2580
- aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry
2581
- b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV
2582
- BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg
2583
- S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4
2584
- MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl
2585
- IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF
2586
- n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl
2587
- IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft
2588
- dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl
2589
- cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B
2590
- AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO
2591
- Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1
2592
- xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR
2593
- 6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL
2594
- hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd
2595
- BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
2596
- MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4
2597
- N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT
2598
- y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh
2599
- LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M
2600
- dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI=
2601
- -----END CERTIFICATE-----
2602
-
2603
- Buypass Class 2 CA 1
2604
- ====================
2605
- -----BEGIN CERTIFICATE-----
2606
- MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
2607
- QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2
2608
- MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
2609
- c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI
2610
- hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M
2611
- cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83
2612
- 0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4
2613
- 0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R
2614
- uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC
2615
- MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P
2616
- AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV
2617
- 1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt
2618
- 7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2
2619
- fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w
2620
- wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho
2621
- -----END CERTIFICATE-----
2622
-
2623
- Buypass Class 3 CA 1
2624
- ====================
2625
- -----BEGIN CERTIFICATE-----
2626
- MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
2627
- QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1
2628
- MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
2629
- c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI
2630
- hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx
2631
- ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0
2632
- n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia
2633
- AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c
2634
- 1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC
2635
- MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P
2636
- AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7
2637
- pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA
2638
- EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5
2639
- htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj
2640
- el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915
2641
- -----END CERTIFICATE-----
2642
-
2643
- EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1
2644
- ==========================================================================
2645
- -----BEGIN CERTIFICATE-----
2646
- MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF
2647
- bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg
2648
- QmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe
2649
- Fw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p
2650
- ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt
2651
- IFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG
2652
- SIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by
2653
- X3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b
2654
- gmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr
2655
- eYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ
2656
- TqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy
2657
- Y5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn
2658
- uqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI
2659
- qkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm
2660
- ExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0
2661
- Nokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB
2662
- /wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW
2663
- Z5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t
2664
- FcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm
2665
- zJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k
2666
- XPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT
2667
- bCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU
2668
- RT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK
2669
- 1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt
2670
- 2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ
2671
- Y9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9
2672
- AahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT
2673
- -----END CERTIFICATE-----
2674
-
2675
- certSIGN ROOT CA
2676
- ================
2677
- -----BEGIN CERTIFICATE-----
2678
- MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD
2679
- VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa
2680
- Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE
2681
- CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I
2682
- JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH
2683
- rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2
2684
- ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD
2685
- 0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943
2686
- AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B
2687
- Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB
2688
- AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8
2689
- SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0
2690
- x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt
2691
- vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz
2692
- TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD
2693
- -----END CERTIFICATE-----
2694
-
2695
- CNNIC ROOT
2696
- ==========
2697
- -----BEGIN CERTIFICATE-----
2698
- MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE
2699
- ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw
2700
- OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw
2701
- ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD
2702
- o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz
2703
- VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT
2704
- VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or
2705
- czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK
2706
- y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC
2707
- wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S
2708
- lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5
2709
- Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM
2710
- O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8
2711
- BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2
2712
- G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m
2713
- mxE=
2714
- -----END CERTIFICATE-----
2715
-
2716
- ApplicationCA - Japanese Government
2717
- ===================================
2718
- -----BEGIN CERTIFICATE-----
2719
- MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT
2720
- SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw
2721
- MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl
2722
- cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
2723
- CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4
2724
- fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN
2725
- wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE
2726
- jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu
2727
- nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU
2728
- WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV
2729
- BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD
2730
- vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs
2731
- o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g
2732
- /DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD
2733
- io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW
2734
- dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL
2735
- rosot4LKGAfmt1t06SAZf7IbiVQ=
2736
- -----END CERTIFICATE-----
2737
-
2738
- GeoTrust Primary Certification Authority - G3
2739
- =============================================
2740
- -----BEGIN CERTIFICATE-----
2741
- MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE
2742
- BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0
2743
- IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy
2744
- eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz
2745
- NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo
2746
- YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT
2747
- LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI
2748
- hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j
2749
- K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE
2750
- c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C
2751
- IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu
2752
- dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC
2753
- MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr
2754
- 2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9
2755
- cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE
2756
- Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
2757
- AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s
2758
- t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt
2759
- -----END CERTIFICATE-----
2760
-
2761
- thawte Primary Root CA - G2
2762
- ===========================
2763
- -----BEGIN CERTIFICATE-----
2764
- MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC
2765
- VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu
2766
- IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg
2767
- Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV
2768
- MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG
2769
- b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt
2770
- IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS
2771
- LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5
2772
- 8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU
2773
- mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN
2774
- G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K
2775
- rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
2776
- -----END CERTIFICATE-----
2777
-
2778
- thawte Primary Root CA - G3
2779
- ===========================
2780
- -----BEGIN CERTIFICATE-----
2781
- MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE
2782
- BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
2783
- aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
2784
- cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w
2785
- ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
2786
- d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD
2787
- VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG
2788
- A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
2789
- MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At
2790
- P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC
2791
- +BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY
2792
- 7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW
2793
- vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E
2794
- BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ
2795
- KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK
2796
- A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
2797
- t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC
2798
- 8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm
2799
- er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A=
2800
- -----END CERTIFICATE-----
2801
-
2802
- GeoTrust Primary Certification Authority - G2
2803
- =============================================
2804
- -----BEGIN CERTIFICATE-----
2805
- MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC
2806
- VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu
2807
- Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD
2808
- ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1
2809
- OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
2810
- MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl
2811
- b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG
2812
- BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc
2813
- KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD
2814
- VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+
2815
- EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m
2816
- ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2
2817
- npaqBA+K
2818
- -----END CERTIFICATE-----
2819
-
2820
- VeriSign Universal Root Certification Authority
2821
- ===============================================
2822
- -----BEGIN CERTIFICATE-----
2823
- MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE
2824
- BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
2825
- ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
2826
- IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u
2827
- IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV
2828
- UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
2829
- cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
2830
- IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0
2831
- aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj
2832
- 1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP
2833
- MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72
2834
- 9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I
2835
- AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR
2836
- tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G
2837
- CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O
2838
- a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
2839
- DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3
2840
- Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx
2841
- Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx
2842
- P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P
2843
- wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4
2844
- mJO37M2CYfE45k+XmCpajQ==
2845
- -----END CERTIFICATE-----
2846
-
2847
- VeriSign Class 3 Public Primary Certification Authority - G4
2848
- ============================================================
2849
- -----BEGIN CERTIFICATE-----
2850
- MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC
2851
- VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3
2852
- b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz
2853
- ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj
2854
- YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL
2855
- MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU
2856
- cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo
2857
- b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5
2858
- IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8
2859
- Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz
2860
- rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB
2861
- /zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw
2862
- HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u
2863
- Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD
2864
- A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx
2865
- AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
2866
- -----END CERTIFICATE-----
2867
-
2868
- NetLock Arany (Class Gold) Főtanúsítvány
2869
- ============================================
2870
- -----BEGIN CERTIFICATE-----
2871
- MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G
2872
- A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610
2873
- dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB
2874
- cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx
2875
- MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO
2876
- ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv
2877
- biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6
2878
- c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu
2879
- 0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw
2880
- /HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk
2881
- H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw
2882
- fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1
2883
- neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB
2884
- BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW
2885
- qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta
2886
- YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
2887
- bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna
2888
- NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu
2889
- dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
2890
- -----END CERTIFICATE-----
2891
-
2892
- Staat der Nederlanden Root CA - G2
2893
- ==================================
2894
- -----BEGIN CERTIFICATE-----
2895
- MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE
2896
- CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
2897
- Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC
2898
- TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l
2899
- ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ
2900
- 5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn
2901
- vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj
2902
- CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil
2903
- e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR
2904
- OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI
2905
- CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65
2906
- 48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi
2907
- trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737
2908
- qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB
2909
- AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC
2910
- ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV
2911
- HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA
2912
- A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz
2913
- +51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj
2914
- f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN
2915
- kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk
2916
- CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF
2917
- URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb
2918
- CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h
2919
- oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV
2920
- IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm
2921
- 66+KAQ==
2922
- -----END CERTIFICATE-----
2923
-
2924
- CA Disig
2925
- ========
2926
- -----BEGIN CERTIFICATE-----
2927
- MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK
2928
- QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw
2929
- MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz
2930
- bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3
2931
- DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm
2932
- GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD
2933
- Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo
2934
- hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt
2935
- ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w
2936
- gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P
2937
- AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz
2938
- aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff
2939
- ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa
2940
- BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t
2941
- WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3
2942
- mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/
2943
- CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K
2944
- ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA
2945
- 4Z7CRneC9VkGjCFMhwnN5ag=
2946
- -----END CERTIFICATE-----
2947
-
2948
- Juur-SK
2949
- =======
2950
- -----BEGIN CERTIFICATE-----
2951
- MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA
2952
- c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw
2953
- DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG
2954
- SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy
2955
- aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
2956
- ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf
2957
- TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC
2958
- +Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw
2959
- UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa
2960
- Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF
2961
- MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD
2962
- HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh
2963
- AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA
2964
- cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr
2965
- AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw
2966
- cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE
2967
- FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G
2968
- A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo
2969
- ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL
2970
- abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678
2971
- IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh
2972
- Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2
2973
- yyqcjg==
2974
- -----END CERTIFICATE-----
2975
-
2976
- Hongkong Post Root CA 1
2977
- =======================
2978
- -----BEGIN CERTIFICATE-----
2979
- MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT
2980
- DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx
2981
- NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n
2982
- IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF
2983
- AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1
2984
- ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr
2985
- auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh
2986
- qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY
2987
- V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV
2988
- HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i
2989
- h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio
2990
- l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei
2991
- IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps
2992
- T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT
2993
- c4afU9hDDl3WY4JxHYB0yvbiAmvZWg==
2994
- -----END CERTIFICATE-----
2995
-
2996
- SecureSign RootCA11
2997
- ===================
2998
- -----BEGIN CERTIFICATE-----
2999
- MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi
3000
- SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS
3001
- b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw
3002
- KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1
3003
- cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL
3004
- TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO
3005
- wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq
3006
- g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP
3007
- O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA
3008
- bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX
3009
- t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh
3010
- OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r
3011
- bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ
3012
- Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01
3013
- y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061
3014
- lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=
3015
- -----END CERTIFICATE-----
3016
-
3017
- ACEDICOM Root
3018
- =============
3019
- -----BEGIN CERTIFICATE-----
3020
- MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD
3021
- T00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4
3022
- MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG
3023
- A1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF
3024
- AAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk
3025
- WLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD
3026
- YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew
3027
- MYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb
3028
- m8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk
3029
- HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT
3030
- xKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2
3031
- 3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9
3032
- 2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq
3033
- TYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz
3034
- 4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU
3035
- 9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv
3036
- bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg
3037
- aHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP
3038
- eGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk
3039
- zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1
3040
- ThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI
3041
- KiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq
3042
- nxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE
3043
- I2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp
3044
- MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o
3045
- tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA==
3046
- -----END CERTIFICATE-----
3047
-
3048
- Verisign Class 1 Public Primary Certification Authority
3049
- =======================================================
3050
- -----BEGIN CERTIFICATE-----
3051
- MIICPDCCAaUCED9pHoGc8JpK83P/uUii5N0wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx
3052
- FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAxIFB1YmxpYyBQcmltYXJ5
3053
- IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow
3054
- XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAx
3055
- IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
3056
- A4GNADCBiQKBgQDlGb9to1ZhLZlIcfZn3rmN67eehoAKkQ76OCWvRoiC5XOooJskXQ0fzGVuDLDQ
3057
- VoQYh5oGmxChc9+0WDlrbsH2FdWoqD+qEgaNMax/sDTXjzRniAnNFBHiTkVWaR94AoDa3EeRKbs2
3058
- yWNcxeDXLYd7obcysHswuiovMaruo2fa2wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFgVKTk8d6Pa
3059
- XCUDfGD67gmZPCcQcMgMCeazh88K4hiWNWLMv5sneYlfycQJ9M61Hd8qveXbhpxoJeUwfLaJFf5n
3060
- 0a3hUKw8fGJLj7qE1xIVGx/KXQ/BUpQqEZnae88MNhPVNdwQGVnqlMEAv3WP2fr9dgTbYruQagPZ
3061
- RjXZ+Hxb
3062
- -----END CERTIFICATE-----
3063
-
3064
- Verisign Class 3 Public Primary Certification Authority
3065
- =======================================================
3066
- -----BEGIN CERTIFICATE-----
3067
- MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx
3068
- FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
3069
- IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow
3070
- XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
3071
- IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
3072
- A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
3073
- f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
3074
- hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky
3075
- CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX
3076
- bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/
3077
- D/xwzoiQ
3078
- -----END CERTIFICATE-----
3079
-
3080
- Microsec e-Szigno Root CA 2009
3081
- ==============================
3082
- -----BEGIN CERTIFICATE-----
3083
- MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER
3084
- MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv
3085
- c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
3086
- dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE
3087
- BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt
3088
- U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw
3089
- DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA
3090
- fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG
3091
- 0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA
3092
- pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm
3093
- 1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC
3094
- AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf
3095
- QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE
3096
- FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o
3097
- lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX
3098
- I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
3099
- tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02
3100
- yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi
3101
- LXpUq3DDfSJlgnCW
3102
- -----END CERTIFICATE-----
3103
-
3104
- E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi
3105
- ===================================================
3106
- -----BEGIN CERTIFICATE-----
3107
- MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
3108
- EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz
3109
- ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3
3110
- MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0
3111
- cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u
3112
- aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
3113
- AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY
3114
- 8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y
3115
- jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI
3116
- JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk
3117
- 9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD
3118
- AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG
3119
- SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d
3120
- F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq
3121
- D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4
3122
- Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq
3123
- fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX
3124
- -----END CERTIFICATE-----
3125
-
3126
- GlobalSign Root CA - R3
3127
- =======================
3128
- -----BEGIN CERTIFICATE-----
3129
- MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv
3130
- YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
3131
- bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
3132
- aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
3133
- bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt
3134
- iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ
3135
- 0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3
3136
- rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl
3137
- OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2
3138
- xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
3139
- FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7
3140
- lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8
3141
- EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E
3142
- bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18
3143
- YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r
3144
- kpeDMdmztcpHWD9f
3145
- -----END CERTIFICATE-----
3146
-
3147
- TC TrustCenter Universal CA III
3148
- ===============================
3149
- -----BEGIN CERTIFICATE-----
3150
- MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezELMAkGA1UEBhMC
3151
- REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy
3152
- IFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAe
3153
- Fw0wOTA5MDkwODE1MjdaFw0yOTEyMzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNU
3154
- QyBUcnVzdENlbnRlciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0Ex
3155
- KDAmBgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqGSIb3DQEB
3156
- AQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF5+cvAqBNLaT6hdqbJYUt
3157
- QCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYvDIRlzg9uwliT6CwLOunBjvvya8o84pxO
3158
- juT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8vzArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+Eut
3159
- CHnNaYlAJ/Uqwa1D7KRTyGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1
3160
- M4BDj5yjdipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBhMB8G
3161
- A1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
3162
- BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI4jANBgkqhkiG9w0BAQUFAAOCAQEA
3163
- g8ev6n9NCjw5sWi+e22JLumzCecYV42FmhfzdkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+
3164
- KGwWaODIl0YgoGhnYIg5IFHYaAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhK
3165
- BgePxLcHsU0GDeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV
3166
- CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPHLQNjO9Po5KIq
3167
- woIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg==
3168
- -----END CERTIFICATE-----
3169
-
3170
- Autoridad de Certificacion Firmaprofesional CIF A62634068
3171
- =========================================================
3172
- -----BEGIN CERTIFICATE-----
3173
- MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA
3174
- BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
3175
- MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw
3176
- QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB
3177
- NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD
3178
- Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P
3179
- B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY
3180
- 7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH
3181
- ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI
3182
- plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX
3183
- MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX
3184
- LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK
3185
- bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU
3186
- vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud
3187
- EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH
3188
- DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
3189
- cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA
3190
- bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx
3191
- ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx
3192
- 51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk
3193
- R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP
3194
- T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f
3195
- Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl
3196
- osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR
3197
- crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR
3198
- saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD
3199
- KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi
3200
- 6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
3201
- -----END CERTIFICATE-----
3202
-
3203
- Izenpe.com
3204
- ==========
3205
- -----BEGIN CERTIFICATE-----
3206
- MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG
3207
- EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz
3208
- MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu
3209
- QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ
3210
- 03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK
3211
- ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU
3212
- +zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC
3213
- PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT
3214
- OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK
3215
- F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK
3216
- 0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+
3217
- 0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB
3218
- leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID
3219
- AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+
3220
- SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG
3221
- NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx
3222
- MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
3223
- BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l
3224
- Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga
3225
- kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q
3226
- hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs
3227
- g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5
3228
- aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5
3229
- nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC
3230
- ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo
3231
- Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z
3232
- WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==
3233
- -----END CERTIFICATE-----
3234
-
3235
- Chambers of Commerce Root - 2008
3236
- ================================
3237
- -----BEGIN CERTIFICATE-----
3238
- MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD
3239
- MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
3240
- bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
3241
- QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy
3242
- Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl
3243
- ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF
3244
- EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl
3245
- cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
3246
- AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA
3247
- XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj
3248
- h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/
3249
- ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk
3250
- NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g
3251
- D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331
3252
- lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ
3253
- 0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
3254
- ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2
3255
- EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI
3256
- G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ
3257
- BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh
3258
- bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh
3259
- bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC
3260
- CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH
3261
- AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1
3262
- wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH
3263
- 3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU
3264
- RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6
3265
- M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1
3266
- YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF
3267
- 9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK
3268
- zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG
3269
- nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
3270
- OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ
3271
- -----END CERTIFICATE-----
3272
-
3273
- Global Chambersign Root - 2008
3274
- ==============================
3275
- -----BEGIN CERTIFICATE-----
3276
- MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD
3277
- MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
3278
- bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
3279
- QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx
3280
- NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg
3281
- Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ
3282
- QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
3283
- aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf
3284
- VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf
3285
- XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0
3286
- ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB
3287
- /gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA
3288
- TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M
3289
- H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe
3290
- Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF
3291
- HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
3292
- wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB
3293
- AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT
3294
- BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE
3295
- BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm
3296
- aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm
3297
- aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp
3298
- 1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0
3299
- dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG
3300
- /5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6
3301
- ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s
3302
- dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg
3303
- 9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH
3304
- foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du
3305
- qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr
3306
- P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq
3307
- c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
3308
- 09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
3309
- -----END CERTIFICATE-----
3310
-
3311
- Go Daddy Root Certificate Authority - G2
3312
- ========================================
3313
- -----BEGIN CERTIFICATE-----
3314
- MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
3315
- B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu
3316
- MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
3317
- MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
3318
- b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G
3319
- A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
3320
- hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq
3321
- 9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD
3322
- +qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd
3323
- fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl
3324
- NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC
3325
- MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9
3326
- BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac
3327
- vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r
3328
- 5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV
3329
- N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
3330
- LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1
3331
- -----END CERTIFICATE-----
3332
-
3333
- Starfield Root Certificate Authority - G2
3334
- =========================================
3335
- -----BEGIN CERTIFICATE-----
3336
- MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
3337
- B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
3338
- b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
3339
- eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw
3340
- DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg
3341
- VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB
3342
- dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv
3343
- W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs
3344
- bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk
3345
- N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf
3346
- ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU
3347
- JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
3348
- AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol
3349
- TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx
3350
- 4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw
3351
- F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
3352
- pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ
3353
- c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
3354
- -----END CERTIFICATE-----
3355
-
3356
- Starfield Services Root Certificate Authority - G2
3357
- ==================================================
3358
- -----BEGIN CERTIFICATE-----
3359
- MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
3360
- B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
3361
- b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl
3362
- IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV
3363
- BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT
3364
- dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg
3365
- Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
3366
- AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2
3367
- h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa
3368
- hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP
3369
- LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB
3370
- rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
3371
- AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG
3372
- SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP
3373
- E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy
3374
- xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
3375
- iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza
3376
- YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6
3377
- -----END CERTIFICATE-----
3378
-
3379
- AffirmTrust Commercial
3380
- ======================
3381
- -----BEGIN CERTIFICATE-----
3382
- MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS
3383
- BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw
3384
- MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
3385
- bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF
3386
- AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb
3387
- DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV
3388
- C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6
3389
- BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww
3390
- MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV
3391
- HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
3392
- AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG
3393
- hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi
3394
- qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv
3395
- 0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh
3396
- sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
3397
- -----END CERTIFICATE-----
3398
-
3399
- AffirmTrust Networking
3400
- ======================
3401
- -----BEGIN CERTIFICATE-----
3402
- MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS
3403
- BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw
3404
- MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
3405
- bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF
3406
- AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE
3407
- Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI
3408
- dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24
3409
- /PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb
3410
- h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV
3411
- HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
3412
- AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu
3413
- UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6
3414
- 12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23
3415
- WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9
3416
- /ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
3417
- -----END CERTIFICATE-----
3418
-
3419
- AffirmTrust Premium
3420
- ===================
3421
- -----BEGIN CERTIFICATE-----
3422
- MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS
3423
- BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy
3424
- OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy
3425
- dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
3426
- MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn
3427
- BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV
3428
- 5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs
3429
- +7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd
3430
- GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R
3431
- p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI
3432
- S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04
3433
- 6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5
3434
- /bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo
3435
- +Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB
3436
- /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv
3437
- MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
3438
- Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC
3439
- 6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S
3440
- L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK
3441
- +4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV
3442
- BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg
3443
- IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60
3444
- g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb
3445
- zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw==
3446
- -----END CERTIFICATE-----
3447
-
3448
- AffirmTrust Premium ECC
3449
- =======================
3450
- -----BEGIN CERTIFICATE-----
3451
- MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV
3452
- BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx
3453
- MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U
3454
- cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA
3455
- IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ
3456
- N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW
3457
- BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK
3458
- BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X
3459
- 57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM
3460
- eQ==
3461
- -----END CERTIFICATE-----
3462
-
3463
- Certum Trusted Network CA
3464
- =========================
3465
- -----BEGIN CERTIFICATE-----
3466
- MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK
3467
- ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv
3468
- biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy
3469
- MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU
3470
- ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
3471
- MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
3472
- AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC
3473
- l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J
3474
- J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4
3475
- fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0
3476
- cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB
3477
- Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw
3478
- DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj
3479
- jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1
3480
- mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj
3481
- Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
3482
- 03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
3483
- -----END CERTIFICATE-----
3484
-
3485
- Certinomis - Autorité Racine
3486
- =============================
3487
- -----BEGIN CERTIFICATE-----
3488
- MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK
3489
- Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg
3490
- LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG
3491
- A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw
3492
- JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD
3493
- ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa
3494
- wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly
3495
- Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw
3496
- 2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N
3497
- jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q
3498
- c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC
3499
- lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb
3500
- xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g
3501
- 530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna
3502
- 4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
3503
- A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ
3504
- KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x
3505
- WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva
3506
- R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40
3507
- nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B
3508
- CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv
3509
- JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE
3510
- qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b
3511
- WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE
3512
- wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/
3513
- vgt2Fl43N+bYdJeimUV5
3514
- -----END CERTIFICATE-----
3515
-
3516
- Root CA Generalitat Valenciana
3517
- ==============================
3518
- -----BEGIN CERTIFICATE-----
3519
- MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE
3520
- ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290
3521
- IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3
3522
- WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE
3523
- CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G
3524
- CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2
3525
- F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B
3526
- ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ
3527
- D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte
3528
- JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB
3529
- AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n
3530
- dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB
3531
- ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl
3532
- AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA
3533
- YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy
3534
- AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA
3535
- aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt
3536
- AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA
3537
- YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu
3538
- AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA
3539
- OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0
3540
- dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV
3541
- BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G
3542
- A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S
3543
- b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh
3544
- TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz
3545
- Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63
3546
- NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH
3547
- iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt
3548
- +GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM=
3549
- -----END CERTIFICATE-----
3550
-
3551
- A-Trust-nQual-03
3552
- ================
3553
- -----BEGIN CERTIFICATE-----
3554
- MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE
3555
- Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy
3556
- a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R
3557
- dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw
3558
- RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0
3559
- ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1
3560
- c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA
3561
- zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n
3562
- yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE
3563
- SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4
3564
- iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V
3565
- cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV
3566
- eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40
3567
- ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr
3568
- sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd
3569
- JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS
3570
- mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6
3571
- ahq97BvIxYSazQ==
3572
- -----END CERTIFICATE-----
3573
-
3574
- TWCA Root Certification Authority
3575
- =================================
3576
- -----BEGIN CERTIFICATE-----
3577
- MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ
3578
- VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh
3579
- dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG
3580
- EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB
3581
- IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
3582
- AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx
3583
- QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC
3584
- oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP
3585
- 4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r
3586
- y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB
3587
- BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG
3588
- 9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC
3589
- mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW
3590
- QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY
3591
- T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny
3592
- Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
3593
- -----END CERTIFICATE-----
3594
-
3595
- Security Communication RootCA2
3596
- ==============================
3597
- -----BEGIN CERTIFICATE-----
3598
- MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
3599
- U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh
3600
- dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC
3601
- SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy
3602
- aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
3603
- ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++
3604
- +T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R
3605
- 3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV
3606
- spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K
3607
- EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8
3608
- QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB
3609
- CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj
3610
- u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk
3611
- 3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q
3612
- tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29
3613
- mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
3614
- -----END CERTIFICATE-----
3615
-
3616
- EC-ACC
3617
- ======
3618
- -----BEGIN CERTIFICATE-----
3619
- MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE
3620
- BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w
3621
- ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD
3622
- VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE
3623
- CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT
3624
- BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7
3625
- MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt
3626
- SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl
3627
- Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh
3628
- cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND
3629
- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK
3630
- w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT
3631
- ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4
3632
- HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a
3633
- E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw
3634
- 0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E
3635
- BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD
3636
- VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0
3637
- Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l
3638
- dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ
3639
- lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa
3640
- Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe
3641
- l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2
3642
- E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D
3643
- 5EI=
3644
- -----END CERTIFICATE-----
3645
-
3646
- Hellenic Academic and Research Institutions RootCA 2011
3647
- =======================================================
3648
- -----BEGIN CERTIFICATE-----
3649
- MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT
3650
- O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y
3651
- aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
3652
- IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT
3653
- AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
3654
- IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo
3655
- IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
3656
- AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI
3657
- 1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa
3658
- 71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u
3659
- 8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH
3660
- 3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/
3661
- MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8
3662
- MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu
3663
- b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt
3664
- XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8
3665
- TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD
3666
- /md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N
3667
- 7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4
3668
- -----END CERTIFICATE-----
3669
-
3670
- Actalis Authentication Root CA
3671
- ==============================
3672
- -----BEGIN CERTIFICATE-----
3673
- MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM
3674
- BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE
3675
- AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky
3676
- MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz
3677
- IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
3678
- IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ
3679
- wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa
3680
- by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6
3681
- zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f
3682
- YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2
3683
- oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l
3684
- EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7
3685
- hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8
3686
- EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5
3687
- jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY
3688
- iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
3689
- ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI
3690
- WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0
3691
- JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx
3692
- K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+
3693
- Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC
3694
- 4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo
3695
- 2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz
3696
- lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem
3697
- OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9
3698
- vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
3699
- -----END CERTIFICATE-----
3700
-
3701
- Trustis FPS Root CA
3702
- ===================
3703
- -----BEGIN CERTIFICATE-----
3704
- MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG
3705
- EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290
3706
- IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV
3707
- BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ
3708
- KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ
3709
- RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk
3710
- H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa
3711
- cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt
3712
- o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA
3713
- AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd
3714
- BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c
3715
- GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC
3716
- yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P
3717
- 8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV
3718
- l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl
3719
- iB6XzCGcKQENZetX2fNXlrtIzYE=
3720
- -----END CERTIFICATE-----
3721
-
3722
- StartCom Certification Authority
3723
- ================================
3724
- -----BEGIN CERTIFICATE-----
3725
- MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
3726
- U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
3727
- ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
3728
- NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
3729
- LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
3730
- U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
3731
- ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
3732
- o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
3733
- Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
3734
- eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
3735
- 2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
3736
- 6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
3737
- osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
3738
- untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
3739
- UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
3740
- 37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
3741
- VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ
3742
- Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0
3743
- dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu
3744
- c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv
3745
- bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0
3746
- aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0
3747
- aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t
3748
- L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG
3749
- cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5
3750
- fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm
3751
- N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN
3752
- Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T
3753
- tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX
3754
- e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA
3755
- 2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs
3756
- HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE
3757
- JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib
3758
- D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8=
3759
- -----END CERTIFICATE-----
3760
-
3761
- StartCom Certification Authority G2
3762
- ===================================
3763
- -----BEGIN CERTIFICATE-----
3764
- MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
3765
- U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
3766
- RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE
3767
- ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp
3768
- dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O
3769
- o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG
3770
- 4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi
3771
- Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul
3772
- Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs
3773
- O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H
3774
- vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L
3775
- nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS
3776
- FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa
3777
- z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E
3778
- BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ
3779
- KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K
3780
- 2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk
3781
- J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+
3782
- JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG
3783
- /+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc
3784
- nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld
3785
- blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc
3786
- l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm
3787
- 7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm
3788
- obp573PYtlNXLfbQ4ddI
3789
- -----END CERTIFICATE-----
3790
-
3791
- Buypass Class 2 Root CA
3792
- =======================
3793
- -----BEGIN CERTIFICATE-----
3794
- MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
3795
- QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X
3796
- DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1
3797
- eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw
3798
- DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1
3799
- g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn
3800
- 9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b
3801
- /+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU
3802
- CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff
3803
- awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI
3804
- zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn
3805
- Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX
3806
- Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs
3807
- M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
3808
- VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
3809
- AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s
3810
- A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI
3811
- osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S
3812
- aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd
3813
- DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD
3814
- LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0
3815
- oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC
3816
- wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS
3817
- CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN
3818
- rJgWVqA=
3819
- -----END CERTIFICATE-----
3820
-
3821
- Buypass Class 3 Root CA
3822
- =======================
3823
- -----BEGIN CERTIFICATE-----
3824
- MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
3825
- QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X
3826
- DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1
3827
- eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw
3828
- DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH
3829
- sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR
3830
- 5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh
3831
- 7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ
3832
- ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH
3833
- 2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV
3834
- /afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ
3835
- RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA
3836
- Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq
3837
- j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
3838
- VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
3839
- AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV
3840
- cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G
3841
- uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG
3842
- Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8
3843
- ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2
3844
- KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz
3845
- 6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug
3846
- UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe
3847
- eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi
3848
- Cp/HuZc=
3849
- -----END CERTIFICATE-----
3850
-
3851
- T-TeleSec GlobalRoot Class 3
3852
- ============================
3853
- -----BEGIN CERTIFICATE-----
3854
- MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
3855
- IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
3856
- cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx
3857
- MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
3858
- dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
3859
- ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3
3860
- DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK
3861
- 9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU
3862
- NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF
3863
- iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W
3864
- 0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA
3865
- MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr
3866
- AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb
3867
- fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT
3868
- ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h
3869
- P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
3870
- e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw==
3871
- -----END CERTIFICATE-----
3872
-
3873
- EE Certification Centre Root CA
3874
- ===============================
3875
- -----BEGIN CERTIFICATE-----
3876
- MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
3877
- EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy
3878
- dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw
3879
- MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB
3880
- UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy
3881
- ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB
3882
- DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM
3883
- TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2
3884
- rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw
3885
- 93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN
3886
- P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T
3887
- AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ
3888
- MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF
3889
- BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj
3890
- xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM
3891
- lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u
3892
- uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU
3893
- 3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM
3894
- dcGWxZ0=
3895
- -----END CERTIFICATE-----
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/mindscape/raygun4php/testbootstrap.php DELETED
@@ -1,3 +0,0 @@
1
- <?php
2
-
3
- require_once(__DIR__ .'/src/Raygun4php/RaygunClient.php');
 
 
 
vendor/mindscape/raygun4php/tests/RaygunClientTest.php DELETED
@@ -1,128 +0,0 @@
1
- <?php
2
-
3
- class RaygunClientTest extends PHPUnit_Framework_TestCase
4
- {
5
-
6
- /**
7
- * @expectedException \Raygun4php\Raygun4PhpException
8
- * @expectedExceptionMessage API not valid, cannot send message to Raygun
9
- */
10
- public function testSendReturns403WithInvalidApiKey()
11
- {
12
- $client = new \Raygun4php\RaygunClient("", true);
13
- $client->SendException(new Exception(''));
14
- }
15
-
16
- public function testGetFilteredParamsRemovesByKey() {
17
- $client = new \Raygun4php\RaygunClient("some-api-key", true);
18
- $client->setFilterParams(array(
19
- 'MyParam' => true
20
- ));
21
- $message = $this->getEmptyMessage();
22
- $message->Details->Request->Form = array(
23
- 'MyParam' => 'secret',
24
- );
25
- $message->Details->Request->Headers = array(
26
- 'MyParam' => 'secret',
27
- );
28
- $message->Details->Request->Data = array(
29
- 'MyParam' => 'secret',
30
- );
31
-
32
- $filteredMessage = $client->filterParamsFromMessage($message);
33
- $this->assertEquals(
34
- $filteredMessage->Details->Request->Form,
35
- array('MyParam' => '[filtered]',)
36
- );
37
- $this->assertEquals(
38
- $filteredMessage->Details->Request->Headers,
39
- array('MyParam' => '[filtered]',)
40
- );
41
- $this->assertEquals(
42
- $filteredMessage->Details->Request->Data,
43
- array('MyParam' => '[filtered]',)
44
- );
45
- }
46
-
47
- public function testGetFilteredParamsIgnoresCase() {
48
- $client = new \Raygun4php\RaygunClient("some-api-key", true);
49
- $client->setFilterParams(array('myparam' => true));
50
- $message = $this->getEmptyMessage();
51
- $message->Details->Request->Form = array('MyParam' => 'secret',);
52
-
53
- $filteredMessage = $client->filterParamsFromMessage($message);
54
- $this->assertEquals(
55
- $filteredMessage->Details->Request->Form,
56
- array('MyParam' => '[filtered]',)
57
- );
58
- }
59
-
60
- public function testGetFilteredParamsAcceptsCustomFunctions() {
61
- $client = new \Raygun4php\RaygunClient("some-api-key", true);
62
- $client->setFilterParams(array(
63
- 'MyParam' => function($key, $val) {return strrev($val);},
64
- ));
65
- $message = $this->getEmptyMessage();
66
- $message->Details->Request->Form = array(
67
- 'MyParam' => 'secret',
68
- );
69
-
70
- $filteredMessage = $client->filterParamsFromMessage($message);
71
- $this->assertEquals(
72
- $filteredMessage->Details->Request->Form,
73
- array(
74
- 'MyParam' => 'terces',
75
- )
76
- );
77
- }
78
-
79
- public function testGetFilteredParamsRemovesRawData() {
80
- $client = new \Raygun4php\RaygunClient("some-api-key", true);
81
- $message = $this->getEmptyMessage();
82
- $message->Details->Request->RawData = 'some-data';
83
-
84
- $filteredMessage = $client->filterParamsFromMessage($message);
85
- $this->assertEquals($filteredMessage->Details->Request->RawData, 'some-data');
86
-
87
- $client->setFilterParams(array('MySensitiveParam' => true));
88
- $filteredMessage = $client->filterParamsFromMessage($message);
89
- $this->assertNull($filteredMessage->Details->Request->RawData);
90
- }
91
-
92
- public function testGetFilteredParamsParsesRegex() {
93
- $client = new \Raygun4php\RaygunClient("some-api-key", true);
94
- $client->setFilterParams(array('/MyRegex.*/' => true,));
95
- $message = $this->getEmptyMessage();
96
- $message->Details->Request->Form = array(
97
- 'MyParam' => 'some val',
98
- 'MyRegexParam' => 'secret',
99
- );
100
-
101
- $filteredMessage = $client->filterParamsFromMessage($message);
102
- $this->assertEquals(
103
- $filteredMessage->Details->Request->Form,
104
- array(
105
- 'MyParam' => 'some val',
106
- 'MyRegexParam' => '[filtered]',
107
- )
108
- );
109
- }
110
-
111
- protected function getEmptyMessage() {
112
- $requestMessage = new Raygun4php\RaygunRequestMessage();
113
- $requestMessage->HostName = null;
114
- $requestMessage->Url = null;
115
- $requestMessage->HttpMethod = null;
116
- $requestMessage->IpAddress = null;
117
- $requestMessage->QueryString = null;
118
- $requestMessage->Headers = null;
119
- $requestMessage->Data = null;
120
- $requestMessage->RawData = null;
121
- $requestMessage->Form = null;
122
- $message = new Raygun4php\RaygunMessage(0);
123
- $message->Details->Request = $requestMessage;
124
-
125
- return $message;
126
- }
127
- }
128
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/mindscape/raygun4php/tests/RaygunMessageTest.php DELETED
@@ -1,30 +0,0 @@
1
- <?php
2
-
3
- class RaygunMessageTest extends PHPUnit_Framework_TestCase
4
- {
5
- public function testDefaultConstructorGeneratesValid8601()
6
- {
7
- $msg = new \Raygun4php\RaygunMessage();
8
-
9
- $matches = preg_match('/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})Z$/', $msg->OccurredOn);
10
-
11
- $this->assertEquals(1, $matches);
12
- }
13
-
14
- public function testUnixTimestampResultsInCorrect8601()
15
- {
16
- $msg = new \Raygun4php\RaygunMessage(0);
17
-
18
- $this->assertEquals($msg->OccurredOn, '1970-01-01T00:00:00Z');
19
- }
20
-
21
- public function testBuildMessageWithException()
22
- {
23
- $msg = new \Raygun4php\RaygunMessage();
24
-
25
- $msg->Build(new Exception('test'));
26
-
27
- $this->assertEquals($msg->Details->Error->Message, 'Exception: test');
28
- }
29
- }
30
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/monolog/monolog/CHANGELOG.md ADDED
@@ -0,0 +1,608 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ### 2.8.0 (2022-07-24)
2
+
3
+ * Deprecated `CubeHandler` and `PHPConsoleHandler` as both projects are abandoned and those should not be used anymore (#1734)
4
+ * Added RFC 5424 level (`7` to `0`) support to `Logger::log` and `Logger::addRecord` to increase interoperability (#1723)
5
+ * Added support for `__toString` for objects which are not json serializable in `JsonFormatter` (#1733)
6
+ * Added `GoogleCloudLoggingFormatter` (#1719)
7
+ * Added support for Predis 2.x (#1732)
8
+ * Added `AmqpHandler->setExtraAttributes` to allow configuring attributes when using an AMQPExchange (#1724)
9
+ * Fixed serialization/unserialization of handlers to make sure private properties are included (#1727)
10
+ * Fixed allowInlineLineBreaks in LineFormatter causing issues with windows paths containing `\n` or `\r` sequences (#1720)
11
+ * Fixed max normalization depth not being taken into account when formatting exceptions with a deep chain of previous exceptions (#1726)
12
+ * Fixed PHP 8.2 deprecation warnings (#1722)
13
+ * Fixed rare race condition or filesystem issue where StreamHandler is unable to create the directory the log should go into yet it exists already (#1678)
14
+
15
+ ### 2.7.0 (2022-06-09)
16
+
17
+ * Added `$datetime` parameter to `Logger::addRecord` as low level API to allow logging into the past or future (#1682)
18
+ * Added `Logger::useLoggingLoopDetection` to allow disabling cyclic logging detection in concurrent frameworks (#1681)
19
+ * Fixed handling of fatal errors if callPrevious is disabled in ErrorHandler (#1670)
20
+ * Marked the reusable `Monolog\Test\TestCase` class as `@internal` to make sure PHPStorm does not show it above PHPUnit, you may still use it to test your own handlers/etc though (#1677)
21
+ * Fixed RotatingFileHandler issue when the date format contained slashes (#1671)
22
+
23
+ ### 2.6.0 (2022-05-10)
24
+
25
+ * Deprecated `SwiftMailerHandler`, use `SymfonyMailerHandler` instead
26
+ * Added `SymfonyMailerHandler` (#1663)
27
+ * Added ElasticSearch 8.x support to the ElasticsearchHandler (#1662)
28
+ * Added a way to filter/modify stack traces in LineFormatter (#1665)
29
+ * Fixed UdpSocket not being able to reopen/reconnect after close()
30
+ * Fixed infinite loops if a Handler is triggering logging while handling log records
31
+
32
+ ### 2.5.0 (2022-04-08)
33
+
34
+ * Added `callType` to IntrospectionProcessor (#1612)
35
+ * Fixed AsMonologProcessor syntax to be compatible with PHP 7.2 (#1651)
36
+
37
+ ### 2.4.0 (2022-03-14)
38
+
39
+ * Added [`Monolog\LogRecord`](src/Monolog/LogRecord.php) interface that can be used to type-hint records like `array|\Monolog\LogRecord $record` to be forward compatible with the upcoming Monolog 3 changes
40
+ * Added `includeStacktraces` constructor params to LineFormatter & JsonFormatter (#1603)
41
+ * Added `persistent`, `timeout`, `writingTimeout`, `connectionTimeout`, `chunkSize` constructor params to SocketHandler and derivatives (#1600)
42
+ * Added `AsMonologProcessor` PHP attribute which can help autowiring / autoconfiguration of processors if frameworks / integrations decide to make use of it. This is useless when used purely with Monolog (#1637)
43
+ * Added support for keeping native BSON types as is in MongoDBFormatter (#1620)
44
+ * Added support for a `user_agent` key in WebProcessor, disabled by default but you can use it by configuring the $extraFields you want (#1613)
45
+ * Added support for username/userIcon in SlackWebhookHandler (#1617)
46
+ * Added extension points to BrowserConsoleHandler (#1593)
47
+ * Added record message/context/extra info to exceptions thrown when a StreamHandler cannot open its stream to avoid completely losing the data logged (#1630)
48
+ * Fixed error handler signature to accept a null $context which happens with internal PHP errors (#1614)
49
+ * Fixed a few setter methods not returning `self` (#1609)
50
+ * Fixed handling of records going over the max Telegram message length (#1616)
51
+
52
+ ### 2.3.5 (2021-10-01)
53
+
54
+ * Fixed regression in StreamHandler since 2.3.3 on systems with the memory_limit set to >=20GB (#1592)
55
+
56
+ ### 2.3.4 (2021-09-15)
57
+
58
+ * Fixed support for psr/log 3.x (#1589)
59
+
60
+ ### 2.3.3 (2021-09-14)
61
+
62
+ * Fixed memory usage when using StreamHandler and calling stream_get_contents on the resource you passed to it (#1578, #1577)
63
+ * Fixed support for psr/log 2.x (#1587)
64
+ * Fixed some type annotations
65
+
66
+ ### 2.3.2 (2021-07-23)
67
+
68
+ * Fixed compatibility with PHP 7.2 - 7.4 when experiencing PCRE errors (#1568)
69
+
70
+ ### 2.3.1 (2021-07-14)
71
+
72
+ * Fixed Utils::getClass handling of anonymous classes not being fully compatible with PHP 8 (#1563)
73
+ * Fixed some `@inheritDoc` annotations having the wrong case
74
+
75
+ ### 2.3.0 (2021-07-05)
76
+
77
+ * Added a ton of PHPStan type annotations as well as type aliases on Monolog\Logger for Record, Level and LevelName that you can import (#1557)
78
+ * Added ability to customize date format when using JsonFormatter (#1561)
79
+ * Fixed FilterHandler not calling reset on its internal handler when reset() is called on it (#1531)
80
+ * Fixed SyslogUdpHandler not setting the timezone correctly on DateTimeImmutable instances (#1540)
81
+ * Fixed StreamHandler thread safety - chunk size set to 2GB now to avoid interlacing when doing concurrent writes (#1553)
82
+
83
+ ### 2.2.0 (2020-12-14)
84
+
85
+ * Added JSON_PARTIAL_OUTPUT_ON_ERROR to default json encoding flags, to avoid dropping entire context data or even records due to an invalid subset of it somewhere
86
+ * Added setDateFormat to NormalizerFormatter (and Line/Json formatters by extension) to allow changing this after object creation
87
+ * Added RedisPubSubHandler to log records to a Redis channel using PUBLISH
88
+ * Added support for Elastica 7, and deprecated the $type argument of ElasticaFormatter which is not in use anymore as of Elastica 7
89
+ * Added support for millisecond write timeouts in SocketHandler, you can now pass floats to setWritingTimeout, e.g. 0.2 is 200ms
90
+ * Added support for unix sockets in SyslogUdpHandler (set $port to 0 to make the $host a unix socket)
91
+ * Added handleBatch support for TelegramBotHandler
92
+ * Added RFC5424e extended date format including milliseconds to SyslogUdpHandler
93
+ * Added support for configuring handlers with numeric level values in strings (coming from e.g. env vars)
94
+ * Fixed Wildfire/FirePHP/ChromePHP handling of unicode characters
95
+ * Fixed PHP 8 issues in SyslogUdpHandler
96
+ * Fixed internal type error when mbstring is missing
97
+
98
+ ### 2.1.1 (2020-07-23)
99
+
100
+ * Fixed removing of json encoding options
101
+ * Fixed type hint of $level not accepting strings in SendGridHandler and OverflowHandler
102
+ * Fixed SwiftMailerHandler not accepting email templates with an empty subject
103
+ * Fixed array access on null in RavenHandler
104
+ * Fixed unique_id in WebProcessor not being disableable
105
+
106
+ ### 2.1.0 (2020-05-22)
107
+
108
+ * Added `JSON_INVALID_UTF8_SUBSTITUTE` to default json flags, so that invalid UTF8 characters now get converted to [�](https://en.wikipedia.org/wiki/Specials_(Unicode_block)#Replacement_character) instead of being converted from ISO-8859-15 to UTF8 as it was before, which was hardly a comprehensive solution
109
+ * Added `$ignoreEmptyContextAndExtra` option to JsonFormatter to skip empty context/extra entirely from the output
110
+ * Added `$parseMode`, `$disableWebPagePreview` and `$disableNotification` options to TelegramBotHandler
111
+ * Added tentative support for PHP 8
112
+ * NormalizerFormatter::addJsonEncodeOption and removeJsonEncodeOption are now public to allow modifying default json flags
113
+ * Fixed GitProcessor type error when there is no git repo present
114
+ * Fixed normalization of SoapFault objects containing deeply nested objects as "detail"
115
+ * Fixed support for relative paths in RotatingFileHandler
116
+
117
+ ### 2.0.2 (2019-12-20)
118
+
119
+ * Fixed ElasticsearchHandler swallowing exceptions details when failing to index log records
120
+ * Fixed normalization of SoapFault objects containing non-strings as "detail" in LineFormatter
121
+ * Fixed formatting of resources in JsonFormatter
122
+ * Fixed RedisHandler failing to use MULTI properly when passed a proxied Redis instance (e.g. in Symfony with lazy services)
123
+ * Fixed FilterHandler triggering a notice when handleBatch was filtering all records passed to it
124
+ * Fixed Turkish locale messing up the conversion of level names to their constant values
125
+
126
+ ### 2.0.1 (2019-11-13)
127
+
128
+ * Fixed normalization of Traversables to avoid traversing them as not all of them are rewindable
129
+ * Fixed setFormatter/getFormatter to forward to the nested handler in FilterHandler, FingersCrossedHandler, BufferHandler, OverflowHandler and SamplingHandler
130
+ * Fixed BrowserConsoleHandler formatting when using multiple styles
131
+ * Fixed normalization of exception codes to be always integers even for PDOException which have them as numeric strings
132
+ * Fixed normalization of SoapFault objects containing non-strings as "detail"
133
+ * Fixed json encoding across all handlers to always attempt recovery of non-UTF-8 strings instead of failing the whole encoding
134
+ * Fixed ChromePHPHandler to avoid sending more data than latest Chrome versions allow in headers (4KB down from 256KB).
135
+ * Fixed type error in BrowserConsoleHandler when the context array of log records was not associative.
136
+
137
+ ### 2.0.0 (2019-08-30)
138
+
139
+ * BC Break: This is a major release, see [UPGRADE.md](UPGRADE.md) for details if you are coming from a 1.x release
140
+ * BC Break: Logger methods log/debug/info/notice/warning/error/critical/alert/emergency now have explicit void return types
141
+ * Added FallbackGroupHandler which works like the WhatFailureGroupHandler but stops dispatching log records as soon as one handler accepted it
142
+ * Fixed support for UTF-8 when cutting strings to avoid cutting a multibyte-character in half
143
+ * Fixed normalizers handling of exception backtraces to avoid serializing arguments in some cases
144
+ * Fixed date timezone handling in SyslogUdpHandler
145
+
146
+ ### 2.0.0-beta2 (2019-07-06)
147
+
148
+ * BC Break: This is a major release, see [UPGRADE.md](UPGRADE.md) for details if you are coming from a 1.x release
149
+ * BC Break: PHP 7.2 is now the minimum required PHP version.
150
+ * BC Break: Removed SlackbotHandler, RavenHandler and HipChatHandler, see [UPGRADE.md](UPGRADE.md) for details
151
+ * Added OverflowHandler which will only flush log records to its nested handler when reaching a certain amount of logs (i.e. only pass through when things go really bad)
152
+ * Added TelegramBotHandler to log records to a [Telegram](https://core.telegram.org/bots/api) bot account
153
+ * Added support for JsonSerializable when normalizing exceptions
154
+ * Added support for RFC3164 (outdated BSD syslog protocol) to SyslogUdpHandler
155
+ * Added SoapFault details to formatted exceptions
156
+ * Fixed DeduplicationHandler silently failing to start when file could not be opened
157
+ * Fixed issue in GroupHandler and WhatFailureGroupHandler where setting multiple processors would duplicate records
158
+ * Fixed GelfFormatter losing some data when one attachment was too long
159
+ * Fixed issue in SignalHandler restarting syscalls functionality
160
+ * Improved performance of LogglyHandler when sending multiple logs in a single request
161
+
162
+ ### 2.0.0-beta1 (2018-12-08)
163
+
164
+ * BC Break: This is a major release, see [UPGRADE.md](UPGRADE.md) for details if you are coming from a 1.x release
165
+ * BC Break: PHP 7.1 is now the minimum required PHP version.
166
+ * BC Break: Quite a few interface changes, only relevant if you implemented your own handlers/processors/formatters
167
+ * BC Break: Removed non-PSR-3 methods to add records, all the `add*` (e.g. `addWarning`) methods as well as `emerg`, `crit`, `err` and `warn`
168
+ * BC Break: The record timezone is now set per Logger instance and not statically anymore
169
+ * BC Break: There is no more default handler configured on empty Logger instances
170
+ * BC Break: ElasticSearchHandler renamed to ElasticaHandler
171
+ * BC Break: Various handler-specific breaks, see [UPGRADE.md](UPGRADE.md) for details
172
+ * Added scalar type hints and return hints in all the places it was possible. Switched strict_types on for more reliability.
173
+ * Added DateTimeImmutable support, all record datetime are now immutable, and will toString/json serialize with the correct date format, including microseconds (unless disabled)
174
+ * Added timezone and microseconds to the default date format
175
+ * Added SendGridHandler to use the SendGrid API to send emails
176
+ * Added LogmaticHandler to use the Logmatic.io API to store log records
177
+ * Added SqsHandler to send log records to an AWS SQS queue
178
+ * Added ElasticsearchHandler to send records via the official ES library. Elastica users should now use ElasticaHandler instead of ElasticSearchHandler
179
+ * Added NoopHandler which is similar to the NullHandle but does not prevent the bubbling of log records to handlers further down the configuration, useful for temporarily disabling a handler in configuration files
180
+ * Added ProcessHandler to write log output to the STDIN of a given process
181
+ * Added HostnameProcessor that adds the machine's hostname to log records
182
+ * Added a `$dateFormat` option to the PsrLogMessageProcessor which lets you format DateTime instances nicely
183
+ * Added support for the PHP 7.x `mongodb` extension in the MongoDBHandler
184
+ * Fixed many minor issues in various handlers, and probably added a few regressions too
185
+
186
+ ### 1.26.1 (2021-05-28)
187
+
188
+ * Fixed PHP 8.1 deprecation warning
189
+
190
+ ### 1.26.0 (2020-12-14)
191
+
192
+ * Added $dateFormat and $removeUsedContextFields arguments to PsrLogMessageProcessor (backport from 2.x)
193
+
194
+ ### 1.25.5 (2020-07-23)
195
+
196
+ * Fixed array access on null in RavenHandler
197
+ * Fixed unique_id in WebProcessor not being disableable
198
+
199
+ ### 1.25.4 (2020-05-22)
200
+
201
+ * Fixed GitProcessor type error when there is no git repo present
202
+ * Fixed normalization of SoapFault objects containing deeply nested objects as "detail"
203
+ * Fixed support for relative paths in RotatingFileHandler
204
+
205
+ ### 1.25.3 (2019-12-20)
206
+
207
+ * Fixed formatting of resources in JsonFormatter
208
+ * Fixed RedisHandler failing to use MULTI properly when passed a proxied Redis instance (e.g. in Symfony with lazy services)
209
+ * Fixed FilterHandler triggering a notice when handleBatch was filtering all records passed to it
210
+ * Fixed Turkish locale messing up the conversion of level names to their constant values
211
+
212
+ ### 1.25.2 (2019-11-13)
213
+
214
+ * Fixed normalization of Traversables to avoid traversing them as not all of them are rewindable
215
+ * Fixed setFormatter/getFormatter to forward to the nested handler in FilterHandler, FingersCrossedHandler, BufferHandler and SamplingHandler
216
+ * Fixed BrowserConsoleHandler formatting when using multiple styles
217
+ * Fixed normalization of exception codes to be always integers even for PDOException which have them as numeric strings
218
+ * Fixed normalization of SoapFault objects containing non-strings as "detail"
219
+ * Fixed json encoding across all handlers to always attempt recovery of non-UTF-8 strings instead of failing the whole encoding
220
+
221
+ ### 1.25.1 (2019-09-06)
222
+
223
+ * Fixed forward-compatible interfaces to be compatible with Monolog 1.x too.
224
+
225
+ ### 1.25.0 (2019-09-06)
226
+
227
+ * Deprecated SlackbotHandler, use SlackWebhookHandler or SlackHandler instead
228
+ * Deprecated RavenHandler, use sentry/sentry 2.x and their Sentry\Monolog\Handler instead
229
+ * Deprecated HipChatHandler, migrate to Slack and use SlackWebhookHandler or SlackHandler instead
230
+ * Added forward-compatible interfaces and traits FormattableHandlerInterface, FormattableHandlerTrait, ProcessableHandlerInterface, ProcessableHandlerTrait. If you use modern PHP and want to make code compatible with Monolog 1 and 2 this can help. You will have to require at least Monolog 1.25 though.
231
+ * Added support for RFC3164 (outdated BSD syslog protocol) to SyslogUdpHandler
232
+ * Fixed issue in GroupHandler and WhatFailureGroupHandler where setting multiple processors would duplicate records
233
+ * Fixed issue in SignalHandler restarting syscalls functionality
234
+ * Fixed normalizers handling of exception backtraces to avoid serializing arguments in some cases
235
+ * Fixed ZendMonitorHandler to work with the latest Zend Server versions
236
+ * Fixed ChromePHPHandler to avoid sending more data than latest Chrome versions allow in headers (4KB down from 256KB).
237
+
238
+ ### 1.24.0 (2018-11-05)
239
+
240
+ * BC Notice: If you are extending any of the Monolog's Formatters' `normalize` method, make sure you add the new `$depth = 0` argument to your function signature to avoid strict PHP warnings.
241
+ * Added a `ResettableInterface` in order to reset/reset/clear/flush handlers and processors
242
+ * Added a `ProcessorInterface` as an optional way to label a class as being a processor (mostly useful for autowiring dependency containers)
243
+ * Added a way to log signals being received using Monolog\SignalHandler
244
+ * Added ability to customize error handling at the Logger level using Logger::setExceptionHandler
245
+ * Added InsightOpsHandler to migrate users of the LogEntriesHandler
246
+ * Added protection to NormalizerFormatter against circular and very deep structures, it now stops normalizing at a depth of 9
247
+ * Added capture of stack traces to ErrorHandler when logging PHP errors
248
+ * Added RavenHandler support for a `contexts` context or extra key to forward that to Sentry's contexts
249
+ * Added forwarding of context info to FluentdFormatter
250
+ * Added SocketHandler::setChunkSize to override the default chunk size in case you must send large log lines to rsyslog for example
251
+ * Added ability to extend/override BrowserConsoleHandler
252
+ * Added SlackWebhookHandler::getWebhookUrl and SlackHandler::getToken to enable class extensibility
253
+ * Added SwiftMailerHandler::getSubjectFormatter to enable class extensibility
254
+ * Dropped official support for HHVM in test builds
255
+ * Fixed normalization of exception traces when call_user_func is used to avoid serializing objects and the data they contain
256
+ * Fixed naming of fields in Slack handler, all field names are now capitalized in all cases
257
+ * Fixed HipChatHandler bug where slack dropped messages randomly
258
+ * Fixed normalization of objects in Slack handlers
259
+ * Fixed support for PHP7's Throwable in NewRelicHandler
260
+ * Fixed race bug when StreamHandler sometimes incorrectly reported it failed to create a directory
261
+ * Fixed table row styling issues in HtmlFormatter
262
+ * Fixed RavenHandler dropping the message when logging exception
263
+ * Fixed WhatFailureGroupHandler skipping processors when using handleBatch
264
+ and implement it where possible
265
+ * Fixed display of anonymous class names
266
+
267
+ ### 1.23.0 (2017-06-19)
268
+
269
+ * Improved SyslogUdpHandler's support for RFC5424 and added optional `$ident` argument
270
+ * Fixed GelfHandler truncation to be per field and not per message
271
+ * Fixed compatibility issue with PHP <5.3.6
272
+ * Fixed support for headless Chrome in ChromePHPHandler
273
+ * Fixed support for latest Aws SDK in DynamoDbHandler
274
+ * Fixed support for SwiftMailer 6.0+ in SwiftMailerHandler
275
+
276
+ ### 1.22.1 (2017-03-13)
277
+
278
+ * Fixed lots of minor issues in the new Slack integrations
279
+ * Fixed support for allowInlineLineBreaks in LineFormatter when formatting exception backtraces
280
+
281
+ ### 1.22.0 (2016-11-26)
282
+
283
+ * Added SlackbotHandler and SlackWebhookHandler to set up Slack integration more easily
284
+ * Added MercurialProcessor to add mercurial revision and branch names to log records
285
+ * Added support for AWS SDK v3 in DynamoDbHandler
286
+ * Fixed fatal errors occurring when normalizing generators that have been fully consumed
287
+ * Fixed RollbarHandler to include a level (rollbar level), monolog_level (original name), channel and datetime (unix)
288
+ * Fixed RollbarHandler not flushing records automatically, calling close() explicitly is not necessary anymore
289
+ * Fixed SyslogUdpHandler to avoid sending empty frames
290
+ * Fixed a few PHP 7.0 and 7.1 compatibility issues
291
+
292
+ ### 1.21.0 (2016-07-29)
293
+
294
+ * Break: Reverted the addition of $context when the ErrorHandler handles regular php errors from 1.20.0 as it was causing issues
295
+ * Added support for more formats in RotatingFileHandler::setFilenameFormat as long as they have Y, m and d in order
296
+ * Added ability to format the main line of text the SlackHandler sends by explicitly setting a formatter on the handler
297
+ * Added information about SoapFault instances in NormalizerFormatter
298
+ * Added $handleOnlyReportedErrors option on ErrorHandler::registerErrorHandler (default true) to allow logging of all errors no matter the error_reporting level
299
+
300
+ ### 1.20.0 (2016-07-02)
301
+
302
+ * Added FingersCrossedHandler::activate() to manually trigger the handler regardless of the activation policy
303
+ * Added StreamHandler::getUrl to retrieve the stream's URL
304
+ * Added ability to override addRow/addTitle in HtmlFormatter
305
+ * Added the $context to context information when the ErrorHandler handles a regular php error
306
+ * Deprecated RotatingFileHandler::setFilenameFormat to only support 3 formats: Y, Y-m and Y-m-d
307
+ * Fixed WhatFailureGroupHandler to work with PHP7 throwables
308
+ * Fixed a few minor bugs
309
+
310
+ ### 1.19.0 (2016-04-12)
311
+
312
+ * Break: StreamHandler will not close streams automatically that it does not own. If you pass in a stream (not a path/url), then it will not close it for you. You can retrieve those using getStream() if needed
313
+ * Added DeduplicationHandler to remove duplicate records from notifications across multiple requests, useful for email or other notifications on errors
314
+ * Added ability to use `%message%` and other LineFormatter replacements in the subject line of emails sent with NativeMailHandler and SwiftMailerHandler
315
+ * Fixed HipChatHandler handling of long messages
316
+
317
+ ### 1.18.2 (2016-04-02)
318
+
319
+ * Fixed ElasticaFormatter to use more precise dates
320
+ * Fixed GelfMessageFormatter sending too long messages
321
+
322
+ ### 1.18.1 (2016-03-13)
323
+
324
+ * Fixed SlackHandler bug where slack dropped messages randomly
325
+ * Fixed RedisHandler issue when using with the PHPRedis extension
326
+ * Fixed AmqpHandler content-type being incorrectly set when using with the AMQP extension
327
+ * Fixed BrowserConsoleHandler regression
328
+
329
+ ### 1.18.0 (2016-03-01)
330
+
331
+ * Added optional reduction of timestamp precision via `Logger->useMicrosecondTimestamps(false)`, disabling it gets you a bit of performance boost but reduces the precision to the second instead of microsecond
332
+ * Added possibility to skip some extra stack frames in IntrospectionProcessor if you have some library wrapping Monolog that is always adding frames
333
+ * Added `Logger->withName` to clone a logger (keeping all handlers) with a new name
334
+ * Added FluentdFormatter for the Fluentd unix socket protocol
335
+ * Added HandlerWrapper base class to ease the creation of handler wrappers, just extend it and override as needed
336
+ * Added support for replacing context sub-keys using `%context.*%` in LineFormatter
337
+ * Added support for `payload` context value in RollbarHandler
338
+ * Added setRelease to RavenHandler to describe the application version, sent with every log
339
+ * Added support for `fingerprint` context value in RavenHandler
340
+ * Fixed JSON encoding errors that would gobble up the whole log record, we now handle those more gracefully by dropping chars as needed
341
+ * Fixed write timeouts in SocketHandler and derivatives, set to 10sec by default, lower it with `setWritingTimeout()`
342
+ * Fixed PHP7 compatibility with regard to Exception/Throwable handling in a few places
343
+
344
+ ### 1.17.2 (2015-10-14)
345
+
346
+ * Fixed ErrorHandler compatibility with non-Monolog PSR-3 loggers
347
+ * Fixed SlackHandler handling to use slack functionalities better
348
+ * Fixed SwiftMailerHandler bug when sending multiple emails they all had the same id
349
+ * Fixed 5.3 compatibility regression
350
+
351
+ ### 1.17.1 (2015-08-31)
352
+
353
+ * Fixed RollbarHandler triggering PHP notices
354
+
355
+ ### 1.17.0 (2015-08-30)
356
+
357
+ * Added support for `checksum` and `release` context/extra values in RavenHandler
358
+ * Added better support for exceptions in RollbarHandler
359
+ * Added UidProcessor::getUid
360
+ * Added support for showing the resource type in NormalizedFormatter
361
+ * Fixed IntrospectionProcessor triggering PHP notices
362
+
363
+ ### 1.16.0 (2015-08-09)
364
+
365
+ * Added IFTTTHandler to notify ifttt.com triggers
366
+ * Added Logger::setHandlers() to allow setting/replacing all handlers
367
+ * Added $capSize in RedisHandler to cap the log size
368
+ * Fixed StreamHandler creation of directory to only trigger when the first log write happens
369
+ * Fixed bug in the handling of curl failures
370
+ * Fixed duplicate logging of fatal errors when both error and fatal error handlers are registered in monolog's ErrorHandler
371
+ * Fixed missing fatal errors records with handlers that need to be closed to flush log records
372
+ * Fixed TagProcessor::addTags support for associative arrays
373
+
374
+ ### 1.15.0 (2015-07-12)
375
+
376
+ * Added addTags and setTags methods to change a TagProcessor
377
+ * Added automatic creation of directories if they are missing for a StreamHandler to open a log file
378
+ * Added retry functionality to Loggly, Cube and Mandrill handlers so they retry up to 5 times in case of network failure
379
+ * Fixed process exit code being incorrectly reset to 0 if ErrorHandler::registerExceptionHandler was used
380
+ * Fixed HTML/JS escaping in BrowserConsoleHandler
381
+ * Fixed JSON encoding errors being silently suppressed (PHP 5.5+ only)
382
+
383
+ ### 1.14.0 (2015-06-19)
384
+
385
+ * Added PHPConsoleHandler to send record to Chrome's PHP Console extension and library
386
+ * Added support for objects implementing __toString in the NormalizerFormatter
387
+ * Added support for HipChat's v2 API in HipChatHandler
388
+ * Added Logger::setTimezone() to initialize the timezone monolog should use in case date.timezone isn't correct for your app
389
+ * Added an option to send formatted message instead of the raw record on PushoverHandler via ->useFormattedMessage(true)
390
+ * Fixed curl errors being silently suppressed
391
+
392
+ ### 1.13.1 (2015-03-09)
393
+
394
+ * Fixed regression in HipChat requiring a new token to be created
395
+
396
+ ### 1.13.0 (2015-03-05)
397
+
398
+ * Added Registry::hasLogger to check for the presence of a logger instance
399
+ * Added context.user support to RavenHandler
400
+ * Added HipChat API v2 support in the HipChatHandler
401
+ * Added NativeMailerHandler::addParameter to pass params to the mail() process
402
+ * Added context data to SlackHandler when $includeContextAndExtra is true
403
+ * Added ability to customize the Swift_Message per-email in SwiftMailerHandler
404
+ * Fixed SwiftMailerHandler to lazily create message instances if a callback is provided
405
+ * Fixed serialization of INF and NaN values in Normalizer and LineFormatter
406
+
407
+ ### 1.12.0 (2014-12-29)
408
+
409
+ * Break: HandlerInterface::isHandling now receives a partial record containing only a level key. This was always the intent and does not break any Monolog handler but is strictly speaking a BC break and you should check if you relied on any other field in your own handlers.
410
+ * Added PsrHandler to forward records to another PSR-3 logger
411
+ * Added SamplingHandler to wrap around a handler and include only every Nth record
412
+ * Added MongoDBFormatter to support better storage with MongoDBHandler (it must be enabled manually for now)
413
+ * Added exception codes in the output of most formatters
414
+ * Added LineFormatter::includeStacktraces to enable exception stack traces in logs (uses more than one line)
415
+ * Added $useShortAttachment to SlackHandler to minify attachment size and $includeExtra to append extra data
416
+ * Added $host to HipChatHandler for users of private instances
417
+ * Added $transactionName to NewRelicHandler and support for a transaction_name context value
418
+ * Fixed MandrillHandler to avoid outputting API call responses
419
+ * Fixed some non-standard behaviors in SyslogUdpHandler
420
+
421
+ ### 1.11.0 (2014-09-30)
422
+
423
+ * Break: The NewRelicHandler extra and context data are now prefixed with extra_ and context_ to avoid clashes. Watch out if you have scripts reading those from the API and rely on names
424
+ * Added WhatFailureGroupHandler to suppress any exception coming from the wrapped handlers and avoid chain failures if a logging service fails
425
+ * Added MandrillHandler to send emails via the Mandrillapp.com API
426
+ * Added SlackHandler to log records to a Slack.com account
427
+ * Added FleepHookHandler to log records to a Fleep.io account
428
+ * Added LogglyHandler::addTag to allow adding tags to an existing handler
429
+ * Added $ignoreEmptyContextAndExtra to LineFormatter to avoid empty [] at the end
430
+ * Added $useLocking to StreamHandler and RotatingFileHandler to enable flock() while writing
431
+ * Added support for PhpAmqpLib in the AmqpHandler
432
+ * Added FingersCrossedHandler::clear and BufferHandler::clear to reset them between batches in long running jobs
433
+ * Added support for adding extra fields from $_SERVER in the WebProcessor
434
+ * Fixed support for non-string values in PrsLogMessageProcessor
435
+ * Fixed SwiftMailer messages being sent with the wrong date in long running scripts
436
+ * Fixed minor PHP 5.6 compatibility issues
437
+ * Fixed BufferHandler::close being called twice
438
+
439
+ ### 1.10.0 (2014-06-04)
440
+
441
+ * Added Logger::getHandlers() and Logger::getProcessors() methods
442
+ * Added $passthruLevel argument to FingersCrossedHandler to let it always pass some records through even if the trigger level is not reached
443
+ * Added support for extra data in NewRelicHandler
444
+ * Added $expandNewlines flag to the ErrorLogHandler to create multiple log entries when a message has multiple lines
445
+
446
+ ### 1.9.1 (2014-04-24)
447
+
448
+ * Fixed regression in RotatingFileHandler file permissions
449
+ * Fixed initialization of the BufferHandler to make sure it gets flushed after receiving records
450
+ * Fixed ChromePHPHandler and FirePHPHandler's activation strategies to be more conservative
451
+
452
+ ### 1.9.0 (2014-04-20)
453
+
454
+ * Added LogEntriesHandler to send logs to a LogEntries account
455
+ * Added $filePermissions to tweak file mode on StreamHandler and RotatingFileHandler
456
+ * Added $useFormatting flag to MemoryProcessor to make it send raw data in bytes
457
+ * Added support for table formatting in FirePHPHandler via the table context key
458
+ * Added a TagProcessor to add tags to records, and support for tags in RavenHandler
459
+ * Added $appendNewline flag to the JsonFormatter to enable using it when logging to files
460
+ * Added sound support to the PushoverHandler
461
+ * Fixed multi-threading support in StreamHandler
462
+ * Fixed empty headers issue when ChromePHPHandler received no records
463
+ * Fixed default format of the ErrorLogHandler
464
+
465
+ ### 1.8.0 (2014-03-23)
466
+
467
+ * Break: the LineFormatter now strips newlines by default because this was a bug, set $allowInlineLineBreaks to true if you need them
468
+ * Added BrowserConsoleHandler to send logs to any browser's console via console.log() injection in the output
469
+ * Added FilterHandler to filter records and only allow those of a given list of levels through to the wrapped handler
470
+ * Added FlowdockHandler to send logs to a Flowdock account
471
+ * Added RollbarHandler to send logs to a Rollbar account
472
+ * Added HtmlFormatter to send prettier log emails with colors for each log level
473
+ * Added GitProcessor to add the current branch/commit to extra record data
474
+ * Added a Monolog\Registry class to allow easier global access to pre-configured loggers
475
+ * Added support for the new official graylog2/gelf-php lib for GelfHandler, upgrade if you can by replacing the mlehner/gelf-php requirement
476
+ * Added support for HHVM
477
+ * Added support for Loggly batch uploads
478
+ * Added support for tweaking the content type and encoding in NativeMailerHandler
479
+ * Added $skipClassesPartials to tweak the ignored classes in the IntrospectionProcessor
480
+ * Fixed batch request support in GelfHandler
481
+
482
+ ### 1.7.0 (2013-11-14)
483
+
484
+ * Added ElasticSearchHandler to send logs to an Elastic Search server
485
+ * Added DynamoDbHandler and ScalarFormatter to send logs to Amazon's Dynamo DB
486
+ * Added SyslogUdpHandler to send logs to a remote syslogd server
487
+ * Added LogglyHandler to send logs to a Loggly account
488
+ * Added $level to IntrospectionProcessor so it only adds backtraces when needed
489
+ * Added $version to LogstashFormatter to allow using the new v1 Logstash format
490
+ * Added $appName to NewRelicHandler
491
+ * Added configuration of Pushover notification retries/expiry
492
+ * Added $maxColumnWidth to NativeMailerHandler to change the 70 chars default
493
+ * Added chainability to most setters for all handlers
494
+ * Fixed RavenHandler batch processing so it takes the message from the record with highest priority
495
+ * Fixed HipChatHandler batch processing so it sends all messages at once
496
+ * Fixed issues with eAccelerator
497
+ * Fixed and improved many small things
498
+
499
+ ### 1.6.0 (2013-07-29)
500
+
501
+ * Added HipChatHandler to send logs to a HipChat chat room
502
+ * Added ErrorLogHandler to send logs to PHP's error_log function
503
+ * Added NewRelicHandler to send logs to NewRelic's service
504
+ * Added Monolog\ErrorHandler helper class to register a Logger as exception/error/fatal handler
505
+ * Added ChannelLevelActivationStrategy for the FingersCrossedHandler to customize levels by channel
506
+ * Added stack traces output when normalizing exceptions (json output & co)
507
+ * Added Monolog\Logger::API constant (currently 1)
508
+ * Added support for ChromePHP's v4.0 extension
509
+ * Added support for message priorities in PushoverHandler, see $highPriorityLevel and $emergencyLevel
510
+ * Added support for sending messages to multiple users at once with the PushoverHandler
511
+ * Fixed RavenHandler's support for batch sending of messages (when behind a Buffer or FingersCrossedHandler)
512
+ * Fixed normalization of Traversables with very large data sets, only the first 1000 items are shown now
513
+ * Fixed issue in RotatingFileHandler when an open_basedir restriction is active
514
+ * Fixed minor issues in RavenHandler and bumped the API to Raven 0.5.0
515
+ * Fixed SyslogHandler issue when many were used concurrently with different facilities
516
+
517
+ ### 1.5.0 (2013-04-23)
518
+
519
+ * Added ProcessIdProcessor to inject the PID in log records
520
+ * Added UidProcessor to inject a unique identifier to all log records of one request/run
521
+ * Added support for previous exceptions in the LineFormatter exception serialization
522
+ * Added Monolog\Logger::getLevels() to get all available levels
523
+ * Fixed ChromePHPHandler so it avoids sending headers larger than Chrome can handle
524
+
525
+ ### 1.4.1 (2013-04-01)
526
+
527
+ * Fixed exception formatting in the LineFormatter to be more minimalistic
528
+ * Fixed RavenHandler's handling of context/extra data, requires Raven client >0.1.0
529
+ * Fixed log rotation in RotatingFileHandler to work with long running scripts spanning multiple days
530
+ * Fixed WebProcessor array access so it checks for data presence
531
+ * Fixed Buffer, Group and FingersCrossed handlers to make use of their processors
532
+
533
+ ### 1.4.0 (2013-02-13)
534
+
535
+ * Added RedisHandler to log to Redis via the Predis library or the phpredis extension
536
+ * Added ZendMonitorHandler to log to the Zend Server monitor
537
+ * Added the possibility to pass arrays of handlers and processors directly in the Logger constructor
538
+ * Added `$useSSL` option to the PushoverHandler which is enabled by default
539
+ * Fixed ChromePHPHandler and FirePHPHandler issue when multiple instances are used simultaneously
540
+ * Fixed header injection capability in the NativeMailHandler
541
+
542
+ ### 1.3.1 (2013-01-11)
543
+
544
+ * Fixed LogstashFormatter to be usable with stream handlers
545
+ * Fixed GelfMessageFormatter levels on Windows
546
+
547
+ ### 1.3.0 (2013-01-08)
548
+
549
+ * Added PSR-3 compliance, the `Monolog\Logger` class is now an instance of `Psr\Log\LoggerInterface`
550
+ * Added PsrLogMessageProcessor that you can selectively enable for full PSR-3 compliance
551
+ * Added LogstashFormatter (combine with SocketHandler or StreamHandler to send logs to Logstash)
552
+ * Added PushoverHandler to send mobile notifications
553
+ * Added CouchDBHandler and DoctrineCouchDBHandler
554
+ * Added RavenHandler to send data to Sentry servers
555
+ * Added support for the new MongoClient class in MongoDBHandler
556
+ * Added microsecond precision to log records' timestamps
557
+ * Added `$flushOnOverflow` param to BufferHandler to flush by batches instead of losing
558
+ the oldest entries
559
+ * Fixed normalization of objects with cyclic references
560
+
561
+ ### 1.2.1 (2012-08-29)
562
+
563
+ * Added new $logopts arg to SyslogHandler to provide custom openlog options
564
+ * Fixed fatal error in SyslogHandler
565
+
566
+ ### 1.2.0 (2012-08-18)
567
+
568
+ * Added AmqpHandler (for use with AMQP servers)
569
+ * Added CubeHandler
570
+ * Added NativeMailerHandler::addHeader() to send custom headers in mails
571
+ * Added the possibility to specify more than one recipient in NativeMailerHandler
572
+ * Added the possibility to specify float timeouts in SocketHandler
573
+ * Added NOTICE and EMERGENCY levels to conform with RFC 5424
574
+ * Fixed the log records to use the php default timezone instead of UTC
575
+ * Fixed BufferHandler not being flushed properly on PHP fatal errors
576
+ * Fixed normalization of exotic resource types
577
+ * Fixed the default format of the SyslogHandler to avoid duplicating datetimes in syslog
578
+
579
+ ### 1.1.0 (2012-04-23)
580
+
581
+ * Added Monolog\Logger::isHandling() to check if a handler will
582
+ handle the given log level
583
+ * Added ChromePHPHandler
584
+ * Added MongoDBHandler
585
+ * Added GelfHandler (for use with Graylog2 servers)
586
+ * Added SocketHandler (for use with syslog-ng for example)
587
+ * Added NormalizerFormatter
588
+ * Added the possibility to change the activation strategy of the FingersCrossedHandler
589
+ * Added possibility to show microseconds in logs
590
+ * Added `server` and `referer` to WebProcessor output
591
+
592
+ ### 1.0.2 (2011-10-24)
593
+
594
+ * Fixed bug in IE with large response headers and FirePHPHandler
595
+
596
+ ### 1.0.1 (2011-08-25)
597
+
598
+ * Added MemoryPeakUsageProcessor and MemoryUsageProcessor
599
+ * Added Monolog\Logger::getName() to get a logger's channel name
600
+
601
+ ### 1.0.0 (2011-07-06)
602
+
603
+ * Added IntrospectionProcessor to get info from where the logger was called
604
+ * Fixed WebProcessor in CLI
605
+
606
+ ### 1.0.0-RC1 (2011-07-01)
607
+
608
+ * Initial release
vendor/monolog/monolog/LICENSE ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright (c) 2011-2020 Jordi Boggiano
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is furnished
8
+ to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
vendor/monolog/monolog/README.md ADDED
@@ -0,0 +1,112 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Monolog - Logging for PHP [![Continuous Integration](https://github.com/Seldaek/monolog/workflows/Continuous%20Integration/badge.svg?branch=main)](https://github.com/Seldaek/monolog/actions)
2
+
3
+ [![Total Downloads](https://img.shields.io/packagist/dt/monolog/monolog.svg)](https://packagist.org/packages/monolog/monolog)
4
+ [![Latest Stable Version](https://img.shields.io/packagist/v/monolog/monolog.svg)](https://packagist.org/packages/monolog/monolog)
5
+
6
+
7
+ Monolog sends your logs to files, sockets, inboxes, databases and various
8
+ web services. See the complete list of handlers below. Special handlers
9
+ allow you to build advanced logging strategies.
10
+
11
+ This library implements the [PSR-3](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md)
12
+ interface that you can type-hint against in your own libraries to keep
13
+ a maximum of interoperability. You can also use it in your applications to
14
+ make sure you can always use another compatible logger at a later time.
15
+ As of 1.11.0 Monolog public APIs will also accept PSR-3 log levels.
16
+ Internally Monolog still uses its own level scheme since it predates PSR-3.
17
+
18
+ ## Installation
19
+
20
+ Install the latest version with
21
+
22
+ ```bash
23
+ $ composer require monolog/monolog
24
+ ```
25
+
26
+ ## Basic Usage
27
+
28
+ ```php
29
+ <?php
30
+
31
+ use Monolog\Logger;
32
+ use Monolog\Handler\StreamHandler;
33
+
34
+ // create a log channel
35
+ $log = new Logger('name');
36
+ $log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING));
37
+
38
+ // add records to the log
39
+ $log->warning('Foo');
40
+ $log->error('Bar');
41
+ ```
42
+
43
+ ## Documentation
44
+
45
+ - [Usage Instructions](doc/01-usage.md)
46
+ - [Handlers, Formatters and Processors](doc/02-handlers-formatters-processors.md)
47
+ - [Utility Classes](doc/03-utilities.md)
48
+ - [Extending Monolog](doc/04-extending.md)
49
+ - [Log Record Structure](doc/message-structure.md)
50
+
51
+ ## Support Monolog Financially
52
+
53
+ Get supported Monolog and help fund the project with the [Tidelift Subscription](https://tidelift.com/subscription/pkg/packagist-monolog-monolog?utm_source=packagist-monolog-monolog&utm_medium=referral&utm_campaign=enterprise) or via [GitHub sponsorship](https://github.com/sponsors/Seldaek).
54
+
55
+ Tidelift delivers commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use.
56
+
57
+ ## Third Party Packages
58
+
59
+ Third party handlers, formatters and processors are
60
+ [listed in the wiki](https://github.com/Seldaek/monolog/wiki/Third-Party-Packages). You
61
+ can also add your own there if you publish one.
62
+
63
+ ## About
64
+
65
+ ### Requirements
66
+
67
+ - Monolog `^2.0` works with PHP 7.2 or above, use Monolog `^1.25` for PHP 5.3+ support.
68
+
69
+ ### Support
70
+
71
+ Monolog 1.x support is somewhat limited at this point and only important fixes will be done. You should migrate to Monolog 2 where possible to benefit from all the latest features and fixes.
72
+
73
+ ### Submitting bugs and feature requests
74
+
75
+ Bugs and feature request are tracked on [GitHub](https://github.com/Seldaek/monolog/issues)
76
+
77
+ ### Framework Integrations
78
+
79
+ - Frameworks and libraries using [PSR-3](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md)
80
+ can be used very easily with Monolog since it implements the interface.
81
+ - [Symfony](http://symfony.com) comes out of the box with Monolog.
82
+ - [Laravel](http://laravel.com/) comes out of the box with Monolog.
83
+ - [Lumen](http://lumen.laravel.com/) comes out of the box with Monolog.
84
+ - [PPI](https://github.com/ppi/framework) comes out of the box with Monolog.
85
+ - [CakePHP](http://cakephp.org/) is usable with Monolog via the [cakephp-monolog](https://github.com/jadb/cakephp-monolog) plugin.
86
+ - [Slim](http://www.slimframework.com/) is usable with Monolog via the [Slim-Monolog](https://github.com/Flynsarmy/Slim-Monolog) log writer.
87
+ - [XOOPS 2.6](http://xoops.org/) comes out of the box with Monolog.
88
+ - [Aura.Web_Project](https://github.com/auraphp/Aura.Web_Project) comes out of the box with Monolog.
89
+ - [Nette Framework](http://nette.org/en/) is usable with Monolog via the [contributte/monolog](https://github.com/contributte/monolog) or [orisai/nette-monolog](https://github.com/orisai/nette-monolog) extensions.
90
+ - [Proton Micro Framework](https://github.com/alexbilbie/Proton) comes out of the box with Monolog.
91
+ - [FuelPHP](http://fuelphp.com/) comes out of the box with Monolog.
92
+ - [Equip Framework](https://github.com/equip/framework) comes out of the box with Monolog.
93
+ - [Yii 2](http://www.yiiframework.com/) is usable with Monolog via the [yii2-monolog](https://github.com/merorafael/yii2-monolog) or [yii2-psr-log-target](https://github.com/samdark/yii2-psr-log-target) plugins.
94
+ - [Hawkbit Micro Framework](https://github.com/HawkBitPhp/hawkbit) comes out of the box with Monolog.
95
+ - [SilverStripe 4](https://www.silverstripe.org/) comes out of the box with Monolog.
96
+ - [Drupal](https://www.drupal.org/) is usable with Monolog via the [monolog](https://www.drupal.org/project/monolog) module.
97
+ - [Aimeos ecommerce framework](https://aimeos.org/) is usable with Monolog via the [ai-monolog](https://github.com/aimeos/ai-monolog) extension.
98
+ - [Magento](https://magento.com/) comes out of the box with Monolog.
99
+
100
+ ### Author
101
+
102
+ Jordi Boggiano - <j.boggiano@seld.be> - <http://twitter.com/seldaek><br />
103
+ See also the list of [contributors](https://github.com/Seldaek/monolog/contributors) who participated in this project.
104
+
105
+ ### License
106
+
107
+ Monolog is licensed under the MIT License - see the [LICENSE](LICENSE) file for details
108
+
109
+ ### Acknowledgements
110
+
111
+ This library is heavily inspired by Python's [Logbook](https://logbook.readthedocs.io/en/stable/)
112
+ library, although most concepts have been adjusted to fit to the PHP world.
vendor/monolog/monolog/UPGRADE.md ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ### 2.0.0
2
+
3
+ - `Monolog\Logger::API` can be used to distinguish between a Monolog `1` and `2`
4
+ install of Monolog when writing integration code.
5
+
6
+ - Removed non-PSR-3 methods to add records, all the `add*` (e.g. `addWarning`)
7
+ methods as well as `emerg`, `crit`, `err` and `warn`.
8
+
9
+ - DateTime are now formatted with a timezone and microseconds (unless disabled).
10
+ Various formatters and log output might be affected, which may mess with log parsing
11
+ in some cases.
12
+
13
+ - The `datetime` in every record array is now a DateTimeImmutable, not that you
14
+ should have been modifying these anyway.
15
+
16
+ - The timezone is now set per Logger instance and not statically, either
17
+ via ->setTimezone or passed in the constructor. Calls to Logger::setTimezone
18
+ should be converted.
19
+
20
+ - `HandlerInterface` has been split off and two new interfaces now exist for
21
+ more granular controls: `ProcessableHandlerInterface` and
22
+ `FormattableHandlerInterface`. Handlers not extending `AbstractHandler`
23
+ should make sure to implement the relevant interfaces.
24
+
25
+ - `HandlerInterface` now requires the `close` method to be implemented. This
26
+ only impacts you if you implement the interface yourself, but you can extend
27
+ the new `Monolog\Handler\Handler` base class too.
28
+
29
+ - There is no more default handler configured on empty Logger instances, if
30
+ you were relying on that you will not get any output anymore, make sure to
31
+ configure the handler you need.
32
+
33
+ #### LogglyFormatter
34
+
35
+ - The records' `datetime` is not sent anymore. Only `timestamp` is sent to Loggly.
36
+
37
+ #### AmqpHandler
38
+
39
+ - Log levels are not shortened to 4 characters anymore. e.g. a warning record
40
+ will be sent using the `warning.channel` routing key instead of `warn.channel`
41
+ as in 1.x.
42
+ - The exchange name does not default to 'log' anymore, and it is completely ignored
43
+ now for the AMQP extension users. Only PHPAmqpLib uses it if provided.
44
+
45
+ #### RotatingFileHandler
46
+
47
+ - The file name format must now contain `{date}` and the date format must be set
48
+ to one of the predefined FILE_PER_* constants to avoid issues with file rotation.
49
+ See `setFilenameFormat`.
50
+
51
+ #### LogstashFormatter
52
+
53
+ - Removed Logstash V0 support
54
+ - Context/extra prefix has been removed in favor of letting users configure the exact key being sent
55
+ - Context/extra data are now sent as an object instead of single keys
56
+
57
+ #### HipChatHandler
58
+
59
+ - Removed deprecated HipChat handler, migrate to Slack and use SlackWebhookHandler or SlackHandler instead
60
+
61
+ #### SlackbotHandler
62
+
63
+ - Removed deprecated SlackbotHandler handler, use SlackWebhookHandler or SlackHandler instead
64
+
65
+ #### RavenHandler
66
+
67
+ - Removed deprecated RavenHandler handler, use sentry/sentry 2.x and their Sentry\Monolog\Handler instead
68
+
69
+ #### ElasticSearchHandler
70
+
71
+ - As support for the official Elasticsearch library was added, the former ElasticSearchHandler has been
72
+ renamed to ElasticaHandler and the new one added as ElasticsearchHandler.
vendor/monolog/monolog/composer.json ADDED
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "monolog/monolog",
3
+ "description": "Sends your logs to files, sockets, inboxes, databases and various web services",
4
+ "keywords": ["log", "logging", "psr-3"],
5
+ "homepage": "https://github.com/Seldaek/monolog",
6
+ "type": "library",
7
+ "license": "MIT",
8
+ "authors": [
9
+ {
10
+ "name": "Jordi Boggiano",
11
+ "email": "j.boggiano@seld.be",
12
+ "homepage": "https://seld.be"
13
+ }
14
+ ],
15
+ "require": {
16
+ "php": ">=7.2",
17
+ "psr/log": "^1.0.1 || ^2.0 || ^3.0"
18
+ },
19
+ "require-dev": {
20
+ "ext-json": "*",
21
+ "aws/aws-sdk-php": "^2.4.9 || ^3.0",
22
+ "doctrine/couchdb": "~1.0@dev",
23
+ "elasticsearch/elasticsearch": "^7 || ^8",
24
+ "graylog2/gelf-php": "^1.4.2",
25
+ "guzzlehttp/guzzle": "^7.4",
26
+ "guzzlehttp/psr7": "^2.2",
27
+ "mongodb/mongodb": "^1.8",
28
+ "php-amqplib/php-amqplib": "~2.4 || ^3",
29
+ "phpspec/prophecy": "^1.15",
30
+ "phpstan/phpstan": "^0.12.91",
31
+ "phpunit/phpunit": "^8.5.14",
32
+ "predis/predis": "^1.1 || ^2.0",
33
+ "rollbar/rollbar": "^1.3 || ^2 || ^3",
34
+ "ruflin/elastica": "^7",
35
+ "swiftmailer/swiftmailer": "^5.3|^6.0",
36
+ "symfony/mailer": "^5.4 || ^6",
37
+ "symfony/mime": "^5.4 || ^6"
38
+ },
39
+ "suggest": {
40
+ "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
41
+ "doctrine/couchdb": "Allow sending log messages to a CouchDB server",
42
+ "ruflin/elastica": "Allow sending log messages to an Elastic Search server",
43
+ "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client",
44
+ "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
45
+ "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
46
+ "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)",
47
+ "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)",
48
+ "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
49
+ "rollbar/rollbar": "Allow sending log messages to Rollbar",
50
+ "ext-mbstring": "Allow to work properly with unicode symbols",
51
+ "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)",
52
+ "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler",
53
+ "ext-openssl": "Required to send log messages using SSL"
54
+ },
55
+ "autoload": {
56
+ "psr-4": {"Monolog\\": "src/Monolog"}
57
+ },
58
+ "autoload-dev": {
59
+ "psr-4": {"Monolog\\": "tests/Monolog"}
60
+ },
61
+ "provide": {
62
+ "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0"
63
+ },
64
+ "extra": {
65
+ "branch-alias": {
66
+ "dev-main": "2.x-dev"
67
+ }
68
+ },
69
+ "scripts": {
70
+ "test": "@php vendor/bin/phpunit",
71
+ "phpstan": "@php vendor/bin/phpstan analyse"
72
+ },
73
+ "config": {
74
+ "lock": false,
75
+ "sort-packages": true,
76
+ "platform-check": false,
77
+ "allow-plugins": {
78
+ "composer/package-versions-deprecated": true
79
+ }
80
+ }
81
+ }
vendor/monolog/monolog/src/Monolog/Attribute/AsMonologProcessor.php ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Attribute;
13
+
14
+ /**
15
+ * A reusable attribute to help configure a class or a method as a processor.
16
+ *
17
+ * Using it offers no guarantee: it needs to be leveraged by a Monolog third-party consumer.
18
+ *
19
+ * Using it with the Monolog library only has no effect at all: processors should still be turned into a callable if
20
+ * needed and manually pushed to the loggers and to the processable handlers.
21
+ */
22
+ #[\Attribute(\Attribute::TARGET_CLASS | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
23
+ class AsMonologProcessor
24
+ {
25
+ /** @var string|null */
26
+ public $channel = null;
27
+ /** @var string|null */
28
+ public $handler = null;
29
+ /** @var string|null */
30
+ public $method = null;
31
+
32
+ /**
33
+ * @param string|null $channel The logging channel the processor should be pushed to.
34
+ * @param string|null $handler The handler the processor should be pushed to.
35
+ * @param string|null $method The method that processes the records (if the attribute is used at the class level).
36
+ */
37
+ public function __construct(
38
+ ?string $channel = null,
39
+ ?string $handler = null,
40
+ ?string $method = null
41
+ ) {
42
+ $this->channel = $channel;
43
+ $this->handler = $handler;
44
+ $this->method = $method;
45
+ }
46
+ }
vendor/monolog/monolog/src/Monolog/DateTimeImmutable.php ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog;
13
+
14
+ use DateTimeZone;
15
+
16
+ /**
17
+ * Overrides default json encoding of date time objects
18
+ *
19
+ * @author Menno Holtkamp
20
+ * @author Jordi Boggiano <j.boggiano@seld.be>
21
+ */
22
+ class DateTimeImmutable extends \DateTimeImmutable implements \JsonSerializable
23
+ {
24
+ /**
25
+ * @var bool
26
+ */
27
+ private $useMicroseconds;
28
+
29
+ public function __construct(bool $useMicroseconds, ?DateTimeZone $timezone = null)
30
+ {
31
+ $this->useMicroseconds = $useMicroseconds;
32
+
33
+ parent::__construct('now', $timezone);
34
+ }
35
+
36
+ public function jsonSerialize(): string
37
+ {
38
+ if ($this->useMicroseconds) {
39
+ return $this->format('Y-m-d\TH:i:s.uP');
40
+ }
41
+
42
+ return $this->format('Y-m-d\TH:i:sP');
43
+ }
44
+
45
+ public function __toString(): string
46
+ {
47
+ return $this->jsonSerialize();
48
+ }
49
+ }
vendor/monolog/monolog/src/Monolog/ErrorHandler.php ADDED
@@ -0,0 +1,307 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog;
13
+
14
+ use Psr\Log\LoggerInterface;
15
+ use Psr\Log\LogLevel;
16
+
17
+ /**
18
+ * Monolog error handler
19
+ *
20
+ * A facility to enable logging of runtime errors, exceptions and fatal errors.
21
+ *
22
+ * Quick setup: <code>ErrorHandler::register($logger);</code>
23
+ *
24
+ * @author Jordi Boggiano <j.boggiano@seld.be>
25
+ */
26
+ class ErrorHandler
27
+ {
28
+ /** @var LoggerInterface */
29
+ private $logger;
30
+
31
+ /** @var ?callable */
32
+ private $previousExceptionHandler = null;
33
+ /** @var array<class-string, LogLevel::*> an array of class name to LogLevel::* constant mapping */
34
+ private $uncaughtExceptionLevelMap = [];
35
+
36
+ /** @var callable|true|null */
37
+ private $previousErrorHandler = null;
38
+ /** @var array<int, LogLevel::*> an array of E_* constant to LogLevel::* constant mapping */
39
+ private $errorLevelMap = [];
40
+ /** @var bool */
41
+ private $handleOnlyReportedErrors = true;
42
+
43
+ /** @var bool */
44
+ private $hasFatalErrorHandler = false;
45
+ /** @var LogLevel::* */
46
+ private $fatalLevel = LogLevel::ALERT;
47
+ /** @var ?string */
48
+ private $reservedMemory = null;
49
+ /** @var ?array{type: int, message: string, file: string, line: int, trace: mixed} */
50
+ private $lastFatalData = null;
51
+ /** @var int[] */
52
+ private static $fatalErrors = [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR];
53
+
54
+ public function __construct(LoggerInterface $logger)
55
+ {
56
+ $this->logger = $logger;
57
+ }
58
+
59
+ /**
60
+ * Registers a new ErrorHandler for a given Logger
61
+ *
62
+ * By default it will handle errors, exceptions and fatal errors
63
+ *
64
+ * @param LoggerInterface $logger
65
+ * @param array<int, LogLevel::*>|false $errorLevelMap an array of E_* constant to LogLevel::* constant mapping, or false to disable error handling
66
+ * @param array<class-string, LogLevel::*>|false $exceptionLevelMap an array of class name to LogLevel::* constant mapping, or false to disable exception handling
67
+ * @param LogLevel::*|null|false $fatalLevel a LogLevel::* constant, null to use the default LogLevel::ALERT or false to disable fatal error handling
68
+ * @return ErrorHandler
69
+ */
70
+ public static function register(LoggerInterface $logger, $errorLevelMap = [], $exceptionLevelMap = [], $fatalLevel = null): self
71
+ {
72
+ /** @phpstan-ignore-next-line */
73
+ $handler = new static($logger);
74
+ if ($errorLevelMap !== false) {
75
+ $handler->registerErrorHandler($errorLevelMap);
76
+ }
77
+ if ($exceptionLevelMap !== false) {
78
+ $handler->registerExceptionHandler($exceptionLevelMap);
79
+ }
80
+ if ($fatalLevel !== false) {
81
+ $handler->registerFatalHandler($fatalLevel);
82
+ }
83
+
84
+ return $handler;
85
+ }
86
+
87
+ /**
88
+ * @param array<class-string, LogLevel::*> $levelMap an array of class name to LogLevel::* constant mapping
89
+ * @return $this
90
+ */
91
+ public function registerExceptionHandler(array $levelMap = [], bool $callPrevious = true): self
92
+ {
93
+ $prev = set_exception_handler(function (\Throwable $e): void {
94
+ $this->handleException($e);
95
+ });
96
+ $this->uncaughtExceptionLevelMap = $levelMap;
97
+ foreach ($this->defaultExceptionLevelMap() as $class => $level) {
98
+ if (!isset($this->uncaughtExceptionLevelMap[$class])) {
99
+ $this->uncaughtExceptionLevelMap[$class] = $level;
100
+ }
101
+ }
102
+ if ($callPrevious && $prev) {
103
+ $this->previousExceptionHandler = $prev;
104
+ }
105
+
106
+ return $this;
107
+ }
108
+
109
+ /**
110
+ * @param array<int, LogLevel::*> $levelMap an array of E_* constant to LogLevel::* constant mapping
111
+ * @return $this
112
+ */
113
+ public function registerErrorHandler(array $levelMap = [], bool $callPrevious = true, int $errorTypes = -1, bool $handleOnlyReportedErrors = true): self
114
+ {
115
+ $prev = set_error_handler([$this, 'handleError'], $errorTypes);
116
+ $this->errorLevelMap = array_replace($this->defaultErrorLevelMap(), $levelMap);
117
+ if ($callPrevious) {
118
+ $this->previousErrorHandler = $prev ?: true;
119
+ } else {
120
+ $this->previousErrorHandler = null;
121
+ }
122
+
123
+ $this->handleOnlyReportedErrors = $handleOnlyReportedErrors;
124
+
125
+ return $this;
126
+ }
127
+
128
+ /**
129
+ * @param LogLevel::*|null $level a LogLevel::* constant, null to use the default LogLevel::ALERT
130
+ * @param int $reservedMemorySize Amount of KBs to reserve in memory so that it can be freed when handling fatal errors giving Monolog some room in memory to get its job done
131
+ */
132
+ public function registerFatalHandler($level = null, int $reservedMemorySize = 20): self
133
+ {
134
+ register_shutdown_function([$this, 'handleFatalError']);
135
+
136
+ $this->reservedMemory = str_repeat(' ', 1024 * $reservedMemorySize);
137
+ $this->fatalLevel = null === $level ? LogLevel::ALERT : $level;
138
+ $this->hasFatalErrorHandler = true;
139
+
140
+ return $this;
141
+ }
142
+
143
+ /**
144
+ * @return array<class-string, LogLevel::*>
145
+ */
146
+ protected function defaultExceptionLevelMap(): array
147
+ {
148
+ return [
149
+ 'ParseError' => LogLevel::CRITICAL,
150
+ 'Throwable' => LogLevel::ERROR,
151
+ ];
152
+ }
153
+
154
+ /**
155
+ * @return array<int, LogLevel::*>
156
+ */
157
+ protected function defaultErrorLevelMap(): array
158
+ {
159
+ return [
160
+ E_ERROR => LogLevel::CRITICAL,
161
+ E_WARNING => LogLevel::WARNING,
162
+ E_PARSE => LogLevel::ALERT,
163
+ E_NOTICE => LogLevel::NOTICE,
164
+ E_CORE_ERROR => LogLevel::CRITICAL,
165
+ E_CORE_WARNING => LogLevel::WARNING,
166
+ E_COMPILE_ERROR => LogLevel::ALERT,
167
+ E_COMPILE_WARNING => LogLevel::WARNING,
168
+ E_USER_ERROR => LogLevel::ERROR,
169
+ E_USER_WARNING => LogLevel::WARNING,
170
+ E_USER_NOTICE => LogLevel::NOTICE,
171
+ E_STRICT => LogLevel::NOTICE,
172
+ E_RECOVERABLE_ERROR => LogLevel::ERROR,
173
+ E_DEPRECATED => LogLevel::NOTICE,
174
+ E_USER_DEPRECATED => LogLevel::NOTICE,
175
+ ];
176
+ }
177
+
178
+ /**
179
+ * @phpstan-return never
180
+ */
181
+ private function handleException(\Throwable $e): void
182
+ {
183
+ $level = LogLevel::ERROR;
184
+ foreach ($this->uncaughtExceptionLevelMap as $class => $candidate) {
185
+ if ($e instanceof $class) {
186
+ $level = $candidate;
187
+ break;
188
+ }
189
+ }
190
+
191
+ $this->logger->log(
192
+ $level,
193
+ sprintf('Uncaught Exception %s: "%s" at %s line %s', Utils::getClass($e), $e->getMessage(), $e->getFile(), $e->getLine()),
194
+ ['exception' => $e]
195
+ );
196
+
197
+ if ($this->previousExceptionHandler) {
198
+ ($this->previousExceptionHandler)($e);
199
+ }
200
+
201
+ if (!headers_sent() && !ini_get('display_errors')) {
202
+ http_response_code(500);
203
+ }
204
+
205
+ exit(255);
206
+ }
207
+
208
+ /**
209
+ * @private
210
+ *
211
+ * @param mixed[] $context
212
+ */
213
+ public function handleError(int $code, string $message, string $file = '', int $line = 0, ?array $context = []): bool
214
+ {
215
+ if ($this->handleOnlyReportedErrors && !(error_reporting() & $code)) {
216
+ return false;
217
+ }
218
+
219
+ // fatal error codes are ignored if a fatal error handler is present as well to avoid duplicate log entries
220
+ if (!$this->hasFatalErrorHandler || !in_array($code, self::$fatalErrors, true)) {
221
+ $level = $this->errorLevelMap[$code] ?? LogLevel::CRITICAL;
222
+ $this->logger->log($level, self::codeToString($code).': '.$message, ['code' => $code, 'message' => $message, 'file' => $file, 'line' => $line]);
223
+ } else {
224
+ $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
225
+ array_shift($trace); // Exclude handleError from trace
226
+ $this->lastFatalData = ['type' => $code, 'message' => $message, 'file' => $file, 'line' => $line, 'trace' => $trace];
227
+ }
228
+
229
+ if ($this->previousErrorHandler === true) {
230
+ return false;
231
+ } elseif ($this->previousErrorHandler) {
232
+ return (bool) ($this->previousErrorHandler)($code, $message, $file, $line, $context);
233
+ }
234
+
235
+ return true;
236
+ }
237
+
238
+ /**
239
+ * @private
240
+ */
241
+ public function handleFatalError(): void
242
+ {
243
+ $this->reservedMemory = '';
244
+
245
+ if (is_array($this->lastFatalData)) {
246
+ $lastError = $this->lastFatalData;
247
+ } else {
248
+ $lastError = error_get_last();
249
+ }
250
+
251
+ if ($lastError && in_array($lastError['type'], self::$fatalErrors, true)) {
252
+ $trace = $lastError['trace'] ?? null;
253
+ $this->logger->log(
254
+ $this->fatalLevel,
255
+ 'Fatal Error ('.self::codeToString($lastError['type']).'): '.$lastError['message'],
256
+ ['code' => $lastError['type'], 'message' => $lastError['message'], 'file' => $lastError['file'], 'line' => $lastError['line'], 'trace' => $trace]
257
+ );
258
+
259
+ if ($this->logger instanceof Logger) {
260
+ foreach ($this->logger->getHandlers() as $handler) {
261
+ $handler->close();
262
+ }
263
+ }
264
+ }
265
+ }
266
+
267
+ /**
268
+ * @param int $code
269
+ */
270
+ private static function codeToString($code): string
271
+ {
272
+ switch ($code) {
273
+ case E_ERROR:
274
+ return 'E_ERROR';
275
+ case E_WARNING:
276
+ return 'E_WARNING';
277
+ case E_PARSE:
278
+ return 'E_PARSE';
279
+ case E_NOTICE:
280
+ return 'E_NOTICE';
281
+ case E_CORE_ERROR:
282
+ return 'E_CORE_ERROR';
283
+ case E_CORE_WARNING:
284
+ return 'E_CORE_WARNING';
285
+ case E_COMPILE_ERROR:
286
+ return 'E_COMPILE_ERROR';
287
+ case E_COMPILE_WARNING:
288
+ return 'E_COMPILE_WARNING';
289
+ case E_USER_ERROR:
290
+ return 'E_USER_ERROR';
291
+ case E_USER_WARNING:
292
+ return 'E_USER_WARNING';
293
+ case E_USER_NOTICE:
294
+ return 'E_USER_NOTICE';
295
+ case E_STRICT:
296
+ return 'E_STRICT';
297
+ case E_RECOVERABLE_ERROR:
298
+ return 'E_RECOVERABLE_ERROR';
299
+ case E_DEPRECATED:
300
+ return 'E_DEPRECATED';
301
+ case E_USER_DEPRECATED:
302
+ return 'E_USER_DEPRECATED';
303
+ }
304
+
305
+ return 'Unknown PHP error';
306
+ }
307
+ }
vendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Formatter;
13
+
14
+ use Monolog\Logger;
15
+
16
+ /**
17
+ * Formats a log message according to the ChromePHP array format
18
+ *
19
+ * @author Christophe Coevoet <stof@notk.org>
20
+ */
21
+ class ChromePHPFormatter implements FormatterInterface
22
+ {
23
+ /**
24
+ * Translates Monolog log levels to Wildfire levels.
25
+ *
26
+ * @var array<int, 'log'|'info'|'warn'|'error'>
27
+ */
28
+ private $logLevels = [
29
+ Logger::DEBUG => 'log',
30
+ Logger::INFO => 'info',
31
+ Logger::NOTICE => 'info',
32
+ Logger::WARNING => 'warn',
33
+ Logger::ERROR => 'error',
34
+ Logger::CRITICAL => 'error',
35
+ Logger::ALERT => 'error',
36
+ Logger::EMERGENCY => 'error',
37
+ ];
38
+
39
+ /**
40
+ * {@inheritDoc}
41
+ */
42
+ public function format(array $record)
43
+ {
44
+ // Retrieve the line and file if set and remove them from the formatted extra
45
+ $backtrace = 'unknown';
46
+ if (isset($record['extra']['file'], $record['extra']['line'])) {
47
+ $backtrace = $record['extra']['file'].' : '.$record['extra']['line'];
48
+ unset($record['extra']['file'], $record['extra']['line']);
49
+ }
50
+
51
+ $message = ['message' => $record['message']];
52
+ if ($record['context']) {
53
+ $message['context'] = $record['context'];
54
+ }
55
+ if ($record['extra']) {
56
+ $message['extra'] = $record['extra'];
57
+ }
58
+ if (count($message) === 1) {
59
+ $message = reset($message);
60
+ }
61
+
62
+ return [
63
+ $record['channel'],
64
+ $message,
65
+ $backtrace,
66
+ $this->logLevels[$record['level']],
67
+ ];
68
+ }
69
+
70
+ /**
71
+ * {@inheritDoc}
72
+ */
73
+ public function formatBatch(array $records)
74
+ {
75
+ $formatted = [];
76
+
77
+ foreach ($records as $record) {
78
+ $formatted[] = $this->format($record);
79
+ }
80
+
81
+ return $formatted;
82
+ }
83
+ }
vendor/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Formatter;
13
+
14
+ use Elastica\Document;
15
+
16
+ /**
17
+ * Format a log message into an Elastica Document
18
+ *
19
+ * @author Jelle Vink <jelle.vink@gmail.com>
20
+ *
21
+ * @phpstan-import-type Record from \Monolog\Logger
22
+ */
23
+ class ElasticaFormatter extends NormalizerFormatter
24
+ {
25
+ /**
26
+ * @var string Elastic search index name
27
+ */
28
+ protected $index;
29
+
30
+ /**
31
+ * @var ?string Elastic search document type
32
+ */
33
+ protected $type;
34
+
35
+ /**
36
+ * @param string $index Elastic Search index name
37
+ * @param ?string $type Elastic Search document type, deprecated as of Elastica 7
38
+ */
39
+ public function __construct(string $index, ?string $type)
40
+ {
41
+ // elasticsearch requires a ISO 8601 format date with optional millisecond precision.
42
+ parent::__construct('Y-m-d\TH:i:s.uP');
43
+
44
+ $this->index = $index;
45
+ $this->type = $type;
46
+ }
47
+
48
+ /**
49
+ * {@inheritDoc}
50
+ */
51
+ public function format(array $record)
52
+ {
53
+ $record = parent::format($record);
54
+
55
+ return $this->getDocument($record);
56
+ }
57
+
58
+ public function getIndex(): string
59
+ {
60
+ return $this->index;
61
+ }
62
+
63
+ /**
64
+ * @deprecated since Elastica 7 type has no effect
65
+ */
66
+ public function getType(): string
67
+ {
68
+ /** @phpstan-ignore-next-line */
69
+ return $this->type;
70
+ }
71
+
72
+ /**
73
+ * Convert a log message into an Elastica Document
74
+ *
75
+ * @phpstan-param Record $record
76
+ */
77
+ protected function getDocument(array $record): Document
78
+ {
79
+ $document = new Document();
80
+ $document->setData($record);
81
+ if (method_exists($document, 'setType')) {
82
+ /** @phpstan-ignore-next-line */
83
+ $document->setType($this->type);
84
+ }
85
+ $document->setIndex($this->index);
86
+
87
+ return $document;
88
+ }
89
+ }
vendor/monolog/monolog/src/Monolog/Formatter/ElasticsearchFormatter.php ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Formatter;
13
+
14
+ use DateTimeInterface;
15
+
16
+ /**
17
+ * Format a log message into an Elasticsearch record
18
+ *
19
+ * @author Avtandil Kikabidze <akalongman@gmail.com>
20
+ */
21
+ class ElasticsearchFormatter extends NormalizerFormatter
22
+ {
23
+ /**
24
+ * @var string Elasticsearch index name
25
+ */
26
+ protected $index;
27
+
28
+ /**
29
+ * @var string Elasticsearch record type
30
+ */
31
+ protected $type;
32
+
33
+ /**
34
+ * @param string $index Elasticsearch index name
35
+ * @param string $type Elasticsearch record type
36
+ */
37
+ public function __construct(string $index, string $type)
38
+ {
39
+ // Elasticsearch requires an ISO 8601 format date with optional millisecond precision.
40
+ parent::__construct(DateTimeInterface::ISO8601);
41
+
42
+ $this->index = $index;
43
+ $this->type = $type;
44
+ }
45
+
46
+ /**
47
+ * {@inheritDoc}
48
+ */
49
+ public function format(array $record)
50
+ {
51
+ $record = parent::format($record);
52
+
53
+ return $this->getDocument($record);
54
+ }
55
+
56
+ /**
57
+ * Getter index
58
+ *
59
+ * @return string
60
+ */
61
+ public function getIndex(): string
62
+ {
63
+ return $this->index;
64
+ }
65
+
66
+ /**
67
+ * Getter type
68
+ *
69
+ * @return string
70
+ */
71
+ public function getType(): string
72
+ {
73
+ return $this->type;
74
+ }
75
+
76
+ /**
77
+ * Convert a log message into an Elasticsearch record
78
+ *
79
+ * @param mixed[] $record Log message
80
+ * @return mixed[]
81
+ */
82
+ protected function getDocument(array $record): array
83
+ {
84
+ $record['_index'] = $this->index;
85
+ $record['_type'] = $this->type;
86
+
87
+ return $record;
88
+ }
89
+ }
vendor/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php ADDED
@@ -0,0 +1,111 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Formatter;
13
+
14
+ /**
15
+ * formats the record to be used in the FlowdockHandler
16
+ *
17
+ * @author Dominik Liebler <liebler.dominik@gmail.com>
18
+ */
19
+ class FlowdockFormatter implements FormatterInterface
20
+ {
21
+ /**
22
+ * @var string
23
+ */
24
+ private $source;
25
+
26
+ /**
27
+ * @var string
28
+ */
29
+ private $sourceEmail;
30
+
31
+ public function __construct(string $source, string $sourceEmail)
32
+ {
33
+ $this->source = $source;
34
+ $this->sourceEmail = $sourceEmail;
35
+ }
36
+
37
+ /**
38
+ * {@inheritDoc}
39
+ *
40
+ * @return mixed[]
41
+ */
42
+ public function format(array $record): array
43
+ {
44
+ $tags = [
45
+ '#logs',
46
+ '#' . strtolower($record['level_name']),
47
+ '#' . $record['channel'],
48
+ ];
49
+
50
+ foreach ($record['extra'] as $value) {
51
+ $tags[] = '#' . $value;
52
+ }
53
+
54
+ $subject = sprintf(
55
+ 'in %s: %s - %s',
56
+ $this->source,
57
+ $record['level_name'],
58
+ $this->getShortMessage($record['message'])
59
+ );
60
+
61
+ $record['flowdock'] = [
62
+ 'source' => $this->source,
63
+ 'from_address' => $this->sourceEmail,
64
+ 'subject' => $subject,
65
+ 'content' => $record['message'],
66
+ 'tags' => $tags,
67
+ 'project' => $this->source,
68
+ ];
69
+
70
+ return $record;
71
+ }
72
+
73
+ /**
74
+ * {@inheritDoc}
75
+ *
76
+ * @return mixed[][]
77
+ */
78
+ public function formatBatch(array $records): array
79
+ {
80
+ $formatted = [];
81
+
82
+ foreach ($records as $record) {
83
+ $formatted[] = $this->format($record);
84
+ }
85
+
86
+ return $formatted;
87
+ }
88
+
89
+ public function getShortMessage(string $message): string
90
+ {
91
+ static $hasMbString;
92
+
93
+ if (null === $hasMbString) {
94
+ $hasMbString = function_exists('mb_strlen');
95
+ }
96
+
97
+ $maxLength = 45;
98
+
99
+ if ($hasMbString) {
100
+ if (mb_strlen($message, 'UTF-8') > $maxLength) {
101
+ $message = mb_substr($message, 0, $maxLength - 4, 'UTF-8') . ' ...';
102
+ }
103
+ } else {
104
+ if (strlen($message) > $maxLength) {
105
+ $message = substr($message, 0, $maxLength - 4) . ' ...';
106
+ }
107
+ }
108
+
109
+ return $message;
110
+ }
111
+ }
vendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php ADDED
@@ -0,0 +1,88 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Formatter;
13
+
14
+ use Monolog\Utils;
15
+
16
+ /**
17
+ * Class FluentdFormatter
18
+ *
19
+ * Serializes a log message to Fluentd unix socket protocol
20
+ *
21
+ * Fluentd config:
22
+ *
23
+ * <source>
24
+ * type unix
25
+ * path /var/run/td-agent/td-agent.sock
26
+ * </source>
27
+ *
28
+ * Monolog setup:
29
+ *
30
+ * $logger = new Monolog\Logger('fluent.tag');
31
+ * $fluentHandler = new Monolog\Handler\SocketHandler('unix:///var/run/td-agent/td-agent.sock');
32
+ * $fluentHandler->setFormatter(new Monolog\Formatter\FluentdFormatter());
33
+ * $logger->pushHandler($fluentHandler);
34
+ *
35
+ * @author Andrius Putna <fordnox@gmail.com>
36
+ */
37
+ class FluentdFormatter implements FormatterInterface
38
+ {
39
+ /**
40
+ * @var bool $levelTag should message level be a part of the fluentd tag
41
+ */
42
+ protected $levelTag = false;
43
+
44
+ public function __construct(bool $levelTag = false)
45
+ {
46
+ if (!function_exists('json_encode')) {
47
+ throw new \RuntimeException('PHP\'s json extension is required to use Monolog\'s FluentdUnixFormatter');
48
+ }
49
+
50
+ $this->levelTag = $levelTag;
51
+ }
52
+
53
+ public function isUsingLevelsInTag(): bool
54
+ {
55
+ return $this->levelTag;
56
+ }
57
+
58
+ public function format(array $record): string
59
+ {
60
+ $tag = $record['channel'];
61
+ if ($this->levelTag) {
62
+ $tag .= '.' . strtolower($record['level_name']);
63
+ }
64
+
65
+ $message = [
66
+ 'message' => $record['message'],
67
+ 'context' => $record['context'],
68
+ 'extra' => $record['extra'],
69
+ ];
70
+
71
+ if (!$this->levelTag) {
72
+ $message['level'] = $record['level'];
73
+ $message['level_name'] = $record['level_name'];
74
+ }
75
+
76
+ return Utils::jsonEncode([$tag, $record['datetime']->getTimestamp(), $message]);
77
+ }
78
+
79
+ public function formatBatch(array $records): string
80
+ {
81
+ $message = '';
82
+ foreach ($records as $record) {
83
+ $message .= $this->format($record);
84
+ }
85
+
86
+ return $message;
87
+ }
88
+ }
vendor/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Formatter;
13
+
14
+ /**
15
+ * Interface for formatters
16
+ *
17
+ * @author Jordi Boggiano <j.boggiano@seld.be>
18
+ *
19
+ * @phpstan-import-type Record from \Monolog\Logger
20
+ */
21
+ interface FormatterInterface
22
+ {
23
+ /**
24
+ * Formats a log record.
25
+ *
26
+ * @param array $record A record to format
27
+ * @return mixed The formatted record
28
+ *
29
+ * @phpstan-param Record $record
30
+ */
31
+ public function format(array $record);
32
+
33
+ /**
34
+ * Formats a set of log records.
35
+ *
36
+ * @param array $records A set of records to format
37
+ * @return mixed The formatted set of records
38
+ *
39
+ * @phpstan-param Record[] $records
40
+ */
41
+ public function formatBatch(array $records);
42
+ }
vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php ADDED
@@ -0,0 +1,160 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Formatter;
13
+
14
+ use Monolog\Logger;
15
+ use Gelf\Message;
16
+ use Monolog\Utils;
17
+
18
+ /**
19
+ * Serializes a log message to GELF
20
+ * @see http://docs.graylog.org/en/latest/pages/gelf.html
21
+ *
22
+ * @author Matt Lehner <mlehner@gmail.com>
23
+ *
24
+ * @phpstan-import-type Level from \Monolog\Logger
25
+ */
26
+ class GelfMessageFormatter extends NormalizerFormatter
27
+ {
28
+ protected const DEFAULT_MAX_LENGTH = 32766;
29
+
30
+ /**
31
+ * @var string the name of the system for the Gelf log message
32
+ */
33
+ protected $systemName;
34
+
35
+ /**
36
+ * @var string a prefix for 'extra' fields from the Monolog record (optional)
37
+ */
38
+ protected $extraPrefix;
39
+
40
+ /**
41
+ * @var string a prefix for 'context' fields from the Monolog record (optional)
42
+ */
43
+ protected $contextPrefix;
44
+
45
+ /**
46
+ * @var int max length per field
47
+ */
48
+ protected $maxLength;
49
+
50
+ /**
51
+ * Translates Monolog log levels to Graylog2 log priorities.
52
+ *
53
+ * @var array<int, int>
54
+ *
55
+ * @phpstan-var array<Level, int>
56
+ */
57
+ private $logLevels = [
58
+ Logger::DEBUG => 7,
59
+ Logger::INFO => 6,
60
+ Logger::NOTICE => 5,
61
+ Logger::WARNING => 4,
62
+ Logger::ERROR => 3,
63
+ Logger::CRITICAL => 2,
64
+ Logger::ALERT => 1,
65
+ Logger::EMERGENCY => 0,
66
+ ];
67
+
68
+ public function __construct(?string $systemName = null, ?string $extraPrefix = null, string $contextPrefix = 'ctxt_', ?int $maxLength = null)
69
+ {
70
+ if (!class_exists(Message::class)) {
71
+ throw new \RuntimeException('Composer package graylog2/gelf-php is required to use Monolog\'s GelfMessageFormatter');
72
+ }
73
+
74
+ parent::__construct('U.u');
75
+
76
+ $this->systemName = (is_null($systemName) || $systemName === '') ? (string) gethostname() : $systemName;
77
+
78
+ $this->extraPrefix = is_null($extraPrefix) ? '' : $extraPrefix;
79
+ $this->contextPrefix = $contextPrefix;
80
+ $this->maxLength = is_null($maxLength) ? self::DEFAULT_MAX_LENGTH : $maxLength;
81
+ }
82
+
83
+ /**
84
+ * {@inheritDoc}
85
+ */
86
+ public function format(array $record): Message
87
+ {
88
+ $context = $extra = [];
89
+ if (isset($record['context'])) {
90
+ /** @var mixed[] $context */
91
+ $context = parent::normalize($record['context']);
92
+ }
93
+ if (isset($record['extra'])) {
94
+ /** @var mixed[] $extra */
95
+ $extra = parent::normalize($record['extra']);
96
+ }
97
+
98
+ if (!isset($record['datetime'], $record['message'], $record['level'])) {
99
+ throw new \InvalidArgumentException('The record should at least contain datetime, message and level keys, '.var_export($record, true).' given');
100
+ }
101
+
102
+ $message = new Message();
103
+ $message
104
+ ->setTimestamp($record['datetime'])
105
+ ->setShortMessage((string) $record['message'])
106
+ ->setHost($this->systemName)
107
+ ->setLevel($this->logLevels[$record['level']]);
108
+
109
+ // message length + system name length + 200 for padding / metadata
110
+ $len = 200 + strlen((string) $record['message']) + strlen($this->systemName);
111
+
112
+ if ($len > $this->maxLength) {
113
+ $message->setShortMessage(Utils::substr($record['message'], 0, $this->maxLength));
114
+ }
115
+
116
+ if (isset($record['channel'])) {
117
+ $message->setFacility($record['channel']);
118
+ }
119
+ if (isset($extra['line'])) {
120
+ $message->setLine($extra['line']);
121
+ unset($extra['line']);
122
+ }
123
+ if (isset($extra['file'])) {
124
+ $message->setFile($extra['file']);
125
+ unset($extra['file']);
126
+ }
127
+
128
+ foreach ($extra as $key => $val) {
129
+ $val = is_scalar($val) || null === $val ? $val : $this->toJson($val);
130
+ $len = strlen($this->extraPrefix . $key . $val);
131
+ if ($len > $this->maxLength) {
132
+ $message->setAdditional($this->extraPrefix . $key, Utils::substr((string) $val, 0, $this->maxLength));
133
+
134
+ continue;
135
+ }
136
+ $message->setAdditional($this->extraPrefix . $key, $val);
137
+ }
138
+
139
+ foreach ($context as $key => $val) {
140
+ $val = is_scalar($val) || null === $val ? $val : $this->toJson($val);
141
+ $len = strlen($this->contextPrefix . $key . $val);
142
+ if ($len > $this->maxLength) {
143
+ $message->setAdditional($this->contextPrefix . $key, Utils::substr((string) $val, 0, $this->maxLength));
144
+
145
+ continue;
146
+ }
147
+ $message->setAdditional($this->contextPrefix . $key, $val);
148
+ }
149
+
150
+ /** @phpstan-ignore-next-line */
151
+ if (null === $message->getFile() && isset($context['exception']['file'])) {
152
+ if (preg_match("/^(.+):([0-9]+)$/", $context['exception']['file'], $matches)) {
153
+ $message->setFile($matches[1]);
154
+ $message->setLine($matches[2]);
155
+ }
156
+ }
157
+
158
+ return $message;
159
+ }
160
+ }
vendor/monolog/monolog/src/Monolog/Formatter/GoogleCloudLoggingFormatter.php ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Formatter;
13
+
14
+ use DateTimeInterface;
15
+ use Monolog\LogRecord;
16
+
17
+ /**
18
+ * Encodes message information into JSON in a format compatible with Cloud logging.
19
+ *
20
+ * @see https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry
21
+ *
22
+ * @author Luís Cobucci <lcobucci@gmail.com>
23
+ */
24
+ final class GoogleCloudLoggingFormatter extends JsonFormatter
25
+ {
26
+ /** {@inheritdoc} **/
27
+ public function format(array $record): string
28
+ {
29
+ // Re-key level for GCP logging
30
+ $record['severity'] = $record['level_name'];
31
+ $record['timestamp'] = $record['datetime']->format(DateTimeInterface::RFC3339_EXTENDED);
32
+
33
+ // Remove keys that are not used by GCP
34
+ unset($record['level'], $record['level_name'], $record['datetime']);
35
+
36
+ return parent::format($record);
37
+ }
38
+ }
39
+
vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php ADDED
@@ -0,0 +1,142 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Formatter;
13
+
14
+ use Monolog\Logger;
15
+ use Monolog\Utils;
16
+
17
+ /**
18
+ * Formats incoming records into an HTML table
19
+ *
20
+ * This is especially useful for html email logging
21
+ *
22
+ * @author Tiago Brito <tlfbrito@gmail.com>
23
+ */
24
+ class HtmlFormatter extends NormalizerFormatter
25
+ {
26
+ /**
27
+ * Translates Monolog log levels to html color priorities.
28
+ *
29
+ * @var array<int, string>
30
+ */
31
+ protected $logLevels = [
32
+ Logger::DEBUG => '#CCCCCC',
33
+ Logger::INFO => '#28A745',
34
+ Logger::NOTICE => '#17A2B8',
35
+ Logger::WARNING => '#FFC107',
36
+ Logger::ERROR => '#FD7E14',
37
+ Logger::CRITICAL => '#DC3545',
38
+ Logger::ALERT => '#821722',
39
+ Logger::EMERGENCY => '#000000',
40
+ ];
41
+
42
+ /**
43
+ * @param string|null $dateFormat The format of the timestamp: one supported by DateTime::format
44
+ */
45
+ public function __construct(?string $dateFormat = null)
46
+ {
47
+ parent::__construct($dateFormat);
48
+ }
49
+
50
+ /**
51
+ * Creates an HTML table row
52
+ *
53
+ * @param string $th Row header content
54
+ * @param string $td Row standard cell content
55
+ * @param bool $escapeTd false if td content must not be html escaped
56
+ */
57
+ protected function addRow(string $th, string $td = ' ', bool $escapeTd = true): string
58
+ {
59
+ $th = htmlspecialchars($th, ENT_NOQUOTES, 'UTF-8');
60
+ if ($escapeTd) {
61
+ $td = '<pre>'.htmlspecialchars($td, ENT_NOQUOTES, 'UTF-8').'</pre>';
62
+ }
63
+
64
+ return "<tr style=\"padding: 4px;text-align: left;\">\n<th style=\"vertical-align: top;background: #ccc;color: #000\" width=\"100\">$th:</th>\n<td style=\"padding: 4px;text-align: left;vertical-align: top;background: #eee;color: #000\">".$td."</td>\n</tr>";
65
+ }
66
+
67
+ /**
68
+ * Create a HTML h1 tag
69
+ *
70
+ * @param string $title Text to be in the h1
71
+ * @param int $level Error level
72
+ * @return string
73
+ */
74
+ protected function addTitle(string $title, int $level): string
75
+ {
76
+ $title = htmlspecialchars($title, ENT_NOQUOTES, 'UTF-8');
77
+
78
+ return '<h1 style="background: '.$this->logLevels[$level].';color: #ffffff;padding: 5px;" class="monolog-output">'.$title.'</h1>';
79
+ }
80
+
81
+ /**
82
+ * Formats a log record.
83
+ *
84
+ * @return string The formatted record
85
+ */
86
+ public function format(array $record): string
87
+ {
88
+ $output = $this->addTitle($record['level_name'], $record['level']);
89
+ $output .= '<table cellspacing="1" width="100%" class="monolog-output">';
90
+
91
+ $output .= $this->addRow('Message', (string) $record['message']);
92
+ $output .= $this->addRow('Time', $this->formatDate($record['datetime']));
93
+ $output .= $this->addRow('Channel', $record['channel']);
94
+ if ($record['context']) {
95
+ $embeddedTable = '<table cellspacing="1" width="100%">';
96
+ foreach ($record['context'] as $key => $value) {
97
+ $embeddedTable .= $this->addRow((string) $key, $this->convertToString($value));
98
+ }
99
+ $embeddedTable .= '</table>';
100
+ $output .= $this->addRow('Context', $embeddedTable, false);
101
+ }
102
+ if ($record['extra']) {
103
+ $embeddedTable = '<table cellspacing="1" width="100%">';
104
+ foreach ($record['extra'] as $key => $value) {
105
+ $embeddedTable .= $this->addRow((string) $key, $this->convertToString($value));
106
+ }
107
+ $embeddedTable .= '</table>';
108
+ $output .= $this->addRow('Extra', $embeddedTable, false);
109
+ }
110
+
111
+ return $output.'</table>';
112
+ }
113
+
114
+ /**
115
+ * Formats a set of log records.
116
+ *
117
+ * @return string The formatted set of records
118
+ */
119
+ public function formatBatch(array $records): string
120
+ {
121
+ $message = '';
122
+ foreach ($records as $record) {
123
+ $message .= $this->format($record);
124
+ }
125
+
126
+ return $message;
127
+ }
128
+
129
+ /**
130
+ * @param mixed $data
131
+ */
132
+ protected function convertToString($data): string
133
+ {
134
+ if (null === $data || is_scalar($data)) {
135
+ return (string) $data;
136
+ }
137
+
138
+ $data = $this->normalize($data);
139
+
140
+ return Utils::jsonEncode($data, JSON_PRETTY_PRINT | Utils::DEFAULT_JSON_FLAGS, true);
141
+ }
142
+ }
vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php ADDED
@@ -0,0 +1,224 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Formatter;
13
+
14
+ use Throwable;
15
+
16
+ /**
17
+ * Encodes whatever record data is passed to it as json
18
+ *
19
+ * This can be useful to log to databases or remote APIs
20
+ *
21
+ * @author Jordi Boggiano <j.boggiano@seld.be>
22
+ *
23
+ * @phpstan-import-type Record from \Monolog\Logger
24
+ */
25
+ class JsonFormatter extends NormalizerFormatter
26
+ {
27
+ public const BATCH_MODE_JSON = 1;
28
+ public const BATCH_MODE_NEWLINES = 2;
29
+
30
+ /** @var self::BATCH_MODE_* */
31
+ protected $batchMode;
32
+ /** @var bool */
33
+ protected $appendNewline;
34
+ /** @var bool */
35
+ protected $ignoreEmptyContextAndExtra;
36
+ /** @var bool */
37
+ protected $includeStacktraces = false;
38
+
39
+ /**
40
+ * @param self::BATCH_MODE_* $batchMode
41
+ */
42
+ public function __construct(int $batchMode = self::BATCH_MODE_JSON, bool $appendNewline = true, bool $ignoreEmptyContextAndExtra = false, bool $includeStacktraces = false)
43
+ {
44
+ $this->batchMode = $batchMode;
45
+ $this->appendNewline = $appendNewline;
46
+ $this->ignoreEmptyContextAndExtra = $ignoreEmptyContextAndExtra;
47
+ $this->includeStacktraces = $includeStacktraces;
48
+
49
+ parent::__construct();
50
+ }
51
+
52
+ /**
53
+ * The batch mode option configures the formatting style for
54
+ * multiple records. By default, multiple records will be
55
+ * formatted as a JSON-encoded array. However, for
56
+ * compatibility with some API endpoints, alternative styles
57
+ * are available.
58
+ */
59
+ public function getBatchMode(): int
60
+ {
61
+ return $this->batchMode;
62
+ }
63
+
64
+ /**
65
+ * True if newlines are appended to every formatted record
66
+ */
67
+ public function isAppendingNewlines(): bool
68
+ {
69
+ return $this->appendNewline;
70
+ }
71
+
72
+ /**
73
+ * {@inheritDoc}
74
+ */
75
+ public function format(array $record): string
76
+ {
77
+ $normalized = $this->normalize($record);
78
+
79
+ if (isset($normalized['context']) && $normalized['context'] === []) {
80
+ if ($this->ignoreEmptyContextAndExtra) {
81
+ unset($normalized['context']);
82
+ } else {
83
+ $normalized['context'] = new \stdClass;
84
+ }
85
+ }
86
+ if (isset($normalized['extra']) && $normalized['extra'] === []) {
87
+ if ($this->ignoreEmptyContextAndExtra) {
88
+ unset($normalized['extra']);
89
+ } else {
90
+ $normalized['extra'] = new \stdClass;
91
+ }
92
+ }
93
+
94
+ return $this->toJson($normalized, true) . ($this->appendNewline ? "\n" : '');
95
+ }
96
+
97
+ /**
98
+ * {@inheritDoc}
99
+ */
100
+ public function formatBatch(array $records): string
101
+ {
102
+ switch ($this->batchMode) {
103
+ case static::BATCH_MODE_NEWLINES:
104
+ return $this->formatBatchNewlines($records);
105
+
106
+ case static::BATCH_MODE_JSON:
107
+ default:
108
+ return $this->formatBatchJson($records);
109
+ }
110
+ }
111
+
112
+ /**
113
+ * @return self
114
+ */
115
+ public function includeStacktraces(bool $include = true): self
116
+ {
117
+ $this->includeStacktraces = $include;
118
+
119
+ return $this;
120
+ }
121
+
122
+ /**
123
+ * Return a JSON-encoded array of records.
124
+ *
125
+ * @phpstan-param Record[] $records
126
+ */
127
+ protected function formatBatchJson(array $records): string
128
+ {
129
+ return $this->toJson($this->normalize($records), true);
130
+ }
131
+
132
+ /**
133
+ * Use new lines to separate records instead of a
134
+ * JSON-encoded array.
135
+ *
136
+ * @phpstan-param Record[] $records
137
+ */
138
+ protected function formatBatchNewlines(array $records): string
139
+ {
140
+ $instance = $this;
141
+
142
+ $oldNewline = $this->appendNewline;
143
+ $this->appendNewline = false;
144
+ array_walk($records, function (&$value, $key) use ($instance) {
145
+ $value = $instance->format($value);
146
+ });
147
+ $this->appendNewline = $oldNewline;
148
+
149
+ return implode("\n", $records);
150
+ }
151
+
152
+ /**
153
+ * Normalizes given $data.
154
+ *
155
+ * @param mixed $data
156
+ *
157
+ * @return mixed
158
+ */
159
+ protected function normalize($data, int $depth = 0)
160
+ {
161
+ if ($depth > $this->maxNormalizeDepth) {
162
+ return 'Over '.$this->maxNormalizeDepth.' levels deep, aborting normalization';
163
+ }
164
+
165
+ if (is_array($data)) {
166
+ $normalized = [];
167
+
168
+ $count = 1;
169
+ foreach ($data as $key => $value) {
170
+ if ($count++ > $this->maxNormalizeItemCount) {
171
+ $normalized['...'] = 'Over '.$this->maxNormalizeItemCount.' items ('.count($data).' total), aborting normalization';
172
+ break;
173
+ }
174
+
175
+ $normalized[$key] = $this->normalize($value, $depth + 1);
176
+ }
177
+
178
+ return $normalized;
179
+ }
180
+
181
+ if (is_object($data)) {
182
+ if ($data instanceof \DateTimeInterface) {
183
+ return $this->formatDate($data);
184
+ }
185
+
186
+ if ($data instanceof Throwable) {
187
+ return $this->normalizeException($data, $depth);
188
+ }
189
+
190
+ // if the object has specific json serializability we want to make sure we skip the __toString treatment below
191
+ if ($data instanceof \JsonSerializable) {
192
+ return $data;
193
+ }
194
+
195
+ if (method_exists($data, '__toString')) {
196
+ return $data->__toString();
197
+ }
198
+
199
+ return $data;
200
+ }
201
+
202
+ if (is_resource($data)) {
203
+ return parent::normalize($data);
204
+ }
205
+
206
+ return $data;
207
+ }
208
+
209
+ /**
210
+ * Normalizes given exception with or without its own stack trace based on
211
+ * `includeStacktraces` property.
212
+ *
213
+ * {@inheritDoc}
214
+ */
215
+ protected function normalizeException(Throwable $e, int $depth = 0): array
216
+ {
217
+ $data = parent::normalizeException($e, $depth);
218
+ if (!$this->includeStacktraces) {
219
+ unset($data['trace']);
220
+ }
221
+
222
+ return $data;
223
+ }
224
+ }
vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php ADDED
@@ -0,0 +1,246 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Formatter;
13
+
14
+ use Monolog\Utils;
15
+
16
+ /**
17
+ * Formats incoming records into a one-line string
18
+ *
19
+ * This is especially useful for logging to files
20
+ *
21
+ * @author Jordi Boggiano <j.boggiano@seld.be>
22
+ * @author Christophe Coevoet <stof@notk.org>
23
+ */
24
+ class LineFormatter extends NormalizerFormatter
25
+ {
26
+ public const SIMPLE_FORMAT = "[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n";
27
+
28
+ /** @var string */
29
+ protected $format;
30
+ /** @var bool */
31
+ protected $allowInlineLineBreaks;
32
+ /** @var bool */
33
+ protected $ignoreEmptyContextAndExtra;
34
+ /** @var bool */
35
+ protected $includeStacktraces;
36
+ /** @var ?callable */
37
+ protected $stacktracesParser;
38
+
39
+ /**
40
+ * @param string|null $format The format of the message
41
+ * @param string|null $dateFormat The format of the timestamp: one supported by DateTime::format
42
+ * @param bool $allowInlineLineBreaks Whether to allow inline line breaks in log entries
43
+ * @param bool $ignoreEmptyContextAndExtra
44
+ */
45
+ public function __construct(?string $format = null, ?string $dateFormat = null, bool $allowInlineLineBreaks = false, bool $ignoreEmptyContextAndExtra = false, bool $includeStacktraces = false)
46
+ {
47
+ $this->format = $format === null ? static::SIMPLE_FORMAT : $format;
48
+ $this->allowInlineLineBreaks = $allowInlineLineBreaks;
49
+ $this->ignoreEmptyContextAndExtra = $ignoreEmptyContextAndExtra;
50
+ $this->includeStacktraces($includeStacktraces);
51
+ parent::__construct($dateFormat);
52
+ }
53
+
54
+ public function includeStacktraces(bool $include = true, ?callable $parser = null): self
55
+ {
56
+ $this->includeStacktraces = $include;
57
+ if ($this->includeStacktraces) {
58
+ $this->allowInlineLineBreaks = true;
59
+ $this->stacktracesParser = $parser;
60
+ }
61
+
62
+ return $this;
63
+ }
64
+
65
+ public function allowInlineLineBreaks(bool $allow = true): self
66
+ {
67
+ $this->allowInlineLineBreaks = $allow;
68
+
69
+ return $this;
70
+ }
71
+
72
+ public function ignoreEmptyContextAndExtra(bool $ignore = true): self
73
+ {
74
+ $this->ignoreEmptyContextAndExtra = $ignore;
75
+
76
+ return $this;
77
+ }
78
+
79
+ /**
80
+ * {@inheritDoc}
81
+ */
82
+ public function format(array $record): string
83
+ {
84
+ $vars = parent::format($record);
85
+
86
+ $output = $this->format;
87
+
88
+ foreach ($vars['extra'] as $var => $val) {
89
+ if (false !== strpos($output, '%extra.'.$var.'%')) {
90
+ $output = str_replace('%extra.'.$var.'%', $this->stringify($val), $output);
91
+ unset($vars['extra'][$var]);
92
+ }
93
+ }
94
+
95
+ foreach ($vars['context'] as $var => $val) {
96
+ if (false !== strpos($output, '%context.'.$var.'%')) {
97
+ $output = str_replace('%context.'.$var.'%', $this->stringify($val), $output);
98
+ unset($vars['context'][$var]);
99
+ }
100
+ }
101
+
102
+ if ($this->ignoreEmptyContextAndExtra) {
103
+ if (empty($vars['context'])) {
104
+ unset($vars['context']);
105
+ $output = str_replace('%context%', '', $output);
106
+ }
107
+
108
+ if (empty($vars['extra'])) {
109
+ unset($vars['extra']);
110
+ $output = str_replace('%extra%', '', $output);
111
+ }
112
+ }
113
+
114
+ foreach ($vars as $var => $val) {
115
+ if (false !== strpos($output, '%'.$var.'%')) {
116
+ $output = str_replace('%'.$var.'%', $this->stringify($val), $output);
117
+ }
118
+ }
119
+
120
+ // remove leftover %extra.xxx% and %context.xxx% if any
121
+ if (false !== strpos($output, '%')) {
122
+ $output = preg_replace('/%(?:extra|context)\..+?%/', '', $output);
123
+ if (null === $output) {
124
+ $pcreErrorCode = preg_last_error();
125
+ throw new \RuntimeException('Failed to run preg_replace: ' . $pcreErrorCode . ' / ' . Utils::pcreLastErrorMessage($pcreErrorCode));
126
+ }
127
+ }
128
+
129
+ return $output;
130
+ }
131
+
132
+ public function formatBatch(array $records): string
133
+ {
134
+ $message = '';
135
+ foreach ($records as $record) {
136
+ $message .= $this->format($record);
137
+ }
138
+
139
+ return $message;
140
+ }
141
+
142
+ /**
143
+ * @param mixed $value
144
+ */
145
+ public function stringify($value): string
146
+ {
147
+ return $this->replaceNewlines($this->convertToString($value));
148
+ }
149
+
150
+ protected function normalizeException(\Throwable $e, int $depth = 0): string
151
+ {
152
+ $str = $this->formatException($e);
153
+
154
+ if ($previous = $e->getPrevious()) {
155
+ do {
156
+ $depth++;
157
+ if ($depth > $this->maxNormalizeDepth) {
158
+ $str .= '\n[previous exception] Over ' . $this->maxNormalizeDepth . ' levels deep, aborting normalization';
159
+ break;
160
+ }
161
+
162
+ $str .= "\n[previous exception] " . $this->formatException($previous);
163
+ } while ($previous = $previous->getPrevious());
164
+ }
165
+
166
+ return $str;
167
+ }
168
+
169
+ /**
170
+ * @param mixed $data
171
+ */
172
+ protected function convertToString($data): string
173
+ {
174
+ if (null === $data || is_bool($data)) {
175
+ return var_export($data, true);
176
+ }
177
+
178
+ if (is_scalar($data)) {
179
+ return (string) $data;
180
+ }
181
+
182
+ return $this->toJson($data, true);
183
+ }
184
+
185
+ protected function replaceNewlines(string $str): string
186
+ {
187
+ if ($this->allowInlineLineBreaks) {
188
+ if (0 === strpos($str, '{')) {
189
+ $str = preg_replace('/(?<!\\\\)\\\\[rn]/', "\n", $str);
190
+ if (null === $str) {
191
+ $pcreErrorCode = preg_last_error();
192
+ throw new \RuntimeException('Failed to run preg_replace: ' . $pcreErrorCode . ' / ' . Utils::pcreLastErrorMessage($pcreErrorCode));
193
+ }
194
+ }
195
+
196
+ return $str;
197
+ }
198
+
199
+ return str_replace(["\r\n", "\r", "\n"], ' ', $str);
200
+ }
201
+
202
+ private function formatException(\Throwable $e): string
203
+ {
204
+ $str = '[object] (' . Utils::getClass($e) . '(code: ' . $e->getCode();
205
+ if ($e instanceof \SoapFault) {
206
+ if (isset($e->faultcode)) {
207
+ $str .= ' faultcode: ' . $e->faultcode;
208
+ }
209
+
210
+ if (isset($e->faultactor)) {
211
+ $str .= ' faultactor: ' . $e->faultactor;
212
+ }
213
+
214
+ if (isset($e->detail)) {
215
+ if (is_string($e->detail)) {
216
+ $str .= ' detail: ' . $e->detail;
217
+ } elseif (is_object($e->detail) || is_array($e->detail)) {
218
+ $str .= ' detail: ' . $this->toJson($e->detail, true);
219
+ }
220
+ }
221
+ }
222
+ $str .= '): ' . $e->getMessage() . ' at ' . $e->getFile() . ':' . $e->getLine() . ')';
223
+
224
+ if ($this->includeStacktraces) {
225
+ $str .= $this->stacktracesParser($e);
226
+ }
227
+
228
+ return $str;
229
+ }
230
+
231
+ private function stacktracesParser(\Throwable $e): string
232
+ {
233
+ $trace = $e->getTraceAsString();
234
+
235
+ if ($this->stacktracesParser) {
236
+ $trace = $this->stacktracesParserCustom($trace);
237
+ }
238
+
239
+ return "\n[stacktrace]\n" . $trace . "\n";
240
+ }
241
+
242
+ private function stacktracesParserCustom(string $trace): string
243
+ {
244
+ return implode("\n", array_filter(array_map($this->stacktracesParser, explode("\n", $trace))));
245
+ }
246
+ }
vendor/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Formatter;
13
+
14
+ /**
15
+ * Encodes message information into JSON in a format compatible with Loggly.
16
+ *
17
+ * @author Adam Pancutt <adam@pancutt.com>
18
+ */
19
+ class LogglyFormatter extends JsonFormatter
20
+ {
21
+ /**
22
+ * Overrides the default batch mode to new lines for compatibility with the
23
+ * Loggly bulk API.
24
+ */
25
+ public function __construct(int $batchMode = self::BATCH_MODE_NEWLINES, bool $appendNewline = false)
26
+ {
27
+ parent::__construct($batchMode, $appendNewline);
28
+ }
29
+
30
+ /**
31
+ * Appends the 'timestamp' parameter for indexing by Loggly.
32
+ *
33
+ * @see https://www.loggly.com/docs/automated-parsing/#json
34
+ * @see \Monolog\Formatter\JsonFormatter::format()
35
+ */
36
+ public function format(array $record): string
37
+ {
38
+ if (isset($record["datetime"]) && ($record["datetime"] instanceof \DateTimeInterface)) {
39
+ $record["timestamp"] = $record["datetime"]->format("Y-m-d\TH:i:s.uO");
40
+ unset($record["datetime"]);
41
+ }
42
+
43
+ return parent::format($record);
44
+ }
45
+ }
vendor/monolog/monolog/src/Monolog/Formatter/LogmaticFormatter.php ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Formatter;
13
+
14
+ /**
15
+ * Encodes message information into JSON in a format compatible with Logmatic.
16
+ *
17
+ * @author Julien Breux <julien.breux@gmail.com>
18
+ */
19
+ class LogmaticFormatter extends JsonFormatter
20
+ {
21
+ protected const MARKERS = ["sourcecode", "php"];
22
+
23
+ /**
24
+ * @var string
25
+ */
26
+ protected $hostname = '';
27
+
28
+ /**
29
+ * @var string
30
+ */
31
+ protected $appname = '';
32
+
33
+ public function setHostname(string $hostname): self
34
+ {
35
+ $this->hostname = $hostname;
36
+
37
+ return $this;
38
+ }
39
+
40
+ public function setAppname(string $appname): self
41
+ {
42
+ $this->appname = $appname;
43
+
44
+ return $this;
45
+ }
46
+
47
+ /**
48
+ * Appends the 'hostname' and 'appname' parameter for indexing by Logmatic.
49
+ *
50
+ * @see http://doc.logmatic.io/docs/basics-to-send-data
51
+ * @see \Monolog\Formatter\JsonFormatter::format()
52
+ */
53
+ public function format(array $record): string
54
+ {
55
+ if (!empty($this->hostname)) {
56
+ $record["hostname"] = $this->hostname;
57
+ }
58
+ if (!empty($this->appname)) {
59
+ $record["appname"] = $this->appname;
60
+ }
61
+
62
+ $record["@marker"] = static::MARKERS;
63
+
64
+ return parent::format($record);
65
+ }
66
+ }
vendor/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Formatter;
13
+
14
+ /**
15
+ * Serializes a log message to Logstash Event Format
16
+ *
17
+ * @see https://www.elastic.co/products/logstash
18
+ * @see https://github.com/elastic/logstash/blob/master/logstash-core/src/main/java/org/logstash/Event.java
19
+ *
20
+ * @author Tim Mower <timothy.mower@gmail.com>
21
+ */
22
+ class LogstashFormatter extends NormalizerFormatter
23
+ {
24
+ /**
25
+ * @var string the name of the system for the Logstash log message, used to fill the @source field
26
+ */
27
+ protected $systemName;
28
+
29
+ /**
30
+ * @var string an application name for the Logstash log message, used to fill the @type field
31
+ */
32
+ protected $applicationName;
33
+
34
+ /**
35
+ * @var string the key for 'extra' fields from the Monolog record
36
+ */
37
+ protected $extraKey;
38
+
39
+ /**
40
+ * @var string the key for 'context' fields from the Monolog record
41
+ */
42
+ protected $contextKey;
43
+
44
+ /**
45
+ * @param string $applicationName The application that sends the data, used as the "type" field of logstash
46
+ * @param string|null $systemName The system/machine name, used as the "source" field of logstash, defaults to the hostname of the machine
47
+ * @param string $extraKey The key for extra keys inside logstash "fields", defaults to extra
48
+ * @param string $contextKey The key for context keys inside logstash "fields", defaults to context
49
+ */
50
+ public function __construct(string $applicationName, ?string $systemName = null, string $extraKey = 'extra', string $contextKey = 'context')
51
+ {
52
+ // logstash requires a ISO 8601 format date with optional millisecond precision.
53
+ parent::__construct('Y-m-d\TH:i:s.uP');
54
+
55
+ $this->systemName = $systemName === null ? (string) gethostname() : $systemName;
56
+ $this->applicationName = $applicationName;
57
+ $this->extraKey = $extraKey;
58
+ $this->contextKey = $contextKey;
59
+ }
60
+
61
+ /**
62
+ * {@inheritDoc}
63
+ */
64
+ public function format(array $record): string
65
+ {
66
+ $record = parent::format($record);
67
+
68
+ if (empty($record['datetime'])) {
69
+ $record['datetime'] = gmdate('c');
70
+ }
71
+ $message = [
72
+ '@timestamp' => $record['datetime'],
73
+ '@version' => 1,
74
+ 'host' => $this->systemName,
75
+ ];
76
+ if (isset($record['message'])) {
77
+ $message['message'] = $record['message'];
78
+ }
79
+ if (isset($record['channel'])) {
80
+ $message['type'] = $record['channel'];
81
+ $message['channel'] = $record['channel'];
82
+ }
83
+ if (isset($record['level_name'])) {
84
+ $message['level'] = $record['level_name'];
85
+ }
86
+ if (isset($record['level'])) {
87
+ $message['monolog_level'] = $record['level'];
88
+ }
89
+ if ($this->applicationName) {
90
+ $message['type'] = $this->applicationName;
91
+ }
92
+ if (!empty($record['extra'])) {
93
+ $message[$this->extraKey] = $record['extra'];
94
+ }
95
+ if (!empty($record['context'])) {
96
+ $message[$this->contextKey] = $record['context'];
97
+ }
98
+
99
+ return $this->toJson($message) . "\n";
100
+ }
101
+ }
vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php ADDED
@@ -0,0 +1,162 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Formatter;
13
+
14
+ use MongoDB\BSON\Type;
15
+ use MongoDB\BSON\UTCDateTime;
16
+ use Monolog\Utils;
17
+
18
+ /**
19
+ * Formats a record for use with the MongoDBHandler.
20
+ *
21
+ * @author Florian Plattner <me@florianplattner.de>
22
+ */
23
+ class MongoDBFormatter implements FormatterInterface
24
+ {
25
+ /** @var bool */
26
+ private $exceptionTraceAsString;
27
+ /** @var int */
28
+ private $maxNestingLevel;
29
+ /** @var bool */
30
+ private $isLegacyMongoExt;
31
+
32
+ /**
33
+ * @param int $maxNestingLevel 0 means infinite nesting, the $record itself is level 1, $record['context'] is 2
34
+ * @param bool $exceptionTraceAsString set to false to log exception traces as a sub documents instead of strings
35
+ */
36
+ public function __construct(int $maxNestingLevel = 3, bool $exceptionTraceAsString = true)
37
+ {
38
+ $this->maxNestingLevel = max($maxNestingLevel, 0);
39
+ $this->exceptionTraceAsString = $exceptionTraceAsString;
40
+
41
+ $this->isLegacyMongoExt = extension_loaded('mongodb') && version_compare((string) phpversion('mongodb'), '1.1.9', '<=');
42
+ }
43
+
44
+ /**
45
+ * {@inheritDoc}
46
+ *
47
+ * @return mixed[]
48
+ */
49
+ public function format(array $record): array
50
+ {
51
+ /** @var mixed[] $res */
52
+ $res = $this->formatArray($record);
53
+
54
+ return $res;
55
+ }
56
+
57
+ /**
58
+ * {@inheritDoc}
59
+ *
60
+ * @return array<mixed[]>
61
+ */
62
+ public function formatBatch(array $records): array
63
+ {
64
+ $formatted = [];
65
+ foreach ($records as $key => $record) {
66
+ $formatted[$key] = $this->format($record);
67
+ }
68
+
69
+ return $formatted;
70
+ }
71
+
72
+ /**
73
+ * @param mixed[] $array
74
+ * @return mixed[]|string Array except when max nesting level is reached then a string "[...]"
75
+ */
76
+ protected function formatArray(array $array, int $nestingLevel = 0)
77
+ {
78
+ if ($this->maxNestingLevel > 0 && $nestingLevel > $this->maxNestingLevel) {
79
+ return '[...]';
80
+ }
81
+
82
+ foreach ($array as $name => $value) {
83
+ if ($value instanceof \DateTimeInterface) {
84
+ $array[$name] = $this->formatDate($value, $nestingLevel + 1);
85
+ } elseif ($value instanceof \Throwable) {
86
+ $array[$name] = $this->formatException($value, $nestingLevel + 1);
87
+ } elseif (is_array($value)) {
88
+ $array[$name] = $this->formatArray($value, $nestingLevel + 1);
89
+ } elseif (is_object($value) && !$value instanceof Type) {
90
+ $array[$name] = $this->formatObject($value, $nestingLevel + 1);
91
+ }
92
+ }
93
+
94
+ return $array;
95
+ }
96
+
97
+ /**
98
+ * @param mixed $value
99
+ * @return mixed[]|string
100
+ */
101
+ protected function formatObject($value, int $nestingLevel)
102
+ {
103
+ $objectVars = get_object_vars($value);
104
+ $objectVars['class'] = Utils::getClass($value);
105
+
106
+ return $this->formatArray($objectVars, $nestingLevel);
107
+ }
108
+
109
+ /**
110
+ * @return mixed[]|string
111
+ */
112
+ protected function formatException(\Throwable $exception, int $nestingLevel)
113
+ {
114
+ $formattedException = [
115
+ 'class' => Utils::getClass($exception),
116
+ 'message' => $exception->getMessage(),
117
+ 'code' => (int) $exception->getCode(),
118
+ 'file' => $exception->getFile() . ':' . $exception->getLine(),
119
+ ];
120
+
121
+ if ($this->exceptionTraceAsString === true) {
122
+ $formattedException['trace'] = $exception->getTraceAsString();
123
+ } else {
124
+ $formattedException['trace'] = $exception->getTrace();
125
+ }
126
+
127
+ return $this->formatArray($formattedException, $nestingLevel);
128
+ }
129
+
130
+ protected function formatDate(\DateTimeInterface $value, int $nestingLevel): UTCDateTime
131
+ {
132
+ if ($this->isLegacyMongoExt) {
133
+ return $this->legacyGetMongoDbDateTime($value);
134
+ }
135
+
136
+ return $this->getMongoDbDateTime($value);
137
+ }
138
+
139
+ private function getMongoDbDateTime(\DateTimeInterface $value): UTCDateTime
140
+ {
141
+ return new UTCDateTime((int) floor(((float) $value->format('U.u')) * 1000));
142
+ }
143
+
144
+ /**
145
+ * This is needed to support MongoDB Driver v1.19 and below
146
+ *
147
+ * See https://github.com/mongodb/mongo-php-driver/issues/426
148
+ *
149
+ * It can probably be removed in 2.1 or later once MongoDB's 1.2 is released and widely adopted
150
+ */
151
+ private function legacyGetMongoDbDateTime(\DateTimeInterface $value): UTCDateTime
152
+ {
153
+ $milliseconds = floor(((float) $value->format('U.u')) * 1000);
154
+
155
+ $milliseconds = (PHP_INT_SIZE == 8) //64-bit OS?
156
+ ? (int) $milliseconds
157
+ : (string) $milliseconds;
158
+
159
+ // @phpstan-ignore-next-line
160
+ return new UTCDateTime($milliseconds);
161
+ }
162
+ }
vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php ADDED
@@ -0,0 +1,287 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Formatter;
13
+
14
+ use Monolog\DateTimeImmutable;
15
+ use Monolog\Utils;
16
+ use Throwable;
17
+
18
+ /**
19
+ * Normalizes incoming records to remove objects/resources so it's easier to dump to various targets
20
+ *
21
+ * @author Jordi Boggiano <j.boggiano@seld.be>
22
+ */
23
+ class NormalizerFormatter implements FormatterInterface
24
+ {
25
+ public const SIMPLE_DATE = "Y-m-d\TH:i:sP";
26
+
27
+ /** @var string */
28
+ protected $dateFormat;
29
+ /** @var int */
30
+ protected $maxNormalizeDepth = 9;
31
+ /** @var int */
32
+ protected $maxNormalizeItemCount = 1000;
33
+
34
+ /** @var int */
35
+ private $jsonEncodeOptions = Utils::DEFAULT_JSON_FLAGS;
36
+
37
+ /**
38
+ * @param string|null $dateFormat The format of the timestamp: one supported by DateTime::format
39
+ */
40
+ public function __construct(?string $dateFormat = null)
41
+ {
42
+ $this->dateFormat = null === $dateFormat ? static::SIMPLE_DATE : $dateFormat;
43
+ if (!function_exists('json_encode')) {
44
+ throw new \RuntimeException('PHP\'s json extension is required to use Monolog\'s NormalizerFormatter');
45
+ }
46
+ }
47
+
48
+ /**
49
+ * {@inheritDoc}
50
+ *
51
+ * @param mixed[] $record
52
+ */
53
+ public function format(array $record)
54
+ {
55
+ return $this->normalize($record);
56
+ }
57
+
58
+ /**
59
+ * {@inheritDoc}
60
+ */
61
+ public function formatBatch(array $records)
62
+ {
63
+ foreach ($records as $key => $record) {
64
+ $records[$key] = $this->format($record);
65
+ }
66
+
67
+ return $records;
68
+ }
69
+
70
+ public function getDateFormat(): string
71
+ {
72
+ return $this->dateFormat;
73
+ }
74
+
75
+ public function setDateFormat(string $dateFormat): self
76
+ {
77
+ $this->dateFormat = $dateFormat;
78
+
79
+ return $this;
80
+ }
81
+
82
+ /**
83
+ * The maximum number of normalization levels to go through
84
+ */
85
+ public function getMaxNormalizeDepth(): int
86
+ {
87
+ return $this->maxNormalizeDepth;
88
+ }
89
+
90
+ public function setMaxNormalizeDepth(int $maxNormalizeDepth): self
91
+ {
92
+ $this->maxNormalizeDepth = $maxNormalizeDepth;
93
+
94
+ return $this;
95
+ }
96
+
97
+ /**
98
+ * The maximum number of items to normalize per level
99
+ */
100
+ public function getMaxNormalizeItemCount(): int
101
+ {
102
+ return $this->maxNormalizeItemCount;
103
+ }
104
+
105
+ public function setMaxNormalizeItemCount(int $maxNormalizeItemCount): self
106
+ {
107
+ $this->maxNormalizeItemCount = $maxNormalizeItemCount;
108
+
109
+ return $this;
110
+ }
111
+
112
+ /**
113
+ * Enables `json_encode` pretty print.
114
+ */
115
+ public function setJsonPrettyPrint(bool $enable): self
116
+ {
117
+ if ($enable) {
118
+ $this->jsonEncodeOptions |= JSON_PRETTY_PRINT;
119
+ } else {
120
+ $this->jsonEncodeOptions &= ~JSON_PRETTY_PRINT;
121
+ }
122
+
123
+ return $this;
124
+ }
125
+
126
+ /**
127
+ * @param mixed $data
128
+ * @return null|scalar|array<array|scalar|null>
129
+ */
130
+ protected function normalize($data, int $depth = 0)
131
+ {
132
+ if ($depth > $this->maxNormalizeDepth) {
133
+ return 'Over ' . $this->maxNormalizeDepth . ' levels deep, aborting normalization';
134
+ }
135
+
136
+ if (null === $data || is_scalar($data)) {
137
+ if (is_float($data)) {
138
+ if (is_infinite($data)) {
139
+ return ($data > 0 ? '' : '-') . 'INF';
140
+ }
141
+ if (is_nan($data)) {
142
+ return 'NaN';
143
+ }
144
+ }
145
+
146
+ return $data;
147
+ }
148
+
149
+ if (is_array($data)) {
150
+ $normalized = [];
151
+
152
+ $count = 1;
153
+ foreach ($data as $key => $value) {
154
+ if ($count++ > $this->maxNormalizeItemCount) {
155
+ $normalized['...'] = 'Over ' . $this->maxNormalizeItemCount . ' items ('.count($data).' total), aborting normalization';
156
+ break;
157
+ }
158
+
159
+ $normalized[$key] = $this->normalize($value, $depth + 1);
160
+ }
161
+
162
+ return $normalized;
163
+ }
164
+
165
+ if ($data instanceof \DateTimeInterface) {
166
+ return $this->formatDate($data);
167
+ }
168
+
169
+ if (is_object($data)) {
170
+ if ($data instanceof Throwable) {
171
+ return $this->normalizeException($data, $depth);
172
+ }
173
+
174
+ if ($data instanceof \JsonSerializable) {
175
+ /** @var null|scalar|array<array|scalar|null> $value */
176
+ $value = $data->jsonSerialize();
177
+ } elseif (method_exists($data, '__toString')) {
178
+ /** @var string $value */
179
+ $value = $data->__toString();
180
+ } else {
181
+ // the rest is normalized by json encoding and decoding it
182
+ /** @var null|scalar|array<array|scalar|null> $value */
183
+ $value = json_decode($this->toJson($data, true), true);
184
+ }
185
+
186
+ return [Utils::getClass($data) => $value];
187
+ }
188
+
189
+ if (is_resource($data)) {
190
+ return sprintf('[resource(%s)]', get_resource_type($data));
191
+ }
192
+
193
+ return '[unknown('.gettype($data).')]';
194
+ }
195
+
196
+ /**
197
+ * @return mixed[]
198
+ */
199
+ protected function normalizeException(Throwable $e, int $depth = 0)
200
+ {
201
+ if ($depth > $this->maxNormalizeDepth) {
202
+ return ['Over ' . $this->maxNormalizeDepth . ' levels deep, aborting normalization'];
203
+ }
204
+
205
+ if ($e instanceof \JsonSerializable) {
206
+ return (array) $e->jsonSerialize();
207
+ }
208
+
209
+ $data = [
210
+ 'class' => Utils::getClass($e),
211
+ 'message' => $e->getMessage(),
212
+ 'code' => (int) $e->getCode(),
213
+ 'file' => $e->getFile().':'.$e->getLine(),
214
+ ];
215
+
216
+ if ($e instanceof \SoapFault) {
217
+ if (isset($e->faultcode)) {
218
+ $data['faultcode'] = $e->faultcode;
219
+ }
220
+
221
+ if (isset($e->faultactor)) {
222
+ $data['faultactor'] = $e->faultactor;
223
+ }
224
+
225
+ if (isset($e->detail)) {
226
+ if (is_string($e->detail)) {
227
+ $data['detail'] = $e->detail;
228
+ } elseif (is_object($e->detail) || is_array($e->detail)) {
229
+ $data['detail'] = $this->toJson($e->detail, true);
230
+ }
231
+ }
232
+ }
233
+
234
+ $trace = $e->getTrace();
235
+ foreach ($trace as $frame) {
236
+ if (isset($frame['file'])) {
237
+ $data['trace'][] = $frame['file'].':'.$frame['line'];
238
+ }
239
+ }
240
+
241
+ if ($previous = $e->getPrevious()) {
242
+ $data['previous'] = $this->normalizeException($previous, $depth + 1);
243
+ }
244
+
245
+ return $data;
246
+ }
247
+
248
+ /**
249
+ * Return the JSON representation of a value
250
+ *
251
+ * @param mixed $data
252
+ * @throws \RuntimeException if encoding fails and errors are not ignored
253
+ * @return string if encoding fails and ignoreErrors is true 'null' is returned
254
+ */
255
+ protected function toJson($data, bool $ignoreErrors = false): string
256
+ {
257
+ return Utils::jsonEncode($data, $this->jsonEncodeOptions, $ignoreErrors);
258
+ }
259
+
260
+ /**
261
+ * @return string
262
+ */
263
+ protected function formatDate(\DateTimeInterface $date)
264
+ {
265
+ // in case the date format isn't custom then we defer to the custom DateTimeImmutable
266
+ // formatting logic, which will pick the right format based on whether useMicroseconds is on
267
+ if ($this->dateFormat === self::SIMPLE_DATE && $date instanceof DateTimeImmutable) {
268
+ return (string) $date;
269
+ }
270
+
271
+ return $date->format($this->dateFormat);
272
+ }
273
+
274
+ public function addJsonEncodeOption(int $option): self
275
+ {
276
+ $this->jsonEncodeOptions |= $option;
277
+
278
+ return $this;
279
+ }
280
+
281
+ public function removeJsonEncodeOption(int $option): self
282
+ {
283
+ $this->jsonEncodeOptions &= ~$option;
284
+
285
+ return $this;
286
+ }
287
+ }
vendor/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Formatter;
13
+
14
+ /**
15
+ * Formats data into an associative array of scalar values.
16
+ * Objects and arrays will be JSON encoded.
17
+ *
18
+ * @author Andrew Lawson <adlawson@gmail.com>
19
+ */
20
+ class ScalarFormatter extends NormalizerFormatter
21
+ {
22
+ /**
23
+ * {@inheritDoc}
24
+ *
25
+ * @phpstan-return array<string, scalar|null> $record
26
+ */
27
+ public function format(array $record): array
28
+ {
29
+ $result = [];
30
+ foreach ($record as $key => $value) {
31
+ $result[$key] = $this->normalizeValue($value);
32
+ }
33
+
34
+ return $result;
35
+ }
36
+
37
+ /**
38
+ * @param mixed $value
39
+ * @return scalar|null
40
+ */
41
+ protected function normalizeValue($value)
42
+ {
43
+ $normalized = $this->normalize($value);
44
+
45
+ if (is_array($normalized)) {
46
+ return $this->toJson($normalized, true);
47
+ }
48
+
49
+ return $normalized;
50
+ }
51
+ }
vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php ADDED
@@ -0,0 +1,139 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Formatter;
13
+
14
+ use Monolog\Logger;
15
+
16
+ /**
17
+ * Serializes a log message according to Wildfire's header requirements
18
+ *
19
+ * @author Eric Clemmons (@ericclemmons) <eric@uxdriven.com>
20
+ * @author Christophe Coevoet <stof@notk.org>
21
+ * @author Kirill chEbba Chebunin <iam@chebba.org>
22
+ *
23
+ * @phpstan-import-type Level from \Monolog\Logger
24
+ */
25
+ class WildfireFormatter extends NormalizerFormatter
26
+ {
27
+ /**
28
+ * Translates Monolog log levels to Wildfire levels.
29
+ *
30
+ * @var array<Level, string>
31
+ */
32
+ private $logLevels = [
33
+ Logger::DEBUG => 'LOG',
34
+ Logger::INFO => 'INFO',
35
+ Logger::NOTICE => 'INFO',
36
+ Logger::WARNING => 'WARN',
37
+ Logger::ERROR => 'ERROR',
38
+ Logger::CRITICAL => 'ERROR',
39
+ Logger::ALERT => 'ERROR',
40
+ Logger::EMERGENCY => 'ERROR',
41
+ ];
42
+
43
+ /**
44
+ * @param string|null $dateFormat The format of the timestamp: one supported by DateTime::format
45
+ */
46
+ public function __construct(?string $dateFormat = null)
47
+ {
48
+ parent::__construct($dateFormat);
49
+
50
+ // http headers do not like non-ISO-8559-1 characters
51
+ $this->removeJsonEncodeOption(JSON_UNESCAPED_UNICODE);
52
+ }
53
+
54
+ /**
55
+ * {@inheritDoc}
56
+ *
57
+ * @return string
58
+ */
59
+ public function format(array $record): string
60
+ {
61
+ // Retrieve the line and file if set and remove them from the formatted extra
62
+ $file = $line = '';
63
+ if (isset($record['extra']['file'])) {
64
+ $file = $record['extra']['file'];
65
+ unset($record['extra']['file']);
66
+ }
67
+ if (isset($record['extra']['line'])) {
68
+ $line = $record['extra']['line'];
69
+ unset($record['extra']['line']);
70
+ }
71
+
72
+ /** @var mixed[] $record */
73
+ $record = $this->normalize($record);
74
+ $message = ['message' => $record['message']];
75
+ $handleError = false;
76
+ if ($record['context']) {
77
+ $message['context'] = $record['context'];
78
+ $handleError = true;
79
+ }
80
+ if ($record['extra']) {
81
+ $message['extra'] = $record['extra'];
82
+ $handleError = true;
83
+ }
84
+ if (count($message) === 1) {
85
+ $message = reset($message);
86
+ }
87
+
88
+ if (isset($record['context']['table'])) {
89
+ $type = 'TABLE';
90
+ $label = $record['channel'] .': '. $record['message'];
91
+ $message = $record['context']['table'];
92
+ } else {
93
+ $type = $this->logLevels[$record['level']];
94
+ $label = $record['channel'];
95
+ }
96
+
97
+ // Create JSON object describing the appearance of the message in the console
98
+ $json = $this->toJson([
99
+ [
100
+ 'Type' => $type,
101
+ 'File' => $file,
102
+ 'Line' => $line,
103
+ 'Label' => $label,
104
+ ],
105
+ $message,
106
+ ], $handleError);
107
+
108
+ // The message itself is a serialization of the above JSON object + it's length
109
+ return sprintf(
110
+ '%d|%s|',
111
+ strlen($json),
112
+ $json
113
+ );
114
+ }
115
+
116
+ /**
117
+ * {@inheritDoc}
118
+ *
119
+ * @phpstan-return never
120
+ */
121
+ public function formatBatch(array $records)
122
+ {
123
+ throw new \BadMethodCallException('Batch formatting does not make sense for the WildfireFormatter');
124
+ }
125
+
126
+ /**
127
+ * {@inheritDoc}
128
+ *
129
+ * @return null|scalar|array<array|scalar|null>|object
130
+ */
131
+ protected function normalize($data, int $depth = 0)
132
+ {
133
+ if (is_object($data) && !$data instanceof \DateTimeInterface) {
134
+ return $data;
135
+ }
136
+
137
+ return parent::normalize($data, $depth);
138
+ }
139
+ }
vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php ADDED
@@ -0,0 +1,112 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Logger;
15
+ use Monolog\ResettableInterface;
16
+ use Psr\Log\LogLevel;
17
+
18
+ /**
19
+ * Base Handler class providing basic level/bubble support
20
+ *
21
+ * @author Jordi Boggiano <j.boggiano@seld.be>
22
+ *
23
+ * @phpstan-import-type Level from \Monolog\Logger
24
+ * @phpstan-import-type LevelName from \Monolog\Logger
25
+ */
26
+ abstract class AbstractHandler extends Handler implements ResettableInterface
27
+ {
28
+ /**
29
+ * @var int
30
+ * @phpstan-var Level
31
+ */
32
+ protected $level = Logger::DEBUG;
33
+ /** @var bool */
34
+ protected $bubble = true;
35
+
36
+ /**
37
+ * @param int|string $level The minimum logging level at which this handler will be triggered
38
+ * @param bool $bubble Whether the messages that are handled can bubble up the stack or not
39
+ *
40
+ * @phpstan-param Level|LevelName|LogLevel::* $level
41
+ */
42
+ public function __construct($level = Logger::DEBUG, bool $bubble = true)
43
+ {
44
+ $this->setLevel($level);
45
+ $this->bubble = $bubble;
46
+ }
47
+
48
+ /**
49
+ * {@inheritDoc}
50
+ */
51
+ public function isHandling(array $record): bool
52
+ {
53
+ return $record['level'] >= $this->level;
54
+ }
55
+
56
+ /**
57
+ * Sets minimum logging level at which this handler will be triggered.
58
+ *
59
+ * @param Level|LevelName|LogLevel::* $level Level or level name
60
+ * @return self
61
+ */
62
+ public function setLevel($level): self
63
+ {
64
+ $this->level = Logger::toMonologLevel($level);
65
+
66
+ return $this;
67
+ }
68
+
69
+ /**
70
+ * Gets minimum logging level at which this handler will be triggered.
71
+ *
72
+ * @return int
73
+ *
74
+ * @phpstan-return Level
75
+ */
76
+ public function getLevel(): int
77
+ {
78
+ return $this->level;
79
+ }
80
+
81
+ /**
82
+ * Sets the bubbling behavior.
83
+ *
84
+ * @param bool $bubble true means that this handler allows bubbling.
85
+ * false means that bubbling is not permitted.
86
+ * @return self
87
+ */
88
+ public function setBubble(bool $bubble): self
89
+ {
90
+ $this->bubble = $bubble;
91
+
92
+ return $this;
93
+ }
94
+
95
+ /**
96
+ * Gets the bubbling behavior.
97
+ *
98
+ * @return bool true means that this handler allows bubbling.
99
+ * false means that bubbling is not permitted.
100
+ */
101
+ public function getBubble(): bool
102
+ {
103
+ return $this->bubble;
104
+ }
105
+
106
+ /**
107
+ * {@inheritDoc}
108
+ */
109
+ public function reset()
110
+ {
111
+ }
112
+ }
vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ /**
15
+ * Base Handler class providing the Handler structure, including processors and formatters
16
+ *
17
+ * Classes extending it should (in most cases) only implement write($record)
18
+ *
19
+ * @author Jordi Boggiano <j.boggiano@seld.be>
20
+ * @author Christophe Coevoet <stof@notk.org>
21
+ *
22
+ * @phpstan-import-type LevelName from \Monolog\Logger
23
+ * @phpstan-import-type Level from \Monolog\Logger
24
+ * @phpstan-import-type Record from \Monolog\Logger
25
+ * @phpstan-type FormattedRecord array{message: string, context: mixed[], level: Level, level_name: LevelName, channel: string, datetime: \DateTimeImmutable, extra: mixed[], formatted: mixed}
26
+ */
27
+ abstract class AbstractProcessingHandler extends AbstractHandler implements ProcessableHandlerInterface, FormattableHandlerInterface
28
+ {
29
+ use ProcessableHandlerTrait;
30
+ use FormattableHandlerTrait;
31
+
32
+ /**
33
+ * {@inheritDoc}
34
+ */
35
+ public function handle(array $record): bool
36
+ {
37
+ if (!$this->isHandling($record)) {
38
+ return false;
39
+ }
40
+
41
+ if ($this->processors) {
42
+ /** @var Record $record */
43
+ $record = $this->processRecord($record);
44
+ }
45
+
46
+ $record['formatted'] = $this->getFormatter()->format($record);
47
+
48
+ $this->write($record);
49
+
50
+ return false === $this->bubble;
51
+ }
52
+
53
+ /**
54
+ * Writes the record down to the log of the implementing handler
55
+ *
56
+ * @phpstan-param FormattedRecord $record
57
+ */
58
+ abstract protected function write(array $record): void;
59
+
60
+ /**
61
+ * @return void
62
+ */
63
+ public function reset()
64
+ {
65
+ parent::reset();
66
+
67
+ $this->resetProcessors();
68
+ }
69
+ }
vendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php ADDED
@@ -0,0 +1,106 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Logger;
15
+ use Monolog\Formatter\FormatterInterface;
16
+ use Monolog\Formatter\LineFormatter;
17
+
18
+ /**
19
+ * Common syslog functionality
20
+ *
21
+ * @phpstan-import-type Level from \Monolog\Logger
22
+ */
23
+ abstract class AbstractSyslogHandler extends AbstractProcessingHandler
24
+ {
25
+ /** @var int */
26
+ protected $facility;
27
+
28
+ /**
29
+ * Translates Monolog log levels to syslog log priorities.
30
+ * @var array
31
+ * @phpstan-var array<Level, int>
32
+ */
33
+ protected $logLevels = [
34
+ Logger::DEBUG => LOG_DEBUG,
35
+ Logger::INFO => LOG_INFO,
36
+ Logger::NOTICE => LOG_NOTICE,
37
+ Logger::WARNING => LOG_WARNING,
38
+ Logger::ERROR => LOG_ERR,
39
+ Logger::CRITICAL => LOG_CRIT,
40
+ Logger::ALERT => LOG_ALERT,
41
+ Logger::EMERGENCY => LOG_EMERG,
42
+ ];
43
+
44
+ /**
45
+ * List of valid log facility names.
46
+ * @var array<string, int>
47
+ */
48
+ protected $facilities = [
49
+ 'auth' => LOG_AUTH,
50
+ 'authpriv' => LOG_AUTHPRIV,
51
+ 'cron' => LOG_CRON,
52
+ 'daemon' => LOG_DAEMON,
53
+ 'kern' => LOG_KERN,
54
+ 'lpr' => LOG_LPR,
55
+ 'mail' => LOG_MAIL,
56
+ 'news' => LOG_NEWS,
57
+ 'syslog' => LOG_SYSLOG,
58
+ 'user' => LOG_USER,
59
+ 'uucp' => LOG_UUCP,
60
+ ];
61
+
62
+ /**
63
+ * @param string|int $facility Either one of the names of the keys in $this->facilities, or a LOG_* facility constant
64
+ */
65
+ public function __construct($facility = LOG_USER, $level = Logger::DEBUG, bool $bubble = true)
66
+ {
67
+ parent::__construct($level, $bubble);
68
+
69
+ if (!defined('PHP_WINDOWS_VERSION_BUILD')) {
70
+ $this->facilities['local0'] = LOG_LOCAL0;
71
+ $this->facilities['local1'] = LOG_LOCAL1;
72
+ $this->facilities['local2'] = LOG_LOCAL2;
73
+ $this->facilities['local3'] = LOG_LOCAL3;
74
+ $this->facilities['local4'] = LOG_LOCAL4;
75
+ $this->facilities['local5'] = LOG_LOCAL5;
76
+ $this->facilities['local6'] = LOG_LOCAL6;
77
+ $this->facilities['local7'] = LOG_LOCAL7;
78
+ } else {
79
+ $this->facilities['local0'] = 128; // LOG_LOCAL0
80
+ $this->facilities['local1'] = 136; // LOG_LOCAL1
81
+ $this->facilities['local2'] = 144; // LOG_LOCAL2
82
+ $this->facilities['local3'] = 152; // LOG_LOCAL3
83
+ $this->facilities['local4'] = 160; // LOG_LOCAL4
84
+ $this->facilities['local5'] = 168; // LOG_LOCAL5
85
+ $this->facilities['local6'] = 176; // LOG_LOCAL6
86
+ $this->facilities['local7'] = 184; // LOG_LOCAL7
87
+ }
88
+
89
+ // convert textual description of facility to syslog constant
90
+ if (is_string($facility) && array_key_exists(strtolower($facility), $this->facilities)) {
91
+ $facility = $this->facilities[strtolower($facility)];
92
+ } elseif (!in_array($facility, array_values($this->facilities), true)) {
93
+ throw new \UnexpectedValueException('Unknown facility value "'.$facility.'" given');
94
+ }
95
+
96
+ $this->facility = $facility;
97
+ }
98
+
99
+ /**
100
+ * {@inheritDoc}
101
+ */
102
+ protected function getDefaultFormatter(): FormatterInterface
103
+ {
104
+ return new LineFormatter('%channel%.%level_name%: %message% %context% %extra%');
105
+ }
106
+ }
vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php ADDED
@@ -0,0 +1,170 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Logger;
15
+ use Monolog\Formatter\FormatterInterface;
16
+ use Monolog\Formatter\JsonFormatter;
17
+ use PhpAmqpLib\Message\AMQPMessage;
18
+ use PhpAmqpLib\Channel\AMQPChannel;
19
+ use AMQPExchange;
20
+
21
+ /**
22
+ * @phpstan-import-type Record from \Monolog\Logger
23
+ */
24
+ class AmqpHandler extends AbstractProcessingHandler
25
+ {
26
+ /**
27
+ * @var AMQPExchange|AMQPChannel $exchange
28
+ */
29
+ protected $exchange;
30
+ /** @var array<string, mixed> */
31
+ private $extraAttributes = [];
32
+
33
+ /**
34
+ * @return array<string, mixed>
35
+ */
36
+ public function getExtraAttributes(): array
37
+ {
38
+ return $this->extraAttributes;
39
+ }
40
+
41
+ /**
42
+ * Configure extra attributes to pass to the AMQPExchange (if you are using the amqp extension)
43
+ *
44
+ * @param array<string, mixed> $extraAttributes One of content_type, content_encoding,
45
+ * message_id, user_id, app_id, delivery_mode,
46
+ * priority, timestamp, expiration, type
47
+ * or reply_to, headers.
48
+ * @return AmqpHandler
49
+ */
50
+ public function setExtraAttributes(array $extraAttributes): self
51
+ {
52
+ $this->extraAttributes = $extraAttributes;
53
+ return $this;
54
+ }
55
+
56
+ /**
57
+ * @var string
58
+ */
59
+ protected $exchangeName;
60
+
61
+ /**
62
+ * @param AMQPExchange|AMQPChannel $exchange AMQPExchange (php AMQP ext) or PHP AMQP lib channel, ready for use
63
+ * @param string|null $exchangeName Optional exchange name, for AMQPChannel (PhpAmqpLib) only
64
+ */
65
+ public function __construct($exchange, ?string $exchangeName = null, $level = Logger::DEBUG, bool $bubble = true)
66
+ {
67
+ if ($exchange instanceof AMQPChannel) {
68
+ $this->exchangeName = (string) $exchangeName;
69
+ } elseif (!$exchange instanceof AMQPExchange) {
70
+ throw new \InvalidArgumentException('PhpAmqpLib\Channel\AMQPChannel or AMQPExchange instance required');
71
+ } elseif ($exchangeName) {
72
+ @trigger_error('The $exchangeName parameter can only be passed when using PhpAmqpLib, if using an AMQPExchange instance configure it beforehand', E_USER_DEPRECATED);
73
+ }
74
+ $this->exchange = $exchange;
75
+
76
+ parent::__construct($level, $bubble);
77
+ }
78
+
79
+ /**
80
+ * {@inheritDoc}
81
+ */
82
+ protected function write(array $record): void
83
+ {
84
+ $data = $record["formatted"];
85
+ $routingKey = $this->getRoutingKey($record);
86
+
87
+ if ($this->exchange instanceof AMQPExchange) {
88
+ $attributes = [
89
+ 'delivery_mode' => 2,
90
+ 'content_type' => 'application/json',
91
+ ];
92
+ if ($this->extraAttributes) {
93
+ $attributes = array_merge($attributes, $this->extraAttributes);
94
+ }
95
+ $this->exchange->publish(
96
+ $data,
97
+ $routingKey,
98
+ 0,
99
+ $attributes
100
+ );
101
+ } else {
102
+ $this->exchange->basic_publish(
103
+ $this->createAmqpMessage($data),
104
+ $this->exchangeName,
105
+ $routingKey
106
+ );
107
+ }
108
+ }
109
+
110
+ /**
111
+ * {@inheritDoc}
112
+ */
113
+ public function handleBatch(array $records): void
114
+ {
115
+ if ($this->exchange instanceof AMQPExchange) {
116
+ parent::handleBatch($records);
117
+
118
+ return;
119
+ }
120
+
121
+ foreach ($records as $record) {
122
+ if (!$this->isHandling($record)) {
123
+ continue;
124
+ }
125
+
126
+ /** @var Record $record */
127
+ $record = $this->processRecord($record);
128
+ $data = $this->getFormatter()->format($record);
129
+
130
+ $this->exchange->batch_basic_publish(
131
+ $this->createAmqpMessage($data),
132
+ $this->exchangeName,
133
+ $this->getRoutingKey($record)
134
+ );
135
+ }
136
+
137
+ $this->exchange->publish_batch();
138
+ }
139
+
140
+ /**
141
+ * Gets the routing key for the AMQP exchange
142
+ *
143
+ * @phpstan-param Record $record
144
+ */
145
+ protected function getRoutingKey(array $record): string
146
+ {
147
+ $routingKey = sprintf('%s.%s', $record['level_name'], $record['channel']);
148
+
149
+ return strtolower($routingKey);
150
+ }
151
+
152
+ private function createAmqpMessage(string $data): AMQPMessage
153
+ {
154
+ return new AMQPMessage(
155
+ $data,
156
+ [
157
+ 'delivery_mode' => 2,
158
+ 'content_type' => 'application/json',
159
+ ]
160
+ );
161
+ }
162
+
163
+ /**
164
+ * {@inheritDoc}
165
+ */
166
+ protected function getDefaultFormatter(): FormatterInterface
167
+ {
168
+ return new JsonFormatter(JsonFormatter::BATCH_MODE_JSON, false);
169
+ }
170
+ }
vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php ADDED
@@ -0,0 +1,293 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Formatter\FormatterInterface;
15
+ use Monolog\Formatter\LineFormatter;
16
+ use Monolog\Utils;
17
+
18
+ use function count;
19
+ use function headers_list;
20
+ use function stripos;
21
+ use function trigger_error;
22
+
23
+ use const E_USER_DEPRECATED;
24
+
25
+ /**
26
+ * Handler sending logs to browser's javascript console with no browser extension required
27
+ *
28
+ * @author Olivier Poitrey <rs@dailymotion.com>
29
+ *
30
+ * @phpstan-import-type FormattedRecord from AbstractProcessingHandler
31
+ */
32
+ class BrowserConsoleHandler extends AbstractProcessingHandler
33
+ {
34
+ /** @var bool */
35
+ protected static $initialized = false;
36
+ /** @var FormattedRecord[] */
37
+ protected static $records = [];
38
+
39
+ protected const FORMAT_HTML = 'html';
40
+ protected const FORMAT_JS = 'js';
41
+ protected const FORMAT_UNKNOWN = 'unknown';
42
+
43
+ /**
44
+ * {@inheritDoc}
45
+ *
46
+ * Formatted output may contain some formatting markers to be transferred to `console.log` using the %c format.
47
+ *
48
+ * Example of formatted string:
49
+ *
50
+ * You can do [[blue text]]{color: blue} or [[green background]]{background-color: green; color: white}
51
+ */
52
+ protected function getDefaultFormatter(): FormatterInterface
53
+ {
54
+ return new LineFormatter('[[%channel%]]{macro: autolabel} [[%level_name%]]{font-weight: bold} %message%');
55
+ }
56
+
57
+ /**
58
+ * {@inheritDoc}
59
+ */
60
+ protected function write(array $record): void
61
+ {
62
+ // Accumulate records
63
+ static::$records[] = $record;
64
+
65
+ // Register shutdown handler if not already done
66
+ if (!static::$initialized) {
67
+ static::$initialized = true;
68
+ $this->registerShutdownFunction();
69
+ }
70
+ }
71
+
72
+ /**
73
+ * Convert records to javascript console commands and send it to the browser.
74
+ * This method is automatically called on PHP shutdown if output is HTML or Javascript.
75
+ */
76
+ public static function send(): void
77
+ {
78
+ $format = static::getResponseFormat();
79
+ if ($format === self::FORMAT_UNKNOWN) {
80
+ return;
81
+ }
82
+
83
+ if (count(static::$records)) {
84
+ if ($format === self::FORMAT_HTML) {
85
+ static::writeOutput('<script>' . static::generateScript() . '</script>');
86
+ } elseif ($format === self::FORMAT_JS) {
87
+ static::writeOutput(static::generateScript());
88
+ }
89
+ static::resetStatic();
90
+ }
91
+ }
92
+
93
+ public function close(): void
94
+ {
95
+ self::resetStatic();
96
+ }
97
+
98
+ public function reset()
99
+ {
100
+ parent::reset();
101
+
102
+ self::resetStatic();
103
+ }
104
+
105
+ /**
106
+ * Forget all logged records
107
+ */
108
+ public static function resetStatic(): void
109
+ {
110
+ static::$records = [];
111
+ }
112
+
113
+ /**
114
+ * Wrapper for register_shutdown_function to allow overriding
115
+ */
116
+ protected function registerShutdownFunction(): void
117
+ {
118
+ if (PHP_SAPI !== 'cli') {
119
+ register_shutdown_function(['Monolog\Handler\BrowserConsoleHandler', 'send']);
120
+ }
121
+ }
122
+
123
+ /**
124
+ * Wrapper for echo to allow overriding
125
+ */
126
+ protected static function writeOutput(string $str): void
127
+ {
128
+ echo $str;
129
+ }
130
+
131
+ /**
132
+ * Checks the format of the response
133
+ *
134
+ * If Content-Type is set to application/javascript or text/javascript -> js
135
+ * If Content-Type is set to text/html, or is unset -> html
136
+ * If Content-Type is anything else -> unknown
137
+ *
138
+ * @return string One of 'js', 'html' or 'unknown'
139
+ * @phpstan-return self::FORMAT_*
140
+ */
141
+ protected static function getResponseFormat(): string
142
+ {
143
+ // Check content type
144
+ foreach (headers_list() as $header) {
145
+ if (stripos($header, 'content-type:') === 0) {
146
+ return static::getResponseFormatFromContentType($header);
147
+ }
148
+ }
149
+
150
+ return self::FORMAT_HTML;
151
+ }
152
+
153
+ /**
154
+ * @return string One of 'js', 'html' or 'unknown'
155
+ * @phpstan-return self::FORMAT_*
156
+ */
157
+ protected static function getResponseFormatFromContentType(string $contentType): string
158
+ {
159
+ // This handler only works with HTML and javascript outputs
160
+ // text/javascript is obsolete in favour of application/javascript, but still used
161
+ if (stripos($contentType, 'application/javascript') !== false || stripos($contentType, 'text/javascript') !== false) {
162
+ return self::FORMAT_JS;
163
+ }
164
+
165
+ if (stripos($contentType, 'text/html') !== false) {
166
+ return self::FORMAT_HTML;
167
+ }
168
+
169
+ return self::FORMAT_UNKNOWN;
170
+ }
171
+
172
+ private static function generateScript(): string
173
+ {
174
+ $script = [];
175
+ foreach (static::$records as $record) {
176
+ $context = static::dump('Context', $record['context']);
177
+ $extra = static::dump('Extra', $record['extra']);
178
+
179
+ if (empty($context) && empty($extra)) {
180
+ $script[] = static::call_array('log', static::handleStyles($record['formatted']));
181
+ } else {
182
+ $script = array_merge(
183
+ $script,
184
+ [static::call_array('groupCollapsed', static::handleStyles($record['formatted']))],
185
+ $context,
186
+ $extra,
187
+ [static::call('groupEnd')]
188
+ );
189
+ }
190
+ }
191
+
192
+ return "(function (c) {if (c && c.groupCollapsed) {\n" . implode("\n", $script) . "\n}})(console);";
193
+ }
194
+
195
+ /**
196
+ * @return string[]
197
+ */
198
+ private static function handleStyles(string $formatted): array
199
+ {
200
+ $args = [];
201
+ $format = '%c' . $formatted;
202
+ preg_match_all('/\[\[(.*?)\]\]\{([^}]*)\}/s', $format, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
203
+
204
+ foreach (array_reverse($matches) as $match) {
205
+ $args[] = '"font-weight: normal"';
206
+ $args[] = static::quote(static::handleCustomStyles($match[2][0], $match[1][0]));
207
+
208
+ $pos = $match[0][1];
209
+ $format = Utils::substr($format, 0, $pos) . '%c' . $match[1][0] . '%c' . Utils::substr($format, $pos + strlen($match[0][0]));
210
+ }
211
+
212
+ $args[] = static::quote('font-weight: normal');
213
+ $args[] = static::quote($format);
214
+
215
+ return array_reverse($args);
216
+ }
217
+
218
+ private static function handleCustomStyles(string $style, string $string): string
219
+ {
220
+ static $colors = ['blue', 'green', 'red', 'magenta', 'orange', 'black', 'grey'];
221
+ static $labels = [];
222
+
223
+ $style = preg_replace_callback('/macro\s*:(.*?)(?:;|$)/', function (array $m) use ($string, &$colors, &$labels) {
224
+ if (trim($m[1]) === 'autolabel') {
225
+ // Format the string as a label with consistent auto assigned background color
226
+ if (!isset($labels[$string])) {
227
+ $labels[$string] = $colors[count($labels) % count($colors)];
228
+ }
229
+ $color = $labels[$string];
230
+
231
+ return "background-color: $color; color: white; border-radius: 3px; padding: 0 2px 0 2px";
232
+ }
233
+
234
+ return $m[1];
235
+ }, $style);
236
+
237
+ if (null === $style) {
238
+ $pcreErrorCode = preg_last_error();
239
+ throw new \RuntimeException('Failed to run preg_replace_callback: ' . $pcreErrorCode . ' / ' . Utils::pcreLastErrorMessage($pcreErrorCode));
240
+ }
241
+
242
+ return $style;
243
+ }
244
+
245
+ /**
246
+ * @param mixed[] $dict
247
+ * @return mixed[]
248
+ */
249
+ private static function dump(string $title, array $dict): array
250
+ {
251
+ $script = [];
252
+ $dict = array_filter($dict);
253
+ if (empty($dict)) {
254
+ return $script;
255
+ }
256
+ $script[] = static::call('log', static::quote('%c%s'), static::quote('font-weight: bold'), static::quote($title));
257
+ foreach ($dict as $key => $value) {
258
+ $value = json_encode($value);
259
+ if (empty($value)) {
260
+ $value = static::quote('');
261
+ }
262
+ $script[] = static::call('log', static::quote('%s: %o'), static::quote((string) $key), $value);
263
+ }
264
+
265
+ return $script;
266
+ }
267
+
268
+ private static function quote(string $arg): string
269
+ {
270
+ return '"' . addcslashes($arg, "\"\n\\") . '"';
271
+ }
272
+
273
+ /**
274
+ * @param mixed $args
275
+ */
276
+ private static function call(...$args): string
277
+ {
278
+ $method = array_shift($args);
279
+ if (!is_string($method)) {
280
+ throw new \UnexpectedValueException('Expected the first arg to be a string, got: '.var_export($method, true));
281
+ }
282
+
283
+ return static::call_array($method, $args);
284
+ }
285
+
286
+ /**
287
+ * @param mixed[] $args
288
+ */
289
+ private static function call_array(string $method, array $args): string
290
+ {
291
+ return 'c.' . $method . '(' . implode(', ', $args) . ');';
292
+ }
293
+ }
vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php ADDED
@@ -0,0 +1,167 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Logger;
15
+ use Monolog\ResettableInterface;
16
+ use Monolog\Formatter\FormatterInterface;
17
+
18
+ /**
19
+ * Buffers all records until closing the handler and then pass them as batch.
20
+ *
21
+ * This is useful for a MailHandler to send only one mail per request instead of
22
+ * sending one per log message.
23
+ *
24
+ * @author Christophe Coevoet <stof@notk.org>
25
+ *
26
+ * @phpstan-import-type Record from \Monolog\Logger
27
+ */
28
+ class BufferHandler extends AbstractHandler implements ProcessableHandlerInterface, FormattableHandlerInterface
29
+ {
30
+ use ProcessableHandlerTrait;
31
+
32
+ /** @var HandlerInterface */
33
+ protected $handler;
34
+ /** @var int */
35
+ protected $bufferSize = 0;
36
+ /** @var int */
37
+ protected $bufferLimit;
38
+ /** @var bool */
39
+ protected $flushOnOverflow;
40
+ /** @var Record[] */
41
+ protected $buffer = [];
42
+ /** @var bool */
43
+ protected $initialized = false;
44
+
45
+ /**
46
+ * @param HandlerInterface $handler Handler.
47
+ * @param int $bufferLimit How many entries should be buffered at most, beyond that the oldest items are removed from the buffer.
48
+ * @param bool $flushOnOverflow If true, the buffer is flushed when the max size has been reached, by default oldest entries are discarded
49
+ */
50
+ public function __construct(HandlerInterface $handler, int $bufferLimit = 0, $level = Logger::DEBUG, bool $bubble = true, bool $flushOnOverflow = false)
51
+ {
52
+ parent::__construct($level, $bubble);
53
+ $this->handler = $handler;
54
+ $this->bufferLimit = $bufferLimit;
55
+ $this->flushOnOverflow = $flushOnOverflow;
56
+ }
57
+
58
+ /**
59
+ * {@inheritDoc}
60
+ */
61
+ public function handle(array $record): bool
62
+ {
63
+ if ($record['level'] < $this->level) {
64
+ return false;
65
+ }
66
+
67
+ if (!$this->initialized) {
68
+ // __destructor() doesn't get called on Fatal errors
69
+ register_shutdown_function([$this, 'close']);
70
+ $this->initialized = true;
71
+ }
72
+
73
+ if ($this->bufferLimit > 0 && $this->bufferSize === $this->bufferLimit) {
74
+ if ($this->flushOnOverflow) {
75
+ $this->flush();
76
+ } else {
77
+ array_shift($this->buffer);
78
+ $this->bufferSize--;
79
+ }
80
+ }
81
+
82
+ if ($this->processors) {
83
+ /** @var Record $record */
84
+ $record = $this->processRecord($record);
85
+ }
86
+
87
+ $this->buffer[] = $record;
88
+ $this->bufferSize++;
89
+
90
+ return false === $this->bubble;
91
+ }
92
+
93
+ public function flush(): void
94
+ {
95
+ if ($this->bufferSize === 0) {
96
+ return;
97
+ }
98
+
99
+ $this->handler->handleBatch($this->buffer);
100
+ $this->clear();
101
+ }
102
+
103
+ public function __destruct()
104
+ {
105
+ // suppress the parent behavior since we already have register_shutdown_function()
106
+ // to call close(), and the reference contained there will prevent this from being
107
+ // GC'd until the end of the request
108
+ }
109
+
110
+ /**
111
+ * {@inheritDoc}
112
+ */
113
+ public function close(): void
114
+ {
115
+ $this->flush();
116
+
117
+ $this->handler->close();
118
+ }
119
+
120
+ /**
121
+ * Clears the buffer without flushing any messages down to the wrapped handler.
122
+ */
123
+ public function clear(): void
124
+ {
125
+ $this->bufferSize = 0;
126
+ $this->buffer = [];
127
+ }
128
+
129
+ public function reset()
130
+ {
131
+ $this->flush();
132
+
133
+ parent::reset();
134
+
135
+ $this->resetProcessors();
136
+
137
+ if ($this->handler instanceof ResettableInterface) {
138
+ $this->handler->reset();
139
+ }
140
+ }
141
+
142
+ /**
143
+ * {@inheritDoc}
144
+ */
145
+ public function setFormatter(FormatterInterface $formatter): HandlerInterface
146
+ {
147
+ if ($this->handler instanceof FormattableHandlerInterface) {
148
+ $this->handler->setFormatter($formatter);
149
+
150
+ return $this;
151
+ }
152
+
153
+ throw new \UnexpectedValueException('The nested handler of type '.get_class($this->handler).' does not support formatters.');
154
+ }
155
+
156
+ /**
157
+ * {@inheritDoc}
158
+ */
159
+ public function getFormatter(): FormatterInterface
160
+ {
161
+ if ($this->handler instanceof FormattableHandlerInterface) {
162
+ return $this->handler->getFormatter();
163
+ }
164
+
165
+ throw new \UnexpectedValueException('The nested handler of type '.get_class($this->handler).' does not support formatters.');
166
+ }
167
+ }
vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php ADDED
@@ -0,0 +1,196 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Formatter\ChromePHPFormatter;
15
+ use Monolog\Formatter\FormatterInterface;
16
+ use Monolog\Logger;
17
+ use Monolog\Utils;
18
+
19
+ /**
20
+ * Handler sending logs to the ChromePHP extension (http://www.chromephp.com/)
21
+ *
22
+ * This also works out of the box with Firefox 43+
23
+ *
24
+ * @author Christophe Coevoet <stof@notk.org>
25
+ *
26
+ * @phpstan-import-type Record from \Monolog\Logger
27
+ */
28
+ class ChromePHPHandler extends AbstractProcessingHandler
29
+ {
30
+ use WebRequestRecognizerTrait;
31
+
32
+ /**
33
+ * Version of the extension
34
+ */
35
+ protected const VERSION = '4.0';
36
+
37
+ /**
38
+ * Header name
39
+ */
40
+ protected const HEADER_NAME = 'X-ChromeLogger-Data';
41
+
42
+ /**
43
+ * Regular expression to detect supported browsers (matches any Chrome, or Firefox 43+)
44
+ */
45
+ protected const USER_AGENT_REGEX = '{\b(?:Chrome/\d+(?:\.\d+)*|HeadlessChrome|Firefox/(?:4[3-9]|[5-9]\d|\d{3,})(?:\.\d)*)\b}';
46
+
47
+ /** @var bool */
48
+ protected static $initialized = false;
49
+
50
+ /**
51
+ * Tracks whether we sent too much data
52
+ *
53
+ * Chrome limits the headers to 4KB, so when we sent 3KB we stop sending
54
+ *
55
+ * @var bool
56
+ */
57
+ protected static $overflowed = false;
58
+
59
+ /** @var mixed[] */
60
+ protected static $json = [
61
+ 'version' => self::VERSION,
62
+ 'columns' => ['label', 'log', 'backtrace', 'type'],
63
+ 'rows' => [],
64
+ ];
65
+
66
+ /** @var bool */
67
+ protected static $sendHeaders = true;
68
+
69
+ public function __construct($level = Logger::DEBUG, bool $bubble = true)
70
+ {
71
+ parent::__construct($level, $bubble);
72
+ if (!function_exists('json_encode')) {
73
+ throw new \RuntimeException('PHP\'s json extension is required to use Monolog\'s ChromePHPHandler');
74
+ }
75
+ }
76
+
77
+ /**
78
+ * {@inheritDoc}
79
+ */
80
+ public function handleBatch(array $records): void
81
+ {
82
+ if (!$this->isWebRequest()) {
83
+ return;
84
+ }
85
+
86
+ $messages = [];
87
+
88
+ foreach ($records as $record) {
89
+ if ($record['level'] < $this->level) {
90
+ continue;
91
+ }
92
+ /** @var Record $message */
93
+ $message = $this->processRecord($record);
94
+ $messages[] = $message;
95
+ }
96
+
97
+ if (!empty($messages)) {
98
+ $messages = $this->getFormatter()->formatBatch($messages);
99
+ self::$json['rows'] = array_merge(self::$json['rows'], $messages);
100
+ $this->send();
101
+ }
102
+ }
103
+
104
+ /**
105
+ * {@inheritDoc}
106
+ */
107
+ protected function getDefaultFormatter(): FormatterInterface
108
+ {
109
+ return new ChromePHPFormatter();
110
+ }
111
+
112
+ /**
113
+ * Creates & sends header for a record
114
+ *
115
+ * @see sendHeader()
116
+ * @see send()
117
+ */
118
+ protected function write(array $record): void
119
+ {
120
+ if (!$this->isWebRequest()) {
121
+ return;
122
+ }
123
+
124
+ self::$json['rows'][] = $record['formatted'];
125
+
126
+ $this->send();
127
+ }
128
+
129
+ /**
130
+ * Sends the log header
131
+ *
132
+ * @see sendHeader()
133
+ */
134
+ protected function send(): void
135
+ {
136
+ if (self::$overflowed || !self::$sendHeaders) {
137
+ return;
138
+ }
139
+
140
+ if (!self::$initialized) {
141
+ self::$initialized = true;
142
+
143
+ self::$sendHeaders = $this->headersAccepted();
144
+ if (!self::$sendHeaders) {
145
+ return;
146
+ }
147
+
148
+ self::$json['request_uri'] = $_SERVER['REQUEST_URI'] ?? '';
149
+ }
150
+
151
+ $json = Utils::jsonEncode(self::$json, Utils::DEFAULT_JSON_FLAGS & ~JSON_UNESCAPED_UNICODE, true);
152
+ $data = base64_encode($json);
153
+ if (strlen($data) > 3 * 1024) {
154
+ self::$overflowed = true;
155
+
156
+ $record = [
157
+ 'message' => 'Incomplete logs, chrome header size limit reached',
158
+ 'context' => [],
159
+ 'level' => Logger::WARNING,
160
+ 'level_name' => Logger::getLevelName(Logger::WARNING),
161
+ 'channel' => 'monolog',
162
+ 'datetime' => new \DateTimeImmutable(),
163
+ 'extra' => [],
164
+ ];
165
+ self::$json['rows'][count(self::$json['rows']) - 1] = $this->getFormatter()->format($record);
166
+ $json = Utils::jsonEncode(self::$json, Utils::DEFAULT_JSON_FLAGS & ~JSON_UNESCAPED_UNICODE, true);
167
+ $data = base64_encode($json);
168
+ }
169
+
170
+ if (trim($data) !== '') {
171
+ $this->sendHeader(static::HEADER_NAME, $data);
172
+ }
173
+ }
174
+
175
+ /**
176
+ * Send header string to the client
177
+ */
178
+ protected function sendHeader(string $header, string $content): void
179
+ {
180
+ if (!headers_sent() && self::$sendHeaders) {
181
+ header(sprintf('%s: %s', $header, $content));
182
+ }
183
+ }
184
+
185
+ /**
186
+ * Verifies if the headers are accepted by the current user agent
187
+ */
188
+ protected function headersAccepted(): bool
189
+ {
190
+ if (empty($_SERVER['HTTP_USER_AGENT'])) {
191
+ return false;
192
+ }
193
+
194
+ return preg_match(static::USER_AGENT_REGEX, $_SERVER['HTTP_USER_AGENT']) === 1;
195
+ }
196
+ }
vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Formatter\FormatterInterface;
15
+ use Monolog\Formatter\JsonFormatter;
16
+ use Monolog\Logger;
17
+
18
+ /**
19
+ * CouchDB handler
20
+ *
21
+ * @author Markus Bachmann <markus.bachmann@bachi.biz>
22
+ */
23
+ class CouchDBHandler extends AbstractProcessingHandler
24
+ {
25
+ /** @var mixed[] */
26
+ private $options;
27
+
28
+ /**
29
+ * @param mixed[] $options
30
+ */
31
+ public function __construct(array $options = [], $level = Logger::DEBUG, bool $bubble = true)
32
+ {
33
+ $this->options = array_merge([
34
+ 'host' => 'localhost',
35
+ 'port' => 5984,
36
+ 'dbname' => 'logger',
37
+ 'username' => null,
38
+ 'password' => null,
39
+ ], $options);
40
+
41
+ parent::__construct($level, $bubble);
42
+ }
43
+
44
+ /**
45
+ * {@inheritDoc}
46
+ */
47
+ protected function write(array $record): void
48
+ {
49
+ $basicAuth = null;
50
+ if ($this->options['username']) {
51
+ $basicAuth = sprintf('%s:%s@', $this->options['username'], $this->options['password']);
52
+ }
53
+
54
+ $url = 'http://'.$basicAuth.$this->options['host'].':'.$this->options['port'].'/'.$this->options['dbname'];
55
+ $context = stream_context_create([
56
+ 'http' => [
57
+ 'method' => 'POST',
58
+ 'content' => $record['formatted'],
59
+ 'ignore_errors' => true,
60
+ 'max_redirects' => 0,
61
+ 'header' => 'Content-type: application/json',
62
+ ],
63
+ ]);
64
+
65
+ if (false === @file_get_contents($url, false, $context)) {
66
+ throw new \RuntimeException(sprintf('Could not connect to %s', $url));
67
+ }
68
+ }
69
+
70
+ /**
71
+ * {@inheritDoc}
72
+ */
73
+ protected function getDefaultFormatter(): FormatterInterface
74
+ {
75
+ return new JsonFormatter(JsonFormatter::BATCH_MODE_JSON, false);
76
+ }
77
+ }
vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php ADDED
@@ -0,0 +1,167 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Logger;
15
+ use Monolog\Utils;
16
+
17
+ /**
18
+ * Logs to Cube.
19
+ *
20
+ * @link https://github.com/square/cube/wiki
21
+ * @author Wan Chen <kami@kamisama.me>
22
+ * @deprecated Since 2.8.0 and 3.2.0, Cube appears abandoned and thus we will drop this handler in Monolog 4
23
+ */
24
+ class CubeHandler extends AbstractProcessingHandler
25
+ {
26
+ /** @var resource|\Socket|null */
27
+ private $udpConnection = null;
28
+ /** @var resource|\CurlHandle|null */
29
+ private $httpConnection = null;
30
+ /** @var string */
31
+ private $scheme;
32
+ /** @var string */
33
+ private $host;
34
+ /** @var int */
35
+ private $port;
36
+ /** @var string[] */
37
+ private $acceptedSchemes = ['http', 'udp'];
38
+
39
+ /**
40
+ * Create a Cube handler
41
+ *
42
+ * @throws \UnexpectedValueException when given url is not a valid url.
43
+ * A valid url must consist of three parts : protocol://host:port
44
+ * Only valid protocols used by Cube are http and udp
45
+ */
46
+ public function __construct(string $url, $level = Logger::DEBUG, bool $bubble = true)
47
+ {
48
+ $urlInfo = parse_url($url);
49
+
50
+ if ($urlInfo === false || !isset($urlInfo['scheme'], $urlInfo['host'], $urlInfo['port'])) {
51
+ throw new \UnexpectedValueException('URL "'.$url.'" is not valid');
52
+ }
53
+
54
+ if (!in_array($urlInfo['scheme'], $this->acceptedSchemes)) {
55
+ throw new \UnexpectedValueException(
56
+ 'Invalid protocol (' . $urlInfo['scheme'] . ').'
57
+ . ' Valid options are ' . implode(', ', $this->acceptedSchemes)
58
+ );
59
+ }
60
+
61
+ $this->scheme = $urlInfo['scheme'];
62
+ $this->host = $urlInfo['host'];
63
+ $this->port = (int) $urlInfo['port'];
64
+
65
+ parent::__construct($level, $bubble);
66
+ }
67
+
68
+ /**
69
+ * Establish a connection to an UDP socket
70
+ *
71
+ * @throws \LogicException when unable to connect to the socket
72
+ * @throws MissingExtensionException when there is no socket extension
73
+ */
74
+ protected function connectUdp(): void
75
+ {
76
+ if (!extension_loaded('sockets')) {
77
+ throw new MissingExtensionException('The sockets extension is required to use udp URLs with the CubeHandler');
78
+ }
79
+
80
+ $udpConnection = socket_create(AF_INET, SOCK_DGRAM, 0);
81
+ if (false === $udpConnection) {
82
+ throw new \LogicException('Unable to create a socket');
83
+ }
84
+
85
+ $this->udpConnection = $udpConnection;
86
+ if (!socket_connect($this->udpConnection, $this->host, $this->port)) {
87
+ throw new \LogicException('Unable to connect to the socket at ' . $this->host . ':' . $this->port);
88
+ }
89
+ }
90
+
91
+ /**
92
+ * Establish a connection to an http server
93
+ *
94
+ * @throws \LogicException when unable to connect to the socket
95
+ * @throws MissingExtensionException when no curl extension
96
+ */
97
+ protected function connectHttp(): void
98
+ {
99
+ if (!extension_loaded('curl')) {
100
+ throw new MissingExtensionException('The curl extension is required to use http URLs with the CubeHandler');
101
+ }
102
+
103
+ $httpConnection = curl_init('http://'.$this->host.':'.$this->port.'/1.0/event/put');
104
+ if (false === $httpConnection) {
105
+ throw new \LogicException('Unable to connect to ' . $this->host . ':' . $this->port);
106
+ }
107
+
108
+ $this->httpConnection = $httpConnection;
109
+ curl_setopt($this->httpConnection, CURLOPT_CUSTOMREQUEST, "POST");
110
+ curl_setopt($this->httpConnection, CURLOPT_RETURNTRANSFER, true);
111
+ }
112
+
113
+ /**
114
+ * {@inheritDoc}
115
+ */
116
+ protected function write(array $record): void
117
+ {
118
+ $date = $record['datetime'];
119
+
120
+ $data = ['time' => $date->format('Y-m-d\TH:i:s.uO')];
121
+ unset($record['datetime']);
122
+
123
+ if (isset($record['context']['type'])) {
124
+ $data['type'] = $record['context']['type'];
125
+ unset($record['context']['type']);
126
+ } else {
127
+ $data['type'] = $record['channel'];
128
+ }
129
+
130
+ $data['data'] = $record['context'];
131
+ $data['data']['level'] = $record['level'];
132
+
133
+ if ($this->scheme === 'http') {
134
+ $this->writeHttp(Utils::jsonEncode($data));
135
+ } else {
136
+ $this->writeUdp(Utils::jsonEncode($data));
137
+ }
138
+ }
139
+
140
+ private function writeUdp(string $data): void
141
+ {
142
+ if (!$this->udpConnection) {
143
+ $this->connectUdp();
144
+ }
145
+
146
+ socket_send($this->udpConnection, $data, strlen($data), 0);
147
+ }
148
+
149
+ private function writeHttp(string $data): void
150
+ {
151
+ if (!$this->httpConnection) {
152
+ $this->connectHttp();
153
+ }
154
+
155
+ if (null === $this->httpConnection) {
156
+ throw new \LogicException('No connection could be established');
157
+ }
158
+
159
+ curl_setopt($this->httpConnection, CURLOPT_POSTFIELDS, '['.$data.']');
160
+ curl_setopt($this->httpConnection, CURLOPT_HTTPHEADER, [
161
+ 'Content-Type: application/json',
162
+ 'Content-Length: ' . strlen('['.$data.']'),
163
+ ]);
164
+
165
+ Curl\Util::execute($this->httpConnection, 5, false);
166
+ }
167
+ }
vendor/monolog/monolog/src/Monolog/Handler/Curl/Util.php ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler\Curl;
13
+
14
+ use CurlHandle;
15
+
16
+ /**
17
+ * This class is marked as internal and it is not under the BC promise of the package.
18
+ *
19
+ * @internal
20
+ */
21
+ final class Util
22
+ {
23
+ /** @var array<int> */
24
+ private static $retriableErrorCodes = [
25
+ CURLE_COULDNT_RESOLVE_HOST,
26
+ CURLE_COULDNT_CONNECT,
27
+ CURLE_HTTP_NOT_FOUND,
28
+ CURLE_READ_ERROR,
29
+ CURLE_OPERATION_TIMEOUTED,
30
+ CURLE_HTTP_POST_ERROR,
31
+ CURLE_SSL_CONNECT_ERROR,
32
+ ];
33
+
34
+ /**
35
+ * Executes a CURL request with optional retries and exception on failure
36
+ *
37
+ * @param resource|CurlHandle $ch curl handler
38
+ * @param int $retries
39
+ * @param bool $closeAfterDone
40
+ * @return bool|string @see curl_exec
41
+ */
42
+ public static function execute($ch, int $retries = 5, bool $closeAfterDone = true)
43
+ {
44
+ while ($retries--) {
45
+ $curlResponse = curl_exec($ch);
46
+ if ($curlResponse === false) {
47
+ $curlErrno = curl_errno($ch);
48
+
49
+ if (false === in_array($curlErrno, self::$retriableErrorCodes, true) || !$retries) {
50
+ $curlError = curl_error($ch);
51
+
52
+ if ($closeAfterDone) {
53
+ curl_close($ch);
54
+ }
55
+
56
+ throw new \RuntimeException(sprintf('Curl error (code %d): %s', $curlErrno, $curlError));
57
+ }
58
+
59
+ continue;
60
+ }
61
+
62
+ if ($closeAfterDone) {
63
+ curl_close($ch);
64
+ }
65
+
66
+ return $curlResponse;
67
+ }
68
+
69
+ return false;
70
+ }
71
+ }
vendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php ADDED
@@ -0,0 +1,186 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Logger;
15
+ use Psr\Log\LogLevel;
16
+
17
+ /**
18
+ * Simple handler wrapper that deduplicates log records across multiple requests
19
+ *
20
+ * It also includes the BufferHandler functionality and will buffer
21
+ * all messages until the end of the request or flush() is called.
22
+ *
23
+ * This works by storing all log records' messages above $deduplicationLevel
24
+ * to the file specified by $deduplicationStore. When further logs come in at the end of the
25
+ * request (or when flush() is called), all those above $deduplicationLevel are checked
26
+ * against the existing stored logs. If they match and the timestamps in the stored log is
27
+ * not older than $time seconds, the new log record is discarded. If no log record is new, the
28
+ * whole data set is discarded.
29
+ *
30
+ * This is mainly useful in combination with Mail handlers or things like Slack or HipChat handlers
31
+ * that send messages to people, to avoid spamming with the same message over and over in case of
32
+ * a major component failure like a database server being down which makes all requests fail in the
33
+ * same way.
34
+ *
35
+ * @author Jordi Boggiano <j.boggiano@seld.be>
36
+ *
37
+ * @phpstan-import-type Record from \Monolog\Logger
38
+ * @phpstan-import-type LevelName from \Monolog\Logger
39
+ * @phpstan-import-type Level from \Monolog\Logger
40
+ */
41
+ class DeduplicationHandler extends BufferHandler
42
+ {
43
+ /**
44
+ * @var string
45
+ */
46
+ protected $deduplicationStore;
47
+
48
+ /**
49
+ * @var Level
50
+ */
51
+ protected $deduplicationLevel;
52
+
53
+ /**
54
+ * @var int
55
+ */
56
+ protected $time;
57
+
58
+ /**
59
+ * @var bool
60
+ */
61
+ private $gc = false;
62
+
63
+ /**
64
+ * @param HandlerInterface $handler Handler.
65
+ * @param string $deduplicationStore The file/path where the deduplication log should be kept
66
+ * @param string|int $deduplicationLevel The minimum logging level for log records to be looked at for deduplication purposes
67
+ * @param int $time The period (in seconds) during which duplicate entries should be suppressed after a given log is sent through
68
+ * @param bool $bubble Whether the messages that are handled can bubble up the stack or not
69
+ *
70
+ * @phpstan-param Level|LevelName|LogLevel::* $deduplicationLevel
71
+ */
72
+ public function __construct(HandlerInterface $handler, ?string $deduplicationStore = null, $deduplicationLevel = Logger::ERROR, int $time = 60, bool $bubble = true)
73
+ {
74
+ parent::__construct($handler, 0, Logger::DEBUG, $bubble, false);
75
+
76
+ $this->deduplicationStore = $deduplicationStore === null ? sys_get_temp_dir() . '/monolog-dedup-' . substr(md5(__FILE__), 0, 20) .'.log' : $deduplicationStore;
77
+ $this->deduplicationLevel = Logger::toMonologLevel($deduplicationLevel);
78
+ $this->time = $time;
79
+ }
80
+
81
+ public function flush(): void
82
+ {
83
+ if ($this->bufferSize === 0) {
84
+ return;
85
+ }
86
+
87
+ $passthru = null;
88
+
89
+ foreach ($this->buffer as $record) {
90
+ if ($record['level'] >= $this->deduplicationLevel) {
91
+ $passthru = $passthru || !$this->isDuplicate($record);
92
+ if ($passthru) {
93
+ $this->appendRecord($record);
94
+ }
95
+ }
96
+ }
97
+
98
+ // default of null is valid as well as if no record matches duplicationLevel we just pass through
99
+ if ($passthru === true || $passthru === null) {
100
+ $this->handler->handleBatch($this->buffer);
101
+ }
102
+
103
+ $this->clear();
104
+
105
+ if ($this->gc) {
106
+ $this->collectLogs();
107
+ }
108
+ }
109
+
110
+ /**
111
+ * @phpstan-param Record $record
112
+ */
113
+ private function isDuplicate(array $record): bool
114
+ {
115
+ if (!file_exists($this->deduplicationStore)) {
116
+ return false;
117
+ }
118
+
119
+ $store = file($this->deduplicationStore, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
120
+ if (!is_array($store)) {
121
+ return false;
122
+ }
123
+
124
+ $yesterday = time() - 86400;
125
+ $timestampValidity = $record['datetime']->getTimestamp() - $this->time;
126
+ $expectedMessage = preg_replace('{[\r\n].*}', '', $record['message']);
127
+
128
+ for ($i = count($store) - 1; $i >= 0; $i--) {
129
+ list($timestamp, $level, $message) = explode(':', $store[$i], 3);
130
+
131
+ if ($level === $record['level_name'] && $message === $expectedMessage && $timestamp > $timestampValidity) {
132
+ return true;
133
+ }
134
+
135
+ if ($timestamp < $yesterday) {
136
+ $this->gc = true;
137
+ }
138
+ }
139
+
140
+ return false;
141
+ }
142
+
143
+ private function collectLogs(): void
144
+ {
145
+ if (!file_exists($this->deduplicationStore)) {
146
+ return;
147
+ }
148
+
149
+ $handle = fopen($this->deduplicationStore, 'rw+');
150
+
151
+ if (!$handle) {
152
+ throw new \RuntimeException('Failed to open file for reading and writing: ' . $this->deduplicationStore);
153
+ }
154
+
155
+ flock($handle, LOCK_EX);
156
+ $validLogs = [];
157
+
158
+ $timestampValidity = time() - $this->time;
159
+
160
+ while (!feof($handle)) {
161
+ $log = fgets($handle);
162
+ if ($log && substr($log, 0, 10) >= $timestampValidity) {
163
+ $validLogs[] = $log;
164
+ }
165
+ }
166
+
167
+ ftruncate($handle, 0);
168
+ rewind($handle);
169
+ foreach ($validLogs as $log) {
170
+ fwrite($handle, $log);
171
+ }
172
+
173
+ flock($handle, LOCK_UN);
174
+ fclose($handle);
175
+
176
+ $this->gc = false;
177
+ }
178
+
179
+ /**
180
+ * @phpstan-param Record $record
181
+ */
182
+ private function appendRecord(array $record): void
183
+ {
184
+ file_put_contents($this->deduplicationStore, $record['datetime']->getTimestamp() . ':' . $record['level_name'] . ':' . preg_replace('{[\r\n].*}', '', $record['message']) . "\n", FILE_APPEND);
185
+ }
186
+ }
vendor/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Logger;
15
+ use Monolog\Formatter\NormalizerFormatter;
16
+ use Monolog\Formatter\FormatterInterface;
17
+ use Doctrine\CouchDB\CouchDBClient;
18
+
19
+ /**
20
+ * CouchDB handler for Doctrine CouchDB ODM
21
+ *
22
+ * @author Markus Bachmann <markus.bachmann@bachi.biz>
23
+ */
24
+ class DoctrineCouchDBHandler extends AbstractProcessingHandler
25
+ {
26
+ /** @var CouchDBClient */
27
+ private $client;
28
+
29
+ public function __construct(CouchDBClient $client, $level = Logger::DEBUG, bool $bubble = true)
30
+ {
31
+ $this->client = $client;
32
+ parent::__construct($level, $bubble);
33
+ }
34
+
35
+ /**
36
+ * {@inheritDoc}
37
+ */
38
+ protected function write(array $record): void
39
+ {
40
+ $this->client->postDocument($record['formatted']);
41
+ }
42
+
43
+ protected function getDefaultFormatter(): FormatterInterface
44
+ {
45
+ return new NormalizerFormatter;
46
+ }
47
+ }
vendor/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php ADDED
@@ -0,0 +1,104 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Aws\Sdk;
15
+ use Aws\DynamoDb\DynamoDbClient;
16
+ use Monolog\Formatter\FormatterInterface;
17
+ use Aws\DynamoDb\Marshaler;
18
+ use Monolog\Formatter\ScalarFormatter;
19
+ use Monolog\Logger;
20
+
21
+ /**
22
+ * Amazon DynamoDB handler (http://aws.amazon.com/dynamodb/)
23
+ *
24
+ * @link https://github.com/aws/aws-sdk-php/
25
+ * @author Andrew Lawson <adlawson@gmail.com>
26
+ */
27
+ class DynamoDbHandler extends AbstractProcessingHandler
28
+ {
29
+ public const DATE_FORMAT = 'Y-m-d\TH:i:s.uO';
30
+
31
+ /**
32
+ * @var DynamoDbClient
33
+ */
34
+ protected $client;
35
+
36
+ /**
37
+ * @var string
38
+ */
39
+ protected $table;
40
+
41
+ /**
42
+ * @var int
43
+ */
44
+ protected $version;
45
+
46
+ /**
47
+ * @var Marshaler
48
+ */
49
+ protected $marshaler;
50
+
51
+ public function __construct(DynamoDbClient $client, string $table, $level = Logger::DEBUG, bool $bubble = true)
52
+ {
53
+ /** @phpstan-ignore-next-line */
54
+ if (defined('Aws\Sdk::VERSION') && version_compare(Sdk::VERSION, '3.0', '>=')) {
55
+ $this->version = 3;
56
+ $this->marshaler = new Marshaler;
57
+ } else {
58
+ $this->version = 2;
59
+ }
60
+
61
+ $this->client = $client;
62
+ $this->table = $table;
63
+
64
+ parent::__construct($level, $bubble);
65
+ }
66
+
67
+ /**
68
+ * {@inheritDoc}
69
+ */
70
+ protected function write(array $record): void
71
+ {
72
+ $filtered = $this->filterEmptyFields($record['formatted']);
73
+ if ($this->version === 3) {
74
+ $formatted = $this->marshaler->marshalItem($filtered);
75
+ } else {
76
+ /** @phpstan-ignore-next-line */
77
+ $formatted = $this->client->formatAttributes($filtered);
78
+ }
79
+
80
+ $this->client->putItem([
81
+ 'TableName' => $this->table,
82
+ 'Item' => $formatted,
83
+ ]);
84
+ }
85
+
86
+ /**
87
+ * @param mixed[] $record
88
+ * @return mixed[]
89
+ */
90
+ protected function filterEmptyFields(array $record): array
91
+ {
92
+ return array_filter($record, function ($value) {
93
+ return !empty($value) || false === $value || 0 === $value;
94
+ });
95
+ }
96
+
97
+ /**
98
+ * {@inheritDoc}
99
+ */
100
+ protected function getDefaultFormatter(): FormatterInterface
101
+ {
102
+ return new ScalarFormatter(self::DATE_FORMAT);
103
+ }
104
+ }
vendor/monolog/monolog/src/Monolog/Handler/ElasticaHandler.php ADDED
@@ -0,0 +1,129 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Elastica\Document;
15
+ use Monolog\Formatter\FormatterInterface;
16
+ use Monolog\Formatter\ElasticaFormatter;
17
+ use Monolog\Logger;
18
+ use Elastica\Client;
19
+ use Elastica\Exception\ExceptionInterface;
20
+
21
+ /**
22
+ * Elastic Search handler
23
+ *
24
+ * Usage example:
25
+ *
26
+ * $client = new \Elastica\Client();
27
+ * $options = array(
28
+ * 'index' => 'elastic_index_name',
29
+ * 'type' => 'elastic_doc_type', Types have been removed in Elastica 7
30
+ * );
31
+ * $handler = new ElasticaHandler($client, $options);
32
+ * $log = new Logger('application');
33
+ * $log->pushHandler($handler);
34
+ *
35
+ * @author Jelle Vink <jelle.vink@gmail.com>
36
+ */
37
+ class ElasticaHandler extends AbstractProcessingHandler
38
+ {
39
+ /**
40
+ * @var Client
41
+ */
42
+ protected $client;
43
+
44
+ /**
45
+ * @var mixed[] Handler config options
46
+ */
47
+ protected $options = [];
48
+
49
+ /**
50
+ * @param Client $client Elastica Client object
51
+ * @param mixed[] $options Handler configuration
52
+ */
53
+ public function __construct(Client $client, array $options = [], $level = Logger::DEBUG, bool $bubble = true)
54
+ {
55
+ parent::__construct($level, $bubble);
56
+ $this->client = $client;
57
+ $this->options = array_merge(
58
+ [
59
+ 'index' => 'monolog', // Elastic index name
60
+ 'type' => 'record', // Elastic document type
61
+ 'ignore_error' => false, // Suppress Elastica exceptions
62
+ ],
63
+ $options
64
+ );
65
+ }
66
+
67
+ /**
68
+ * {@inheritDoc}
69
+ */
70
+ protected function write(array $record): void
71
+ {
72
+ $this->bulkSend([$record['formatted']]);
73
+ }
74
+
75
+ /**
76
+ * {@inheritDoc}
77
+ */
78
+ public function setFormatter(FormatterInterface $formatter): HandlerInterface
79
+ {
80
+ if ($formatter instanceof ElasticaFormatter) {
81
+ return parent::setFormatter($formatter);
82
+ }
83
+
84
+ throw new \InvalidArgumentException('ElasticaHandler is only compatible with ElasticaFormatter');
85
+ }
86
+
87
+ /**
88
+ * @return mixed[]
89
+ */
90
+ public function getOptions(): array
91
+ {
92
+ return $this->options;
93
+ }
94
+
95
+ /**
96
+ * {@inheritDoc}
97
+ */
98
+ protected function getDefaultFormatter(): FormatterInterface
99
+ {
100
+ return new ElasticaFormatter($this->options['index'], $this->options['type']);
101
+ }
102
+
103
+ /**
104
+ * {@inheritDoc}
105
+ */
106
+ public function handleBatch(array $records): void
107
+ {
108
+ $documents = $this->getFormatter()->formatBatch($records);
109
+ $this->bulkSend($documents);
110
+ }
111
+
112
+ /**
113
+ * Use Elasticsearch bulk API to send list of documents
114
+ *
115
+ * @param Document[] $documents
116
+ *
117
+ * @throws \RuntimeException
118
+ */
119
+ protected function bulkSend(array $documents): void
120
+ {
121
+ try {
122
+ $this->client->addDocuments($documents);
123
+ } catch (ExceptionInterface $e) {
124
+ if (!$this->options['ignore_error']) {
125
+ throw new \RuntimeException("Error sending messages to Elasticsearch", 0, $e);
126
+ }
127
+ }
128
+ }
129
+ }
vendor/monolog/monolog/src/Monolog/Handler/ElasticsearchHandler.php ADDED
@@ -0,0 +1,218 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Elastic\Elasticsearch\Response\Elasticsearch;
15
+ use Throwable;
16
+ use RuntimeException;
17
+ use Monolog\Logger;
18
+ use Monolog\Formatter\FormatterInterface;
19
+ use Monolog\Formatter\ElasticsearchFormatter;
20
+ use InvalidArgumentException;
21
+ use Elasticsearch\Common\Exceptions\RuntimeException as ElasticsearchRuntimeException;
22
+ use Elasticsearch\Client;
23
+ use Elastic\Elasticsearch\Exception\InvalidArgumentException as ElasticInvalidArgumentException;
24
+ use Elastic\Elasticsearch\Client as Client8;
25
+
26
+ /**
27
+ * Elasticsearch handler
28
+ *
29
+ * @link https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/index.html
30
+ *
31
+ * Simple usage example:
32
+ *
33
+ * $client = \Elasticsearch\ClientBuilder::create()
34
+ * ->setHosts($hosts)
35
+ * ->build();
36
+ *
37
+ * $options = array(
38
+ * 'index' => 'elastic_index_name',
39
+ * 'type' => 'elastic_doc_type',
40
+ * );
41
+ * $handler = new ElasticsearchHandler($client, $options);
42
+ * $log = new Logger('application');
43
+ * $log->pushHandler($handler);
44
+ *
45
+ * @author Avtandil Kikabidze <akalongman@gmail.com>
46
+ */
47
+ class ElasticsearchHandler extends AbstractProcessingHandler
48
+ {
49
+ /**
50
+ * @var Client|Client8
51
+ */
52
+ protected $client;
53
+
54
+ /**
55
+ * @var mixed[] Handler config options
56
+ */
57
+ protected $options = [];
58
+
59
+ /**
60
+ * @var bool
61
+ */
62
+ private $needsType;
63
+
64
+ /**
65
+ * @param Client|Client8 $client Elasticsearch Client object
66
+ * @param mixed[] $options Handler configuration
67
+ */
68
+ public function __construct($client, array $options = [], $level = Logger::DEBUG, bool $bubble = true)
69
+ {
70
+ if (!$client instanceof Client && !$client instanceof Client8) {
71
+ throw new \TypeError('Elasticsearch\Client or Elastic\Elasticsearch\Client instance required');
72
+ }
73
+
74
+ parent::__construct($level, $bubble);
75
+ $this->client = $client;
76
+ $this->options = array_merge(
77
+ [
78
+ 'index' => 'monolog', // Elastic index name
79
+ 'type' => '_doc', // Elastic document type
80
+ 'ignore_error' => false, // Suppress Elasticsearch exceptions
81
+ ],
82
+ $options
83
+ );
84
+
85
+ if ($client instanceof Client8 || $client::VERSION[0] === '7') {
86
+ $this->needsType = false;
87
+ // force the type to _doc for ES8/ES7
88
+ $this->options['type'] = '_doc';
89
+ } else {
90
+ $this->needsType = true;
91
+ }
92
+ }
93
+
94
+ /**
95
+ * {@inheritDoc}
96
+ */
97
+ protected function write(array $record): void
98
+ {
99
+ $this->bulkSend([$record['formatted']]);
100
+ }
101
+
102
+ /**
103
+ * {@inheritDoc}
104
+ */
105
+ public function setFormatter(FormatterInterface $formatter): HandlerInterface
106
+ {
107
+ if ($formatter instanceof ElasticsearchFormatter) {
108
+ return parent::setFormatter($formatter);
109
+ }
110
+
111
+ throw new InvalidArgumentException('ElasticsearchHandler is only compatible with ElasticsearchFormatter');
112
+ }
113
+
114
+ /**
115
+ * Getter options
116
+ *
117
+ * @return mixed[]
118
+ */
119
+ public function getOptions(): array
120
+ {
121
+ return $this->options;
122
+ }
123
+
124
+ /**
125
+ * {@inheritDoc}
126
+ */
127
+ protected function getDefaultFormatter(): FormatterInterface
128
+ {
129
+ return new ElasticsearchFormatter($this->options['index'], $this->options['type']);
130
+ }
131
+
132
+ /**
133
+ * {@inheritDoc}
134
+ */
135
+ public function handleBatch(array $records): void
136
+ {
137
+ $documents = $this->getFormatter()->formatBatch($records);
138
+ $this->bulkSend($documents);
139
+ }
140
+
141
+ /**
142
+ * Use Elasticsearch bulk API to send list of documents
143
+ *
144
+ * @param array[] $records Records + _index/_type keys
145
+ * @throws \RuntimeException
146
+ */
147
+ protected function bulkSend(array $records): void
148
+ {
149
+ try {
150
+ $params = [
151
+ 'body' => [],
152
+ ];
153
+
154
+ foreach ($records as $record) {
155
+ $params['body'][] = [
156
+ 'index' => $this->needsType ? [
157
+ '_index' => $record['_index'],
158
+ '_type' => $record['_type'],
159
+ ] : [
160
+ '_index' => $record['_index'],
161
+ ],
162
+ ];
163
+ unset($record['_index'], $record['_type']);
164
+
165
+ $params['body'][] = $record;
166
+ }
167
+
168
+ /** @var Elasticsearch */
169
+ $responses = $this->client->bulk($params);
170
+
171
+ if ($responses['errors'] === true) {
172
+ throw $this->createExceptionFromResponses($responses);
173
+ }
174
+ } catch (Throwable $e) {
175
+ if (! $this->options['ignore_error']) {
176
+ throw new RuntimeException('Error sending messages to Elasticsearch', 0, $e);
177
+ }
178
+ }
179
+ }
180
+
181
+ /**
182
+ * Creates elasticsearch exception from responses array
183
+ *
184
+ * Only the first error is converted into an exception.
185
+ *
186
+ * @param mixed[]|Elasticsearch $responses returned by $this->client->bulk()
187
+ */
188
+ protected function createExceptionFromResponses($responses): Throwable
189
+ {
190
+ foreach ($responses['items'] ?? [] as $item) {
191
+ if (isset($item['index']['error'])) {
192
+ return $this->createExceptionFromError($item['index']['error']);
193
+ }
194
+ }
195
+
196
+ if (class_exists(ElasticInvalidArgumentException::class)) {
197
+ return new ElasticInvalidArgumentException('Elasticsearch failed to index one or more records.');
198
+ }
199
+
200
+ return new ElasticsearchRuntimeException('Elasticsearch failed to index one or more records.');
201
+ }
202
+
203
+ /**
204
+ * Creates elasticsearch exception from error array
205
+ *
206
+ * @param mixed[] $error
207
+ */
208
+ protected function createExceptionFromError(array $error): Throwable
209
+ {
210
+ $previous = isset($error['caused_by']) ? $this->createExceptionFromError($error['caused_by']) : null;
211
+
212
+ if (class_exists(ElasticInvalidArgumentException::class)) {
213
+ return new ElasticInvalidArgumentException($error['type'] . ': ' . $error['reason'], 0, $previous);
214
+ }
215
+
216
+ return new ElasticsearchRuntimeException($error['type'] . ': ' . $error['reason'], 0, $previous);
217
+ }
218
+ }
vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php ADDED
@@ -0,0 +1,91 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Formatter\LineFormatter;
15
+ use Monolog\Formatter\FormatterInterface;
16
+ use Monolog\Logger;
17
+ use Monolog\Utils;
18
+
19
+ /**
20
+ * Stores to PHP error_log() handler.
21
+ *
22
+ * @author Elan Ruusamäe <glen@delfi.ee>
23
+ */
24
+ class ErrorLogHandler extends AbstractProcessingHandler
25
+ {
26
+ public const OPERATING_SYSTEM = 0;
27
+ public const SAPI = 4;
28
+
29
+ /** @var int */
30
+ protected $messageType;
31
+ /** @var bool */
32
+ protected $expandNewlines;
33
+
34
+ /**
35
+ * @param int $messageType Says where the error should go.
36
+ * @param bool $expandNewlines If set to true, newlines in the message will be expanded to be take multiple log entries
37
+ */
38
+ public function __construct(int $messageType = self::OPERATING_SYSTEM, $level = Logger::DEBUG, bool $bubble = true, bool $expandNewlines = false)
39
+ {
40
+ parent::__construct($level, $bubble);
41
+
42
+ if (false === in_array($messageType, self::getAvailableTypes(), true)) {
43
+ $message = sprintf('The given message type "%s" is not supported', print_r($messageType, true));
44
+
45
+ throw new \InvalidArgumentException($message);
46
+ }
47
+
48
+ $this->messageType = $messageType;
49
+ $this->expandNewlines = $expandNewlines;
50
+ }
51
+
52
+ /**
53
+ * @return int[] With all available types
54
+ */
55
+ public static function getAvailableTypes(): array
56
+ {
57
+ return [
58
+ self::OPERATING_SYSTEM,
59
+ self::SAPI,
60
+ ];
61
+ }
62
+
63
+ /**
64
+ * {@inheritDoc}
65
+ */
66
+ protected function getDefaultFormatter(): FormatterInterface
67
+ {
68
+ return new LineFormatter('[%datetime%] %channel%.%level_name%: %message% %context% %extra%');
69
+ }
70
+
71
+ /**
72
+ * {@inheritDoc}
73
+ */
74
+ protected function write(array $record): void
75
+ {
76
+ if (!$this->expandNewlines) {
77
+ error_log((string) $record['formatted'], $this->messageType);
78
+
79
+ return;
80
+ }
81
+
82
+ $lines = preg_split('{[\r\n]+}', (string) $record['formatted']);
83
+ if ($lines === false) {
84
+ $pcreErrorCode = preg_last_error();
85
+ throw new \RuntimeException('Failed to preg_split formatted string: ' . $pcreErrorCode . ' / '. Utils::pcreLastErrorMessage($pcreErrorCode));
86
+ }
87
+ foreach ($lines as $line) {
88
+ error_log($line, $this->messageType);
89
+ }
90
+ }
91
+ }
vendor/monolog/monolog/src/Monolog/Handler/FallbackGroupHandler.php ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Throwable;
15
+
16
+ /**
17
+ * Forwards records to at most one handler
18
+ *
19
+ * If a handler fails, the exception is suppressed and the record is forwarded to the next handler.
20
+ *
21
+ * As soon as one handler handles a record successfully, the handling stops there.
22
+ *
23
+ * @phpstan-import-type Record from \Monolog\Logger
24
+ */
25
+ class FallbackGroupHandler extends GroupHandler
26
+ {
27
+ /**
28
+ * {@inheritDoc}
29
+ */
30
+ public function handle(array $record): bool
31
+ {
32
+ if ($this->processors) {
33
+ /** @var Record $record */
34
+ $record = $this->processRecord($record);
35
+ }
36
+ foreach ($this->handlers as $handler) {
37
+ try {
38
+ $handler->handle($record);
39
+ break;
40
+ } catch (Throwable $e) {
41
+ // What throwable?
42
+ }
43
+ }
44
+
45
+ return false === $this->bubble;
46
+ }
47
+
48
+ /**
49
+ * {@inheritDoc}
50
+ */
51
+ public function handleBatch(array $records): void
52
+ {
53
+ if ($this->processors) {
54
+ $processed = [];
55
+ foreach ($records as $record) {
56
+ $processed[] = $this->processRecord($record);
57
+ }
58
+ /** @var Record[] $records */
59
+ $records = $processed;
60
+ }
61
+
62
+ foreach ($this->handlers as $handler) {
63
+ try {
64
+ $handler->handleBatch($records);
65
+ break;
66
+ } catch (Throwable $e) {
67
+ // What throwable?
68
+ }
69
+ }
70
+ }
71
+ }
vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php ADDED
@@ -0,0 +1,212 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Logger;
15
+ use Monolog\ResettableInterface;
16
+ use Monolog\Formatter\FormatterInterface;
17
+ use Psr\Log\LogLevel;
18
+
19
+ /**
20
+ * Simple handler wrapper that filters records based on a list of levels
21
+ *
22
+ * It can be configured with an exact list of levels to allow, or a min/max level.
23
+ *
24
+ * @author Hennadiy Verkh
25
+ * @author Jordi Boggiano <j.boggiano@seld.be>
26
+ *
27
+ * @phpstan-import-type Record from \Monolog\Logger
28
+ * @phpstan-import-type Level from \Monolog\Logger
29
+ * @phpstan-import-type LevelName from \Monolog\Logger
30
+ */
31
+ class FilterHandler extends Handler implements ProcessableHandlerInterface, ResettableInterface, FormattableHandlerInterface
32
+ {
33
+ use ProcessableHandlerTrait;
34
+
35
+ /**
36
+ * Handler or factory callable($record, $this)
37
+ *
38
+ * @var callable|HandlerInterface
39
+ * @phpstan-var callable(?Record, HandlerInterface): HandlerInterface|HandlerInterface
40
+ */
41
+ protected $handler;
42
+
43
+ /**
44
+ * Minimum level for logs that are passed to handler
45
+ *
46
+ * @var int[]
47
+ * @phpstan-var array<Level, int>
48
+ */
49
+ protected $acceptedLevels;
50
+
51
+ /**
52
+ * Whether the messages that are handled can bubble up the stack or not
53
+ *
54
+ * @var bool
55
+ */
56
+ protected $bubble;
57
+
58
+ /**
59
+ * @psalm-param HandlerInterface|callable(?Record, HandlerInterface): HandlerInterface $handler
60
+ *
61
+ * @param callable|HandlerInterface $handler Handler or factory callable($record|null, $filterHandler).
62
+ * @param int|array $minLevelOrList A list of levels to accept or a minimum level if maxLevel is provided
63
+ * @param int|string $maxLevel Maximum level to accept, only used if $minLevelOrList is not an array
64
+ * @param bool $bubble Whether the messages that are handled can bubble up the stack or not
65
+ *
66
+ * @phpstan-param Level|LevelName|LogLevel::*|array<Level|LevelName|LogLevel::*> $minLevelOrList
67
+ * @phpstan-param Level|LevelName|LogLevel::* $maxLevel
68
+ */
69
+ public function __construct($handler, $minLevelOrList = Logger::DEBUG, $maxLevel = Logger::EMERGENCY, bool $bubble = true)
70
+ {
71
+ $this->handler = $handler;
72
+ $this->bubble = $bubble;
73
+ $this->setAcceptedLevels($minLevelOrList, $maxLevel);
74
+
75
+ if (!$this->handler instanceof HandlerInterface && !is_callable($this->handler)) {
76
+ throw new \RuntimeException("The given handler (".json_encode($this->handler).") is not a callable nor a Monolog\Handler\HandlerInterface object");
77
+ }
78
+ }
79
+
80
+ /**
81
+ * @phpstan-return array<int, Level>
82
+ */
83
+ public function getAcceptedLevels(): array
84
+ {
85
+ return array_flip($this->acceptedLevels);
86
+ }
87
+
88
+ /**
89
+ * @param int|string|array $minLevelOrList A list of levels to accept or a minimum level or level name if maxLevel is provided
90
+ * @param int|string $maxLevel Maximum level or level name to accept, only used if $minLevelOrList is not an array
91
+ *
92
+ * @phpstan-param Level|LevelName|LogLevel::*|array<Level|LevelName|LogLevel::*> $minLevelOrList
93
+ * @phpstan-param Level|LevelName|LogLevel::* $maxLevel
94
+ */
95
+ public function setAcceptedLevels($minLevelOrList = Logger::DEBUG, $maxLevel = Logger::EMERGENCY): self
96
+ {
97
+ if (is_array($minLevelOrList)) {
98
+ $acceptedLevels = array_map('Monolog\Logger::toMonologLevel', $minLevelOrList);
99
+ } else {
100
+ $minLevelOrList = Logger::toMonologLevel($minLevelOrList);
101
+ $maxLevel = Logger::toMonologLevel($maxLevel);
102
+ $acceptedLevels = array_values(array_filter(Logger::getLevels(), function ($level) use ($minLevelOrList, $maxLevel) {
103
+ return $level >= $minLevelOrList && $level <= $maxLevel;
104
+ }));
105
+ }
106
+ $this->acceptedLevels = array_flip($acceptedLevels);
107
+
108
+ return $this;
109
+ }
110
+
111
+ /**
112
+ * {@inheritDoc}
113
+ */
114
+ public function isHandling(array $record): bool
115
+ {
116
+ return isset($this->acceptedLevels[$record['level']]);
117
+ }
118
+
119
+ /**
120
+ * {@inheritDoc}
121
+ */
122
+ public function handle(array $record): bool
123
+ {
124
+ if (!$this->isHandling($record)) {
125
+ return false;
126
+ }
127
+
128
+ if ($this->processors) {
129
+ /** @var Record $record */
130
+ $record = $this->processRecord($record);
131
+ }
132
+
133
+ $this->getHandler($record)->handle($record);
134
+
135
+ return false === $this->bubble;
136
+ }
137
+
138
+ /**
139
+ * {@inheritDoc}
140
+ */
141
+ public function handleBatch(array $records): void
142
+ {
143
+ $filtered = [];
144
+ foreach ($records as $record) {
145
+ if ($this->isHandling($record)) {
146
+ $filtered[] = $record;
147
+ }
148
+ }
149
+
150
+ if (count($filtered) > 0) {
151
+ $this->getHandler($filtered[count($filtered) - 1])->handleBatch($filtered);
152
+ }
153
+ }
154
+
155
+ /**
156
+ * Return the nested handler
157
+ *
158
+ * If the handler was provided as a factory callable, this will trigger the handler's instantiation.
159
+ *
160
+ * @return HandlerInterface
161
+ *
162
+ * @phpstan-param Record $record
163
+ */
164
+ public function getHandler(array $record = null)
165
+ {
166
+ if (!$this->handler instanceof HandlerInterface) {
167
+ $this->handler = ($this->handler)($record, $this);
168
+ if (!$this->handler instanceof HandlerInterface) {
169
+ throw new \RuntimeException("The factory callable should return a HandlerInterface");
170
+ }
171
+ }
172
+
173
+ return $this->handler;
174
+ }
175
+
176
+ /**
177
+ * {@inheritDoc}
178
+ */
179
+ public function setFormatter(FormatterInterface $formatter): HandlerInterface
180
+ {
181
+ $handler = $this->getHandler();
182
+ if ($handler instanceof FormattableHandlerInterface) {
183
+ $handler->setFormatter($formatter);
184
+
185
+ return $this;
186
+ }
187
+
188
+ throw new \UnexpectedValueException('The nested handler of type '.get_class($handler).' does not support formatters.');
189
+ }
190
+
191
+ /**
192
+ * {@inheritDoc}
193
+ */
194
+ public function getFormatter(): FormatterInterface
195
+ {
196
+ $handler = $this->getHandler();
197
+ if ($handler instanceof FormattableHandlerInterface) {
198
+ return $handler->getFormatter();
199
+ }
200
+
201
+ throw new \UnexpectedValueException('The nested handler of type '.get_class($handler).' does not support formatters.');
202
+ }
203
+
204
+ public function reset()
205
+ {
206
+ $this->resetProcessors();
207
+
208
+ if ($this->getHandler() instanceof ResettableInterface) {
209
+ $this->getHandler()->reset();
210
+ }
211
+ }
212
+ }
vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler\FingersCrossed;
13
+
14
+ /**
15
+ * Interface for activation strategies for the FingersCrossedHandler.
16
+ *
17
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
18
+ *
19
+ * @phpstan-import-type Record from \Monolog\Logger
20
+ */
21
+ interface ActivationStrategyInterface
22
+ {
23
+ /**
24
+ * Returns whether the given record activates the handler.
25
+ *
26
+ * @phpstan-param Record $record
27
+ */
28
+ public function isHandlerActivated(array $record): bool;
29
+ }
vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler\FingersCrossed;
13
+
14
+ use Monolog\Logger;
15
+ use Psr\Log\LogLevel;
16
+
17
+ /**
18
+ * Channel and Error level based monolog activation strategy. Allows to trigger activation
19
+ * based on level per channel. e.g. trigger activation on level 'ERROR' by default, except
20
+ * for records of the 'sql' channel; those should trigger activation on level 'WARN'.
21
+ *
22
+ * Example:
23
+ *
24
+ * <code>
25
+ * $activationStrategy = new ChannelLevelActivationStrategy(
26
+ * Logger::CRITICAL,
27
+ * array(
28
+ * 'request' => Logger::ALERT,
29
+ * 'sensitive' => Logger::ERROR,
30
+ * )
31
+ * );
32
+ * $handler = new FingersCrossedHandler(new StreamHandler('php://stderr'), $activationStrategy);
33
+ * </code>
34
+ *
35
+ * @author Mike Meessen <netmikey@gmail.com>
36
+ *
37
+ * @phpstan-import-type Record from \Monolog\Logger
38
+ * @phpstan-import-type Level from \Monolog\Logger
39
+ * @phpstan-import-type LevelName from \Monolog\Logger
40
+ */
41
+ class ChannelLevelActivationStrategy implements ActivationStrategyInterface
42
+ {
43
+ /**
44
+ * @var Level
45
+ */
46
+ private $defaultActionLevel;
47
+
48
+ /**
49
+ * @var array<string, Level>
50
+ */
51
+ private $channelToActionLevel;
52
+
53
+ /**
54
+ * @param int|string $defaultActionLevel The default action level to be used if the record's category doesn't match any
55
+ * @param array<string, int> $channelToActionLevel An array that maps channel names to action levels.
56
+ *
57
+ * @phpstan-param array<string, Level> $channelToActionLevel
58
+ * @phpstan-param Level|LevelName|LogLevel::* $defaultActionLevel
59
+ */
60
+ public function __construct($defaultActionLevel, array $channelToActionLevel = [])
61
+ {
62
+ $this->defaultActionLevel = Logger::toMonologLevel($defaultActionLevel);
63
+ $this->channelToActionLevel = array_map('Monolog\Logger::toMonologLevel', $channelToActionLevel);
64
+ }
65
+
66
+ /**
67
+ * @phpstan-param Record $record
68
+ */
69
+ public function isHandlerActivated(array $record): bool
70
+ {
71
+ if (isset($this->channelToActionLevel[$record['channel']])) {
72
+ return $record['level'] >= $this->channelToActionLevel[$record['channel']];
73
+ }
74
+
75
+ return $record['level'] >= $this->defaultActionLevel;
76
+ }
77
+ }
vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler\FingersCrossed;
13
+
14
+ use Monolog\Logger;
15
+ use Psr\Log\LogLevel;
16
+
17
+ /**
18
+ * Error level based activation strategy.
19
+ *
20
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
21
+ *
22
+ * @phpstan-import-type Level from \Monolog\Logger
23
+ * @phpstan-import-type LevelName from \Monolog\Logger
24
+ */
25
+ class ErrorLevelActivationStrategy implements ActivationStrategyInterface
26
+ {
27
+ /**
28
+ * @var Level
29
+ */
30
+ private $actionLevel;
31
+
32
+ /**
33
+ * @param int|string $actionLevel Level or name or value
34
+ *
35
+ * @phpstan-param Level|LevelName|LogLevel::* $actionLevel
36
+ */
37
+ public function __construct($actionLevel)
38
+ {
39
+ $this->actionLevel = Logger::toMonologLevel($actionLevel);
40
+ }
41
+
42
+ public function isHandlerActivated(array $record): bool
43
+ {
44
+ return $record['level'] >= $this->actionLevel;
45
+ }
46
+ }
vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php ADDED
@@ -0,0 +1,252 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy;
15
+ use Monolog\Handler\FingersCrossed\ActivationStrategyInterface;
16
+ use Monolog\Logger;
17
+ use Monolog\ResettableInterface;
18
+ use Monolog\Formatter\FormatterInterface;
19
+ use Psr\Log\LogLevel;
20
+
21
+ /**
22
+ * Buffers all records until a certain level is reached
23
+ *
24
+ * The advantage of this approach is that you don't get any clutter in your log files.
25
+ * Only requests which actually trigger an error (or whatever your actionLevel is) will be
26
+ * in the logs, but they will contain all records, not only those above the level threshold.
27
+ *
28
+ * You can then have a passthruLevel as well which means that at the end of the request,
29
+ * even if it did not get activated, it will still send through log records of e.g. at least a
30
+ * warning level.
31
+ *
32
+ * You can find the various activation strategies in the
33
+ * Monolog\Handler\FingersCrossed\ namespace.
34
+ *
35
+ * @author Jordi Boggiano <j.boggiano@seld.be>
36
+ *
37
+ * @phpstan-import-type Record from \Monolog\Logger
38
+ * @phpstan-import-type Level from \Monolog\Logger
39
+ * @phpstan-import-type LevelName from \Monolog\Logger
40
+ */
41
+ class FingersCrossedHandler extends Handler implements ProcessableHandlerInterface, ResettableInterface, FormattableHandlerInterface
42
+ {
43
+ use ProcessableHandlerTrait;
44
+
45
+ /**
46
+ * @var callable|HandlerInterface
47
+ * @phpstan-var callable(?Record, HandlerInterface): HandlerInterface|HandlerInterface
48
+ */
49
+ protected $handler;
50
+ /** @var ActivationStrategyInterface */
51
+ protected $activationStrategy;
52
+ /** @var bool */
53
+ protected $buffering = true;
54
+ /** @var int */
55
+ protected $bufferSize;
56
+ /** @var Record[] */
57
+ protected $buffer = [];
58
+ /** @var bool */
59
+ protected $stopBuffering;
60
+ /**
61
+ * @var ?int
62
+ * @phpstan-var ?Level
63
+ */
64
+ protected $passthruLevel;
65
+ /** @var bool */
66
+ protected $bubble;
67
+
68
+ /**
69
+ * @psalm-param HandlerInterface|callable(?Record, HandlerInterface): HandlerInterface $handler
70
+ *
71
+ * @param callable|HandlerInterface $handler Handler or factory callable($record|null, $fingersCrossedHandler).
72
+ * @param int|string|ActivationStrategyInterface $activationStrategy Strategy which determines when this handler takes action, or a level name/value at which the handler is activated
73
+ * @param int $bufferSize How many entries should be buffered at most, beyond that the oldest items are removed from the buffer.
74
+ * @param bool $bubble Whether the messages that are handled can bubble up the stack or not
75
+ * @param bool $stopBuffering Whether the handler should stop buffering after being triggered (default true)
76
+ * @param int|string $passthruLevel Minimum level to always flush to handler on close, even if strategy not triggered
77
+ *
78
+ * @phpstan-param Level|LevelName|LogLevel::* $passthruLevel
79
+ * @phpstan-param Level|LevelName|LogLevel::*|ActivationStrategyInterface $activationStrategy
80
+ */
81
+ public function __construct($handler, $activationStrategy = null, int $bufferSize = 0, bool $bubble = true, bool $stopBuffering = true, $passthruLevel = null)
82
+ {
83
+ if (null === $activationStrategy) {
84
+ $activationStrategy = new ErrorLevelActivationStrategy(Logger::WARNING);
85
+ }
86
+
87
+ // convert simple int activationStrategy to an object
88
+ if (!$activationStrategy instanceof ActivationStrategyInterface) {
89
+ $activationStrategy = new ErrorLevelActivationStrategy($activationStrategy);
90
+ }
91
+
92
+ $this->handler = $handler;
93
+ $this->activationStrategy = $activationStrategy;
94
+ $this->bufferSize = $bufferSize;
95
+ $this->bubble = $bubble;
96
+ $this->stopBuffering = $stopBuffering;
97
+
98
+ if ($passthruLevel !== null) {
99
+ $this->passthruLevel = Logger::toMonologLevel($passthruLevel);
100
+ }
101
+
102
+ if (!$this->handler instanceof HandlerInterface && !is_callable($this->handler)) {
103
+ throw new \RuntimeException("The given handler (".json_encode($this->handler).") is not a callable nor a Monolog\Handler\HandlerInterface object");
104
+ }
105
+ }
106
+
107
+ /**
108
+ * {@inheritDoc}
109
+ */
110
+ public function isHandling(array $record): bool
111
+ {
112
+ return true;
113
+ }
114
+
115
+ /**
116
+ * Manually activate this logger regardless of the activation strategy
117
+ */
118
+ public function activate(): void
119
+ {
120
+ if ($this->stopBuffering) {
121
+ $this->buffering = false;
122
+ }
123
+
124
+ $this->getHandler(end($this->buffer) ?: null)->handleBatch($this->buffer);
125
+ $this->buffer = [];
126
+ }
127
+
128
+ /**
129
+ * {@inheritDoc}
130
+ */
131
+ public function handle(array $record): bool
132
+ {
133
+ if ($this->processors) {
134
+ /** @var Record $record */
135
+ $record = $this->processRecord($record);
136
+ }
137
+
138
+ if ($this->buffering) {
139
+ $this->buffer[] = $record;
140
+ if ($this->bufferSize > 0 && count($this->buffer) > $this->bufferSize) {
141
+ array_shift($this->buffer);
142
+ }
143
+ if ($this->activationStrategy->isHandlerActivated($record)) {
144
+ $this->activate();
145
+ }
146
+ } else {
147
+ $this->getHandler($record)->handle($record);
148
+ }
149
+
150
+ return false === $this->bubble;
151
+ }
152
+
153
+ /**
154
+ * {@inheritDoc}
155
+ */
156
+ public function close(): void
157
+ {
158
+ $this->flushBuffer();
159
+
160
+ $this->getHandler()->close();
161
+ }
162
+
163
+ public function reset()
164
+ {
165
+ $this->flushBuffer();
166
+
167
+ $this->resetProcessors();
168
+
169
+ if ($this->getHandler() instanceof ResettableInterface) {
170
+ $this->getHandler()->reset();
171
+ }
172
+ }
173
+
174
+ /**
175
+ * Clears the buffer without flushing any messages down to the wrapped handler.
176
+ *
177
+ * It also resets the handler to its initial buffering state.
178
+ */
179
+ public function clear(): void
180
+ {
181
+ $this->buffer = [];
182
+ $this->reset();
183
+ }
184
+
185
+ /**
186
+ * Resets the state of the handler. Stops forwarding records to the wrapped handler.
187
+ */
188
+ private function flushBuffer(): void
189
+ {
190
+ if (null !== $this->passthruLevel) {
191
+ $level = $this->passthruLevel;
192
+ $this->buffer = array_filter($this->buffer, function ($record) use ($level) {
193
+ return $record['level'] >= $level;
194
+ });
195
+ if (count($this->buffer) > 0) {
196
+ $this->getHandler(end($this->buffer))->handleBatch($this->buffer);
197
+ }
198
+ }
199
+
200
+ $this->buffer = [];
201
+ $this->buffering = true;
202
+ }
203
+
204
+ /**
205
+ * Return the nested handler
206
+ *
207
+ * If the handler was provided as a factory callable, this will trigger the handler's instantiation.
208
+ *
209
+ * @return HandlerInterface
210
+ *
211
+ * @phpstan-param Record $record
212
+ */
213
+ public function getHandler(array $record = null)
214
+ {
215
+ if (!$this->handler instanceof HandlerInterface) {
216
+ $this->handler = ($this->handler)($record, $this);
217
+ if (!$this->handler instanceof HandlerInterface) {
218
+ throw new \RuntimeException("The factory callable should return a HandlerInterface");
219
+ }
220
+ }
221
+
222
+ return $this->handler;
223
+ }
224
+
225
+ /**
226
+ * {@inheritDoc}
227
+ */
228
+ public function setFormatter(FormatterInterface $formatter): HandlerInterface
229
+ {
230
+ $handler = $this->getHandler();
231
+ if ($handler instanceof FormattableHandlerInterface) {
232
+ $handler->setFormatter($formatter);
233
+
234
+ return $this;
235
+ }
236
+
237
+ throw new \UnexpectedValueException('The nested handler of type '.get_class($handler).' does not support formatters.');
238
+ }
239
+
240
+ /**
241
+ * {@inheritDoc}
242
+ */
243
+ public function getFormatter(): FormatterInterface
244
+ {
245
+ $handler = $this->getHandler();
246
+ if ($handler instanceof FormattableHandlerInterface) {
247
+ return $handler->getFormatter();
248
+ }
249
+
250
+ throw new \UnexpectedValueException('The nested handler of type '.get_class($handler).' does not support formatters.');
251
+ }
252
+ }
vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php ADDED
@@ -0,0 +1,180 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Formatter\WildfireFormatter;
15
+ use Monolog\Formatter\FormatterInterface;
16
+
17
+ /**
18
+ * Simple FirePHP Handler (http://www.firephp.org/), which uses the Wildfire protocol.
19
+ *
20
+ * @author Eric Clemmons (@ericclemmons) <eric@uxdriven.com>
21
+ *
22
+ * @phpstan-import-type FormattedRecord from AbstractProcessingHandler
23
+ */
24
+ class FirePHPHandler extends AbstractProcessingHandler
25
+ {
26
+ use WebRequestRecognizerTrait;
27
+
28
+ /**
29
+ * WildFire JSON header message format
30
+ */
31
+ protected const PROTOCOL_URI = 'http://meta.wildfirehq.org/Protocol/JsonStream/0.2';
32
+
33
+ /**
34
+ * FirePHP structure for parsing messages & their presentation
35
+ */
36
+ protected const STRUCTURE_URI = 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1';
37
+
38
+ /**
39
+ * Must reference a "known" plugin, otherwise headers won't display in FirePHP
40
+ */
41
+ protected const PLUGIN_URI = 'http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.3';
42
+
43
+ /**
44
+ * Header prefix for Wildfire to recognize & parse headers
45
+ */
46
+ protected const HEADER_PREFIX = 'X-Wf';
47
+
48
+ /**
49
+ * Whether or not Wildfire vendor-specific headers have been generated & sent yet
50
+ * @var bool
51
+ */
52
+ protected static $initialized = false;
53
+
54
+ /**
55
+ * Shared static message index between potentially multiple handlers
56
+ * @var int
57
+ */
58
+ protected static $messageIndex = 1;
59
+
60
+ /** @var bool */
61
+ protected static $sendHeaders = true;
62
+
63
+ /**
64
+ * Base header creation function used by init headers & record headers
65
+ *
66
+ * @param array<int|string> $meta Wildfire Plugin, Protocol & Structure Indexes
67
+ * @param string $message Log message
68
+ *
69
+ * @return array<string, string> Complete header string ready for the client as key and message as value
70
+ *
71
+ * @phpstan-return non-empty-array<string, string>
72
+ */
73
+ protected function createHeader(array $meta, string $message): array
74
+ {
75
+ $header = sprintf('%s-%s', static::HEADER_PREFIX, join('-', $meta));
76
+
77
+ return [$header => $message];
78
+ }
79
+
80
+ /**
81
+ * Creates message header from record
82
+ *
83
+ * @return array<string, string>
84
+ *
85
+ * @phpstan-return non-empty-array<string, string>
86
+ *
87
+ * @see createHeader()
88
+ *
89
+ * @phpstan-param FormattedRecord $record
90
+ */
91
+ protected function createRecordHeader(array $record): array
92
+ {
93
+ // Wildfire is extensible to support multiple protocols & plugins in a single request,
94
+ // but we're not taking advantage of that (yet), so we're using "1" for simplicity's sake.
95
+ return $this->createHeader(
96
+ [1, 1, 1, self::$messageIndex++],
97
+ $record['formatted']
98
+ );
99
+ }
100
+
101
+ /**
102
+ * {@inheritDoc}
103
+ */
104
+ protected function getDefaultFormatter(): FormatterInterface
105
+ {
106
+ return new WildfireFormatter();
107
+ }
108
+
109
+ /**
110
+ * Wildfire initialization headers to enable message parsing
111
+ *
112
+ * @see createHeader()
113
+ * @see sendHeader()
114
+ *
115
+ * @return array<string, string>
116
+ */
117
+ protected function getInitHeaders(): array
118
+ {
119
+ // Initial payload consists of required headers for Wildfire
120
+ return array_merge(
121
+ $this->createHeader(['Protocol', 1], static::PROTOCOL_URI),
122
+ $this->createHeader([1, 'Structure', 1], static::STRUCTURE_URI),
123
+ $this->createHeader([1, 'Plugin', 1], static::PLUGIN_URI)
124
+ );
125
+ }
126
+
127
+ /**
128
+ * Send header string to the client
129
+ */
130
+ protected function sendHeader(string $header, string $content): void
131
+ {
132
+ if (!headers_sent() && self::$sendHeaders) {
133
+ header(sprintf('%s: %s', $header, $content));
134
+ }
135
+ }
136
+
137
+ /**
138
+ * Creates & sends header for a record, ensuring init headers have been sent prior
139
+ *
140
+ * @see sendHeader()
141
+ * @see sendInitHeaders()
142
+ */
143
+ protected function write(array $record): void
144
+ {
145
+ if (!self::$sendHeaders || !$this->isWebRequest()) {
146
+ return;
147
+ }
148
+
149
+ // WildFire-specific headers must be sent prior to any messages
150
+ if (!self::$initialized) {
151
+ self::$initialized = true;
152
+
153
+ self::$sendHeaders = $this->headersAccepted();
154
+ if (!self::$sendHeaders) {
155
+ return;
156
+ }
157
+
158
+ foreach ($this->getInitHeaders() as $header => $content) {
159
+ $this->sendHeader($header, $content);
160
+ }
161
+ }
162
+
163
+ $header = $this->createRecordHeader($record);
164
+ if (trim(current($header)) !== '') {
165
+ $this->sendHeader(key($header), current($header));
166
+ }
167
+ }
168
+
169
+ /**
170
+ * Verifies if the headers are accepted by the current user agent
171
+ */
172
+ protected function headersAccepted(): bool
173
+ {
174
+ if (!empty($_SERVER['HTTP_USER_AGENT']) && preg_match('{\bFirePHP/\d+\.\d+\b}', $_SERVER['HTTP_USER_AGENT'])) {
175
+ return true;
176
+ }
177
+
178
+ return isset($_SERVER['HTTP_X_FIREPHP_VERSION']);
179
+ }
180
+ }
vendor/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php ADDED
@@ -0,0 +1,135 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Formatter\FormatterInterface;
15
+ use Monolog\Formatter\LineFormatter;
16
+ use Monolog\Logger;
17
+
18
+ /**
19
+ * Sends logs to Fleep.io using Webhook integrations
20
+ *
21
+ * You'll need a Fleep.io account to use this handler.
22
+ *
23
+ * @see https://fleep.io/integrations/webhooks/ Fleep Webhooks Documentation
24
+ * @author Ando Roots <ando@sqroot.eu>
25
+ *
26
+ * @phpstan-import-type FormattedRecord from AbstractProcessingHandler
27
+ */
28
+ class FleepHookHandler extends SocketHandler
29
+ {
30
+ protected const FLEEP_HOST = 'fleep.io';
31
+
32
+ protected const FLEEP_HOOK_URI = '/hook/';
33
+
34
+ /**
35
+ * @var string Webhook token (specifies the conversation where logs are sent)
36
+ */
37
+ protected $token;
38
+
39
+ /**
40
+ * Construct a new Fleep.io Handler.
41
+ *
42
+ * For instructions on how to create a new web hook in your conversations
43
+ * see https://fleep.io/integrations/webhooks/
44
+ *
45
+ * @param string $token Webhook token
46
+ * @throws MissingExtensionException
47
+ */
48
+ public function __construct(
49
+ string $token,
50
+ $level = Logger::DEBUG,
51
+ bool $bubble = true,
52
+ bool $persistent = false,
53
+ float $timeout = 0.0,
54
+ float $writingTimeout = 10.0,
55
+ ?float $connectionTimeout = null,
56
+ ?int $chunkSize = null
57
+ ) {
58
+ if (!extension_loaded('openssl')) {
59
+ throw new MissingExtensionException('The OpenSSL PHP extension is required to use the FleepHookHandler');
60
+ }
61
+
62
+ $this->token = $token;
63
+
64
+ $connectionString = 'ssl://' . static::FLEEP_HOST . ':443';
65
+ parent::__construct(
66
+ $connectionString,
67
+ $level,
68
+ $bubble,
69
+ $persistent,
70
+ $timeout,
71
+ $writingTimeout,
72
+ $connectionTimeout,
73
+ $chunkSize
74
+ );
75
+ }
76
+
77
+ /**
78
+ * Returns the default formatter to use with this handler
79
+ *
80
+ * Overloaded to remove empty context and extra arrays from the end of the log message.
81
+ *
82
+ * @return LineFormatter
83
+ */
84
+ protected function getDefaultFormatter(): FormatterInterface
85
+ {
86
+ return new LineFormatter(null, null, true, true);
87
+ }
88
+
89
+ /**
90
+ * Handles a log record
91
+ */
92
+ public function write(array $record): void
93
+ {
94
+ parent::write($record);
95
+ $this->closeSocket();
96
+ }
97
+
98
+ /**
99
+ * {@inheritDoc}
100
+ */
101
+ protected function generateDataStream(array $record): string
102
+ {
103
+ $content = $this->buildContent($record);
104
+
105
+ return $this->buildHeader($content) . $content;
106
+ }
107
+
108
+ /**
109
+ * Builds the header of the API Call
110
+ */
111
+ private function buildHeader(string $content): string
112
+ {
113
+ $header = "POST " . static::FLEEP_HOOK_URI . $this->token . " HTTP/1.1\r\n";
114
+ $header .= "Host: " . static::FLEEP_HOST . "\r\n";
115
+ $header .= "Content-Type: application/x-www-form-urlencoded\r\n";
116
+ $header .= "Content-Length: " . strlen($content) . "\r\n";
117
+ $header .= "\r\n";
118
+
119
+ return $header;
120
+ }
121
+
122
+ /**
123
+ * Builds the body of API call
124
+ *
125
+ * @phpstan-param FormattedRecord $record
126
+ */
127
+ private function buildContent(array $record): string
128
+ {
129
+ $dataArray = [
130
+ 'message' => $record['formatted'],
131
+ ];
132
+
133
+ return http_build_query($dataArray);
134
+ }
135
+ }
vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php ADDED
@@ -0,0 +1,132 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Logger;
15
+ use Monolog\Utils;
16
+ use Monolog\Formatter\FlowdockFormatter;
17
+ use Monolog\Formatter\FormatterInterface;
18
+
19
+ /**
20
+ * Sends notifications through the Flowdock push API
21
+ *
22
+ * This must be configured with a FlowdockFormatter instance via setFormatter()
23
+ *
24
+ * Notes:
25
+ * API token - Flowdock API token
26
+ *
27
+ * @author Dominik Liebler <liebler.dominik@gmail.com>
28
+ * @see https://www.flowdock.com/api/push
29
+ *
30
+ * @phpstan-import-type FormattedRecord from AbstractProcessingHandler
31
+ */
32
+ class FlowdockHandler extends SocketHandler
33
+ {
34
+ /**
35
+ * @var string
36
+ */
37
+ protected $apiToken;
38
+
39
+ /**
40
+ * @throws MissingExtensionException if OpenSSL is missing
41
+ */
42
+ public function __construct(
43
+ string $apiToken,
44
+ $level = Logger::DEBUG,
45
+ bool $bubble = true,
46
+ bool $persistent = false,
47
+ float $timeout = 0.0,
48
+ float $writingTimeout = 10.0,
49
+ ?float $connectionTimeout = null,
50
+ ?int $chunkSize = null
51
+ ) {
52
+ if (!extension_loaded('openssl')) {
53
+ throw new MissingExtensionException('The OpenSSL PHP extension is required to use the FlowdockHandler');
54
+ }
55
+
56
+ parent::__construct(
57
+ 'ssl://api.flowdock.com:443',
58
+ $level,
59
+ $bubble,
60
+ $persistent,
61
+ $timeout,
62
+ $writingTimeout,
63
+ $connectionTimeout,
64
+ $chunkSize
65
+ );
66
+ $this->apiToken = $apiToken;
67
+ }
68
+
69
+ /**
70
+ * {@inheritDoc}
71
+ */
72
+ public function setFormatter(FormatterInterface $formatter): HandlerInterface
73
+ {
74
+ if (!$formatter instanceof FlowdockFormatter) {
75
+ throw new \InvalidArgumentException('The FlowdockHandler requires an instance of Monolog\Formatter\FlowdockFormatter to function correctly');
76
+ }
77
+
78
+ return parent::setFormatter($formatter);
79
+ }
80
+
81
+ /**
82
+ * Gets the default formatter.
83
+ */
84
+ protected function getDefaultFormatter(): FormatterInterface
85
+ {
86
+ throw new \InvalidArgumentException('The FlowdockHandler must be configured (via setFormatter) with an instance of Monolog\Formatter\FlowdockFormatter to function correctly');
87
+ }
88
+
89
+ /**
90
+ * {@inheritDoc}
91
+ */
92
+ protected function write(array $record): void
93
+ {
94
+ parent::write($record);
95
+
96
+ $this->closeSocket();
97
+ }
98
+
99
+ /**
100
+ * {@inheritDoc}
101
+ */
102
+ protected function generateDataStream(array $record): string
103
+ {
104
+ $content = $this->buildContent($record);
105
+
106
+ return $this->buildHeader($content) . $content;
107
+ }
108
+
109
+ /**
110
+ * Builds the body of API call
111
+ *
112
+ * @phpstan-param FormattedRecord $record
113
+ */
114
+ private function buildContent(array $record): string
115
+ {
116
+ return Utils::jsonEncode($record['formatted']['flowdock']);
117
+ }
118
+
119
+ /**
120
+ * Builds the header of the API Call
121
+ */
122
+ private function buildHeader(string $content): string
123
+ {
124
+ $header = "POST /v1/messages/team_inbox/" . $this->apiToken . " HTTP/1.1\r\n";
125
+ $header .= "Host: api.flowdock.com\r\n";
126
+ $header .= "Content-Type: application/json\r\n";
127
+ $header .= "Content-Length: " . strlen($content) . "\r\n";
128
+ $header .= "\r\n";
129
+
130
+ return $header;
131
+ }
132
+ }
vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerInterface.php ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Formatter\FormatterInterface;
15
+
16
+ /**
17
+ * Interface to describe loggers that have a formatter
18
+ *
19
+ * @author Jordi Boggiano <j.boggiano@seld.be>
20
+ */
21
+ interface FormattableHandlerInterface
22
+ {
23
+ /**
24
+ * Sets the formatter.
25
+ *
26
+ * @param FormatterInterface $formatter
27
+ * @return HandlerInterface self
28
+ */
29
+ public function setFormatter(FormatterInterface $formatter): HandlerInterface;
30
+
31
+ /**
32
+ * Gets the formatter.
33
+ *
34
+ * @return FormatterInterface
35
+ */
36
+ public function getFormatter(): FormatterInterface;
37
+ }
vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerTrait.php ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Formatter\FormatterInterface;
15
+ use Monolog\Formatter\LineFormatter;
16
+
17
+ /**
18
+ * Helper trait for implementing FormattableInterface
19
+ *
20
+ * @author Jordi Boggiano <j.boggiano@seld.be>
21
+ */
22
+ trait FormattableHandlerTrait
23
+ {
24
+ /**
25
+ * @var ?FormatterInterface
26
+ */
27
+ protected $formatter;
28
+
29
+ /**
30
+ * {@inheritDoc}
31
+ */
32
+ public function setFormatter(FormatterInterface $formatter): HandlerInterface
33
+ {
34
+ $this->formatter = $formatter;
35
+
36
+ return $this;
37
+ }
38
+
39
+ /**
40
+ * {@inheritDoc}
41
+ */
42
+ public function getFormatter(): FormatterInterface
43
+ {
44
+ if (!$this->formatter) {
45
+ $this->formatter = $this->getDefaultFormatter();
46
+ }
47
+
48
+ return $this->formatter;
49
+ }
50
+
51
+ /**
52
+ * Gets the default formatter.
53
+ *
54
+ * Overwrite this if the LineFormatter is not a good default for your handler.
55
+ */
56
+ protected function getDefaultFormatter(): FormatterInterface
57
+ {
58
+ return new LineFormatter();
59
+ }
60
+ }
vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Gelf\PublisherInterface;
15
+ use Monolog\Logger;
16
+ use Monolog\Formatter\GelfMessageFormatter;
17
+ use Monolog\Formatter\FormatterInterface;
18
+
19
+ /**
20
+ * Handler to send messages to a Graylog2 (http://www.graylog2.org) server
21
+ *
22
+ * @author Matt Lehner <mlehner@gmail.com>
23
+ * @author Benjamin Zikarsky <benjamin@zikarsky.de>
24
+ */
25
+ class GelfHandler extends AbstractProcessingHandler
26
+ {
27
+ /**
28
+ * @var PublisherInterface the publisher object that sends the message to the server
29
+ */
30
+ protected $publisher;
31
+
32
+ /**
33
+ * @param PublisherInterface $publisher a gelf publisher object
34
+ */
35
+ public function __construct(PublisherInterface $publisher, $level = Logger::DEBUG, bool $bubble = true)
36
+ {
37
+ parent::__construct($level, $bubble);
38
+
39
+ $this->publisher = $publisher;
40
+ }
41
+
42
+ /**
43
+ * {@inheritDoc}
44
+ */
45
+ protected function write(array $record): void
46
+ {
47
+ $this->publisher->publish($record['formatted']);
48
+ }
49
+
50
+ /**
51
+ * {@inheritDoc}
52
+ */
53
+ protected function getDefaultFormatter(): FormatterInterface
54
+ {
55
+ return new GelfMessageFormatter();
56
+ }
57
+ }
vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php ADDED
@@ -0,0 +1,132 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Formatter\FormatterInterface;
15
+ use Monolog\ResettableInterface;
16
+
17
+ /**
18
+ * Forwards records to multiple handlers
19
+ *
20
+ * @author Lenar Lõhmus <lenar@city.ee>
21
+ *
22
+ * @phpstan-import-type Record from \Monolog\Logger
23
+ */
24
+ class GroupHandler extends Handler implements ProcessableHandlerInterface, ResettableInterface
25
+ {
26
+ use ProcessableHandlerTrait;
27
+
28
+ /** @var HandlerInterface[] */
29
+ protected $handlers;
30
+ /** @var bool */
31
+ protected $bubble;
32
+
33
+ /**
34
+ * @param HandlerInterface[] $handlers Array of Handlers.
35
+ * @param bool $bubble Whether the messages that are handled can bubble up the stack or not
36
+ */
37
+ public function __construct(array $handlers, bool $bubble = true)
38
+ {
39
+ foreach ($handlers as $handler) {
40
+ if (!$handler instanceof HandlerInterface) {
41
+ throw new \InvalidArgumentException('The first argument of the GroupHandler must be an array of HandlerInterface instances.');
42
+ }
43
+ }
44
+
45
+ $this->handlers = $handlers;
46
+ $this->bubble = $bubble;
47
+ }
48
+
49
+ /**
50
+ * {@inheritDoc}
51
+ */
52
+ public function isHandling(array $record): bool
53
+ {
54
+ foreach ($this->handlers as $handler) {
55
+ if ($handler->isHandling($record)) {
56
+ return true;
57
+ }
58
+ }
59
+
60
+ return false;
61
+ }
62
+
63
+ /**
64
+ * {@inheritDoc}
65
+ */
66
+ public function handle(array $record): bool
67
+ {
68
+ if ($this->processors) {
69
+ /** @var Record $record */
70
+ $record = $this->processRecord($record);
71
+ }
72
+
73
+ foreach ($this->handlers as $handler) {
74
+ $handler->handle($record);
75
+ }
76
+
77
+ return false === $this->bubble;
78
+ }
79
+
80
+ /**
81
+ * {@inheritDoc}
82
+ */
83
+ public function handleBatch(array $records): void
84
+ {
85
+ if ($this->processors) {
86
+ $processed = [];
87
+ foreach ($records as $record) {
88
+ $processed[] = $this->processRecord($record);
89
+ }
90
+ /** @var Record[] $records */
91
+ $records = $processed;
92
+ }
93
+
94
+ foreach ($this->handlers as $handler) {
95
+ $handler->handleBatch($records);
96
+ }
97
+ }
98
+
99
+ public function reset()
100
+ {
101
+ $this->resetProcessors();
102
+
103
+ foreach ($this->handlers as $handler) {
104
+ if ($handler instanceof ResettableInterface) {
105
+ $handler->reset();
106
+ }
107
+ }
108
+ }
109
+
110
+ public function close(): void
111
+ {
112
+ parent::close();
113
+
114
+ foreach ($this->handlers as $handler) {
115
+ $handler->close();
116
+ }
117
+ }
118
+
119
+ /**
120
+ * {@inheritDoc}
121
+ */
122
+ public function setFormatter(FormatterInterface $formatter): HandlerInterface
123
+ {
124
+ foreach ($this->handlers as $handler) {
125
+ if ($handler instanceof FormattableHandlerInterface) {
126
+ $handler->setFormatter($formatter);
127
+ }
128
+ }
129
+
130
+ return $this;
131
+ }
132
+ }
vendor/monolog/monolog/src/Monolog/Handler/Handler.php ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ /**
15
+ * Base Handler class providing basic close() support as well as handleBatch
16
+ *
17
+ * @author Jordi Boggiano <j.boggiano@seld.be>
18
+ */
19
+ abstract class Handler implements HandlerInterface
20
+ {
21
+ /**
22
+ * {@inheritDoc}
23
+ */
24
+ public function handleBatch(array $records): void
25
+ {
26
+ foreach ($records as $record) {
27
+ $this->handle($record);
28
+ }
29
+ }
30
+
31
+ /**
32
+ * {@inheritDoc}
33
+ */
34
+ public function close(): void
35
+ {
36
+ }
37
+
38
+ public function __destruct()
39
+ {
40
+ try {
41
+ $this->close();
42
+ } catch (\Throwable $e) {
43
+ // do nothing
44
+ }
45
+ }
46
+
47
+ public function __sleep()
48
+ {
49
+ $this->close();
50
+
51
+ $reflClass = new \ReflectionClass($this);
52
+
53
+ $keys = [];
54
+ foreach ($reflClass->getProperties() as $reflProp) {
55
+ if (!$reflProp->isStatic()) {
56
+ $keys[] = $reflProp->getName();
57
+ }
58
+ }
59
+
60
+ return $keys;
61
+ }
62
+ }
vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ /**
15
+ * Interface that all Monolog Handlers must implement
16
+ *
17
+ * @author Jordi Boggiano <j.boggiano@seld.be>
18
+ *
19
+ * @phpstan-import-type Record from \Monolog\Logger
20
+ * @phpstan-import-type Level from \Monolog\Logger
21
+ */
22
+ interface HandlerInterface
23
+ {
24
+ /**
25
+ * Checks whether the given record will be handled by this handler.
26
+ *
27
+ * This is mostly done for performance reasons, to avoid calling processors for nothing.
28
+ *
29
+ * Handlers should still check the record levels within handle(), returning false in isHandling()
30
+ * is no guarantee that handle() will not be called, and isHandling() might not be called
31
+ * for a given record.
32
+ *
33
+ * @param array $record Partial log record containing only a level key
34
+ *
35
+ * @return bool
36
+ *
37
+ * @phpstan-param array{level: Level} $record
38
+ */
39
+ public function isHandling(array $record): bool;
40
+
41
+ /**
42
+ * Handles a record.
43
+ *
44
+ * All records may be passed to this method, and the handler should discard
45
+ * those that it does not want to handle.
46
+ *
47
+ * The return value of this function controls the bubbling process of the handler stack.
48
+ * Unless the bubbling is interrupted (by returning true), the Logger class will keep on
49
+ * calling further handlers in the stack with a given log record.
50
+ *
51
+ * @param array $record The record to handle
52
+ * @return bool true means that this handler handled the record, and that bubbling is not permitted.
53
+ * false means the record was either not processed or that this handler allows bubbling.
54
+ *
55
+ * @phpstan-param Record $record
56
+ */
57
+ public function handle(array $record): bool;
58
+
59
+ /**
60
+ * Handles a set of records at once.
61
+ *
62
+ * @param array $records The records to handle (an array of record arrays)
63
+ *
64
+ * @phpstan-param Record[] $records
65
+ */
66
+ public function handleBatch(array $records): void;
67
+
68
+ /**
69
+ * Closes the handler.
70
+ *
71
+ * Ends a log cycle and frees all resources used by the handler.
72
+ *
73
+ * Closing a Handler means flushing all buffers and freeing any open resources/handles.
74
+ *
75
+ * Implementations have to be idempotent (i.e. it should be possible to call close several times without breakage)
76
+ * and ideally handlers should be able to reopen themselves on handle() after they have been closed.
77
+ *
78
+ * This is useful at the end of a request and will be called automatically when the object
79
+ * is destroyed if you extend Monolog\Handler\Handler.
80
+ *
81
+ * If you are thinking of calling this method yourself, most likely you should be
82
+ * calling ResettableInterface::reset instead. Have a look.
83
+ */
84
+ public function close(): void;
85
+ }
vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php ADDED
@@ -0,0 +1,136 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\ResettableInterface;
15
+ use Monolog\Formatter\FormatterInterface;
16
+
17
+ /**
18
+ * This simple wrapper class can be used to extend handlers functionality.
19
+ *
20
+ * Example: A custom filtering that can be applied to any handler.
21
+ *
22
+ * Inherit from this class and override handle() like this:
23
+ *
24
+ * public function handle(array $record)
25
+ * {
26
+ * if ($record meets certain conditions) {
27
+ * return false;
28
+ * }
29
+ * return $this->handler->handle($record);
30
+ * }
31
+ *
32
+ * @author Alexey Karapetov <alexey@karapetov.com>
33
+ */
34
+ class HandlerWrapper implements HandlerInterface, ProcessableHandlerInterface, FormattableHandlerInterface, ResettableInterface
35
+ {
36
+ /**
37
+ * @var HandlerInterface
38
+ */
39
+ protected $handler;
40
+
41
+ public function __construct(HandlerInterface $handler)
42
+ {
43
+ $this->handler = $handler;
44
+ }
45
+
46
+ /**
47
+ * {@inheritDoc}
48
+ */
49
+ public function isHandling(array $record): bool
50
+ {
51
+ return $this->handler->isHandling($record);
52
+ }
53
+
54
+ /**
55
+ * {@inheritDoc}
56
+ */
57
+ public function handle(array $record): bool
58
+ {
59
+ return $this->handler->handle($record);
60
+ }
61
+
62
+ /**
63
+ * {@inheritDoc}
64
+ */
65
+ public function handleBatch(array $records): void
66
+ {
67
+ $this->handler->handleBatch($records);
68
+ }
69
+
70
+ /**
71
+ * {@inheritDoc}
72
+ */
73
+ public function close(): void
74
+ {
75
+ $this->handler->close();
76
+ }
77
+
78
+ /**
79
+ * {@inheritDoc}
80
+ */
81
+ public function pushProcessor(callable $callback): HandlerInterface
82
+ {
83
+ if ($this->handler instanceof ProcessableHandlerInterface) {
84
+ $this->handler->pushProcessor($callback);
85
+
86
+ return $this;
87
+ }
88
+
89
+ throw new \LogicException('The wrapped handler does not implement ' . ProcessableHandlerInterface::class);
90
+ }
91
+
92
+ /**
93
+ * {@inheritDoc}
94
+ */
95
+ public function popProcessor(): callable
96
+ {
97
+ if ($this->handler instanceof ProcessableHandlerInterface) {
98
+ return $this->handler->popProcessor();
99
+ }
100
+
101
+ throw new \LogicException('The wrapped handler does not implement ' . ProcessableHandlerInterface::class);
102
+ }
103
+
104
+ /**
105
+ * {@inheritDoc}
106
+ */
107
+ public function setFormatter(FormatterInterface $formatter): HandlerInterface
108
+ {
109
+ if ($this->handler instanceof FormattableHandlerInterface) {
110
+ $this->handler->setFormatter($formatter);
111
+
112
+ return $this;
113
+ }
114
+
115
+ throw new \LogicException('The wrapped handler does not implement ' . FormattableHandlerInterface::class);
116
+ }
117
+
118
+ /**
119
+ * {@inheritDoc}
120
+ */
121
+ public function getFormatter(): FormatterInterface
122
+ {
123
+ if ($this->handler instanceof FormattableHandlerInterface) {
124
+ return $this->handler->getFormatter();
125
+ }
126
+
127
+ throw new \LogicException('The wrapped handler does not implement ' . FormattableHandlerInterface::class);
128
+ }
129
+
130
+ public function reset()
131
+ {
132
+ if ($this->handler instanceof ResettableInterface) {
133
+ $this->handler->reset();
134
+ }
135
+ }
136
+ }
vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Logger;
15
+ use Monolog\Utils;
16
+
17
+ /**
18
+ * IFTTTHandler uses cURL to trigger IFTTT Maker actions
19
+ *
20
+ * Register a secret key and trigger/event name at https://ifttt.com/maker
21
+ *
22
+ * value1 will be the channel from monolog's Logger constructor,
23
+ * value2 will be the level name (ERROR, WARNING, ..)
24
+ * value3 will be the log record's message
25
+ *
26
+ * @author Nehal Patel <nehal@nehalpatel.me>
27
+ */
28
+ class IFTTTHandler extends AbstractProcessingHandler
29
+ {
30
+ /** @var string */
31
+ private $eventName;
32
+ /** @var string */
33
+ private $secretKey;
34
+
35
+ /**
36
+ * @param string $eventName The name of the IFTTT Maker event that should be triggered
37
+ * @param string $secretKey A valid IFTTT secret key
38
+ */
39
+ public function __construct(string $eventName, string $secretKey, $level = Logger::ERROR, bool $bubble = true)
40
+ {
41
+ if (!extension_loaded('curl')) {
42
+ throw new MissingExtensionException('The curl extension is needed to use the IFTTTHandler');
43
+ }
44
+
45
+ $this->eventName = $eventName;
46
+ $this->secretKey = $secretKey;
47
+
48
+ parent::__construct($level, $bubble);
49
+ }
50
+
51
+ /**
52
+ * {@inheritDoc}
53
+ */
54
+ public function write(array $record): void
55
+ {
56
+ $postData = [
57
+ "value1" => $record["channel"],
58
+ "value2" => $record["level_name"],
59
+ "value3" => $record["message"],
60
+ ];
61
+ $postString = Utils::jsonEncode($postData);
62
+
63
+ $ch = curl_init();
64
+ curl_setopt($ch, CURLOPT_URL, "https://maker.ifttt.com/trigger/" . $this->eventName . "/with/key/" . $this->secretKey);
65
+ curl_setopt($ch, CURLOPT_POST, true);
66
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
67
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $postString);
68
+ curl_setopt($ch, CURLOPT_HTTPHEADER, [
69
+ "Content-Type: application/json",
70
+ ]);
71
+
72
+ Curl\Util::execute($ch);
73
+ }
74
+ }
vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Logger;
15
+
16
+ /**
17
+ * Inspired on LogEntriesHandler.
18
+ *
19
+ * @author Robert Kaufmann III <rok3@rok3.me>
20
+ * @author Gabriel Machado <gabriel.ms1@hotmail.com>
21
+ */
22
+ class InsightOpsHandler extends SocketHandler
23
+ {
24
+ /**
25
+ * @var string
26
+ */
27
+ protected $logToken;
28
+
29
+ /**
30
+ * @param string $token Log token supplied by InsightOps
31
+ * @param string $region Region where InsightOps account is hosted. Could be 'us' or 'eu'.
32
+ * @param bool $useSSL Whether or not SSL encryption should be used
33
+ *
34
+ * @throws MissingExtensionException If SSL encryption is set to true and OpenSSL is missing
35
+ */
36
+ public function __construct(
37
+ string $token,
38
+ string $region = 'us',
39
+ bool $useSSL = true,
40
+ $level = Logger::DEBUG,
41
+ bool $bubble = true,
42
+ bool $persistent = false,
43
+ float $timeout = 0.0,
44
+ float $writingTimeout = 10.0,
45
+ ?float $connectionTimeout = null,
46
+ ?int $chunkSize = null
47
+ ) {
48
+ if ($useSSL && !extension_loaded('openssl')) {
49
+ throw new MissingExtensionException('The OpenSSL PHP plugin is required to use SSL encrypted connection for InsightOpsHandler');
50
+ }
51
+
52
+ $endpoint = $useSSL
53
+ ? 'ssl://' . $region . '.data.logs.insight.rapid7.com:443'
54
+ : $region . '.data.logs.insight.rapid7.com:80';
55
+
56
+ parent::__construct(
57
+ $endpoint,
58
+ $level,
59
+ $bubble,
60
+ $persistent,
61
+ $timeout,
62
+ $writingTimeout,
63
+ $connectionTimeout,
64
+ $chunkSize
65
+ );
66
+ $this->logToken = $token;
67
+ }
68
+
69
+ /**
70
+ * {@inheritDoc}
71
+ */
72
+ protected function generateDataStream(array $record): string
73
+ {
74
+ return $this->logToken . ' ' . $record['formatted'];
75
+ }
76
+ }
vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Logger;
15
+
16
+ /**
17
+ * @author Robert Kaufmann III <rok3@rok3.me>
18
+ */
19
+ class LogEntriesHandler extends SocketHandler
20
+ {
21
+ /**
22
+ * @var string
23
+ */
24
+ protected $logToken;
25
+
26
+ /**
27
+ * @param string $token Log token supplied by LogEntries
28
+ * @param bool $useSSL Whether or not SSL encryption should be used.
29
+ * @param string $host Custom hostname to send the data to if needed
30
+ *
31
+ * @throws MissingExtensionException If SSL encryption is set to true and OpenSSL is missing
32
+ */
33
+ public function __construct(
34
+ string $token,
35
+ bool $useSSL = true,
36
+ $level = Logger::DEBUG,
37
+ bool $bubble = true,
38
+ string $host = 'data.logentries.com',
39
+ bool $persistent = false,
40
+ float $timeout = 0.0,
41
+ float $writingTimeout = 10.0,
42
+ ?float $connectionTimeout = null,
43
+ ?int $chunkSize = null
44
+ ) {
45
+ if ($useSSL && !extension_loaded('openssl')) {
46
+ throw new MissingExtensionException('The OpenSSL PHP plugin is required to use SSL encrypted connection for LogEntriesHandler');
47
+ }
48
+
49
+ $endpoint = $useSSL ? 'ssl://' . $host . ':443' : $host . ':80';
50
+ parent::__construct(
51
+ $endpoint,
52
+ $level,
53
+ $bubble,
54
+ $persistent,
55
+ $timeout,
56
+ $writingTimeout,
57
+ $connectionTimeout,
58
+ $chunkSize
59
+ );
60
+ $this->logToken = $token;
61
+ }
62
+
63
+ /**
64
+ * {@inheritDoc}
65
+ */
66
+ protected function generateDataStream(array $record): string
67
+ {
68
+ return $this->logToken . ' ' . $record['formatted'];
69
+ }
70
+ }
vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php ADDED
@@ -0,0 +1,160 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Logger;
15
+ use Monolog\Formatter\FormatterInterface;
16
+ use Monolog\Formatter\LogglyFormatter;
17
+ use function array_key_exists;
18
+ use CurlHandle;
19
+
20
+ /**
21
+ * Sends errors to Loggly.
22
+ *
23
+ * @author Przemek Sobstel <przemek@sobstel.org>
24
+ * @author Adam Pancutt <adam@pancutt.com>
25
+ * @author Gregory Barchard <gregory@barchard.net>
26
+ */
27
+ class LogglyHandler extends AbstractProcessingHandler
28
+ {
29
+ protected const HOST = 'logs-01.loggly.com';
30
+ protected const ENDPOINT_SINGLE = 'inputs';
31
+ protected const ENDPOINT_BATCH = 'bulk';
32
+
33
+ /**
34
+ * Caches the curl handlers for every given endpoint.
35
+ *
36
+ * @var resource[]|CurlHandle[]
37
+ */
38
+ protected $curlHandlers = [];
39
+
40
+ /** @var string */
41
+ protected $token;
42
+
43
+ /** @var string[] */
44
+ protected $tag = [];
45
+
46
+ /**
47
+ * @param string $token API token supplied by Loggly
48
+ *
49
+ * @throws MissingExtensionException If the curl extension is missing
50
+ */
51
+ public function __construct(string $token, $level = Logger::DEBUG, bool $bubble = true)
52
+ {
53
+ if (!extension_loaded('curl')) {
54
+ throw new MissingExtensionException('The curl extension is needed to use the LogglyHandler');
55
+ }
56
+
57
+ $this->token = $token;
58
+
59
+ parent::__construct($level, $bubble);
60
+ }
61
+
62
+ /**
63
+ * Loads and returns the shared curl handler for the given endpoint.
64
+ *
65
+ * @param string $endpoint
66
+ *
67
+ * @return resource|CurlHandle
68
+ */
69
+ protected function getCurlHandler(string $endpoint)
70
+ {
71
+ if (!array_key_exists($endpoint, $this->curlHandlers)) {
72
+ $this->curlHandlers[$endpoint] = $this->loadCurlHandle($endpoint);
73
+ }
74
+
75
+ return $this->curlHandlers[$endpoint];
76
+ }
77
+
78
+ /**
79
+ * Starts a fresh curl session for the given endpoint and returns its handler.
80
+ *
81
+ * @param string $endpoint
82
+ *
83
+ * @return resource|CurlHandle
84
+ */
85
+ private function loadCurlHandle(string $endpoint)
86
+ {
87
+ $url = sprintf("https://%s/%s/%s/", static::HOST, $endpoint, $this->token);
88
+
89
+ $ch = curl_init();
90
+
91
+ curl_setopt($ch, CURLOPT_URL, $url);
92
+ curl_setopt($ch, CURLOPT_POST, true);
93
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
94
+
95
+ return $ch;
96
+ }
97
+
98
+ /**
99
+ * @param string[]|string $tag
100
+ */
101
+ public function setTag($tag): self
102
+ {
103
+ $tag = !empty($tag) ? $tag : [];
104
+ $this->tag = is_array($tag) ? $tag : [$tag];
105
+
106
+ return $this;
107
+ }
108
+
109
+ /**
110
+ * @param string[]|string $tag
111
+ */
112
+ public function addTag($tag): self
113
+ {
114
+ if (!empty($tag)) {
115
+ $tag = is_array($tag) ? $tag : [$tag];
116
+ $this->tag = array_unique(array_merge($this->tag, $tag));
117
+ }
118
+
119
+ return $this;
120
+ }
121
+
122
+ protected function write(array $record): void
123
+ {
124
+ $this->send($record["formatted"], static::ENDPOINT_SINGLE);
125
+ }
126
+
127
+ public function handleBatch(array $records): void
128
+ {
129
+ $level = $this->level;
130
+
131
+ $records = array_filter($records, function ($record) use ($level) {
132
+ return ($record['level'] >= $level);
133
+ });
134
+
135
+ if ($records) {
136
+ $this->send($this->getFormatter()->formatBatch($records), static::ENDPOINT_BATCH);
137
+ }
138
+ }
139
+
140
+ protected function send(string $data, string $endpoint): void
141
+ {
142
+ $ch = $this->getCurlHandler($endpoint);
143
+
144
+ $headers = ['Content-Type: application/json'];
145
+
146
+ if (!empty($this->tag)) {
147
+ $headers[] = 'X-LOGGLY-TAG: '.implode(',', $this->tag);
148
+ }
149
+
150
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
151
+ curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
152
+
153
+ Curl\Util::execute($ch, 5, false);
154
+ }
155
+
156
+ protected function getDefaultFormatter(): FormatterInterface
157
+ {
158
+ return new LogglyFormatter();
159
+ }
160
+ }
vendor/monolog/monolog/src/Monolog/Handler/LogmaticHandler.php ADDED
@@ -0,0 +1,106 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Logger;
15
+ use Monolog\Formatter\FormatterInterface;
16
+ use Monolog\Formatter\LogmaticFormatter;
17
+
18
+ /**
19
+ * @author Julien Breux <julien.breux@gmail.com>
20
+ */
21
+ class LogmaticHandler extends SocketHandler
22
+ {
23
+ /**
24
+ * @var string
25
+ */
26
+ private $logToken;
27
+
28
+ /**
29
+ * @var string
30
+ */
31
+ private $hostname;
32
+
33
+ /**
34
+ * @var string
35
+ */
36
+ private $appname;
37
+
38
+ /**
39
+ * @param string $token Log token supplied by Logmatic.
40
+ * @param string $hostname Host name supplied by Logmatic.
41
+ * @param string $appname Application name supplied by Logmatic.
42
+ * @param bool $useSSL Whether or not SSL encryption should be used.
43
+ *
44
+ * @throws MissingExtensionException If SSL encryption is set to true and OpenSSL is missing
45
+ */
46
+ public function __construct(
47
+ string $token,
48
+ string $hostname = '',
49
+ string $appname = '',
50
+ bool $useSSL = true,
51
+ $level = Logger::DEBUG,
52
+ bool $bubble = true,
53
+ bool $persistent = false,
54
+ float $timeout = 0.0,
55
+ float $writingTimeout = 10.0,
56
+ ?float $connectionTimeout = null,
57
+ ?int $chunkSize = null
58
+ ) {
59
+ if ($useSSL && !extension_loaded('openssl')) {
60
+ throw new MissingExtensionException('The OpenSSL PHP extension is required to use SSL encrypted connection for LogmaticHandler');
61
+ }
62
+
63
+ $endpoint = $useSSL ? 'ssl://api.logmatic.io:10515' : 'api.logmatic.io:10514';
64
+ $endpoint .= '/v1/';
65
+
66
+ parent::__construct(
67
+ $endpoint,
68
+ $level,
69
+ $bubble,
70
+ $persistent,
71
+ $timeout,
72
+ $writingTimeout,
73
+ $connectionTimeout,
74
+ $chunkSize
75
+ );
76
+
77
+ $this->logToken = $token;
78
+ $this->hostname = $hostname;
79
+ $this->appname = $appname;
80
+ }
81
+
82
+ /**
83
+ * {@inheritDoc}
84
+ */
85
+ protected function generateDataStream(array $record): string
86
+ {
87
+ return $this->logToken . ' ' . $record['formatted'];
88
+ }
89
+
90
+ /**
91
+ * {@inheritDoc}
92
+ */
93
+ protected function getDefaultFormatter(): FormatterInterface
94
+ {
95
+ $formatter = new LogmaticFormatter();
96
+
97
+ if (!empty($this->hostname)) {
98
+ $formatter->setHostname($this->hostname);
99
+ }
100
+ if (!empty($this->appname)) {
101
+ $formatter->setAppname($this->appname);
102
+ }
103
+
104
+ return $formatter;
105
+ }
106
+ }
vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php ADDED
@@ -0,0 +1,95 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Formatter\FormatterInterface;
15
+ use Monolog\Formatter\HtmlFormatter;
16
+
17
+ /**
18
+ * Base class for all mail handlers
19
+ *
20
+ * @author Gyula Sallai
21
+ *
22
+ * @phpstan-import-type Record from \Monolog\Logger
23
+ */
24
+ abstract class MailHandler extends AbstractProcessingHandler
25
+ {
26
+ /**
27
+ * {@inheritDoc}
28
+ */
29
+ public function handleBatch(array $records): void
30
+ {
31
+ $messages = [];
32
+
33
+ foreach ($records as $record) {
34
+ if ($record['level'] < $this->level) {
35
+ continue;
36
+ }
37
+ /** @var Record $message */
38
+ $message = $this->processRecord($record);
39
+ $messages[] = $message;
40
+ }
41
+
42
+ if (!empty($messages)) {
43
+ $this->send((string) $this->getFormatter()->formatBatch($messages), $messages);
44
+ }
45
+ }
46
+
47
+ /**
48
+ * Send a mail with the given content
49
+ *
50
+ * @param string $content formatted email body to be sent
51
+ * @param array $records the array of log records that formed this content
52
+ *
53
+ * @phpstan-param Record[] $records
54
+ */
55
+ abstract protected function send(string $content, array $records): void;
56
+
57
+ /**
58
+ * {@inheritDoc}
59
+ */
60
+ protected function write(array $record): void
61
+ {
62
+ $this->send((string) $record['formatted'], [$record]);
63
+ }
64
+
65
+ /**
66
+ * @phpstan-param non-empty-array<Record> $records
67
+ * @phpstan-return Record
68
+ */
69
+ protected function getHighestRecord(array $records): array
70
+ {
71
+ $highestRecord = null;
72
+ foreach ($records as $record) {
73
+ if ($highestRecord === null || $highestRecord['level'] < $record['level']) {
74
+ $highestRecord = $record;
75
+ }
76
+ }
77
+
78
+ return $highestRecord;
79
+ }
80
+
81
+ protected function isHtmlBody(string $body): bool
82
+ {
83
+ return ($body[0] ?? null) === '<';
84
+ }
85
+
86
+ /**
87
+ * Gets the default formatter.
88
+ *
89
+ * @return FormatterInterface
90
+ */
91
+ protected function getDefaultFormatter(): FormatterInterface
92
+ {
93
+ return new HtmlFormatter();
94
+ }
95
+ }
vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Logger;
15
+ use Swift;
16
+ use Swift_Message;
17
+
18
+ /**
19
+ * MandrillHandler uses cURL to send the emails to the Mandrill API
20
+ *
21
+ * @author Adam Nicholson <adamnicholson10@gmail.com>
22
+ */
23
+ class MandrillHandler extends MailHandler
24
+ {
25
+ /** @var Swift_Message */
26
+ protected $message;
27
+ /** @var string */
28
+ protected $apiKey;
29
+
30
+ /**
31
+ * @psalm-param Swift_Message|callable(): Swift_Message $message
32
+ *
33
+ * @param string $apiKey A valid Mandrill API key
34
+ * @param callable|Swift_Message $message An example message for real messages, only the body will be replaced
35
+ */
36
+ public function __construct(string $apiKey, $message, $level = Logger::ERROR, bool $bubble = true)
37
+ {
38
+ parent::__construct($level, $bubble);
39
+
40
+ if (!$message instanceof Swift_Message && is_callable($message)) {
41
+ $message = $message();
42
+ }
43
+ if (!$message instanceof Swift_Message) {
44
+ throw new \InvalidArgumentException('You must provide either a Swift_Message instance or a callable returning it');
45
+ }
46
+ $this->message = $message;
47
+ $this->apiKey = $apiKey;
48
+ }
49
+
50
+ /**
51
+ * {@inheritDoc}
52
+ */
53
+ protected function send(string $content, array $records): void
54
+ {
55
+ $mime = 'text/plain';
56
+ if ($this->isHtmlBody($content)) {
57
+ $mime = 'text/html';
58
+ }
59
+
60
+ $message = clone $this->message;
61
+ $message->setBody($content, $mime);
62
+ /** @phpstan-ignore-next-line */
63
+ if (version_compare(Swift::VERSION, '6.0.0', '>=')) {
64
+ $message->setDate(new \DateTimeImmutable());
65
+ } else {
66
+ /** @phpstan-ignore-next-line */
67
+ $message->setDate(time());
68
+ }
69
+
70
+ $ch = curl_init();
71
+
72
+ curl_setopt($ch, CURLOPT_URL, 'https://mandrillapp.com/api/1.0/messages/send-raw.json');
73
+ curl_setopt($ch, CURLOPT_POST, 1);
74
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
75
+ curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
76
+ 'key' => $this->apiKey,
77
+ 'raw_message' => (string) $message,
78
+ 'async' => false,
79
+ ]));
80
+
81
+ Curl\Util::execute($ch);
82
+ }
83
+ }
vendor/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ /**
15
+ * Exception can be thrown if an extension for a handler is missing
16
+ *
17
+ * @author Christian Bergau <cbergau86@gmail.com>
18
+ */
19
+ class MissingExtensionException extends \Exception
20
+ {
21
+ }
vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php ADDED
@@ -0,0 +1,86 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use MongoDB\Driver\BulkWrite;
15
+ use MongoDB\Driver\Manager;
16
+ use MongoDB\Client;
17
+ use Monolog\Logger;
18
+ use Monolog\Formatter\FormatterInterface;
19
+ use Monolog\Formatter\MongoDBFormatter;
20
+
21
+ /**
22
+ * Logs to a MongoDB database.
23
+ *
24
+ * Usage example:
25
+ *
26
+ * $log = new \Monolog\Logger('application');
27
+ * $client = new \MongoDB\Client('mongodb://localhost:27017');
28
+ * $mongodb = new \Monolog\Handler\MongoDBHandler($client, 'logs', 'prod');
29
+ * $log->pushHandler($mongodb);
30
+ *
31
+ * The above examples uses the MongoDB PHP library's client class; however, the
32
+ * MongoDB\Driver\Manager class from ext-mongodb is also supported.
33
+ */
34
+ class MongoDBHandler extends AbstractProcessingHandler
35
+ {
36
+ /** @var \MongoDB\Collection */
37
+ private $collection;
38
+ /** @var Client|Manager */
39
+ private $manager;
40
+ /** @var string */
41
+ private $namespace;
42
+
43
+ /**
44
+ * Constructor.
45
+ *
46
+ * @param Client|Manager $mongodb MongoDB library or driver client
47
+ * @param string $database Database name
48
+ * @param string $collection Collection name
49
+ */
50
+ public function __construct($mongodb, string $database, string $collection, $level = Logger::DEBUG, bool $bubble = true)
51
+ {
52
+ if (!($mongodb instanceof Client || $mongodb instanceof Manager)) {
53
+ throw new \InvalidArgumentException('MongoDB\Client or MongoDB\Driver\Manager instance required');
54
+ }
55
+
56
+ if ($mongodb instanceof Client) {
57
+ $this->collection = $mongodb->selectCollection($database, $collection);
58
+ } else {
59
+ $this->manager = $mongodb;
60
+ $this->namespace = $database . '.' . $collection;
61
+ }
62
+
63
+ parent::__construct($level, $bubble);
64
+ }
65
+
66
+ protected function write(array $record): void
67
+ {
68
+ if (isset($this->collection)) {
69
+ $this->collection->insertOne($record['formatted']);
70
+ }
71
+
72
+ if (isset($this->manager, $this->namespace)) {
73
+ $bulk = new BulkWrite;
74
+ $bulk->insert($record["formatted"]);
75
+ $this->manager->executeBulkWrite($this->namespace, $bulk);
76
+ }
77
+ }
78
+
79
+ /**
80
+ * {@inheritDoc}
81
+ */
82
+ protected function getDefaultFormatter(): FormatterInterface
83
+ {
84
+ return new MongoDBFormatter;
85
+ }
86
+ }
vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php ADDED
@@ -0,0 +1,174 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Logger;
15
+ use Monolog\Formatter\LineFormatter;
16
+
17
+ /**
18
+ * NativeMailerHandler uses the mail() function to send the emails
19
+ *
20
+ * @author Christophe Coevoet <stof@notk.org>
21
+ * @author Mark Garrett <mark@moderndeveloperllc.com>
22
+ */
23
+ class NativeMailerHandler extends MailHandler
24
+ {
25
+ /**
26
+ * The email addresses to which the message will be sent
27
+ * @var string[]
28
+ */
29
+ protected $to;
30
+
31
+ /**
32
+ * The subject of the email
33
+ * @var string
34
+ */
35
+ protected $subject;
36
+
37
+ /**
38
+ * Optional headers for the message
39
+ * @var string[]
40
+ */
41
+ protected $headers = [];
42
+
43
+ /**
44
+ * Optional parameters for the message
45
+ * @var string[]
46
+ */
47
+ protected $parameters = [];
48
+
49
+ /**
50
+ * The wordwrap length for the message
51
+ * @var int
52
+ */
53
+ protected $maxColumnWidth;
54
+
55
+ /**
56
+ * The Content-type for the message
57
+ * @var string|null
58
+ */
59
+ protected $contentType;
60
+
61
+ /**
62
+ * The encoding for the message
63
+ * @var string
64
+ */
65
+ protected $encoding = 'utf-8';
66
+
67
+ /**
68
+ * @param string|string[] $to The receiver of the mail
69
+ * @param string $subject The subject of the mail
70
+ * @param string $from The sender of the mail
71
+ * @param int $maxColumnWidth The maximum column width that the message lines will have
72
+ */
73
+ public function __construct($to, string $subject, string $from, $level = Logger::ERROR, bool $bubble = true, int $maxColumnWidth = 70)
74
+ {
75
+ parent::__construct($level, $bubble);
76
+ $this->to = (array) $to;
77
+ $this->subject = $subject;
78
+ $this->addHeader(sprintf('From: %s', $from));
79
+ $this->maxColumnWidth = $maxColumnWidth;
80
+ }
81
+
82
+ /**
83
+ * Add headers to the message
84
+ *
85
+ * @param string|string[] $headers Custom added headers
86
+ */
87
+ public function addHeader($headers): self
88
+ {
89
+ foreach ((array) $headers as $header) {
90
+ if (strpos($header, "\n") !== false || strpos($header, "\r") !== false) {
91
+ throw new \InvalidArgumentException('Headers can not contain newline characters for security reasons');
92
+ }
93
+ $this->headers[] = $header;
94
+ }
95
+
96
+ return $this;
97
+ }
98
+
99
+ /**
100
+ * Add parameters to the message
101
+ *
102
+ * @param string|string[] $parameters Custom added parameters
103
+ */
104
+ public function addParameter($parameters): self
105
+ {
106
+ $this->parameters = array_merge($this->parameters, (array) $parameters);
107
+
108
+ return $this;
109
+ }
110
+
111
+ /**
112
+ * {@inheritDoc}
113
+ */
114
+ protected function send(string $content, array $records): void
115
+ {
116
+ $contentType = $this->getContentType() ?: ($this->isHtmlBody($content) ? 'text/html' : 'text/plain');
117
+
118
+ if ($contentType !== 'text/html') {
119
+ $content = wordwrap($content, $this->maxColumnWidth);
120
+ }
121
+
122
+ $headers = ltrim(implode("\r\n", $this->headers) . "\r\n", "\r\n");
123
+ $headers .= 'Content-type: ' . $contentType . '; charset=' . $this->getEncoding() . "\r\n";
124
+ if ($contentType === 'text/html' && false === strpos($headers, 'MIME-Version:')) {
125
+ $headers .= 'MIME-Version: 1.0' . "\r\n";
126
+ }
127
+
128
+ $subject = $this->subject;
129
+ if ($records) {
130
+ $subjectFormatter = new LineFormatter($this->subject);
131
+ $subject = $subjectFormatter->format($this->getHighestRecord($records));
132
+ }
133
+
134
+ $parameters = implode(' ', $this->parameters);
135
+ foreach ($this->to as $to) {
136
+ mail($to, $subject, $content, $headers, $parameters);
137
+ }
138
+ }
139
+
140
+ public function getContentType(): ?string
141
+ {
142
+ return $this->contentType;
143
+ }
144
+
145
+ public function getEncoding(): string
146
+ {
147
+ return $this->encoding;
148
+ }
149
+
150
+ /**
151
+ * @param string $contentType The content type of the email - Defaults to text/plain. Use text/html for HTML messages.
152
+ */
153
+ public function setContentType(string $contentType): self
154
+ {
155
+ if (strpos($contentType, "\n") !== false || strpos($contentType, "\r") !== false) {
156
+ throw new \InvalidArgumentException('The content type can not contain newline characters to prevent email header injection');
157
+ }
158
+
159
+ $this->contentType = $contentType;
160
+
161
+ return $this;
162
+ }
163
+
164
+ public function setEncoding(string $encoding): self
165
+ {
166
+ if (strpos($encoding, "\n") !== false || strpos($encoding, "\r") !== false) {
167
+ throw new \InvalidArgumentException('The encoding can not contain newline characters to prevent email header injection');
168
+ }
169
+
170
+ $this->encoding = $encoding;
171
+
172
+ return $this;
173
+ }
174
+ }
vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php ADDED
@@ -0,0 +1,199 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Logger;
15
+ use Monolog\Utils;
16
+ use Monolog\Formatter\NormalizerFormatter;
17
+ use Monolog\Formatter\FormatterInterface;
18
+
19
+ /**
20
+ * Class to record a log on a NewRelic application.
21
+ * Enabling New Relic High Security mode may prevent capture of useful information.
22
+ *
23
+ * This handler requires a NormalizerFormatter to function and expects an array in $record['formatted']
24
+ *
25
+ * @see https://docs.newrelic.com/docs/agents/php-agent
26
+ * @see https://docs.newrelic.com/docs/accounts-partnerships/accounts/security/high-security
27
+ */
28
+ class NewRelicHandler extends AbstractProcessingHandler
29
+ {
30
+ /**
31
+ * Name of the New Relic application that will receive logs from this handler.
32
+ *
33
+ * @var ?string
34
+ */
35
+ protected $appName;
36
+
37
+ /**
38
+ * Name of the current transaction
39
+ *
40
+ * @var ?string
41
+ */
42
+ protected $transactionName;
43
+
44
+ /**
45
+ * Some context and extra data is passed into the handler as arrays of values. Do we send them as is
46
+ * (useful if we are using the API), or explode them for display on the NewRelic RPM website?
47
+ *
48
+ * @var bool
49
+ */
50
+ protected $explodeArrays;
51
+
52
+ /**
53
+ * {@inheritDoc}
54
+ *
55
+ * @param string|null $appName
56
+ * @param bool $explodeArrays
57
+ * @param string|null $transactionName
58
+ */
59
+ public function __construct(
60
+ $level = Logger::ERROR,
61
+ bool $bubble = true,
62
+ ?string $appName = null,
63
+ bool $explodeArrays = false,
64
+ ?string $transactionName = null
65
+ ) {
66
+ parent::__construct($level, $bubble);
67
+
68
+ $this->appName = $appName;
69
+ $this->explodeArrays = $explodeArrays;
70
+ $this->transactionName = $transactionName;
71
+ }
72
+
73
+ /**
74
+ * {@inheritDoc}
75
+ */
76
+ protected function write(array $record): void
77
+ {
78
+ if (!$this->isNewRelicEnabled()) {
79
+ throw new MissingExtensionException('The newrelic PHP extension is required to use the NewRelicHandler');
80
+ }
81
+
82
+ if ($appName = $this->getAppName($record['context'])) {
83
+ $this->setNewRelicAppName($appName);
84
+ }
85
+
86
+ if ($transactionName = $this->getTransactionName($record['context'])) {
87
+ $this->setNewRelicTransactionName($transactionName);
88
+ unset($record['formatted']['context']['transaction_name']);
89
+ }
90
+
91
+ if (isset($record['context']['exception']) && $record['context']['exception'] instanceof \Throwable) {
92
+ newrelic_notice_error($record['message'], $record['context']['exception']);
93
+ unset($record['formatted']['context']['exception']);
94
+ } else {
95
+ newrelic_notice_error($record['message']);
96
+ }
97
+
98
+ if (isset($record['formatted']['context']) && is_array($record['formatted']['context'])) {
99
+ foreach ($record['formatted']['context'] as $key => $parameter) {
100
+ if (is_array($parameter) && $this->explodeArrays) {
101
+ foreach ($parameter as $paramKey => $paramValue) {
102
+ $this->setNewRelicParameter('context_' . $key . '_' . $paramKey, $paramValue);
103
+ }
104
+ } else {
105
+ $this->setNewRelicParameter('context_' . $key, $parameter);
106
+ }
107
+ }
108
+ }
109
+
110
+ if (isset($record['formatted']['extra']) && is_array($record['formatted']['extra'])) {
111
+ foreach ($record['formatted']['extra'] as $key => $parameter) {
112
+ if (is_array($parameter) && $this->explodeArrays) {
113
+ foreach ($parameter as $paramKey => $paramValue) {
114
+ $this->setNewRelicParameter('extra_' . $key . '_' . $paramKey, $paramValue);
115
+ }
116
+ } else {
117
+ $this->setNewRelicParameter('extra_' . $key, $parameter);
118
+ }
119
+ }
120
+ }
121
+ }
122
+
123
+ /**
124
+ * Checks whether the NewRelic extension is enabled in the system.
125
+ *
126
+ * @return bool
127
+ */
128
+ protected function isNewRelicEnabled(): bool
129
+ {
130
+ return extension_loaded('newrelic');
131
+ }
132
+
133
+ /**
134
+ * Returns the appname where this log should be sent. Each log can override the default appname, set in this
135
+ * handler's constructor, by providing the appname in it's context.
136
+ *
137
+ * @param mixed[] $context
138
+ */
139
+ protected function getAppName(array $context): ?string
140
+ {
141
+ if (isset($context['appname'])) {
142
+ return $context['appname'];
143
+ }
144
+
145
+ return $this->appName;
146
+ }
147
+
148
+ /**
149
+ * Returns the name of the current transaction. Each log can override the default transaction name, set in this
150
+ * handler's constructor, by providing the transaction_name in it's context
151
+ *
152
+ * @param mixed[] $context
153
+ */
154
+ protected function getTransactionName(array $context): ?string
155
+ {
156
+ if (isset($context['transaction_name'])) {
157
+ return $context['transaction_name'];
158
+ }
159
+
160
+ return $this->transactionName;
161
+ }
162
+
163
+ /**
164
+ * Sets the NewRelic application that should receive this log.
165
+ */
166
+ protected function setNewRelicAppName(string $appName): void
167
+ {
168
+ newrelic_set_appname($appName);
169
+ }
170
+
171
+ /**
172
+ * Overwrites the name of the current transaction
173
+ */
174
+ protected function setNewRelicTransactionName(string $transactionName): void
175
+ {
176
+ newrelic_name_transaction($transactionName);
177
+ }
178
+
179
+ /**
180
+ * @param string $key
181
+ * @param mixed $value
182
+ */
183
+ protected function setNewRelicParameter(string $key, $value): void
184
+ {
185
+ if (null === $value || is_scalar($value)) {
186
+ newrelic_add_custom_parameter($key, $value);
187
+ } else {
188
+ newrelic_add_custom_parameter($key, Utils::jsonEncode($value, null, true));
189
+ }
190
+ }
191
+
192
+ /**
193
+ * {@inheritDoc}
194
+ */
195
+ protected function getDefaultFormatter(): FormatterInterface
196
+ {
197
+ return new NormalizerFormatter();
198
+ }
199
+ }
vendor/monolog/monolog/src/Monolog/Handler/NoopHandler.php ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ /**
15
+ * No-op
16
+ *
17
+ * This handler handles anything, but does nothing, and does not stop bubbling to the rest of the stack.
18
+ * This can be used for testing, or to disable a handler when overriding a configuration without
19
+ * influencing the rest of the stack.
20
+ *
21
+ * @author Roel Harbers <roelharbers@gmail.com>
22
+ */
23
+ class NoopHandler extends Handler
24
+ {
25
+ /**
26
+ * {@inheritDoc}
27
+ */
28
+ public function isHandling(array $record): bool
29
+ {
30
+ return true;
31
+ }
32
+
33
+ /**
34
+ * {@inheritDoc}
35
+ */
36
+ public function handle(array $record): bool
37
+ {
38
+ return false;
39
+ }
40
+ }
vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Logger;
15
+ use Psr\Log\LogLevel;
16
+
17
+ /**
18
+ * Blackhole
19
+ *
20
+ * Any record it can handle will be thrown away. This can be used
21
+ * to put on top of an existing stack to override it temporarily.
22
+ *
23
+ * @author Jordi Boggiano <j.boggiano@seld.be>
24
+ *
25
+ * @phpstan-import-type Level from \Monolog\Logger
26
+ * @phpstan-import-type LevelName from \Monolog\Logger
27
+ */
28
+ class NullHandler extends Handler
29
+ {
30
+ /**
31
+ * @var int
32
+ */
33
+ private $level;
34
+
35
+ /**
36
+ * @param string|int $level The minimum logging level at which this handler will be triggered
37
+ *
38
+ * @phpstan-param Level|LevelName|LogLevel::* $level
39
+ */
40
+ public function __construct($level = Logger::DEBUG)
41
+ {
42
+ $this->level = Logger::toMonologLevel($level);
43
+ }
44
+
45
+ /**
46
+ * {@inheritDoc}
47
+ */
48
+ public function isHandling(array $record): bool
49
+ {
50
+ return $record['level'] >= $this->level;
51
+ }
52
+
53
+ /**
54
+ * {@inheritDoc}
55
+ */
56
+ public function handle(array $record): bool
57
+ {
58
+ return $record['level'] >= $this->level;
59
+ }
60
+ }
vendor/monolog/monolog/src/Monolog/Handler/OverflowHandler.php ADDED
@@ -0,0 +1,149 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Logger;
15
+ use Monolog\Formatter\FormatterInterface;
16
+
17
+ /**
18
+ * Handler to only pass log messages when a certain threshold of number of messages is reached.
19
+ *
20
+ * This can be useful in cases of processing a batch of data, but you're for example only interested
21
+ * in case it fails catastrophically instead of a warning for 1 or 2 events. Worse things can happen, right?
22
+ *
23
+ * Usage example:
24
+ *
25
+ * ```
26
+ * $log = new Logger('application');
27
+ * $handler = new SomeHandler(...)
28
+ *
29
+ * // Pass all warnings to the handler when more than 10 & all error messages when more then 5
30
+ * $overflow = new OverflowHandler($handler, [Logger::WARNING => 10, Logger::ERROR => 5]);
31
+ *
32
+ * $log->pushHandler($overflow);
33
+ *```
34
+ *
35
+ * @author Kris Buist <krisbuist@gmail.com>
36
+ */
37
+ class OverflowHandler extends AbstractHandler implements FormattableHandlerInterface
38
+ {
39
+ /** @var HandlerInterface */
40
+ private $handler;
41
+
42
+ /** @var int[] */
43
+ private $thresholdMap = [
44
+ Logger::DEBUG => 0,
45
+ Logger::INFO => 0,
46
+ Logger::NOTICE => 0,
47
+ Logger::WARNING => 0,
48
+ Logger::ERROR => 0,
49
+ Logger::CRITICAL => 0,
50
+ Logger::ALERT => 0,
51
+ Logger::EMERGENCY => 0,
52
+ ];
53
+
54
+ /**
55
+ * Buffer of all messages passed to the handler before the threshold was reached
56
+ *
57
+ * @var mixed[][]
58
+ */
59
+ private $buffer = [];
60
+
61
+ /**
62
+ * @param HandlerInterface $handler
63
+ * @param int[] $thresholdMap Dictionary of logger level => threshold
64
+ */
65
+ public function __construct(
66
+ HandlerInterface $handler,
67
+ array $thresholdMap = [],
68
+ $level = Logger::DEBUG,
69
+ bool $bubble = true
70
+ ) {
71
+ $this->handler = $handler;
72
+ foreach ($thresholdMap as $thresholdLevel => $threshold) {
73
+ $this->thresholdMap[$thresholdLevel] = $threshold;
74
+ }
75
+ parent::__construct($level, $bubble);
76
+ }
77
+
78
+ /**
79
+ * Handles a record.
80
+ *
81
+ * All records may be passed to this method, and the handler should discard
82
+ * those that it does not want to handle.
83
+ *
84
+ * The return value of this function controls the bubbling process of the handler stack.
85
+ * Unless the bubbling is interrupted (by returning true), the Logger class will keep on
86
+ * calling further handlers in the stack with a given log record.
87
+ *
88
+ * {@inheritDoc}
89
+ */
90
+ public function handle(array $record): bool
91
+ {
92
+ if ($record['level'] < $this->level) {
93
+ return false;
94
+ }
95
+
96
+ $level = $record['level'];
97
+
98
+ if (!isset($this->thresholdMap[$level])) {
99
+ $this->thresholdMap[$level] = 0;
100
+ }
101
+
102
+ if ($this->thresholdMap[$level] > 0) {
103
+ // The overflow threshold is not yet reached, so we're buffering the record and lowering the threshold by 1
104
+ $this->thresholdMap[$level]--;
105
+ $this->buffer[$level][] = $record;
106
+
107
+ return false === $this->bubble;
108
+ }
109
+
110
+ if ($this->thresholdMap[$level] == 0) {
111
+ // This current message is breaking the threshold. Flush the buffer and continue handling the current record
112
+ foreach ($this->buffer[$level] ?? [] as $buffered) {
113
+ $this->handler->handle($buffered);
114
+ }
115
+ $this->thresholdMap[$level]--;
116
+ unset($this->buffer[$level]);
117
+ }
118
+
119
+ $this->handler->handle($record);
120
+
121
+ return false === $this->bubble;
122
+ }
123
+
124
+ /**
125
+ * {@inheritDoc}
126
+ */
127
+ public function setFormatter(FormatterInterface $formatter): HandlerInterface
128
+ {
129
+ if ($this->handler instanceof FormattableHandlerInterface) {
130
+ $this->handler->setFormatter($formatter);
131
+
132
+ return $this;
133
+ }
134
+
135
+ throw new \UnexpectedValueException('The nested handler of type '.get_class($this->handler).' does not support formatters.');
136
+ }
137
+
138
+ /**
139
+ * {@inheritDoc}
140
+ */
141
+ public function getFormatter(): FormatterInterface
142
+ {
143
+ if ($this->handler instanceof FormattableHandlerInterface) {
144
+ return $this->handler->getFormatter();
145
+ }
146
+
147
+ throw new \UnexpectedValueException('The nested handler of type '.get_class($this->handler).' does not support formatters.');
148
+ }
149
+ }
vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php ADDED
@@ -0,0 +1,263 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Formatter\LineFormatter;
15
+ use Monolog\Formatter\FormatterInterface;
16
+ use Monolog\Logger;
17
+ use Monolog\Utils;
18
+ use PhpConsole\Connector;
19
+ use PhpConsole\Handler as VendorPhpConsoleHandler;
20
+ use PhpConsole\Helper;
21
+
22
+ /**
23
+ * Monolog handler for Google Chrome extension "PHP Console"
24
+ *
25
+ * Display PHP error/debug log messages in Google Chrome console and notification popups, executes PHP code remotely
26
+ *
27
+ * Usage:
28
+ * 1. Install Google Chrome extension [now dead and removed from the chrome store]
29
+ * 2. See overview https://github.com/barbushin/php-console#overview
30
+ * 3. Install PHP Console library https://github.com/barbushin/php-console#installation
31
+ * 4. Example (result will looks like http://i.hizliresim.com/vg3Pz4.png)
32
+ *
33
+ * $logger = new \Monolog\Logger('all', array(new \Monolog\Handler\PHPConsoleHandler()));
34
+ * \Monolog\ErrorHandler::register($logger);
35
+ * echo $undefinedVar;
36
+ * $logger->debug('SELECT * FROM users', array('db', 'time' => 0.012));
37
+ * PC::debug($_SERVER); // PHP Console debugger for any type of vars
38
+ *
39
+ * @author Sergey Barbushin https://www.linkedin.com/in/barbushin
40
+ *
41
+ * @phpstan-import-type Record from \Monolog\Logger
42
+ * @deprecated Since 2.8.0 and 3.2.0, PHPConsole is abandoned and thus we will drop this handler in Monolog 4
43
+ */
44
+ class PHPConsoleHandler extends AbstractProcessingHandler
45
+ {
46
+ /** @var array<string, mixed> */
47
+ private $options = [
48
+ 'enabled' => true, // bool Is PHP Console server enabled
49
+ 'classesPartialsTraceIgnore' => ['Monolog\\'], // array Hide calls of classes started with...
50
+ 'debugTagsKeysInContext' => [0, 'tag'], // bool Is PHP Console server enabled
51
+ 'useOwnErrorsHandler' => false, // bool Enable errors handling
52
+ 'useOwnExceptionsHandler' => false, // bool Enable exceptions handling
53
+ 'sourcesBasePath' => null, // string Base path of all project sources to strip in errors source paths
54
+ 'registerHelper' => true, // bool Register PhpConsole\Helper that allows short debug calls like PC::debug($var, 'ta.g.s')
55
+ 'serverEncoding' => null, // string|null Server internal encoding
56
+ 'headersLimit' => null, // int|null Set headers size limit for your web-server
57
+ 'password' => null, // string|null Protect PHP Console connection by password
58
+ 'enableSslOnlyMode' => false, // bool Force connection by SSL for clients with PHP Console installed
59
+ 'ipMasks' => [], // array Set IP masks of clients that will be allowed to connect to PHP Console: array('192.168.*.*', '127.0.0.1')
60
+ 'enableEvalListener' => false, // bool Enable eval request to be handled by eval dispatcher(if enabled, 'password' option is also required)
61
+ 'dumperDetectCallbacks' => false, // bool Convert callback items in dumper vars to (callback SomeClass::someMethod) strings
62
+ 'dumperLevelLimit' => 5, // int Maximum dumped vars array or object nested dump level
63
+ 'dumperItemsCountLimit' => 100, // int Maximum dumped var same level array items or object properties number
64
+ 'dumperItemSizeLimit' => 5000, // int Maximum length of any string or dumped array item
65
+ 'dumperDumpSizeLimit' => 500000, // int Maximum approximate size of dumped vars result formatted in JSON
66
+ 'detectDumpTraceAndSource' => false, // bool Autodetect and append trace data to debug
67
+ 'dataStorage' => null, // \PhpConsole\Storage|null Fixes problem with custom $_SESSION handler(see http://goo.gl/Ne8juJ)
68
+ ];
69
+
70
+ /** @var Connector */
71
+ private $connector;
72
+
73
+ /**
74
+ * @param array<string, mixed> $options See \Monolog\Handler\PHPConsoleHandler::$options for more details
75
+ * @param Connector|null $connector Instance of \PhpConsole\Connector class (optional)
76
+ * @throws \RuntimeException
77
+ */
78
+ public function __construct(array $options = [], ?Connector $connector = null, $level = Logger::DEBUG, bool $bubble = true)
79
+ {
80
+ if (!class_exists('PhpConsole\Connector')) {
81
+ throw new \RuntimeException('PHP Console library not found. See https://github.com/barbushin/php-console#installation');
82
+ }
83
+ parent::__construct($level, $bubble);
84
+ $this->options = $this->initOptions($options);
85
+ $this->connector = $this->initConnector($connector);
86
+ }
87
+
88
+ /**
89
+ * @param array<string, mixed> $options
90
+ *
91
+ * @return array<string, mixed>
92
+ */
93
+ private function initOptions(array $options): array
94
+ {
95
+ $wrongOptions = array_diff(array_keys($options), array_keys($this->options));
96
+ if ($wrongOptions) {
97
+ throw new \RuntimeException('Unknown options: ' . implode(', ', $wrongOptions));
98
+ }
99
+
100
+ return array_replace($this->options, $options);
101
+ }
102
+
103
+ private function initConnector(?Connector $connector = null): Connector
104
+ {
105
+ if (!$connector) {
106
+ if ($this->options['dataStorage']) {
107
+ Connector::setPostponeStorage($this->options['dataStorage']);
108
+ }
109
+ $connector = Connector::getInstance();
110
+ }
111
+
112
+ if ($this->options['registerHelper'] && !Helper::isRegistered()) {
113
+ Helper::register();
114
+ }
115
+
116
+ if ($this->options['enabled'] && $connector->isActiveClient()) {
117
+ if ($this->options['useOwnErrorsHandler'] || $this->options['useOwnExceptionsHandler']) {
118
+ $handler = VendorPhpConsoleHandler::getInstance();
119
+ $handler->setHandleErrors($this->options['useOwnErrorsHandler']);
120
+ $handler->setHandleExceptions($this->options['useOwnExceptionsHandler']);
121
+ $handler->start();
122
+ }
123
+ if ($this->options['sourcesBasePath']) {
124
+ $connector->setSourcesBasePath($this->options['sourcesBasePath']);
125
+ }
126
+ if ($this->options['serverEncoding']) {
127
+ $connector->setServerEncoding($this->options['serverEncoding']);
128
+ }
129
+ if ($this->options['password']) {
130
+ $connector->setPassword($this->options['password']);
131
+ }
132
+ if ($this->options['enableSslOnlyMode']) {
133
+ $connector->enableSslOnlyMode();
134
+ }
135
+ if ($this->options['ipMasks']) {
136
+ $connector->setAllowedIpMasks($this->options['ipMasks']);
137
+ }
138
+ if ($this->options['headersLimit']) {
139
+ $connector->setHeadersLimit($this->options['headersLimit']);
140
+ }
141
+ if ($this->options['detectDumpTraceAndSource']) {
142
+ $connector->getDebugDispatcher()->detectTraceAndSource = true;
143
+ }
144
+ $dumper = $connector->getDumper();
145
+ $dumper->levelLimit = $this->options['dumperLevelLimit'];
146
+ $dumper->itemsCountLimit = $this->options['dumperItemsCountLimit'];
147
+ $dumper->itemSizeLimit = $this->options['dumperItemSizeLimit'];
148
+ $dumper->dumpSizeLimit = $this->options['dumperDumpSizeLimit'];
149
+ $dumper->detectCallbacks = $this->options['dumperDetectCallbacks'];
150
+ if ($this->options['enableEvalListener']) {
151
+ $connector->startEvalRequestsListener();
152
+ }
153
+ }
154
+
155
+ return $connector;
156
+ }
157
+
158
+ public function getConnector(): Connector
159
+ {
160
+ return $this->connector;
161
+ }
162
+
163
+ /**
164
+ * @return array<string, mixed>
165
+ */
166
+ public function getOptions(): array
167
+ {
168
+ return $this->options;
169
+ }
170
+
171
+ public function handle(array $record): bool
172
+ {
173
+ if ($this->options['enabled'] && $this->connector->isActiveClient()) {
174
+ return parent::handle($record);
175
+ }
176
+
177
+ return !$this->bubble;
178
+ }
179
+
180
+ /**
181
+ * Writes the record down to the log of the implementing handler
182
+ */
183
+ protected function write(array $record): void
184
+ {
185
+ if ($record['level'] < Logger::NOTICE) {
186
+ $this->handleDebugRecord($record);
187
+ } elseif (isset($record['context']['exception']) && $record['context']['exception'] instanceof \Throwable) {
188
+ $this->handleExceptionRecord($record);
189
+ } else {
190
+ $this->handleErrorRecord($record);
191
+ }
192
+ }
193
+
194
+ /**
195
+ * @phpstan-param Record $record
196
+ */
197
+ private function handleDebugRecord(array $record): void
198
+ {
199
+ $tags = $this->getRecordTags($record);
200
+ $message = $record['message'];
201
+ if ($record['context']) {
202
+ $message .= ' ' . Utils::jsonEncode($this->connector->getDumper()->dump(array_filter($record['context'])), null, true);
203
+ }
204
+ $this->connector->getDebugDispatcher()->dispatchDebug($message, $tags, $this->options['classesPartialsTraceIgnore']);
205
+ }
206
+
207
+ /**
208
+ * @phpstan-param Record $record
209
+ */
210
+ private function handleExceptionRecord(array $record): void
211
+ {
212
+ $this->connector->getErrorsDispatcher()->dispatchException($record['context']['exception']);
213
+ }
214
+
215
+ /**
216
+ * @phpstan-param Record $record
217
+ */
218
+ private function handleErrorRecord(array $record): void
219
+ {
220
+ $context = $record['context'];
221
+
222
+ $this->connector->getErrorsDispatcher()->dispatchError(
223
+ $context['code'] ?? null,
224
+ $context['message'] ?? $record['message'],
225
+ $context['file'] ?? null,
226
+ $context['line'] ?? null,
227
+ $this->options['classesPartialsTraceIgnore']
228
+ );
229
+ }
230
+
231
+ /**
232
+ * @phpstan-param Record $record
233
+ * @return string
234
+ */
235
+ private function getRecordTags(array &$record)
236
+ {
237
+ $tags = null;
238
+ if (!empty($record['context'])) {
239
+ $context = & $record['context'];
240
+ foreach ($this->options['debugTagsKeysInContext'] as $key) {
241
+ if (!empty($context[$key])) {
242
+ $tags = $context[$key];
243
+ if ($key === 0) {
244
+ array_shift($context);
245
+ } else {
246
+ unset($context[$key]);
247
+ }
248
+ break;
249
+ }
250
+ }
251
+ }
252
+
253
+ return $tags ?: strtolower($record['level_name']);
254
+ }
255
+
256
+ /**
257
+ * {@inheritDoc}
258
+ */
259
+ protected function getDefaultFormatter(): FormatterInterface
260
+ {
261
+ return new LineFormatter('%message%');
262
+ }
263
+ }
vendor/monolog/monolog/src/Monolog/Handler/ProcessHandler.php ADDED
@@ -0,0 +1,191 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Logger;
15
+
16
+ /**
17
+ * Stores to STDIN of any process, specified by a command.
18
+ *
19
+ * Usage example:
20
+ * <pre>
21
+ * $log = new Logger('myLogger');
22
+ * $log->pushHandler(new ProcessHandler('/usr/bin/php /var/www/monolog/someScript.php'));
23
+ * </pre>
24
+ *
25
+ * @author Kolja Zuelsdorf <koljaz@web.de>
26
+ */
27
+ class ProcessHandler extends AbstractProcessingHandler
28
+ {
29
+ /**
30
+ * Holds the process to receive data on its STDIN.
31
+ *
32
+ * @var resource|bool|null
33
+ */
34
+ private $process;
35
+
36
+ /**
37
+ * @var string
38
+ */
39
+ private $command;
40
+
41
+ /**
42
+ * @var string|null
43
+ */
44
+ private $cwd;
45
+
46
+ /**
47
+ * @var resource[]
48
+ */
49
+ private $pipes = [];
50
+
51
+ /**
52
+ * @var array<int, string[]>
53
+ */
54
+ protected const DESCRIPTOR_SPEC = [
55
+ 0 => ['pipe', 'r'], // STDIN is a pipe that the child will read from
56
+ 1 => ['pipe', 'w'], // STDOUT is a pipe that the child will write to
57
+ 2 => ['pipe', 'w'], // STDERR is a pipe to catch the any errors
58
+ ];
59
+
60
+ /**
61
+ * @param string $command Command for the process to start. Absolute paths are recommended,
62
+ * especially if you do not use the $cwd parameter.
63
+ * @param string|null $cwd "Current working directory" (CWD) for the process to be executed in.
64
+ * @throws \InvalidArgumentException
65
+ */
66
+ public function __construct(string $command, $level = Logger::DEBUG, bool $bubble = true, ?string $cwd = null)
67
+ {
68
+ if ($command === '') {
69
+ throw new \InvalidArgumentException('The command argument must be a non-empty string.');
70
+ }
71
+ if ($cwd === '') {
72
+ throw new \InvalidArgumentException('The optional CWD argument must be a non-empty string or null.');
73
+ }
74
+
75
+ parent::__construct($level, $bubble);
76
+
77
+ $this->command = $command;
78
+ $this->cwd = $cwd;
79
+ }
80
+
81
+ /**
82
+ * Writes the record down to the log of the implementing handler
83
+ *
84
+ * @throws \UnexpectedValueException
85
+ */
86
+ protected function write(array $record): void
87
+ {
88
+ $this->ensureProcessIsStarted();
89
+
90
+ $this->writeProcessInput($record['formatted']);
91
+
92
+ $errors = $this->readProcessErrors();
93
+ if (empty($errors) === false) {
94
+ throw new \UnexpectedValueException(sprintf('Errors while writing to process: %s', $errors));
95
+ }
96
+ }
97
+
98
+ /**
99
+ * Makes sure that the process is actually started, and if not, starts it,
100
+ * assigns the stream pipes, and handles startup errors, if any.
101
+ */
102
+ private function ensureProcessIsStarted(): void
103
+ {
104
+ if (is_resource($this->process) === false) {
105
+ $this->startProcess();
106
+
107
+ $this->handleStartupErrors();
108
+ }
109
+ }
110
+
111
+ /**
112
+ * Starts the actual process and sets all streams to non-blocking.
113
+ */
114
+ private function startProcess(): void
115
+ {
116
+ $this->process = proc_open($this->command, static::DESCRIPTOR_SPEC, $this->pipes, $this->cwd);
117
+
118
+ foreach ($this->pipes as $pipe) {
119
+ stream_set_blocking($pipe, false);
120
+ }
121
+ }
122
+
123
+ /**
124
+ * Selects the STDERR stream, handles upcoming startup errors, and throws an exception, if any.
125
+ *
126
+ * @throws \UnexpectedValueException
127
+ */
128
+ private function handleStartupErrors(): void
129
+ {
130
+ $selected = $this->selectErrorStream();
131
+ if (false === $selected) {
132
+ throw new \UnexpectedValueException('Something went wrong while selecting a stream.');
133
+ }
134
+
135
+ $errors = $this->readProcessErrors();
136
+
137
+ if (is_resource($this->process) === false || empty($errors) === false) {
138
+ throw new \UnexpectedValueException(
139
+ sprintf('The process "%s" could not be opened: ' . $errors, $this->command)
140
+ );
141
+ }
142
+ }
143
+
144
+ /**
145
+ * Selects the STDERR stream.
146
+ *
147
+ * @return int|bool
148
+ */
149
+ protected function selectErrorStream()
150
+ {
151
+ $empty = [];
152
+ $errorPipes = [$this->pipes[2]];
153
+
154
+ return stream_select($errorPipes, $empty, $empty, 1);
155
+ }
156
+
157
+ /**
158
+ * Reads the errors of the process, if there are any.
159
+ *
160
+ * @codeCoverageIgnore
161
+ * @return string Empty string if there are no errors.
162
+ */
163
+ protected function readProcessErrors(): string
164
+ {
165
+ return (string) stream_get_contents($this->pipes[2]);
166
+ }
167
+
168
+ /**
169
+ * Writes to the input stream of the opened process.
170
+ *
171
+ * @codeCoverageIgnore
172
+ */
173
+ protected function writeProcessInput(string $string): void
174
+ {
175
+ fwrite($this->pipes[0], $string);
176
+ }
177
+
178
+ /**
179
+ * {@inheritDoc}
180
+ */
181
+ public function close(): void
182
+ {
183
+ if (is_resource($this->process)) {
184
+ foreach ($this->pipes as $pipe) {
185
+ fclose($pipe);
186
+ }
187
+ proc_close($this->process);
188
+ $this->process = null;
189
+ }
190
+ }
191
+ }
vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerInterface.php ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Processor\ProcessorInterface;
15
+
16
+ /**
17
+ * Interface to describe loggers that have processors
18
+ *
19
+ * @author Jordi Boggiano <j.boggiano@seld.be>
20
+ *
21
+ * @phpstan-import-type Record from \Monolog\Logger
22
+ */
23
+ interface ProcessableHandlerInterface
24
+ {
25
+ /**
26
+ * Adds a processor in the stack.
27
+ *
28
+ * @psalm-param ProcessorInterface|callable(Record): Record $callback
29
+ *
30
+ * @param ProcessorInterface|callable $callback
31
+ * @return HandlerInterface self
32
+ */
33
+ public function pushProcessor(callable $callback): HandlerInterface;
34
+
35
+ /**
36
+ * Removes the processor on top of the stack and returns it.
37
+ *
38
+ * @psalm-return ProcessorInterface|callable(Record): Record $callback
39
+ *
40
+ * @throws \LogicException In case the processor stack is empty
41
+ * @return callable|ProcessorInterface
42
+ */
43
+ public function popProcessor(): callable;
44
+ }
vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerTrait.php ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\ResettableInterface;
15
+ use Monolog\Processor\ProcessorInterface;
16
+
17
+ /**
18
+ * Helper trait for implementing ProcessableInterface
19
+ *
20
+ * @author Jordi Boggiano <j.boggiano@seld.be>
21
+ *
22
+ * @phpstan-import-type Record from \Monolog\Logger
23
+ */
24
+ trait ProcessableHandlerTrait
25
+ {
26
+ /**
27
+ * @var callable[]
28
+ * @phpstan-var array<ProcessorInterface|callable(Record): Record>
29
+ */
30
+ protected $processors = [];
31
+
32
+ /**
33
+ * {@inheritDoc}
34
+ */
35
+ public function pushProcessor(callable $callback): HandlerInterface
36
+ {
37
+ array_unshift($this->processors, $callback);
38
+
39
+ return $this;
40
+ }
41
+
42
+ /**
43
+ * {@inheritDoc}
44
+ */
45
+ public function popProcessor(): callable
46
+ {
47
+ if (!$this->processors) {
48
+ throw new \LogicException('You tried to pop from an empty processor stack.');
49
+ }
50
+
51
+ return array_shift($this->processors);
52
+ }
53
+
54
+ /**
55
+ * Processes a record.
56
+ *
57
+ * @phpstan-param Record $record
58
+ * @phpstan-return Record
59
+ */
60
+ protected function processRecord(array $record): array
61
+ {
62
+ foreach ($this->processors as $processor) {
63
+ $record = $processor($record);
64
+ }
65
+
66
+ return $record;
67
+ }
68
+
69
+ protected function resetProcessors(): void
70
+ {
71
+ foreach ($this->processors as $processor) {
72
+ if ($processor instanceof ResettableInterface) {
73
+ $processor->reset();
74
+ }
75
+ }
76
+ }
77
+ }
vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php ADDED
@@ -0,0 +1,95 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Logger;
15
+ use Psr\Log\LoggerInterface;
16
+ use Monolog\Formatter\FormatterInterface;
17
+
18
+ /**
19
+ * Proxies log messages to an existing PSR-3 compliant logger.
20
+ *
21
+ * If a formatter is configured, the formatter's output MUST be a string and the
22
+ * formatted message will be fed to the wrapped PSR logger instead of the original
23
+ * log record's message.
24
+ *
25
+ * @author Michael Moussa <michael.moussa@gmail.com>
26
+ */
27
+ class PsrHandler extends AbstractHandler implements FormattableHandlerInterface
28
+ {
29
+ /**
30
+ * PSR-3 compliant logger
31
+ *
32
+ * @var LoggerInterface
33
+ */
34
+ protected $logger;
35
+
36
+ /**
37
+ * @var FormatterInterface|null
38
+ */
39
+ protected $formatter;
40
+
41
+ /**
42
+ * @param LoggerInterface $logger The underlying PSR-3 compliant logger to which messages will be proxied
43
+ */
44
+ public function __construct(LoggerInterface $logger, $level = Logger::DEBUG, bool $bubble = true)
45
+ {
46
+ parent::__construct($level, $bubble);
47
+
48
+ $this->logger = $logger;
49
+ }
50
+
51
+ /**
52
+ * {@inheritDoc}
53
+ */
54
+ public function handle(array $record): bool
55
+ {
56
+ if (!$this->isHandling($record)) {
57
+ return false;
58
+ }
59
+
60
+ if ($this->formatter) {
61
+ $formatted = $this->formatter->format($record);
62
+ $this->logger->log(strtolower($record['level_name']), (string) $formatted, $record['context']);
63
+ } else {
64
+ $this->logger->log(strtolower($record['level_name']), $record['message'], $record['context']);
65
+ }
66
+
67
+ return false === $this->bubble;
68
+ }
69
+
70
+ /**
71
+ * Sets the formatter.
72
+ *
73
+ * @param FormatterInterface $formatter
74
+ */
75
+ public function setFormatter(FormatterInterface $formatter): HandlerInterface
76
+ {
77
+ $this->formatter = $formatter;
78
+
79
+ return $this;
80
+ }
81
+
82
+ /**
83
+ * Gets the formatter.
84
+ *
85
+ * @return FormatterInterface
86
+ */
87
+ public function getFormatter(): FormatterInterface
88
+ {
89
+ if (!$this->formatter) {
90
+ throw new \LogicException('No formatter has been set and this handler does not have a default formatter');
91
+ }
92
+
93
+ return $this->formatter;
94
+ }
95
+ }
vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php ADDED
@@ -0,0 +1,246 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Logger;
15
+ use Monolog\Utils;
16
+ use Psr\Log\LogLevel;
17
+
18
+ /**
19
+ * Sends notifications through the pushover api to mobile phones
20
+ *
21
+ * @author Sebastian Göttschkes <sebastian.goettschkes@googlemail.com>
22
+ * @see https://www.pushover.net/api
23
+ *
24
+ * @phpstan-import-type FormattedRecord from AbstractProcessingHandler
25
+ * @phpstan-import-type Level from \Monolog\Logger
26
+ * @phpstan-import-type LevelName from \Monolog\Logger
27
+ */
28
+ class PushoverHandler extends SocketHandler
29
+ {
30
+ /** @var string */
31
+ private $token;
32
+ /** @var array<int|string> */
33
+ private $users;
34
+ /** @var string */
35
+ private $title;
36
+ /** @var string|int|null */
37
+ private $user = null;
38
+ /** @var int */
39
+ private $retry;
40
+ /** @var int */
41
+ private $expire;
42
+
43
+ /** @var int */
44
+ private $highPriorityLevel;
45
+ /** @var int */
46
+ private $emergencyLevel;
47
+ /** @var bool */
48
+ private $useFormattedMessage = false;
49
+
50
+ /**
51
+ * All parameters that can be sent to Pushover
52
+ * @see https://pushover.net/api
53
+ * @var array<string, bool>
54
+ */
55
+ private $parameterNames = [
56
+ 'token' => true,
57
+ 'user' => true,
58
+ 'message' => true,
59
+ 'device' => true,
60
+ 'title' => true,
61
+ 'url' => true,
62
+ 'url_title' => true,
63
+ 'priority' => true,
64
+ 'timestamp' => true,
65
+ 'sound' => true,
66
+ 'retry' => true,
67
+ 'expire' => true,
68
+ 'callback' => true,
69
+ ];
70
+
71
+ /**
72
+ * Sounds the api supports by default
73
+ * @see https://pushover.net/api#sounds
74
+ * @var string[]
75
+ */
76
+ private $sounds = [
77
+ 'pushover', 'bike', 'bugle', 'cashregister', 'classical', 'cosmic', 'falling', 'gamelan', 'incoming',
78
+ 'intermission', 'magic', 'mechanical', 'pianobar', 'siren', 'spacealarm', 'tugboat', 'alien', 'climb',
79
+ 'persistent', 'echo', 'updown', 'none',
80
+ ];
81
+
82
+ /**
83
+ * @param string $token Pushover api token
84
+ * @param string|array $users Pushover user id or array of ids the message will be sent to
85
+ * @param string|null $title Title sent to the Pushover API
86
+ * @param bool $useSSL Whether to connect via SSL. Required when pushing messages to users that are not
87
+ * the pushover.net app owner. OpenSSL is required for this option.
88
+ * @param string|int $highPriorityLevel The minimum logging level at which this handler will start
89
+ * sending "high priority" requests to the Pushover API
90
+ * @param string|int $emergencyLevel The minimum logging level at which this handler will start
91
+ * sending "emergency" requests to the Pushover API
92
+ * @param int $retry The retry parameter specifies how often (in seconds) the Pushover servers will
93
+ * send the same notification to the user.
94
+ * @param int $expire The expire parameter specifies how many seconds your notification will continue
95
+ * to be retried for (every retry seconds).
96
+ *
97
+ * @phpstan-param string|array<int|string> $users
98
+ * @phpstan-param Level|LevelName|LogLevel::* $highPriorityLevel
99
+ * @phpstan-param Level|LevelName|LogLevel::* $emergencyLevel
100
+ */
101
+ public function __construct(
102
+ string $token,
103
+ $users,
104
+ ?string $title = null,
105
+ $level = Logger::CRITICAL,
106
+ bool $bubble = true,
107
+ bool $useSSL = true,
108
+ $highPriorityLevel = Logger::CRITICAL,
109
+ $emergencyLevel = Logger::EMERGENCY,
110
+ int $retry = 30,
111
+ int $expire = 25200,
112
+ bool $persistent = false,
113
+ float $timeout = 0.0,
114
+ float $writingTimeout = 10.0,
115
+ ?float $connectionTimeout = null,
116
+ ?int $chunkSize = null
117
+ ) {
118
+ $connectionString = $useSSL ? 'ssl://api.pushover.net:443' : 'api.pushover.net:80';
119
+ parent::__construct(
120
+ $connectionString,
121
+ $level,
122
+ $bubble,
123
+ $persistent,
124
+ $timeout,
125
+ $writingTimeout,
126
+ $connectionTimeout,
127
+ $chunkSize
128
+ );
129
+
130
+ $this->token = $token;
131
+ $this->users = (array) $users;
132
+ $this->title = $title ?: (string) gethostname();
133
+ $this->highPriorityLevel = Logger::toMonologLevel($highPriorityLevel);
134
+ $this->emergencyLevel = Logger::toMonologLevel($emergencyLevel);
135
+ $this->retry = $retry;
136
+ $this->expire = $expire;
137
+ }
138
+
139
+ protected function generateDataStream(array $record): string
140
+ {
141
+ $content = $this->buildContent($record);
142
+
143
+ return $this->buildHeader($content) . $content;
144
+ }
145
+
146
+ /**
147
+ * @phpstan-param FormattedRecord $record
148
+ */
149
+ private function buildContent(array $record): string
150
+ {
151
+ // Pushover has a limit of 512 characters on title and message combined.
152
+ $maxMessageLength = 512 - strlen($this->title);
153
+
154
+ $message = ($this->useFormattedMessage) ? $record['formatted'] : $record['message'];
155
+ $message = Utils::substr($message, 0, $maxMessageLength);
156
+
157
+ $timestamp = $record['datetime']->getTimestamp();
158
+
159
+ $dataArray = [
160
+ 'token' => $this->token,
161
+ 'user' => $this->user,
162
+ 'message' => $message,
163
+ 'title' => $this->title,
164
+ 'timestamp' => $timestamp,
165
+ ];
166
+
167
+ if (isset($record['level']) && $record['level'] >= $this->emergencyLevel) {
168
+ $dataArray['priority'] = 2;
169
+ $dataArray['retry'] = $this->retry;
170
+ $dataArray['expire'] = $this->expire;
171
+ } elseif (isset($record['level']) && $record['level'] >= $this->highPriorityLevel) {
172
+ $dataArray['priority'] = 1;
173
+ }
174
+
175
+ // First determine the available parameters
176
+ $context = array_intersect_key($record['context'], $this->parameterNames);
177
+ $extra = array_intersect_key($record['extra'], $this->parameterNames);
178
+
179
+ // Least important info should be merged with subsequent info
180
+ $dataArray = array_merge($extra, $context, $dataArray);
181
+
182
+ // Only pass sounds that are supported by the API
183
+ if (isset($dataArray['sound']) && !in_array($dataArray['sound'], $this->sounds)) {
184
+ unset($dataArray['sound']);
185
+ }
186
+
187
+ return http_build_query($dataArray);
188
+ }
189
+
190
+ private function buildHeader(string $content): string
191
+ {
192
+ $header = "POST /1/messages.json HTTP/1.1\r\n";
193
+ $header .= "Host: api.pushover.net\r\n";
194
+ $header .= "Content-Type: application/x-www-form-urlencoded\r\n";
195
+ $header .= "Content-Length: " . strlen($content) . "\r\n";
196
+ $header .= "\r\n";
197
+
198
+ return $header;
199
+ }
200
+
201
+ protected function write(array $record): void
202
+ {
203
+ foreach ($this->users as $user) {
204
+ $this->user = $user;
205
+
206
+ parent::write($record);
207
+ $this->closeSocket();
208
+ }
209
+
210
+ $this->user = null;
211
+ }
212
+
213
+ /**
214
+ * @param int|string $value
215
+ *
216
+ * @phpstan-param Level|LevelName|LogLevel::* $value
217
+ */
218
+ public function setHighPriorityLevel($value): self
219
+ {
220
+ $this->highPriorityLevel = Logger::toMonologLevel($value);
221
+
222
+ return $this;
223
+ }
224
+
225
+ /**
226
+ * @param int|string $value
227
+ *
228
+ * @phpstan-param Level|LevelName|LogLevel::* $value
229
+ */
230
+ public function setEmergencyLevel($value): self
231
+ {
232
+ $this->emergencyLevel = Logger::toMonologLevel($value);
233
+
234
+ return $this;
235
+ }
236
+
237
+ /**
238
+ * Use the formatted message?
239
+ */
240
+ public function useFormattedMessage(bool $value): self
241
+ {
242
+ $this->useFormattedMessage = $value;
243
+
244
+ return $this;
245
+ }
246
+ }
vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Formatter\LineFormatter;
15
+ use Monolog\Formatter\FormatterInterface;
16
+ use Monolog\Logger;
17
+
18
+ /**
19
+ * Logs to a Redis key using rpush
20
+ *
21
+ * usage example:
22
+ *
23
+ * $log = new Logger('application');
24
+ * $redis = new RedisHandler(new Predis\Client("tcp://localhost:6379"), "logs", "prod");
25
+ * $log->pushHandler($redis);
26
+ *
27
+ * @author Thomas Tourlourat <thomas@tourlourat.com>
28
+ *
29
+ * @phpstan-import-type FormattedRecord from AbstractProcessingHandler
30
+ */
31
+ class RedisHandler extends AbstractProcessingHandler
32
+ {
33
+ /** @var \Predis\Client<\Predis\Client>|\Redis */
34
+ private $redisClient;
35
+ /** @var string */
36
+ private $redisKey;
37
+ /** @var int */
38
+ protected $capSize;
39
+
40
+ /**
41
+ * @param \Predis\Client<\Predis\Client>|\Redis $redis The redis instance
42
+ * @param string $key The key name to push records to
43
+ * @param int $capSize Number of entries to limit list size to, 0 = unlimited
44
+ */
45
+ public function __construct($redis, string $key, $level = Logger::DEBUG, bool $bubble = true, int $capSize = 0)
46
+ {
47
+ if (!(($redis instanceof \Predis\Client) || ($redis instanceof \Redis))) {
48
+ throw new \InvalidArgumentException('Predis\Client or Redis instance required');
49
+ }
50
+
51
+ $this->redisClient = $redis;
52
+ $this->redisKey = $key;
53
+ $this->capSize = $capSize;
54
+
55
+ parent::__construct($level, $bubble);
56
+ }
57
+
58
+ /**
59
+ * {@inheritDoc}
60
+ */
61
+ protected function write(array $record): void
62
+ {
63
+ if ($this->capSize) {
64
+ $this->writeCapped($record);
65
+ } else {
66
+ $this->redisClient->rpush($this->redisKey, $record["formatted"]);
67
+ }
68
+ }
69
+
70
+ /**
71
+ * Write and cap the collection
72
+ * Writes the record to the redis list and caps its
73
+ *
74
+ * @phpstan-param FormattedRecord $record
75
+ */
76
+ protected function writeCapped(array $record): void
77
+ {
78
+ if ($this->redisClient instanceof \Redis) {
79
+ $mode = defined('\Redis::MULTI') ? \Redis::MULTI : 1;
80
+ $this->redisClient->multi($mode)
81
+ ->rpush($this->redisKey, $record["formatted"])
82
+ ->ltrim($this->redisKey, -$this->capSize, -1)
83
+ ->exec();
84
+ } else {
85
+ $redisKey = $this->redisKey;
86
+ $capSize = $this->capSize;
87
+ $this->redisClient->transaction(function ($tx) use ($record, $redisKey, $capSize) {
88
+ $tx->rpush($redisKey, $record["formatted"]);
89
+ $tx->ltrim($redisKey, -$capSize, -1);
90
+ });
91
+ }
92
+ }
93
+
94
+ /**
95
+ * {@inheritDoc}
96
+ */
97
+ protected function getDefaultFormatter(): FormatterInterface
98
+ {
99
+ return new LineFormatter();
100
+ }
101
+ }
vendor/monolog/monolog/src/Monolog/Handler/RedisPubSubHandler.php ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Formatter\LineFormatter;
15
+ use Monolog\Formatter\FormatterInterface;
16
+ use Monolog\Logger;
17
+
18
+ /**
19
+ * Sends the message to a Redis Pub/Sub channel using PUBLISH
20
+ *
21
+ * usage example:
22
+ *
23
+ * $log = new Logger('application');
24
+ * $redis = new RedisPubSubHandler(new Predis\Client("tcp://localhost:6379"), "logs", Logger::WARNING);
25
+ * $log->pushHandler($redis);
26
+ *
27
+ * @author Gaëtan Faugère <gaetan@fauge.re>
28
+ */
29
+ class RedisPubSubHandler extends AbstractProcessingHandler
30
+ {
31
+ /** @var \Predis\Client<\Predis\Client>|\Redis */
32
+ private $redisClient;
33
+ /** @var string */
34
+ private $channelKey;
35
+
36
+ /**
37
+ * @param \Predis\Client<\Predis\Client>|\Redis $redis The redis instance
38
+ * @param string $key The channel key to publish records to
39
+ */
40
+ public function __construct($redis, string $key, $level = Logger::DEBUG, bool $bubble = true)
41
+ {
42
+ if (!(($redis instanceof \Predis\Client) || ($redis instanceof \Redis))) {
43
+ throw new \InvalidArgumentException('Predis\Client or Redis instance required');
44
+ }
45
+
46
+ $this->redisClient = $redis;
47
+ $this->channelKey = $key;
48
+
49
+ parent::__construct($level, $bubble);
50
+ }
51
+
52
+ /**
53
+ * {@inheritDoc}
54
+ */
55
+ protected function write(array $record): void
56
+ {
57
+ $this->redisClient->publish($this->channelKey, $record["formatted"]);
58
+ }
59
+
60
+ /**
61
+ * {@inheritDoc}
62
+ */
63
+ protected function getDefaultFormatter(): FormatterInterface
64
+ {
65
+ return new LineFormatter();
66
+ }
67
+ }
vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php ADDED
@@ -0,0 +1,131 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Rollbar\RollbarLogger;
15
+ use Throwable;
16
+ use Monolog\Logger;
17
+
18
+ /**
19
+ * Sends errors to Rollbar
20
+ *
21
+ * If the context data contains a `payload` key, that is used as an array
22
+ * of payload options to RollbarLogger's log method.
23
+ *
24
+ * Rollbar's context info will contain the context + extra keys from the log record
25
+ * merged, and then on top of that a few keys:
26
+ *
27
+ * - level (rollbar level name)
28
+ * - monolog_level (monolog level name, raw level, as rollbar only has 5 but monolog 8)
29
+ * - channel
30
+ * - datetime (unix timestamp)
31
+ *
32
+ * @author Paul Statezny <paulstatezny@gmail.com>
33
+ */
34
+ class RollbarHandler extends AbstractProcessingHandler
35
+ {
36
+ /**
37
+ * @var RollbarLogger
38
+ */
39
+ protected $rollbarLogger;
40
+
41
+ /** @var string[] */
42
+ protected $levelMap = [
43
+ Logger::DEBUG => 'debug',
44
+ Logger::INFO => 'info',
45
+ Logger::NOTICE => 'info',
46
+ Logger::WARNING => 'warning',
47
+ Logger::ERROR => 'error',
48
+ Logger::CRITICAL => 'critical',
49
+ Logger::ALERT => 'critical',
50
+ Logger::EMERGENCY => 'critical',
51
+ ];
52
+
53
+ /**
54
+ * Records whether any log records have been added since the last flush of the rollbar notifier
55
+ *
56
+ * @var bool
57
+ */
58
+ private $hasRecords = false;
59
+
60
+ /** @var bool */
61
+ protected $initialized = false;
62
+
63
+ /**
64
+ * @param RollbarLogger $rollbarLogger RollbarLogger object constructed with valid token
65
+ */
66
+ public function __construct(RollbarLogger $rollbarLogger, $level = Logger::ERROR, bool $bubble = true)
67
+ {
68
+ $this->rollbarLogger = $rollbarLogger;
69
+
70
+ parent::__construct($level, $bubble);
71
+ }
72
+
73
+ /**
74
+ * {@inheritDoc}
75
+ */
76
+ protected function write(array $record): void
77
+ {
78
+ if (!$this->initialized) {
79
+ // __destructor() doesn't get called on Fatal errors
80
+ register_shutdown_function(array($this, 'close'));
81
+ $this->initialized = true;
82
+ }
83
+
84
+ $context = $record['context'];
85
+ $context = array_merge($context, $record['extra'], [
86
+ 'level' => $this->levelMap[$record['level']],
87
+ 'monolog_level' => $record['level_name'],
88
+ 'channel' => $record['channel'],
89
+ 'datetime' => $record['datetime']->format('U'),
90
+ ]);
91
+
92
+ if (isset($context['exception']) && $context['exception'] instanceof Throwable) {
93
+ $exception = $context['exception'];
94
+ unset($context['exception']);
95
+ $toLog = $exception;
96
+ } else {
97
+ $toLog = $record['message'];
98
+ }
99
+
100
+ // @phpstan-ignore-next-line
101
+ $this->rollbarLogger->log($context['level'], $toLog, $context);
102
+
103
+ $this->hasRecords = true;
104
+ }
105
+
106
+ public function flush(): void
107
+ {
108
+ if ($this->hasRecords) {
109
+ $this->rollbarLogger->flush();
110
+ $this->hasRecords = false;
111
+ }
112
+ }
113
+
114
+ /**
115
+ * {@inheritDoc}
116
+ */
117
+ public function close(): void
118
+ {
119
+ $this->flush();
120
+ }
121
+
122
+ /**
123
+ * {@inheritDoc}
124
+ */
125
+ public function reset()
126
+ {
127
+ $this->flush();
128
+
129
+ parent::reset();
130
+ }
131
+ }
vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php ADDED
@@ -0,0 +1,207 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use InvalidArgumentException;
15
+ use Monolog\Logger;
16
+ use Monolog\Utils;
17
+
18
+ /**
19
+ * Stores logs to files that are rotated every day and a limited number of files are kept.
20
+ *
21
+ * This rotation is only intended to be used as a workaround. Using logrotate to
22
+ * handle the rotation is strongly encouraged when you can use it.
23
+ *
24
+ * @author Christophe Coevoet <stof@notk.org>
25
+ * @author Jordi Boggiano <j.boggiano@seld.be>
26
+ */
27
+ class RotatingFileHandler extends StreamHandler
28
+ {
29
+ public const FILE_PER_DAY = 'Y-m-d';
30
+ public const FILE_PER_MONTH = 'Y-m';
31
+ public const FILE_PER_YEAR = 'Y';
32
+
33
+ /** @var string */
34
+ protected $filename;
35
+ /** @var int */
36
+ protected $maxFiles;
37
+ /** @var bool */
38
+ protected $mustRotate;
39
+ /** @var \DateTimeImmutable */
40
+ protected $nextRotation;
41
+ /** @var string */
42
+ protected $filenameFormat;
43
+ /** @var string */
44
+ protected $dateFormat;
45
+
46
+ /**
47
+ * @param string $filename
48
+ * @param int $maxFiles The maximal amount of files to keep (0 means unlimited)
49
+ * @param int|null $filePermission Optional file permissions (default (0644) are only for owner read/write)
50
+ * @param bool $useLocking Try to lock log file before doing any writes
51
+ */
52
+ public function __construct(string $filename, int $maxFiles = 0, $level = Logger::DEBUG, bool $bubble = true, ?int $filePermission = null, bool $useLocking = false)
53
+ {
54
+ $this->filename = Utils::canonicalizePath($filename);
55
+ $this->maxFiles = $maxFiles;
56
+ $this->nextRotation = new \DateTimeImmutable('tomorrow');
57
+ $this->filenameFormat = '{filename}-{date}';
58
+ $this->dateFormat = static::FILE_PER_DAY;
59
+
60
+ parent::__construct($this->getTimedFilename(), $level, $bubble, $filePermission, $useLocking);
61
+ }
62
+
63
+ /**
64
+ * {@inheritDoc}
65
+ */
66
+ public function close(): void
67
+ {
68
+ parent::close();
69
+
70
+ if (true === $this->mustRotate) {
71
+ $this->rotate();
72
+ }
73
+ }
74
+
75
+ /**
76
+ * {@inheritDoc}
77
+ */
78
+ public function reset()
79
+ {
80
+ parent::reset();
81
+
82
+ if (true === $this->mustRotate) {
83
+ $this->rotate();
84
+ }
85
+ }
86
+
87
+ public function setFilenameFormat(string $filenameFormat, string $dateFormat): self
88
+ {
89
+ if (!preg_match('{^[Yy](([/_.-]?m)([/_.-]?d)?)?$}', $dateFormat)) {
90
+ throw new InvalidArgumentException(
91
+ 'Invalid date format - format must be one of '.
92
+ 'RotatingFileHandler::FILE_PER_DAY ("Y-m-d"), RotatingFileHandler::FILE_PER_MONTH ("Y-m") '.
93
+ 'or RotatingFileHandler::FILE_PER_YEAR ("Y"), or you can set one of the '.
94
+ 'date formats using slashes, underscores and/or dots instead of dashes.'
95
+ );
96
+ }
97
+ if (substr_count($filenameFormat, '{date}') === 0) {
98
+ throw new InvalidArgumentException(
99
+ 'Invalid filename format - format must contain at least `{date}`, because otherwise rotating is impossible.'
100
+ );
101
+ }
102
+ $this->filenameFormat = $filenameFormat;
103
+ $this->dateFormat = $dateFormat;
104
+ $this->url = $this->getTimedFilename();
105
+ $this->close();
106
+
107
+ return $this;
108
+ }
109
+
110
+ /**
111
+ * {@inheritDoc}
112
+ */
113
+ protected function write(array $record): void
114
+ {
115
+ // on the first record written, if the log is new, we should rotate (once per day)
116
+ if (null === $this->mustRotate) {
117
+ $this->mustRotate = null === $this->url || !file_exists($this->url);
118
+ }
119
+
120
+ if ($this->nextRotation <= $record['datetime']) {
121
+ $this->mustRotate = true;
122
+ $this->close();
123
+ }
124
+
125
+ parent::write($record);
126
+ }
127
+
128
+ /**
129
+ * Rotates the files.
130
+ */
131
+ protected function rotate(): void
132
+ {
133
+ // update filename
134
+ $this->url = $this->getTimedFilename();
135
+ $this->nextRotation = new \DateTimeImmutable('tomorrow');
136
+
137
+ // skip GC of old logs if files are unlimited
138
+ if (0 === $this->maxFiles) {
139
+ return;
140
+ }
141
+
142
+ $logFiles = glob($this->getGlobPattern());
143
+ if (false === $logFiles) {
144
+ // failed to glob
145
+ return;
146
+ }
147
+
148
+ if ($this->maxFiles >= count($logFiles)) {
149
+ // no files to remove
150
+ return;
151
+ }
152
+
153
+ // Sorting the files by name to remove the older ones
154
+ usort($logFiles, function ($a, $b) {
155
+ return strcmp($b, $a);
156
+ });
157
+
158
+ foreach (array_slice($logFiles, $this->maxFiles) as $file) {
159
+ if (is_writable($file)) {
160
+ // suppress errors here as unlink() might fail if two processes
161
+ // are cleaning up/rotating at the same time
162
+ set_error_handler(function (int $errno, string $errstr, string $errfile, int $errline): bool {
163
+ return false;
164
+ });
165
+ unlink($file);
166
+ restore_error_handler();
167
+ }
168
+ }
169
+
170
+ $this->mustRotate = false;
171
+ }
172
+
173
+ protected function getTimedFilename(): string
174
+ {
175
+ $fileInfo = pathinfo($this->filename);
176
+ $timedFilename = str_replace(
177
+ ['{filename}', '{date}'],
178
+ [$fileInfo['filename'], date($this->dateFormat)],
179
+ $fileInfo['dirname'] . '/' . $this->filenameFormat
180
+ );
181
+
182
+ if (isset($fileInfo['extension'])) {
183
+ $timedFilename .= '.'.$fileInfo['extension'];
184
+ }
185
+
186
+ return $timedFilename;
187
+ }
188
+
189
+ protected function getGlobPattern(): string
190
+ {
191
+ $fileInfo = pathinfo($this->filename);
192
+ $glob = str_replace(
193
+ ['{filename}', '{date}'],
194
+ [$fileInfo['filename'], str_replace(
195
+ ['Y', 'y', 'm', 'd'],
196
+ ['[0-9][0-9][0-9][0-9]', '[0-9][0-9]', '[0-9][0-9]', '[0-9][0-9]'],
197
+ $this->dateFormat)
198
+ ],
199
+ $fileInfo['dirname'] . '/' . $this->filenameFormat
200
+ );
201
+ if (isset($fileInfo['extension'])) {
202
+ $glob .= '.'.$fileInfo['extension'];
203
+ }
204
+
205
+ return $glob;
206
+ }
207
+ }
vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php ADDED
@@ -0,0 +1,132 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Formatter\FormatterInterface;
15
+
16
+ /**
17
+ * Sampling handler
18
+ *
19
+ * A sampled event stream can be useful for logging high frequency events in
20
+ * a production environment where you only need an idea of what is happening
21
+ * and are not concerned with capturing every occurrence. Since the decision to
22
+ * handle or not handle a particular event is determined randomly, the
23
+ * resulting sampled log is not guaranteed to contain 1/N of the events that
24
+ * occurred in the application, but based on the Law of large numbers, it will
25
+ * tend to be close to this ratio with a large number of attempts.
26
+ *
27
+ * @author Bryan Davis <bd808@wikimedia.org>
28
+ * @author Kunal Mehta <legoktm@gmail.com>
29
+ *
30
+ * @phpstan-import-type Record from \Monolog\Logger
31
+ * @phpstan-import-type Level from \Monolog\Logger
32
+ */
33
+ class SamplingHandler extends AbstractHandler implements ProcessableHandlerInterface, FormattableHandlerInterface
34
+ {
35
+ use ProcessableHandlerTrait;
36
+
37
+ /**
38
+ * @var HandlerInterface|callable
39
+ * @phpstan-var HandlerInterface|callable(Record|array{level: Level}|null, HandlerInterface): HandlerInterface
40
+ */
41
+ protected $handler;
42
+
43
+ /**
44
+ * @var int $factor
45
+ */
46
+ protected $factor;
47
+
48
+ /**
49
+ * @psalm-param HandlerInterface|callable(Record|array{level: Level}|null, HandlerInterface): HandlerInterface $handler
50
+ *
51
+ * @param callable|HandlerInterface $handler Handler or factory callable($record|null, $samplingHandler).
52
+ * @param int $factor Sample factor (e.g. 10 means every ~10th record is sampled)
53
+ */
54
+ public function __construct($handler, int $factor)
55
+ {
56
+ parent::__construct();
57
+ $this->handler = $handler;
58
+ $this->factor = $factor;
59
+
60
+ if (!$this->handler instanceof HandlerInterface && !is_callable($this->handler)) {
61
+ throw new \RuntimeException("The given handler (".json_encode($this->handler).") is not a callable nor a Monolog\Handler\HandlerInterface object");
62
+ }
63
+ }
64
+
65
+ public function isHandling(array $record): bool
66
+ {
67
+ return $this->getHandler($record)->isHandling($record);
68
+ }
69
+
70
+ public function handle(array $record): bool
71
+ {
72
+ if ($this->isHandling($record) && mt_rand(1, $this->factor) === 1) {
73
+ if ($this->processors) {
74
+ /** @var Record $record */
75
+ $record = $this->processRecord($record);
76
+ }
77
+
78
+ $this->getHandler($record)->handle($record);
79
+ }
80
+
81
+ return false === $this->bubble;
82
+ }
83
+
84
+ /**
85
+ * Return the nested handler
86
+ *
87
+ * If the handler was provided as a factory callable, this will trigger the handler's instantiation.
88
+ *
89
+ * @phpstan-param Record|array{level: Level}|null $record
90
+ *
91
+ * @return HandlerInterface
92
+ */
93
+ public function getHandler(array $record = null)
94
+ {
95
+ if (!$this->handler instanceof HandlerInterface) {
96
+ $this->handler = ($this->handler)($record, $this);
97
+ if (!$this->handler instanceof HandlerInterface) {
98
+ throw new \RuntimeException("The factory callable should return a HandlerInterface");
99
+ }
100
+ }
101
+
102
+ return $this->handler;
103
+ }
104
+
105
+ /**
106
+ * {@inheritDoc}
107
+ */
108
+ public function setFormatter(FormatterInterface $formatter): HandlerInterface
109
+ {
110
+ $handler = $this->getHandler();
111
+ if ($handler instanceof FormattableHandlerInterface) {
112
+ $handler->setFormatter($formatter);
113
+
114
+ return $this;
115
+ }
116
+
117
+ throw new \UnexpectedValueException('The nested handler of type '.get_class($handler).' does not support formatters.');
118
+ }
119
+
120
+ /**
121
+ * {@inheritDoc}
122
+ */
123
+ public function getFormatter(): FormatterInterface
124
+ {
125
+ $handler = $this->getHandler();
126
+ if ($handler instanceof FormattableHandlerInterface) {
127
+ return $handler->getFormatter();
128
+ }
129
+
130
+ throw new \UnexpectedValueException('The nested handler of type '.get_class($handler).' does not support formatters.');
131
+ }
132
+ }
vendor/monolog/monolog/src/Monolog/Handler/SendGridHandler.php ADDED
@@ -0,0 +1,102 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Logger;
15
+
16
+ /**
17
+ * SendGridrHandler uses the SendGrid API v2 function to send Log emails, more information in https://sendgrid.com/docs/API_Reference/Web_API/mail.html
18
+ *
19
+ * @author Ricardo Fontanelli <ricardo.fontanelli@hotmail.com>
20
+ */
21
+ class SendGridHandler extends MailHandler
22
+ {
23
+ /**
24
+ * The SendGrid API User
25
+ * @var string
26
+ */
27
+ protected $apiUser;
28
+
29
+ /**
30
+ * The SendGrid API Key
31
+ * @var string
32
+ */
33
+ protected $apiKey;
34
+
35
+ /**
36
+ * The email addresses to which the message will be sent
37
+ * @var string
38
+ */
39
+ protected $from;
40
+
41
+ /**
42
+ * The email addresses to which the message will be sent
43
+ * @var string[]
44
+ */
45
+ protected $to;
46
+
47
+ /**
48
+ * The subject of the email
49
+ * @var string
50
+ */
51
+ protected $subject;
52
+
53
+ /**
54
+ * @param string $apiUser The SendGrid API User
55
+ * @param string $apiKey The SendGrid API Key
56
+ * @param string $from The sender of the email
57
+ * @param string|string[] $to The recipients of the email
58
+ * @param string $subject The subject of the mail
59
+ */
60
+ public function __construct(string $apiUser, string $apiKey, string $from, $to, string $subject, $level = Logger::ERROR, bool $bubble = true)
61
+ {
62
+ if (!extension_loaded('curl')) {
63
+ throw new MissingExtensionException('The curl extension is needed to use the SendGridHandler');
64
+ }
65
+
66
+ parent::__construct($level, $bubble);
67
+ $this->apiUser = $apiUser;
68
+ $this->apiKey = $apiKey;
69
+ $this->from = $from;
70
+ $this->to = (array) $to;
71
+ $this->subject = $subject;
72
+ }
73
+
74
+ /**
75
+ * {@inheritDoc}
76
+ */
77
+ protected function send(string $content, array $records): void
78
+ {
79
+ $message = [];
80
+ $message['api_user'] = $this->apiUser;
81
+ $message['api_key'] = $this->apiKey;
82
+ $message['from'] = $this->from;
83
+ foreach ($this->to as $recipient) {
84
+ $message['to[]'] = $recipient;
85
+ }
86
+ $message['subject'] = $this->subject;
87
+ $message['date'] = date('r');
88
+
89
+ if ($this->isHtmlBody($content)) {
90
+ $message['html'] = $content;
91
+ } else {
92
+ $message['text'] = $content;
93
+ }
94
+
95
+ $ch = curl_init();
96
+ curl_setopt($ch, CURLOPT_URL, 'https://api.sendgrid.com/api/mail.send.json');
97
+ curl_setopt($ch, CURLOPT_POST, 1);
98
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
99
+ curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($message));
100
+ Curl\Util::execute($ch, 2);
101
+ }
102
+ }
vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php ADDED
@@ -0,0 +1,387 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler\Slack;
13
+
14
+ use Monolog\Logger;
15
+ use Monolog\Utils;
16
+ use Monolog\Formatter\NormalizerFormatter;
17
+ use Monolog\Formatter\FormatterInterface;
18
+
19
+ /**
20
+ * Slack record utility helping to log to Slack webhooks or API.
21
+ *
22
+ * @author Greg Kedzierski <greg@gregkedzierski.com>
23
+ * @author Haralan Dobrev <hkdobrev@gmail.com>
24
+ * @see https://api.slack.com/incoming-webhooks
25
+ * @see https://api.slack.com/docs/message-attachments
26
+ *
27
+ * @phpstan-import-type FormattedRecord from \Monolog\Handler\AbstractProcessingHandler
28
+ * @phpstan-import-type Record from \Monolog\Logger
29
+ */
30
+ class SlackRecord
31
+ {
32
+ public const COLOR_DANGER = 'danger';
33
+
34
+ public const COLOR_WARNING = 'warning';
35
+
36
+ public const COLOR_GOOD = 'good';
37
+
38
+ public const COLOR_DEFAULT = '#e3e4e6';
39
+
40
+ /**
41
+ * Slack channel (encoded ID or name)
42
+ * @var string|null
43
+ */
44
+ private $channel;
45
+
46
+ /**
47
+ * Name of a bot
48
+ * @var string|null
49
+ */
50
+ private $username;
51
+
52
+ /**
53
+ * User icon e.g. 'ghost', 'http://example.com/user.png'
54
+ * @var string|null
55
+ */
56
+ private $userIcon;
57
+
58
+ /**
59
+ * Whether the message should be added to Slack as attachment (plain text otherwise)
60
+ * @var bool
61
+ */
62
+ private $useAttachment;
63
+
64
+ /**
65
+ * Whether the the context/extra messages added to Slack as attachments are in a short style
66
+ * @var bool
67
+ */
68
+ private $useShortAttachment;
69
+
70
+ /**
71
+ * Whether the attachment should include context and extra data
72
+ * @var bool
73
+ */
74
+ private $includeContextAndExtra;
75
+
76
+ /**
77
+ * Dot separated list of fields to exclude from slack message. E.g. ['context.field1', 'extra.field2']
78
+ * @var string[]
79
+ */
80
+ private $excludeFields;
81
+
82
+ /**
83
+ * @var ?FormatterInterface
84
+ */
85
+ private $formatter;
86
+
87
+ /**
88
+ * @var NormalizerFormatter
89
+ */
90
+ private $normalizerFormatter;
91
+
92
+ /**
93
+ * @param string[] $excludeFields
94
+ */
95
+ public function __construct(
96
+ ?string $channel = null,
97
+ ?string $username = null,
98
+ bool $useAttachment = true,
99
+ ?string $userIcon = null,
100
+ bool $useShortAttachment = false,
101
+ bool $includeContextAndExtra = false,
102
+ array $excludeFields = array(),
103
+ FormatterInterface $formatter = null
104
+ ) {
105
+ $this
106
+ ->setChannel($channel)
107
+ ->setUsername($username)
108
+ ->useAttachment($useAttachment)
109
+ ->setUserIcon($userIcon)
110
+ ->useShortAttachment($useShortAttachment)
111
+ ->includeContextAndExtra($includeContextAndExtra)
112
+ ->excludeFields($excludeFields)
113
+ ->setFormatter($formatter);
114
+
115
+ if ($this->includeContextAndExtra) {
116
+ $this->normalizerFormatter = new NormalizerFormatter();
117
+ }
118
+ }
119
+
120
+ /**
121
+ * Returns required data in format that Slack
122
+ * is expecting.
123
+ *
124
+ * @phpstan-param FormattedRecord $record
125
+ * @phpstan-return mixed[]
126
+ */
127
+ public function getSlackData(array $record): array
128
+ {
129
+ $dataArray = array();
130
+ $record = $this->removeExcludedFields($record);
131
+
132
+ if ($this->username) {
133
+ $dataArray['username'] = $this->username;
134
+ }
135
+
136
+ if ($this->channel) {
137
+ $dataArray['channel'] = $this->channel;
138
+ }
139
+
140
+ if ($this->formatter && !$this->useAttachment) {
141
+ /** @phpstan-ignore-next-line */
142
+ $message = $this->formatter->format($record);
143
+ } else {
144
+ $message = $record['message'];
145
+ }
146
+
147
+ if ($this->useAttachment) {
148
+ $attachment = array(
149
+ 'fallback' => $message,
150
+ 'text' => $message,
151
+ 'color' => $this->getAttachmentColor($record['level']),
152
+ 'fields' => array(),
153
+ 'mrkdwn_in' => array('fields'),
154
+ 'ts' => $record['datetime']->getTimestamp(),
155
+ 'footer' => $this->username,
156
+ 'footer_icon' => $this->userIcon,
157
+ );
158
+
159
+ if ($this->useShortAttachment) {
160
+ $attachment['title'] = $record['level_name'];
161
+ } else {
162
+ $attachment['title'] = 'Message';
163
+ $attachment['fields'][] = $this->generateAttachmentField('Level', $record['level_name']);
164
+ }
165
+
166
+ if ($this->includeContextAndExtra) {
167
+ foreach (array('extra', 'context') as $key) {
168
+ if (empty($record[$key])) {
169
+ continue;
170
+ }
171
+
172
+ if ($this->useShortAttachment) {
173
+ $attachment['fields'][] = $this->generateAttachmentField(
174
+ (string) $key,
175
+ $record[$key]
176
+ );
177
+ } else {
178
+ // Add all extra fields as individual fields in attachment
179
+ $attachment['fields'] = array_merge(
180
+ $attachment['fields'],
181
+ $this->generateAttachmentFields($record[$key])
182
+ );
183
+ }
184
+ }
185
+ }
186
+
187
+ $dataArray['attachments'] = array($attachment);
188
+ } else {
189
+ $dataArray['text'] = $message;
190
+ }
191
+
192
+ if ($this->userIcon) {
193
+ if (filter_var($this->userIcon, FILTER_VALIDATE_URL)) {
194
+ $dataArray['icon_url'] = $this->userIcon;
195
+ } else {
196
+ $dataArray['icon_emoji'] = ":{$this->userIcon}:";
197
+ }
198
+ }
199
+
200
+ return $dataArray;
201
+ }
202
+
203
+ /**
204
+ * Returns a Slack message attachment color associated with
205
+ * provided level.
206
+ */
207
+ public function getAttachmentColor(int $level): string
208
+ {
209
+ switch (true) {
210
+ case $level >= Logger::ERROR:
211
+ return static::COLOR_DANGER;
212
+ case $level >= Logger::WARNING:
213
+ return static::COLOR_WARNING;
214
+ case $level >= Logger::INFO:
215
+ return static::COLOR_GOOD;
216
+ default:
217
+ return static::COLOR_DEFAULT;
218
+ }
219
+ }
220
+
221
+ /**
222
+ * Stringifies an array of key/value pairs to be used in attachment fields
223
+ *
224
+ * @param mixed[] $fields
225
+ */
226
+ public function stringify(array $fields): string
227
+ {
228
+ /** @var Record $fields */
229
+ $normalized = $this->normalizerFormatter->format($fields);
230
+
231
+ $hasSecondDimension = count(array_filter($normalized, 'is_array'));
232
+ $hasNonNumericKeys = !count(array_filter(array_keys($normalized), 'is_numeric'));
233
+
234
+ return $hasSecondDimension || $hasNonNumericKeys
235
+ ? Utils::jsonEncode($normalized, JSON_PRETTY_PRINT|Utils::DEFAULT_JSON_FLAGS)
236
+ : Utils::jsonEncode($normalized, Utils::DEFAULT_JSON_FLAGS);
237
+ }
238
+
239
+ /**
240
+ * Channel used by the bot when posting
241
+ *
242
+ * @param ?string $channel
243
+ *
244
+ * @return static
245
+ */
246
+ public function setChannel(?string $channel = null): self
247
+ {
248
+ $this->channel = $channel;
249
+
250
+ return $this;
251
+ }
252
+
253
+ /**
254
+ * Username used by the bot when posting
255
+ *
256
+ * @param ?string $username
257
+ *
258
+ * @return static
259
+ */
260
+ public function setUsername(?string $username = null): self
261
+ {
262
+ $this->username = $username;
263
+
264
+ return $this;
265
+ }
266
+
267
+ public function useAttachment(bool $useAttachment = true): self
268
+ {
269
+ $this->useAttachment = $useAttachment;
270
+
271
+ return $this;
272
+ }
273
+
274
+ public function setUserIcon(?string $userIcon = null): self
275
+ {
276
+ $this->userIcon = $userIcon;
277
+
278
+ if (\is_string($userIcon)) {
279
+ $this->userIcon = trim($userIcon, ':');
280
+ }
281
+
282
+ return $this;
283
+ }
284
+
285
+ public function useShortAttachment(bool $useShortAttachment = false): self
286
+ {
287
+ $this->useShortAttachment = $useShortAttachment;
288
+
289
+ return $this;
290
+ }
291
+
292
+ public function includeContextAndExtra(bool $includeContextAndExtra = false): self
293
+ {
294
+ $this->includeContextAndExtra = $includeContextAndExtra;
295
+
296
+ if ($this->includeContextAndExtra) {
297
+ $this->normalizerFormatter = new NormalizerFormatter();
298
+ }
299
+
300
+ return $this;
301
+ }
302
+
303
+ /**
304
+ * @param string[] $excludeFields
305
+ */
306
+ public function excludeFields(array $excludeFields = []): self
307
+ {
308
+ $this->excludeFields = $excludeFields;
309
+
310
+ return $this;
311
+ }
312
+
313
+ public function setFormatter(?FormatterInterface $formatter = null): self
314
+ {
315
+ $this->formatter = $formatter;
316
+
317
+ return $this;
318
+ }
319
+
320
+ /**
321
+ * Generates attachment field
322
+ *
323
+ * @param string|mixed[] $value
324
+ *
325
+ * @return array{title: string, value: string, short: false}
326
+ */
327
+ private function generateAttachmentField(string $title, $value): array
328
+ {
329
+ $value = is_array($value)
330
+ ? sprintf('```%s```', substr($this->stringify($value), 0, 1990))
331
+ : $value;
332
+
333
+ return array(
334
+ 'title' => ucfirst($title),
335
+ 'value' => $value,
336
+ 'short' => false,
337
+ );
338
+ }
339
+
340
+ /**
341
+ * Generates a collection of attachment fields from array
342
+ *
343
+ * @param mixed[] $data
344
+ *
345
+ * @return array<array{title: string, value: string, short: false}>
346
+ */
347
+ private function generateAttachmentFields(array $data): array
348
+ {
349
+ /** @var Record $data */
350
+ $normalized = $this->normalizerFormatter->format($data);
351
+
352
+ $fields = array();
353
+ foreach ($normalized as $key => $value) {
354
+ $fields[] = $this->generateAttachmentField((string) $key, $value);
355
+ }
356
+
357
+ return $fields;
358
+ }
359
+
360
+ /**
361
+ * Get a copy of record with fields excluded according to $this->excludeFields
362
+ *
363
+ * @phpstan-param FormattedRecord $record
364
+ *
365
+ * @return mixed[]
366
+ */
367
+ private function removeExcludedFields(array $record): array
368
+ {
369
+ foreach ($this->excludeFields as $field) {
370
+ $keys = explode('.', $field);
371
+ $node = &$record;
372
+ $lastKey = end($keys);
373
+ foreach ($keys as $key) {
374
+ if (!isset($node[$key])) {
375
+ break;
376
+ }
377
+ if ($lastKey === $key) {
378
+ unset($node[$key]);
379
+ break;
380
+ }
381
+ $node = &$node[$key];
382
+ }
383
+ }
384
+
385
+ return $record;
386
+ }
387
+ }
vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php ADDED
@@ -0,0 +1,256 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Formatter\FormatterInterface;
15
+ use Monolog\Logger;
16
+ use Monolog\Utils;
17
+ use Monolog\Handler\Slack\SlackRecord;
18
+
19
+ /**
20
+ * Sends notifications through Slack API
21
+ *
22
+ * @author Greg Kedzierski <greg@gregkedzierski.com>
23
+ * @see https://api.slack.com/
24
+ *
25
+ * @phpstan-import-type FormattedRecord from AbstractProcessingHandler
26
+ */
27
+ class SlackHandler extends SocketHandler
28
+ {
29
+ /**
30
+ * Slack API token
31
+ * @var string
32
+ */
33
+ private $token;
34
+
35
+ /**
36
+ * Instance of the SlackRecord util class preparing data for Slack API.
37
+ * @var SlackRecord
38
+ */
39
+ private $slackRecord;
40
+
41
+ /**
42
+ * @param string $token Slack API token
43
+ * @param string $channel Slack channel (encoded ID or name)
44
+ * @param string|null $username Name of a bot
45
+ * @param bool $useAttachment Whether the message should be added to Slack as attachment (plain text otherwise)
46
+ * @param string|null $iconEmoji The emoji name to use (or null)
47
+ * @param bool $useShortAttachment Whether the context/extra messages added to Slack as attachments are in a short style
48
+ * @param bool $includeContextAndExtra Whether the attachment should include context and extra data
49
+ * @param string[] $excludeFields Dot separated list of fields to exclude from slack message. E.g. ['context.field1', 'extra.field2']
50
+ * @throws MissingExtensionException If no OpenSSL PHP extension configured
51
+ */
52
+ public function __construct(
53
+ string $token,
54
+ string $channel,
55
+ ?string $username = null,
56
+ bool $useAttachment = true,
57
+ ?string $iconEmoji = null,
58
+ $level = Logger::CRITICAL,
59
+ bool $bubble = true,
60
+ bool $useShortAttachment = false,
61
+ bool $includeContextAndExtra = false,
62
+ array $excludeFields = array(),
63
+ bool $persistent = false,
64
+ float $timeout = 0.0,
65
+ float $writingTimeout = 10.0,
66
+ ?float $connectionTimeout = null,
67
+ ?int $chunkSize = null
68
+ ) {
69
+ if (!extension_loaded('openssl')) {
70
+ throw new MissingExtensionException('The OpenSSL PHP extension is required to use the SlackHandler');
71
+ }
72
+
73
+ parent::__construct(
74
+ 'ssl://slack.com:443',
75
+ $level,
76
+ $bubble,
77
+ $persistent,
78
+ $timeout,
79
+ $writingTimeout,
80
+ $connectionTimeout,
81
+ $chunkSize
82
+ );
83
+
84
+ $this->slackRecord = new SlackRecord(
85
+ $channel,
86
+ $username,
87
+ $useAttachment,
88
+ $iconEmoji,
89
+ $useShortAttachment,
90
+ $includeContextAndExtra,
91
+ $excludeFields
92
+ );
93
+
94
+ $this->token = $token;
95
+ }
96
+
97
+ public function getSlackRecord(): SlackRecord
98
+ {
99
+ return $this->slackRecord;
100
+ }
101
+
102
+ public function getToken(): string
103
+ {
104
+ return $this->token;
105
+ }
106
+
107
+ /**
108
+ * {@inheritDoc}
109
+ */
110
+ protected function generateDataStream(array $record): string
111
+ {
112
+ $content = $this->buildContent($record);
113
+
114
+ return $this->buildHeader($content) . $content;
115
+ }
116
+
117
+ /**
118
+ * Builds the body of API call
119
+ *
120
+ * @phpstan-param FormattedRecord $record
121
+ */
122
+ private function buildContent(array $record): string
123
+ {
124
+ $dataArray = $this->prepareContentData($record);
125
+
126
+ return http_build_query($dataArray);
127
+ }
128
+
129
+ /**
130
+ * @phpstan-param FormattedRecord $record
131
+ * @return string[]
132
+ */
133
+ protected function prepareContentData(array $record): array
134
+ {
135
+ $dataArray = $this->slackRecord->getSlackData($record);
136
+ $dataArray['token'] = $this->token;
137
+
138
+ if (!empty($dataArray['attachments'])) {
139
+ $dataArray['attachments'] = Utils::jsonEncode($dataArray['attachments']);
140
+ }
141
+
142
+ return $dataArray;
143
+ }
144
+
145
+ /**
146
+ * Builds the header of the API Call
147
+ */
148
+ private function buildHeader(string $content): string
149
+ {
150
+ $header = "POST /api/chat.postMessage HTTP/1.1\r\n";
151
+ $header .= "Host: slack.com\r\n";
152
+ $header .= "Content-Type: application/x-www-form-urlencoded\r\n";
153
+ $header .= "Content-Length: " . strlen($content) . "\r\n";
154
+ $header .= "\r\n";
155
+
156
+ return $header;
157
+ }
158
+
159
+ /**
160
+ * {@inheritDoc}
161
+ */
162
+ protected function write(array $record): void
163
+ {
164
+ parent::write($record);
165
+ $this->finalizeWrite();
166
+ }
167
+
168
+ /**
169
+ * Finalizes the request by reading some bytes and then closing the socket
170
+ *
171
+ * If we do not read some but close the socket too early, slack sometimes
172
+ * drops the request entirely.
173
+ */
174
+ protected function finalizeWrite(): void
175
+ {
176
+ $res = $this->getResource();
177
+ if (is_resource($res)) {
178
+ @fread($res, 2048);
179
+ }
180
+ $this->closeSocket();
181
+ }
182
+
183
+ public function setFormatter(FormatterInterface $formatter): HandlerInterface
184
+ {
185
+ parent::setFormatter($formatter);
186
+ $this->slackRecord->setFormatter($formatter);
187
+
188
+ return $this;
189
+ }
190
+
191
+ public function getFormatter(): FormatterInterface
192
+ {
193
+ $formatter = parent::getFormatter();
194
+ $this->slackRecord->setFormatter($formatter);
195
+
196
+ return $formatter;
197
+ }
198
+
199
+ /**
200
+ * Channel used by the bot when posting
201
+ */
202
+ public function setChannel(string $channel): self
203
+ {
204
+ $this->slackRecord->setChannel($channel);
205
+
206
+ return $this;
207
+ }
208
+
209
+ /**
210
+ * Username used by the bot when posting
211
+ */
212
+ public function setUsername(string $username): self
213
+ {
214
+ $this->slackRecord->setUsername($username);
215
+
216
+ return $this;
217
+ }
218
+
219
+ public function useAttachment(bool $useAttachment): self
220
+ {
221
+ $this->slackRecord->useAttachment($useAttachment);
222
+
223
+ return $this;
224
+ }
225
+
226
+ public function setIconEmoji(string $iconEmoji): self
227
+ {
228
+ $this->slackRecord->setUserIcon($iconEmoji);
229
+
230
+ return $this;
231
+ }
232
+
233
+ public function useShortAttachment(bool $useShortAttachment): self
234
+ {
235
+ $this->slackRecord->useShortAttachment($useShortAttachment);
236
+
237
+ return $this;
238
+ }
239
+
240
+ public function includeContextAndExtra(bool $includeContextAndExtra): self
241
+ {
242
+ $this->slackRecord->includeContextAndExtra($includeContextAndExtra);
243
+
244
+ return $this;
245
+ }
246
+
247
+ /**
248
+ * @param string[] $excludeFields
249
+ */
250
+ public function excludeFields(array $excludeFields): self
251
+ {
252
+ $this->slackRecord->excludeFields($excludeFields);
253
+
254
+ return $this;
255
+ }
256
+ }
vendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php ADDED
@@ -0,0 +1,130 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Formatter\FormatterInterface;
15
+ use Monolog\Logger;
16
+ use Monolog\Utils;
17
+ use Monolog\Handler\Slack\SlackRecord;
18
+
19
+ /**
20
+ * Sends notifications through Slack Webhooks
21
+ *
22
+ * @author Haralan Dobrev <hkdobrev@gmail.com>
23
+ * @see https://api.slack.com/incoming-webhooks
24
+ */
25
+ class SlackWebhookHandler extends AbstractProcessingHandler
26
+ {
27
+ /**
28
+ * Slack Webhook token
29
+ * @var string
30
+ */
31
+ private $webhookUrl;
32
+
33
+ /**
34
+ * Instance of the SlackRecord util class preparing data for Slack API.
35
+ * @var SlackRecord
36
+ */
37
+ private $slackRecord;
38
+
39
+ /**
40
+ * @param string $webhookUrl Slack Webhook URL
41
+ * @param string|null $channel Slack channel (encoded ID or name)
42
+ * @param string|null $username Name of a bot
43
+ * @param bool $useAttachment Whether the message should be added to Slack as attachment (plain text otherwise)
44
+ * @param string|null $iconEmoji The emoji name to use (or null)
45
+ * @param bool $useShortAttachment Whether the the context/extra messages added to Slack as attachments are in a short style
46
+ * @param bool $includeContextAndExtra Whether the attachment should include context and extra data
47
+ * @param string[] $excludeFields Dot separated list of fields to exclude from slack message. E.g. ['context.field1', 'extra.field2']
48
+ */
49
+ public function __construct(
50
+ string $webhookUrl,
51
+ ?string $channel = null,
52
+ ?string $username = null,
53
+ bool $useAttachment = true,
54
+ ?string $iconEmoji = null,
55
+ bool $useShortAttachment = false,
56
+ bool $includeContextAndExtra = false,
57
+ $level = Logger::CRITICAL,
58
+ bool $bubble = true,
59
+ array $excludeFields = array()
60
+ ) {
61
+ if (!extension_loaded('curl')) {
62
+ throw new MissingExtensionException('The curl extension is needed to use the SlackWebhookHandler');
63
+ }
64
+
65
+ parent::__construct($level, $bubble);
66
+
67
+ $this->webhookUrl = $webhookUrl;
68
+
69
+ $this->slackRecord = new SlackRecord(
70
+ $channel,
71
+ $username,
72
+ $useAttachment,
73
+ $iconEmoji,
74
+ $useShortAttachment,
75
+ $includeContextAndExtra,
76
+ $excludeFields
77
+ );
78
+ }
79
+
80
+ public function getSlackRecord(): SlackRecord
81
+ {
82
+ return $this->slackRecord;
83
+ }
84
+
85
+ public function getWebhookUrl(): string
86
+ {
87
+ return $this->webhookUrl;
88
+ }
89
+
90
+ /**
91
+ * {@inheritDoc}
92
+ */
93
+ protected function write(array $record): void
94
+ {
95
+ $postData = $this->slackRecord->getSlackData($record);
96
+ $postString = Utils::jsonEncode($postData);
97
+
98
+ $ch = curl_init();
99
+ $options = array(
100
+ CURLOPT_URL => $this->webhookUrl,
101
+ CURLOPT_POST => true,
102
+ CURLOPT_RETURNTRANSFER => true,
103
+ CURLOPT_HTTPHEADER => array('Content-type: application/json'),
104
+ CURLOPT_POSTFIELDS => $postString,
105
+ );
106
+ if (defined('CURLOPT_SAFE_UPLOAD')) {
107
+ $options[CURLOPT_SAFE_UPLOAD] = true;
108
+ }
109
+
110
+ curl_setopt_array($ch, $options);
111
+
112
+ Curl\Util::execute($ch);
113
+ }
114
+
115
+ public function setFormatter(FormatterInterface $formatter): HandlerInterface
116
+ {
117
+ parent::setFormatter($formatter);
118
+ $this->slackRecord->setFormatter($formatter);
119
+
120
+ return $this;
121
+ }
122
+
123
+ public function getFormatter(): FormatterInterface
124
+ {
125
+ $formatter = parent::getFormatter();
126
+ $this->slackRecord->setFormatter($formatter);
127
+
128
+ return $formatter;
129
+ }
130
+ }
vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php ADDED
@@ -0,0 +1,448 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Logger;
15
+
16
+ /**
17
+ * Stores to any socket - uses fsockopen() or pfsockopen().
18
+ *
19
+ * @author Pablo de Leon Belloc <pablolb@gmail.com>
20
+ * @see http://php.net/manual/en/function.fsockopen.php
21
+ *
22
+ * @phpstan-import-type Record from \Monolog\Logger
23
+ * @phpstan-import-type FormattedRecord from AbstractProcessingHandler
24
+ */
25
+ class SocketHandler extends AbstractProcessingHandler
26
+ {
27
+ /** @var string */
28
+ private $connectionString;
29
+ /** @var float */
30
+ private $connectionTimeout;
31
+ /** @var resource|null */
32
+ private $resource;
33
+ /** @var float */
34
+ private $timeout;
35
+ /** @var float */
36
+ private $writingTimeout;
37
+ /** @var ?int */
38
+ private $lastSentBytes = null;
39
+ /** @var ?int */
40
+ private $chunkSize;
41
+ /** @var bool */
42
+ private $persistent;
43
+ /** @var ?int */
44
+ private $errno = null;
45
+ /** @var ?string */
46
+ private $errstr = null;
47
+ /** @var ?float */
48
+ private $lastWritingAt = null;
49
+
50
+ /**
51
+ * @param string $connectionString Socket connection string
52
+ * @param bool $persistent Flag to enable/disable persistent connections
53
+ * @param float $timeout Socket timeout to wait until the request is being aborted
54
+ * @param float $writingTimeout Socket timeout to wait until the request should've been sent/written
55
+ * @param float|null $connectionTimeout Socket connect timeout to wait until the connection should've been
56
+ * established
57
+ * @param int|null $chunkSize Sets the chunk size. Only has effect during connection in the writing cycle
58
+ *
59
+ * @throws \InvalidArgumentException If an invalid timeout value (less than 0) is passed.
60
+ */
61
+ public function __construct(
62
+ string $connectionString,
63
+ $level = Logger::DEBUG,
64
+ bool $bubble = true,
65
+ bool $persistent = false,
66
+ float $timeout = 0.0,
67
+ float $writingTimeout = 10.0,
68
+ ?float $connectionTimeout = null,
69
+ ?int $chunkSize = null
70
+ ) {
71
+ parent::__construct($level, $bubble);
72
+ $this->connectionString = $connectionString;
73
+
74
+ if ($connectionTimeout !== null) {
75
+ $this->validateTimeout($connectionTimeout);
76
+ }
77
+
78
+ $this->connectionTimeout = $connectionTimeout ?? (float) ini_get('default_socket_timeout');
79
+ $this->persistent = $persistent;
80
+ $this->validateTimeout($timeout);
81
+ $this->timeout = $timeout;
82
+ $this->validateTimeout($writingTimeout);
83
+ $this->writingTimeout = $writingTimeout;
84
+ $this->chunkSize = $chunkSize;
85
+ }
86
+
87
+ /**
88
+ * Connect (if necessary) and write to the socket
89
+ *
90
+ * {@inheritDoc}
91
+ *
92
+ * @throws \UnexpectedValueException
93
+ * @throws \RuntimeException
94
+ */
95
+ protected function write(array $record): void
96
+ {
97
+ $this->connectIfNotConnected();
98
+ $data = $this->generateDataStream($record);
99
+ $this->writeToSocket($data);
100
+ }
101
+
102
+ /**
103
+ * We will not close a PersistentSocket instance so it can be reused in other requests.
104
+ */
105
+ public function close(): void
106
+ {
107
+ if (!$this->isPersistent()) {
108
+ $this->closeSocket();
109
+ }
110
+ }
111
+
112
+ /**
113
+ * Close socket, if open
114
+ */
115
+ public function closeSocket(): void
116
+ {
117
+ if (is_resource($this->resource)) {
118
+ fclose($this->resource);
119
+ $this->resource = null;
120
+ }
121
+ }
122
+
123
+ /**
124
+ * Set socket connection to be persistent. It only has effect before the connection is initiated.
125
+ */
126
+ public function setPersistent(bool $persistent): self
127
+ {
128
+ $this->persistent = $persistent;
129
+
130
+ return $this;
131
+ }
132
+
133
+ /**
134
+ * Set connection timeout. Only has effect before we connect.
135
+ *
136
+ * @see http://php.net/manual/en/function.fsockopen.php
137
+ */
138
+ public function setConnectionTimeout(float $seconds): self
139
+ {
140
+ $this->validateTimeout($seconds);
141
+ $this->connectionTimeout = $seconds;
142
+
143
+ return $this;
144
+ }
145
+
146
+ /**
147
+ * Set write timeout. Only has effect before we connect.
148
+ *
149
+ * @see http://php.net/manual/en/function.stream-set-timeout.php
150
+ */
151
+ public function setTimeout(float $seconds): self
152
+ {
153
+ $this->validateTimeout($seconds);
154
+ $this->timeout = $seconds;
155
+
156
+ return $this;
157
+ }
158
+
159
+ /**
160
+ * Set writing timeout. Only has effect during connection in the writing cycle.
161
+ *
162
+ * @param float $seconds 0 for no timeout
163
+ */
164
+ public function setWritingTimeout(float $seconds): self
165
+ {
166
+ $this->validateTimeout($seconds);
167
+ $this->writingTimeout = $seconds;
168
+
169
+ return $this;
170
+ }
171
+
172
+ /**
173
+ * Set chunk size. Only has effect during connection in the writing cycle.
174
+ */
175
+ public function setChunkSize(int $bytes): self
176
+ {
177
+ $this->chunkSize = $bytes;
178
+
179
+ return $this;
180
+ }
181
+
182
+ /**
183
+ * Get current connection string
184
+ */
185
+ public function getConnectionString(): string
186
+ {
187
+ return $this->connectionString;
188
+ }
189
+
190
+ /**
191
+ * Get persistent setting
192
+ */
193
+ public function isPersistent(): bool
194
+ {
195
+ return $this->persistent;
196
+ }
197
+
198
+ /**
199
+ * Get current connection timeout setting
200
+ */
201
+ public function getConnectionTimeout(): float
202
+ {
203
+ return $this->connectionTimeout;
204
+ }
205
+
206
+ /**
207
+ * Get current in-transfer timeout
208
+ */
209
+ public function getTimeout(): float
210
+ {
211
+ return $this->timeout;
212
+ }
213
+
214
+ /**
215
+ * Get current local writing timeout
216
+ *
217
+ * @return float
218
+ */
219
+ public function getWritingTimeout(): float
220
+ {
221
+ return $this->writingTimeout;
222
+ }
223
+
224
+ /**
225
+ * Get current chunk size
226
+ */
227
+ public function getChunkSize(): ?int
228
+ {
229
+ return $this->chunkSize;
230
+ }
231
+
232
+ /**
233
+ * Check to see if the socket is currently available.
234
+ *
235
+ * UDP might appear to be connected but might fail when writing. See http://php.net/fsockopen for details.
236
+ */
237
+ public function isConnected(): bool
238
+ {
239
+ return is_resource($this->resource)
240
+ && !feof($this->resource); // on TCP - other party can close connection.
241
+ }
242
+
243
+ /**
244
+ * Wrapper to allow mocking
245
+ *
246
+ * @return resource|false
247
+ */
248
+ protected function pfsockopen()
249
+ {
250
+ return @pfsockopen($this->connectionString, -1, $this->errno, $this->errstr, $this->connectionTimeout);
251
+ }
252
+
253
+ /**
254
+ * Wrapper to allow mocking
255
+ *
256
+ * @return resource|false
257
+ */
258
+ protected function fsockopen()
259
+ {
260
+ return @fsockopen($this->connectionString, -1, $this->errno, $this->errstr, $this->connectionTimeout);
261
+ }
262
+
263
+ /**
264
+ * Wrapper to allow mocking
265
+ *
266
+ * @see http://php.net/manual/en/function.stream-set-timeout.php
267
+ *
268
+ * @return bool
269
+ */
270
+ protected function streamSetTimeout()
271
+ {
272
+ $seconds = floor($this->timeout);
273
+ $microseconds = round(($this->timeout - $seconds) * 1e6);
274
+
275
+ if (!is_resource($this->resource)) {
276
+ throw new \LogicException('streamSetTimeout called but $this->resource is not a resource');
277
+ }
278
+
279
+ return stream_set_timeout($this->resource, (int) $seconds, (int) $microseconds);
280
+ }
281
+
282
+ /**
283
+ * Wrapper to allow mocking
284
+ *
285
+ * @see http://php.net/manual/en/function.stream-set-chunk-size.php
286
+ *
287
+ * @return int|bool
288
+ */
289
+ protected function streamSetChunkSize()
290
+ {
291
+ if (!is_resource($this->resource)) {
292
+ throw new \LogicException('streamSetChunkSize called but $this->resource is not a resource');
293
+ }
294
+
295
+ if (null === $this->chunkSize) {
296
+ throw new \LogicException('streamSetChunkSize called but $this->chunkSize is not set');
297
+ }
298
+
299
+ return stream_set_chunk_size($this->resource, $this->chunkSize);
300
+ }
301
+
302
+ /**
303
+ * Wrapper to allow mocking
304
+ *
305
+ * @return int|bool
306
+ */
307
+ protected function fwrite(string $data)
308
+ {
309
+ if (!is_resource($this->resource)) {
310
+ throw new \LogicException('fwrite called but $this->resource is not a resource');
311
+ }
312
+
313
+ return @fwrite($this->resource, $data);
314
+ }
315
+
316
+ /**
317
+ * Wrapper to allow mocking
318
+ *
319
+ * @return mixed[]|bool
320
+ */
321
+ protected function streamGetMetadata()
322
+ {
323
+ if (!is_resource($this->resource)) {
324
+ throw new \LogicException('streamGetMetadata called but $this->resource is not a resource');
325
+ }
326
+
327
+ return stream_get_meta_data($this->resource);
328
+ }
329
+
330
+ private function validateTimeout(float $value): void
331
+ {
332
+ if ($value < 0) {
333
+ throw new \InvalidArgumentException("Timeout must be 0 or a positive float (got $value)");
334
+ }
335
+ }
336
+
337
+ private function connectIfNotConnected(): void
338
+ {
339
+ if ($this->isConnected()) {
340
+ return;
341
+ }
342
+ $this->connect();
343
+ }
344
+
345
+ /**
346
+ * @phpstan-param FormattedRecord $record
347
+ */
348
+ protected function generateDataStream(array $record): string
349
+ {
350
+ return (string) $record['formatted'];
351
+ }
352
+
353
+ /**
354
+ * @return resource|null
355
+ */
356
+ protected function getResource()
357
+ {
358
+ return $this->resource;
359
+ }
360
+
361
+ private function connect(): void
362
+ {
363
+ $this->createSocketResource();
364
+ $this->setSocketTimeout();
365
+ $this->setStreamChunkSize();
366
+ }
367
+
368
+ private function createSocketResource(): void
369
+ {
370
+ if ($this->isPersistent()) {
371
+ $resource = $this->pfsockopen();
372
+ } else {
373
+ $resource = $this->fsockopen();
374
+ }
375
+ if (is_bool($resource)) {
376
+ throw new \UnexpectedValueException("Failed connecting to $this->connectionString ($this->errno: $this->errstr)");
377
+ }
378
+ $this->resource = $resource;
379
+ }
380
+
381
+ private function setSocketTimeout(): void
382
+ {
383
+ if (!$this->streamSetTimeout()) {
384
+ throw new \UnexpectedValueException("Failed setting timeout with stream_set_timeout()");
385
+ }
386
+ }
387
+
388
+ private function setStreamChunkSize(): void
389
+ {
390
+ if ($this->chunkSize && !$this->streamSetChunkSize()) {
391
+ throw new \UnexpectedValueException("Failed setting chunk size with stream_set_chunk_size()");
392
+ }
393
+ }
394
+
395
+ private function writeToSocket(string $data): void
396
+ {
397
+ $length = strlen($data);
398
+ $sent = 0;
399
+ $this->lastSentBytes = $sent;
400
+ while ($this->isConnected() && $sent < $length) {
401
+ if (0 == $sent) {
402
+ $chunk = $this->fwrite($data);
403
+ } else {
404
+ $chunk = $this->fwrite(substr($data, $sent));
405
+ }
406
+ if ($chunk === false) {
407
+ throw new \RuntimeException("Could not write to socket");
408
+ }
409
+ $sent += $chunk;
410
+ $socketInfo = $this->streamGetMetadata();
411
+ if (is_array($socketInfo) && $socketInfo['timed_out']) {
412
+ throw new \RuntimeException("Write timed-out");
413
+ }
414
+
415
+ if ($this->writingIsTimedOut($sent)) {
416
+ throw new \RuntimeException("Write timed-out, no data sent for `{$this->writingTimeout}` seconds, probably we got disconnected (sent $sent of $length)");
417
+ }
418
+ }
419
+ if (!$this->isConnected() && $sent < $length) {
420
+ throw new \RuntimeException("End-of-file reached, probably we got disconnected (sent $sent of $length)");
421
+ }
422
+ }
423
+
424
+ private function writingIsTimedOut(int $sent): bool
425
+ {
426
+ // convert to ms
427
+ if (0.0 == $this->writingTimeout) {
428
+ return false;
429
+ }
430
+
431
+ if ($sent !== $this->lastSentBytes) {
432
+ $this->lastWritingAt = microtime(true);
433
+ $this->lastSentBytes = $sent;
434
+
435
+ return false;
436
+ } else {
437
+ usleep(100);
438
+ }
439
+
440
+ if ((microtime(true) - $this->lastWritingAt) >= $this->writingTimeout) {
441
+ $this->closeSocket();
442
+
443
+ return true;
444
+ }
445
+
446
+ return false;
447
+ }
448
+ }
vendor/monolog/monolog/src/Monolog/Handler/SqsHandler.php ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Aws\Sqs\SqsClient;
15
+ use Monolog\Logger;
16
+ use Monolog\Utils;
17
+
18
+ /**
19
+ * Writes to any sqs queue.
20
+ *
21
+ * @author Martijn van Calker <git@amvc.nl>
22
+ */
23
+ class SqsHandler extends AbstractProcessingHandler
24
+ {
25
+ /** 256 KB in bytes - maximum message size in SQS */
26
+ protected const MAX_MESSAGE_SIZE = 262144;
27
+ /** 100 KB in bytes - head message size for new error log */
28
+ protected const HEAD_MESSAGE_SIZE = 102400;
29
+
30
+ /** @var SqsClient */
31
+ private $client;
32
+ /** @var string */
33
+ private $queueUrl;
34
+
35
+ public function __construct(SqsClient $sqsClient, string $queueUrl, $level = Logger::DEBUG, bool $bubble = true)
36
+ {
37
+ parent::__construct($level, $bubble);
38
+
39
+ $this->client = $sqsClient;
40
+ $this->queueUrl = $queueUrl;
41
+ }
42
+
43
+ /**
44
+ * {@inheritDoc}
45
+ */
46
+ protected function write(array $record): void
47
+ {
48
+ if (!isset($record['formatted']) || 'string' !== gettype($record['formatted'])) {
49
+ throw new \InvalidArgumentException('SqsHandler accepts only formatted records as a string' . Utils::getRecordMessageForException($record));
50
+ }
51
+
52
+ $messageBody = $record['formatted'];
53
+ if (strlen($messageBody) >= static::MAX_MESSAGE_SIZE) {
54
+ $messageBody = Utils::substr($messageBody, 0, static::HEAD_MESSAGE_SIZE);
55
+ }
56
+
57
+ $this->client->sendMessage([
58
+ 'QueueUrl' => $this->queueUrl,
59
+ 'MessageBody' => $messageBody,
60
+ ]);
61
+ }
62
+ }
vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php ADDED
@@ -0,0 +1,221 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Logger;
15
+ use Monolog\Utils;
16
+
17
+ /**
18
+ * Stores to any stream resource
19
+ *
20
+ * Can be used to store into php://stderr, remote and local files, etc.
21
+ *
22
+ * @author Jordi Boggiano <j.boggiano@seld.be>
23
+ *
24
+ * @phpstan-import-type FormattedRecord from AbstractProcessingHandler
25
+ */
26
+ class StreamHandler extends AbstractProcessingHandler
27
+ {
28
+ /** @const int */
29
+ protected const MAX_CHUNK_SIZE = 2147483647;
30
+ /** @const int 10MB */
31
+ protected const DEFAULT_CHUNK_SIZE = 10 * 1024 * 1024;
32
+ /** @var int */
33
+ protected $streamChunkSize;
34
+ /** @var resource|null */
35
+ protected $stream;
36
+ /** @var ?string */
37
+ protected $url = null;
38
+ /** @var ?string */
39
+ private $errorMessage = null;
40
+ /** @var ?int */
41
+ protected $filePermission;
42
+ /** @var bool */
43
+ protected $useLocking;
44
+ /** @var true|null */
45
+ private $dirCreated = null;
46
+
47
+ /**
48
+ * @param resource|string $stream If a missing path can't be created, an UnexpectedValueException will be thrown on first write
49
+ * @param int|null $filePermission Optional file permissions (default (0644) are only for owner read/write)
50
+ * @param bool $useLocking Try to lock log file before doing any writes
51
+ *
52
+ * @throws \InvalidArgumentException If stream is not a resource or string
53
+ */
54
+ public function __construct($stream, $level = Logger::DEBUG, bool $bubble = true, ?int $filePermission = null, bool $useLocking = false)
55
+ {
56
+ parent::__construct($level, $bubble);
57
+
58
+ if (($phpMemoryLimit = Utils::expandIniShorthandBytes(ini_get('memory_limit'))) !== false) {
59
+ if ($phpMemoryLimit > 0) {
60
+ // use max 10% of allowed memory for the chunk size, and at least 100KB
61
+ $this->streamChunkSize = min(static::MAX_CHUNK_SIZE, max((int) ($phpMemoryLimit / 10), 100 * 1024));
62
+ } else {
63
+ // memory is unlimited, set to the default 10MB
64
+ $this->streamChunkSize = static::DEFAULT_CHUNK_SIZE;
65
+ }
66
+ } else {
67
+ // no memory limit information, set to the default 10MB
68
+ $this->streamChunkSize = static::DEFAULT_CHUNK_SIZE;
69
+ }
70
+
71
+ if (is_resource($stream)) {
72
+ $this->stream = $stream;
73
+
74
+ stream_set_chunk_size($this->stream, $this->streamChunkSize);
75
+ } elseif (is_string($stream)) {
76
+ $this->url = Utils::canonicalizePath($stream);
77
+ } else {
78
+ throw new \InvalidArgumentException('A stream must either be a resource or a string.');
79
+ }
80
+
81
+ $this->filePermission = $filePermission;
82
+ $this->useLocking = $useLocking;
83
+ }
84
+
85
+ /**
86
+ * {@inheritDoc}
87
+ */
88
+ public function close(): void
89
+ {
90
+ if ($this->url && is_resource($this->stream)) {
91
+ fclose($this->stream);
92
+ }
93
+ $this->stream = null;
94
+ $this->dirCreated = null;
95
+ }
96
+
97
+ /**
98
+ * Return the currently active stream if it is open
99
+ *
100
+ * @return resource|null
101
+ */
102
+ public function getStream()
103
+ {
104
+ return $this->stream;
105
+ }
106
+
107
+ /**
108
+ * Return the stream URL if it was configured with a URL and not an active resource
109
+ *
110
+ * @return string|null
111
+ */
112
+ public function getUrl(): ?string
113
+ {
114
+ return $this->url;
115
+ }
116
+
117
+ /**
118
+ * @return int
119
+ */
120
+ public function getStreamChunkSize(): int
121
+ {
122
+ return $this->streamChunkSize;
123
+ }
124
+
125
+ /**
126
+ * {@inheritDoc}
127
+ */
128
+ protected function write(array $record): void
129
+ {
130
+ if (!is_resource($this->stream)) {
131
+ $url = $this->url;
132
+ if (null === $url || '' === $url) {
133
+ throw new \LogicException('Missing stream url, the stream can not be opened. This may be caused by a premature call to close().' . Utils::getRecordMessageForException($record));
134
+ }
135
+ $this->createDir($url);
136
+ $this->errorMessage = null;
137
+ set_error_handler([$this, 'customErrorHandler']);
138
+ $stream = fopen($url, 'a');
139
+ if ($this->filePermission !== null) {
140
+ @chmod($url, $this->filePermission);
141
+ }
142
+ restore_error_handler();
143
+ if (!is_resource($stream)) {
144
+ $this->stream = null;
145
+
146
+ throw new \UnexpectedValueException(sprintf('The stream or file "%s" could not be opened in append mode: '.$this->errorMessage, $url) . Utils::getRecordMessageForException($record));
147
+ }
148
+ stream_set_chunk_size($stream, $this->streamChunkSize);
149
+ $this->stream = $stream;
150
+ }
151
+
152
+ $stream = $this->stream;
153
+ if (!is_resource($stream)) {
154
+ throw new \LogicException('No stream was opened yet' . Utils::getRecordMessageForException($record));
155
+ }
156
+
157
+ if ($this->useLocking) {
158
+ // ignoring errors here, there's not much we can do about them
159
+ flock($stream, LOCK_EX);
160
+ }
161
+
162
+ $this->streamWrite($stream, $record);
163
+
164
+ if ($this->useLocking) {
165
+ flock($stream, LOCK_UN);
166
+ }
167
+ }
168
+
169
+ /**
170
+ * Write to stream
171
+ * @param resource $stream
172
+ * @param array $record
173
+ *
174
+ * @phpstan-param FormattedRecord $record
175
+ */
176
+ protected function streamWrite($stream, array $record): void
177
+ {
178
+ fwrite($stream, (string) $record['formatted']);
179
+ }
180
+
181
+ private function customErrorHandler(int $code, string $msg): bool
182
+ {
183
+ $this->errorMessage = preg_replace('{^(fopen|mkdir)\(.*?\): }', '', $msg);
184
+
185
+ return true;
186
+ }
187
+
188
+ private function getDirFromStream(string $stream): ?string
189
+ {
190
+ $pos = strpos($stream, '://');
191
+ if ($pos === false) {
192
+ return dirname($stream);
193
+ }
194
+
195
+ if ('file://' === substr($stream, 0, 7)) {
196
+ return dirname(substr($stream, 7));
197
+ }
198
+
199
+ return null;
200
+ }
201
+
202
+ private function createDir(string $url): void
203
+ {
204
+ // Do not try to create dir if it has already been tried.
205
+ if ($this->dirCreated) {
206
+ return;
207
+ }
208
+
209
+ $dir = $this->getDirFromStream($url);
210
+ if (null !== $dir && !is_dir($dir)) {
211
+ $this->errorMessage = null;
212
+ set_error_handler([$this, 'customErrorHandler']);
213
+ $status = mkdir($dir, 0777, true);
214
+ restore_error_handler();
215
+ if (false === $status && !is_dir($dir) && strpos((string) $this->errorMessage, 'File exists') === false) {
216
+ throw new \UnexpectedValueException(sprintf('There is no existing directory at "%s" and it could not be created: '.$this->errorMessage, $dir));
217
+ }
218
+ }
219
+ $this->dirCreated = true;
220
+ }
221
+ }
vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php ADDED
@@ -0,0 +1,115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Logger;
15
+ use Monolog\Utils;
16
+ use Monolog\Formatter\FormatterInterface;
17
+ use Monolog\Formatter\LineFormatter;
18
+ use Swift_Message;
19
+ use Swift;
20
+
21
+ /**
22
+ * SwiftMailerHandler uses Swift_Mailer to send the emails
23
+ *
24
+ * @author Gyula Sallai
25
+ *
26
+ * @phpstan-import-type Record from \Monolog\Logger
27
+ * @deprecated Since Monolog 2.6. Use SymfonyMailerHandler instead.
28
+ */
29
+ class SwiftMailerHandler extends MailHandler
30
+ {
31
+ /** @var \Swift_Mailer */
32
+ protected $mailer;
33
+ /** @var Swift_Message|callable(string, Record[]): Swift_Message */
34
+ private $messageTemplate;
35
+
36
+ /**
37
+ * @psalm-param Swift_Message|callable(string, Record[]): Swift_Message $message
38
+ *
39
+ * @param \Swift_Mailer $mailer The mailer to use
40
+ * @param callable|Swift_Message $message An example message for real messages, only the body will be replaced
41
+ */
42
+ public function __construct(\Swift_Mailer $mailer, $message, $level = Logger::ERROR, bool $bubble = true)
43
+ {
44
+ parent::__construct($level, $bubble);
45
+
46
+ @trigger_error('The SwiftMailerHandler is deprecated since Monolog 2.6. Use SymfonyMailerHandler instead.', E_USER_DEPRECATED);
47
+
48
+ $this->mailer = $mailer;
49
+ $this->messageTemplate = $message;
50
+ }
51
+
52
+ /**
53
+ * {@inheritDoc}
54
+ */
55
+ protected function send(string $content, array $records): void
56
+ {
57
+ $this->mailer->send($this->buildMessage($content, $records));
58
+ }
59
+
60
+ /**
61
+ * Gets the formatter for the Swift_Message subject.
62
+ *
63
+ * @param string|null $format The format of the subject
64
+ */
65
+ protected function getSubjectFormatter(?string $format): FormatterInterface
66
+ {
67
+ return new LineFormatter($format);
68
+ }
69
+
70
+ /**
71
+ * Creates instance of Swift_Message to be sent
72
+ *
73
+ * @param string $content formatted email body to be sent
74
+ * @param array $records Log records that formed the content
75
+ * @return Swift_Message
76
+ *
77
+ * @phpstan-param Record[] $records
78
+ */
79
+ protected function buildMessage(string $content, array $records): Swift_Message
80
+ {
81
+ $message = null;
82
+ if ($this->messageTemplate instanceof Swift_Message) {
83
+ $message = clone $this->messageTemplate;
84
+ $message->generateId();
85
+ } elseif (is_callable($this->messageTemplate)) {
86
+ $message = ($this->messageTemplate)($content, $records);
87
+ }
88
+
89
+ if (!$message instanceof Swift_Message) {
90
+ $record = reset($records);
91
+ throw new \InvalidArgumentException('Could not resolve message as instance of Swift_Message or a callable returning it' . ($record ? Utils::getRecordMessageForException($record) : ''));
92
+ }
93
+
94
+ if ($records) {
95
+ $subjectFormatter = $this->getSubjectFormatter($message->getSubject());
96
+ $message->setSubject($subjectFormatter->format($this->getHighestRecord($records)));
97
+ }
98
+
99
+ $mime = 'text/plain';
100
+ if ($this->isHtmlBody($content)) {
101
+ $mime = 'text/html';
102
+ }
103
+
104
+ $message->setBody($content, $mime);
105
+ /** @phpstan-ignore-next-line */
106
+ if (version_compare(Swift::VERSION, '6.0.0', '>=')) {
107
+ $message->setDate(new \DateTimeImmutable());
108
+ } else {
109
+ /** @phpstan-ignore-next-line */
110
+ $message->setDate(time());
111
+ }
112
+
113
+ return $message;
114
+ }
115
+ }
vendor/monolog/monolog/src/Monolog/Handler/SymfonyMailerHandler.php ADDED
@@ -0,0 +1,111 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Logger;
15
+ use Monolog\Utils;
16
+ use Monolog\Formatter\FormatterInterface;
17
+ use Monolog\Formatter\LineFormatter;
18
+ use Symfony\Component\Mailer\MailerInterface;
19
+ use Symfony\Component\Mailer\Transport\TransportInterface;
20
+ use Symfony\Component\Mime\Email;
21
+
22
+ /**
23
+ * SymfonyMailerHandler uses Symfony's Mailer component to send the emails
24
+ *
25
+ * @author Jordi Boggiano <j.boggiano@seld.be>
26
+ *
27
+ * @phpstan-import-type Record from \Monolog\Logger
28
+ */
29
+ class SymfonyMailerHandler extends MailHandler
30
+ {
31
+ /** @var MailerInterface|TransportInterface */
32
+ protected $mailer;
33
+ /** @var Email|callable(string, Record[]): Email */
34
+ private $emailTemplate;
35
+
36
+ /**
37
+ * @psalm-param Email|callable(string, Record[]): Email $email
38
+ *
39
+ * @param MailerInterface|TransportInterface $mailer The mailer to use
40
+ * @param callable|Email $email An email template, the subject/body will be replaced
41
+ */
42
+ public function __construct($mailer, $email, $level = Logger::ERROR, bool $bubble = true)
43
+ {
44
+ parent::__construct($level, $bubble);
45
+
46
+ $this->mailer = $mailer;
47
+ $this->emailTemplate = $email;
48
+ }
49
+
50
+ /**
51
+ * {@inheritDoc}
52
+ */
53
+ protected function send(string $content, array $records): void
54
+ {
55
+ $this->mailer->send($this->buildMessage($content, $records));
56
+ }
57
+
58
+ /**
59
+ * Gets the formatter for the Swift_Message subject.
60
+ *
61
+ * @param string|null $format The format of the subject
62
+ */
63
+ protected function getSubjectFormatter(?string $format): FormatterInterface
64
+ {
65
+ return new LineFormatter($format);
66
+ }
67
+
68
+ /**
69
+ * Creates instance of Email to be sent
70
+ *
71
+ * @param string $content formatted email body to be sent
72
+ * @param array $records Log records that formed the content
73
+ *
74
+ * @phpstan-param Record[] $records
75
+ */
76
+ protected function buildMessage(string $content, array $records): Email
77
+ {
78
+ $message = null;
79
+ if ($this->emailTemplate instanceof Email) {
80
+ $message = clone $this->emailTemplate;
81
+ } elseif (is_callable($this->emailTemplate)) {
82
+ $message = ($this->emailTemplate)($content, $records);
83
+ }
84
+
85
+ if (!$message instanceof Email) {
86
+ $record = reset($records);
87
+ throw new \InvalidArgumentException('Could not resolve message as instance of Email or a callable returning it' . ($record ? Utils::getRecordMessageForException($record) : ''));
88
+ }
89
+
90
+ if ($records) {
91
+ $subjectFormatter = $this->getSubjectFormatter($message->getSubject());
92
+ $message->subject($subjectFormatter->format($this->getHighestRecord($records)));
93
+ }
94
+
95
+ if ($this->isHtmlBody($content)) {
96
+ if (null !== ($charset = $message->getHtmlCharset())) {
97
+ $message->html($content, $charset);
98
+ } else {
99
+ $message->html($content);
100
+ }
101
+ } else {
102
+ if (null !== ($charset = $message->getTextCharset())) {
103
+ $message->text($content, $charset);
104
+ } else {
105
+ $message->text($content);
106
+ }
107
+ }
108
+
109
+ return $message->date(new \DateTimeImmutable());
110
+ }
111
+ }
vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Logger;
15
+ use Monolog\Utils;
16
+
17
+ /**
18
+ * Logs to syslog service.
19
+ *
20
+ * usage example:
21
+ *
22
+ * $log = new Logger('application');
23
+ * $syslog = new SyslogHandler('myfacility', 'local6');
24
+ * $formatter = new LineFormatter("%channel%.%level_name%: %message% %extra%");
25
+ * $syslog->setFormatter($formatter);
26
+ * $log->pushHandler($syslog);
27
+ *
28
+ * @author Sven Paulus <sven@karlsruhe.org>
29
+ */
30
+ class SyslogHandler extends AbstractSyslogHandler
31
+ {
32
+ /** @var string */
33
+ protected $ident;
34
+ /** @var int */
35
+ protected $logopts;
36
+
37
+ /**
38
+ * @param string $ident
39
+ * @param string|int $facility Either one of the names of the keys in $this->facilities, or a LOG_* facility constant
40
+ * @param int $logopts Option flags for the openlog() call, defaults to LOG_PID
41
+ */
42
+ public function __construct(string $ident, $facility = LOG_USER, $level = Logger::DEBUG, bool $bubble = true, int $logopts = LOG_PID)
43
+ {
44
+ parent::__construct($facility, $level, $bubble);
45
+
46
+ $this->ident = $ident;
47
+ $this->logopts = $logopts;
48
+ }
49
+
50
+ /**
51
+ * {@inheritDoc}
52
+ */
53
+ public function close(): void
54
+ {
55
+ closelog();
56
+ }
57
+
58
+ /**
59
+ * {@inheritDoc}
60
+ */
61
+ protected function write(array $record): void
62
+ {
63
+ if (!openlog($this->ident, $this->logopts, $this->facility)) {
64
+ throw new \LogicException('Can\'t open syslog for ident "'.$this->ident.'" and facility "'.$this->facility.'"' . Utils::getRecordMessageForException($record));
65
+ }
66
+ syslog($this->logLevels[$record['level']], (string) $record['formatted']);
67
+ }
68
+ }
vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php ADDED
@@ -0,0 +1,88 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler\SyslogUdp;
13
+
14
+ use Monolog\Utils;
15
+ use Socket;
16
+
17
+ class UdpSocket
18
+ {
19
+ protected const DATAGRAM_MAX_LENGTH = 65023;
20
+
21
+ /** @var string */
22
+ protected $ip;
23
+ /** @var int */
24
+ protected $port;
25
+ /** @var resource|Socket|null */
26
+ protected $socket = null;
27
+
28
+ public function __construct(string $ip, int $port = 514)
29
+ {
30
+ $this->ip = $ip;
31
+ $this->port = $port;
32
+ }
33
+
34
+ /**
35
+ * @param string $line
36
+ * @param string $header
37
+ * @return void
38
+ */
39
+ public function write($line, $header = "")
40
+ {
41
+ $this->send($this->assembleMessage($line, $header));
42
+ }
43
+
44
+ public function close(): void
45
+ {
46
+ if (is_resource($this->socket) || $this->socket instanceof Socket) {
47
+ socket_close($this->socket);
48
+ $this->socket = null;
49
+ }
50
+ }
51
+
52
+ /**
53
+ * @return resource|Socket
54
+ */
55
+ protected function getSocket()
56
+ {
57
+ if (null !== $this->socket) {
58
+ return $this->socket;
59
+ }
60
+
61
+ $domain = AF_INET;
62
+ $protocol = SOL_UDP;
63
+ // Check if we are using unix sockets.
64
+ if ($this->port === 0) {
65
+ $domain = AF_UNIX;
66
+ $protocol = IPPROTO_IP;
67
+ }
68
+
69
+ $this->socket = socket_create($domain, SOCK_DGRAM, $protocol) ?: null;
70
+ if (null === $this->socket) {
71
+ throw new \RuntimeException('The UdpSocket to '.$this->ip.':'.$this->port.' could not be opened via socket_create');
72
+ }
73
+
74
+ return $this->socket;
75
+ }
76
+
77
+ protected function send(string $chunk): void
78
+ {
79
+ socket_sendto($this->getSocket(), $chunk, strlen($chunk), $flags = 0, $this->ip, $this->port);
80
+ }
81
+
82
+ protected function assembleMessage(string $line, string $header): string
83
+ {
84
+ $chunkSize = static::DATAGRAM_MAX_LENGTH - strlen($header);
85
+
86
+ return $header . Utils::substr($line, 0, $chunkSize);
87
+ }
88
+ }
vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php ADDED
@@ -0,0 +1,150 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use DateTimeInterface;
15
+ use Monolog\Logger;
16
+ use Monolog\Handler\SyslogUdp\UdpSocket;
17
+ use Monolog\Utils;
18
+
19
+ /**
20
+ * A Handler for logging to a remote syslogd server.
21
+ *
22
+ * @author Jesper Skovgaard Nielsen <nulpunkt@gmail.com>
23
+ * @author Dominik Kukacka <dominik.kukacka@gmail.com>
24
+ */
25
+ class SyslogUdpHandler extends AbstractSyslogHandler
26
+ {
27
+ const RFC3164 = 0;
28
+ const RFC5424 = 1;
29
+ const RFC5424e = 2;
30
+
31
+ /** @var array<self::RFC*, string> */
32
+ private $dateFormats = array(
33
+ self::RFC3164 => 'M d H:i:s',
34
+ self::RFC5424 => \DateTime::RFC3339,
35
+ self::RFC5424e => \DateTime::RFC3339_EXTENDED,
36
+ );
37
+
38
+ /** @var UdpSocket */
39
+ protected $socket;
40
+ /** @var string */
41
+ protected $ident;
42
+ /** @var self::RFC* */
43
+ protected $rfc;
44
+
45
+ /**
46
+ * @param string $host Either IP/hostname or a path to a unix socket (port must be 0 then)
47
+ * @param int $port Port number, or 0 if $host is a unix socket
48
+ * @param string|int $facility Either one of the names of the keys in $this->facilities, or a LOG_* facility constant
49
+ * @param bool $bubble Whether the messages that are handled can bubble up the stack or not
50
+ * @param string $ident Program name or tag for each log message.
51
+ * @param int $rfc RFC to format the message for.
52
+ * @throws MissingExtensionException
53
+ *
54
+ * @phpstan-param self::RFC* $rfc
55
+ */
56
+ public function __construct(string $host, int $port = 514, $facility = LOG_USER, $level = Logger::DEBUG, bool $bubble = true, string $ident = 'php', int $rfc = self::RFC5424)
57
+ {
58
+ if (!extension_loaded('sockets')) {
59
+ throw new MissingExtensionException('The sockets extension is required to use the SyslogUdpHandler');
60
+ }
61
+
62
+ parent::__construct($facility, $level, $bubble);
63
+
64
+ $this->ident = $ident;
65
+ $this->rfc = $rfc;
66
+
67
+ $this->socket = new UdpSocket($host, $port);
68
+ }
69
+
70
+ protected function write(array $record): void
71
+ {
72
+ $lines = $this->splitMessageIntoLines($record['formatted']);
73
+
74
+ $header = $this->makeCommonSyslogHeader($this->logLevels[$record['level']], $record['datetime']);
75
+
76
+ foreach ($lines as $line) {
77
+ $this->socket->write($line, $header);
78
+ }
79
+ }
80
+
81
+ public function close(): void
82
+ {
83
+ $this->socket->close();
84
+ }
85
+
86
+ /**
87
+ * @param string|string[] $message
88
+ * @return string[]
89
+ */
90
+ private function splitMessageIntoLines($message): array
91
+ {
92
+ if (is_array($message)) {
93
+ $message = implode("\n", $message);
94
+ }
95
+
96
+ $lines = preg_split('/$\R?^/m', (string) $message, -1, PREG_SPLIT_NO_EMPTY);
97
+ if (false === $lines) {
98
+ $pcreErrorCode = preg_last_error();
99
+ throw new \RuntimeException('Could not preg_split: ' . $pcreErrorCode . ' / ' . Utils::pcreLastErrorMessage($pcreErrorCode));
100
+ }
101
+
102
+ return $lines;
103
+ }
104
+
105
+ /**
106
+ * Make common syslog header (see rfc5424 or rfc3164)
107
+ */
108
+ protected function makeCommonSyslogHeader(int $severity, DateTimeInterface $datetime): string
109
+ {
110
+ $priority = $severity + $this->facility;
111
+
112
+ if (!$pid = getmypid()) {
113
+ $pid = '-';
114
+ }
115
+
116
+ if (!$hostname = gethostname()) {
117
+ $hostname = '-';
118
+ }
119
+
120
+ if ($this->rfc === self::RFC3164) {
121
+ // see https://github.com/phpstan/phpstan/issues/5348
122
+ // @phpstan-ignore-next-line
123
+ $dateNew = $datetime->setTimezone(new \DateTimeZone('UTC'));
124
+ $date = $dateNew->format($this->dateFormats[$this->rfc]);
125
+
126
+ return "<$priority>" .
127
+ $date . " " .
128
+ $hostname . " " .
129
+ $this->ident . "[" . $pid . "]: ";
130
+ }
131
+
132
+ $date = $datetime->format($this->dateFormats[$this->rfc]);
133
+
134
+ return "<$priority>1 " .
135
+ $date . " " .
136
+ $hostname . " " .
137
+ $this->ident . " " .
138
+ $pid . " - - ";
139
+ }
140
+
141
+ /**
142
+ * Inject your own socket, mainly used for testing
143
+ */
144
+ public function setSocket(UdpSocket $socket): self
145
+ {
146
+ $this->socket = $socket;
147
+
148
+ return $this;
149
+ }
150
+ }
vendor/monolog/monolog/src/Monolog/Handler/TelegramBotHandler.php ADDED
@@ -0,0 +1,274 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use RuntimeException;
15
+ use Monolog\Logger;
16
+ use Monolog\Utils;
17
+
18
+ /**
19
+ * Handler send logs to Telegram using Telegram Bot API.
20
+ *
21
+ * How to use:
22
+ * 1) Create telegram bot with https://telegram.me/BotFather
23
+ * 2) Create a telegram channel where logs will be recorded.
24
+ * 3) Add created bot from step 1 to the created channel from step 2.
25
+ *
26
+ * Use telegram bot API key from step 1 and channel name with '@' prefix from step 2 to create instance of TelegramBotHandler
27
+ *
28
+ * @link https://core.telegram.org/bots/api
29
+ *
30
+ * @author Mazur Alexandr <alexandrmazur96@gmail.com>
31
+ *
32
+ * @phpstan-import-type Record from \Monolog\Logger
33
+ */
34
+ class TelegramBotHandler extends AbstractProcessingHandler
35
+ {
36
+ private const BOT_API = 'https://api.telegram.org/bot';
37
+
38
+ /**
39
+ * The available values of parseMode according to the Telegram api documentation
40
+ */
41
+ private const AVAILABLE_PARSE_MODES = [
42
+ 'HTML',
43
+ 'MarkdownV2',
44
+ 'Markdown', // legacy mode without underline and strikethrough, use MarkdownV2 instead
45
+ ];
46
+
47
+ /**
48
+ * The maximum number of characters allowed in a message according to the Telegram api documentation
49
+ */
50
+ private const MAX_MESSAGE_LENGTH = 4096;
51
+
52
+ /**
53
+ * Telegram bot access token provided by BotFather.
54
+ * Create telegram bot with https://telegram.me/BotFather and use access token from it.
55
+ * @var string
56
+ */
57
+ private $apiKey;
58
+
59
+ /**
60
+ * Telegram channel name.
61
+ * Since to start with '@' symbol as prefix.
62
+ * @var string
63
+ */
64
+ private $channel;
65
+
66
+ /**
67
+ * The kind of formatting that is used for the message.
68
+ * See available options at https://core.telegram.org/bots/api#formatting-options
69
+ * or in AVAILABLE_PARSE_MODES
70
+ * @var ?string
71
+ */
72
+ private $parseMode;
73
+
74
+ /**
75
+ * Disables link previews for links in the message.
76
+ * @var ?bool
77
+ */
78
+ private $disableWebPagePreview;
79
+
80
+ /**
81
+ * Sends the message silently. Users will receive a notification with no sound.
82
+ * @var ?bool
83
+ */
84
+ private $disableNotification;
85
+
86
+ /**
87
+ * True - split a message longer than MAX_MESSAGE_LENGTH into parts and send in multiple messages.
88
+ * False - truncates a message that is too long.
89
+ * @var bool
90
+ */
91
+ private $splitLongMessages;
92
+
93
+ /**
94
+ * Adds 1-second delay between sending a split message (according to Telegram API to avoid 429 Too Many Requests).
95
+ * @var bool
96
+ */
97
+ private $delayBetweenMessages;
98
+
99
+ /**
100
+ * @param string $apiKey Telegram bot access token provided by BotFather
101
+ * @param string $channel Telegram channel name
102
+ * @param bool $splitLongMessages Split a message longer than MAX_MESSAGE_LENGTH into parts and send in multiple messages
103
+ * @param bool $delayBetweenMessages Adds delay between sending a split message according to Telegram API
104
+ * @throws MissingExtensionException
105
+ */
106
+ public function __construct(
107
+ string $apiKey,
108
+ string $channel,
109
+ $level = Logger::DEBUG,
110
+ bool $bubble = true,
111
+ string $parseMode = null,
112
+ bool $disableWebPagePreview = null,
113
+ bool $disableNotification = null,
114
+ bool $splitLongMessages = false,
115
+ bool $delayBetweenMessages = false
116
+ )
117
+ {
118
+ if (!extension_loaded('curl')) {
119
+ throw new MissingExtensionException('The curl extension is needed to use the TelegramBotHandler');
120
+ }
121
+
122
+ parent::__construct($level, $bubble);
123
+
124
+ $this->apiKey = $apiKey;
125
+ $this->channel = $channel;
126
+ $this->setParseMode($parseMode);
127
+ $this->disableWebPagePreview($disableWebPagePreview);
128
+ $this->disableNotification($disableNotification);
129
+ $this->splitLongMessages($splitLongMessages);
130
+ $this->delayBetweenMessages($delayBetweenMessages);
131
+ }
132
+
133
+ public function setParseMode(string $parseMode = null): self
134
+ {
135
+ if ($parseMode !== null && !in_array($parseMode, self::AVAILABLE_PARSE_MODES)) {
136
+ throw new \InvalidArgumentException('Unknown parseMode, use one of these: ' . implode(', ', self::AVAILABLE_PARSE_MODES) . '.');
137
+ }
138
+
139
+ $this->parseMode = $parseMode;
140
+
141
+ return $this;
142
+ }
143
+
144
+ public function disableWebPagePreview(bool $disableWebPagePreview = null): self
145
+ {
146
+ $this->disableWebPagePreview = $disableWebPagePreview;
147
+
148
+ return $this;
149
+ }
150
+
151
+ public function disableNotification(bool $disableNotification = null): self
152
+ {
153
+ $this->disableNotification = $disableNotification;
154
+
155
+ return $this;
156
+ }
157
+
158
+ /**
159
+ * True - split a message longer than MAX_MESSAGE_LENGTH into parts and send in multiple messages.
160
+ * False - truncates a message that is too long.
161
+ * @param bool $splitLongMessages
162
+ * @return $this
163
+ */
164
+ public function splitLongMessages(bool $splitLongMessages = false): self
165
+ {
166
+ $this->splitLongMessages = $splitLongMessages;
167
+
168
+ return $this;
169
+ }
170
+
171
+ /**
172
+ * Adds 1-second delay between sending a split message (according to Telegram API to avoid 429 Too Many Requests).
173
+ * @param bool $delayBetweenMessages
174
+ * @return $this
175
+ */
176
+ public function delayBetweenMessages(bool $delayBetweenMessages = false): self
177
+ {
178
+ $this->delayBetweenMessages = $delayBetweenMessages;
179
+
180
+ return $this;
181
+ }
182
+
183
+ /**
184
+ * {@inheritDoc}
185
+ */
186
+ public function handleBatch(array $records): void
187
+ {
188
+ /** @var Record[] $messages */
189
+ $messages = [];
190
+
191
+ foreach ($records as $record) {
192
+ if (!$this->isHandling($record)) {
193
+ continue;
194
+ }
195
+
196
+ if ($this->processors) {
197
+ /** @var Record $record */
198
+ $record = $this->processRecord($record);
199
+ }
200
+
201
+ $messages[] = $record;
202
+ }
203
+
204
+ if (!empty($messages)) {
205
+ $this->send((string)$this->getFormatter()->formatBatch($messages));
206
+ }
207
+ }
208
+
209
+ /**
210
+ * @inheritDoc
211
+ */
212
+ protected function write(array $record): void
213
+ {
214
+ $this->send($record['formatted']);
215
+ }
216
+
217
+ /**
218
+ * Send request to @link https://api.telegram.org/bot on SendMessage action.
219
+ * @param string $message
220
+ */
221
+ protected function send(string $message): void
222
+ {
223
+ $messages = $this->handleMessageLength($message);
224
+
225
+ foreach ($messages as $key => $msg) {
226
+ if ($this->delayBetweenMessages && $key > 0) {
227
+ sleep(1);
228
+ }
229
+
230
+ $this->sendCurl($msg);
231
+ }
232
+ }
233
+
234
+ protected function sendCurl(string $message): void
235
+ {
236
+ $ch = curl_init();
237
+ $url = self::BOT_API . $this->apiKey . '/SendMessage';
238
+ curl_setopt($ch, CURLOPT_URL, $url);
239
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
240
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
241
+ curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
242
+ 'text' => $message,
243
+ 'chat_id' => $this->channel,
244
+ 'parse_mode' => $this->parseMode,
245
+ 'disable_web_page_preview' => $this->disableWebPagePreview,
246
+ 'disable_notification' => $this->disableNotification,
247
+ ]));
248
+
249
+ $result = Curl\Util::execute($ch);
250
+ if (!is_string($result)) {
251
+ throw new RuntimeException('Telegram API error. Description: No response');
252
+ }
253
+ $result = json_decode($result, true);
254
+
255
+ if ($result['ok'] === false) {
256
+ throw new RuntimeException('Telegram API error. Description: ' . $result['description']);
257
+ }
258
+ }
259
+
260
+ /**
261
+ * Handle a message that is too long: truncates or splits into several
262
+ * @param string $message
263
+ * @return string[]
264
+ */
265
+ private function handleMessageLength(string $message): array
266
+ {
267
+ $truncatedMarker = ' (...truncated)';
268
+ if (!$this->splitLongMessages && strlen($message) > self::MAX_MESSAGE_LENGTH) {
269
+ return [Utils::substr($message, 0, self::MAX_MESSAGE_LENGTH - strlen($truncatedMarker)) . $truncatedMarker];
270
+ }
271
+
272
+ return str_split($message, self::MAX_MESSAGE_LENGTH);
273
+ }
274
+ }
vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php ADDED
@@ -0,0 +1,231 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Logger;
15
+ use Psr\Log\LogLevel;
16
+
17
+ /**
18
+ * Used for testing purposes.
19
+ *
20
+ * It records all records and gives you access to them for verification.
21
+ *
22
+ * @author Jordi Boggiano <j.boggiano@seld.be>
23
+ *
24
+ * @method bool hasEmergency($record)
25
+ * @method bool hasAlert($record)
26
+ * @method bool hasCritical($record)
27
+ * @method bool hasError($record)
28
+ * @method bool hasWarning($record)
29
+ * @method bool hasNotice($record)
30
+ * @method bool hasInfo($record)
31
+ * @method bool hasDebug($record)
32
+ *
33
+ * @method bool hasEmergencyRecords()
34
+ * @method bool hasAlertRecords()
35
+ * @method bool hasCriticalRecords()
36
+ * @method bool hasErrorRecords()
37
+ * @method bool hasWarningRecords()
38
+ * @method bool hasNoticeRecords()
39
+ * @method bool hasInfoRecords()
40
+ * @method bool hasDebugRecords()
41
+ *
42
+ * @method bool hasEmergencyThatContains($message)
43
+ * @method bool hasAlertThatContains($message)
44
+ * @method bool hasCriticalThatContains($message)
45
+ * @method bool hasErrorThatContains($message)
46
+ * @method bool hasWarningThatContains($message)
47
+ * @method bool hasNoticeThatContains($message)
48
+ * @method bool hasInfoThatContains($message)
49
+ * @method bool hasDebugThatContains($message)
50
+ *
51
+ * @method bool hasEmergencyThatMatches($message)
52
+ * @method bool hasAlertThatMatches($message)
53
+ * @method bool hasCriticalThatMatches($message)
54
+ * @method bool hasErrorThatMatches($message)
55
+ * @method bool hasWarningThatMatches($message)
56
+ * @method bool hasNoticeThatMatches($message)
57
+ * @method bool hasInfoThatMatches($message)
58
+ * @method bool hasDebugThatMatches($message)
59
+ *
60
+ * @method bool hasEmergencyThatPasses($message)
61
+ * @method bool hasAlertThatPasses($message)
62
+ * @method bool hasCriticalThatPasses($message)
63
+ * @method bool hasErrorThatPasses($message)
64
+ * @method bool hasWarningThatPasses($message)
65
+ * @method bool hasNoticeThatPasses($message)
66
+ * @method bool hasInfoThatPasses($message)
67
+ * @method bool hasDebugThatPasses($message)
68
+ *
69
+ * @phpstan-import-type Record from \Monolog\Logger
70
+ * @phpstan-import-type Level from \Monolog\Logger
71
+ * @phpstan-import-type LevelName from \Monolog\Logger
72
+ */
73
+ class TestHandler extends AbstractProcessingHandler
74
+ {
75
+ /** @var Record[] */
76
+ protected $records = [];
77
+ /** @var array<Level, Record[]> */
78
+ protected $recordsByLevel = [];
79
+ /** @var bool */
80
+ private $skipReset = false;
81
+
82
+ /**
83
+ * @return array
84
+ *
85
+ * @phpstan-return Record[]
86
+ */
87
+ public function getRecords()
88
+ {
89
+ return $this->records;
90
+ }
91
+
92
+ /**
93
+ * @return void
94
+ */
95
+ public function clear()
96
+ {
97
+ $this->records = [];
98
+ $this->recordsByLevel = [];
99
+ }
100
+
101
+ /**
102
+ * @return void
103
+ */
104
+ public function reset()
105
+ {
106
+ if (!$this->skipReset) {
107
+ $this->clear();
108
+ }
109
+ }
110
+
111
+ /**
112
+ * @return void
113
+ */
114
+ public function setSkipReset(bool $skipReset)
115
+ {
116
+ $this->skipReset = $skipReset;
117
+ }
118
+
119
+ /**
120
+ * @param string|int $level Logging level value or name
121
+ *
122
+ * @phpstan-param Level|LevelName|LogLevel::* $level
123
+ */
124
+ public function hasRecords($level): bool
125
+ {
126
+ return isset($this->recordsByLevel[Logger::toMonologLevel($level)]);
127
+ }
128
+
129
+ /**
130
+ * @param string|array $record Either a message string or an array containing message and optionally context keys that will be checked against all records
131
+ * @param string|int $level Logging level value or name
132
+ *
133
+ * @phpstan-param array{message: string, context?: mixed[]}|string $record
134
+ * @phpstan-param Level|LevelName|LogLevel::* $level
135
+ */
136
+ public function hasRecord($record, $level): bool
137
+ {
138
+ if (is_string($record)) {
139
+ $record = array('message' => $record);
140
+ }
141
+
142
+ return $this->hasRecordThatPasses(function ($rec) use ($record) {
143
+ if ($rec['message'] !== $record['message']) {
144
+ return false;
145
+ }
146
+ if (isset($record['context']) && $rec['context'] !== $record['context']) {
147
+ return false;
148
+ }
149
+
150
+ return true;
151
+ }, $level);
152
+ }
153
+
154
+ /**
155
+ * @param string|int $level Logging level value or name
156
+ *
157
+ * @phpstan-param Level|LevelName|LogLevel::* $level
158
+ */
159
+ public function hasRecordThatContains(string $message, $level): bool
160
+ {
161
+ return $this->hasRecordThatPasses(function ($rec) use ($message) {
162
+ return strpos($rec['message'], $message) !== false;
163
+ }, $level);
164
+ }
165
+
166
+ /**
167
+ * @param string|int $level Logging level value or name
168
+ *
169
+ * @phpstan-param Level|LevelName|LogLevel::* $level
170
+ */
171
+ public function hasRecordThatMatches(string $regex, $level): bool
172
+ {
173
+ return $this->hasRecordThatPasses(function (array $rec) use ($regex): bool {
174
+ return preg_match($regex, $rec['message']) > 0;
175
+ }, $level);
176
+ }
177
+
178
+ /**
179
+ * @param string|int $level Logging level value or name
180
+ * @return bool
181
+ *
182
+ * @psalm-param callable(Record, int): mixed $predicate
183
+ * @phpstan-param Level|LevelName|LogLevel::* $level
184
+ */
185
+ public function hasRecordThatPasses(callable $predicate, $level)
186
+ {
187
+ $level = Logger::toMonologLevel($level);
188
+
189
+ if (!isset($this->recordsByLevel[$level])) {
190
+ return false;
191
+ }
192
+
193
+ foreach ($this->recordsByLevel[$level] as $i => $rec) {
194
+ if ($predicate($rec, $i)) {
195
+ return true;
196
+ }
197
+ }
198
+
199
+ return false;
200
+ }
201
+
202
+ /**
203
+ * {@inheritDoc}
204
+ */
205
+ protected function write(array $record): void
206
+ {
207
+ $this->recordsByLevel[$record['level']][] = $record;
208
+ $this->records[] = $record;
209
+ }
210
+
211
+ /**
212
+ * @param string $method
213
+ * @param mixed[] $args
214
+ * @return bool
215
+ */
216
+ public function __call($method, $args)
217
+ {
218
+ if (preg_match('/(.*)(Debug|Info|Notice|Warning|Error|Critical|Alert|Emergency)(.*)/', $method, $matches) > 0) {
219
+ $genericMethod = $matches[1] . ('Records' !== $matches[3] ? 'Record' : '') . $matches[3];
220
+ $level = constant('Monolog\Logger::' . strtoupper($matches[2]));
221
+ $callback = [$this, $genericMethod];
222
+ if (is_callable($callback)) {
223
+ $args[] = $level;
224
+
225
+ return call_user_func_array($callback, $args);
226
+ }
227
+ }
228
+
229
+ throw new \BadMethodCallException('Call to undefined method ' . get_class($this) . '::' . $method . '()');
230
+ }
231
+ }
vendor/monolog/monolog/src/Monolog/Handler/WebRequestRecognizerTrait.php ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ trait WebRequestRecognizerTrait
15
+ {
16
+ /**
17
+ * Checks if PHP's serving a web request
18
+ * @return bool
19
+ */
20
+ protected function isWebRequest(): bool
21
+ {
22
+ return 'cli' !== \PHP_SAPI && 'phpdbg' !== \PHP_SAPI;
23
+ }
24
+ }
vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ /**
15
+ * Forwards records to multiple handlers suppressing failures of each handler
16
+ * and continuing through to give every handler a chance to succeed.
17
+ *
18
+ * @author Craig D'Amelio <craig@damelio.ca>
19
+ *
20
+ * @phpstan-import-type Record from \Monolog\Logger
21
+ */
22
+ class WhatFailureGroupHandler extends GroupHandler
23
+ {
24
+ /**
25
+ * {@inheritDoc}
26
+ */
27
+ public function handle(array $record): bool
28
+ {
29
+ if ($this->processors) {
30
+ /** @var Record $record */
31
+ $record = $this->processRecord($record);
32
+ }
33
+
34
+ foreach ($this->handlers as $handler) {
35
+ try {
36
+ $handler->handle($record);
37
+ } catch (\Throwable $e) {
38
+ // What failure?
39
+ }
40
+ }
41
+
42
+ return false === $this->bubble;
43
+ }
44
+
45
+ /**
46
+ * {@inheritDoc}
47
+ */
48
+ public function handleBatch(array $records): void
49
+ {
50
+ if ($this->processors) {
51
+ $processed = array();
52
+ foreach ($records as $record) {
53
+ $processed[] = $this->processRecord($record);
54
+ }
55
+ /** @var Record[] $records */
56
+ $records = $processed;
57
+ }
58
+
59
+ foreach ($this->handlers as $handler) {
60
+ try {
61
+ $handler->handleBatch($records);
62
+ } catch (\Throwable $e) {
63
+ // What failure?
64
+ }
65
+ }
66
+ }
67
+ }
vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Handler;
13
+
14
+ use Monolog\Formatter\FormatterInterface;
15
+ use Monolog\Formatter\NormalizerFormatter;
16
+ use Monolog\Logger;
17
+
18
+ /**
19
+ * Handler sending logs to Zend Monitor
20
+ *
21
+ * @author Christian Bergau <cbergau86@gmail.com>
22
+ * @author Jason Davis <happydude@jasondavis.net>
23
+ *
24
+ * @phpstan-import-type FormattedRecord from AbstractProcessingHandler
25
+ */
26
+ class ZendMonitorHandler extends AbstractProcessingHandler
27
+ {
28
+ /**
29
+ * Monolog level / ZendMonitor Custom Event priority map
30
+ *
31
+ * @var array<int, int>
32
+ */
33
+ protected $levelMap = [];
34
+
35
+ /**
36
+ * @throws MissingExtensionException
37
+ */
38
+ public function __construct($level = Logger::DEBUG, bool $bubble = true)
39
+ {
40
+ if (!function_exists('zend_monitor_custom_event')) {
41
+ throw new MissingExtensionException(
42
+ 'You must have Zend Server installed with Zend Monitor enabled in order to use this handler'
43
+ );
44
+ }
45
+ //zend monitor constants are not defined if zend monitor is not enabled.
46
+ $this->levelMap = [
47
+ Logger::DEBUG => \ZEND_MONITOR_EVENT_SEVERITY_INFO,
48
+ Logger::INFO => \ZEND_MONITOR_EVENT_SEVERITY_INFO,
49
+ Logger::NOTICE => \ZEND_MONITOR_EVENT_SEVERITY_INFO,
50
+ Logger::WARNING => \ZEND_MONITOR_EVENT_SEVERITY_WARNING,
51
+ Logger::ERROR => \ZEND_MONITOR_EVENT_SEVERITY_ERROR,
52
+ Logger::CRITICAL => \ZEND_MONITOR_EVENT_SEVERITY_ERROR,
53
+ Logger::ALERT => \ZEND_MONITOR_EVENT_SEVERITY_ERROR,
54
+ Logger::EMERGENCY => \ZEND_MONITOR_EVENT_SEVERITY_ERROR,
55
+ ];
56
+ parent::__construct($level, $bubble);
57
+ }
58
+
59
+ /**
60
+ * {@inheritDoc}
61
+ */
62
+ protected function write(array $record): void
63
+ {
64
+ $this->writeZendMonitorCustomEvent(
65
+ Logger::getLevelName($record['level']),
66
+ $record['message'],
67
+ $record['formatted'],
68
+ $this->levelMap[$record['level']]
69
+ );
70
+ }
71
+
72
+ /**
73
+ * Write to Zend Monitor Events
74
+ * @param string $type Text displayed in "Class Name (custom)" field
75
+ * @param string $message Text displayed in "Error String"
76
+ * @param array $formatted Displayed in Custom Variables tab
77
+ * @param int $severity Set the event severity level (-1,0,1)
78
+ *
79
+ * @phpstan-param FormattedRecord $formatted
80
+ */
81
+ protected function writeZendMonitorCustomEvent(string $type, string $message, array $formatted, int $severity): void
82
+ {
83
+ zend_monitor_custom_event($type, $message, $formatted, $severity);
84
+ }
85
+
86
+ /**
87
+ * {@inheritDoc}
88
+ */
89
+ public function getDefaultFormatter(): FormatterInterface
90
+ {
91
+ return new NormalizerFormatter();
92
+ }
93
+
94
+ /**
95
+ * @return array<int, int>
96
+ */
97
+ public function getLevelMap(): array
98
+ {
99
+ return $this->levelMap;
100
+ }
101
+ }
vendor/monolog/monolog/src/Monolog/LogRecord.php ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog;
13
+
14
+ use ArrayAccess;
15
+
16
+ /**
17
+ * Monolog log record interface for forward compatibility with Monolog 3.0
18
+ *
19
+ * This is just present in Monolog 2.4+ to allow interoperable code to be written against
20
+ * both versions by type-hinting arguments as `array|\Monolog\LogRecord $record`
21
+ *
22
+ * Do not rely on this interface for other purposes, and do not implement it.
23
+ *
24
+ * @author Jordi Boggiano <j.boggiano@seld.be>
25
+ * @template-extends \ArrayAccess<'message'|'level'|'context'|'level_name'|'channel'|'datetime'|'extra'|'formatted', mixed>
26
+ * @phpstan-import-type Record from Logger
27
+ */
28
+ interface LogRecord extends \ArrayAccess
29
+ {
30
+ /**
31
+ * @phpstan-return Record
32
+ */
33
+ public function toArray(): array;
34
+ }
vendor/monolog/monolog/src/Monolog/Logger.php ADDED
@@ -0,0 +1,701 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog;
13
+
14
+ use DateTimeZone;
15
+ use Monolog\Handler\HandlerInterface;
16
+ use Psr\Log\LoggerInterface;
17
+ use Psr\Log\InvalidArgumentException;
18
+ use Psr\Log\LogLevel;
19
+ use Throwable;
20
+ use Stringable;
21
+
22
+ /**
23
+ * Monolog log channel
24
+ *
25
+ * It contains a stack of Handlers and a stack of Processors,
26
+ * and uses them to store records that are added to it.
27
+ *
28
+ * @author Jordi Boggiano <j.boggiano@seld.be>
29
+ *
30
+ * @phpstan-type Level Logger::DEBUG|Logger::INFO|Logger::NOTICE|Logger::WARNING|Logger::ERROR|Logger::CRITICAL|Logger::ALERT|Logger::EMERGENCY
31
+ * @phpstan-type LevelName 'DEBUG'|'INFO'|'NOTICE'|'WARNING'|'ERROR'|'CRITICAL'|'ALERT'|'EMERGENCY'
32
+ * @phpstan-type Record array{message: string, context: mixed[], level: Level, level_name: LevelName, channel: string, datetime: \DateTimeImmutable, extra: mixed[]}
33
+ */
34
+ class Logger implements LoggerInterface, ResettableInterface
35
+ {
36
+ /**
37
+ * Detailed debug information
38
+ */
39
+ public const DEBUG = 100;
40
+
41
+ /**
42
+ * Interesting events
43
+ *
44
+ * Examples: User logs in, SQL logs.
45
+ */
46
+ public const INFO = 200;
47
+
48
+ /**
49
+ * Uncommon events
50
+ */
51
+ public const NOTICE = 250;
52
+
53
+ /**
54
+ * Exceptional occurrences that are not errors
55
+ *
56
+ * Examples: Use of deprecated APIs, poor use of an API,
57
+ * undesirable things that are not necessarily wrong.
58
+ */
59
+ public const WARNING = 300;
60
+
61
+ /**
62
+ * Runtime errors
63
+ */
64
+ public const ERROR = 400;
65
+
66
+ /**
67
+ * Critical conditions
68
+ *
69
+ * Example: Application component unavailable, unexpected exception.
70
+ */
71
+ public const CRITICAL = 500;
72
+
73
+ /**
74
+ * Action must be taken immediately
75
+ *
76
+ * Example: Entire website down, database unavailable, etc.
77
+ * This should trigger the SMS alerts and wake you up.
78
+ */
79
+ public const ALERT = 550;
80
+
81
+ /**
82
+ * Urgent alert.
83
+ */
84
+ public const EMERGENCY = 600;
85
+
86
+ /**
87
+ * Monolog API version
88
+ *
89
+ * This is only bumped when API breaks are done and should
90
+ * follow the major version of the library
91
+ *
92
+ * @var int
93
+ */
94
+ public const API = 2;
95
+
96
+ /**
97
+ * This is a static variable and not a constant to serve as an extension point for custom levels
98
+ *
99
+ * @var array<int, string> $levels Logging levels with the levels as key
100
+ *
101
+ * @phpstan-var array<Level, LevelName> $levels Logging levels with the levels as key
102
+ */
103
+ protected static $levels = [
104
+ self::DEBUG => 'DEBUG',
105
+ self::INFO => 'INFO',
106
+ self::NOTICE => 'NOTICE',
107
+ self::WARNING => 'WARNING',
108
+ self::ERROR => 'ERROR',
109
+ self::CRITICAL => 'CRITICAL',
110
+ self::ALERT => 'ALERT',
111
+ self::EMERGENCY => 'EMERGENCY',
112
+ ];
113
+
114
+ /**
115
+ * Mapping between levels numbers defined in RFC 5424 and Monolog ones
116
+ *
117
+ * @phpstan-var array<int, Level> $rfc_5424_levels
118
+ */
119
+ private const RFC_5424_LEVELS = [
120
+ 7 => self::DEBUG,
121
+ 6 => self::INFO,
122
+ 5 => self::NOTICE,
123
+ 4 => self::WARNING,
124
+ 3 => self::ERROR,
125
+ 2 => self::CRITICAL,
126
+ 1 => self::ALERT,
127
+ 0 => self::EMERGENCY,
128
+ ];
129
+
130
+ /**
131
+ * @var string
132
+ */
133
+ protected $name;
134
+
135
+ /**
136
+ * The handler stack
137
+ *
138
+ * @var HandlerInterface[]
139
+ */
140
+ protected $handlers;
141
+
142
+ /**
143
+ * Processors that will process all log records
144
+ *
145
+ * To process records of a single handler instead, add the processor on that specific handler
146
+ *
147
+ * @var callable[]
148
+ */
149
+ protected $processors;
150
+
151
+ /**
152
+ * @var bool
153
+ */
154
+ protected $microsecondTimestamps = true;
155
+
156
+ /**
157
+ * @var DateTimeZone
158
+ */
159
+ protected $timezone;
160
+
161
+ /**
162
+ * @var callable|null
163
+ */
164
+ protected $exceptionHandler;
165
+
166
+ /**
167
+ * @var int Keeps track of depth to prevent infinite logging loops
168
+ */
169
+ private $logDepth = 0;
170
+
171
+ /**
172
+ * @var bool Whether to detect infinite logging loops
173
+ *
174
+ * This can be disabled via {@see useLoggingLoopDetection} if you have async handlers that do not play well with this
175
+ */
176
+ private $detectCycles = true;
177
+
178
+ /**
179
+ * @psalm-param array<callable(array): array> $processors
180
+ *
181
+ * @param string $name The logging channel, a simple descriptive name that is attached to all log records
182
+ * @param HandlerInterface[] $handlers Optional stack of handlers, the first one in the array is called first, etc.
183
+ * @param callable[] $processors Optional array of processors
184
+ * @param DateTimeZone|null $timezone Optional timezone, if not provided date_default_timezone_get() will be used
185
+ */
186
+ public function __construct(string $name, array $handlers = [], array $processors = [], ?DateTimeZone $timezone = null)
187
+ {
188
+ $this->name = $name;
189
+ $this->setHandlers($handlers);
190
+ $this->processors = $processors;
191
+ $this->timezone = $timezone ?: new DateTimeZone(date_default_timezone_get() ?: 'UTC');
192
+ }
193
+
194
+ public function getName(): string
195
+ {
196
+ return $this->name;
197
+ }
198
+
199
+ /**
200
+ * Return a new cloned instance with the name changed
201
+ */
202
+ public function withName(string $name): self
203
+ {
204
+ $new = clone $this;
205
+ $new->name = $name;
206
+
207
+ return $new;
208
+ }
209
+
210
+ /**
211
+ * Pushes a handler on to the stack.
212
+ */
213
+ public function pushHandler(HandlerInterface $handler): self
214
+ {
215
+ array_unshift($this->handlers, $handler);
216
+
217
+ return $this;
218
+ }
219
+
220
+ /**
221
+ * Pops a handler from the stack
222
+ *
223
+ * @throws \LogicException If empty handler stack
224
+ */
225
+ public function popHandler(): HandlerInterface
226
+ {
227
+ if (!$this->handlers) {
228
+ throw new \LogicException('You tried to pop from an empty handler stack.');
229
+ }
230
+
231
+ return array_shift($this->handlers);
232
+ }
233
+
234
+ /**
235
+ * Set handlers, replacing all existing ones.
236
+ *
237
+ * If a map is passed, keys will be ignored.
238
+ *
239
+ * @param HandlerInterface[] $handlers
240
+ */
241
+ public function setHandlers(array $handlers): self
242
+ {
243
+ $this->handlers = [];
244
+ foreach (array_reverse($handlers) as $handler) {
245
+ $this->pushHandler($handler);
246
+ }
247
+
248
+ return $this;
249
+ }
250
+
251
+ /**
252
+ * @return HandlerInterface[]
253
+ */
254
+ public function getHandlers(): array
255
+ {
256
+ return $this->handlers;
257
+ }
258
+
259
+ /**
260
+ * Adds a processor on to the stack.
261
+ */
262
+ public function pushProcessor(callable $callback): self
263
+ {
264
+ array_unshift($this->processors, $callback);
265
+
266
+ return $this;
267
+ }
268
+
269
+ /**
270
+ * Removes the processor on top of the stack and returns it.
271
+ *
272
+ * @throws \LogicException If empty processor stack
273
+ * @return callable
274
+ */
275
+ public function popProcessor(): callable
276
+ {
277
+ if (!$this->processors) {
278
+ throw new \LogicException('You tried to pop from an empty processor stack.');
279
+ }
280
+
281
+ return array_shift($this->processors);
282
+ }
283
+
284
+ /**
285
+ * @return callable[]
286
+ */
287
+ public function getProcessors(): array
288
+ {
289
+ return $this->processors;
290
+ }
291
+
292
+ /**
293
+ * Control the use of microsecond resolution timestamps in the 'datetime'
294
+ * member of new records.
295
+ *
296
+ * As of PHP7.1 microseconds are always included by the engine, so
297
+ * there is no performance penalty and Monolog 2 enabled microseconds
298
+ * by default. This function lets you disable them though in case you want
299
+ * to suppress microseconds from the output.
300
+ *
301
+ * @param bool $micro True to use microtime() to create timestamps
302
+ */
303
+ public function useMicrosecondTimestamps(bool $micro): self
304
+ {
305
+ $this->microsecondTimestamps = $micro;
306
+
307
+ return $this;
308
+ }
309
+
310
+ public function useLoggingLoopDetection(bool $detectCycles): self
311
+ {
312
+ $this->detectCycles = $detectCycles;
313
+
314
+ return $this;
315
+ }
316
+
317
+ /**
318
+ * Adds a log record.
319
+ *
320
+ * @param int $level The logging level (a Monolog or RFC 5424 level)
321
+ * @param string $message The log message
322
+ * @param mixed[] $context The log context
323
+ * @param DateTimeImmutable $datetime Optional log date to log into the past or future
324
+ * @return bool Whether the record has been processed
325
+ *
326
+ * @phpstan-param Level $level
327
+ */
328
+ public function addRecord(int $level, string $message, array $context = [], DateTimeImmutable $datetime = null): bool
329
+ {
330
+ if (isset(self::RFC_5424_LEVELS[$level])) {
331
+ $level = self::RFC_5424_LEVELS[$level];
332
+ }
333
+
334
+ if ($this->detectCycles) {
335
+ $this->logDepth += 1;
336
+ }
337
+ if ($this->logDepth === 3) {
338
+ $this->warning('A possible infinite logging loop was detected and aborted. It appears some of your handler code is triggering logging, see the previous log record for a hint as to what may be the cause.');
339
+ return false;
340
+ } elseif ($this->logDepth >= 5) { // log depth 4 is let through so we can log the warning above
341
+ return false;
342
+ }
343
+
344
+ try {
345
+ $record = null;
346
+
347
+ foreach ($this->handlers as $handler) {
348
+ if (null === $record) {
349
+ // skip creating the record as long as no handler is going to handle it
350
+ if (!$handler->isHandling(['level' => $level])) {
351
+ continue;
352
+ }
353
+
354
+ $levelName = static::getLevelName($level);
355
+
356
+ $record = [
357
+ 'message' => $message,
358
+ 'context' => $context,
359
+ 'level' => $level,
360
+ 'level_name' => $levelName,
361
+ 'channel' => $this->name,
362
+ 'datetime' => $datetime ?? new DateTimeImmutable($this->microsecondTimestamps, $this->timezone),
363
+ 'extra' => [],
364
+ ];
365
+
366
+ try {
367
+ foreach ($this->processors as $processor) {
368
+ $record = $processor($record);
369
+ }
370
+ } catch (Throwable $e) {
371
+ $this->handleException($e, $record);
372
+
373
+ return true;
374
+ }
375
+ }
376
+
377
+ // once the record exists, send it to all handlers as long as the bubbling chain is not interrupted
378
+ try {
379
+ if (true === $handler->handle($record)) {
380
+ break;
381
+ }
382
+ } catch (Throwable $e) {
383
+ $this->handleException($e, $record);
384
+
385
+ return true;
386
+ }
387
+ }
388
+ } finally {
389
+ if ($this->detectCycles) {
390
+ $this->logDepth--;
391
+ }
392
+ }
393
+
394
+ return null !== $record;
395
+ }
396
+
397
+ /**
398
+ * Ends a log cycle and frees all resources used by handlers.
399
+ *
400
+ * Closing a Handler means flushing all buffers and freeing any open resources/handles.
401
+ * Handlers that have been closed should be able to accept log records again and re-open
402
+ * themselves on demand, but this may not always be possible depending on implementation.
403
+ *
404
+ * This is useful at the end of a request and will be called automatically on every handler
405
+ * when they get destructed.
406
+ */
407
+ public function close(): void
408
+ {
409
+ foreach ($this->handlers as $handler) {
410
+ $handler->close();
411
+ }
412
+ }
413
+
414
+ /**
415
+ * Ends a log cycle and resets all handlers and processors to their initial state.
416
+ *
417
+ * Resetting a Handler or a Processor means flushing/cleaning all buffers, resetting internal
418
+ * state, and getting it back to a state in which it can receive log records again.
419
+ *
420
+ * This is useful in case you want to avoid logs leaking between two requests or jobs when you
421
+ * have a long running process like a worker or an application server serving multiple requests
422
+ * in one process.
423
+ */
424
+ public function reset(): void
425
+ {
426
+ foreach ($this->handlers as $handler) {
427
+ if ($handler instanceof ResettableInterface) {
428
+ $handler->reset();
429
+ }
430
+ }
431
+
432
+ foreach ($this->processors as $processor) {
433
+ if ($processor instanceof ResettableInterface) {
434
+ $processor->reset();
435
+ }
436
+ }
437
+ }
438
+
439
+ /**
440
+ * Gets all supported logging levels.
441
+ *
442
+ * @return array<string, int> Assoc array with human-readable level names => level codes.
443
+ * @phpstan-return array<LevelName, Level>
444
+ */
445
+ public static function getLevels(): array
446
+ {
447
+ return array_flip(static::$levels);
448
+ }
449
+
450
+ /**
451
+ * Gets the name of the logging level.
452
+ *
453
+ * @throws \Psr\Log\InvalidArgumentException If level is not defined
454
+ *
455
+ * @phpstan-param Level $level
456
+ * @phpstan-return LevelName
457
+ */
458
+ public static function getLevelName(int $level): string
459
+ {
460
+ if (!isset(static::$levels[$level])) {
461
+ throw new InvalidArgumentException('Level "'.$level.'" is not defined, use one of: '.implode(', ', array_keys(static::$levels)));
462
+ }
463
+
464
+ return static::$levels[$level];
465
+ }
466
+
467
+ /**
468
+ * Converts PSR-3 levels to Monolog ones if necessary
469
+ *
470
+ * @param string|int $level Level number (monolog) or name (PSR-3)
471
+ * @throws \Psr\Log\InvalidArgumentException If level is not defined
472
+ *
473
+ * @phpstan-param Level|LevelName|LogLevel::* $level
474
+ * @phpstan-return Level
475
+ */
476
+ public static function toMonologLevel($level): int
477
+ {
478
+ if (is_string($level)) {
479
+ if (is_numeric($level)) {
480
+ /** @phpstan-ignore-next-line */
481
+ return intval($level);
482
+ }
483
+
484
+ // Contains chars of all log levels and avoids using strtoupper() which may have
485
+ // strange results depending on locale (for example, "i" will become "İ" in Turkish locale)
486
+ $upper = strtr($level, 'abcdefgilmnortuwy', 'ABCDEFGILMNORTUWY');
487
+ if (defined(__CLASS__.'::'.$upper)) {
488
+ return constant(__CLASS__ . '::' . $upper);
489
+ }
490
+
491
+ throw new InvalidArgumentException('Level "'.$level.'" is not defined, use one of: '.implode(', ', array_keys(static::$levels) + static::$levels));
492
+ }
493
+
494
+ if (!is_int($level)) {
495
+ throw new InvalidArgumentException('Level "'.var_export($level, true).'" is not defined, use one of: '.implode(', ', array_keys(static::$levels) + static::$levels));
496
+ }
497
+
498
+ return $level;
499
+ }
500
+
501
+ /**
502
+ * Checks whether the Logger has a handler that listens on the given level
503
+ *
504
+ * @phpstan-param Level $level
505
+ */
506
+ public function isHandling(int $level): bool
507
+ {
508
+ $record = [
509
+ 'level' => $level,
510
+ ];
511
+
512
+ foreach ($this->handlers as $handler) {
513
+ if ($handler->isHandling($record)) {
514
+ return true;
515
+ }
516
+ }
517
+
518
+ return false;
519
+ }
520
+
521
+ /**
522
+ * Set a custom exception handler that will be called if adding a new record fails
523
+ *
524
+ * The callable will receive an exception object and the record that failed to be logged
525
+ */
526
+ public function setExceptionHandler(?callable $callback): self
527
+ {
528
+ $this->exceptionHandler = $callback;
529
+
530
+ return $this;
531
+ }
532
+
533
+ public function getExceptionHandler(): ?callable
534
+ {
535
+ return $this->exceptionHandler;
536
+ }
537
+
538
+ /**
539
+ * Adds a log record at an arbitrary level.
540
+ *
541
+ * This method allows for compatibility with common interfaces.
542
+ *
543
+ * @param mixed $level The log level (a Monolog, PSR-3 or RFC 5424 level)
544
+ * @param string|Stringable $message The log message
545
+ * @param mixed[] $context The log context
546
+ *
547
+ * @phpstan-param Level|LevelName|LogLevel::* $level
548
+ */
549
+ public function log($level, $message, array $context = []): void
550
+ {
551
+ if (!is_int($level) && !is_string($level)) {
552
+ throw new \InvalidArgumentException('$level is expected to be a string or int');
553
+ }
554
+
555
+ if (isset(self::RFC_5424_LEVELS[$level])) {
556
+ $level = self::RFC_5424_LEVELS[$level];
557
+ }
558
+
559
+ $level = static::toMonologLevel($level);
560
+
561
+ $this->addRecord($level, (string) $message, $context);
562
+ }
563
+
564
+ /**
565
+ * Adds a log record at the DEBUG level.
566
+ *
567
+ * This method allows for compatibility with common interfaces.
568
+ *
569
+ * @param string|Stringable $message The log message
570
+ * @param mixed[] $context The log context
571
+ */
572
+ public function debug($message, array $context = []): void
573
+ {
574
+ $this->addRecord(static::DEBUG, (string) $message, $context);
575
+ }
576
+
577
+ /**
578
+ * Adds a log record at the INFO level.
579
+ *
580
+ * This method allows for compatibility with common interfaces.
581
+ *
582
+ * @param string|Stringable $message The log message
583
+ * @param mixed[] $context The log context
584
+ */
585
+ public function info($message, array $context = []): void
586
+ {
587
+ $this->addRecord(static::INFO, (string) $message, $context);
588
+ }
589
+
590
+ /**
591
+ * Adds a log record at the NOTICE level.
592
+ *
593
+ * This method allows for compatibility with common interfaces.
594
+ *
595
+ * @param string|Stringable $message The log message
596
+ * @param mixed[] $context The log context
597
+ */
598
+ public function notice($message, array $context = []): void
599
+ {
600
+ $this->addRecord(static::NOTICE, (string) $message, $context);
601
+ }
602
+
603
+ /**
604
+ * Adds a log record at the WARNING level.
605
+ *
606
+ * This method allows for compatibility with common interfaces.
607
+ *
608
+ * @param string|Stringable $message The log message
609
+ * @param mixed[] $context The log context
610
+ */
611
+ public function warning($message, array $context = []): void
612
+ {
613
+ $this->addRecord(static::WARNING, (string) $message, $context);
614
+ }
615
+
616
+ /**
617
+ * Adds a log record at the ERROR level.
618
+ *
619
+ * This method allows for compatibility with common interfaces.
620
+ *
621
+ * @param string|Stringable $message The log message
622
+ * @param mixed[] $context The log context
623
+ */
624
+ public function error($message, array $context = []): void
625
+ {
626
+ $this->addRecord(static::ERROR, (string) $message, $context);
627
+ }
628
+
629
+ /**
630
+ * Adds a log record at the CRITICAL level.
631
+ *
632
+ * This method allows for compatibility with common interfaces.
633
+ *
634
+ * @param string|Stringable $message The log message
635
+ * @param mixed[] $context The log context
636
+ */
637
+ public function critical($message, array $context = []): void
638
+ {
639
+ $this->addRecord(static::CRITICAL, (string) $message, $context);
640
+ }
641
+
642
+ /**
643
+ * Adds a log record at the ALERT level.
644
+ *
645
+ * This method allows for compatibility with common interfaces.
646
+ *
647
+ * @param string|Stringable $message The log message
648
+ * @param mixed[] $context The log context
649
+ */
650
+ public function alert($message, array $context = []): void
651
+ {
652
+ $this->addRecord(static::ALERT, (string) $message, $context);
653
+ }
654
+
655
+ /**
656
+ * Adds a log record at the EMERGENCY level.
657
+ *
658
+ * This method allows for compatibility with common interfaces.
659
+ *
660
+ * @param string|Stringable $message The log message
661
+ * @param mixed[] $context The log context
662
+ */
663
+ public function emergency($message, array $context = []): void
664
+ {
665
+ $this->addRecord(static::EMERGENCY, (string) $message, $context);
666
+ }
667
+
668
+ /**
669
+ * Sets the timezone to be used for the timestamp of log records.
670
+ */
671
+ public function setTimezone(DateTimeZone $tz): self
672
+ {
673
+ $this->timezone = $tz;
674
+
675
+ return $this;
676
+ }
677
+
678
+ /**
679
+ * Returns the timezone to be used for the timestamp of log records.
680
+ */
681
+ public function getTimezone(): DateTimeZone
682
+ {
683
+ return $this->timezone;
684
+ }
685
+
686
+ /**
687
+ * Delegates exception management to the custom exception handler,
688
+ * or throws the exception if no custom handler is set.
689
+ *
690
+ * @param array $record
691
+ * @phpstan-param Record $record
692
+ */
693
+ protected function handleException(Throwable $e, array $record): void
694
+ {
695
+ if (!$this->exceptionHandler) {
696
+ throw $e;
697
+ }
698
+
699
+ ($this->exceptionHandler)($e, $record);
700
+ }
701
+ }
vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Processor;
13
+
14
+ use Monolog\Logger;
15
+ use Psr\Log\LogLevel;
16
+
17
+ /**
18
+ * Injects Git branch and Git commit SHA in all records
19
+ *
20
+ * @author Nick Otter
21
+ * @author Jordi Boggiano <j.boggiano@seld.be>
22
+ *
23
+ * @phpstan-import-type Level from \Monolog\Logger
24
+ * @phpstan-import-type LevelName from \Monolog\Logger
25
+ */
26
+ class GitProcessor implements ProcessorInterface
27
+ {
28
+ /** @var int */
29
+ private $level;
30
+ /** @var array{branch: string, commit: string}|array<never>|null */
31
+ private static $cache = null;
32
+
33
+ /**
34
+ * @param string|int $level The minimum logging level at which this Processor will be triggered
35
+ *
36
+ * @phpstan-param Level|LevelName|LogLevel::* $level
37
+ */
38
+ public function __construct($level = Logger::DEBUG)
39
+ {
40
+ $this->level = Logger::toMonologLevel($level);
41
+ }
42
+
43
+ /**
44
+ * {@inheritDoc}
45
+ */
46
+ public function __invoke(array $record): array
47
+ {
48
+ // return if the level is not high enough
49
+ if ($record['level'] < $this->level) {
50
+ return $record;
51
+ }
52
+
53
+ $record['extra']['git'] = self::getGitInfo();
54
+
55
+ return $record;
56
+ }
57
+
58
+ /**
59
+ * @return array{branch: string, commit: string}|array<never>
60
+ */
61
+ private static function getGitInfo(): array
62
+ {
63
+ if (self::$cache) {
64
+ return self::$cache;
65
+ }
66
+
67
+ $branches = `git branch -v --no-abbrev`;
68
+ if ($branches && preg_match('{^\* (.+?)\s+([a-f0-9]{40})(?:\s|$)}m', $branches, $matches)) {
69
+ return self::$cache = [
70
+ 'branch' => $matches[1],
71
+ 'commit' => $matches[2],
72
+ ];
73
+ }
74
+
75
+ return self::$cache = [];
76
+ }
77
+ }
vendor/monolog/monolog/src/Monolog/Processor/HostnameProcessor.php ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Processor;
13
+
14
+ /**
15
+ * Injects value of gethostname in all records
16
+ */
17
+ class HostnameProcessor implements ProcessorInterface
18
+ {
19
+ /** @var string */
20
+ private static $host;
21
+
22
+ public function __construct()
23
+ {
24
+ self::$host = (string) gethostname();
25
+ }
26
+
27
+ /**
28
+ * {@inheritDoc}
29
+ */
30
+ public function __invoke(array $record): array
31
+ {
32
+ $record['extra']['hostname'] = self::$host;
33
+
34
+ return $record;
35
+ }
36
+ }
vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php ADDED
@@ -0,0 +1,123 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Processor;
13
+
14
+ use Monolog\Logger;
15
+ use Psr\Log\LogLevel;
16
+
17
+ /**
18
+ * Injects line/file:class/function where the log message came from
19
+ *
20
+ * Warning: This only works if the handler processes the logs directly.
21
+ * If you put the processor on a handler that is behind a FingersCrossedHandler
22
+ * for example, the processor will only be called once the trigger level is reached,
23
+ * and all the log records will have the same file/line/.. data from the call that
24
+ * triggered the FingersCrossedHandler.
25
+ *
26
+ * @author Jordi Boggiano <j.boggiano@seld.be>
27
+ *
28
+ * @phpstan-import-type Level from \Monolog\Logger
29
+ * @phpstan-import-type LevelName from \Monolog\Logger
30
+ */
31
+ class IntrospectionProcessor implements ProcessorInterface
32
+ {
33
+ /** @var int */
34
+ private $level;
35
+ /** @var string[] */
36
+ private $skipClassesPartials;
37
+ /** @var int */
38
+ private $skipStackFramesCount;
39
+ /** @var string[] */
40
+ private $skipFunctions = [
41
+ 'call_user_func',
42
+ 'call_user_func_array',
43
+ ];
44
+
45
+ /**
46
+ * @param string|int $level The minimum logging level at which this Processor will be triggered
47
+ * @param string[] $skipClassesPartials
48
+ *
49
+ * @phpstan-param Level|LevelName|LogLevel::* $level
50
+ */
51
+ public function __construct($level = Logger::DEBUG, array $skipClassesPartials = [], int $skipStackFramesCount = 0)
52
+ {
53
+ $this->level = Logger::toMonologLevel($level);
54
+ $this->skipClassesPartials = array_merge(['Monolog\\'], $skipClassesPartials);
55
+ $this->skipStackFramesCount = $skipStackFramesCount;
56
+ }
57
+
58
+ /**
59
+ * {@inheritDoc}
60
+ */
61
+ public function __invoke(array $record): array
62
+ {
63
+ // return if the level is not high enough
64
+ if ($record['level'] < $this->level) {
65
+ return $record;
66
+ }
67
+
68
+ $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
69
+
70
+ // skip first since it's always the current method
71
+ array_shift($trace);
72
+ // the call_user_func call is also skipped
73
+ array_shift($trace);
74
+
75
+ $i = 0;
76
+
77
+ while ($this->isTraceClassOrSkippedFunction($trace, $i)) {
78
+ if (isset($trace[$i]['class'])) {
79
+ foreach ($this->skipClassesPartials as $part) {
80
+ if (strpos($trace[$i]['class'], $part) !== false) {
81
+ $i++;
82
+
83
+ continue 2;
84
+ }
85
+ }
86
+ } elseif (in_array($trace[$i]['function'], $this->skipFunctions)) {
87
+ $i++;
88
+
89
+ continue;
90
+ }
91
+
92
+ break;
93
+ }
94
+
95
+ $i += $this->skipStackFramesCount;
96
+
97
+ // we should have the call source now
98
+ $record['extra'] = array_merge(
99
+ $record['extra'],
100
+ [
101
+ 'file' => isset($trace[$i - 1]['file']) ? $trace[$i - 1]['file'] : null,
102
+ 'line' => isset($trace[$i - 1]['line']) ? $trace[$i - 1]['line'] : null,
103
+ 'class' => isset($trace[$i]['class']) ? $trace[$i]['class'] : null,
104
+ 'callType' => isset($trace[$i]['type']) ? $trace[$i]['type'] : null,
105
+ 'function' => isset($trace[$i]['function']) ? $trace[$i]['function'] : null,
106
+ ]
107
+ );
108
+
109
+ return $record;
110
+ }
111
+
112
+ /**
113
+ * @param array[] $trace
114
+ */
115
+ private function isTraceClassOrSkippedFunction(array $trace, int $index): bool
116
+ {
117
+ if (!isset($trace[$index])) {
118
+ return false;
119
+ }
120
+
121
+ return isset($trace[$index]['class']) || in_array($trace[$index]['function'], $this->skipFunctions);
122
+ }
123
+ }
vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Processor;
13
+
14
+ /**
15
+ * Injects memory_get_peak_usage in all records
16
+ *
17
+ * @see Monolog\Processor\MemoryProcessor::__construct() for options
18
+ * @author Rob Jensen
19
+ */
20
+ class MemoryPeakUsageProcessor extends MemoryProcessor
21
+ {
22
+ /**
23
+ * {@inheritDoc}
24
+ */
25
+ public function __invoke(array $record): array
26
+ {
27
+ $usage = memory_get_peak_usage($this->realUsage);
28
+
29
+ if ($this->useFormatting) {
30
+ $usage = $this->formatBytes($usage);
31
+ }
32
+
33
+ $record['extra']['memory_peak_usage'] = $usage;
34
+
35
+ return $record;
36
+ }
37
+ }
vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Processor;
13
+
14
+ /**
15
+ * Some methods that are common for all memory processors
16
+ *
17
+ * @author Rob Jensen
18
+ */
19
+ abstract class MemoryProcessor implements ProcessorInterface
20
+ {
21
+ /**
22
+ * @var bool If true, get the real size of memory allocated from system. Else, only the memory used by emalloc() is reported.
23
+ */
24
+ protected $realUsage;
25
+
26
+ /**
27
+ * @var bool If true, then format memory size to human readable string (MB, KB, B depending on size)
28
+ */
29
+ protected $useFormatting;
30
+
31
+ /**
32
+ * @param bool $realUsage Set this to true to get the real size of memory allocated from system.
33
+ * @param bool $useFormatting If true, then format memory size to human readable string (MB, KB, B depending on size)
34
+ */
35
+ public function __construct(bool $realUsage = true, bool $useFormatting = true)
36
+ {
37
+ $this->realUsage = $realUsage;
38
+ $this->useFormatting = $useFormatting;
39
+ }
40
+
41
+ /**
42
+ * Formats bytes into a human readable string if $this->useFormatting is true, otherwise return $bytes as is
43
+ *
44
+ * @param int $bytes
45
+ * @return string|int Formatted string if $this->useFormatting is true, otherwise return $bytes as int
46
+ */
47
+ protected function formatBytes(int $bytes)
48
+ {
49
+ if (!$this->useFormatting) {
50
+ return $bytes;
51
+ }
52
+
53
+ if ($bytes > 1024 * 1024) {
54
+ return round($bytes / 1024 / 1024, 2).' MB';
55
+ } elseif ($bytes > 1024) {
56
+ return round($bytes / 1024, 2).' KB';
57
+ }
58
+
59
+ return $bytes . ' B';
60
+ }
61
+ }
vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Processor;
13
+
14
+ /**
15
+ * Injects memory_get_usage in all records
16
+ *
17
+ * @see Monolog\Processor\MemoryProcessor::__construct() for options
18
+ * @author Rob Jensen
19
+ */
20
+ class MemoryUsageProcessor extends MemoryProcessor
21
+ {
22
+ /**
23
+ * {@inheritDoc}
24
+ */
25
+ public function __invoke(array $record): array
26
+ {
27
+ $usage = memory_get_usage($this->realUsage);
28
+
29
+ if ($this->useFormatting) {
30
+ $usage = $this->formatBytes($usage);
31
+ }
32
+
33
+ $record['extra']['memory_usage'] = $usage;
34
+
35
+ return $record;
36
+ }
37
+ }
vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Processor;
13
+
14
+ use Monolog\Logger;
15
+ use Psr\Log\LogLevel;
16
+
17
+ /**
18
+ * Injects Hg branch and Hg revision number in all records
19
+ *
20
+ * @author Jonathan A. Schweder <jonathanschweder@gmail.com>
21
+ *
22
+ * @phpstan-import-type LevelName from \Monolog\Logger
23
+ * @phpstan-import-type Level from \Monolog\Logger
24
+ */
25
+ class MercurialProcessor implements ProcessorInterface
26
+ {
27
+ /** @var Level */
28
+ private $level;
29
+ /** @var array{branch: string, revision: string}|array<never>|null */
30
+ private static $cache = null;
31
+
32
+ /**
33
+ * @param int|string $level The minimum logging level at which this Processor will be triggered
34
+ *
35
+ * @phpstan-param Level|LevelName|LogLevel::* $level
36
+ */
37
+ public function __construct($level = Logger::DEBUG)
38
+ {
39
+ $this->level = Logger::toMonologLevel($level);
40
+ }
41
+
42
+ /**
43
+ * {@inheritDoc}
44
+ */
45
+ public function __invoke(array $record): array
46
+ {
47
+ // return if the level is not high enough
48
+ if ($record['level'] < $this->level) {
49
+ return $record;
50
+ }
51
+
52
+ $record['extra']['hg'] = self::getMercurialInfo();
53
+
54
+ return $record;
55
+ }
56
+
57
+ /**
58
+ * @return array{branch: string, revision: string}|array<never>
59
+ */
60
+ private static function getMercurialInfo(): array
61
+ {
62
+ if (self::$cache) {
63
+ return self::$cache;
64
+ }
65
+
66
+ $result = explode(' ', trim(`hg id -nb`));
67
+
68
+ if (count($result) >= 3) {
69
+ return self::$cache = [
70
+ 'branch' => $result[1],
71
+ 'revision' => $result[2],
72
+ ];
73
+ }
74
+
75
+ return self::$cache = [];
76
+ }
77
+ }
vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Processor;
13
+
14
+ /**
15
+ * Adds value of getmypid into records
16
+ *
17
+ * @author Andreas Hörnicke
18
+ */
19
+ class ProcessIdProcessor implements ProcessorInterface
20
+ {
21
+ /**
22
+ * {@inheritDoc}
23
+ */
24
+ public function __invoke(array $record): array
25
+ {
26
+ $record['extra']['process_id'] = getmypid();
27
+
28
+ return $record;
29
+ }
30
+ }
vendor/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Processor;
13
+
14
+ /**
15
+ * An optional interface to allow labelling Monolog processors.
16
+ *
17
+ * @author Nicolas Grekas <p@tchwork.com>
18
+ *
19
+ * @phpstan-import-type Record from \Monolog\Logger
20
+ */
21
+ interface ProcessorInterface
22
+ {
23
+ /**
24
+ * @return array The processed record
25
+ *
26
+ * @phpstan-param Record $record
27
+ * @phpstan-return Record
28
+ */
29
+ public function __invoke(array $record);
30
+ }
vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php ADDED
@@ -0,0 +1,86 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Processor;
13
+
14
+ use Monolog\Utils;
15
+
16
+ /**
17
+ * Processes a record's message according to PSR-3 rules
18
+ *
19
+ * It replaces {foo} with the value from $context['foo']
20
+ *
21
+ * @author Jordi Boggiano <j.boggiano@seld.be>
22
+ */
23
+ class PsrLogMessageProcessor implements ProcessorInterface
24
+ {
25
+ public const SIMPLE_DATE = "Y-m-d\TH:i:s.uP";
26
+
27
+ /** @var string|null */
28
+ private $dateFormat;
29
+
30
+ /** @var bool */
31
+ private $removeUsedContextFields;
32
+
33
+ /**
34
+ * @param string|null $dateFormat The format of the timestamp: one supported by DateTime::format
35
+ * @param bool $removeUsedContextFields If set to true the fields interpolated into message gets unset
36
+ */
37
+ public function __construct(?string $dateFormat = null, bool $removeUsedContextFields = false)
38
+ {
39
+ $this->dateFormat = $dateFormat;
40
+ $this->removeUsedContextFields = $removeUsedContextFields;
41
+ }
42
+
43
+ /**
44
+ * {@inheritDoc}
45
+ */
46
+ public function __invoke(array $record): array
47
+ {
48
+ if (false === strpos($record['message'], '{')) {
49
+ return $record;
50
+ }
51
+
52
+ $replacements = [];
53
+ foreach ($record['context'] as $key => $val) {
54
+ $placeholder = '{' . $key . '}';
55
+ if (strpos($record['message'], $placeholder) === false) {
56
+ continue;
57
+ }
58
+
59
+ if (is_null($val) || is_scalar($val) || (is_object($val) && method_exists($val, "__toString"))) {
60
+ $replacements[$placeholder] = $val;
61
+ } elseif ($val instanceof \DateTimeInterface) {
62
+ if (!$this->dateFormat && $val instanceof \Monolog\DateTimeImmutable) {
63
+ // handle monolog dates using __toString if no specific dateFormat was asked for
64
+ // so that it follows the useMicroseconds flag
65
+ $replacements[$placeholder] = (string) $val;
66
+ } else {
67
+ $replacements[$placeholder] = $val->format($this->dateFormat ?: static::SIMPLE_DATE);
68
+ }
69
+ } elseif (is_object($val)) {
70
+ $replacements[$placeholder] = '[object '.Utils::getClass($val).']';
71
+ } elseif (is_array($val)) {
72
+ $replacements[$placeholder] = 'array'.Utils::jsonEncode($val, null, true);
73
+ } else {
74
+ $replacements[$placeholder] = '['.gettype($val).']';
75
+ }
76
+
77
+ if ($this->removeUsedContextFields) {
78
+ unset($record['context'][$key]);
79
+ }
80
+ }
81
+
82
+ $record['message'] = strtr($record['message'], $replacements);
83
+
84
+ return $record;
85
+ }
86
+ }
vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Processor;
13
+
14
+ /**
15
+ * Adds a tags array into record
16
+ *
17
+ * @author Martijn Riemers
18
+ */
19
+ class TagProcessor implements ProcessorInterface
20
+ {
21
+ /** @var string[] */
22
+ private $tags;
23
+
24
+ /**
25
+ * @param string[] $tags
26
+ */
27
+ public function __construct(array $tags = [])
28
+ {
29
+ $this->setTags($tags);
30
+ }
31
+
32
+ /**
33
+ * @param string[] $tags
34
+ */
35
+ public function addTags(array $tags = []): self
36
+ {
37
+ $this->tags = array_merge($this->tags, $tags);
38
+
39
+ return $this;
40
+ }
41
+
42
+ /**
43
+ * @param string[] $tags
44
+ */
45
+ public function setTags(array $tags = []): self
46
+ {
47
+ $this->tags = $tags;
48
+
49
+ return $this;
50
+ }
51
+
52
+ /**
53
+ * {@inheritDoc}
54
+ */
55
+ public function __invoke(array $record): array
56
+ {
57
+ $record['extra']['tags'] = $this->tags;
58
+
59
+ return $record;
60
+ }
61
+ }
vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Processor;
13
+
14
+ use Monolog\ResettableInterface;
15
+
16
+ /**
17
+ * Adds a unique identifier into records
18
+ *
19
+ * @author Simon Mönch <sm@webfactory.de>
20
+ */
21
+ class UidProcessor implements ProcessorInterface, ResettableInterface
22
+ {
23
+ /** @var string */
24
+ private $uid;
25
+
26
+ public function __construct(int $length = 7)
27
+ {
28
+ if ($length > 32 || $length < 1) {
29
+ throw new \InvalidArgumentException('The uid length must be an integer between 1 and 32');
30
+ }
31
+
32
+ $this->uid = $this->generateUid($length);
33
+ }
34
+
35
+ /**
36
+ * {@inheritDoc}
37
+ */
38
+ public function __invoke(array $record): array
39
+ {
40
+ $record['extra']['uid'] = $this->uid;
41
+
42
+ return $record;
43
+ }
44
+
45
+ public function getUid(): string
46
+ {
47
+ return $this->uid;
48
+ }
49
+
50
+ public function reset()
51
+ {
52
+ $this->uid = $this->generateUid(strlen($this->uid));
53
+ }
54
+
55
+ private function generateUid(int $length): string
56
+ {
57
+ return substr(bin2hex(random_bytes((int) ceil($length / 2))), 0, $length);
58
+ }
59
+ }
vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php ADDED
@@ -0,0 +1,111 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Processor;
13
+
14
+ /**
15
+ * Injects url/method and remote IP of the current web request in all records
16
+ *
17
+ * @author Jordi Boggiano <j.boggiano@seld.be>
18
+ */
19
+ class WebProcessor implements ProcessorInterface
20
+ {
21
+ /**
22
+ * @var array<string, mixed>|\ArrayAccess<string, mixed>
23
+ */
24
+ protected $serverData;
25
+
26
+ /**
27
+ * Default fields
28
+ *
29
+ * Array is structured as [key in record.extra => key in $serverData]
30
+ *
31
+ * @var array<string, string>
32
+ */
33
+ protected $extraFields = [
34
+ 'url' => 'REQUEST_URI',
35
+ 'ip' => 'REMOTE_ADDR',
36
+ 'http_method' => 'REQUEST_METHOD',
37
+ 'server' => 'SERVER_NAME',
38
+ 'referrer' => 'HTTP_REFERER',
39
+ 'user_agent' => 'HTTP_USER_AGENT',
40
+ ];
41
+
42
+ /**
43
+ * @param array<string, mixed>|\ArrayAccess<string, mixed>|null $serverData Array or object w/ ArrayAccess that provides access to the $_SERVER data
44
+ * @param array<string, string>|array<string>|null $extraFields Field names and the related key inside $serverData to be added (or just a list of field names to use the default configured $serverData mapping). If not provided it defaults to: [url, ip, http_method, server, referrer] + unique_id if present in server data
45
+ */
46
+ public function __construct($serverData = null, array $extraFields = null)
47
+ {
48
+ if (null === $serverData) {
49
+ $this->serverData = &$_SERVER;
50
+ } elseif (is_array($serverData) || $serverData instanceof \ArrayAccess) {
51
+ $this->serverData = $serverData;
52
+ } else {
53
+ throw new \UnexpectedValueException('$serverData must be an array or object implementing ArrayAccess.');
54
+ }
55
+
56
+ $defaultEnabled = ['url', 'ip', 'http_method', 'server', 'referrer'];
57
+ if (isset($this->serverData['UNIQUE_ID'])) {
58
+ $this->extraFields['unique_id'] = 'UNIQUE_ID';
59
+ $defaultEnabled[] = 'unique_id';
60
+ }
61
+
62
+ if (null === $extraFields) {
63
+ $extraFields = $defaultEnabled;
64
+ }
65
+ if (isset($extraFields[0])) {
66
+ foreach (array_keys($this->extraFields) as $fieldName) {
67
+ if (!in_array($fieldName, $extraFields)) {
68
+ unset($this->extraFields[$fieldName]);
69
+ }
70
+ }
71
+ } else {
72
+ $this->extraFields = $extraFields;
73
+ }
74
+ }
75
+
76
+ /**
77
+ * {@inheritDoc}
78
+ */
79
+ public function __invoke(array $record): array
80
+ {
81
+ // skip processing if for some reason request data
82
+ // is not present (CLI or wonky SAPIs)
83
+ if (!isset($this->serverData['REQUEST_URI'])) {
84
+ return $record;
85
+ }
86
+
87
+ $record['extra'] = $this->appendExtraFields($record['extra']);
88
+
89
+ return $record;
90
+ }
91
+
92
+ public function addExtraField(string $extraName, string $serverName): self
93
+ {
94
+ $this->extraFields[$extraName] = $serverName;
95
+
96
+ return $this;
97
+ }
98
+
99
+ /**
100
+ * @param mixed[] $extra
101
+ * @return mixed[]
102
+ */
103
+ private function appendExtraFields(array $extra): array
104
+ {
105
+ foreach ($this->extraFields as $extraName => $serverName) {
106
+ $extra[$extraName] = $this->serverData[$serverName] ?? null;
107
+ }
108
+
109
+ return $extra;
110
+ }
111
+ }
vendor/monolog/monolog/src/Monolog/Registry.php ADDED
@@ -0,0 +1,134 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog;
13
+
14
+ use InvalidArgumentException;
15
+
16
+ /**
17
+ * Monolog log registry
18
+ *
19
+ * Allows to get `Logger` instances in the global scope
20
+ * via static method calls on this class.
21
+ *
22
+ * <code>
23
+ * $application = new Monolog\Logger('application');
24
+ * $api = new Monolog\Logger('api');
25
+ *
26
+ * Monolog\Registry::addLogger($application);
27
+ * Monolog\Registry::addLogger($api);
28
+ *
29
+ * function testLogger()
30
+ * {
31
+ * Monolog\Registry::api()->error('Sent to $api Logger instance');
32
+ * Monolog\Registry::application()->error('Sent to $application Logger instance');
33
+ * }
34
+ * </code>
35
+ *
36
+ * @author Tomas Tatarko <tomas@tatarko.sk>
37
+ */
38
+ class Registry
39
+ {
40
+ /**
41
+ * List of all loggers in the registry (by named indexes)
42
+ *
43
+ * @var Logger[]
44
+ */
45
+ private static $loggers = [];
46
+
47
+ /**
48
+ * Adds new logging channel to the registry
49
+ *
50
+ * @param Logger $logger Instance of the logging channel
51
+ * @param string|null $name Name of the logging channel ($logger->getName() by default)
52
+ * @param bool $overwrite Overwrite instance in the registry if the given name already exists?
53
+ * @throws \InvalidArgumentException If $overwrite set to false and named Logger instance already exists
54
+ * @return void
55
+ */
56
+ public static function addLogger(Logger $logger, ?string $name = null, bool $overwrite = false)
57
+ {
58
+ $name = $name ?: $logger->getName();
59
+
60
+ if (isset(self::$loggers[$name]) && !$overwrite) {
61
+ throw new InvalidArgumentException('Logger with the given name already exists');
62
+ }
63
+
64
+ self::$loggers[$name] = $logger;
65
+ }
66
+
67
+ /**
68
+ * Checks if such logging channel exists by name or instance
69
+ *
70
+ * @param string|Logger $logger Name or logger instance
71
+ */
72
+ public static function hasLogger($logger): bool
73
+ {
74
+ if ($logger instanceof Logger) {
75
+ $index = array_search($logger, self::$loggers, true);
76
+
77
+ return false !== $index;
78
+ }
79
+
80
+ return isset(self::$loggers[$logger]);
81
+ }
82
+
83
+ /**
84
+ * Removes instance from registry by name or instance
85
+ *
86
+ * @param string|Logger $logger Name or logger instance
87
+ */
88
+ public static function removeLogger($logger): void
89
+ {
90
+ if ($logger instanceof Logger) {
91
+ if (false !== ($idx = array_search($logger, self::$loggers, true))) {
92
+ unset(self::$loggers[$idx]);
93
+ }
94
+ } else {
95
+ unset(self::$loggers[$logger]);
96
+ }
97
+ }
98
+
99
+ /**
100
+ * Clears the registry
101
+ */
102
+ public static function clear(): void
103
+ {
104
+ self::$loggers = [];
105
+ }
106
+
107
+ /**
108
+ * Gets Logger instance from the registry
109
+ *
110
+ * @param string $name Name of the requested Logger instance
111
+ * @throws \InvalidArgumentException If named Logger instance is not in the registry
112
+ */
113
+ public static function getInstance($name): Logger
114
+ {
115
+ if (!isset(self::$loggers[$name])) {
116
+ throw new InvalidArgumentException(sprintf('Requested "%s" logger instance is not in the registry', $name));
117
+ }
118
+
119
+ return self::$loggers[$name];
120
+ }
121
+
122
+ /**
123
+ * Gets Logger instance from the registry via static method call
124
+ *
125
+ * @param string $name Name of the requested Logger instance
126
+ * @param mixed[] $arguments Arguments passed to static method call
127
+ * @throws \InvalidArgumentException If named Logger instance is not in the registry
128
+ * @return Logger Requested instance of Logger
129
+ */
130
+ public static function __callStatic($name, $arguments)
131
+ {
132
+ return self::getInstance($name);
133
+ }
134
+ }
vendor/monolog/monolog/src/Monolog/ResettableInterface.php ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog;
13
+
14
+ /**
15
+ * Handler or Processor implementing this interface will be reset when Logger::reset() is called.
16
+ *
17
+ * Resetting ends a log cycle gets them back to their initial state.
18
+ *
19
+ * Resetting a Handler or a Processor means flushing/cleaning all buffers, resetting internal
20
+ * state, and getting it back to a state in which it can receive log records again.
21
+ *
22
+ * This is useful in case you want to avoid logs leaking between two requests or jobs when you
23
+ * have a long running process like a worker or an application server serving multiple requests
24
+ * in one process.
25
+ *
26
+ * @author Grégoire Pineau <lyrixx@lyrixx.info>
27
+ */
28
+ interface ResettableInterface
29
+ {
30
+ /**
31
+ * @return void
32
+ */
33
+ public function reset();
34
+ }
vendor/monolog/monolog/src/Monolog/SignalHandler.php ADDED
@@ -0,0 +1,120 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog;
13
+
14
+ use Psr\Log\LoggerInterface;
15
+ use Psr\Log\LogLevel;
16
+ use ReflectionExtension;
17
+
18
+ /**
19
+ * Monolog POSIX signal handler
20
+ *
21
+ * @author Robert Gust-Bardon <robert@gust-bardon.org>
22
+ *
23
+ * @phpstan-import-type Level from \Monolog\Logger
24
+ * @phpstan-import-type LevelName from \Monolog\Logger
25
+ */
26
+ class SignalHandler
27
+ {
28
+ /** @var LoggerInterface */
29
+ private $logger;
30
+
31
+ /** @var array<int, callable|string|int> SIG_DFL, SIG_IGN or previous callable */
32
+ private $previousSignalHandler = [];
33
+ /** @var array<int, int> */
34
+ private $signalLevelMap = [];
35
+ /** @var array<int, bool> */
36
+ private $signalRestartSyscalls = [];
37
+
38
+ public function __construct(LoggerInterface $logger)
39
+ {
40
+ $this->logger = $logger;
41
+ }
42
+
43
+ /**
44
+ * @param int|string $level Level or level name
45
+ * @param bool $callPrevious
46
+ * @param bool $restartSyscalls
47
+ * @param bool|null $async
48
+ * @return $this
49
+ *
50
+ * @phpstan-param Level|LevelName|LogLevel::* $level
51
+ */
52
+ public function registerSignalHandler(int $signo, $level = LogLevel::CRITICAL, bool $callPrevious = true, bool $restartSyscalls = true, ?bool $async = true): self
53
+ {
54
+ if (!extension_loaded('pcntl') || !function_exists('pcntl_signal')) {
55
+ return $this;
56
+ }
57
+
58
+ $level = Logger::toMonologLevel($level);
59
+
60
+ if ($callPrevious) {
61
+ $handler = pcntl_signal_get_handler($signo);
62
+ $this->previousSignalHandler[$signo] = $handler;
63
+ } else {
64
+ unset($this->previousSignalHandler[$signo]);
65
+ }
66
+ $this->signalLevelMap[$signo] = $level;
67
+ $this->signalRestartSyscalls[$signo] = $restartSyscalls;
68
+
69
+ if ($async !== null) {
70
+ pcntl_async_signals($async);
71
+ }
72
+
73
+ pcntl_signal($signo, [$this, 'handleSignal'], $restartSyscalls);
74
+
75
+ return $this;
76
+ }
77
+
78
+ /**
79
+ * @param mixed $siginfo
80
+ */
81
+ public function handleSignal(int $signo, $siginfo = null): void
82
+ {
83
+ static $signals = [];
84
+
85
+ if (!$signals && extension_loaded('pcntl')) {
86
+ $pcntl = new ReflectionExtension('pcntl');
87
+ // HHVM 3.24.2 returns an empty array.
88
+ foreach ($pcntl->getConstants() ?: get_defined_constants(true)['Core'] as $name => $value) {
89
+ if (substr($name, 0, 3) === 'SIG' && $name[3] !== '_' && is_int($value)) {
90
+ $signals[$value] = $name;
91
+ }
92
+ }
93
+ }
94
+
95
+ $level = $this->signalLevelMap[$signo] ?? LogLevel::CRITICAL;
96
+ $signal = $signals[$signo] ?? $signo;
97
+ $context = $siginfo ?? [];
98
+ $this->logger->log($level, sprintf('Program received signal %s', $signal), $context);
99
+
100
+ if (!isset($this->previousSignalHandler[$signo])) {
101
+ return;
102
+ }
103
+
104
+ if ($this->previousSignalHandler[$signo] === SIG_DFL) {
105
+ if (extension_loaded('pcntl') && function_exists('pcntl_signal') && function_exists('pcntl_sigprocmask') && function_exists('pcntl_signal_dispatch')
106
+ && extension_loaded('posix') && function_exists('posix_getpid') && function_exists('posix_kill')
107
+ ) {
108
+ $restartSyscalls = $this->signalRestartSyscalls[$signo] ?? true;
109
+ pcntl_signal($signo, SIG_DFL, $restartSyscalls);
110
+ pcntl_sigprocmask(SIG_UNBLOCK, [$signo], $oldset);
111
+ posix_kill(posix_getpid(), $signo);
112
+ pcntl_signal_dispatch();
113
+ pcntl_sigprocmask(SIG_SETMASK, $oldset);
114
+ pcntl_signal($signo, [$this, 'handleSignal'], $restartSyscalls);
115
+ }
116
+ } elseif (is_callable($this->previousSignalHandler[$signo])) {
117
+ $this->previousSignalHandler[$signo]($signo, $siginfo);
118
+ }
119
+ }
120
+ }
vendor/monolog/monolog/src/Monolog/Test/TestCase.php ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog\Test;
13
+
14
+ use Monolog\Logger;
15
+ use Monolog\DateTimeImmutable;
16
+ use Monolog\Formatter\FormatterInterface;
17
+
18
+ /**
19
+ * Lets you easily generate log records and a dummy formatter for testing purposes
20
+ *
21
+ * @author Jordi Boggiano <j.boggiano@seld.be>
22
+ *
23
+ * @phpstan-import-type Record from \Monolog\Logger
24
+ * @phpstan-import-type Level from \Monolog\Logger
25
+ *
26
+ * @internal feel free to reuse this to test your own handlers, this is marked internal to avoid issues with PHPStorm https://github.com/Seldaek/monolog/issues/1677
27
+ */
28
+ class TestCase extends \PHPUnit\Framework\TestCase
29
+ {
30
+ public function tearDown(): void
31
+ {
32
+ parent::tearDown();
33
+
34
+ if (isset($this->handler)) {
35
+ unset($this->handler);
36
+ }
37
+ }
38
+
39
+ /**
40
+ * @param mixed[] $context
41
+ *
42
+ * @return array Record
43
+ *
44
+ * @phpstan-param Level $level
45
+ * @phpstan-return Record
46
+ */
47
+ protected function getRecord(int $level = Logger::WARNING, string $message = 'test', array $context = []): array
48
+ {
49
+ return [
50
+ 'message' => (string) $message,
51
+ 'context' => $context,
52
+ 'level' => $level,
53
+ 'level_name' => Logger::getLevelName($level),
54
+ 'channel' => 'test',
55
+ 'datetime' => new DateTimeImmutable(true),
56
+ 'extra' => [],
57
+ ];
58
+ }
59
+
60
+ /**
61
+ * @phpstan-return Record[]
62
+ */
63
+ protected function getMultipleRecords(): array
64
+ {
65
+ return [
66
+ $this->getRecord(Logger::DEBUG, 'debug message 1'),
67
+ $this->getRecord(Logger::DEBUG, 'debug message 2'),
68
+ $this->getRecord(Logger::INFO, 'information'),
69
+ $this->getRecord(Logger::WARNING, 'warning'),
70
+ $this->getRecord(Logger::ERROR, 'error'),
71
+ ];
72
+ }
73
+
74
+ protected function getIdentityFormatter(): FormatterInterface
75
+ {
76
+ $formatter = $this->createMock(FormatterInterface::class);
77
+ $formatter->expects($this->any())
78
+ ->method('format')
79
+ ->will($this->returnCallback(function ($record) {
80
+ return $record['message'];
81
+ }));
82
+
83
+ return $formatter;
84
+ }
85
+ }
vendor/monolog/monolog/src/Monolog/Utils.php ADDED
@@ -0,0 +1,284 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare(strict_types=1);
2
+
3
+ /*
4
+ * This file is part of the Monolog package.
5
+ *
6
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Monolog;
13
+
14
+ final class Utils
15
+ {
16
+ const DEFAULT_JSON_FLAGS = JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRESERVE_ZERO_FRACTION | JSON_INVALID_UTF8_SUBSTITUTE | JSON_PARTIAL_OUTPUT_ON_ERROR;
17
+
18
+ public static function getClass(object $object): string
19
+ {
20
+ $class = \get_class($object);
21
+
22
+ if (false === ($pos = \strpos($class, "@anonymous\0"))) {
23
+ return $class;
24
+ }
25
+
26
+ if (false === ($parent = \get_parent_class($class))) {
27
+ return \substr($class, 0, $pos + 10);
28
+ }
29
+
30
+ return $parent . '@anonymous';
31
+ }
32
+
33
+ public static function substr(string $string, int $start, ?int $length = null): string
34
+ {
35
+ if (extension_loaded('mbstring')) {
36
+ return mb_strcut($string, $start, $length);
37
+ }
38
+
39
+ return substr($string, $start, (null === $length) ? strlen($string) : $length);
40
+ }
41
+
42
+ /**
43
+ * Makes sure if a relative path is passed in it is turned into an absolute path
44
+ *
45
+ * @param string $streamUrl stream URL or path without protocol
46
+ */
47
+ public static function canonicalizePath(string $streamUrl): string
48
+ {
49
+ $prefix = '';
50
+ if ('file://' === substr($streamUrl, 0, 7)) {
51
+ $streamUrl = substr($streamUrl, 7);
52
+ $prefix = 'file://';
53
+ }
54
+
55
+ // other type of stream, not supported
56
+ if (false !== strpos($streamUrl, '://')) {
57
+ return $streamUrl;
58
+ }
59
+
60
+ // already absolute
61
+ if (substr($streamUrl, 0, 1) === '/' || substr($streamUrl, 1, 1) === ':' || substr($streamUrl, 0, 2) === '\\\\') {
62
+ return $prefix.$streamUrl;
63
+ }
64
+
65
+ $streamUrl = getcwd() . '/' . $streamUrl;
66
+
67
+ return $prefix.$streamUrl;
68
+ }
69
+
70
+ /**
71
+ * Return the JSON representation of a value
72
+ *
73
+ * @param mixed $data
74
+ * @param int $encodeFlags flags to pass to json encode, defaults to DEFAULT_JSON_FLAGS
75
+ * @param bool $ignoreErrors whether to ignore encoding errors or to throw on error, when ignored and the encoding fails, "null" is returned which is valid json for null
76
+ * @throws \RuntimeException if encoding fails and errors are not ignored
77
+ * @return string when errors are ignored and the encoding fails, "null" is returned which is valid json for null
78
+ */
79
+ public static function jsonEncode($data, ?int $encodeFlags = null, bool $ignoreErrors = false): string
80
+ {
81
+ if (null === $encodeFlags) {
82
+ $encodeFlags = self::DEFAULT_JSON_FLAGS;
83
+ }
84
+
85
+ if ($ignoreErrors) {
86
+ $json = @json_encode($data, $encodeFlags);
87
+ if (false === $json) {
88
+ return 'null';
89
+ }
90
+
91
+ return $json;
92
+ }
93
+
94
+ $json = json_encode($data, $encodeFlags);
95
+ if (false === $json) {
96
+ $json = self::handleJsonError(json_last_error(), $data);
97
+ }
98
+
99
+ return $json;
100
+ }
101
+
102
+ /**
103
+ * Handle a json_encode failure.
104
+ *
105
+ * If the failure is due to invalid string encoding, try to clean the
106
+ * input and encode again. If the second encoding attempt fails, the
107
+ * initial error is not encoding related or the input can't be cleaned then
108
+ * raise a descriptive exception.
109
+ *
110
+ * @param int $code return code of json_last_error function
111
+ * @param mixed $data data that was meant to be encoded
112
+ * @param int $encodeFlags flags to pass to json encode, defaults to JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRESERVE_ZERO_FRACTION
113
+ * @throws \RuntimeException if failure can't be corrected
114
+ * @return string JSON encoded data after error correction
115
+ */
116
+ public static function handleJsonError(int $code, $data, ?int $encodeFlags = null): string
117
+ {
118
+ if ($code !== JSON_ERROR_UTF8) {
119
+ self::throwEncodeError($code, $data);
120
+ }
121
+
122
+ if (is_string($data)) {
123
+ self::detectAndCleanUtf8($data);
124
+ } elseif (is_array($data)) {
125
+ array_walk_recursive($data, array('Monolog\Utils', 'detectAndCleanUtf8'));
126
+ } else {
127
+ self::throwEncodeError($code, $data);
128
+ }
129
+
130
+ if (null === $encodeFlags) {
131
+ $encodeFlags = self::DEFAULT_JSON_FLAGS;
132
+ }
133
+
134
+ $json = json_encode($data, $encodeFlags);
135
+
136
+ if ($json === false) {
137
+ self::throwEncodeError(json_last_error(), $data);
138
+ }
139
+
140
+ return $json;
141
+ }
142
+
143
+ /**
144
+ * @internal
145
+ */
146
+ public static function pcreLastErrorMessage(int $code): string
147
+ {
148
+ if (PHP_VERSION_ID >= 80000) {
149
+ return preg_last_error_msg();
150
+ }
151
+
152
+ $constants = (get_defined_constants(true))['pcre'];
153
+ $constants = array_filter($constants, function ($key) {
154
+ return substr($key, -6) == '_ERROR';
155
+ }, ARRAY_FILTER_USE_KEY);
156
+
157
+ $constants = array_flip($constants);
158
+
159
+ return $constants[$code] ?? 'UNDEFINED_ERROR';
160
+ }
161
+
162
+ /**
163
+ * Throws an exception according to a given code with a customized message
164
+ *
165
+ * @param int $code return code of json_last_error function
166
+ * @param mixed $data data that was meant to be encoded
167
+ * @throws \RuntimeException
168
+ *
169
+ * @return never
170
+ */
171
+ private static function throwEncodeError(int $code, $data): void
172
+ {
173
+ switch ($code) {
174
+ case JSON_ERROR_DEPTH:
175
+ $msg = 'Maximum stack depth exceeded';
176
+ break;
177
+ case JSON_ERROR_STATE_MISMATCH:
178
+ $msg = 'Underflow or the modes mismatch';
179
+ break;
180
+ case JSON_ERROR_CTRL_CHAR:
181
+ $msg = 'Unexpected control character found';
182
+ break;
183
+ case JSON_ERROR_UTF8:
184
+ $msg = 'Malformed UTF-8 characters, possibly incorrectly encoded';
185
+ break;
186
+ default:
187
+ $msg = 'Unknown error';
188
+ }
189
+
190
+ throw new \RuntimeException('JSON encoding failed: '.$msg.'. Encoding: '.var_export($data, true));
191
+ }
192
+
193
+ /**
194
+ * Detect invalid UTF-8 string characters and convert to valid UTF-8.
195
+ *
196
+ * Valid UTF-8 input will be left unmodified, but strings containing
197
+ * invalid UTF-8 codepoints will be reencoded as UTF-8 with an assumed
198
+ * original encoding of ISO-8859-15. This conversion may result in
199
+ * incorrect output if the actual encoding was not ISO-8859-15, but it
200
+ * will be clean UTF-8 output and will not rely on expensive and fragile
201
+ * detection algorithms.
202
+ *
203
+ * Function converts the input in place in the passed variable so that it
204
+ * can be used as a callback for array_walk_recursive.
205
+ *
206
+ * @param mixed $data Input to check and convert if needed, passed by ref
207
+ */
208
+ private static function detectAndCleanUtf8(&$data): void
209
+ {
210
+ if (is_string($data) && !preg_match('//u', $data)) {
211
+ $data = preg_replace_callback(
212
+ '/[\x80-\xFF]+/',
213
+ function ($m) {
214
+ return function_exists('mb_convert_encoding') ? mb_convert_encoding($m[0], 'UTF-8', 'ISO-8859-1') : utf8_encode($m[0]);
215
+ },
216
+ $data
217
+ );
218
+ if (!is_string($data)) {
219
+ $pcreErrorCode = preg_last_error();
220
+ throw new \RuntimeException('Failed to preg_replace_callback: ' . $pcreErrorCode . ' / ' . self::pcreLastErrorMessage($pcreErrorCode));
221
+ }
222
+ $data = str_replace(
223
+ ['¤', '¦', '¨', '´', '¸', '¼', '½', '¾'],
224
+ ['€', 'Š', 'š', 'Ž', 'ž', 'Œ', 'œ', 'Ÿ'],
225
+ $data
226
+ );
227
+ }
228
+ }
229
+
230
+ /**
231
+ * Converts a string with a valid 'memory_limit' format, to bytes.
232
+ *
233
+ * @param string|false $val
234
+ * @return int|false Returns an integer representing bytes. Returns FALSE in case of error.
235
+ */
236
+ public static function expandIniShorthandBytes($val)
237
+ {
238
+ if (!is_string($val)) {
239
+ return false;
240
+ }
241
+
242
+ // support -1
243
+ if ((int) $val < 0) {
244
+ return (int) $val;
245
+ }
246
+
247
+ if (!preg_match('/^\s*(?<val>\d+)(?:\.\d+)?\s*(?<unit>[gmk]?)\s*$/i', $val, $match)) {
248
+ return false;
249
+ }
250
+
251
+ $val = (int) $match['val'];
252
+ switch (strtolower($match['unit'] ?? '')) {
253
+ case 'g':
254
+ $val *= 1024;
255
+ case 'm':
256
+ $val *= 1024;
257
+ case 'k':
258
+ $val *= 1024;
259
+ }
260
+
261
+ return $val;
262
+ }
263
+
264
+ /**
265
+ * @param array<mixed> $record
266
+ */
267
+ public static function getRecordMessageForException(array $record): string
268
+ {
269
+ $context = '';
270
+ $extra = '';
271
+ try {
272
+ if ($record['context']) {
273
+ $context = "\nContext: " . json_encode($record['context']);
274
+ }
275
+ if ($record['extra']) {
276
+ $extra = "\nExtra: " . json_encode($record['extra']);
277
+ }
278
+ } catch (\Throwable $e) {
279
+ // noop
280
+ }
281
+
282
+ return "\nThe exception occurred while attempting to log: " . $record['message'] . $context . $extra;
283
+ }
284
+ }
vendor/psr/log/LICENSE ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright (c) 2012 PHP Framework Interoperability Group
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
vendor/psr/log/Psr/Log/AbstractLogger.php ADDED
@@ -0,0 +1,128 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Psr\Log;
4
+
5
+ /**
6
+ * This is a simple Logger implementation that other Loggers can inherit from.
7
+ *
8
+ * It simply delegates all log-level-specific methods to the `log` method to
9
+ * reduce boilerplate code that a simple Logger that does the same thing with
10
+ * messages regardless of the error level has to implement.
11
+ */
12
+ abstract class AbstractLogger implements LoggerInterface
13
+ {
14
+ /**
15
+ * System is unusable.
16
+ *
17
+ * @param string $message
18
+ * @param mixed[] $context
19
+ *
20
+ * @return void
21
+ */
22
+ public function emergency($message, array $context = array())
23
+ {
24
+ $this->log(LogLevel::EMERGENCY, $message, $context);
25
+ }
26
+
27
+ /**
28
+ * Action must be taken immediately.
29
+ *
30
+ * Example: Entire website down, database unavailable, etc. This should
31
+ * trigger the SMS alerts and wake you up.
32
+ *
33
+ * @param string $message
34
+ * @param mixed[] $context
35
+ *
36
+ * @return void
37
+ */
38
+ public function alert($message, array $context = array())
39
+ {
40
+ $this->log(LogLevel::ALERT, $message, $context);
41
+ }
42
+
43
+ /**
44
+ * Critical conditions.
45
+ *
46
+ * Example: Application component unavailable, unexpected exception.
47
+ *
48
+ * @param string $message
49
+ * @param mixed[] $context
50
+ *
51
+ * @return void
52
+ */
53
+ public function critical($message, array $context = array())
54
+ {
55
+ $this->log(LogLevel::CRITICAL, $message, $context);
56
+ }
57
+
58
+ /**
59
+ * Runtime errors that do not require immediate action but should typically
60
+ * be logged and monitored.
61
+ *
62
+ * @param string $message
63
+ * @param mixed[] $context
64
+ *
65
+ * @return void
66
+ */
67
+ public function error($message, array $context = array())
68
+ {
69
+ $this->log(LogLevel::ERROR, $message, $context);
70
+ }
71
+
72
+ /**
73
+ * Exceptional occurrences that are not errors.
74
+ *
75
+ * Example: Use of deprecated APIs, poor use of an API, undesirable things
76
+ * that are not necessarily wrong.
77
+ *
78
+ * @param string $message
79
+ * @param mixed[] $context
80
+ *
81
+ * @return void
82
+ */
83
+ public function warning($message, array $context = array())
84
+ {
85
+ $this->log(LogLevel::WARNING, $message, $context);
86
+ }
87
+
88
+ /**
89
+ * Normal but significant events.
90
+ *
91
+ * @param string $message
92
+ * @param mixed[] $context
93
+ *
94
+ * @return void
95
+ */
96
+ public function notice($message, array $context = array())
97
+ {
98
+ $this->log(LogLevel::NOTICE, $message, $context);
99
+ }
100
+
101
+ /**
102
+ * Interesting events.
103
+ *
104
+ * Example: User logs in, SQL logs.
105
+ *
106
+ * @param string $message
107
+ * @param mixed[] $context
108
+ *
109
+ * @return void
110
+ */
111
+ public function info($message, array $context = array())
112
+ {
113
+ $this->log(LogLevel::INFO, $message, $context);
114
+ }
115
+
116
+ /**
117
+ * Detailed debug information.
118
+ *
119
+ * @param string $message
120
+ * @param mixed[] $context
121
+ *
122
+ * @return void
123
+ */
124
+ public function debug($message, array $context = array())
125
+ {
126
+ $this->log(LogLevel::DEBUG, $message, $context);
127
+ }
128
+ }
vendor/psr/log/Psr/Log/InvalidArgumentException.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Psr\Log;
4
+
5
+ class InvalidArgumentException extends \InvalidArgumentException
6
+ {
7
+ }
vendor/psr/log/Psr/Log/LogLevel.php ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Psr\Log;
4
+
5
+ /**
6
+ * Describes log levels.
7
+ */
8
+ class LogLevel
9
+ {
10
+ const EMERGENCY = 'emergency';
11
+ const ALERT = 'alert';
12
+ const CRITICAL = 'critical';
13
+ const ERROR = 'error';
14
+ const WARNING = 'warning';
15
+ const NOTICE = 'notice';
16
+ const INFO = 'info';
17
+ const DEBUG = 'debug';
18
+ }
vendor/psr/log/Psr/Log/LoggerAwareInterface.php ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Psr\Log;
4
+
5
+ /**
6
+ * Describes a logger-aware instance.
7
+ */
8
+ interface LoggerAwareInterface
9
+ {
10
+ /**
11
+ * Sets a logger instance on the object.
12
+ *
13
+ * @param LoggerInterface $logger
14
+ *
15
+ * @return void
16
+ */
17
+ public function setLogger(LoggerInterface $logger);
18
+ }
vendor/psr/log/Psr/Log/LoggerAwareTrait.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Psr\Log;
4
+
5
+ /**
6
+ * Basic Implementation of LoggerAwareInterface.
7
+ */
8
+ trait LoggerAwareTrait
9
+ {
10
+ /**
11
+ * The logger instance.
12
+ *
13
+ * @var LoggerInterface|null
14
+ */
15
+ protected $logger;
16
+
17
+ /**
18
+ * Sets a logger.
19
+ *
20
+ * @param LoggerInterface $logger
21
+ */
22
+ public function setLogger(LoggerInterface $logger)
23
+ {
24
+ $this->logger = $logger;
25
+ }
26
+ }
vendor/psr/log/Psr/Log/LoggerInterface.php ADDED
@@ -0,0 +1,125 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Psr\Log;
4
+
5
+ /**
6
+ * Describes a logger instance.
7
+ *
8
+ * The message MUST be a string or object implementing __toString().
9
+ *
10
+ * The message MAY contain placeholders in the form: {foo} where foo
11
+ * will be replaced by the context data in key "foo".
12
+ *
13
+ * The context array can contain arbitrary data. The only assumption that
14
+ * can be made by implementors is that if an Exception instance is given
15
+ * to produce a stack trace, it MUST be in a key named "exception".
16
+ *
17
+ * See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md
18
+ * for the full interface specification.
19
+ */
20
+ interface LoggerInterface
21
+ {
22
+ /**
23
+ * System is unusable.
24
+ *
25
+ * @param string $message
26
+ * @param mixed[] $context
27
+ *
28
+ * @return void
29
+ */
30
+ public function emergency($message, array $context = array());
31
+
32
+ /**
33
+ * Action must be taken immediately.
34
+ *
35
+ * Example: Entire website down, database unavailable, etc. This should
36
+ * trigger the SMS alerts and wake you up.
37
+ *
38
+ * @param string $message
39
+ * @param mixed[] $context
40
+ *
41
+ * @return void
42
+ */
43
+ public function alert($message, array $context = array());
44
+
45
+ /**
46
+ * Critical conditions.
47
+ *
48
+ * Example: Application component unavailable, unexpected exception.
49
+ *
50
+ * @param string $message
51
+ * @param mixed[] $context
52
+ *
53
+ * @return void
54
+ */
55
+ public function critical($message, array $context = array());
56
+
57
+ /**
58
+ * Runtime errors that do not require immediate action but should typically
59
+ * be logged and monitored.
60
+ *
61
+ * @param string $message
62
+ * @param mixed[] $context
63
+ *
64
+ * @return void
65
+ */
66
+ public function error($message, array $context = array());
67
+
68
+ /**
69
+ * Exceptional occurrences that are not errors.
70
+ *
71
+ * Example: Use of deprecated APIs, poor use of an API, undesirable things
72
+ * that are not necessarily wrong.
73
+ *
74
+ * @param string $message
75
+ * @param mixed[] $context
76
+ *
77
+ * @return void
78
+ */
79
+ public function warning($message, array $context = array());
80
+
81
+ /**
82
+ * Normal but significant events.
83
+ *
84
+ * @param string $message
85
+ * @param mixed[] $context
86
+ *
87
+ * @return void
88
+ */
89
+ public function notice($message, array $context = array());
90
+
91
+ /**
92
+ * Interesting events.
93
+ *
94
+ * Example: User logs in, SQL logs.
95
+ *
96
+ * @param string $message
97
+ * @param mixed[] $context
98
+ *
99
+ * @return void
100
+ */
101
+ public function info($message, array $context = array());
102
+
103
+ /**
104
+ * Detailed debug information.
105
+ *
106
+ * @param string $message
107
+ * @param mixed[] $context
108
+ *
109
+ * @return void
110
+ */
111
+ public function debug($message, array $context = array());
112
+
113
+ /**
114
+ * Logs with an arbitrary level.
115
+ *
116
+ * @param mixed $level
117
+ * @param string $message
118
+ * @param mixed[] $context
119
+ *
120
+ * @return void
121
+ *
122
+ * @throws \Psr\Log\InvalidArgumentException
123
+ */
124
+ public function log($level, $message, array $context = array());
125
+ }
vendor/psr/log/Psr/Log/LoggerTrait.php ADDED
@@ -0,0 +1,142 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Psr\Log;
4
+
5
+ /**
6
+ * This is a simple Logger trait that classes unable to extend AbstractLogger
7
+ * (because they extend another class, etc) can include.
8
+ *
9
+ * It simply delegates all log-level-specific methods to the `log` method to
10
+ * reduce boilerplate code that a simple Logger that does the same thing with
11
+ * messages regardless of the error level has to implement.
12
+ */
13
+ trait LoggerTrait
14
+ {
15
+ /**
16
+ * System is unusable.
17
+ *
18
+ * @param string $message
19
+ * @param array $context
20
+ *
21
+ * @return void
22
+ */
23
+ public function emergency($message, array $context = array())
24
+ {
25
+ $this->log(LogLevel::EMERGENCY, $message, $context);
26
+ }
27
+
28
+ /**
29
+ * Action must be taken immediately.
30
+ *
31
+ * Example: Entire website down, database unavailable, etc. This should
32
+ * trigger the SMS alerts and wake you up.
33
+ *
34
+ * @param string $message
35
+ * @param array $context
36
+ *
37
+ * @return void
38
+ */
39
+ public function alert($message, array $context = array())
40
+ {
41
+ $this->log(LogLevel::ALERT, $message, $context);
42
+ }
43
+
44
+ /**
45
+ * Critical conditions.
46
+ *
47
+ * Example: Application component unavailable, unexpected exception.
48
+ *
49
+ * @param string $message
50
+ * @param array $context
51
+ *
52
+ * @return void
53
+ */
54
+ public function critical($message, array $context = array())
55
+ {
56
+ $this->log(LogLevel::CRITICAL, $message, $context);
57
+ }
58
+
59
+ /**
60
+ * Runtime errors that do not require immediate action but should typically
61
+ * be logged and monitored.
62
+ *
63
+ * @param string $message
64
+ * @param array $context
65
+ *
66
+ * @return void
67
+ */
68
+ public function error($message, array $context = array())
69
+ {
70
+ $this->log(LogLevel::ERROR, $message, $context);
71
+ }
72
+
73
+ /**
74
+ * Exceptional occurrences that are not errors.
75
+ *
76
+ * Example: Use of deprecated APIs, poor use of an API, undesirable things
77
+ * that are not necessarily wrong.
78
+ *
79
+ * @param string $message
80
+ * @param array $context
81
+ *
82
+ * @return void
83
+ */
84
+ public function warning($message, array $context = array())
85
+ {
86
+ $this->log(LogLevel::WARNING, $message, $context);
87
+ }
88
+
89
+ /**
90
+ * Normal but significant events.
91
+ *
92
+ * @param string $message
93
+ * @param array $context
94
+ *
95
+ * @return void
96
+ */
97
+ public function notice($message, array $context = array())
98
+ {
99
+ $this->log(LogLevel::NOTICE, $message, $context);
100
+ }
101
+
102
+ /**
103
+ * Interesting events.
104
+ *
105
+ * Example: User logs in, SQL logs.
106
+ *
107
+ * @param string $message
108
+ * @param array $context
109
+ *
110
+ * @return void
111
+ */
112
+ public function info($message, array $context = array())
113
+ {
114
+ $this->log(LogLevel::INFO, $message, $context);
115
+ }
116
+
117
+ /**
118
+ * Detailed debug information.
119
+ *
120
+ * @param string $message
121
+ * @param array $context
122
+ *
123
+ * @return void
124
+ */
125
+ public function debug($message, array $context = array())
126
+ {
127
+ $this->log(LogLevel::DEBUG, $message, $context);
128
+ }
129
+
130
+ /**
131
+ * Logs with an arbitrary level.
132
+ *
133
+ * @param mixed $level
134
+ * @param string $message
135
+ * @param array $context
136
+ *
137
+ * @return void
138
+ *
139
+ * @throws \Psr\Log\InvalidArgumentException
140
+ */
141
+ abstract public function log($level, $message, array $context = array());
142
+ }
vendor/psr/log/Psr/Log/NullLogger.php ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Psr\Log;
4
+
5
+ /**
6
+ * This Logger can be used to avoid conditional log calls.
7
+ *
8
+ * Logging should always be optional, and if no logger is provided to your
9
+ * library creating a NullLogger instance to have something to throw logs at
10
+ * is a good way to avoid littering your code with `if ($this->logger) { }`
11
+ * blocks.
12
+ */
13
+ class NullLogger extends AbstractLogger
14
+ {
15
+ /**
16
+ * Logs with an arbitrary level.
17
+ *
18
+ * @param mixed $level
19
+ * @param string $message
20
+ * @param array $context
21
+ *
22
+ * @return void
23
+ *
24
+ * @throws \Psr\Log\InvalidArgumentException
25
+ */
26
+ public function log($level, $message, array $context = array())
27
+ {
28
+ // noop
29
+ }
30
+ }
vendor/psr/log/Psr/Log/Test/DummyTest.php ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Psr\Log\Test;
4
+
5
+ /**
6
+ * This class is internal and does not follow the BC promise.
7
+ *
8
+ * Do NOT use this class in any way.
9
+ *
10
+ * @internal
11
+ */
12
+ class DummyTest
13
+ {
14
+ public function __toString()
15
+ {
16
+ return 'DummyTest';
17
+ }
18
+ }
vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php ADDED
@@ -0,0 +1,138 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Psr\Log\Test;
4
+
5
+ use Psr\Log\LoggerInterface;
6
+ use Psr\Log\LogLevel;
7
+ use PHPUnit\Framework\TestCase;
8
+
9
+ /**
10
+ * Provides a base test class for ensuring compliance with the LoggerInterface.
11
+ *
12
+ * Implementors can extend the class and implement abstract methods to run this
13
+ * as part of their test suite.
14
+ */
15
+ abstract class LoggerInterfaceTest extends TestCase
16
+ {
17
+ /**
18
+ * @return LoggerInterface
19
+ */
20
+ abstract public function getLogger();
21
+
22
+ /**
23
+ * This must return the log messages in order.
24
+ *
25
+ * The simple formatting of the messages is: "<LOG LEVEL> <MESSAGE>".
26
+ *
27
+ * Example ->error('Foo') would yield "error Foo".
28
+ *
29
+ * @return string[]
30
+ */
31
+ abstract public function getLogs();
32
+
33
+ public function testImplements()
34
+ {
35
+ $this->assertInstanceOf('Psr\Log\LoggerInterface', $this->getLogger());
36
+ }
37
+
38
+ /**
39
+ * @dataProvider provideLevelsAndMessages
40
+ */
41
+ public function testLogsAtAllLevels($level, $message)
42
+ {
43
+ $logger = $this->getLogger();
44
+ $logger->{$level}($message, array('user' => 'Bob'));
45
+ $logger->log($level, $message, array('user' => 'Bob'));
46
+
47
+ $expected = array(
48
+ $level.' message of level '.$level.' with context: Bob',
49
+ $level.' message of level '.$level.' with context: Bob',
50
+ );
51
+ $this->assertEquals($expected, $this->getLogs());
52
+ }
53
+
54
+ public function provideLevelsAndMessages()
55
+ {
56
+ return array(
57
+ LogLevel::EMERGENCY => array(LogLevel::EMERGENCY, 'message of level emergency with context: {user}'),
58
+ LogLevel::ALERT => array(LogLevel::ALERT, 'message of level alert with context: {user}'),
59
+ LogLevel::CRITICAL => array(LogLevel::CRITICAL, 'message of level critical with context: {user}'),
60
+ LogLevel::ERROR => array(LogLevel::ERROR, 'message of level error with context: {user}'),
61
+ LogLevel::WARNING => array(LogLevel::WARNING, 'message of level warning with context: {user}'),
62
+ LogLevel::NOTICE => array(LogLevel::NOTICE, 'message of level notice with context: {user}'),
63
+ LogLevel::INFO => array(LogLevel::INFO, 'message of level info with context: {user}'),
64
+ LogLevel::DEBUG => array(LogLevel::DEBUG, 'message of level debug with context: {user}'),
65
+ );
66
+ }
67
+
68
+ /**
69
+ * @expectedException \Psr\Log\InvalidArgumentException
70
+ */
71
+ public function testThrowsOnInvalidLevel()
72
+ {
73
+ $logger = $this->getLogger();
74
+ $logger->log('invalid level', 'Foo');
75
+ }
76
+
77
+ public function testContextReplacement()
78
+ {
79
+ $logger = $this->getLogger();
80
+ $logger->info('{Message {nothing} {user} {foo.bar} a}', array('user' => 'Bob', 'foo.bar' => 'Bar'));
81
+
82
+ $expected = array('info {Message {nothing} Bob Bar a}');
83
+ $this->assertEquals($expected, $this->getLogs());
84
+ }
85
+
86
+ public function testObjectCastToString()
87
+ {
88
+ if (method_exists($this, 'createPartialMock')) {
89
+ $dummy = $this->createPartialMock('Psr\Log\Test\DummyTest', array('__toString'));
90
+ } else {
91
+ $dummy = $this->getMock('Psr\Log\Test\DummyTest', array('__toString'));
92
+ }
93
+ $dummy->expects($this->once())
94
+ ->method('__toString')
95
+ ->will($this->returnValue('DUMMY'));
96
+
97
+ $this->getLogger()->warning($dummy);
98
+
99
+ $expected = array('warning DUMMY');
100
+ $this->assertEquals($expected, $this->getLogs());
101
+ }
102
+
103
+ public function testContextCanContainAnything()
104
+ {
105
+ $closed = fopen('php://memory', 'r');
106
+ fclose($closed);
107
+
108
+ $context = array(
109
+ 'bool' => true,
110
+ 'null' => null,
111
+ 'string' => 'Foo',
112
+ 'int' => 0,
113
+ 'float' => 0.5,
114
+ 'nested' => array('with object' => new DummyTest),
115
+ 'object' => new \DateTime,
116
+ 'resource' => fopen('php://memory', 'r'),
117
+ 'closed' => $closed,
118
+ );
119
+
120
+ $this->getLogger()->warning('Crazy context data', $context);
121
+
122
+ $expected = array('warning Crazy context data');
123
+ $this->assertEquals($expected, $this->getLogs());
124
+ }
125
+
126
+ public function testContextExceptionKeyCanBeExceptionOrOtherValues()
127
+ {
128
+ $logger = $this->getLogger();
129
+ $logger->warning('Random message', array('exception' => 'oops'));
130
+ $logger->critical('Uncaught Exception!', array('exception' => new \LogicException('Fail')));
131
+
132
+ $expected = array(
133
+ 'warning Random message',
134
+ 'critical Uncaught Exception!'
135
+ );
136
+ $this->assertEquals($expected, $this->getLogs());
137
+ }
138
+ }
vendor/psr/log/Psr/Log/Test/TestLogger.php ADDED
@@ -0,0 +1,147 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Psr\Log\Test;
4
+
5
+ use Psr\Log\AbstractLogger;
6
+
7
+ /**
8
+ * Used for testing purposes.
9
+ *
10
+ * It records all records and gives you access to them for verification.
11
+ *
12
+ * @method bool hasEmergency($record)
13
+ * @method bool hasAlert($record)
14
+ * @method bool hasCritical($record)
15
+ * @method bool hasError($record)
16
+ * @method bool hasWarning($record)
17
+ * @method bool hasNotice($record)
18
+ * @method bool hasInfo($record)
19
+ * @method bool hasDebug($record)
20
+ *
21
+ * @method bool hasEmergencyRecords()
22
+ * @method bool hasAlertRecords()
23
+ * @method bool hasCriticalRecords()
24
+ * @method bool hasErrorRecords()
25
+ * @method bool hasWarningRecords()
26
+ * @method bool hasNoticeRecords()
27
+ * @method bool hasInfoRecords()
28
+ * @method bool hasDebugRecords()
29
+ *
30
+ * @method bool hasEmergencyThatContains($message)
31
+ * @method bool hasAlertThatContains($message)
32
+ * @method bool hasCriticalThatContains($message)
33
+ * @method bool hasErrorThatContains($message)
34
+ * @method bool hasWarningThatContains($message)
35
+ * @method bool hasNoticeThatContains($message)
36
+ * @method bool hasInfoThatContains($message)
37
+ * @method bool hasDebugThatContains($message)
38
+ *
39
+ * @method bool hasEmergencyThatMatches($message)
40
+ * @method bool hasAlertThatMatches($message)
41
+ * @method bool hasCriticalThatMatches($message)
42
+ * @method bool hasErrorThatMatches($message)
43
+ * @method bool hasWarningThatMatches($message)
44
+ * @method bool hasNoticeThatMatches($message)
45
+ * @method bool hasInfoThatMatches($message)
46
+ * @method bool hasDebugThatMatches($message)
47
+ *
48
+ * @method bool hasEmergencyThatPasses($message)
49
+ * @method bool hasAlertThatPasses($message)
50
+ * @method bool hasCriticalThatPasses($message)
51
+ * @method bool hasErrorThatPasses($message)
52
+ * @method bool hasWarningThatPasses($message)
53
+ * @method bool hasNoticeThatPasses($message)
54
+ * @method bool hasInfoThatPasses($message)
55
+ * @method bool hasDebugThatPasses($message)
56
+ */
57
+ class TestLogger extends AbstractLogger
58
+ {
59
+ /**
60
+ * @var array
61
+ */
62
+ public $records = [];
63
+
64
+ public $recordsByLevel = [];
65
+
66
+ /**
67
+ * @inheritdoc
68
+ */
69
+ public function log($level, $message, array $context = [])
70
+ {
71
+ $record = [
72
+ 'level' => $level,
73
+ 'message' => $message,
74
+ 'context' => $context,
75
+ ];
76
+
77
+ $this->recordsByLevel[$record['level']][] = $record;
78
+ $this->records[] = $record;
79
+ }
80
+
81
+ public function hasRecords($level)
82
+ {
83
+ return isset($this->recordsByLevel[$level]);
84
+ }
85
+
86
+ public function hasRecord($record, $level)
87
+ {
88
+ if (is_string($record)) {
89
+ $record = ['message' => $record];
90
+ }
91
+ return $this->hasRecordThatPasses(function ($rec) use ($record) {
92
+ if ($rec['message'] !== $record['message']) {
93
+ return false;
94
+ }
95
+ if (isset($record['context']) && $rec['context'] !== $record['context']) {
96
+ return false;
97
+ }
98
+ return true;
99
+ }, $level);
100
+ }
101
+
102
+ public function hasRecordThatContains($message, $level)
103
+ {
104
+ return $this->hasRecordThatPasses(function ($rec) use ($message) {
105
+ return strpos($rec['message'], $message) !== false;
106
+ }, $level);
107
+ }
108
+
109
+ public function hasRecordThatMatches($regex, $level)
110
+ {
111
+ return $this->hasRecordThatPasses(function ($rec) use ($regex) {
112
+ return preg_match($regex, $rec['message']) > 0;
113
+ }, $level);
114
+ }
115
+
116
+ public function hasRecordThatPasses(callable $predicate, $level)
117
+ {
118
+ if (!isset($this->recordsByLevel[$level])) {
119
+ return false;
120
+ }
121
+ foreach ($this->recordsByLevel[$level] as $i => $rec) {
122
+ if (call_user_func($predicate, $rec, $i)) {
123
+ return true;
124
+ }
125
+ }
126
+ return false;
127
+ }
128
+
129
+ public function __call($method, $args)
130
+ {
131
+ if (preg_match('/(.*)(Debug|Info|Notice|Warning|Error|Critical|Alert|Emergency)(.*)/', $method, $matches) > 0) {
132
+ $genericMethod = $matches[1] . ('Records' !== $matches[3] ? 'Record' : '') . $matches[3];
133
+ $level = strtolower($matches[2]);
134
+ if (method_exists($this, $genericMethod)) {
135
+ $args[] = $level;
136
+ return call_user_func_array([$this, $genericMethod], $args);
137
+ }
138
+ }
139
+ throw new \BadMethodCallException('Call to undefined method ' . get_class($this) . '::' . $method . '()');
140
+ }
141
+
142
+ public function reset()
143
+ {
144
+ $this->records = [];
145
+ $this->recordsByLevel = [];
146
+ }
147
+ }
vendor/psr/log/README.md ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ PSR Log
2
+ =======
3
+
4
+ This repository holds all interfaces/classes/traits related to
5
+ [PSR-3](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md).
6
+
7
+ Note that this is not a logger of its own. It is merely an interface that
8
+ describes a logger. See the specification for more details.
9
+
10
+ Installation
11
+ ------------
12
+
13
+ ```bash
14
+ composer require psr/log
15
+ ```
16
+
17
+ Usage
18
+ -----
19
+
20
+ If you need a logger, you can use the interface like this:
21
+
22
+ ```php
23
+ <?php
24
+
25
+ use Psr\Log\LoggerInterface;
26
+
27
+ class Foo
28
+ {
29
+ private $logger;
30
+
31
+ public function __construct(LoggerInterface $logger = null)
32
+ {
33
+ $this->logger = $logger;
34
+ }
35
+
36
+ public function doSomething()
37
+ {
38
+ if ($this->logger) {
39
+ $this->logger->info('Doing work');
40
+ }
41
+
42
+ try {
43
+ $this->doSomethingElse();
44
+ } catch (Exception $exception) {
45
+ $this->logger->error('Oh no!', array('exception' => $exception));
46
+ }
47
+
48
+ // do something useful
49
+ }
50
+ }
51
+ ```
52
+
53
+ You can then pick one of the implementations of the interface to get a logger.
54
+
55
+ If you want to implement the interface, you can require this package and
56
+ implement `Psr\Log\LoggerInterface` in your code. Please read the
57
+ [specification text](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md)
58
+ for details.
vendor/psr/log/composer.json ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "psr/log",
3
+ "description": "Common interface for logging libraries",
4
+ "keywords": ["psr", "psr-3", "log"],
5
+ "homepage": "https://github.com/php-fig/log",
6
+ "license": "MIT",
7
+ "authors": [
8
+ {
9
+ "name": "PHP-FIG",
10
+ "homepage": "https://www.php-fig.org/"
11
+ }
12
+ ],
13
+ "require": {
14
+ "php": ">=5.3.0"
15
+ },
16
+ "autoload": {
17
+ "psr-4": {
18
+ "Psr\\Log\\": "Psr/Log/"
19
+ }
20
+ },
21
+ "extra": {
22
+ "branch-alias": {
23
+ "dev-master": "1.1.x-dev"
24
+ }
25
+ }
26
+ }