Image Optimizer by 10web – Image Optimizer and Compression plugin - Version 1.0.0

Version Description

  • Initial version

=

Download this release

Release Info

Developer webdorado
Plugin Icon 128x128 Image Optimizer by 10web – Image Optimizer and Compression plugin
Version 1.0.0
Comparing to
See all releases

Version 1.0.0

Files changed (183) hide show
  1. assets/css/admin_main.css +1058 -0
  2. assets/css/calendar-jos.css +212 -0
  3. assets/css/img/calendar.png +0 -0
  4. assets/css/img/check.png +0 -0
  5. assets/css/img/delete-white.png +0 -0
  6. assets/css/img/delete.png +0 -0
  7. assets/css/img/ui-icons_888888_256x240.png +0 -0
  8. assets/css/img/web-dorado.png +0 -0
  9. assets/img/document.png +0 -0
  10. assets/img/folder-open.png +0 -0
  11. assets/img/folder.png +0 -0
  12. assets/img/help.jpg +0 -0
  13. assets/img/helpbalanced.jpg +0 -0
  14. assets/img/helpconservative.jpg +0 -0
  15. assets/img/helpextreme.jpg +0 -0
  16. assets/img/icon.png +0 -0
  17. assets/img/minus.png +0 -0
  18. assets/img/no_image.png +0 -0
  19. assets/img/plus.png +0 -0
  20. assets/img/reset.png +0 -0
  21. assets/img/search.png +0 -0
  22. assets/img/spinner.gif +0 -0
  23. assets/img/web-dorado.png +0 -0
  24. assets/js/admin_main.js +271 -0
  25. assets/js/api.js +74 -0
  26. assets/js/calendar.js +1522 -0
  27. assets/js/calendar_function.js +577 -0
  28. assets/js/settings.js +474 -0
  29. cacert-2017-06-07.pem +3955 -0
  30. classes/iowddb.php +103 -0
  31. classes/iowddb_class.php +93 -0
  32. classes/iowdimage.php +183 -0
  33. composer.json +13 -0
  34. composer.lock +1181 -0
  35. includes/iowd-ajax.php +291 -0
  36. includes/iowd-amazon-s3.php +64 -0
  37. includes/iowd-api.php +55 -0
  38. includes/iowd-helper.php +243 -0
  39. includes/iowd-log.php +28 -0
  40. includes/iowd-media-library.php +279 -0
  41. includes/iowd-optimize.php +743 -0
  42. includes/iowd-report.php +125 -0
  43. includes/iowd-settings.php +691 -0
  44. includes/iowd-uninstall.php +17 -0
  45. includes/iowd-util.php +53 -0
  46. io-wd.php +82 -0
  47. iowd-rest.php +147 -0
  48. iowd_class.php +490 -0
  49. log/index.php +0 -0
  50. readme.txt +226 -0
  51. vendor/aannnaa7/aws-sdk-php-minimized/LICENSE.md +141 -0
  52. vendor/aannnaa7/aws-sdk-php-minimized/NOTICE.md +64 -0
  53. vendor/aannnaa7/aws-sdk-php-minimized/README.md +176 -0
  54. vendor/aannnaa7/aws-sdk-php-minimized/composer.json +60 -0
  55. vendor/aannnaa7/aws-sdk-php-minimized/src/Api/AbstractModel.php +67 -0
  56. vendor/aannnaa7/aws-sdk-php-minimized/src/Api/ApiProvider.php +241 -0
  57. vendor/aannnaa7/aws-sdk-php-minimized/src/Api/DateTimeResult.php +41 -0
  58. vendor/aannnaa7/aws-sdk-php-minimized/src/Api/DocModel.php +128 -0
  59. vendor/aannnaa7/aws-sdk-php-minimized/src/Api/ErrorParser/JsonParserTrait.php +23 -0
  60. vendor/aannnaa7/aws-sdk-php-minimized/src/Api/ErrorParser/JsonRpcErrorParser.php +31 -0
  61. vendor/aannnaa7/aws-sdk-php-minimized/src/Api/ErrorParser/RestJsonErrorParser.php +35 -0
  62. vendor/aannnaa7/aws-sdk-php-minimized/src/Api/ErrorParser/XmlErrorParser.php +79 -0
  63. vendor/aannnaa7/aws-sdk-php-minimized/src/Api/ListShape.php +35 -0
  64. vendor/aannnaa7/aws-sdk-php-minimized/src/Api/MapShape.php +54 -0
  65. vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Operation.php +97 -0
  66. vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Parser/AbstractParser.php +35 -0
  67. vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Parser/AbstractRestParser.php +154 -0
  68. vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Parser/Crc32ValidatingParser.php +47 -0
  69. vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Parser/Exception/ParserException.php +4 -0
  70. vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Parser/JsonParser.php +58 -0
  71. vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Parser/JsonRpcParser.php +39 -0
  72. vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Parser/PayloadParserTrait.php +51 -0
  73. vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Parser/QueryParser.php +52 -0
  74. vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Parser/RestJsonParser.php +39 -0
  75. vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Parser/RestXmlParser.php +36 -0
  76. vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Parser/XmlParser.php +134 -0
  77. vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Serializer/Ec2ParamBuilder.php +40 -0
  78. vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Serializer/JsonBody.php +90 -0
  79. vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Serializer/JsonRpcSerializer.php +69 -0
  80. vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Serializer/QueryParamBuilder.php +154 -0
  81. vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Serializer/QuerySerializer.php +69 -0
  82. vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Serializer/RestJsonSerializer.php +39 -0
  83. vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Serializer/RestSerializer.php +193 -0
  84. vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Serializer/RestXmlSerializer.php +34 -0
  85. vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Serializer/XmlBody.php +217 -0
  86. vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Service.php +404 -0
  87. vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Shape.php +69 -0
  88. vendor/aannnaa7/aws-sdk-php-minimized/src/Api/ShapeMap.php +66 -0
  89. vendor/aannnaa7/aws-sdk-php-minimized/src/Api/StructureShape.php +79 -0
  90. vendor/aannnaa7/aws-sdk-php-minimized/src/Api/TimestampShape.php +48 -0
  91. vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Validator.php +236 -0
  92. vendor/aannnaa7/aws-sdk-php-minimized/src/ApiGateway/ApiGatewayClient.php +166 -0
  93. vendor/aannnaa7/aws-sdk-php-minimized/src/ApiGateway/Exception/ApiGatewayException.php +9 -0
  94. vendor/aannnaa7/aws-sdk-php-minimized/src/AwsClient.php +351 -0
  95. vendor/aannnaa7/aws-sdk-php-minimized/src/AwsClientInterface.php +169 -0
  96. vendor/aannnaa7/aws-sdk-php-minimized/src/CacheInterface.php +34 -0
  97. vendor/aannnaa7/aws-sdk-php-minimized/src/ClientResolver.php +548 -0
  98. vendor/aannnaa7/aws-sdk-php-minimized/src/CodeCommit/CodeCommitClient.php +32 -0
  99. vendor/aannnaa7/aws-sdk-php-minimized/src/CodeCommit/Exception/CodeCommitException.php +9 -0
  100. vendor/aannnaa7/aws-sdk-php-minimized/src/CodeDeploy/CodeDeployClient.php +74 -0
  101. vendor/aannnaa7/aws-sdk-php-minimized/src/CodeDeploy/Exception/CodeDeployException.php +9 -0
  102. vendor/aannnaa7/aws-sdk-php-minimized/src/CodePipeline/CodePipelineClient.php +56 -0
  103. vendor/aannnaa7/aws-sdk-php-minimized/src/CodePipeline/Exception/CodePipelineException.php +9 -0
  104. vendor/aannnaa7/aws-sdk-php-minimized/src/CognitoIdentity/CognitoIdentityClient.php +46 -0
  105. vendor/aannnaa7/aws-sdk-php-minimized/src/CognitoIdentity/Exception/CognitoIdentityException.php +9 -0
  106. vendor/aannnaa7/aws-sdk-php-minimized/src/CognitoSync/CognitoSyncClient.php +44 -0
  107. vendor/aannnaa7/aws-sdk-php-minimized/src/CognitoSync/Exception/CognitoSyncException.php +9 -0
  108. vendor/aannnaa7/aws-sdk-php-minimized/src/Command.php +57 -0
  109. vendor/aannnaa7/aws-sdk-php-minimized/src/CommandInterface.php +42 -0
  110. vendor/aannnaa7/aws-sdk-php-minimized/src/CommandPool.php +144 -0
  111. vendor/aannnaa7/aws-sdk-php-minimized/src/ConfigService/ConfigServiceClient.php +56 -0
  112. vendor/aannnaa7/aws-sdk-php-minimized/src/ConfigService/Exception/ConfigServiceException.php +9 -0
  113. vendor/aannnaa7/aws-sdk-php-minimized/src/Credentials/CredentialProvider.php +324 -0
  114. vendor/aannnaa7/aws-sdk-php-minimized/src/Credentials/Credentials.php +91 -0
  115. vendor/aannnaa7/aws-sdk-php-minimized/src/Credentials/CredentialsInterface.php +52 -0
  116. vendor/aannnaa7/aws-sdk-php-minimized/src/Credentials/InstanceProfileProvider.php +102 -0
  117. vendor/aannnaa7/aws-sdk-php-minimized/src/DeviceFarm/DeviceFarmClient.php +72 -0
  118. vendor/aannnaa7/aws-sdk-php-minimized/src/DeviceFarm/Exception/DeviceFarmException.php +9 -0
  119. vendor/aannnaa7/aws-sdk-php-minimized/src/DirectConnect/DirectConnectClient.php +48 -0
  120. vendor/aannnaa7/aws-sdk-php-minimized/src/DirectConnect/Exception/DirectConnectException.php +9 -0
  121. vendor/aannnaa7/aws-sdk-php-minimized/src/DirectoryService/DirectoryServiceClient.php +44 -0
  122. vendor/aannnaa7/aws-sdk-php-minimized/src/DirectoryService/Exception/DirectoryServiceException.php +9 -0
  123. vendor/aannnaa7/aws-sdk-php-minimized/src/DoctrineCacheAdapter.php +55 -0
  124. vendor/aannnaa7/aws-sdk-php-minimized/src/DynamoDb/BinaryValue.php +36 -0
  125. vendor/aannnaa7/aws-sdk-php-minimized/src/DynamoDb/DynamoDbClient.php +95 -0
  126. vendor/aannnaa7/aws-sdk-php-minimized/src/DynamoDb/Exception/DynamoDbException.php +9 -0
  127. vendor/aannnaa7/aws-sdk-php-minimized/src/DynamoDb/LockingSessionConnection.php +62 -0
  128. vendor/aannnaa7/aws-sdk-php-minimized/src/DynamoDb/Marshaler.php +320 -0
  129. vendor/aannnaa7/aws-sdk-php-minimized/src/DynamoDb/NumberValue.php +29 -0
  130. vendor/aannnaa7/aws-sdk-php-minimized/src/DynamoDb/SessionConnectionInterface.php +45 -0
  131. vendor/aannnaa7/aws-sdk-php-minimized/src/DynamoDb/SessionHandler.php +226 -0
  132. vendor/aannnaa7/aws-sdk-php-minimized/src/DynamoDb/SetValue.php +44 -0
  133. vendor/aannnaa7/aws-sdk-php-minimized/src/DynamoDb/StandardSessionConnection.php +137 -0
  134. vendor/aannnaa7/aws-sdk-php-minimized/src/DynamoDb/WriteRequestBatch.php +269 -0
  135. vendor/aannnaa7/aws-sdk-php-minimized/src/DynamoDbStreams/DynamoDbStreamsClient.php +29 -0
  136. vendor/aannnaa7/aws-sdk-php-minimized/src/DynamoDbStreams/Exception/DynamoDbStreamsException.php +9 -0
  137. vendor/aannnaa7/aws-sdk-php-minimized/src/Ec2/CopySnapshotMiddleware.php +78 -0
  138. vendor/aannnaa7/aws-sdk-php-minimized/src/Ec2/Ec2Client.php +416 -0
  139. vendor/aannnaa7/aws-sdk-php-minimized/src/Ec2/Exception/Ec2Exception.php +9 -0
  140. vendor/aannnaa7/aws-sdk-php-minimized/src/Ecs/EcsClient.php +64 -0
  141. vendor/aannnaa7/aws-sdk-php-minimized/src/Ecs/Exception/EcsException.php +9 -0
  142. vendor/aannnaa7/aws-sdk-php-minimized/src/Efs/EfsClient.php +32 -0
  143. vendor/aannnaa7/aws-sdk-php-minimized/src/Efs/Exception/EfsException.php +9 -0
  144. vendor/aannnaa7/aws-sdk-php-minimized/src/ElastiCache/ElastiCacheClient.php +84 -0
  145. vendor/aannnaa7/aws-sdk-php-minimized/src/ElastiCache/Exception/ElastiCacheException.php +9 -0
  146. vendor/aannnaa7/aws-sdk-php-minimized/src/ElasticBeanstalk/ElasticBeanstalkClient.php +74 -0
  147. vendor/aannnaa7/aws-sdk-php-minimized/src/ElasticBeanstalk/Exception/ElasticBeanstalkException.php +9 -0
  148. vendor/aannnaa7/aws-sdk-php-minimized/src/ElasticLoadBalancing/ElasticLoadBalancingClient.php +66 -0
  149. vendor/aannnaa7/aws-sdk-php-minimized/src/ElasticLoadBalancing/Exception/ElasticLoadBalancingException.php +9 -0
  150. vendor/aannnaa7/aws-sdk-php-minimized/src/ElasticTranscoder/ElasticTranscoderClient.php +44 -0
  151. vendor/aannnaa7/aws-sdk-php-minimized/src/ElasticTranscoder/Exception/ElasticTranscoderException.php +9 -0
  152. vendor/aannnaa7/aws-sdk-php-minimized/src/ElasticsearchService/ElasticsearchServiceClient.php +30 -0
  153. vendor/aannnaa7/aws-sdk-php-minimized/src/ElasticsearchService/Exception/ElasticsearchServiceException.php +9 -0
  154. vendor/aannnaa7/aws-sdk-php-minimized/src/Emr/EmrClient.php +44 -0
  155. vendor/aannnaa7/aws-sdk-php-minimized/src/Emr/Exception/EmrException.php +9 -0
  156. vendor/aannnaa7/aws-sdk-php-minimized/src/Endpoint/EndpointProvider.php +96 -0
  157. vendor/aannnaa7/aws-sdk-php-minimized/src/Endpoint/PatternEndpointProvider.php +51 -0
  158. vendor/aannnaa7/aws-sdk-php-minimized/src/Exception/AwsException.php +160 -0
  159. vendor/aannnaa7/aws-sdk-php-minimized/src/Exception/CouldNotCreateChecksumException.php +19 -0
  160. vendor/aannnaa7/aws-sdk-php-minimized/src/Exception/CredentialsException.php +4 -0
  161. vendor/aannnaa7/aws-sdk-php-minimized/src/Exception/MultipartUploadException.php +57 -0
  162. vendor/aannnaa7/aws-sdk-php-minimized/src/Exception/UnresolvedApiException.php +4 -0
  163. vendor/aannnaa7/aws-sdk-php-minimized/src/Exception/UnresolvedEndpointException.php +4 -0
  164. vendor/aannnaa7/aws-sdk-php-minimized/src/Exception/UnresolvedSignatureException.php +4 -0
  165. vendor/aannnaa7/aws-sdk-php-minimized/src/Firehose/Exception/FirehoseException.php +9 -0
  166. vendor/aannnaa7/aws-sdk-php-minimized/src/Firehose/FirehoseClient.php +24 -0
  167. vendor/aannnaa7/aws-sdk-php-minimized/src/Glacier/Exception/GlacierException.php +9 -0
  168. vendor/aannnaa7/aws-sdk-php-minimized/src/Glacier/GlacierClient.php +247 -0
  169. vendor/aannnaa7/aws-sdk-php-minimized/src/Glacier/MultipartUploader.php +281 -0
  170. vendor/aannnaa7/aws-sdk-php-minimized/src/Glacier/TreeHash.php +118 -0
  171. vendor/aannnaa7/aws-sdk-php-minimized/src/Handler/GuzzleV5/GuzzleHandler.php +181 -0
  172. vendor/aannnaa7/aws-sdk-php-minimized/src/Handler/GuzzleV5/GuzzleStream.php +24 -0
  173. vendor/aannnaa7/aws-sdk-php-minimized/src/Handler/GuzzleV5/PsrStream.php +34 -0
  174. vendor/aannnaa7/aws-sdk-php-minimized/src/Handler/GuzzleV6/GuzzleHandler.php +59 -0
  175. vendor/aannnaa7/aws-sdk-php-minimized/src/HandlerList.php +424 -0
  176. vendor/aannnaa7/aws-sdk-php-minimized/src/HasDataTrait.php +60 -0
  177. vendor/aannnaa7/aws-sdk-php-minimized/src/HashInterface.php +27 -0
  178. vendor/aannnaa7/aws-sdk-php-minimized/src/HashingStream.php +60 -0
  179. vendor/aannnaa7/aws-sdk-php-minimized/src/History.php +152 -0
  180. vendor/aannnaa7/aws-sdk-php-minimized/src/Iam/Exception/IamException.php +9 -0
  181. vendor/aannnaa7/aws-sdk-php-minimized/src/Iam/IamClient.php +236 -0
  182. vendor/aannnaa7/aws-sdk-php-minimized/src/Inspector/Exception/InspectorException.php +9 -0
  183. vendor/aannnaa7/aws-sdk-php-minimized/src/Inspector/InspectorClient.php +67 -0
assets/css/admin_main.css ADDED
@@ -0,0 +1,1058 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .iowd_header a, .iowd_header strong a {
2
+ text-decoration: none;
3
+ }
4
+
5
+ .iowd_header strong a {
6
+ color: #377BF1 !important;
7
+ }
8
+
9
+ a:focus {
10
+ box-shadow: none;
11
+ }
12
+
13
+ .iowd_header {
14
+ margin: 12px 30px 0px;
15
+ border-radius: 2px;
16
+ }
17
+
18
+ .iowd_header_cells {
19
+ display: table;
20
+ width: 100%;
21
+ }
22
+
23
+ .iowd_header_cells h2, .iowd h2 {
24
+ margin-top: 0px;
25
+ }
26
+
27
+ .iowd_actions:first-child {
28
+ width: 60%;
29
+ }
30
+
31
+ .iowd_actions:last-child {
32
+ width: 40%;
33
+ }
34
+
35
+ .iowd_actions_tabs {
36
+ display: table;
37
+ width: 100%;
38
+ }
39
+
40
+ .iowd_actions, .iowd_stat {
41
+ display: table-cell;
42
+ vertical-align: top;
43
+ }
44
+
45
+ .iowd_tab {
46
+ width: 50%;
47
+ display: table-cell;
48
+ border-top: 2px solid transparent;
49
+ border-bottom: 1px solid transparent;
50
+ cursor: pointer;
51
+ }
52
+
53
+ .iowd_tab a {
54
+ padding: 17px 5px;
55
+ text-align: center;
56
+ text-transform: uppercase;
57
+ font-size: 18px;
58
+ display: block;
59
+ color: #000;
60
+ }
61
+
62
+ .iowd_tab_active, .iowd_tab:hover {
63
+ background: #fff;
64
+ border-top: 2px solid #377BF1;
65
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
66
+ border-bottom: 1px solid #F9F9F9;
67
+ }
68
+
69
+ .iowd_tab_active a, .iowd_tab:hover a {
70
+ color: #377BF1 !important;
71
+ }
72
+
73
+ .iowd_actions_content, .iowd_stat_content, .iowd_limit_content {
74
+ background: #fff;
75
+ padding: 24px 31px;
76
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
77
+ }
78
+
79
+ .iowd_actions_content {
80
+ border-radius: 0px 0px 2px 2px;
81
+ }
82
+
83
+ .iowd_quick_settings {
84
+ margin-bottom: 39px;
85
+ }
86
+
87
+ .iowd_quick_settings_row {
88
+ margin-bottom: 10px;
89
+ display: table;
90
+ width: 100%;
91
+ }
92
+
93
+ .iowd_quick_settings_cell {
94
+ display: table-cell;
95
+ vertical-align: top;
96
+ text-align: center;
97
+ }
98
+
99
+ .iowd_quick_settings_cell:last-child {
100
+ width: 40%;
101
+ }
102
+
103
+ .iowd-how-works {
104
+ color: #377BF1;
105
+ border-bottom: 1px solid #377BF1;
106
+ }
107
+
108
+ .iowd-how-works:hover {
109
+ color: #377BF1 !important;
110
+ border-bottom: 1px solid transparent;
111
+ }
112
+
113
+ .iowd-standart-mode-view {
114
+ display: table;
115
+ margin: 11px auto 33px;
116
+ }
117
+
118
+ .iowd-standart-cell {
119
+ display: table-cell;
120
+ padding: 5px 0px;
121
+ font-size: 16px;
122
+ border-top: 1px solid #2D3142;
123
+ border-bottom: 1px solid #2D3142;
124
+ width: 155px;
125
+ text-align: center;
126
+ cursor: pointer;
127
+ }
128
+
129
+ .iowd-standart-cell:first-child {
130
+ border-left: 1px solid #2D3142;
131
+ border-right: 1px solid #2D3142;
132
+ }
133
+ .iowd-standart-cell:last-child{
134
+ border-left: 1px solid #2D3142;
135
+ border-right: 1px solid #ddd;
136
+ border-top: 1px solid #ddd;
137
+ border-bottom: 1px solid #ddd;
138
+ }
139
+
140
+ .iowd-standart-cell:first-child {
141
+ border-top-left-radius: 2px;
142
+ border-bottom-left-radius: 2px;
143
+ }
144
+
145
+ .iowd-standart-cell:last-child {
146
+ border-top-right-radius: 2px;
147
+ border-bottom-right-radius: 2px;
148
+ }
149
+
150
+ .iowd-standart-cell-active, .iowd-standart-cell:hover {
151
+ background: #2D3142;
152
+ color: #fff;
153
+ }
154
+
155
+ .iowd-setings {
156
+ margin-top: 50px;
157
+ }
158
+
159
+ .iowd_stat_content{
160
+ margin-left: 15px;
161
+ border-radius: 2px;
162
+ }
163
+
164
+ .iowd_stat_content{
165
+ margin-top: 55px;
166
+ border-radius: 2px;
167
+ }
168
+
169
+ .iowd_limit_content{
170
+ margin-top: 20px;
171
+ margin-left: 15px;
172
+ }
173
+
174
+ .iowd-main {
175
+ margin-bottom: 10px;
176
+ text-align: center;
177
+ }
178
+
179
+ .attachment-row {
180
+ margin-bottom: 5px;
181
+ border-bottom: 1px solid #ccc;
182
+ padding: 10px 0px;
183
+ }
184
+
185
+ .iowd-media-seleced {
186
+ padding: 10px 0px;
187
+ max-height: 300px;
188
+ overflow: auto;
189
+ text-align: left;
190
+ }
191
+
192
+ .iowd-media-seleced-b {
193
+ font-size: 18px;
194
+ margin-top: 33px;
195
+ }
196
+
197
+ .iowd_stat-row {
198
+ display: table;
199
+ width: 100%;
200
+ border-bottom: 1px solid #ccc;
201
+ padding: 19px 0px;
202
+ font-size: 15px;
203
+ }
204
+
205
+ .iowd-stat-progress-bar, .iowd-loading-bar {
206
+ border-radius: 5px;
207
+ border: 1px solid #72777c;
208
+ }
209
+
210
+ .iowd-loading-bar {
211
+ display: none;
212
+ margin: 10px 0px;
213
+ }
214
+
215
+ .iowd_stat_content .iowd_stat-row:last-child {
216
+ border-bottom: none;
217
+ }
218
+
219
+ .iowd-stat-ratio {
220
+ text-align: center;
221
+ font-weight: bold;
222
+ margin-top: 4px;
223
+ }
224
+
225
+ .iowd-stat-progress-bar-inner, .iowd-loading-bar-inner {
226
+ background: #377BF1;
227
+ height: 3px;
228
+ border-radius: 5px;
229
+ width: 0px;
230
+ }
231
+
232
+ .iowd-loading-bar-inner {
233
+ /*background: -webkit-linear-gradient(left , #0193CD 30%, #66D4E5 80%, #0193CD 100%) repeat;*/
234
+ background: rgba(122, 194, 214, 1);
235
+ background: -moz-linear-gradient(left, rgba(122, 194, 214, 1) 0%, rgba(94, 178, 201, 1) 41%, rgba(63, 151, 166, 1) 100%);
236
+ background: -webkit-gradient(left top, right top, color-stop(0%, rgba(122, 194, 214, 1)), color-stop(41%, rgba(94, 178, 201, 1)), color-stop(100%, rgba(63, 151, 166, 1)));
237
+ background: -webkit-linear-gradient(left, rgba(122, 194, 214, 1) 0%, rgba(94, 178, 201, 1) 41%, rgba(63, 151, 166, 1) 100%);
238
+ background: -o-linear-gradient(left, rgba(122, 194, 214, 1) 0%, rgba(94, 178, 201, 1) 41%, rgba(63, 151, 166, 1) 100%);
239
+ background: -ms-linear-gradient(left, rgba(122, 194, 214, 1) 0%, rgba(94, 178, 201, 1) 41%, rgba(63, 151, 166, 1) 100%);
240
+ background: linear-gradient(to right, rgba(122, 194, 214, 1) 0%, rgba(94, 178, 201, 1) 41%, rgba(63, 151, 166, 1) 100%);
241
+
242
+ -webkit-background-size: 50% 100%;
243
+ -webkit-animation-name: moving-gradient;
244
+ -webkit-animation-duration: 1s;
245
+ -webkit-animation-iteration-count: infinite;
246
+ -webkit-animation-timing-function: linear;
247
+ }
248
+
249
+ .iowd_stat-cell {
250
+ display: table-cell;
251
+ }
252
+
253
+ .iowd_stat-cell:first-child {
254
+ width: 60%;
255
+ }
256
+
257
+ .iowd-help {
258
+ margin-top: 8px;
259
+ vertical-align: top;
260
+ }
261
+
262
+ .iowd-up-to-date {
263
+ background-image: url(img/check.png);
264
+ background-repeat: no-repeat;
265
+ background-position: right center;
266
+ padding-right: 36px;
267
+ background-size: 35px;
268
+ }
269
+
270
+ .iowd-optimized-txt {
271
+ background: rgba(229, 229, 229, 0.44);
272
+ padding: 10px;
273
+ border-radius: 2px;
274
+ text-align: center;
275
+ color: #72777c;
276
+ font-size: 18px;
277
+ }
278
+
279
+ .iowd {
280
+ background: #fff;
281
+ padding: 24px 31px;
282
+ margin: 30px;
283
+ border-radius: 2px;
284
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
285
+ }
286
+
287
+ .iowd_other_dirs_container{
288
+ margin-top: 20px;
289
+ }
290
+
291
+ .iowd_other_save_btn {
292
+ text-align: right;
293
+ }
294
+
295
+ .iowd-setings input[type=text], .iowd-setings input[type=number], .iowd-setings select, .iowd-setings textarea {
296
+ border-radius: 2px;
297
+ height: 30px;
298
+ }
299
+
300
+ .iowd-setings input[type=radio], .iowd-setings input[type=checkbox] {
301
+ margin: 0px 5px 0px 7px;
302
+ }
303
+
304
+ .iowd-table {
305
+ display: table;
306
+ width: 100%;
307
+ margin: 10px auto;
308
+ border-radius: 2px;
309
+ }
310
+
311
+ .iowd-table-row {
312
+ display: table-row;
313
+ }
314
+
315
+ .iowd-table-cell {
316
+ display: table-cell;
317
+ vertical-align: middle;
318
+ padding: 10px 25px;
319
+ border-bottom: 1px solid #eee;
320
+ }
321
+
322
+ .iowd-table .iowd-table-row .iowd-table-cell:first-child {
323
+ width: 43%;
324
+ }
325
+
326
+ .iowd-elem-650 {
327
+ width: 650px;
328
+ }
329
+
330
+ .iowd-elem-450 {
331
+ width: 450px;
332
+ }
333
+
334
+ .iowd-elem-250 {
335
+ width: 250px;
336
+ }
337
+
338
+ .iowd-elem-80 {
339
+ width: 80px;
340
+ }
341
+
342
+ .iowd-elem-110 {
343
+ width: 110px;
344
+ }
345
+
346
+ .iowd-clear:after {
347
+ content: "";
348
+ clear: both;
349
+ display: table;
350
+ }
351
+
352
+ .iowd-btn {
353
+ padding: 9px 20px 9px;
354
+ height: auto;
355
+ display: inline-block;
356
+ margin: 0;
357
+ border: 0;
358
+ border-radius: 2px;
359
+ -moz-border-radius: 2px;
360
+ cursor: pointer;
361
+ box-shadow: none;
362
+ -moz-transition: color 0.3s, opacity 0.3s;
363
+ transition: color 0.3s, opacity 0.3s;
364
+ text-shadow: none;
365
+ font-size: 16px;
366
+ color: #FFF !important;
367
+ outline: none;
368
+ }
369
+
370
+ .iowd-btn-small {
371
+ padding: 6px 15px 6px;
372
+ font-size: 14px;
373
+ }
374
+
375
+ .iowd-btn-primary {
376
+ background: #377BF1;
377
+ }
378
+
379
+ .iowd-btn-primary:hover, .iowd-btn-primary:focus {
380
+ background: #377BF1;
381
+ outline: none;
382
+ }
383
+
384
+ .iowd-btn-secondary {
385
+ background: #AEAEAE;
386
+ }
387
+
388
+ .iowd-btn-secondary:hover, .iowd-btn-secondary:focus {
389
+ background: #9E9E9E;
390
+ outline: none;
391
+ }
392
+
393
+ .iowd-btn-disabled {
394
+ background: #ddd;
395
+ color: #fff !important;
396
+ cursor: not-allowed;
397
+ pointer-events: all !important;
398
+ }
399
+
400
+ .iowd-btn-disabled:hover, .iowd-btn-disabled:focus {
401
+ background: #ddd;
402
+ outline: none;
403
+ }
404
+
405
+ .iowd-spinner {
406
+ display: none;
407
+ }
408
+
409
+ /* Settings */
410
+ .iowd_save_btn {
411
+ margin-top: 30px;
412
+ }
413
+
414
+ .iowd_tabs_1 {
415
+ border-bottom: 1px solid #dddfe3;
416
+ }
417
+
418
+ .iowd_tabs_1 li {
419
+ width: auto;
420
+ background: none;
421
+ box-shadow: none;
422
+ float: left;
423
+ margin: 0;
424
+ padding: 0;
425
+ cursor: pointer;
426
+ position: relative;
427
+
428
+ }
429
+
430
+ .iowd_tabs_1 li a {
431
+ display: block;
432
+ padding: 13px 30px;
433
+ border-top: 3px solid transparent;
434
+ border-right: 1px solid transparent;
435
+ border-left: 1px solid transparent;
436
+ text-decoration: none;
437
+ color: #6e7990;
438
+ font-size: 16px;
439
+ font-weight: 400;
440
+ position: relative;
441
+ }
442
+
443
+ .iowd_tabs_1 li a:hover:after, .iowd_tabs_active:after {
444
+ content: "";
445
+ height: 4px;
446
+ background: #fff;
447
+ position: absolute;
448
+ bottom: -4px;
449
+ top: auto;
450
+ display: block;
451
+ width: 100%;
452
+ left: 0;
453
+ }
454
+
455
+ .iowd_tabs_1 li a:hover, .iowd_tabs_active {
456
+ border-top-color: #377BF1 !important;
457
+ color: #377BF1 !important;
458
+ border-right: 1px solid #dddfe3 !important;
459
+ border-left: 1px solid #dddfe3 !important;
460
+ }
461
+
462
+ .iowd-dir-paths {
463
+ margin: 10px 0px;
464
+ }
465
+
466
+ .iowd_other_folders_row {
467
+ padding: 10px 0px;
468
+ border-bottom: 1px solid #ccc;
469
+ }
470
+
471
+ .iowd-show-images {
472
+ background: #ddd;
473
+ padding: 5px 6px;
474
+ border-radius: 6px;
475
+ margin-left: 13px;
476
+ cursor: pointer;
477
+ }
478
+
479
+ .folder-images {
480
+ margin-top: 10px;
481
+ background: #fff;
482
+ padding: 10px;
483
+ max-height: 300px;
484
+ overflow: auto;
485
+ }
486
+
487
+ .folder-images div {
488
+ border-bottom: 1px solid #ccc;
489
+ padding: 10px 0px;
490
+
491
+ }
492
+
493
+ .iowd-popup, .iowd-popup-help {
494
+ display: none;
495
+ }
496
+
497
+ .iowd_other_folders_container, .iowd-how-works-container {
498
+ position: fixed;
499
+ top: 0;
500
+ left: 0;
501
+ right: 0;
502
+ bottom: 0;
503
+ margin: auto;
504
+ z-index: 444;
505
+ }
506
+
507
+ .iowd_other_folders_container {
508
+ width: 700px;
509
+ }
510
+
511
+ .iowd-how-works-container {
512
+ width: 68%;
513
+ height: 92%;
514
+ }
515
+
516
+ .iowd_folders {
517
+ background: #fff;
518
+ padding: 23px;
519
+ border-radius: 2px;
520
+ display: flex;
521
+ flex-direction: column;
522
+ width: 100%;
523
+ box-sizing: border-box;
524
+ margin-top: 82px;
525
+ overflow: auto;
526
+ max-height: 60%;
527
+ box-shadow: -1px -1px 13px #32373c;
528
+ font-size: 0;
529
+ overflow: hidden;
530
+ }
531
+
532
+ .header {
533
+ flex-grow: 0;
534
+ flex-shrink: 0;
535
+ }
536
+
537
+ .body-wrap {
538
+ flex-grow: 1;
539
+ flex-shrink: 1;
540
+ font-size: 15px;
541
+ overflow-y: auto;
542
+ }
543
+
544
+ .iowd-selected_bottom {
545
+ flex-grow: 0;
546
+ flex-shrink: 0;
547
+ }
548
+
549
+ .iowd_update_dirs, .iowd_update_alreday_used {
550
+ vertical-align: text-top;
551
+ padding-left: 15px;
552
+ width: 20px;
553
+ cursor: pointer;
554
+ }
555
+
556
+ .iowd_other_folders_container h2 {
557
+ border-bottom: 1px solid #ccc;
558
+ padding: 14px 0px;
559
+ margin: 0;
560
+ color: #377BF1;
561
+ font-size: 21px;
562
+ text-transform: uppercase;
563
+ }
564
+
565
+ .iowd_other_folders_container ul ul {
566
+ padding-left: 20px;
567
+ }
568
+
569
+ .iowd_other_folders_container ul ul {
570
+ display: none;
571
+ }
572
+
573
+ .iowd_other_folders_container a, .iowd_other_folders_container a:hover {
574
+ color: #23282d;
575
+ text-decoration: none !important;
576
+ }
577
+
578
+ .iowd-active-folder > a {
579
+ color: #00ACCA !important;
580
+ }
581
+
582
+ .iowd-dir-tree-icon {
583
+ width: 18px;
584
+ vertical-align: middle;
585
+ padding: 5px 9px 5px 5px;
586
+ }
587
+
588
+ .iowd-select-dir {
589
+ text-align: right;
590
+ }
591
+
592
+ .iowd-selected-dir {
593
+ width: 100%;
594
+ margin: 10px 0px;
595
+ }
596
+
597
+ .iowd-popup-close, .iowd-popup-help-close {
598
+ font-size: 18px;
599
+ font-weight: bold;
600
+ text-align: right;
601
+ cursor: pointer;
602
+ }
603
+
604
+ .iowd-compare {
605
+ display: table;
606
+ width: 100%;
607
+ }
608
+
609
+ .iowd-compare-cell {
610
+ display: table-cell;
611
+ vertical-align: middle;
612
+ text-align: center;
613
+ text-transform: uppercase;
614
+ }
615
+
616
+ .iowd-compare-cell:first-child {
617
+ padding-right: 5px;
618
+ }
619
+
620
+ .iowd-compare-cell:last-child {
621
+ padding-left: 5px;
622
+ }
623
+
624
+ .iowd-help-stat-container {
625
+ border-bottom: 1px solid;
626
+ border-right: 1px solid;
627
+ border-left: 1px solid;
628
+ margin-top: -34px;
629
+ }
630
+
631
+ .iowd-help-stat {
632
+ display: table;
633
+ margin: 10px auto;
634
+ }
635
+
636
+ .iowd-help-stat h3 {
637
+ color: #377BF1;
638
+ font-weight: normal;
639
+ font-size: 17px;
640
+ }
641
+
642
+ .iowd-help-stat img {
643
+ vertical-align: middle;
644
+ padding-right: 5px;
645
+ }
646
+
647
+ .iowd-help-up-to {
648
+ color: #377BF1;
649
+ text-transform: uppercase;
650
+ }
651
+
652
+ .iowd-help-stat p {
653
+ font-size: 15px;
654
+ }
655
+
656
+ .iowd_remove, .iowd_remove_img, .iowd_remove_attachment {
657
+ color: #878787;
658
+ cursor: pointer;
659
+ display: inline-block;
660
+ float: right;
661
+ font-size: 18px;
662
+ font-weight: bold;
663
+ margin-right: 16px;
664
+ }
665
+
666
+ .iowd_msg_div {
667
+ display: none;
668
+ background: #fff;
669
+ padding: 15px;
670
+ margin: 10px 30px;
671
+ position: relative;
672
+ border: 1px solid #eee;
673
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
674
+ }
675
+
676
+ .iowd_msg_div_msg {
677
+ border-left: 2px solid green;
678
+ }
679
+
680
+ .iowd_msg_div_error {
681
+ border-left: 2px solid red !important;
682
+ }
683
+
684
+ .iowd_msg_div_close {
685
+ position: absolute;
686
+ right: 5px;
687
+ top: 2px;
688
+ font-weight: bold;
689
+ color: #6f6c6c;
690
+ cursor: pointer;
691
+ }
692
+
693
+ .iowd-popup ::-webkit-scrollbar, .iowd_header ::-webkit-scrollbar, .iowd ::-webkit-scrollbar {
694
+ width: 8px;
695
+ background: rgba(204, 204, 204, 0.38);
696
+ }
697
+
698
+ .iowd-popup ::-webkit-scrollbar-thumb, .iowd_header ::-webkit-scrollbar-thumb, .iowd ::-webkit-scrollbar-thumb {
699
+ border-radius: 2px;
700
+ background: #a0a5aa;
701
+ }
702
+
703
+ .iowd-opacity {
704
+ position: fixed;
705
+ top: 0;
706
+ left: 0;
707
+ right: 0;
708
+ bottom: 0;
709
+ background: #000;
710
+ opacity: 0.5;
711
+ z-index: 44;
712
+ }
713
+
714
+ /* reports */
715
+ .iowd_reports_container {
716
+ padding: 10px;
717
+ }
718
+
719
+ .iowd_reports_filters {
720
+ margin-top: 15px;
721
+ margin-bottom: 15px;
722
+ }
723
+
724
+ .iowd_reports_table table {
725
+ border-collapse: collapse;
726
+ width: 34%;
727
+ }
728
+
729
+ .iowd_reports_table .main_tr {
730
+ display: table;
731
+ margin-bottom: 5px;
732
+ border: 1px solid #ccc;
733
+ width: 100%;
734
+ border-radius: 2px;
735
+ }
736
+
737
+ .iowd_reports_table .iowd_reports_table_td {
738
+ padding: 22px 22px 0px 22px;
739
+ vertical-align: top;
740
+ display: table-cell;
741
+ }
742
+
743
+ .iowd_reports_table .iowd_reports_table_td:first-child {
744
+ width: 200px;
745
+ }
746
+
747
+ .iowd-report-block {
748
+ margin-bottom: 22px;
749
+ }
750
+
751
+ .iowd-report-block img {
752
+ max-width: 150px;
753
+ }
754
+
755
+ .iowd-blue-txt {
756
+ color: #377BF1;
757
+ }
758
+
759
+ .iowd_report_search, .iowd_report_reset {
760
+ width: 23px;
761
+ cursor: pointer;
762
+ }
763
+
764
+ /*pagination */
765
+ .iowd-paging-nav {
766
+ margin: 10px 0px;
767
+ text-align: right;
768
+ width: 98%;
769
+ }
770
+
771
+ .iowd-paging-nav input {
772
+ width: 37px;
773
+ vertical-align: top;
774
+ }
775
+
776
+ .iowd-paging-nav .iowd_page_separator {
777
+ height: 18px;
778
+ margin: 0 4px;
779
+ padding: 0 0 0 4px;
780
+ border-left: 1.5px solid #ccc;
781
+ }
782
+
783
+ .iowd_page_count {
784
+ height: 18px;
785
+ margin: 0 4px;
786
+ padding: 0 4px 0 0;
787
+ border-right: 1.5px solid #ccc;
788
+ }
789
+
790
+ .iowd-paging-nav a {
791
+ margin: auto 1px;
792
+ text-decoration: none;
793
+ display: inline-block;
794
+ color: white;
795
+ border-radius: 2px;
796
+ width: 16px;
797
+ height: 16px;
798
+ vertical-align: middle
799
+ }
800
+
801
+ .iowd-paging-nav a:first-child {
802
+ background-image: url(img/ui-icons_888888_256x240.png) /*{iconsDefault}*/;
803
+ background-position: -80px -160px;
804
+ }
805
+
806
+ .iowd-paging-nav a:nth-child(2) {
807
+ background-image: url(img/ui-icons_888888_256x240.png) /*{iconsDefault}*/;
808
+ background-position: -48px -160px;
809
+ }
810
+
811
+ .iowd-paging-nav .iowd_next_link {
812
+ background-image: url(img/ui-icons_888888_256x240.png) /*{iconsDefault}*/;
813
+ background-position: -32px -160px;
814
+ }
815
+
816
+ .iowd-paging-nav .last_link {
817
+ background-image: url(img/ui-icons_888888_256x240.png) /*{iconsDefault}*/;
818
+ background-position: -64px -160px;
819
+ }
820
+
821
+ @-webkit-keyframes moving-gradient {
822
+ 0% {
823
+ background-position: left bottom;
824
+ }
825
+
826
+ 100% {
827
+ background-position: right bottom;
828
+ }
829
+ }
830
+
831
+
832
+ .iowd-step {
833
+ text-align: center;
834
+ font-weight: bold;
835
+ color: #194e56;
836
+ }
837
+
838
+ .calendar_button {
839
+ background: url(img/calendar.png) no-repeat center !important;
840
+ width: 30px !important;
841
+ height: 30px !important;
842
+ vertical-align: top;
843
+ cursor: pointer;
844
+ }
845
+
846
+ .calendar_button:focus {
847
+ outline: none !important;
848
+ }
849
+
850
+ .iowd-report-loader {
851
+ position: absolute;
852
+ top: 0;
853
+ left: 0;
854
+ right: 0;
855
+ bottom: 0;
856
+ margin: auto;
857
+ display: none;
858
+ }
859
+
860
+ .iowd-report-loader-class {
861
+ position: relative;
862
+ opacity: 0.4;
863
+ }
864
+
865
+ .iowd-clear-history {
866
+ padding: 5px 11px 5px 28px;
867
+ background-repeat: no-repeat;
868
+ border: 0;
869
+ background-position: 4px center;
870
+ background-size: 16px;
871
+ cursor: pointer;
872
+ outline: none !important;
873
+ border-radius: 2px;
874
+ }
875
+
876
+ .iowd-clear-history-bulk {
877
+ color: #fff;
878
+ background-color: #2D3142;
879
+ background-image: url(img/delete-white.png);
880
+ }
881
+
882
+ .iowd-clear-history-single {
883
+ color: #686668;
884
+ background-color: #fff;
885
+
886
+ background-image: url(img/delete.png);
887
+ }
888
+
889
+ .iowd-report-more-cont {
890
+ margin-top: 10px;
891
+ text-align: center;
892
+ }
893
+
894
+ .iowd-more {
895
+ border: 1px solid #ccc;
896
+ display: inline-block;
897
+ padding: 5px 10px;
898
+ cursor: pointer;
899
+ border-radius: 2px;
900
+ }
901
+
902
+ .iowd-padding-left {
903
+ padding-left: 5px;
904
+ }
905
+
906
+ .iowd-switch {
907
+ position: relative;
908
+ display: inline-block;
909
+ width: 52px;
910
+ height: 20px;
911
+ }
912
+
913
+ /* Hide default HTML checkbox */
914
+ .iowd-switch input {
915
+ display: none;
916
+ }
917
+
918
+ /* The slider */
919
+ .iowd-slider {
920
+ position: absolute;
921
+ cursor: pointer;
922
+ top: 0;
923
+ left: 0;
924
+ right: 0;
925
+ bottom: 0;
926
+ -webkit-transition: .4s;
927
+ transition: .4s;
928
+ border-radius: 2px;
929
+ border: 1px solid #ccc;
930
+ }
931
+
932
+ .iowd-slider:before {
933
+ position: absolute;
934
+ content: "";
935
+ height: 18px;
936
+ width: 25px;
937
+ -webkit-transition: .4s;
938
+ transition: .4s;
939
+ left: -1px;
940
+ bottom: 0;
941
+ right: 0;
942
+ background-color: #ccc;
943
+ }
944
+
945
+ input:checked + .iowd-slider {
946
+ background-color: #fff;
947
+ border: 1px solid #377BF1;
948
+ }
949
+
950
+ input:focus + .iowd-slider {
951
+ box-shadow: 0 0 1px #2196F3;
952
+ }
953
+
954
+ input:checked + .iowd-slider:before {
955
+ -webkit-transform: translateX(26px);
956
+ -ms-transform: translateX(26px);
957
+ transform: translateX(26px);
958
+ background-color: #2196F3;
959
+ }
960
+
961
+ /* tooltips */
962
+ .ui-tooltip {
963
+ padding: 5px;
964
+ position: absolute;
965
+ z-index: 9999;
966
+ max-width: 500px;
967
+ -webkit-box-shadow: 0 0 5px #aaa;
968
+ box-shadow: 0 0 5px #aaa;
969
+ border-radius: 2px;
970
+ background: rgba(0, 0, 0, 0.8);
971
+ color: #fff;
972
+ font-size: 1em;
973
+ }
974
+
975
+ .iowd_optimizing_msg {
976
+ display: none;
977
+ text-align: center;
978
+ font-size: 16px;
979
+ padding: 10px;
980
+ border-radius: 2px;
981
+ margin: 9px 0px;
982
+ text-transform: uppercase;
983
+ box-shadow: 0 1px 6px rgba(0, 0, 0, 0.1);
984
+ color: #377BF1;
985
+ background: rgba(55, 123, 241, 0.16);
986
+ }
987
+
988
+ .iowd_optimizing_msg {
989
+ animation: blinker 1s linear;
990
+ -webkit-animation-iteration-count: 2; /* Safari 4.0 - 8.0 */
991
+ animation-iteration-count: 2;
992
+ }
993
+
994
+ @keyframes blinker {
995
+ 50% {
996
+ opacity: 0.2;
997
+ }
998
+ }
999
+
1000
+ .iowd-abort{
1001
+ display: none;
1002
+ color: #fff!important;
1003
+ background: rgba(165, 51, 51, 0.97);
1004
+ padding: 1px 11px 2px;
1005
+ margin-top: 7px;
1006
+ border-radius: 3px;
1007
+ }
1008
+
1009
+ .iowd-pro{
1010
+ color: rgba(165, 51, 51, 0.97);
1011
+ }
1012
+
1013
+ .iowd-disable{
1014
+ cursor: not-allowed !important;
1015
+ }
1016
+
1017
+ .iowd_upgrade{
1018
+ clear: both;
1019
+ padding: 0px 15px;
1020
+ background: #fff;
1021
+ margin: 6px 30px;
1022
+ color: #6e7990;
1023
+ font-size: 14px;
1024
+ font-weight: bold;
1025
+ line-height: 30px;
1026
+
1027
+ }
1028
+ .iowd_upgrade .wd-table{
1029
+ background-color: #D8D8D8;
1030
+ padding: 1px 5px;
1031
+ font-size: 11px;
1032
+ display: table;
1033
+ }
1034
+ .iowd_upgrade .wd-cell{
1035
+ display: table-cell;
1036
+ }
1037
+ .iowd_upgrade .wd-cell:first-child{
1038
+ padding-right: 2px;
1039
+ }
1040
+ .iowd_upgrade a, .iowd_upgrade a:hover {
1041
+ text-decoration: none !important;
1042
+ }
1043
+ .iowd_upgrade img {
1044
+ vertical-align: middle;
1045
+ }
1046
+ .wd-left{
1047
+ float:left;
1048
+ }
1049
+ .wd-right{
1050
+ float:right;
1051
+ }
1052
+ .wd-clear:after{
1053
+ clear:both;
1054
+ content:"";
1055
+ display:table;
1056
+ }
1057
+
1058
+
assets/css/calendar-jos.css ADDED
@@ -0,0 +1,212 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* The main calendar widget. DIV containing a table. */
2
+
3
+ /* Form Wordpress. */
4
+ .calendar .button {
5
+ display: table-cell !important;
6
+ }
7
+
8
+ div.calendar {
9
+ position: relative;
10
+ z-index: 100;
11
+ width: 226px;
12
+ }
13
+
14
+ .calendar,
15
+ .calendar table {
16
+ border: 1px solid #cccccc;
17
+ font-size: 11px;
18
+ color: #000;
19
+ cursor: default;
20
+ background: #efefef;
21
+ font-family: arial, verdana, sans-serif;
22
+ margin: 0;
23
+ line-height: 1.7;
24
+ }
25
+
26
+ /* Header part -- contains navigation buttons and day names. */
27
+ .calendar .button { /* "<<", "<", ">", ">>" buttons have this class */
28
+ text-align: center; /* They are the navigation buttons */
29
+ padding: 2px; /* Make the buttons seem like they're pressing */
30
+ border: 0px;
31
+ height: inherit;
32
+
33
+ }
34
+
35
+ .wdform_table1 .button,
36
+ #formMakerDiv1 .button,
37
+ .submitdate_fc .button,
38
+ .main .button {
39
+ -webkit-border-radius: 11px !important;;
40
+ border-radius: 11px !important;;
41
+ text-shadow: white 0px 1px 0px;
42
+ background-origin: padding-box;
43
+ border-bottom-width: 1px;
44
+ border-left-width: 1px;
45
+ border-right-width: 1px;
46
+ border-top-width: 1px;
47
+ }
48
+
49
+ .calendar thead .title { /* This holds the current "month, year" */
50
+ font-weight: bold; /* Pressing it will take you to the current date */
51
+ text-align: center;
52
+ background: #333333;
53
+ color: #ffffff;
54
+ padding: 2px;
55
+ }
56
+
57
+ .calendar thead .headrow { /* Row <TR> containing navigation buttons */
58
+ background: #dedede;
59
+ color: #000;
60
+ }
61
+
62
+ .calendar thead .name { /* Cells <TD> containing the day names */
63
+ border-bottom: 1px solid #cccccc;
64
+ padding: 2px;
65
+ text-align: center;
66
+ color: #000;
67
+ }
68
+
69
+ .calendar thead .weekend { /* How a weekend day name shows in header */
70
+ color: #666666 !important;
71
+ }
72
+
73
+ .calendar thead .hilite { /* How do the buttons in header appear when hover */
74
+ background: #bbbbbb;
75
+ color: #000000;
76
+ border: 1px solid #cccccc;
77
+ padding: 1px;
78
+ }
79
+
80
+ .calendar thead .active { /* Active (pressed) buttons in header */
81
+ background: #c77;
82
+ padding: 2px 0px 0px 2px;
83
+ }
84
+
85
+ .calendar thead .daynames { /* Row <TR> containing the day names */
86
+ background: #dddddd;
87
+ }
88
+
89
+ /* The body part -- contains all the days in month. */
90
+
91
+ .calendar tbody .day { /* Cells <TD> containing month days dates */
92
+ width: 2em;
93
+ text-align: right;
94
+ padding: 2px 4px 2px 2px;
95
+ }
96
+
97
+ .calendar table .wn {
98
+ padding: 2px 3px 2px 2px;
99
+ border-right: 1px solid #cccccc;
100
+ background: #dddddd;
101
+ }
102
+
103
+ .calendar tbody .rowhilite td {
104
+ background: #666666;
105
+ color: #ffffff;
106
+ }
107
+
108
+ .calendar tbody .rowhilite td.wn {
109
+ background: #666666;
110
+ color: #ffffff;
111
+ }
112
+
113
+ .calendar table {
114
+ border-collapse: inherit !important;
115
+ }
116
+
117
+ .calendar tbody td.hilite { /* Hovered cells <TD> */
118
+ background: #999999;
119
+ padding: 1px 3px 1px 1px;
120
+ border: 1px solid #666666;
121
+ }
122
+
123
+ .calendar tbody td.active { /* Active (pressed) cells <TD> */
124
+ background: #000000;
125
+ color: #ffffff;
126
+ padding: 2px 2px 0px 2px;
127
+ }
128
+
129
+ .calendar tbody td.selected { /* Cell showing today date */
130
+ font-weight: bold;
131
+ border: 1px solid #000;
132
+ padding: 1px 3px 1px 1px;
133
+ background: #000000;
134
+ color: #ffffff;
135
+ }
136
+
137
+ .calendar tbody td.weekend { /* Cells showing weekend days */
138
+ color: #cccccc;
139
+ }
140
+
141
+ .calendar tbody td.today {
142
+ font-weight: bold;
143
+ }
144
+
145
+ .calendar tbody .disabled {
146
+ color: #999;
147
+ }
148
+
149
+ .calendar tbody .emptycell { /* Empty cells (the best is to hide them) */
150
+ visibility: hidden;
151
+ padding: 0;
152
+ }
153
+
154
+ .calendar tbody .emptyrow { /* Empty row (some months need less than 6 rows) */
155
+ display: none;
156
+ }
157
+
158
+ /* The footer part -- status bar and "Close" button */
159
+
160
+ .calendar tfoot .footrow { /* The <TR> in footer (only one right now) */
161
+ text-align: center;
162
+ background: #cccccc;
163
+ color: #000;
164
+ }
165
+
166
+ .calendar tfoot .ttip { /* Tooltip (status bar) cell <TD> */
167
+ border-top: 1px solid #cccccc;
168
+ background: #efefef;
169
+ color: #000000;
170
+ }
171
+
172
+ .calendar tfoot .hilite { /* Hover style for buttons in footer */
173
+ background: #666666;
174
+ border: 1px solid #f40;
175
+ padding: 1px;
176
+ }
177
+
178
+ .calendar tfoot .active { /* Active (pressed) style for buttons in footer */
179
+ background: #999999;
180
+ padding: 2px 0px 0px 2px;
181
+ }
182
+
183
+ /* Combo boxes (menus that display months/years for direct selection) */
184
+ .combo {
185
+ position: absolute;
186
+ display: none;
187
+ top: 0px;
188
+ left: 0px;
189
+ width: 4em;
190
+ cursor: default;
191
+ border: 1px solid #655;
192
+ background: #ffffff;
193
+ color: #000;
194
+ font-size: smaller;
195
+ }
196
+
197
+ .combo .label {
198
+ width: 100%;
199
+ text-align: center;
200
+ }
201
+
202
+ .combo .hilite {
203
+ background: #fc8;
204
+ }
205
+
206
+ .combo .active {
207
+ border-top: 1px solid #cccccc;
208
+ border-bottom: 1px solid #cccccc;
209
+ background: #efefef;
210
+ font-weight: bold;
211
+
212
+ }
assets/css/img/calendar.png ADDED
Binary file
assets/css/img/check.png ADDED
Binary file
assets/css/img/delete-white.png ADDED
Binary file
assets/css/img/delete.png ADDED
Binary file
assets/css/img/ui-icons_888888_256x240.png ADDED
Binary file
assets/css/img/web-dorado.png ADDED
Binary file
assets/img/document.png ADDED
Binary file
assets/img/folder-open.png ADDED
Binary file
assets/img/folder.png ADDED
Binary file
assets/img/help.jpg ADDED
Binary file
assets/img/helpbalanced.jpg ADDED
Binary file
assets/img/helpconservative.jpg ADDED
Binary file
assets/img/helpextreme.jpg ADDED
Binary file
assets/img/icon.png ADDED
Binary file
assets/img/minus.png ADDED
Binary file
assets/img/no_image.png ADDED
Binary file
assets/img/plus.png ADDED
Binary file
assets/img/reset.png ADDED
Binary file
assets/img/search.png ADDED
Binary file
assets/img/spinner.gif ADDED
Binary file
assets/img/web-dorado.png ADDED
Binary file
assets/js/admin_main.js ADDED
@@ -0,0 +1,271 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ var api = new iowdAPI();
2
+ api.setApiUrl(iowd.ajaxURL);
3
+
4
+ jQuery(document).ready(function () {
5
+
6
+ if(iowd.iowd_optimizing == 1){
7
+ finishOptimizing(0, 25);
8
+ }
9
+
10
+ jQuery(document).on("keypress", "[type=text], [type=number]", function (event) {
11
+ event = event || window.event;
12
+ if (event.keyCode == 13) {
13
+ return false;
14
+ }
15
+ });
16
+
17
+ jQuery(document).on("click", ".iowd-abort", function(){
18
+ iowdAbort(this);
19
+ return false;
20
+ });
21
+
22
+
23
+ // single optimizing
24
+ jQuery(document).on('click', '.iowd-optimize', function () {
25
+ var postId = jQuery(this).attr("data-id");
26
+ var data = {
27
+ action: "get_attachment_data",
28
+ nonce_iowd: iowd.nonce,
29
+ ID: postId
30
+ };
31
+ jQuery(this).find(".iowd-spinner").show();
32
+
33
+ jQuery.post(iowd.ajaxURL, data, function () {
34
+ }).done(function (response) {
35
+ response = JSON.parse(response);
36
+ if(response.status == "error"){
37
+ var msg = response["error"];
38
+ if(response["error"] == "limit_error"){
39
+ msg = "Your limitation has expired for current month.";
40
+ } else if(response["error"] == "no_job"){
41
+ msg = "Something went wrong. Please try after few minutes.";
42
+ } else{
43
+ msg = "Something went wrong.";
44
+ }
45
+ jQuery(".iowd_" + postId).html(msg);
46
+ return false;
47
+ }
48
+ var data = {
49
+ action: "optimize",
50
+ nonce_iowd: iowd.nonce,
51
+ iteration: 0,
52
+ data_count: response.data_count,
53
+ ID: postId
54
+ };
55
+
56
+ api.setPostData(data);
57
+ api.doAPIRequest(iowdReportSingle);
58
+ });
59
+ return false;
60
+
61
+ });
62
+
63
+ //bulk optimizing
64
+ jQuery("#iowd_optimizing").click(function () {
65
+ jQuery(this).attr("disabled", "disabled");
66
+ jQuery(".iowd-abort").css("display", "inline-block");
67
+ jQuery(".iowd-cancel").hide();
68
+
69
+ jQuery(".iowd_msg_div").hide();
70
+ jQuery(".iowd-standart-mode-view").hide();
71
+ jQuery(".iowd-help-from-media").hide();
72
+ jQuery(".iowd_optimizing_msg").show();
73
+
74
+ var other = jQuery("[name=other_folders]").val() ? 1 : 0;
75
+ jQuery(".iowd-loading-bar").show();
76
+
77
+ var data = {
78
+ action: "get_attachment_data",
79
+ other: other,
80
+ bulk: 1,
81
+ ID: jQuery("[name=ids]").val(),
82
+ nonce_iowd: iowd.nonce,
83
+ };
84
+ jQuery(".iowd-spinner").show();
85
+ jQuery.post(iowd.ajaxURL, data, function () {
86
+ }).done(function (response) {
87
+ response = JSON.parse(response);
88
+ if(response.status == "error"){
89
+ window.location.href = "admin.php?page=iowd_settings";
90
+ return false;
91
+ }
92
+
93
+ var data = {
94
+ action: "optimize",
95
+ nonce_iowd: iowd.nonce,
96
+ iteration: 0,
97
+ bulk: 1,
98
+ data_count: response.data_count
99
+ };
100
+
101
+ api.setPostData(data);
102
+ api.doAPIRequest(iowdReportBulk);
103
+
104
+ }
105
+
106
+ );
107
+
108
+ return false;
109
+ });
110
+
111
+
112
+ jQuery(".iowd_opacity, .iowd_close").click(function () {
113
+ jQuery(".iowd_opacity").hide();
114
+ jQuery(".iowd_stats").hide();
115
+ jQuery(".iowd_stats_body").html("");
116
+ });
117
+
118
+ });
119
+
120
+ function iowdReportSingle(requestData, responseData, dataCount){
121
+
122
+ if(responseData["response"]["status"] == "error"){
123
+ jQuery(".iowd_" + postId).html(responseData["response"]["error"]);
124
+ return false;
125
+ }
126
+ else if(responseData["response"]["status"] == "abort"){
127
+ jQuery(".iowd_" + postId).html("Canceled");
128
+ return false;
129
+ }
130
+ postId = requestData.ID;
131
+ jQuery(".iowd-optimize[data-id=" + postId + "]").find(".iowd-spinner").hide();
132
+
133
+ jQuery(".iowd_" + postId).html(iowd.finishUploadingSingle);
134
+ finishOptimizing(postId, 20);
135
+
136
+ }
137
+
138
+ function iowdReportBulk(requestData, responseData, dataCount){
139
+
140
+ if(responseData["response"]["status"] == "error"){
141
+ window.location.href = "admin.php?page=iowd_settings";
142
+ return false;
143
+ }
144
+ else if(responseData["response"]["status"] == "abort"){
145
+ window.location.href = "admin.php?page=iowd_settings";
146
+ return false;
147
+ }
148
+ var iterator = requestData.iteration + 1;
149
+ if (iterator < dataCount) {
150
+ var width = iterator / dataCount * 100;
151
+ jQuery(".iowd-loading-bar-inner").animate({width: width + '%'});
152
+ }
153
+ else {
154
+ jQuery(".iowd-loading-bar-inner").animate({width: '100%'});
155
+ jQuery(".iowd-loading-bar-inner").css({width: '100%'});
156
+ jQuery(".iowd-spinner").hide();
157
+ jQuery(".iowd-loading-bar").hide();
158
+ responseData.iowd_images_count_start
159
+ jQuery(".iowd_msg_div_text").html(responseData.iowd_images_count_start + " " + iowd.finishUploadingBulk);
160
+ jQuery(".iowd_msg_div").show();
161
+ window.location.href = "admin.php?page=iowd_settings&iowd_optimizing=1";
162
+ }
163
+ }
164
+
165
+ function finishOptimizing(postId, tries){
166
+
167
+ var data = {
168
+ action: "finish_bulk",
169
+ nonce_iowd: iowd.nonce,
170
+ postId: postId
171
+ };
172
+
173
+ jQuery.post(iowd.ajaxURL, data, function (response) {
174
+ var response = JSON.parse(response);
175
+ if(response["status"] == "abort"){
176
+ window.location.href = "admin.php?page=iowd_settings";
177
+ }
178
+ else{
179
+ if (response["status"] == "ok" || tries == 0) {
180
+ if (tries == 0) {
181
+ var data = {
182
+ action: "abort",
183
+ nonce_iowd: iowd.nonce
184
+ };
185
+ jQuery.post(iowd.ajaxURL, data, function () {
186
+ if (postId == 0) {
187
+ window.location.href = "admin.php?page=iowd_settings";
188
+ }
189
+ else {
190
+ jQuery(".iowd_" + postId).html("Something went wrong");
191
+ }
192
+ });
193
+ }
194
+ else {
195
+ if (postId == 0) {
196
+ window.location.href = "admin.php?page=iowd_settings";
197
+ }
198
+
199
+ else {
200
+ jQuery(".iowd_" + postId).html(response.html);
201
+ jQuery(".iowd_" + postId).find(".iowd-abort").hide();
202
+ }
203
+ }
204
+ }
205
+ else{
206
+ setTimeout(function(){
207
+ finishOptimizing(postId, tries-1);
208
+ }, 2000);
209
+ }
210
+ }
211
+ });
212
+
213
+ }
214
+
215
+ function iowdAbort(obj){
216
+ if(jQuery(obj).hasClass("iowd-aborted")){
217
+ return false;
218
+ }
219
+ jQuery(obj).append(" ...");
220
+ jQuery(obj).addClass("iowd-aborted");
221
+ var data = {
222
+ action: "abort",
223
+ nonce_iowd: iowd.nonce
224
+ };
225
+ jQuery.post(iowd.ajaxURL, data, function () {
226
+ window.location.href = "admin.php?page=iowd_settings";
227
+ });
228
+ }
229
+
230
+ function iowdStatus(obj) {
231
+ var data = {
232
+ action: "get_stats",
233
+ ID: jQuery(obj).attr("data-id"),
234
+ nonce_iowd: iowd.nonce
235
+ };
236
+ jQuery(".iowd_opacity").show();
237
+ jQuery(".iowd_stats").show();
238
+
239
+ jQuery.post(iowd.ajaxURL, data, function (response) {
240
+ var html = response ? response : "Not Found";
241
+ jQuery(".iowd_stats_body").html(html);
242
+
243
+ });
244
+ return false;
245
+ }
246
+
247
+ function wdTabs(tabs, default_tab) {
248
+ var activeClass = tabs + "_active";
249
+ var tabsContainer = tabs + "_container";
250
+ var tabsContainerItem = tabs + "_container_item";
251
+ jQuery("." + tabsContainerItem).hide();
252
+ jQuery("#" + (iowd.iowd_active_tab ? iowd.iowd_active_tab : default_tab)).show();
253
+ jQuery("[href=#" + (iowd.iowd_active_tab ? iowd.iowd_active_tab : default_tab) + "]").addClass(activeClass);
254
+
255
+ jQuery("." + tabs + " li a").click(function () {
256
+ jQuery("." + tabsContainerItem).hide();
257
+ jQuery("." + tabs + " li a").removeClass(activeClass);
258
+ jQuery(jQuery(this).attr("href")).show();
259
+ jQuery(this).addClass(activeClass);
260
+ if (jQuery(this).attr("href") == "#report") {
261
+ jQuery(".iowd_save_btn").hide();
262
+ }
263
+ else {
264
+ jQuery(".iowd_save_btn").show();
265
+ }
266
+ jQuery("#" + activeClass).val(jQuery(this).attr("href").substr(1));
267
+ return false;
268
+ });
269
+ }
270
+
271
+
assets/js/api.js ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* api class */
2
+
3
+ var iowdAPI = (function () {
4
+ // constructor
5
+ var api = function () {
6
+ this._apiURL = null;
7
+ this._postData = null;
8
+ this.error = {
9
+ error_number: null,
10
+ error_msg: null,
11
+ };
12
+
13
+ // set nessary params
14
+ this.setApiUrl = function (url) {
15
+ this._apiURL = url;
16
+ };
17
+
18
+ // data
19
+ this.setPostData = function (postData) {
20
+ this._postData = postData;
21
+ };
22
+
23
+ // do api request
24
+ this.doAPIRequest = function (callback) {
25
+ this.ajaxCall(this._postData, callback);
26
+ };
27
+
28
+
29
+ this.ajaxCall = function (data, callback) {
30
+
31
+ var thisAPI = this;
32
+ jQuery.post(this._apiURL, data, function () {
33
+ }).done(function (response) {
34
+ response = JSON.parse(response);
35
+ var dataCount = data.data_count;
36
+
37
+ var responseData = response["response"];
38
+ thisAPI.analyzeResponse(callback, data, response, dataCount);
39
+ if (responseData["status"] == "error" || responseData["status"] == "abort") {
40
+ return false;
41
+ }
42
+ if (dataCount > (data.iteration + 1)) {
43
+ data.iteration = data.iteration + 1;
44
+ thisAPI.ajaxCall(data, callback);
45
+ }
46
+
47
+ }).fail(function() {
48
+ console.log('Something went wrong. IO will retry.');
49
+ setTimeout(function(){
50
+ thisAPI.ajaxCall(data, callback);
51
+ }, 1000);
52
+ });
53
+ };
54
+
55
+ // function for analyze response
56
+ this.analyzeResponse = function (callback, requestData, responseData, dataCount) {
57
+ callback(requestData, responseData, dataCount);
58
+ };
59
+
60
+ // function for error handling
61
+ this.errorHandler = function (errorType) {
62
+ switch (errorType) {
63
+ case "missing_api_key" :
64
+ this.error.error_number = errorType;
65
+ this.error.error_msg = apiText.error_1;
66
+ break;
67
+ }
68
+
69
+ };
70
+ };
71
+
72
+ return api;
73
+ })();
74
+
assets/js/calendar.js ADDED
@@ -0,0 +1,1522 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Copyright Mihai Bazon, 2002-2005 | www.bazon.net/mishoo
2
+ * -----------------------------------------------------------
3
+ *
4
+ * The DHTML Calendar, version 1.0 "It is happening again"
5
+ *
6
+ * Details and latest version at:
7
+ * www.dynarch.com/projects/calendar
8
+ *
9
+ * This script is developed by Dynarch.com. Visit us at www.dynarch.com.
10
+ *
11
+ * This script is distributed under the GNU Lesser General Public License.
12
+ * Read the entire license text here: http://www.gnu.org/licenses/lgpl.html
13
+ */
14
+ Calendar = function (firstDayOfWeek, dateStr, onSelected, onClose) {
15
+ Calendar._DN = new Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday");
16
+ Calendar._SDN = new Array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun");
17
+ Calendar._FD = 0;
18
+ Calendar._MN = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
19
+ Calendar._SMN = new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");
20
+ Calendar._TT = {};
21
+ Calendar._TT["INFO"] = "About the Calendar";
22
+ Calendar._TT["ABOUT"] =
23
+ "DHTML Date/Time Selector\n" +
24
+ "(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" +
25
+ "For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
26
+ "Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." +
27
+ "\n\n" +
28
+ "Date selection:\n" +
29
+ "- Use the \xab, \xbb buttons to select year\n" +
30
+ "- Use the " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " buttons to select month\n" +
31
+ "- Hold mouse button on any of the above buttons for faster selection.";
32
+ Calendar._TT["ABOUT_TIME"] = "\n\n" +
33
+ "Time selection:\n" +
34
+ "- Click on any of the time parts to increase it\n" +
35
+ "- or Shift-click to decrease it\n" +
36
+ "- or click and drag for faster selection.";
37
+
38
+ Calendar._TT["PREV_YEAR"] = "Click to move to the previous year. Click and hold for a list of years.";
39
+ Calendar._TT["PREV_MONTH"] = "Click to move to the previous month. Click and hold for a list of the months.";
40
+ Calendar._TT["GO_TODAY"] = "Go to today";
41
+ Calendar._TT["NEXT_MONTH"] = "Click to move to the next month. Click and hold for a list of the months.";
42
+ Calendar._TT["NEXT_YEAR"] = "Click to move to the next year. Click and hold for a list of years.";
43
+ Calendar._TT["SEL_DATE"] = "Select a date.";
44
+ Calendar._TT["DRAG_TO_MOVE"] = "Drag to move";
45
+ Calendar._TT["PART_TODAY"] = " (Today)";
46
+ Calendar._TT["DAY_FIRST"] = "Display %s first";
47
+ Calendar._TT["WEEKEND"] = "0,6";
48
+ Calendar._TT["CLOSE"] = "Close";
49
+ Calendar._TT["TODAY"] = "Today";
50
+ Calendar._TT["TIME_PART"] = "(Shift-)Click or Drag to change the value.";
51
+ Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
52
+ Calendar._TT["TT_DATE_FORMAT"] = "%A, %B %e";
53
+ Calendar._TT["WK"] = "wk";
54
+ Calendar._TT["TIME"] = "Time:";
55
+
56
+
57
+ this.activeDiv = null;
58
+ this.currentDateEl = null;
59
+ this.getDateStatus = null;
60
+ this.getDateToolTip = null;
61
+ this.getDateText = null;
62
+ this.timeout = null;
63
+ this.onSelected = onSelected || null;
64
+ this.onClose = onClose || null;
65
+ this.dragging = false;
66
+ this.hidden = false;
67
+ this.minYear = 1970;
68
+ this.maxYear = 2050;
69
+ this.dateFormat = Calendar._TT["DEF_DATE_FORMAT"];
70
+ this.ttDateFormat = Calendar._TT["TT_DATE_FORMAT"];
71
+ this.isPopup = true;
72
+ this.weekNumbers = true;
73
+ this.firstDayOfWeek = typeof firstDayOfWeek == "number" ? firstDayOfWeek : Calendar._FD;
74
+ this.showsOtherMonths = false;
75
+ this.dateStr = dateStr;
76
+ this.ar_days = null;
77
+ this.showsTime = false;
78
+ this.time24 = true;
79
+ this.yearStep = 2;
80
+ this.hiliteToday = true;
81
+ this.multiple = null;
82
+ this.table = null;
83
+ this.element = null;
84
+ this.tbody = null;
85
+ this.firstdayname = null;
86
+ this.monthsCombo = null;
87
+ this.yearsCombo = null;
88
+ this.hilitedMonth = null;
89
+ this.activeMonth = null;
90
+ this.hilitedYear = null;
91
+ this.activeYear = null;
92
+ this.dateClicked = false;
93
+ if (typeof Calendar._SDN == "undefined") {
94
+ if (typeof Calendar._SDN_len == "undefined")Calendar._SDN_len = 3;
95
+ var ar = new Array();
96
+ for (var i = 8; i > 0;) {
97
+ ar[--i] = Calendar._DN[i].substr(0, Calendar._SDN_len);
98
+ }
99
+ Calendar._SDN = ar;
100
+ if (typeof Calendar._SMN_len == "undefined")Calendar._SMN_len = 3;
101
+ ar = new Array();
102
+ for (var i = 12; i > 0;) {
103
+ ar[--i] = Calendar._MN[i].substr(0, Calendar._SMN_len);
104
+ }
105
+ Calendar._SMN = ar;
106
+ }
107
+ };
108
+ Calendar._C = null;
109
+ Calendar.is_ie = (/msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent));
110
+ Calendar.is_ie5 = (Calendar.is_ie && /msie 5\.0/i.test(navigator.userAgent));
111
+ Calendar.is_opera = /opera/i.test(navigator.userAgent);
112
+ Calendar.is_khtml = /Konqueror|Safari|KHTML/i.test(navigator.userAgent);
113
+ Calendar.getAbsolutePos = function (el) {
114
+ var SL = 0, ST = 0;
115
+ var is_div = /^div$/i.test(el.tagName);
116
+ if (is_div && el.scrollLeft)SL = el.scrollLeft;
117
+ if (is_div && el.scrollTop)ST = el.scrollTop;
118
+ var r = {
119
+ x: el.offsetLeft - SL,
120
+ y: el.offsetTop - ST
121
+ };
122
+ if (el.offsetParent) {
123
+ var tmp = this.getAbsolutePos(el.offsetParent);
124
+ r.x += tmp.x;
125
+ r.y += tmp.y;
126
+ }
127
+ return r;
128
+ };
129
+ Calendar.isRelated = function (el, evt) {
130
+ var related = evt.relatedTarget;
131
+ if (!related) {
132
+ var type = evt.type;
133
+ if (type == "mouseover") {
134
+ related = evt.fromElement;
135
+ } else if (type == "mouseout") {
136
+ related = evt.toElement;
137
+ }
138
+ }
139
+ while (related) {
140
+ if (related == el) {
141
+ return true;
142
+ }
143
+ related = related.parentNode;
144
+ }
145
+ return false;
146
+ };
147
+ Calendar.removeClass = function (el, className) {
148
+ if (!(el && el.className)) {
149
+ return;
150
+ }
151
+ var cls = el.className.split(" ");
152
+ var ar = new Array();
153
+ for (var i = cls.length; i > 0;) {
154
+ if (cls[--i] != className) {
155
+ ar[ar.length] = cls[i];
156
+ }
157
+ }
158
+ el.className = ar.join(" ");
159
+ };
160
+ Calendar.addClass = function (el, className) {
161
+ Calendar.removeClass(el, className);
162
+ el.className += " " + className;
163
+ };
164
+ Calendar.getElement = function (ev) {
165
+ var f = Calendar.is_ie ? window.event.srcElement : ev.currentTarget;
166
+ while (f.nodeType != 1 || /^div$/i.test(f.tagName))f = f.parentNode;
167
+ return f;
168
+ };
169
+ Calendar.getTargetElement = function (ev) {
170
+ var f = Calendar.is_ie ? window.event.srcElement : ev.target;
171
+ while (f.nodeType != 1)f = f.parentNode;
172
+ return f;
173
+ };
174
+ Calendar.stopEvent = function (ev) {
175
+ ev || (ev = window.event);
176
+ if (Calendar.is_ie) {
177
+ ev.cancelBubble = true;
178
+ ev.returnValue = false;
179
+ } else {
180
+ ev.preventDefault();
181
+ ev.stopPropagation();
182
+ }
183
+ return false;
184
+ };
185
+ Calendar.addEvent = function (el, evname, func) {
186
+ if (el.attachEvent) {
187
+ el.attachEvent("on" + evname, func);
188
+ } else if (el.addEventListener) {
189
+ el.addEventListener(evname, func, true);
190
+ } else {
191
+ el["on" + evname] = func;
192
+ }
193
+ };
194
+ Calendar.removeEvent = function (el, evname, func) {
195
+ if (el.detachEvent) {
196
+ el.detachEvent("on" + evname, func);
197
+ } else if (el.removeEventListener) {
198
+ el.removeEventListener(evname, func, true);
199
+ } else {
200
+ el["on" + evname] = null;
201
+ }
202
+ };
203
+ Calendar.createElement = function (type, parent) {
204
+ var el = null;
205
+ if (document.createElementNS) {
206
+ el = document.createElementNS("http://www.w3.org/1999/xhtml", type);
207
+ } else {
208
+ el = document.createElement(type);
209
+ }
210
+ if (typeof parent != "undefined") {
211
+ parent.appendChild(el);
212
+ }
213
+ return el;
214
+ };
215
+ Calendar._add_evs = function (el) {
216
+ with (Calendar) {
217
+ addEvent(el, "mouseover", dayMouseOver);
218
+ addEvent(el, "mousedown", dayMouseDown);
219
+ addEvent(el, "mouseout", dayMouseOut);
220
+ if (is_ie) {
221
+ addEvent(el, "dblclick", dayMouseDblClick);
222
+ el.setAttribute("unselectable", true);
223
+ }
224
+ }
225
+ };
226
+ Calendar.findMonth = function (el) {
227
+ if (typeof el.month != "undefined") {
228
+ return el;
229
+ } else if (typeof el.parentNode.month != "undefined") {
230
+ return el.parentNode;
231
+ }
232
+ return null;
233
+ };
234
+ Calendar.findYear = function (el) {
235
+ if (typeof el.year != "undefined") {
236
+ return el;
237
+ } else if (typeof el.parentNode.year != "undefined") {
238
+ return el.parentNode;
239
+ }
240
+ return null;
241
+ };
242
+ Calendar.showMonthsCombo = function () {
243
+ var cal = Calendar._C;
244
+ if (!cal) {
245
+ return false;
246
+ }
247
+ var cal = cal;
248
+ var cd = cal.activeDiv;
249
+ var mc = cal.monthsCombo;
250
+ if (cal.hilitedMonth) {
251
+ Calendar.removeClass(cal.hilitedMonth, "hilite");
252
+ }
253
+ if (cal.activeMonth) {
254
+ Calendar.removeClass(cal.activeMonth, "active");
255
+ }
256
+ var mon = cal.monthsCombo.getElementsByTagName("div")[cal.date.getMonth()];
257
+ Calendar.addClass(mon, "active");
258
+ cal.activeMonth = mon;
259
+ var s = mc.style;
260
+ s.display = "block";
261
+ if (cd.navtype < 0)s.left = cd.offsetLeft + "px"; else {
262
+ var mcw = mc.offsetWidth;
263
+ if (typeof mcw == "undefined")mcw = 50;
264
+ s.left = (cd.offsetLeft + cd.offsetWidth - mcw) + "px";
265
+ }
266
+ s.top = (cd.offsetTop + cd.offsetHeight) + "px";
267
+ };
268
+ Calendar.showYearsCombo = function (fwd) {
269
+ var cal = Calendar._C;
270
+ if (!cal) {
271
+ return false;
272
+ }
273
+ var cal = cal;
274
+ var cd = cal.activeDiv;
275
+ var yc = cal.yearsCombo;
276
+ if (cal.hilitedYear) {
277
+ Calendar.removeClass(cal.hilitedYear, "hilite");
278
+ }
279
+ if (cal.activeYear) {
280
+ Calendar.removeClass(cal.activeYear, "active");
281
+ }
282
+ cal.activeYear = null;
283
+ var Y = cal.date.getFullYear() + (fwd ? 1 : -1);
284
+ var yr = yc.firstChild;
285
+ var show = false;
286
+ for (var i = 12; i > 0; --i) {
287
+ if (Y >= cal.minYear && Y <= cal.maxYear) {
288
+ yr.innerHTML = Y;
289
+ yr.year = Y;
290
+ yr.style.display = "block";
291
+ show = true;
292
+ } else {
293
+ yr.style.display = "none";
294
+ }
295
+ yr = yr.nextSibling;
296
+ Y += fwd ? cal.yearStep : -cal.yearStep;
297
+ }
298
+ if (show) {
299
+ var s = yc.style;
300
+ s.display = "block";
301
+ if (cd.navtype < 0)s.left = cd.offsetLeft + "px"; else {
302
+ var ycw = yc.offsetWidth;
303
+ if (typeof ycw == "undefined")ycw = 50;
304
+ s.left = (cd.offsetLeft + cd.offsetWidth - ycw) + "px";
305
+ }
306
+ s.top = (cd.offsetTop + cd.offsetHeight) + "px";
307
+ }
308
+ };
309
+ Calendar.tableMouseUp = function (ev) {
310
+ var cal = Calendar._C;
311
+ if (!cal) {
312
+ return false;
313
+ }
314
+ if (cal.timeout) {
315
+ clearTimeout(cal.timeout);
316
+ }
317
+ var el = cal.activeDiv;
318
+ if (!el) {
319
+ return false;
320
+ }
321
+ var target = Calendar.getTargetElement(ev);
322
+ ev || (ev = window.event);
323
+ Calendar.removeClass(el, "active");
324
+ if (target == el || target.parentNode == el) {
325
+ Calendar.cellClick(el, ev);
326
+ }
327
+ var mon = Calendar.findMonth(target);
328
+ var date = null;
329
+ if (mon) {
330
+ date = new Date(cal.date);
331
+ if (mon.month != date.getMonth()) {
332
+ date.setMonth(mon.month);
333
+ cal.setDate(date);
334
+ cal.dateClicked = false;
335
+ cal.callHandler();
336
+ }
337
+ } else {
338
+ var year = Calendar.findYear(target);
339
+ if (year) {
340
+ date = new Date(cal.date);
341
+ if (year.year != date.getFullYear()) {
342
+ date.setFullYear(year.year);
343
+ cal.setDate(date);
344
+ cal.dateClicked = false;
345
+ cal.callHandler();
346
+ }
347
+ }
348
+ }
349
+ with (Calendar) {
350
+ removeEvent(document, "mouseup", tableMouseUp);
351
+ removeEvent(document, "mouseover", tableMouseOver);
352
+ removeEvent(document, "mousemove", tableMouseOver);
353
+ cal._hideCombos();
354
+ _C = null;
355
+ return stopEvent(ev);
356
+ }
357
+ };
358
+ Calendar.tableMouseOver = function (ev) {
359
+ var cal = Calendar._C;
360
+ if (!cal) {
361
+ return;
362
+ }
363
+ var el = cal.activeDiv;
364
+ var target = Calendar.getTargetElement(ev);
365
+ if (target == el || target.parentNode == el) {
366
+ Calendar.addClass(el, "hilite active");
367
+ Calendar.addClass(el.parentNode, "rowhilite");
368
+ } else {
369
+ if (typeof el.navtype == "undefined" || (el.navtype != 50 && (el.navtype == 0 || Math.abs(el.navtype) > 2)))Calendar.removeClass(el, "active");
370
+ Calendar.removeClass(el, "hilite");
371
+ Calendar.removeClass(el.parentNode, "rowhilite");
372
+ }
373
+ ev || (ev = window.event);
374
+ if (el.navtype == 50 && target != el) {
375
+ var pos = Calendar.getAbsolutePos(el);
376
+ var w = el.offsetWidth;
377
+ var x = ev.clientX;
378
+ var dx;
379
+ var decrease = true;
380
+ if (x > pos.x + w) {
381
+ dx = x - pos.x - w;
382
+ decrease = false;
383
+ } else dx = pos.x - x;
384
+ if (dx < 0)dx = 0;
385
+ var range = el._range;
386
+ var current = el._current;
387
+ var count = Math.floor(dx / 10) % range.length;
388
+ for (var i = range.length; --i >= 0;)if (range[i] == current)break;
389
+ while (count-- > 0)if (decrease) {
390
+ if (--i < 0)i = range.length - 1;
391
+ } else if (++i >= range.length)i = 0;
392
+ var newval = range[i];
393
+ el.innerHTML = newval;
394
+ cal.onUpdateTime();
395
+ }
396
+ var mon = Calendar.findMonth(target);
397
+ if (mon) {
398
+ if (mon.month != cal.date.getMonth()) {
399
+ if (cal.hilitedMonth) {
400
+ Calendar.removeClass(cal.hilitedMonth, "hilite");
401
+ }
402
+ Calendar.addClass(mon, "hilite");
403
+ cal.hilitedMonth = mon;
404
+ } else if (cal.hilitedMonth) {
405
+ Calendar.removeClass(cal.hilitedMonth, "hilite");
406
+ }
407
+ } else {
408
+ if (cal.hilitedMonth) {
409
+ Calendar.removeClass(cal.hilitedMonth, "hilite");
410
+ }
411
+ var year = Calendar.findYear(target);
412
+ if (year) {
413
+ if (year.year != cal.date.getFullYear()) {
414
+ if (cal.hilitedYear) {
415
+ Calendar.removeClass(cal.hilitedYear, "hilite");
416
+ }
417
+ Calendar.addClass(year, "hilite");
418
+ cal.hilitedYear = year;
419
+ } else if (cal.hilitedYear) {
420
+ Calendar.removeClass(cal.hilitedYear, "hilite");
421
+ }
422
+ } else if (cal.hilitedYear) {
423
+ Calendar.removeClass(cal.hilitedYear, "hilite");
424
+ }
425
+ }
426
+ return Calendar.stopEvent(ev);
427
+ };
428
+ Calendar.tableMouseDown = function (ev) {
429
+ if (Calendar.getTargetElement(ev) == Calendar.getElement(ev)) {
430
+ return Calendar.stopEvent(ev);
431
+ }
432
+ };
433
+ Calendar.calDragIt = function (ev) {
434
+ var cal = Calendar._C;
435
+ if (!(cal && cal.dragging)) {
436
+ return false;
437
+ }
438
+ var posX;
439
+ var posY;
440
+ if (Calendar.is_ie) {
441
+ posY = window.event.clientY + document.body.scrollTop;
442
+ posX = window.event.clientX + document.body.scrollLeft;
443
+ } else {
444
+ posX = ev.pageX;
445
+ posY = ev.pageY;
446
+ }
447
+ cal.hideShowCovered();
448
+ var st = cal.element.style;
449
+ st.left = (posX - cal.xOffs) + "px";
450
+ st.top = (posY - cal.yOffs) + "px";
451
+ return Calendar.stopEvent(ev);
452
+ };
453
+ Calendar.calDragEnd = function (ev) {
454
+ var cal = Calendar._C;
455
+ if (!cal) {
456
+ return false;
457
+ }
458
+ cal.dragging = false;
459
+ with (Calendar) {
460
+ removeEvent(document, "mousemove", calDragIt);
461
+ removeEvent(document, "mouseup", calDragEnd);
462
+ tableMouseUp(ev);
463
+ }
464
+ cal.hideShowCovered();
465
+ };
466
+ Calendar.dayMouseDown = function (ev) {
467
+ var el = Calendar.getElement(ev);
468
+ if (el.disabled) {
469
+ return false;
470
+ }
471
+ var cal = el.calendar;
472
+ cal.activeDiv = el;
473
+ Calendar._C = cal;
474
+ if (el.navtype != 300)with (Calendar) {
475
+ if (el.navtype == 50) {
476
+ el._current = el.innerHTML;
477
+ addEvent(document, "mousemove", tableMouseOver);
478
+ } else addEvent(document, Calendar.is_ie5 ? "mousemove" : "mouseover", tableMouseOver);
479
+ addClass(el, "hilite active");
480
+ addEvent(document, "mouseup", tableMouseUp);
481
+ } else if (cal.isPopup) {
482
+ cal._dragStart(ev);
483
+ }
484
+ if (el.navtype == -1 || el.navtype == 1) {
485
+ if (cal.timeout)clearTimeout(cal.timeout);
486
+ cal.timeout = setTimeout("Calendar.showMonthsCombo()", 250);
487
+ } else if (el.navtype == -2 || el.navtype == 2) {
488
+ if (cal.timeout)clearTimeout(cal.timeout);
489
+ cal.timeout = setTimeout((el.navtype > 0) ? "Calendar.showYearsCombo(true)" : "Calendar.showYearsCombo(false)", 250);
490
+ } else {
491
+ cal.timeout = null;
492
+ }
493
+ return Calendar.stopEvent(ev);
494
+ };
495
+ Calendar.dayMouseDblClick = function (ev) {
496
+ Calendar.cellClick(Calendar.getElement(ev), ev || window.event);
497
+ if (Calendar.is_ie) {
498
+ document.selection.empty();
499
+ }
500
+ };
501
+ Calendar.dayMouseOver = function (ev) {
502
+ var el = Calendar.getElement(ev);
503
+ if (Calendar.isRelated(el, ev) || Calendar._C || el.disabled) {
504
+ return false;
505
+ }
506
+ if (el.ttip) {
507
+ if (el.ttip.substr(0, 1) == "_") {
508
+ el.ttip = el.caldate.print(el.calendar.ttDateFormat) + el.ttip.substr(1);
509
+ }
510
+ el.calendar.tooltips.innerHTML = el.ttip;
511
+ }
512
+ if (el.navtype != 300) {
513
+ Calendar.addClass(el, "hilite");
514
+ if (el.caldate) {
515
+ Calendar.addClass(el.parentNode, "rowhilite");
516
+ }
517
+ }
518
+ return Calendar.stopEvent(ev);
519
+ };
520
+ Calendar.dayMouseOut = function (ev) {
521
+ with (Calendar) {
522
+ var el = getElement(ev);
523
+ if (isRelated(el, ev) || _C || el.disabled)return false;
524
+ removeClass(el, "hilite");
525
+ if (el.caldate)removeClass(el.parentNode, "rowhilite");
526
+ if (el.calendar)el.calendar.tooltips.innerHTML = _TT["SEL_DATE"];
527
+ return stopEvent(ev);
528
+ }
529
+ };
530
+ Calendar.cellClick = function (el, ev) {
531
+ var cal = el.calendar;
532
+ var closing = false;
533
+ var newdate = false;
534
+ var date = null;
535
+ if (typeof el.navtype == "undefined") {
536
+ if (cal.currentDateEl) {
537
+ Calendar.removeClass(cal.currentDateEl, "selected");
538
+ Calendar.addClass(el, "selected");
539
+ closing = (cal.currentDateEl == el);
540
+ if (!closing) {
541
+ cal.currentDateEl = el;
542
+ }
543
+ }
544
+ cal.date.setDateOnly(el.caldate);
545
+ date = cal.date;
546
+ var other_month = !(cal.dateClicked = !el.otherMonth);
547
+ if (!other_month && !cal.currentDateEl)cal._toggleMultipleDate(new Date(date)); else newdate = !el.disabled;
548
+ if (other_month)cal._init(cal.firstDayOfWeek, date);
549
+ } else {
550
+ if (el.navtype == 200) {
551
+ Calendar.removeClass(el, "hilite");
552
+ cal.callCloseHandler();
553
+ return;
554
+ }
555
+ date = new Date(cal.date);
556
+ if (el.navtype == 0)date.setDateOnly(new Date());
557
+ cal.dateClicked = false;
558
+ var year = date.getFullYear();
559
+ var mon = date.getMonth();
560
+
561
+ function setMonth(m) {
562
+ var day = date.getDate();
563
+ var max = date.getMonthDays(m);
564
+ if (day > max) {
565
+ date.setDate(max);
566
+ }
567
+ date.setMonth(m);
568
+ };
569
+ switch (el.navtype) {
570
+ case 400:
571
+ Calendar.removeClass(el, "hilite");
572
+ var text = Calendar._TT["ABOUT"];
573
+ if (typeof text != "undefined") {
574
+ text += cal.showsTime ? Calendar._TT["ABOUT_TIME"] : "";
575
+ } else {
576
+ text = "Help and about box text is not translated into this language.\n" + "If you know this language and you feel generous please update\n" + "the corresponding file in \"lang\" subdir to match calendar-en.js\n" + "and send it back to <mihai_bazon@yahoo.com> to get it into the distribution ;-)\n\n" + "Thank you!\n" + "http://dynarch.com/mishoo/calendar.epl\n";
577
+ }
578
+ alert(text);
579
+ return;
580
+ case-2:
581
+ if (year > cal.minYear) {
582
+ date.setFullYear(year - 1);
583
+ }
584
+ break;
585
+ case-1:
586
+ if (mon > 0) {
587
+ setMonth(mon - 1);
588
+ } else if (year-- > cal.minYear) {
589
+ date.setFullYear(year);
590
+ setMonth(11);
591
+ }
592
+ break;
593
+ case 1:
594
+ if (mon < 11) {
595
+ setMonth(mon + 1);
596
+ } else if (year < cal.maxYear) {
597
+ date.setFullYear(year + 1);
598
+ setMonth(0);
599
+ }
600
+ break;
601
+ case 2:
602
+ if (year < cal.maxYear) {
603
+ date.setFullYear(year + 1);
604
+ }
605
+ break;
606
+ case 100:
607
+ cal.setFirstDayOfWeek(el.fdow);
608
+ return;
609
+ case 50:
610
+ var range = el._range;
611
+ var current = el.innerHTML;
612
+ for (var i = range.length; --i >= 0;)if (range[i] == current)break;
613
+ if (ev && ev.shiftKey) {
614
+ if (--i < 0)i = range.length - 1;
615
+ } else if (++i >= range.length)i = 0;
616
+ var newval = range[i];
617
+ el.innerHTML = newval;
618
+ cal.onUpdateTime();
619
+ return;
620
+ case 0:
621
+ if ((typeof cal.getDateStatus == "function") && cal.getDateStatus(date, date.getFullYear(), date.getMonth(), date.getDate())) {
622
+ return false;
623
+ }
624
+ break;
625
+ }
626
+ if (!date.equalsTo(cal.date)) {
627
+ cal.setDate(date);
628
+ newdate = true;
629
+ } else if (el.navtype == 0)newdate = closing = true;
630
+ }
631
+ if (newdate) {
632
+ ev && cal.callHandler();
633
+ }
634
+ if (closing) {
635
+ Calendar.removeClass(el, "hilite");
636
+ ev && cal.callCloseHandler();
637
+ }
638
+ };
639
+ Calendar.prototype.create = function (_par) {
640
+ var parent = null;
641
+ if (!_par) {
642
+ parent = document.getElementsByTagName("body")[0];
643
+ this.isPopup = true;
644
+ } else {
645
+ parent = _par;
646
+ this.isPopup = false;
647
+ }
648
+ this.date = this.dateStr ? new Date(this.dateStr) : new Date();
649
+ var table = Calendar.createElement("table");
650
+ this.table = table;
651
+ table.cellSpacing = 0;
652
+ table.cellPadding = 0;
653
+ table.calendar = this;
654
+ Calendar.addEvent(table, "mousedown", Calendar.tableMouseDown);
655
+ var div = Calendar.createElement("div");
656
+ this.element = div;
657
+ div.className = "calendar";
658
+ if (this.isPopup) {
659
+ div.style.position = "absolute";
660
+ div.style.display = "none";
661
+ }
662
+ div.appendChild(table);
663
+ var thead = Calendar.createElement("thead", table);
664
+ var cell = null;
665
+ var row = null;
666
+ var cal = this;
667
+ var hh = function (text, cs, navtype) {
668
+ cell = Calendar.createElement("td", row);
669
+ cell.colSpan = cs;
670
+ cell.className = "button";
671
+ if (navtype != 0 && Math.abs(navtype) <= 2)cell.className += " nav";
672
+ Calendar._add_evs(cell);
673
+ cell.calendar = cal;
674
+ cell.navtype = navtype;
675
+ cell.innerHTML = "<div unselectable='on'>" + text + "</div>";
676
+ return cell;
677
+ };
678
+ row = Calendar.createElement("tr", thead);
679
+ var title_length = 6;
680
+ (this.isPopup) && --title_length;
681
+ (this.weekNumbers) && ++title_length;
682
+ hh("?", 1, 400).ttip = Calendar._TT["INFO"];
683
+ this.title = hh("", title_length, 300);
684
+ this.title.className = "title";
685
+ if (this.isPopup) {
686
+ this.title.ttip = Calendar._TT["DRAG_TO_MOVE"];
687
+ this.title.style.cursor = "move";
688
+ hh("&#x00d7;", 1, 200).ttip = Calendar._TT["CLOSE"];
689
+ }
690
+ row = Calendar.createElement("tr", thead);
691
+ row.className = "headrow";
692
+ this._nav_py = hh("&#x00ab;", 1, -2);
693
+ this._nav_py.ttip = Calendar._TT["PREV_YEAR"];
694
+ this._nav_pm = hh("&#x2039;", 1, -1);
695
+ this._nav_pm.ttip = Calendar._TT["PREV_MONTH"];
696
+ this._nav_now = hh(Calendar._TT["TODAY"], this.weekNumbers ? 4 : 3, 0);
697
+ this._nav_now.ttip = Calendar._TT["GO_TODAY"];
698
+ this._nav_nm = hh("&#x203a;", 1, 1);
699
+ this._nav_nm.ttip = Calendar._TT["NEXT_MONTH"];
700
+ this._nav_ny = hh("&#x00bb;", 1, 2);
701
+ this._nav_ny.ttip = Calendar._TT["NEXT_YEAR"];
702
+ row = Calendar.createElement("tr", thead);
703
+ row.className = "daynames";
704
+ if (this.weekNumbers) {
705
+ cell = Calendar.createElement("td", row);
706
+ cell.className = "name wn";
707
+ cell.innerHTML = Calendar._TT["WK"];
708
+ }
709
+ for (var i = 7; i > 0; --i) {
710
+ cell = Calendar.createElement("td", row);
711
+ if (!i) {
712
+ cell.navtype = 100;
713
+ cell.calendar = this;
714
+ Calendar._add_evs(cell);
715
+ }
716
+ }
717
+ this.firstdayname = (this.weekNumbers) ? row.firstChild.nextSibling : row.firstChild;
718
+ this._displayWeekdays();
719
+ var tbody = Calendar.createElement("tbody", table);
720
+ this.tbody = tbody;
721
+ for (i = 6; i > 0; --i) {
722
+ row = Calendar.createElement("tr", tbody);
723
+ if (this.weekNumbers) {
724
+ cell = Calendar.createElement("td", row);
725
+ }
726
+ for (var j = 7; j > 0; --j) {
727
+ cell = Calendar.createElement("td", row);
728
+ cell.calendar = this;
729
+ Calendar._add_evs(cell);
730
+ }
731
+ }
732
+ if (this.showsTime) {
733
+ row = Calendar.createElement("tr", tbody);
734
+ row.className = "time";
735
+ cell = Calendar.createElement("td", row);
736
+ cell.className = "time";
737
+ cell.colSpan = 2;
738
+ cell.innerHTML = Calendar._TT["TIME"] || "&nbsp;";
739
+ cell = Calendar.createElement("td", row);
740
+ cell.className = "time";
741
+ cell.colSpan = this.weekNumbers ? 4 : 3;
742
+ (function () {
743
+ function makeTimePart(className, init, range_start, range_end) {
744
+ var part = Calendar.createElement("span", cell);
745
+ part.className = className;
746
+ part.innerHTML = init;
747
+ part.calendar = cal;
748
+ part.ttip = Calendar._TT["TIME_PART"];
749
+ part.navtype = 50;
750
+ part._range = [];
751
+ if (typeof range_start != "number")part._range = range_start; else {
752
+ for (var i = range_start; i <= range_end; ++i) {
753
+ var txt;
754
+ if (i < 10 && range_end >= 10)txt = '0' + i; else txt = '' + i;
755
+ part._range[part._range.length] = txt;
756
+ }
757
+ }
758
+ Calendar._add_evs(part);
759
+ return part;
760
+ };
761
+ var hrs = cal.date.getHours();
762
+ var mins = cal.date.getMinutes();
763
+ var t12 = !cal.time24;
764
+ var pm = (hrs > 12);
765
+ if (t12 && pm)hrs -= 12;
766
+ var H = makeTimePart("hour", hrs, t12 ? 1 : 0, t12 ? 12 : 23);
767
+ var span = Calendar.createElement("span", cell);
768
+ span.innerHTML = ":";
769
+ span.className = "colon";
770
+ var M = makeTimePart("minute", mins, 0, 59);
771
+ var AP = null;
772
+ cell = Calendar.createElement("td", row);
773
+ cell.className = "time";
774
+ cell.colSpan = 2;
775
+ if (t12)AP = makeTimePart("ampm", pm ? "pm" : "am", ["am", "pm"]); else cell.innerHTML = "&nbsp;";
776
+ cal.onSetTime = function () {
777
+ var pm, hrs = this.date.getHours(), mins = this.date.getMinutes();
778
+ if (t12) {
779
+ pm = (hrs >= 12);
780
+ if (pm)hrs -= 12;
781
+ if (hrs == 0)hrs = 12;
782
+ AP.innerHTML = pm ? "pm" : "am";
783
+ }
784
+ H.innerHTML = (hrs < 10) ? ("0" + hrs) : hrs;
785
+ M.innerHTML = (mins < 10) ? ("0" + mins) : mins;
786
+ };
787
+ cal.onUpdateTime = function () {
788
+ var date = this.date;
789
+ var h = parseInt(H.innerHTML, 10);
790
+ if (t12) {
791
+ if (/pm/i.test(AP.innerHTML) && h < 12)h += 12; else if (/am/i.test(AP.innerHTML) && h == 12)h = 0;
792
+ }
793
+ var d = date.getDate();
794
+ var m = date.getMonth();
795
+ var y = date.getFullYear();
796
+ date.setHours(h);
797
+ date.setMinutes(parseInt(M.innerHTML, 10));
798
+ date.setFullYear(y);
799
+ date.setMonth(m);
800
+ date.setDate(d);
801
+ this.dateClicked = false;
802
+ this.callHandler();
803
+ };
804
+ })();
805
+ } else {
806
+ this.onSetTime = this.onUpdateTime = function () {
807
+ };
808
+ }
809
+ var tfoot = Calendar.createElement("tfoot", table);
810
+ row = Calendar.createElement("tr", tfoot);
811
+ row.className = "footrow";
812
+ cell = hh(Calendar._TT["SEL_DATE"], this.weekNumbers ? 8 : 7, 300);
813
+ cell.className = "ttip";
814
+ if (this.isPopup) {
815
+ cell.ttip = Calendar._TT["DRAG_TO_MOVE"];
816
+ cell.style.cursor = "move";
817
+ }
818
+ this.tooltips = cell;
819
+ div = Calendar.createElement("div", this.element);
820
+ this.monthsCombo = div;
821
+ div.className = "combo";
822
+ for (i = 0; i < Calendar._MN.length; ++i) {
823
+ var mn = Calendar.createElement("div");
824
+ mn.className = Calendar.is_ie ? "label-IEfix" : "label";
825
+ mn.month = i;
826
+ mn.innerHTML = Calendar._SMN[i];
827
+ div.appendChild(mn);
828
+ }
829
+ div = Calendar.createElement("div", this.element);
830
+ this.yearsCombo = div;
831
+ div.className = "combo";
832
+ for (i = 12; i > 0; --i) {
833
+ var yr = Calendar.createElement("div");
834
+ yr.className = Calendar.is_ie ? "label-IEfix" : "label";
835
+ div.appendChild(yr);
836
+ }
837
+ this._init(this.firstDayOfWeek, this.date);
838
+ parent.appendChild(this.element);
839
+ };
840
+ Calendar._keyEvent = function (ev) {
841
+ var cal = window._dynarch_popupCalendar;
842
+ if (!cal || cal.multiple)return false;
843
+ (Calendar.is_ie) && (ev = window.event);
844
+ var act = (Calendar.is_ie || ev.type == "keypress"), K = ev.keyCode;
845
+ if (ev.ctrlKey) {
846
+ switch (K) {
847
+ case 37:
848
+ act && Calendar.cellClick(cal._nav_pm);
849
+ break;
850
+ case 38:
851
+ act && Calendar.cellClick(cal._nav_py);
852
+ break;
853
+ case 39:
854
+ act && Calendar.cellClick(cal._nav_nm);
855
+ break;
856
+ case 40:
857
+ act && Calendar.cellClick(cal._nav_ny);
858
+ break;
859
+ default:
860
+ return false;
861
+ }
862
+ } else switch (K) {
863
+ case 32:
864
+ Calendar.cellClick(cal._nav_now);
865
+ break;
866
+ case 27:
867
+ act && cal.callCloseHandler();
868
+ break;
869
+ case 37:
870
+ case 38:
871
+ case 39:
872
+ case 40:
873
+ if (act) {
874
+ var prev, x, y, ne, el, step;
875
+ prev = K == 37 || K == 38;
876
+ step = (K == 37 || K == 39) ? 1 : 7;
877
+ function setVars() {
878
+ el = cal.currentDateEl;
879
+ var p = el.pos;
880
+ x = p & 15;
881
+ y = p >> 4;
882
+ ne = cal.ar_days[y][x];
883
+ };
884
+ setVars();
885
+ function prevMonth() {
886
+ var date = new Date(cal.date);
887
+ date.setDate(date.getDate() - step);
888
+ cal.setDate(date);
889
+ };
890
+ function nextMonth() {
891
+ var date = new Date(cal.date);
892
+ date.setDate(date.getDate() + step);
893
+ cal.setDate(date);
894
+ };
895
+ while (1) {
896
+ switch (K) {
897
+ case 37:
898
+ if (--x >= 0)ne = cal.ar_days[y][x]; else {
899
+ x = 6;
900
+ K = 38;
901
+ continue;
902
+ }
903
+ break;
904
+ case 38:
905
+ if (--y >= 0)ne = cal.ar_days[y][x]; else {
906
+ prevMonth();
907
+ setVars();
908
+ }
909
+ break;
910
+ case 39:
911
+ if (++x < 7)ne = cal.ar_days[y][x]; else {
912
+ x = 0;
913
+ K = 40;
914
+ continue;
915
+ }
916
+ break;
917
+ case 40:
918
+ if (++y < cal.ar_days.length)ne = cal.ar_days[y][x]; else {
919
+ nextMonth();
920
+ setVars();
921
+ }
922
+ break;
923
+ }
924
+ break;
925
+ }
926
+ if (ne) {
927
+ if (!ne.disabled)Calendar.cellClick(ne); else if (prev)prevMonth(); else nextMonth();
928
+ }
929
+ }
930
+ break;
931
+ case 13:
932
+ if (act)Calendar.cellClick(cal.currentDateEl, ev);
933
+ break;
934
+ default:
935
+ return false;
936
+ }
937
+ return Calendar.stopEvent(ev);
938
+ };
939
+ Calendar.prototype._init = function (firstDayOfWeek, date) {
940
+ var today = new Date(), TY = today.getFullYear(), TM = today.getMonth(), TD = today.getDate();
941
+ this.table.style.visibility = "hidden";
942
+ var year = date.getFullYear();
943
+ if (year < this.minYear) {
944
+ year = this.minYear;
945
+ date.setFullYear(year);
946
+ } else if (year > this.maxYear) {
947
+ year = this.maxYear;
948
+ date.setFullYear(year);
949
+ }
950
+ this.firstDayOfWeek = firstDayOfWeek;
951
+ this.date = new Date(date);
952
+ var month = date.getMonth();
953
+ var mday = date.getDate();
954
+ var no_days = date.getMonthDays();
955
+ date.setDate(1);
956
+ var day1 = (date.getDay() - this.firstDayOfWeek) % 7;
957
+ if (day1 < 0)day1 += 7;
958
+ date.setDate(-day1);
959
+ date.setDate(date.getDate() + 1);
960
+ var row = this.tbody.firstChild;
961
+ var MN = Calendar._SMN[month];
962
+ var ar_days = this.ar_days = new Array();
963
+ var weekend = Calendar._TT["WEEKEND"];
964
+ var dates = this.multiple ? (this.datesCells = {}) : null;
965
+ for (var i = 0; i < 6; ++i, row = row.nextSibling) {
966
+ var cell = row.firstChild;
967
+ if (this.weekNumbers) {
968
+ cell.className = "day wn";
969
+ cell.innerHTML = date.getWeekNumber();
970
+ cell = cell.nextSibling;
971
+ }
972
+ row.className = "daysrow";
973
+ var hasdays = false, iday, dpos = ar_days[i] = [];
974
+ for (var j = 0; j < 7; ++j, cell = cell.nextSibling, date.setDate(iday + 1)) {
975
+ iday = date.getDate();
976
+ var wday = date.getDay();
977
+ cell.className = "day";
978
+ cell.pos = i << 4 | j;
979
+ dpos[j] = cell;
980
+ var current_month = (date.getMonth() == month);
981
+ if (!current_month) {
982
+ if (this.showsOtherMonths) {
983
+ cell.className += " othermonth";
984
+ cell.otherMonth = true;
985
+ } else {
986
+ cell.className = "emptycell";
987
+ cell.innerHTML = "&nbsp;";
988
+ cell.disabled = true;
989
+ continue;
990
+ }
991
+ } else {
992
+ cell.otherMonth = false;
993
+ hasdays = true;
994
+ }
995
+ cell.disabled = false;
996
+ cell.innerHTML = this.getDateText ? this.getDateText(date, iday) : iday;
997
+ if (dates)dates[date.print("%Y%m%d")] = cell;
998
+ if (this.getDateStatus) {
999
+ var status = this.getDateStatus(date, year, month, iday);
1000
+ if (this.getDateToolTip) {
1001
+ var toolTip = this.getDateToolTip(date, year, month, iday);
1002
+ if (toolTip)cell.title = toolTip;
1003
+ }
1004
+ if (status === true) {
1005
+ cell.className += " disabled";
1006
+ cell.disabled = true;
1007
+ } else {
1008
+ if (/disabled/i.test(status))cell.disabled = true;
1009
+ cell.className += " " + status;
1010
+ }
1011
+ }
1012
+ if (!cell.disabled) {
1013
+ cell.caldate = new Date(date);
1014
+ cell.ttip = "_";
1015
+ if (!this.multiple && current_month && iday == mday && this.hiliteToday) {
1016
+ cell.className += " selected";
1017
+ this.currentDateEl = cell;
1018
+ }
1019
+ if (date.getFullYear() == TY && date.getMonth() == TM && iday == TD) {
1020
+ cell.className += " today";
1021
+ cell.ttip += Calendar._TT["PART_TODAY"];
1022
+ }
1023
+ if (weekend.indexOf(wday.toString()) != -1)cell.className += cell.otherMonth ? " oweekend" : " weekend";
1024
+ }
1025
+ }
1026
+ if (!(hasdays || this.showsOtherMonths))row.className = "emptyrow";
1027
+ }
1028
+ this.title.innerHTML = Calendar._MN[month] + ", " + year;
1029
+ this.onSetTime();
1030
+ this.table.style.visibility = "visible";
1031
+ this._initMultipleDates();
1032
+ };
1033
+ Calendar.prototype._initMultipleDates = function () {
1034
+ if (this.multiple) {
1035
+ for (var i in this.multiple) {
1036
+ var cell = this.datesCells[i];
1037
+ var d = this.multiple[i];
1038
+ if (!d)continue;
1039
+ if (cell)cell.className += " selected";
1040
+ }
1041
+ }
1042
+ };
1043
+ Calendar.prototype._toggleMultipleDate = function (date) {
1044
+ if (this.multiple) {
1045
+ var ds = date.print("%Y%m%d");
1046
+ var cell = this.datesCells[ds];
1047
+ if (cell) {
1048
+ var d = this.multiple[ds];
1049
+ if (!d) {
1050
+ Calendar.addClass(cell, "selected");
1051
+ this.multiple[ds] = date;
1052
+ } else {
1053
+ Calendar.removeClass(cell, "selected");
1054
+ delete this.multiple[ds];
1055
+ }
1056
+ }
1057
+ }
1058
+ };
1059
+ Calendar.prototype.setDateToolTipHandler = function (unaryFunction) {
1060
+ this.getDateToolTip = unaryFunction;
1061
+ };
1062
+ Calendar.prototype.setDate = function (date) {
1063
+ if (!date.equalsTo(this.date)) {
1064
+ this._init(this.firstDayOfWeek, date);
1065
+ }
1066
+ };
1067
+ Calendar.prototype.refresh = function () {
1068
+ this._init(this.firstDayOfWeek, this.date);
1069
+ };
1070
+ Calendar.prototype.setFirstDayOfWeek = function (firstDayOfWeek) {
1071
+ this._init(firstDayOfWeek, this.date);
1072
+ this._displayWeekdays();
1073
+ };
1074
+ Calendar.prototype.setDateStatusHandler = Calendar.prototype.setDisabledHandler = function (unaryFunction) {
1075
+ this.getDateStatus = unaryFunction;
1076
+ };
1077
+ Calendar.prototype.setRange = function (a, z) {
1078
+ this.minYear = a;
1079
+ this.maxYear = z;
1080
+ };
1081
+ Calendar.prototype.callHandler = function () {
1082
+ if (this.onSelected) {
1083
+ this.onSelected(this, this.date.print(this.dateFormat));
1084
+ }
1085
+ };
1086
+ Calendar.prototype.callCloseHandler = function () {
1087
+ if (this.onClose) {
1088
+ this.onClose(this);
1089
+ }
1090
+ this.hideShowCovered();
1091
+ };
1092
+ Calendar.prototype.destroy = function () {
1093
+ var el = this.element.parentNode;
1094
+ el.removeChild(this.element);
1095
+ Calendar._C = null;
1096
+ window._dynarch_popupCalendar = null;
1097
+ };
1098
+ Calendar.prototype.reparent = function (new_parent) {
1099
+ var el = this.element;
1100
+ el.parentNode.removeChild(el);
1101
+ new_parent.appendChild(el);
1102
+ };
1103
+ Calendar._checkCalendar = function (ev) {
1104
+ var calendar = window._dynarch_popupCalendar;
1105
+ if (!calendar) {
1106
+ return false;
1107
+ }
1108
+ var el = Calendar.is_ie ? Calendar.getElement(ev) : Calendar.getTargetElement(ev);
1109
+ for (; el != null && el != calendar.element; el = el.parentNode);
1110
+ if (el == null) {
1111
+ window._dynarch_popupCalendar.callCloseHandler();
1112
+ return Calendar.stopEvent(ev);
1113
+ }
1114
+ };
1115
+ Calendar.prototype.show = function () {
1116
+ var rows = this.table.getElementsByTagName("tr");
1117
+ for (var i = rows.length; i > 0;) {
1118
+ var row = rows[--i];
1119
+ Calendar.removeClass(row, "rowhilite");
1120
+ var cells = row.getElementsByTagName("td");
1121
+ for (var j = cells.length; j > 0;) {
1122
+ var cell = cells[--j];
1123
+ Calendar.removeClass(cell, "hilite");
1124
+ Calendar.removeClass(cell, "active");
1125
+ }
1126
+ }
1127
+ this.element.style.display = "block";
1128
+ this.hidden = false;
1129
+ if (this.isPopup) {
1130
+ window._dynarch_popupCalendar = this;
1131
+ Calendar.addEvent(document, "keydown", Calendar._keyEvent);
1132
+ Calendar.addEvent(document, "keypress", Calendar._keyEvent);
1133
+ Calendar.addEvent(document, "mousedown", Calendar._checkCalendar);
1134
+ }
1135
+ this.hideShowCovered();
1136
+ };
1137
+ Calendar.prototype.hide = function () {
1138
+ if (this.isPopup) {
1139
+ Calendar.removeEvent(document, "keydown", Calendar._keyEvent);
1140
+ Calendar.removeEvent(document, "keypress", Calendar._keyEvent);
1141
+ Calendar.removeEvent(document, "mousedown", Calendar._checkCalendar);
1142
+ }
1143
+ this.element.style.display = "none";
1144
+ this.hidden = true;
1145
+ this.hideShowCovered();
1146
+ };
1147
+ Calendar.prototype.showAt = function (x, y) {
1148
+ var s = this.element.style;
1149
+ s.left = x + "px";
1150
+ s.top = y + "px";
1151
+ this.show();
1152
+ };
1153
+ Calendar.prototype.showAtElement = function (el, opts) {
1154
+ var self = this;
1155
+ var p = Calendar.getAbsolutePos(el);
1156
+ if (!opts || typeof opts != "string") {
1157
+ this.showAt(p.x, p.y + el.offsetHeight);
1158
+ return true;
1159
+ }
1160
+ function fixPosition(box) {
1161
+ if (box.x < 0)box.x = 0;
1162
+ if (box.y < 0)box.y = 0;
1163
+ var cp = document.createElement("div");
1164
+ var s = cp.style;
1165
+ s.position = "absolute";
1166
+ s.right = s.bottom = s.width = s.height = "0px";
1167
+ document.body.appendChild(cp);
1168
+ var br = Calendar.getAbsolutePos(cp);
1169
+ document.body.removeChild(cp);
1170
+ if (Calendar.is_ie) {
1171
+ br.y += document.body.scrollTop;
1172
+ br.x += document.body.scrollLeft;
1173
+ } else {
1174
+ br.y += window.scrollY;
1175
+ br.x += window.scrollX;
1176
+ }
1177
+ var tmp = box.x + box.width - br.x;
1178
+ if (tmp > 0)box.x -= tmp;
1179
+ tmp = box.y + box.height - br.y;
1180
+ if (tmp > 0)box.y -= tmp;
1181
+ };
1182
+ this.element.style.display = "block";
1183
+ Calendar.continuation_for_the_fucking_khtml_browser = function () {
1184
+ var w = self.element.offsetWidth;
1185
+ var h = self.element.offsetHeight;
1186
+ self.element.style.display = "none";
1187
+ var valign = opts.substr(0, 1);
1188
+ var halign = "l";
1189
+ if (opts.length > 1) {
1190
+ halign = opts.substr(1, 1);
1191
+ }
1192
+ switch (valign) {
1193
+ case "T":
1194
+ p.y -= h;
1195
+ break;
1196
+ case "B":
1197
+ p.y += el.offsetHeight;
1198
+ break;
1199
+ case "C":
1200
+ p.y += (el.offsetHeight - h) / 2;
1201
+ break;
1202
+ case "t":
1203
+ p.y += el.offsetHeight - h;
1204
+ break;
1205
+ case "b":
1206
+ break;
1207
+ }
1208
+ switch (halign) {
1209
+ case "L":
1210
+ p.x -= w;
1211
+ break;
1212
+ case "R":
1213
+ p.x += el.offsetWidth;
1214
+ break;
1215
+ case "C":
1216
+ p.x += (el.offsetWidth - w) / 2;
1217
+ break;
1218
+ case "l":
1219
+ p.x += el.offsetWidth - w;
1220
+ break;
1221
+ case "r":
1222
+ break;
1223
+ }
1224
+ p.width = w;
1225
+ p.height = h + 40;
1226
+ self.monthsCombo.style.display = "none";
1227
+ fixPosition(p);
1228
+ self.showAt(p.x, p.y);
1229
+ };
1230
+ if (Calendar.is_khtml)setTimeout("Calendar.continuation_for_the_fucking_khtml_browser()", 10); else Calendar.continuation_for_the_fucking_khtml_browser();
1231
+ };
1232
+ Calendar.prototype.setDateFormat = function (str) {
1233
+ this.dateFormat = str;
1234
+ };
1235
+ Calendar.prototype.setTtDateFormat = function (str) {
1236
+ this.ttDateFormat = str;
1237
+ };
1238
+ Calendar.prototype.parseDate = function (str, fmt) {
1239
+ if (!fmt)fmt = this.dateFormat;
1240
+ this.setDate(Date.parseDate(str, fmt));
1241
+ };
1242
+ Calendar.prototype.hideShowCovered = function () {
1243
+ if (!Calendar.is_ie && !Calendar.is_opera)return;
1244
+ function getVisib(obj) {
1245
+ var value = obj.style.visibility;
1246
+ if (!value) {
1247
+ if (document.defaultView && typeof(document.defaultView.getComputedStyle) == "function") {
1248
+ if (!Calendar.is_khtml)value = document.defaultView.getComputedStyle(obj, "").getPropertyValue("visibility"); else value = '';
1249
+ } else if (obj.currentStyle) {
1250
+ value = obj.currentStyle.visibility;
1251
+ } else value = '';
1252
+ }
1253
+ return value;
1254
+ };
1255
+ var tags = new Array("applet", "iframe", "select");
1256
+ var el = this.element;
1257
+ var p = Calendar.getAbsolutePos(el);
1258
+ var EX1 = p.x;
1259
+ var EX2 = el.offsetWidth + EX1;
1260
+ var EY1 = p.y;
1261
+ var EY2 = el.offsetHeight + EY1;
1262
+ for (var k = tags.length; k > 0;) {
1263
+ var ar = document.getElementsByTagName(tags[--k]);
1264
+ var cc = null;
1265
+ for (var i = ar.length; i > 0;) {
1266
+ cc = ar[--i];
1267
+ p = Calendar.getAbsolutePos(cc);
1268
+ var CX1 = p.x;
1269
+ var CX2 = cc.offsetWidth + CX1;
1270
+ var CY1 = p.y;
1271
+ var CY2 = cc.offsetHeight + CY1;
1272
+ if (this.hidden || (CX1 > EX2) || (CX2 < EX1) || (CY1 > EY2) || (CY2 < EY1)) {
1273
+ if (!cc.__msh_save_visibility) {
1274
+ cc.__msh_save_visibility = getVisib(cc);
1275
+ }
1276
+ cc.style.visibility = cc.__msh_save_visibility;
1277
+ } else {
1278
+ if (!cc.__msh_save_visibility) {
1279
+ cc.__msh_save_visibility = getVisib(cc);
1280
+ }
1281
+ cc.style.visibility = "hidden";
1282
+ }
1283
+ }
1284
+ }
1285
+ };
1286
+ Calendar.prototype._displayWeekdays = function () {
1287
+ var fdow = this.firstDayOfWeek;
1288
+ var cell = this.firstdayname;
1289
+ var weekend = Calendar._TT["WEEKEND"];
1290
+ for (var i = 0; i < 7; ++i) {
1291
+ cell.className = "day name";
1292
+ var realday = (i + fdow) % 7;
1293
+ if (i) {
1294
+ cell.ttip = Calendar._TT["DAY_FIRST"].replace("%s", Calendar._DN[realday]);
1295
+ cell.navtype = 100;
1296
+ cell.calendar = this;
1297
+ cell.fdow = realday;
1298
+ Calendar._add_evs(cell);
1299
+ }
1300
+ if (weekend.indexOf(realday.toString()) != -1) {
1301
+ Calendar.addClass(cell, "weekend");
1302
+ }
1303
+ cell.innerHTML = Calendar._SDN[(i + fdow) % 7];
1304
+ cell = cell.nextSibling;
1305
+ }
1306
+ };
1307
+ Calendar.prototype._hideCombos = function () {
1308
+ this.monthsCombo.style.display = "none";
1309
+ this.yearsCombo.style.display = "none";
1310
+ };
1311
+ Calendar.prototype._dragStart = function (ev) {
1312
+ if (this.dragging) {
1313
+ return;
1314
+ }
1315
+ this.dragging = true;
1316
+ var posX;
1317
+ var posY;
1318
+ if (Calendar.is_ie) {
1319
+ posY = window.event.clientY + document.body.scrollTop;
1320
+ posX = window.event.clientX + document.body.scrollLeft;
1321
+ } else {
1322
+ posY = ev.clientY + window.scrollY;
1323
+ posX = ev.clientX + window.scrollX;
1324
+ }
1325
+ var st = this.element.style;
1326
+ this.xOffs = posX - parseInt(st.left);
1327
+ this.yOffs = posY - parseInt(st.top);
1328
+ with (Calendar) {
1329
+ addEvent(document, "mousemove", calDragIt);
1330
+ addEvent(document, "mouseup", calDragEnd);
1331
+ }
1332
+ };
1333
+ Date._MD = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
1334
+ Date.SECOND = 1000;
1335
+ Date.MINUTE = 60 * Date.SECOND;
1336
+ Date.HOUR = 60 * Date.MINUTE;
1337
+ Date.DAY = 24 * Date.HOUR;
1338
+ Date.WEEK = 7 * Date.DAY;
1339
+ Date.parseDate = function (str, fmt) {
1340
+ var today = new Date();
1341
+ var y = 0;
1342
+ var m = -1;
1343
+ var d = 0;
1344
+ var a = str.split(/\W+/);
1345
+ var b = fmt.match(/%./g);
1346
+ var i = 0, j = 0;
1347
+ var hr = 0;
1348
+ var min = 0;
1349
+ for (i = 0; i < a.length; ++i) {
1350
+ if (!a[i])continue;
1351
+ switch (b[i]) {
1352
+ case "%d":
1353
+ case "%e":
1354
+ d = parseInt(a[i], 10);
1355
+ break;
1356
+ case "%m":
1357
+ m = parseInt(a[i], 10) - 1;
1358
+ break;
1359
+ case "%Y":
1360
+ case "%y":
1361
+ y = parseInt(a[i], 10);
1362
+ (y < 100) && (y += (y > 29) ? 1900 : 2000);
1363
+ break;
1364
+ case "%b":
1365
+ case "%B":
1366
+ for (j = 0; j < 12; ++j) {
1367
+ if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) {
1368
+ m = j;
1369
+ break;
1370
+ }
1371
+ }
1372
+ break;
1373
+ case "%H":
1374
+ case "%I":
1375
+ case "%k":
1376
+ case "%l":
1377
+ hr = parseInt(a[i], 10);
1378
+ break;
1379
+ case "%P":
1380
+ case "%p":
1381
+ if (/pm/i.test(a[i]) && hr < 12)hr += 12; else if (/am/i.test(a[i]) && hr >= 12)hr -= 12;
1382
+ break;
1383
+ case "%M":
1384
+ min = parseInt(a[i], 10);
1385
+ break;
1386
+ }
1387
+ }
1388
+ if (isNaN(y))y = today.getFullYear();
1389
+ if (isNaN(m))m = today.getMonth();
1390
+ if (isNaN(d))d = today.getDate();
1391
+ if (isNaN(hr))hr = today.getHours();
1392
+ if (isNaN(min))min = today.getMinutes();
1393
+ if (y != 0 && m != -1 && d != 0)return new Date(y, m, d, hr, min, 0);
1394
+ y = 0;
1395
+ m = -1;
1396
+ d = 0;
1397
+ for (i = 0; i < a.length; ++i) {
1398
+ if (a[i].search(/[a-zA-Z]+/) != -1) {
1399
+ var t = -1;
1400
+ for (j = 0; j < 12; ++j) {
1401
+ if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) {
1402
+ t = j;
1403
+ break;
1404
+ }
1405
+ }
1406
+ if (t != -1) {
1407
+ if (m != -1) {
1408
+ d = m + 1;
1409
+ }
1410
+ m = t;
1411
+ }
1412
+ } else if (parseInt(a[i], 10) <= 12 && m == -1) {
1413
+ m = a[i] - 1;
1414
+ } else if (parseInt(a[i], 10) > 31 && y == 0) {
1415
+ y = parseInt(a[i], 10);
1416
+ (y < 100) && (y += (y > 29) ? 1900 : 2000);
1417
+ } else if (d == 0) {
1418
+ d = a[i];
1419
+ }
1420
+ }
1421
+ if (y == 0)y = today.getFullYear();
1422
+ if (m != -1 && d != 0)return new Date(y, m, d, hr, min, 0);
1423
+ return today;
1424
+ };
1425
+ Date.prototype.getMonthDays = function (month) {
1426
+ var year = this.getFullYear();
1427
+ if (typeof month == "undefined") {
1428
+ month = this.getMonth();
1429
+ }
1430
+ if (((0 == (year % 4)) && ((0 != (year % 100)) || (0 == (year % 400)))) && month == 1) {
1431
+ return 29;
1432
+ } else {
1433
+ return Date._MD[month];
1434
+ }
1435
+ };
1436
+ Date.prototype.getDayOfYear = function () {
1437
+ var now = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);
1438
+ var then = new Date(this.getFullYear(), 0, 0, 0, 0, 0);
1439
+ var time = now - then;
1440
+ return Math.floor(time / Date.DAY);
1441
+ };
1442
+ Date.prototype.getWeekNumber = function () {
1443
+ var d = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);
1444
+ var DoW = d.getDay();
1445
+ d.setDate(d.getDate() - (DoW + 6) % 7 + 3);
1446
+ var ms = d.valueOf();
1447
+ d.setMonth(0);
1448
+ d.setDate(4);
1449
+ return Math.round((ms - d.valueOf()) / (7 * 864e5)) + 1;
1450
+ };
1451
+ Date.prototype.equalsTo = function (date) {
1452
+ return ((this.getFullYear() == date.getFullYear()) && (this.getMonth() == date.getMonth()) && (this.getDate() == date.getDate()) && (this.getHours() == date.getHours()) && (this.getMinutes() == date.getMinutes()));
1453
+ };
1454
+ Date.prototype.setDateOnly = function (date) {
1455
+ var tmp = new Date(date);
1456
+ this.setDate(1);
1457
+ this.setFullYear(tmp.getFullYear());
1458
+ this.setMonth(tmp.getMonth());
1459
+ this.setDate(tmp.getDate());
1460
+ };
1461
+ Date.prototype.print = function (str) {
1462
+ var m = this.getMonth();
1463
+ var d = this.getDate();
1464
+ var y = this.getFullYear();
1465
+ var wn = this.getWeekNumber();
1466
+ var w = this.getDay();
1467
+ var s = {};
1468
+ var hr = this.getHours();
1469
+ var pm = (hr >= 12);
1470
+ var ir = (pm) ? (hr - 12) : hr;
1471
+ var dy = this.getDayOfYear();
1472
+ if (ir == 0)ir = 12;
1473
+ var min = this.getMinutes();
1474
+ var sec = this.getSeconds();
1475
+ s["%a"] = Calendar._SDN[w];
1476
+ s["%A"] = Calendar._DN[w];
1477
+ s["%b"] = Calendar._SMN[m];
1478
+ s["%B"] = Calendar._MN[m];
1479
+ s["%C"] = 1 + Math.floor(y / 100);
1480
+ s["%d"] = (d < 10) ? ("0" + d) : d;
1481
+ s["%e"] = d;
1482
+ s["%H"] = (hr < 10) ? ("0" + hr) : hr;
1483
+ s["%I"] = (ir < 10) ? ("0" + ir) : ir;
1484
+ s["%j"] = (dy < 100) ? ((dy < 10) ? ("00" + dy) : ("0" + dy)) : dy;
1485
+ s["%k"] = hr;
1486
+ s["%l"] = ir;
1487
+ s["%m"] = (m < 9) ? ("0" + (1 + m)) : (1 + m);
1488
+ s["%M"] = (min < 10) ? ("0" + min) : min;
1489
+ s["%n"] = "\n";
1490
+ s["%p"] = pm ? "PM" : "AM";
1491
+ s["%P"] = pm ? "pm" : "am";
1492
+ s["%s"] = Math.floor(this.getTime() / 1000);
1493
+ s["%S"] = (sec < 10) ? ("0" + sec) : sec;
1494
+ s["%t"] = "\t";
1495
+ s["%U"] = s["%W"] = s["%V"] = (wn < 10) ? ("0" + wn) : wn;
1496
+ s["%u"] = w + 1;
1497
+ s["%w"] = w;
1498
+ s["%y"] = ('' + y).substr(2, 2);
1499
+ s["%Y"] = y;
1500
+ s["%%"] = "%";
1501
+ var re = /%./g;
1502
+ if (!Calendar.is_ie5 && !Calendar.is_khtml)return str.replace(re, function (par) {
1503
+ return s[par] || par;
1504
+ });
1505
+ var a = str.match(re);
1506
+ for (var i = 0; i < a.length; i++) {
1507
+ var tmp = s[a[i]];
1508
+ if (tmp) {
1509
+ re = new RegExp(a[i], 'g');
1510
+ str = str.replace(re, tmp);
1511
+ }
1512
+ }
1513
+ return str;
1514
+ };
1515
+ Date.prototype.__msh_oldSetFullYear = Date.prototype.setFullYear;
1516
+ Date.prototype.setFullYear = function (y) {
1517
+ var d = new Date(this);
1518
+ d.__msh_oldSetFullYear(y);
1519
+ if (d.getMonth() != this.getMonth())this.setDate(28);
1520
+ this.__msh_oldSetFullYear(y);
1521
+ };
1522
+ window._dynarch_popupCalendar = null;
assets/js/calendar_function.js ADDED
@@ -0,0 +1,577 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // <?php !! This fools phpdocumentor into parsing this file
2
+ /**
3
+ * @version $Id: joomla.javascript.js 14401 2010-01-26 14:10:00Z louis $
4
+ * @package Joomla
5
+ * @copyright Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
6
+ * @license GNU/GPL
7
+ * Joomla! is Free Software
8
+ */
9
+
10
+ /**
11
+ * Overlib Styling Declarations to allow CSS class override of styles
12
+ *
13
+ */
14
+ var ol_fgclass = 'ol-foreground';
15
+ var ol_bgclass = 'ol-background';
16
+ var ol_textfontclass = 'ol-textfont';
17
+ var ol_captionfontclass = 'ol-captionfont';
18
+ var ol_closefontclass = 'ol-closefont';
19
+
20
+ // general utility for browsing a named array or object
21
+ function xshow(o) {
22
+ s = '';
23
+ for (e in o) {
24
+ s += e + '=' + o[e] + '\n';
25
+ }
26
+ alert(s);
27
+ }
28
+
29
+ /**
30
+ * Writes a dynamically generated list
31
+ * @param string The parameters to insert into the <select> tag
32
+ * @param array A javascript array of list options in the form [key,value,text]
33
+ * @param string The key to display for the initial state of the list
34
+ * @param string The original key that was selected
35
+ * @param string The original item value that was selected
36
+ */
37
+ function writeDynaList(selectParams, source, key, orig_key, orig_val) {
38
+ var html = '\n <select ' + selectParams + '>';
39
+ var i = 0;
40
+ for (x in source) {
41
+ if (source[x][0] == key) {
42
+ var selected = '';
43
+ if ((orig_key == key && orig_val == source[x][1]) || (i == 0 && orig_key != key)) {
44
+ selected = 'selected="selected"';
45
+ }
46
+ html += '\n <option value="' + source[x][1] + '" ' + selected + '>' + source[x][2] + '</option>';
47
+ }
48
+ i++;
49
+ }
50
+ html += '\n </select>';
51
+
52
+ document.writeln(html);
53
+ }
54
+
55
+ /**
56
+ * Changes a dynamically generated list
57
+ * @param string The name of the list to change
58
+ * @param array A javascript array of list options in the form [key,value,text]
59
+ * @param string The key to display
60
+ * @param string The original key that was selected
61
+ * @param string The original item value that was selected
62
+ */
63
+ function changeDynaList(listname, source, key, orig_key, orig_val) {
64
+ var list = eval('document.adminForm.' + listname);
65
+
66
+ // empty the list
67
+ for (i in list.options.length) {
68
+ list.options[i] = null;
69
+ }
70
+ i = 0;
71
+ for (x in source) {
72
+ if (source[x][0] == key) {
73
+ opt = new Option();
74
+ opt.value = source[x][1];
75
+ opt.text = source[x][2];
76
+
77
+ if ((orig_key == key && orig_val == opt.value) || i == 0) {
78
+ opt.selected = true;
79
+ }
80
+ list.options[i++] = opt;
81
+ }
82
+ }
83
+ list.length = i;
84
+ }
85
+
86
+ /**
87
+ * Adds a select item(s) from one list to another
88
+ */
89
+ function addSelectedToList(frmName, srcListName, tgtListName) {
90
+ var form = eval('document.' + frmName);
91
+ var srcList = eval('form.' + srcListName);
92
+ var tgtList = eval('form.' + tgtListName);
93
+
94
+ var srcLen = srcList.length;
95
+ var tgtLen = tgtList.length;
96
+ var tgt = "x";
97
+
98
+ //build array of target items
99
+ for (var i = tgtLen - 1; i > -1; i--) {
100
+ tgt += "," + tgtList.options[i].value + ","
101
+ }
102
+
103
+ //Pull selected resources and add them to list
104
+ //for (var i=srcLen-1; i > -1; i--) {
105
+ for (var i = 0; i < srcLen; i++) {
106
+ if (srcList.options[i].selected && tgt.indexOf("," + srcList.options[i].value + ",") == -1) {
107
+ opt = new Option(srcList.options[i].text, srcList.options[i].value);
108
+ tgtList.options[tgtList.length] = opt;
109
+ }
110
+ }
111
+ }
112
+
113
+ function delSelectedFromList(frmName, srcListName) {
114
+ var form = eval('document.' + frmName);
115
+ var srcList = eval('form.' + srcListName);
116
+
117
+ var srcLen = srcList.length;
118
+
119
+ for (var i = srcLen - 1; i > -1; i--) {
120
+ if (srcList.options[i].selected) {
121
+ srcList.options[i] = null;
122
+ }
123
+ }
124
+ }
125
+
126
+ function moveInList(frmName, srcListName, index, to) {
127
+ var form = eval('document.' + frmName);
128
+ var srcList = eval('form.' + srcListName);
129
+ var total = srcList.options.length - 1;
130
+
131
+ if (index == -1) {
132
+ return false;
133
+ }
134
+ if (to == +1 && index == total) {
135
+ return false;
136
+ }
137
+ if (to == -1 && index == 0) {
138
+ return false;
139
+ }
140
+
141
+ var items = new Array;
142
+ var values = new Array;
143
+
144
+ for (i = total; i >= 0; i--) {
145
+ items[i] = srcList.options[i].text;
146
+ values[i] = srcList.options[i].value;
147
+ }
148
+ for (i = total; i >= 0; i--) {
149
+ if (index == i) {
150
+ srcList.options[i + to] = new Option(items[i], values[i], 0, 1);
151
+ srcList.options[i] = new Option(items[i + to], values[i + to]);
152
+ i--;
153
+ } else {
154
+ srcList.options[i] = new Option(items[i], values[i]);
155
+ }
156
+ }
157
+ srcList.focus();
158
+ return true;
159
+ }
160
+
161
+ function getSelectedOption(frmName, srcListName) {
162
+ var form = eval('document.' + frmName);
163
+ var srcList = eval('form.' + srcListName);
164
+
165
+ i = srcList.selectedIndex;
166
+ if (i != null && i > -1) {
167
+ return srcList.options[i];
168
+ } else {
169
+ return null;
170
+ }
171
+ }
172
+
173
+ function setSelectedValue(frmName, srcListName, value) {
174
+ var form = eval('document.' + frmName);
175
+ var srcList = eval('form.' + srcListName);
176
+
177
+ var srcLen = srcList.length;
178
+
179
+ for (var i = 0; i < srcLen; i++) {
180
+ srcList.options[i].selected = false;
181
+ if (srcList.options[i].value == value) {
182
+ srcList.options[i].selected = true;
183
+ }
184
+ }
185
+ }
186
+
187
+ function getSelectedRadio(frmName, srcGroupName) {
188
+ var form = eval('document.' + frmName);
189
+ var srcGroup = eval('form.' + srcGroupName);
190
+
191
+ return radioGetCheckedValue(srcGroup);
192
+ }
193
+
194
+ // return the value of the radio button that is checked
195
+ // return an empty string if none are checked, or
196
+ // there are no radio buttons
197
+ function radioGetCheckedValue(radioObj) {
198
+ if (!radioObj) {
199
+ return '';
200
+ }
201
+ var n = radioObj.length;
202
+ if (n == undefined) {
203
+ if (radioObj.checked) {
204
+ return radioObj.value;
205
+ } else {
206
+ return '';
207
+ }
208
+ }
209
+ for (var i = 0; i < n; i++) {
210
+ if (radioObj[i].checked) {
211
+ return radioObj[i].value;
212
+ }
213
+ }
214
+ return '';
215
+ }
216
+
217
+ function getSelectedValue(frmName, srcListName) {
218
+ var form = eval('document.' + frmName);
219
+ var srcList = eval('form.' + srcListName);
220
+
221
+ i = srcList.selectedIndex;
222
+ if (i != null && i > -1) {
223
+ return srcList.options[i].value;
224
+ } else {
225
+ return null;
226
+ }
227
+ }
228
+
229
+ function getSelectedText(frmName, srcListName) {
230
+ var form = eval('document.' + frmName);
231
+ var srcList = eval('form.' + srcListName);
232
+
233
+ i = srcList.selectedIndex;
234
+ if (i != null && i > -1) {
235
+ return srcList.options[i].text;
236
+ } else {
237
+ return null;
238
+ }
239
+ }
240
+
241
+ function chgSelectedValue(frmName, srcListName, value) {
242
+ var form = eval('document.' + frmName);
243
+ var srcList = eval('form.' + srcListName);
244
+
245
+ i = srcList.selectedIndex;
246
+ if (i != null && i > -1) {
247
+ srcList.options[i].value = value;
248
+ return true;
249
+ } else {
250
+ return false;
251
+ }
252
+ }
253
+
254
+ /**
255
+ * Toggles the check state of a group of boxes
256
+ *
257
+ * Checkboxes must have an id attribute in the form cb0, cb1...
258
+ * @param The number of box to 'check'
259
+ * @param An alternative field name
260
+ */
261
+
262
+ function listItemTask(id, task) {
263
+ var f = document.adminForm;
264
+ cb = eval('f.' + id);
265
+ if (cb) {
266
+ for (i = 0; true; i++) {
267
+ cbx = eval('f.cb' + i);
268
+ if (!cbx) break;
269
+ cbx.checked = false;
270
+ } // for
271
+ cb.checked = true;
272
+ f.boxchecked.value = 1;
273
+ submitbutton(task);
274
+ }
275
+ return false;
276
+ }
277
+
278
+ function hideMainMenu() {
279
+ if (document.adminForm.hidemainmenu) {
280
+ document.adminForm.hidemainmenu.value = 1;
281
+ }
282
+ }
283
+
284
+ function isChecked(isitchecked) {
285
+ if (isitchecked == true) {
286
+ document.adminForm.boxchecked.value++;
287
+ }
288
+ else {
289
+ document.adminForm.boxchecked.value--;
290
+ }
291
+ }
292
+
293
+ /**
294
+ * Default function. Usually would be overriden by the component
295
+ *//*
296
+ function submitbutton(pressbutton) {
297
+ submitform(pressbutton);
298
+ }
299
+ */
300
+ /**
301
+ * Submit the admin form
302
+ */
303
+ function submitform(pressbutton) {
304
+ if (pressbutton) {
305
+ document.adminForm.task.value = pressbutton;
306
+ }
307
+ if (typeof document.adminForm.onsubmit == "function") {
308
+ document.adminForm.onsubmit();
309
+ }
310
+ document.adminForm.submit();
311
+ }
312
+
313
+ /**
314
+ * Submit the control panel admin form
315
+ */
316
+ function submitcpform(sectionid, id) {
317
+ document.adminForm.sectionid.value = sectionid;
318
+ document.adminForm.id.value = id;
319
+ submitbutton("edit");
320
+ }
321
+
322
+ /**
323
+ * Getting radio button that is selected.
324
+ */
325
+ function getSelected(allbuttons) {
326
+ for (i = 0; i < allbuttons.length; i++) {
327
+ if (allbuttons[i].checked) {
328
+ return allbuttons[i].value
329
+ }
330
+ }
331
+ return null;
332
+ }
333
+
334
+ // JS Calendar
335
+ var calendar = null; // remember the calendar object so that we reuse
336
+ // it and avoid creating another
337
+
338
+ // This function gets called when an end-user clicks on some date
339
+ function selected(cal, date) {
340
+ cal.sel.value = date; // just update the value of the input field
341
+ }
342
+
343
+ // And this gets called when the end-user clicks on the _selected_ date,
344
+ // or clicks the "Close" (X) button. It just hides the calendar without
345
+ // destroying it.
346
+ function closeHandler(cal) {
347
+ cal.hide(); // hide the calendar
348
+
349
+ // don't check mousedown on document anymore (used to be able to hide the
350
+ // calendar when someone clicks outside it, see the showCalendar function).
351
+ Calendar.removeEvent(document, "mousedown", checkCalendar);
352
+ }
353
+
354
+ // This gets called when the user presses a mouse button anywhere in the
355
+ // document, if the calendar is shown. If the click was outside the open
356
+ // calendar this function closes it.
357
+ function checkCalendar(ev) {
358
+ var el = Calendar.is_ie ? Calendar.getElement(ev) : Calendar.getTargetElement(ev);
359
+ for (; el != null; el = el.parentNode)
360
+ // FIXME: allow end-user to click some link without closing the
361
+ // calendar. Good to see real-time stylesheet change :)
362
+ if (el == calendar.element || el.tagName == "A") break;
363
+ if (el == null) {
364
+ // calls closeHandler which should hide the calendar.
365
+ calendar.callCloseHandler();
366
+ Calendar.stopEvent(ev);
367
+ }
368
+ }
369
+
370
+ // This function shows the calendar under the element having the given id.
371
+ // It takes care of catching "mousedown" signals on document and hiding the
372
+ // calendar if the click was outside.
373
+ function showCalendar(id, dateFormat) {
374
+ var el = document.getElementById(id);
375
+ if (calendar != null) {
376
+ // we already have one created, so just update it.
377
+ calendar.hide(); // hide the existing calendar
378
+ calendar.parseDate(el.value); // set it to a new date
379
+ } else {
380
+ // first-time call, create the calendar
381
+ var cal = new Calendar(true, null, selected, closeHandler);
382
+ calendar = cal; // remember the calendar in the global
383
+ cal.setRange(1900, 2070); // min/max year allowed
384
+
385
+ if (dateFormat) // optional date format
386
+ {
387
+ cal.setDateFormat(dateFormat);
388
+ }
389
+
390
+ calendar.create(); // create a popup calendar
391
+ calendar.parseDate(el.value); // set it to a new date
392
+ }
393
+ calendar.sel = el; // inform it about the input field in use
394
+ calendar.showAtElement(el); // show the calendar next to the input field
395
+
396
+ // catch mousedown on the document
397
+ Calendar.addEvent(document, "mousedown", checkCalendar);
398
+ return false;
399
+ }
400
+
401
+ /**
402
+ * Pops up a new window in the middle of the screen
403
+ */
404
+ function popupWindow(mypage, myname, w, h, scroll) {
405
+ var winl = (screen.width - w) / 2;
406
+ var wint = (screen.height - h) / 2;
407
+ winprops = 'height=' + h + ',width=' + w + ',top=' + wint + ',left=' + winl + ',scrollbars=' + scroll + ',resizable'
408
+ win = window.open(mypage, myname, winprops)
409
+ if (parseInt(navigator.appVersion) >= 4) {
410
+ win.window.focus();
411
+ }
412
+ }
413
+
414
+ // LTrim(string) : Returns a copy of a string without leading spaces.
415
+ function ltrim(str) {
416
+ var whitespace = new String(" \t\n\r");
417
+ var s = new String(str);
418
+ if (whitespace.indexOf(s.charAt(0)) != -1) {
419
+ var j = 0, i = s.length;
420
+ while (j < i && whitespace.indexOf(s.charAt(j)) != -1)
421
+ j++;
422
+ s = s.substring(j, i);
423
+ }
424
+ return s;
425
+ }
426
+
427
+ //RTrim(string) : Returns a copy of a string without trailing spaces.
428
+ function rtrim(str) {
429
+ var whitespace = new String(" \t\n\r");
430
+ var s = new String(str);
431
+ if (whitespace.indexOf(s.charAt(s.length - 1)) != -1) {
432
+ var i = s.length - 1; // Get length of string
433
+ while (i >= 0 && whitespace.indexOf(s.charAt(i)) != -1)
434
+ i--;
435
+ s = s.substring(0, i + 1);
436
+ }
437
+ return s;
438
+ }
439
+
440
+ // Trim(string) : Returns a copy of a string without leading or trailing spaces
441
+ function trim(str) {
442
+ return rtrim(ltrim(str));
443
+ }
444
+
445
+ function mosDHTML() {
446
+ this.ver = navigator.appVersion
447
+ this.agent = navigator.userAgent
448
+ this.dom = document.getElementById ? 1 : 0
449
+ this.opera5 = this.agent.indexOf("Opera 5") < -1
450
+ this.ie5 = (this.ver.indexOf("MSIE 5") < -1 && this.dom && !this.opera5) ? 1 : 0;
451
+ this.ie6 = (this.ver.indexOf("MSIE 6") < -1 && this.dom && !this.opera5) ? 1 : 0;
452
+ this.ie4 = (document.all && !this.dom && !this.opera5) ? 1 : 0;
453
+ this.ie = this.ie4 || this.ie5 || this.ie6
454
+ this.mac = this.agent.indexOf("Mac") < -1
455
+ this.ns6 = (this.dom && parseInt(this.ver) <= 5) ? 1 : 0;
456
+ this.ns4 = (document.layers && !this.dom) ? 1 : 0;
457
+ this.bw = (this.ie6 || this.ie5 || this.ie4 || this.ns4 || this.ns6 || this.opera5);
458
+
459
+ this.activeTab = '';
460
+ this.onTabStyle = 'ontab';
461
+ this.offTabStyle = 'offtab';
462
+
463
+ this.setElemStyle = function (elem, style) {
464
+ document.getElementById(elem).className = style;
465
+ }
466
+ this.showElem = function (id) {
467
+ if ((elem = document.getElementById(id))) {
468
+ elem.style.visibility = 'visible';
469
+ elem.style.display = 'block';
470
+ }
471
+ }
472
+ this.hideElem = function (id) {
473
+ if ((elem = document.getElementById(id))) {
474
+ elem.style.visibility = 'hidden';
475
+ elem.style.display = 'none';
476
+ }
477
+ }
478
+ this.cycleTab = function (name) {
479
+ if (this.activeTab) {
480
+ this.setElemStyle(this.activeTab, this.offTabStyle);
481
+ page = this.activeTab.replace('tab', 'page');
482
+ this.hideElem(page);
483
+ }
484
+ this.setElemStyle(name, this.onTabStyle);
485
+ this.activeTab = name;
486
+ page = this.activeTab.replace('tab', 'page');
487
+ this.showElem(page);
488
+ }
489
+ return this;
490
+ }
491
+ var dhtml = new mosDHTML();
492
+
493
+ // needed for Table Column ordering
494
+ /*function tableOrdering( order, dir, task ) {
495
+ var form = document.adminForm;
496
+
497
+ form.filter_order.value = order;
498
+ form.filter_order_Dir.value = dir;
499
+ //form.sort_by.value = order;
500
+ //form.sort_order.value = dir;
501
+ submitform( task );
502
+ }*/
503
+
504
+ function saveorder(n, task) {
505
+ checkAll_button(n, task);
506
+ }
507
+
508
+ //needed by saveorder function
509
+ function checkAll_button(n, task) {
510
+
511
+ if (!task) {
512
+ task = 'saveorder';
513
+ }
514
+
515
+ for (var j = 0; j <= n; j++) {
516
+ box = eval("document.adminForm.cb" + j);
517
+ if (box) {
518
+ if (box.checked == false) {
519
+ box.checked = true;
520
+ }
521
+ } else {
522
+ alert("You cannot change the order of items, as an item in the list is `Checked Out`");
523
+ return;
524
+ }
525
+ }
526
+ submitform(task);
527
+ }
528
+ /**
529
+ * @param object A form element
530
+ * @param string The name of the element to find
531
+ */
532
+ function getElementByName(f, name) {
533
+ if (f.elements) {
534
+ for (i = 0, n = f.elements.length; i < n; i++) {
535
+ if (f.elements[i].name == name) {
536
+ return f.elements[i];
537
+ }
538
+ }
539
+ }
540
+ return null;
541
+ }
542
+
543
+ function go2(pressbutton, menu, id) {
544
+ var form = document.adminForm;
545
+
546
+ if (form.imagelist && form.images) {
547
+ // assemble the images back into one field
548
+ var temp = new Array;
549
+ for (var i = 0, n = form.imagelist.options.length; i < n; i++) {
550
+ temp[i] = form.imagelist.options[i].value;
551
+ }
552
+ form.images.value = temp.join('\n');
553
+ }
554
+
555
+ if (pressbutton == 'go2menu') {
556
+ form.menu.value = menu;
557
+ submitform(pressbutton);
558
+ return;
559
+ }
560
+
561
+ if (pressbutton == 'go2menuitem') {
562
+ form.menu.value = menu;
563
+ form.menuid.value = id;
564
+ submitform(pressbutton);
565
+ return;
566
+ }
567
+ }
568
+ /**
569
+ * Verifies if the string is in a valid email format
570
+ * @param string
571
+ * @return boolean
572
+ */
573
+ function isEmail(text) {
574
+ var pattern = "^[\\w-_\.]*[\\w-_\.]\@[\\w]\.+[\\w]+[\\w]$";
575
+ var regex = new RegExp(pattern);
576
+ return regex.test(text);
577
+ }
assets/js/settings.js ADDED
@@ -0,0 +1,474 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ jQuery(document).ready(function () {
2
+
3
+ if (iowdSettingsGlobal.page == "iowd_settings") {
4
+
5
+ jQuery("#settings_form").tooltip();
6
+ // quick settings
7
+ jQuery(".iowd_quick_automatically_optimize").change(function () {
8
+ var value = 0;
9
+ if (jQuery(this).is(":checked") == true) {
10
+ value = 1;
11
+ }
12
+ var name = jQuery(this).attr("name");
13
+ iowdCickSettings(name, value);
14
+
15
+ });
16
+
17
+ // standart settings
18
+ jQuery(".iowd-standart-mode-view1 .iowd-standart-cell").click(function () {
19
+ if(jQuery(this).attr("data-value") == "extreme"){
20
+ return false;
21
+ }
22
+ jQuery("[name=standard_setting]").val(jQuery(this).attr("data-value"));
23
+ jQuery("#settings_form").submit()
24
+
25
+ });
26
+
27
+ // how it works
28
+ jQuery(".iowd-how-works").click(function () {
29
+ jQuery(".iowd-popup-help").show();
30
+ });
31
+ jQuery(".iowd-standart-mode-view-help .iowd-standart-cell").click(function () {
32
+ jQuery(".iowd-standart-mode-view-help .iowd-standart-cell").removeClass("iowd-standart-cell-active");
33
+ jQuery(this).addClass("iowd-standart-cell-active");
34
+ var mode = jQuery(this).attr("data-value");
35
+ var src = jQuery(".iowd-optimized-img").attr("src", iowdSettingsGlobal.image_url + "/help" + mode + ".jpg");
36
+
37
+ if (mode == "conservative") {
38
+ jQuery(".iowd-stat-val").html("8 KB (4.65%)");
39
+ jQuery(".iowd-percent").html("20%");
40
+ jQuery(".iowd-help-optimized").html("749 KB");
41
+ jQuery(".iowd-help-type-txt").html("Light reduction");
42
+ jQuery(".iowd-help-exif").attr("src", iowdSettingsGlobal.image_url + "/plus.png");
43
+ jQuery(".iowd-help-full").attr("src", iowdSettingsGlobal.image_url + "/plus.png");
44
+
45
+ }
46
+ else if (mode == "balanced") {
47
+ jQuery(".iowd-stat-val").html("457 KB (59.31%)");
48
+ jQuery(".iowd-percent").html("40%");
49
+ jQuery(".iowd-help-optimized").html("300 KB");
50
+ jQuery(".iowd-help-type-txt").html("Lossy reduction");
51
+ jQuery(".iowd-help-exif").attr("src", iowdSettingsGlobal.image_url + "/minus.png");
52
+ jQuery(".iowd-help-full").attr("src", iowdSettingsGlobal.image_url + "/plus.png");
53
+ }
54
+ else {
55
+ jQuery(".iowd-stat-val").html("598 KB (78.93%)");
56
+ jQuery(".iowd-percent").html("90%");
57
+ jQuery(".iowd-help-optimized").html("159 KB");
58
+ jQuery(".iowd-help-type-txt").html("Extreme reduction");
59
+ jQuery(".iowd-help-exif").attr("src", iowdSettingsGlobal.image_url + "/minus.png");
60
+ jQuery(".iowd-help-full").attr("src", iowdSettingsGlobal.image_url + "/minus.png");
61
+ }
62
+
63
+ });
64
+ jQuery(".iowd-popup-help-close").click(function () {
65
+ jQuery(".iowd-popup-help").hide();
66
+ });
67
+
68
+
69
+ // tabs
70
+ wdTabs("iowd_tabs", "general");
71
+ showOtherFolders();
72
+
73
+ // show hide
74
+ iowdShowHide("scheduled_optimization", ["scheduled_optimization_recurrence"], 1);
75
+ iowdShowHideChange("scheduled_optimization", ["scheduled_optimization_recurrence"], 1);
76
+
77
+ iowdShowHide("enable_conversion", ["jpg_to_png", "png_to_jpg", "gif_to_png", "jpg_to_webp", "png_to_webp"], 1);
78
+ iowdShowHideChange("enable_conversion", ["jpg_to_png", "png_to_jpg", "gif_to_png", "jpg_to_webp", "png_to_webp"], 1);
79
+
80
+ iowdShowHide("exclude_full_size", ["enable_resizing", "resize_media_images_width"], 0);
81
+ iowdShowHideChange("exclude_full_size", ["enable_resizing", "resize_media_images_width"], 0, "enable_resizing", ["resize_media_images_width"], 1);
82
+
83
+
84
+ iowdShowHide("enable_resizing", ["resize_media_images_width"], 1, "exclude_full_size", 0);
85
+ iowdShowHideChange("enable_resizing", ["resize_media_images_width"], 1);
86
+
87
+ iowdShowHide("enable_resizing_other", ["resize_other_images_width"], 1);
88
+ iowdShowHideChange("enable_resizing_other", ["resize_other_images_width"], 1);
89
+
90
+
91
+ iowdShowHide("keep_exif_data", ["exclude_full_size_metadata_removal"], 0);
92
+ iowdShowHideChange("keep_exif_data", ["exclude_full_size_metadata_removal"], 0);
93
+
94
+
95
+ //conversion
96
+ jQuery("[name=jpg_to_png]").change(function () {
97
+ iowdDisable("jpg_to_png", "jpg_to_webp");
98
+ });
99
+ jQuery("[name=jpg_to_webp]").change(function () {
100
+ iowdDisable("jpg_to_webp", "jpg_to_png");
101
+ });
102
+
103
+ jQuery("[name=png_to_jpg]").change(function () {
104
+ iowdDisable("png_to_jpg", "png_to_webp");
105
+ });
106
+
107
+ jQuery("[name=png_to_webp]").change(function () {
108
+ iowdDisable("png_to_webp", "png_to_jpg");
109
+ });
110
+
111
+ jQuery(".iowd_msg_div_close").click(function () {
112
+ jQuery(".iowd_msg_div").hide();
113
+ jQuery(".iowd_msg_div_text").html("");
114
+ });
115
+
116
+ jQuery(".iowd-cancel").click(function () {
117
+ var dataCancelType = jQuery(this).attr("data-cancel-type");
118
+ if (dataCancelType == "1") {
119
+ jQuery("[name=other_folders]").val("");
120
+ jQuery("#settings_form").submit();
121
+ return false;
122
+ }
123
+ });
124
+
125
+ jQuery(".iowd-dir-tree-title").on('click', function (e) {
126
+ e.stopPropagation();
127
+ var thisElem = jQuery(e.target).closest("li");
128
+
129
+ jQuery(".iowd_other_folders_container li").removeClass("iowd-active-folder");
130
+ if (jQuery(thisElem).find(">ul").length > 0) {
131
+ jQuery(thisElem).find('>ul').slideUp(500, function () {
132
+ jQuery(thisElem).find('>ul').remove();
133
+ });
134
+ } else {
135
+ var data = {
136
+ action: "get_subdirs",
137
+ nonce_iowd: iowd.nonce,
138
+ dir: thisElem.attr("data-path")
139
+ };
140
+
141
+ jQuery.post(iowd.ajaxURL, data, function (response) {
142
+ jQuery(thisElem).append(response);
143
+ jQuery(thisElem).find('>ul').slideDown(500);
144
+ });
145
+ jQuery(thisElem).addClass("iowd-active-folder");
146
+ }
147
+
148
+
149
+ jQuery(".iowd-selected-dir").val(jQuery(thisElem).attr("data-path"));
150
+ return false;
151
+ });
152
+
153
+
154
+ jQuery(document).on("click", ".iowd-show-images", function () {
155
+ jQuery(this).closest(".iowd_other_folders_row").find(".folder-images").slideToggle(200);
156
+ });
157
+
158
+ jQuery(document).on("click", ".iowd_update_dirs", function () {
159
+ var dirData = {};
160
+ jQuery(".iowd_other_folders_row").each(function () {
161
+ var otherFolderPath = jQuery(this).find(".iowd_other_path").attr("data-name");
162
+ dirData[otherFolderPath] = [];
163
+ });
164
+ var data = {
165
+ action: "choose_dirs",
166
+ nonce_iowd: iowd.nonce,
167
+ dir: JSON.stringify(dirData)
168
+ }
169
+ jQuery(".iowd-spinner-select").show();
170
+ jQuery.post(iowd.ajaxURL, data, function (response) {
171
+ jQuery(".iowd-dir-paths").html(response);
172
+ jQuery(".iowd-spinner-select").hide();
173
+ save_settings();
174
+ });
175
+ });
176
+
177
+
178
+ jQuery(".iowd-select-dir-btn").click(function () {
179
+ var selectedDir = jQuery(".iowd-selected-dir").val();
180
+ var dirData = {};
181
+ dirData[selectedDir] = [];
182
+ var flag = true;
183
+ jQuery(".iowd_other_folders_row").each(function () {
184
+ var otherFolderPath = jQuery(this).find(".iowd_other_path").attr("data-name");
185
+
186
+ if (otherFolderPath == selectedDir) {
187
+ flag = false;
188
+ return false;
189
+ }
190
+ });
191
+ if (flag === true) {
192
+ var data = {
193
+ action: "choose_dirs",
194
+ nonce_iowd: iowd.nonce,
195
+ dir: JSON.stringify(dirData)
196
+ }
197
+ jQuery(".iowd-spinner-select").show();
198
+ jQuery.post(iowd.ajaxURL, data, function (response) {
199
+ jQuery(".iowd-dir-paths").append(response);
200
+ jQuery(".iowd-spinner-select").hide();
201
+ updateOtherFolders();
202
+ });
203
+
204
+ }
205
+ jQuery(".iowd-popup").hide();
206
+
207
+ return false;
208
+ });
209
+ // other folders remove
210
+ jQuery(document).on("click", ".iowd_remove", function () {
211
+ jQuery(this).closest(".iowd_other_folders_row").remove();
212
+ updateOtherFolders(false);
213
+ });
214
+ jQuery(document).on("click", ".iowd_remove_img", function () {
215
+
216
+ var imagesCount = Number(jQuery(this).closest(".iowd_other_folders_row").find(".iowd_other_img_path").length) - 1;
217
+ if (imagesCount == 0) {
218
+ jQuery(this).closest(".iowd_other_folders_row").remove();
219
+ }
220
+ else {
221
+ jQuery(this).closest(".iowd_other_folders_row").find(".iowd-show-images").html(imagesCount + " images");
222
+ jQuery(this).closest(".iowd_other_img_path").remove();
223
+ }
224
+
225
+ updateOtherFolders();
226
+ });
227
+
228
+
229
+ //remove from bulk
230
+ jQuery(document).on("click", ".iowd_remove_attachment", function () {
231
+ var ids = jQuery("[name=ids]").val() ? jQuery("[name=ids]").val().split(",") : [];
232
+ var postId = jQuery(this).attr("data-id");
233
+ var index = ids.indexOf(postId);
234
+ if (index > -1) {
235
+ ids.splice(index, 1);
236
+ }
237
+ jQuery(".attachment-row-" + postId).remove();
238
+ jQuery("[name=ids]").val(ids.join());
239
+ if (jQuery(".attachment-row").length == 0) {
240
+ window.location.href = "upload.php?page=iowd_settings";
241
+ }
242
+
243
+ });
244
+
245
+
246
+ jQuery(".iowd-popup-close, .iowd-opacity").click(function () {
247
+ jQuery(".iowd-popup").hide();
248
+ return false;
249
+ });
250
+ jQuery(".iowd-open-dir-tree-btn").click(function () {
251
+ jQuery(".iowd-popup").show();
252
+ return false;
253
+ });
254
+
255
+ // optimize thumbs
256
+ jQuery(".wp_sizes").change(function () {
257
+
258
+ var cid = [];
259
+ jQuery(".wp_sizes").each(function () {
260
+ if (jQuery(this).is(":checked") == true) {
261
+ cid.push(jQuery(this).val());
262
+ }
263
+ });
264
+ jQuery("[name=optimize_thumbs]").val(cid.join());
265
+ });
266
+ }
267
+ else if (iowdSettingsGlobal.page == "iowd_report") {
268
+ // delete
269
+ jQuery(document).on("click", ".iowd-clear-history-single, .iowd-clear-history-bulk", function () {
270
+ jQuery(".iowd_reports").addClass("iowd-report-loader-class");
271
+ jQuery(".iowd-report-loader").show();
272
+ var postId = jQuery(this).attr("data-post-id");
273
+ var data = {
274
+ action: "clear_report",
275
+ nonce_iowd: iowd.nonce,
276
+ post_id: postId
277
+ };
278
+ var _this = jQuery(this);
279
+ jQuery.post(iowd.ajaxURL, data, function (response) {
280
+ if (postId) {
281
+ _this.closest(".main_tr").remove();
282
+ }
283
+ else {
284
+ jQuery(".iowd_reports_table_tbody").html("");
285
+ }
286
+
287
+ jQuery(".iowd_reports").removeClass("iowd-report-loader-class");
288
+ jQuery(".iowd-report-loader").hide();
289
+ });
290
+ });
291
+
292
+
293
+ //report filters
294
+ jQuery(document).on("click", ".iowd_report_search, .iowd_report_reset, .iowd-more", function () {
295
+ jQuery(".iowd_reports").addClass("iowd-report-loader-class");
296
+ jQuery(".iowd-report-loader").show();
297
+
298
+ if (jQuery(this).hasClass("iowd_report_reset")) {
299
+ jQuery(".iowd-filter-elem").val("");
300
+ }
301
+ if (jQuery(this).hasClass("iowd-more")) {
302
+ var newLimit = Number(jQuery(".iowd-more").attr("data-limit")) + 10;
303
+ }
304
+ else {
305
+ var newLimit = jQuery(".iowd-more").attr("data-limit");
306
+ }
307
+
308
+ var data = {
309
+ action: "filter_report",
310
+ nonce_iowd: iowd.nonce,
311
+ limit: newLimit
312
+ };
313
+ jQuery(".iowd-filter-elem").each(function () {
314
+ var name = jQuery(this).attr("name");
315
+ if (jQuery(this).is("input[type=radio]")) {
316
+ data[name] = jQuery("[name=" + name + "]:checked").val();
317
+ }
318
+ else if (jQuery(this).is("select")) {
319
+ data[name] = jQuery("[name=" + name + "] :selected").val();
320
+ }
321
+ else {
322
+ data[name] = jQuery(this).val();
323
+ }
324
+ });
325
+
326
+ jQuery.post(iowd.ajaxURL, data, function (response) {
327
+ jQuery(".iowd_reports_table .iowd_reports_table_tbody").html(response);
328
+ jQuery(".iowd-more").attr("data-limit", newLimit);
329
+
330
+ jQuery(".iowd_reports").removeClass("iowd-report-loader-class");
331
+ jQuery(".iowd-report-loader").hide();
332
+ });
333
+ });
334
+ }
335
+
336
+ // update already used
337
+ jQuery(document).on("click", ".iowd_update_alreday_used", function () {
338
+ var data = {
339
+ action: "update_already_used",
340
+ nonce_iowd: iowd.nonce
341
+ }
342
+ jQuery(".iowd-spinner-select-already-used").show();
343
+ jQuery.post(iowd.ajaxURL, data, function (response) {
344
+ // response = JSON.parse(response);
345
+ // jQuery(".iowd_already_used_cell .images_count").html(response.already_optimized);
346
+ // var remained = jQuery(".iowd_remained_cell .images_count").html();
347
+ // jQuery(".iowd_remained_cell .images_count").html(response.limit-response.already_optimized);
348
+ // jQuery(".iowd-spinner-select-already-used").hide();
349
+ window.location.href = "admin.php?page=iowd_settings";
350
+ });
351
+ });
352
+
353
+ });
354
+
355
+
356
+ function updateOtherFolders(html) {
357
+ if (typeof html == "undefined") {
358
+ html = true;
359
+ }
360
+ var otherFolders = {};
361
+
362
+ jQuery(".iowd_other_folders_row").each(function () {
363
+ var otherFolderPath = jQuery(this).find(".iowd_other_path").attr("data-name").trim();
364
+ if (otherFolderPath) {
365
+ var otherImages = [];
366
+ jQuery(this).find(".iowd_other_img_path").each(function () {
367
+ var imagePath = jQuery(this).find(".iowd_image_path").html();
368
+ if (imagePath) {
369
+ otherImages.push(imagePath);
370
+ }
371
+ });
372
+ otherFolders[otherFolderPath] = otherImages;
373
+ }
374
+
375
+ });
376
+
377
+ if (html === true) {
378
+ if (Number(Object.keys(otherFolders).length) > 0) {
379
+ otherFolders = JSON.stringify(otherFolders);
380
+ if (jQuery(".iowd_other_save_btn").length == 0) {
381
+ var saveButton = '<div class="iowd_other_save_btn"><button class="iowd-btn iowd-btn-small iowd-btn-secondary">' + iowdSettingsGlobal.save_dirs_txt + '</button></div>';
382
+ jQuery(".iowd_other_dirs_container").append(saveButton);
383
+ }
384
+ }
385
+ else {
386
+ jQuery(".iowd_other_save_btn").remove();
387
+ otherFolders = "";
388
+ }
389
+ }
390
+ jQuery("[name=other_folders]").val(otherFolders);
391
+
392
+ }
393
+
394
+
395
+ function showOtherFolders() {
396
+ var otherFolders = jQuery("[name=other_folders]").val();
397
+ if (otherFolders.trim()) {
398
+ var data = {
399
+ action: "choose_dirs",
400
+ nonce_iowd: iowd.nonce,
401
+ dir: otherFolders
402
+ }
403
+
404
+ jQuery(".iowd-spinner-select").show();
405
+ jQuery.post(iowd.ajaxURL, data, function (response) {
406
+ jQuery(".iowd-dir-paths").append(response);
407
+ jQuery(".iowd-spinner-select").hide();
408
+ updateOtherFolders();
409
+ });
410
+ }
411
+
412
+
413
+ }
414
+
415
+ function save_settings() {
416
+ updateOtherFolders();
417
+ jQuery("#settings_form").submit();
418
+ }
419
+
420
+ function iowdShowHide(onChangeElem, showToggleElem, checkedVal, parent, parentVal) {
421
+ var _show = true;
422
+
423
+ if (parent != "undefined") {
424
+ if (jQuery("[name=" + parent + "]:checked").val() != parentVal) {
425
+ _show = false;
426
+ }
427
+ }
428
+
429
+ if (jQuery("[name=" + onChangeElem + "]:checked").val() == checkedVal && _show) {
430
+ for (var i = 0; i < showToggleElem.length; i++) {
431
+ jQuery("[name=" + showToggleElem[i] + "]").closest(".iowd-table-row").show();
432
+ }
433
+ }
434
+ else {
435
+ for (var i = 0; i < showToggleElem.length; i++) {
436
+ jQuery("[name=" + showToggleElem[i] + "]").closest(".iowd-table-row").hide();
437
+ }
438
+ }
439
+ }
440
+ function iowdShowHideChange(onChangeElem, showToggleElem, checkedVal, onChangeElemChild, showToggleElemChild, checkedValChild) {
441
+
442
+ jQuery("[name=" + onChangeElem).change(function () {
443
+ iowdShowHide(onChangeElem, showToggleElem, checkedVal);
444
+ if (onChangeElemChild && showToggleElemChild && checkedValChild) {
445
+ iowdShowHide(onChangeElemChild, showToggleElemChild, checkedValChild, onChangeElem, checkedVal);
446
+ }
447
+ });
448
+
449
+ }
450
+
451
+ function iowdCickSettings(name, value) {
452
+
453
+ var data = {
454
+ action: "quick_settings",
455
+ nonce_iowd: iowd.nonce,
456
+ name: name,
457
+ value: value
458
+ };
459
+
460
+
461
+ jQuery.post(iowd.ajaxURL, data, function (response) {
462
+ });
463
+ }
464
+
465
+
466
+ function iowdDisable(changedElem, disabledElem) {
467
+
468
+ if (jQuery("[name=" + changedElem + "]:checked").val() == "1") {
469
+ jQuery("#" + disabledElem + "0").attr("checked", "checked");
470
+ }
471
+ }
472
+
473
+
474
+
cacert-2017-06-07.pem ADDED
@@ -0,0 +1,3955 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ##
2
+ ## Bundle of CA Root Certificates
3
+ ##
4
+ ## Certificate data from Mozilla as of: Wed Jun 7 03:12:05 2017 GMT
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
+ ## https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt
10
+ ##
11
+ ## It contains the certificates in PEM format and therefore
12
+ ## can be directly used with curl / libcurl / php_curl, or with
13
+ ## an Apache+mod_ssl webserver for SSL client authentication.
14
+ ## Just configure this file as the SSLCACertificateFile.
15
+ ##
16
+ ## Conversion done with mk-ca-bundle.pl version 1.27.
17
+ ## SHA256: 93753268e1c596aee21893fb1c6975338389132f15c942ed65fc394a904371d7
18
+ ##
19
+
20
+
21
+ GlobalSign Root CA
22
+ ==================
23
+ -----BEGIN CERTIFICATE-----
24
+ MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx
25
+ GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds
26
+ b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV
27
+ BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD
28
+ VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa
29
+ DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc
30
+ THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb
31
+ Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP
32
+ c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX
33
+ gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
34
+ HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF
35
+ AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj
36
+ Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG
37
+ j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH
38
+ hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC
39
+ X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
40
+ -----END CERTIFICATE-----
41
+
42
+ GlobalSign Root CA - R2
43
+ =======================
44
+ -----BEGIN CERTIFICATE-----
45
+ MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv
46
+ YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
47
+ bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
48
+ aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
49
+ bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6
50
+ ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp
51
+ s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN
52
+ S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL
53
+ TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C
54
+ ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
55
+ FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i
56
+ YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN
57
+ BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp
58
+ 9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu
59
+ 01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7
60
+ 9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
61
+ TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
62
+ -----END CERTIFICATE-----
63
+
64
+ Verisign Class 3 Public Primary Certification Authority - G3
65
+ ============================================================
66
+ -----BEGIN CERTIFICATE-----
67
+ MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
68
+ UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
69
+ cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
70
+ IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
71
+ dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
72
+ CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
73
+ dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
74
+ cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg
75
+ Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
76
+ ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1
77
+ EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc
78
+ cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw
79
+ EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj
80
+ 055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
81
+ ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f
82
+ j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
83
+ /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0
84
+ xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa
85
+ t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
86
+ -----END CERTIFICATE-----
87
+
88
+ Entrust.net Premium 2048 Secure Server CA
89
+ =========================================
90
+ -----BEGIN CERTIFICATE-----
91
+ MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
92
+ ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp
93
+ bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
94
+ BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx
95
+ NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
96
+ d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
97
+ MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u
98
+ ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
99
+ MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL
100
+ Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr
101
+ hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW
102
+ nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi
103
+ VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E
104
+ BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ
105
+ KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy
106
+ T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
107
+ zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT
108
+ J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e
109
+ nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE=
110
+ -----END CERTIFICATE-----
111
+
112
+ Baltimore CyberTrust Root
113
+ =========================
114
+ -----BEGIN CERTIFICATE-----
115
+ MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE
116
+ ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li
117
+ ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC
118
+ SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs
119
+ dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME
120
+ uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB
121
+ UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C
122
+ G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9
123
+ XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr
124
+ l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI
125
+ VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB
126
+ BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh
127
+ cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5
128
+ hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa
129
+ Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H
130
+ RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
131
+ -----END CERTIFICATE-----
132
+
133
+ AddTrust Low-Value Services Root
134
+ ================================
135
+ -----BEGIN CERTIFICATE-----
136
+ MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
137
+ QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU
138
+ cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw
139
+ CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO
140
+ ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB
141
+ AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6
142
+ 54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr
143
+ oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1
144
+ Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui
145
+ GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w
146
+ HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD
147
+ AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT
148
+ RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw
149
+ HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt
150
+ ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph
151
+ iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
152
+ eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr
153
+ mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj
154
+ ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
155
+ -----END CERTIFICATE-----
156
+
157
+ AddTrust External Root
158
+ ======================
159
+ -----BEGIN CERTIFICATE-----
160
+ MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
161
+ QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD
162
+ VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw
163
+ NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU
164
+ cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg
165
+ Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821
166
+ +iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw
167
+ Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo
168
+ aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy
169
+ 2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7
170
+ 7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P
171
+ BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL
172
+ VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk
173
+ VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB
174
+ IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl
175
+ j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
176
+ 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355
177
+ e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u
178
+ G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
179
+ -----END CERTIFICATE-----
180
+
181
+ AddTrust Public Services Root
182
+ =============================
183
+ -----BEGIN CERTIFICATE-----
184
+ MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
185
+ QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU
186
+ cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ
187
+ BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l
188
+ dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF
189
+ AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu
190
+ nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i
191
+ d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG
192
+ Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw
193
+ HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G
194
+ A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
195
+ /zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux
196
+ FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G
197
+ A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4
198
+ JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL
199
+ +YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao
200
+ GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9
201
+ Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H
202
+ EufOX1362KqxMy3ZdvJOOjMMK7MtkAY=
203
+ -----END CERTIFICATE-----
204
+
205
+ AddTrust Qualified Certificates Root
206
+ ====================================
207
+ -----BEGIN CERTIFICATE-----
208
+ MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
209
+ QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU
210
+ cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx
211
+ CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ
212
+ IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG
213
+ 9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx
214
+ 64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3
215
+ KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o
216
+ L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR
217
+ wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU
218
+ MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/
219
+ BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE
220
+ BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y
221
+ azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD
222
+ ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG
223
+ GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X
224
+ dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze
225
+ RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB
226
+ iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE=
227
+ -----END CERTIFICATE-----
228
+
229
+ Entrust Root Certification Authority
230
+ ====================================
231
+ -----BEGIN CERTIFICATE-----
232
+ MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV
233
+ BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw
234
+ b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG
235
+ A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0
236
+ MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu
237
+ MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu
238
+ Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v
239
+ dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
240
+ ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz
241
+ A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww
242
+ Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68
243
+ j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN
244
+ rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw
245
+ DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1
246
+ MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH
247
+ hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
248
+ A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM
249
+ Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa
250
+ v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS
251
+ W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0
252
+ tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8
253
+ -----END CERTIFICATE-----
254
+
255
+ GeoTrust Global CA
256
+ ==================
257
+ -----BEGIN CERTIFICATE-----
258
+ MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
259
+ Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw
260
+ MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
261
+ LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
262
+ CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo
263
+ BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet
264
+ 8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc
265
+ T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU
266
+ vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD
267
+ AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk
268
+ DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q
269
+ zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4
270
+ d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2
271
+ mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p
272
+ XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm
273
+ Mw==
274
+ -----END CERTIFICATE-----
275
+
276
+ GeoTrust Global CA 2
277
+ ====================
278
+ -----BEGIN CERTIFICATE-----
279
+ MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
280
+ R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw
281
+ MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
282
+ LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
283
+ ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/
284
+ NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k
285
+ LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA
286
+ Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b
287
+ HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF
288
+ MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH
289
+ K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7
290
+ srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh
291
+ ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL
292
+ OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC
293
+ x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF
294
+ H4z1Ir+rzoPz4iIprn2DQKi6bA==
295
+ -----END CERTIFICATE-----
296
+
297
+ GeoTrust Universal CA
298
+ =====================
299
+ -----BEGIN CERTIFICATE-----
300
+ MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
301
+ R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1
302
+ MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu
303
+ Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
304
+ ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t
305
+ JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e
306
+ RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs
307
+ 7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d
308
+ 8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V
309
+ qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga
310
+ Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB
311
+ Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu
312
+ KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08
313
+ ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0
314
+ XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB
315
+ hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
316
+ aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2
317
+ qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL
318
+ oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK
319
+ xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF
320
+ KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2
321
+ DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK
322
+ xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU
323
+ p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI
324
+ P/rmMuGNG2+k5o7Y+SlIis5z/iw=
325
+ -----END CERTIFICATE-----
326
+
327
+ GeoTrust Universal CA 2
328
+ =======================
329
+ -----BEGIN CERTIFICATE-----
330
+ MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
331
+ R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0
332
+ MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg
333
+ SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA
334
+ A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0
335
+ DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17
336
+ j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q
337
+ JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a
338
+ QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2
339
+ WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP
340
+ 20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn
341
+ ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC
342
+ SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG
343
+ 8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2
344
+ +/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E
345
+ BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
346
+ dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ
347
+ 4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+
348
+ mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq
349
+ A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg
350
+ Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP
351
+ pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d
352
+ FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp
353
+ gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm
354
+ X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
355
+ -----END CERTIFICATE-----
356
+
357
+ Visa eCommerce Root
358
+ ===================
359
+ -----BEGIN CERTIFICATE-----
360
+ MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG
361
+ EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug
362
+ QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2
363
+ WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm
364
+ VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
365
+ bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL
366
+ F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b
367
+ RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0
368
+ TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI
369
+ /k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs
370
+ GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG
371
+ MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc
372
+ CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW
373
+ YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz
374
+ zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu
375
+ YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
376
+ 398znM/jra6O1I7mT1GvFpLgXPYHDw==
377
+ -----END CERTIFICATE-----
378
+
379
+ Certum Root CA
380
+ ==============
381
+ -----BEGIN CERTIFICATE-----
382
+ MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK
383
+ ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla
384
+ Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u
385
+ by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x
386
+ wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL
387
+ kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ
388
+ 89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K
389
+ Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P
390
+ NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq
391
+ hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+
392
+ GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg
393
+ GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/
394
+ 0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS
395
+ qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw==
396
+ -----END CERTIFICATE-----
397
+
398
+ Comodo AAA Services root
399
+ ========================
400
+ -----BEGIN CERTIFICATE-----
401
+ MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
402
+ R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
403
+ TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw
404
+ MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl
405
+ c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
406
+ BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
407
+ ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG
408
+ C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs
409
+ i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW
410
+ Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH
411
+ Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK
412
+ Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f
413
+ BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl
414
+ cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz
415
+ LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm
416
+ 7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
417
+ Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z
418
+ 8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C
419
+ 12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
420
+ -----END CERTIFICATE-----
421
+
422
+ Comodo Secure Services root
423
+ ===========================
424
+ -----BEGIN CERTIFICATE-----
425
+ MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
426
+ R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
427
+ TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw
428
+ MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu
429
+ Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi
430
+ BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
431
+ ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP
432
+ 9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc
433
+ rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC
434
+ oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V
435
+ p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E
436
+ FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w
437
+ gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj
438
+ YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm
439
+ aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm
440
+ 4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj
441
+ Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL
442
+ DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw
443
+ pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H
444
+ RR3B7Hzs/Sk=
445
+ -----END CERTIFICATE-----
446
+
447
+ Comodo Trusted Services root
448
+ ============================
449
+ -----BEGIN CERTIFICATE-----
450
+ MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
451
+ R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
452
+ TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw
453
+ MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h
454
+ bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw
455
+ IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC
456
+ AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7
457
+ 3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y
458
+ /9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6
459
+ juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS
460
+ ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud
461
+ DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
462
+ /zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp
463
+ ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl
464
+ cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw
465
+ uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32
466
+ pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA
467
+ BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l
468
+ R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O
469
+ 9y5Xt5hwXsjEeLBi
470
+ -----END CERTIFICATE-----
471
+
472
+ QuoVadis Root CA
473
+ ================
474
+ -----BEGIN CERTIFICATE-----
475
+ MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE
476
+ ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
477
+ eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz
478
+ MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp
479
+ cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD
480
+ EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
481
+ AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk
482
+ J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL
483
+ F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL
484
+ YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen
485
+ AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w
486
+ PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y
487
+ ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7
488
+ MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj
489
+ YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs
490
+ ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
491
+ Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW
492
+ Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu
493
+ BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw
494
+ FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0
495
+ aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6
496
+ tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo
497
+ fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul
498
+ LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x
499
+ gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi
500
+ 5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi
501
+ 5nrQNiOKSnQ2+Q==
502
+ -----END CERTIFICATE-----
503
+
504
+ QuoVadis Root CA 2
505
+ ==================
506
+ -----BEGIN CERTIFICATE-----
507
+ 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
533
+ -----END CERTIFICATE-----
534
+
535
+ QuoVadis Root CA 3
536
+ ==================
537
+ -----BEGIN CERTIFICATE-----
538
+ MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
539
+ EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx
540
+ OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
541
+ aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
542
+ DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg
543
+ DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij
544
+ KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K
545
+ DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv
546
+ BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp
547
+ p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8
548
+ nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX
549
+ MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM
550
+ Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz
551
+ uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT
552
+ BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj
553
+ YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
554
+ aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB
555
+ BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD
556
+ VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4
557
+ ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE
558
+ AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV
559
+ qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s
560
+ hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z
561
+ POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2
562
+ Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp
563
+ 8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC
564
+ bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu
565
+ g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p
566
+ vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr
567
+ qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=
568
+ -----END CERTIFICATE-----
569
+
570
+ Security Communication Root CA
571
+ ==============================
572
+ -----BEGIN CERTIFICATE-----
573
+ MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
574
+ U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
575
+ HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
576
+ U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
577
+ ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw
578
+ 8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM
579
+ DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX
580
+ 5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd
581
+ DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2
582
+ JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw
583
+ DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g
584
+ 0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a
585
+ mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ
586
+ s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ
587
+ 6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi
588
+ FL39vmwLAw==
589
+ -----END CERTIFICATE-----
590
+
591
+ Sonera Class 2 Root CA
592
+ ======================
593
+ -----BEGIN CERTIFICATE-----
594
+ MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
595
+ U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw
596
+ NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
597
+ IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3
598
+ /Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT
599
+ dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG
600
+ f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P
601
+ tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH
602
+ nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT
603
+ XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt
604
+ 0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI
605
+ cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph
606
+ Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx
607
+ EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH
608
+ llpwrN9M
609
+ -----END CERTIFICATE-----
610
+
611
+ UTN USERFirst Hardware Root CA
612
+ ==============================
613
+ -----BEGIN CERTIFICATE-----
614
+ MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE
615
+ BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
616
+ IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd
617
+ BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx
618
+ OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0
619
+ eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz
620
+ ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3
621
+ DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI
622
+ wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd
623
+ tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8
624
+ i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf
625
+ Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw
626
+ gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF
627
+ lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF
628
+ UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF
629
+ BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
630
+ //bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW
631
+ XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2
632
+ lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn
633
+ iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67
634
+ nfhmqA==
635
+ -----END CERTIFICATE-----
636
+
637
+ Camerfirma Chambers of Commerce Root
638
+ ====================================
639
+ -----BEGIN CERTIFICATE-----
640
+ MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
641
+ QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
642
+ ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx
643
+ NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp
644
+ cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn
645
+ MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC
646
+ AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU
647
+ xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH
648
+ NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW
649
+ DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV
650
+ d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud
651
+ EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v
652
+ cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P
653
+ AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh
654
+ bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD
655
+ VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz
656
+ aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi
657
+ fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD
658
+ L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN
659
+ UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n
660
+ ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1
661
+ erfutGWaIZDgqtCYvDi1czyL+Nw=
662
+ -----END CERTIFICATE-----
663
+
664
+ Camerfirma Global Chambersign Root
665
+ ==================================
666
+ -----BEGIN CERTIFICATE-----
667
+ MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
668
+ QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
669
+ ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx
670
+ NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt
671
+ YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg
672
+ MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw
673
+ ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J
674
+ 1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O
675
+ by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl
676
+ 6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c
677
+ 8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/
678
+ BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j
679
+ aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B
680
+ Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj
681
+ aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y
682
+ ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh
683
+ bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA
684
+ PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y
685
+ gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ
686
+ PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4
687
+ IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes
688
+ t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==
689
+ -----END CERTIFICATE-----
690
+
691
+ XRamp Global CA Root
692
+ ====================
693
+ -----BEGIN CERTIFICATE-----
694
+ MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE
695
+ BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj
696
+ dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
697
+ dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx
698
+ HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg
699
+ U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
700
+ dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu
701
+ IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx
702
+ foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE
703
+ zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs
704
+ AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry
705
+ xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
706
+ EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap
707
+ oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC
708
+ AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc
709
+ /Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
710
+ qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n
711
+ nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz
712
+ 8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=
713
+ -----END CERTIFICATE-----
714
+
715
+ Go Daddy Class 2 CA
716
+ ===================
717
+ -----BEGIN CERTIFICATE-----
718
+ MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY
719
+ VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp
720
+ ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG
721
+ A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
722
+ RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD
723
+ ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
724
+ 2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32
725
+ qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j
726
+ YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY
727
+ vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O
728
+ BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o
729
+ atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu
730
+ MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG
731
+ A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim
732
+ PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt
733
+ I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
734
+ HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI
735
+ Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b
736
+ vZ8=
737
+ -----END CERTIFICATE-----
738
+
739
+ Starfield Class 2 CA
740
+ ====================
741
+ -----BEGIN CERTIFICATE-----
742
+ MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc
743
+ U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg
744
+ Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo
745
+ MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG
746
+ A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG
747
+ SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY
748
+ bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ
749
+ JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm
750
+ epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN
751
+ F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF
752
+ MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f
753
+ hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo
754
+ bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g
755
+ QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs
756
+ afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM
757
+ PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
758
+ xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD
759
+ KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3
760
+ QBFGmh95DmK/D5fs4C8fF5Q=
761
+ -----END CERTIFICATE-----
762
+
763
+ StartCom Certification Authority
764
+ ================================
765
+ -----BEGIN CERTIFICATE-----
766
+ MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
767
+ U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
768
+ ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
769
+ NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
770
+ LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
771
+ U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
772
+ ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
773
+ o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
774
+ Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
775
+ eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
776
+ 2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
777
+ 6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
778
+ osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
779
+ untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
780
+ UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
781
+ 37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
782
+ FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0
783
+ Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj
784
+ YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH
785
+ AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw
786
+ Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg
787
+ U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5
788
+ LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl
789
+ cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh
790
+ cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT
791
+ dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC
792
+ AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh
793
+ 3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm
794
+ vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk
795
+ fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3
796
+ fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ
797
+ EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
798
+ yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl
799
+ 1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/
800
+ lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro
801
+ g14=
802
+ -----END CERTIFICATE-----
803
+
804
+ Taiwan GRCA
805
+ ===========
806
+ -----BEGIN CERTIFICATE-----
807
+ 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
832
+ -----END CERTIFICATE-----
833
+
834
+ Swisscom Root CA 1
835
+ ==================
836
+ -----BEGIN CERTIFICATE-----
837
+ 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
863
+ NY6E0F/6MBr1mmz0DlP5OlvRHA==
864
+ -----END CERTIFICATE-----
865
+
866
+ DigiCert Assured ID Root CA
867
+ ===========================
868
+ -----BEGIN CERTIFICATE-----
869
+ MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG
870
+ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
871
+ IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx
872
+ MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
873
+ ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew
874
+ ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO
875
+ 9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy
876
+ UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW
877
+ /lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy
878
+ oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf
879
+ GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF
880
+ 66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq
881
+ hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc
882
+ EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn
883
+ SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i
884
+ 8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
885
+ +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
886
+ -----END CERTIFICATE-----
887
+
888
+ DigiCert Global Root CA
889
+ =======================
890
+ -----BEGIN CERTIFICATE-----
891
+ MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG
892
+ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
893
+ HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw
894
+ MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
895
+ dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq
896
+ hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn
897
+ TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5
898
+ BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H
899
+ 4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y
900
+ 7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB
901
+ o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm
902
+ 8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF
903
+ BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr
904
+ EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt
905
+ tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886
906
+ UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
907
+ CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
908
+ -----END CERTIFICATE-----
909
+
910
+ DigiCert High Assurance EV Root CA
911
+ ==================================
912
+ -----BEGIN CERTIFICATE-----
913
+ MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
914
+ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
915
+ KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
916
+ MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
917
+ MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
918
+ Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
919
+ Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
920
+ OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
921
+ MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
922
+ NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
923
+ h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
924
+ Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
925
+ JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
926
+ V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
927
+ myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
928
+ mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
929
+ vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
930
+ -----END CERTIFICATE-----
931
+
932
+ Certplus Class 2 Primary CA
933
+ ===========================
934
+ -----BEGIN CERTIFICATE-----
935
+ MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE
936
+ BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN
937
+ OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy
938
+ dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP
939
+ ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR
940
+ 5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ
941
+ Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO
942
+ YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e
943
+ e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME
944
+ CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ
945
+ YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t
946
+ L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD
947
+ P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R
948
+ TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+
949
+ 7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW
950
+ //1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
951
+ l7+ijrRU
952
+ -----END CERTIFICATE-----
953
+
954
+ DST Root CA X3
955
+ ==============
956
+ -----BEGIN CERTIFICATE-----
957
+ MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK
958
+ ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X
959
+ DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1
960
+ cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD
961
+ ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT
962
+ rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9
963
+ UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy
964
+ xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d
965
+ utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T
966
+ AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ
967
+ MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug
968
+ dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE
969
+ GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw
970
+ RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS
971
+ fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
972
+ -----END CERTIFICATE-----
973
+
974
+ DST ACES CA X6
975
+ ==============
976
+ -----BEGIN CERTIFICATE-----
977
+ MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG
978
+ EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT
979
+ MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha
980
+ MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE
981
+ CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC
982
+ AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI
983
+ DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa
984
+ pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow
985
+ GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy
986
+ MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud
987
+ EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu
988
+ Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy
989
+ dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU
990
+ CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2
991
+ 5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t
992
+ Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq
993
+ nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs
994
+ vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3
995
+ oKfN5XozNmr6mis=
996
+ -----END CERTIFICATE-----
997
+
998
+ SwissSign Gold CA - G2
999
+ ======================
1000
+ -----BEGIN CERTIFICATE-----
1001
+ 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
1027
+ -----END CERTIFICATE-----
1028
+
1029
+ SwissSign Silver CA - G2
1030
+ ========================
1031
+ -----BEGIN CERTIFICATE-----
1032
+ MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT
1033
+ BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X
1034
+ DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3
1035
+ aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG
1036
+ 9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644
1037
+ N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm
1038
+ +/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH
1039
+ 6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu
1040
+ MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h
1041
+ qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5
1042
+ FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs
1043
+ ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc
1044
+ celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X
1045
+ CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
1046
+ BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB
1047
+ tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0
1048
+ cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P
1049
+ 4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F
1050
+ kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L
1051
+ 3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx
1052
+ /uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa
1053
+ DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP
1054
+ e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu
1055
+ WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ
1056
+ DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub
1057
+ DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u
1058
+ -----END CERTIFICATE-----
1059
+
1060
+ GeoTrust Primary Certification Authority
1061
+ ========================================
1062
+ -----BEGIN CERTIFICATE-----
1063
+ MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG
1064
+ EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD
1065
+ ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx
1066
+ CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ
1067
+ cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
1068
+ CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN
1069
+ b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9
1070
+ nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge
1071
+ RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt
1072
+ tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
1073
+ AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI
1074
+ hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K
1075
+ Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN
1076
+ NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa
1077
+ Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG
1078
+ 1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
1079
+ -----END CERTIFICATE-----
1080
+
1081
+ thawte Primary Root CA
1082
+ ======================
1083
+ -----BEGIN CERTIFICATE-----
1084
+ MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE
1085
+ BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
1086
+ aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
1087
+ cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3
1088
+ MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg
1089
+ SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv
1090
+ KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT
1091
+ FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs
1092
+ oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ
1093
+ 1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc
1094
+ q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K
1095
+ aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p
1096
+ afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD
1097
+ VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF
1098
+ AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE
1099
+ uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
1100
+ xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89
1101
+ jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH
1102
+ z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==
1103
+ -----END CERTIFICATE-----
1104
+
1105
+ VeriSign Class 3 Public Primary Certification Authority - G5
1106
+ ============================================================
1107
+ -----BEGIN CERTIFICATE-----
1108
+ MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
1109
+ BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
1110
+ ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
1111
+ IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp
1112
+ ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB
1113
+ yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln
1114
+ biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh
1115
+ dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt
1116
+ YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
1117
+ ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz
1118
+ j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD
1119
+ Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/
1120
+ Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r
1121
+ fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/
1122
+ BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv
1123
+ Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
1124
+ aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
1125
+ SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+
1126
+ X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE
1127
+ KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC
1128
+ Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE
1129
+ ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
1130
+ -----END CERTIFICATE-----
1131
+
1132
+ SecureTrust CA
1133
+ ==============
1134
+ -----BEGIN CERTIFICATE-----
1135
+ MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG
1136
+ EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy
1137
+ dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe
1138
+ BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC
1139
+ ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX
1140
+ OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t
1141
+ DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH
1142
+ GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b
1143
+ 01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH
1144
+ ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/
1145
+ BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj
1146
+ aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
1147
+ KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu
1148
+ SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf
1149
+ mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ
1150
+ nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
1151
+ 3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
1152
+ -----END CERTIFICATE-----
1153
+
1154
+ Secure Global CA
1155
+ ================
1156
+ -----BEGIN CERTIFICATE-----
1157
+ MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG
1158
+ EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH
1159
+ bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg
1160
+ MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg
1161
+ Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx
1162
+ YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ
1163
+ bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g
1164
+ 8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV
1165
+ HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi
1166
+ 0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
1167
+ EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn
1168
+ oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA
1169
+ MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+
1170
+ OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn
1171
+ CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5
1172
+ 3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
1173
+ f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
1174
+ -----END CERTIFICATE-----
1175
+
1176
+ COMODO Certification Authority
1177
+ ==============================
1178
+ -----BEGIN CERTIFICATE-----
1179
+ MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE
1180
+ BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
1181
+ A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1
1182
+ dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb
1183
+ MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD
1184
+ T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
1185
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH
1186
+ +7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww
1187
+ xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV
1188
+ 4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA
1189
+ 1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI
1190
+ rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E
1191
+ BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k
1192
+ b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC
1193
+ AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP
1194
+ OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
1195
+ RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc
1196
+ IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN
1197
+ +8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==
1198
+ -----END CERTIFICATE-----
1199
+
1200
+ Network Solutions Certificate Authority
1201
+ =======================================
1202
+ -----BEGIN CERTIFICATE-----
1203
+ MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG
1204
+ EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr
1205
+ IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx
1206
+ MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
1207
+ MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
1208
+ CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx
1209
+ jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT
1210
+ aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT
1211
+ crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc
1212
+ /Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB
1213
+ AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP
1214
+ BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv
1215
+ bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA
1216
+ A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q
1217
+ 4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/
1218
+ GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
1219
+ wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD
1220
+ ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
1221
+ -----END CERTIFICATE-----
1222
+
1223
+ COMODO ECC Certification Authority
1224
+ ==================================
1225
+ -----BEGIN CERTIFICATE-----
1226
+ MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC
1227
+ R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
1228
+ ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB
1229
+ dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix
1230
+ GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
1231
+ Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo
1232
+ b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X
1233
+ 4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni
1234
+ wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E
1235
+ BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG
1236
+ FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA
1237
+ U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
1238
+ -----END CERTIFICATE-----
1239
+
1240
+ Security Communication EV RootCA1
1241
+ =================================
1242
+ -----BEGIN CERTIFICATE-----
1243
+ MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
1244
+ U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh
1245
+ dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE
1246
+ BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl
1247
+ Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
1248
+ AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO
1249
+ /VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX
1250
+ WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z
1251
+ ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4
1252
+ bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK
1253
+ 9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
1254
+ SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm
1255
+ iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG
1256
+ Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW
1257
+ mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW
1258
+ T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490
1259
+ -----END CERTIFICATE-----
1260
+
1261
+ OISTE WISeKey Global Root GA CA
1262
+ ===============================
1263
+ -----BEGIN CERTIFICATE-----
1264
+ MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE
1265
+ BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG
1266
+ A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH
1267
+ bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD
1268
+ VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw
1269
+ IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5
1270
+ IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9
1271
+ Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg
1272
+ Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD
1273
+ d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ
1274
+ /yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R
1275
+ LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
1276
+ AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
1277
+ KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm
1278
+ MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4
1279
+ +vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
1280
+ hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY
1281
+ okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=
1282
+ -----END CERTIFICATE-----
1283
+
1284
+ Certigna
1285
+ ========
1286
+ -----BEGIN CERTIFICATE-----
1287
+ MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw
1288
+ EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3
1289
+ MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI
1290
+ Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q
1291
+ XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH
1292
+ GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p
1293
+ ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg
1294
+ DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf
1295
+ Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ
1296
+ tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ
1297
+ BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J
1298
+ SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA
1299
+ hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+
1300
+ ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu
1301
+ PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY
1302
+ 1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
1303
+ WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
1304
+ -----END CERTIFICATE-----
1305
+
1306
+ Deutsche Telekom Root CA 2
1307
+ ==========================
1308
+ -----BEGIN CERTIFICATE-----
1309
+ MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT
1310
+ RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG
1311
+ A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5
1312
+ MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G
1313
+ A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS
1314
+ b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5
1315
+ bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI
1316
+ KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY
1317
+ AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK
1318
+ Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV
1319
+ jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV
1320
+ HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr
1321
+ E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy
1322
+ zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8
1323
+ rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G
1324
+ dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
1325
+ Cm26OWMohpLzGITY+9HPBVZkVw==
1326
+ -----END CERTIFICATE-----
1327
+
1328
+ Cybertrust Global Root
1329
+ ======================
1330
+ -----BEGIN CERTIFICATE-----
1331
+ MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li
1332
+ ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4
1333
+ MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD
1334
+ ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
1335
+ +Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW
1336
+ 0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL
1337
+ AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin
1338
+ 89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT
1339
+ 8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP
1340
+ BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2
1341
+ MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G
1342
+ A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO
1343
+ lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi
1344
+ 5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2
1345
+ hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T
1346
+ X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
1347
+ WL1WMRJOEcgh4LMRkWXbtKaIOM5V
1348
+ -----END CERTIFICATE-----
1349
+
1350
+ ePKI Root Certification Authority
1351
+ =================================
1352
+ -----BEGIN CERTIFICATE-----
1353
+ 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
1379
+ -----END CERTIFICATE-----
1380
+
1381
+ 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
1382
+ =============================================================================================================================
1383
+ -----BEGIN CERTIFICATE-----
1384
+ MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH
1385
+ DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q
1386
+ aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry
1387
+ b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV
1388
+ BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg
1389
+ S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4
1390
+ MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl
1391
+ IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF
1392
+ n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl
1393
+ IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft
1394
+ dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl
1395
+ cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B
1396
+ AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO
1397
+ Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1
1398
+ xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR
1399
+ 6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL
1400
+ hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd
1401
+ BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
1402
+ MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4
1403
+ N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT
1404
+ y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh
1405
+ LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M
1406
+ dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI=
1407
+ -----END CERTIFICATE-----
1408
+
1409
+ certSIGN ROOT CA
1410
+ ================
1411
+ -----BEGIN CERTIFICATE-----
1412
+ MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD
1413
+ VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa
1414
+ Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE
1415
+ CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I
1416
+ JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH
1417
+ rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2
1418
+ ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD
1419
+ 0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943
1420
+ AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B
1421
+ Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB
1422
+ AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8
1423
+ SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0
1424
+ x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt
1425
+ vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz
1426
+ TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD
1427
+ -----END CERTIFICATE-----
1428
+
1429
+ CNNIC ROOT
1430
+ ==========
1431
+ -----BEGIN CERTIFICATE-----
1432
+ MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE
1433
+ ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw
1434
+ OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw
1435
+ ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD
1436
+ o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz
1437
+ VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT
1438
+ VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or
1439
+ czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK
1440
+ y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC
1441
+ wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S
1442
+ lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5
1443
+ Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM
1444
+ O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8
1445
+ BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2
1446
+ G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m
1447
+ mxE=
1448
+ -----END CERTIFICATE-----
1449
+
1450
+ GeoTrust Primary Certification Authority - G3
1451
+ =============================================
1452
+ -----BEGIN CERTIFICATE-----
1453
+ MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE
1454
+ BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0
1455
+ IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy
1456
+ eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz
1457
+ NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo
1458
+ YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT
1459
+ LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI
1460
+ hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j
1461
+ K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE
1462
+ c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C
1463
+ IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu
1464
+ dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC
1465
+ MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr
1466
+ 2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9
1467
+ cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE
1468
+ Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
1469
+ AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s
1470
+ t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt
1471
+ -----END CERTIFICATE-----
1472
+
1473
+ thawte Primary Root CA - G2
1474
+ ===========================
1475
+ -----BEGIN CERTIFICATE-----
1476
+ MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC
1477
+ VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu
1478
+ IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg
1479
+ Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV
1480
+ MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG
1481
+ b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt
1482
+ IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS
1483
+ LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5
1484
+ 8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU
1485
+ mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN
1486
+ G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K
1487
+ rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
1488
+ -----END CERTIFICATE-----
1489
+
1490
+ thawte Primary Root CA - G3
1491
+ ===========================
1492
+ -----BEGIN CERTIFICATE-----
1493
+ MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE
1494
+ BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
1495
+ aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
1496
+ cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w
1497
+ ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
1498
+ d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD
1499
+ VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG
1500
+ A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
1501
+ MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At
1502
+ P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC
1503
+ +BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY
1504
+ 7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW
1505
+ vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E
1506
+ BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ
1507
+ KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK
1508
+ A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
1509
+ t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC
1510
+ 8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm
1511
+ er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A=
1512
+ -----END CERTIFICATE-----
1513
+
1514
+ GeoTrust Primary Certification Authority - G2
1515
+ =============================================
1516
+ -----BEGIN CERTIFICATE-----
1517
+ MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC
1518
+ VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu
1519
+ Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD
1520
+ ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1
1521
+ OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
1522
+ MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl
1523
+ b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG
1524
+ BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc
1525
+ KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD
1526
+ VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+
1527
+ EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m
1528
+ ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2
1529
+ npaqBA+K
1530
+ -----END CERTIFICATE-----
1531
+
1532
+ VeriSign Universal Root Certification Authority
1533
+ ===============================================
1534
+ -----BEGIN CERTIFICATE-----
1535
+ MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE
1536
+ BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
1537
+ ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
1538
+ IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u
1539
+ IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV
1540
+ UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
1541
+ cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
1542
+ IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0
1543
+ aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj
1544
+ 1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP
1545
+ MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72
1546
+ 9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I
1547
+ AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR
1548
+ tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G
1549
+ CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O
1550
+ a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
1551
+ DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3
1552
+ Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx
1553
+ Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx
1554
+ P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P
1555
+ wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4
1556
+ mJO37M2CYfE45k+XmCpajQ==
1557
+ -----END CERTIFICATE-----
1558
+
1559
+ VeriSign Class 3 Public Primary Certification Authority - G4
1560
+ ============================================================
1561
+ -----BEGIN CERTIFICATE-----
1562
+ MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC
1563
+ VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3
1564
+ b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz
1565
+ ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj
1566
+ YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL
1567
+ MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU
1568
+ cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo
1569
+ b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5
1570
+ IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8
1571
+ Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz
1572
+ rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB
1573
+ /zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw
1574
+ HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u
1575
+ Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD
1576
+ A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx
1577
+ AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
1578
+ -----END CERTIFICATE-----
1579
+
1580
+ NetLock Arany (Class Gold) Főtanúsítvány
1581
+ ========================================
1582
+ -----BEGIN CERTIFICATE-----
1583
+ MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G
1584
+ A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610
1585
+ dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB
1586
+ cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx
1587
+ MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO
1588
+ ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv
1589
+ biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6
1590
+ c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu
1591
+ 0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw
1592
+ /HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk
1593
+ H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw
1594
+ fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1
1595
+ neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB
1596
+ BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW
1597
+ qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta
1598
+ YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
1599
+ bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna
1600
+ NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu
1601
+ dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
1602
+ -----END CERTIFICATE-----
1603
+
1604
+ Staat der Nederlanden Root CA - G2
1605
+ ==================================
1606
+ -----BEGIN CERTIFICATE-----
1607
+ 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
1633
+ 66+KAQ==
1634
+ -----END CERTIFICATE-----
1635
+
1636
+ Hongkong Post Root CA 1
1637
+ =======================
1638
+ -----BEGIN CERTIFICATE-----
1639
+ MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT
1640
+ DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx
1641
+ NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n
1642
+ IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF
1643
+ AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1
1644
+ ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr
1645
+ auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh
1646
+ qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY
1647
+ V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV
1648
+ HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i
1649
+ h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio
1650
+ l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei
1651
+ IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps
1652
+ T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT
1653
+ c4afU9hDDl3WY4JxHYB0yvbiAmvZWg==
1654
+ -----END CERTIFICATE-----
1655
+
1656
+ SecureSign RootCA11
1657
+ ===================
1658
+ -----BEGIN CERTIFICATE-----
1659
+ MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi
1660
+ SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS
1661
+ b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw
1662
+ KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1
1663
+ cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL
1664
+ TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO
1665
+ wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq
1666
+ g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP
1667
+ O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA
1668
+ bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX
1669
+ t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh
1670
+ OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r
1671
+ bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ
1672
+ Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01
1673
+ y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061
1674
+ lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=
1675
+ -----END CERTIFICATE-----
1676
+
1677
+ ACEDICOM Root
1678
+ =============
1679
+ -----BEGIN CERTIFICATE-----
1680
+ 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
1706
+ -----END CERTIFICATE-----
1707
+
1708
+ Microsec e-Szigno Root CA 2009
1709
+ ==============================
1710
+ -----BEGIN CERTIFICATE-----
1711
+ MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER
1712
+ MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv
1713
+ c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
1714
+ dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE
1715
+ BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt
1716
+ U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw
1717
+ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA
1718
+ fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG
1719
+ 0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA
1720
+ pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm
1721
+ 1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC
1722
+ AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf
1723
+ QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE
1724
+ FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o
1725
+ lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX
1726
+ I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
1727
+ tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02
1728
+ yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi
1729
+ LXpUq3DDfSJlgnCW
1730
+ -----END CERTIFICATE-----
1731
+
1732
+ GlobalSign Root CA - R3
1733
+ =======================
1734
+ -----BEGIN CERTIFICATE-----
1735
+ MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv
1736
+ YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
1737
+ bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
1738
+ aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
1739
+ bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt
1740
+ iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ
1741
+ 0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3
1742
+ rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl
1743
+ OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2
1744
+ xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
1745
+ FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7
1746
+ lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8
1747
+ EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E
1748
+ bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18
1749
+ YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r
1750
+ kpeDMdmztcpHWD9f
1751
+ -----END CERTIFICATE-----
1752
+
1753
+ Autoridad de Certificacion Firmaprofesional CIF A62634068
1754
+ =========================================================
1755
+ -----BEGIN CERTIFICATE-----
1756
+ MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA
1757
+ BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
1758
+ MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw
1759
+ QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB
1760
+ NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD
1761
+ Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P
1762
+ B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY
1763
+ 7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH
1764
+ ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI
1765
+ plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX
1766
+ MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX
1767
+ LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK
1768
+ bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU
1769
+ vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud
1770
+ EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH
1771
+ DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
1772
+ cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA
1773
+ bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx
1774
+ ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx
1775
+ 51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk
1776
+ R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP
1777
+ T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f
1778
+ Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl
1779
+ osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR
1780
+ crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR
1781
+ saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD
1782
+ KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi
1783
+ 6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
1784
+ -----END CERTIFICATE-----
1785
+
1786
+ Izenpe.com
1787
+ ==========
1788
+ -----BEGIN CERTIFICATE-----
1789
+ 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
1816
+ -----END CERTIFICATE-----
1817
+
1818
+ Chambers of Commerce Root - 2008
1819
+ ================================
1820
+ -----BEGIN CERTIFICATE-----
1821
+ MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD
1822
+ MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
1823
+ bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
1824
+ QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy
1825
+ Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl
1826
+ ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF
1827
+ EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl
1828
+ cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
1829
+ AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA
1830
+ XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj
1831
+ h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/
1832
+ ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk
1833
+ NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g
1834
+ D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331
1835
+ lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ
1836
+ 0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
1837
+ ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2
1838
+ EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI
1839
+ G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ
1840
+ BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh
1841
+ bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh
1842
+ bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC
1843
+ CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH
1844
+ AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1
1845
+ wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH
1846
+ 3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU
1847
+ RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6
1848
+ M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1
1849
+ YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF
1850
+ 9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK
1851
+ zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG
1852
+ nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
1853
+ OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ
1854
+ -----END CERTIFICATE-----
1855
+
1856
+ Global Chambersign Root - 2008
1857
+ ==============================
1858
+ -----BEGIN CERTIFICATE-----
1859
+ MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD
1860
+ MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
1861
+ bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
1862
+ QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx
1863
+ NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg
1864
+ Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ
1865
+ QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
1866
+ aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf
1867
+ VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf
1868
+ XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0
1869
+ ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB
1870
+ /gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA
1871
+ TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M
1872
+ H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe
1873
+ Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF
1874
+ HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
1875
+ wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB
1876
+ AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT
1877
+ BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE
1878
+ BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm
1879
+ aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm
1880
+ aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp
1881
+ 1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0
1882
+ dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG
1883
+ /5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6
1884
+ ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s
1885
+ dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg
1886
+ 9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH
1887
+ foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du
1888
+ qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr
1889
+ P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq
1890
+ c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
1891
+ 09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
1892
+ -----END CERTIFICATE-----
1893
+
1894
+ Go Daddy Root Certificate Authority - G2
1895
+ ========================================
1896
+ -----BEGIN CERTIFICATE-----
1897
+ MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
1898
+ B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu
1899
+ MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
1900
+ MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
1901
+ b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G
1902
+ A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
1903
+ hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq
1904
+ 9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD
1905
+ +qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd
1906
+ fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl
1907
+ NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC
1908
+ MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9
1909
+ BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac
1910
+ vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r
1911
+ 5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV
1912
+ N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
1913
+ LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1
1914
+ -----END CERTIFICATE-----
1915
+
1916
+ Starfield Root Certificate Authority - G2
1917
+ =========================================
1918
+ -----BEGIN CERTIFICATE-----
1919
+ MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
1920
+ B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
1921
+ b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
1922
+ eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw
1923
+ DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg
1924
+ VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB
1925
+ dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv
1926
+ W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs
1927
+ bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk
1928
+ N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf
1929
+ ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU
1930
+ JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
1931
+ AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol
1932
+ TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx
1933
+ 4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw
1934
+ F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
1935
+ pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ
1936
+ c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
1937
+ -----END CERTIFICATE-----
1938
+
1939
+ Starfield Services Root Certificate Authority - G2
1940
+ ==================================================
1941
+ -----BEGIN CERTIFICATE-----
1942
+ MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
1943
+ B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
1944
+ b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl
1945
+ IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV
1946
+ BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT
1947
+ dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg
1948
+ Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
1949
+ AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2
1950
+ h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa
1951
+ hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP
1952
+ LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB
1953
+ rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
1954
+ AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG
1955
+ SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP
1956
+ E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy
1957
+ xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
1958
+ iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza
1959
+ YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6
1960
+ -----END CERTIFICATE-----
1961
+
1962
+ AffirmTrust Commercial
1963
+ ======================
1964
+ -----BEGIN CERTIFICATE-----
1965
+ MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS
1966
+ BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw
1967
+ MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
1968
+ bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF
1969
+ AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb
1970
+ DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV
1971
+ C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6
1972
+ BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww
1973
+ MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV
1974
+ HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
1975
+ AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG
1976
+ hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi
1977
+ qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv
1978
+ 0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh
1979
+ sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
1980
+ -----END CERTIFICATE-----
1981
+
1982
+ AffirmTrust Networking
1983
+ ======================
1984
+ -----BEGIN CERTIFICATE-----
1985
+ MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS
1986
+ BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw
1987
+ MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
1988
+ bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF
1989
+ AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE
1990
+ Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI
1991
+ dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24
1992
+ /PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb
1993
+ h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV
1994
+ HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
1995
+ AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu
1996
+ UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6
1997
+ 12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23
1998
+ WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9
1999
+ /ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
2000
+ -----END CERTIFICATE-----
2001
+
2002
+ AffirmTrust Premium
2003
+ ===================
2004
+ -----BEGIN CERTIFICATE-----
2005
+ MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS
2006
+ BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy
2007
+ OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy
2008
+ dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
2009
+ MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn
2010
+ BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV
2011
+ 5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs
2012
+ +7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd
2013
+ GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R
2014
+ p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI
2015
+ S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04
2016
+ 6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5
2017
+ /bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo
2018
+ +Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB
2019
+ /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv
2020
+ MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
2021
+ Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC
2022
+ 6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S
2023
+ L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK
2024
+ +4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV
2025
+ BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg
2026
+ IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60
2027
+ g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb
2028
+ zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw==
2029
+ -----END CERTIFICATE-----
2030
+
2031
+ AffirmTrust Premium ECC
2032
+ =======================
2033
+ -----BEGIN CERTIFICATE-----
2034
+ MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV
2035
+ BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx
2036
+ MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U
2037
+ cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA
2038
+ IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ
2039
+ N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW
2040
+ BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK
2041
+ BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X
2042
+ 57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM
2043
+ eQ==
2044
+ -----END CERTIFICATE-----
2045
+
2046
+ Certum Trusted Network CA
2047
+ =========================
2048
+ -----BEGIN CERTIFICATE-----
2049
+ MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK
2050
+ ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv
2051
+ biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy
2052
+ MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU
2053
+ ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
2054
+ MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
2055
+ AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC
2056
+ l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J
2057
+ J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4
2058
+ fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0
2059
+ cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB
2060
+ Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw
2061
+ DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj
2062
+ jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1
2063
+ mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj
2064
+ Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
2065
+ 03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
2066
+ -----END CERTIFICATE-----
2067
+
2068
+ Certinomis - Autorité Racine
2069
+ ============================
2070
+ -----BEGIN CERTIFICATE-----
2071
+ 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
2096
+ vgt2Fl43N+bYdJeimUV5
2097
+ -----END CERTIFICATE-----
2098
+
2099
+ TWCA Root Certification Authority
2100
+ =================================
2101
+ -----BEGIN CERTIFICATE-----
2102
+ MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ
2103
+ VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh
2104
+ dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG
2105
+ EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB
2106
+ IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
2107
+ AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx
2108
+ QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC
2109
+ oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP
2110
+ 4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r
2111
+ y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB
2112
+ BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG
2113
+ 9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC
2114
+ mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW
2115
+ QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY
2116
+ T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny
2117
+ Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
2118
+ -----END CERTIFICATE-----
2119
+
2120
+ Security Communication RootCA2
2121
+ ==============================
2122
+ -----BEGIN CERTIFICATE-----
2123
+ MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
2124
+ U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh
2125
+ dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC
2126
+ SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy
2127
+ aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
2128
+ ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++
2129
+ +T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R
2130
+ 3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV
2131
+ spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K
2132
+ EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8
2133
+ QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB
2134
+ CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj
2135
+ u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk
2136
+ 3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q
2137
+ tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29
2138
+ mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
2139
+ -----END CERTIFICATE-----
2140
+
2141
+ EC-ACC
2142
+ ======
2143
+ -----BEGIN CERTIFICATE-----
2144
+ MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE
2145
+ BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w
2146
+ ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD
2147
+ VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE
2148
+ CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT
2149
+ BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7
2150
+ MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt
2151
+ SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl
2152
+ Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh
2153
+ cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND
2154
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK
2155
+ w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT
2156
+ ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4
2157
+ HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a
2158
+ E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw
2159
+ 0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E
2160
+ BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD
2161
+ VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0
2162
+ Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l
2163
+ dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ
2164
+ lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa
2165
+ Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe
2166
+ l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2
2167
+ E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D
2168
+ 5EI=
2169
+ -----END CERTIFICATE-----
2170
+
2171
+ Hellenic Academic and Research Institutions RootCA 2011
2172
+ =======================================================
2173
+ -----BEGIN CERTIFICATE-----
2174
+ MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT
2175
+ O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y
2176
+ aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
2177
+ IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT
2178
+ AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
2179
+ IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo
2180
+ IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
2181
+ AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI
2182
+ 1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa
2183
+ 71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u
2184
+ 8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH
2185
+ 3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/
2186
+ MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8
2187
+ MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu
2188
+ b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt
2189
+ XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8
2190
+ TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD
2191
+ /md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N
2192
+ 7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4
2193
+ -----END CERTIFICATE-----
2194
+
2195
+ Actalis Authentication Root CA
2196
+ ==============================
2197
+ -----BEGIN CERTIFICATE-----
2198
+ MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM
2199
+ BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE
2200
+ AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky
2201
+ MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz
2202
+ IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
2203
+ IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ
2204
+ wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa
2205
+ by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6
2206
+ zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f
2207
+ YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2
2208
+ oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l
2209
+ EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7
2210
+ hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8
2211
+ EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5
2212
+ jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY
2213
+ iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
2214
+ ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI
2215
+ WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0
2216
+ JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx
2217
+ K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+
2218
+ Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC
2219
+ 4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo
2220
+ 2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz
2221
+ lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem
2222
+ OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9
2223
+ vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
2224
+ -----END CERTIFICATE-----
2225
+
2226
+ Trustis FPS Root CA
2227
+ ===================
2228
+ -----BEGIN CERTIFICATE-----
2229
+ MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG
2230
+ EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290
2231
+ IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV
2232
+ BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ
2233
+ KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ
2234
+ RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk
2235
+ H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa
2236
+ cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt
2237
+ o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA
2238
+ AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd
2239
+ BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c
2240
+ GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC
2241
+ yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P
2242
+ 8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV
2243
+ l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl
2244
+ iB6XzCGcKQENZetX2fNXlrtIzYE=
2245
+ -----END CERTIFICATE-----
2246
+
2247
+ StartCom Certification Authority
2248
+ ================================
2249
+ -----BEGIN CERTIFICATE-----
2250
+ MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
2251
+ U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
2252
+ ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
2253
+ NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
2254
+ LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
2255
+ U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
2256
+ ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
2257
+ o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
2258
+ Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
2259
+ eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
2260
+ 2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
2261
+ 6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
2262
+ osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
2263
+ untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
2264
+ UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
2265
+ 37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
2266
+ VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ
2267
+ Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0
2268
+ dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu
2269
+ c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv
2270
+ bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0
2271
+ aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0
2272
+ aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t
2273
+ L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG
2274
+ cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5
2275
+ fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm
2276
+ N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN
2277
+ Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T
2278
+ tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX
2279
+ e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA
2280
+ 2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs
2281
+ HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE
2282
+ JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib
2283
+ D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8=
2284
+ -----END CERTIFICATE-----
2285
+
2286
+ StartCom Certification Authority G2
2287
+ ===================================
2288
+ -----BEGIN CERTIFICATE-----
2289
+ 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
2313
+ obp573PYtlNXLfbQ4ddI
2314
+ -----END CERTIFICATE-----
2315
+
2316
+ Buypass Class 2 Root CA
2317
+ =======================
2318
+ -----BEGIN CERTIFICATE-----
2319
+ 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
2343
+ rJgWVqA=
2344
+ -----END CERTIFICATE-----
2345
+
2346
+ Buypass Class 3 Root CA
2347
+ =======================
2348
+ -----BEGIN CERTIFICATE-----
2349
+ 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
2373
+ Cp/HuZc=
2374
+ -----END CERTIFICATE-----
2375
+
2376
+ T-TeleSec GlobalRoot Class 3
2377
+ ============================
2378
+ -----BEGIN CERTIFICATE-----
2379
+ MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
2380
+ IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
2381
+ cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx
2382
+ MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
2383
+ dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
2384
+ ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3
2385
+ DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK
2386
+ 9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU
2387
+ NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF
2388
+ iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W
2389
+ 0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA
2390
+ MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr
2391
+ AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb
2392
+ fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT
2393
+ ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h
2394
+ P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
2395
+ e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw==
2396
+ -----END CERTIFICATE-----
2397
+
2398
+ EE Certification Centre Root CA
2399
+ ===============================
2400
+ -----BEGIN CERTIFICATE-----
2401
+ MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
2402
+ EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy
2403
+ dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw
2404
+ MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB
2405
+ UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy
2406
+ ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB
2407
+ DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM
2408
+ TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2
2409
+ rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw
2410
+ 93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN
2411
+ P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T
2412
+ AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ
2413
+ MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF
2414
+ BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj
2415
+ xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM
2416
+ lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u
2417
+ uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU
2418
+ 3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM
2419
+ dcGWxZ0=
2420
+ -----END CERTIFICATE-----
2421
+
2422
+ TURKTRUST Certificate Services Provider Root 2007
2423
+ =================================================
2424
+ -----BEGIN CERTIFICATE-----
2425
+ MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF
2426
+ bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP
2427
+ MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
2428
+ QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X
2429
+ DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl
2430
+ a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN
2431
+ BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp
2432
+ bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw
2433
+ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N
2434
+ YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv
2435
+ KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya
2436
+ KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT
2437
+ rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC
2438
+ AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP
2439
+ BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s
2440
+ Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I
2441
+ aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO
2442
+ Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb
2443
+ BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK
2444
+ poRq0Tl9
2445
+ -----END CERTIFICATE-----
2446
+
2447
+ D-TRUST Root Class 3 CA 2 2009
2448
+ ==============================
2449
+ -----BEGIN CERTIFICATE-----
2450
+ MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK
2451
+ DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe
2452
+ Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE
2453
+ LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw
2454
+ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD
2455
+ ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA
2456
+ BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv
2457
+ KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z
2458
+ p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC
2459
+ AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ
2460
+ 4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y
2461
+ eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw
2462
+ MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G
2463
+ PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw
2464
+ OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm
2465
+ 2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0
2466
+ o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV
2467
+ dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph
2468
+ X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I=
2469
+ -----END CERTIFICATE-----
2470
+
2471
+ D-TRUST Root Class 3 CA 2 EV 2009
2472
+ =================================
2473
+ -----BEGIN CERTIFICATE-----
2474
+ MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
2475
+ DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
2476
+ OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
2477
+ DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
2478
+ OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS
2479
+ egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh
2480
+ zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T
2481
+ 7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60
2482
+ sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35
2483
+ 11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv
2484
+ cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v
2485
+ ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El
2486
+ MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp
2487
+ b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh
2488
+ c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+
2489
+ PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05
2490
+ nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX
2491
+ ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA
2492
+ NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv
2493
+ w9y4AyHqnxbxLFS1
2494
+ -----END CERTIFICATE-----
2495
+
2496
+ PSCProcert
2497
+ ==========
2498
+ -----BEGIN CERTIFICATE-----
2499
+ MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1dG9yaWRhZCBk
2500
+ ZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9sYW5vMQswCQYDVQQGEwJWRTEQ
2501
+ MA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlzdHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lz
2502
+ dGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBl
2503
+ cmludGVuZGVuY2lhIGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUw
2504
+ IwYJKoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEwMFoXDTIw
2505
+ MTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHByb2NlcnQubmV0LnZlMQ8w
2506
+ DQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGExKjAoBgNVBAsTIVByb3ZlZWRvciBkZSBD
2507
+ ZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZp
2508
+ Y2FjaW9uIEVsZWN0cm9uaWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIw
2509
+ DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo97BVC
2510
+ wfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74BCXfgI8Qhd19L3uA
2511
+ 3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38GieU89RLAu9MLmV+QfI4tL3czkkoh
2512
+ RqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmO
2513
+ EO8GqQKJ/+MMbpfg353bIdD0PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG2
2514
+ 0qCZyFSTXai20b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH
2515
+ 0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/6mnbVSKVUyqU
2516
+ td+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1mv6JpIzi4mWCZDlZTOpx+FIyw
2517
+ Bm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvp
2518
+ r2uKGcfLFFb14dq12fy/czja+eevbqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/
2519
+ AgEBMDcGA1UdEgQwMC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAz
2520
+ Ni0wMB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFDgBStuyId
2521
+ xuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0b3JpZGFkIGRlIENlcnRp
2522
+ ZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xhbm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQH
2523
+ EwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5h
2524
+ Y2lvbmFsIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5k
2525
+ ZW5jaWEgZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkqhkiG
2526
+ 9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQDAgEGME0GA1UdEQRG
2527
+ MESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0wMDAwMDKgGwYFYIZeAgKgEgwQUklG
2528
+ LUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEagRKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52
2529
+ ZS9sY3IvQ0VSVElGSUNBRE8tUkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNy
2530
+ YWl6LnN1c2NlcnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v
2531
+ Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsGAQUFBwIBFh5o
2532
+ dHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcNAQELBQADggIBACtZ6yKZu4Sq
2533
+ T96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmN
2534
+ g7+mvTV+LFwxNG9s2/NkAZiqlCxB3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4q
2535
+ uxtxj7mkoP3YldmvWb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1
2536
+ n8GhHVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHmpHmJWhSn
2537
+ FFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXzsOfIt+FTvZLm8wyWuevo
2538
+ 5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bEqCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq
2539
+ 3TNWOByyrYDT13K9mmyZY+gAu0F2BbdbmRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5
2540
+ poLWccret9W6aAjtmcz9opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3Y
2541
+ eMLEYC/HYvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km
2542
+ -----END CERTIFICATE-----
2543
+
2544
+ China Internet Network Information Center EV Certificates Root
2545
+ ==============================================================
2546
+ -----BEGIN CERTIFICATE-----
2547
+ MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCQ04xMjAwBgNV
2548
+ BAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyMUcwRQYDVQQDDD5D
2549
+ aGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMg
2550
+ Um9vdDAeFw0xMDA4MzEwNzExMjVaFw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAG
2551
+ A1UECgwpQ2hpbmEgSW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMM
2552
+ PkNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRpZmljYXRl
2553
+ cyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z7r07eKpkQ0H1UN+U8i6y
2554
+ jUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA//DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV
2555
+ 98YPjUesWgbdYavi7NifFy2cyjw1l1VxzUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2H
2556
+ klY0bBoQCxfVWhyXWIQ8hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23
2557
+ KzhmBsUs4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54ugQEC
2558
+ 7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oYNJKiyoOCWTAPBgNV
2559
+ HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUfHJLOcfA22KlT5uqGDSSosqD
2560
+ glkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd5
2561
+ 0XPFtQO3WKwMVC/GVhMPMdoG52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM
2562
+ 7+czV0I664zBechNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws
2563
+ ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrIzo9uoV1/A3U0
2564
+ 5K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATywy39FCqQmbkHzJ8=
2565
+ -----END CERTIFICATE-----
2566
+
2567
+ Swisscom Root CA 2
2568
+ ==================
2569
+ -----BEGIN CERTIFICATE-----
2570
+ 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
2596
+ 5OfNeOI5wSsSnqaeG8XmDtkx2Q==
2597
+ -----END CERTIFICATE-----
2598
+
2599
+ Swisscom Root EV CA 2
2600
+ =====================
2601
+ -----BEGIN CERTIFICATE-----
2602
+ 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
2628
+ l8PVP3wbI+2ksx0WckNLIOFZfsLorSa/ovc=
2629
+ -----END CERTIFICATE-----
2630
+
2631
+ CA Disig Root R1
2632
+ ================
2633
+ -----BEGIN CERTIFICATE-----
2634
+ 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
2658
+ a7+h89n07eLw4+1knj0vllJPgFOL
2659
+ -----END CERTIFICATE-----
2660
+
2661
+ CA Disig Root R2
2662
+ ================
2663
+ -----BEGIN CERTIFICATE-----
2664
+ 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
2688
+ 7+ZtsH8tZ/3zbBt1RqPlShfppNcL
2689
+ -----END CERTIFICATE-----
2690
+
2691
+ ACCVRAIZ1
2692
+ =========
2693
+ -----BEGIN CERTIFICATE-----
2694
+ MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB
2695
+ SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1
2696
+ MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH
2697
+ UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
2698
+ DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM
2699
+ jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0
2700
+ RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD
2701
+ aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ
2702
+ 0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG
2703
+ WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7
2704
+ 8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR
2705
+ 5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J
2706
+ 9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK
2707
+ Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw
2708
+ Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu
2709
+ Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2
2710
+ VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM
2711
+ Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA
2712
+ QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh
2713
+ AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA
2714
+ YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj
2715
+ AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA
2716
+ IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk
2717
+ aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0
2718
+ dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2
2719
+ MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI
2720
+ hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E
2721
+ R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN
2722
+ YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49
2723
+ nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ
2724
+ TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3
2725
+ sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h
2726
+ I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg
2727
+ Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd
2728
+ 3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p
2729
+ EfbRD0tVNEYqi4Y7
2730
+ -----END CERTIFICATE-----
2731
+
2732
+ TWCA Global Root CA
2733
+ ===================
2734
+ -----BEGIN CERTIFICATE-----
2735
+ MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT
2736
+ CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD
2737
+ QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK
2738
+ EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg
2739
+ Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C
2740
+ nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV
2741
+ r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR
2742
+ Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV
2743
+ tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W
2744
+ KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99
2745
+ sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p
2746
+ yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn
2747
+ kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI
2748
+ zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC
2749
+ AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g
2750
+ cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn
2751
+ LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M
2752
+ 8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg
2753
+ /eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg
2754
+ lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP
2755
+ A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m
2756
+ i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8
2757
+ EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3
2758
+ zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0=
2759
+ -----END CERTIFICATE-----
2760
+
2761
+ TeliaSonera Root CA v1
2762
+ ======================
2763
+ -----BEGIN CERTIFICATE-----
2764
+ MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE
2765
+ CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4
2766
+ MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW
2767
+ VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+
2768
+ 6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA
2769
+ 3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k
2770
+ B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn
2771
+ Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH
2772
+ oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3
2773
+ F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ
2774
+ oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7
2775
+ gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc
2776
+ TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB
2777
+ AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW
2778
+ DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm
2779
+ zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx
2780
+ 0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW
2781
+ pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV
2782
+ G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc
2783
+ c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT
2784
+ JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2
2785
+ qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6
2786
+ Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems
2787
+ WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=
2788
+ -----END CERTIFICATE-----
2789
+
2790
+ E-Tugra Certification Authority
2791
+ ===============================
2792
+ -----BEGIN CERTIFICATE-----
2793
+ MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w
2794
+ DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls
2795
+ ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN
2796
+ ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw
2797
+ NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx
2798
+ QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl
2799
+ cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD
2800
+ DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
2801
+ MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd
2802
+ hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K
2803
+ CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g
2804
+ ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ
2805
+ BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0
2806
+ E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz
2807
+ rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq
2808
+ jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn
2809
+ rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5
2810
+ dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB
2811
+ /wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG
2812
+ MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK
2813
+ kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO
2814
+ XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807
2815
+ VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo
2816
+ a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc
2817
+ dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV
2818
+ KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT
2819
+ Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0
2820
+ 8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G
2821
+ C7TbO6Orb1wdtn7os4I07QZcJA==
2822
+ -----END CERTIFICATE-----
2823
+
2824
+ T-TeleSec GlobalRoot Class 2
2825
+ ============================
2826
+ -----BEGIN CERTIFICATE-----
2827
+ MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
2828
+ IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
2829
+ cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx
2830
+ MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
2831
+ dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
2832
+ ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3
2833
+ DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ
2834
+ SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F
2835
+ vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970
2836
+ 2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV
2837
+ WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA
2838
+ MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy
2839
+ YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4
2840
+ r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf
2841
+ vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR
2842
+ 3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN
2843
+ 9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg==
2844
+ -----END CERTIFICATE-----
2845
+
2846
+ Atos TrustedRoot 2011
2847
+ =====================
2848
+ -----BEGIN CERTIFICATE-----
2849
+ MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU
2850
+ cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4
2851
+ MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG
2852
+ A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV
2853
+ hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr
2854
+ 54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+
2855
+ DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320
2856
+ HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR
2857
+ z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R
2858
+ l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ
2859
+ bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB
2860
+ CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h
2861
+ k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh
2862
+ TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9
2863
+ 61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G
2864
+ 3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed
2865
+ -----END CERTIFICATE-----
2866
+
2867
+ QuoVadis Root CA 1 G3
2868
+ =====================
2869
+ -----BEGIN CERTIFICATE-----
2870
+ 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
2894
+ hMJKzRwuJIczYOXD
2895
+ -----END CERTIFICATE-----
2896
+
2897
+ QuoVadis Root CA 2 G3
2898
+ =====================
2899
+ -----BEGIN CERTIFICATE-----
2900
+ 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
2924
+ O3jtZsSOeWmD3n+M
2925
+ -----END CERTIFICATE-----
2926
+
2927
+ QuoVadis Root CA 3 G3
2928
+ =====================
2929
+ -----BEGIN CERTIFICATE-----
2930
+ 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
2954
+ PpxxVJkES/1Y+Zj0
2955
+ -----END CERTIFICATE-----
2956
+
2957
+ DigiCert Assured ID Root G2
2958
+ ===========================
2959
+ -----BEGIN CERTIFICATE-----
2960
+ MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG
2961
+ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
2962
+ IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw
2963
+ MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
2964
+ ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw
2965
+ ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH
2966
+ 35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq
2967
+ bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw
2968
+ VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP
2969
+ YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn
2970
+ lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO
2971
+ w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv
2972
+ 0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz
2973
+ d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW
2974
+ hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M
2975
+ jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo
2976
+ IhNzbM8m9Yop5w==
2977
+ -----END CERTIFICATE-----
2978
+
2979
+ DigiCert Assured ID Root G3
2980
+ ===========================
2981
+ -----BEGIN CERTIFICATE-----
2982
+ MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV
2983
+ UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD
2984
+ VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1
2985
+ MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
2986
+ d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ
2987
+ BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb
2988
+ RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs
2989
+ KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF
2990
+ UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy
2991
+ YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy
2992
+ 1vUhZscv6pZjamVFkpUBtA==
2993
+ -----END CERTIFICATE-----
2994
+
2995
+ DigiCert Global Root G2
2996
+ =======================
2997
+ -----BEGIN CERTIFICATE-----
2998
+ MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG
2999
+ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
3000
+ HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx
3001
+ MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
3002
+ dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq
3003
+ hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ
3004
+ kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO
3005
+ 3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV
3006
+ BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM
3007
+ UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB
3008
+ o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu
3009
+ 5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr
3010
+ F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U
3011
+ WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH
3012
+ QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/
3013
+ iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl
3014
+ MrY=
3015
+ -----END CERTIFICATE-----
3016
+
3017
+ DigiCert Global Root G3
3018
+ =======================
3019
+ -----BEGIN CERTIFICATE-----
3020
+ MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV
3021
+ UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD
3022
+ VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw
3023
+ MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k
3024
+ aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C
3025
+ AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O
3026
+ YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP
3027
+ BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp
3028
+ Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y
3029
+ 3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34
3030
+ VOKa5Vt8sycX
3031
+ -----END CERTIFICATE-----
3032
+
3033
+ DigiCert Trusted Root G4
3034
+ ========================
3035
+ -----BEGIN CERTIFICATE-----
3036
+ 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
3061
+ 82Z+
3062
+ -----END CERTIFICATE-----
3063
+
3064
+ WoSign
3065
+ ======
3066
+ -----BEGIN CERTIFICATE-----
3067
+ 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
3092
+ -----END CERTIFICATE-----
3093
+
3094
+ WoSign China
3095
+ ============
3096
+ -----BEGIN CERTIFICATE-----
3097
+ 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
3121
+ kI26oQ==
3122
+ -----END CERTIFICATE-----
3123
+
3124
+ COMODO RSA Certification Authority
3125
+ ==================================
3126
+ -----BEGIN CERTIFICATE-----
3127
+ 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
3153
+ LaZRfyHBNVOFBkpdn627G190
3154
+ -----END CERTIFICATE-----
3155
+
3156
+ USERTrust RSA Certification Authority
3157
+ =====================================
3158
+ -----BEGIN CERTIFICATE-----
3159
+ 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
3185
+ Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9
3186
+ -----END CERTIFICATE-----
3187
+
3188
+ USERTrust ECC Certification Authority
3189
+ =====================================
3190
+ -----BEGIN CERTIFICATE-----
3191
+ MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC
3192
+ VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
3193
+ aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv
3194
+ biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC
3195
+ VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
3196
+ aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv
3197
+ biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2
3198
+ 0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez
3199
+ nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV
3200
+ HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB
3201
+ HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu
3202
+ 9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=
3203
+ -----END CERTIFICATE-----
3204
+
3205
+ GlobalSign ECC Root CA - R4
3206
+ ===========================
3207
+ -----BEGIN CERTIFICATE-----
3208
+ MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb
3209
+ R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
3210
+ EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb
3211
+ R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
3212
+ EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl
3213
+ OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P
3214
+ AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV
3215
+ MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF
3216
+ JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q=
3217
+ -----END CERTIFICATE-----
3218
+
3219
+ GlobalSign ECC Root CA - R5
3220
+ ===========================
3221
+ -----BEGIN CERTIFICATE-----
3222
+ MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb
3223
+ R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
3224
+ EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb
3225
+ R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
3226
+ EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6
3227
+ SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS
3228
+ h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd
3229
+ BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx
3230
+ uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7
3231
+ yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3
3232
+ -----END CERTIFICATE-----
3233
+
3234
+ Staat der Nederlanden Root CA - G3
3235
+ ==================================
3236
+ -----BEGIN CERTIFICATE-----
3237
+ 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
3262
+ -----END CERTIFICATE-----
3263
+
3264
+ Staat der Nederlanden EV Root CA
3265
+ ================================
3266
+ -----BEGIN CERTIFICATE-----
3267
+ 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
3291
+ eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg==
3292
+ -----END CERTIFICATE-----
3293
+
3294
+ IdenTrust Commercial Root CA 1
3295
+ ==============================
3296
+ -----BEGIN CERTIFICATE-----
3297
+ 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
3321
+ cGzM7vRX+Bi6hG6H
3322
+ -----END CERTIFICATE-----
3323
+
3324
+ IdenTrust Public Sector Root CA 1
3325
+ =================================
3326
+ -----BEGIN CERTIFICATE-----
3327
+ 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
3351
+ 3Wl9af0AVqW3rLatt8o+Ae+c
3352
+ -----END CERTIFICATE-----
3353
+
3354
+ Entrust Root Certification Authority - G2
3355
+ =========================================
3356
+ -----BEGIN CERTIFICATE-----
3357
+ MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV
3358
+ BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy
3359
+ bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug
3360
+ b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw
3361
+ HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT
3362
+ DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx
3363
+ OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s
3364
+ eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi
3365
+ MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP
3366
+ /vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz
3367
+ HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU
3368
+ s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y
3369
+ TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx
3370
+ AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6
3371
+ 0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z
3372
+ iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ
3373
+ Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi
3374
+ nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+
3375
+ vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO
3376
+ e4pIb4tF9g==
3377
+ -----END CERTIFICATE-----
3378
+
3379
+ Entrust Root Certification Authority - EC1
3380
+ ==========================================
3381
+ -----BEGIN CERTIFICATE-----
3382
+ MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx
3383
+ FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn
3384
+ YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl
3385
+ ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
3386
+ IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw
3387
+ FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs
3388
+ LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg
3389
+ dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt
3390
+ IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy
3391
+ AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef
3392
+ 9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
3393
+ FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h
3394
+ vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8
3395
+ kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G
3396
+ -----END CERTIFICATE-----
3397
+
3398
+ CFCA EV ROOT
3399
+ ============
3400
+ -----BEGIN CERTIFICATE-----
3401
+ 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
3426
+ -----END CERTIFICATE-----
3427
+
3428
+ TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5
3429
+ ====================================================
3430
+ -----BEGIN CERTIFICATE-----
3431
+ MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UEBhMCVFIxDzAN
3432
+ BgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp
3433
+ bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1Qg
3434
+ RWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAw
3435
+ ODA3MDFaFw0yMzA0MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0w
3436
+ SwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnE
3437
+ n2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRp
3438
+ ZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
3439
+ CgKCAQEApCUZ4WWe60ghUEoI5RHwWrom/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537
3440
+ jVJp45wnEFPzpALFp/kRGml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1m
3441
+ ep5Fimh34khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z5UNP
3442
+ 9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0hO8EuPbJbKoCPrZV
3443
+ 4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QIDAQABo0IwQDAdBgNVHQ4EFgQUVpkH
3444
+ HtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI
3445
+ hvcNAQELBQADggEBAJ5FdnsXSDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPo
3446
+ BP5yCccLqh0lVX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq
3447
+ URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nfpeYVhDfwwvJl
3448
+ lpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CFYv4HAqGEVka+lgqaE9chTLd8
3449
+ B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW+qtB4Uu2NQvAmxU=
3450
+ -----END CERTIFICATE-----
3451
+
3452
+ Certinomis - Root CA
3453
+ ====================
3454
+ -----BEGIN CERTIFICATE-----
3455
+ MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjETMBEGA1UEChMK
3456
+ Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAbBgNVBAMTFENlcnRpbm9taXMg
3457
+ LSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMzMTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIx
3458
+ EzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRD
3459
+ ZXJ0aW5vbWlzIC0gUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQos
3460
+ P5L2fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJflLieY6pOo
3461
+ d5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQVWZUKxkd8aRi5pwP5ynap
3462
+ z8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDFTKWrteoB4owuZH9kb/2jJZOLyKIOSY00
3463
+ 8B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09x
3464
+ RLWtwHkziOC/7aOgFLScCbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE
3465
+ 6OXWk6RiwsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJwx3t
3466
+ FvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SGm/lg0h9tkQPTYKbV
3467
+ PZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4F2iw4lNVYC2vPsKD2NkJK/DAZNuH
3468
+ i5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZngWVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGj
3469
+ YzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I
3470
+ 6tNxIqSSaHh02TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF
3471
+ AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/0KGRHCwPT5iV
3472
+ WVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWwF6YSjNRieOpWauwK0kDDPAUw
3473
+ Pk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZSg081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAX
3474
+ lCOotQqSD7J6wWAsOMwaplv/8gzjqh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJ
3475
+ y29SWwNyhlCVCNSNh4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9
3476
+ Iff/ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8Vbtaw5Bng
3477
+ DwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwjY/M50n92Uaf0yKHxDHYi
3478
+ I0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nM
3479
+ cyrDflOR1m749fPH0FFNjkulW+YZFzvWgQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVr
3480
+ hkIGuUE=
3481
+ -----END CERTIFICATE-----
3482
+
3483
+ OISTE WISeKey Global Root GB CA
3484
+ ===============================
3485
+ -----BEGIN CERTIFICATE-----
3486
+ MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG
3487
+ EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl
3488
+ ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw
3489
+ MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD
3490
+ VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds
3491
+ b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX
3492
+ scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP
3493
+ rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk
3494
+ 9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o
3495
+ Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg
3496
+ GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
3497
+ /zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI
3498
+ hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD
3499
+ dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0
3500
+ VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui
3501
+ HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic
3502
+ Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM=
3503
+ -----END CERTIFICATE-----
3504
+
3505
+ Certification Authority of WoSign G2
3506
+ ====================================
3507
+ -----BEGIN CERTIFICATE-----
3508
+ MIIDfDCCAmSgAwIBAgIQayXaioidfLwPBbOxemFFRDANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQG
3509
+ EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxLTArBgNVBAMTJENlcnRpZmljYXRpb24g
3510
+ QXV0aG9yaXR5IG9mIFdvU2lnbiBHMjAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMFgx
3511
+ CzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEtMCsGA1UEAxMkQ2VydGlm
3512
+ aWNhdGlvbiBBdXRob3JpdHkgb2YgV29TaWduIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
3513
+ CgKCAQEAvsXEoCKASU+/2YcRxlPhuw+9YH+v9oIOH9ywjj2X4FA8jzrvZjtFB5sg+OPXJYY1kBai
3514
+ XW8wGQiHC38Gsp1ij96vkqVg1CuAmlI/9ZqD6TRay9nVYlzmDuDfBpgOgHzKtB0TiGsOqCR3A9Du
3515
+ W/PKaZE1OVbFbeP3PU9ekzgkyhjpJMuSA93MHD0JcOQg5PGurLtzaaNjOg9FD6FKmsLRY6zLEPg9
3516
+ 5k4ot+vElbGs/V6r+kHLXZ1L3PR8du9nfwB6jdKgGlxNIuG12t12s9R23164i5jIFFTMaxeSt+BK
3517
+ v0mUYQs4kI9dJGwlezt52eJ+na2fmKEG/HgUYFf47oB3sQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC
3518
+ AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU+mCp62XF3RYUCE4MD42b4Pdkr2cwDQYJKoZI
3519
+ hvcNAQELBQADggEBAFfDejaCnI2Y4qtAqkePx6db7XznPWZaOzG73/MWM5H8fHulwqZm46qwtyeY
3520
+ P0nXYGdnPzZPSsvxFPpahygc7Y9BMsaV+X3avXtbwrAh449G3CE4Q3RM+zD4F3LBMvzIkRfEzFg3
3521
+ TgvMWvchNSiDbGAtROtSjFA9tWwS1/oJu2yySrHFieT801LYYRf+epSEj3m2M1m6D8QL4nCgS3gu
3522
+ +sif/a+RZQp4OBXllxcU3fngLDT4ONCEIgDAFFEYKwLcMFrw6AF8NTojrwjkr6qOKEJJLvD1mTS+
3523
+ 7Q9LGOHSJDy7XUe3IfKN0QqZjuNuPq1w4I+5ysxugTH2e5x6eeRncRg=
3524
+ -----END CERTIFICATE-----
3525
+
3526
+ CA WoSign ECC Root
3527
+ ==================
3528
+ -----BEGIN CERTIFICATE-----
3529
+ MIICCTCCAY+gAwIBAgIQaEpYcIBr8I8C+vbe6LCQkDAKBggqhkjOPQQDAzBGMQswCQYDVQQGEwJD
3530
+ TjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMTEkNBIFdvU2lnbiBFQ0MgUm9v
3531
+ dDAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQK
3532
+ ExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAxMSQ0EgV29TaWduIEVDQyBSb290MHYwEAYHKoZI
3533
+ zj0CAQYFK4EEACIDYgAE4f2OuEMkq5Z7hcK6C62N4DrjJLnSsb6IOsq/Srj57ywvr1FQPEd1bPiU
3534
+ t5v8KB7FVMxjnRZLU8HnIKvNrCXSf4/CwVqCXjCLelTOA7WRf6qU0NGKSMyCBSah1VES1ns2o0Iw
3535
+ QDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUqv3VWqP2h4syhf3R
3536
+ MluARZPzA7gwCgYIKoZIzj0EAwMDaAAwZQIxAOSkhLCB1T2wdKyUpOgOPQB0TKGXa/kNUTyh2Tv0
3537
+ Daupn75OcsqF1NnstTJFGG+rrQIwfcf3aWMvoeGY7xMQ0Xk/0f7qO3/eVvSQsRUR2LIiFdAvwyYu
3538
+ a/GRspBl9JrmkO5K
3539
+ -----END CERTIFICATE-----
3540
+
3541
+ SZAFIR ROOT CA2
3542
+ ===============
3543
+ -----BEGIN CERTIFICATE-----
3544
+ MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG
3545
+ A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV
3546
+ BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ
3547
+ BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD
3548
+ VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q
3549
+ qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK
3550
+ DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE
3551
+ 2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ
3552
+ ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi
3553
+ ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
3554
+ AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC
3555
+ AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5
3556
+ O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67
3557
+ oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul
3558
+ 4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6
3559
+ +/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw==
3560
+ -----END CERTIFICATE-----
3561
+
3562
+ Certum Trusted Network CA 2
3563
+ ===========================
3564
+ -----BEGIN CERTIFICATE-----
3565
+ MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE
3566
+ BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1
3567
+ bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y
3568
+ ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ
3569
+ TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl
3570
+ cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB
3571
+ IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9
3572
+ 7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o
3573
+ CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b
3574
+ Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p
3575
+ uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130
3576
+ GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ
3577
+ 9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB
3578
+ Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye
3579
+ hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM
3580
+ BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
3581
+ AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI
3582
+ hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW
3583
+ Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA
3584
+ L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo
3585
+ clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM
3586
+ pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb
3587
+ w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo
3588
+ J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm
3589
+ ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX
3590
+ is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7
3591
+ zAYspsbiDrW5viSP
3592
+ -----END CERTIFICATE-----
3593
+
3594
+ Hellenic Academic and Research Institutions RootCA 2015
3595
+ =======================================================
3596
+ -----BEGIN CERTIFICATE-----
3597
+ MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT
3598
+ BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0
3599
+ aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl
3600
+ YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx
3601
+ MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg
3602
+ QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV
3603
+ BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw
3604
+ MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv
3605
+ bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh
3606
+ iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+
3607
+ 6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd
3608
+ FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr
3609
+ i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F
3610
+ GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2
3611
+ fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu
3612
+ iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc
3613
+ Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
3614
+ AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI
3615
+ hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+
3616
+ D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM
3617
+ d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y
3618
+ d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn
3619
+ 82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb
3620
+ davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F
3621
+ Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt
3622
+ J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa
3623
+ JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q
3624
+ p/UsQu0yrbYhnr68
3625
+ -----END CERTIFICATE-----
3626
+
3627
+ Hellenic Academic and Research Institutions ECC RootCA 2015
3628
+ ===========================================================
3629
+ -----BEGIN CERTIFICATE-----
3630
+ MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0
3631
+ aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u
3632
+ cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj
3633
+ aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw
3634
+ MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj
3635
+ IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD
3636
+ VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290
3637
+ Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP
3638
+ dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK
3639
+ Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
3640
+ BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA
3641
+ GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn
3642
+ dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR
3643
+ -----END CERTIFICATE-----
3644
+
3645
+ Certplus Root CA G1
3646
+ ===================
3647
+ -----BEGIN CERTIFICATE-----
3648
+ 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
3672
+ qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo=
3673
+ -----END CERTIFICATE-----
3674
+
3675
+ Certplus Root CA G2
3676
+ ===================
3677
+ -----BEGIN CERTIFICATE-----
3678
+ MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4xCzAJBgNVBAYT
3679
+ AkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMjAeFw0x
3680
+ NDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0
3681
+ cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IA
3682
+ BM0PW1aC3/BFGtat93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uN
3683
+ Am8xIk0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0PAQH/BAQD
3684
+ AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMB8GA1Ud
3685
+ IwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqGSM49BAMDA2gAMGUCMHD+sAvZ94OX7PNV
3686
+ HdTcswYO/jOYnYs5kGuUIe22113WTNchp+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjl
3687
+ vPl5adytRSv3tjFzzAalU5ORGpOucGpnutee5WEaXw==
3688
+ -----END CERTIFICATE-----
3689
+
3690
+ OpenTrust Root CA G1
3691
+ ====================
3692
+ -----BEGIN CERTIFICATE-----
3693
+ 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
3717
+ OXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj1oxx
3718
+ -----END CERTIFICATE-----
3719
+
3720
+ OpenTrust Root CA G2
3721
+ ====================
3722
+ -----BEGIN CERTIFICATE-----
3723
+ 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
3747
+ u7JwqkwR3v98KzfUetF3NI/n+UL3PIEMS1IK
3748
+ -----END CERTIFICATE-----
3749
+
3750
+ OpenTrust Root CA G3
3751
+ ====================
3752
+ -----BEGIN CERTIFICATE-----
3753
+ MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAxCzAJBgNVBAYT
3754
+ AkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEczMB4X
3755
+ DTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9w
3756
+ ZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQA
3757
+ IgNiAARK7liuTcpm3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5B
3758
+ ta1doYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4GA1UdDwEB
3759
+ /wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAf
3760
+ BgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAKBggqhkjOPQQDAwNpADBmAjEAj6jcnboM
3761
+ BBf6Fek9LykBl7+BFjNAk2z8+e2AcG+qj9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta
3762
+ 3U1fJAuwACEl74+nBCZx4nxp5V2a+EEfOzmTk51V6s2N8fvB
3763
+ -----END CERTIFICATE-----
3764
+
3765
+ ISRG Root X1
3766
+ ============
3767
+ -----BEGIN CERTIFICATE-----
3768
+ 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
3792
+ m+kXQ99b21/+jh5Xos1AnX5iItreGCc=
3793
+ -----END CERTIFICATE-----
3794
+
3795
+ AC RAIZ FNMT-RCM
3796
+ ================
3797
+ -----BEGIN CERTIFICATE-----
3798
+ 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
3823
+ -----END CERTIFICATE-----
3824
+
3825
+ Amazon Root CA 1
3826
+ ================
3827
+ -----BEGIN CERTIFICATE-----
3828
+ MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD
3829
+ VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1
3830
+ MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv
3831
+ bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
3832
+ ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH
3833
+ FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ
3834
+ gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t
3835
+ dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce
3836
+ VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB
3837
+ /zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3
3838
+ DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM
3839
+ CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy
3840
+ 8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa
3841
+ 2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2
3842
+ xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5
3843
+ -----END CERTIFICATE-----
3844
+
3845
+ Amazon Root CA 2
3846
+ ================
3847
+ -----BEGIN CERTIFICATE-----
3848
+ MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD
3849
+ VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1
3850
+ MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv
3851
+ bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
3852
+ ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4
3853
+ kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp
3854
+ N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9
3855
+ AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd
3856
+ fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx
3857
+ kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS
3858
+ btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0
3859
+ Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN
3860
+ c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+
3861
+ 3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw
3862
+ DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA
3863
+ A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY
3864
+ +gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE
3865
+ YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW
3866
+ xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ
3867
+ gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW
3868
+ aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV
3869
+ Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3
3870
+ KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi
3871
+ JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw=
3872
+ -----END CERTIFICATE-----
3873
+
3874
+ Amazon Root CA 3
3875
+ ================
3876
+ -----BEGIN CERTIFICATE-----
3877
+ MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG
3878
+ EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy
3879
+ NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ
3880
+ MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB
3881
+ f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr
3882
+ Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43
3883
+ rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc
3884
+ eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw==
3885
+ -----END CERTIFICATE-----
3886
+
3887
+ Amazon Root CA 4
3888
+ ================
3889
+ -----BEGIN CERTIFICATE-----
3890
+ MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG
3891
+ EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy
3892
+ NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ
3893
+ MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN
3894
+ /sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri
3895
+ 83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
3896
+ HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA
3897
+ MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1
3898
+ AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA==
3899
+ -----END CERTIFICATE-----
3900
+
3901
+ LuxTrust Global Root 2
3902
+ ======================
3903
+ -----BEGIN CERTIFICATE-----
3904
+ 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
3930
+ -----END CERTIFICATE-----
3931
+
3932
+ TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1
3933
+ =============================================
3934
+ -----BEGIN CERTIFICATE-----
3935
+ MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT
3936
+ D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr
3937
+ IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g
3938
+ TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp
3939
+ ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD
3940
+ VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt
3941
+ c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth
3942
+ bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11
3943
+ IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
3944
+ MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8
3945
+ 6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc
3946
+ wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0
3947
+ 3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9
3948
+ WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU
3949
+ ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ
3950
+ KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh
3951
+ AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc
3952
+ lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R
3953
+ e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j
3954
+ q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM=
3955
+ -----END CERTIFICATE-----
classes/iowddb.php ADDED
@@ -0,0 +1,103 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if (!defined('ABSPATH')) {
4
+ exit;
5
+ }
6
+ require_once IOWD_DIR_CLASSES . "/iowddb_class.php";
7
+
8
+ class IOWDDB extends IOWDDB_Class
9
+ {
10
+
11
+ public function create_iowd_images_table()
12
+ {
13
+ $fields = array(
14
+ array(
15
+ "field_name" => "`id`",
16
+ "field_type" => "int(16)",
17
+ "null" => "not null",
18
+ "ai" => 1,
19
+ ),
20
+ array(
21
+ "field_name" => "`post_id`",
22
+ "field_type" => "varchar(256)",
23
+ "null" => "not null",
24
+ "ai" => 0,
25
+ ),
26
+
27
+ array(
28
+ "field_name" => "`size`",
29
+ "field_type" => "varchar(256)",
30
+ "null" => "not null",
31
+ "ai" => 0,
32
+ ),
33
+ array(
34
+ "field_name" => "`path`",
35
+ "field_type" => "varchar(256)",
36
+ "null" => "not null",
37
+ "ai" => 0,
38
+ ),
39
+ array(
40
+ "field_name" => "`image_size`",
41
+ "field_type" => "int(16)",
42
+ "null" => "not null",
43
+ "ai" => 0,
44
+ ),
45
+ array(
46
+ "field_name" => "`image_orig_size`",
47
+ "field_type" => "int(16)",
48
+ "null" => "not null",
49
+ "ai" => 0,
50
+ ),
51
+ array(
52
+ "field_name" => "`updated_date`",
53
+ "field_type" => "datetime",
54
+ "null" => "not null",
55
+ "ai" => 0,
56
+ ),
57
+ array(
58
+ "field_name" => "`status`",
59
+ "field_type" => "varchar(256)",
60
+ "null" => "not null",
61
+ "ai" => 0,
62
+ ),
63
+ array(
64
+ "field_name" => "`media`",
65
+ "field_type" => "int(16)",
66
+ "null" => "not null",
67
+ "ai" => 0,
68
+ ),
69
+ array(
70
+ "field_name" => "`already_optimized`",
71
+ "field_type" => "varchar(256)",
72
+ "null" => "not null",
73
+ "ai" => 0,
74
+ ),
75
+ array(
76
+ "field_name" => "`converted`",
77
+ "field_type" => "int(16)",
78
+ "null" => "not null",
79
+ "ai" => 0,
80
+ ),
81
+ array(
82
+ "field_name" => "`resized`",
83
+ "field_type" => "int(16)",
84
+ "null" => "not null",
85
+ "ai" => 0,
86
+ ),
87
+ array(
88
+ "field_name" => "`deleted`",
89
+ "field_type" => "int(16)",
90
+ "null" => "not null",
91
+ "ai" => 0,
92
+ ),
93
+
94
+ );
95
+
96
+ $this->create_table("iowd_images", $fields);
97
+ }
98
+
99
+
100
+ }
101
+
102
+
103
+
classes/iowddb_class.php ADDED
@@ -0,0 +1,93 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if (!defined('ABSPATH')) {
4
+ exit;
5
+ }
6
+
7
+ class IOWDDB_Class
8
+ {
9
+ public $errors = array();
10
+ private $table_name;
11
+
12
+
13
+ /**
14
+ * function for create table
15
+ *
16
+ * @param string $table_name
17
+ * @param array $fields array( 0=> array("field_name" => "name", "field_type" => "type", "null" => "NOT NULL", "ai" => "0"))
18
+ * @param string $primary_key
19
+ *
20
+ * @return void
21
+ */
22
+ public function create_table($table_name, $fields = array(), $primary_key = "id")
23
+ {
24
+ global $wpdb;
25
+ $query_str = array();
26
+ foreach ($fields as $field) {
27
+ $single_field = $field["field_name"] . " " . $field["field_type"] . " " . $field["null"];
28
+ if ($field["ai"] == 1) {
29
+ $single_field .= " AUTO_INCREMENT";
30
+ }
31
+ $query_str[] = $single_field;
32
+ }
33
+
34
+ $fields = implode(",", $query_str);
35
+
36
+ $query = "CREATE TABLE IF NOT EXISTS `" . $wpdb->prefix . $table_name . "` (
37
+ " . $fields . ",
38
+ PRIMARY KEY (`" . $primary_key . "`)
39
+ ) DEFAULT CHARSET=utf8;";
40
+
41
+ $wpdb->query($query);
42
+ if ($wpdb->last_error) {
43
+ array_push($this->errors, $wpdb->last_error);
44
+ }
45
+ }
46
+
47
+
48
+ /**
49
+ * function for getting single row by field name
50
+ *
51
+ * @param array $values = array("field_name" => field_value, ..)
52
+ * @param string $compare
53
+ * @param string $operator
54
+ *
55
+ * @return object
56
+ */
57
+
58
+ public function get_row_by_field($values = array(), $compare = "=", $operator = "and")
59
+ {
60
+ $row = false;
61
+ global $wpdb;
62
+ if ($this->table_name) {
63
+ $where = array();
64
+ if ($values) {
65
+ foreach ($values as $key => $val) {
66
+ $where[] = $key . $compare . "'" . $val . "'";
67
+ }
68
+ }
69
+ $where = count($where) > 0 ? " WHERE " . implode(" " . $operator . " ", $where) : "";
70
+ $query = "SELECT * FROM " . $wpdb->prefix . $this->table_name . $where;
71
+
72
+ $row = $wpdb->get_row($query);
73
+ }
74
+
75
+ return $row;
76
+ }
77
+
78
+ /**
79
+ * function for setting table name
80
+ *
81
+ * @param string $table_name
82
+ *
83
+ * @return void
84
+ */
85
+ public function set_table_name($table_name)
86
+ {
87
+ $this->table_name = $table_name;
88
+ }
89
+
90
+ }
91
+
92
+
93
+
classes/iowdimage.php ADDED
@@ -0,0 +1,183 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if (!defined('ABSPATH')) {
4
+ exit;
5
+ }
6
+
7
+ class IOWDImage
8
+ {
9
+
10
+ private $image = null;
11
+ private $image_path = null;
12
+ private $image_full_path = null;
13
+ private $mime_type = null;
14
+ private $image_name = null;
15
+ private $width = null;
16
+ private $height = null;
17
+
18
+ /**
19
+ * function for setting image path
20
+ *
21
+ * @param string $image_path
22
+ *
23
+ * @return void
24
+ */
25
+ public function load_image($image_path)
26
+ {
27
+
28
+ $this->image_full_path = $image_path;
29
+ $this->mime_type = pathinfo($image_path, PATHINFO_EXTENSION);
30
+
31
+ $this->image_path = str_replace(basename($image_path), "", $image_path);
32
+ $this->image_name = str_replace("." . $this->mime_type, "", basename($image_path));
33
+
34
+
35
+ list($img_width, $img_height) = @getimagesize(htmlspecialchars_decode($image_path, ENT_COMPAT | ENT_QUOTES));
36
+
37
+ $this->width = $img_width;
38
+ $this->height = $img_height;
39
+
40
+ switch ($this->mime_type) {
41
+ case "jpg" :
42
+ case "jpeg" :
43
+ $this->image = @imagecreatefromjpeg($image_path);
44
+ break;
45
+ case "png" :
46
+ $this->image = @imagecreatefrompng($image_path);
47
+ break;
48
+
49
+ case "gif" :
50
+ $this->image = @imagecreatefromgif($image_path);
51
+ break;
52
+ }
53
+ }
54
+
55
+ /**
56
+ * function for setting image path
57
+ *
58
+ * @return void
59
+ */
60
+ public function convert_to_png()
61
+ {
62
+ if ($this->image) {
63
+ imagepng($this->image, $this->image_path . $this->image_name . '.png');
64
+ @imagedestroy($this->image);
65
+ }
66
+
67
+ }
68
+
69
+ /**
70
+ * function for setting image path
71
+ *
72
+ * @return void
73
+ */
74
+ public function convert_to_jpg()
75
+ {
76
+ if ($this->image) {
77
+ $output = $this->image;
78
+
79
+ if ($this->mime_type == "png") {
80
+ list($width, $height) = getimagesize($this->image_full_path);
81
+ $output = imagecreatetruecolor($width, $height);
82
+ $white = imagecolorallocate($output, 255, 255, 255);
83
+ imagefilledrectangle($output, 0, 0, $width, $height, $white);
84
+ imagecopy($output, $this->image, 0, 0, 0, 0, $width, $height);
85
+ }
86
+
87
+ imagejpeg($output, $this->image_path . $this->image_name . '.jpg');
88
+ @imagedestroy($output);
89
+ }
90
+ }
91
+
92
+ /**
93
+ * function for setting image path
94
+ *
95
+ * @return void
96
+ */
97
+ public function convert_to_webp()
98
+ {
99
+ if ($this->image) {
100
+ $output = $this->image;
101
+
102
+ if ($this->mime_type == "png") {
103
+ list($width, $height) = getimagesize($this->image_full_path);
104
+ $output = imagecreatetruecolor($width, $height);
105
+ $white = imagecolorallocate($output, 255, 255, 255);
106
+ imagefilledrectangle($output, 0, 0, $width, $height, $white);
107
+ imagecopy($output, $this->image, 0, 0, 0, 0, $width, $height);
108
+ }
109
+ @imagewebp($output, $this->image_path . $this->image_name . '.webp');
110
+ @imagedestroy($output);
111
+ }
112
+ }
113
+
114
+ /**
115
+ * function for setting image path
116
+ *
117
+ * @param string $width
118
+ * @param string $height
119
+ *
120
+ * @return void
121
+ */
122
+ public function resize($width, $height)
123
+ {
124
+ $ratio = $this->width / $this->height;
125
+ $max_width = $width;
126
+ $max_height = $width / $ratio;
127
+
128
+ ini_set('memory_limit', '-1');
129
+
130
+ if (($this->width / $this->height) >= ($max_width / $max_height)) {
131
+ $new_width = $this->width / ($this->height / $max_height);
132
+ $new_height = $max_height;
133
+ } else {
134
+ $new_width = $max_width;
135
+ $new_height = $this->height / ($this->width / $max_width);
136
+ }
137
+
138
+ $dst_x = 0 - ($new_width - $max_width) / 2;
139
+ $dst_y = 0 - ($new_height - $max_height) / 2;
140
+
141
+ $new_img = @imagecreatetruecolor($max_width, $max_height);
142
+
143
+ switch ($this->mime_type) {
144
+ case "jpg":
145
+ case "jpeg":
146
+ $write_image = 'imagejpeg';
147
+ $image_quality = 75;
148
+ $extension = ".jpeg";
149
+ break;
150
+
151
+ case "gif":
152
+ @imagecolortransparent($new_img, @imagecolorallocate($new_img, 0, 0, 0));
153
+ $write_image = 'imagegif';
154
+ $image_quality = null;
155
+ $extension = ".gif";
156
+ break;
157
+
158
+ case "png":
159
+ @imagecolortransparent($new_img, @imagecolorallocate($new_img, 0, 0, 0));
160
+ @imagealphablending($new_img, false);
161
+ @imagesavealpha($new_img, true);
162
+ $write_image = 'imagepng';
163
+ $image_quality = 9;
164
+ $extension = ".png";
165
+ break;
166
+
167
+
168
+ }
169
+ $success = $this->image && @imagecopyresampled($new_img, $this->image, $dst_x, $dst_y, 0, 0, $new_width, $new_height, $this->width, $this->height) && $write_image($new_img, $this->image_full_path, $image_quality);
170
+
171
+ // Free up memory (imagedestroy does not delete files):
172
+ @imagedestroy($this->image);
173
+ @imagedestroy($new_img);
174
+ ini_restore('memory_limit');
175
+
176
+ }
177
+
178
+
179
+
180
+ }
181
+
182
+
183
+
composer.json ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "require": {
3
+
4
+ "aannnaa7/aws-sdk-php-minimized": "dev-master",
5
+ "wyrihaximus/react-guzzle-psr7": "^2.0"
6
+ },
7
+ "config": {
8
+ "preferred-install": "dist"
9
+ }
10
+
11
+ }
12
+
13
+
composer.lock ADDED
@@ -0,0 +1,1181 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "_readme": [
3
+ "This file locks the dependencies of your project to a known state",
4
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
5
+ "This file is @generated automatically"
6
+ ],
7
+ "hash": "c075045db9e0aa65d11e300b502a12ea",
8
+ "content-hash": "f780e41ceab8da74f86ee7466feb6eed",
9
+ "packages": [
10
+ {
11
+ "name": "aannnaa7/aws-sdk-php-minimized",
12
+ "version": "dev-master",
13
+ "source": {
14
+ "type": "git",
15
+ "url": "https://github.com/aannnaa7/aws-sdk-php.git",
16
+ "reference": "cad6966faac81f79e6afec39c2ebf806b9dfeba7"
17
+ },
18
+ "dist": {
19
+ "type": "zip",
20
+ "url": "https://api.github.com/repos/aannnaa7/aws-sdk-php/zipball/cad6966faac81f79e6afec39c2ebf806b9dfeba7",
21
+ "reference": "cad6966faac81f79e6afec39c2ebf806b9dfeba7",
22
+ "shasum": ""
23
+ },
24
+ "require": {
25
+ "guzzlehttp/guzzle": "~5.3|~6.0.1|~6.1",
26
+ "guzzlehttp/promises": "~1.0",
27
+ "guzzlehttp/psr7": "~1.0",
28
+ "mtdowling/jmespath.php": "~2.2",
29
+ "php": ">=5.5"
30
+ },
31
+ "require-dev": {
32
+ "andrewsville/php-token-reflection": "^1.4",
33
+ "aws/aws-php-sns-message-validator": "~1.0",
34
+ "behat/behat": "~3.0",
35
+ "doctrine/cache": "~1.4",
36
+ "ext-dom": "*",
37
+ "ext-json": "*",
38
+ "ext-openssl": "*",
39
+ "ext-pcre": "*",
40
+ "ext-simplexml": "*",
41
+ "ext-spl": "*",
42
+ "nette/neon": "^2.3",
43
+ "phpunit/phpunit": "~4.0"
44
+ },
45
+ "suggest": {
46
+ "doctrine/cache": "To use the DoctrineCacheAdapter",
47
+ "ext-curl": "To send requests using cURL",
48
+ "ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages"
49
+ },
50
+ "type": "library",
51
+ "extra": {
52
+ "branch-alias": {
53
+ "dev-master": "3.0-dev"
54
+ }
55
+ },
56
+ "autoload": {
57
+ "psr-4": {
58
+ "Aws\\": "src/"
59
+ },
60
+ "files": [
61
+ "src/functions.php"
62
+ ]
63
+ },
64
+ "notification-url": "https://packagist.org/downloads/",
65
+ "license": [
66
+ "Apache-2.0"
67
+ ],
68
+ "description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project private use only",
69
+ "homepage": "http://aws.amazon.com/sdkforphp",
70
+ "keywords": [
71
+ "amazon",
72
+ "aws",
73
+ "cloud",
74
+ "dynamodb",
75
+ "ec2",
76
+ "glacier",
77
+ "s3",
78
+ "sdk"
79
+ ],
80
+ "time": "2017-07-04 11:16:05"
81
+ },
82
+ {
83
+ "name": "clue/buzz-react",
84
+ "version": "v1.1.0",
85
+ "source": {
86
+ "type": "git",
87
+ "url": "https://github.com/clue/php-buzz-react.git",
88
+ "reference": "693c96d35f0cd0e4f0e1a51b976433a91792eff9"
89
+ },
90
+ "dist": {
91
+ "type": "zip",
92
+ "url": "https://api.github.com/repos/clue/php-buzz-react/zipball/693c96d35f0cd0e4f0e1a51b976433a91792eff9",
93
+ "reference": "693c96d35f0cd0e4f0e1a51b976433a91792eff9",
94
+ "shasum": ""
95
+ },
96
+ "require": {
97
+ "php": ">=5.3",
98
+ "psr/http-message": "^1.0",
99
+ "react/dns": "^0.4.1 || ^0.3",
100
+ "react/event-loop": "^0.4 || ^0.3",
101
+ "react/http-client": "^0.4 || ^0.3",
102
+ "react/promise": "^2 || ^1.1",
103
+ "react/socket-client": "^0.5 || ^0.4.5",
104
+ "react/stream": "^0.4 || ^0.3.1",
105
+ "ringcentral/psr7": "^1.2"
106
+ },
107
+ "require-dev": {
108
+ "clue/block-react": "^1.0",
109
+ "phpunit/phpunit": "^4.5"
110
+ },
111
+ "type": "library",
112
+ "autoload": {
113
+ "psr-4": {
114
+ "Clue\\React\\Buzz\\": "src/"
115
+ }
116
+ },
117
+ "notification-url": "https://packagist.org/downloads/",
118
+ "license": [
119
+ "MIT"
120
+ ],
121
+ "authors": [
122
+ {
123
+ "name": "Christian Lück",
124
+ "email": "christian@lueck.tv"
125
+ }
126
+ ],
127
+ "description": "Simple, async HTTP client for concurrently processing any number of HTTP requests, built on top of React PHP",
128
+ "homepage": "https://github.com/clue/php-buzz-react",
129
+ "keywords": [
130
+ "async",
131
+ "http",
132
+ "http client",
133
+ "reactphp"
134
+ ],
135
+ "time": "2016-10-21 10:29:37"
136
+ },
137
+ {
138
+ "name": "clue/http-proxy-react",
139
+ "version": "v0.1.0",
140
+ "source": {
141
+ "type": "git",
142
+ "url": "https://github.com/clue/php-http-proxy-react.git",
143
+ "reference": "c4098cbe6f5b22812c31b550dfd8c9038ac0064c"
144
+ },
145
+ "dist": {
146
+ "type": "zip",
147
+ "url": "https://api.github.com/repos/clue/php-http-proxy-react/zipball/c4098cbe6f5b22812c31b550dfd8c9038ac0064c",
148
+ "reference": "c4098cbe6f5b22812c31b550dfd8c9038ac0064c",
149
+ "shasum": ""
150
+ },
151
+ "require": {
152
+ "php": ">=5.3",
153
+ "react/event-loop": "^0.4 || ^0.3",
154
+ "react/promise": " ^2.1 || ^1.2",
155
+ "react/socket-client": "^0.5 || ^0.4 || ^0.3",
156
+ "react/stream": "^0.4 || ^0.3",
157
+ "ringcentral/psr7": "^1.2"
158
+ },
159
+ "require-dev": {
160
+ "clue/block-react": "^1.1",
161
+ "react/socket-client": "^0.5"
162
+ },
163
+ "type": "library",
164
+ "autoload": {
165
+ "psr-4": {
166
+ "Clue\\React\\HttpProxy\\": "src/"
167
+ }
168
+ },
169
+ "notification-url": "https://packagist.org/downloads/",
170
+ "license": [
171
+ "MIT"
172
+ ],
173
+ "authors": [
174
+ {
175
+ "name": "Christian Lück",
176
+ "email": "christian@lueck.tv"
177
+ }
178
+ ],
179
+ "description": "Async HTTP CONNECT proxy connector, use any TCP/IP protocol through an HTTP proxy server, built on top of React PHP",
180
+ "homepage": "https://github.com/clue/php-http-proxy-react",
181
+ "keywords": [
182
+ "async",
183
+ "connect",
184
+ "http",
185
+ "proxy",
186
+ "reactphp"
187
+ ],
188
+ "time": "2016-11-01 19:25:52"
189
+ },
190
+ {
191
+ "name": "clue/socks-react",
192
+ "version": "v0.4.0",
193
+ "source": {
194
+ "type": "git",
195
+ "url": "https://github.com/clue/php-socks-react.git",
196
+ "reference": "ad36da8c0a59493842023a55b54cbf0f7f204085"
197
+ },
198
+ "dist": {
199
+ "type": "zip",
200
+ "url": "https://api.github.com/repos/clue/php-socks-react/zipball/ad36da8c0a59493842023a55b54cbf0f7f204085",
201
+ "reference": "ad36da8c0a59493842023a55b54cbf0f7f204085",
202
+ "shasum": ""
203
+ },
204
+ "require": {
205
+ "evenement/evenement": "~1.0|~2.0",
206
+ "php": ">=5.3",
207
+ "react/dns": "0.3.*|0.4.*",
208
+ "react/event-loop": "0.3.*|0.4.*",
209
+ "react/promise": "~1.0|~2.0",
210
+ "react/socket": "0.3.*|0.4.*",
211
+ "react/socket-client": "^0.5",
212
+ "react/stream": "0.3.*|0.4.*"
213
+ },
214
+ "type": "library",
215
+ "autoload": {
216
+ "psr-4": {
217
+ "Clue\\React\\Socks\\": "src"
218
+ }
219
+ },
220
+ "notification-url": "https://packagist.org/downloads/",
221
+ "license": [
222
+ "MIT"
223
+ ],
224
+ "authors": [
225
+ {
226
+ "name": "Christian Lück",
227
+ "email": "christian@lueck.tv"
228
+ }
229
+ ],
230
+ "description": "Async SOCKS proxy client and server (SOCKS4, SOCKS4a and SOCKS5)",
231
+ "homepage": "https://github.com/clue/php-socks-react",
232
+ "keywords": [
233
+ "async",
234
+ "react",
235
+ "socks client",
236
+ "socks protocol",
237
+ "socks server",
238
+ "tcp tunnel"
239
+ ],
240
+ "time": "2016-03-19 16:55:13"
241
+ },
242
+ {
243
+ "name": "evenement/evenement",
244
+ "version": "v2.1.0",
245
+ "source": {
246
+ "type": "git",
247
+ "url": "https://github.com/igorw/evenement.git",
248
+ "reference": "6ba9a777870ab49f417e703229d53931ed40fd7a"
249
+ },
250
+ "dist": {
251
+ "type": "zip",
252
+ "url": "https://api.github.com/repos/igorw/evenement/zipball/6ba9a777870ab49f417e703229d53931ed40fd7a",
253
+ "reference": "6ba9a777870ab49f417e703229d53931ed40fd7a",
254
+ "shasum": ""
255
+ },
256
+ "require": {
257
+ "php": ">=5.4.0"
258
+ },
259
+ "require-dev": {
260
+ "phpunit/phpunit": "^6.0||^5.7||^4.8.35"
261
+ },
262
+ "type": "library",
263
+ "extra": {
264
+ "branch-alias": {
265
+ "dev-master": "2.0-dev"
266
+ }
267
+ },
268
+ "autoload": {
269
+ "psr-0": {
270
+ "Evenement": "src"
271
+ }
272
+ },
273
+ "notification-url": "https://packagist.org/downloads/",
274
+ "license": [
275
+ "MIT"
276
+ ],
277
+ "authors": [
278
+ {
279
+ "name": "Igor Wiedler",
280
+ "email": "igor@wiedler.ch"
281
+ }
282
+ ],
283
+ "description": "Événement is a very simple event dispatching library for PHP",
284
+ "keywords": [
285
+ "event-dispatcher",
286
+ "event-emitter"
287
+ ],
288
+ "time": "2017-07-17 17:39:19"
289
+ },
290
+ {
291
+ "name": "guzzlehttp/guzzle",
292
+ "version": "6.3.0",
293
+ "source": {
294
+ "type": "git",
295
+ "url": "https://github.com/guzzle/guzzle.git",
296
+ "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699"
297
+ },
298
+ "dist": {
299
+ "type": "zip",
300
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/f4db5a78a5ea468d4831de7f0bf9d9415e348699",
301
+ "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699",
302
+ "shasum": ""
303
+ },
304
+ "require": {
305
+ "guzzlehttp/promises": "^1.0",
306
+ "guzzlehttp/psr7": "^1.4",
307
+ "php": ">=5.5"
308
+ },
309
+ "require-dev": {
310
+ "ext-curl": "*",
311
+ "phpunit/phpunit": "^4.0 || ^5.0",
312
+ "psr/log": "^1.0"
313
+ },
314
+ "suggest": {
315
+ "psr/log": "Required for using the Log middleware"
316
+ },
317
+ "type": "library",
318
+ "extra": {
319
+ "branch-alias": {
320
+ "dev-master": "6.2-dev"
321
+ }
322
+ },
323
+ "autoload": {
324
+ "files": [
325
+ "src/functions_include.php"
326
+ ],
327
+ "psr-4": {
328
+ "GuzzleHttp\\": "src/"
329
+ }
330
+ },
331
+ "notification-url": "https://packagist.org/downloads/",
332
+ "license": [
333
+ "MIT"
334
+ ],
335
+ "authors": [
336
+ {
337
+ "name": "Michael Dowling",
338
+ "email": "mtdowling@gmail.com",
339
+ "homepage": "https://github.com/mtdowling"
340
+ }
341
+ ],
342
+ "description": "Guzzle is a PHP HTTP client library",
343
+ "homepage": "http://guzzlephp.org/",
344
+ "keywords": [
345
+ "client",
346
+ "curl",
347
+ "framework",
348
+ "http",
349
+ "http client",
350
+ "rest",
351
+ "web service"
352
+ ],
353
+ "time": "2017-06-22 18:50:49"
354
+ },
355
+ {
356
+ "name": "guzzlehttp/promises",
357
+ "version": "v1.3.1",
358
+ "source": {
359
+ "type": "git",
360
+ "url": "https://github.com/guzzle/promises.git",
361
+ "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646"
362
+ },
363
+ "dist": {
364
+ "type": "zip",
365
+ "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646",
366
+ "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646",
367
+ "shasum": ""
368
+ },
369
+ "require": {
370
+ "php": ">=5.5.0"
371
+ },
372
+ "require-dev": {
373
+ "phpunit/phpunit": "^4.0"
374
+ },
375
+ "type": "library",
376
+ "extra": {
377
+ "branch-alias": {
378
+ "dev-master": "1.4-dev"
379
+ }
380
+ },
381
+ "autoload": {
382
+ "psr-4": {
383
+ "GuzzleHttp\\Promise\\": "src/"
384
+ },
385
+ "files": [
386
+ "src/functions_include.php"
387
+ ]
388
+ },
389
+ "notification-url": "https://packagist.org/downloads/",
390
+ "license": [
391
+ "MIT"
392
+ ],
393
+ "authors": [
394
+ {
395
+ "name": "Michael Dowling",
396
+ "email": "mtdowling@gmail.com",
397
+ "homepage": "https://github.com/mtdowling"
398
+ }
399
+ ],
400
+ "description": "Guzzle promises library",
401
+ "keywords": [
402
+ "promise"
403
+ ],
404
+ "time": "2016-12-20 10:07:11"
405
+ },
406
+ {
407
+ "name": "guzzlehttp/psr7",
408
+ "version": "1.4.2",
409
+ "source": {
410
+ "type": "git",
411
+ "url": "https://github.com/guzzle/psr7.git",
412
+ "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c"
413
+ },
414
+ "dist": {
415
+ "type": "zip",
416
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/f5b8a8512e2b58b0071a7280e39f14f72e05d87c",
417
+ "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c",
418
+ "shasum": ""
419
+ },
420
+ "require": {
421
+ "php": ">=5.4.0",
422
+ "psr/http-message": "~1.0"
423
+ },
424
+ "provide": {
425
+ "psr/http-message-implementation": "1.0"
426
+ },
427
+ "require-dev": {
428
+ "phpunit/phpunit": "~4.0"
429
+ },
430
+ "type": "library",
431
+ "extra": {
432
+ "branch-alias": {
433
+ "dev-master": "1.4-dev"
434
+ }
435
+ },
436
+ "autoload": {
437
+ "psr-4": {
438
+ "GuzzleHttp\\Psr7\\": "src/"
439
+ },
440
+ "files": [
441
+ "src/functions_include.php"
442
+ ]
443
+ },
444
+ "notification-url": "https://packagist.org/downloads/",
445
+ "license": [
446
+ "MIT"
447
+ ],
448
+ "authors": [
449
+ {
450
+ "name": "Michael Dowling",
451
+ "email": "mtdowling@gmail.com",
452
+ "homepage": "https://github.com/mtdowling"
453
+ },
454
+ {
455
+ "name": "Tobias Schultze",
456
+ "homepage": "https://github.com/Tobion"
457
+ }
458
+ ],
459
+ "description": "PSR-7 message implementation that also provides common utility methods",
460
+ "keywords": [
461
+ "http",
462
+ "message",
463
+ "request",
464
+ "response",
465
+ "stream",
466
+ "uri",
467
+ "url"
468
+ ],
469
+ "time": "2017-03-20 17:10:46"
470
+ },
471
+ {
472
+ "name": "mtdowling/jmespath.php",
473
+ "version": "2.4.0",
474
+ "source": {
475
+ "type": "git",
476
+ "url": "https://github.com/jmespath/jmespath.php.git",
477
+ "reference": "adcc9531682cf87dfda21e1fd5d0e7a41d292fac"
478
+ },
479
+ "dist": {
480
+ "type": "zip",
481
+ "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/adcc9531682cf87dfda21e1fd5d0e7a41d292fac",
482
+ "reference": "adcc9531682cf87dfda21e1fd5d0e7a41d292fac",
483
+ "shasum": ""
484
+ },
485
+ "require": {
486
+ "php": ">=5.4.0"
487
+ },
488
+ "require-dev": {
489
+ "phpunit/phpunit": "~4.0"
490
+ },
491
+ "bin": [
492
+ "bin/jp.php"
493
+ ],
494
+ "type": "library",
495
+ "extra": {
496
+ "branch-alias": {
497
+ "dev-master": "2.0-dev"
498
+ }
499
+ },
500
+ "autoload": {
501
+ "psr-4": {
502
+ "JmesPath\\": "src/"
503
+ },
504
+ "files": [
505
+ "src/JmesPath.php"
506
+ ]
507
+ },
508
+ "notification-url": "https://packagist.org/downloads/",
509
+ "license": [
510
+ "MIT"
511
+ ],
512
+ "authors": [
513
+ {
514
+ "name": "Michael Dowling",
515
+ "email": "mtdowling@gmail.com",
516
+ "homepage": "https://github.com/mtdowling"
517
+ }
518
+ ],
519
+ "description": "Declaratively specify how to extract elements from a JSON document",
520
+ "keywords": [
521
+ "json",
522
+ "jsonpath"
523
+ ],
524
+ "time": "2016-12-03 22:08:25"
525
+ },
526
+ {
527
+ "name": "psr/http-message",
528
+ "version": "1.0.1",
529
+ "source": {
530
+ "type": "git",
531
+ "url": "https://github.com/php-fig/http-message.git",
532
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
533
+ },
534
+ "dist": {
535
+ "type": "zip",
536
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
537
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
538
+ "shasum": ""
539
+ },
540
+ "require": {
541
+ "php": ">=5.3.0"
542
+ },
543
+ "type": "library",
544
+ "extra": {
545
+ "branch-alias": {
546
+ "dev-master": "1.0.x-dev"
547
+ }
548
+ },
549
+ "autoload": {
550
+ "psr-4": {
551
+ "Psr\\Http\\Message\\": "src/"
552
+ }
553
+ },
554
+ "notification-url": "https://packagist.org/downloads/",
555
+ "license": [
556
+ "MIT"
557
+ ],
558
+ "authors": [
559
+ {
560
+ "name": "PHP-FIG",
561
+ "homepage": "http://www.php-fig.org/"
562
+ }
563
+ ],
564
+ "description": "Common interface for HTTP messages",
565
+ "homepage": "https://github.com/php-fig/http-message",
566
+ "keywords": [
567
+ "http",
568
+ "http-message",
569
+ "psr",
570
+ "psr-7",
571
+ "request",
572
+ "response"
573
+ ],
574
+ "time": "2016-08-06 14:39:51"
575
+ },
576
+ {
577
+ "name": "react/cache",
578
+ "version": "v0.4.1",
579
+ "source": {
580
+ "type": "git",
581
+ "url": "https://github.com/reactphp/cache.git",
582
+ "reference": "558f614891341b1d817a8cdf9a358948ec49638f"
583
+ },
584
+ "dist": {
585
+ "type": "zip",
586
+ "url": "https://api.github.com/repos/reactphp/cache/zipball/558f614891341b1d817a8cdf9a358948ec49638f",
587
+ "reference": "558f614891341b1d817a8cdf9a358948ec49638f",
588
+ "shasum": ""
589
+ },
590
+ "require": {
591
+ "php": ">=5.3.0",
592
+ "react/promise": "~2.0|~1.1"
593
+ },
594
+ "type": "library",
595
+ "autoload": {
596
+ "psr-4": {
597
+ "React\\Cache\\": "src\\"
598
+ }
599
+ },
600
+ "notification-url": "https://packagist.org/downloads/",
601
+ "license": [
602
+ "MIT"
603
+ ],
604
+ "description": "Async caching.",
605
+ "keywords": [
606
+ "cache"
607
+ ],
608
+ "time": "2016-02-25 18:17:16"
609
+ },
610
+ {
611
+ "name": "react/dns",
612
+ "version": "v0.4.10",
613
+ "source": {
614
+ "type": "git",
615
+ "url": "https://github.com/reactphp/dns.git",
616
+ "reference": "457fbc43c04e9612573a24245d950c091c0fc40e"
617
+ },
618
+ "dist": {
619
+ "type": "zip",
620
+ "url": "https://api.github.com/repos/reactphp/dns/zipball/457fbc43c04e9612573a24245d950c091c0fc40e",
621
+ "reference": "457fbc43c04e9612573a24245d950c091c0fc40e",
622
+ "shasum": ""
623
+ },
624
+ "require": {
625
+ "php": ">=5.3.0",
626
+ "react/cache": "~0.4.0|~0.3.0",
627
+ "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5",
628
+ "react/promise": "^2.1 || ^1.2.1",
629
+ "react/promise-timer": "^1.2",
630
+ "react/socket": "^1.0 || ^0.8 || ^0.7 || ^0.6 || ^0.5 || ^0.4.4",
631
+ "react/stream": "^1.0 || ^0.7 || ^0.6 || ^0.5 || ^0.4.5"
632
+ },
633
+ "require-dev": {
634
+ "clue/block-react": "^1.2",
635
+ "phpunit/phpunit": "^5.0 || ^4.8.10"
636
+ },
637
+ "type": "library",
638
+ "autoload": {
639
+ "psr-4": {
640
+ "React\\Dns\\": "src"
641
+ }
642
+ },
643
+ "notification-url": "https://packagist.org/downloads/",
644
+ "license": [
645
+ "MIT"
646
+ ],
647
+ "description": "Async DNS resolver for ReactPHP",
648
+ "keywords": [
649
+ "async",
650
+ "dns",
651
+ "dns-resolver",
652
+ "reactphp"
653
+ ],
654
+ "time": "2017-08-10 12:31:41"
655
+ },
656
+ {
657
+ "name": "react/event-loop",
658
+ "version": "v0.4.3",
659
+ "source": {
660
+ "type": "git",
661
+ "url": "https://github.com/reactphp/event-loop.git",
662
+ "reference": "8bde03488ee897dc6bb3d91e4e17c353f9c5252f"
663
+ },
664
+ "dist": {
665
+ "type": "zip",
666
+ "url": "https://api.github.com/repos/reactphp/event-loop/zipball/8bde03488ee897dc6bb3d91e4e17c353f9c5252f",
667
+ "reference": "8bde03488ee897dc6bb3d91e4e17c353f9c5252f",
668
+ "shasum": ""
669
+ },
670
+ "require": {
671
+ "php": ">=5.4.0"
672
+ },
673
+ "require-dev": {
674
+ "phpunit/phpunit": "~4.8"
675
+ },
676
+ "suggest": {
677
+ "ext-event": "~1.0",
678
+ "ext-libev": "*",
679
+ "ext-libevent": ">=0.1.0"
680
+ },
681
+ "type": "library",
682
+ "autoload": {
683
+ "psr-4": {
684
+ "React\\EventLoop\\": "src"
685
+ }
686
+ },
687
+ "notification-url": "https://packagist.org/downloads/",
688
+ "license": [
689
+ "MIT"
690
+ ],
691
+ "description": "Event loop abstraction layer that libraries can use for evented I/O.",
692
+ "keywords": [
693
+ "asynchronous",
694
+ "event-loop"
695
+ ],
696
+ "time": "2017-04-27 10:56:23"
697
+ },
698
+ {
699
+ "name": "react/http-client",
700
+ "version": "v0.4.17",
701
+ "source": {
702
+ "type": "git",
703
+ "url": "https://github.com/reactphp/http-client.git",
704
+ "reference": "75ee8a113f156834aaabfe0055e8db531cb4892c"
705
+ },
706
+ "dist": {
707
+ "type": "zip",
708
+ "url": "https://api.github.com/repos/reactphp/http-client/zipball/75ee8a113f156834aaabfe0055e8db531cb4892c",
709
+ "reference": "75ee8a113f156834aaabfe0055e8db531cb4892c",
710
+ "shasum": ""
711
+ },
712
+ "require": {
713
+ "evenement/evenement": "~2.0",
714
+ "guzzlehttp/psr7": "^1.0",
715
+ "php": ">=5.4.0",
716
+ "react/dns": "0.4.*",
717
+ "react/event-loop": "0.4.*",
718
+ "react/promise": "~2.2",
719
+ "react/socket-client": "^0.5 || ^0.4 || ^0.3",
720
+ "react/stream": "0.4.*"
721
+ },
722
+ "require-dev": {
723
+ "phpunit/phpunit": "^5.0 || ^4.8.10"
724
+ },
725
+ "type": "library",
726
+ "autoload": {
727
+ "psr-4": {
728
+ "React\\HttpClient\\": "src"
729
+ }
730
+ },
731
+ "notification-url": "https://packagist.org/downloads/",
732
+ "license": [
733
+ "MIT"
734
+ ],
735
+ "description": "Asynchronous HTTP client library.",
736
+ "keywords": [
737
+ "http"
738
+ ],
739
+ "time": "2017-03-20 09:55:48"
740
+ },
741
+ {
742
+ "name": "react/promise",
743
+ "version": "v2.5.1",
744
+ "source": {
745
+ "type": "git",
746
+ "url": "https://github.com/reactphp/promise.git",
747
+ "reference": "62785ae604c8d69725d693eb370e1d67e94c4053"
748
+ },
749
+ "dist": {
750
+ "type": "zip",
751
+ "url": "https://api.github.com/repos/reactphp/promise/zipball/62785ae604c8d69725d693eb370e1d67e94c4053",
752
+ "reference": "62785ae604c8d69725d693eb370e1d67e94c4053",
753
+ "shasum": ""
754
+ },
755
+ "require": {
756
+ "php": ">=5.4.0"
757
+ },
758
+ "require-dev": {
759
+ "phpunit/phpunit": "~4.8"
760
+ },
761
+ "type": "library",
762
+ "autoload": {
763
+ "psr-4": {
764
+ "React\\Promise\\": "src/"
765
+ },
766
+ "files": [
767
+ "src/functions_include.php"
768
+ ]
769
+ },
770
+ "notification-url": "https://packagist.org/downloads/",
771
+ "license": [
772
+ "MIT"
773
+ ],
774
+ "authors": [
775
+ {
776
+ "name": "Jan Sorgalla",
777
+ "email": "jsorgalla@gmail.com"
778
+ }
779
+ ],
780
+ "description": "A lightweight implementation of CommonJS Promises/A for PHP",
781
+ "keywords": [
782
+ "promise",
783
+ "promises"
784
+ ],
785
+ "time": "2017-03-25 12:08:31"
786
+ },
787
+ {
788
+ "name": "react/promise-timer",
789
+ "version": "v1.2.0",
790
+ "source": {
791
+ "type": "git",
792
+ "url": "https://github.com/reactphp/promise-timer.git",
793
+ "reference": "3bc527fbd1201a193ab41c19b9a770d71a3514af"
794
+ },
795
+ "dist": {
796
+ "type": "zip",
797
+ "url": "https://api.github.com/repos/reactphp/promise-timer/zipball/3bc527fbd1201a193ab41c19b9a770d71a3514af",
798
+ "reference": "3bc527fbd1201a193ab41c19b9a770d71a3514af",
799
+ "shasum": ""
800
+ },
801
+ "require": {
802
+ "php": ">=5.3",
803
+ "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5",
804
+ "react/promise": "~2.1|~1.2"
805
+ },
806
+ "require-dev": {
807
+ "phpunit/phpunit": "^5.0 || ^4.8"
808
+ },
809
+ "type": "library",
810
+ "autoload": {
811
+ "psr-4": {
812
+ "React\\Promise\\Timer\\": "src/"
813
+ },
814
+ "files": [
815
+ "src/functions.php"
816
+ ]
817
+ },
818
+ "notification-url": "https://packagist.org/downloads/",
819
+ "license": [
820
+ "MIT"
821
+ ],
822
+ "authors": [
823
+ {
824
+ "name": "Christian Lück",
825
+ "email": "christian@lueck.tv"
826
+ }
827
+ ],
828
+ "description": "Trivial timeout implementation for Promises",
829
+ "homepage": "https://github.com/react/promise-timer",
830
+ "keywords": [
831
+ "async",
832
+ "event-loop",
833
+ "promise",
834
+ "reactphp",
835
+ "timeout",
836
+ "timer"
837
+ ],
838
+ "time": "2017-08-08 16:30:19"
839
+ },
840
+ {
841
+ "name": "react/socket",
842
+ "version": "v0.4.6",
843
+ "source": {
844
+ "type": "git",
845
+ "url": "https://github.com/reactphp/socket.git",
846
+ "reference": "cf074e53c974df52388ebd09710a9018894745d2"
847
+ },
848
+ "dist": {
849
+ "type": "zip",
850
+ "url": "https://api.github.com/repos/reactphp/socket/zipball/cf074e53c974df52388ebd09710a9018894745d2",
851
+ "reference": "cf074e53c974df52388ebd09710a9018894745d2",
852
+ "shasum": ""
853
+ },
854
+ "require": {
855
+ "evenement/evenement": "~2.0|~1.0",
856
+ "php": ">=5.3.0",
857
+ "react/event-loop": "0.4.*|0.3.*",
858
+ "react/promise": "^2.0 || ^1.1",
859
+ "react/stream": "^0.4.5"
860
+ },
861
+ "require-dev": {
862
+ "clue/block-react": "^1.1",
863
+ "phpunit/phpunit": "~4.8",
864
+ "react/socket-client": "^0.5.1"
865
+ },
866
+ "type": "library",
867
+ "autoload": {
868
+ "psr-4": {
869
+ "React\\Socket\\": "src"
870
+ }
871
+ },
872
+ "notification-url": "https://packagist.org/downloads/",
873
+ "license": [
874
+ "MIT"
875
+ ],
876
+ "description": "Async, streaming plaintext TCP/IP and secure TLS socket server for React PHP",
877
+ "keywords": [
878
+ "Socket"
879
+ ],
880
+ "time": "2017-01-26 09:23:38"
881
+ },
882
+ {
883
+ "name": "react/socket-client",
884
+ "version": "v0.5.3",
885
+ "source": {
886
+ "type": "git",
887
+ "url": "https://github.com/reactphp/socket-client.git",
888
+ "reference": "5570838d436f056695e9a5eaf01dd5f80386dd26"
889
+ },
890
+ "dist": {
891
+ "type": "zip",
892
+ "url": "https://api.github.com/repos/reactphp/socket-client/zipball/5570838d436f056695e9a5eaf01dd5f80386dd26",
893
+ "reference": "5570838d436f056695e9a5eaf01dd5f80386dd26",
894
+ "shasum": ""
895
+ },
896
+ "require": {
897
+ "php": ">=5.3.0",
898
+ "react/dns": "0.4.*|0.3.*",
899
+ "react/event-loop": "0.4.*|0.3.*",
900
+ "react/promise": "^2.1 || ^1.2",
901
+ "react/promise-timer": "~1.0",
902
+ "react/stream": "^0.4.5"
903
+ },
904
+ "require-dev": {
905
+ "clue/block-react": "^1.1"
906
+ },
907
+ "type": "library",
908
+ "autoload": {
909
+ "psr-4": {
910
+ "React\\SocketClient\\": "src"
911
+ }
912
+ },
913
+ "notification-url": "https://packagist.org/downloads/",
914
+ "license": [
915
+ "MIT"
916
+ ],
917
+ "description": "Async connector to open TCP/IP and SSL/TLS based connections.",
918
+ "keywords": [
919
+ "Socket"
920
+ ],
921
+ "time": "2016-12-24 11:19:15"
922
+ },
923
+ {
924
+ "name": "react/stream",
925
+ "version": "v0.4.6",
926
+ "source": {
927
+ "type": "git",
928
+ "url": "https://github.com/reactphp/stream.git",
929
+ "reference": "44dc7f51ea48624110136b535b9ba44fd7d0c1ee"
930
+ },
931
+ "dist": {
932
+ "type": "zip",
933
+ "url": "https://api.github.com/repos/reactphp/stream/zipball/44dc7f51ea48624110136b535b9ba44fd7d0c1ee",
934
+ "reference": "44dc7f51ea48624110136b535b9ba44fd7d0c1ee",
935
+ "shasum": ""
936
+ },
937
+ "require": {
938
+ "evenement/evenement": "^2.0|^1.0",
939
+ "php": ">=5.3.8"
940
+ },
941
+ "require-dev": {
942
+ "clue/stream-filter": "~1.2",
943
+ "react/event-loop": "^0.4|^0.3",
944
+ "react/promise": "^2.0|^1.0"
945
+ },
946
+ "suggest": {
947
+ "react/event-loop": "^0.4",
948
+ "react/promise": "^2.0"
949
+ },
950
+ "type": "library",
951
+ "autoload": {
952
+ "psr-4": {
953
+ "React\\Stream\\": "src"
954
+ }
955
+ },
956
+ "notification-url": "https://packagist.org/downloads/",
957
+ "license": [
958
+ "MIT"
959
+ ],
960
+ "description": "Basic readable and writable stream interfaces that support piping.",
961
+ "keywords": [
962
+ "pipe",
963
+ "stream"
964
+ ],
965
+ "time": "2017-01-25 14:44:14"
966
+ },
967
+ {
968
+ "name": "ringcentral/psr7",
969
+ "version": "1.2.1",
970
+ "source": {
971
+ "type": "git",
972
+ "url": "https://github.com/ringcentral/psr7.git",
973
+ "reference": "2594fb47cdc659f3fcf0aa1559b7355460555303"
974
+ },
975
+ "dist": {
976
+ "type": "zip",
977
+ "url": "https://api.github.com/repos/ringcentral/psr7/zipball/2594fb47cdc659f3fcf0aa1559b7355460555303",
978
+ "reference": "2594fb47cdc659f3fcf0aa1559b7355460555303",
979
+ "shasum": ""
980
+ },
981
+ "require": {
982
+ "php": ">=5.3",
983
+ "psr/http-message": "~1.0"
984
+ },
985
+ "provide": {
986
+ "psr/http-message-implementation": "1.0"
987
+ },
988
+ "require-dev": {
989
+ "phpunit/phpunit": "~4.0"
990
+ },
991
+ "type": "library",
992
+ "extra": {
993
+ "branch-alias": {
994
+ "dev-master": "1.0-dev"
995
+ }
996
+ },
997
+ "autoload": {
998
+ "psr-4": {
999
+ "RingCentral\\Psr7\\": "src/"
1000
+ },
1001
+ "files": [
1002
+ "src/functions_include.php"
1003
+ ]
1004
+ },
1005
+ "notification-url": "https://packagist.org/downloads/",
1006
+ "license": [
1007
+ "MIT"
1008
+ ],
1009
+ "authors": [
1010
+ {
1011
+ "name": "Michael Dowling",
1012
+ "email": "mtdowling@gmail.com",
1013
+ "homepage": "https://github.com/mtdowling"
1014
+ }
1015
+ ],
1016
+ "description": "PSR-7 message implementation",
1017
+ "keywords": [
1018
+ "http",
1019
+ "message",
1020
+ "stream",
1021
+ "uri"
1022
+ ],
1023
+ "time": "2016-03-25 17:36:49"
1024
+ },
1025
+ {
1026
+ "name": "wyrihaximus/react-guzzle-http-client",
1027
+ "version": "4.0.0",
1028
+ "source": {
1029
+ "type": "git",
1030
+ "url": "https://github.com/WyriHaximus/react-guzzle-http-client.git",
1031
+ "reference": "b487d7aaf3a7b928245b1d3719de4dff60af70a7"
1032
+ },
1033
+ "dist": {
1034
+ "type": "zip",
1035
+ "url": "https://api.github.com/repos/WyriHaximus/react-guzzle-http-client/zipball/b487d7aaf3a7b928245b1d3719de4dff60af70a7",
1036
+ "reference": "b487d7aaf3a7b928245b1d3719de4dff60af70a7",
1037
+ "shasum": ""
1038
+ },
1039
+ "require": {
1040
+ "clue/buzz-react": "^1.0",
1041
+ "clue/http-proxy-react": "^0.1.0",
1042
+ "clue/socks-react": "^0.4.0",
1043
+ "guzzlehttp/psr7": "^1.0",
1044
+ "php": "^5.4|^7.0",
1045
+ "psr/http-message": "^1.0",
1046
+ "react/dns": "^0.4.1",
1047
+ "react/http-client": "^0.4.9",
1048
+ "react/socket-client": "^0.5",
1049
+ "react/stream": "^0.4.2",
1050
+ "wyrihaximus/ticking-promise": "^1.6"
1051
+ },
1052
+ "require-dev": {
1053
+ "clue/block-react": "^1.1",
1054
+ "phake/phake": "~1.0.6",
1055
+ "phpunit/phpunit": "^5.0 || ^4.8",
1056
+ "squizlabs/php_codesniffer": "~1.5.0",
1057
+ "vectorface/dunit": "~2"
1058
+ },
1059
+ "type": "library",
1060
+ "autoload": {
1061
+ "psr-4": {
1062
+ "WyriHaximus\\React\\Guzzle\\HttpClient\\": "src/"
1063
+ }
1064
+ },
1065
+ "notification-url": "https://packagist.org/downloads/",
1066
+ "license": [
1067
+ "MIT"
1068
+ ],
1069
+ "authors": [
1070
+ {
1071
+ "name": "Cees-Jan Kiewiet",
1072
+ "email": "ceesjank@gmail.com",
1073
+ "homepage": "http://wyrihaximus.net/"
1074
+ }
1075
+ ],
1076
+ "description": "Asynchronous GuzzleRing adapter powered by react/http-client",
1077
+ "time": "2017-03-29 05:57:02"
1078
+ },
1079
+ {
1080
+ "name": "wyrihaximus/react-guzzle-psr7",
1081
+ "version": "2.0.0",
1082
+ "source": {
1083
+ "type": "git",
1084
+ "url": "https://github.com/WyriHaximus/react-guzzle-psr7.git",
1085
+ "reference": "9ed5d900558134b98897d9d9905b6d5c7ea79d7a"
1086
+ },
1087
+ "dist": {
1088
+ "type": "zip",
1089
+ "url": "https://api.github.com/repos/WyriHaximus/react-guzzle-psr7/zipball/9ed5d900558134b98897d9d9905b6d5c7ea79d7a",
1090
+ "reference": "9ed5d900558134b98897d9d9905b6d5c7ea79d7a",
1091
+ "shasum": ""
1092
+ },
1093
+ "require": {
1094
+ "guzzlehttp/guzzle": "^6.0",
1095
+ "php": "^5.5|^7.0",
1096
+ "wyrihaximus/react-guzzle-http-client": "^4.0"
1097
+ },
1098
+ "require-dev": {
1099
+ "phake/phake": "~1.0.6",
1100
+ "phpunit/phpunit": "^4.0|^5.0",
1101
+ "squizlabs/php_codesniffer": "~1.5.6",
1102
+ "vectorface/dunit": "^2.0"
1103
+ },
1104
+ "type": "library",
1105
+ "autoload": {
1106
+ "psr-4": {
1107
+ "WyriHaximus\\React\\GuzzlePsr7\\": "src/"
1108
+ }
1109
+ },
1110
+ "notification-url": "https://packagist.org/downloads/",
1111
+ "license": [
1112
+ "MIT"
1113
+ ],
1114
+ "authors": [
1115
+ {
1116
+ "name": "Cees-Jan Kiewiet",
1117
+ "email": "ceesjank@gmail.com",
1118
+ "homepage": "http://wyrihaximus.net/"
1119
+ }
1120
+ ],
1121
+ "description": "Asyncronous Guzzle (PSR7) adapter powered by react/http-client",
1122
+ "time": "2017-03-30 20:40:59"
1123
+ },
1124
+ {
1125
+ "name": "wyrihaximus/ticking-promise",
1126
+ "version": "1.6.1",
1127
+ "source": {
1128
+ "type": "git",
1129
+ "url": "https://github.com/WyriHaximus/TickingPromise.git",
1130
+ "reference": "8d26b1458e32c367ba6fb8ad5042046279acdb12"
1131
+ },
1132
+ "dist": {
1133
+ "type": "zip",
1134
+ "url": "https://api.github.com/repos/WyriHaximus/TickingPromise/zipball/8d26b1458e32c367ba6fb8ad5042046279acdb12",
1135
+ "reference": "8d26b1458e32c367ba6fb8ad5042046279acdb12",
1136
+ "shasum": ""
1137
+ },
1138
+ "require": {
1139
+ "react/event-loop": "^0.4",
1140
+ "react/promise": "~2.1"
1141
+ },
1142
+ "require-dev": {
1143
+ "phpunit/phpunit": "~4.4",
1144
+ "squizlabs/php_codesniffer": "^1.5.6",
1145
+ "vectorface/dunit": "~1.4"
1146
+ },
1147
+ "type": "library",
1148
+ "autoload": {
1149
+ "psr-4": {
1150
+ "WyriHaximus\\React\\": "src/"
1151
+ },
1152
+ "files": [
1153
+ "src/functions_include.php"
1154
+ ]
1155
+ },
1156
+ "notification-url": "https://packagist.org/downloads/",
1157
+ "license": [
1158
+ "MIT"
1159
+ ],
1160
+ "authors": [
1161
+ {
1162
+ "name": "Cees-Jan Kiewiet",
1163
+ "email": "ceesjank@gmail.com",
1164
+ "homepage": "http://wyrihaximus.net/"
1165
+ }
1166
+ ],
1167
+ "description": "Wrapping ticks into a promise",
1168
+ "time": "2016-03-05 20:23:05"
1169
+ }
1170
+ ],
1171
+ "packages-dev": [],
1172
+ "aliases": [],
1173
+ "minimum-stability": "stable",
1174
+ "stability-flags": {
1175
+ "aannnaa7/aws-sdk-php-minimized": 20
1176
+ },
1177
+ "prefer-stable": false,
1178
+ "prefer-lowest": false,
1179
+ "platform": [],
1180
+ "platform-dev": []
1181
+ }
includes/iowd-ajax.php ADDED
@@ -0,0 +1,291 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if (!defined('ABSPATH')) {
3
+ exit;
4
+ }
5
+
6
+ class IOWD_Ajax
7
+ {
8
+
9
+ /**
10
+ *
11
+ */
12
+
13
+ public static function finish_bulk()
14
+ {
15
+ $abort = get_option("iowd_abort");
16
+ if (!$abort) {
17
+ $id = isset($_POST["postId"]) && $_POST["postId"] ? $_POST["postId"] : '';
18
+ $done = get_site_transient("iowd_done_" . $id);
19
+
20
+ $images_count_start = get_transient("iowd_images_count_start");
21
+ // get optimization data
22
+ $last_optimized_data = get_site_transient("iowd_last_optimized_data");
23
+ $last_optimized_data = $last_optimized_data ? json_decode($last_optimized_data, true) : array("image_size" => 0, "image_orig_size" => 0, "image_count" => 0);
24
+
25
+ if ($done) {
26
+ $response = array("status" => "ok");
27
+ if ($id) {
28
+ // get file type
29
+ $path = get_attached_file($id);
30
+ $type = strtolower(pathinfo($path, PATHINFO_EXTENSION));
31
+ global $wpdb;
32
+ $row = $wpdb->get_row("SELECT COUNT(*) AS image_count, SUM(image_orig_size) AS image_orig_size, SUM(image_size) AS image_size, post_id FROM " . $wpdb->prefix . "iowd_images WHERE post_id='" . $id."' GROUP BY post_id");
33
+
34
+ $reduced = $row->image_orig_size - $row->image_size;
35
+ $reduced_percent = $row->image_orig_size ? ($reduced / $row->image_orig_size) * 100 : 0;
36
+ $reduced_percent = number_format($reduced_percent, 2);
37
+
38
+ $sizes = IOWD_Helper::get_attachmnet_sizes($id);
39
+ $html = '<div class="iowd_' . $id . '">
40
+ <div><a href="#" onclick="iowdStatus(this);return false;" data-id="' . $id . '"><small>' . __("Stats", IOWD_PREFIX) . ' [+]</small></a></div>
41
+ <div>' . $row->image_count . " " . __("images optimized by ", IOWD_PREFIX) . IOWD_Util::format_bytes($reduced) . ' ( ' . number_format($reduced_percent, 2) . '% )</div>
42
+ <div>Size: ' . IOWD_Util::format_bytes($sizes["total"]) . '</div>';
43
+ if ($type != "webp" && get_option("wdd_user_hash")) {
44
+ $html .= '<a href="#" class="iowd-optimize" data-id="' . $id . '">
45
+ <span>' . __("Reoptimize", IOWD_PREFIX) . '</span>
46
+ <img src="' . IOWD_URL_IMG . '/spinner.gif" class="iowd-spinner" style="display:none; vertical-align:sub;" />
47
+ </a>';
48
+ }
49
+ $html .= '</div>';
50
+ $response["html"] = $html;
51
+ delete_site_transient("iowd_done_" . $id);
52
+ delete_transient("iowd_images_count_start");
53
+ }
54
+ } else {
55
+ $response = array("status" => "pending", "data" => array("all" => $images_count_start, "optimized" => $last_optimized_data["image_count"]));
56
+ }
57
+ } else {
58
+ delete_option("iowd_abort");
59
+ $response = array("status" => "abort", "data" => array("all" => 0, "optimized" => 0));
60
+ }
61
+
62
+ echo json_encode($response);
63
+ wp_die();
64
+ }
65
+
66
+ public static function abort()
67
+ {
68
+ delete_transient("iowd_images_count_start");
69
+ delete_transient("iowd_optimizing_post_ids");
70
+ global $wpdb;
71
+ $wpdb->query("DELETE FROM {$wpdb->options} WHERE option_name LIKE '%iowd_done_%' OR option_name LIKE '%iowd_received_images_%'");
72
+ add_option("iowd_abort", 1);
73
+ wp_die();
74
+ }
75
+
76
+ public static function update_already_used()
77
+ {
78
+ $data = IOWD_Helper::limitation(true);
79
+ echo json_encode($data);
80
+ wp_die();
81
+ }
82
+
83
+ public static function get_attachment_data()
84
+ {
85
+ $ids = isset($_POST["ID"]) && $_POST["ID"] ? explode(",", $_POST["ID"]) : array();
86
+ $other = isset($_POST["other"]) && $_POST["other"] ? true : false;
87
+ $single = isset($_POST["bulk"]) ? false : true;
88
+
89
+ $optimize = new IOWD_Optimize($single);
90
+ $response = $optimize->get_temp_data($ids, $other, $single);
91
+
92
+ echo json_encode($response);
93
+ wp_die();
94
+
95
+ }
96
+
97
+ public static function optimize()
98
+ {
99
+ $single = isset($_POST["bulk"]) ? false : true;
100
+ $iteration = isset($_POST["iteration"]) ? $_POST["iteration"] : 0;
101
+ $id = isset($_POST["ID"]) && $_POST["ID"] ? $_POST["ID"] : '';
102
+
103
+ $optimize = new IOWD_Optimize($single);
104
+ $response = $optimize->optimize($iteration, $id);
105
+
106
+ echo json_encode($response);
107
+ wp_die();
108
+
109
+ }
110
+
111
+ public static function get_stats()
112
+ {
113
+ $optimized_data = array();
114
+
115
+ $post_id = isset($_POST["ID"]) ? (int)$_POST["ID"] : 0;
116
+ if ($post_id) {
117
+ global $wpdb;
118
+ $posts = $wpdb->get_results("SELECT * FROM " . $wpdb->prefix . "iowd_images WHERE post_id = '" . $post_id . "'");
119
+ if ($posts) {
120
+ $sizes = IOWD_Helper::get_attachmnet_sizes($post_id);
121
+ unset($sizes["total"]);
122
+ $optimized_data = array();
123
+ foreach ($posts as $post) {
124
+ $obj = new stdClass();
125
+ $obj->image_size = $post->image_size;
126
+ $obj->image_orig_size = $post->image_orig_size;
127
+ $obj->size = $post->size;
128
+ $optimized_data[$post->size] = $obj;
129
+ }
130
+ $all_sizes = array_keys($sizes);
131
+ $optimized_sizes = array_keys($optimized_data);
132
+ $not_optimized_sizes = array_diff($all_sizes, $optimized_sizes);
133
+
134
+ if (empty($not_optimized_sizes) === false) {
135
+ foreach ($not_optimized_sizes as $not_optimized_size) {
136
+ $obj = new stdClass();
137
+ $obj->image_size = $obj->image_orig_size = $sizes[$not_optimized_size];
138
+ $obj->size = $not_optimized_size;
139
+ $optimized_data[$not_optimized_size] = $obj;
140
+ }
141
+ }
142
+ }
143
+ }
144
+ $response = '';
145
+ if ($optimized_data) {
146
+ $response =
147
+ '<table class="iowd_stat_table">
148
+ <tr>
149
+ <th></th>
150
+ <th>' . __("Original size", IOWD_PREFIX) . '</th>
151
+ <th>' . __("Size", IOWD_PREFIX) . '</th>
152
+ <th>' . __("Reduced By", IOWD_PREFIX) . '</th>
153
+ </tr>';
154
+ $total = 0;
155
+ foreach ($optimized_data as $post) {
156
+ $reduse = $post->image_orig_size - $post->image_size;
157
+ $redused_persent = ($reduse / $post->image_orig_size) * 100;
158
+ $response .=
159
+ '<tr>
160
+ <td>' . ucfirst($post->size) . '</td>
161
+ <td>' . IOWD_Util::format_bytes($post->image_orig_size) . '</td>
162
+ <td>' . IOWD_Util::format_bytes($post->image_size) . '</td>';
163
+
164
+ if ($post->image_orig_size == $post->image_size) {
165
+ $response .= '<td>' . __("Skipped", IOWD_PREFIX) . '</td>';
166
+ } else {
167
+ $response .=
168
+ '<td>' . IOWD_Util::format_bytes($reduse) . '( ' . number_format($redused_persent, 2) . '% ) </td>';
169
+ }
170
+
171
+ $response .= '</tr>';
172
+ $total += $post->image_size;
173
+ }
174
+
175
+
176
+ $response .= '</table>';
177
+ $response .= '
178
+ <br>
179
+ <div>
180
+ <b>' . __("Total size", IOWD_PREFIX) . ':&nbsp;
181
+ ' . IOWD_Util::format_bytes($total) . ' </b>
182
+ </div>';
183
+ }
184
+
185
+ echo $response;
186
+ }
187
+
188
+ public static function choose_dirs()
189
+ {
190
+ $dirs = isset($_POST["dir"]) ? json_decode(stripslashes($_POST["dir"])) : array();
191
+ $template = "";
192
+ if ($dirs) {
193
+ foreach ($dirs as $dir => $images) {
194
+ if (!$images) {
195
+ $images = IOWD_Helper::get_images_from_dir_recursiv(trim($dir));
196
+ }
197
+
198
+ $show = $images ? '<span class="iowd-show-images">' . count($images) . ' images</span>' : '<span style="color:red; margin-left: 13px;">' . __("There are no images in this folder", IOWD_PREFIX) . '<span>';
199
+ $images_tmpl = "";
200
+ if ($images) {
201
+ $images_tmpl = "<div class='folder-images' style='display:none;'>";
202
+ foreach ($images as $image) {
203
+ $images_tmpl .= '<div class="iowd_other_img_path"><span class="iowd_image_path">' . $image . '</span> <span class="iowd_remove_img"> × </span> </div>';
204
+ }
205
+ $images_tmpl .= '</div>';
206
+ }
207
+ $dir_name = str_replace(get_home_path(), "", $dir);
208
+ $template .= '<div class="iowd_other_folders_row">' .
209
+ '<div class="other_folders" >' .
210
+ '<span class="iowd_other_path" title="' . $dir . '" data-name="' . $dir . '">' . $dir_name . ' </span> ' . $show .
211
+ '<span class="iowd_remove"> × </span>' .
212
+ '</div>' . $images_tmpl .
213
+
214
+ '</div>';
215
+ }
216
+
217
+ }
218
+
219
+ echo $template;
220
+ wp_die();
221
+ }
222
+
223
+ public static function filter_report()
224
+ {
225
+ $report_class = new IOWD_Report();
226
+ $data = $report_class->report_data();
227
+ $report_data = $data["rows"];
228
+ $total_count = $data["total_count"];
229
+ $total_orig_size = $data["total_image_orig_size"];
230
+ $total_size = $data["total_image_size"];
231
+ $limit = $data["limit"];
232
+
233
+ require_once IOWD_DIR_VIEWS . '/iowd_report_tbody_display.php';
234
+ wp_die();
235
+ }
236
+
237
+ public static function clear_report()
238
+ {
239
+ global $wpdb;
240
+ $post_id = isset($_POST["post_id"]) ? $_POST["post_id"] : 0;
241
+ $where = $post_id ? " WHERE post_id='" . $post_id . "'" : "";
242
+
243
+ $wpdb->query("UPDATE " . $wpdb->prefix . "iowd_images SET deleted=1 " . $where);
244
+ wp_die();
245
+ }
246
+
247
+ public static function quick_settings()
248
+ {
249
+ $name = isset($_POST["name"]) ? $_POST["name"] : false;
250
+ $value = isset($_POST["value"]) ? (int)$_POST["value"] : false;
251
+
252
+ if ($name !== false && $value !== false) {
253
+ $settings = json_decode(get_option(IOWD_PREFIX . "_options"), true);
254
+ if (isset($settings[$name])) {
255
+ $settings[$name] = $value;
256
+ update_option(IOWD_PREFIX . "_options", json_encode($settings));
257
+ }
258
+
259
+ }
260
+ wp_die();
261
+
262
+ }
263
+
264
+ public static function get_subdirs()
265
+ {
266
+ $dir = isset($_POST["dir"]) ? $_POST["dir"] : '';
267
+ $html = '';
268
+
269
+ if (is_dir($dir)) {
270
+ foreach (scandir($dir) as $file) {
271
+ if ('.' === $file || '..' === $file || !is_dir($dir . "/" . $file)) {
272
+ continue;
273
+ }
274
+
275
+ $html .= '<li class="iowd-dir-tree-title" data-path="' . str_replace("\\", "/", $dir) . "/" . $file . '" ><a href="#" ><img src="' . IOWD_URL_IMG . '/folder.png" class="iowd-dir-tree-icon">' . $file . '</a>';
276
+
277
+ }
278
+
279
+ if ($html) {
280
+ $html = "<ul>" . $html . "</ul>";
281
+ }
282
+ }
283
+
284
+ echo $html;
285
+ //wp_die();
286
+ }
287
+
288
+ }
289
+
290
+
291
+ ?>
includes/iowd-amazon-s3.php ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if (!defined('ABSPATH')) {
4
+ exit;
5
+ }
6
+
7
+ use Aws\S3\Exception\S3Exception;
8
+ use Aws\S3\S3Client;
9
+
10
+ class IOWD_Amazon_S3
11
+ {
12
+ const CACERT_PATH = IOWD_DIR . '/cacert-2017-06-07.pem';
13
+ const S3_CREDENTIALS_PATH = IOWD_API_URL . '/s3credentials';
14
+
15
+ public $errors = array();
16
+ public $sub_folder_name = null;
17
+ public $folder_name = null;
18
+ public $credentials = null;
19
+ public $s3_client = null;
20
+ private $region = 'us-west-2';
21
+ private $bucket = 'iotwbucket';
22
+
23
+ public function __construct($id = '')
24
+ {
25
+ $this->sub_folder_name = md5("TWlop45&&Kn1)@" . time());
26
+ $this->folder_name = md5(site_url());
27
+
28
+ $credentials = get_option("iowd_crd_" . $id);
29
+ $config = array(
30
+ 'version' => 'latest',
31
+ 'region' => $this->region,
32
+ 'credentials' => $credentials,
33
+ 'http' => array(
34
+ 'verify' => self::CACERT_PATH,
35
+ ),
36
+ );
37
+ $this->credentials = $credentials;
38
+
39
+ $this->s3_client = new S3Client($config);
40
+ }
41
+
42
+ public function upload($file_key)
43
+ {
44
+ try {
45
+ @ini_set('max_execution_time', 3600);
46
+ clearstatcache();
47
+ $arg = array(
48
+ 'Bucket' => $this->bucket,
49
+ 'Key' => $this->folder_name . "/" . $this->sub_folder_name . "/" . basename($file_key),
50
+ 'SourceFile' => $file_key,
51
+ );
52
+
53
+ $response = $this->s3_client->putObjectAsync($arg);
54
+
55
+ return $response;
56
+
57
+ } catch (S3Exception $e) {
58
+ IOWD_Log::error_log($e->getMessage());
59
+ }
60
+
61
+ }
62
+
63
+
64
+ }
includes/iowd-api.php ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if (!defined('ABSPATH')) {
3
+ exit;
4
+ }
5
+
6
+ class IOWD_Api
7
+ {
8
+ private static $api_url = null;
9
+ private static $post_data = null;
10
+ private static $post_headers_data = array(
11
+ "Accept" => "application/x.optimizer.v1+json"
12
+ );
13
+
14
+
15
+ public static function api_request()
16
+ {
17
+
18
+ $data = self::$post_data;
19
+ $hedares = self::$post_headers_data;
20
+
21
+ $request = wp_remote_post(self::$api_url, array(
22
+ 'method' => 'POST',
23
+ 'headers' => $hedares,
24
+ 'body' => $data,
25
+ )
26
+ );
27
+
28
+ if (!is_wp_error($request) || wp_remote_retrieve_response_code($request) === 200) {
29
+ if (isset($request["body"])) {
30
+ return json_decode($request['body'], true);
31
+ }
32
+ }
33
+
34
+ return false;
35
+ }
36
+
37
+ public static function set_post_data($data)
38
+ {
39
+ self::$post_data = $data;
40
+ }
41
+
42
+ public static function set_post_headers_data($data)
43
+ {
44
+ self::$post_headers_data = array_merge(self::$post_headers_data, $data);
45
+ }
46
+
47
+
48
+
49
+ public static function set_api_action($api_action)
50
+ {
51
+ self::$api_url = IOWD_API_URL . $api_action;
52
+ }
53
+
54
+
55
+ }
includes/iowd-helper.php ADDED
@@ -0,0 +1,243 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if (!defined('ABSPATH')) {
3
+ exit;
4
+ }
5
+
6
+ class IOWD_Helper
7
+ {
8
+
9
+
10
+ public static function message($message, $type)
11
+ {
12
+ return '<div class="iowd-messages">
13
+ <div class="' . $type . '">
14
+ <p><strong>' . $message . '</strong></p>
15
+ </div>
16
+ </div>';
17
+ }
18
+
19
+ public static function redirect(array $url, $page = "admin.php")
20
+ {
21
+ return wp_safe_redirect(add_query_arg($url, admin_url($page)));
22
+ }
23
+
24
+ public static function dir_tree($dir_path, $only_dirs = true)
25
+ {
26
+
27
+ if (file_exists($dir_path)) {
28
+ echo "<ul>";
29
+ $dir = scandir($dir_path);
30
+
31
+ foreach ($dir as $file) {
32
+
33
+ if ($file == "." || $file == ".." || strpos($file, ".") !== false) {
34
+ continue;
35
+ }
36
+
37
+ if (is_dir($dir_path . "/" . $file) || $only_dirs === false) {
38
+
39
+ echo '<li class="iowd-dir-tree-title" data-path="' . str_replace("\\", "/", $dir_path) . "/" . $file . '" ><a href="#" ><img src="' . IOWD_URL_IMG . '/folder.png" class="iowd-dir-tree-icon">' . $file . '</a>';
40
+ }
41
+
42
+ if (is_dir($dir_path . "/" . $file) === true) {
43
+ self::dir_tree($dir_path . "/" . $file, $only_dirs);
44
+ }
45
+
46
+ }
47
+ echo "</li></ul>";
48
+ }
49
+
50
+
51
+ }
52
+
53
+ public static function get_images_from_dir_recursiv($dir_path, &$image_paths = array())
54
+ {
55
+
56
+ if (file_exists($dir_path)) {
57
+ $dir = scandir($dir_path);
58
+ $images = glob($dir_path . '/*.{jpg,png,gif,jpeg,pdf}', GLOB_BRACE);
59
+
60
+ $images = $images ? $images : array();
61
+ if ($images) {
62
+ $protocaol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http';
63
+ array_walk($images, create_function('&$value', '$value = str_replace( "' . $_SERVER['DOCUMENT_ROOT'] . '", "' . $protocaol . '://' . $_SERVER['SERVER_NAME'] . '", $value );'));
64
+ }
65
+ $image_paths = array_merge($image_paths, $images);
66
+ foreach ($dir as $file) {
67
+ if ($file == "." || $file == ".." || substr($file, 0, 1) == ".") {
68
+ continue;
69
+ }
70
+
71
+ if (is_dir($dir_path . "/" . $file)) {
72
+ self::get_images_from_dir_recursiv($dir_path . "/" . $file, $image_paths);
73
+ }
74
+
75
+ }
76
+ }
77
+
78
+ return $image_paths;
79
+
80
+ }
81
+
82
+ public static function get_images_from_dir($dir_path)
83
+ {
84
+ if (file_exists($dir_path)) {
85
+ $images = glob($dir_path . '/*.{jpg,png,gif,jpeg,pdf}', GLOB_BRACE);
86
+
87
+ $images = $images ? $images : array();
88
+ if ($images) {
89
+ $protocaol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http';
90
+ array_walk($images, create_function('&$value', '$value = str_replace( "' . $_SERVER['DOCUMENT_ROOT'] . '", "' . $protocaol . '://' . $_SERVER['SERVER_NAME'] . '", $value );'));
91
+ }
92
+ }
93
+
94
+ return $images;
95
+
96
+ }
97
+
98
+ public static function get_attachment_ids()
99
+ {
100
+ $args = array(
101
+ 'post_type' => 'attachment',
102
+ 'numberposts' => -1
103
+ );
104
+ $attachments = get_posts($args);
105
+ $images = array();
106
+
107
+ foreach ($attachments as $attachment) {
108
+ $images[] = $attachment->ID;
109
+ }
110
+
111
+ return $images;
112
+ }
113
+
114
+ public static function wp_get_image_sizes()
115
+ {
116
+ $iowd_sizes = array();
117
+ $sizes = get_intermediate_image_sizes();
118
+ global $_wp_additional_image_sizes;
119
+ foreach ($sizes as $size) {
120
+ if ($size == 'thumbnail' || $size == 'medium' || $size == 'medium_large' || $size == 'large') {
121
+ $iowd_sizes[$size]["width"] = get_option($size . '_size_w');
122
+ $iowd_sizes[$size]["height"] = get_option($size . '_size_h');
123
+ } elseif (isset($_wp_additional_image_sizes[$size])) {
124
+ $iowd_sizes[$size] = array(
125
+ 'width' => $_wp_additional_image_sizes[$size]['width'],
126
+ 'height' => $_wp_additional_image_sizes[$size]['height'],
127
+ );
128
+ }
129
+ }
130
+ if ($iowd_sizes['medium_large']['width'] == 0) {
131
+ $iowd_sizes['medium_large']['width'] = '768';
132
+ }
133
+ if ($iowd_sizes['medium_large']['height'] == 0) {
134
+ $iowd_sizes['medium_large']['height'] = '9999';
135
+ }
136
+
137
+ return $iowd_sizes;
138
+ }
139
+
140
+ public static function pn_get_attachment_id_from_url($attachment_url = '')
141
+ {
142
+
143
+ global $wpdb;
144
+ $attachment_id = false;
145
+
146
+ // If there is no url, return.
147
+ if ('' == $attachment_url)
148
+ return;
149
+
150
+ // Get the upload directory paths
151
+ $upload_dir_paths = wp_upload_dir();
152
+
153
+ // Make sure the upload path base directory exists in the attachment URL, to verify that we're working with a media library image
154
+ if (false !== strpos($attachment_url, $upload_dir_paths['baseurl'])) {
155
+
156
+ // If this is the URL of an auto-generated thumbnail, get the URL of the original image
157
+ $attachment_url = preg_replace('/-\d+x\d+(?=\.(jpg|jpeg|png|gif)$)/i', '', $attachment_url);
158
+
159
+ // Remove the upload path base directory from the attachment URL
160
+ $attachment_url = str_replace($upload_dir_paths['baseurl'] . '/', '', $attachment_url);
161
+
162
+ // Finally, run a custom database query to get the attachment ID from the modified attachment URL
163
+ $attachment_id = $wpdb->get_var($wpdb->prepare("SELECT wposts.ID FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta WHERE wposts.ID = wpostmeta.post_id AND wpostmeta.meta_key = '_wp_attached_file' AND wpostmeta.meta_value = '%s' AND wposts.post_type = 'attachment'", $attachment_url));
164
+
165
+ }
166
+
167
+ return $attachment_id;
168
+ }
169
+
170
+ public static function iowd_is_url_exists($url)
171
+ {
172
+
173
+ $ch = curl_init($url);
174
+ curl_setopt($ch, CURLOPT_NOBODY, true);
175
+ curl_exec($ch);
176
+ $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
177
+
178
+ if ($code == 200) {
179
+ $status = true;
180
+ } else {
181
+ $status = false;
182
+ }
183
+ curl_close($ch);
184
+
185
+ return $status;
186
+ }
187
+
188
+ public static function get_attachmnet_sizes($id)
189
+ {
190
+ $attachmnet_sizes = array();
191
+ $full_file = get_attached_file($id);
192
+ $full_file_size = file_exists($full_file) ? filesize($full_file) : 0;
193
+
194
+ $meta = wp_get_attachment_metadata($id);
195
+ $sizes = isset($meta["sizes"]) ? $meta["sizes"] : array();
196
+ $attachmnet_sizes["full"] = $full_file_size;
197
+ $attachment_root_dir = str_replace(basename($full_file), "", $full_file);
198
+ $total = $full_file_size;
199
+ foreach ($sizes as $size => $file) {
200
+ $image_size = file_exists($attachment_root_dir . $file["file"]) ? filesize($attachment_root_dir . $file["file"]) : 0;
201
+ $attachmnet_sizes[$size] = $image_size;
202
+ $total += $image_size;
203
+
204
+ }
205
+ $attachmnet_sizes["total"] = $total;
206
+
207
+ return $attachmnet_sizes;
208
+
209
+ }
210
+
211
+ public static function limitation($refresh = false)
212
+ {
213
+ $already_optimized = get_site_transient("iowd_already_optimized");
214
+ if(is_null($already_optimized) || $already_optimized === false || $refresh == true){
215
+ $already_optimized = self::update_already_used();
216
+ }
217
+
218
+ return array(
219
+ "limit" => 1000,
220
+ "period" => "1 month",
221
+ "already_optimized" => $already_optimized,
222
+ );
223
+ }
224
+
225
+ public static function update_already_used()
226
+ {
227
+ require_once IOWD_DIR_INCLUDES . "/iowd-api.php";
228
+ $request_data = array(
229
+ "domain" => site_url(),
230
+ "uhash" => "",
231
+ );
232
+ IOWD_Api::set_post_data($request_data);
233
+ IOWD_Api::set_api_action("used");
234
+ $response = IOWD_Api::api_request();
235
+ $already_optimized = isset($response["already_optimized"]) ? $response["already_optimized"] : 0;
236
+
237
+ set_site_transient("iowd_already_optimized", $already_optimized, 43200);
238
+
239
+ return $already_optimized;
240
+ }
241
+
242
+
243
+ }
includes/iowd-log.php ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if (!defined('ABSPATH')) {
3
+ exit;
4
+ }
5
+
6
+ class IOWD_Log
7
+ {
8
+
9
+ private static $log_path = IOWD_DIR . "/log/";
10
+
11
+ public static function error_log($log_content)
12
+ {
13
+ self::write_log($log_content, "ERROR");
14
+ }
15
+
16
+
17
+ private static function write_log($log, $type)
18
+ {
19
+ $log_content = "[" . date("Y-m-d H:i:s") . "] " ;
20
+ if($type){
21
+ $log_content .= "[" . $type . "] ";
22
+ }
23
+ $log_content .= $log . '/n';
24
+ file_put_contents(self::$log_path . date("Ymd") . '.txt', $log_content);
25
+ }
26
+
27
+
28
+ }
includes/iowd-media-library.php ADDED
@@ -0,0 +1,279 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if (!defined('ABSPATH')) {
3
+ exit;
4
+ }
5
+
6
+ class IOWD_MediaLibrary
7
+ {
8
+
9
+ public function __construct()
10
+ {
11
+ // add bulc action for wd optimize
12
+ add_action('admin_footer', array($this, 'custom_bulk_admin_footer'));
13
+ add_action('admin_action_wd_optimize', array($this, 'wd_optimize_bulk_handler'));
14
+
15
+ //wd optimize button to grid view, modal
16
+ add_filter('attachment_fields_to_edit', array($this, 'add_wd_optimize_button'), 10, 2);
17
+ add_filter('manage_media_columns', array($this, 'manage_columns'));
18
+ add_action('manage_media_custom_column', array($this, 'media_wd_optimize_column'), 10, 2);
19
+
20
+ add_action('restrict_manage_posts', array($this, 'size_filter'));
21
+
22
+ add_filter('posts_where', array($this, 'where_size'));
23
+ }
24
+
25
+ /**
26
+ * Adds wd optimize bulk action to media library page
27
+ *
28
+ */
29
+ public function wd_optimize_bulk_handler()
30
+ {
31
+
32
+ if ((empty($_REQUEST['action']) || 'wd_optimize' != $_REQUEST['action'])) {
33
+ return false;
34
+ }
35
+ if (empty($_REQUEST['media']) || !is_array($_REQUEST['media'])) {
36
+ return false;
37
+ }
38
+ check_admin_referer('bulk-media');
39
+
40
+ $ids = implode(",", array_map('intval', $_REQUEST['media']));
41
+
42
+ IOWD_Helper::redirect(array("page" => IOWD_PREFIX . "_settings", "ids" => $ids));
43
+ exit();
44
+
45
+ }
46
+
47
+ /**
48
+ * Adds wd optimize button to attachement modal and media grid view
49
+ *
50
+ */
51
+ public function add_wd_optimize_button($form_fields, $post)
52
+ {
53
+ if (!wp_attachment_is_image($post->ID)) {
54
+ return $form_fields;
55
+ }
56
+
57
+ $form_fields['wd_optimize'] = array(
58
+ 'label' => __('Optimize', IOWD_PREFIX),
59
+ 'input' => 'html',
60
+ 'html' => $this->wd_optimize_html($post->ID),
61
+ 'show_in_edit' => true,
62
+ 'show_in_modal' => true,
63
+ );
64
+
65
+
66
+ return $form_fields;
67
+ }
68
+
69
+ public function wd_optimize_html($id)
70
+ {
71
+ $db = new IOWDDB();
72
+ $db->set_table_name("iowd_images");
73
+ $limitation = IOWD_Helper::limitation();
74
+ global $wpdb;
75
+ $row = $wpdb->get_row("SELECT COUNT(case when image_orig_size = image_size then null else 1 end) AS images_count, SUM(image_orig_size) AS image_orig_size, SUM(image_size) AS image_size, path FROM " . $wpdb->prefix . "iowd_images WHERE post_id='" . $id . "' GROUP BY post_id");
76
+
77
+ $path = get_attached_file($id);
78
+ $options = json_decode(get_option(IOWD_PREFIX . "_options"), true);
79
+ $type = strtolower(pathinfo($path, PATHINFO_EXTENSION));
80
+ $db_post_ids = get_transient("iowd_optimizing_post_ids") ? get_transient("iowd_optimizing_post_ids") : array();
81
+ if ($row) {
82
+ $reduse = $row->image_orig_size - $row->image_size;
83
+ $redused_persent = $row->image_orig_size ? ($reduse / $row->image_orig_size) * 100 : 0;
84
+ $sizes = IOWD_Helper::get_attachmnet_sizes($id);
85
+ $html = '<div class="iowd_' . $id . '">
86
+ <div><a href="#" onclick="iowdStatus(this);return false;" data-id="' . $id . '"><small>' . __("Stats", IOWD_PREFIX) . ' [+]</small></a></div>
87
+ <div>' . $row->images_count . " " . __("images optimized by ", IOWD_PREFIX) . IOWD_Util::format_bytes($reduse) . ' ( ' . number_format($redused_persent, 2) . '% )</div>
88
+ <div>Size: ' . IOWD_Util::format_bytes($sizes["total"]) . '</div>';
89
+ if ($type != "webp" && $limitation["already_optimized"] < $limitation["limit"]) {
90
+ $html .= '<a href="#" class="iowd-optimize" data-id="' . $id . '">
91
+ <span>' . __("Reoptimize", IOWD_PREFIX) . '</span>
92
+ <img src="' . IOWD_URL_IMG . '/spinner.gif" class="iowd-spinner" style="display:none; vertical-align:sub;" />
93
+ </a>';
94
+ }
95
+ $html .= '</div>';
96
+ } else {
97
+ if ($limitation["already_optimized"] > $limitation["limit"]) {
98
+ $html = sprintf(__("Your subscription plan allows optimizing %s images per month. This limitation has expired for current month.", IOWD_PREFIX), $limitation["limit"]);
99
+ } else if (($type == "png" && $options["png_optimization_levels"] == "0") || (($type == "jpg" || $type == "jpeg") && $options["jpg_optimization_levels"] == "0") || ($type == "gif" && $options["gif_optimization_levels"] == "0") ) {
100
+ $html = sprintf(__("Please select %s optimization level from ", IOWD_PREFIX), $type);
101
+ $html .= '<a href="upload.php?page=iowd_settings">' . __("Settings", IOWD_PREFIX) . '</a>.';
102
+ } else if (in_array($id, $db_post_ids)) {
103
+ $html = __("Processing optimize", IOWD_PREFIX);
104
+ } else if ($type == "png" || $type == "jpg" || $type == "jpeg" || $type == "gif") {
105
+ $html = '<div class="iowd_' . $id . '"><button class="button button-secondary iowd-optimize" data-id="' . $id . '">
106
+ <span>' . __("Optimize", IOWD_PREFIX) . '</span>
107
+ <img src="' . IOWD_URL_IMG . '/spinner.gif" class="iowd-spinner" style="display:none; vertical-align:sub;" />
108
+ </button>';
109
+
110
+ $html .= '</div>';
111
+ } else {
112
+ $html = '';
113
+ }
114
+ }
115
+
116
+ return $html;
117
+ }
118
+
119
+
120
+ public function size_filter()
121
+ {
122
+ global $pagenow;
123
+ if ($pagenow == 'upload.php') {
124
+
125
+ $file_size = filter_input(INPUT_GET, 'size', FILTER_SANITIZE_STRING);
126
+ $file_size = trim($file_size);
127
+ $file_size = !empty($file_size) ? $file_size : false;
128
+
129
+ $sizes = array(
130
+ "" => __("Larger than", IOWD_PREFIX),
131
+ "500000" => "0.5MB",
132
+ "1000000" => "1MB",
133
+ "2000000" => "2MB",
134
+ "4000000" => "4MB",
135
+ "8000000" => "8MB",
136
+ "14000000" => "14MB",
137
+ );
138
+ $html = '<select name="size" class="postform">';
139
+ foreach ($sizes as $key => $value) {
140
+ $html .= '<option value="' . $key . '" ' . selected($file_size, $key, false) . '>' . $value . '</option>';
141
+ }
142
+ $html .= '</select>';
143
+
144
+
145
+ echo $html;
146
+ }
147
+ }
148
+
149
+
150
+ public function where_size($sql)
151
+ {
152
+ global $pagenow, $wpdb;
153
+ if ($pagenow == 'upload.php') {
154
+ $file_size = filter_input(INPUT_GET, 'size', FILTER_SANITIZE_STRING);
155
+ $file_size = trim($file_size);
156
+ $file_size = !empty($file_size) ? $file_size : false;
157
+
158
+ // get all attachments
159
+ if ($file_size) {
160
+ $file_size = $file_size * 1000;
161
+ $attachments = get_posts(array(
162
+ 'post_type' => 'attachment',
163
+ 'post__in' => array(),
164
+ 'numberposts' => -1
165
+ ));
166
+ $ids = array();
167
+ foreach ($attachments as $attachment) {
168
+ $size = filesize(get_attached_file($attachment->ID));
169
+ if ($size > $file_size) {
170
+ $ids[] = $attachment->ID;
171
+ }
172
+
173
+ }
174
+
175
+ $sql .= count($ids) > 0 ? " AND $wpdb->posts.id IN (" . implode(",", $ids) . ") " : " AND 0 ";
176
+
177
+ }
178
+
179
+ }
180
+
181
+ return $sql;
182
+ }
183
+
184
+
185
+ public function custom_bulk_admin_footer()
186
+ {
187
+ global $pagenow;
188
+
189
+ if ($pagenow == 'upload.php' || $pagenow == 'post.php') {
190
+ ?>
191
+ <div
192
+ class="iowd_opacity"></div>
193
+ <div
194
+ class="iowd_stats">
195
+ <div
196
+ class="iowd_close">
197
+ ×
198
+ </div>
199
+ <div
200
+ class="iowd_stats_body"></div>
201
+ </div>
202
+
203
+ <script
204
+ type="text/javascript">
205
+ jQuery(document).ready(function () {
206
+ jQuery('<option>').val('wd_optimize').text('<?php _e('Optimize', IOWD_PREFIX)?>').appendTo("select[name='action']");
207
+ });
208
+ </script>
209
+ <style>
210
+ .iowd_opacity, .iowd_stats {
211
+ position: fixed;
212
+ top: 0px;
213
+ left: 0px;
214
+ bottom: 0px;
215
+ right: 0px;
216
+ padding: 23px;
217
+ }
218
+
219
+ .iowd_opacity {
220
+ background: #000;
221
+ opacity: 0.6;
222
+ z-index: 9999999;
223
+ display: none;
224
+ }
225
+
226
+ .iowd_stats {
227
+ margin: auto;
228
+ z-index: 9999999;
229
+ background: #fff;
230
+ width: 570px;
231
+ height: 300px;
232
+ opacity: 1;
233
+ display: none;
234
+ overflow: auto;
235
+ max-height: 60%;
236
+ box-shadow: -1px -1px 13px #32373c;
237
+ border-radius: 4px;
238
+ }
239
+
240
+ .iowd_close {
241
+ font-size: 18px;
242
+ cursor: pointer;
243
+ text-align: right;
244
+ }
245
+
246
+ .iowd_stat_table {
247
+ width: 100%;
248
+ border-collapse: collapse;
249
+ }
250
+
251
+ .iowd_stat_table th, .iowd_stat_table td {
252
+ text-align: left;
253
+ padding: 10px;
254
+ border-bottom: 1px solid #ddd;
255
+ }
256
+ </style>
257
+ <?php
258
+ }
259
+ }
260
+
261
+ public function manage_columns($defaults)
262
+ {
263
+ $defaults['wd_optimize'] = __('Optimize', IOWD_PREFIX);
264
+
265
+ return $defaults;
266
+ }
267
+
268
+ public function media_wd_optimize_column($column_name, $id)
269
+ {
270
+ if ('wd_optimize' == $column_name) {
271
+ echo $this->wd_optimize_html($id);
272
+ }
273
+
274
+ }
275
+
276
+
277
+ }
278
+
279
+ new IOWD_MediaLibrary();
includes/iowd-optimize.php ADDED
@@ -0,0 +1,743 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if (!defined('ABSPATH')) {
3
+ exit;
4
+ }
5
+
6
+
7
+ class IOWD_Optimize
8
+ {
9
+ private $options;
10
+ private $is_single = false;
11
+ private $allowed_types = array("jpg", "jpeg", "png", "gif");
12
+ private $images_count = 10;
13
+
14
+
15
+ public function __construct($single = false)
16
+ {
17
+ $this->is_single = $single;
18
+ $this->options = json_decode(get_option(IOWD_PREFIX . "_options"), true);
19
+ if ($single == true) {
20
+ $this->images_count = count(IOWD_Helper::wp_get_image_sizes()) + 1;
21
+ }
22
+
23
+ }
24
+
25
+ public function get_temp_data($ids = array(), $other = false, $single = false, $meta = array())
26
+ {
27
+ $id = $single == true ? ($meta ? "auto_" . $ids[0] : $ids[0]) : '';
28
+ // delete all remained data
29
+ delete_option("iowd_image_temp_data_" . $id);
30
+ delete_option("iowd_data_count_" . $id);
31
+ delete_site_transient("iowd_last_optimized_data");
32
+ delete_transient("iowd_images_count_start");
33
+ delete_site_transient("iowd_done_" . $id);
34
+ delete_option("iowd_crd_" . $id);
35
+ delete_option("iowd_abort");
36
+ delete_site_transient("iowd_received_images_". $id);
37
+
38
+ //check
39
+ $folder_name = md5(site_url());
40
+ $request_data = array(
41
+ "domain" => site_url(),
42
+ "folder" => $folder_name,
43
+ );
44
+
45
+ IOWD_Api::set_post_data($request_data);
46
+ IOWD_Api::set_api_action("validate");
47
+ $response = IOWD_Api::api_request();
48
+
49
+ if ($response["status"] == "error") {
50
+ set_transient("iowd_response_error", $response["error"]);
51
+ IOWD_Helper::update_already_used();
52
+ return $response;
53
+ }
54
+
55
+ if (!empty($response["credentials"])) {
56
+ $credentials = array(
57
+ 'key' => $response["credentials"]["AccessKeyId"],
58
+ 'secret' => $response["credentials"]["SecretAccessKey"],
59
+ 'token' => $response["credentials"]["SessionToken"]
60
+ );
61
+ add_option("iowd_crd_" . $id, $credentials);
62
+ } else {
63
+ set_transient("iowd_response_error", 'empty_credentials');
64
+
65
+ return array("status" => "error", "error" => __("Empty credentials, please try again.", IOWD_PREFIX));
66
+ }
67
+
68
+ if (empty($ids) === false) {
69
+ $images_data = $this->get_attachments($ids, false, $meta, $response["remained"]);
70
+ } else {
71
+ $images_data = $this->scan($ids, $other, $response["remained"]);
72
+ $images_data = $images_data["attachments_data"];
73
+ }
74
+
75
+ $data_count = count($images_data);
76
+ // add temp data
77
+ add_option("iowd_image_temp_data_" . $id, $images_data);
78
+ add_option("iowd_data_count_" . $id, $data_count);
79
+
80
+ return array("status" => "ok", "data_count" => $data_count);
81
+ }
82
+
83
+ public function get_attachments($ids = array(), $include_others = false, $meta = array(), $remained = null)
84
+ {
85
+ ini_set('memory_limit', '-1');
86
+ clearstatcache();
87
+ $options = $this->options;
88
+ $image_data = array();
89
+
90
+
91
+ $optimize_thumbs = explode(",", $options["optimize_thumbs"]);
92
+ // if isset ids, get attachments
93
+
94
+ $args = array(
95
+ 'post_type' => 'attachment',
96
+ 'post__in' => $ids,
97
+ 'numberposts' => -1
98
+ );
99
+ $attachments = get_posts($args);
100
+
101
+ if (empty($attachments) === false) {
102
+ foreach ($attachments as $attachment) {
103
+ if (!file_exists(get_attached_file($attachment->ID))) {
104
+ continue;
105
+ }
106
+ $file_name = get_attached_file($attachment->ID);
107
+ $type = pathinfo($file_name, PATHINFO_EXTENSION);
108
+ $size = filesize($file_name);
109
+ $path = wp_get_attachment_url($attachment->ID);
110
+ // check type
111
+ if (!in_array(strtolower($type), $this->allowed_types) || $this->check_optimization_level($type) === false) {
112
+ continue;
113
+ }
114
+
115
+ if (($this->skip_small_images($size) === true && $this->skip_large_images($size) === true && $options["exclude_full_size"] == 0) || $this->is_single == true) {
116
+
117
+ $image = array();
118
+ $image["path"] = $path;
119
+ $image["file"] = $file_name;
120
+ $image["post_id"] = $attachment->ID;
121
+ $image["size"] = "full";
122
+ $image["image_size"] = $size;
123
+ $image["media"] = 1;
124
+ $image["converted"] = 0;
125
+ $image["resized"] = 0;
126
+ $image["single"] = $this->is_single;
127
+ $image["transparent"] = $type == "png" && IOWD_Util::is_transparent_png($file_name) ? 1 : 0;
128
+
129
+ $image_data[] = $image;
130
+ }
131
+ $attachment_root_url = str_replace(basename($path), "", $path);
132
+ $attachment_root_dir = str_replace(basename(get_attached_file($attachment->ID)), "", get_attached_file($attachment->ID));
133
+
134
+ $meta = wp_get_attachment_metadata($attachment->ID) ? wp_get_attachment_metadata($attachment->ID) : $meta;
135
+ $sizes = isset($meta["sizes"]) ? $meta["sizes"] : array();
136
+
137
+ foreach ($sizes as $size => $file) {
138
+ if (in_array($size, $optimize_thumbs)) {
139
+ $image_size = filesize($attachment_root_dir . $file["file"]);
140
+ if (($this->skip_small_images($image_size) === true && $this->skip_large_images($image_size) === true) || $this->is_single == true) {
141
+ $image = array();
142
+ $image["path"] = $attachment_root_url . $file["file"];
143
+ $image["file"] = $attachment_root_dir . $file["file"];
144
+ $image["post_id"] = $attachment->ID;
145
+ $image["size"] = $size;
146
+ $image["image_size"] = $image_size;
147
+ $image["media"] = 1;
148
+ $image["converted"] = 0;
149
+ $image["resized"] = 0;
150
+ $image["single"] = $this->is_single;
151
+ $image["transparent"] = $type == "png" && IOWD_Util::is_transparent_png($attachment_root_dir . $file["file"]) ? 1 : 0;
152
+
153
+
154
+ $image_data[] = $image;
155
+ }
156
+ }
157
+ }
158
+ }
159
+ }
160
+
161
+ if ($include_others == true) {
162
+
163
+ $protocaol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http';
164
+
165
+ $all_dirs = $options["other_folders"] ? json_decode(htmlspecialchars_decode(stripslashes($options["other_folders"])), true) : array();
166
+
167
+ $other_images = array();
168
+ if (empty($all_dirs) === false) {
169
+ foreach ($all_dirs as $dir => $image_path) {
170
+ foreach ($image_path as $path) {
171
+ $other_images[] = $path;
172
+ }
173
+ }
174
+ }
175
+
176
+ $other_images = array_unique($other_images);
177
+
178
+ $i = 1;
179
+ if (empty($other_images) === false) {
180
+ global $wpdb;
181
+ $max_iowd_post = $wpdb->get_row("SELECT post_id, id FROM " . $wpdb->prefix . "iowd_images WHERE post_id LIKE '%iowd_%' ORDER BY id DESC LIMIT 0,1");
182
+
183
+ $max_iowd_post = $max_iowd_post ? substr($max_iowd_post->post_id, 5) + 1 : 1;
184
+
185
+ foreach ($other_images as $other_image) {
186
+ $other_path = str_replace($protocaol . '://' . $_SERVER['SERVER_NAME'], $_SERVER['DOCUMENT_ROOT'], $other_image);
187
+
188
+ if (!file_exists($other_path)) {
189
+ continue;
190
+ }
191
+ $size = filesize($other_path);
192
+ $type = pathinfo($other_image, PATHINFO_EXTENSION);
193
+
194
+ if ($this->check_optimization_level($type) === false || $this->skip_small_images($size) === false || $this->skip_large_images($size) === false || !in_array(strtolower($type), $this->allowed_types)) {
195
+ continue;
196
+ }
197
+
198
+ $image = array();
199
+ $image["path"] = $other_image;
200
+ $image["file"] = str_replace($protocaol . '://' . $_SERVER['SERVER_NAME'], $_SERVER['DOCUMENT_ROOT'], $other_image);
201
+ $image["post_id"] = "iowd_" . $max_iowd_post;
202
+ $image["size"] = "full";
203
+
204
+ $image["image_size"] = $size;
205
+ $image["media"] = 0;
206
+ $image["converted"] = 0;
207
+ $image["resized"] = 0;
208
+ $image["single"] = $this->is_single;
209
+ $image["transparent"] = $type == "png" && IOWD_Util::is_transparent_png($image["file"]) ? 1 : 0;
210
+
211
+ $image_data[] = $image;
212
+ $i++;
213
+ $max_iowd_post++;
214
+ }
215
+ }
216
+ }
217
+
218
+ if (!is_null($remained)) {
219
+ $image_data = array_slice($image_data, 0, $remained);
220
+ }
221
+
222
+ $images_count = count($image_data);
223
+ $attachments_data = array();
224
+ if ($images_count > $this->images_count) {
225
+ for ($i = 0; $i < ceil($images_count / $this->images_count); $i++) {
226
+ $attachments_data[$i] = array_slice($image_data, $i * $this->images_count, $this->images_count);
227
+ }
228
+ } else {
229
+ $attachments_data[0] = $image_data;
230
+ }
231
+
232
+ return $attachments_data;
233
+
234
+ }
235
+
236
+ private function check_optimization_level($mime_type)
237
+ {
238
+ $options = $this->options;
239
+
240
+ switch (strtolower($mime_type)) {
241
+ case "jpg":
242
+ case "jpeg":
243
+ if (!$options["jpg_optimization_levels"]) {
244
+ return false;
245
+ }
246
+ break;
247
+
248
+ case "png":
249
+ if (!$options["png_optimization_levels"]) {
250
+ return false;
251
+ }
252
+ break;
253
+
254
+ case "gif":
255
+ if (!$options["gif_optimization_levels"]) {
256
+ return false;
257
+ }
258
+ break;
259
+
260
+ case "pdf":
261
+ if (!$options["pdf_optimization_levels"]) {
262
+ return false;
263
+ }
264
+ break;
265
+ }
266
+
267
+ return true;
268
+ }
269
+
270
+ private function skip_small_images($size)
271
+ {
272
+ $options = $this->options;
273
+ if ($size < (int)$options["skip_small_images"] * 1048576 && $options["skip_small_images"]) {
274
+ return false;
275
+ }
276
+
277
+ return true;
278
+ }
279
+
280
+ private function skip_large_images($size)
281
+ {
282
+ $options = $this->options;
283
+ if ($size > (int)$options["skip_large_images"] * 1048576 && $options["skip_large_images"]) {
284
+ return false;
285
+ }
286
+
287
+ return true;
288
+ }
289
+
290
+ public function scan($ids = array(), $include_others = false, $remained = null)
291
+ {
292
+ $options = $this->options;
293
+ $attachments = $this->get_attachments($ids, $include_others);
294
+
295
+ global $wpdb;
296
+ $where = "";
297
+ $rows = $wpdb->get_results("SELECT * FROM " . $wpdb->prefix . "iowd_images " . $where);
298
+ $optimized_data = array();
299
+
300
+ $all_data_count = array();
301
+ $optimized_data_count = array();
302
+ $all_data = array();
303
+
304
+ $for_checking = array();
305
+ for ($i = 0; $i < count($attachments); $i++) {
306
+ foreach ($attachments[$i] as $attachment) {
307
+ if (!in_array($attachment["path"], $for_checking)) {
308
+ if ($attachment["media"] == 1) {
309
+ $all_data[$attachment["post_id"] . ":" . $attachment["size"]] = $attachment["post_id"] . ":" . $attachment["size"];
310
+ $all_data_count[$attachment["post_id"]] = $attachment["post_id"];
311
+ } else {
312
+ $all_data["iowd_" . $attachment["path"]] = "iowd_" . $attachment["path"];
313
+ $all_data_count[$attachment["path"]] = $attachment["path"];
314
+ }
315
+ }
316
+ $for_checking[] = $attachment["path"];
317
+ }
318
+ }
319
+
320
+ foreach ($rows as $row) {
321
+ $optimization_type = $this->get_current_opt_level($row->path);
322
+ $already_optimized = explode(",", $row->already_optimized);
323
+ $already_optimized = array_unique($already_optimized);
324
+
325
+ if ($options["optimize_once_more"] == "1" && (($optimization_type == "losselss" && empty($already_optimized) == true) || ($optimization_type == "lossy40" && ($already_optimized == array("lossless") || empty($already_optimized) == true)) || ($optimization_type == "lossy" && !in_array("lossy", $already_optimized)))) {
326
+ continue;
327
+ }
328
+
329
+ if ($row->media == 1) {
330
+ $optimized_data[$row->post_id . ":" . $row->size] = $row->post_id . ":" . $row->size;
331
+ $optimized_data_count[$row->post_id] = $row->post_id;
332
+ } else {
333
+ $optimized_data["iowd_" . $row->path] = "iowd_" . $row->path;
334
+ $optimized_data_count[$row->path] = $row->path;
335
+ }
336
+ }
337
+
338
+ $optimize_all_diff = array_diff($optimized_data, $all_data);
339
+ $not_optimized_data = array_diff($all_data, $optimized_data);
340
+ $all_data = $all_data + $optimize_all_diff;
341
+
342
+
343
+ $optimize_all_diff_count = array_diff($optimized_data_count, $all_data_count);
344
+ $not_optimized_data_count = array_diff($all_data_count, $optimized_data_count);
345
+ $all_data_count = $all_data_count + $optimize_all_diff_count;
346
+
347
+
348
+ $not_optimized_data_other = array_filter($not_optimized_data, function ($elem) {
349
+ if (strpos($elem, "iowd_") !== false) {
350
+ return $elem;
351
+ }
352
+ });
353
+
354
+ $not_optimized_data_media_count = count($not_optimized_data_count) - count($not_optimized_data_other);
355
+ $not_optimized_data_media = count($not_optimized_data) - count($not_optimized_data_other);
356
+
357
+ $image_data = array();
358
+
359
+ for ($i = 0; $i < count($attachments); $i++) {
360
+ foreach ($attachments[$i] as $attachment) {
361
+ if (in_array($attachment["post_id"] . ":" . $attachment["size"], $not_optimized_data) || in_array("iowd_" . $attachment["path"], $not_optimized_data)) {
362
+ $image_data[] = $attachment;
363
+ }
364
+ }
365
+ }
366
+
367
+ if (!is_null($remained)) {
368
+ $image_data = array_slice($image_data, 0, $remained);
369
+ }
370
+
371
+ $images_count = count($image_data);
372
+ $attachments_data = array();
373
+ if ($images_count > $this->images_count) {
374
+ for ($i = 0; $i < ceil($images_count / $this->images_count); $i++) {
375
+ $attachments_data[$i] = array_slice($image_data, $i * $this->images_count, $this->images_count);
376
+ }
377
+ } else {
378
+ $attachments_data[0] = $image_data;
379
+ }
380
+
381
+
382
+ return array(
383
+ "optimized_data" => count($optimized_data_count),
384
+ "optimized_data_sizes" => count($optimized_data),
385
+ "not_optimized_data" => count($not_optimized_data_count),
386
+ "not_optimized_data_sizes" => count($not_optimized_data),
387
+ "not_optimized_data_media" => $not_optimized_data_media_count,
388
+ "not_optimized_data_media_sizes" => $not_optimized_data_media,
389
+ "not_optimized_data_other" => count($not_optimized_data_other),
390
+ "all_data" => count($all_data_count),
391
+ "all_data_sizes" => count($all_data),
392
+ "attachments_data" => $attachments_data
393
+ );
394
+ }
395
+
396
+ private function get_current_opt_level($path)
397
+ {
398
+ $options = $this->options;
399
+ $mime_type = strtolower(pathinfo($path, PATHINFO_EXTENSION));
400
+ $mime_type = $mime_type == "jpeg" ? "jpg" : $mime_type;
401
+ $optimization_type = isset($options[$mime_type . "_optimization_levels"]) ? $options[$mime_type . "_optimization_levels"] : "0";
402
+
403
+ return $optimization_type;
404
+ }
405
+
406
+ public function optimize($iteration, $id = '', $auto = 0, $meta = array())
407
+ {
408
+ $abort = get_option("iowd_abort");
409
+ if (!$abort) {
410
+ $images_data = get_option("iowd_image_temp_data_" . $id);
411
+ if ($this->is_single == true) {
412
+ $images_data = $images_data[0];
413
+ } else {
414
+ $images_data = $images_data[$iteration];
415
+ }
416
+
417
+ if (empty($images_data) === false) {
418
+
419
+ $options = json_decode(get_option(IOWD_PREFIX . "_options"), true);
420
+ $s3 = new IOWD_Amazon_S3($id);
421
+
422
+ $data = array();
423
+ $response = array();
424
+ $post_ids = array();
425
+ for ($i = 0; $i < count($images_data); $i++) {
426
+ $image_data = $images_data[$i];
427
+ // if enable resizing
428
+ if ($options["enable_resizing"] == 1 || $options["enable_resizing_other"] == 1) {
429
+ $resize_data = $this->resize($image_data, $meta);
430
+ $image_data = $resize_data[0];
431
+ $meta = $resize_data[1];
432
+ }
433
+
434
+ // upload files to s3
435
+ $response[] = $s3->upload($image_data["file"]);
436
+
437
+ $data[$i] = array(
438
+ "path" => $image_data["path"],
439
+ "file" => $image_data["file"],
440
+ "transparent" => $image_data["transparent"],
441
+ "post_id" => $image_data["post_id"],
442
+ "size" => $image_data["size"],
443
+ "image_size" => $image_data["image_size"],
444
+ );
445
+ $post_ids[] = $image_data["post_id"];
446
+ }
447
+
448
+ //update image count data
449
+ $iowd_images_count_start = (int)get_transient("iowd_images_count_start");
450
+ $iowd_images_count_start += count($images_data);
451
+ set_transient("iowd_images_count_start", $iowd_images_count_start);
452
+
453
+ //update post ids data
454
+ $db_post_ids = get_transient("iowd_optimizing_post_ids") ? get_transient("iowd_optimizing_post_ids") : array();
455
+ $db_post_ids = array_merge($db_post_ids, $post_ids);
456
+ $db_post_ids = array_unique($db_post_ids);
457
+ set_transient("iowd_optimizing_post_ids", $db_post_ids);
458
+
459
+ GuzzleHttp\Promise\unwrap($response);
460
+ $response = $this->api_call_ajax($data, $s3->folder_name, $s3->sub_folder_name, $s3->credentials, $iteration, $id);
461
+ if (isset($response["status"]) && $response["status"] == "error") {
462
+ set_transient("iowd_response_error", $response["error"]);
463
+ delete_transient("iowd_images_count_start");
464
+ delete_transient("iowd_optimizing_post_ids");
465
+ }
466
+ if ($auto == 0) {
467
+ return array("iowd_images_count_start" => $iowd_images_count_start, "response" => $response);
468
+ }
469
+ }
470
+ } else {
471
+ delete_option("iowd_abort");
472
+ if ($auto == 0) {
473
+ return array("iowd_images_count_start" => 0, "response" => array("status" => "abort"));
474
+ }
475
+ }
476
+
477
+ return $meta;
478
+
479
+ }
480
+
481
+ public function resize($item, $meta = array())
482
+ {
483
+ $db = new IOWDDB_Class();
484
+ $db->set_table_name("iowd_images");
485
+ $options = json_decode(get_option(IOWD_PREFIX . "_options"), true);
486
+ // do optional resizing and coversions
487
+ if ($item) {
488
+ $iowd_image = new IOWDImage();
489
+ $row = $db->get_row_by_field(array("path" => $item["path"]));
490
+ $resized = $row && $row->resized ? 1 : 0;
491
+ $item["resized"] = $resized;
492
+
493
+ if ($resized == 0) {
494
+ $iowd_image->load_image($item["file"]);
495
+ if ($options["keep_originals"] == 1) {
496
+ $this->keep_originals($item["file"]);
497
+ }
498
+ $flag = false;
499
+ list($width) = @getimagesize($item["file"]);
500
+ if ($item["media"] == 1 && $options["resize_media_images_width"] && $options["resize_media_images_height"] && $width > $options["resize_media_images_width"] && $options["enable_resizing"] == 1 && $item["size"] == "full") {
501
+ $iowd_image->resize($options["resize_media_images_width"], $options["resize_media_images_height"]);
502
+ $flag = true;
503
+ } else if ($item["media"] == 0 && $options["resize_other_images_width"] && $options["resize_other_images_height"] && $width > $options["resize_other_images_width"] && $options["enable_resizing_other"] == 1) {
504
+ $iowd_image->resize($options["resize_other_images_width"], $options["resize_other_images_height"]);
505
+ $flag = true;
506
+ }
507
+
508
+ if ($flag == true) {
509
+ $item["resized"] = 1;
510
+ list($width, $height) = @getimagesize($item["file"]);
511
+ if (!$meta) {
512
+ $_wp_attachment_metadata = get_post_meta($item["post_id"], "_wp_attachment_metadata");
513
+ $_wp_attachment_metadata = $_wp_attachment_metadata[0];
514
+ $_wp_attachment_metadata["width"] = $width;
515
+ $_wp_attachment_metadata["height"] = $height;
516
+ update_post_meta($item["post_id"], "_wp_attachment_metadata", $_wp_attachment_metadata);
517
+ } else {
518
+ $meta["width"] = $width;
519
+ $meta["height"] = $height;
520
+ }
521
+ }
522
+
523
+ }
524
+
525
+ }
526
+
527
+ return array($item, $meta);
528
+ }
529
+
530
+ public function keep_originals($file)
531
+ {
532
+ $filename = basename($file);
533
+ $dest = str_replace($filename, "", $file);
534
+ $copy = true;
535
+ if (!file_exists($dest . "/.iowd_orig")) {
536
+ mkdir($dest . "/.iowd_orig");
537
+ } else {
538
+ if (file_exists($dest . "/.iowd_orig/" . $filename)) {
539
+ $copy = false;
540
+ }
541
+ }
542
+ if ($copy) {
543
+ copy($dest . $filename, $dest . "/.iowd_orig/" . $filename);
544
+ }
545
+
546
+ }
547
+
548
+ public function api_call_ajax($data, $folder_name, $sub_folder_name, $credentials, $iteration, $id)
549
+ {
550
+
551
+ if ($data) {
552
+ // make api call
553
+ $wd_options = json_decode(get_option(IOWD_PREFIX . "_options"), true);
554
+ $options = array(
555
+ "keep_exif_data" => $wd_options["keep_exif_data"],
556
+ "exclude_full_size_metadata_removal" => $wd_options["exclude_full_size_metadata_removal"],
557
+ "jpg_optimization_levels" => $wd_options["jpg_optimization_levels"],
558
+ "png_optimization_levels" => $wd_options["png_optimization_levels"],
559
+ "gif_optimization_levels" => $wd_options["gif_optimization_levels"],
560
+ );
561
+
562
+ $request_data = array(
563
+ "domain" => site_url(),
564
+ "folder_name" => $folder_name,
565
+ "sub_folder_name" => $sub_folder_name,
566
+ "options" => $options,
567
+ "images_data" => $data,
568
+ "credentials" => $credentials,
569
+ "iteration" => $iteration,
570
+ "id" => $id,
571
+ );
572
+ $headers = array(
573
+ //'accept' => 'application/json',
574
+ //'content-type' => 'application/json',
575
+ );
576
+
577
+ IOWD_Api::set_post_headers_data($headers);
578
+ IOWD_Api::set_post_data($request_data);
579
+ IOWD_Api::set_api_action("compress");
580
+ $response = IOWD_Api::api_request();
581
+
582
+ return $response;
583
+ }
584
+
585
+ return false;
586
+ }
587
+
588
+
589
+ public function save_data_to_db($body, $iterator, $post_id = '')
590
+ {
591
+ global $wpdb;
592
+ $options = json_decode(get_option(IOWD_PREFIX . "_options"), true);
593
+
594
+ $request = get_option("iowd_image_temp_data_" . $post_id);
595
+ $request = isset($request[$iterator]) ? $request[$iterator] : array();
596
+ $_image_size = 0;
597
+ $_image_orig_size = 0;
598
+ $_image_count = 0;
599
+ for ($i = 0; $i < count($request); $i++) {
600
+ $request_row = $request[$i];
601
+ $response_row = isset($body[$request_row["post_id"] . ":" . $request_row["size"]]) ? $body[$request_row["post_id"] . ":" . $request_row["size"]] : false;
602
+
603
+ if ($response_row === false) {
604
+ continue;
605
+ }
606
+ $existing_row = $wpdb->get_row("SELECT id, image_orig_size, image_size,already_optimized FROM " . $wpdb->prefix . "iowd_images WHERE path='" . $request_row["path"] . "' AND post_id='" . $request_row["post_id"] . "'");
607
+
608
+ $type = strtolower(pathinfo($request_row["path"], PATHINFO_EXTENSION));
609
+ if ($existing_row && $existing_row->image_size == $response_row["image_size"] && $type != "webp") {
610
+ continue;
611
+ }
612
+
613
+ if ($options["enable_conversion"] == 1) {
614
+ $request_row = $this->convert($request_row);
615
+ }
616
+
617
+ $image_size = isset($request_row["converted_image_size"]) ? $request_row["converted_image_size"] : ((int)$response_row["image_size"] > (int)$request_row["image_size"] ? $request_row["image_size"] : $response_row["image_size"]);
618
+
619
+ $row_data = array(
620
+ "post_id" => $request_row["post_id"],
621
+ "size" => $request_row["size"],
622
+ "path" => $request_row["path"],
623
+ "image_size" => $image_size,
624
+ "status" => $response_row["status"],
625
+ "updated_date" => date("Y-m-d H:i:s"),
626
+ "media" => $request_row["media"],
627
+ "resized" => $request_row["resized"],
628
+ "converted" => $request_row["converted"],
629
+ );
630
+ $types = array("%s", "%s", "%s", "%d", "%s", "%s", "%d", "%d", "%d");
631
+ $optimization_type = $this->get_current_opt_level($request_row["path"]);
632
+ if (!$existing_row) {
633
+ $row_data["already_optimized"] = $optimization_type;
634
+ $row_data["image_orig_size"] = $request_row["image_size"];
635
+
636
+ $img_orig_size = $request_row["image_size"];
637
+ array_push($types, "%s", "%d");
638
+ // insert to db
639
+ $wpdb->insert($wpdb->prefix . "iowd_images", $row_data, $types);
640
+ } else {
641
+ $row_data["already_optimized"] = $existing_row->already_optimized . "," . $optimization_type;
642
+ array_push($types, "%s");
643
+ $img_orig_size = $existing_row->image_orig_size;
644
+ // update db
645
+ $wpdb->update($wpdb->prefix . "iowd_images", $row_data, array("id" => $existing_row->id), $types);
646
+ }
647
+ $_image_size += $row_data["image_size"];
648
+ $_image_orig_size += $img_orig_size;
649
+ $_image_count += 1;
650
+ }
651
+
652
+ $last_optimized_data = get_site_transient("iowd_last_optimized_data");
653
+ $last_optimized_data = $last_optimized_data ? json_decode($last_optimized_data, true) : array("image_size" => 0, "image_orig_size" => 0, "image_count" => 0);
654
+
655
+ $last_optimized_data["image_size"] = $last_optimized_data["image_size"] + $_image_size;
656
+ $last_optimized_data["image_orig_size"] = $last_optimized_data["image_orig_size"] + $_image_orig_size;
657
+ $last_optimized_data["image_count"] = $last_optimized_data["image_count"] + $_image_count;
658
+
659
+ $already_optimized = get_site_transient("iowd_already_optimized");
660
+ set_site_transient("iowd_already_optimized", ($already_optimized + $_image_count), 43200);
661
+
662
+ set_site_transient("iowd_last_optimized_data", json_encode($last_optimized_data));
663
+
664
+ }
665
+
666
+
667
+ public function convert(&$item)
668
+ {
669
+ require_once IOWD_DIR_CLASSES . "/iowdimage.php";
670
+ require_once IOWD_DIR_INCLUDES . "/iowd-util.php";
671
+ $options = json_decode(get_option(IOWD_PREFIX . "_options"), true);
672
+
673
+ $iowd_image = new IOWDImage();
674
+ $original_file = $item["file"];
675
+
676
+ $mime_type = strtolower(pathinfo($item["file"], PATHINFO_EXTENSION));
677
+ $flag = false;
678
+ $iowd_image->load_image($original_file);
679
+ if (($options["jpg_to_png"] == 1 && ($mime_type == "jpg" || $mime_type == "jpeg")) || ($options["gif_to_png"] == 1 && $mime_type == "gif")) {
680
+ $iowd_image->convert_to_png();
681
+ $flag = "png";
682
+
683
+ } else if ($options["png_to_jpg"] == 1 && $mime_type == "png") {
684
+ $iowd_image->convert_to_jpg();
685
+ $flag = "jpg";
686
+ } else if (($options["jpg_to_webp"] == 1 && ($mime_type == "jpg" || $mime_type == "jpeg")) || ($options["png_to_webp"] == 1 && $mime_type == "png")) {
687
+ $iowd_image->convert_to_webp();
688
+ $flag = "webp";
689
+
690
+ }
691
+
692
+ if ($flag) {
693
+ $item["converted"] = 1;
694
+ if ($item["media"] == 1) {
695
+ if ($item["size"] == "full") {
696
+ global $wpdb;
697
+ // Update the post into the database
698
+ $wpdb->query("UPDATE wp_posts SET guid = CONCAT(TRIM(TRAILING '" . $mime_type . "' FROM guid), '" . $flag . "'),
699
+
700
+ post_mime_type = 'image/" . $flag . "' WHERE ID='" . $item["post_id"] . "'");
701
+
702
+
703
+ // Update the post meta into the database
704
+ $_wp_attached_file = get_post_meta($item["post_id"], "_wp_attached_file");
705
+ $_wp_attached_file = $_wp_attached_file[0];
706
+ $updated__wp_attached_file = IOWD_Util::str_lreplace($mime_type, $flag, $_wp_attached_file);
707
+ update_post_meta($item["post_id"], "_wp_attached_file", $updated__wp_attached_file);
708
+
709
+ $_wp_attachment_metadata = get_post_meta($item["post_id"], "_wp_attachment_metadata");
710
+ $_wp_attachment_metadata = $_wp_attachment_metadata[0];
711
+ $_wp_attachment_metadata["file"] = IOWD_Util::str_lreplace($mime_type, $flag, $_wp_attachment_metadata["file"]);
712
+ update_post_meta($item["post_id"], "_wp_attachment_metadata", $_wp_attachment_metadata);
713
+
714
+ } else {
715
+ $_wp_attachment_metadata = get_post_meta($item["post_id"], "_wp_attachment_metadata");
716
+ $_wp_attachment_metadata = $_wp_attachment_metadata[0];
717
+ $_wp_attachment_metadata["sizes"][$item["size"]]["file"] = IOWD_Util::str_lreplace($mime_type, $flag, $_wp_attachment_metadata["sizes"][$item["size"]]["file"]);
718
+ $_wp_attachment_metadata["sizes"][$item["size"]]["mime-type"] = "image/" . $flag;
719
+ update_post_meta($item["post_id"], "_wp_attachment_metadata", $_wp_attachment_metadata);
720
+
721
+ }
722
+ }
723
+
724
+ $image_name = str_replace("." . $mime_type, "", basename($item["file"]));
725
+ $converted_path = str_replace(basename($item["path"]), "", $item["path"]) . $image_name . "." . $flag;
726
+
727
+ $converted_file = str_replace(basename($item["file"]), "", $item["file"]) . $image_name . "." . $flag;
728
+
729
+ $converted_image_size = filesize($converted_file);
730
+
731
+ $item["converted_image_size"] = $converted_image_size;
732
+ $item["path"] = $converted_path;
733
+
734
+
735
+ unlink($original_file);
736
+ }
737
+
738
+ return $item;
739
+
740
+ }
741
+
742
+
743
+ }
includes/iowd-report.php ADDED
@@ -0,0 +1,125 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if (!defined('ABSPATH')) {
3
+ exit;
4
+ }
5
+
6
+ class IOWD_Report
7
+ {
8
+ private $filter_path = "";
9
+ private $filter_start_date = "";
10
+ private $filter_end_date = "";
11
+ private $filter_size_from = "";
12
+ private $filter_size_to = "";
13
+ private $filter_type = "";
14
+ private $limit = 10;
15
+
16
+ public function __construct()
17
+ {
18
+ if (isset($_POST["path"]) && $_POST["path"] != "") {
19
+ $this->filter_path = $_POST["path"];
20
+ }
21
+ if (isset($_POST["start_date"]) && $_POST["start_date"] != "") {
22
+ $this->filter_start_date = $_POST["start_date"];
23
+ }
24
+ if (isset($_POST["end_date"]) && $_POST["end_date"] != "") {
25
+ $this->filter_end_date = $_POST["end_date"];
26
+ }
27
+ if (isset($_POST["size_from"]) && $_POST["size_from"] != "") {
28
+ $this->filter_size_from = $_POST["size_from"];
29
+ }
30
+ if (isset($_POST["size_to"]) && $_POST["size_to"] != "") {
31
+ $this->filter_size_to = $_POST["size_to"];
32
+ }
33
+ if (isset($_POST["type"]) && $_POST["type"] != "") {
34
+ $this->filter_type = $_POST["type"];
35
+ }
36
+
37
+ if (isset($_POST["limit"]) && $_POST["limit"] != "") {
38
+ $this->limit = $_POST["limit"];
39
+ }
40
+ }
41
+
42
+ public function display()
43
+ {
44
+ // get options
45
+ $options = json_decode(get_option(IOWD_PREFIX . "_options"), true);
46
+
47
+ // report data
48
+ $data = $this->report_data();
49
+ $report_data = $data["rows"];
50
+ $total_count = $data["total_count"];
51
+ $total_orig_size = $data["total_image_orig_size"];
52
+ $total_size = $data["total_image_size"];
53
+
54
+ $limit = $data["limit"];
55
+
56
+ $file_types = array("" => "-" . __("Select", IOWD_PREFIX) . "-", "jpg" => "jpg", "png" => "png", "gif" => "gif", "pdf" => "pdf");
57
+
58
+ // require view template
59
+ require_once(IOWD_DIR_VIEWS . '/iowd_report_display.php');
60
+ }
61
+
62
+
63
+ public function report_data()
64
+ {
65
+ global $wpdb;
66
+ $where = array();
67
+ if ($this->filter_path) {
68
+ $where[] = " path LIKE '%" . $this->filter_path . "%' ";
69
+ }
70
+ if ($this->filter_start_date) {
71
+ $where[] = " updated_date >= '" . $this->filter_start_date . "' ";
72
+ }
73
+ if ($this->filter_end_date) {
74
+ $where[] = " updated_date <= '" . $this->filter_end_date . "' ";
75
+ }
76
+ if ($this->filter_size_from) {
77
+ $where[] = " image_size >= " . (int)$this->filter_size_from . " ";
78
+ }
79
+ if ($this->filter_size_to) {
80
+ $where[] = " image_size <= " . (int)$this->filter_size_to . " ";
81
+ }
82
+ if ($this->filter_type) {
83
+ if ($this->filter_type == "jpg") {
84
+ $where[] = " ( LOWER(SUBSTRING_INDEX(path,'.',-1)) = 'jpg' OR LOWER(SUBSTRING_INDEX(path,'.',-1)) = 'jpeg' )";
85
+ } else {
86
+ $where[] = " LOWER(SUBSTRING_INDEX(path,'.',-1)) = '" . $this->filter_type . "' ";
87
+ }
88
+
89
+ }
90
+ $where = count($where) > 0 ? " AND " . implode(" AND ", $where) : "";
91
+
92
+ $rows = $wpdb->get_results("SELECT id, image_orig_size, image_size, path, post_id, DATE(updated_date) AS date FROM " . $wpdb->prefix . "iowd_images WHERE deleted=0 " . $where . " ORDER BY id DESC LIMIT 0, " . $this->limit);
93
+
94
+ $total_data = $wpdb->get_row("SELECT COUNT(id) AS count, SUM(image_orig_size) AS total_image_orig_size, SUM(image_size) AS total_image_size FROM " . $wpdb->prefix . "iowd_images WHERE deleted=0 " . $where);
95
+
96
+ $count = $total_data ? $total_data->count : 0;
97
+ $total_image_orig_size = $total_data ? $total_data->total_image_orig_size : 0;
98
+ $total_image_size = $total_data ? $total_data->total_image_size : 0;
99
+
100
+ $sizes = array(
101
+ "500000" => "0.5MB",
102
+ "1000000" => "1MB",
103
+ "2000000" => "2MB",
104
+ "4000000" => "4MB",
105
+ "8000000" => "8MB",
106
+ "14000000" => "14MB",
107
+ );
108
+
109
+ $data = array(
110
+ "rows" => $rows,
111
+ "total_count" => $count,
112
+ "total_image_orig_size" => $total_image_orig_size,
113
+ "total_image_size" => $total_image_size,
114
+ "limit" => $this->limit,
115
+ "sizes" => $sizes,
116
+ );
117
+
118
+ return $data;
119
+
120
+ }
121
+
122
+
123
+ }
124
+
125
+
includes/iowd-settings.php ADDED
@@ -0,0 +1,691 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if (!defined('ABSPATH')) {
3
+ exit;
4
+ }
5
+
6
+ class IOWD_Settings
7
+ {
8
+
9
+ private $tabs = array();
10
+
11
+
12
+ public function __construct()
13
+ {
14
+
15
+ $fields = $this->get_fields();
16
+
17
+ $this->tabs = array(
18
+ 'general' => array(
19
+ 'name' => __("General", IOWD_PREFIX),
20
+ 'fields' => $fields["general_fields"],
21
+ ),
22
+ 'conversion' => array(
23
+ 'name' => __("Conversion", IOWD_PREFIX),
24
+ 'fields' => $fields["conversion_fields"],
25
+ ),
26
+ 'advanced' => array(
27
+ 'name' => __("Other", IOWD_PREFIX),
28
+ 'fields' => $fields["advanced_fields"],
29
+ ),
30
+
31
+ );
32
+ }
33
+
34
+ private function get_fields()
35
+ {
36
+ $fields = array();
37
+ // general
38
+ $fields["general_fields"] = array(
39
+ "keep_exif_data" => array(
40
+ "type" => "radio",
41
+ "choices" => array(
42
+ 0 => array(
43
+ "label" => __("No", IOWD_PREFIX),
44
+ "value" => 0,
45
+ "classes" => "",
46
+ "attr" => "",
47
+ ),
48
+ 1 => array(
49
+ "label" => __("Yes", IOWD_PREFIX),
50
+ "value" => 1,
51
+ "classes" => "",
52
+ "attr" => "",
53
+ ),
54
+
55
+ ),
56
+ "label" => __("Keep EXIF data", IOWD_PREFIX),
57
+ "help_text" => "",
58
+ "tooltip" => __("Keep such interchange information as date and time the image was taken, if a flash was used,shutter speed, exposure compensation, F number, etc. EXIF data makes image files larger but if you are a photographer you may want to preserve this information.", IOWD_PREFIX),
59
+ ),
60
+ "exclude_full_size_metadata_removal" => array(
61
+ "type" => "radio",
62
+ "choices" => array(
63
+ 0 => array(
64
+ "label" => __("No", IOWD_PREFIX),
65
+ "value" => 0,
66
+ "classes" => "",
67
+ "attr" => "",
68
+ ),
69
+ 1 => array(
70
+ "label" => __("Yes", IOWD_PREFIX),
71
+ "value" => 1,
72
+ "classes" => "",
73
+ "attr" => "",
74
+ ),
75
+
76
+ ),
77
+ "label" => __("Exclude full-size images from exif data removal", IOWD_PREFIX),
78
+ "help_text" => "",
79
+ "tooltip" => __("Do not remove the descriptive information on full-size images.", IOWD_PREFIX),
80
+ ),
81
+ "keep_originals" => array(
82
+ "type" => "radio",
83
+ "choices" => array(
84
+ 0 => array(
85
+ "label" => __("No", IOWD_PREFIX),
86
+ "value" => 0,
87
+ "classes" => "",
88
+ "attr" => "",
89
+ ),
90
+ 1 => array(
91
+ "label" => __("Yes", IOWD_PREFIX),
92
+ "value" => 1,
93
+ "classes" => "",
94
+ "attr" => "",
95
+ ),
96
+
97
+ ),
98
+ "label" => __("Keep originals", IOWD_PREFIX),
99
+ "help_text" => "",
100
+ "tooltip" => "",
101
+ ),
102
+ "jpg_optimization_levels" => array(
103
+ "type" => "select",
104
+ "choices" => array(
105
+ 0 => array(
106
+ "label" => __("No Compression", IOWD_PREFIX),
107
+ "value" => 0
108
+ ),
109
+ 1 => array(
110
+ "label" => __("Lossless Compression", IOWD_PREFIX),
111
+ "value" => "lossless"
112
+
113
+ ),
114
+ 2 => array(
115
+ "label" => __("Lossy Compression ", IOWD_PREFIX),
116
+ "value" => "lossy40"
117
+ ),
118
+ 3 => array(
119
+ "label" => __("Maximum Lossy Compression (disabled in free version)", IOWD_PREFIX),
120
+ "value" => "",
121
+ "attr" => "disabled",
122
+ ),
123
+
124
+ ),
125
+ "label" => __("JPG Optimization Level", IOWD_PREFIX),
126
+ "classes" => "iowd-elem-250",
127
+ "attr" => "",
128
+ "help_text" => "",
129
+ "tooltip" => __("Lossy: while the size reduction is greater,perceptible loss of quality of the image is possible. Lossless: there will be no loss of the full information contained in the original file.", IOWD_PREFIX),
130
+ ),
131
+ "png_optimization_levels" => array(
132
+ "type" => "select",
133
+ "choices" => array(
134
+ 0 => array(
135
+ "label" => __("No Compression", IOWD_PREFIX),
136
+ "value" => 0
137
+ ),
138
+ 1 => array(
139
+ "label" => __("Lossless Compression", IOWD_PREFIX),
140
+ "value" => "lossless"
141
+
142
+ ),
143
+ 2 => array(
144
+ "label" => __("Lossy Compression ", IOWD_PREFIX),
145
+ "value" => "lossy40"
146
+ ),
147
+ 3 => array(
148
+ "label" => __("Maximum Lossy Compression (disabled in free version)", IOWD_PREFIX),
149
+ "value" => "",
150
+ "attr" => "disabled",
151
+ ),
152
+
153
+ ),
154
+ "label" => __("PNG Optimization Level", IOWD_PREFIX),
155
+ "classes" => "iowd-elem-250",
156
+ "attr" => "",
157
+ "help_text" => "",
158
+ "tooltip" => __("Lossy: while the size reduction is greater,perceptible loss of quality of the image is possible. Lossless: there will be no loss of the full information contained in the original file.", IOWD_PREFIX),
159
+ ),
160
+ "gif_optimization_levels" => array(
161
+ "type" => "select",
162
+ "choices" => array(
163
+ 0 => array(
164
+ "label" => __("No Compression", IOWD_PREFIX),
165
+ "value" => 0
166
+ ),
167
+ 1 => array(
168
+ "label" => __("Lossless Compression", IOWD_PREFIX),
169
+ "value" => "lossless"
170
+
171
+ )
172
+ ),
173
+ "label" => __("GIF Optimization Level", IOWD_PREFIX),
174
+ "classes" => "iowd-elem-250",
175
+ "attr" => "",
176
+ "help_text" => "",
177
+ "tooltip" => __("Lossless: there will be no loss of the full information contained in the original file.", IOWD_PREFIX),
178
+ ),
179
+ "pdf_optimization_levels" => array(
180
+ "type" => "select",
181
+ "choices" => array(
182
+ 0 => array(
183
+ "label" => __("No Compression", IOWD_PREFIX),
184
+ "value" => 0
185
+ )
186
+ ),
187
+ "label" => __("PDF Optimization Level", IOWD_PREFIX),
188
+ "classes" => "iowd-elem-250 iowd-disable",
189
+ "attr" => "disabled",
190
+ "help_text" => "",
191
+ "pro_text" => __("This option is disabled in free version.", IOWD_PREFIX),
192
+ "tooltip" => __("Lossless: there will be no loss of the full information contained in the original file.", IOWD_PREFIX),
193
+ )
194
+ );
195
+ // advanced
196
+
197
+
198
+ $fields["advanced_fields"] = array(
199
+ "scheduled_optimization" => array(
200
+ "type" => "radio",
201
+ "choices" => array(
202
+ 0 => array(
203
+ "label" => __("No", IOWD_PREFIX),
204
+ "value" => 0,
205
+ "classes" => "iowd-disable",
206
+ "attr" => "disabled",
207
+ ),
208
+ 1 => array(
209
+ "label" => __("Yes", IOWD_PREFIX),
210
+ "value" => 1,
211
+ "classes" => "iowd-disable",
212
+ "attr" => "disabled",
213
+ ),
214
+
215
+ ),
216
+ "label" => __("Scheduled optimization", IOWD_PREFIX),
217
+ "help_text" => "",
218
+ "pro_text" => __("This option is disabled in free version.", IOWD_PREFIX),
219
+ "tooltip" => __("The images will be automatically optimized with the chosen frequency.", IOWD_PREFIX),
220
+ ),
221
+
222
+ "exclude_full_size" => array(
223
+ "type" => "radio",
224
+ "choices" => array(
225
+ 0 => array(
226
+ "label" => __("No", IOWD_PREFIX),
227
+ "value" => 0,
228
+ "classes" => "",
229
+ "attr" => "",
230
+ ),
231
+ 1 => array(
232
+ "label" => __("Yes", IOWD_PREFIX),
233
+ "value" => 1,
234
+ "classes" => "",
235
+ "attr" => "",
236
+ ),
237
+
238
+ ),
239
+ "label" => __("Exclude full-size images from optimization", IOWD_PREFIX),
240
+ "help_text" => "",
241
+ "tooltip" => __("Do not optimize full size images.", IOWD_PREFIX),
242
+ ),
243
+
244
+ "enable_resizing" => array(
245
+ "type" => "radio",
246
+ "choices" => array(
247
+ 0 => array(
248
+ "label" => __("No", IOWD_PREFIX),
249
+ "value" => 0,
250
+ "classes" => "",
251
+ "attr" => "",
252
+ ),
253
+ 1 => array(
254
+ "label" => __("Yes", IOWD_PREFIX),
255
+ "value" => 1,
256
+ "classes" => "",
257
+ "attr" => "",
258
+ ),
259
+
260
+ ),
261
+ "label" => __("Resize media full-size images", IOWD_PREFIX),
262
+ "help_text" => "",
263
+ "tooltip" => "",
264
+ ),
265
+ "resize_media_images" => array(
266
+ "type" => "custom",
267
+ "label" => __("Media images dimensions", IOWD_PREFIX),
268
+ "help_text" => "",
269
+ "tooltip" => __("Change the original size of the full-size images.", IOWD_PREFIX),
270
+ ),
271
+
272
+ "enable_resizing_other" => array(
273
+ "type" => "radio",
274
+ "choices" => array(
275
+ 0 => array(
276
+ "label" => __("No", IOWD_PREFIX),
277
+ "value" => 0,
278
+ "classes" => "",
279
+ "attr" => "",
280
+ ),
281
+ 1 => array(
282
+ "label" => __("Yes", IOWD_PREFIX),
283
+ "value" => 1,
284
+ "classes" => "",
285
+ "attr" => "",
286
+ ),
287
+
288
+ ),
289
+ "label" => __("Resize other directory images", IOWD_PREFIX),
290
+ "help_text" => "",
291
+ "tooltip" => "",
292
+ ),
293
+ "resize_other_images" => array(
294
+ "type" => "custom",
295
+ "label" => __("Other directory images dimensions", IOWD_PREFIX),
296
+ "help_text" => "",
297
+ "tooltip" => "",
298
+ ),
299
+ "optimize_thumbs" => array(
300
+ "type" => "custom",
301
+ "label" => __("Optimize these sizes", IOWD_PREFIX),
302
+ "help_text" => "",
303
+ "tooltip" => __("Only optimize images of the selected size", IOWD_PREFIX),
304
+ ),
305
+ "skip_small_images" => array(
306
+ "type" => "text",
307
+ "label" => __("Don't optimize images smaller than", IOWD_PREFIX),
308
+ "classes" => "iowd-elem-80",
309
+ "attr" => "",
310
+ "help_text" => __("In megabytes", IOWD_PREFIX),
311
+ "tooltip" => "",
312
+ ),
313
+ "skip_large_images" => array(
314
+ "type" => "text",
315
+ "label" => __("Don't optimize images larger than", IOWD_PREFIX),
316
+ "classes" => "iowd-elem-80",
317
+ "attr" => "",
318
+ "help_text" => __("In megabytes", IOWD_PREFIX),
319
+ "tooltip" => "",
320
+ ),
321
+
322
+ "optimize_once_more" => array(
323
+ "type" => "radio",
324
+ "choices" => array(
325
+ 0 => array(
326
+ "label" => __("No", IOWD_PREFIX),
327
+ "value" => 0,
328
+ "classes" => "",
329
+ "attr" => "",
330
+ ),
331
+ 1 => array(
332
+ "label" => __("Yes", IOWD_PREFIX),
333
+ "value" => 1,
334
+ "classes" => "",
335
+ "attr" => "",
336
+ ),
337
+
338
+ ),
339
+ "label" => __("In other optimize once more, if optimization level has changed", IOWD_PREFIX),
340
+ "help_text" => "",
341
+ "tooltip" => "",
342
+ ),
343
+ );
344
+ // conversion
345
+ $fields["conversion_fields"] = array(
346
+ "enable_conversion" => array(
347
+ "type" => "radio",
348
+ "choices" => array(
349
+ 0 => array(
350
+ "label" => __("No", IOWD_PREFIX),
351
+ "value" => 0,
352
+ "classes" => "",
353
+ "attr" => "",
354
+ ),
355
+ 1 => array(
356
+ "label" => __("Yes", IOWD_PREFIX),
357
+ "value" => 1,
358
+ "classes" => "",
359
+ "attr" => "",
360
+ ),
361
+
362
+ ),
363
+ "label" => __("Enable conversion", IOWD_PREFIX),
364
+ "help_text" => "",
365
+ "tooltip" => "",
366
+ ),
367
+ "jpg_to_png" => array(
368
+ "type" => "radio",
369
+ "choices" => array(
370
+ 0 => array(
371
+ "label" => __("No", IOWD_PREFIX),
372
+ "value" => 0,
373
+ "classes" => "",
374
+ "attr" => "",
375
+ ),
376
+ 1 => array(
377
+ "label" => __("Yes", IOWD_PREFIX),
378
+ "value" => 1,
379
+ "classes" => "",
380
+ "attr" => "",
381
+ ),
382
+
383
+ ),
384
+ "label" => __("Enable jpg to png conversion", IOWD_PREFIX),
385
+ "help_text" => __("PNG uses lossless compression. It is recommended to use for logos, and other pictures with transparent backgrounds. This option removes image metadata and increases CPU usage.", IOWD_PREFIX),
386
+ "tooltip" => __("Removes metadata and increases cpu usage dramatically", IOWD_PREFIX),
387
+ ),
388
+ "jpg_to_webp" => array(
389
+ "type" => "radio",
390
+ "choices" => array(
391
+ 0 => array(
392
+ "label" => __("No", IOWD_PREFIX),
393
+ "value" => 0,
394
+ "classes" => "",
395
+ "attr" => "",
396
+ ),
397
+ 1 => array(
398
+ "label" => __("Yes", IOWD_PREFIX),
399
+ "value" => 1,
400
+ "classes" => "",
401
+ "attr" => "",
402
+ ),
403
+
404
+ ),
405
+ "label" => __("Enable jpg to webP conversion", IOWD_PREFIX),
406
+ "help_text" => __("WebP lets you have 25-34% smaller images and speed up your website. JPG to WebP conversion is lossy, but it will not affect the image quality significantly.", IOWD_PREFIX),
407
+ "tooltip" => __("JPG to WebP conversion is lossy, but quality loss is minimal", IOWD_PREFIX),
408
+ ),
409
+ "png_to_jpg" => array(
410
+ "type" => "radio",
411
+ "choices" => array(
412
+ 0 => array(
413
+ "label" => __("No", IOWD_PREFIX),
414
+ "value" => 0,
415
+ "classes" => "",
416
+ "attr" => "",
417
+ ),
418
+ 1 => array(
419
+ "label" => __("Yes", IOWD_PREFIX),
420
+ "value" => 1,
421
+ "classes" => "",
422
+ "attr" => "",
423
+ ),
424
+
425
+ ),
426
+ "label" => __("Enable png to jpg conversion", IOWD_PREFIX),
427
+ "help_text" => __("JPG format is recommended to use for photographs and similar high-resolution images. Since it uses lossy compression, some of the image data is lost when the image is compressed.", IOWD_PREFIX),
428
+ "tooltip" => __("This is not a lossless conversion", IOWD_PREFIX),
429
+ ),
430
+ "png_to_webp" => array(
431
+ "type" => "radio",
432
+ "choices" => array(
433
+ 0 => array(
434
+ "label" => __("No", IOWD_PREFIX),
435
+ "value" => 0,
436
+ "classes" => "",
437
+ "attr" => "",
438
+ ),
439
+ 1 => array(
440
+ "label" => __("Yes", IOWD_PREFIX),
441
+ "value" => 1,
442
+ "classes" => "",
443
+ "attr" => "",
444
+ ),
445
+
446
+ ),
447
+ "label" => __("Enable png to webP conversion", IOWD_PREFIX),
448
+ "help_text" => __("PNG to WebP conversion is lossless. WebP images are 26% smaller in size, than their PNGs. This lets you make your website faster.", IOWD_PREFIX),
449
+ "tooltip" => __("PNG to WebP conversion is lossless.", IOWD_PREFIX),
450
+ ),
451
+ "gif_to_png" => array(
452
+ "type" => "radio",
453
+ "choices" => array(
454
+ 0 => array(
455
+ "label" => __("No", IOWD_PREFIX),
456
+ "value" => 0,
457
+ "classes" => "",
458
+ "attr" => "",
459
+ ),
460
+ 1 => array(
461
+ "label" => __("Yes", IOWD_PREFIX),
462
+ "value" => 1,
463
+ "classes" => "",
464
+ "attr" => "",
465
+ ),
466
+
467
+ ),
468
+ "label" => __("Enable gif to png conversion", IOWD_PREFIX),
469
+ "help_text" => __("PNG uses lossless compression. It is recommended for logos and pictures with transparent backgrounds. Note, that animated GIFs cannot be converted.", IOWD_PREFIX),
470
+ "tooltip" => __("Gif to png conversion has no wornings.", IOWD_PREFIX),
471
+ ),
472
+
473
+ );
474
+
475
+
476
+ return $fields;
477
+
478
+ }
479
+
480
+ public static function save_settings()
481
+ {
482
+ check_admin_referer('nonce_' . IOWD_PREFIX, 'nonce_' . IOWD_PREFIX);
483
+ if (isset($_POST["standard_setting"]) && $_POST["standard_setting"]) {
484
+ self::save_standard_settings();
485
+ } else {
486
+ $old_settings = json_decode(get_option(IOWD_PREFIX . "_options"), true);
487
+ $new_settings = array();
488
+ foreach ($old_settings as $setting_key => $setting) {
489
+ $new_settings[$setting_key] = isset($_POST[$setting_key]) ? esc_html($_POST[$setting_key]) : $setting;
490
+ }
491
+ if ($new_settings["scheduled_optimization"] == "0") {
492
+ wp_clear_scheduled_hook('iowd_optimize');
493
+ }
494
+
495
+ update_option(IOWD_PREFIX . "_options", json_encode($new_settings));
496
+ }
497
+ $iowd_tabs_active = isset($_POST["iowd_tabs_active"]) ? $_POST["iowd_tabs_active"] : "general";
498
+ $ids = isset($_POST["ids"]) ? $_POST["ids"] : "";
499
+ IOWD_Helper::redirect(array("page" => "iowd_settings", "msg" => "1", "iowd_tabs_active" => $iowd_tabs_active, "ids" => $ids));
500
+ }
501
+
502
+ public static function save_standard_settings()
503
+ {
504
+ if (isset($_POST["standard_setting"])) {
505
+ $value = $_POST["standard_setting"] == "conservative" || $_POST["standard_setting"] == "balanced" || $_POST["standard_setting"] == "extreme" ? $_POST["standard_setting"] : "conservative";
506
+
507
+ if (get_option(IOWD_PREFIX . "_standart_setting")) {
508
+ update_option(IOWD_PREFIX . "_standart_setting", $value);
509
+ } else {
510
+ add_option(IOWD_PREFIX . "_standart_setting", $value, '', 'no');
511
+ }
512
+
513
+ $settings = json_decode(get_option(IOWD_PREFIX . "_options"), true);
514
+
515
+ if ($value == "conservative") {
516
+ $settings["keep_exif_data"] = 1;
517
+ $settings["exclude_full_size_metadata_removal"] = 1;
518
+ $settings["exclude_full_size"] = 1;
519
+ $settings["jpg_optimization_levels"] = "lossless";
520
+ $settings["png_optimization_levels"] = "lossless";
521
+ $settings["gif_optimization_levels"] = "lossless";
522
+ $settings["pdf_optimization_levels"] = "lossless";
523
+
524
+ update_option(IOWD_PREFIX . "_options", json_encode($settings));
525
+ } else if ($value == "balanced") {
526
+ $settings["keep_exif_data"] = 0;
527
+ $settings["exclude_full_size_metadata_removal"] = 0;
528
+ $settings["exclude_full_size"] = 1;
529
+ $settings["jpg_optimization_levels"] = "lossy40";
530
+ $settings["png_optimization_levels"] = "lossy40";
531
+ $settings["gif_optimization_levels"] = "lossless";
532
+ $settings["pdf_optimization_levels"] = "lossless";
533
+ update_option(IOWD_PREFIX . "_options", json_encode($settings));
534
+ }
535
+ }
536
+ }
537
+
538
+ public function display()
539
+ {
540
+ // get options
541
+ $options = json_decode(get_option(IOWD_PREFIX . "_options"), true);
542
+ // get mode
543
+ $mode = get_option(IOWD_PREFIX . "_mode");
544
+ $mode = $mode ? $mode : "standart";
545
+
546
+ // get standart setting
547
+ $standart_setting = get_option(IOWD_PREFIX . "_standart_setting");
548
+ $standart_setting = $standart_setting ? $standart_setting : "conservative";
549
+
550
+ // statistics data
551
+ $stat = $this->get_statistics();
552
+
553
+ // scan
554
+ $optimize = new IOWD_Optimize();
555
+ $other_folders = json_decode(htmlspecialchars_decode(stripslashes($options["other_folders"])), true);
556
+
557
+ $other = empty($other_folders) === false && is_array($other_folders) ? true : false;
558
+
559
+ $scan = $optimize->scan(array(), $other);
560
+
561
+ $iowd_tabs_active = isset($_REQUEST["iowd_tabs_active"]) ? $_REQUEST["iowd_tabs_active"] : "general";
562
+ $iowd_sizes = IOWD_Helper::wp_get_image_sizes();
563
+
564
+ // if from bilk optimaze
565
+ $attachments = array();
566
+ $ids = isset($_GET["ids"]) && $_GET["ids"] ? explode(",", $_GET["ids"]) : array();
567
+ if ($ids) {
568
+ $optimize = new IOWD_Optimize(true);
569
+ $attachments = $optimize->get_attachments($ids);
570
+ }
571
+ $last_optimized_data = get_site_transient("iowd_last_optimized_data");
572
+ $last_optimized_data = $last_optimized_data ? json_decode($last_optimized_data, true) : array("image_size" => 0, "image_orig_size" => 0, "image_count" => 0);
573
+
574
+ $last_optimized_data_reduced = $last_optimized_data["image_orig_size"] - $last_optimized_data["image_size"];
575
+ $last_optimized_data_reduced_percent = $last_optimized_data["image_orig_size"] ? ($last_optimized_data_reduced / $last_optimized_data["image_orig_size"]) * 100 : 0;
576
+ $last_optimized_data_reduced_percent = number_format($last_optimized_data_reduced_percent, 2);
577
+
578
+ $msg = "";
579
+ $msg_style = "";
580
+ $msg_class = "";
581
+
582
+ if ($options["jpg_optimization_levels"] == "0" && $options["png_optimization_levels"] == "0" && $options["gif_optimization_levels"] == "0" && $options["pdf_optimization_levels"] == "0") {
583
+
584
+ $msg = __("Please select at least one optimization level for image types you want to optimize.", IOWD_PREFIX);
585
+ $msg_style = 'style="display: block;"';
586
+ $msg_class = "iowd_msg_div_error";
587
+ } else if (get_site_transient("iowd_done_") == "1") {
588
+ $images_count = get_transient("iowd_images_count_start") ? get_transient("iowd_images_count_start") : 0;
589
+ $images_count = $images_count ? $images_count : "No";
590
+ $skipped = $images_count - $last_optimized_data["image_count"];
591
+ $msg = $last_optimized_data["image_count"] . " " . __("images have been optimized.", IOWD_PREFIX);
592
+ if ($skipped) {
593
+ $msg .= " " . $skipped . " " . __("images were skipped.", IOWD_PREFIX);
594
+ }
595
+ $msg_style = 'style="display: block;"';
596
+ $msg_class = "iowd_msg_div_msg";
597
+ delete_site_transient("iowd_done_");
598
+ delete_transient("iowd_images_count_start");
599
+ delete_transient("iowd_optimizing_post_ids");
600
+ } else if (get_transient("iowd_response_error")) {
601
+ $error = get_transient("iowd_response_error");
602
+
603
+ if ($error == "no_job") {
604
+ $msg = __("Something went wrong. Please try after few minutes.", IOWD_PREFIX);
605
+ } elseif ($error == "no_agreement") {
606
+ $msg = __("No agreement found.", IOWD_PREFIX);
607
+ } else if ($error == "empty_credentials") {
608
+ $msg = __("Empty credentials, please try again.", IOWD_PREFIX);
609
+ }
610
+
611
+ if ($msg) {
612
+ $msg_style = 'style="display: block;"';
613
+ $msg_class = "iowd_msg_div_error";
614
+ }
615
+ delete_transient("iowd_response_error");
616
+ }
617
+
618
+
619
+ $limitation = IOWD_Helper::limitation();
620
+ // require view template
621
+
622
+ require_once(IOWD_DIR_VIEWS . '/iowd_settings_display.php');
623
+ }
624
+
625
+ public function get_statistics()
626
+ {
627
+ global $wpdb;
628
+ $rows = $wpdb->get_results("SELECT * FROM " . $wpdb->prefix . "iowd_images");
629
+
630
+ $total_size = 0;
631
+ $total_orig_size = 0;
632
+ $total_size_other = 0;
633
+ $total_orig_size_other = 0;
634
+
635
+
636
+ $protocaol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http';
637
+ foreach ($rows as $row) {
638
+ /* $file = str_replace( $protocaol . '://' . $_SERVER['SERVER_NAME'], $_SERVER['DOCUMENT_ROOT'], $row->path ) ;
639
+ if( !file_exists( $file ) ){
640
+ continue;
641
+ }
642
+ else {
643
+ if( $row->media == 1 ){
644
+ if( get_post_status ( $row->post_id ) == false ){
645
+ continue;
646
+ }
647
+ }
648
+ else{
649
+ //to do
650
+ }
651
+
652
+ }*/
653
+
654
+ if ($row->media == 0) {
655
+ $total_size_other += $row->image_size;
656
+ $total_orig_size_other += $row->image_orig_size;
657
+ } else {
658
+ $total_size += $row->image_size;
659
+ $total_orig_size += $row->image_orig_size;
660
+ }
661
+
662
+
663
+ }
664
+
665
+ $total_reduced = $total_orig_size - $total_size;
666
+ $total_reduced_persent = $total_orig_size ? ($total_reduced / $total_orig_size) * 100 : 0;
667
+
668
+ $total_reduced_other = $total_orig_size_other - $total_size_other;
669
+ $total_reduced_persent_other = $total_orig_size_other ? ($total_reduced_other / $total_orig_size_other) * 100 : 0;
670
+
671
+ $total = $total_reduced + $total_reduced_other;
672
+ $total_persent = ($total_orig_size + $total_orig_size_other) ? ($total / ($total_orig_size + $total_orig_size_other)) * 100 : 0;
673
+
674
+ $total_reduced_persent = number_format($total_reduced_persent, 2);
675
+ $total_reduced_persent_other = number_format($total_reduced_persent_other, 2);
676
+ $total_persent = number_format($total_persent, 2);
677
+
678
+ return array(
679
+ "total_reduced" => $total_reduced,
680
+ "total_reduced_persent" => $total_reduced_persent,
681
+ "total_reduced_other" => $total_reduced_other,
682
+ "total_reduced_persent_other" => $total_reduced_persent_other,
683
+ "total" => $total,
684
+ "total_persent" => $total_persent,
685
+ );
686
+ }
687
+
688
+
689
+ }
690
+
691
+
includes/iowd-uninstall.php ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if (!defined('ABSPATH')) {
3
+ exit;
4
+ }
5
+
6
+ class IOWD_Uninstall
7
+ {
8
+
9
+ public function display()
10
+ {
11
+ require_once(IOWD_DIR_VIEWS . '/iowd_uninstall_display.php');
12
+
13
+ }
14
+
15
+ }
16
+
17
+
includes/iowd-util.php ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if (!defined('ABSPATH')) {
3
+ exit;
4
+ }
5
+
6
+ class IOWD_Util
7
+ {
8
+
9
+
10
+ public static function format_bytes($bytes, $precision = 2)
11
+ {
12
+ $units = array('B', 'KB', 'MB', 'GB', 'TB');
13
+ if ($bytes == 0) {
14
+ return '0 B';
15
+ }
16
+
17
+ $bytes = max($bytes, 0);
18
+ $pow = floor(($bytes ? log($bytes) : 0) / log(1024));
19
+
20
+ $pow = min($pow, count($units) - 1);
21
+
22
+ $bytes /= pow(1024, $pow);
23
+
24
+
25
+ return round($bytes, $precision) . ' ' . $units[$pow];
26
+ }
27
+
28
+ public static function str_lreplace($search, $replace, $subject)
29
+ {
30
+ $pos = strrpos($subject, $search);
31
+ if ($pos !== false) {
32
+ $subject = substr_replace($subject, $replace, $pos, strlen($search));
33
+ }
34
+
35
+ return $subject;
36
+ }
37
+
38
+ public static function is_transparent_png($file)
39
+ {
40
+ //4 checks for greyscale + alpha and RGB + alpha
41
+ if ((ord(file_get_contents($file, false, null, 25, 1)) & 4)) {
42
+ return true;
43
+ }
44
+ $contents = file_get_contents( $file );
45
+
46
+ if ( stripos( $contents, 'PLTE' ) !== false && stripos( $contents, 'tRNS' ) !== false ) {
47
+ return true;
48
+ }
49
+ return false;
50
+
51
+ }
52
+
53
+ }
io-wd.php ADDED
@@ -0,0 +1,82 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Plugin Name: Image Optimizer WD
5
+ * Plugin URI: https://web-dorado.com/products/wordpress-image-optimizer.html
6
+ * Description: Image Optimizer WordPress plugin enables you to resize, compress and optimize PNG, JPG, GIF files while maintaining image quality.
7
+ * Version: 1.0.0
8
+ * Author: WebDorado
9
+ * Author URI: https://web-dorado.com/
10
+ * License: GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
11
+ */
12
+
13
+ define('IOWD_DIR', WP_PLUGIN_DIR . "/" . plugin_basename(dirname(__FILE__)));
14
+ define('IOWD_URL', plugins_url(plugin_basename(dirname(__FILE__))));
15
+ define('IOWD_DIR_INCLUDES', IOWD_DIR . '/includes');
16
+ define('IOWD_DIR_CLASSES', IOWD_DIR . '/classes');
17
+ define('IOWD_DIR_VIEWS', IOWD_DIR . '/views');
18
+ define('IOWD_URL_CSS', IOWD_URL . '/assets/css');
19
+ define('IOWD_URL_JS', IOWD_URL . '/assets/js');
20
+ define('IOWD_URL_IMG', IOWD_URL . '/assets/img');
21
+
22
+
23
+ define('IOWD_NAME', plugin_basename(dirname(__FILE__)));
24
+ define('IOWD_MAIN_FILE', plugin_basename(__FILE__));
25
+ define('IOWD_PREFIX', "iowd");
26
+ //define( 'IOWD_API_URL', "http://local.web-dorado.info/IO_api/v1/" );
27
+ define('IOWD_API_URL', "https://optimizer.web-dorado.com/api/");
28
+
29
+ setlocale(LC_ALL, 'en_US.UTF-8');
30
+
31
+ require_once('vendor/autoload.php');
32
+
33
+ if (class_exists("WP_REST_Controller")) {
34
+ require_once('iowd-rest.php');
35
+ add_action('rest_api_init', function () {
36
+ $rest = new IOWD_Rest();
37
+ $rest->register_routes();
38
+ });
39
+ }
40
+
41
+ if (is_admin() || (defined('DOING_CRON') && DOING_CRON)) {
42
+ require_once('iowd_class.php');
43
+ require_once(IOWD_DIR_INCLUDES . '/iowd-media-library.php');
44
+ register_activation_hook(__FILE__, array('IOWD', 'activate'));
45
+ add_action('plugins_loaded', array('IOWD', 'get_instance'));
46
+
47
+ register_deactivation_hook(__FILE__, array('IOWD', 'deactivate'));
48
+
49
+ }
50
+
51
+ if (!class_exists("DoradoWeb")) {
52
+ require_once(IOWD_DIR . '/wd/start.php');
53
+ }
54
+
55
+ global $iowd_plugin_options;
56
+
57
+ $iowd_plugin_options = array(
58
+ "prefix" => IOWD_PREFIX,
59
+ "wd_plugin_id" => 181,
60
+ "plugin_title" => "Image Optimizer WD",
61
+ "plugin_wordpress_slug" => "image-optimizer-wd",
62
+ "plugin_dir" => IOWD_DIR,
63
+ "plugin_main_file" => __FILE__,
64
+ "description" => '',
65
+ "plugin_features" => array(),
66
+ "user_guide" => array(),
67
+ "overview_welcome_image" => null,
68
+ "video_youtube_id" => "",
69
+ "plugin_wd_url" => "",
70
+ "plugin_wd_demo_link" => "",
71
+ "plugin_wd_addons_link" => "",
72
+ "after_subscribe" => "admin.php?page=iowd_settings",
73
+ "plugin_wizard_link" => "",
74
+ "plugin_menu_title" => __('Image optimizer', IOWD_PREFIX),
75
+ "plugin_menu_icon" => IOWD_URL_IMG . "/icon.png",
76
+ "deactivate" => true,
77
+ "subscribe" => true,
78
+ "custom_post" => false,
79
+ "menu_capability" => "manage_options",
80
+ "menu_position" => null,
81
+ );
82
+ dorado_web_init($iowd_plugin_options);
iowd-rest.php ADDED
@@ -0,0 +1,147 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Created by PhpStorm.
5
+ * User: Araqel
6
+ * Date: 08/04/2017
7
+ * Time: 1:38 PM
8
+ */
9
+
10
+ use Aws\CommandPool;
11
+ use Aws\S3\Exception\S3Exception;
12
+ use Aws\S3\S3Client;
13
+
14
+ require_once IOWD_DIR_INCLUDES . "/iowd-optimize.php";
15
+
16
+ class IOWD_Rest extends WP_REST_Controller
17
+ {
18
+ private $version = '1';
19
+ private $route = 'iowd';
20
+ private $region = 'us-west-2';
21
+
22
+ public function register_routes()
23
+ {
24
+ $namespace = $this->route . '/v' . $this->version;
25
+ register_rest_route($namespace, '/images/download', array(
26
+ array(
27
+ 'methods' => WP_REST_Server::CREATABLE,
28
+ 'callback' => array($this, 'download_images'),
29
+ 'args' => array(
30
+ 'bucket' => array(
31
+ 'required' => true,
32
+ 'type' => 'string',
33
+ ),
34
+ 'post_id' => array(
35
+ 'required' => true,
36
+ ),
37
+ 'iteration' => array(
38
+ 'required' => true,
39
+ ),
40
+ 'images_data' => array(
41
+ 'required' => true
42
+ ),
43
+ ),
44
+ )
45
+ ));
46
+
47
+ }
48
+
49
+ //TODO optimize async download
50
+ //TODO check which way is faster ( i think $promies->wait())
51
+ public function download_images(WP_REST_Request $request)
52
+ {
53
+ clearstatcache();
54
+ @ini_set('max_execution_time',1300);
55
+ $bucket = $request->get_param('bucket');
56
+ $images_data = $request->get_param('images_data');
57
+ $post_id = $request->get_param('post_id');
58
+ $iteration = $request->get_param('iteration');
59
+ $credentials = get_option("iowd_crd_" . $post_id);
60
+
61
+ $s3args = array(
62
+ 'version' => 'latest',
63
+ 'region' => $this->region,
64
+ 'credentials' => $credentials,
65
+ );
66
+
67
+ $s3client = new S3Client($s3args);
68
+
69
+ try {
70
+ $commands = array();
71
+ foreach ($images_data as $image_data) {
72
+ if ($s3client->doesObjectExist($bucket, $image_data["path"])) {
73
+ $commands[] = $s3client->getCommand('getObject', array(
74
+ 'Bucket' => $bucket,
75
+ 'Key' => $image_data["path"],
76
+ 'SaveAs' => $image_data["wp_path"],
77
+ ));
78
+ }
79
+ }
80
+ if (empty($commands) === false) {
81
+ $pool = new CommandPool($s3client, $commands);
82
+ $promise = $pool->promise();
83
+ $promise->wait();
84
+ }
85
+ $optimizer = new IOWD_Optimize();
86
+ $optimizer->save_data_to_db($images_data, $iteration, $post_id);
87
+
88
+ $received_images = get_site_transient("iowd_received_images_" . $post_id);
89
+ if (!$received_images) {
90
+ $data_count = get_option("iowd_data_count_" . $post_id);
91
+ $received_images = range(0, $data_count-1);
92
+ }
93
+ unset($received_images[$iteration]);
94
+
95
+ if (empty($received_images) === true) {
96
+ delete_site_transient("iowd_received_images_" . $post_id);
97
+ $post_ids = get_transient("iowd_optimizing_post_ids");
98
+ if (($key = array_search($post_id, $post_ids)) !== false) {
99
+ unset($post_ids[$key]);
100
+ set_transient("iowd_optimizing_post_ids", $post_ids);
101
+ } else {
102
+ delete_transient("iowd_optimizing_post_ids");
103
+ }
104
+ delete_option("iowd_crd_" . $post_id);
105
+ delete_option("iowd_image_temp_data_" . $post_id);
106
+ delete_option("iowd_data_count_" . $post_id);
107
+ if (strpos($post_id, "auto") === false) {
108
+ set_site_transient("iowd_done_" . $post_id, 1);
109
+ }
110
+ } else {
111
+ set_site_transient("iowd_received_images_" . $post_id, $received_images);
112
+ }
113
+
114
+
115
+ } catch (S3Exception $e) {
116
+ IOWD_Log::error_log($e->getMessage());
117
+
118
+ return new WP_Error($e->getCode() == 0 ? 'amazon' : $e->getCode(), $e->getMessage());
119
+ }
120
+
121
+ return new WP_REST_Response(array('status' => 'ok', 'message' => 'success'), 200);
122
+ }
123
+
124
+ /* public function validate_credentials($param)
125
+ {
126
+ if (!$this->is_array($param)) {
127
+ return false;
128
+ }
129
+
130
+ $haystack = array('AccessKeyId', 'SecretAccessKey', 'SessionToken', 'Expiration');
131
+ $niddle = array_keys($param);
132
+
133
+ if (!array_diff($niddle, $haystack)) {
134
+ return true;
135
+ }
136
+
137
+ return false;
138
+
139
+ }
140
+
141
+ public function is_array($param)
142
+ {
143
+ return is_array($param);
144
+ }*/
145
+
146
+
147
+ }
iowd_class.php ADDED
@@ -0,0 +1,490 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if (!defined('ABSPATH')) {
4
+ exit;
5
+ }
6
+
7
+ class IOWD
8
+ {
9
+
10
+ protected static $instance = null;
11
+ private static $version = '1.0.0';
12
+ private static $page;
13
+ private $reg_autoloader = false;
14
+ private $options = array();
15
+
16
+ private function __construct()
17
+ {
18
+
19
+ self::$page = isset($_GET["page"]) ? $_GET["page"] : 'iowd';
20
+ $this->options = json_decode(get_option(IOWD_PREFIX . "_options"), true);
21
+
22
+ add_action('admin_post_save_settings', array('IOWD_Settings', 'save_settings'));
23
+ add_action('admin_post_nopriv_save_settings', array('IOWD_Settings', 'save_settings'));
24
+
25
+ // ajax
26
+ add_action('wp_ajax_choose_dirs', array($this, 'ajax'));
27
+ add_action('wp_ajax_optimize', array($this, 'ajax'));
28
+ add_action('wp_ajax_get_attachment_data', array($this, 'ajax'));
29
+ add_action('wp_ajax_finish_bulk', array($this, 'ajax'));
30
+ add_action('wp_ajax_abort', array($this, 'ajax'));
31
+
32
+ add_action('wp_ajax_filter_report', array($this, 'ajax'));
33
+ add_action('wp_ajax_get_stats', array($this, 'ajax'));
34
+ add_action('wp_ajax_clear_report', array($this, 'ajax'));
35
+ add_action('wp_ajax_quick_settings', array($this, 'ajax'));
36
+ add_action('wp_ajax_update_already_used', array($this, 'ajax'));
37
+
38
+ add_action('admin_notices', array($this, 'notice'));
39
+
40
+ add_action('wp_ajax_get_subdirs', array($this, 'ajax'));
41
+
42
+ // autoloder
43
+ add_action('init', array($this, 'register_autoloader'));
44
+
45
+ require_once IOWD_DIR_INCLUDES . "/iowd-helper.php";
46
+ $limitation = IOWD_Helper::limitation();
47
+ if ($limitation["already_optimized"] < $limitation["limit"]) {
48
+ add_filter('wp_update_attachment_metadata', array($this, 'auto_optimize'), 15, 2);
49
+ }
50
+
51
+ add_action('admin_init', array($this, 'actions'));
52
+
53
+ // Add menu
54
+ add_action('admin_menu', array($this, 'admin_menu'));
55
+
56
+ // Add admin styles and scripts
57
+ add_action('admin_enqueue_scripts', array($this, 'styles'));
58
+ add_action('admin_enqueue_scripts', array($this, 'scripts'));
59
+
60
+ add_action('admin_init', array($this, 'includes'));
61
+
62
+ if (!get_option(IOWD_PREFIX . "_options")) {
63
+ self::add_options_to_db(true);
64
+ }
65
+
66
+ }
67
+
68
+ public static function activate()
69
+ {
70
+
71
+ //delete_transient('iowd_update_check');
72
+ require_once IOWD_DIR_INCLUDES . "/iowd-helper.php";
73
+ IOWD_Helper::update_already_used();
74
+ $version = get_option(IOWD_PREFIX . "_version");
75
+ if (get_option(IOWD_PREFIX . "_pro")) {
76
+ update_option(IOWD_PREFIX . "_pro", "yes");
77
+ } else {
78
+ add_option(IOWD_PREFIX . "_pro", "yes", '', 'no');
79
+ }
80
+
81
+ if ($version && version_compare($version, self::$version, '<')) {
82
+ update_option(IOWD_PREFIX . "_version", self::$version);
83
+
84
+ } else {
85
+ add_option(IOWD_PREFIX . "_version", self::$version, '', 'no');
86
+
87
+ if (!get_option(IOWD_PREFIX . "_mode")) {
88
+ add_option(IOWD_PREFIX . '_mode', "standart", '', 'no');
89
+ }
90
+
91
+ if (!get_option(IOWD_PREFIX . "_standart_setting")) {
92
+ add_option(IOWD_PREFIX . '_standart_setting', "conservative", '', 'no');
93
+ }
94
+
95
+ self::add_options_to_db();
96
+ require_once IOWD_DIR_CLASSES . "/iowddb.php";
97
+ $db = new IOWDDB();
98
+ $db->create_iowd_images_table();
99
+ }
100
+
101
+ }
102
+
103
+ private static function add_options_to_db($delete = false)
104
+ {
105
+ if ($delete == true) {
106
+ delete_option(IOWD_PREFIX . "_options");
107
+ }
108
+ require_once IOWD_DIR_INCLUDES . "/iowd-helper.php";
109
+ $sizes = IOWD_Helper::wp_get_image_sizes();
110
+ $sizes = is_array($sizes) && empty($sizes) === false ? implode(",", array_keys($sizes)) : "";
111
+
112
+ $options = array(
113
+ "api_key" => "",
114
+ "automatically_optimize" => "0",
115
+ "keep_exif_data" => "1",
116
+ "keep_originals" => "0",
117
+ "jpg_optimization_levels" => "lossy40",
118
+ "png_optimization_levels" => "lossy40",
119
+ "gif_optimization_levels" => "lossless",
120
+ "pdf_optimization_levels" => "0",
121
+ "scheduled_optimization" => "0",
122
+ "scheduled_optimization_recurrence" => "",
123
+ "other_folders" => "",
124
+ "resize_media_images_width" => "",
125
+ "resize_media_images_height" => "",
126
+ "enable_resizing" => "",
127
+ "enable_resizing_other" => "",
128
+ "resize_other_images_width" => "",
129
+ "resize_other_images_height" => "",
130
+ "optimize_thumbs" => $sizes,
131
+ "skip_small_images" => "",
132
+ "skip_large_images" => "",
133
+ "exclude_full_size" => "1",
134
+ "exclude_full_size_metadata_removal" => "0",
135
+ "optimize_once_more" => "1",
136
+ "enable_conversion" => "0",
137
+ "jpg_to_png" => "0",
138
+ "png_to_jpg" => "0",
139
+ "gif_to_png" => "0",
140
+ "jpg_to_webp" => "0",
141
+ "png_to_webp" => "0",
142
+ );
143
+ add_option(IOWD_PREFIX . "_options", json_encode($options), '', 'no');
144
+ }
145
+
146
+ public static function deactivate()
147
+ {
148
+ wp_clear_scheduled_hook('iowd_optimize');
149
+ }
150
+
151
+ public static function get_instance()
152
+ {
153
+ if (null == self::$instance) {
154
+ self::$instance = new self;
155
+ }
156
+
157
+ return self::$instance;
158
+ }
159
+
160
+ public static function autoload($class)
161
+ {
162
+ $class = str_replace("_", "-", strtolower($class));
163
+ $include_file = IOWD_DIR_INCLUDES . "/" . $class . ".php";
164
+ if (file_exists($include_file)) {
165
+ include_once $include_file;
166
+ }
167
+ }
168
+
169
+ public static function autoloadProxy($class)
170
+ {
171
+ __autoload($class);
172
+ }
173
+
174
+ // Return an instance of this class.
175
+
176
+ public function notice()
177
+ {
178
+ if($this->is_iowd_page()) {
179
+ $limitation = IOWD_Helper::limitation();
180
+ $whitelist = array(
181
+ '127.0.0.1',
182
+ '::1'
183
+ );
184
+ if(in_array($_SERVER['REMOTE_ADDR'], $whitelist)){
185
+ echo "<div class='error'><p>" . __("Image optimizing is disabled on Localhost. Please install the plugin on a live server to optimize images.", IOWD_PREFIX) . "</p></div>";
186
+ }
187
+ if ($limitation["already_optimized"] >= $limitation["limit"]) {
188
+ echo "<div class='error'><p>" . sprintf(__("Your subscription plan allows optimizing %s images per month. This limitation has expired for current month.", IOWD_PREFIX), $limitation["limit"]) . "</p></div>";
189
+ }
190
+ if (!class_exists("WP_REST_Controller")) {
191
+ echo "<div class='error'><p>" . __("Image Optimizer plugin requires WordPress 4.7 or higher.", IOWD_PREFIX) . "</p></div>";
192
+ }
193
+ }
194
+
195
+
196
+ }
197
+
198
+ // Admin menu
199
+
200
+ public function actions()
201
+ {
202
+
203
+ if (isset($_GET["iowd_mode"])) {
204
+ $mode = ($_GET["iowd_mode"] == "standart" || $_GET["iowd_mode"] == "advanced") ? $_GET["iowd_mode"] : "standart";
205
+
206
+ if (get_option(IOWD_PREFIX . "_mode")) {
207
+ update_option(IOWD_PREFIX . "_mode", $mode);
208
+ } else {
209
+ add_option(IOWD_PREFIX . '_mode', $mode, '', 'no');
210
+ }
211
+ if ($mode == "standart") {
212
+ $standart_setting = get_option(IOWD_PREFIX . "_standart_setting");
213
+ $settings = json_decode(get_option(IOWD_PREFIX . "_options"), true);
214
+ if ($standart_setting == "conservative") {
215
+ $settings["keep_exif_data"] = 1;
216
+ $settings["exclude_full_size_metadata_removal"] = 1;
217
+ $settings["exclude_full_size"] = 1;
218
+ $settings["jpg_optimization_levels"] = "lossless";
219
+ $settings["png_optimization_levels"] = "lossless";
220
+ $settings["gif_optimization_levels"] = "lossless";
221
+ $settings["pdf_optimization_levels"] = "lossless";
222
+
223
+ update_option(IOWD_PREFIX . "_options", json_encode($settings));
224
+ } else if ($standart_setting == "balanced") {
225
+ $settings["keep_exif_data"] = 1;
226
+ $settings["exclude_full_size_metadata_removal"] = 1;
227
+ $settings["exclude_full_size"] = 1;
228
+ $settings["jpg_optimization_levels"] = "lossy40";
229
+ $settings["png_optimization_levels"] = "lossy40";
230
+ $settings["gif_optimization_levels"] = "lossless";
231
+ $settings["pdf_optimization_levels"] = "lossless";
232
+
233
+ update_option(IOWD_PREFIX . "_options", json_encode($settings));
234
+ } else if ($standart_setting == "extreme") {
235
+ $settings["keep_exif_data"] = 0;
236
+ $settings["exclude_full_size_metadata_removal"] = 0;
237
+ $settings["exclude_full_size"] = 0;
238
+ $settings["jpg_optimization_levels"] = "lossy";
239
+ $settings["png_optimization_levels"] = "lossy";
240
+ $settings["gif_optimization_levels"] = "lossless";
241
+ $settings["pdf_optimization_levels"] = "lossless";
242
+
243
+ update_option(IOWD_PREFIX . "_options", json_encode($settings));
244
+ }
245
+
246
+ }
247
+
248
+ IOWD_Helper::redirect(array("page" => "iowd_settings"));
249
+ }
250
+
251
+ }
252
+
253
+
254
+ // Admin main function
255
+
256
+ public function auto_optimize($meta, $id)
257
+ {
258
+ $options = $this->options;
259
+ if ($options["automatically_optimize"] == 0) {
260
+ return $meta;
261
+ }
262
+ $optimize = new IOWD_Optimize(true);
263
+ $ids = is_array($id) ? $id : array($id);
264
+
265
+ $optimize->get_temp_data($ids, false, true, $meta);
266
+ $meta = $optimize->optimize(0, "auto_" . $id, 1, $meta);
267
+
268
+ return $meta;
269
+ }
270
+
271
+ public function scheduled_optimization()
272
+ {
273
+ $options = $this->options;
274
+
275
+ if ($options["scheduled_optimization"] == 0) {
276
+ return;
277
+ }
278
+ $optimize = new IOWD_Optimize();
279
+ $data_count = $optimize->get_temp_data();
280
+ for ($i = 0; $i < $data_count; $i++) {
281
+ $optimize->optimize($i);
282
+ }
283
+
284
+ }
285
+
286
+ // Register autoloader
287
+
288
+ public function admin_menu()
289
+ {
290
+ $parent_slug = null;
291
+ if( get_option( "iowd_subscribe_done" ) == 1 ){
292
+ $parent_slug = "iowd_settings";
293
+ add_menu_page("Image Optimizer", "Image Optimizer", 'manage_options', 'iowd_settings', array($this, 'iowd_admin'), IOWD_URL_IMG . "/icon.png");
294
+ }
295
+ add_submenu_page($parent_slug, "Image Optimizer", "Image Optimizer", 'manage_options', 'iowd_settings', array($this, 'iowd_admin'));
296
+
297
+ add_submenu_page($parent_slug, 'Image Optimizer', 'Report', 'manage_options', 'iowd_report', array($this, 'iowd_admin'));
298
+ }
299
+
300
+ public function iowd_admin()
301
+ {
302
+ if ($this->is_iowd_page() == true) {
303
+ $this->upgrade_pro();
304
+ $view_class = ucfirst(strtolower(self::$page));
305
+ $view = new $view_class();
306
+ $view->display();
307
+ }
308
+ }
309
+
310
+ private function is_iowd_page()
311
+ {
312
+ $iowd_pages = array(
313
+ IOWD_PREFIX . "_settings",
314
+ IOWD_PREFIX . "_report",
315
+ );
316
+
317
+ if (in_array(self::$page, $iowd_pages) == true) {
318
+ return true;
319
+ }
320
+
321
+ return false;
322
+
323
+ }
324
+
325
+ public function ajax()
326
+ {
327
+ check_ajax_referer('nonce_' . IOWD_PREFIX, 'nonce_' . IOWD_PREFIX);
328
+ $action = isset($_REQUEST["action"]) ? $_REQUEST["action"] : '';
329
+
330
+ if ($action) {
331
+ if (method_exists('IOWD_Ajax', $action)) {
332
+ IOWD_Ajax::$action();
333
+ }
334
+ }
335
+ wp_die();
336
+
337
+ }
338
+
339
+ // Admin styles
340
+
341
+ public function register_autoloader()
342
+ {
343
+ if ($this->reg_autoloader) {
344
+ return;
345
+ }
346
+ spl_autoload_register(array(__CLASS__, "autoload"));
347
+
348
+ if (function_exists("__autoload")) {
349
+ spl_autoload_register(array(__CLASS__, "autoloadProxy"));
350
+ }
351
+
352
+ $this->reg_autoloader = true;
353
+ }
354
+
355
+ // Admin scripts
356
+
357
+ public function includes()
358
+ {
359
+ require_once IOWD_DIR_CLASSES . "/iowddb.php";
360
+ require_once IOWD_DIR_CLASSES . "/iowdimage.php";
361
+ }
362
+
363
+ public function styles()
364
+ {
365
+ wp_admin_css('thickbox');
366
+ if ($this->is_iowd_page() == true) {
367
+ wp_enqueue_style(IOWD_PREFIX . '_admin_main-css', IOWD_URL_CSS . '/admin_main.css', array(), self::$version);
368
+ wp_enqueue_style(IOWD_PREFIX . '_calendar-css', IOWD_URL_CSS . '/calendar-jos.css');
369
+ }
370
+
371
+ }
372
+
373
+ public function scripts()
374
+ {
375
+ $options = $this->options;
376
+ wp_enqueue_script('jquery');
377
+ wp_enqueue_script('jquery-ui');
378
+ wp_enqueue_script('jquery-ui-tooltip');
379
+
380
+ // api js
381
+ wp_enqueue_script(IOWD_PREFIX . '_api-js', IOWD_URL_JS . '/api.js', array(), self::$version);
382
+ wp_localize_script(IOWD_PREFIX . '_api-js', 'apiText', array(
383
+ "error_1" => __("Invalid Api key, or Api key not found.", IOWD_PREFIX),
384
+
385
+ ));
386
+
387
+ // admin main js
388
+ wp_enqueue_script(IOWD_PREFIX . '_admin_main-js', IOWD_URL_JS . '/admin_main.js', array(), self::$version);
389
+
390
+ global $pagenow;
391
+ $is_media_page = ($pagenow == 'upload.php' || $pagenow == 'post.php') && !(isset($_GET["page"]) && $_GET["page"] == "iowd_settings") ? 1 : 0;
392
+
393
+ wp_localize_script(IOWD_PREFIX . '_admin_main-js', 'iowd', array(
394
+ "options" => get_option(IOWD_PREFIX . "_options", array()),
395
+ "finishUploadingBulk" => __(" images are ready to be optimized.", IOWD_PREFIX),
396
+ "finishUploadingSingle" => __("Processing optimize", IOWD_PREFIX),
397
+ "ajaxURL" => admin_url('admin-ajax.php'),
398
+ "nonce" => wp_create_nonce('nonce_' . IOWD_PREFIX),
399
+ "page" => self::$page,
400
+ "iowd_active_tab" => (isset($_REQUEST["iowd_tabs_active"]) ? $_REQUEST["iowd_tabs_active"] : ""),
401
+ "is_media_page" => $is_media_page,
402
+ "iowd_image_url" => IOWD_URL_IMG,
403
+ "enable_resizing" => $options["enable_resizing"],
404
+ "enable_resizing_other" => $options["enable_resizing_other"],
405
+ "iowd_optimizing" => (isset($_GET["iowd_optimizing"]) ? $_GET["iowd_optimizing"] : 0),
406
+
407
+ ));
408
+
409
+
410
+ if ($this->is_iowd_page() == true) {
411
+
412
+ wp_enqueue_script(IOWD_PREFIX . '_settings-js', IOWD_URL_JS . '/settings.js', array(), self::$version);
413
+
414
+
415
+ wp_localize_script(IOWD_PREFIX . '_settings-js', 'iowdSettingsGlobal', array(
416
+ "image_url" => IOWD_URL_IMG,
417
+ "ajaxURL" => admin_url('admin-ajax.php'),
418
+ "nonce" => wp_create_nonce('nonce_' . IOWD_PREFIX),
419
+ "page" => (isset($_GET["page"]) ? $_GET["page"] : IOWD_PREFIX . "_settings"),
420
+ "save_dirs_txt" => __("Save directories", IOWD_PREFIX),
421
+ ));
422
+
423
+ wp_enqueue_script(IOWD_PREFIX . '_calendar-js', IOWD_URL_JS . '/calendar.js', array(), self::$version, true);
424
+ wp_enqueue_script(IOWD_PREFIX . '_calendar_function-js', IOWD_URL_JS . '/calendar_function.js', array(), self::$version, true);
425
+
426
+ }
427
+
428
+ }
429
+
430
+ public function upgrade_pro()
431
+ {
432
+ $page = isset($_GET["page"]) ? $_GET["page"] : "";
433
+ ?>
434
+ <div class="iowd_upgrade wd-clear">
435
+ <div class="wd-left">
436
+ <?php
437
+ switch ($page) {
438
+ case "iowd_settings": ?>
439
+ <div style="font-size: 14px;margin-top: 6px;">
440
+ <?php
441
+ if (get_option(IOWD_PREFIX . '_mode') == "standart") {
442
+ _e("This section allows you quickly optimize the pictures, without going through advanced settings.", IOWD_PREFIX); ?>
443
+ <a style="color: #5CAEBD; text-decoration: none;border-bottom: 1px dotted;"
444
+ target="_blank"
445
+ href="https://web-dorado.com/wordpress-image-optimizer-guide/easy-optimization.html"><?php _e("Read More in User Manual.", IOWD_PREFIX); ?></a>
446
+ <?php
447
+ } else {
448
+ _e("This section allows you configure image optimization and set up what best fits your website.", IOWD_PREFIX); ?>
449
+ <a style="color: #5CAEBD; text-decoration: none;border-bottom: 1px dotted;"
450
+ target="_blank"
451
+ href="https://web-dorado.com/wordpress-image-optimizer-guide/advanced-optimization.html"><?php _e("Read More in User Manual.", IOWD_PREFIX); ?></a>
452
+ <?php
453
+ }
454
+ ?>
455
+ </div>
456
+ <?php
457
+ break;
458
+ case "iowd_report":
459
+ ?>
460
+ <div style="font-size: 14px;margin-top: 6px;">
461
+ <?php _e("This section allows you to check the optimization results.", IOWD_PREFIX); ?>
462
+ <a style="color: #5CAEBD; text-decoration: none;border-bottom: 1px dotted;" target="_blank"
463
+ href="https://web-dorado.com/wordpress-image-optimizer-guide/statistics-report.html"><?php _e("Read More in User Manual.", IOWD_PREFIX); ?></a>
464
+ </div>
465
+ <?php
466
+ break;
467
+ }
468
+ ?>
469
+ </div>
470
+ <div class="wd-right">
471
+ <a href="https://web-dorado.com/products/wordpress-image-optimizer.html" target="_blank">
472
+ <div class="wd-table">
473
+ <div class="wd-cell wd-cell-valign-middle">
474
+ <img src="<?php echo IOWD_URL_IMG; ?>/web-dorado.png" width="42px">
475
+ </div>
476
+ <div class="wd-cell wd-cell-valign-middle">
477
+ <?php _e("UPGRADE TO PAID VERSION", IOWD_PREFIX); ?>
478
+ </div>
479
+ </div>
480
+ </a>
481
+
482
+ </div>
483
+ </div>
484
+ <?php
485
+ }
486
+
487
+ }
488
+
489
+
490
+
log/index.php ADDED
File without changes
readme.txt ADDED
@@ -0,0 +1,226 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ === Image Optimizer WD – WordPress Image Optimizer ===
2
+ Contributors: webdorado
3
+ Donate link: https://web-dorado.com/products/wordpress-image-optimizer.html
4
+ Tags: : compress, image, images optimization, performance, photos, lossless, optimize
5
+ Requires at least: 3.9
6
+ Tested up to: 4.8
7
+ Stable tag: 1.0.0
8
+ License: GPLv2 or later
9
+ License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
+
11
+ Image Optimizer WD enables you to resize, compress and optimize PNG, JPG, GIF files while maintaining image quality.
12
+
13
+ == Description ==
14
+
15
+ [Image Optimizer WD](https://web-dorado.com/products/wordpress-image-optimizer.html)
16
+ [User Manual](https://web-dorado.com/wordpress-image-optimizer-guide/introduction.html)
17
+
18
+ Do you have a lot of high resolution images on your website? Images on your website can significantly increase your page load time and be frustrating for your site visitors. The optimization of images will accelerate your website, as well as help you save bandwidth and storage space on your website.
19
+
20
+ Image Optimizer WordPress plugin enables you to resize, compress and optimize PNG, JPG, GIF and PDF (paid version only) files while maintaining image quality. Lossless, Lossy and Maximum Lossy (paid version only) Compression methods are available to choose from. Lossless Compression allows you to resize images without notably impacting image quality. With Lossy Compression method you’ll be able to compress images with minimal loss of quality. Overall, the image compression plugin will enable you to resize the image files up to 80%, depending on image and compression type.
21
+
22
+ The image optimizer plugin can optimize the new images you upload, but you can also optimize existing images on your website. The WordPress plugin comes with a bulk optimization option, which allows to optimize multiple images at once with a single click. The number of images you can optimize in bulk is limited in the free version of the plugin.
23
+
24
+ Choose from 3 modes of compression available in the easy mode, including conservative, balanced, extreme. You can also choose to optimize images from the Advanced mode of the plugin.
25
+
26
+ The advanced setting of the plugin allow you to convert your images to the file format that works best for you, optimize the image sizes that you want, including thumbnails.
27
+
28
+ The plugin provides statistics, so you can always know how many images were optimized, when the last optimization occurred and how much space you’ve saved in the result.
29
+
30
+
31
+
32
+ ### Features of Image Optimizer WD plugin:
33
+
34
+ * SEO friendly Image Optimization
35
+ * Easy to setup and use
36
+ * Shrink JPEG, PNG, GIF files
37
+ * Optimize 1000 images every month
38
+ * Convert from one image type to another
39
+ * 3 Modes - conservative, balanced, extreme
40
+ * Lossless and Lossy Conversions without losing image quality or minimal quality loss
41
+ * Pick exactly which sizes you want to compress (i.e. thumbnail, medium, etc.)
42
+ * Automatic optimization options
43
+ * Bulk optimization to optimize more than one image at once
44
+ * Improve your website’s load times
45
+
46
+ Upgrade to [Image Optimizer WD Pro](https://web-dorado.com/products/wordpress-image-optimizer.html) to add features:
47
+
48
+ * Optimize PDF files
49
+ * Schedule optimization to automatically compress images hourly, twice daily or daily
50
+ * Optimize up to 40000 images every month
51
+ * Maximum lossy compression
52
+
53
+
54
+
55
+ == Changelog ==
56
+
57
+ = 1.0.0 =
58
+ * Initial version
59
+
60
+
61
+
62
+ == Installation ==
63
+
64
+ #### Thank you for your interest in Image Optimizer WD.
65
+
66
+ ### Minimum requirements.
67
+ * Wordpress 3.9+
68
+ * PHP 5.4+
69
+ * MySQL 5.x
70
+
71
+ ### Perform a new installation
72
+
73
+ After downloading the ZIP file of the Image Optimizer WD plugin,
74
+
75
+ 1. Log in to the administrator panel.
76
+ 2. Go to Plugins Add > New > Upload.
77
+ 3. Click "Choose file" ("Browse") and select the downloaded zip file of the Image Optimizer WD plugin.
78
+ *For Mac Users*
79
+ *Go to your Downloads folder and locate the folder with the Image Optimizer WD. Right-click on the folder and select Compress. Now you have a newly created .zip file which can be installed as described here.*
80
+ 4. Click "Install Now" button.
81
+ 5. Click "Activate Plugin" button for activating the Image Optimizer WD.
82
+ 6. If the installation does not succeed, please contact us at [support@web-dorado.com](mailto:support@web-dorado.com).
83
+
84
+ == Image Optimizer WD User Manual ==
85
+
86
+ = Introduction =
87
+
88
+ Image Optimizer plugin is created to compress, convert, and reduce the size of large images throughout your website. With just a few steps, you are able to configure and perform optimization for all images. This lets you quickly decrease the amount of used storage space on the hosting of your website and speed up its performance.
89
+
90
+ The plugin lets you optimize images from directories other than WordPress Media Library. This feature lets you optimize the images by simply providing the URL of the folder containing your pictures.
91
+
92
+ Image Optimizer plugin is simple and straightforward, however, it provides all necessary options to control the optimization process, set up automatic optimization and much more. This user guide will help you configure the plugin and assemble the specific optimization type, which fits your site.
93
+
94
+
95
+ = Easy Mode of Optimization =
96
+
97
+ Click on Image Optimizer menu item from WordPress left menu to start its configuration. To quickly optimize the pictures, without going through advanced settings, you can use Easy Mode of Image Optimizer plugin. Click Image Optimizer menu item to navigate to the plugin’s Settings page.
98
+
99
+ Easy Mode of image optimization consist of three optimization types:
100
+ Conservative
101
+ Reduces image size up to 20%.
102
+ Keeps EXIF data of the pictures.
103
+ Keeps full-sized images.
104
+
105
+ Balanced
106
+ Reduces image size up to 40% (lossy reduction).
107
+ Keeps EXIF data of the pictures.
108
+ Keeps full-sized images.
109
+
110
+ Extreme
111
+ Reduces image size up to 90% (extreme reduction).
112
+ Doesn’t keep EXIF data of the pictures.
113
+ Doesn’t keep full-sized images.
114
+
115
+ How it works? link will help you compare optimized versions of images with all three types, and choose the best one for your photos. Once you have selected the type, press Optimize Now (Bulk Optimizing) button, and the plugin will start the image compression.
116
+
117
+ In case you wish to automatically optimize uploaded images, turn on Auto Optimize setting.
118
+
119
+
120
+ = Optimizing from WordPress Media Library =
121
+
122
+ You are also able to optimize individual images from WordPress Media Library. Press Media Library link to navigate there, then open the image you need to optimize. You will find Optimize button at the bottom of right pane.
123
+
124
+ After clicking Optimize, you can Reoptimize individual images later.
125
+
126
+ Furthermore, you can optimize several images at once. Fistly, make sure to select List View of WordPress Media library, then choose the images you need to optimize. Select Optimize option from Bulk Actions dropdown box, then press Apply.
127
+
128
+ Advanced Mode of Optimization
129
+
130
+ With its Advanced optimization settings, the plugin lets you configure image optimization and set up what best fits your website. Press Image Optimizer link from left menu, then click on Advanced tab to access its option.
131
+
132
+ As with Easy Mode, the plugin lets you activate Auto Optimize option for newly uploaded images. Don’t forget to hit Save Settings after you make changes in the plugin configuration.
133
+
134
+ = General =
135
+
136
+ Keep EXIF data
137
+ This setting lets you keep or remove EXIF data of the images. This information is the date photo was taken, exposure, camera lense, shutter speed, etc. It makes the images larger, but in case you are a photographer, it would be best to keep it.
138
+
139
+ Exclude full-size images from EXIF data removal
140
+ In case Keep EXIF data option is set to No, you are able to enable this option to prevent EXIF data removal from full-size images.
141
+
142
+ Keep originals
143
+ In case this option is enabled, Image Optimizer plugin will create a directory titled /.iowd_orig, where it will store the original versions of optimized images.
144
+
145
+ JPG Optimization Level and PNG Optimization Level
146
+ Select the optimization level for JPG and PNG images. You can choose one of the following:
147
+ No Compression
148
+ Lossless Compression
149
+ Lossy Compression
150
+ Maximum Lossy Compression
151
+
152
+ GIF Optimization Level and PDF Optimization Level
153
+ Select the optimization level for GIF images and PDF files. You can choose one of the following:
154
+ No Compression
155
+ Lossless Compression
156
+
157
+ = Conversion =
158
+
159
+ Warning! In case the images are used in other plugins, problems may occur after converting them, if these plugins use the absolute URLs of the images. There will be no issues in case they use the media IDs of the pictures.
160
+
161
+ Enable conversion
162
+ Turn on this setting in case you wish to convert the format of your website images, to make the site faster.
163
+
164
+ JPG to PNG conversion
165
+ PNG uses lossless compression. It is recommended to use for logos, and other pictures with transparent backgrounds. This option removes image metadata and increases CPU usage.
166
+
167
+ JPG to WebP conversion
168
+ WebP lets you have 25-34% smaller images and speed up your website. JPG to WebP conversion is lossy, but it will not affect the image quality significantly.
169
+
170
+ PNG to JPG conversion
171
+ JPG format is recommended to use for photographs and similar high-resolution images. Since it uses lossy compression, some of the image data is lost when the image is compressed.
172
+
173
+ PNG to WebP conversion
174
+ PNG to WebP conversion is lossless. WebP images are 26% smaller in size, than their PNGs. This lets you make your website faster.
175
+
176
+ GIF to PNG conversion
177
+ PNG uses lossless compression. It is recommended for logos and pictures with transparent backgrounds. Note, that animated GIFs cannot be converted.
178
+
179
+ Other
180
+
181
+ Scheduled optimization
182
+ Enable this setting to automatically optimize new images based on the value of How often the optimization should reoccur setting. It can be set to one of the following options:
183
+ Hourly
184
+ Twice daily
185
+ Daily
186
+
187
+ Exclude full-size images from optimization
188
+ Enable this setting, in case you don’t want to optimize full-size images of your website.
189
+
190
+ Resize media full-size images
191
+ If Exclude full-size images from optimization is disabled, you are able to activate resizing for full-size images in WordPress Media Library.
192
+
193
+ Resize other directory images
194
+ Activate this option to resize the images of other directories, when optimizing them.
195
+
196
+ Other directory images dimensions
197
+ In case you choose to resize the image of other directories, use this setting to provide the dimensions, to which they are going to be resized to.
198
+
199
+ Optimize these sizes
200
+ This setting lets you select which image sizes to optimize, for instance, medium or large pictures.
201
+
202
+ Don't optimize images smaller than
203
+ Use this option to define the lower limit of image size, which will be optimized with Image Optimizer plugin.
204
+
205
+ Don't optimize images larger than
206
+ Use this option to define the upper limit of image size, which will be optimized with Image Optimizer plugin.
207
+
208
+ In other has optimize once more, if optimization level has chahged
209
+ If this option is enabled, the plugin will optimize the images again, in case optimization level has been changed in Image Optimizer settings.
210
+
211
+ Optimizing Other Directories
212
+
213
+ Image Optimizer plugin lets you optimize images of other directories of your domain with just a few clicks. You will only need to provide Directory Path after pressing Select Directory button. Make sure to press Save Directories button after adding the path.
214
+
215
+ In case you have uploaded new images to the selected directory after adding it to Image Optimizer settings, you need to press Refresh button to add the new pictures to optimization queue.
216
+
217
+ = Statistics and Report =
218
+
219
+ Statistics
220
+
221
+ To let you quickly check the optimization results and be posted about latest optimization process, the plugin adds Statistics section to Image Optimizer settings. You can check the reduction size in WordPress Media Library or other directories, see how many images were optimized, and more.
222
+
223
+ Report
224
+
225
+ To see long-term results and the list of optimized images, you can use Report dashboard. Go to Image Optimizer > Report page to access the list. This dashboard lets you filter the images by name, date, size or type. You can also clear the optimization history of each individual image, or reset the report by pressing Clear History button.
226
+
vendor/aannnaa7/aws-sdk-php-minimized/LICENSE.md ADDED
@@ -0,0 +1,141 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Apache License
2
+ Version 2.0, January 2004
3
+
4
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
5
+
6
+ ## 1. Definitions.
7
+
8
+ "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1
9
+ through 9 of this document.
10
+
11
+ "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the
12
+ License.
13
+
14
+ "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled
15
+ by, or are under common control with that entity. For the purposes of this definition, "control" means
16
+ (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract
17
+ or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial
18
+ ownership of such entity.
19
+
20
+ "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
21
+
22
+ "Source" form shall mean the preferred form for making modifications, including but not limited to software
23
+ source code, documentation source, and configuration files.
24
+
25
+ "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form,
26
+ including but not limited to compiled object code, generated documentation, and conversions to other media
27
+ types.
28
+
29
+ "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License,
30
+ as indicated by a copyright notice that is included in or attached to the work (an example is provided in the
31
+ Appendix below).
32
+
33
+ "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from)
34
+ the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent,
35
+ as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not
36
+ include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work
37
+ and Derivative Works thereof.
38
+
39
+ "Contribution" shall mean any work of authorship, including the original version of the Work and any
40
+ modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to
41
+ Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to
42
+ submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of
43
+ electronic, verbal, or written communication sent to the Licensor or its representatives, including but not
44
+ limited to communication on electronic mailing lists, source code control systems, and issue tracking systems
45
+ that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but
46
+ excluding communication that is conspicuously marked or otherwise designated in writing by the copyright
47
+ owner as "Not a Contribution."
48
+
49
+ "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been
50
+ received by Licensor and subsequently incorporated within the Work.
51
+
52
+ ## 2. Grant of Copyright License.
53
+
54
+ Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual,
55
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare
56
+ Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such
57
+ Derivative Works in Source or Object form.
58
+
59
+ ## 3. Grant of Patent License.
60
+
61
+ Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual,
62
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent
63
+ license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such
64
+ license applies only to those patent claims licensable by such Contributor that are necessarily infringed by
65
+ their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such
66
+ Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim
67
+ or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work
68
+ constitutes direct or contributory patent infringement, then any patent licenses granted to You under this
69
+ License for that Work shall terminate as of the date such litigation is filed.
70
+
71
+ ## 4. Redistribution.
72
+
73
+ You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without
74
+ modifications, and in Source or Object form, provided that You meet the following conditions:
75
+
76
+ 1. You must give any other recipients of the Work or Derivative Works a copy of this License; and
77
+
78
+ 2. You must cause any modified files to carry prominent notices stating that You changed the files; and
79
+
80
+ 3. You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent,
81
+ trademark, and attribution notices from the Source form of the Work, excluding those notices that do
82
+ not pertain to any part of the Derivative Works; and
83
+
84
+ 4. If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that
85
+ You distribute must include a readable copy of the attribution notices contained within such NOTICE
86
+ file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one
87
+ of the following places: within a NOTICE text file distributed as part of the Derivative Works; within
88
+ the Source form or documentation, if provided along with the Derivative Works; or, within a display
89
+ generated by the Derivative Works, if and wherever such third-party notices normally appear. The
90
+ contents of the NOTICE file are for informational purposes only and do not modify the License. You may
91
+ add Your own attribution notices within Derivative Works that You distribute, alongside or as an
92
+ addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be
93
+ construed as modifying the License.
94
+
95
+ You may add Your own copyright statement to Your modifications and may provide additional or different license
96
+ terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative
97
+ Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the
98
+ conditions stated in this License.
99
+
100
+ ## 5. Submission of Contributions.
101
+
102
+ Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by
103
+ You to the Licensor shall be under the terms and conditions of this License, without any additional terms or
104
+ conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate
105
+ license agreement you may have executed with Licensor regarding such Contributions.
106
+
107
+ ## 6. Trademarks.
108
+
109
+ This License does not grant permission to use the trade names, trademarks, service marks, or product names of
110
+ the Licensor, except as required for reasonable and customary use in describing the origin of the Work and
111
+ reproducing the content of the NOTICE file.
112
+
113
+ ## 7. Disclaimer of Warranty.
114
+
115
+ Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor
116
+ provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
117
+ or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT,
118
+ MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the
119
+ appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of
120
+ permissions under this License.
121
+
122
+ ## 8. Limitation of Liability.
123
+
124
+ In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless
125
+ required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any
126
+ Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential
127
+ damages of any character arising as a result of this License or out of the use or inability to use the Work
128
+ (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or
129
+ any and all other commercial damages or losses), even if such Contributor has been advised of the possibility
130
+ of such damages.
131
+
132
+ ## 9. Accepting Warranty or Additional Liability.
133
+
134
+ While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for,
135
+ acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this
136
+ License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole
137
+ responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold
138
+ each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason
139
+ of your accepting any such warranty or additional liability.
140
+
141
+ END OF TERMS AND CONDITIONS
vendor/aannnaa7/aws-sdk-php-minimized/NOTICE.md ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # AWS SDK for PHP
2
+
3
+ <http://aws.amazon.com/php>
4
+
5
+ Copyright 2010-2014 Amazon.com, Inc. or its affiliates. All Rights Reserved.
6
+
7
+ Licensed under the Apache License, Version 2.0 (the "License").
8
+ You may not use this file except in compliance with the License.
9
+ A copy of the License is located at
10
+
11
+ <http://aws.amazon.com/apache2.0>
12
+
13
+ or in the "license" file accompanying this file. This file is distributed
14
+ on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
15
+ express or implied. See the License for the specific language governing
16
+ permissions and limitations under the License.
17
+
18
+ # Guzzle
19
+
20
+ <https://github.com/guzzle/guzzle>
21
+
22
+ Copyright (c) 2014 Michael Dowling, https://github.com/mtdowling
23
+
24
+ Permission is hereby granted, free of charge, to any person obtaining a copy
25
+ of this software and associated documentation files (the "Software"), to deal
26
+ in the Software without restriction, including without limitation the rights
27
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
28
+ copies of the Software, and to permit persons to whom the Software is
29
+ furnished to do so, subject to the following conditions:
30
+
31
+ The above copyright notice and this permission notice shall be included in
32
+ all copies or substantial portions of the Software.
33
+
34
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
35
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
36
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
37
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
38
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
39
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
40
+ THE SOFTWARE.
41
+
42
+ # jmespath.php
43
+
44
+ <https://github.com/mtdowling/jmespath.php>
45
+
46
+ Copyright (c) 2014 Michael Dowling, https://github.com/mtdowling
47
+
48
+ Permission is hereby granted, free of charge, to any person obtaining a copy
49
+ of this software and associated documentation files (the "Software"), to deal
50
+ in the Software without restriction, including without limitation the rights
51
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
52
+ copies of the Software, and to permit persons to whom the Software is
53
+ furnished to do so, subject to the following conditions:
54
+
55
+ The above copyright notice and this permission notice shall be included in
56
+ all copies or substantial portions of the Software.
57
+
58
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
59
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
60
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
61
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
62
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
63
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
64
+ THE SOFTWARE.
vendor/aannnaa7/aws-sdk-php-minimized/README.md ADDED
@@ -0,0 +1,176 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # AWS SDK for PHP - Version 3
2
+
3
+ [![@awsforphp on Twitter](http://img.shields.io/badge/twitter-%40awsforphp-blue.svg?style=flat)](https://twitter.com/awsforphp)
4
+ [![Total Downloads](https://img.shields.io/packagist/dt/aws/aws-sdk-php.svg?style=flat)](https://packagist.org/packages/aws/aws-sdk-php)
5
+ [![Build Status](https://img.shields.io/travis/aws/aws-sdk-php.svg?style=flat)](https://travis-ci.org/aws/aws-sdk-php)
6
+ [![Apache 2 License](https://img.shields.io/packagist/l/aws/aws-sdk-php.svg?style=flat)](http://aws.amazon.com/apache-2-0/)
7
+ [![Gitter](https://badges.gitter.im/aws/aws-sdk-php.svg)](https://gitter.im/aws/aws-sdk-php?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
8
+ [![codecov](https://codecov.io/gh/aws/aws-sdk-php/branch/master/graph/badge.svg)](https://codecov.io/gh/aws/aws-sdk-php)
9
+
10
+ The **AWS SDK for PHP** makes it easy for developers to access [Amazon Web
11
+ Services][aws] in their PHP code, and build robust applications and software
12
+ using services like Amazon S3, Amazon DynamoDB, Amazon Glacier, etc. You can
13
+ get started in minutes by [installing the SDK through Composer][docs-installation]
14
+ or by downloading a single zip or phar file from our [latest release][latest-release].
15
+
16
+ ## Resources
17
+
18
+ * [User Guide][docs-guide] – For both getting started and in-depth SDK usage information
19
+ * [API Docs][docs-api] – For details about operations, parameters, and responses
20
+ * [Blog][sdk-blog] – Tips & tricks, articles, and announcements
21
+ * [Sample Project][sdk-sample] - A quick, sample project to help get you started
22
+ * [Forum][sdk-forum] – Ask questions, get help, and give feedback
23
+ * [Issues][sdk-issues] – Report issues, submit pull requests, and get involved
24
+ (see [Apache 2.0 License][sdk-license])
25
+ * [@awsforphp][sdk-twitter] – Follow us on Twitter
26
+ * For Version 2 of the SDK:
27
+ * [User Guide][docs-guide-v2]
28
+ * [API Docs][docs-api-v2]
29
+
30
+ ## Getting Help
31
+
32
+ Please use these community resources for getting help. We use the GitHub issues for tracking bugs and feature requests and have limited bandwidth to address them.
33
+
34
+ * Ask a question on [StackOverflow](https://stackoverflow.com/) and tag it with [`aws-php-sdk`](http://stackoverflow.com/questions/tagged/aws-php-sdk)
35
+ * Come join the AWS SDK for PHP [gitter](https://gitter.im/aws/aws-sdk-php)
36
+ * Open a support ticket with [AWS Support](https://console.aws.amazon.com/support/home/)
37
+ * If it turns out that you may have found a bug, please [open an issue](https://github.com/aws/aws-sdk-php/issues/new)
38
+
39
+ ## Opening Issues
40
+
41
+ If you encounter a bug with `aws-sdk-php` we would like to hear about it. Search the existing issues and try to make sure your problem doesn’t already exist before opening a new issue. It’s helpful if you include the version of `aws-sdk-php`, PHP version and OS you’re using. Please include a stack trace and reduced repro case when appropriate, too.
42
+
43
+ The GitHub issues are intended for bug reports and feature requests. For help and questions with using `aws-sdk-php` please make use of the resources listed in the Getting Help section. There are limited resources available for handling issues and by keeping the list of open issues lean we can respond in a timely manner.
44
+
45
+ ## Features
46
+
47
+ * Provides easy-to-use HTTP clients for all supported AWS
48
+ [services][docs-services], [regions][docs-rande], and authentication
49
+ protocols.
50
+ * Is built on [Guzzle][guzzle-docs], and utilizes many of its features,
51
+ including persistent connections, asynchronous requests, middlewares, etc.
52
+ * Provides convenience features including easy result pagination via
53
+ [Paginators][docs-paginators], [Waiters][docs-waiters], and simple
54
+ [Result objects][docs-results].
55
+ * Provides a [multipart uploader tool][docs-s3-multipart] for Amazon S3 and
56
+ Amazon Glacier that can be paused and resumed.
57
+ * Provides an [Amazon S3 Stream Wrapper][docs-streamwrapper], so that you can
58
+ use PHP's native file handling functions to interact with your S3 buckets and
59
+ objects like a local filesystem.
60
+ * Provides the [Amazon DynamoDB Session Handler][docs-ddbsh] for easily scaling
61
+ sessions on a fast, NoSQL database.
62
+ * Automatically uses [IAM Instance Profile Credentials][aws-iam-credentials] on
63
+ configured Amazon EC2 instances.
64
+
65
+ ## Getting Started
66
+
67
+ 1. **Sign up for AWS** – Before you begin, you need to
68
+ sign up for an AWS account and retrieve your [AWS credentials][docs-signup].
69
+ 1. **Minimum requirements** – To run the SDK, your system will need to meet the
70
+ [minimum requirements][docs-requirements], including having **PHP >= 5.5**
71
+ compiled with the cURL extension and cURL 7.16.2+ compiled with a TLS
72
+ backend (e.g., NSS or OpenSSL).
73
+ 1. **Install the SDK** – Using [Composer] is the recommended way to install the
74
+ AWS SDK for PHP. The SDK is available via [Packagist] under the
75
+ [`aws/aws-sdk-php`][install-packagist] package. Please see the
76
+ [Installation section of the User Guide][docs-installation] for more
77
+ detailed information about installing the SDK through Composer and other
78
+ means.
79
+ 1. **Using the SDK** – The best way to become familiar with how to use the SDK
80
+ is to read the [User Guide][docs-guide]. The
81
+ [Getting Started Guide][docs-quickstart] will help you become familiar with
82
+ the basic concepts.
83
+
84
+ ## Quick Examples
85
+
86
+ ### Create an Amazon S3 client
87
+
88
+ ```php
89
+ <?php
90
+ // Require the Composer autoloader.
91
+ require 'vendor/autoload.php';
92
+
93
+ use Aws\S3\S3Client;
94
+
95
+ // Instantiate an Amazon S3 client.
96
+ $s3 = new S3Client([
97
+ 'version' => 'latest',
98
+ 'region' => 'us-west-2'
99
+ ]);
100
+ ```
101
+
102
+ ### Upload a file to Amazon S3
103
+
104
+ ```php
105
+ <?php
106
+ // Upload a publicly accessible file. The file size and type are determined by the SDK.
107
+ try {
108
+ $s3->putObject([
109
+ 'Bucket' => 'my-bucket',
110
+ 'Key' => 'my-object',
111
+ 'Body' => fopen('/path/to/file', 'r'),
112
+ 'ACL' => 'public-read',
113
+ ]);
114
+ } catch (Aws\S3\Exception\S3Exception $e) {
115
+ echo "There was an error uploading the file.\n";
116
+ }
117
+ ```
118
+
119
+ ### Related AWS Projects
120
+
121
+ * [AWS Service Provider for Laravel][mod-laravel]
122
+ * [AWS SDK ZF2 Module][mod-zf2]
123
+ * [AWS Service Provider for Silex][mod-silex]
124
+ * [AWS SDK Bundle for Symfony][mod-symfony]
125
+ * [Amazon SNS Message Validator for PHP][sns-validator] - SNS validator without requiring SDK
126
+ * [Guzzle Version 6][guzzle-docs] – PHP HTTP client and framework
127
+ * Other [AWS SDKs & Tools][aws-tools] (e.g., js, cli, ruby, python, java, etc.)
128
+
129
+ [sdk-website]: http://aws.amazon.com/sdkforphp
130
+ [sdk-forum]: https://forums.aws.amazon.com/forum.jspa?forumID=80
131
+ [sdk-issues]: https://github.com/aws/aws-sdk-php/issues
132
+ [sdk-license]: http://aws.amazon.com/apache2.0/
133
+ [sdk-blog]: http://blogs.aws.amazon.com/php
134
+ [sdk-twitter]: https://twitter.com/awsforphp
135
+ [sdk-sample]: http://aws.amazon.com/developers/getting-started/php
136
+
137
+ [install-packagist]: https://packagist.org/packages/aws/aws-sdk-php
138
+ [latest-release]: https://github.com/aws/aws-sdk-php/releases
139
+
140
+ [docs-api]: http://docs.aws.amazon.com/aws-sdk-php/v3/api/index.html
141
+ [docs-guide]: http://docs.aws.amazon.com/aws-sdk-php/v3/guide/index.html
142
+ [docs-api-v2]: http://docs.aws.amazon.com/aws-sdk-php/v2/api/index.html
143
+ [docs-guide-v2]: http://docs.aws.amazon.com/aws-sdk-php/v2/guide/index.html
144
+ [docs-contribution]: https://github.com/aws/aws-sdk-php/blob/master/CONTRIBUTING.md
145
+ [docs-migration]: http://docs.aws.amazon.com/aws-sdk-php/v3/guide/guide/migration.html
146
+ [docs-signup]: http://aws.amazon.com/developers/access-keys/
147
+ [docs-requirements]: http://docs.aws.amazon.com/aws-sdk-php/v3/guide/getting-started/requirements.html
148
+ [docs-installation]: http://docs.aws.amazon.com/aws-sdk-php/v3/guide/getting-started/installation.html
149
+ [docs-quickstart]: http://docs.aws.amazon.com/aws-sdk-php/v3/guide/#getting-started
150
+ [docs-paginators]: http://docs.aws.amazon.com/aws-sdk-php/v3/guide/guide/paginators.html
151
+ [docs-waiters]: http://docs.aws.amazon.com/aws-sdk-php/v3/guide/guide/waiters.html
152
+ [docs-results]: http://docs.aws.amazon.com/aws-sdk-php/v3/guide/getting-started/basic-usage.html#result-objects
153
+ [docs-exceptions]: http://docs.aws.amazon.com/aws-sdk-php/v3/guide/quick-start.html#error-handling
154
+ [docs-wire-logging]: http://docs.aws.amazon.com/aws-sdk-php/v3/guide/faq.html#how-can-i-see-what-data-is-sent-over-the-wire
155
+ [docs-ddbsh]: http://docs.aws.amazon.com/aws-sdk-php/v3/guide/service/dynamodb-session-handler.html
156
+ [docs-rande]: http://docs.aws.amazon.com/general/latest/gr/rande.html
157
+ [docs-streamwrapper]: http://docs.aws.amazon.com/aws-sdk-php/v3/guide/service/s3-stream-wrapper.html
158
+ [docs-s3-transfer]: http://docs.aws.amazon.com/aws-sdk-php/v3/guide/service/s3-transfer.html
159
+ [docs-s3-multipart]: http://docs.aws.amazon.com/aws-sdk-php/v3/guide/service/s3-multipart-upload.html
160
+
161
+ [aws]: http://aws.amazon.com
162
+ [aws-iam-credentials]: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/UsingIAM.html#UsingIAMrolesWithAmazonEC2Instances
163
+ [aws-tools]: http://aws.amazon.com/tools
164
+ [guzzle-docs]: http://guzzlephp.org
165
+ [composer]: http://getcomposer.org
166
+ [packagist]: http://packagist.org
167
+ [psr-7]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-7-http-message.md
168
+ [psr-4]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md
169
+ [psr-1]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md
170
+ [psr-2]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md
171
+
172
+ [mod-laravel]: https://github.com/aws/aws-sdk-php-laravel
173
+ [mod-zf2]: https://github.com/aws/aws-sdk-php-zf2
174
+ [mod-silex]: https://github.com/aws/aws-sdk-php-silex
175
+ [mod-symfony]: https://github.com/aws/aws-sdk-php-symfony
176
+ [sns-validator]: https://github.com/aws/aws-php-sns-message-validator
vendor/aannnaa7/aws-sdk-php-minimized/composer.json ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "aannnaa7/aws-sdk-php-minimized",
3
+ "homepage": "http://aws.amazon.com/sdkforphp",
4
+ "description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project private use only",
5
+ "keywords": ["aws","amazon","sdk","s3","ec2","dynamodb","cloud","glacier"],
6
+ "type": "library",
7
+ "license": "Apache-2.0",
8
+ "support": {
9
+ "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
10
+ "issues": "https://github.com/aws/aws-sdk-php/issues"
11
+ },
12
+ "require": {
13
+ "php": ">=5.5",
14
+ "guzzlehttp/guzzle": "~5.3|~6.0.1|~6.1",
15
+ "guzzlehttp/psr7": "~1.0",
16
+ "guzzlehttp/promises": "~1.0",
17
+ "mtdowling/jmespath.php": "~2.2"
18
+ },
19
+ "require-dev": {
20
+ "ext-openssl": "*",
21
+ "ext-pcre": "*",
22
+ "ext-spl": "*",
23
+ "ext-json": "*",
24
+ "ext-dom": "*",
25
+ "ext-simplexml": "*",
26
+ "phpunit/phpunit": "~4.0",
27
+ "behat/behat": "~3.0",
28
+ "doctrine/cache": "~1.4",
29
+ "aws/aws-php-sns-message-validator": "~1.0",
30
+ "nette/neon": "^2.3",
31
+ "andrewsville/php-token-reflection": "^1.4"
32
+ },
33
+ "suggest": {
34
+ "ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages",
35
+ "ext-curl": "To send requests using cURL",
36
+ "doctrine/cache": "To use the DoctrineCacheAdapter"
37
+ },
38
+ "autoload": {
39
+ "psr-4": {
40
+ "Aws\\": "src/"
41
+ },
42
+ "files": ["src/functions.php"]
43
+ },
44
+ "autoload-dev": {
45
+ "psr-4": {
46
+ "Aws\\Test\\": "tests/"
47
+ },
48
+ "classmap": ["build/"]
49
+ },
50
+ "extra": {
51
+ "branch-alias": {
52
+ "dev-master": "3.0-dev"
53
+ }
54
+ },
55
+ "scripts": {
56
+ "post-autoload-dump": [
57
+ "make compile-json"
58
+ ]
59
+ }
60
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Api/AbstractModel.php ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Api;
3
+
4
+ /**
5
+ * Base class that is used by most API shapes
6
+ */
7
+ abstract class AbstractModel implements \ArrayAccess
8
+ {
9
+ /** @var array */
10
+ protected $definition;
11
+
12
+ /** @var ShapeMap */
13
+ protected $shapeMap;
14
+
15
+ /**
16
+ * @param array $definition Service description
17
+ * @param ShapeMap $shapeMap Shapemap used for creating shapes
18
+ */
19
+ public function __construct(array $definition, ShapeMap $shapeMap)
20
+ {
21
+ $this->definition = $definition;
22
+ $this->shapeMap = $shapeMap;
23
+ }
24
+
25
+ public function toArray()
26
+ {
27
+ return $this->definition;
28
+ }
29
+
30
+ public function offsetGet($offset)
31
+ {
32
+ return isset($this->definition[$offset])
33
+ ? $this->definition[$offset] : null;
34
+ }
35
+
36
+ public function offsetSet($offset, $value)
37
+ {
38
+ $this->definition[$offset] = $value;
39
+ }
40
+
41
+ public function offsetExists($offset)
42
+ {
43
+ return isset($this->definition[$offset]);
44
+ }
45
+
46
+ public function offsetUnset($offset)
47
+ {
48
+ unset($this->definition[$offset]);
49
+ }
50
+
51
+ protected function shapeAt($key)
52
+ {
53
+ if (!isset($this->definition[$key])) {
54
+ throw new \InvalidArgumentException('Expected shape definition at '
55
+ . $key);
56
+ }
57
+
58
+ return $this->shapeFor($this->definition[$key]);
59
+ }
60
+
61
+ protected function shapeFor(array $definition)
62
+ {
63
+ return isset($definition['shape'])
64
+ ? $this->shapeMap->resolve($definition)
65
+ : Shape::create($definition, $this->shapeMap);
66
+ }
67
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Api/ApiProvider.php ADDED
@@ -0,0 +1,241 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Api;
3
+
4
+ use Aws\Exception\UnresolvedApiException;
5
+
6
+ /**
7
+ * API providers.
8
+ *
9
+ * An API provider is a function that accepts a type, service, and version and
10
+ * returns an array of API data on success or NULL if no API data can be created
11
+ * for the provided arguments.
12
+ *
13
+ * You can wrap your calls to an API provider with the
14
+ * {@see ApiProvider::resolve} method to ensure that API data is created. If the
15
+ * API data is not created, then the resolve() method will throw a
16
+ * {@see Aws\Exception\UnresolvedApiException}.
17
+ *
18
+ * use Aws\Api\ApiProvider;
19
+ * $provider = ApiProvider::defaultProvider();
20
+ * // Returns an array or NULL.
21
+ * $data = $provider('api', 's3', '2006-03-01');
22
+ * // Returns an array or throws.
23
+ * $data = ApiProvider::resolve($provider, 'api', 'elasticfood', '2020-01-01');
24
+ *
25
+ * You can compose multiple providers into a single provider using
26
+ * {@see Aws\or_chain}. This method accepts providers as arguments and
27
+ * returns a new function that will invoke each provider until a non-null value
28
+ * is returned.
29
+ *
30
+ * $a = ApiProvider::filesystem(sys_get_temp_dir() . '/aws-beta-models');
31
+ * $b = ApiProvider::manifest();
32
+ *
33
+ * $c = \Aws\or_chain($a, $b);
34
+ * $data = $c('api', 'betaservice', '2015-08-08'); // $a handles this.
35
+ * $data = $c('api', 's3', '2006-03-01'); // $b handles this.
36
+ * $data = $c('api', 'invalid', '2014-12-15'); // Neither handles this.
37
+ */
38
+ class ApiProvider
39
+ {
40
+ /** @var array A map of public API type names to their file suffix. */
41
+ private static $typeMap = [
42
+ 'api' => 'api-2',
43
+ 'paginator' => 'paginators-1',
44
+ 'waiter' => 'waiters-2',
45
+ 'docs' => 'docs-2',
46
+ ];
47
+
48
+ /** @var array API manifest */
49
+ private $manifest;
50
+
51
+ /** @var string The directory containing service models. */
52
+ private $modelsDir;
53
+
54
+ /**
55
+ * Resolves an API provider and ensures a non-null return value.
56
+ *
57
+ * @param callable $provider Provider function to invoke.
58
+ * @param string $type Type of data ('api', 'waiter', 'paginator').
59
+ * @param string $service Service name.
60
+ * @param string $version API version.
61
+ *
62
+ * @return array
63
+ * @throws UnresolvedApiException
64
+ */
65
+ public static function resolve(callable $provider, $type, $service, $version)
66
+ {
67
+ // Execute the provider and return the result, if there is one.
68
+ $result = $provider($type, $service, $version);
69
+ if (is_array($result)) {
70
+ return $result;
71
+ }
72
+
73
+ // Throw an exception with a message depending on the inputs.
74
+ if (!isset(self::$typeMap[$type])) {
75
+ $msg = "The type must be one of: " . implode(', ', self::$typeMap);
76
+ } elseif ($service) {
77
+ $msg = "The {$service} service does not have version: {$version}.";
78
+ } else {
79
+ $msg = "You must specify a service name to retrieve its API data.";
80
+ }
81
+
82
+ throw new UnresolvedApiException($msg);
83
+ }
84
+
85
+ /**
86
+ * Default SDK API provider.
87
+ *
88
+ * This provider loads pre-built manifest data from the `data` directory.
89
+ *
90
+ * @return self
91
+ */
92
+ public static function defaultProvider()
93
+ {
94
+ return new self(__DIR__ . '/../data', \Aws\manifest());
95
+ }
96
+
97
+ /**
98
+ * Loads API data after resolving the version to the latest, compatible,
99
+ * available version based on the provided manifest data.
100
+ *
101
+ * Manifest data is essentially an associative array of service names to
102
+ * associative arrays of API version aliases.
103
+ *
104
+ * [
105
+ * ...
106
+ * 'ec2' => [
107
+ * 'latest' => '2014-10-01',
108
+ * '2014-10-01' => '2014-10-01',
109
+ * '2014-09-01' => '2014-10-01',
110
+ * '2014-06-15' => '2014-10-01',
111
+ * ...
112
+ * ],
113
+ * 'ecs' => [...],
114
+ * 'elasticache' => [...],
115
+ * ...
116
+ * ]
117
+ *
118
+ * @param string $dir Directory containing service models.
119
+ * @param array $manifest The API version manifest data.
120
+ *
121
+ * @return self
122
+ */
123
+ public static function manifest($dir, array $manifest)
124
+ {
125
+ return new self($dir, $manifest);
126
+ }
127
+
128
+ /**
129
+ * Loads API data from the specified directory.
130
+ *
131
+ * If "latest" is specified as the version, this provider must glob the
132
+ * directory to find which is the latest available version.
133
+ *
134
+ * @param string $dir Directory containing service models.
135
+ *
136
+ * @return self
137
+ * @throws \InvalidArgumentException if the provided `$dir` is invalid.
138
+ */
139
+ public static function filesystem($dir)
140
+ {
141
+ return new self($dir);
142
+ }
143
+
144
+ /**
145
+ * Retrieves a list of valid versions for the specified service.
146
+ *
147
+ * @param string $service Service name
148
+ *
149
+ * @return array
150
+ */
151
+ public function getVersions($service)
152
+ {
153
+ if (!isset($this->manifest)) {
154
+ $this->buildVersionsList($service);
155
+ }
156
+
157
+ if (!isset($this->manifest[$service]['versions'])) {
158
+ return [];
159
+ }
160
+
161
+ return array_values(array_unique($this->manifest[$service]['versions']));
162
+ }
163
+
164
+ /**
165
+ * Execute the the provider.
166
+ *
167
+ * @param string $type Type of data ('api', 'waiter', 'paginator').
168
+ * @param string $service Service name.
169
+ * @param string $version API version.
170
+ *
171
+ * @return array|null
172
+ */
173
+ public function __invoke($type, $service, $version)
174
+ {
175
+ // Resolve the type or return null.
176
+ if (isset(self::$typeMap[$type])) {
177
+ $type = self::$typeMap[$type];
178
+ } else {
179
+ return null;
180
+ }
181
+
182
+ // Resolve the version or return null.
183
+ if (!isset($this->manifest)) {
184
+ $this->buildVersionsList($service);
185
+ }
186
+
187
+ if (!isset($this->manifest[$service]['versions'][$version])) {
188
+ return null;
189
+ }
190
+
191
+ $version = $this->manifest[$service]['versions'][$version];
192
+ $path = "{$this->modelsDir}/{$service}/{$version}/{$type}.json";
193
+
194
+ try {
195
+ return \Aws\load_compiled_json($path);
196
+ } catch (\InvalidArgumentException $e) {
197
+ return null;
198
+ }
199
+ }
200
+
201
+ /**
202
+ * @param string $modelsDir Directory containing service models.
203
+ * @param array $manifest The API version manifest data.
204
+ */
205
+ private function __construct($modelsDir, array $manifest = null)
206
+ {
207
+ $this->manifest = $manifest;
208
+ $this->modelsDir = rtrim($modelsDir, '/');
209
+ if (!is_dir($this->modelsDir)) {
210
+ throw new \InvalidArgumentException(
211
+ "The specified models directory, {$modelsDir}, was not found."
212
+ );
213
+ }
214
+ }
215
+
216
+ /**
217
+ * Build the versions list for the specified service by globbing the dir.
218
+ */
219
+ private function buildVersionsList($service)
220
+ {
221
+ $dir = "{$this->modelsDir}/{$service}/";
222
+
223
+ if (!is_dir($dir)) {
224
+ return;
225
+ }
226
+
227
+ // Get versions, remove . and .., and sort in descending order.
228
+ $results = array_diff(scandir($dir, SCANDIR_SORT_DESCENDING), ['..', '.']);
229
+
230
+ if (!$results) {
231
+ $this->manifest[$service] = ['versions' => []];
232
+ } else {
233
+ $this->manifest[$service] = [
234
+ 'versions' => [
235
+ 'latest' => $results[0]
236
+ ]
237
+ ];
238
+ $this->manifest[$service]['versions'] += array_combine($results, $results);
239
+ }
240
+ }
241
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Api/DateTimeResult.php ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Api;
3
+
4
+ /**
5
+ * DateTime overrides that make DateTime work more seamlessly as a string,
6
+ * with JSON documents, and with JMESPath.
7
+ */
8
+ class DateTimeResult extends \DateTime implements \JsonSerializable
9
+ {
10
+ /**
11
+ * Create a new DateTimeResult from a unix timestamp.
12
+ *
13
+ * @param $unixTimestamp
14
+ *
15
+ * @return DateTimeResult
16
+ */
17
+ public static function fromEpoch($unixTimestamp)
18
+ {
19
+ return new self(gmdate('c', $unixTimestamp));
20
+ }
21
+
22
+ /**
23
+ * Serialize the DateTimeResult as an ISO 8601 date string.
24
+ *
25
+ * @return string
26
+ */
27
+ public function __toString()
28
+ {
29
+ return $this->format('c');
30
+ }
31
+
32
+ /**
33
+ * Serialize the date as an ISO 8601 date when serializing as JSON.
34
+ *
35
+ * @return mixed|string
36
+ */
37
+ public function jsonSerialize()
38
+ {
39
+ return (string) $this;
40
+ }
41
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Api/DocModel.php ADDED
@@ -0,0 +1,128 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Api;
3
+
4
+ /**
5
+ * Encapsulates the documentation strings for a given service-version and
6
+ * provides methods for extracting the desired parts related to a service,
7
+ * operation, error, or shape (i.e., parameter).
8
+ */
9
+ class DocModel
10
+ {
11
+ /** @var array */
12
+ private $docs;
13
+
14
+ /**
15
+ * @param array $docs
16
+ *
17
+ * @throws \RuntimeException
18
+ */
19
+ public function __construct(array $docs)
20
+ {
21
+ if (!extension_loaded('tidy')) {
22
+ throw new \RuntimeException('The "tidy" PHP extension is required.');
23
+ }
24
+
25
+ $this->docs = $docs;
26
+ }
27
+
28
+ /**
29
+ * Convert the doc model to an array.
30
+ *
31
+ * @return array
32
+ */
33
+ public function toArray()
34
+ {
35
+ return $this->docs;
36
+ }
37
+
38
+ /**
39
+ * Retrieves documentation about the service.
40
+ *
41
+ * @return null|string
42
+ */
43
+ public function getServiceDocs()
44
+ {
45
+ return isset($this->docs['service']) ? $this->docs['service'] : null;
46
+ }
47
+
48
+ /**
49
+ * Retrieves documentation about an operation.
50
+ *
51
+ * @param string $operation Name of the operation
52
+ *
53
+ * @return null|string
54
+ */
55
+ public function getOperationDocs($operation)
56
+ {
57
+ return isset($this->docs['operations'][$operation])
58
+ ? $this->docs['operations'][$operation]
59
+ : null;
60
+ }
61
+
62
+ /**
63
+ * Retrieves documentation about an error.
64
+ *
65
+ * @param string $error Name of the error
66
+ *
67
+ * @return null|string
68
+ */
69
+ public function getErrorDocs($error)
70
+ {
71
+ return isset($this->docs['shapes'][$error]['base'])
72
+ ? $this->docs['shapes'][$error]['base']
73
+ : null;
74
+ }
75
+
76
+ /**
77
+ * Retrieves documentation about a shape, specific to the context.
78
+ *
79
+ * @param string $shapeName Name of the shape.
80
+ * @param string $parentName Name of the parent/context shape.
81
+ * @param string $ref Name used by the context to reference the shape.
82
+ *
83
+ * @return null|string
84
+ */
85
+ public function getShapeDocs($shapeName, $parentName, $ref)
86
+ {
87
+ if (!isset($this->docs['shapes'][$shapeName])) {
88
+ return '';
89
+ }
90
+
91
+ $result = '';
92
+ $d = $this->docs['shapes'][$shapeName];
93
+ if (isset($d['refs']["{$parentName}\$${ref}"])) {
94
+ $result = $d['refs']["{$parentName}\$${ref}"];
95
+ } elseif (isset($d['base'])) {
96
+ $result = $d['base'];
97
+ }
98
+
99
+ if (isset($d['append'])) {
100
+ $result .= $d['append'];
101
+ }
102
+
103
+ return $this->clean($result);
104
+ }
105
+
106
+ private function clean($content)
107
+ {
108
+ if (!$content) {
109
+ return '';
110
+ }
111
+
112
+ $tidy = new \Tidy();
113
+ $tidy->parseString($content, [
114
+ 'indent' => true,
115
+ 'doctype' => 'omit',
116
+ 'output-html' => true,
117
+ 'show-body-only' => true,
118
+ 'drop-empty-paras' => true,
119
+ 'drop-font-tags' => true,
120
+ 'drop-proprietary-attributes' => true,
121
+ 'hide-comments' => true,
122
+ 'logical-emphasis' => true
123
+ ]);
124
+ $tidy->cleanRepair();
125
+
126
+ return (string) $content;
127
+ }
128
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Api/ErrorParser/JsonParserTrait.php ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Api\ErrorParser;
3
+
4
+ use Psr\Http\Message\ResponseInterface;
5
+
6
+ /**
7
+ * Provides basic JSON error parsing functionality.
8
+ */
9
+ trait JsonParserTrait
10
+ {
11
+ private function genericHandler(ResponseInterface $response)
12
+ {
13
+ $code = (string) $response->getStatusCode();
14
+
15
+ return [
16
+ 'request_id' => (string) $response->getHeaderLine('x-amzn-requestid'),
17
+ 'code' => null,
18
+ 'message' => null,
19
+ 'type' => $code[0] == '4' ? 'client' : 'server',
20
+ 'parsed' => json_decode($response->getBody(), true)
21
+ ];
22
+ }
23
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Api/ErrorParser/JsonRpcErrorParser.php ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Api\ErrorParser;
3
+
4
+ use Psr\Http\Message\ResponseInterface;
5
+
6
+ /**
7
+ * Parsers JSON-RPC errors.
8
+ */
9
+ class JsonRpcErrorParser
10
+ {
11
+ use JsonParserTrait;
12
+
13
+ public function __invoke(ResponseInterface $response)
14
+ {
15
+ $data = $this->genericHandler($response);
16
+ // Make the casing consistent across services.
17
+ if ($data['parsed']) {
18
+ $data['parsed'] = array_change_key_case($data['parsed']);
19
+ }
20
+
21
+ if (isset($data['parsed']['__type'])) {
22
+ $parts = explode('#', $data['parsed']['__type']);
23
+ $data['code'] = isset($parts[1]) ? $parts[1] : $parts[0];
24
+ $data['message'] = isset($data['parsed']['message'])
25
+ ? $data['parsed']['message']
26
+ : null;
27
+ }
28
+
29
+ return $data;
30
+ }
31
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Api/ErrorParser/RestJsonErrorParser.php ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Api\ErrorParser;
3
+
4
+ use Psr\Http\Message\ResponseInterface;
5
+
6
+ /**
7
+ * Parses JSON-REST errors.
8
+ */
9
+ class RestJsonErrorParser
10
+ {
11
+ use JsonParserTrait;
12
+
13
+ public function __invoke(ResponseInterface $response)
14
+ {
15
+ $data = $this->genericHandler($response);
16
+
17
+ // Merge in error data from the JSON body
18
+ if ($json = $data['parsed']) {
19
+ $data = array_replace($data, $json);
20
+ }
21
+
22
+ // Correct error type from services like Amazon Glacier
23
+ if (!empty($data['type'])) {
24
+ $data['type'] = strtolower($data['type']);
25
+ }
26
+
27
+ // Retrieve the error code from services like Amazon Elastic Transcoder
28
+ if ($code = $response->getHeaderLine('x-amzn-errortype')) {
29
+ $colon = strpos($code, ':');
30
+ $data['code'] = $colon ? substr($code, 0, $colon) : $code;
31
+ }
32
+
33
+ return $data;
34
+ }
35
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Api/ErrorParser/XmlErrorParser.php ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Api\ErrorParser;
3
+
4
+ use Psr\Http\Message\ResponseInterface;
5
+
6
+ /**
7
+ * Parses XML errors.
8
+ */
9
+ class XmlErrorParser
10
+ {
11
+ public function __invoke(ResponseInterface $response)
12
+ {
13
+ $code = (string) $response->getStatusCode();
14
+
15
+ $data = [
16
+ 'type' => $code[0] == '4' ? 'client' : 'server',
17
+ 'request_id' => null,
18
+ 'code' => null,
19
+ 'message' => null,
20
+ 'parsed' => null
21
+ ];
22
+
23
+ $body = $response->getBody();
24
+ if ($body->getSize() > 0) {
25
+ $this->parseBody(new \SimpleXMLElement($body), $data);
26
+ } else {
27
+ $this->parseHeaders($response, $data);
28
+ }
29
+
30
+ return $data;
31
+ }
32
+
33
+ private function parseHeaders(ResponseInterface $response, array &$data)
34
+ {
35
+ if ($response->getStatusCode() == '404') {
36
+ $data['code'] = 'NotFound';
37
+ }
38
+
39
+ $data['message'] = $response->getStatusCode() . ' '
40
+ . $response->getReasonPhrase();
41
+
42
+ if ($requestId = $response->getHeaderLine('x-amz-request-id')) {
43
+ $data['request_id'] = $requestId;
44
+ $data['message'] .= " (Request-ID: $requestId)";
45
+ }
46
+ }
47
+
48
+ private function parseBody(\SimpleXMLElement $body, array &$data)
49
+ {
50
+ $data['parsed'] = $body;
51
+
52
+ $namespaces = $body->getDocNamespaces();
53
+ if (!isset($namespaces[''])) {
54
+ $prefix = '';
55
+ } else {
56
+ // Account for the default namespace being defined and PHP not
57
+ // being able to handle it :(.
58
+ $body->registerXPathNamespace('ns', $namespaces['']);
59
+ $prefix = 'ns:';
60
+ }
61
+
62
+ if ($tempXml = $body->xpath("//{$prefix}Code[1]")) {
63
+ $data['code'] = (string) $tempXml[0];
64
+ }
65
+
66
+ if ($tempXml = $body->xpath("//{$prefix}Message[1]")) {
67
+ $data['message'] = (string) $tempXml[0];
68
+ }
69
+
70
+ $tempXml = $body->xpath("//{$prefix}RequestId[1]");
71
+ if (empty($tempXml)) {
72
+ $tempXml = $body->xpath("//{$prefix}RequestID[1]");
73
+ }
74
+
75
+ if (isset($tempXml[0])) {
76
+ $data['request_id'] = (string) $tempXml[0];
77
+ }
78
+ }
79
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Api/ListShape.php ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Api;
3
+
4
+ /**
5
+ * Represents a list shape.
6
+ */
7
+ class ListShape extends Shape
8
+ {
9
+ private $member;
10
+
11
+ public function __construct(array $definition, ShapeMap $shapeMap)
12
+ {
13
+ $definition['type'] = 'list';
14
+ parent::__construct($definition, $shapeMap);
15
+ }
16
+
17
+ /**
18
+ * @return Shape
19
+ * @throws \RuntimeException if no member is specified
20
+ */
21
+ public function getMember()
22
+ {
23
+ if (!$this->member) {
24
+ if (!isset($this->definition['member'])) {
25
+ throw new \RuntimeException('No member attribute specified');
26
+ }
27
+ $this->member = Shape::create(
28
+ $this->definition['member'],
29
+ $this->shapeMap
30
+ );
31
+ }
32
+
33
+ return $this->member;
34
+ }
35
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Api/MapShape.php ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Api;
3
+
4
+ /**
5
+ * Represents a map shape.
6
+ */
7
+ class MapShape extends Shape
8
+ {
9
+ /** @var Shape */
10
+ private $value;
11
+
12
+ /** @var Shape */
13
+ private $key;
14
+
15
+ public function __construct(array $definition, ShapeMap $shapeMap)
16
+ {
17
+ $definition['type'] = 'map';
18
+ parent::__construct($definition, $shapeMap);
19
+ }
20
+
21
+ /**
22
+ * @return Shape
23
+ * @throws \RuntimeException if no value is specified
24
+ */
25
+ public function getValue()
26
+ {
27
+ if (!$this->value) {
28
+ if (!isset($this->definition['value'])) {
29
+ throw new \RuntimeException('No value specified');
30
+ }
31
+
32
+ $this->value = Shape::create(
33
+ $this->definition['value'],
34
+ $this->shapeMap
35
+ );
36
+ }
37
+
38
+ return $this->value;
39
+ }
40
+
41
+ /**
42
+ * @return Shape
43
+ */
44
+ public function getKey()
45
+ {
46
+ if (!$this->key) {
47
+ $this->key = isset($this->definition['key'])
48
+ ? Shape::create($this->definition['key'], $this->shapeMap)
49
+ : new Shape(['type' => 'string'], $this->shapeMap);
50
+ }
51
+
52
+ return $this->key;
53
+ }
54
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Operation.php ADDED
@@ -0,0 +1,97 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Api;
3
+
4
+ /**
5
+ * Represents an API operation.
6
+ */
7
+ class Operation extends AbstractModel
8
+ {
9
+ private $input;
10
+ private $output;
11
+ private $errors;
12
+
13
+ public function __construct(array $definition, ShapeMap $shapeMap)
14
+ {
15
+ $definition['type'] = 'structure';
16
+
17
+ if (!isset($definition['http']['method'])) {
18
+ $definition['http']['method'] = 'POST';
19
+ }
20
+
21
+ if (!isset($definition['http']['requestUri'])) {
22
+ $definition['http']['requestUri'] = '/';
23
+ }
24
+
25
+ parent::__construct($definition, $shapeMap);
26
+ }
27
+
28
+ /**
29
+ * Returns an associative array of the HTTP attribute of the operation:
30
+ *
31
+ * - method: HTTP method of the operation
32
+ * - requestUri: URI of the request (can include URI template placeholders)
33
+ *
34
+ * @return array
35
+ */
36
+ public function getHttp()
37
+ {
38
+ return $this->definition['http'];
39
+ }
40
+
41
+ /**
42
+ * Get the input shape of the operation.
43
+ *
44
+ * @return StructureShape
45
+ */
46
+ public function getInput()
47
+ {
48
+ if (!$this->input) {
49
+ if ($input = $this['input']) {
50
+ $this->input = $this->shapeFor($input);
51
+ } else {
52
+ $this->input = new StructureShape([], $this->shapeMap);
53
+ }
54
+ }
55
+
56
+ return $this->input;
57
+ }
58
+
59
+ /**
60
+ * Get the output shape of the operation.
61
+ *
62
+ * @return StructureShape
63
+ */
64
+ public function getOutput()
65
+ {
66
+ if (!$this->output) {
67
+ if ($output = $this['output']) {
68
+ $this->output = $this->shapeFor($output);
69
+ } else {
70
+ $this->output = new StructureShape([], $this->shapeMap);
71
+ }
72
+ }
73
+
74
+ return $this->output;
75
+ }
76
+
77
+ /**
78
+ * Get an array of operation error shapes.
79
+ *
80
+ * @return Shape[]
81
+ */
82
+ public function getErrors()
83
+ {
84
+ if ($this->errors === null) {
85
+ if ($errors = $this['errors']) {
86
+ foreach ($errors as &$error) {
87
+ $error = $this->shapeFor($error);
88
+ }
89
+ $this->errors = $errors;
90
+ } else {
91
+ $this->errors = [];
92
+ }
93
+ }
94
+
95
+ return $this->errors;
96
+ }
97
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Parser/AbstractParser.php ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Api\Parser;
3
+
4
+ use Aws\Api\Service;
5
+ use Aws\CommandInterface;
6
+ use Aws\ResultInterface;
7
+ use Psr\Http\Message\ResponseInterface;
8
+
9
+ /**
10
+ * @internal
11
+ */
12
+ abstract class AbstractParser
13
+ {
14
+ /** @var \Aws\Api\Service Representation of the service API*/
15
+ protected $api;
16
+
17
+ /**
18
+ * @param Service $api Service description.
19
+ */
20
+ public function __construct(Service $api)
21
+ {
22
+ $this->api = $api;
23
+ }
24
+
25
+ /**
26
+ * @param CommandInterface $command Command that was executed.
27
+ * @param ResponseInterface $response Response that was received.
28
+ *
29
+ * @return ResultInterface
30
+ */
31
+ abstract public function __invoke(
32
+ CommandInterface $command,
33
+ ResponseInterface $response
34
+ );
35
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Parser/AbstractRestParser.php ADDED
@@ -0,0 +1,154 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Api\Parser;
3
+
4
+ use Aws\Api\DateTimeResult;
5
+ use Aws\Api\Shape;
6
+ use Aws\Api\StructureShape;
7
+ use Aws\Result;
8
+ use Aws\CommandInterface;
9
+ use Psr\Http\Message\ResponseInterface;
10
+
11
+ /**
12
+ * @internal
13
+ */
14
+ abstract class AbstractRestParser extends AbstractParser
15
+ {
16
+ /**
17
+ * Parses a payload from a response.
18
+ *
19
+ * @param ResponseInterface $response Response to parse.
20
+ * @param StructureShape $member Member to parse
21
+ * @param array $result Result value
22
+ *
23
+ * @return mixed
24
+ */
25
+ abstract protected function payload(
26
+ ResponseInterface $response,
27
+ StructureShape $member,
28
+ array &$result
29
+ );
30
+
31
+ public function __invoke(
32
+ CommandInterface $command,
33
+ ResponseInterface $response
34
+ ) {
35
+ $output = $this->api->getOperation($command->getName())->getOutput();
36
+ $result = [];
37
+
38
+ if ($payload = $output['payload']) {
39
+ $this->extractPayload($payload, $output, $response, $result);
40
+ }
41
+
42
+ foreach ($output->getMembers() as $name => $member) {
43
+ switch ($member['location']) {
44
+ case 'header':
45
+ $this->extractHeader($name, $member, $response, $result);
46
+ break;
47
+ case 'headers':
48
+ $this->extractHeaders($name, $member, $response, $result);
49
+ break;
50
+ case 'statusCode':
51
+ $this->extractStatus($name, $response, $result);
52
+ break;
53
+ }
54
+ }
55
+
56
+ if (!$payload && $response->getBody()->getSize() > 0) {
57
+ // if no payload was found, then parse the contents of the body
58
+ $this->payload($response, $output, $result);
59
+ }
60
+
61
+ return new Result($result);
62
+ }
63
+
64
+ private function extractPayload(
65
+ $payload,
66
+ StructureShape $output,
67
+ ResponseInterface $response,
68
+ array &$result
69
+ ) {
70
+ $member = $output->getMember($payload);
71
+
72
+ if ($member instanceof StructureShape) {
73
+ // Structure members parse top-level data into a specific key.
74
+ $result[$payload] = [];
75
+ $this->payload($response, $member, $result[$payload]);
76
+ } else {
77
+ // Streaming data is just the stream from the response body.
78
+ $result[$payload] = $response->getBody();
79
+ }
80
+ }
81
+
82
+ /**
83
+ * Extract a single header from the response into the result.
84
+ */
85
+ private function extractHeader(
86
+ $name,
87
+ Shape $shape,
88
+ ResponseInterface $response,
89
+ &$result
90
+ ) {
91
+ $value = $response->getHeaderLine($shape['locationName'] ?: $name);
92
+
93
+ switch ($shape->getType()) {
94
+ case 'float':
95
+ case 'double':
96
+ $value = (float) $value;
97
+ break;
98
+ case 'long':
99
+ $value = (int) $value;
100
+ break;
101
+ case 'boolean':
102
+ $value = filter_var($value, FILTER_VALIDATE_BOOLEAN);
103
+ break;
104
+ case 'blob':
105
+ $value = base64_decode($value);
106
+ break;
107
+ case 'timestamp':
108
+ try {
109
+ $value = new DateTimeResult($value);
110
+ break;
111
+ } catch (\Exception $e) {
112
+ // If the value cannot be parsed, then do not add it to the
113
+ // output structure.
114
+ return;
115
+ }
116
+ }
117
+
118
+ $result[$name] = $value;
119
+ }
120
+
121
+ /**
122
+ * Extract a map of headers with an optional prefix from the response.
123
+ */
124
+ private function extractHeaders(
125
+ $name,
126
+ Shape $shape,
127
+ ResponseInterface $response,
128
+ &$result
129
+ ) {
130
+ // Check if the headers are prefixed by a location name
131
+ $result[$name] = [];
132
+ $prefix = $shape['locationName'];
133
+ $prefixLen = strlen($prefix);
134
+
135
+ foreach ($response->getHeaders() as $k => $values) {
136
+ if (!$prefixLen) {
137
+ $result[$name][$k] = implode(', ', $values);
138
+ } elseif (stripos($k, $prefix) === 0) {
139
+ $result[$name][substr($k, $prefixLen)] = implode(', ', $values);
140
+ }
141
+ }
142
+ }
143
+
144
+ /**
145
+ * Places the status code of the response into the result array.
146
+ */
147
+ private function extractStatus(
148
+ $name,
149
+ ResponseInterface $response,
150
+ array &$result
151
+ ) {
152
+ $result[$name] = (int) $response->getStatusCode();
153
+ }
154
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Parser/Crc32ValidatingParser.php ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Api\Parser;
3
+
4
+ use Aws\CommandInterface;
5
+ use Aws\Exception\AwsException;
6
+ use Psr\Http\Message\ResponseInterface;
7
+ use GuzzleHttp\Psr7;
8
+
9
+ /**
10
+ * @internal Decorates a parser and validates the x-amz-crc32 header.
11
+ */
12
+ class Crc32ValidatingParser extends AbstractParser
13
+ {
14
+ /** @var callable */
15
+ private $parser;
16
+
17
+ /**
18
+ * @param callable $parser Parser to wrap.
19
+ */
20
+ public function __construct(callable $parser)
21
+ {
22
+ $this->parser = $parser;
23
+ }
24
+
25
+ public function __invoke(
26
+ CommandInterface $command,
27
+ ResponseInterface $response
28
+ ) {
29
+ if ($expected = $response->getHeaderLine('x-amz-crc32')) {
30
+ $hash = hexdec(Psr7\hash($response->getBody(), 'crc32b'));
31
+ if ($expected != $hash) {
32
+ throw new AwsException(
33
+ "crc32 mismatch. Expected {$expected}, found {$hash}.",
34
+ $command,
35
+ [
36
+ 'code' => 'ClientChecksumMismatch',
37
+ 'connection_error' => true,
38
+ 'response' => $response
39
+ ]
40
+ );
41
+ }
42
+ }
43
+
44
+ $fn = $this->parser;
45
+ return $fn($command, $response);
46
+ }
47
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Parser/Exception/ParserException.php ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <?php
2
+ namespace Aws\Api\Parser\Exception;
3
+
4
+ class ParserException extends \RuntimeException {}
vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Parser/JsonParser.php ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Api\Parser;
3
+
4
+ use Aws\Api\DateTimeResult;
5
+ use Aws\Api\Shape;
6
+
7
+ /**
8
+ * @internal Implements standard JSON parsing.
9
+ */
10
+ class JsonParser
11
+ {
12
+ public function parse(Shape $shape, $value)
13
+ {
14
+ if ($value === null) {
15
+ return $value;
16
+ }
17
+
18
+ switch ($shape['type']) {
19
+ case 'structure':
20
+ $target = [];
21
+ foreach ($shape->getMembers() as $name => $member) {
22
+ $locationName = $member['locationName'] ?: $name;
23
+ if (isset($value[$locationName])) {
24
+ $target[$name] = $this->parse($member, $value[$locationName]);
25
+ }
26
+ }
27
+ return $target;
28
+
29
+ case 'list':
30
+ $member = $shape->getMember();
31
+ $target = [];
32
+ foreach ($value as $v) {
33
+ $target[] = $this->parse($member, $v);
34
+ }
35
+ return $target;
36
+
37
+ case 'map':
38
+ $values = $shape->getValue();
39
+ $target = [];
40
+ foreach ($value as $k => $v) {
41
+ $target[$k] = $this->parse($values, $v);
42
+ }
43
+ return $target;
44
+
45
+ case 'timestamp':
46
+ // The Unix epoch (or Unix time or POSIX time or Unix
47
+ // timestamp) is the number of seconds that have elapsed since
48
+ // January 1, 1970 (midnight UTC/GMT).
49
+ return DateTimeResult::fromEpoch($value);
50
+
51
+ case 'blob':
52
+ return base64_decode($value);
53
+
54
+ default:
55
+ return $value;
56
+ }
57
+ }
58
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Parser/JsonRpcParser.php ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Api\Parser;
3
+
4
+ use Aws\Api\Service;
5
+ use Aws\Result;
6
+ use Aws\CommandInterface;
7
+ use Psr\Http\Message\ResponseInterface;
8
+
9
+ /**
10
+ * @internal Implements JSON-RPC parsing (e.g., DynamoDB)
11
+ */
12
+ class JsonRpcParser extends AbstractParser
13
+ {
14
+ use PayloadParserTrait;
15
+
16
+ private $parser;
17
+
18
+ /**
19
+ * @param Service $api Service description
20
+ * @param JsonParser $parser JSON body builder
21
+ */
22
+ public function __construct(Service $api, JsonParser $parser = null)
23
+ {
24
+ parent::__construct($api);
25
+ $this->parser = $parser ?: new JsonParser();
26
+ }
27
+
28
+ public function __invoke(
29
+ CommandInterface $command,
30
+ ResponseInterface $response
31
+ ) {
32
+ $operation = $this->api->getOperation($command->getName());
33
+
34
+ return new Result($this->parser->parse(
35
+ $operation->getOutput(),
36
+ $this->parseJson($response->getBody())
37
+ ));
38
+ }
39
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Parser/PayloadParserTrait.php ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Api\Parser;
3
+
4
+ use Aws\Api\Parser\Exception\ParserException;
5
+
6
+ trait PayloadParserTrait
7
+ {
8
+ /**
9
+ * @param string $json
10
+ *
11
+ * @throws ParserException
12
+ *
13
+ * @return array
14
+ */
15
+ private function parseJson($json)
16
+ {
17
+ $jsonPayload = json_decode($json, true);
18
+
19
+ if (JSON_ERROR_NONE !== json_last_error()) {
20
+ throw new ParserException('Error parsing JSON: '
21
+ . json_last_error_msg());
22
+ }
23
+
24
+ return $jsonPayload;
25
+ }
26
+
27
+ /**
28
+ * @param string $xml
29
+ *
30
+ * @throws ParserException
31
+ *
32
+ * @return \SimpleXMLElement
33
+ */
34
+ private function parseXml($xml)
35
+ {
36
+ $priorSetting = libxml_use_internal_errors(true);
37
+ try {
38
+ libxml_clear_errors();
39
+ $xmlPayload = new \SimpleXMLElement($xml);
40
+ if ($error = libxml_get_last_error()) {
41
+ throw new \RuntimeException($error->message);
42
+ }
43
+ } catch (\Exception $e) {
44
+ throw new ParserException("Error parsing XML: {$e->getMessage()}", 0, $e);
45
+ } finally {
46
+ libxml_use_internal_errors($priorSetting);
47
+ }
48
+
49
+ return $xmlPayload;
50
+ }
51
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Parser/QueryParser.php ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Api\Parser;
3
+
4
+ use Aws\Api\Service;
5
+ use Aws\Result;
6
+ use Aws\CommandInterface;
7
+ use Psr\Http\Message\ResponseInterface;
8
+
9
+ /**
10
+ * @internal Parses query (XML) responses (e.g., EC2, SQS, and many others)
11
+ */
12
+ class QueryParser extends AbstractParser
13
+ {
14
+ use PayloadParserTrait;
15
+
16
+ /** @var XmlParser */
17
+ private $xmlParser;
18
+
19
+ /** @var bool */
20
+ private $honorResultWrapper;
21
+
22
+ /**
23
+ * @param Service $api Service description
24
+ * @param XmlParser $xmlParser Optional XML parser
25
+ * @param bool $honorResultWrapper Set to false to disable the peeling
26
+ * back of result wrappers from the
27
+ * output strucutre.
28
+ */
29
+ public function __construct(
30
+ Service $api,
31
+ XmlParser $xmlParser = null,
32
+ $honorResultWrapper = true
33
+ ) {
34
+ parent::__construct($api);
35
+ $this->xmlParser = $xmlParser ?: new XmlParser();
36
+ $this->honorResultWrapper = $honorResultWrapper;
37
+ }
38
+
39
+ public function __invoke(
40
+ CommandInterface $command,
41
+ ResponseInterface $response
42
+ ) {
43
+ $output = $this->api->getOperation($command->getName())->getOutput();
44
+ $xml = $this->parseXml($response->getBody());
45
+
46
+ if ($this->honorResultWrapper && $output['resultWrapper']) {
47
+ $xml = $xml->{$output['resultWrapper']};
48
+ }
49
+
50
+ return new Result($this->xmlParser->parse($output, $xml));
51
+ }
52
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Parser/RestJsonParser.php ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Api\Parser;
3
+
4
+ use Aws\Api\Service;
5
+ use Aws\Api\StructureShape;
6
+ use Psr\Http\Message\ResponseInterface;
7
+
8
+ /**
9
+ * @internal Implements REST-JSON parsing (e.g., Glacier, Elastic Transcoder)
10
+ */
11
+ class RestJsonParser extends AbstractRestParser
12
+ {
13
+ use PayloadParserTrait;
14
+
15
+ /** @var JsonParser */
16
+ private $parser;
17
+
18
+ /**
19
+ * @param Service $api Service description
20
+ * @param JsonParser $parser JSON body builder
21
+ */
22
+ public function __construct(Service $api, JsonParser $parser = null)
23
+ {
24
+ parent::__construct($api);
25
+ $this->parser = $parser ?: new JsonParser();
26
+ }
27
+
28
+ protected function payload(
29
+ ResponseInterface $response,
30
+ StructureShape $member,
31
+ array &$result
32
+ ) {
33
+ $jsonBody = $this->parseJson($response->getBody());
34
+
35
+ if ($jsonBody) {
36
+ $result += $this->parser->parse($member, $jsonBody);
37
+ }
38
+ }
39
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Parser/RestXmlParser.php ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Api\Parser;
3
+
4
+ use Aws\Api\StructureShape;
5
+ use Aws\Api\Service;
6
+ use Psr\Http\Message\ResponseInterface;
7
+
8
+ /**
9
+ * @internal Implements REST-XML parsing (e.g., S3, CloudFront, etc...)
10
+ */
11
+ class RestXmlParser extends AbstractRestParser
12
+ {
13
+ use PayloadParserTrait;
14
+
15
+ /** @var XmlParser */
16
+ private $parser;
17
+
18
+ /**
19
+ * @param Service $api Service description
20
+ * @param XmlParser $parser XML body parser
21
+ */
22
+ public function __construct(Service $api, XmlParser $parser = null)
23
+ {
24
+ parent::__construct($api);
25
+ $this->parser = $parser ?: new XmlParser();
26
+ }
27
+
28
+ protected function payload(
29
+ ResponseInterface $response,
30
+ StructureShape $member,
31
+ array &$result
32
+ ) {
33
+ $xml = $this->parseXml($response->getBody());
34
+ $result += $this->parser->parse($member, $xml);
35
+ }
36
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Parser/XmlParser.php ADDED
@@ -0,0 +1,134 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Api\Parser;
3
+
4
+ use Aws\Api\DateTimeResult;
5
+ use Aws\Api\ListShape;
6
+ use Aws\Api\MapShape;
7
+ use Aws\Api\Shape;
8
+ use Aws\Api\StructureShape;
9
+
10
+ /**
11
+ * @internal Implements standard XML parsing for REST-XML and Query protocols.
12
+ */
13
+ class XmlParser
14
+ {
15
+ public function parse(StructureShape $shape, \SimpleXMLElement $value)
16
+ {
17
+ return $this->dispatch($shape, $value);
18
+ }
19
+
20
+ private function dispatch($shape, \SimpleXMLElement $value)
21
+ {
22
+ static $methods = [
23
+ 'structure' => 'parse_structure',
24
+ 'list' => 'parse_list',
25
+ 'map' => 'parse_map',
26
+ 'blob' => 'parse_blob',
27
+ 'boolean' => 'parse_boolean',
28
+ 'integer' => 'parse_integer',
29
+ 'float' => 'parse_float',
30
+ 'double' => 'parse_float',
31
+ 'timestamp' => 'parse_timestamp',
32
+ ];
33
+
34
+ $type = $shape['type'];
35
+ if (isset($methods[$type])) {
36
+ return $this->{$methods[$type]}($shape, $value);
37
+ }
38
+
39
+ return (string) $value;
40
+ }
41
+
42
+ private function parse_structure(
43
+ StructureShape $shape,
44
+ \SimpleXMLElement $value
45
+ ) {
46
+ $target = [];
47
+
48
+ foreach ($shape->getMembers() as $name => $member) {
49
+ // Extract the name of the XML node
50
+ $node = $this->memberKey($member, $name);
51
+ if (isset($value->{$node})) {
52
+ $target[$name] = $this->dispatch($member, $value->{$node});
53
+ }
54
+ }
55
+
56
+ return $target;
57
+ }
58
+
59
+ private function memberKey(Shape $shape, $name)
60
+ {
61
+ if (null !== $shape['locationName']) {
62
+ return $shape['locationName'];
63
+ }
64
+
65
+ if ($shape instanceof ListShape && $shape['flattened']) {
66
+ return $shape->getMember()['locationName'] ?: $name;
67
+ }
68
+
69
+ return $name;
70
+ }
71
+
72
+ private function parse_list(ListShape $shape, \SimpleXMLElement $value)
73
+ {
74
+ $target = [];
75
+ $member = $shape->getMember();
76
+
77
+ if (!$shape['flattened']) {
78
+ $value = $value->{$member['locationName'] ?: 'member'};
79
+ }
80
+
81
+ foreach ($value as $v) {
82
+ $target[] = $this->dispatch($member, $v);
83
+ }
84
+
85
+ return $target;
86
+ }
87
+
88
+ private function parse_map(MapShape $shape, \SimpleXMLElement $value)
89
+ {
90
+ $target = [];
91
+
92
+ if (!$shape['flattened']) {
93
+ $value = $value->entry;
94
+ }
95
+
96
+ $mapKey = $shape->getKey();
97
+ $mapValue = $shape->getValue();
98
+ $keyName = $shape->getKey()['locationName'] ?: 'key';
99
+ $valueName = $shape->getValue()['locationName'] ?: 'value';
100
+
101
+ foreach ($value as $node) {
102
+ $key = $this->dispatch($mapKey, $node->{$keyName});
103
+ $value = $this->dispatch($mapValue, $node->{$valueName});
104
+ $target[$key] = $value;
105
+ }
106
+
107
+ return $target;
108
+ }
109
+
110
+ private function parse_blob(Shape $shape, $value)
111
+ {
112
+ return base64_decode((string) $value);
113
+ }
114
+
115
+ private function parse_float(Shape $shape, $value)
116
+ {
117
+ return (float) (string) $value;
118
+ }
119
+
120
+ private function parse_integer(Shape $shape, $value)
121
+ {
122
+ return (int) (string) $value;
123
+ }
124
+
125
+ private function parse_boolean(Shape $shape, $value)
126
+ {
127
+ return $value == 'true' ? true : false;
128
+ }
129
+
130
+ private function parse_timestamp(Shape $shape, $value)
131
+ {
132
+ return new DateTimeResult($value);
133
+ }
134
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Serializer/Ec2ParamBuilder.php ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Api\Serializer;
3
+
4
+ use Aws\Api\Shape;
5
+ use Aws\Api\ListShape;
6
+
7
+ /**
8
+ * @internal
9
+ */
10
+ class Ec2ParamBuilder extends QueryParamBuilder
11
+ {
12
+ protected function queryName(Shape $shape, $default = null)
13
+ {
14
+ return ($shape['queryName']
15
+ ?: ucfirst($shape['locationName']))
16
+ ?: $default;
17
+ }
18
+
19
+ protected function isFlat(Shape $shape)
20
+ {
21
+ return false;
22
+ }
23
+
24
+ protected function format_list(
25
+ ListShape $shape,
26
+ array $value,
27
+ $prefix,
28
+ &$query
29
+ ) {
30
+ // Handle empty list serialization
31
+ if (!$value) {
32
+ $query[$prefix] = false;
33
+ } else {
34
+ $items = $shape->getMember();
35
+ foreach ($value as $k => $v) {
36
+ $this->format($items, $v, $prefix . '.' . ($k + 1), $query);
37
+ }
38
+ }
39
+ }
40
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Serializer/JsonBody.php ADDED
@@ -0,0 +1,90 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Api\Serializer;
3
+
4
+ use Aws\Api\Service;
5
+ use Aws\Api\Shape;
6
+ use Aws\Api\TimestampShape;
7
+
8
+ /**
9
+ * Formats the JSON body of a JSON-REST or JSON-RPC operation.
10
+ * @internal
11
+ */
12
+ class JsonBody
13
+ {
14
+ private $api;
15
+
16
+ public function __construct(Service $api)
17
+ {
18
+ $this->api = $api;
19
+ }
20
+
21
+ /**
22
+ * Gets the JSON Content-Type header for a service API
23
+ *
24
+ * @param Service $service
25
+ *
26
+ * @return string
27
+ */
28
+ public static function getContentType(Service $service)
29
+ {
30
+ return 'application/x-amz-json-'
31
+ . number_format($service->getMetadata('jsonVersion'), 1);
32
+ }
33
+
34
+ /**
35
+ * Builds the JSON body based on an array of arguments.
36
+ *
37
+ * @param Shape $shape Operation being constructed
38
+ * @param array $args Associative array of arguments
39
+ *
40
+ * @return string
41
+ */
42
+ public function build(Shape $shape, array $args)
43
+ {
44
+ $result = json_encode($this->format($shape, $args));
45
+
46
+ return $result == '[]' ? '{}' : $result;
47
+ }
48
+
49
+ private function format(Shape $shape, $value)
50
+ {
51
+ switch ($shape['type']) {
52
+ case 'structure':
53
+ $data = [];
54
+ foreach ($value as $k => $v) {
55
+ if ($v !== null && $shape->hasMember($k)) {
56
+ $valueShape = $shape->getMember($k);
57
+ $data[$valueShape['locationName'] ?: $k]
58
+ = $this->format($valueShape, $v);
59
+ }
60
+ }
61
+ return $data;
62
+
63
+ case 'list':
64
+ $items = $shape->getMember();
65
+ foreach ($value as &$v) {
66
+ $v = $this->format($items, $v);
67
+ }
68
+ return $value;
69
+
70
+ case 'map':
71
+ if (empty($value)) {
72
+ return new \stdClass;
73
+ }
74
+ $values = $shape->getValue();
75
+ foreach ($value as &$v) {
76
+ $v = $this->format($values, $v);
77
+ }
78
+ return $value;
79
+
80
+ case 'blob':
81
+ return base64_encode($value);
82
+
83
+ case 'timestamp':
84
+ return TimestampShape::format($value, 'unixTimestamp');
85
+
86
+ default:
87
+ return $value;
88
+ }
89
+ }
90
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Serializer/JsonRpcSerializer.php ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Api\Serializer;
3
+
4
+ use Aws\Api\Service;
5
+ use Aws\CommandInterface;
6
+ use GuzzleHttp\Psr7\Request;
7
+ use Psr\Http\Message\RequestInterface;
8
+
9
+ /**
10
+ * Prepares a JSON-RPC request for transfer.
11
+ * @internal
12
+ */
13
+ class JsonRpcSerializer
14
+ {
15
+ /** @var JsonBody */
16
+ private $jsonFormatter;
17
+
18
+ /** @var string */
19
+ private $endpoint;
20
+
21
+ /** @var Service */
22
+ private $api;
23
+
24
+ /** @var string */
25
+ private $contentType;
26
+
27
+ /**
28
+ * @param Service $api Service description
29
+ * @param string $endpoint Endpoint to connect to
30
+ * @param JsonBody $jsonFormatter Optional JSON formatter to use
31
+ */
32
+ public function __construct(
33
+ Service $api,
34
+ $endpoint,
35
+ JsonBody $jsonFormatter = null
36
+ ) {
37
+ $this->endpoint = $endpoint;
38
+ $this->api = $api;
39
+ $this->jsonFormatter = $jsonFormatter ?: new JsonBody($this->api);
40
+ $this->contentType = JsonBody::getContentType($api);
41
+ }
42
+
43
+ /**
44
+ * When invoked with an AWS command, returns a serialization array
45
+ * containing "method", "uri", "headers", and "body" key value pairs.
46
+ *
47
+ * @param CommandInterface $command
48
+ *
49
+ * @return RequestInterface
50
+ */
51
+ public function __invoke(CommandInterface $command)
52
+ {
53
+ $name = $command->getName();
54
+ $operation = $this->api->getOperation($name);
55
+
56
+ return new Request(
57
+ $operation['http']['method'],
58
+ $this->endpoint,
59
+ [
60
+ 'X-Amz-Target' => $this->api->getMetadata('targetPrefix') . '.' . $name,
61
+ 'Content-Type' => $this->contentType
62
+ ],
63
+ $this->jsonFormatter->build(
64
+ $operation->getInput(),
65
+ $command->toArray()
66
+ )
67
+ );
68
+ }
69
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Serializer/QueryParamBuilder.php ADDED
@@ -0,0 +1,154 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Api\Serializer;
3
+
4
+ use Aws\Api\StructureShape;
5
+ use Aws\Api\ListShape;
6
+ use Aws\Api\MapShape;
7
+ use Aws\Api\Shape;
8
+ use Aws\Api\TimestampShape;
9
+
10
+ /**
11
+ * @internal
12
+ */
13
+ class QueryParamBuilder
14
+ {
15
+ private $methods;
16
+
17
+ protected function queryName(Shape $shape, $default = null)
18
+ {
19
+ if (null !== $shape['queryName']) {
20
+ return $shape['queryName'];
21
+ }
22
+
23
+ if (null !== $shape['locationName']) {
24
+ return $shape['locationName'];
25
+ }
26
+
27
+ if ($this->isFlat($shape) && !empty($shape['member']['locationName'])) {
28
+ return $shape['member']['locationName'];
29
+ }
30
+
31
+ return $default;
32
+ }
33
+
34
+ protected function isFlat(Shape $shape)
35
+ {
36
+ return $shape['flattened'] === true;
37
+ }
38
+
39
+ public function __invoke(StructureShape $shape, array $params)
40
+ {
41
+ if (!$this->methods) {
42
+ $this->methods = array_fill_keys(get_class_methods($this), true);
43
+ }
44
+
45
+ $query = [];
46
+ $this->format_structure($shape, $params, '', $query);
47
+
48
+ return $query;
49
+ }
50
+
51
+ protected function format(Shape $shape, $value, $prefix, array &$query)
52
+ {
53
+ $type = 'format_' . $shape['type'];
54
+ if (isset($this->methods[$type])) {
55
+ $this->{$type}($shape, $value, $prefix, $query);
56
+ } else {
57
+ $query[$prefix] = (string) $value;
58
+ }
59
+ }
60
+
61
+ protected function format_structure(
62
+ StructureShape $shape,
63
+ array $value,
64
+ $prefix,
65
+ &$query
66
+ ) {
67
+ if ($prefix) {
68
+ $prefix .= '.';
69
+ }
70
+
71
+ foreach ($value as $k => $v) {
72
+ if ($shape->hasMember($k)) {
73
+ $member = $shape->getMember($k);
74
+ $this->format(
75
+ $member,
76
+ $v,
77
+ $prefix . $this->queryName($member, $k),
78
+ $query
79
+ );
80
+ }
81
+ }
82
+ }
83
+
84
+ protected function format_list(
85
+ ListShape $shape,
86
+ array $value,
87
+ $prefix,
88
+ &$query
89
+ ) {
90
+ // Handle empty list serialization
91
+ if (!$value) {
92
+ $query[$prefix] = '';
93
+ return;
94
+ }
95
+
96
+ $items = $shape->getMember();
97
+
98
+ if (!$this->isFlat($shape)) {
99
+ $locationName = $shape->getMember()['locationName'] ?: 'member';
100
+ $prefix .= ".$locationName";
101
+ } elseif ($name = $this->queryName($items)) {
102
+ $parts = explode('.', $prefix);
103
+ $parts[count($parts) - 1] = $name;
104
+ $prefix = implode('.', $parts);
105
+ }
106
+
107
+ foreach ($value as $k => $v) {
108
+ $this->format($items, $v, $prefix . '.' . ($k + 1), $query);
109
+ }
110
+ }
111
+
112
+ protected function format_map(
113
+ MapShape $shape,
114
+ array $value,
115
+ $prefix,
116
+ array &$query
117
+ ) {
118
+ $vals = $shape->getValue();
119
+ $keys = $shape->getKey();
120
+
121
+ if (!$this->isFlat($shape)) {
122
+ $prefix .= '.entry';
123
+ }
124
+
125
+ $i = 0;
126
+ $keyName = '%s.%d.' . $this->queryName($keys, 'key');
127
+ $valueName = '%s.%s.' . $this->queryName($vals, 'value');
128
+
129
+ foreach ($value as $k => $v) {
130
+ $i++;
131
+ $this->format($keys, $k, sprintf($keyName, $prefix, $i), $query);
132
+ $this->format($vals, $v, sprintf($valueName, $prefix, $i), $query);
133
+ }
134
+ }
135
+
136
+ protected function format_blob(Shape $shape, $value, $prefix, array &$query)
137
+ {
138
+ $query[$prefix] = base64_encode($value);
139
+ }
140
+
141
+ protected function format_timestamp(
142
+ TimestampShape $shape,
143
+ $value,
144
+ $prefix,
145
+ array &$query
146
+ ) {
147
+ $query[$prefix] = TimestampShape::format($value, 'iso8601');
148
+ }
149
+
150
+ protected function format_boolean(Shape $shape, $value, $prefix, array &$query)
151
+ {
152
+ $query[$prefix] = ($value) ? 'true' : 'false';
153
+ }
154
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Serializer/QuerySerializer.php ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Api\Serializer;
3
+
4
+ use Aws\Api\Service;
5
+ use Aws\CommandInterface;
6
+ use GuzzleHttp\Psr7\Request;
7
+ use Psr\Http\Message\RequestInterface;
8
+
9
+ /**
10
+ * Serializes a query protocol request.
11
+ * @internal
12
+ */
13
+ class QuerySerializer
14
+ {
15
+ private $endpoint;
16
+ private $api;
17
+ private $paramBuilder;
18
+
19
+ public function __construct(
20
+ Service $api,
21
+ $endpoint,
22
+ callable $paramBuilder = null
23
+ ) {
24
+ $this->api = $api;
25
+ $this->endpoint = $endpoint;
26
+ $this->paramBuilder = $paramBuilder ?: new QueryParamBuilder();
27
+ }
28
+
29
+ /**
30
+ * When invoked with an AWS command, returns a serialization array
31
+ * containing "method", "uri", "headers", and "body" key value pairs.
32
+ *
33
+ * @param CommandInterface $command
34
+ *
35
+ * @return RequestInterface
36
+ */
37
+ public function __invoke(CommandInterface $command)
38
+ {
39
+ $operation = $this->api->getOperation($command->getName());
40
+
41
+ $body = [
42
+ 'Action' => $command->getName(),
43
+ 'Version' => $this->api->getMetadata('apiVersion')
44
+ ];
45
+
46
+ $params = $command->toArray();
47
+
48
+ // Only build up the parameters when there are parameters to build
49
+ if ($params) {
50
+ $body += call_user_func(
51
+ $this->paramBuilder,
52
+ $operation->getInput(),
53
+ $params
54
+ );
55
+ }
56
+
57
+ $body = http_build_query($body, null, '&', PHP_QUERY_RFC3986);
58
+
59
+ return new Request(
60
+ 'POST',
61
+ $this->endpoint,
62
+ [
63
+ 'Content-Length' => strlen($body),
64
+ 'Content-Type' => 'application/x-www-form-urlencoded'
65
+ ],
66
+ $body
67
+ );
68
+ }
69
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Serializer/RestJsonSerializer.php ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Api\Serializer;
3
+
4
+ use Aws\Api\Service;
5
+ use Aws\Api\StructureShape;
6
+
7
+ /**
8
+ * Serializes requests for the REST-JSON protocol.
9
+ * @internal
10
+ */
11
+ class RestJsonSerializer extends RestSerializer
12
+ {
13
+ /** @var JsonBody */
14
+ private $jsonFormatter;
15
+
16
+ /** @var string */
17
+ private $contentType;
18
+
19
+ /**
20
+ * @param Service $api Service API description
21
+ * @param string $endpoint Endpoint to connect to
22
+ * @param JsonBody $jsonFormatter Optional JSON formatter to use
23
+ */
24
+ public function __construct(
25
+ Service $api,
26
+ $endpoint,
27
+ JsonBody $jsonFormatter = null
28
+ ) {
29
+ parent::__construct($api, $endpoint);
30
+ $this->contentType = JsonBody::getContentType($api);
31
+ $this->jsonFormatter = $jsonFormatter ?: new JsonBody($api);
32
+ }
33
+
34
+ protected function payload(StructureShape $member, array $value, array &$opts)
35
+ {
36
+ $opts['headers']['Content-Type'] = $this->contentType;
37
+ $opts['body'] = (string) $this->jsonFormatter->build($member, $value);
38
+ }
39
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Serializer/RestSerializer.php ADDED
@@ -0,0 +1,193 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Api\Serializer;
3
+
4
+ use Aws\Api\MapShape;
5
+ use Aws\Api\Service;
6
+ use Aws\Api\Operation;
7
+ use Aws\Api\Shape;
8
+ use Aws\Api\StructureShape;
9
+ use Aws\Api\TimestampShape;
10
+ use Aws\CommandInterface;
11
+ use GuzzleHttp\Psr7;
12
+ use Psr\Http\Message\RequestInterface;
13
+
14
+ /**
15
+ * Serializes HTTP locations like header, uri, payload, etc...
16
+ * @internal
17
+ */
18
+ abstract class RestSerializer
19
+ {
20
+ /** @var Service */
21
+ private $api;
22
+
23
+ /** @var Psr7\Uri */
24
+ private $endpoint;
25
+
26
+ /**
27
+ * @param Service $api Service API description
28
+ * @param string $endpoint Endpoint to connect to
29
+ */
30
+ public function __construct(Service $api, $endpoint)
31
+ {
32
+ $this->api = $api;
33
+ $this->endpoint = Psr7\uri_for($endpoint);
34
+ }
35
+
36
+ /**
37
+ * @param CommandInterface $command Command to serialized
38
+ *
39
+ * @return RequestInterface
40
+ */
41
+ public function __invoke(CommandInterface $command)
42
+ {
43
+ $operation = $this->api->getOperation($command->getName());
44
+ $args = $command->toArray();
45
+ $opts = $this->serialize($operation, $args);
46
+ $uri = $this->buildEndpoint($operation, $args, $opts);
47
+
48
+ return new Psr7\Request(
49
+ $operation['http']['method'],
50
+ $uri,
51
+ isset($opts['headers']) ? $opts['headers'] : [],
52
+ isset($opts['body']) ? $opts['body'] : null
53
+ );
54
+ }
55
+
56
+ /**
57
+ * Modifies a hash of request options for a payload body.
58
+ *
59
+ * @param StructureShape $member Member to serialize
60
+ * @param array $value Value to serialize
61
+ * @param array $opts Request options to modify.
62
+ */
63
+ abstract protected function payload(
64
+ StructureShape $member,
65
+ array $value,
66
+ array &$opts
67
+ );
68
+
69
+ private function serialize(Operation $operation, array $args)
70
+ {
71
+ $opts = [];
72
+ $input = $operation->getInput();
73
+
74
+ // Apply the payload trait if present
75
+ if ($payload = $input['payload']) {
76
+ $this->applyPayload($input, $payload, $args, $opts);
77
+ }
78
+
79
+ foreach ($args as $name => $value) {
80
+ if ($input->hasMember($name)) {
81
+ $member = $input->getMember($name);
82
+ $location = $member['location'];
83
+ if (!$payload && !$location) {
84
+ $bodyMembers[$name] = $value;
85
+ } elseif ($location == 'header') {
86
+ $this->applyHeader($name, $member, $value, $opts);
87
+ } elseif ($location == 'querystring') {
88
+ $this->applyQuery($name, $member, $value, $opts);
89
+ } elseif ($location == 'headers') {
90
+ $this->applyHeaderMap($name, $member, $value, $opts);
91
+ }
92
+ }
93
+ }
94
+
95
+ if (isset($bodyMembers)) {
96
+ $this->payload($operation->getInput(), $bodyMembers, $opts);
97
+ }
98
+
99
+ return $opts;
100
+ }
101
+
102
+ private function applyPayload(StructureShape $input, $name, array $args, array &$opts)
103
+ {
104
+ if (!isset($args[$name])) {
105
+ return;
106
+ }
107
+
108
+ $m = $input->getMember($name);
109
+
110
+ if ($m['streaming'] ||
111
+ ($m['type'] == 'string' || $m['type'] == 'blob')
112
+ ) {
113
+ // Streaming bodies or payloads that are strings are
114
+ // always just a stream of data.
115
+ $opts['body'] = Psr7\stream_for($args[$name]);
116
+ return;
117
+ }
118
+
119
+ $this->payload($m, $args[$name], $opts);
120
+ }
121
+
122
+ private function applyHeader($name, Shape $member, $value, array &$opts)
123
+ {
124
+ if ($member->getType() == 'timestamp') {
125
+ $value = TimestampShape::format($value, 'rfc822');
126
+ }
127
+
128
+ $opts['headers'][$member['locationName'] ?: $name] = $value;
129
+ }
130
+
131
+ /**
132
+ * Note: This is currently only present in the Amazon S3 model.
133
+ */
134
+ private function applyHeaderMap($name, Shape $member, array $value, array &$opts)
135
+ {
136
+ $prefix = $member['locationName'];
137
+ foreach ($value as $k => $v) {
138
+ $opts['headers'][$prefix . $k] = $v;
139
+ }
140
+ }
141
+
142
+ private function applyQuery($name, Shape $member, $value, array &$opts)
143
+ {
144
+ if ($member instanceof MapShape) {
145
+ $opts['query'] = isset($opts['query']) && is_array($opts['query'])
146
+ ? $opts['query'] + $value
147
+ : $value;
148
+ } elseif ($value !== null) {
149
+ $opts['query'][$member['locationName'] ?: $name] = $value;
150
+ }
151
+ }
152
+
153
+ private function buildEndpoint(Operation $operation, array $args, array $opts)
154
+ {
155
+ $varspecs = [];
156
+
157
+ // Create an associative array of varspecs used in expansions
158
+ foreach ($operation->getInput()->getMembers() as $name => $member) {
159
+ if ($member['location'] == 'uri') {
160
+ $varspecs[$member['locationName'] ?: $name] =
161
+ isset($args[$name])
162
+ ? $args[$name]
163
+ : null;
164
+ }
165
+ }
166
+
167
+ $relative = preg_replace_callback(
168
+ '/\{([^\}]+)\}/',
169
+ function (array $matches) use ($varspecs) {
170
+ $isGreedy = substr($matches[1], -1, 1) == '+';
171
+ $k = $isGreedy ? substr($matches[1], 0, -1) : $matches[1];
172
+ if (!isset($varspecs[$k])) {
173
+ return '';
174
+ } elseif ($isGreedy) {
175
+ return str_replace('%2F', '/', rawurlencode($varspecs[$k]));
176
+ } else {
177
+ return rawurlencode($varspecs[$k]);
178
+ }
179
+ },
180
+ $operation['http']['requestUri']
181
+ );
182
+
183
+ // Add the query string variables or appending to one if needed.
184
+ if (!empty($opts['query'])) {
185
+ $append = Psr7\build_query($opts['query']);
186
+ $relative .= strpos($relative, '?') ? "&{$append}" : "?$append";
187
+ }
188
+
189
+ // Expand path place holders using Amazon's slightly different URI
190
+ // template syntax.
191
+ return Psr7\Uri::resolve($this->endpoint, $relative);
192
+ }
193
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Serializer/RestXmlSerializer.php ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Api\Serializer;
3
+
4
+ use Aws\Api\StructureShape;
5
+ use Aws\Api\Service;
6
+
7
+ /**
8
+ * @internal
9
+ */
10
+ class RestXmlSerializer extends RestSerializer
11
+ {
12
+ /** @var XmlBody */
13
+ private $xmlBody;
14
+
15
+ /**
16
+ * @param Service $api Service API description
17
+ * @param string $endpoint Endpoint to connect to
18
+ * @param XmlBody $xmlBody Optional XML formatter to use
19
+ */
20
+ public function __construct(
21
+ Service $api,
22
+ $endpoint,
23
+ XmlBody $xmlBody = null
24
+ ) {
25
+ parent::__construct($api, $endpoint);
26
+ $this->xmlBody = $xmlBody ?: new XmlBody($api);
27
+ }
28
+
29
+ protected function payload(StructureShape $member, array $value, array &$opts)
30
+ {
31
+ $opts['headers']['Content-Type'] = 'application/xml';
32
+ $opts['body'] = (string) $this->xmlBody->build($member, $value);
33
+ }
34
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Serializer/XmlBody.php ADDED
@@ -0,0 +1,217 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Api\Serializer;
3
+
4
+ use Aws\Api\MapShape;
5
+ use Aws\Api\Service;
6
+ use Aws\Api\Shape;
7
+ use Aws\Api\StructureShape;
8
+ use Aws\Api\ListShape;
9
+ use Aws\Api\TimestampShape;
10
+ use XMLWriter;
11
+
12
+ /**
13
+ * @internal Formats the XML body of a REST-XML services.
14
+ */
15
+ class XmlBody
16
+ {
17
+ /** @var \Aws\Api\Service */
18
+ private $api;
19
+
20
+ /**
21
+ * @param Service $api API being used to create the XML body.
22
+ */
23
+ public function __construct(Service $api)
24
+ {
25
+ $this->api = $api;
26
+ }
27
+
28
+ /**
29
+ * Builds the XML body based on an array of arguments.
30
+ *
31
+ * @param Shape $shape Operation being constructed
32
+ * @param array $args Associative array of arguments
33
+ *
34
+ * @return string
35
+ */
36
+ public function build(Shape $shape, array $args)
37
+ {
38
+ $xml = new XMLWriter();
39
+ $xml->openMemory();
40
+ $xml->startDocument('1.0', 'UTF-8');
41
+ $this->format($shape, $shape['locationName'], $args, $xml);
42
+ $xml->endDocument();
43
+
44
+ return $xml->outputMemory();
45
+ }
46
+
47
+ private function startElement(Shape $shape, $name, XMLWriter $xml)
48
+ {
49
+ $xml->startElement($name);
50
+
51
+ if ($ns = $shape['xmlNamespace']) {
52
+ $xml->writeAttribute(
53
+ isset($ns['prefix']) ? "xmlns:{$ns['prefix']}" : 'xmlns',
54
+ $shape['xmlNamespace']['uri']
55
+ );
56
+ }
57
+ }
58
+
59
+ private function format(Shape $shape, $name, $value, XMLWriter $xml)
60
+ {
61
+ // Any method mentioned here has a custom serialization handler.
62
+ static $methods = [
63
+ 'add_structure' => true,
64
+ 'add_list' => true,
65
+ 'add_blob' => true,
66
+ 'add_timestamp' => true,
67
+ 'add_boolean' => true,
68
+ 'add_map' => true,
69
+ 'add_string' => true
70
+ ];
71
+
72
+ $type = 'add_' . $shape['type'];
73
+ if (isset($methods[$type])) {
74
+ $this->{$type}($shape, $name, $value, $xml);
75
+ } else {
76
+ $this->defaultShape($shape, $name, $value, $xml);
77
+ }
78
+ }
79
+
80
+ private function defaultShape(Shape $shape, $name, $value, XMLWriter $xml)
81
+ {
82
+ $this->startElement($shape, $name, $xml);
83
+ $xml->writeRaw($value);
84
+ $xml->endElement();
85
+ }
86
+
87
+ private function add_structure(
88
+ StructureShape $shape,
89
+ $name,
90
+ array $value,
91
+ \XMLWriter $xml
92
+ ) {
93
+ $this->startElement($shape, $name, $xml);
94
+
95
+ foreach ($this->getStructureMembers($shape, $value) as $k => $definition) {
96
+ $this->format(
97
+ $definition['member'],
98
+ $definition['member']['locationName'] ?: $k,
99
+ $definition['value'],
100
+ $xml
101
+ );
102
+ }
103
+
104
+ $xml->endElement();
105
+ }
106
+
107
+ private function getStructureMembers(StructureShape $shape, array $value)
108
+ {
109
+ $members = [];
110
+
111
+ foreach ($value as $k => $v) {
112
+ if ($v !== null && $shape->hasMember($k)) {
113
+ $definition = [
114
+ 'member' => $shape->getMember($k),
115
+ 'value' => $v,
116
+ ];
117
+
118
+ if ($definition['member']['xmlAttribute']) {
119
+ // array_unshift_associative
120
+ $members = [$k => $definition] + $members;
121
+ } else {
122
+ $members[$k] = $definition;
123
+ }
124
+ }
125
+ }
126
+
127
+ return $members;
128
+ }
129
+
130
+ private function add_list(
131
+ ListShape $shape,
132
+ $name,
133
+ array $value,
134
+ XMLWriter $xml
135
+ ) {
136
+ $items = $shape->getMember();
137
+
138
+ if ($shape['flattened']) {
139
+ $elementName = $name;
140
+ } else {
141
+ $this->startElement($shape, $name, $xml);
142
+ $elementName = $items['locationName'] ?: 'member';
143
+ }
144
+
145
+ foreach ($value as &$v) {
146
+ $this->format($items, $elementName, $v, $xml);
147
+ }
148
+
149
+ if (!$shape['flattened']) {
150
+ $xml->endElement();
151
+ }
152
+ }
153
+
154
+ private function add_map(
155
+ MapShape $shape,
156
+ $name,
157
+ array $value,
158
+ XMLWriter $xml
159
+ ) {
160
+ $xmlEntry = $shape['flattened'] ? $shape['locationName'] : 'entry';
161
+ $xmlKey = $shape->getKey()['locationName'] ?: 'key';
162
+ $xmlValue = $shape->getValue()['locationName'] ?: 'value';
163
+
164
+ $this->startElement($shape, $name, $xml);
165
+
166
+ foreach ($value as $key => $v) {
167
+ $this->startElement($shape, $xmlEntry, $xml);
168
+ $this->format($shape->getKey(), $xmlKey, $key, $xml);
169
+ $this->format($shape->getValue(), $xmlValue, $v, $xml);
170
+ $xml->endElement();
171
+ }
172
+
173
+ $xml->endElement();
174
+ }
175
+
176
+ private function add_blob(Shape $shape, $name, $value, XMLWriter $xml)
177
+ {
178
+ $this->startElement($shape, $name, $xml);
179
+ $xml->writeRaw(base64_encode($value));
180
+ $xml->endElement();
181
+ }
182
+
183
+ private function add_timestamp(
184
+ TimestampShape $shape,
185
+ $name,
186
+ $value,
187
+ XMLWriter $xml
188
+ ) {
189
+ $this->startElement($shape, $name, $xml);
190
+ $xml->writeRaw(TimestampShape::format($value, 'iso8601'));
191
+ $xml->endElement();
192
+ }
193
+
194
+ private function add_boolean(
195
+ Shape $shape,
196
+ $name,
197
+ $value,
198
+ XMLWriter $xml
199
+ ) {
200
+ $this->startElement($shape, $name, $xml);
201
+ $xml->writeRaw($value ? 'true' : 'false');
202
+ $xml->endElement();
203
+ }
204
+
205
+ private function add_string(
206
+ Shape $shape,
207
+ $name,
208
+ $value,
209
+ XMLWriter $xml
210
+ ) {
211
+ if ($shape['xmlAttribute']) {
212
+ $xml->writeAttribute($shape['locationName'] ?: $name, $value);
213
+ } else {
214
+ $this->defaultShape($shape, $name, $value, $xml);
215
+ }
216
+ }
217
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Service.php ADDED
@@ -0,0 +1,404 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Api;
3
+
4
+ use Aws\Api\Serializer\QuerySerializer;
5
+ use Aws\Api\Serializer\Ec2ParamBuilder;
6
+ use Aws\Api\Parser\QueryParser;
7
+
8
+ /**
9
+ * Represents a web service API model.
10
+ */
11
+ class Service extends AbstractModel
12
+ {
13
+ /** @var callable */
14
+ private $apiProvider;
15
+
16
+ /** @var string */
17
+ private $serviceName;
18
+
19
+ /** @var string */
20
+ private $apiVersion;
21
+
22
+ /** @var Operation[] */
23
+ private $operations = [];
24
+
25
+ /** @var array */
26
+ private $paginators = null;
27
+
28
+ /** @var array */
29
+ private $waiters = null;
30
+
31
+ /**
32
+ * @param array $definition
33
+ * @param callable $provider
34
+ *
35
+ * @internal param array $definition Service description
36
+ */
37
+ public function __construct(array $definition, callable $provider)
38
+ {
39
+ static $defaults = [
40
+ 'operations' => [],
41
+ 'shapes' => [],
42
+ 'metadata' => []
43
+ ], $defaultMeta = [
44
+ 'apiVersion' => null,
45
+ 'serviceFullName' => null,
46
+ 'endpointPrefix' => null,
47
+ 'signingName' => null,
48
+ 'signatureVersion' => null,
49
+ 'protocol' => null
50
+ ];
51
+
52
+ $definition += $defaults;
53
+ $definition['metadata'] += $defaultMeta;
54
+ $this->definition = $definition;
55
+ $this->apiProvider = $provider;
56
+ parent::__construct($definition, new ShapeMap($definition['shapes']));
57
+ $this->serviceName = $this->getEndpointPrefix();
58
+ $this->apiVersion = $this->getApiVersion();
59
+ }
60
+
61
+ /**
62
+ * Creates a request serializer for the provided API object.
63
+ *
64
+ * @param Service $api API that contains a protocol.
65
+ * @param string $endpoint Endpoint to send requests to.
66
+ *
67
+ * @return callable
68
+ * @throws \UnexpectedValueException
69
+ */
70
+ public static function createSerializer(Service $api, $endpoint)
71
+ {
72
+ static $mapping = [
73
+ 'json' => 'Aws\Api\Serializer\JsonRpcSerializer',
74
+ 'query' => 'Aws\Api\Serializer\QuerySerializer',
75
+ 'rest-json' => 'Aws\Api\Serializer\RestJsonSerializer',
76
+ 'rest-xml' => 'Aws\Api\Serializer\RestXmlSerializer'
77
+ ];
78
+
79
+ $proto = $api->getProtocol();
80
+
81
+ if (isset($mapping[$proto])) {
82
+ return new $mapping[$proto]($api, $endpoint);
83
+ } elseif ($proto == 'ec2') {
84
+ return new QuerySerializer($api, $endpoint, new Ec2ParamBuilder());
85
+ }
86
+
87
+ throw new \UnexpectedValueException(
88
+ 'Unknown protocol: ' . $api->getProtocol()
89
+ );
90
+ }
91
+
92
+ /**
93
+ * Creates an error parser for the given protocol.
94
+ *
95
+ * @param string $protocol Protocol to parse (e.g., query, json, etc.)
96
+ *
97
+ * @return callable
98
+ * @throws \UnexpectedValueException
99
+ */
100
+ public static function createErrorParser($protocol)
101
+ {
102
+ static $mapping = [
103
+ 'json' => 'Aws\Api\ErrorParser\JsonRpcErrorParser',
104
+ 'query' => 'Aws\Api\ErrorParser\XmlErrorParser',
105
+ 'rest-json' => 'Aws\Api\ErrorParser\RestJsonErrorParser',
106
+ 'rest-xml' => 'Aws\Api\ErrorParser\XmlErrorParser',
107
+ 'ec2' => 'Aws\Api\ErrorParser\XmlErrorParser'
108
+ ];
109
+
110
+ if (isset($mapping[$protocol])) {
111
+ return new $mapping[$protocol]();
112
+ }
113
+
114
+ throw new \UnexpectedValueException("Unknown protocol: $protocol");
115
+ }
116
+
117
+ /**
118
+ * Applies the listeners needed to parse client models.
119
+ *
120
+ * @param Service $api API to create a parser for
121
+ * @return callable
122
+ * @throws \UnexpectedValueException
123
+ */
124
+ public static function createParser(Service $api)
125
+ {
126
+ static $mapping = [
127
+ 'json' => 'Aws\Api\Parser\JsonRpcParser',
128
+ 'query' => 'Aws\Api\Parser\QueryParser',
129
+ 'rest-json' => 'Aws\Api\Parser\RestJsonParser',
130
+ 'rest-xml' => 'Aws\Api\Parser\RestXmlParser'
131
+ ];
132
+
133
+ $proto = $api->getProtocol();
134
+ if (isset($mapping[$proto])) {
135
+ return new $mapping[$proto]($api);
136
+ } elseif ($proto == 'ec2') {
137
+ return new QueryParser($api, null, false);
138
+ }
139
+
140
+ throw new \UnexpectedValueException(
141
+ 'Unknown protocol: ' . $api->getProtocol()
142
+ );
143
+ }
144
+
145
+ /**
146
+ * Get the full name of the service
147
+ *
148
+ * @return string
149
+ */
150
+ public function getServiceFullName()
151
+ {
152
+ return $this->definition['metadata']['serviceFullName'];
153
+ }
154
+
155
+ /**
156
+ * Get the API version of the service
157
+ *
158
+ * @return string
159
+ */
160
+ public function getApiVersion()
161
+ {
162
+ return $this->definition['metadata']['apiVersion'];
163
+ }
164
+
165
+ /**
166
+ * Get the API version of the service
167
+ *
168
+ * @return string
169
+ */
170
+ public function getEndpointPrefix()
171
+ {
172
+ return $this->definition['metadata']['endpointPrefix'];
173
+ }
174
+
175
+ /**
176
+ * Get the signing name used by the service.
177
+ *
178
+ * @return string
179
+ */
180
+ public function getSigningName()
181
+ {
182
+ return $this->definition['metadata']['signingName']
183
+ ?: $this->definition['metadata']['endpointPrefix'];
184
+ }
185
+
186
+ /**
187
+ * Get the default signature version of the service.
188
+ *
189
+ * Note: this method assumes "v4" when not specified in the model.
190
+ *
191
+ * @return string
192
+ */
193
+ public function getSignatureVersion()
194
+ {
195
+ return $this->definition['metadata']['signatureVersion'] ?: 'v4';
196
+ }
197
+
198
+ /**
199
+ * Get the protocol used by the service.
200
+ *
201
+ * @return string
202
+ */
203
+ public function getProtocol()
204
+ {
205
+ return $this->definition['metadata']['protocol'];
206
+ }
207
+
208
+ /**
209
+ * Check if the description has a specific operation by name.
210
+ *
211
+ * @param string $name Operation to check by name
212
+ *
213
+ * @return bool
214
+ */
215
+ public function hasOperation($name)
216
+ {
217
+ return isset($this['operations'][$name]);
218
+ }
219
+
220
+ /**
221
+ * Get an operation by name.
222
+ *
223
+ * @param string $name Operation to retrieve by name
224
+ *
225
+ * @return Operation
226
+ * @throws \InvalidArgumentException If the operation is not found
227
+ */
228
+ public function getOperation($name)
229
+ {
230
+ if (!isset($this->operations[$name])) {
231
+ if (!isset($this->definition['operations'][$name])) {
232
+ throw new \InvalidArgumentException("Unknown operation: $name");
233
+ }
234
+ $this->operations[$name] = new Operation(
235
+ $this->definition['operations'][$name],
236
+ $this->shapeMap
237
+ );
238
+ }
239
+
240
+ return $this->operations[$name];
241
+ }
242
+
243
+ /**
244
+ * Get all of the operations of the description.
245
+ *
246
+ * @return Operation[]
247
+ */
248
+ public function getOperations()
249
+ {
250
+ $result = [];
251
+ foreach ($this->definition['operations'] as $name => $definition) {
252
+ $result[$name] = $this->getOperation($name);
253
+ }
254
+
255
+ return $result;
256
+ }
257
+
258
+ /**
259
+ * Get all of the service metadata or a specific metadata key value.
260
+ *
261
+ * @param string|null $key Key to retrieve or null to retrieve all metadata
262
+ *
263
+ * @return mixed Returns the result or null if the key is not found
264
+ */
265
+ public function getMetadata($key = null)
266
+ {
267
+ if (!$key) {
268
+ return $this['metadata'];
269
+ } elseif (isset($this->definition['metadata'][$key])) {
270
+ return $this->definition['metadata'][$key];
271
+ }
272
+
273
+ return null;
274
+ }
275
+
276
+ /**
277
+ * Gets an associative array of available paginator configurations where
278
+ * the key is the name of the paginator, and the value is the paginator
279
+ * configuration.
280
+ *
281
+ * @return array
282
+ * @unstable The configuration format of paginators may change in the future
283
+ */
284
+ public function getPaginators()
285
+ {
286
+ if (!isset($this->paginators)) {
287
+ $res = call_user_func(
288
+ $this->apiProvider,
289
+ 'paginator',
290
+ $this->serviceName,
291
+ $this->apiVersion
292
+ );
293
+ $this->paginators = isset($res['pagination'])
294
+ ? $res['pagination']
295
+ : [];
296
+ }
297
+
298
+ return $this->paginators;
299
+ }
300
+
301
+ /**
302
+ * Determines if the service has a paginator by name.
303
+ *
304
+ * @param string $name Name of the paginator.
305
+ *
306
+ * @return bool
307
+ */
308
+ public function hasPaginator($name)
309
+ {
310
+ return isset($this->getPaginators()[$name]);
311
+ }
312
+
313
+ /**
314
+ * Retrieve a paginator by name.
315
+ *
316
+ * @param string $name Paginator to retrieve by name. This argument is
317
+ * typically the operation name.
318
+ * @return array
319
+ * @throws \UnexpectedValueException if the paginator does not exist.
320
+ * @unstable The configuration format of paginators may change in the future
321
+ */
322
+ public function getPaginatorConfig($name)
323
+ {
324
+ static $defaults = [
325
+ 'input_token' => null,
326
+ 'output_token' => null,
327
+ 'limit_key' => null,
328
+ 'result_key' => null,
329
+ 'more_results' => null,
330
+ ];
331
+
332
+ if ($this->hasPaginator($name)) {
333
+ return $this->paginators[$name] + $defaults;
334
+ }
335
+
336
+ throw new \UnexpectedValueException("There is no {$name} "
337
+ . "paginator defined for the {$this->serviceName} service.");
338
+ }
339
+
340
+ /**
341
+ * Gets an associative array of available waiter configurations where the
342
+ * key is the name of the waiter, and the value is the waiter
343
+ * configuration.
344
+ *
345
+ * @return array
346
+ */
347
+ public function getWaiters()
348
+ {
349
+ if (!isset($this->waiters)) {
350
+ $res = call_user_func(
351
+ $this->apiProvider,
352
+ 'waiter',
353
+ $this->serviceName,
354
+ $this->apiVersion
355
+ );
356
+ $this->waiters = isset($res['waiters'])
357
+ ? $res['waiters']
358
+ : [];
359
+ }
360
+
361
+ return $this->waiters;
362
+ }
363
+
364
+ /**
365
+ * Determines if the service has a waiter by name.
366
+ *
367
+ * @param string $name Name of the waiter.
368
+ *
369
+ * @return bool
370
+ */
371
+ public function hasWaiter($name)
372
+ {
373
+ return isset($this->getWaiters()[$name]);
374
+ }
375
+
376
+ /**
377
+ * Get a waiter configuration by name.
378
+ *
379
+ * @param string $name Name of the waiter by name.
380
+ *
381
+ * @return array
382
+ * @throws \UnexpectedValueException if the waiter does not exist.
383
+ */
384
+ public function getWaiterConfig($name)
385
+ {
386
+ // Error if the waiter is not defined
387
+ if ($this->hasWaiter($name)) {
388
+ return $this->waiters[$name];
389
+ }
390
+
391
+ throw new \UnexpectedValueException("There is no {$name} waiter "
392
+ . "defined for the {$this->serviceName} service.");
393
+ }
394
+
395
+ /**
396
+ * Get the shape map used by the API.
397
+ *
398
+ * @return ShapeMap
399
+ */
400
+ public function getShapeMap()
401
+ {
402
+ return $this->shapeMap;
403
+ }
404
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Shape.php ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Api;
3
+
4
+ /**
5
+ * Base class representing a modeled shape.
6
+ */
7
+ class Shape extends AbstractModel
8
+ {
9
+ /**
10
+ * Get a concrete shape for the given definition.
11
+ *
12
+ * @param array $definition
13
+ * @param ShapeMap $shapeMap
14
+ *
15
+ * @return mixed
16
+ * @throws \RuntimeException if the type is invalid
17
+ */
18
+ public static function create(array $definition, ShapeMap $shapeMap)
19
+ {
20
+ static $map = [
21
+ 'structure' => 'Aws\Api\StructureShape',
22
+ 'map' => 'Aws\Api\MapShape',
23
+ 'list' => 'Aws\Api\ListShape',
24
+ 'timestamp' => 'Aws\Api\TimestampShape',
25
+ 'integer' => 'Aws\Api\Shape',
26
+ 'double' => 'Aws\Api\Shape',
27
+ 'float' => 'Aws\Api\Shape',
28
+ 'long' => 'Aws\Api\Shape',
29
+ 'string' => 'Aws\Api\Shape',
30
+ 'byte' => 'Aws\Api\Shape',
31
+ 'character' => 'Aws\Api\Shape',
32
+ 'blob' => 'Aws\Api\Shape',
33
+ 'boolean' => 'Aws\Api\Shape'
34
+ ];
35
+
36
+ if (isset($definition['shape'])) {
37
+ return $shapeMap->resolve($definition);
38
+ }
39
+
40
+ if (!isset($map[$definition['type']])) {
41
+ throw new \RuntimeException('Invalid type: '
42
+ . print_r($definition, true));
43
+ }
44
+
45
+ $type = $map[$definition['type']];
46
+
47
+ return new $type($definition, $shapeMap);
48
+ }
49
+
50
+ /**
51
+ * Get the type of the shape
52
+ *
53
+ * @return string
54
+ */
55
+ public function getType()
56
+ {
57
+ return $this->definition['type'];
58
+ }
59
+
60
+ /**
61
+ * Get the name of the shape
62
+ *
63
+ * @return string
64
+ */
65
+ public function getName()
66
+ {
67
+ return $this->definition['name'];
68
+ }
69
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Api/ShapeMap.php ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Api;
3
+
4
+ /**
5
+ * Builds shape based on shape references.
6
+ */
7
+ class ShapeMap
8
+ {
9
+ /** @var array */
10
+ private $definitions;
11
+
12
+ /** @var Shape[] */
13
+ private $simple;
14
+
15
+ /**
16
+ * @param array $shapeModels Associative array of shape definitions.
17
+ */
18
+ public function __construct(array $shapeModels)
19
+ {
20
+ $this->definitions = $shapeModels;
21
+ }
22
+
23
+ /**
24
+ * Get an array of shape names.
25
+ *
26
+ * @return array
27
+ */
28
+ public function getShapeNames()
29
+ {
30
+ return array_keys($this->definitions);
31
+ }
32
+
33
+ /**
34
+ * Resolve a shape reference
35
+ *
36
+ * @param array $shapeRef Shape reference shape
37
+ *
38
+ * @return Shape
39
+ * @throws \InvalidArgumentException
40
+ */
41
+ public function resolve(array $shapeRef)
42
+ {
43
+ $shape = $shapeRef['shape'];
44
+
45
+ if (!isset($this->definitions[$shape])) {
46
+ throw new \InvalidArgumentException('Shape not found: ' . $shape);
47
+ }
48
+
49
+ $isSimple = count($shapeRef) == 1;
50
+ if ($isSimple && isset($this->simple[$shape])) {
51
+ return $this->simple[$shape];
52
+ }
53
+
54
+ $definition = $shapeRef + $this->definitions[$shape];
55
+ $definition['name'] = $definition['shape'];
56
+ unset($definition['shape']);
57
+
58
+ $result = Shape::create($definition, $this);
59
+
60
+ if ($isSimple) {
61
+ $this->simple[$shape] = $result;
62
+ }
63
+
64
+ return $result;
65
+ }
66
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Api/StructureShape.php ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Api;
3
+
4
+ /**
5
+ * Represents a structure shape and resolve member shape references.
6
+ */
7
+ class StructureShape extends Shape
8
+ {
9
+ /**
10
+ * @var Shape[]
11
+ */
12
+ private $members;
13
+
14
+ public function __construct(array $definition, ShapeMap $shapeMap)
15
+ {
16
+ $definition['type'] = 'structure';
17
+
18
+ if (!isset($definition['members'])) {
19
+ $definition['members'] = [];
20
+ }
21
+
22
+ parent::__construct($definition, $shapeMap);
23
+ }
24
+
25
+ /**
26
+ * Gets a list of all members
27
+ *
28
+ * @return Shape[]
29
+ */
30
+ public function getMembers()
31
+ {
32
+ if (empty($this->members)) {
33
+ $this->generateMembersHash();
34
+ }
35
+
36
+ return $this->members;
37
+ }
38
+
39
+ /**
40
+ * Check if a specific member exists by name.
41
+ *
42
+ * @param string $name Name of the member to check
43
+ *
44
+ * @return bool
45
+ */
46
+ public function hasMember($name)
47
+ {
48
+ return isset($this->definition['members'][$name]);
49
+ }
50
+
51
+ /**
52
+ * Retrieve a member by name.
53
+ *
54
+ * @param string $name Name of the member to retrieve
55
+ *
56
+ * @return Shape
57
+ * @throws \InvalidArgumentException if the member is not found.
58
+ */
59
+ public function getMember($name)
60
+ {
61
+ $members = $this->getMembers();
62
+
63
+ if (!isset($members[$name])) {
64
+ throw new \InvalidArgumentException('Unknown member ' . $name);
65
+ }
66
+
67
+ return $members[$name];
68
+ }
69
+
70
+
71
+ private function generateMembersHash()
72
+ {
73
+ $this->members = [];
74
+
75
+ foreach ($this->definition['members'] as $name => $definition) {
76
+ $this->members[$name] = $this->shapeFor($definition);
77
+ }
78
+ }
79
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Api/TimestampShape.php ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Api;
3
+
4
+ /**
5
+ * Represents a timestamp shape.
6
+ */
7
+ class TimestampShape extends Shape
8
+ {
9
+ public function __construct(array $definition, ShapeMap $shapeMap)
10
+ {
11
+ $definition['type'] = 'timestamp';
12
+ parent::__construct($definition, $shapeMap);
13
+ }
14
+
15
+ /**
16
+ * Formats a timestamp value for a service.
17
+ *
18
+ * @param mixed $value Value to format
19
+ * @param string $format Format used to serialize the value
20
+ *
21
+ * @return int|string
22
+ * @throws \UnexpectedValueException if the format is unknown.
23
+ * @throws \InvalidArgumentException if the value is an unsupported type.
24
+ */
25
+ public static function format($value, $format)
26
+ {
27
+ if ($value instanceof \DateTime) {
28
+ $value = $value->getTimestamp();
29
+ } elseif (is_string($value)) {
30
+ $value = strtotime($value);
31
+ } elseif (!is_int($value)) {
32
+ throw new \InvalidArgumentException('Unable to handle the provided'
33
+ . ' timestamp type: ' . gettype($value));
34
+ }
35
+
36
+ switch ($format) {
37
+ case 'iso8601':
38
+ return gmdate('Y-m-d\TH:i:s\Z', $value);
39
+ case 'rfc822':
40
+ return gmdate('D, d M Y H:i:s \G\M\T', $value);
41
+ case 'unixTimestamp':
42
+ return $value;
43
+ default:
44
+ throw new \UnexpectedValueException('Unknown timestamp format: '
45
+ . $format);
46
+ }
47
+ }
48
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Api/Validator.php ADDED
@@ -0,0 +1,236 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Api;
3
+
4
+ use Aws;
5
+
6
+ /**
7
+ * Validates a schema against a hash of input.
8
+ */
9
+ class Validator
10
+ {
11
+ private $path = [];
12
+ private $errors = [];
13
+
14
+ /**
15
+ * Validates the given input against the schema.
16
+ *
17
+ * @param string $name Operation name
18
+ * @param Shape $shape Shape to validate
19
+ * @param array $input Input to validate
20
+ *
21
+ * @throws \InvalidArgumentException if the input is invalid.
22
+ */
23
+ public function validate($name, Shape $shape, array $input)
24
+ {
25
+ $this->dispatch($shape, $input);
26
+
27
+ if ($this->errors) {
28
+ $message = sprintf(
29
+ "Found %d error%s while validating the input provided for the "
30
+ . "%s operation:\n%s",
31
+ count($this->errors),
32
+ count($this->errors) > 1 ? 's' : '',
33
+ $name,
34
+ implode("\n", $this->errors)
35
+ );
36
+ $this->errors = [];
37
+
38
+ throw new \InvalidArgumentException($message);
39
+ }
40
+ }
41
+
42
+ private function dispatch(Shape $shape, $value)
43
+ {
44
+ static $methods = [
45
+ 'structure' => 'check_structure',
46
+ 'list' => 'check_list',
47
+ 'map' => 'check_map',
48
+ 'blob' => 'check_blob',
49
+ 'boolean' => 'check_boolean',
50
+ 'integer' => 'check_numeric',
51
+ 'float' => 'check_numeric',
52
+ 'long' => 'check_numeric',
53
+ 'string' => 'check_string',
54
+ 'byte' => 'check_string',
55
+ 'char' => 'check_string'
56
+ ];
57
+
58
+ $type = $shape->getType();
59
+ if (isset($methods[$type])) {
60
+ $this->{$methods[$type]}($shape, $value);
61
+ }
62
+ }
63
+
64
+ private function check_structure(StructureShape $shape, $value)
65
+ {
66
+ if (!$this->checkAssociativeArray($value)) {
67
+ return;
68
+ }
69
+
70
+ if ($shape['required']) {
71
+ foreach ($shape['required'] as $req) {
72
+ if (!isset($value[$req])) {
73
+ $this->path[] = $req;
74
+ $this->addError('is missing and is a required parameter');
75
+ array_pop($this->path);
76
+ }
77
+ }
78
+ }
79
+
80
+ foreach ($value as $name => $v) {
81
+ if ($shape->hasMember($name)) {
82
+ $this->path[] = $name;
83
+ $this->dispatch(
84
+ $shape->getMember($name),
85
+ isset($value[$name]) ? $value[$name] : null
86
+ );
87
+ array_pop($this->path);
88
+ }
89
+ }
90
+ }
91
+
92
+ private function check_list(ListShape $shape, $value)
93
+ {
94
+ if (!is_array($value)) {
95
+ $this->addError('must be an array. Found '
96
+ . Aws\describe_type($value));
97
+ return;
98
+ }
99
+
100
+ list($min, $max, $count) = [$shape['min'], $shape['max'], count($value)];
101
+
102
+ if ($min && $count < $min) {
103
+ $this->addError("must have at least $min members."
104
+ . " Value provided has $count.");
105
+ }
106
+
107
+ if ($max && $count > $max) {
108
+ $this->addError("must have no more than $max members."
109
+ . " Value provided has $count.");
110
+ }
111
+
112
+ $items = $shape->getMember();
113
+ foreach ($value as $index => $v) {
114
+ $this->path[] = $index;
115
+ $this->dispatch($items, $v);
116
+ array_pop($this->path);
117
+ }
118
+ }
119
+
120
+ private function check_map(MapShape $shape, $value)
121
+ {
122
+ if (!$this->checkAssociativeArray($value)) {
123
+ return;
124
+ }
125
+
126
+ $values = $shape->getValue();
127
+ foreach ($value as $key => $v) {
128
+ $this->path[] = $key;
129
+ $this->dispatch($values, $v);
130
+ array_pop($this->path);
131
+ }
132
+ }
133
+
134
+ private function check_blob(Shape $shape, $value)
135
+ {
136
+ static $valid = [
137
+ 'string' => true,
138
+ 'integer' => true,
139
+ 'double' => true,
140
+ 'resource' => true
141
+ ];
142
+
143
+ $type = gettype($value);
144
+ if (!isset($valid[$type])) {
145
+ if ($type != 'object' || !method_exists($value, '__toString')) {
146
+ $this->addError('must be an fopen resource, a '
147
+ . 'GuzzleHttp\Stream\StreamInterface object, or something '
148
+ . 'that can be cast to a string. Found '
149
+ . Aws\describe_type($value));
150
+ }
151
+ }
152
+ }
153
+
154
+ private function check_numeric(Shape $shape, $value)
155
+ {
156
+ if (!is_numeric($value)) {
157
+ $this->addError('must be numeric. Found '
158
+ . Aws\describe_type($value));
159
+ return;
160
+ }
161
+
162
+ list($min, $max) = [$shape['min'], $shape['max']];
163
+
164
+ if ($min && $value < $min) {
165
+ $this->addError("must be at least $min. Value provided is $value.");
166
+ }
167
+
168
+ if ($max && $value > $max) {
169
+ $this->addError("must be no more than $max."
170
+ . " Value provided is $value.");
171
+ }
172
+ }
173
+
174
+ private function check_boolean(Shape $shape, $value)
175
+ {
176
+ if (!is_bool($value)) {
177
+ $this->addError('must be a boolean. Found '
178
+ . Aws\describe_type($value));
179
+ }
180
+ }
181
+
182
+ private function check_string(Shape $shape, $value)
183
+ {
184
+ if (!$this->checkCanString($value)) {
185
+ $this->addError('must be a string or an object that implements '
186
+ . '__toString(). Found ' . Aws\describe_type($value));
187
+ return;
188
+ }
189
+
190
+ list($min, $max, $len) = [$shape['min'], $shape['max'], strlen($value)];
191
+
192
+ if ($min && $len < $min) {
193
+ $this->addError("must be at least $min characters long."
194
+ . " Value provided is $len characters long.");
195
+ }
196
+
197
+ if ($max && $len > $max) {
198
+ $this->addError("must be no more than $max characters long."
199
+ . " Value provided is $len characters long.");
200
+ }
201
+ }
202
+
203
+ private function checkCanString($value)
204
+ {
205
+ static $valid = [
206
+ 'string' => true,
207
+ 'integer' => true,
208
+ 'double' => true,
209
+ 'NULL' => true,
210
+ ];
211
+
212
+ $type = gettype($value);
213
+
214
+ return isset($valid[$type]) ||
215
+ ($type == 'object' && method_exists($value, '__toString'));
216
+ }
217
+
218
+ private function checkAssociativeArray($value)
219
+ {
220
+ if (!is_array($value) || isset($value[0])) {
221
+ $this->addError('must be an associative array. Found '
222
+ . Aws\describe_type($value));
223
+ return false;
224
+ }
225
+
226
+ return true;
227
+ }
228
+
229
+ private function addError($message)
230
+ {
231
+ $this->errors[] =
232
+ implode('', array_map(function ($s) { return "[{$s}]"; }, $this->path))
233
+ . ' '
234
+ . $message;
235
+ }
236
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/ApiGateway/ApiGatewayClient.php ADDED
@@ -0,0 +1,166 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\ApiGateway;
3
+
4
+ use Aws\AwsClient;
5
+ use Aws\CommandInterface;
6
+ use Psr\Http\Message\RequestInterface;
7
+
8
+ /**
9
+ * This client is used to interact with the **AWS API Gateway** service.
10
+ *
11
+ * @method \Aws\Result createApiKey(array $args = [])
12
+ * @method \GuzzleHttp\Promise\Promise createApiKeyAsync(array $args = [])
13
+ * @method \Aws\Result createBasePathMapping(array $args = [])
14
+ * @method \GuzzleHttp\Promise\Promise createBasePathMappingAsync(array $args = [])
15
+ * @method \Aws\Result createDeployment(array $args = [])
16
+ * @method \GuzzleHttp\Promise\Promise createDeploymentAsync(array $args = [])
17
+ * @method \Aws\Result createDomainName(array $args = [])
18
+ * @method \GuzzleHttp\Promise\Promise createDomainNameAsync(array $args = [])
19
+ * @method \Aws\Result createModel(array $args = [])
20
+ * @method \GuzzleHttp\Promise\Promise createModelAsync(array $args = [])
21
+ * @method \Aws\Result createResource(array $args = [])
22
+ * @method \GuzzleHttp\Promise\Promise createResourceAsync(array $args = [])
23
+ * @method \Aws\Result createRestApi(array $args = [])
24
+ * @method \GuzzleHttp\Promise\Promise createRestApiAsync(array $args = [])
25
+ * @method \Aws\Result createStage(array $args = [])
26
+ * @method \GuzzleHttp\Promise\Promise createStageAsync(array $args = [])
27
+ * @method \Aws\Result deleteApiKey(array $args = [])
28
+ * @method \GuzzleHttp\Promise\Promise deleteApiKeyAsync(array $args = [])
29
+ * @method \Aws\Result deleteBasePathMapping(array $args = [])
30
+ * @method \GuzzleHttp\Promise\Promise deleteBasePathMappingAsync(array $args = [])
31
+ * @method \Aws\Result deleteClientCertificate(array $args = [])
32
+ * @method \GuzzleHttp\Promise\Promise deleteClientCertificateAsync(array $args = [])
33
+ * @method \Aws\Result deleteDeployment(array $args = [])
34
+ * @method \GuzzleHttp\Promise\Promise deleteDeploymentAsync(array $args = [])
35
+ * @method \Aws\Result deleteDomainName(array $args = [])
36
+ * @method \GuzzleHttp\Promise\Promise deleteDomainNameAsync(array $args = [])
37
+ * @method \Aws\Result deleteIntegration(array $args = [])
38
+ * @method \GuzzleHttp\Promise\Promise deleteIntegrationAsync(array $args = [])
39
+ * @method \Aws\Result deleteIntegrationResponse(array $args = [])
40
+ * @method \GuzzleHttp\Promise\Promise deleteIntegrationResponseAsync(array $args = [])
41
+ * @method \Aws\Result deleteMethod(array $args = [])
42
+ * @method \GuzzleHttp\Promise\Promise deleteMethodAsync(array $args = [])
43
+ * @method \Aws\Result deleteMethodResponse(array $args = [])
44
+ * @method \GuzzleHttp\Promise\Promise deleteMethodResponseAsync(array $args = [])
45
+ * @method \Aws\Result deleteModel(array $args = [])
46
+ * @method \GuzzleHttp\Promise\Promise deleteModelAsync(array $args = [])
47
+ * @method \Aws\Result deleteResource(array $args = [])
48
+ * @method \GuzzleHttp\Promise\Promise deleteResourceAsync(array $args = [])
49
+ * @method \Aws\Result deleteRestApi(array $args = [])
50
+ * @method \GuzzleHttp\Promise\Promise deleteRestApiAsync(array $args = [])
51
+ * @method \Aws\Result deleteStage(array $args = [])
52
+ * @method \GuzzleHttp\Promise\Promise deleteStageAsync(array $args = [])
53
+ * @method \Aws\Result flushStageCache(array $args = [])
54
+ * @method \GuzzleHttp\Promise\Promise flushStageCacheAsync(array $args = [])
55
+ * @method \Aws\Result generateClientCertificate(array $args = [])
56
+ * @method \GuzzleHttp\Promise\Promise generateClientCertificateAsync(array $args = [])
57
+ * @method \Aws\Result getAccount(array $args = [])
58
+ * @method \GuzzleHttp\Promise\Promise getAccountAsync(array $args = [])
59
+ * @method \Aws\Result getApiKey(array $args = [])
60
+ * @method \GuzzleHttp\Promise\Promise getApiKeyAsync(array $args = [])
61
+ * @method \Aws\Result getApiKeys(array $args = [])
62
+ * @method \GuzzleHttp\Promise\Promise getApiKeysAsync(array $args = [])
63
+ * @method \Aws\Result getBasePathMapping(array $args = [])
64
+ * @method \GuzzleHttp\Promise\Promise getBasePathMappingAsync(array $args = [])
65
+ * @method \Aws\Result getBasePathMappings(array $args = [])
66
+ * @method \GuzzleHttp\Promise\Promise getBasePathMappingsAsync(array $args = [])
67
+ * @method \Aws\Result getClientCertificate(array $args = [])
68
+ * @method \GuzzleHttp\Promise\Promise getClientCertificateAsync(array $args = [])
69
+ * @method \Aws\Result getClientCertificates(array $args = [])
70
+ * @method \GuzzleHttp\Promise\Promise getClientCertificatesAsync(array $args = [])
71
+ * @method \Aws\Result getDeployment(array $args = [])
72
+ * @method \GuzzleHttp\Promise\Promise getDeploymentAsync(array $args = [])
73
+ * @method \Aws\Result getDeployments(array $args = [])
74
+ * @method \GuzzleHttp\Promise\Promise getDeploymentsAsync(array $args = [])
75
+ * @method \Aws\Result getDomainName(array $args = [])
76
+ * @method \GuzzleHttp\Promise\Promise getDomainNameAsync(array $args = [])
77
+ * @method \Aws\Result getDomainNames(array $args = [])
78
+ * @method \GuzzleHttp\Promise\Promise getDomainNamesAsync(array $args = [])
79
+ * @method \Aws\Result getIntegration(array $args = [])
80
+ * @method \GuzzleHttp\Promise\Promise getIntegrationAsync(array $args = [])
81
+ * @method \Aws\Result getIntegrationResponse(array $args = [])
82
+ * @method \GuzzleHttp\Promise\Promise getIntegrationResponseAsync(array $args = [])
83
+ * @method \Aws\Result getMethod(array $args = [])
84
+ * @method \GuzzleHttp\Promise\Promise getMethodAsync(array $args = [])
85
+ * @method \Aws\Result getMethodResponse(array $args = [])
86
+ * @method \GuzzleHttp\Promise\Promise getMethodResponseAsync(array $args = [])
87
+ * @method \Aws\Result getModel(array $args = [])
88
+ * @method \GuzzleHttp\Promise\Promise getModelAsync(array $args = [])
89
+ * @method \Aws\Result getModelTemplate(array $args = [])
90
+ * @method \GuzzleHttp\Promise\Promise getModelTemplateAsync(array $args = [])
91
+ * @method \Aws\Result getModels(array $args = [])
92
+ * @method \GuzzleHttp\Promise\Promise getModelsAsync(array $args = [])
93
+ * @method \Aws\Result getResource(array $args = [])
94
+ * @method \GuzzleHttp\Promise\Promise getResourceAsync(array $args = [])
95
+ * @method \Aws\Result getResources(array $args = [])
96
+ * @method \GuzzleHttp\Promise\Promise getResourcesAsync(array $args = [])
97
+ * @method \Aws\Result getRestApi(array $args = [])
98
+ * @method \GuzzleHttp\Promise\Promise getRestApiAsync(array $args = [])
99
+ * @method \Aws\Result getRestApis(array $args = [])
100
+ * @method \GuzzleHttp\Promise\Promise getRestApisAsync(array $args = [])
101
+ * @method \Aws\Result getSdk(array $args = [])
102
+ * @method \GuzzleHttp\Promise\Promise getSdkAsync(array $args = [])
103
+ * @method \Aws\Result getStage(array $args = [])
104
+ * @method \GuzzleHttp\Promise\Promise getStageAsync(array $args = [])
105
+ * @method \Aws\Result getStages(array $args = [])
106
+ * @method \GuzzleHttp\Promise\Promise getStagesAsync(array $args = [])
107
+ * @method \Aws\Result putIntegration(array $args = [])
108
+ * @method \GuzzleHttp\Promise\Promise putIntegrationAsync(array $args = [])
109
+ * @method \Aws\Result putIntegrationResponse(array $args = [])
110
+ * @method \GuzzleHttp\Promise\Promise putIntegrationResponseAsync(array $args = [])
111
+ * @method \Aws\Result putMethod(array $args = [])
112
+ * @method \GuzzleHttp\Promise\Promise putMethodAsync(array $args = [])
113
+ * @method \Aws\Result putMethodResponse(array $args = [])
114
+ * @method \GuzzleHttp\Promise\Promise putMethodResponseAsync(array $args = [])
115
+ * @method \Aws\Result testInvokeMethod(array $args = [])
116
+ * @method \GuzzleHttp\Promise\Promise testInvokeMethodAsync(array $args = [])
117
+ * @method \Aws\Result updateAccount(array $args = [])
118
+ * @method \GuzzleHttp\Promise\Promise updateAccountAsync(array $args = [])
119
+ * @method \Aws\Result updateApiKey(array $args = [])
120
+ * @method \GuzzleHttp\Promise\Promise updateApiKeyAsync(array $args = [])
121
+ * @method \Aws\Result updateBasePathMapping(array $args = [])
122
+ * @method \GuzzleHttp\Promise\Promise updateBasePathMappingAsync(array $args = [])
123
+ * @method \Aws\Result updateClientCertificate(array $args = [])
124
+ * @method \GuzzleHttp\Promise\Promise updateClientCertificateAsync(array $args = [])
125
+ * @method \Aws\Result updateDeployment(array $args = [])
126
+ * @method \GuzzleHttp\Promise\Promise updateDeploymentAsync(array $args = [])
127
+ * @method \Aws\Result updateDomainName(array $args = [])
128
+ * @method \GuzzleHttp\Promise\Promise updateDomainNameAsync(array $args = [])
129
+ * @method \Aws\Result updateIntegration(array $args = [])
130
+ * @method \GuzzleHttp\Promise\Promise updateIntegrationAsync(array $args = [])
131
+ * @method \Aws\Result updateIntegrationResponse(array $args = [])
132
+ * @method \GuzzleHttp\Promise\Promise updateIntegrationResponseAsync(array $args = [])
133
+ * @method \Aws\Result updateMethod(array $args = [])
134
+ * @method \GuzzleHttp\Promise\Promise updateMethodAsync(array $args = [])
135
+ * @method \Aws\Result updateMethodResponse(array $args = [])
136
+ * @method \GuzzleHttp\Promise\Promise updateMethodResponseAsync(array $args = [])
137
+ * @method \Aws\Result updateModel(array $args = [])
138
+ * @method \GuzzleHttp\Promise\Promise updateModelAsync(array $args = [])
139
+ * @method \Aws\Result updateResource(array $args = [])
140
+ * @method \GuzzleHttp\Promise\Promise updateResourceAsync(array $args = [])
141
+ * @method \Aws\Result updateRestApi(array $args = [])
142
+ * @method \GuzzleHttp\Promise\Promise updateRestApiAsync(array $args = [])
143
+ * @method \Aws\Result updateStage(array $args = [])
144
+ * @method \GuzzleHttp\Promise\Promise updateStageAsync(array $args = [])
145
+ */
146
+ class ApiGatewayClient extends AwsClient
147
+ {
148
+ public function __construct(array $args)
149
+ {
150
+ parent::__construct($args);
151
+ $stack = $this->getHandlerList();
152
+ $stack->appendBuild([__CLASS__, '_add_accept_header']);
153
+ }
154
+
155
+ public static function _add_accept_header(callable $handler)
156
+ {
157
+ return function (
158
+ CommandInterface $command,
159
+ RequestInterface $request
160
+ ) use ($handler) {
161
+ $request = $request->withHeader('Accept', 'application/json');
162
+
163
+ return $handler($command, $request);
164
+ };
165
+ }
166
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/ApiGateway/Exception/ApiGatewayException.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\ApiGateway\Exception;
3
+
4
+ use Aws\Exception\AwsException;
5
+
6
+ /**
7
+ * Represents an error interacting with the **AWS API Gateway** service.
8
+ */
9
+ class ApiGatewayException extends AwsException {}
vendor/aannnaa7/aws-sdk-php-minimized/src/AwsClient.php ADDED
@@ -0,0 +1,351 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws;
3
+
4
+ use Aws\Api\ApiProvider;
5
+ use Aws\Api\DocModel;
6
+ use Aws\Api\Service;
7
+ use Aws\Signature\SignatureProvider;
8
+ use GuzzleHttp\Psr7\Uri;
9
+
10
+ /**
11
+ * Default AWS client implementation
12
+ */
13
+ class AwsClient implements AwsClientInterface
14
+ {
15
+ /** @var string */
16
+ private $region;
17
+
18
+ /** @var string */
19
+ private $endpoint;
20
+
21
+ /** @var Service */
22
+ private $api;
23
+
24
+ /** @var callable */
25
+ private $signatureProvider;
26
+
27
+ /** @var callable */
28
+ private $credentialProvider;
29
+
30
+ /** @var HandlerList */
31
+ private $handlerList;
32
+
33
+ /** @var array*/
34
+ private $defaultRequestOptions;
35
+
36
+ /**
37
+ * Get an array of client constructor arguments used by the client.
38
+ *
39
+ * @return array
40
+ */
41
+ public static function getArguments()
42
+ {
43
+ return ClientResolver::getDefaultArguments();
44
+ }
45
+
46
+ /**
47
+ * The client constructor accepts the following options:
48
+ *
49
+ * - api_provider: (callable) An optional PHP callable that accepts a
50
+ * type, service, and version argument, and returns an array of
51
+ * corresponding configuration data. The type value can be one of api,
52
+ * waiter, or paginator.
53
+ * - credentials:
54
+ * (Aws\Credentials\CredentialsInterface|array|bool|callable) Specifies
55
+ * the credentials used to sign requests. Provide an
56
+ * Aws\Credentials\CredentialsInterface object, an associative array of
57
+ * "key", "secret", and an optional "token" key, `false` to use null
58
+ * credentials, or a callable credentials provider used to create
59
+ * credentials or return null. See Aws\Credentials\CredentialProvider for
60
+ * a list of built-in credentials providers. If no credentials are
61
+ * provided, the SDK will attempt to load them from the environment.
62
+ * - debug: (bool|array) Set to true to display debug information when
63
+ * sending requests. Alternatively, you can provide an associative array
64
+ * with the following keys: logfn: (callable) Function that is invoked
65
+ * with log messages; stream_size: (int) When the size of a stream is
66
+ * greater than this number, the stream data will not be logged (set to
67
+ * "0" to not log any stream data); scrub_auth: (bool) Set to false to
68
+ * disable the scrubbing of auth data from the logged messages; http:
69
+ * (bool) Set to false to disable the "debug" feature of lower level HTTP
70
+ * adapters (e.g., verbose curl output).
71
+ * - endpoint: (string) The full URI of the webservice. This is only
72
+ * required when connecting to a custom endpoint (e.g., a local version
73
+ * of S3).
74
+ * - endpoint_provider: (callable) An optional PHP callable that
75
+ * accepts a hash of options including a "service" and "region" key and
76
+ * returns NULL or a hash of endpoint data, of which the "endpoint" key
77
+ * is required. See Aws\Endpoint\EndpointProvider for a list of built-in
78
+ * providers.
79
+ * - handler: (callable) A handler that accepts a command object,
80
+ * request object and returns a promise that is fulfilled with an
81
+ * Aws\ResultInterface object or rejected with an
82
+ * Aws\Exception\AwsException. A handler does not accept a next handler
83
+ * as it is terminal and expected to fulfill a command. If no handler is
84
+ * provided, a default Guzzle handler will be utilized.
85
+ * - http: (array, default=array(0)) Set to an array of SDK request
86
+ * options to apply to each request (e.g., proxy, verify, etc.).
87
+ * - http_handler: (callable) An HTTP handler is a function that
88
+ * accepts a PSR-7 request object and returns a promise that is fulfilled
89
+ * with a PSR-7 response object or rejected with an array of exception
90
+ * data. NOTE: This option supersedes any provided "handler" option.
91
+ * - profile: (string) Allows you to specify which profile to use when
92
+ * credentials are created from the AWS credentials file in your HOME
93
+ * directory. This setting overrides the AWS_PROFILE environment
94
+ * variable. Note: Specifying "profile" will cause the "credentials" key
95
+ * to be ignored.
96
+ * - region: (string, required) Region to connect to. See
97
+ * http://docs.aws.amazon.com/general/latest/gr/rande.html for a list of
98
+ * available regions.
99
+ * - retries: (int, default=int(3)) Configures the maximum number of
100
+ * allowed retries for a client (pass 0 to disable retries).
101
+ * - scheme: (string, default=string(5) "https") URI scheme to use when
102
+ * connecting connect. The SDK will utilize "https" endpoints (i.e.,
103
+ * utilize SSL/TLS connections) by default. You can attempt to connect to
104
+ * a service over an unencrypted "http" endpoint by setting ``scheme`` to
105
+ * "http".
106
+ * - signature_provider: (callable) A callable that accepts a signature
107
+ * version name (e.g., "v4"), a service name, and region, and
108
+ * returns a SignatureInterface object or null. This provider is used to
109
+ * create signers utilized by the client. See
110
+ * Aws\Signature\SignatureProvider for a list of built-in providers
111
+ * - signature_version: (string) A string representing a custom
112
+ * signature version to use with a service (e.g., v4). Note that
113
+ * per/operation signature version MAY override this requested signature
114
+ * version.
115
+ * - validate: (bool, default=bool(true)) Set to false to disable
116
+ * client-side parameter validation.
117
+ * - version: (string, required) The version of the webservice to
118
+ * utilize (e.g., 2006-03-01).
119
+ *
120
+ * @param array $args Client configuration arguments.
121
+ *
122
+ * @throws \InvalidArgumentException if any required options are missing or
123
+ * the service is not supported.
124
+ */
125
+ public function __construct(array $args)
126
+ {
127
+ list($service, $exceptionClass) = $this->parseClass();
128
+ if (!isset($args['service'])) {
129
+ $args['service'] = manifest($service)['endpoint'];
130
+ }
131
+ if (!isset($args['exception_class'])) {
132
+ $args['exception_class'] = $exceptionClass;
133
+ }
134
+
135
+ $this->handlerList = new HandlerList();
136
+ $resolver = new ClientResolver(static::getArguments());
137
+ $config = $resolver->resolve($args, $this->handlerList);
138
+ $this->api = $config['api'];
139
+ $this->signatureProvider = $config['signature_provider'];
140
+ $this->endpoint = new Uri($config['endpoint']);
141
+ $this->credentialProvider = $config['credentials'];
142
+ $this->region = isset($config['region']) ? $config['region'] : null;
143
+ $this->config = $config['config'];
144
+ $this->defaultRequestOptions = $config['http'];
145
+ $this->addSignatureMiddleware();
146
+
147
+ if (isset($args['with_resolved'])) {
148
+ $args['with_resolved']($config);
149
+ }
150
+ }
151
+
152
+ public function getHandlerList()
153
+ {
154
+ return $this->handlerList;
155
+ }
156
+
157
+ public function __call($name, array $args)
158
+ {
159
+ $params = isset($args[0]) ? $args[0] : [];
160
+
161
+ if (substr($name, -5) === 'Async') {
162
+ return $this->executeAsync(
163
+ $this->getCommand(substr($name, 0, -5), $params)
164
+ );
165
+ }
166
+
167
+ return $this->execute($this->getCommand($name, $params));
168
+ }
169
+
170
+ public function getConfig($option = null)
171
+ {
172
+ return $option === null
173
+ ? $this->config
174
+ : (isset($this->config[$option])
175
+ ? $this->config[$option]
176
+ : null);
177
+ }
178
+
179
+ public function getCredentials()
180
+ {
181
+ $fn = $this->credentialProvider;
182
+ return $fn();
183
+ }
184
+
185
+ public function getEndpoint()
186
+ {
187
+ return $this->endpoint;
188
+ }
189
+
190
+ public function getRegion()
191
+ {
192
+ return $this->region;
193
+ }
194
+
195
+ public function getApi()
196
+ {
197
+ return $this->api;
198
+ }
199
+
200
+ public function execute(CommandInterface $command)
201
+ {
202
+ return $this->executeAsync($command)->wait();
203
+ }
204
+
205
+ public function executeAsync(CommandInterface $command)
206
+ {
207
+ $handler = $command->getHandlerList()->resolve();
208
+ return $handler($command);
209
+ }
210
+
211
+ public function getCommand($name, array $args = [])
212
+ {
213
+ // Fail fast if the command cannot be found in the description.
214
+ if (!isset($this->api['operations'][$name])) {
215
+ $name = ucfirst($name);
216
+ if (!isset($this->api['operations'][$name])) {
217
+ throw new \InvalidArgumentException("Operation not found: $name");
218
+ }
219
+ }
220
+
221
+ if (!isset($args['@http'])) {
222
+ $args['@http'] = $this->defaultRequestOptions;
223
+ } else {
224
+ $args['@http'] += $this->defaultRequestOptions;
225
+ }
226
+
227
+ return new Command($name, $args, clone $this->getHandlerList());
228
+ }
229
+
230
+ public function getIterator($name, array $args = [])
231
+ {
232
+ $config = $this->api->getPaginatorConfig($name);
233
+ if (!$config['result_key']) {
234
+ throw new \UnexpectedValueException(sprintf(
235
+ 'There are no resources to iterate for the %s operation of %s',
236
+ $name, $this->api['serviceFullName']
237
+ ));
238
+ }
239
+
240
+ $key = is_array($config['result_key'])
241
+ ? $config['result_key'][0]
242
+ : $config['result_key'];
243
+
244
+ if ($config['output_token'] && $config['input_token']) {
245
+ return $this->getPaginator($name, $args)->search($key);
246
+ }
247
+
248
+ $result = $this->execute($this->getCommand($name, $args))->search($key);
249
+
250
+ return new \ArrayIterator((array) $result);
251
+ }
252
+
253
+ public function getPaginator($name, array $args = [])
254
+ {
255
+ $config = $this->api->getPaginatorConfig($name);
256
+
257
+ return new ResultPaginator($this, $name, $args, $config);
258
+ }
259
+
260
+ public function waitUntil($name, array $args = [])
261
+ {
262
+ return $this->getWaiter($name, $args)->promise()->wait();
263
+ }
264
+
265
+ public function getWaiter($name, array $args = [])
266
+ {
267
+ $config = isset($args['@waiter']) ? $args['@waiter'] : [];
268
+ $config += $this->api->getWaiterConfig($name);
269
+
270
+ return new Waiter($this, $name, $args, $config);
271
+ }
272
+
273
+ /**
274
+ * Get the signature_provider function of the client.
275
+ *
276
+ * @return callable
277
+ */
278
+ final protected function getSignatureProvider()
279
+ {
280
+ return $this->signatureProvider;
281
+ }
282
+
283
+ /**
284
+ * Parse the class name and setup the custom exception class of the client
285
+ * and return the "service" name of the client and "exception_class".
286
+ *
287
+ * @return array
288
+ */
289
+ private function parseClass()
290
+ {
291
+ $klass = get_class($this);
292
+
293
+ if ($klass === __CLASS__) {
294
+ return ['', 'Aws\Exception\AwsException'];
295
+ }
296
+
297
+ $service = substr($klass, strrpos($klass, '\\') + 1, -6);
298
+
299
+ return [
300
+ strtolower($service),
301
+ "Aws\\{$service}\\Exception\\{$service}Exception"
302
+ ];
303
+ }
304
+
305
+ private function addSignatureMiddleware()
306
+ {
307
+ // Sign requests. This may need to be modified later to support
308
+ // variable signatures per/operation.
309
+ $this->handlerList->appendSign(
310
+ Middleware::signer(
311
+ $this->credentialProvider,
312
+ constantly(SignatureProvider::resolve(
313
+ $this->signatureProvider,
314
+ $this->config['signature_version'],
315
+ $this->api->getSigningName(),
316
+ $this->region
317
+ ))
318
+ ),
319
+ 'signer'
320
+ );
321
+ }
322
+
323
+ /**
324
+ * Returns a service model and doc model with any necessary changes
325
+ * applied.
326
+ *
327
+ * @param array $api Array of service data being documented.
328
+ * @param array $docs Array of doc model data.
329
+ *
330
+ * @return array Tuple containing a [Service, DocModel]
331
+ *
332
+ * @internal This should only used to document the service API.
333
+ * @codeCoverageIgnore
334
+ */
335
+ public static function applyDocFilters(array $api, array $docs)
336
+ {
337
+ return [
338
+ new Service($api, ApiProvider::defaultProvider()),
339
+ new DocModel($docs)
340
+ ];
341
+ }
342
+
343
+ /**
344
+ * @deprecated
345
+ * @return static
346
+ */
347
+ public static function factory(array $config = [])
348
+ {
349
+ return new static($config);
350
+ }
351
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/AwsClientInterface.php ADDED
@@ -0,0 +1,169 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws;
3
+
4
+ use Psr\Http\Message\UriInterface;
5
+ use GuzzleHttp\Promise\PromiseInterface;
6
+
7
+ /**
8
+ * Represents an AWS client.
9
+ */
10
+ interface AwsClientInterface
11
+ {
12
+ /**
13
+ * Creates and executes a command for an operation by name.
14
+ *
15
+ * Suffixing an operation name with "Async" will return a
16
+ * promise that can be used to execute commands asynchronously.
17
+ *
18
+ * @param string $name Name of the command to execute.
19
+ * @param array $arguments Arguments to pass to the getCommand method.
20
+ *
21
+ * @return ResultInterface
22
+ * @throws \Exception
23
+ */
24
+ public function __call($name, array $arguments);
25
+
26
+ /**
27
+ * Create a command for an operation name.
28
+ *
29
+ * Special keys may be set on the command to control how it behaves,
30
+ * including:
31
+ *
32
+ * - @http: Associative array of transfer specific options to apply to the
33
+ * request that is serialized for this command. Available keys include
34
+ * "proxy", "verify", "timeout", "connect_timeout", "debug", "delay", and
35
+ * "headers".
36
+ *
37
+ * @param string $name Name of the operation to use in the command
38
+ * @param array $args Arguments to pass to the command
39
+ *
40
+ * @return CommandInterface
41
+ * @throws \InvalidArgumentException if no command can be found by name
42
+ */
43
+ public function getCommand($name, array $args = []);
44
+
45
+ /**
46
+ * Execute a single command.
47
+ *
48
+ * @param CommandInterface $command Command to execute
49
+ *
50
+ * @return ResultInterface
51
+ * @throws \Exception
52
+ */
53
+ public function execute(CommandInterface $command);
54
+
55
+ /**
56
+ * Execute a command asynchronously.
57
+ *
58
+ * @param CommandInterface $command Command to execute
59
+ *
60
+ * @return \GuzzleHttp\Promise\PromiseInterface
61
+ */
62
+ public function executeAsync(CommandInterface $command);
63
+
64
+ /**
65
+ * Returns a promise that is fulfilled with an
66
+ * {@see \Aws\Credentials\CredentialsInterface} object.
67
+ *
68
+ * If you need the credentials synchronously, then call the wait() method
69
+ * on the returned promise.
70
+ *
71
+ * @return PromiseInterface
72
+ */
73
+ public function getCredentials();
74
+
75
+ /**
76
+ * Get the region to which the client is configured to send requests.
77
+ *
78
+ * @return string
79
+ */
80
+ public function getRegion();
81
+
82
+ /**
83
+ * Gets the default endpoint, or base URL, used by the client.
84
+ *
85
+ * @return UriInterface
86
+ */
87
+ public function getEndpoint();
88
+
89
+ /**
90
+ * Get the service description associated with the client.
91
+ *
92
+ * @return \Aws\Api\Service
93
+ */
94
+ public function getApi();
95
+
96
+ /**
97
+ * Get a client configuration value.
98
+ *
99
+ * @param string|null $option The option to retrieve. Pass null to retrieve
100
+ * all options.
101
+ * @return mixed|null
102
+ */
103
+ public function getConfig($option = null);
104
+
105
+ /**
106
+ * Get the handler list used to transfer commands.
107
+ *
108
+ * This list can be modified to add middleware or to change the underlying
109
+ * handler used to send HTTP requests.
110
+ *
111
+ * @return HandlerList
112
+ */
113
+ public function getHandlerList();
114
+
115
+ /**
116
+ * Get a resource iterator for the specified operation.
117
+ *
118
+ * @param string $name Name of the iterator to retrieve.
119
+ * @param array $args Command arguments to use with each command.
120
+ *
121
+ * @return \Iterator
122
+ * @throws \UnexpectedValueException if the iterator config is invalid.
123
+ */
124
+ public function getIterator($name, array $args = []);
125
+
126
+ /**
127
+ * Get a result paginator for the specified operation.
128
+ *
129
+ * @param string $name Name of the operation used for iterator
130
+ * @param array $args Command args to be used with each command
131
+ *
132
+ * @return \Aws\ResultPaginator
133
+ * @throws \UnexpectedValueException if the iterator config is invalid.
134
+ */
135
+ public function getPaginator($name, array $args = []);
136
+
137
+ /**
138
+ * Wait until a resource is in a particular state.
139
+ *
140
+ * @param string|callable $name Name of the waiter that defines the wait
141
+ * configuration and conditions.
142
+ * @param array $args Args to be used with each command executed
143
+ * by the waiter. Waiter configuration options
144
+ * can be provided in an associative array in
145
+ * the @waiter key.
146
+ * @return void
147
+ * @throws \UnexpectedValueException if the waiter is invalid.
148
+ */
149
+ public function waitUntil($name, array $args = []);
150
+
151
+ /**
152
+ * Get a waiter that waits until a resource is in a particular state.
153
+ *
154
+ * Retrieving a waiter can be useful when you wish to wait asynchronously:
155
+ *
156
+ * $waiter = $client->getWaiter('foo', ['bar' => 'baz']);
157
+ * $waiter->promise()->then(function () { echo 'Done!'; });
158
+ *
159
+ * @param string|callable $name Name of the waiter that defines the wait
160
+ * configuration and conditions.
161
+ * @param array $args Args to be used with each command executed
162
+ * by the waiter. Waiter configuration options
163
+ * can be provided in an associative array in
164
+ * the @waiter key.
165
+ * @return \Aws\Waiter
166
+ * @throws \UnexpectedValueException if the waiter is invalid.
167
+ */
168
+ public function getWaiter($name, array $args = []);
169
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/CacheInterface.php ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws;
3
+
4
+ /**
5
+ * Represents a simple cache interface.
6
+ */
7
+ interface CacheInterface
8
+ {
9
+ /**
10
+ * Get a cache item by key.
11
+ *
12
+ * @param string $key Key to retrieve.
13
+ *
14
+ * @return mixed|null Returns the value or null if not found.
15
+ */
16
+ public function get($key);
17
+
18
+ /**
19
+ * Set a cache key value.
20
+ *
21
+ * @param string $key Key to set
22
+ * @param mixed $value Value to set.
23
+ * @param int $ttl Number of seconds the item is allowed to live. Set
24
+ * to 0 to allow an unlimited lifetime.
25
+ */
26
+ public function set($key, $value, $ttl = 0);
27
+
28
+ /**
29
+ * Remove a cache key.
30
+ *
31
+ * @param string $key Key to remove.
32
+ */
33
+ public function remove($key);
34
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/ClientResolver.php ADDED
@@ -0,0 +1,548 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws;
3
+
4
+ use Aws\Api\Validator;
5
+ use Aws\Api\ApiProvider;
6
+ use Aws\Api\Service;
7
+ use Aws\Credentials\Credentials;
8
+ use Aws\Credentials\CredentialsInterface;
9
+ use Aws\Signature\SignatureProvider;
10
+ use Aws\Endpoint\EndpointProvider;
11
+ use Aws\Credentials\CredentialProvider;
12
+ use GuzzleHttp\Promise;
13
+ use InvalidArgumentException as IAE;
14
+ use Psr\Http\Message\RequestInterface;
15
+
16
+ /**
17
+ * @internal Resolves a hash of client arguments to construct a client.
18
+ */
19
+ class ClientResolver
20
+ {
21
+ /** @var array */
22
+ private $argDefinitions;
23
+
24
+ /** @var array Map of types to a corresponding function */
25
+ private static $typeMap = [
26
+ 'resource' => 'is_resource',
27
+ 'callable' => 'is_callable',
28
+ 'int' => 'is_int',
29
+ 'bool' => 'is_bool',
30
+ 'string' => 'is_string',
31
+ 'object' => 'is_object',
32
+ 'array' => 'is_array',
33
+ ];
34
+
35
+ private static $defaultArgs = [
36
+ 'service' => [
37
+ 'type' => 'value',
38
+ 'valid' => ['string'],
39
+ 'doc' => 'Name of the service to utilize. This value will be supplied by default when using one of the SDK clients (e.g., Aws\\S3\\S3Client).',
40
+ 'required' => true,
41
+ 'internal' => true
42
+ ],
43
+ 'exception_class' => [
44
+ 'type' => 'value',
45
+ 'valid' => ['string'],
46
+ 'doc' => 'Exception class to create when an error occurs.',
47
+ 'default' => 'Aws\Exception\AwsException',
48
+ 'internal' => true
49
+ ],
50
+ 'scheme' => [
51
+ 'type' => 'value',
52
+ 'valid' => ['string'],
53
+ 'default' => 'https',
54
+ 'doc' => 'URI scheme to use when connecting connect. The SDK will utilize "https" endpoints (i.e., utilize SSL/TLS connections) by default. You can attempt to connect to a service over an unencrypted "http" endpoint by setting ``scheme`` to "http".',
55
+ ],
56
+ 'endpoint' => [
57
+ 'type' => 'value',
58
+ 'valid' => ['string'],
59
+ 'doc' => 'The full URI of the webservice. This is only required when connecting to a custom endpoint (e.g., a local version of S3).',
60
+ 'fn' => [__CLASS__, '_apply_endpoint'],
61
+ ],
62
+ 'region' => [
63
+ 'type' => 'value',
64
+ 'valid' => ['string'],
65
+ 'required' => [__CLASS__, '_missing_region'],
66
+ 'doc' => 'Region to connect to. See http://docs.aws.amazon.com/general/latest/gr/rande.html for a list of available regions.',
67
+ ],
68
+ 'version' => [
69
+ 'type' => 'value',
70
+ 'valid' => ['string'],
71
+ 'required' => [__CLASS__, '_missing_version'],
72
+ 'doc' => 'The version of the webservice to utilize (e.g., 2006-03-01).',
73
+ ],
74
+ 'signature_provider' => [
75
+ 'type' => 'value',
76
+ 'valid' => ['callable'],
77
+ 'doc' => 'A callable that accepts a signature version name (e.g., "v4"), a service name, and region, and returns a SignatureInterface object or null. This provider is used to create signers utilized by the client. See Aws\\Signature\\SignatureProvider for a list of built-in providers',
78
+ 'default' => [__CLASS__, '_default_signature_provider'],
79
+ ],
80
+ 'endpoint_provider' => [
81
+ 'type' => 'value',
82
+ 'valid' => ['callable'],
83
+ 'fn' => [__CLASS__, '_apply_endpoint_provider'],
84
+ 'doc' => 'An optional PHP callable that accepts a hash of options including a "service" and "region" key and returns NULL or a hash of endpoint data, of which the "endpoint" key is required. See Aws\\Endpoint\\EndpointProvider for a list of built-in providers.',
85
+ 'default' => [__CLASS__, '_default_endpoint_provider'],
86
+ ],
87
+ 'api_provider' => [
88
+ 'type' => 'value',
89
+ 'valid' => ['callable'],
90
+ 'doc' => 'An optional PHP callable that accepts a type, service, and version argument, and returns an array of corresponding configuration data. The type value can be one of api, waiter, or paginator.',
91
+ 'fn' => [__CLASS__, '_apply_api_provider'],
92
+ 'default' => [ApiProvider::class, 'defaultProvider'],
93
+ ],
94
+ 'signature_version' => [
95
+ 'type' => 'config',
96
+ 'valid' => ['string'],
97
+ 'doc' => 'A string representing a custom signature version to use with a service (e.g., v4). Note that per/operation signature version MAY override this requested signature version.',
98
+ 'default' => [__CLASS__, '_default_signature_version'],
99
+ ],
100
+ 'profile' => [
101
+ 'type' => 'config',
102
+ 'valid' => ['string'],
103
+ 'doc' => 'Allows you to specify which profile to use when credentials are created from the AWS credentials file in your HOME directory. This setting overrides the AWS_PROFILE environment variable. Note: Specifying "profile" will cause the "credentials" key to be ignored.',
104
+ 'fn' => [__CLASS__, '_apply_profile'],
105
+ ],
106
+ 'credentials' => [
107
+ 'type' => 'value',
108
+ 'valid' => [CredentialsInterface::class, CacheInterface::class, 'array', 'bool', 'callable'],
109
+ 'doc' => 'Specifies the credentials used to sign requests. Provide an Aws\Credentials\CredentialsInterface object, an associative array of "key", "secret", and an optional "token" key, `false` to use null credentials, or a callable credentials provider used to create credentials or return null. See Aws\\Credentials\\CredentialProvider for a list of built-in credentials providers. If no credentials are provided, the SDK will attempt to load them from the environment.',
110
+ 'fn' => [__CLASS__, '_apply_credentials'],
111
+ 'default' => [CredentialProvider::class, 'defaultProvider'],
112
+ ],
113
+ 'retries' => [
114
+ 'type' => 'value',
115
+ 'valid' => ['int'],
116
+ 'doc' => 'Configures the maximum number of allowed retries for a client (pass 0 to disable retries). ',
117
+ 'fn' => [__CLASS__, '_apply_retries'],
118
+ 'default' => 3,
119
+ ],
120
+ 'validate' => [
121
+ 'type' => 'value',
122
+ 'valid' => ['bool'],
123
+ 'default' => true,
124
+ 'doc' => 'Set to false to disable client-side parameter validation.',
125
+ 'fn' => [__CLASS__, '_apply_validate'],
126
+ ],
127
+ 'debug' => [
128
+ 'type' => 'value',
129
+ 'valid' => ['bool', 'array'],
130
+ 'doc' => 'Set to true to display debug information when sending requests. Alternatively, you can provide an associative array with the following keys: logfn: (callable) Function that is invoked with log messages; stream_size: (int) When the size of a stream is greater than this number, the stream data will not be logged (set to "0" to not log any stream data); scrub_auth: (bool) Set to false to disable the scrubbing of auth data from the logged messages; http: (bool) Set to false to disable the "debug" feature of lower level HTTP adapters (e.g., verbose curl output).',
131
+ 'fn' => [__CLASS__, '_apply_debug'],
132
+ ],
133
+ 'http' => [
134
+ 'type' => 'value',
135
+ 'valid' => ['array'],
136
+ 'default' => [],
137
+ 'doc' => 'Set to an array of SDK request options to apply to each request (e.g., proxy, verify, etc.).',
138
+ ],
139
+ 'http_handler' => [
140
+ 'type' => 'value',
141
+ 'valid' => ['callable'],
142
+ 'doc' => 'An HTTP handler is a function that accepts a PSR-7 request object and returns a promise that is fulfilled with a PSR-7 response object or rejected with an array of exception data. NOTE: This option supersedes any provided "handler" option.',
143
+ 'fn' => [__CLASS__, '_apply_http_handler']
144
+ ],
145
+ 'handler' => [
146
+ 'type' => 'value',
147
+ 'valid' => ['callable'],
148
+ 'doc' => 'A handler that accepts a command object, request object and returns a promise that is fulfilled with an Aws\ResultInterface object or rejected with an Aws\Exception\AwsException. A handler does not accept a next handler as it is terminal and expected to fulfill a command. If no handler is provided, a default Guzzle handler will be utilized.',
149
+ 'fn' => [__CLASS__, '_apply_handler'],
150
+ 'default' => [__CLASS__, '_default_handler']
151
+ ],
152
+ 'ua_append' => [
153
+ 'type' => 'value',
154
+ 'valid' => ['string', 'array'],
155
+ 'doc' => 'Provide a string or array of strings to send in the User-Agent header.',
156
+ 'fn' => [__CLASS__, '_apply_user_agent'],
157
+ 'default' => [],
158
+ ],
159
+ ];
160
+
161
+ /**
162
+ * Gets an array of default client arguments, each argument containing a
163
+ * hash of the following:
164
+ *
165
+ * - type: (string, required) option type described as follows:
166
+ * - value: The default option type.
167
+ * - config: The provided value is made available in the client's
168
+ * getConfig() method.
169
+ * - valid: (array, required) Valid PHP types or class names. Note: null
170
+ * is not an allowed type.
171
+ * - required: (bool, callable) Whether or not the argument is required.
172
+ * Provide a function that accepts an array of arguments and returns a
173
+ * string to provide a custom error message.
174
+ * - default: (mixed) The default value of the argument if not provided. If
175
+ * a function is provided, then it will be invoked to provide a default
176
+ * value. The function is provided the array of options and is expected
177
+ * to return the default value of the option.
178
+ * - doc: (string) The argument documentation string.
179
+ * - fn: (callable) Function used to apply the argument. The function
180
+ * accepts the provided value, array of arguments by reference, and an
181
+ * event emitter.
182
+ *
183
+ * Note: Order is honored and important when applying arguments.
184
+ *
185
+ * @return array
186
+ */
187
+ public static function getDefaultArguments()
188
+ {
189
+ return self::$defaultArgs;
190
+ }
191
+
192
+ /**
193
+ * @param array $argDefinitions Client arguments.
194
+ */
195
+ public function __construct(array $argDefinitions)
196
+ {
197
+ $this->argDefinitions = $argDefinitions;
198
+ }
199
+
200
+ /**
201
+ * Resolves client configuration options and attached event listeners.
202
+ *
203
+ * @param array $args Provided constructor arguments.
204
+ * @param HandlerList $list Handler list to augment.
205
+ *
206
+ * @return array Returns the array of provided options.
207
+ * @throws \InvalidArgumentException
208
+ * @see Aws\AwsClient::__construct for a list of available options.
209
+ */
210
+ public function resolve(array $args, HandlerList $list)
211
+ {
212
+ $args['config'] = [];
213
+ foreach ($this->argDefinitions as $key => $a) {
214
+ // Add defaults, validate required values, and skip if not set.
215
+ if (!isset($args[$key])) {
216
+ if (isset($a['default'])) {
217
+ // Merge defaults in when not present.
218
+ $args[$key] = is_callable($a['default'])
219
+ ? $a['default']($args)
220
+ : $a['default'];
221
+ } elseif (empty($a['required'])) {
222
+ continue;
223
+ } else {
224
+ $this->throwRequired($args);
225
+ }
226
+ }
227
+
228
+ // Validate the types against the provided value.
229
+ foreach ($a['valid'] as $check) {
230
+ if (isset(self::$typeMap[$check])) {
231
+ $fn = self::$typeMap[$check];
232
+ if ($fn($args[$key])) {
233
+ goto is_valid;
234
+ }
235
+ } elseif ($args[$key] instanceof $check) {
236
+ goto is_valid;
237
+ }
238
+ }
239
+
240
+ $this->invalidType($key, $args[$key]);
241
+
242
+ // Apply the value
243
+ is_valid:
244
+ if (isset($a['fn'])) {
245
+ $a['fn']($args[$key], $args, $list);
246
+ }
247
+
248
+ if ($a['type'] === 'config') {
249
+ $args['config'][$key] = $args[$key];
250
+ }
251
+ }
252
+
253
+ return $args;
254
+ }
255
+
256
+ /**
257
+ * Creates a verbose error message for an invalid argument.
258
+ *
259
+ * @param string $name Name of the argument that is missing.
260
+ * @param array $args Provided arguments
261
+ * @param bool $useRequired Set to true to show the required fn text if
262
+ * available instead of the documentation.
263
+ * @return string
264
+ */
265
+ private function getArgMessage($name, $args = [], $useRequired = false)
266
+ {
267
+ $arg = $this->argDefinitions[$name];
268
+ $msg = '';
269
+ $modifiers = [];
270
+ if (isset($arg['valid'])) {
271
+ $modifiers[] = implode('|', $arg['valid']);
272
+ }
273
+ if (isset($arg['choice'])) {
274
+ $modifiers[] = 'One of ' . implode(', ', $arg['choice']);
275
+ }
276
+ if ($modifiers) {
277
+ $msg .= '(' . implode('; ', $modifiers) . ')';
278
+ }
279
+ $msg = wordwrap("{$name}: {$msg}", 75, "\n ");
280
+
281
+ if ($useRequired && is_callable($arg['required'])) {
282
+ $msg .= "\n\n ";
283
+ $msg .= str_replace("\n", "\n ", call_user_func($arg['required'], $args));
284
+ } elseif (isset($arg['doc'])) {
285
+ $msg .= wordwrap("\n\n {$arg['doc']}", 75, "\n ");
286
+ }
287
+
288
+ return $msg;
289
+ }
290
+
291
+ /**
292
+ * Throw when an invalid type is encountered.
293
+ *
294
+ * @param string $name Name of the value being validated.
295
+ * @param mixed $provided The provided value.
296
+ * @throws \InvalidArgumentException
297
+ */
298
+ private function invalidType($name, $provided)
299
+ {
300
+ $expected = implode('|', $this->argDefinitions[$name]['valid']);
301
+ $msg = "Invalid configuration value "
302
+ . "provided for \"{$name}\". Expected {$expected}, but got "
303
+ . describe_type($provided) . "\n\n"
304
+ . $this->getArgMessage($name);
305
+ throw new IAE($msg);
306
+ }
307
+
308
+ /**
309
+ * Throws an exception for missing required arguments.
310
+ *
311
+ * @param array $args Passed in arguments.
312
+ * @throws \InvalidArgumentException
313
+ */
314
+ private function throwRequired(array $args)
315
+ {
316
+ $missing = [];
317
+ foreach ($this->argDefinitions as $k => $a) {
318
+ if (empty($a['required'])
319
+ || isset($a['default'])
320
+ || array_key_exists($k, $args)
321
+ ) {
322
+ continue;
323
+ }
324
+ $missing[] = $this->getArgMessage($k, $args, true);
325
+ }
326
+ $msg = "Missing required client configuration options: \n\n";
327
+ $msg .= implode("\n\n", $missing);
328
+ throw new IAE($msg);
329
+ }
330
+
331
+ public static function _apply_retries($value, array &$args, HandlerList $list)
332
+ {
333
+ if ($value) {
334
+ $decider = RetryMiddleware::createDefaultDecider($value);
335
+ $list->appendSign(Middleware::retry($decider), 'retry');
336
+ }
337
+ }
338
+
339
+ public static function _apply_credentials($value, array &$args)
340
+ {
341
+ if (is_callable($value)) {
342
+ return;
343
+ } elseif ($value instanceof CredentialsInterface) {
344
+ $args['credentials'] = CredentialProvider::fromCredentials($value);
345
+ } elseif (is_array($value)
346
+ && isset($value['key'])
347
+ && isset($value['secret'])
348
+ ) {
349
+ $args['credentials'] = CredentialProvider::fromCredentials(
350
+ new Credentials(
351
+ $value['key'],
352
+ $value['secret'],
353
+ isset($value['token']) ? $value['token'] : null,
354
+ isset($value['expires']) ? $value['expires'] : null
355
+ )
356
+ );
357
+ } elseif ($value === false) {
358
+ $args['credentials'] = CredentialProvider::fromCredentials(
359
+ new Credentials('', '')
360
+ );
361
+ $args['config']['signature_version'] = 'anonymous';
362
+ } elseif ($value instanceof CacheInterface) {
363
+ $args['credentials'] = CredentialProvider::defaultProvider($args);
364
+ } else {
365
+ throw new IAE('Credentials must be an instance of '
366
+ . 'Aws\Credentials\CredentialsInterface, an associative '
367
+ . 'array that contains "key", "secret", and an optional "token" '
368
+ . 'key-value pairs, a credentials provider function, or false.');
369
+ }
370
+ }
371
+
372
+ public static function _apply_api_provider(callable $value, array &$args, HandlerList $list)
373
+ {
374
+ $api = new Service(
375
+ ApiProvider::resolve(
376
+ $value,
377
+ 'api',
378
+ $args['service'],
379
+ $args['version']
380
+ ),
381
+ $value
382
+ );
383
+ $args['api'] = $api;
384
+ $args['serializer'] = Service::createSerializer($api, $args['endpoint']);
385
+ $args['parser'] = Service::createParser($api);
386
+ $args['error_parser'] = Service::createErrorParser($api->getProtocol());
387
+ $list->prependBuild(Middleware::requestBuilder($args['serializer']), 'builder');
388
+ }
389
+
390
+ public static function _apply_endpoint_provider(callable $value, array &$args)
391
+ {
392
+ if (!isset($args['endpoint'])) {
393
+ // Invoke the endpoint provider and throw if it does not resolve.
394
+ $result = EndpointProvider::resolve($value, [
395
+ 'service' => $args['service'],
396
+ 'region' => $args['region'],
397
+ 'scheme' => $args['scheme']
398
+ ]);
399
+
400
+ $args['endpoint'] = $result['endpoint'];
401
+
402
+ if (isset($result['signatureVersion'])) {
403
+ $args['config']['signature_version'] = $result['signatureVersion'];
404
+ }
405
+ }
406
+ }
407
+
408
+ public static function _apply_debug($value, array &$args, HandlerList $list)
409
+ {
410
+ if ($value !== false) {
411
+ $list->interpose(new TraceMiddleware($value === true ? [] : $value));
412
+ }
413
+ }
414
+
415
+ public static function _apply_profile($_, array &$args)
416
+ {
417
+ $args['credentials'] = CredentialProvider::ini($args['profile']);
418
+ }
419
+
420
+ public static function _apply_validate($value, array &$args, HandlerList $list)
421
+ {
422
+ if ($value === true) {
423
+ $list->appendValidate(
424
+ Middleware::validation($args['api'], new Validator()),
425
+ 'validation'
426
+ );
427
+ }
428
+ }
429
+
430
+ public static function _apply_handler($value, array &$args, HandlerList $list)
431
+ {
432
+ $list->setHandler($value);
433
+ }
434
+
435
+ public static function _default_handler(array &$args)
436
+ {
437
+ return new WrappedHttpHandler(
438
+ default_http_handler(),
439
+ $args['parser'],
440
+ $args['error_parser'],
441
+ $args['exception_class']
442
+ );
443
+ }
444
+
445
+ public static function _apply_http_handler($value, array &$args, HandlerList $list)
446
+ {
447
+ $args['handler'] = new WrappedHttpHandler(
448
+ $value,
449
+ $args['parser'],
450
+ $args['error_parser'],
451
+ $args['exception_class']
452
+ );
453
+ }
454
+
455
+ public static function _apply_user_agent($value, array &$args, HandlerList $list)
456
+ {
457
+ if (!is_array($value)) {
458
+ $value = [$value];
459
+ }
460
+
461
+ $value = array_map('strval', $value);
462
+
463
+ array_unshift($value, 'aws-sdk-php/' . Sdk::VERSION);
464
+ $args['ua_append'] = $value;
465
+
466
+ $list->appendBuild(static function (callable $handler) use ($value) {
467
+ return function (
468
+ CommandInterface $command,
469
+ RequestInterface $request
470
+ ) use ($handler, $value) {
471
+ return $handler($command, $request->withHeader(
472
+ 'User-Agent',
473
+ implode(' ', array_merge(
474
+ $value,
475
+ $request->getHeader('User-Agent')
476
+ ))
477
+ ));
478
+ };
479
+ });
480
+ }
481
+
482
+ public static function _apply_endpoint($value, array &$args, HandlerList $list)
483
+ {
484
+ $parts = parse_url($value);
485
+ if (empty($parts['scheme']) || empty($parts['host'])) {
486
+ throw new IAE(
487
+ 'Endpoints must be full URIs and include a scheme and host'
488
+ );
489
+ }
490
+
491
+ $args['endpoint'] = $value;
492
+ }
493
+
494
+ public static function _default_endpoint_provider()
495
+ {
496
+ return EndpointProvider::defaultProvider();
497
+ }
498
+
499
+ public static function _default_signature_provider()
500
+ {
501
+ return SignatureProvider::defaultProvider();
502
+ }
503
+
504
+ public static function _default_signature_version(array &$args)
505
+ {
506
+ return isset($args['config']['signature_version'])
507
+ ? $args['config']['signature_version']
508
+ : $args['api']->getSignatureVersion();
509
+ }
510
+
511
+ public static function _missing_version(array $args)
512
+ {
513
+ $service = isset($args['service']) ? $args['service'] : '';
514
+ $versions = ApiProvider::defaultProvider()->getVersions($service);
515
+ $versions = implode("\n", array_map(function ($v) {
516
+ return "* \"$v\"";
517
+ }, $versions)) ?: '* (none found)';
518
+
519
+ return <<<EOT
520
+ A "version" configuration value is required. Specifying a version constraint
521
+ ensures that your code will not be affected by a breaking change made to the
522
+ service. For example, when using Amazon S3, you can lock your API version to
523
+ "2006-03-01".
524
+
525
+ Your build of the SDK has the following version(s) of "{$service}": {$versions}
526
+
527
+ You may provide "latest" to the "version" configuration value to utilize the
528
+ most recent available API version that your client's API provider can find.
529
+ Note: Using 'latest' in a production application is not recommended.
530
+
531
+ A list of available API versions can be found on each client's API documentation
532
+ page: http://docs.aws.amazon.com/aws-sdk-php/v3/api/index.html. If you are
533
+ unable to load a specific API version, then you may need to update your copy of
534
+ the SDK.
535
+ EOT;
536
+ }
537
+
538
+ public static function _missing_region(array $args)
539
+ {
540
+ $service = isset($args['service']) ? $args['service'] : '';
541
+
542
+ return <<<EOT
543
+ A "region" configuration value is required for the "{$service}" service
544
+ (e.g., "us-west-2"). A list of available public regions and endpoints can be
545
+ found at http://docs.aws.amazon.com/general/latest/gr/rande.html.
546
+ EOT;
547
+ }
548
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/CodeCommit/CodeCommitClient.php ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\CodeCommit;
3
+
4
+ use Aws\AwsClient;
5
+
6
+ /**
7
+ * This client is used to interact with the **AWS CodeCommit** service.
8
+ *
9
+ * @method \Aws\Result batchGetRepositories(array $args = [])
10
+ * @method \GuzzleHttp\Promise\Promise batchGetRepositoriesAsync(array $args = [])
11
+ * @method \Aws\Result createBranch(array $args = [])
12
+ * @method \GuzzleHttp\Promise\Promise createBranchAsync(array $args = [])
13
+ * @method \Aws\Result createRepository(array $args = [])
14
+ * @method \GuzzleHttp\Promise\Promise createRepositoryAsync(array $args = [])
15
+ * @method \Aws\Result deleteRepository(array $args = [])
16
+ * @method \GuzzleHttp\Promise\Promise deleteRepositoryAsync(array $args = [])
17
+ * @method \Aws\Result getBranch(array $args = [])
18
+ * @method \GuzzleHttp\Promise\Promise getBranchAsync(array $args = [])
19
+ * @method \Aws\Result getRepository(array $args = [])
20
+ * @method \GuzzleHttp\Promise\Promise getRepositoryAsync(array $args = [])
21
+ * @method \Aws\Result listBranches(array $args = [])
22
+ * @method \GuzzleHttp\Promise\Promise listBranchesAsync(array $args = [])
23
+ * @method \Aws\Result listRepositories(array $args = [])
24
+ * @method \GuzzleHttp\Promise\Promise listRepositoriesAsync(array $args = [])
25
+ * @method \Aws\Result updateDefaultBranch(array $args = [])
26
+ * @method \GuzzleHttp\Promise\Promise updateDefaultBranchAsync(array $args = [])
27
+ * @method \Aws\Result updateRepositoryDescription(array $args = [])
28
+ * @method \GuzzleHttp\Promise\Promise updateRepositoryDescriptionAsync(array $args = [])
29
+ * @method \Aws\Result updateRepositoryName(array $args = [])
30
+ * @method \GuzzleHttp\Promise\Promise updateRepositoryNameAsync(array $args = [])
31
+ */
32
+ class CodeCommitClient extends AwsClient {}
vendor/aannnaa7/aws-sdk-php-minimized/src/CodeCommit/Exception/CodeCommitException.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\CodeCommit\Exception;
3
+
4
+ use Aws\Exception\AwsException;
5
+
6
+ /**
7
+ * Represents an error interacting with the **AWS CodeCommit** service.
8
+ */
9
+ class CodeCommitException extends AwsException {}
vendor/aannnaa7/aws-sdk-php-minimized/src/CodeDeploy/CodeDeployClient.php ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\CodeDeploy;
3
+
4
+ use Aws\AwsClient;
5
+
6
+ /**
7
+ * This client is used to interact with AWS CodeDeploy
8
+ *
9
+ * @method \Aws\Result addTagsToOnPremisesInstances(array $args = [])
10
+ * @method \GuzzleHttp\Promise\Promise addTagsToOnPremisesInstancesAsync(array $args = [])
11
+ * @method \Aws\Result batchGetApplications(array $args = [])
12
+ * @method \GuzzleHttp\Promise\Promise batchGetApplicationsAsync(array $args = [])
13
+ * @method \Aws\Result batchGetDeployments(array $args = [])
14
+ * @method \GuzzleHttp\Promise\Promise batchGetDeploymentsAsync(array $args = [])
15
+ * @method \Aws\Result batchGetOnPremisesInstances(array $args = [])
16
+ * @method \GuzzleHttp\Promise\Promise batchGetOnPremisesInstancesAsync(array $args = [])
17
+ * @method \Aws\Result createApplication(array $args = [])
18
+ * @method \GuzzleHttp\Promise\Promise createApplicationAsync(array $args = [])
19
+ * @method \Aws\Result createDeployment(array $args = [])
20
+ * @method \GuzzleHttp\Promise\Promise createDeploymentAsync(array $args = [])
21
+ * @method \Aws\Result createDeploymentConfig(array $args = [])
22
+ * @method \GuzzleHttp\Promise\Promise createDeploymentConfigAsync(array $args = [])
23
+ * @method \Aws\Result createDeploymentGroup(array $args = [])
24
+ * @method \GuzzleHttp\Promise\Promise createDeploymentGroupAsync(array $args = [])
25
+ * @method \Aws\Result deleteApplication(array $args = [])
26
+ * @method \GuzzleHttp\Promise\Promise deleteApplicationAsync(array $args = [])
27
+ * @method \Aws\Result deleteDeploymentConfig(array $args = [])
28
+ * @method \GuzzleHttp\Promise\Promise deleteDeploymentConfigAsync(array $args = [])
29
+ * @method \Aws\Result deleteDeploymentGroup(array $args = [])
30
+ * @method \GuzzleHttp\Promise\Promise deleteDeploymentGroupAsync(array $args = [])
31
+ * @method \Aws\Result deregisterOnPremisesInstance(array $args = [])
32
+ * @method \GuzzleHttp\Promise\Promise deregisterOnPremisesInstanceAsync(array $args = [])
33
+ * @method \Aws\Result getApplication(array $args = [])
34
+ * @method \GuzzleHttp\Promise\Promise getApplicationAsync(array $args = [])
35
+ * @method \Aws\Result getApplicationRevision(array $args = [])
36
+ * @method \GuzzleHttp\Promise\Promise getApplicationRevisionAsync(array $args = [])
37
+ * @method \Aws\Result getDeployment(array $args = [])
38
+ * @method \GuzzleHttp\Promise\Promise getDeploymentAsync(array $args = [])
39
+ * @method \Aws\Result getDeploymentConfig(array $args = [])
40
+ * @method \GuzzleHttp\Promise\Promise getDeploymentConfigAsync(array $args = [])
41
+ * @method \Aws\Result getDeploymentGroup(array $args = [])
42
+ * @method \GuzzleHttp\Promise\Promise getDeploymentGroupAsync(array $args = [])
43
+ * @method \Aws\Result getDeploymentInstance(array $args = [])
44
+ * @method \GuzzleHttp\Promise\Promise getDeploymentInstanceAsync(array $args = [])
45
+ * @method \Aws\Result getOnPremisesInstance(array $args = [])
46
+ * @method \GuzzleHttp\Promise\Promise getOnPremisesInstanceAsync(array $args = [])
47
+ * @method \Aws\Result listApplicationRevisions(array $args = [])
48
+ * @method \GuzzleHttp\Promise\Promise listApplicationRevisionsAsync(array $args = [])
49
+ * @method \Aws\Result listApplications(array $args = [])
50
+ * @method \GuzzleHttp\Promise\Promise listApplicationsAsync(array $args = [])
51
+ * @method \Aws\Result listDeploymentConfigs(array $args = [])
52
+ * @method \GuzzleHttp\Promise\Promise listDeploymentConfigsAsync(array $args = [])
53
+ * @method \Aws\Result listDeploymentGroups(array $args = [])
54
+ * @method \GuzzleHttp\Promise\Promise listDeploymentGroupsAsync(array $args = [])
55
+ * @method \Aws\Result listDeploymentInstances(array $args = [])
56
+ * @method \GuzzleHttp\Promise\Promise listDeploymentInstancesAsync(array $args = [])
57
+ * @method \Aws\Result listDeployments(array $args = [])
58
+ * @method \GuzzleHttp\Promise\Promise listDeploymentsAsync(array $args = [])
59
+ * @method \Aws\Result listOnPremisesInstances(array $args = [])
60
+ * @method \GuzzleHttp\Promise\Promise listOnPremisesInstancesAsync(array $args = [])
61
+ * @method \Aws\Result registerApplicationRevision(array $args = [])
62
+ * @method \GuzzleHttp\Promise\Promise registerApplicationRevisionAsync(array $args = [])
63
+ * @method \Aws\Result registerOnPremisesInstance(array $args = [])
64
+ * @method \GuzzleHttp\Promise\Promise registerOnPremisesInstanceAsync(array $args = [])
65
+ * @method \Aws\Result removeTagsFromOnPremisesInstances(array $args = [])
66
+ * @method \GuzzleHttp\Promise\Promise removeTagsFromOnPremisesInstancesAsync(array $args = [])
67
+ * @method \Aws\Result stopDeployment(array $args = [])
68
+ * @method \GuzzleHttp\Promise\Promise stopDeploymentAsync(array $args = [])
69
+ * @method \Aws\Result updateApplication(array $args = [])
70
+ * @method \GuzzleHttp\Promise\Promise updateApplicationAsync(array $args = [])
71
+ * @method \Aws\Result updateDeploymentGroup(array $args = [])
72
+ * @method \GuzzleHttp\Promise\Promise updateDeploymentGroupAsync(array $args = [])
73
+ */
74
+ class CodeDeployClient extends AwsClient {}
vendor/aannnaa7/aws-sdk-php-minimized/src/CodeDeploy/Exception/CodeDeployException.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\CodeDeploy\Exception;
3
+
4
+ use Aws\Exception\AwsException;
5
+
6
+ /**
7
+ * Represents an error interacting with AWS CodeDeploy.
8
+ */
9
+ class CodeDeployException extends AwsException {}
vendor/aannnaa7/aws-sdk-php-minimized/src/CodePipeline/CodePipelineClient.php ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\CodePipeline;
3
+
4
+ use Aws\AwsClient;
5
+
6
+ /**
7
+ * This client is used to interact with the **Amazon CodePipeline** service.
8
+ *
9
+ * @method \Aws\Result acknowledgeJob(array $args = [])
10
+ * @method \GuzzleHttp\Promise\Promise acknowledgeJobAsync(array $args = [])
11
+ * @method \Aws\Result acknowledgeThirdPartyJob(array $args = [])
12
+ * @method \GuzzleHttp\Promise\Promise acknowledgeThirdPartyJobAsync(array $args = [])
13
+ * @method \Aws\Result createCustomActionType(array $args = [])
14
+ * @method \GuzzleHttp\Promise\Promise createCustomActionTypeAsync(array $args = [])
15
+ * @method \Aws\Result createPipeline(array $args = [])
16
+ * @method \GuzzleHttp\Promise\Promise createPipelineAsync(array $args = [])
17
+ * @method \Aws\Result deleteCustomActionType(array $args = [])
18
+ * @method \GuzzleHttp\Promise\Promise deleteCustomActionTypeAsync(array $args = [])
19
+ * @method \Aws\Result deletePipeline(array $args = [])
20
+ * @method \GuzzleHttp\Promise\Promise deletePipelineAsync(array $args = [])
21
+ * @method \Aws\Result disableStageTransition(array $args = [])
22
+ * @method \GuzzleHttp\Promise\Promise disableStageTransitionAsync(array $args = [])
23
+ * @method \Aws\Result enableStageTransition(array $args = [])
24
+ * @method \GuzzleHttp\Promise\Promise enableStageTransitionAsync(array $args = [])
25
+ * @method \Aws\Result getJobDetails(array $args = [])
26
+ * @method \GuzzleHttp\Promise\Promise getJobDetailsAsync(array $args = [])
27
+ * @method \Aws\Result getPipeline(array $args = [])
28
+ * @method \GuzzleHttp\Promise\Promise getPipelineAsync(array $args = [])
29
+ * @method \Aws\Result getPipelineState(array $args = [])
30
+ * @method \GuzzleHttp\Promise\Promise getPipelineStateAsync(array $args = [])
31
+ * @method \Aws\Result getThirdPartyJobDetails(array $args = [])
32
+ * @method \GuzzleHttp\Promise\Promise getThirdPartyJobDetailsAsync(array $args = [])
33
+ * @method \Aws\Result listActionTypes(array $args = [])
34
+ * @method \GuzzleHttp\Promise\Promise listActionTypesAsync(array $args = [])
35
+ * @method \Aws\Result listPipelines(array $args = [])
36
+ * @method \GuzzleHttp\Promise\Promise listPipelinesAsync(array $args = [])
37
+ * @method \Aws\Result pollForJobs(array $args = [])
38
+ * @method \GuzzleHttp\Promise\Promise pollForJobsAsync(array $args = [])
39
+ * @method \Aws\Result pollForThirdPartyJobs(array $args = [])
40
+ * @method \GuzzleHttp\Promise\Promise pollForThirdPartyJobsAsync(array $args = [])
41
+ * @method \Aws\Result putActionRevision(array $args = [])
42
+ * @method \GuzzleHttp\Promise\Promise putActionRevisionAsync(array $args = [])
43
+ * @method \Aws\Result putJobFailureResult(array $args = [])
44
+ * @method \GuzzleHttp\Promise\Promise putJobFailureResultAsync(array $args = [])
45
+ * @method \Aws\Result putJobSuccessResult(array $args = [])
46
+ * @method \GuzzleHttp\Promise\Promise putJobSuccessResultAsync(array $args = [])
47
+ * @method \Aws\Result putThirdPartyJobFailureResult(array $args = [])
48
+ * @method \GuzzleHttp\Promise\Promise putThirdPartyJobFailureResultAsync(array $args = [])
49
+ * @method \Aws\Result putThirdPartyJobSuccessResult(array $args = [])
50
+ * @method \GuzzleHttp\Promise\Promise putThirdPartyJobSuccessResultAsync(array $args = [])
51
+ * @method \Aws\Result startPipelineExecution(array $args = [])
52
+ * @method \GuzzleHttp\Promise\Promise startPipelineExecutionAsync(array $args = [])
53
+ * @method \Aws\Result updatePipeline(array $args = [])
54
+ * @method \GuzzleHttp\Promise\Promise updatePipelineAsync(array $args = [])
55
+ */
56
+ class CodePipelineClient extends AwsClient {}
vendor/aannnaa7/aws-sdk-php-minimized/src/CodePipeline/Exception/CodePipelineException.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\CodePipeline\Exception;
3
+
4
+ use Aws\Exception\AwsException;
5
+
6
+ /**
7
+ * Represents an error interacting with the Amazon CodePipeline service.
8
+ */
9
+ class CodePipelineException extends AwsException {}
vendor/aannnaa7/aws-sdk-php-minimized/src/CognitoIdentity/CognitoIdentityClient.php ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\CognitoIdentity;
3
+
4
+ use Aws\AwsClient;
5
+
6
+ /**
7
+ * This client is used to interact with the **Amazon Cognito Identity** service.
8
+ *
9
+ * @method \Aws\Result createIdentityPool(array $args = [])
10
+ * @method \GuzzleHttp\Promise\Promise createIdentityPoolAsync(array $args = [])
11
+ * @method \Aws\Result deleteIdentities(array $args = [])
12
+ * @method \GuzzleHttp\Promise\Promise deleteIdentitiesAsync(array $args = [])
13
+ * @method \Aws\Result deleteIdentityPool(array $args = [])
14
+ * @method \GuzzleHttp\Promise\Promise deleteIdentityPoolAsync(array $args = [])
15
+ * @method \Aws\Result describeIdentity(array $args = [])
16
+ * @method \GuzzleHttp\Promise\Promise describeIdentityAsync(array $args = [])
17
+ * @method \Aws\Result describeIdentityPool(array $args = [])
18
+ * @method \GuzzleHttp\Promise\Promise describeIdentityPoolAsync(array $args = [])
19
+ * @method \Aws\Result getCredentialsForIdentity(array $args = [])
20
+ * @method \GuzzleHttp\Promise\Promise getCredentialsForIdentityAsync(array $args = [])
21
+ * @method \Aws\Result getId(array $args = [])
22
+ * @method \GuzzleHttp\Promise\Promise getIdAsync(array $args = [])
23
+ * @method \Aws\Result getIdentityPoolRoles(array $args = [])
24
+ * @method \GuzzleHttp\Promise\Promise getIdentityPoolRolesAsync(array $args = [])
25
+ * @method \Aws\Result getOpenIdToken(array $args = [])
26
+ * @method \GuzzleHttp\Promise\Promise getOpenIdTokenAsync(array $args = [])
27
+ * @method \Aws\Result getOpenIdTokenForDeveloperIdentity(array $args = [])
28
+ * @method \GuzzleHttp\Promise\Promise getOpenIdTokenForDeveloperIdentityAsync(array $args = [])
29
+ * @method \Aws\Result listIdentities(array $args = [])
30
+ * @method \GuzzleHttp\Promise\Promise listIdentitiesAsync(array $args = [])
31
+ * @method \Aws\Result listIdentityPools(array $args = [])
32
+ * @method \GuzzleHttp\Promise\Promise listIdentityPoolsAsync(array $args = [])
33
+ * @method \Aws\Result lookupDeveloperIdentity(array $args = [])
34
+ * @method \GuzzleHttp\Promise\Promise lookupDeveloperIdentityAsync(array $args = [])
35
+ * @method \Aws\Result mergeDeveloperIdentities(array $args = [])
36
+ * @method \GuzzleHttp\Promise\Promise mergeDeveloperIdentitiesAsync(array $args = [])
37
+ * @method \Aws\Result setIdentityPoolRoles(array $args = [])
38
+ * @method \GuzzleHttp\Promise\Promise setIdentityPoolRolesAsync(array $args = [])
39
+ * @method \Aws\Result unlinkDeveloperIdentity(array $args = [])
40
+ * @method \GuzzleHttp\Promise\Promise unlinkDeveloperIdentityAsync(array $args = [])
41
+ * @method \Aws\Result unlinkIdentity(array $args = [])
42
+ * @method \GuzzleHttp\Promise\Promise unlinkIdentityAsync(array $args = [])
43
+ * @method \Aws\Result updateIdentityPool(array $args = [])
44
+ * @method \GuzzleHttp\Promise\Promise updateIdentityPoolAsync(array $args = [])
45
+ */
46
+ class CognitoIdentityClient extends AwsClient {}
vendor/aannnaa7/aws-sdk-php-minimized/src/CognitoIdentity/Exception/CognitoIdentityException.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\CognitoIdentity\Exception;
3
+
4
+ use Aws\Exception\AwsException;
5
+
6
+ /**
7
+ * Represents an error interacting with the Amazon Cognito Identity Logs service.
8
+ */
9
+ class CognitoIdentityException extends AwsException {}
vendor/aannnaa7/aws-sdk-php-minimized/src/CognitoSync/CognitoSyncClient.php ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\CognitoSync;
3
+
4
+ use Aws\AwsClient;
5
+
6
+ /**
7
+ * This client is used to interact with the **Amazon Cognito Sync** service.
8
+ *
9
+ * @method \Aws\Result bulkPublish(array $args = [])
10
+ * @method \GuzzleHttp\Promise\Promise bulkPublishAsync(array $args = [])
11
+ * @method \Aws\Result deleteDataset(array $args = [])
12
+ * @method \GuzzleHttp\Promise\Promise deleteDatasetAsync(array $args = [])
13
+ * @method \Aws\Result describeDataset(array $args = [])
14
+ * @method \GuzzleHttp\Promise\Promise describeDatasetAsync(array $args = [])
15
+ * @method \Aws\Result describeIdentityPoolUsage(array $args = [])
16
+ * @method \GuzzleHttp\Promise\Promise describeIdentityPoolUsageAsync(array $args = [])
17
+ * @method \Aws\Result describeIdentityUsage(array $args = [])
18
+ * @method \GuzzleHttp\Promise\Promise describeIdentityUsageAsync(array $args = [])
19
+ * @method \Aws\Result getBulkPublishDetails(array $args = [])
20
+ * @method \GuzzleHttp\Promise\Promise getBulkPublishDetailsAsync(array $args = [])
21
+ * @method \Aws\Result getCognitoEvents(array $args = [])
22
+ * @method \GuzzleHttp\Promise\Promise getCognitoEventsAsync(array $args = [])
23
+ * @method \Aws\Result getIdentityPoolConfiguration(array $args = [])
24
+ * @method \GuzzleHttp\Promise\Promise getIdentityPoolConfigurationAsync(array $args = [])
25
+ * @method \Aws\Result listDatasets(array $args = [])
26
+ * @method \GuzzleHttp\Promise\Promise listDatasetsAsync(array $args = [])
27
+ * @method \Aws\Result listIdentityPoolUsage(array $args = [])
28
+ * @method \GuzzleHttp\Promise\Promise listIdentityPoolUsageAsync(array $args = [])
29
+ * @method \Aws\Result listRecords(array $args = [])
30
+ * @method \GuzzleHttp\Promise\Promise listRecordsAsync(array $args = [])
31
+ * @method \Aws\Result registerDevice(array $args = [])
32
+ * @method \GuzzleHttp\Promise\Promise registerDeviceAsync(array $args = [])
33
+ * @method \Aws\Result setCognitoEvents(array $args = [])
34
+ * @method \GuzzleHttp\Promise\Promise setCognitoEventsAsync(array $args = [])
35
+ * @method \Aws\Result setIdentityPoolConfiguration(array $args = [])
36
+ * @method \GuzzleHttp\Promise\Promise setIdentityPoolConfigurationAsync(array $args = [])
37
+ * @method \Aws\Result subscribeToDataset(array $args = [])
38
+ * @method \GuzzleHttp\Promise\Promise subscribeToDatasetAsync(array $args = [])
39
+ * @method \Aws\Result unsubscribeFromDataset(array $args = [])
40
+ * @method \GuzzleHttp\Promise\Promise unsubscribeFromDatasetAsync(array $args = [])
41
+ * @method \Aws\Result updateRecords(array $args = [])
42
+ * @method \GuzzleHttp\Promise\Promise updateRecordsAsync(array $args = [])
43
+ */
44
+ class CognitoSyncClient extends AwsClient {}
vendor/aannnaa7/aws-sdk-php-minimized/src/CognitoSync/Exception/CognitoSyncException.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\CognitoSync\Exception;
3
+
4
+ use Aws\Exception\AwsException;
5
+
6
+ /**
7
+ * Represents an error interacting with the Amazon Cognito Sync service.
8
+ */
9
+ class CognitoSyncException extends AwsException {}
vendor/aannnaa7/aws-sdk-php-minimized/src/Command.php ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws;
3
+
4
+ /**
5
+ * AWS command object.
6
+ */
7
+ class Command implements CommandInterface
8
+ {
9
+ use HasDataTrait;
10
+
11
+ /** @var string */
12
+ private $name;
13
+
14
+ /** @var HandlerList */
15
+ private $handlerList;
16
+
17
+ /**
18
+ * Accepts an associative array of command options, including:
19
+ *
20
+ * - @http: (array) Associative array of transfer options.
21
+ *
22
+ * @param string $name Name of the command
23
+ * @param array $args Arguments to pass to the command
24
+ * @param HandlerList $list Handler list
25
+ */
26
+ public function __construct($name, array $args = [], HandlerList $list = null)
27
+ {
28
+ $this->name = $name;
29
+ $this->data = $args;
30
+ $this->handlerList = $list ?: new HandlerList();
31
+
32
+ if (!isset($this->data['@http'])) {
33
+ $this->data['@http'] = [];
34
+ }
35
+ }
36
+
37
+ public function getName()
38
+ {
39
+ return $this->name;
40
+ }
41
+
42
+ public function hasParam($name)
43
+ {
44
+ return array_key_exists($name, $this->data);
45
+ }
46
+
47
+ public function getHandlerList()
48
+ {
49
+ return $this->handlerList;
50
+ }
51
+
52
+ /** @deprecated */
53
+ public function get($name)
54
+ {
55
+ return $this[$name];
56
+ }
57
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/CommandInterface.php ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws;
3
+
4
+ /**
5
+ * A command object encapsulates the input parameters used to control the
6
+ * creation of a HTTP request and processing of a HTTP response.
7
+ *
8
+ * Using the toArray() method will return the input parameters of the command
9
+ * as an associative array.
10
+ */
11
+ interface CommandInterface extends \ArrayAccess, \Countable, \IteratorAggregate
12
+ {
13
+ /**
14
+ * Converts the command parameters to an array
15
+ *
16
+ * @return array
17
+ */
18
+ public function toArray();
19
+
20
+ /**
21
+ * Get the name of the command
22
+ *
23
+ * @return string
24
+ */
25
+ public function getName();
26
+
27
+ /**
28
+ * Check if the command has a parameter by name.
29
+ *
30
+ * @param string $name Name of the parameter to check
31
+ *
32
+ * @return bool
33
+ */
34
+ public function hasParam($name);
35
+
36
+ /**
37
+ * Get the handler list used to transfer the command.
38
+ *
39
+ * @return HandlerList
40
+ */
41
+ public function getHandlerList();
42
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/CommandPool.php ADDED
@@ -0,0 +1,144 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws;
3
+
4
+ use GuzzleHttp\Promise\PromisorInterface;
5
+ use GuzzleHttp\Promise\EachPromise;
6
+
7
+ /**
8
+ * Sends and iterator of commands concurrently using a capped pool size.
9
+ *
10
+ * The pool will read command objects from an iterator until it is cancelled or
11
+ * until the iterator is consumed.
12
+ */
13
+ class CommandPool implements PromisorInterface
14
+ {
15
+ /** @var EachPromise */
16
+ private $each;
17
+
18
+ /**
19
+ * The CommandPool constructor accepts a hash of configuration options:
20
+ *
21
+ * - concurrency: (callable|int) Maximum number of commands to execute
22
+ * concurrently. Provide a function to resize the pool dynamically. The
23
+ * function will be provided the current number of pending requests and
24
+ * is expected to return an integer representing the new pool size limit.
25
+ * - before: (callable) function to invoke before sending each command. The
26
+ * before function accepts the command and the key of the iterator of the
27
+ * command. You can mutate the command as needed in the before function
28
+ * before sending the command.
29
+ * - fulfilled: (callable) Function to invoke when a promise is fulfilled.
30
+ * The function is provided the result object, id of the iterator that the
31
+ * result came from, and the aggregate promise that can be resolved/rejected
32
+ * if you need to short-circuit the pool.
33
+ * - rejected: (callable) Function to invoke when a promise is rejected.
34
+ * The function is provided an AwsException object, id of the iterator that
35
+ * the exception came from, and the aggregate promise that can be
36
+ * resolved/rejected if you need to short-circuit the pool.
37
+ *
38
+ * @param AwsClientInterface $client Client used to execute commands.
39
+ * @param array|\Iterator $commands Iterable that yields commands.
40
+ * @param array $config Associative array of options.
41
+ */
42
+ public function __construct(
43
+ AwsClientInterface $client,
44
+ $commands,
45
+ array $config = []
46
+ ) {
47
+ if (!isset($config['concurrency'])) {
48
+ $config['concurrency'] = 25;
49
+ }
50
+
51
+ $before = $this->getBefore($config);
52
+ $mapFn = function ($commands) use ($client, $before) {
53
+ foreach ($commands as $key => $command) {
54
+ if (!($command instanceof CommandInterface)) {
55
+ throw new \InvalidArgumentException('Each value yielded by '
56
+ . 'the iterator must be an Aws\CommandInterface.');
57
+ }
58
+ if ($before) {
59
+ $before($command, $key);
60
+ }
61
+ yield $client->executeAsync($command);
62
+ }
63
+ };
64
+
65
+ $this->each = new EachPromise($mapFn($commands), $config);
66
+ }
67
+
68
+ /**
69
+ * @return \GuzzleHttp\Promise\PromiseInterface
70
+ */
71
+ public function promise()
72
+ {
73
+ return $this->each->promise();
74
+ }
75
+
76
+ /**
77
+ * Executes a pool synchronously and aggregates the results of the pool
78
+ * into an indexed array in the same order as the passed in array.
79
+ *
80
+ * @param AwsClientInterface $client Client used to execute commands.
81
+ * @param mixed $commands Iterable that yields commands.
82
+ * @param array $config Configuration options.
83
+ *
84
+ * @return array
85
+ * @see \Aws\CommandPool::__construct for available configuration options.
86
+ */
87
+ public static function batch(
88
+ AwsClientInterface $client,
89
+ $commands,
90
+ array $config = []
91
+ ) {
92
+ $results = [];
93
+ self::cmpCallback($config, 'fulfilled', $results);
94
+ self::cmpCallback($config, 'rejected', $results);
95
+
96
+ return (new self($client, $commands, $config))
97
+ ->promise()
98
+ ->then(static function () use (&$results) {
99
+ ksort($results);
100
+ return $results;
101
+ })
102
+ ->wait();
103
+ }
104
+
105
+ /**
106
+ * @return callable
107
+ */
108
+ private function getBefore(array $config)
109
+ {
110
+ if (!isset($config['before'])) {
111
+ return null;
112
+ }
113
+
114
+ if (is_callable($config['before'])) {
115
+ return $config['before'];
116
+ }
117
+
118
+ throw new \InvalidArgumentException('before must be callable');
119
+ }
120
+
121
+ /**
122
+ * Adds an onFulfilled or onRejected callback that aggregates results into
123
+ * an array. If a callback is already present, it is replaced with the
124
+ * composed function.
125
+ *
126
+ * @param array $config
127
+ * @param $name
128
+ * @param array $results
129
+ */
130
+ private static function cmpCallback(array &$config, $name, array &$results)
131
+ {
132
+ if (!isset($config[$name])) {
133
+ $config[$name] = function ($v, $k) use (&$results) {
134
+ $results[$k] = $v;
135
+ };
136
+ } else {
137
+ $currentFn = $config[$name];
138
+ $config[$name] = function ($v, $k) use (&$results, $currentFn) {
139
+ $currentFn($v, $k);
140
+ $results[$k] = $v;
141
+ };
142
+ }
143
+ }
144
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/ConfigService/ConfigServiceClient.php ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\ConfigService;
3
+
4
+ use Aws\AwsClient;
5
+
6
+ /**
7
+ * This client is used to interact with AWS Config.
8
+ *
9
+ * @method \Aws\Result deleteConfigRule(array $args = [])
10
+ * @method \GuzzleHttp\Promise\Promise deleteConfigRuleAsync(array $args = [])
11
+ * @method \Aws\Result deleteDeliveryChannel(array $args = [])
12
+ * @method \GuzzleHttp\Promise\Promise deleteDeliveryChannelAsync(array $args = [])
13
+ * @method \Aws\Result deliverConfigSnapshot(array $args = [])
14
+ * @method \GuzzleHttp\Promise\Promise deliverConfigSnapshotAsync(array $args = [])
15
+ * @method \Aws\Result describeComplianceByConfigRule(array $args = [])
16
+ * @method \GuzzleHttp\Promise\Promise describeComplianceByConfigRuleAsync(array $args = [])
17
+ * @method \Aws\Result describeComplianceByResource(array $args = [])
18
+ * @method \GuzzleHttp\Promise\Promise describeComplianceByResourceAsync(array $args = [])
19
+ * @method \Aws\Result describeConfigRuleEvaluationStatus(array $args = [])
20
+ * @method \GuzzleHttp\Promise\Promise describeConfigRuleEvaluationStatusAsync(array $args = [])
21
+ * @method \Aws\Result describeConfigRules(array $args = [])
22
+ * @method \GuzzleHttp\Promise\Promise describeConfigRulesAsync(array $args = [])
23
+ * @method \Aws\Result describeConfigurationRecorderStatus(array $args = [])
24
+ * @method \GuzzleHttp\Promise\Promise describeConfigurationRecorderStatusAsync(array $args = [])
25
+ * @method \Aws\Result describeConfigurationRecorders(array $args = [])
26
+ * @method \GuzzleHttp\Promise\Promise describeConfigurationRecordersAsync(array $args = [])
27
+ * @method \Aws\Result describeDeliveryChannelStatus(array $args = [])
28
+ * @method \GuzzleHttp\Promise\Promise describeDeliveryChannelStatusAsync(array $args = [])
29
+ * @method \Aws\Result describeDeliveryChannels(array $args = [])
30
+ * @method \GuzzleHttp\Promise\Promise describeDeliveryChannelsAsync(array $args = [])
31
+ * @method \Aws\Result getComplianceDetailsByConfigRule(array $args = [])
32
+ * @method \GuzzleHttp\Promise\Promise getComplianceDetailsByConfigRuleAsync(array $args = [])
33
+ * @method \Aws\Result getComplianceDetailsByResource(array $args = [])
34
+ * @method \GuzzleHttp\Promise\Promise getComplianceDetailsByResourceAsync(array $args = [])
35
+ * @method \Aws\Result getComplianceSummaryByConfigRule(array $args = [])
36
+ * @method \GuzzleHttp\Promise\Promise getComplianceSummaryByConfigRuleAsync(array $args = [])
37
+ * @method \Aws\Result getComplianceSummaryByResourceType(array $args = [])
38
+ * @method \GuzzleHttp\Promise\Promise getComplianceSummaryByResourceTypeAsync(array $args = [])
39
+ * @method \Aws\Result getResourceConfigHistory(array $args = [])
40
+ * @method \GuzzleHttp\Promise\Promise getResourceConfigHistoryAsync(array $args = [])
41
+ * @method \Aws\Result listDiscoveredResources(array $args = [])
42
+ * @method \GuzzleHttp\Promise\Promise listDiscoveredResourcesAsync(array $args = [])
43
+ * @method \Aws\Result putConfigRule(array $args = [])
44
+ * @method \GuzzleHttp\Promise\Promise putConfigRuleAsync(array $args = [])
45
+ * @method \Aws\Result putConfigurationRecorder(array $args = [])
46
+ * @method \GuzzleHttp\Promise\Promise putConfigurationRecorderAsync(array $args = [])
47
+ * @method \Aws\Result putDeliveryChannel(array $args = [])
48
+ * @method \GuzzleHttp\Promise\Promise putDeliveryChannelAsync(array $args = [])
49
+ * @method \Aws\Result putEvaluations(array $args = [])
50
+ * @method \GuzzleHttp\Promise\Promise putEvaluationsAsync(array $args = [])
51
+ * @method \Aws\Result startConfigurationRecorder(array $args = [])
52
+ * @method \GuzzleHttp\Promise\Promise startConfigurationRecorderAsync(array $args = [])
53
+ * @method \Aws\Result stopConfigurationRecorder(array $args = [])
54
+ * @method \GuzzleHttp\Promise\Promise stopConfigurationRecorderAsync(array $args = [])
55
+ */
56
+ class ConfigServiceClient extends AwsClient {}
vendor/aannnaa7/aws-sdk-php-minimized/src/ConfigService/Exception/ConfigServiceException.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\ConfigService\Exception;
3
+
4
+ use Aws\Exception\AwsException;
5
+
6
+ /**
7
+ * Represents an error interacting with the AWS Config service.
8
+ */
9
+ class ConfigServiceException extends AwsException {}
vendor/aannnaa7/aws-sdk-php-minimized/src/Credentials/CredentialProvider.php ADDED
@@ -0,0 +1,324 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Credentials;
3
+
4
+ use Aws;
5
+ use Aws\CacheInterface;
6
+ use Aws\Exception\CredentialsException;
7
+ use GuzzleHttp\Promise;
8
+
9
+ /**
10
+ * Credential providers are functions that accept no arguments and return a
11
+ * promise that is fulfilled with an {@see \Aws\Credentials\CredentialsInterface}
12
+ * or rejected with an {@see \Aws\Exception\CredentialsException}.
13
+ *
14
+ * <code>
15
+ * use Aws\Credentials\CredentialProvider;
16
+ * $provider = CredentialProvider::defaultProvider();
17
+ * // Returns a CredentialsInterface or throws.
18
+ * $creds = $provider()->wait();
19
+ * </code>
20
+ *
21
+ * Credential providers can be composed to create credentials using conditional
22
+ * logic that can create different credentials in different environments. You
23
+ * can compose multiple providers into a single provider using
24
+ * {@see Aws\Credentials\CredentialProvider::chain}. This function accepts
25
+ * providers as variadic arguments and returns a new function that will invoke
26
+ * each provider until a successful set of credentials is returned.
27
+ *
28
+ * <code>
29
+ * // First try an INI file at this location.
30
+ * $a = CredentialProvider::ini(null, '/path/to/file.ini');
31
+ * // Then try an INI file at this location.
32
+ * $b = CredentialProvider::ini(null, '/path/to/other-file.ini');
33
+ * // Then try loading from envrionment variables.
34
+ * $c = CredentialProvider::env();
35
+ * // Combine the three providers together.
36
+ * $composed = CredentialProvider::chain($a, $b, $c);
37
+ * // Returns a promise that is fulfilled with credentials or throws.
38
+ * $promise = $composed();
39
+ * // Wait on the credentials to resolve.
40
+ * $creds = $promise->wait();
41
+ * </code>
42
+ */
43
+ class CredentialProvider
44
+ {
45
+ const ENV_KEY = 'AWS_ACCESS_KEY_ID';
46
+ const ENV_SECRET = 'AWS_SECRET_ACCESS_KEY';
47
+ const ENV_SESSION = 'AWS_SESSION_TOKEN';
48
+ const ENV_PROFILE = 'AWS_PROFILE';
49
+
50
+ /**
51
+ * Create a default credential provider that first checks for environment
52
+ * variables, then checks for the "default" profile in ~/.aws/credentials,
53
+ * and finally checks for credentials using EC2 instance profile
54
+ * credentials.
55
+ *
56
+ * This provider is automatically wrapped in a memoize function that caches
57
+ * previously provided credentials.
58
+ *
59
+ * @param array $config Optional array of instance profile credentials
60
+ * provider options.
61
+ * @return callable
62
+ */
63
+ public static function defaultProvider(array $config = [])
64
+ {
65
+ $instanceProfileProvider = self::instanceProfile($config);
66
+ if (isset($config['credentials'])
67
+ && $config['credentials'] instanceof CacheInterface
68
+ ) {
69
+ $instanceProfileProvider = self::cache(
70
+ $instanceProfileProvider,
71
+ $config['credentials']
72
+ );
73
+ }
74
+
75
+ return self::memoize(
76
+ self::chain(
77
+ self::env(),
78
+ self::ini(),
79
+ $instanceProfileProvider
80
+ )
81
+ );
82
+ }
83
+
84
+ /**
85
+ * Create a credential provider function from a set of static credentials.
86
+ *
87
+ * @param CredentialsInterface $creds
88
+ *
89
+ * @return callable
90
+ */
91
+ public static function fromCredentials(CredentialsInterface $creds)
92
+ {
93
+ $promise = Promise\promise_for($creds);
94
+
95
+ return function () use ($promise) {
96
+ return $promise;
97
+ };
98
+ }
99
+
100
+ /**
101
+ * Creates an aggregate credentials provider that invokes the provided
102
+ * variadic providers one after the other until a provider returns
103
+ * credentials.
104
+ *
105
+ * @return callable
106
+ */
107
+ public static function chain()
108
+ {
109
+ $links = func_get_args();
110
+ if (empty($links)) {
111
+ throw new \InvalidArgumentException('No providers in chain');
112
+ }
113
+
114
+ return function () use ($links) {
115
+ /** @var callable $parent */
116
+ $parent = array_shift($links);
117
+ $promise = $parent();
118
+ while ($next = array_shift($links)) {
119
+ $promise = $promise->otherwise($next);
120
+ }
121
+ return $promise;
122
+ };
123
+ }
124
+
125
+ /**
126
+ * Wraps a credential provider and caches previously provided credentials.
127
+ *
128
+ * Ensures that cached credentials are refreshed when they expire.
129
+ *
130
+ * @param callable $provider Credentials provider function to wrap.
131
+ *
132
+ * @return callable
133
+ */
134
+ public static function memoize(callable $provider)
135
+ {
136
+ return function () use ($provider) {
137
+ static $result;
138
+ static $isConstant;
139
+
140
+ // Constant credentials will be returned constantly.
141
+ if ($isConstant) {
142
+ return $result;
143
+ }
144
+
145
+ // Create the initial promise that will be used as the cached value
146
+ // until it expires.
147
+ if (null === $result) {
148
+ $result = $provider();
149
+ }
150
+
151
+ // Return credentials that could expire and refresh when needed.
152
+ return $result
153
+ ->then(function (CredentialsInterface $creds) use ($provider, &$isConstant, &$result) {
154
+ // Determine if these are constant credentials.
155
+ if (!$creds->getExpiration()) {
156
+ $isConstant = true;
157
+ return $creds;
158
+ }
159
+
160
+ // Refresh expired credentials.
161
+ if (!$creds->isExpired()) {
162
+ return $creds;
163
+ }
164
+ // Refresh the result and forward the promise.
165
+ return $result = $provider();
166
+ });
167
+ };
168
+ }
169
+
170
+ /**
171
+ * Wraps a credential provider and saves provided credentials in an
172
+ * instance of Aws\CacheInterface. Forwards calls when no credentials found
173
+ * in cache and updates cache with the results.
174
+ *
175
+ * Defaults to using a simple file-based cache when none provided.
176
+ *
177
+ * @param callable $provider Credentials provider function to wrap
178
+ * @param CacheInterface $cache (optional) Cache to store credentials
179
+ * @param string|null $cacheKey (optional) Cache key to use
180
+ *
181
+ * @return callable
182
+ */
183
+ public static function cache(
184
+ callable $provider,
185
+ CacheInterface $cache,
186
+ $cacheKey = null
187
+ ) {
188
+ $cacheKey = $cacheKey ?: 'aws_cached_credentials';
189
+
190
+ return function () use ($provider, $cache, $cacheKey) {
191
+ $found = $cache->get($cacheKey);
192
+ if ($found instanceof CredentialsInterface && !$found->isExpired()) {
193
+ return Promise\promise_for($found);
194
+ }
195
+
196
+ return $provider()
197
+ ->then(function (CredentialsInterface $creds) use (
198
+ $cache,
199
+ $cacheKey
200
+ ) {
201
+ $cache->set(
202
+ $cacheKey,
203
+ $creds,
204
+ null === $creds->getExpiration() ?
205
+ 0 : $creds->getExpiration() - time()
206
+ );
207
+
208
+ return $creds;
209
+ });
210
+ };
211
+ }
212
+
213
+ /**
214
+ * Provider that creates credentials from environment variables
215
+ * AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, and AWS_SESSION_TOKEN.
216
+ *
217
+ * @return callable
218
+ */
219
+ public static function env()
220
+ {
221
+ return function () {
222
+ // Use credentials from environment variables, if available
223
+ $key = getenv(self::ENV_KEY);
224
+ $secret = getenv(self::ENV_SECRET);
225
+ if ($key && $secret) {
226
+ return Promise\promise_for(
227
+ new Credentials($key, $secret, getenv(self::ENV_SESSION))
228
+ );
229
+ }
230
+
231
+ return self::reject('Could not find environment variable '
232
+ . 'credentials in ' . self::ENV_KEY . '/' . self::ENV_SECRET);
233
+ };
234
+ }
235
+
236
+ /**
237
+ * Credential provider that creates credentials using instance profile
238
+ * credentials.
239
+ *
240
+ * @param array $config Array of configuration data.
241
+ *
242
+ * @return InstanceProfileProvider
243
+ * @see Aws\Credentials\InstanceProfileProvider for $config details.
244
+ */
245
+ public static function instanceProfile(array $config = [])
246
+ {
247
+ return new InstanceProfileProvider($config);
248
+ }
249
+
250
+ /**
251
+ * Credentials provider that creates credentials using an ini file stored
252
+ * in the current user's home directory.
253
+ *
254
+ * @param string|null $profile Profile to use. If not specified will use
255
+ * the "default" profile.
256
+ * @param string|null $filename If provided, uses a custom filename rather
257
+ * than looking in the home directory for the
258
+ *
259
+ * @return callable
260
+ */
261
+ public static function ini($profile = null, $filename = null)
262
+ {
263
+ $filename = $filename ?: (self::getHomeDir() . '/.aws/credentials');
264
+ $profile = $profile ?: (getenv(self::ENV_PROFILE) ?: 'default');
265
+
266
+ return function () use ($profile, $filename) {
267
+ if (!is_readable($filename)) {
268
+ return self::reject("Cannot read credentials from $filename");
269
+ }
270
+ $data = parse_ini_file($filename, true);
271
+ if ($data === false) {
272
+ return self::reject("Invalid credentials file: $filename");
273
+ }
274
+ if (!isset($data[$profile])) {
275
+ return self::reject("'$profile' not found in credentials file");
276
+ }
277
+ if (!isset($data[$profile]['aws_access_key_id'])
278
+ || !isset($data[$profile]['aws_secret_access_key'])
279
+ ) {
280
+ return self::reject("No credentials present in INI profile "
281
+ . "'$profile' ($filename)");
282
+ }
283
+
284
+ if (empty($data[$profile]['aws_session_token'])) {
285
+ $data[$profile]['aws_session_token']
286
+ = isset($data[$profile]['aws_security_token'])
287
+ ? $data[$profile]['aws_security_token']
288
+ : null;
289
+ }
290
+
291
+ return Promise\promise_for(
292
+ new Credentials(
293
+ $data[$profile]['aws_access_key_id'],
294
+ $data[$profile]['aws_secret_access_key'],
295
+ $data[$profile]['aws_session_token']
296
+ )
297
+ );
298
+ };
299
+ }
300
+
301
+ /**
302
+ * Gets the environment's HOME directory if available.
303
+ *
304
+ * @return null|string
305
+ */
306
+ private static function getHomeDir()
307
+ {
308
+ // On Linux/Unix-like systems, use the HOME environment variable
309
+ if ($homeDir = getenv('HOME')) {
310
+ return $homeDir;
311
+ }
312
+
313
+ // Get the HOMEDRIVE and HOMEPATH values for Windows hosts
314
+ $homeDrive = getenv('HOMEDRIVE');
315
+ $homePath = getenv('HOMEPATH');
316
+
317
+ return ($homeDrive && $homePath) ? $homeDrive . $homePath : null;
318
+ }
319
+
320
+ private static function reject($msg)
321
+ {
322
+ return new Promise\RejectedPromise(new CredentialsException($msg));
323
+ }
324
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Credentials/Credentials.php ADDED
@@ -0,0 +1,91 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Credentials;
3
+
4
+ /**
5
+ * Basic implementation of the AWS Credentials interface that allows callers to
6
+ * pass in the AWS Access Key and AWS Secret Access Key in the constructor.
7
+ */
8
+ class Credentials implements CredentialsInterface, \Serializable
9
+ {
10
+ private $key;
11
+ private $secret;
12
+ private $token;
13
+ private $expires;
14
+
15
+ /**
16
+ * Constructs a new BasicAWSCredentials object, with the specified AWS
17
+ * access key and AWS secret key
18
+ *
19
+ * @param string $key AWS access key ID
20
+ * @param string $secret AWS secret access key
21
+ * @param string $token Security token to use
22
+ * @param int $expires UNIX timestamp for when credentials expire
23
+ */
24
+ public function __construct($key, $secret, $token = null, $expires = null)
25
+ {
26
+ $this->key = trim($key);
27
+ $this->secret = trim($secret);
28
+ $this->token = $token;
29
+ $this->expires = $expires;
30
+ }
31
+
32
+ public static function __set_state(array $state)
33
+ {
34
+ return new self(
35
+ $state['key'],
36
+ $state['secret'],
37
+ $state['token'],
38
+ $state['expires']
39
+ );
40
+ }
41
+
42
+ public function getAccessKeyId()
43
+ {
44
+ return $this->key;
45
+ }
46
+
47
+ public function getSecretKey()
48
+ {
49
+ return $this->secret;
50
+ }
51
+
52
+ public function getSecurityToken()
53
+ {
54
+ return $this->token;
55
+ }
56
+
57
+ public function getExpiration()
58
+ {
59
+ return $this->expires;
60
+ }
61
+
62
+ public function isExpired()
63
+ {
64
+ return $this->expires !== null && time() >= $this->expires;
65
+ }
66
+
67
+ public function toArray()
68
+ {
69
+ return [
70
+ 'key' => $this->key,
71
+ 'secret' => $this->secret,
72
+ 'token' => $this->token,
73
+ 'expires' => $this->expires
74
+ ];
75
+ }
76
+
77
+ public function serialize()
78
+ {
79
+ return json_encode($this->toArray());
80
+ }
81
+
82
+ public function unserialize($serialized)
83
+ {
84
+ $data = json_decode($serialized, true);
85
+
86
+ $this->key = $data['key'];
87
+ $this->secret = $data['secret'];
88
+ $this->token = $data['token'];
89
+ $this->expires = $data['expires'];
90
+ }
91
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Credentials/CredentialsInterface.php ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Credentials;
3
+
4
+ /**
5
+ * Provides access to the AWS credentials used for accessing AWS services: AWS
6
+ * access key ID, secret access key, and security token. These credentials are
7
+ * used to securely sign requests to AWS services.
8
+ */
9
+ interface CredentialsInterface
10
+ {
11
+ /**
12
+ * Returns the AWS access key ID for this credentials object.
13
+ *
14
+ * @return string
15
+ */
16
+ public function getAccessKeyId();
17
+
18
+ /**
19
+ * Returns the AWS secret access key for this credentials object.
20
+ *
21
+ * @return string
22
+ */
23
+ public function getSecretKey();
24
+
25
+ /**
26
+ * Get the associated security token if available
27
+ *
28
+ * @return string|null
29
+ */
30
+ public function getSecurityToken();
31
+
32
+ /**
33
+ * Get the UNIX timestamp in which the credentials will expire
34
+ *
35
+ * @return int|null
36
+ */
37
+ public function getExpiration();
38
+
39
+ /**
40
+ * Check if the credentials are expired
41
+ *
42
+ * @return bool
43
+ */
44
+ public function isExpired();
45
+
46
+ /**
47
+ * Converts the credentials to an associative array.
48
+ *
49
+ * @return array
50
+ */
51
+ public function toArray();
52
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Credentials/InstanceProfileProvider.php ADDED
@@ -0,0 +1,102 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Credentials;
3
+
4
+ use Aws\Exception\CredentialsException;
5
+ use GuzzleHttp\Promise;
6
+ use GuzzleHttp\Psr7\Request;
7
+ use GuzzleHttp\Promise\PromiseInterface;
8
+ use Psr\Http\Message\ResponseInterface;
9
+
10
+ /**
11
+ * Credential provider that provides credentials from the EC2 metadata server.
12
+ */
13
+ class InstanceProfileProvider
14
+ {
15
+ const SERVER_URI = 'http://169.254.169.254/latest/';
16
+ const CRED_PATH = 'meta-data/iam/security-credentials/';
17
+
18
+ /** @var string */
19
+ private $profile;
20
+
21
+ /** @var callable */
22
+ private $client;
23
+
24
+ /**
25
+ * The constructor accepts the following options:
26
+ *
27
+ * - timeout: Connection timeout, in seconds.
28
+ * - profile: Optional EC2 profile name, if known.
29
+ *
30
+ * @param array $config Configuration options.
31
+ */
32
+ public function __construct(array $config = [])
33
+ {
34
+ $this->timeout = isset($config['timeout']) ? $config['timeout'] : 1.0;
35
+ $this->profile = isset($config['profile']) ? $config['profile'] : null;
36
+ $this->client = isset($config['client'])
37
+ ? $config['client'] // internal use only
38
+ : \Aws\default_http_handler();
39
+ }
40
+
41
+ /**
42
+ * Loads instance profile credentials.
43
+ *
44
+ * @return PromiseInterface
45
+ */
46
+ public function __invoke()
47
+ {
48
+ return Promise\coroutine(function () {
49
+ if (!$this->profile) {
50
+ $this->profile = (yield $this->request(self::CRED_PATH));
51
+ }
52
+ $json = (yield $this->request(self::CRED_PATH . $this->profile));
53
+ $result = $this->decodeResult($json);
54
+ yield new Credentials(
55
+ $result['AccessKeyId'],
56
+ $result['SecretAccessKey'],
57
+ $result['Token'],
58
+ strtotime($result['Expiration'])
59
+ );
60
+ });
61
+ }
62
+
63
+ /**
64
+ * @param string $url
65
+ * @return PromiseInterface Returns a promise that is fulfilled with the
66
+ * body of the response as a string.
67
+ */
68
+ private function request($url)
69
+ {
70
+ $fn = $this->client;
71
+ $request = new Request('GET', self::SERVER_URI . $url);
72
+
73
+ return $fn($request, ['timeout' => $this->timeout])
74
+ ->then(function (ResponseInterface $response) {
75
+ return (string) $response->getBody();
76
+ })->otherwise(function (array $reason) {
77
+ $reason = $reason['exception'];
78
+ $msg = $reason->getMessage();
79
+ throw new CredentialsException(
80
+ $this->createErrorMessage($msg, 0, $reason)
81
+ );
82
+ });
83
+ }
84
+
85
+ private function createErrorMessage($previous)
86
+ {
87
+ return "Error retrieving credentials from the instance profile "
88
+ . "metadata server. ({$previous})";
89
+ }
90
+
91
+ private function decodeResult($response)
92
+ {
93
+ $result = json_decode($response, true);
94
+
95
+ if ($result['Code'] !== 'Success') {
96
+ throw new CredentialsException('Unexpected instance profile '
97
+ . 'response code: ' . $result['Code']);
98
+ }
99
+
100
+ return $result;
101
+ }
102
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/DeviceFarm/DeviceFarmClient.php ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\DeviceFarm;
3
+
4
+ use Aws\AwsClient;
5
+
6
+ /**
7
+ * This client is used to interact with the **Amazon DeviceFarm** service.
8
+ *
9
+ * @method \Aws\Result createDevicePool(array $args = [])
10
+ * @method \GuzzleHttp\Promise\Promise createDevicePoolAsync(array $args = [])
11
+ * @method \Aws\Result createProject(array $args = [])
12
+ * @method \GuzzleHttp\Promise\Promise createProjectAsync(array $args = [])
13
+ * @method \Aws\Result createUpload(array $args = [])
14
+ * @method \GuzzleHttp\Promise\Promise createUploadAsync(array $args = [])
15
+ * @method \Aws\Result deleteDevicePool(array $args = [])
16
+ * @method \GuzzleHttp\Promise\Promise deleteDevicePoolAsync(array $args = [])
17
+ * @method \Aws\Result deleteProject(array $args = [])
18
+ * @method \GuzzleHttp\Promise\Promise deleteProjectAsync(array $args = [])
19
+ * @method \Aws\Result deleteRun(array $args = [])
20
+ * @method \GuzzleHttp\Promise\Promise deleteRunAsync(array $args = [])
21
+ * @method \Aws\Result deleteUpload(array $args = [])
22
+ * @method \GuzzleHttp\Promise\Promise deleteUploadAsync(array $args = [])
23
+ * @method \Aws\Result getAccountSettings(array $args = [])
24
+ * @method \GuzzleHttp\Promise\Promise getAccountSettingsAsync(array $args = [])
25
+ * @method \Aws\Result getDevice(array $args = [])
26
+ * @method \GuzzleHttp\Promise\Promise getDeviceAsync(array $args = [])
27
+ * @method \Aws\Result getDevicePool(array $args = [])
28
+ * @method \GuzzleHttp\Promise\Promise getDevicePoolAsync(array $args = [])
29
+ * @method \Aws\Result getDevicePoolCompatibility(array $args = [])
30
+ * @method \GuzzleHttp\Promise\Promise getDevicePoolCompatibilityAsync(array $args = [])
31
+ * @method \Aws\Result getJob(array $args = [])
32
+ * @method \GuzzleHttp\Promise\Promise getJobAsync(array $args = [])
33
+ * @method \Aws\Result getProject(array $args = [])
34
+ * @method \GuzzleHttp\Promise\Promise getProjectAsync(array $args = [])
35
+ * @method \Aws\Result getRun(array $args = [])
36
+ * @method \GuzzleHttp\Promise\Promise getRunAsync(array $args = [])
37
+ * @method \Aws\Result getSuite(array $args = [])
38
+ * @method \GuzzleHttp\Promise\Promise getSuiteAsync(array $args = [])
39
+ * @method \Aws\Result getTest(array $args = [])
40
+ * @method \GuzzleHttp\Promise\Promise getTestAsync(array $args = [])
41
+ * @method \Aws\Result getUpload(array $args = [])
42
+ * @method \GuzzleHttp\Promise\Promise getUploadAsync(array $args = [])
43
+ * @method \Aws\Result listArtifacts(array $args = [])
44
+ * @method \GuzzleHttp\Promise\Promise listArtifactsAsync(array $args = [])
45
+ * @method \Aws\Result listDevicePools(array $args = [])
46
+ * @method \GuzzleHttp\Promise\Promise listDevicePoolsAsync(array $args = [])
47
+ * @method \Aws\Result listDevices(array $args = [])
48
+ * @method \GuzzleHttp\Promise\Promise listDevicesAsync(array $args = [])
49
+ * @method \Aws\Result listJobs(array $args = [])
50
+ * @method \GuzzleHttp\Promise\Promise listJobsAsync(array $args = [])
51
+ * @method \Aws\Result listProjects(array $args = [])
52
+ * @method \GuzzleHttp\Promise\Promise listProjectsAsync(array $args = [])
53
+ * @method \Aws\Result listRuns(array $args = [])
54
+ * @method \GuzzleHttp\Promise\Promise listRunsAsync(array $args = [])
55
+ * @method \Aws\Result listSamples(array $args = [])
56
+ * @method \GuzzleHttp\Promise\Promise listSamplesAsync(array $args = [])
57
+ * @method \Aws\Result listSuites(array $args = [])
58
+ * @method \GuzzleHttp\Promise\Promise listSuitesAsync(array $args = [])
59
+ * @method \Aws\Result listTests(array $args = [])
60
+ * @method \GuzzleHttp\Promise\Promise listTestsAsync(array $args = [])
61
+ * @method \Aws\Result listUniqueProblems(array $args = [])
62
+ * @method \GuzzleHttp\Promise\Promise listUniqueProblemsAsync(array $args = [])
63
+ * @method \Aws\Result listUploads(array $args = [])
64
+ * @method \GuzzleHttp\Promise\Promise listUploadsAsync(array $args = [])
65
+ * @method \Aws\Result scheduleRun(array $args = [])
66
+ * @method \GuzzleHttp\Promise\Promise scheduleRunAsync(array $args = [])
67
+ * @method \Aws\Result updateDevicePool(array $args = [])
68
+ * @method \GuzzleHttp\Promise\Promise updateDevicePoolAsync(array $args = [])
69
+ * @method \Aws\Result updateProject(array $args = [])
70
+ * @method \GuzzleHttp\Promise\Promise updateProjectAsync(array $args = [])
71
+ */
72
+ class DeviceFarmClient extends AwsClient {}
vendor/aannnaa7/aws-sdk-php-minimized/src/DeviceFarm/Exception/DeviceFarmException.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\DeviceFarm\Exception;
3
+
4
+ use Aws\Exception\AwsException;
5
+
6
+ /**
7
+ * Represents an error interacting with the Amazon DeviceFarm service.
8
+ */
9
+ class DeviceFarmException extends AwsException {}
vendor/aannnaa7/aws-sdk-php-minimized/src/DirectConnect/DirectConnectClient.php ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\DirectConnect;
3
+
4
+ use Aws\AwsClient;
5
+
6
+ /**
7
+ * This client is used to interact with the **AWS Direct Connect** service.
8
+ *
9
+ * @method \Aws\Result allocateConnectionOnInterconnect(array $args = [])
10
+ * @method \GuzzleHttp\Promise\Promise allocateConnectionOnInterconnectAsync(array $args = [])
11
+ * @method \Aws\Result allocatePrivateVirtualInterface(array $args = [])
12
+ * @method \GuzzleHttp\Promise\Promise allocatePrivateVirtualInterfaceAsync(array $args = [])
13
+ * @method \Aws\Result allocatePublicVirtualInterface(array $args = [])
14
+ * @method \GuzzleHttp\Promise\Promise allocatePublicVirtualInterfaceAsync(array $args = [])
15
+ * @method \Aws\Result confirmConnection(array $args = [])
16
+ * @method \GuzzleHttp\Promise\Promise confirmConnectionAsync(array $args = [])
17
+ * @method \Aws\Result confirmPrivateVirtualInterface(array $args = [])
18
+ * @method \GuzzleHttp\Promise\Promise confirmPrivateVirtualInterfaceAsync(array $args = [])
19
+ * @method \Aws\Result confirmPublicVirtualInterface(array $args = [])
20
+ * @method \GuzzleHttp\Promise\Promise confirmPublicVirtualInterfaceAsync(array $args = [])
21
+ * @method \Aws\Result createConnection(array $args = [])
22
+ * @method \GuzzleHttp\Promise\Promise createConnectionAsync(array $args = [])
23
+ * @method \Aws\Result createInterconnect(array $args = [])
24
+ * @method \GuzzleHttp\Promise\Promise createInterconnectAsync(array $args = [])
25
+ * @method \Aws\Result createPrivateVirtualInterface(array $args = [])
26
+ * @method \GuzzleHttp\Promise\Promise createPrivateVirtualInterfaceAsync(array $args = [])
27
+ * @method \Aws\Result createPublicVirtualInterface(array $args = [])
28
+ * @method \GuzzleHttp\Promise\Promise createPublicVirtualInterfaceAsync(array $args = [])
29
+ * @method \Aws\Result deleteConnection(array $args = [])
30
+ * @method \GuzzleHttp\Promise\Promise deleteConnectionAsync(array $args = [])
31
+ * @method \Aws\Result deleteInterconnect(array $args = [])
32
+ * @method \GuzzleHttp\Promise\Promise deleteInterconnectAsync(array $args = [])
33
+ * @method \Aws\Result deleteVirtualInterface(array $args = [])
34
+ * @method \GuzzleHttp\Promise\Promise deleteVirtualInterfaceAsync(array $args = [])
35
+ * @method \Aws\Result describeConnections(array $args = [])
36
+ * @method \GuzzleHttp\Promise\Promise describeConnectionsAsync(array $args = [])
37
+ * @method \Aws\Result describeConnectionsOnInterconnect(array $args = [])
38
+ * @method \GuzzleHttp\Promise\Promise describeConnectionsOnInterconnectAsync(array $args = [])
39
+ * @method \Aws\Result describeInterconnects(array $args = [])
40
+ * @method \GuzzleHttp\Promise\Promise describeInterconnectsAsync(array $args = [])
41
+ * @method \Aws\Result describeLocations(array $args = [])
42
+ * @method \GuzzleHttp\Promise\Promise describeLocationsAsync(array $args = [])
43
+ * @method \Aws\Result describeVirtualGateways(array $args = [])
44
+ * @method \GuzzleHttp\Promise\Promise describeVirtualGatewaysAsync(array $args = [])
45
+ * @method \Aws\Result describeVirtualInterfaces(array $args = [])
46
+ * @method \GuzzleHttp\Promise\Promise describeVirtualInterfacesAsync(array $args = [])
47
+ */
48
+ class DirectConnectClient extends AwsClient {}
vendor/aannnaa7/aws-sdk-php-minimized/src/DirectConnect/Exception/DirectConnectException.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\DirectConnect\Exception;
3
+
4
+ use Aws\Exception\AwsException;
5
+
6
+ /**
7
+ * Represents an error interacting with the AWS Direct Connect service.
8
+ */
9
+ class DirectConnectException extends AwsException {}
vendor/aannnaa7/aws-sdk-php-minimized/src/DirectoryService/DirectoryServiceClient.php ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\DirectoryService;
3
+
4
+ use Aws\AwsClient;
5
+
6
+ /**
7
+ * AWS Directory Service client
8
+ *
9
+ * @method \Aws\Result connectDirectory(array $args = [])
10
+ * @method \GuzzleHttp\Promise\Promise connectDirectoryAsync(array $args = [])
11
+ * @method \Aws\Result createAlias(array $args = [])
12
+ * @method \GuzzleHttp\Promise\Promise createAliasAsync(array $args = [])
13
+ * @method \Aws\Result createComputer(array $args = [])
14
+ * @method \GuzzleHttp\Promise\Promise createComputerAsync(array $args = [])
15
+ * @method \Aws\Result createDirectory(array $args = [])
16
+ * @method \GuzzleHttp\Promise\Promise createDirectoryAsync(array $args = [])
17
+ * @method \Aws\Result createSnapshot(array $args = [])
18
+ * @method \GuzzleHttp\Promise\Promise createSnapshotAsync(array $args = [])
19
+ * @method \Aws\Result deleteDirectory(array $args = [])
20
+ * @method \GuzzleHttp\Promise\Promise deleteDirectoryAsync(array $args = [])
21
+ * @method \Aws\Result deleteSnapshot(array $args = [])
22
+ * @method \GuzzleHttp\Promise\Promise deleteSnapshotAsync(array $args = [])
23
+ * @method \Aws\Result describeDirectories(array $args = [])
24
+ * @method \GuzzleHttp\Promise\Promise describeDirectoriesAsync(array $args = [])
25
+ * @method \Aws\Result describeSnapshots(array $args = [])
26
+ * @method \GuzzleHttp\Promise\Promise describeSnapshotsAsync(array $args = [])
27
+ * @method \Aws\Result disableRadius(array $args = [])
28
+ * @method \GuzzleHttp\Promise\Promise disableRadiusAsync(array $args = [])
29
+ * @method \Aws\Result disableSso(array $args = [])
30
+ * @method \GuzzleHttp\Promise\Promise disableSsoAsync(array $args = [])
31
+ * @method \Aws\Result enableRadius(array $args = [])
32
+ * @method \GuzzleHttp\Promise\Promise enableRadiusAsync(array $args = [])
33
+ * @method \Aws\Result enableSso(array $args = [])
34
+ * @method \GuzzleHttp\Promise\Promise enableSsoAsync(array $args = [])
35
+ * @method \Aws\Result getDirectoryLimits(array $args = [])
36
+ * @method \GuzzleHttp\Promise\Promise getDirectoryLimitsAsync(array $args = [])
37
+ * @method \Aws\Result getSnapshotLimits(array $args = [])
38
+ * @method \GuzzleHttp\Promise\Promise getSnapshotLimitsAsync(array $args = [])
39
+ * @method \Aws\Result restoreFromSnapshot(array $args = [])
40
+ * @method \GuzzleHttp\Promise\Promise restoreFromSnapshotAsync(array $args = [])
41
+ * @method \Aws\Result updateRadius(array $args = [])
42
+ * @method \GuzzleHttp\Promise\Promise updateRadiusAsync(array $args = [])
43
+ */
44
+ class DirectoryServiceClient extends AwsClient {}
vendor/aannnaa7/aws-sdk-php-minimized/src/DirectoryService/Exception/DirectoryServiceException.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\DirectoryService\Exception;
3
+
4
+ use Aws\Exception\AwsException;
5
+
6
+ /**
7
+ * AWS Directory Service Exception
8
+ */
9
+ class DirectoryServiceException extends AwsException {}
vendor/aannnaa7/aws-sdk-php-minimized/src/DoctrineCacheAdapter.php ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws;
3
+
4
+ use Doctrine\Common\Cache\Cache;
5
+
6
+ class DoctrineCacheAdapter implements CacheInterface, Cache
7
+ {
8
+ /** @var Cache */
9
+ private $cache;
10
+
11
+ public function __construct(Cache $cache)
12
+ {
13
+ $this->cache = $cache;
14
+ }
15
+
16
+ public function get($key)
17
+ {
18
+ return $this->cache->fetch($key);
19
+ }
20
+
21
+ public function fetch($key)
22
+ {
23
+ return $this->get($key);
24
+ }
25
+
26
+ public function set($key, $value, $ttl = 0)
27
+ {
28
+ return $this->cache->save($key, $value, $ttl);
29
+ }
30
+
31
+ public function save($key, $value, $ttl = 0)
32
+ {
33
+ return $this->set($key, $value, $ttl);
34
+ }
35
+
36
+ public function remove($key)
37
+ {
38
+ return $this->cache->delete($key);
39
+ }
40
+
41
+ public function delete($key)
42
+ {
43
+ return $this->remove($key);
44
+ }
45
+
46
+ public function contains($key)
47
+ {
48
+ return $this->cache->contains($key);
49
+ }
50
+
51
+ public function getStats()
52
+ {
53
+ return $this->cache->getStats();
54
+ }
55
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/DynamoDb/BinaryValue.php ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\DynamoDb;
3
+
4
+ use GuzzleHttp\Psr7;
5
+
6
+ /**
7
+ * Special object to represent a DynamoDB binary (B) value.
8
+ */
9
+ class BinaryValue implements \JsonSerializable
10
+ {
11
+ /** @var string Binary value. */
12
+ private $value;
13
+
14
+ /**
15
+ * @param mixed $value A binary value compatible with Guzzle streams.
16
+ *
17
+ * @see GuzzleHttp\Stream\Stream::factory
18
+ */
19
+ public function __construct($value)
20
+ {
21
+ if (!is_string($value)) {
22
+ $value = Psr7\stream_for($value);
23
+ }
24
+ $this->value = (string) $value;
25
+ }
26
+
27
+ public function jsonSerialize()
28
+ {
29
+ return $this->value;
30
+ }
31
+
32
+ public function __toString()
33
+ {
34
+ return $this->value;
35
+ }
36
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/DynamoDb/DynamoDbClient.php ADDED
@@ -0,0 +1,95 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\DynamoDb;
3
+
4
+ use Aws\Api\Parser\Crc32ValidatingParser;
5
+ use Aws\AwsClient;
6
+ use Aws\ClientResolver;
7
+ use Aws\HandlerList;
8
+ use Aws\Middleware;
9
+ use Aws\RetryMiddleware;
10
+
11
+ /**
12
+ * This client is used to interact with the **Amazon DynamoDB** service.
13
+ *
14
+ * @method \Aws\Result batchGetItem(array $args = [])
15
+ * @method \GuzzleHttp\Promise\Promise batchGetItemAsync(array $args = [])
16
+ * @method \Aws\Result batchWriteItem(array $args = [])
17
+ * @method \GuzzleHttp\Promise\Promise batchWriteItemAsync(array $args = [])
18
+ * @method \Aws\Result createTable(array $args = [])
19
+ * @method \GuzzleHttp\Promise\Promise createTableAsync(array $args = [])
20
+ * @method \Aws\Result deleteItem(array $args = [])
21
+ * @method \GuzzleHttp\Promise\Promise deleteItemAsync(array $args = [])
22
+ * @method \Aws\Result deleteTable(array $args = [])
23
+ * @method \GuzzleHttp\Promise\Promise deleteTableAsync(array $args = [])
24
+ * @method \Aws\Result describeTable(array $args = [])
25
+ * @method \GuzzleHttp\Promise\Promise describeTableAsync(array $args = [])
26
+ * @method \Aws\Result getItem(array $args = [])
27
+ * @method \GuzzleHttp\Promise\Promise getItemAsync(array $args = [])
28
+ * @method \Aws\Result listTables(array $args = [])
29
+ * @method \GuzzleHttp\Promise\Promise listTablesAsync(array $args = [])
30
+ * @method \Aws\Result putItem(array $args = [])
31
+ * @method \GuzzleHttp\Promise\Promise putItemAsync(array $args = [])
32
+ * @method \Aws\Result query(array $args = [])
33
+ * @method \GuzzleHttp\Promise\Promise queryAsync(array $args = [])
34
+ * @method \Aws\Result scan(array $args = [])
35
+ * @method \GuzzleHttp\Promise\Promise scanAsync(array $args = [])
36
+ * @method \Aws\Result updateItem(array $args = [])
37
+ * @method \GuzzleHttp\Promise\Promise updateItemAsync(array $args = [])
38
+ * @method \Aws\Result updateTable(array $args = [])
39
+ * @method \GuzzleHttp\Promise\Promise updateTableAsync(array $args = [])
40
+ */
41
+ class DynamoDbClient extends AwsClient
42
+ {
43
+ public static function getArguments()
44
+ {
45
+ $args = parent::getArguments();
46
+ $args['retries']['default'] = 11;
47
+ $args['retries']['fn'] = [__CLASS__, '_applyRetryConfig'];
48
+ $args['api_provider']['fn'] = [__CLASS__, '_applyApiProvider'];
49
+
50
+ return $args;
51
+ }
52
+
53
+ /**
54
+ * Convenience method for instantiating and registering the DynamoDB
55
+ * Session handler with this DynamoDB client object.
56
+ *
57
+ * @param array $config Array of options for the session handler factory
58
+ *
59
+ * @return SessionHandler
60
+ */
61
+ public function registerSessionHandler(array $config = [])
62
+ {
63
+ $handler = SessionHandler::fromClient($this, $config);
64
+ $handler->register();
65
+
66
+ return $handler;
67
+ }
68
+
69
+ /** @internal */
70
+ public static function _applyRetryConfig($value, array &$args, HandlerList $list)
71
+ {
72
+ if (!$value) {
73
+ return;
74
+ }
75
+
76
+ $list->appendSign(
77
+ Middleware::retry(
78
+ RetryMiddleware::createDefaultDecider($value),
79
+ function ($retries) {
80
+ return $retries
81
+ ? (50 * (int) pow(2, $retries - 1)) / 1000
82
+ : 0;
83
+ }
84
+ ),
85
+ 'retry'
86
+ );
87
+ }
88
+
89
+ /** @internal */
90
+ public static function _applyApiProvider($value, array &$args, HandlerList $list)
91
+ {
92
+ ClientResolver::_apply_api_provider($value, $args, $list);
93
+ $args['parser'] = new Crc32ValidatingParser($args['parser']);
94
+ }
95
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/DynamoDb/Exception/DynamoDbException.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\DynamoDb\Exception;
3
+
4
+ use Aws\Exception\AwsException;
5
+
6
+ /**
7
+ * Represents an error interacting with the Amazon DynamoDB service.
8
+ */
9
+ class DynamoDbException extends AwsException {}
vendor/aannnaa7/aws-sdk-php-minimized/src/DynamoDb/LockingSessionConnection.php ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\DynamoDb;
3
+
4
+ use Aws\DynamoDb\Exception\DynamoDbException;
5
+
6
+ /**
7
+ * The locking connection adds locking logic to the read operation.
8
+ */
9
+ class LockingSessionConnection extends StandardSessionConnection
10
+ {
11
+ public function __construct(DynamoDbClient $client, array $config = [])
12
+ {
13
+ parent::__construct($client, $config + [
14
+ 'max_lock_wait_time' => 10,
15
+ 'min_lock_retry_microtime' => 10000,
16
+ 'max_lock_retry_microtime' => 50000,
17
+ ]);
18
+ }
19
+
20
+ /**
21
+ * {@inheritdoc}
22
+ * Retries the request until the lock can be acquired
23
+ */
24
+ public function read($id)
25
+ {
26
+ // Create the params for the UpdateItem operation so that a lock can be
27
+ // set and item returned (via ReturnValues) in a one, atomic operation.
28
+ $params = [
29
+ 'TableName' => $this->config['table_name'],
30
+ 'Key' => $this->formatKey($id),
31
+ 'Expected' => ['lock' => ['Exists' => false]],
32
+ 'AttributeUpdates' => ['lock' => ['Value' => ['N' => '1']]],
33
+ 'ReturnValues' => 'ALL_NEW',
34
+ ];
35
+
36
+ // Acquire the lock and fetch the item data.
37
+ $timeout = time() + $this->config['max_lock_wait_time'];
38
+ while (true) {
39
+ try {
40
+ $item = [];
41
+ $result = $this->client->updateItem($params);
42
+ if (isset($result['Attributes'])) {
43
+ foreach ($result['Attributes'] as $key => $value) {
44
+ $item[$key] = current($value);
45
+ }
46
+ }
47
+ return $item;
48
+ } catch (DynamoDbException $e) {
49
+ if ($e->getAwsErrorCode() === 'ConditionalCheckFailedException'
50
+ && time() < $timeout
51
+ ) {
52
+ usleep(pow(10, -6) * rand(
53
+ $this->config['min_lock_retry_microtime'],
54
+ $this->config['max_lock_retry_microtime']
55
+ ));
56
+ } else {
57
+ break;
58
+ }
59
+ }
60
+ }
61
+ }
62
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/DynamoDb/Marshaler.php ADDED
@@ -0,0 +1,320 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\DynamoDb;
3
+
4
+ use Psr\Http\Message\StreamInterface;
5
+
6
+ /**
7
+ * Marshals and unmarshals JSON documents and PHP arrays into DynamoDB items.
8
+ */
9
+ class Marshaler
10
+ {
11
+ /** @var array Default options to merge into provided options. */
12
+ private static $defaultOptions = [
13
+ 'ignore_invalid' => false,
14
+ 'nullify_invalid' => false,
15
+ 'wrap_numbers' => false,
16
+ ];
17
+
18
+ /** @var array Marshaler options. */
19
+ private $options;
20
+
21
+ /**
22
+ * Instantiates a DynamoDB Marshaler.
23
+ *
24
+ * The following options are valid.
25
+ *
26
+ * - ignore_invalid: (bool) Set to `true` if invalid values should be
27
+ * ignored (i.e., not included) during marshaling.
28
+ * - nullify_invalid: (bool) Set to `true` if invalid values should be set
29
+ * to null.
30
+ * - wrap_numbers: (bool) Set to `true` to wrap numbers with `NumberValue`
31
+ * objects during unmarshaling to preserve the precision.
32
+ *
33
+ * @param array $options Marshaler options
34
+ */
35
+ public function __construct(array $options = [])
36
+ {
37
+ $this->options = $options + self::$defaultOptions;
38
+ }
39
+
40
+ /**
41
+ * Creates a special object to represent a DynamoDB binary (B) value.
42
+ *
43
+ * This helps disambiguate binary values from string (S) values.
44
+ *
45
+ * @param mixed $value A binary value compatible with Guzzle streams.
46
+ *
47
+ * @return BinaryValue
48
+ * @see GuzzleHttp\Stream\Stream::factory
49
+ */
50
+ public function binary($value)
51
+ {
52
+ return new BinaryValue($value);
53
+ }
54
+
55
+ /**
56
+ * Creates a special object to represent a DynamoDB number (N) value.
57
+ *
58
+ * This helps maintain the precision of large integer/float in PHP.
59
+ *
60
+ * @param string|int|float $value A number value.
61
+ *
62
+ * @return NumberValue
63
+ */
64
+ public function number($value)
65
+ {
66
+ return new NumberValue($value);
67
+ }
68
+
69
+ /**
70
+ * Creates a special object to represent a DynamoDB set (SS/NS/BS) value.
71
+ *
72
+ * This helps disambiguate set values from list (L) values.
73
+ *
74
+ * @param array $values The values of the set.
75
+ *
76
+ * @return SetValue
77
+ *
78
+ */
79
+ public function set(array $values)
80
+ {
81
+ return new SetValue($values);
82
+ }
83
+
84
+ /**
85
+ * Marshal a JSON document from a string to a DynamoDB item.
86
+ *
87
+ * The result is an array formatted in the proper parameter structure
88
+ * required by the DynamoDB API for items.
89
+ *
90
+ * @param string $json A valid JSON document.
91
+ *
92
+ * @return array Item formatted for DynamoDB.
93
+ * @throws \InvalidArgumentException if the JSON is invalid.
94
+ */
95
+ public function marshalJson($json)
96
+ {
97
+ $data = json_decode($json);
98
+ if (!($data instanceof \stdClass)) {
99
+ throw new \InvalidArgumentException(
100
+ 'The JSON document must be valid and be an object at its root.'
101
+ );
102
+ }
103
+
104
+ return current($this->marshalValue($data));
105
+ }
106
+
107
+ /**
108
+ * Marshal a native PHP array of data to a DynamoDB item.
109
+ *
110
+ * The result is an array formatted in the proper parameter structure
111
+ * required by the DynamoDB API for items.
112
+ *
113
+ * @param array|\stdClass $item An associative array of data.
114
+ *
115
+ * @return array Item formatted for DynamoDB.
116
+ */
117
+ public function marshalItem($item)
118
+ {
119
+ return current($this->marshalValue($item));
120
+ }
121
+
122
+ /**
123
+ * Marshal a native PHP value into a DynamoDB attribute value.
124
+ *
125
+ * The result is an associative array that is formatted in the proper
126
+ * `[TYPE => VALUE]` parameter structure required by the DynamoDB API.
127
+ *
128
+ * @param mixed $value A scalar, array, or `stdClass` value.
129
+ *
130
+ * @return array Attribute formatted for DynamoDB.
131
+ * @throws \UnexpectedValueException if the value cannot be marshaled.
132
+ */
133
+ public function marshalValue($value)
134
+ {
135
+ $type = gettype($value);
136
+
137
+ // Handle string values.
138
+ if ($type === 'string') {
139
+ if ($value === '') {
140
+ return $this->handleInvalid('empty strings are invalid');
141
+ }
142
+
143
+ return ['S' => $value];
144
+ }
145
+
146
+ // Handle number values.
147
+ if ($type === 'integer'
148
+ || $type === 'double'
149
+ || $value instanceof NumberValue
150
+ ) {
151
+ return ['N' => (string) $value];
152
+ }
153
+
154
+ // Handle boolean values.
155
+ if ($type === 'boolean') {
156
+ return ['BOOL' => $value];
157
+ }
158
+
159
+ // Handle null values.
160
+ if ($type === 'NULL') {
161
+ return ['NULL' => true];
162
+ }
163
+
164
+ // Handle set values.
165
+ if ($value instanceof SetValue) {
166
+ if (count($value) === 0) {
167
+ return $this->handleInvalid('empty sets are invalid');
168
+ }
169
+ $previousType = null;
170
+ $data = [];
171
+ foreach ($value as $v) {
172
+ $marshaled = $this->marshalValue($v);
173
+ $setType = key($marshaled);
174
+ if (!$previousType) {
175
+ $previousType = $setType;
176
+ } elseif ($setType !== $previousType) {
177
+ return $this->handleInvalid('sets must be uniform in type');
178
+ }
179
+ $data[] = current($marshaled);
180
+ }
181
+
182
+ return [$previousType . 'S' => array_unique($data)];
183
+ }
184
+
185
+ // Handle list and map values.
186
+ $dbType = 'L';
187
+ if ($value instanceof \stdClass) {
188
+ $type = 'array';
189
+ $dbType = 'M';
190
+ }
191
+ if ($type === 'array' || $value instanceof \Traversable) {
192
+ $data = [];
193
+ $index = 0;
194
+ foreach ($value as $k => $v) {
195
+ if ($v = $this->marshalValue($v)) {
196
+ $data[$k] = $v;
197
+ if ($dbType === 'L' && (!is_int($k) || $k != $index++)) {
198
+ $dbType = 'M';
199
+ }
200
+ }
201
+ }
202
+ return [$dbType => $data];
203
+ }
204
+
205
+ // Handle binary values.
206
+ if (is_resource($value) || $value instanceof StreamInterface) {
207
+ $value = $this->binary($value);
208
+ }
209
+ if ($value instanceof BinaryValue) {
210
+ return ['B' => (string) $value];
211
+ }
212
+
213
+ // Handle invalid values.
214
+ return $this->handleInvalid('encountered unexpected value');
215
+ }
216
+
217
+ /**
218
+ * Unmarshal a document (item) from a DynamoDB operation result into a JSON
219
+ * document string.
220
+ *
221
+ * @param array $data Item/document from a DynamoDB result.
222
+ * @param int $jsonEncodeFlags Flags to use with `json_encode()`.
223
+ *
224
+ * @return string
225
+ */
226
+ public function unmarshalJson(array $data, $jsonEncodeFlags = 0)
227
+ {
228
+ return json_encode(
229
+ $this->unmarshalValue(['M' => $data], true),
230
+ $jsonEncodeFlags
231
+ );
232
+ }
233
+
234
+ /**
235
+ * Unmarshal an item from a DynamoDB operation result into a native PHP
236
+ * array. If you set $mapAsObject to true, then a stdClass value will be
237
+ * returned instead.
238
+ *
239
+ * @param array $data Item from a DynamoDB result.
240
+ *
241
+ * @return array|\stdClass
242
+ */
243
+ public function unmarshalItem(array $data)
244
+ {
245
+ return $this->unmarshalValue(['M' => $data]);
246
+ }
247
+
248
+ /**
249
+ * Unmarshal a value from a DynamoDB operation result into a native PHP
250
+ * value. Will return a scalar, array, or (if you set $mapAsObject to true)
251
+ * stdClass value.
252
+ *
253
+ * @param array $value Value from a DynamoDB result.
254
+ * @param bool $mapAsObject Whether maps should be represented as stdClass.
255
+ *
256
+ * @return mixed
257
+ * @throws \UnexpectedValueException
258
+ */
259
+ public function unmarshalValue(array $value, $mapAsObject = false)
260
+ {
261
+ list($type, $value) = each($value);
262
+ switch ($type) {
263
+ case 'S':
264
+ case 'BOOL':
265
+ return $value;
266
+ case 'NULL':
267
+ return null;
268
+ case 'N':
269
+ if ($this->options['wrap_numbers']) {
270
+ return new NumberValue($value);
271
+ } else {
272
+ // Use type coercion to unmarshal numbers to int/float.
273
+ return $value + 0;
274
+ }
275
+ case 'M':
276
+ if ($mapAsObject) {
277
+ $data = new \stdClass;
278
+ foreach ($value as $k => $v) {
279
+ $data->$k = $this->unmarshalValue($v, $mapAsObject);
280
+ }
281
+ return $data;
282
+ }
283
+ // NOBREAK: Unmarshal M the same way as L, for arrays.
284
+ case 'L':
285
+ foreach ($value as &$v) {
286
+ $v = $this->unmarshalValue($v, $mapAsObject);
287
+ }
288
+ return $value;
289
+ case 'B':
290
+ return new BinaryValue($value);
291
+ case 'SS':
292
+ case 'NS':
293
+ case 'BS':
294
+ foreach ($value as &$v) {
295
+ $v = $this->unmarshalValue([$type[0] => $v]);
296
+ }
297
+ return new SetValue($value);
298
+ }
299
+
300
+ throw new \UnexpectedValueException("Unexpected type: {$type}.");
301
+ }
302
+
303
+ /**
304
+ * Handle invalid value based on marshaler configuration.
305
+ *
306
+ * @param string $message Error message
307
+ *
308
+ * @return array|null
309
+ */
310
+ private function handleInvalid($message)
311
+ {
312
+ if ($this->options['ignore_invalid']) {
313
+ return null;
314
+ } elseif ($this->options['nullify_invalid']) {
315
+ return ['NULL' => true];
316
+ }
317
+
318
+ throw new \UnexpectedValueException("Marshaling error: {$message}.");
319
+ }
320
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/DynamoDb/NumberValue.php ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\DynamoDb;
3
+
4
+ /**
5
+ * Special object to represent a DynamoDB Number (N) value.
6
+ */
7
+ class NumberValue implements \JsonSerializable
8
+ {
9
+ /** @var string Number value. */
10
+ private $value;
11
+
12
+ /**
13
+ * @param string|int|float $value A number value.
14
+ */
15
+ public function __construct($value)
16
+ {
17
+ $this->value = (string) $value;
18
+ }
19
+
20
+ public function jsonSerialize()
21
+ {
22
+ return $this->value;
23
+ }
24
+
25
+ public function __toString()
26
+ {
27
+ return $this->value;
28
+ }
29
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/DynamoDb/SessionConnectionInterface.php ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\DynamoDb;
3
+
4
+ /**
5
+ * The session connection provides the underlying logic for interacting with
6
+ * Amazon DynamoDB and performs all of the reading and writing operations.
7
+ */
8
+ interface SessionConnectionInterface
9
+ {
10
+ /**
11
+ * Reads session data from DynamoDB
12
+ *
13
+ * @param string $id Session ID
14
+ *
15
+ * @return array
16
+ */
17
+ public function read($id);
18
+
19
+ /**
20
+ * Writes session data to DynamoDB
21
+ *
22
+ * @param string $id Session ID
23
+ * @param string $data Serialized session data
24
+ * @param bool $isChanged Whether or not the data has changed
25
+ *
26
+ * @return bool
27
+ */
28
+ public function write($id, $data, $isChanged);
29
+
30
+ /**
31
+ * Deletes session record from DynamoDB
32
+ *
33
+ * @param string $id Session ID
34
+ *
35
+ * @return bool
36
+ */
37
+ public function delete($id);
38
+
39
+ /**
40
+ * Performs garbage collection on the sessions stored in the DynamoDB
41
+ *
42
+ * @return bool
43
+ */
44
+ public function deleteExpired();
45
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/DynamoDb/SessionHandler.php ADDED
@@ -0,0 +1,226 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\DynamoDb;
3
+
4
+ /**
5
+ * Provides an interface for using Amazon DynamoDB as a session store by hooking
6
+ * into PHP's session handler hooks. Once registered, You may use the native
7
+ * `$_SESSION` superglobal and session functions, and the sessions will be
8
+ * stored automatically in DynamoDB. DynamoDB is a great session storage
9
+ * solution due to its speed, scalability, and fault tolerance.
10
+ *
11
+ * For maximum performance, we recommend that you keep the size of your sessions
12
+ * small. Locking is disabled by default, since it can drive up latencies and
13
+ * costs under high traffic. Only turn it on if you need it.
14
+ *
15
+ * By far, the most expensive operation is garbage collection. Therefore, we
16
+ * encourage you to carefully consider your session garbage collection strategy.
17
+ * Note: the DynamoDB Session Handler does not allow garbage collection to be
18
+ * triggered randomly. You must run garbage collection manually or through other
19
+ * automated means using a cron job or similar scheduling technique.
20
+ */
21
+ class SessionHandler implements \SessionHandlerInterface
22
+ {
23
+ /** @var SessionConnectionInterface Session save logic.*/
24
+ private $connection;
25
+
26
+ /** @var string Session save path. */
27
+ private $savePath;
28
+
29
+ /** @var string Session name. */
30
+ private $sessionName;
31
+
32
+ /** @var string Stores serialized data for tracking changes. */
33
+ private $dataRead;
34
+
35
+ /** @var string Keeps track of the open session's ID. */
36
+ private $openSessionId;
37
+
38
+ /** @var bool Keeps track of whether the session has been written. */
39
+ private $sessionWritten;
40
+
41
+ /**
42
+ * Creates a new DynamoDB Session Handler.
43
+ *
44
+ * The configuration array accepts the following array keys and values:
45
+ * - table_name: Name of table to store the sessions.
46
+ * - hash_key: Name of hash key in table. Default: "id".
47
+ * - session_lifetime: Lifetime of inactive sessions expiration.
48
+ * - consistent_read: Whether or not to use consistent reads.
49
+ * - batch_config: Batch options used for garbage collection.
50
+ * - locking: Whether or not to use session locking.
51
+ * - max_lock_wait_time: Max time (s) to wait for lock acquisition.
52
+ * - min_lock_retry_microtime: Min time (µs) to wait between lock attempts.
53
+ * - max_lock_retry_microtime: Max time (µs) to wait between lock attempts.
54
+ *
55
+ * @param DynamoDbClient $client Client for doing DynamoDB operations
56
+ * @param array $config Configuration for the Session Handler
57
+ *
58
+ * @return SessionHandler
59
+ */
60
+ public static function fromClient(DynamoDbClient $client, array $config = [])
61
+ {
62
+ $config += ['locking' => false];
63
+ if ($config['locking']) {
64
+ $connection = new LockingSessionConnection($client, $config);
65
+ } else {
66
+ $connection = new StandardSessionConnection($client, $config);
67
+ }
68
+
69
+ return new static($connection);
70
+ }
71
+
72
+ /**
73
+ * @param SessionConnectionInterface $connection
74
+ */
75
+ public function __construct(SessionConnectionInterface $connection)
76
+ {
77
+ $this->connection = $connection;
78
+ }
79
+
80
+ /**
81
+ * Register the DynamoDB session handler.
82
+ *
83
+ * @return bool Whether or not the handler was registered.
84
+ * @codeCoverageIgnore
85
+ */
86
+ public function register()
87
+ {
88
+ return session_set_save_handler($this, true);
89
+ }
90
+
91
+ /**
92
+ * Open a session for writing. Triggered by session_start().
93
+ *
94
+ * @param string $savePath Session save path.
95
+ * @param string $sessionName Session name.
96
+ *
97
+ * @return bool Whether or not the operation succeeded.
98
+ */
99
+ public function open($savePath, $sessionName)
100
+ {
101
+ $this->savePath = $savePath;
102
+ $this->sessionName = $sessionName;
103
+ $this->openSessionId = session_id();
104
+
105
+ return (bool) $this->openSessionId;
106
+ }
107
+
108
+ /**
109
+ * Close a session from writing.
110
+ *
111
+ * @return bool Success
112
+ */
113
+ public function close()
114
+ {
115
+ // Make sure the session is unlocked and the expiration time is updated,
116
+ // even if the write did not occur
117
+ if (!$this->sessionWritten) {
118
+ $id = $this->formatId($this->openSessionId);
119
+ $result = $this->connection->write($id, '', false);
120
+ $this->sessionWritten = (bool) $result;
121
+ }
122
+
123
+ $this->openSessionId = null;
124
+
125
+ return $this->sessionWritten;
126
+ }
127
+
128
+ /**
129
+ * Read a session stored in DynamoDB.
130
+ *
131
+ * @param string $id Session ID.
132
+ *
133
+ * @return string Session data.
134
+ */
135
+ public function read($id)
136
+ {
137
+ // PHP expects an empty string to be returned from this method if no
138
+ // data is retrieved
139
+ $this->dataRead = '';
140
+
141
+ // Get session data using the selected locking strategy
142
+ $item = $this->connection->read($this->formatId($id));
143
+
144
+ // Return the data if it is not expired. If it is expired, remove it
145
+ if (isset($item['expires']) && isset($item['data'])) {
146
+ $this->dataRead = $item['data'];
147
+ if ($item['expires'] <= time()) {
148
+ $this->dataRead = '';
149
+ $this->destroy($id);
150
+ }
151
+ }
152
+
153
+ return $this->dataRead;
154
+ }
155
+
156
+ /**
157
+ * Write a session to DynamoDB.
158
+ *
159
+ * @param string $id Session ID.
160
+ * @param string $data Serialized session data to write.
161
+ *
162
+ * @return bool Whether or not the operation succeeded.
163
+ */
164
+ public function write($id, $data)
165
+ {
166
+ // Write the session data using the selected locking strategy
167
+ $this->sessionWritten = $this->connection->write(
168
+ $this->formatId($id),
169
+ $data,
170
+ ($data !== $this->dataRead)
171
+ );
172
+
173
+ return $this->sessionWritten;
174
+ }
175
+
176
+ /**
177
+ * Delete a session stored in DynamoDB.
178
+ *
179
+ * @param string $id Session ID.
180
+ *
181
+ * @return bool Whether or not the operation succeeded.
182
+ */
183
+ public function destroy($id)
184
+ {
185
+ // Delete the session data using the selected locking strategy
186
+ $this->sessionWritten = $this->connection->delete($this->formatId($id));
187
+
188
+ return $this->sessionWritten;
189
+ }
190
+
191
+ /**
192
+ * Satisfies the session handler interface, but does nothing. To do garbage
193
+ * collection, you must manually call the garbageCollect() method.
194
+ *
195
+ * @param int $maxLifetime Ignored.
196
+ *
197
+ * @return bool Whether or not the operation succeeded.
198
+ * @codeCoverageIgnore
199
+ */
200
+ public function gc($maxLifetime)
201
+ {
202
+ // Garbage collection for a DynamoDB table must be triggered manually.
203
+ return true;
204
+ }
205
+
206
+ /**
207
+ * Triggers garbage collection on expired sessions.
208
+ * @codeCoverageIgnore
209
+ */
210
+ public function garbageCollect()
211
+ {
212
+ $this->connection->deleteExpired();
213
+ }
214
+
215
+ /**
216
+ * Prepend the session ID with the session name.
217
+ *
218
+ * @param string $id The session ID.
219
+ *
220
+ * @return string Prepared session ID.
221
+ */
222
+ private function formatId($id)
223
+ {
224
+ return trim($this->sessionName . '_' . $id, '_');
225
+ }
226
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/DynamoDb/SetValue.php ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\DynamoDb;
3
+
4
+ /**
5
+ * Special object to represent a DynamoDB set (SS/NS/BS) value.
6
+ */
7
+ class SetValue implements \JsonSerializable, \Countable, \IteratorAggregate
8
+ {
9
+ /** @var array Values in the set as provided. */
10
+ private $values;
11
+
12
+ /**
13
+ * @param array $values Values in the set.
14
+ */
15
+ public function __construct(array $values)
16
+ {
17
+ $this->values = $values;
18
+ }
19
+
20
+ /**
21
+ * Get the values formatted for PHP and JSON.
22
+ *
23
+ * @return array
24
+ */
25
+ public function toArray()
26
+ {
27
+ return $this->values;
28
+ }
29
+
30
+ public function count()
31
+ {
32
+ return count($this->values);
33
+ }
34
+
35
+ public function getIterator()
36
+ {
37
+ return new \ArrayIterator($this->values);
38
+ }
39
+
40
+ public function jsonSerialize()
41
+ {
42
+ return $this->toArray();
43
+ }
44
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/DynamoDb/StandardSessionConnection.php ADDED
@@ -0,0 +1,137 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\DynamoDb;
3
+
4
+ use Aws\DynamoDb\Exception\DynamoDbException;
5
+
6
+ /**
7
+ * The standard connection performs the read and write operations to DynamoDB.
8
+ */
9
+ class StandardSessionConnection implements SessionConnectionInterface
10
+ {
11
+ /** @var DynamoDbClient The DynamoDB client */
12
+ protected $client;
13
+
14
+ /** @var array The session handler config options */
15
+ protected $config;
16
+
17
+ /**
18
+ * @param DynamoDbClient $client DynamoDB client
19
+ * @param array $config Session handler config
20
+ */
21
+ public function __construct(DynamoDbClient $client, array $config = [])
22
+ {
23
+ $this->client = $client;
24
+ $this->config = $config + [
25
+ 'table_name' => 'sessions',
26
+ 'hash_key' => 'id',
27
+ 'session_lifetime' => (int) ini_get('session.gc_maxlifetime'),
28
+ 'consistent_read' => true,
29
+ 'batch_config' => [],
30
+ ];
31
+ }
32
+
33
+ public function read($id)
34
+ {
35
+ $item = [];
36
+ try {
37
+ // Execute a GetItem command to retrieve the item.
38
+ $result = $this->client->getItem([
39
+ 'TableName' => $this->config['table_name'],
40
+ 'Key' => $this->formatKey($id),
41
+ 'ConsistentRead' => (bool) $this->config['consistent_read'],
42
+ ]);
43
+
44
+ // Get the item values
45
+ $result = isset($result['Item']) ? $result['Item'] : [];
46
+ foreach ($result as $key => $value) {
47
+ $item[$key] = current($value);
48
+ }
49
+ } catch (DynamoDbException $e) {
50
+ // Could not retrieve item, so return nothing.
51
+ }
52
+
53
+ return $item;
54
+ }
55
+
56
+ public function write($id, $data, $isChanged)
57
+ {
58
+ // Prepare the attributes
59
+ $expires = time() + $this->config['session_lifetime'];
60
+ $attributes = [
61
+ 'expires' => ['Value' => ['N' => (string) $expires]],
62
+ 'lock' => ['Action' => 'DELETE'],
63
+ ];
64
+ if ($isChanged) {
65
+ if ($data != '') {
66
+ $attributes['data'] = ['Value' => ['S' => $data]];
67
+ } else {
68
+ $attributes['data'] = ['Action' => 'DELETE'];
69
+ }
70
+ }
71
+
72
+ // Perform the UpdateItem command
73
+ try {
74
+ return (bool) $this->client->updateItem([
75
+ 'TableName' => $this->config['table_name'],
76
+ 'Key' => $this->formatKey($id),
77
+ 'AttributeUpdates' => $attributes,
78
+ ]);
79
+ } catch (DynamoDbException $e) {
80
+ return false;
81
+ }
82
+ }
83
+
84
+ public function delete($id)
85
+ {
86
+ try {
87
+ return (bool) $this->client->deleteItem([
88
+ 'TableName' => $this->config['table_name'],
89
+ 'Key' => $this->formatKey($id),
90
+ ]);
91
+ } catch (DynamoDbException $e) {
92
+ return false;
93
+ }
94
+ }
95
+
96
+ public function deleteExpired()
97
+ {
98
+ // Create a Scan iterator for finding expired session items
99
+ $scan = $this->client->getPaginator('Scan', [
100
+ 'TableName' => $this->config['table_name'],
101
+ 'AttributesToGet' => [$this->config['hash_key']],
102
+ 'ScanFilter' => [
103
+ 'expires' => [
104
+ 'ComparisonOperator' => 'LT',
105
+ 'AttributeValueList' => [['N' => (string) time()]],
106
+ ],
107
+ 'lock' => [
108
+ 'ComparisonOperator' => 'NULL',
109
+ ]
110
+ ],
111
+ ]);
112
+
113
+ // Create a WriteRequestBatch for deleting the expired items
114
+ $batch = new WriteRequestBatch($this->client, $this->config['batch_config']);
115
+
116
+ // Perform Scan and BatchWriteItem (delete) operations as needed
117
+ foreach ($scan->search('Items') as $item) {
118
+ $batch->delete(
119
+ [$this->config['hash_key'] => $item[$this->config['hash_key']]],
120
+ $this->config['table_name']
121
+ );
122
+ }
123
+
124
+ // Delete any remaining items that were not auto-flushed
125
+ $batch->flush();
126
+ }
127
+
128
+ /**
129
+ * @param string $key
130
+ *
131
+ * @return array
132
+ */
133
+ protected function formatKey($key)
134
+ {
135
+ return [$this->config['hash_key'] => ['S' => $key]];
136
+ }
137
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/DynamoDb/WriteRequestBatch.php ADDED
@@ -0,0 +1,269 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\DynamoDb;
3
+
4
+ use Aws\AwsClientInterface;
5
+ use Aws\CommandInterface;
6
+ use Aws\CommandPool;
7
+ use Aws\Exception\AwsException;
8
+ use Aws\ResultInterface;
9
+
10
+ /**
11
+ * The WriteRequestBatch is an object that is capable of efficiently sending
12
+ * DynamoDB BatchWriteItem requests from queued up put and delete item requests.
13
+ * requests. The batch attempts to send the requests with the fewest requests
14
+ * to DynamoDB as possible and also re-queues any unprocessed items to ensure
15
+ * that all items are sent.
16
+ */
17
+ class WriteRequestBatch
18
+ {
19
+ /** @var DynamoDbClient DynamoDB client used to perform write operations. */
20
+ private $client;
21
+
22
+ /** @var array Configuration options for the batch. */
23
+ private $config;
24
+
25
+ /** @var array Queue of pending put/delete requests in the batch. */
26
+ private $queue;
27
+
28
+ /**
29
+ * Creates a WriteRequestBatch object that is capable of efficiently sending
30
+ * DynamoDB BatchWriteItem requests from queued up Put and Delete requests.
31
+ *
32
+ * @param DynamoDbClient $client DynamoDB client used to send batches.
33
+ * @param array $config Batch configuration options.
34
+ * - table: (string) DynamoDB table used by the batch, this can be
35
+ * overridden for each individual put() or delete() call.
36
+ * - batch_size: (int) The size of each batch (default: 25). The batch
37
+ * size must be between 2 and 25. If you are sending batches of large
38
+ * items, you may consider lowering the batch size, otherwise, you
39
+ * should use 25.
40
+ * - pool_size: (int) This number dictates how many BatchWriteItem
41
+ * requests you would like to do in parallel. For example, if the
42
+ * "batch_size" is 25, and "pool_size" is 3, then you would send 3
43
+ * BatchWriteItem requests at a time, each with 25 items. Please keep
44
+ * your throughput in mind when choosing the "pool_size" option.
45
+ * - autoflush: (bool) This option allows the batch to automatically
46
+ * flush once there are enough items (i.e., "batch_size" * "pool_size")
47
+ * in the queue. This defaults to true, so you must set this to false
48
+ * to stop autoflush.
49
+ * - before: (callable) Executed before every BatchWriteItem operation.
50
+ * It should accept an \Aws\CommandInterface object as its argument.
51
+ * - error: Executed if an error was encountered executing a,
52
+ * BatchWriteItem operation, otherwise errors are ignored. It should
53
+ * accept an \Aws\Exception\AwsException as its argument.
54
+ *
55
+ * @throws \InvalidArgumentException if the batch size is not between 2 and 25.
56
+ */
57
+ public function __construct(DynamoDbClient $client, array $config = [])
58
+ {
59
+ // Apply defaults
60
+ $config += [
61
+ 'table' => null,
62
+ 'batch_size' => 25,
63
+ 'pool_size' => 1,
64
+ 'autoflush' => true,
65
+ 'before' => null,
66
+ 'error' => null
67
+ ];
68
+
69
+ // Ensure the batch size is valid
70
+ if ($config['batch_size'] > 25 || $config['batch_size'] < 2) {
71
+ throw new \InvalidArgumentException('"batch_size" must be between 2 and 25.');
72
+ }
73
+
74
+ // Ensure the callbacks are valid
75
+ if ($config['before'] && !is_callable($config['before'])) {
76
+ throw new \InvalidArgumentException('"before" must be callable.');
77
+ }
78
+ if ($config['error'] && !is_callable($config['error'])) {
79
+ throw new \InvalidArgumentException('"error" must be callable.');
80
+ }
81
+
82
+ // If autoflush is enabled, set the threshold
83
+ if ($config['autoflush']) {
84
+ $config['threshold'] = $config['batch_size'] * $config['pool_size'];
85
+ }
86
+
87
+ $this->client = $client;
88
+ $this->config = $config;
89
+ $this->queue = [];
90
+ }
91
+
92
+ /**
93
+ * Adds a put item request to the batch.
94
+ *
95
+ * @param array $item Data for an item to put. Format:
96
+ * [
97
+ * 'attribute1' => ['type' => 'value'],
98
+ * 'attribute2' => ['type' => 'value'],
99
+ * ...
100
+ * ]
101
+ * @param string|null $table The name of the table. This must be specified
102
+ * unless the "table" option was provided in the
103
+ * config of the WriteRequestBatch.
104
+ *
105
+ * @return $this
106
+ */
107
+ public function put(array $item, $table = null)
108
+ {
109
+ $this->queue[] = [
110
+ 'table' => $this->determineTable($table),
111
+ 'data' => ['PutRequest' => ['Item' => $item]],
112
+ ];
113
+
114
+ $this->autoFlush();
115
+
116
+ return $this;
117
+ }
118
+
119
+ /**
120
+ * Adds a delete item request to the batch.
121
+ *
122
+ * @param array $key Key of an item to delete. Format:
123
+ * [
124
+ * 'key1' => ['type' => 'value'],
125
+ * ...
126
+ * ]
127
+ * @param string|null $table The name of the table. This must be specified
128
+ * unless the "table" option was provided in the
129
+ * config of the WriteRequestBatch.
130
+ *
131
+ * @return $this
132
+ */
133
+ public function delete(array $key, $table = null)
134
+ {
135
+ $this->queue[] = [
136
+ 'table' => $this->determineTable($table),
137
+ 'data' => ['DeleteRequest' => ['Key' => $key]],
138
+ ];
139
+
140
+ $this->autoFlush();
141
+
142
+ return $this;
143
+ }
144
+
145
+ /**
146
+ * Flushes the batch by combining all the queued put and delete requests
147
+ * into BatchWriteItem commands and executing them. Unprocessed items are
148
+ * automatically re-queued.
149
+ *
150
+ * @param bool $untilEmpty If true, flushing will continue until the queue
151
+ * is completely empty. This will make sure that
152
+ * unprocessed items are all eventually sent.
153
+ *
154
+ * @return $this
155
+ */
156
+ public function flush($untilEmpty = true)
157
+ {
158
+ // Send BatchWriteItem requests until the queue is empty
159
+ $keepFlushing = true;
160
+ while ($this->queue && $keepFlushing) {
161
+ $commands = $this->prepareCommands();
162
+ $pool = new CommandPool($this->client, $commands, [
163
+ 'before' => $this->config['before'],
164
+ 'concurrency' => $this->config['pool_size'],
165
+ 'fulfilled' => function (ResultInterface $result) {
166
+ // Re-queue any unprocessed items
167
+ if ($result->hasKey('UnprocessedItems')) {
168
+ $this->retryUnprocessed($result['UnprocessedItems']);
169
+ }
170
+ },
171
+ 'rejected' => function ($reason) {
172
+ if ($reason instanceof AwsException) {
173
+ $code = $reason->getAwsErrorCode();
174
+ if ($code === 'ProvisionedThroughputExceededException') {
175
+ $this->retryUnprocessed($reason->getCommand()['RequestItems']);
176
+ } elseif (is_callable($this->config['error'])) {
177
+ $this->config['error']($reason);
178
+ }
179
+ }
180
+ }
181
+ ]);
182
+ $pool->promise()->wait();
183
+ $keepFlushing = (bool) $untilEmpty;
184
+ }
185
+
186
+ return $this;
187
+ }
188
+
189
+ /**
190
+ * Creates BatchWriteItem commands from the items in the queue.
191
+ *
192
+ * @return CommandInterface[]
193
+ */
194
+ private function prepareCommands()
195
+ {
196
+ // Chunk the queue into batches
197
+ $batches = array_chunk($this->queue, $this->config['batch_size']);
198
+ $this->queue = [];
199
+
200
+ // Create BatchWriteItem commands for each batch
201
+ $commands = [];
202
+ foreach ($batches as $batch) {
203
+ $requests = [];
204
+ foreach ($batch as $item) {
205
+ if (!isset($requests[$item['table']])) {
206
+ $requests[$item['table']] = [];
207
+ }
208
+ $requests[$item['table']][] = $item['data'];
209
+ }
210
+ $commands[] = $this->client->getCommand(
211
+ 'BatchWriteItem',
212
+ ['RequestItems' => $requests]
213
+ );
214
+ }
215
+
216
+ return $commands;
217
+ }
218
+
219
+ /**
220
+ * Re-queues unprocessed results with the correct data.
221
+ *
222
+ * @param array $unprocessed Unprocessed items from a result.
223
+ */
224
+ private function retryUnprocessed(array $unprocessed)
225
+ {
226
+ foreach ($unprocessed as $table => $requests) {
227
+ foreach ($requests as $request) {
228
+ $this->queue[] = [
229
+ 'table' => $table,
230
+ 'data' => isset($request['PutRequest'])
231
+ ? $request['PutRequest']
232
+ : $request['DeleteRequest']
233
+ ];
234
+ }
235
+ }
236
+ }
237
+
238
+ /**
239
+ * If autoflush is enabled and the threshold is met, flush the batch
240
+ */
241
+ private function autoFlush()
242
+ {
243
+ if ($this->config['autoflush']
244
+ && count($this->queue) >= $this->config['threshold']
245
+ ) {
246
+ // Flush only once. Unprocessed items are handled in a later flush.
247
+ $this->flush(false);
248
+ }
249
+ }
250
+
251
+ /**
252
+ * Determine the table name by looking at what was provided and what the
253
+ * WriteRequestBatch was originally configured with.
254
+ *
255
+ * @param string|null $table The table name.
256
+ *
257
+ * @return string
258
+ * @throws \RuntimeException if there was no table specified.
259
+ */
260
+ private function determineTable($table)
261
+ {
262
+ $table = $table ?: $this->config['table'];
263
+ if (!$table) {
264
+ throw new \RuntimeException('There was no table specified.');
265
+ }
266
+
267
+ return $table;
268
+ }
269
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/DynamoDbStreams/DynamoDbStreamsClient.php ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\DynamoDbStreams;
3
+
4
+ use Aws\AwsClient;
5
+ use Aws\DynamoDb\DynamoDbClient;
6
+
7
+ /**
8
+ * This client is used to interact with the **Amazon DynamoDb Streams** service.
9
+ *
10
+ * @method \Aws\Result describeStream(array $args = [])
11
+ * @method \GuzzleHttp\Promise\Promise describeStreamAsync(array $args = [])
12
+ * @method \Aws\Result getRecords(array $args = [])
13
+ * @method \GuzzleHttp\Promise\Promise getRecordsAsync(array $args = [])
14
+ * @method \Aws\Result getShardIterator(array $args = [])
15
+ * @method \GuzzleHttp\Promise\Promise getShardIteratorAsync(array $args = [])
16
+ * @method \Aws\Result listStreams(array $args = [])
17
+ * @method \GuzzleHttp\Promise\Promise listStreamsAsync(array $args = [])
18
+ */
19
+ class DynamoDbStreamsClient extends AwsClient
20
+ {
21
+ public static function getArguments()
22
+ {
23
+ $args = parent::getArguments();
24
+ $args['retries']['default'] = 11;
25
+ $args['retries']['fn'] = [DynamoDbClient::class, '_applyRetryConfig'];
26
+
27
+ return $args;
28
+ }
29
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/DynamoDbStreams/Exception/DynamoDbStreamsException.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\DynamoDbStreams\Exception;
3
+
4
+ use Aws\Exception\AwsException;
5
+
6
+ /**
7
+ * Represents an error interacting with the Amazon DynamoDB Streams service.
8
+ */
9
+ class DynamoDbStreamsException extends AwsException {}
vendor/aannnaa7/aws-sdk-php-minimized/src/Ec2/CopySnapshotMiddleware.php ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Ec2;
3
+
4
+ use Aws\AwsClientInterface;
5
+ use Aws\Signature\SignatureV4;
6
+ use Aws\Endpoint\EndpointProvider;
7
+ use Aws\CommandInterface;
8
+ use GuzzleHttp\Psr7\Uri;
9
+ use Psr\Http\Message\RequestInterface;
10
+
11
+ /**
12
+ * @internal Adds computed values to the CopySnapshot operation.
13
+ */
14
+ class CopySnapshotMiddleware
15
+ {
16
+ private $client;
17
+ private $endpointProvider;
18
+ private $nextHandler;
19
+
20
+ public static function wrap(AwsClientInterface $client, callable $endpointProvider)
21
+ {
22
+ return function (callable $handler) use ($endpointProvider, $client) {
23
+ $f = new CopySnapshotMiddleware($endpointProvider, $client, $handler);
24
+ return $f;
25
+ };
26
+ }
27
+
28
+ public function __construct(
29
+ callable $endpointProvider,
30
+ AwsClientInterface $client,
31
+ callable $nextHandler
32
+ ) {
33
+ $this->endpointProvider = $endpointProvider;
34
+ $this->client = $client;
35
+ $this->nextHandler = $nextHandler;
36
+ }
37
+
38
+ public function __invoke(CommandInterface $cmd, RequestInterface $request = null)
39
+ {
40
+ if ($cmd->getName() == 'CopySnapshot'
41
+ && (!isset($cmd->__skipCopySnapshot))
42
+ ) {
43
+ $cmd['PresignedUrl'] = $this->createPresignedUrl($this->client, $cmd);
44
+ $cmd['DestinationRegion'] = $this->client->getRegion();
45
+ }
46
+
47
+ $f = $this->nextHandler;
48
+ return $f($cmd, $request);
49
+ }
50
+
51
+ private function createPresignedUrl(
52
+ AwsClientInterface $client,
53
+ CommandInterface $cmd
54
+ ) {
55
+ $newCmd = $client->getCommand('CopySnapshot', $cmd->toArray());
56
+ // Avoid infinite recursion by flagging the new command.
57
+ $newCmd->__skipCopySnapshot = true;
58
+ // Serialize a request for the CopySnapshot operation.
59
+ $request = \Aws\serialize($newCmd);
60
+ // Create the new endpoint for the target endpoint.
61
+ $endpoint = EndpointProvider::resolve($this->endpointProvider, [
62
+ 'region' => $cmd['SourceRegion'],
63
+ 'service' => 'ec2'
64
+ ])['endpoint'];
65
+
66
+ // Set the request to hit the target endpoint.
67
+ $uri = $request->getUri()->withHost((new Uri($endpoint))->getHost());
68
+ $request = $request->withUri($uri);
69
+ // Create a presigned URL for our generated request.
70
+ $signer = new SignatureV4('ec2', $cmd['SourceRegion']);
71
+
72
+ return (string) $signer->presign(
73
+ SignatureV4::convertPostToGet($request),
74
+ $client->getCredentials()->wait(),
75
+ '+1 hour'
76
+ )->getUri();
77
+ }
78
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Ec2/Ec2Client.php ADDED
@@ -0,0 +1,416 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Ec2;
3
+
4
+ use Aws\AwsClient;
5
+ use Aws\Api\Service;
6
+ use Aws\Api\DocModel;
7
+ use Aws\Api\ApiProvider;
8
+
9
+ /**
10
+ * Client used to interact with Amazon EC2.
11
+ *
12
+ * @method \Aws\Result acceptVpcPeeringConnection(array $args = [])
13
+ * @method \GuzzleHttp\Promise\Promise acceptVpcPeeringConnectionAsync(array $args = [])
14
+ * @method \Aws\Result allocateAddress(array $args = [])
15
+ * @method \GuzzleHttp\Promise\Promise allocateAddressAsync(array $args = [])
16
+ * @method \Aws\Result assignPrivateIpAddresses(array $args = [])
17
+ * @method \GuzzleHttp\Promise\Promise assignPrivateIpAddressesAsync(array $args = [])
18
+ * @method \Aws\Result associateAddress(array $args = [])
19
+ * @method \GuzzleHttp\Promise\Promise associateAddressAsync(array $args = [])
20
+ * @method \Aws\Result associateDhcpOptions(array $args = [])
21
+ * @method \GuzzleHttp\Promise\Promise associateDhcpOptionsAsync(array $args = [])
22
+ * @method \Aws\Result associateRouteTable(array $args = [])
23
+ * @method \GuzzleHttp\Promise\Promise associateRouteTableAsync(array $args = [])
24
+ * @method \Aws\Result attachClassicLinkVpc(array $args = [])
25
+ * @method \GuzzleHttp\Promise\Promise attachClassicLinkVpcAsync(array $args = [])
26
+ * @method \Aws\Result attachInternetGateway(array $args = [])
27
+ * @method \GuzzleHttp\Promise\Promise attachInternetGatewayAsync(array $args = [])
28
+ * @method \Aws\Result attachNetworkInterface(array $args = [])
29
+ * @method \GuzzleHttp\Promise\Promise attachNetworkInterfaceAsync(array $args = [])
30
+ * @method \Aws\Result attachVolume(array $args = [])
31
+ * @method \GuzzleHttp\Promise\Promise attachVolumeAsync(array $args = [])
32
+ * @method \Aws\Result attachVpnGateway(array $args = [])
33
+ * @method \GuzzleHttp\Promise\Promise attachVpnGatewayAsync(array $args = [])
34
+ * @method \Aws\Result authorizeSecurityGroupEgress(array $args = [])
35
+ * @method \GuzzleHttp\Promise\Promise authorizeSecurityGroupEgressAsync(array $args = [])
36
+ * @method \Aws\Result authorizeSecurityGroupIngress(array $args = [])
37
+ * @method \GuzzleHttp\Promise\Promise authorizeSecurityGroupIngressAsync(array $args = [])
38
+ * @method \Aws\Result bundleInstance(array $args = [])
39
+ * @method \GuzzleHttp\Promise\Promise bundleInstanceAsync(array $args = [])
40
+ * @method \Aws\Result cancelBundleTask(array $args = [])
41
+ * @method \GuzzleHttp\Promise\Promise cancelBundleTaskAsync(array $args = [])
42
+ * @method \Aws\Result cancelConversionTask(array $args = [])
43
+ * @method \GuzzleHttp\Promise\Promise cancelConversionTaskAsync(array $args = [])
44
+ * @method \Aws\Result cancelExportTask(array $args = [])
45
+ * @method \GuzzleHttp\Promise\Promise cancelExportTaskAsync(array $args = [])
46
+ * @method \Aws\Result cancelImportTask(array $args = [])
47
+ * @method \GuzzleHttp\Promise\Promise cancelImportTaskAsync(array $args = [])
48
+ * @method \Aws\Result cancelReservedInstancesListing(array $args = [])
49
+ * @method \GuzzleHttp\Promise\Promise cancelReservedInstancesListingAsync(array $args = [])
50
+ * @method \Aws\Result cancelSpotFleetRequests(array $args = [])
51
+ * @method \GuzzleHttp\Promise\Promise cancelSpotFleetRequestsAsync(array $args = [])
52
+ * @method \Aws\Result cancelSpotInstanceRequests(array $args = [])
53
+ * @method \GuzzleHttp\Promise\Promise cancelSpotInstanceRequestsAsync(array $args = [])
54
+ * @method \Aws\Result confirmProductInstance(array $args = [])
55
+ * @method \GuzzleHttp\Promise\Promise confirmProductInstanceAsync(array $args = [])
56
+ * @method \Aws\Result copyImage(array $args = [])
57
+ * @method \GuzzleHttp\Promise\Promise copyImageAsync(array $args = [])
58
+ * @method \Aws\Result copySnapshot(array $args = [])
59
+ * @method \GuzzleHttp\Promise\Promise copySnapshotAsync(array $args = [])
60
+ * @method \Aws\Result createCustomerGateway(array $args = [])
61
+ * @method \GuzzleHttp\Promise\Promise createCustomerGatewayAsync(array $args = [])
62
+ * @method \Aws\Result createDhcpOptions(array $args = [])
63
+ * @method \GuzzleHttp\Promise\Promise createDhcpOptionsAsync(array $args = [])
64
+ * @method \Aws\Result createFlowLogs(array $args = [])
65
+ * @method \GuzzleHttp\Promise\Promise createFlowLogsAsync(array $args = [])
66
+ * @method \Aws\Result createImage(array $args = [])
67
+ * @method \GuzzleHttp\Promise\Promise createImageAsync(array $args = [])
68
+ * @method \Aws\Result createInstanceExportTask(array $args = [])
69
+ * @method \GuzzleHttp\Promise\Promise createInstanceExportTaskAsync(array $args = [])
70
+ * @method \Aws\Result createInternetGateway(array $args = [])
71
+ * @method \GuzzleHttp\Promise\Promise createInternetGatewayAsync(array $args = [])
72
+ * @method \Aws\Result createKeyPair(array $args = [])
73
+ * @method \GuzzleHttp\Promise\Promise createKeyPairAsync(array $args = [])
74
+ * @method \Aws\Result createNetworkAcl(array $args = [])
75
+ * @method \GuzzleHttp\Promise\Promise createNetworkAclAsync(array $args = [])
76
+ * @method \Aws\Result createNetworkAclEntry(array $args = [])
77
+ * @method \GuzzleHttp\Promise\Promise createNetworkAclEntryAsync(array $args = [])
78
+ * @method \Aws\Result createNetworkInterface(array $args = [])
79
+ * @method \GuzzleHttp\Promise\Promise createNetworkInterfaceAsync(array $args = [])
80
+ * @method \Aws\Result createPlacementGroup(array $args = [])
81
+ * @method \GuzzleHttp\Promise\Promise createPlacementGroupAsync(array $args = [])
82
+ * @method \Aws\Result createReservedInstancesListing(array $args = [])
83
+ * @method \GuzzleHttp\Promise\Promise createReservedInstancesListingAsync(array $args = [])
84
+ * @method \Aws\Result createRoute(array $args = [])
85
+ * @method \GuzzleHttp\Promise\Promise createRouteAsync(array $args = [])
86
+ * @method \Aws\Result createRouteTable(array $args = [])
87
+ * @method \GuzzleHttp\Promise\Promise createRouteTableAsync(array $args = [])
88
+ * @method \Aws\Result createSecurityGroup(array $args = [])
89
+ * @method \GuzzleHttp\Promise\Promise createSecurityGroupAsync(array $args = [])
90
+ * @method \Aws\Result createSnapshot(array $args = [])
91
+ * @method \GuzzleHttp\Promise\Promise createSnapshotAsync(array $args = [])
92
+ * @method \Aws\Result createSpotDatafeedSubscription(array $args = [])
93
+ * @method \GuzzleHttp\Promise\Promise createSpotDatafeedSubscriptionAsync(array $args = [])
94
+ * @method \Aws\Result createSubnet(array $args = [])
95
+ * @method \GuzzleHttp\Promise\Promise createSubnetAsync(array $args = [])
96
+ * @method \Aws\Result createTags(array $args = [])
97
+ * @method \GuzzleHttp\Promise\Promise createTagsAsync(array $args = [])
98
+ * @method \Aws\Result createVolume(array $args = [])
99
+ * @method \GuzzleHttp\Promise\Promise createVolumeAsync(array $args = [])
100
+ * @method \Aws\Result createVpc(array $args = [])
101
+ * @method \GuzzleHttp\Promise\Promise createVpcAsync(array $args = [])
102
+ * @method \Aws\Result createVpcEndpoint(array $args = [])
103
+ * @method \GuzzleHttp\Promise\Promise createVpcEndpointAsync(array $args = [])
104
+ * @method \Aws\Result createVpcPeeringConnection(array $args = [])
105
+ * @method \GuzzleHttp\Promise\Promise createVpcPeeringConnectionAsync(array $args = [])
106
+ * @method \Aws\Result createVpnConnection(array $args = [])
107
+ * @method \GuzzleHttp\Promise\Promise createVpnConnectionAsync(array $args = [])
108
+ * @method \Aws\Result createVpnConnectionRoute(array $args = [])
109
+ * @method \GuzzleHttp\Promise\Promise createVpnConnectionRouteAsync(array $args = [])
110
+ * @method \Aws\Result createVpnGateway(array $args = [])
111
+ * @method \GuzzleHttp\Promise\Promise createVpnGatewayAsync(array $args = [])
112
+ * @method \Aws\Result deleteCustomerGateway(array $args = [])
113
+ * @method \GuzzleHttp\Promise\Promise deleteCustomerGatewayAsync(array $args = [])
114
+ * @method \Aws\Result deleteDhcpOptions(array $args = [])
115
+ * @method \GuzzleHttp\Promise\Promise deleteDhcpOptionsAsync(array $args = [])
116
+ * @method \Aws\Result deleteFlowLogs(array $args = [])
117
+ * @method \GuzzleHttp\Promise\Promise deleteFlowLogsAsync(array $args = [])
118
+ * @method \Aws\Result deleteInternetGateway(array $args = [])
119
+ * @method \GuzzleHttp\Promise\Promise deleteInternetGatewayAsync(array $args = [])
120
+ * @method \Aws\Result deleteKeyPair(array $args = [])
121
+ * @method \GuzzleHttp\Promise\Promise deleteKeyPairAsync(array $args = [])
122
+ * @method \Aws\Result deleteNetworkAcl(array $args = [])
123
+ * @method \GuzzleHttp\Promise\Promise deleteNetworkAclAsync(array $args = [])
124
+ * @method \Aws\Result deleteNetworkAclEntry(array $args = [])
125
+ * @method \GuzzleHttp\Promise\Promise deleteNetworkAclEntryAsync(array $args = [])
126
+ * @method \Aws\Result deleteNetworkInterface(array $args = [])
127
+ * @method \GuzzleHttp\Promise\Promise deleteNetworkInterfaceAsync(array $args = [])
128
+ * @method \Aws\Result deletePlacementGroup(array $args = [])
129
+ * @method \GuzzleHttp\Promise\Promise deletePlacementGroupAsync(array $args = [])
130
+ * @method \Aws\Result deleteRoute(array $args = [])
131
+ * @method \GuzzleHttp\Promise\Promise deleteRouteAsync(array $args = [])
132
+ * @method \Aws\Result deleteRouteTable(array $args = [])
133
+ * @method \GuzzleHttp\Promise\Promise deleteRouteTableAsync(array $args = [])
134
+ * @method \Aws\Result deleteSecurityGroup(array $args = [])
135
+ * @method \GuzzleHttp\Promise\Promise deleteSecurityGroupAsync(array $args = [])
136
+ * @method \Aws\Result deleteSnapshot(array $args = [])
137
+ * @method \GuzzleHttp\Promise\Promise deleteSnapshotAsync(array $args = [])
138
+ * @method \Aws\Result deleteSpotDatafeedSubscription(array $args = [])
139
+ * @method \GuzzleHttp\Promise\Promise deleteSpotDatafeedSubscriptionAsync(array $args = [])
140
+ * @method \Aws\Result deleteSubnet(array $args = [])
141
+ * @method \GuzzleHttp\Promise\Promise deleteSubnetAsync(array $args = [])
142
+ * @method \Aws\Result deleteTags(array $args = [])
143
+ * @method \GuzzleHttp\Promise\Promise deleteTagsAsync(array $args = [])
144
+ * @method \Aws\Result deleteVolume(array $args = [])
145
+ * @method \GuzzleHttp\Promise\Promise deleteVolumeAsync(array $args = [])
146
+ * @method \Aws\Result deleteVpc(array $args = [])
147
+ * @method \GuzzleHttp\Promise\Promise deleteVpcAsync(array $args = [])
148
+ * @method \Aws\Result deleteVpcEndpoints(array $args = [])
149
+ * @method \GuzzleHttp\Promise\Promise deleteVpcEndpointsAsync(array $args = [])
150
+ * @method \Aws\Result deleteVpcPeeringConnection(array $args = [])
151
+ * @method \GuzzleHttp\Promise\Promise deleteVpcPeeringConnectionAsync(array $args = [])
152
+ * @method \Aws\Result deleteVpnConnection(array $args = [])
153
+ * @method \GuzzleHttp\Promise\Promise deleteVpnConnectionAsync(array $args = [])
154
+ * @method \Aws\Result deleteVpnConnectionRoute(array $args = [])
155
+ * @method \GuzzleHttp\Promise\Promise deleteVpnConnectionRouteAsync(array $args = [])
156
+ * @method \Aws\Result deleteVpnGateway(array $args = [])
157
+ * @method \GuzzleHttp\Promise\Promise deleteVpnGatewayAsync(array $args = [])
158
+ * @method \Aws\Result deregisterImage(array $args = [])
159
+ * @method \GuzzleHttp\Promise\Promise deregisterImageAsync(array $args = [])
160
+ * @method \Aws\Result describeAccountAttributes(array $args = [])
161
+ * @method \GuzzleHttp\Promise\Promise describeAccountAttributesAsync(array $args = [])
162
+ * @method \Aws\Result describeAddresses(array $args = [])
163
+ * @method \GuzzleHttp\Promise\Promise describeAddressesAsync(array $args = [])
164
+ * @method \Aws\Result describeAvailabilityZones(array $args = [])
165
+ * @method \GuzzleHttp\Promise\Promise describeAvailabilityZonesAsync(array $args = [])
166
+ * @method \Aws\Result describeBundleTasks(array $args = [])
167
+ * @method \GuzzleHttp\Promise\Promise describeBundleTasksAsync(array $args = [])
168
+ * @method \Aws\Result describeClassicLinkInstances(array $args = [])
169
+ * @method \GuzzleHttp\Promise\Promise describeClassicLinkInstancesAsync(array $args = [])
170
+ * @method \Aws\Result describeConversionTasks(array $args = [])
171
+ * @method \GuzzleHttp\Promise\Promise describeConversionTasksAsync(array $args = [])
172
+ * @method \Aws\Result describeCustomerGateways(array $args = [])
173
+ * @method \GuzzleHttp\Promise\Promise describeCustomerGatewaysAsync(array $args = [])
174
+ * @method \Aws\Result describeDhcpOptions(array $args = [])
175
+ * @method \GuzzleHttp\Promise\Promise describeDhcpOptionsAsync(array $args = [])
176
+ * @method \Aws\Result describeExportTasks(array $args = [])
177
+ * @method \GuzzleHttp\Promise\Promise describeExportTasksAsync(array $args = [])
178
+ * @method \Aws\Result describeFlowLogs(array $args = [])
179
+ * @method \GuzzleHttp\Promise\Promise describeFlowLogsAsync(array $args = [])
180
+ * @method \Aws\Result describeImageAttribute(array $args = [])
181
+ * @method \GuzzleHttp\Promise\Promise describeImageAttributeAsync(array $args = [])
182
+ * @method \Aws\Result describeImages(array $args = [])
183
+ * @method \GuzzleHttp\Promise\Promise describeImagesAsync(array $args = [])
184
+ * @method \Aws\Result describeImportImageTasks(array $args = [])
185
+ * @method \GuzzleHttp\Promise\Promise describeImportImageTasksAsync(array $args = [])
186
+ * @method \Aws\Result describeImportSnapshotTasks(array $args = [])
187
+ * @method \GuzzleHttp\Promise\Promise describeImportSnapshotTasksAsync(array $args = [])
188
+ * @method \Aws\Result describeInstanceAttribute(array $args = [])
189
+ * @method \GuzzleHttp\Promise\Promise describeInstanceAttributeAsync(array $args = [])
190
+ * @method \Aws\Result describeInstanceStatus(array $args = [])
191
+ * @method \GuzzleHttp\Promise\Promise describeInstanceStatusAsync(array $args = [])
192
+ * @method \Aws\Result describeInstances(array $args = [])
193
+ * @method \GuzzleHttp\Promise\Promise describeInstancesAsync(array $args = [])
194
+ * @method \Aws\Result describeInternetGateways(array $args = [])
195
+ * @method \GuzzleHttp\Promise\Promise describeInternetGatewaysAsync(array $args = [])
196
+ * @method \Aws\Result describeKeyPairs(array $args = [])
197
+ * @method \GuzzleHttp\Promise\Promise describeKeyPairsAsync(array $args = [])
198
+ * @method \Aws\Result describeMovingAddresses(array $args = [])
199
+ * @method \GuzzleHttp\Promise\Promise describeMovingAddressesAsync(array $args = [])
200
+ * @method \Aws\Result describeNetworkAcls(array $args = [])
201
+ * @method \GuzzleHttp\Promise\Promise describeNetworkAclsAsync(array $args = [])
202
+ * @method \Aws\Result describeNetworkInterfaceAttribute(array $args = [])
203
+ * @method \GuzzleHttp\Promise\Promise describeNetworkInterfaceAttributeAsync(array $args = [])
204
+ * @method \Aws\Result describeNetworkInterfaces(array $args = [])
205
+ * @method \GuzzleHttp\Promise\Promise describeNetworkInterfacesAsync(array $args = [])
206
+ * @method \Aws\Result describePlacementGroups(array $args = [])
207
+ * @method \GuzzleHttp\Promise\Promise describePlacementGroupsAsync(array $args = [])
208
+ * @method \Aws\Result describePrefixLists(array $args = [])
209
+ * @method \GuzzleHttp\Promise\Promise describePrefixListsAsync(array $args = [])
210
+ * @method \Aws\Result describeRegions(array $args = [])
211
+ * @method \GuzzleHttp\Promise\Promise describeRegionsAsync(array $args = [])
212
+ * @method \Aws\Result describeReservedInstances(array $args = [])
213
+ * @method \GuzzleHttp\Promise\Promise describeReservedInstancesAsync(array $args = [])
214
+ * @method \Aws\Result describeReservedInstancesListings(array $args = [])
215
+ * @method \GuzzleHttp\Promise\Promise describeReservedInstancesListingsAsync(array $args = [])
216
+ * @method \Aws\Result describeReservedInstancesModifications(array $args = [])
217
+ * @method \GuzzleHttp\Promise\Promise describeReservedInstancesModificationsAsync(array $args = [])
218
+ * @method \Aws\Result describeReservedInstancesOfferings(array $args = [])
219
+ * @method \GuzzleHttp\Promise\Promise describeReservedInstancesOfferingsAsync(array $args = [])
220
+ * @method \Aws\Result describeRouteTables(array $args = [])
221
+ * @method \GuzzleHttp\Promise\Promise describeRouteTablesAsync(array $args = [])
222
+ * @method \Aws\Result describeSecurityGroups(array $args = [])
223
+ * @method \GuzzleHttp\Promise\Promise describeSecurityGroupsAsync(array $args = [])
224
+ * @method \Aws\Result describeSnapshotAttribute(array $args = [])
225
+ * @method \GuzzleHttp\Promise\Promise describeSnapshotAttributeAsync(array $args = [])
226
+ * @method \Aws\Result describeSnapshots(array $args = [])
227
+ * @method \GuzzleHttp\Promise\Promise describeSnapshotsAsync(array $args = [])
228
+ * @method \Aws\Result describeSpotDatafeedSubscription(array $args = [])
229
+ * @method \GuzzleHttp\Promise\Promise describeSpotDatafeedSubscriptionAsync(array $args = [])
230
+ * @method \Aws\Result describeSpotFleetInstances(array $args = [])
231
+ * @method \GuzzleHttp\Promise\Promise describeSpotFleetInstancesAsync(array $args = [])
232
+ * @method \Aws\Result describeSpotFleetRequestHistory(array $args = [])
233
+ * @method \GuzzleHttp\Promise\Promise describeSpotFleetRequestHistoryAsync(array $args = [])
234
+ * @method \Aws\Result describeSpotFleetRequests(array $args = [])
235
+ * @method \GuzzleHttp\Promise\Promise describeSpotFleetRequestsAsync(array $args = [])
236
+ * @method \Aws\Result describeSpotInstanceRequests(array $args = [])
237
+ * @method \GuzzleHttp\Promise\Promise describeSpotInstanceRequestsAsync(array $args = [])
238
+ * @method \Aws\Result describeSpotPriceHistory(array $args = [])
239
+ * @method \GuzzleHttp\Promise\Promise describeSpotPriceHistoryAsync(array $args = [])
240
+ * @method \Aws\Result describeSubnets(array $args = [])
241
+ * @method \GuzzleHttp\Promise\Promise describeSubnetsAsync(array $args = [])
242
+ * @method \Aws\Result describeTags(array $args = [])
243
+ * @method \GuzzleHttp\Promise\Promise describeTagsAsync(array $args = [])
244
+ * @method \Aws\Result describeVolumeAttribute(array $args = [])
245
+ * @method \GuzzleHttp\Promise\Promise describeVolumeAttributeAsync(array $args = [])
246
+ * @method \Aws\Result describeVolumeStatus(array $args = [])
247
+ * @method \GuzzleHttp\Promise\Promise describeVolumeStatusAsync(array $args = [])
248
+ * @method \Aws\Result describeVolumes(array $args = [])
249
+ * @method \GuzzleHttp\Promise\Promise describeVolumesAsync(array $args = [])
250
+ * @method \Aws\Result describeVpcAttribute(array $args = [])
251
+ * @method \GuzzleHttp\Promise\Promise describeVpcAttributeAsync(array $args = [])
252
+ * @method \Aws\Result describeVpcClassicLink(array $args = [])
253
+ * @method \GuzzleHttp\Promise\Promise describeVpcClassicLinkAsync(array $args = [])
254
+ * @method \Aws\Result describeVpcEndpointServices(array $args = [])
255
+ * @method \GuzzleHttp\Promise\Promise describeVpcEndpointServicesAsync(array $args = [])
256
+ * @method \Aws\Result describeVpcEndpoints(array $args = [])
257
+ * @method \GuzzleHttp\Promise\Promise describeVpcEndpointsAsync(array $args = [])
258
+ * @method \Aws\Result describeVpcPeeringConnections(array $args = [])
259
+ * @method \GuzzleHttp\Promise\Promise describeVpcPeeringConnectionsAsync(array $args = [])
260
+ * @method \Aws\Result describeVpcs(array $args = [])
261
+ * @method \GuzzleHttp\Promise\Promise describeVpcsAsync(array $args = [])
262
+ * @method \Aws\Result describeVpnConnections(array $args = [])
263
+ * @method \GuzzleHttp\Promise\Promise describeVpnConnectionsAsync(array $args = [])
264
+ * @method \Aws\Result describeVpnGateways(array $args = [])
265
+ * @method \GuzzleHttp\Promise\Promise describeVpnGatewaysAsync(array $args = [])
266
+ * @method \Aws\Result detachClassicLinkVpc(array $args = [])
267
+ * @method \GuzzleHttp\Promise\Promise detachClassicLinkVpcAsync(array $args = [])
268
+ * @method \Aws\Result detachInternetGateway(array $args = [])
269
+ * @method \GuzzleHttp\Promise\Promise detachInternetGatewayAsync(array $args = [])
270
+ * @method \Aws\Result detachNetworkInterface(array $args = [])
271
+ * @method \GuzzleHttp\Promise\Promise detachNetworkInterfaceAsync(array $args = [])
272
+ * @method \Aws\Result detachVolume(array $args = [])
273
+ * @method \GuzzleHttp\Promise\Promise detachVolumeAsync(array $args = [])
274
+ * @method \Aws\Result detachVpnGateway(array $args = [])
275
+ * @method \GuzzleHttp\Promise\Promise detachVpnGatewayAsync(array $args = [])
276
+ * @method \Aws\Result disableVgwRoutePropagation(array $args = [])
277
+ * @method \GuzzleHttp\Promise\Promise disableVgwRoutePropagationAsync(array $args = [])
278
+ * @method \Aws\Result disableVpcClassicLink(array $args = [])
279
+ * @method \GuzzleHttp\Promise\Promise disableVpcClassicLinkAsync(array $args = [])
280
+ * @method \Aws\Result disassociateAddress(array $args = [])
281
+ * @method \GuzzleHttp\Promise\Promise disassociateAddressAsync(array $args = [])
282
+ * @method \Aws\Result disassociateRouteTable(array $args = [])
283
+ * @method \GuzzleHttp\Promise\Promise disassociateRouteTableAsync(array $args = [])
284
+ * @method \Aws\Result enableVgwRoutePropagation(array $args = [])
285
+ * @method \GuzzleHttp\Promise\Promise enableVgwRoutePropagationAsync(array $args = [])
286
+ * @method \Aws\Result enableVolumeIO(array $args = [])
287
+ * @method \GuzzleHttp\Promise\Promise enableVolumeIOAsync(array $args = [])
288
+ * @method \Aws\Result enableVpcClassicLink(array $args = [])
289
+ * @method \GuzzleHttp\Promise\Promise enableVpcClassicLinkAsync(array $args = [])
290
+ * @method \Aws\Result getConsoleOutput(array $args = [])
291
+ * @method \GuzzleHttp\Promise\Promise getConsoleOutputAsync(array $args = [])
292
+ * @method \Aws\Result getPasswordData(array $args = [])
293
+ * @method \GuzzleHttp\Promise\Promise getPasswordDataAsync(array $args = [])
294
+ * @method \Aws\Result importImage(array $args = [])
295
+ * @method \GuzzleHttp\Promise\Promise importImageAsync(array $args = [])
296
+ * @method \Aws\Result importInstance(array $args = [])
297
+ * @method \GuzzleHttp\Promise\Promise importInstanceAsync(array $args = [])
298
+ * @method \Aws\Result importKeyPair(array $args = [])
299
+ * @method \GuzzleHttp\Promise\Promise importKeyPairAsync(array $args = [])
300
+ * @method \Aws\Result importSnapshot(array $args = [])
301
+ * @method \GuzzleHttp\Promise\Promise importSnapshotAsync(array $args = [])
302
+ * @method \Aws\Result importVolume(array $args = [])
303
+ * @method \GuzzleHttp\Promise\Promise importVolumeAsync(array $args = [])
304
+ * @method \Aws\Result modifyImageAttribute(array $args = [])
305
+ * @method \GuzzleHttp\Promise\Promise modifyImageAttributeAsync(array $args = [])
306
+ * @method \Aws\Result modifyInstanceAttribute(array $args = [])
307
+ * @method \GuzzleHttp\Promise\Promise modifyInstanceAttributeAsync(array $args = [])
308
+ * @method \Aws\Result modifyNetworkInterfaceAttribute(array $args = [])
309
+ * @method \GuzzleHttp\Promise\Promise modifyNetworkInterfaceAttributeAsync(array $args = [])
310
+ * @method \Aws\Result modifyReservedInstances(array $args = [])
311
+ * @method \GuzzleHttp\Promise\Promise modifyReservedInstancesAsync(array $args = [])
312
+ * @method \Aws\Result modifySnapshotAttribute(array $args = [])
313
+ * @method \GuzzleHttp\Promise\Promise modifySnapshotAttributeAsync(array $args = [])
314
+ * @method \Aws\Result modifySpotFleetRequest(array $args = [])
315
+ * @method \GuzzleHttp\Promise\Promise modifySpotFleetRequestAsync(array $args = [])
316
+ * @method \Aws\Result modifySubnetAttribute(array $args = [])
317
+ * @method \GuzzleHttp\Promise\Promise modifySubnetAttributeAsync(array $args = [])
318
+ * @method \Aws\Result modifyVolumeAttribute(array $args = [])
319
+ * @method \GuzzleHttp\Promise\Promise modifyVolumeAttributeAsync(array $args = [])
320
+ * @method \Aws\Result modifyVpcAttribute(array $args = [])
321
+ * @method \GuzzleHttp\Promise\Promise modifyVpcAttributeAsync(array $args = [])
322
+ * @method \Aws\Result modifyVpcEndpoint(array $args = [])
323
+ * @method \GuzzleHttp\Promise\Promise modifyVpcEndpointAsync(array $args = [])
324
+ * @method \Aws\Result monitorInstances(array $args = [])
325
+ * @method \GuzzleHttp\Promise\Promise monitorInstancesAsync(array $args = [])
326
+ * @method \Aws\Result moveAddressToVpc(array $args = [])
327
+ * @method \GuzzleHttp\Promise\Promise moveAddressToVpcAsync(array $args = [])
328
+ * @method \Aws\Result purchaseReservedInstancesOffering(array $args = [])
329
+ * @method \GuzzleHttp\Promise\Promise purchaseReservedInstancesOfferingAsync(array $args = [])
330
+ * @method \Aws\Result rebootInstances(array $args = [])
331
+ * @method \GuzzleHttp\Promise\Promise rebootInstancesAsync(array $args = [])
332
+ * @method \Aws\Result registerImage(array $args = [])
333
+ * @method \GuzzleHttp\Promise\Promise registerImageAsync(array $args = [])
334
+ * @method \Aws\Result rejectVpcPeeringConnection(array $args = [])
335
+ * @method \GuzzleHttp\Promise\Promise rejectVpcPeeringConnectionAsync(array $args = [])
336
+ * @method \Aws\Result releaseAddress(array $args = [])
337
+ * @method \GuzzleHttp\Promise\Promise releaseAddressAsync(array $args = [])
338
+ * @method \Aws\Result replaceNetworkAclAssociation(array $args = [])
339
+ * @method \GuzzleHttp\Promise\Promise replaceNetworkAclAssociationAsync(array $args = [])
340
+ * @method \Aws\Result replaceNetworkAclEntry(array $args = [])
341
+ * @method \GuzzleHttp\Promise\Promise replaceNetworkAclEntryAsync(array $args = [])
342
+ * @method \Aws\Result replaceRoute(array $args = [])
343
+ * @method \GuzzleHttp\Promise\Promise replaceRouteAsync(array $args = [])
344
+ * @method \Aws\Result replaceRouteTableAssociation(array $args = [])
345
+ * @method \GuzzleHttp\Promise\Promise replaceRouteTableAssociationAsync(array $args = [])
346
+ * @method \Aws\Result reportInstanceStatus(array $args = [])
347
+ * @method \GuzzleHttp\Promise\Promise reportInstanceStatusAsync(array $args = [])
348
+ * @method \Aws\Result requestSpotFleet(array $args = [])
349
+ * @method \GuzzleHttp\Promise\Promise requestSpotFleetAsync(array $args = [])
350
+ * @method \Aws\Result requestSpotInstances(array $args = [])
351
+ * @method \GuzzleHttp\Promise\Promise requestSpotInstancesAsync(array $args = [])
352
+ * @method \Aws\Result resetImageAttribute(array $args = [])
353
+ * @method \GuzzleHttp\Promise\Promise resetImageAttributeAsync(array $args = [])
354
+ * @method \Aws\Result resetInstanceAttribute(array $args = [])
355
+ * @method \GuzzleHttp\Promise\Promise resetInstanceAttributeAsync(array $args = [])
356
+ * @method \Aws\Result resetNetworkInterfaceAttribute(array $args = [])
357
+ * @method \GuzzleHttp\Promise\Promise resetNetworkInterfaceAttributeAsync(array $args = [])
358
+ * @method \Aws\Result resetSnapshotAttribute(array $args = [])
359
+ * @method \GuzzleHttp\Promise\Promise resetSnapshotAttributeAsync(array $args = [])
360
+ * @method \Aws\Result restoreAddressToClassic(array $args = [])
361
+ * @method \GuzzleHttp\Promise\Promise restoreAddressToClassicAsync(array $args = [])
362
+ * @method \Aws\Result revokeSecurityGroupEgress(array $args = [])
363
+ * @method \GuzzleHttp\Promise\Promise revokeSecurityGroupEgressAsync(array $args = [])
364
+ * @method \Aws\Result revokeSecurityGroupIngress(array $args = [])
365
+ * @method \GuzzleHttp\Promise\Promise revokeSecurityGroupIngressAsync(array $args = [])
366
+ * @method \Aws\Result runInstances(array $args = [])
367
+ * @method \GuzzleHttp\Promise\Promise runInstancesAsync(array $args = [])
368
+ * @method \Aws\Result startInstances(array $args = [])
369
+ * @method \GuzzleHttp\Promise\Promise startInstancesAsync(array $args = [])
370
+ * @method \Aws\Result stopInstances(array $args = [])
371
+ * @method \GuzzleHttp\Promise\Promise stopInstancesAsync(array $args = [])
372
+ * @method \Aws\Result terminateInstances(array $args = [])
373
+ * @method \GuzzleHttp\Promise\Promise terminateInstancesAsync(array $args = [])
374
+ * @method \Aws\Result unassignPrivateIpAddresses(array $args = [])
375
+ * @method \GuzzleHttp\Promise\Promise unassignPrivateIpAddressesAsync(array $args = [])
376
+ * @method \Aws\Result unmonitorInstances(array $args = [])
377
+ * @method \GuzzleHttp\Promise\Promise unmonitorInstancesAsync(array $args = [])
378
+ */
379
+ class Ec2Client extends AwsClient
380
+ {
381
+ public function __construct(array $args)
382
+ {
383
+ $args['with_resolved'] = function (array $args) {
384
+ $this->getHandlerList()->appendInit(
385
+ CopySnapshotMiddleware::wrap(
386
+ $this,
387
+ $args['endpoint_provider']
388
+ ),
389
+ 'ec2.copy_snapshot'
390
+ );
391
+ };
392
+
393
+ parent::__construct($args);
394
+ }
395
+
396
+ /**
397
+ * @internal
398
+ * @codeCoverageIgnore
399
+ */
400
+ public static function applyDocFilters(array $api, array $docs)
401
+ {
402
+ // Several copy snapshot parameters are optional.
403
+ $docs['shapes']['String']['refs']['CopySnapshotRequest$PresignedUrl']
404
+ = '<div class="alert alert-info">The SDK will compute this value '
405
+ . 'for you on your behalf.</div>';
406
+ $docs['shapes']['String']['refs']['CopySnapshotRequest$DestinationRegion']
407
+ = '<div class="alert alert-info">The SDK will populate this '
408
+ . 'parameter on your behalf using the configured region value of '
409
+ . 'the client.</div>';
410
+
411
+ return [
412
+ new Service($api, ApiProvider::defaultProvider()),
413
+ new DocModel($docs)
414
+ ];
415
+ }
416
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Ec2/Exception/Ec2Exception.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Ec2\Exception;
3
+
4
+ use Aws\Exception\AwsException;
5
+
6
+ /**
7
+ * Represents an error interacting with the Amazon Elastic Compute Cloud service.
8
+ */
9
+ class Ec2Exception extends AwsException {}
vendor/aannnaa7/aws-sdk-php-minimized/src/Ecs/EcsClient.php ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Ecs;
3
+
4
+ use Aws\AwsClient;
5
+
6
+ /**
7
+ * This client is used to interact with **Amazon ECS**.
8
+ *
9
+ * @method \Aws\Result createCluster(array $args = [])
10
+ * @method \GuzzleHttp\Promise\Promise createClusterAsync(array $args = [])
11
+ * @method \Aws\Result createService(array $args = [])
12
+ * @method \GuzzleHttp\Promise\Promise createServiceAsync(array $args = [])
13
+ * @method \Aws\Result deleteCluster(array $args = [])
14
+ * @method \GuzzleHttp\Promise\Promise deleteClusterAsync(array $args = [])
15
+ * @method \Aws\Result deleteService(array $args = [])
16
+ * @method \GuzzleHttp\Promise\Promise deleteServiceAsync(array $args = [])
17
+ * @method \Aws\Result deregisterContainerInstance(array $args = [])
18
+ * @method \GuzzleHttp\Promise\Promise deregisterContainerInstanceAsync(array $args = [])
19
+ * @method \Aws\Result deregisterTaskDefinition(array $args = [])
20
+ * @method \GuzzleHttp\Promise\Promise deregisterTaskDefinitionAsync(array $args = [])
21
+ * @method \Aws\Result describeClusters(array $args = [])
22
+ * @method \GuzzleHttp\Promise\Promise describeClustersAsync(array $args = [])
23
+ * @method \Aws\Result describeContainerInstances(array $args = [])
24
+ * @method \GuzzleHttp\Promise\Promise describeContainerInstancesAsync(array $args = [])
25
+ * @method \Aws\Result describeServices(array $args = [])
26
+ * @method \GuzzleHttp\Promise\Promise describeServicesAsync(array $args = [])
27
+ * @method \Aws\Result describeTaskDefinition(array $args = [])
28
+ * @method \GuzzleHttp\Promise\Promise describeTaskDefinitionAsync(array $args = [])
29
+ * @method \Aws\Result describeTasks(array $args = [])
30
+ * @method \GuzzleHttp\Promise\Promise describeTasksAsync(array $args = [])
31
+ * @method \Aws\Result discoverPollEndpoint(array $args = [])
32
+ * @method \GuzzleHttp\Promise\Promise discoverPollEndpointAsync(array $args = [])
33
+ * @method \Aws\Result listClusters(array $args = [])
34
+ * @method \GuzzleHttp\Promise\Promise listClustersAsync(array $args = [])
35
+ * @method \Aws\Result listContainerInstances(array $args = [])
36
+ * @method \GuzzleHttp\Promise\Promise listContainerInstancesAsync(array $args = [])
37
+ * @method \Aws\Result listServices(array $args = [])
38
+ * @method \GuzzleHttp\Promise\Promise listServicesAsync(array $args = [])
39
+ * @method \Aws\Result listTaskDefinitionFamilies(array $args = [])
40
+ * @method \GuzzleHttp\Promise\Promise listTaskDefinitionFamiliesAsync(array $args = [])
41
+ * @method \Aws\Result listTaskDefinitions(array $args = [])
42
+ * @method \GuzzleHttp\Promise\Promise listTaskDefinitionsAsync(array $args = [])
43
+ * @method \Aws\Result listTasks(array $args = [])
44
+ * @method \GuzzleHttp\Promise\Promise listTasksAsync(array $args = [])
45
+ * @method \Aws\Result registerContainerInstance(array $args = [])
46
+ * @method \GuzzleHttp\Promise\Promise registerContainerInstanceAsync(array $args = [])
47
+ * @method \Aws\Result registerTaskDefinition(array $args = [])
48
+ * @method \GuzzleHttp\Promise\Promise registerTaskDefinitionAsync(array $args = [])
49
+ * @method \Aws\Result runTask(array $args = [])
50
+ * @method \GuzzleHttp\Promise\Promise runTaskAsync(array $args = [])
51
+ * @method \Aws\Result startTask(array $args = [])
52
+ * @method \GuzzleHttp\Promise\Promise startTaskAsync(array $args = [])
53
+ * @method \Aws\Result stopTask(array $args = [])
54
+ * @method \GuzzleHttp\Promise\Promise stopTaskAsync(array $args = [])
55
+ * @method \Aws\Result submitContainerStateChange(array $args = [])
56
+ * @method \GuzzleHttp\Promise\Promise submitContainerStateChangeAsync(array $args = [])
57
+ * @method \Aws\Result submitTaskStateChange(array $args = [])
58
+ * @method \GuzzleHttp\Promise\Promise submitTaskStateChangeAsync(array $args = [])
59
+ * @method \Aws\Result updateContainerAgent(array $args = [])
60
+ * @method \GuzzleHttp\Promise\Promise updateContainerAgentAsync(array $args = [])
61
+ * @method \Aws\Result updateService(array $args = [])
62
+ * @method \GuzzleHttp\Promise\Promise updateServiceAsync(array $args = [])
63
+ */
64
+ class EcsClient extends AwsClient {}
vendor/aannnaa7/aws-sdk-php-minimized/src/Ecs/Exception/EcsException.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Ecs\Exception;
3
+
4
+ use Aws\Exception\AwsException;
5
+
6
+ /**
7
+ * Amazon ECS exception.
8
+ */
9
+ class EcsException extends AwsException {}
vendor/aannnaa7/aws-sdk-php-minimized/src/Efs/EfsClient.php ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Efs;
3
+
4
+ use Aws\AwsClient;
5
+
6
+ /**
7
+ * This client is used to interact with **Amazon EFS**.
8
+ *
9
+ * @method \Aws\Result createFileSystem(array $args = [])
10
+ * @method \GuzzleHttp\Promise\Promise createFileSystemAsync(array $args = [])
11
+ * @method \Aws\Result createMountTarget(array $args = [])
12
+ * @method \GuzzleHttp\Promise\Promise createMountTargetAsync(array $args = [])
13
+ * @method \Aws\Result createTags(array $args = [])
14
+ * @method \GuzzleHttp\Promise\Promise createTagsAsync(array $args = [])
15
+ * @method \Aws\Result deleteFileSystem(array $args = [])
16
+ * @method \GuzzleHttp\Promise\Promise deleteFileSystemAsync(array $args = [])
17
+ * @method \Aws\Result deleteMountTarget(array $args = [])
18
+ * @method \GuzzleHttp\Promise\Promise deleteMountTargetAsync(array $args = [])
19
+ * @method \Aws\Result deleteTags(array $args = [])
20
+ * @method \GuzzleHttp\Promise\Promise deleteTagsAsync(array $args = [])
21
+ * @method \Aws\Result describeFileSystems(array $args = [])
22
+ * @method \GuzzleHttp\Promise\Promise describeFileSystemsAsync(array $args = [])
23
+ * @method \Aws\Result describeMountTargetSecurityGroups(array $args = [])
24
+ * @method \GuzzleHttp\Promise\Promise describeMountTargetSecurityGroupsAsync(array $args = [])
25
+ * @method \Aws\Result describeMountTargets(array $args = [])
26
+ * @method \GuzzleHttp\Promise\Promise describeMountTargetsAsync(array $args = [])
27
+ * @method \Aws\Result describeTags(array $args = [])
28
+ * @method \GuzzleHttp\Promise\Promise describeTagsAsync(array $args = [])
29
+ * @method \Aws\Result modifyMountTargetSecurityGroups(array $args = [])
30
+ * @method \GuzzleHttp\Promise\Promise modifyMountTargetSecurityGroupsAsync(array $args = [])
31
+ */
32
+ class EfsClient extends AwsClient {}
vendor/aannnaa7/aws-sdk-php-minimized/src/Efs/Exception/EfsException.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Efs\Exception;
3
+
4
+ use Aws\Exception\AwsException;
5
+
6
+ /**
7
+ * Amazon EFS exception.
8
+ */
9
+ class EfsException extends AwsException {}
vendor/aannnaa7/aws-sdk-php-minimized/src/ElastiCache/ElastiCacheClient.php ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\ElastiCache;
3
+
4
+ use Aws\AwsClient;
5
+
6
+ /**
7
+ * This client is used to interact with the **Amazon ElastiCache** service.
8
+ *
9
+ * @method \Aws\Result addTagsToResource(array $args = [])
10
+ * @method \GuzzleHttp\Promise\Promise addTagsToResourceAsync(array $args = [])
11
+ * @method \Aws\Result authorizeCacheSecurityGroupIngress(array $args = [])
12
+ * @method \GuzzleHttp\Promise\Promise authorizeCacheSecurityGroupIngressAsync(array $args = [])
13
+ * @method \Aws\Result copySnapshot(array $args = [])
14
+ * @method \GuzzleHttp\Promise\Promise copySnapshotAsync(array $args = [])
15
+ * @method \Aws\Result createCacheCluster(array $args = [])
16
+ * @method \GuzzleHttp\Promise\Promise createCacheClusterAsync(array $args = [])
17
+ * @method \Aws\Result createCacheParameterGroup(array $args = [])
18
+ * @method \GuzzleHttp\Promise\Promise createCacheParameterGroupAsync(array $args = [])
19
+ * @method \Aws\Result createCacheSecurityGroup(array $args = [])
20
+ * @method \GuzzleHttp\Promise\Promise createCacheSecurityGroupAsync(array $args = [])
21
+ * @method \Aws\Result createCacheSubnetGroup(array $args = [])
22
+ * @method \GuzzleHttp\Promise\Promise createCacheSubnetGroupAsync(array $args = [])
23
+ * @method \Aws\Result createReplicationGroup(array $args = [])
24
+ * @method \GuzzleHttp\Promise\Promise createReplicationGroupAsync(array $args = [])
25
+ * @method \Aws\Result createSnapshot(array $args = [])
26
+ * @method \GuzzleHttp\Promise\Promise createSnapshotAsync(array $args = [])
27
+ * @method \Aws\Result deleteCacheCluster(array $args = [])
28
+ * @method \GuzzleHttp\Promise\Promise deleteCacheClusterAsync(array $args = [])
29
+ * @method \Aws\Result deleteCacheParameterGroup(array $args = [])
30
+ * @method \GuzzleHttp\Promise\Promise deleteCacheParameterGroupAsync(array $args = [])
31
+ * @method \Aws\Result deleteCacheSecurityGroup(array $args = [])
32
+ * @method \GuzzleHttp\Promise\Promise deleteCacheSecurityGroupAsync(array $args = [])
33
+ * @method \Aws\Result deleteCacheSubnetGroup(array $args = [])
34
+ * @method \GuzzleHttp\Promise\Promise deleteCacheSubnetGroupAsync(array $args = [])
35
+ * @method \Aws\Result deleteReplicationGroup(array $args = [])
36
+ * @method \GuzzleHttp\Promise\Promise deleteReplicationGroupAsync(array $args = [])
37
+ * @method \Aws\Result deleteSnapshot(array $args = [])
38
+ * @method \GuzzleHttp\Promise\Promise deleteSnapshotAsync(array $args = [])
39
+ * @method \Aws\Result describeCacheClusters(array $args = [])
40
+ * @method \GuzzleHttp\Promise\Promise describeCacheClustersAsync(array $args = [])
41
+ * @method \Aws\Result describeCacheEngineVersions(array $args = [])
42
+ * @method \GuzzleHttp\Promise\Promise describeCacheEngineVersionsAsync(array $args = [])
43
+ * @method \Aws\Result describeCacheParameterGroups(array $args = [])
44
+ * @method \GuzzleHttp\Promise\Promise describeCacheParameterGroupsAsync(array $args = [])
45
+ * @method \Aws\Result describeCacheParameters(array $args = [])
46
+ * @method \GuzzleHttp\Promise\Promise describeCacheParametersAsync(array $args = [])
47
+ * @method \Aws\Result describeCacheSecurityGroups(array $args = [])
48
+ * @method \GuzzleHttp\Promise\Promise describeCacheSecurityGroupsAsync(array $args = [])
49
+ * @method \Aws\Result describeCacheSubnetGroups(array $args = [])
50
+ * @method \GuzzleHttp\Promise\Promise describeCacheSubnetGroupsAsync(array $args = [])
51
+ * @method \Aws\Result describeEngineDefaultParameters(array $args = [])
52
+ * @method \GuzzleHttp\Promise\Promise describeEngineDefaultParametersAsync(array $args = [])
53
+ * @method \Aws\Result describeEvents(array $args = [])
54
+ * @method \GuzzleHttp\Promise\Promise describeEventsAsync(array $args = [])
55
+ * @method \Aws\Result describeReplicationGroups(array $args = [])
56
+ * @method \GuzzleHttp\Promise\Promise describeReplicationGroupsAsync(array $args = [])
57
+ * @method \Aws\Result describeReservedCacheNodes(array $args = [])
58
+ * @method \GuzzleHttp\Promise\Promise describeReservedCacheNodesAsync(array $args = [])
59
+ * @method \Aws\Result describeReservedCacheNodesOfferings(array $args = [])
60
+ * @method \GuzzleHttp\Promise\Promise describeReservedCacheNodesOfferingsAsync(array $args = [])
61
+ * @method \Aws\Result describeSnapshots(array $args = [])
62
+ * @method \GuzzleHttp\Promise\Promise describeSnapshotsAsync(array $args = [])
63
+ * @method \Aws\Result listTagsForResource(array $args = [])
64
+ * @method \GuzzleHttp\Promise\Promise listTagsForResourceAsync(array $args = [])
65
+ * @method \Aws\Result modifyCacheCluster(array $args = [])
66
+ * @method \GuzzleHttp\Promise\Promise modifyCacheClusterAsync(array $args = [])
67
+ * @method \Aws\Result modifyCacheParameterGroup(array $args = [])
68
+ * @method \GuzzleHttp\Promise\Promise modifyCacheParameterGroupAsync(array $args = [])
69
+ * @method \Aws\Result modifyCacheSubnetGroup(array $args = [])
70
+ * @method \GuzzleHttp\Promise\Promise modifyCacheSubnetGroupAsync(array $args = [])
71
+ * @method \Aws\Result modifyReplicationGroup(array $args = [])
72
+ * @method \GuzzleHttp\Promise\Promise modifyReplicationGroupAsync(array $args = [])
73
+ * @method \Aws\Result purchaseReservedCacheNodesOffering(array $args = [])
74
+ * @method \GuzzleHttp\Promise\Promise purchaseReservedCacheNodesOfferingAsync(array $args = [])
75
+ * @method \Aws\Result rebootCacheCluster(array $args = [])
76
+ * @method \GuzzleHttp\Promise\Promise rebootCacheClusterAsync(array $args = [])
77
+ * @method \Aws\Result removeTagsFromResource(array $args = [])
78
+ * @method \GuzzleHttp\Promise\Promise removeTagsFromResourceAsync(array $args = [])
79
+ * @method \Aws\Result resetCacheParameterGroup(array $args = [])
80
+ * @method \GuzzleHttp\Promise\Promise resetCacheParameterGroupAsync(array $args = [])
81
+ * @method \Aws\Result revokeCacheSecurityGroupIngress(array $args = [])
82
+ * @method \GuzzleHttp\Promise\Promise revokeCacheSecurityGroupIngressAsync(array $args = [])
83
+ */
84
+ class ElastiCacheClient extends AwsClient {}
vendor/aannnaa7/aws-sdk-php-minimized/src/ElastiCache/Exception/ElastiCacheException.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\ElastiCache\Exception;
3
+
4
+ use Aws\Exception\AwsException;
5
+
6
+ /**
7
+ * Represents an error interacting with the Amazon ElastiCache service.
8
+ */
9
+ class ElastiCacheException extends AwsException {}
vendor/aannnaa7/aws-sdk-php-minimized/src/ElasticBeanstalk/ElasticBeanstalkClient.php ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\ElasticBeanstalk;
3
+
4
+ use Aws\AwsClient;
5
+
6
+ /**
7
+ * This client is used to interact with the **AWS Elastic Beanstalk** service.
8
+ *
9
+ * @method \Aws\Result abortEnvironmentUpdate(array $args = [])
10
+ * @method \GuzzleHttp\Promise\Promise abortEnvironmentUpdateAsync(array $args = [])
11
+ * @method \Aws\Result checkDNSAvailability(array $args = [])
12
+ * @method \GuzzleHttp\Promise\Promise checkDNSAvailabilityAsync(array $args = [])
13
+ * @method \Aws\Result createApplication(array $args = [])
14
+ * @method \GuzzleHttp\Promise\Promise createApplicationAsync(array $args = [])
15
+ * @method \Aws\Result createApplicationVersion(array $args = [])
16
+ * @method \GuzzleHttp\Promise\Promise createApplicationVersionAsync(array $args = [])
17
+ * @method \Aws\Result createConfigurationTemplate(array $args = [])
18
+ * @method \GuzzleHttp\Promise\Promise createConfigurationTemplateAsync(array $args = [])
19
+ * @method \Aws\Result createEnvironment(array $args = [])
20
+ * @method \GuzzleHttp\Promise\Promise createEnvironmentAsync(array $args = [])
21
+ * @method \Aws\Result createStorageLocation(array $args = [])
22
+ * @method \GuzzleHttp\Promise\Promise createStorageLocationAsync(array $args = [])
23
+ * @method \Aws\Result deleteApplication(array $args = [])
24
+ * @method \GuzzleHttp\Promise\Promise deleteApplicationAsync(array $args = [])
25
+ * @method \Aws\Result deleteApplicationVersion(array $args = [])
26
+ * @method \GuzzleHttp\Promise\Promise deleteApplicationVersionAsync(array $args = [])
27
+ * @method \Aws\Result deleteConfigurationTemplate(array $args = [])
28
+ * @method \GuzzleHttp\Promise\Promise deleteConfigurationTemplateAsync(array $args = [])
29
+ * @method \Aws\Result deleteEnvironmentConfiguration(array $args = [])
30
+ * @method \GuzzleHttp\Promise\Promise deleteEnvironmentConfigurationAsync(array $args = [])
31
+ * @method \Aws\Result describeApplicationVersions(array $args = [])
32
+ * @method \GuzzleHttp\Promise\Promise describeApplicationVersionsAsync(array $args = [])
33
+ * @method \Aws\Result describeApplications(array $args = [])
34
+ * @method \GuzzleHttp\Promise\Promise describeApplicationsAsync(array $args = [])
35
+ * @method \Aws\Result describeConfigurationOptions(array $args = [])
36
+ * @method \GuzzleHttp\Promise\Promise describeConfigurationOptionsAsync(array $args = [])
37
+ * @method \Aws\Result describeConfigurationSettings(array $args = [])
38
+ * @method \GuzzleHttp\Promise\Promise describeConfigurationSettingsAsync(array $args = [])
39
+ * @method \Aws\Result describeEnvironmentHealth(array $args = [])
40
+ * @method \GuzzleHttp\Promise\Promise describeEnvironmentHealthAsync(array $args = [])
41
+ * @method \Aws\Result describeEnvironmentResources(array $args = [])
42
+ * @method \GuzzleHttp\Promise\Promise describeEnvironmentResourcesAsync(array $args = [])
43
+ * @method \Aws\Result describeEnvironments(array $args = [])
44
+ * @method \GuzzleHttp\Promise\Promise describeEnvironmentsAsync(array $args = [])
45
+ * @method \Aws\Result describeEvents(array $args = [])
46
+ * @method \GuzzleHttp\Promise\Promise describeEventsAsync(array $args = [])
47
+ * @method \Aws\Result describeInstancesHealth(array $args = [])
48
+ * @method \GuzzleHttp\Promise\Promise describeInstancesHealthAsync(array $args = [])
49
+ * @method \Aws\Result listAvailableSolutionStacks(array $args = [])
50
+ * @method \GuzzleHttp\Promise\Promise listAvailableSolutionStacksAsync(array $args = [])
51
+ * @method \Aws\Result rebuildEnvironment(array $args = [])
52
+ * @method \GuzzleHttp\Promise\Promise rebuildEnvironmentAsync(array $args = [])
53
+ * @method \Aws\Result requestEnvironmentInfo(array $args = [])
54
+ * @method \GuzzleHttp\Promise\Promise requestEnvironmentInfoAsync(array $args = [])
55
+ * @method \Aws\Result restartAppServer(array $args = [])
56
+ * @method \GuzzleHttp\Promise\Promise restartAppServerAsync(array $args = [])
57
+ * @method \Aws\Result retrieveEnvironmentInfo(array $args = [])
58
+ * @method \GuzzleHttp\Promise\Promise retrieveEnvironmentInfoAsync(array $args = [])
59
+ * @method \Aws\Result swapEnvironmentCNAMEs(array $args = [])
60
+ * @method \GuzzleHttp\Promise\Promise swapEnvironmentCNAMEsAsync(array $args = [])
61
+ * @method \Aws\Result terminateEnvironment(array $args = [])
62
+ * @method \GuzzleHttp\Promise\Promise terminateEnvironmentAsync(array $args = [])
63
+ * @method \Aws\Result updateApplication(array $args = [])
64
+ * @method \GuzzleHttp\Promise\Promise updateApplicationAsync(array $args = [])
65
+ * @method \Aws\Result updateApplicationVersion(array $args = [])
66
+ * @method \GuzzleHttp\Promise\Promise updateApplicationVersionAsync(array $args = [])
67
+ * @method \Aws\Result updateConfigurationTemplate(array $args = [])
68
+ * @method \GuzzleHttp\Promise\Promise updateConfigurationTemplateAsync(array $args = [])
69
+ * @method \Aws\Result updateEnvironment(array $args = [])
70
+ * @method \GuzzleHttp\Promise\Promise updateEnvironmentAsync(array $args = [])
71
+ * @method \Aws\Result validateConfigurationSettings(array $args = [])
72
+ * @method \GuzzleHttp\Promise\Promise validateConfigurationSettingsAsync(array $args = [])
73
+ */
74
+ class ElasticBeanstalkClient extends AwsClient {}
vendor/aannnaa7/aws-sdk-php-minimized/src/ElasticBeanstalk/Exception/ElasticBeanstalkException.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\ElasticBeanstalk\Exception;
3
+
4
+ use Aws\Exception\AwsException;
5
+
6
+ /**
7
+ * Represents an error interacting with the AWS Elastic Beanstalk service.
8
+ */
9
+ class ElasticBeanstalkException extends AwsException {}
vendor/aannnaa7/aws-sdk-php-minimized/src/ElasticLoadBalancing/ElasticLoadBalancingClient.php ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\ElasticLoadBalancing;
3
+
4
+ use Aws\AwsClient;
5
+
6
+ /**
7
+ * This client is used to interact with the **Elastic Load Balancing** service.
8
+ *
9
+ * @method \Aws\Result addTags(array $args = [])
10
+ * @method \GuzzleHttp\Promise\Promise addTagsAsync(array $args = [])
11
+ * @method \Aws\Result applySecurityGroupsToLoadBalancer(array $args = [])
12
+ * @method \GuzzleHttp\Promise\Promise applySecurityGroupsToLoadBalancerAsync(array $args = [])
13
+ * @method \Aws\Result attachLoadBalancerToSubnets(array $args = [])
14
+ * @method \GuzzleHttp\Promise\Promise attachLoadBalancerToSubnetsAsync(array $args = [])
15
+ * @method \Aws\Result configureHealthCheck(array $args = [])
16
+ * @method \GuzzleHttp\Promise\Promise configureHealthCheckAsync(array $args = [])
17
+ * @method \Aws\Result createAppCookieStickinessPolicy(array $args = [])
18
+ * @method \GuzzleHttp\Promise\Promise createAppCookieStickinessPolicyAsync(array $args = [])
19
+ * @method \Aws\Result createLBCookieStickinessPolicy(array $args = [])
20
+ * @method \GuzzleHttp\Promise\Promise createLBCookieStickinessPolicyAsync(array $args = [])
21
+ * @method \Aws\Result createLoadBalancer(array $args = [])
22
+ * @method \GuzzleHttp\Promise\Promise createLoadBalancerAsync(array $args = [])
23
+ * @method \Aws\Result createLoadBalancerListeners(array $args = [])
24
+ * @method \GuzzleHttp\Promise\Promise createLoadBalancerListenersAsync(array $args = [])
25
+ * @method \Aws\Result createLoadBalancerPolicy(array $args = [])
26
+ * @method \GuzzleHttp\Promise\Promise createLoadBalancerPolicyAsync(array $args = [])
27
+ * @method \Aws\Result deleteLoadBalancer(array $args = [])
28
+ * @method \GuzzleHttp\Promise\Promise deleteLoadBalancerAsync(array $args = [])
29
+ * @method \Aws\Result deleteLoadBalancerListeners(array $args = [])
30
+ * @method \GuzzleHttp\Promise\Promise deleteLoadBalancerListenersAsync(array $args = [])
31
+ * @method \Aws\Result deleteLoadBalancerPolicy(array $args = [])
32
+ * @method \GuzzleHttp\Promise\Promise deleteLoadBalancerPolicyAsync(array $args = [])
33
+ * @method \Aws\Result deregisterInstancesFromLoadBalancer(array $args = [])
34
+ * @method \GuzzleHttp\Promise\Promise deregisterInstancesFromLoadBalancerAsync(array $args = [])
35
+ * @method \Aws\Result describeInstanceHealth(array $args = [])
36
+ * @method \GuzzleHttp\Promise\Promise describeInstanceHealthAsync(array $args = [])
37
+ * @method \Aws\Result describeLoadBalancerAttributes(array $args = [])
38
+ * @method \GuzzleHttp\Promise\Promise describeLoadBalancerAttributesAsync(array $args = [])
39
+ * @method \Aws\Result describeLoadBalancerPolicies(array $args = [])
40
+ * @method \GuzzleHttp\Promise\Promise describeLoadBalancerPoliciesAsync(array $args = [])
41
+ * @method \Aws\Result describeLoadBalancerPolicyTypes(array $args = [])
42
+ * @method \GuzzleHttp\Promise\Promise describeLoadBalancerPolicyTypesAsync(array $args = [])
43
+ * @method \Aws\Result describeLoadBalancers(array $args = [])
44
+ * @method \GuzzleHttp\Promise\Promise describeLoadBalancersAsync(array $args = [])
45
+ * @method \Aws\Result describeTags(array $args = [])
46
+ * @method \GuzzleHttp\Promise\Promise describeTagsAsync(array $args = [])
47
+ * @method \Aws\Result detachLoadBalancerFromSubnets(array $args = [])
48
+ * @method \GuzzleHttp\Promise\Promise detachLoadBalancerFromSubnetsAsync(array $args = [])
49
+ * @method \Aws\Result disableAvailabilityZonesForLoadBalancer(array $args = [])
50
+ * @method \GuzzleHttp\Promise\Promise disableAvailabilityZonesForLoadBalancerAsync(array $args = [])
51
+ * @method \Aws\Result enableAvailabilityZonesForLoadBalancer(array $args = [])
52
+ * @method \GuzzleHttp\Promise\Promise enableAvailabilityZonesForLoadBalancerAsync(array $args = [])
53
+ * @method \Aws\Result modifyLoadBalancerAttributes(array $args = [])
54
+ * @method \GuzzleHttp\Promise\Promise modifyLoadBalancerAttributesAsync(array $args = [])
55
+ * @method \Aws\Result registerInstancesWithLoadBalancer(array $args = [])
56
+ * @method \GuzzleHttp\Promise\Promise registerInstancesWithLoadBalancerAsync(array $args = [])
57
+ * @method \Aws\Result removeTags(array $args = [])
58
+ * @method \GuzzleHttp\Promise\Promise removeTagsAsync(array $args = [])
59
+ * @method \Aws\Result setLoadBalancerListenerSSLCertificate(array $args = [])
60
+ * @method \GuzzleHttp\Promise\Promise setLoadBalancerListenerSSLCertificateAsync(array $args = [])
61
+ * @method \Aws\Result setLoadBalancerPoliciesForBackendServer(array $args = [])
62
+ * @method \GuzzleHttp\Promise\Promise setLoadBalancerPoliciesForBackendServerAsync(array $args = [])
63
+ * @method \Aws\Result setLoadBalancerPoliciesOfListener(array $args = [])
64
+ * @method \GuzzleHttp\Promise\Promise setLoadBalancerPoliciesOfListenerAsync(array $args = [])
65
+ */
66
+ class ElasticLoadBalancingClient extends AwsClient {}
vendor/aannnaa7/aws-sdk-php-minimized/src/ElasticLoadBalancing/Exception/ElasticLoadBalancingException.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\ElasticLoadBalancing\Exception;
3
+
4
+ use Aws\Exception\AwsException;
5
+
6
+ /**
7
+ * Represents an error interacting with the Elastic Load Balancing service.
8
+ */
9
+ class ElasticLoadBalancingException extends AwsException {}
vendor/aannnaa7/aws-sdk-php-minimized/src/ElasticTranscoder/ElasticTranscoderClient.php ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\ElasticTranscoder;
3
+
4
+ use Aws\AwsClient;
5
+
6
+ /**
7
+ * This client is used to interact with the **Amazon Elastic Transcoder** service.
8
+ *
9
+ * @method \Aws\Result cancelJob(array $args = [])
10
+ * @method \GuzzleHttp\Promise\Promise cancelJobAsync(array $args = [])
11
+ * @method \Aws\Result createJob(array $args = [])
12
+ * @method \GuzzleHttp\Promise\Promise createJobAsync(array $args = [])
13
+ * @method \Aws\Result createPipeline(array $args = [])
14
+ * @method \GuzzleHttp\Promise\Promise createPipelineAsync(array $args = [])
15
+ * @method \Aws\Result createPreset(array $args = [])
16
+ * @method \GuzzleHttp\Promise\Promise createPresetAsync(array $args = [])
17
+ * @method \Aws\Result deletePipeline(array $args = [])
18
+ * @method \GuzzleHttp\Promise\Promise deletePipelineAsync(array $args = [])
19
+ * @method \Aws\Result deletePreset(array $args = [])
20
+ * @method \GuzzleHttp\Promise\Promise deletePresetAsync(array $args = [])
21
+ * @method \Aws\Result listJobsByPipeline(array $args = [])
22
+ * @method \GuzzleHttp\Promise\Promise listJobsByPipelineAsync(array $args = [])
23
+ * @method \Aws\Result listJobsByStatus(array $args = [])
24
+ * @method \GuzzleHttp\Promise\Promise listJobsByStatusAsync(array $args = [])
25
+ * @method \Aws\Result listPipelines(array $args = [])
26
+ * @method \GuzzleHttp\Promise\Promise listPipelinesAsync(array $args = [])
27
+ * @method \Aws\Result listPresets(array $args = [])
28
+ * @method \GuzzleHttp\Promise\Promise listPresetsAsync(array $args = [])
29
+ * @method \Aws\Result readJob(array $args = [])
30
+ * @method \GuzzleHttp\Promise\Promise readJobAsync(array $args = [])
31
+ * @method \Aws\Result readPipeline(array $args = [])
32
+ * @method \GuzzleHttp\Promise\Promise readPipelineAsync(array $args = [])
33
+ * @method \Aws\Result readPreset(array $args = [])
34
+ * @method \GuzzleHttp\Promise\Promise readPresetAsync(array $args = [])
35
+ * @method \Aws\Result testRole(array $args = [])
36
+ * @method \GuzzleHttp\Promise\Promise testRoleAsync(array $args = [])
37
+ * @method \Aws\Result updatePipeline(array $args = [])
38
+ * @method \GuzzleHttp\Promise\Promise updatePipelineAsync(array $args = [])
39
+ * @method \Aws\Result updatePipelineNotifications(array $args = [])
40
+ * @method \GuzzleHttp\Promise\Promise updatePipelineNotificationsAsync(array $args = [])
41
+ * @method \Aws\Result updatePipelineStatus(array $args = [])
42
+ * @method \GuzzleHttp\Promise\Promise updatePipelineStatusAsync(array $args = [])
43
+ */
44
+ class ElasticTranscoderClient extends AwsClient {}
vendor/aannnaa7/aws-sdk-php-minimized/src/ElasticTranscoder/Exception/ElasticTranscoderException.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\ElasticTranscoder\Exception;
3
+
4
+ use Aws\Exception\AwsException;
5
+
6
+ /**
7
+ * Represents an error interacting with the Amazon Elastic Transcoder service.
8
+ */
9
+ class ElasticTranscoderException extends AwsException {}
vendor/aannnaa7/aws-sdk-php-minimized/src/ElasticsearchService/ElasticsearchServiceClient.php ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\ElasticsearchService;
3
+
4
+ use Aws\AwsClient;
5
+
6
+ /**
7
+ * This client is used to interact with the **Amazon Elasticsearch Service** service.
8
+ *
9
+ * @method \Aws\Result addTags(array $args = [])
10
+ * @method \GuzzleHttp\Promise\Promise addTagsAsync(array $args = [])
11
+ * @method \Aws\Result createElasticsearchDomain(array $args = [])
12
+ * @method \GuzzleHttp\Promise\Promise createElasticsearchDomainAsync(array $args = [])
13
+ * @method \Aws\Result deleteElasticsearchDomain(array $args = [])
14
+ * @method \GuzzleHttp\Promise\Promise deleteElasticsearchDomainAsync(array $args = [])
15
+ * @method \Aws\Result describeElasticsearchDomain(array $args = [])
16
+ * @method \GuzzleHttp\Promise\Promise describeElasticsearchDomainAsync(array $args = [])
17
+ * @method \Aws\Result describeElasticsearchDomainConfig(array $args = [])
18
+ * @method \GuzzleHttp\Promise\Promise describeElasticsearchDomainConfigAsync(array $args = [])
19
+ * @method \Aws\Result describeElasticsearchDomains(array $args = [])
20
+ * @method \GuzzleHttp\Promise\Promise describeElasticsearchDomainsAsync(array $args = [])
21
+ * @method \Aws\Result listDomainNames(array $args = [])
22
+ * @method \GuzzleHttp\Promise\Promise listDomainNamesAsync(array $args = [])
23
+ * @method \Aws\Result listTags(array $args = [])
24
+ * @method \GuzzleHttp\Promise\Promise listTagsAsync(array $args = [])
25
+ * @method \Aws\Result removeTags(array $args = [])
26
+ * @method \GuzzleHttp\Promise\Promise removeTagsAsync(array $args = [])
27
+ * @method \Aws\Result updateElasticsearchDomainConfig(array $args = [])
28
+ * @method \GuzzleHttp\Promise\Promise updateElasticsearchDomainConfigAsync(array $args = [])
29
+ */
30
+ class ElasticsearchServiceClient extends AwsClient {}
vendor/aannnaa7/aws-sdk-php-minimized/src/ElasticsearchService/Exception/ElasticsearchServiceException.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\ElasticsearchService\Exception;
3
+
4
+ use Aws\Exception\AwsException;
5
+
6
+ /**
7
+ * Represents an error interacting with the **Amazon Elasticsearch Service** service.
8
+ */
9
+ class ElasticsearchServiceException extends AwsException {}
vendor/aannnaa7/aws-sdk-php-minimized/src/Emr/EmrClient.php ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Emr;
3
+
4
+ use Aws\AwsClient;
5
+
6
+ /**
7
+ * This client is used to interact with the **Amazon Elastic MapReduce (Amazon EMR)** service.
8
+ *
9
+ * @method \Aws\Result addInstanceGroups(array $args = [])
10
+ * @method \GuzzleHttp\Promise\Promise addInstanceGroupsAsync(array $args = [])
11
+ * @method \Aws\Result addJobFlowSteps(array $args = [])
12
+ * @method \GuzzleHttp\Promise\Promise addJobFlowStepsAsync(array $args = [])
13
+ * @method \Aws\Result addTags(array $args = [])
14
+ * @method \GuzzleHttp\Promise\Promise addTagsAsync(array $args = [])
15
+ * @method \Aws\Result describeCluster(array $args = [])
16
+ * @method \GuzzleHttp\Promise\Promise describeClusterAsync(array $args = [])
17
+ * @method \Aws\Result describeJobFlows(array $args = [])
18
+ * @method \GuzzleHttp\Promise\Promise describeJobFlowsAsync(array $args = [])
19
+ * @method \Aws\Result describeStep(array $args = [])
20
+ * @method \GuzzleHttp\Promise\Promise describeStepAsync(array $args = [])
21
+ * @method \Aws\Result listBootstrapActions(array $args = [])
22
+ * @method \GuzzleHttp\Promise\Promise listBootstrapActionsAsync(array $args = [])
23
+ * @method \Aws\Result listClusters(array $args = [])
24
+ * @method \GuzzleHttp\Promise\Promise listClustersAsync(array $args = [])
25
+ * @method \Aws\Result listInstanceGroups(array $args = [])
26
+ * @method \GuzzleHttp\Promise\Promise listInstanceGroupsAsync(array $args = [])
27
+ * @method \Aws\Result listInstances(array $args = [])
28
+ * @method \GuzzleHttp\Promise\Promise listInstancesAsync(array $args = [])
29
+ * @method \Aws\Result listSteps(array $args = [])
30
+ * @method \GuzzleHttp\Promise\Promise listStepsAsync(array $args = [])
31
+ * @method \Aws\Result modifyInstanceGroups(array $args = [])
32
+ * @method \GuzzleHttp\Promise\Promise modifyInstanceGroupsAsync(array $args = [])
33
+ * @method \Aws\Result removeTags(array $args = [])
34
+ * @method \GuzzleHttp\Promise\Promise removeTagsAsync(array $args = [])
35
+ * @method \Aws\Result runJobFlow(array $args = [])
36
+ * @method \GuzzleHttp\Promise\Promise runJobFlowAsync(array $args = [])
37
+ * @method \Aws\Result setTerminationProtection(array $args = [])
38
+ * @method \GuzzleHttp\Promise\Promise setTerminationProtectionAsync(array $args = [])
39
+ * @method \Aws\Result setVisibleToAllUsers(array $args = [])
40
+ * @method \GuzzleHttp\Promise\Promise setVisibleToAllUsersAsync(array $args = [])
41
+ * @method \Aws\Result terminateJobFlows(array $args = [])
42
+ * @method \GuzzleHttp\Promise\Promise terminateJobFlowsAsync(array $args = [])
43
+ */
44
+ class EmrClient extends AwsClient {}
vendor/aannnaa7/aws-sdk-php-minimized/src/Emr/Exception/EmrException.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Emr\Exception;
3
+
4
+ use Aws\Exception\AwsException;
5
+
6
+ /**
7
+ * Represents an error interacting with the Amazon Elastic MapReduce service.
8
+ */
9
+ class EmrException extends AwsException {}
vendor/aannnaa7/aws-sdk-php-minimized/src/Endpoint/EndpointProvider.php ADDED
@@ -0,0 +1,96 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Endpoint;
3
+
4
+ use Aws\Exception\UnresolvedEndpointException;
5
+
6
+ /**
7
+ * Endpoint providers.
8
+ *
9
+ * An endpoint provider is a function that accepts a hash of endpoint options,
10
+ * including but not limited to "service" and "region" key value pairs. The
11
+ * endpoint provider function returns a hash of endpoint data, which MUST
12
+ * include an "endpoint" key value pair that represents the resolved endpoint
13
+ * or NULL if an endpoint cannot be determined.
14
+ *
15
+ * You can wrap your calls to an endpoint provider with the
16
+ * {@see EndpointProvider::resolve} function to ensure that an endpoint hash is
17
+ * created. If an endpoint hash is not created, then the resolve() function
18
+ * will throw an {@see Aws\Exception\UnresolvedEndpointException}.
19
+ *
20
+ * use Aws\Endpoint\EndpointProvider;
21
+ * $provider = EndpointProvider::defaultProvider();
22
+ * // Returns an array or NULL.
23
+ * $endpoint = $provider(['service' => 'ec2', 'region' => 'us-west-2']);
24
+ * // Returns an endpoint array or throws.
25
+ * $endpoint = EndpointProvider::resolve($provider, [
26
+ * 'service' => 'ec2',
27
+ * 'region' => 'us-west-2'
28
+ * ]);
29
+ *
30
+ * You can compose multiple providers into a single provider using
31
+ * {@see Aws\or_chain}. This function accepts providers as arguments and
32
+ * returns a new function that will invoke each provider until a non-null value
33
+ * is returned.
34
+ *
35
+ * $a = function (array $args) {
36
+ * if ($args['region'] === 'my-test-region') {
37
+ * return ['endpoint' => 'http://localhost:123/api'];
38
+ * }
39
+ * };
40
+ * $b = EndpointProvider::defaultProvider();
41
+ * $c = \Aws\or_chain($a, $b);
42
+ * $config = ['service' => 'ec2', 'region' => 'my-test-region'];
43
+ * $res = $c($config); // $a handles this.
44
+ * $config['region'] = 'us-west-2';
45
+ * $res = $c($config); // $b handles this.
46
+ */
47
+ class EndpointProvider
48
+ {
49
+ /**
50
+ * Resolves and endpoint provider and ensures a non-null return value.
51
+ *
52
+ * @param callable $provider Provider function to invoke.
53
+ * @param array $args Endpoint arguments to pass to the provider.
54
+ *
55
+ * @return array
56
+ * @throws UnresolvedEndpointException
57
+ */
58
+ public static function resolve(callable $provider, array $args = [])
59
+ {
60
+ $result = $provider($args);
61
+ if (is_array($result)) {
62
+ return $result;
63
+ }
64
+
65
+ throw new UnresolvedEndpointException(
66
+ 'Unable to resolve an endpoint using the provider arguments: '
67
+ . json_encode($args) . '. Note: you can provide an "endpoint" '
68
+ . 'option to a client constructor to bypass invoking an endpoint '
69
+ . 'provider.');
70
+ }
71
+
72
+ /**
73
+ * Creates and returns the default SDK endpoint provider.
74
+ *
75
+ * @return callable
76
+ */
77
+ public static function defaultProvider()
78
+ {
79
+ $data = \Aws\load_compiled_json(__DIR__ . '/../data/endpoints.json');
80
+
81
+ return new PatternEndpointProvider($data['endpoints']);
82
+ }
83
+
84
+ /**
85
+ * Creates and returns an endpoint provider that uses patterns from an
86
+ * array.
87
+ *
88
+ * @param array $patterns Endpoint patterns
89
+ *
90
+ * @return callable
91
+ */
92
+ public static function patterns(array $patterns)
93
+ {
94
+ return new PatternEndpointProvider($patterns);
95
+ }
96
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Endpoint/PatternEndpointProvider.php ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Endpoint;
3
+
4
+ /**
5
+ * Provides endpoints based on an endpoint pattern configuration array.
6
+ */
7
+ class PatternEndpointProvider
8
+ {
9
+ /** @var array */
10
+ private $patterns;
11
+
12
+ /**
13
+ * @param array $patterns Hash of endpoint patterns mapping to endpoint
14
+ * configurations.
15
+ */
16
+ public function __construct(array $patterns)
17
+ {
18
+ $this->patterns = $patterns;
19
+ }
20
+
21
+ public function __invoke(array $args = [])
22
+ {
23
+ $service = isset($args['service']) ? $args['service'] : '';
24
+ $region = isset($args['region']) ? $args['region'] : '';
25
+ $keys = ["{$region}/{$service}", "{$region}/*", "*/{$service}", "*/*"];
26
+
27
+ foreach ($keys as $key) {
28
+ if (isset($this->patterns[$key])) {
29
+ return $this->expand(
30
+ $this->patterns[$key],
31
+ isset($args['scheme']) ? $args['scheme'] : 'https',
32
+ $service,
33
+ $region
34
+ );
35
+ }
36
+ }
37
+
38
+ return null;
39
+ }
40
+
41
+ private function expand(array $config, $scheme, $service, $region)
42
+ {
43
+ $config['endpoint'] = $scheme . '://'
44
+ . strtr($config['endpoint'], [
45
+ '{service}' => $service,
46
+ '{region}' => $region
47
+ ]);
48
+
49
+ return $config;
50
+ }
51
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Exception/AwsException.php ADDED
@@ -0,0 +1,160 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Exception;
3
+
4
+ use Psr\Http\Message\ResponseInterface;
5
+ use Psr\Http\Message\RequestInterface;
6
+ use Aws\CommandInterface;
7
+ use Aws\ResultInterface;
8
+
9
+ /**
10
+ * Represents an AWS exception that is thrown when a command fails.
11
+ */
12
+ class AwsException extends \RuntimeException
13
+ {
14
+ /** @var ResponseInterface */
15
+ private $response;
16
+ private $request;
17
+ private $result;
18
+ private $command;
19
+ private $requestId;
20
+ private $errorType;
21
+ private $errorCode;
22
+ private $connectionError;
23
+
24
+ /**
25
+ * @param string $message Exception message
26
+ * @param CommandInterface $command
27
+ * @param array $context Exception context
28
+ * @param \Exception $previous Previous exception (if any)
29
+ */
30
+ public function __construct(
31
+ $message,
32
+ CommandInterface $command,
33
+ array $context = [],
34
+ \Exception $previous = null
35
+ ) {
36
+ $this->command = $command;
37
+ $this->response = isset($context['response']) ? $context['response'] : null;
38
+ $this->request = isset($context['request']) ? $context['request'] : null;
39
+ $this->requestId = isset($context['request_id'])
40
+ ? $context['request_id']
41
+ : null;
42
+ $this->errorType = isset($context['type']) ? $context['type'] : null;
43
+ $this->errorCode = isset($context['code']) ? $context['code'] : null;
44
+ $this->connectionError = !empty($context['connection_error']);
45
+ $this->result = isset($context['result']) ? $context['result'] : null;
46
+ parent::__construct($message, 0, $previous);
47
+ }
48
+
49
+ public function __toString()
50
+ {
51
+ if (!$this->getPrevious()) {
52
+ return parent::__toString();
53
+ }
54
+
55
+ // PHP strangely shows the innermost exception first before the outer
56
+ // exception message. It also has a default character limit for
57
+ // exception message strings such that the "next" exception (this one)
58
+ // might not even get shown, causing developers to attempt to catch
59
+ // the inner exception instead of the actual exception because they
60
+ // can't see the outer exception's __toString output.
61
+ return sprintf(
62
+ "exception '%s' with message '%s'\n\n%s",
63
+ get_class($this),
64
+ $this->getMessage(),
65
+ parent::__toString()
66
+ );
67
+ }
68
+
69
+ /**
70
+ * Get the command that was executed.
71
+ *
72
+ * @return CommandInterface
73
+ */
74
+ public function getCommand()
75
+ {
76
+ return $this->command;
77
+ }
78
+
79
+ /**
80
+ * Get the sent HTTP request if any.
81
+ *
82
+ * @return RequestInterface|null
83
+ */
84
+ public function getRequest()
85
+ {
86
+ return $this->request;
87
+ }
88
+
89
+ /**
90
+ * Get the received HTTP response if any.
91
+ *
92
+ * @return ResponseInterface|null
93
+ */
94
+ public function getResponse()
95
+ {
96
+ return $this->response;
97
+ }
98
+
99
+ /**
100
+ * Get the result of the exception if available
101
+ *
102
+ * @return ResultInterface|null
103
+ */
104
+ public function getResult()
105
+ {
106
+ return $this->result;
107
+ }
108
+
109
+ /**
110
+ * Returns true if this is a connection error.
111
+ *
112
+ * @return bool
113
+ */
114
+ public function isConnectionError()
115
+ {
116
+ return $this->connectionError;
117
+ }
118
+
119
+ /**
120
+ * If available, gets the HTTP status code of the corresponding response
121
+ *
122
+ * @return int|null
123
+ */
124
+ public function getStatusCode()
125
+ {
126
+ return $this->response ? $this->response->getStatusCode() : null;
127
+ }
128
+
129
+ /**
130
+ * Get the request ID of the error. This value is only present if a
131
+ * response was received and is not present in the event of a networking
132
+ * error.
133
+ *
134
+ * @return string|null Returns null if no response was received
135
+ */
136
+ public function getAwsRequestId()
137
+ {
138
+ return $this->requestId;
139
+ }
140
+
141
+ /**
142
+ * Get the AWS error type.
143
+ *
144
+ * @return string|null Returns null if no response was received
145
+ */
146
+ public function getAwsErrorType()
147
+ {
148
+ return $this->errorType;
149
+ }
150
+
151
+ /**
152
+ * Get the AWS error code.
153
+ *
154
+ * @return string|null Returns null if no response was received
155
+ */
156
+ public function getAwsErrorCode()
157
+ {
158
+ return $this->errorCode;
159
+ }
160
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Exception/CouldNotCreateChecksumException.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Exception;
3
+
4
+ class CouldNotCreateChecksumException extends \RuntimeException
5
+ {
6
+ public function __construct($algorithm, \Exception $previous = null)
7
+ {
8
+ $prefix = $algorithm === 'md5' ? "An" : "A";
9
+ parent::__construct("{$prefix} {$algorithm} checksum could not be "
10
+ . "calculated for the provided upload body, because it was not "
11
+ . "seekable. To prevent this error you can either 1) include the "
12
+ . "ContentMD5 or ContentSHA256 parameters with your request, 2) "
13
+ . "use a seekable stream for the body, or 3) wrap the non-seekable "
14
+ . "stream in a GuzzleHttp\\Psr7\\CachingStream object. You "
15
+ . "should be careful though and remember that the CachingStream "
16
+ . "utilizes PHP temp streams. This means that the stream will be "
17
+ . "temporarily stored on the local disk.", 0, $previous);
18
+ }
19
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Exception/CredentialsException.php ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <?php
2
+ namespace Aws\Exception;
3
+
4
+ class CredentialsException extends \RuntimeException {}
vendor/aannnaa7/aws-sdk-php-minimized/src/Exception/MultipartUploadException.php ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Exception;
3
+
4
+ use Aws\Multipart\UploadState;
5
+
6
+ class MultipartUploadException extends \RuntimeException
7
+ {
8
+ /** @var UploadState State of the erroneous transfer */
9
+ private $state;
10
+
11
+ /**
12
+ * @param UploadState $state Upload state at time of the exception.
13
+ * @param \Exception|array $prev Exception being thrown.
14
+ */
15
+ public function __construct(UploadState $state, $prev = null) {
16
+ $msg = 'An exception occurred while performing a multipart upload.';
17
+
18
+ if (is_array($prev)) {
19
+ $msg = strtr($msg, ['performing' => 'uploading parts to']);
20
+ $msg .= " The following parts had errors:\n";
21
+ /** @var $error AwsException */
22
+ foreach ($prev as $part => $error) {
23
+ $msg .= "- Part {$part}: " . $error->getMessage(). "\n";
24
+ }
25
+ } elseif ($prev instanceof AwsException) {
26
+ switch ($prev->getCommand()->getName()) {
27
+ case 'CreateMultipartUpload':
28
+ case 'InitiateMultipartUpload':
29
+ $action = 'initiating';
30
+ break;
31
+ case 'CompleteMultipartUpload':
32
+ $action = 'completing';
33
+ break;
34
+ }
35
+ if (isset($action)) {
36
+ $msg = strtr($msg, ['performing' => $action]);
37
+ }
38
+ }
39
+
40
+ if (!$prev instanceof \Exception) {
41
+ $prev = null;
42
+ }
43
+
44
+ parent::__construct($msg, 0, $prev);
45
+ $this->state = $state;
46
+ }
47
+
48
+ /**
49
+ * Get the state of the transfer
50
+ *
51
+ * @return UploadState
52
+ */
53
+ public function getState()
54
+ {
55
+ return $this->state;
56
+ }
57
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Exception/UnresolvedApiException.php ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <?php
2
+ namespace Aws\Exception;
3
+
4
+ class UnresolvedApiException extends \RuntimeException {}
vendor/aannnaa7/aws-sdk-php-minimized/src/Exception/UnresolvedEndpointException.php ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <?php
2
+ namespace Aws\Exception;
3
+
4
+ class UnresolvedEndpointException extends \RuntimeException {}
vendor/aannnaa7/aws-sdk-php-minimized/src/Exception/UnresolvedSignatureException.php ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <?php
2
+ namespace Aws\Exception;
3
+
4
+ class UnresolvedSignatureException extends \RuntimeException {}
vendor/aannnaa7/aws-sdk-php-minimized/src/Firehose/Exception/FirehoseException.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Firehose\Exception;
3
+
4
+ use Aws\Exception\AwsException;
5
+
6
+ /**
7
+ * Represents an error interacting with the **Amazon Kinesis Firehose** service.
8
+ */
9
+ class FirehoseException extends AwsException {}
vendor/aannnaa7/aws-sdk-php-minimized/src/Firehose/FirehoseClient.php ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Firehose;
3
+
4
+ use Aws\AwsClient;
5
+
6
+ /**
7
+ * This client is used to interact with the **Amazon Kinesis Firehose** service.
8
+ *
9
+ * @method \Aws\Result createDeliveryStream(array $args = [])
10
+ * @method \GuzzleHttp\Promise\Promise createDeliveryStreamAsync(array $args = [])
11
+ * @method \Aws\Result deleteDeliveryStream(array $args = [])
12
+ * @method \GuzzleHttp\Promise\Promise deleteDeliveryStreamAsync(array $args = [])
13
+ * @method \Aws\Result describeDeliveryStream(array $args = [])
14
+ * @method \GuzzleHttp\Promise\Promise describeDeliveryStreamAsync(array $args = [])
15
+ * @method \Aws\Result listDeliveryStreams(array $args = [])
16
+ * @method \GuzzleHttp\Promise\Promise listDeliveryStreamsAsync(array $args = [])
17
+ * @method \Aws\Result putRecord(array $args = [])
18
+ * @method \GuzzleHttp\Promise\Promise putRecordAsync(array $args = [])
19
+ * @method \Aws\Result putRecordBatch(array $args = [])
20
+ * @method \GuzzleHttp\Promise\Promise putRecordBatchAsync(array $args = [])
21
+ * @method \Aws\Result updateDestination(array $args = [])
22
+ * @method \GuzzleHttp\Promise\Promise updateDestinationAsync(array $args = [])
23
+ */
24
+ class FirehoseClient extends AwsClient {}
vendor/aannnaa7/aws-sdk-php-minimized/src/Glacier/Exception/GlacierException.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Glacier\Exception;
3
+
4
+ use Aws\Exception\AwsException;
5
+
6
+ /**
7
+ * Represents an error interacting with the Amazon Glacier service.
8
+ */
9
+ class GlacierException extends AwsException {}
vendor/aannnaa7/aws-sdk-php-minimized/src/Glacier/GlacierClient.php ADDED
@@ -0,0 +1,247 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Glacier;
3
+
4
+ use Aws\Api\ApiProvider;
5
+ use Aws\Api\DocModel;
6
+ use Aws\Api\Service;
7
+ use Aws\AwsClient;
8
+ use Aws\CommandInterface;
9
+ use Aws\Exception\CouldNotCreateChecksumException;
10
+ use Aws\HashingStream;
11
+ use Aws\Middleware;
12
+ use Aws\PhpHash;
13
+ use Psr\Http\Message\RequestInterface;
14
+
15
+ /**
16
+ * This client is used to interact with the **Amazon Glacier** service.
17
+ *
18
+ * @method \Aws\Result abortMultipartUpload(array $args = [])
19
+ * @method \GuzzleHttp\Promise\Promise abortMultipartUploadAsync(array $args = [])
20
+ * @method \Aws\Result abortVaultLock(array $args = [])
21
+ * @method \GuzzleHttp\Promise\Promise abortVaultLockAsync(array $args = [])
22
+ * @method \Aws\Result addTagsToVault(array $args = [])
23
+ * @method \GuzzleHttp\Promise\Promise addTagsToVaultAsync(array $args = [])
24
+ * @method \Aws\Result completeMultipartUpload(array $args = [])
25
+ * @method \GuzzleHttp\Promise\Promise completeMultipartUploadAsync(array $args = [])
26
+ * @method \Aws\Result completeVaultLock(array $args = [])
27
+ * @method \GuzzleHttp\Promise\Promise completeVaultLockAsync(array $args = [])
28
+ * @method \Aws\Result createVault(array $args = [])
29
+ * @method \GuzzleHttp\Promise\Promise createVaultAsync(array $args = [])
30
+ * @method \Aws\Result deleteArchive(array $args = [])
31
+ * @method \GuzzleHttp\Promise\Promise deleteArchiveAsync(array $args = [])
32
+ * @method \Aws\Result deleteVault(array $args = [])
33
+ * @method \GuzzleHttp\Promise\Promise deleteVaultAsync(array $args = [])
34
+ * @method \Aws\Result deleteVaultAccessPolicy(array $args = [])
35
+ * @method \GuzzleHttp\Promise\Promise deleteVaultAccessPolicyAsync(array $args = [])
36
+ * @method \Aws\Result deleteVaultNotifications(array $args = [])
37
+ * @method \GuzzleHttp\Promise\Promise deleteVaultNotificationsAsync(array $args = [])
38
+ * @method \Aws\Result describeJob(array $args = [])
39
+ * @method \GuzzleHttp\Promise\Promise describeJobAsync(array $args = [])
40
+ * @method \Aws\Result describeVault(array $args = [])
41
+ * @method \GuzzleHttp\Promise\Promise describeVaultAsync(array $args = [])
42
+ * @method \Aws\Result getDataRetrievalPolicy(array $args = [])
43
+ * @method \GuzzleHttp\Promise\Promise getDataRetrievalPolicyAsync(array $args = [])
44
+ * @method \Aws\Result getJobOutput(array $args = [])
45
+ * @method \GuzzleHttp\Promise\Promise getJobOutputAsync(array $args = [])
46
+ * @method \Aws\Result getVaultAccessPolicy(array $args = [])
47
+ * @method \GuzzleHttp\Promise\Promise getVaultAccessPolicyAsync(array $args = [])
48
+ * @method \Aws\Result getVaultLock(array $args = [])
49
+ * @method \GuzzleHttp\Promise\Promise getVaultLockAsync(array $args = [])
50
+ * @method \Aws\Result getVaultNotifications(array $args = [])
51
+ * @method \GuzzleHttp\Promise\Promise getVaultNotificationsAsync(array $args = [])
52
+ * @method \Aws\Result initiateJob(array $args = [])
53
+ * @method \GuzzleHttp\Promise\Promise initiateJobAsync(array $args = [])
54
+ * @method \Aws\Result initiateMultipartUpload(array $args = [])
55
+ * @method \GuzzleHttp\Promise\Promise initiateMultipartUploadAsync(array $args = [])
56
+ * @method \Aws\Result initiateVaultLock(array $args = [])
57
+ * @method \GuzzleHttp\Promise\Promise initiateVaultLockAsync(array $args = [])
58
+ * @method \Aws\Result listJobs(array $args = [])
59
+ * @method \GuzzleHttp\Promise\Promise listJobsAsync(array $args = [])
60
+ * @method \Aws\Result listMultipartUploads(array $args = [])
61
+ * @method \GuzzleHttp\Promise\Promise listMultipartUploadsAsync(array $args = [])
62
+ * @method \Aws\Result listParts(array $args = [])
63
+ * @method \GuzzleHttp\Promise\Promise listPartsAsync(array $args = [])
64
+ * @method \Aws\Result listTagsForVault(array $args = [])
65
+ * @method \GuzzleHttp\Promise\Promise listTagsForVaultAsync(array $args = [])
66
+ * @method \Aws\Result listVaults(array $args = [])
67
+ * @method \GuzzleHttp\Promise\Promise listVaultsAsync(array $args = [])
68
+ * @method \Aws\Result removeTagsFromVault(array $args = [])
69
+ * @method \GuzzleHttp\Promise\Promise removeTagsFromVaultAsync(array $args = [])
70
+ * @method \Aws\Result setDataRetrievalPolicy(array $args = [])
71
+ * @method \GuzzleHttp\Promise\Promise setDataRetrievalPolicyAsync(array $args = [])
72
+ * @method \Aws\Result setVaultAccessPolicy(array $args = [])
73
+ * @method \GuzzleHttp\Promise\Promise setVaultAccessPolicyAsync(array $args = [])
74
+ * @method \Aws\Result setVaultNotifications(array $args = [])
75
+ * @method \GuzzleHttp\Promise\Promise setVaultNotificationsAsync(array $args = [])
76
+ * @method \Aws\Result uploadArchive(array $args = [])
77
+ * @method \GuzzleHttp\Promise\Promise uploadArchiveAsync(array $args = [])
78
+ * @method \Aws\Result uploadMultipartPart(array $args = [])
79
+ * @method \GuzzleHttp\Promise\Promise uploadMultipartPartAsync(array $args = [])
80
+ */
81
+ class GlacierClient extends AwsClient
82
+ {
83
+ public function __construct(array $args)
84
+ {
85
+ parent::__construct($args);
86
+
87
+ // Setup middleware.
88
+ $stack = $this->getHandlerList();
89
+ $stack->appendBuild($this->getApiVersionMiddleware(), 'glacier.api_version');
90
+ $stack->appendBuild($this->getChecksumsMiddleware(), 'glacier.checksum');
91
+ $stack->appendBuild(
92
+ Middleware::contentType(['UploadArchive', 'UploadPart']),
93
+ 'glacier.content_type'
94
+ );
95
+ $stack->appendInit(
96
+ Middleware::sourceFile($this->getApi(), 'body', 'sourceFile'),
97
+ 'glacier.source_file'
98
+ );
99
+ }
100
+
101
+ /**
102
+ * {@inheritdoc}
103
+ *
104
+ * Sets the default accountId to "-" for all operations.
105
+ */
106
+ public function getCommand($name, array $args = [])
107
+ {
108
+ return parent::getCommand($name, $args + ['accountId' => '-']);
109
+ }
110
+
111
+ /**
112
+ * Creates a middleware that updates a command with the content and tree
113
+ * hash headers for upload operations.
114
+ *
115
+ * @return callable
116
+ * @throws CouldNotCreateChecksumException if the body is not seekable.
117
+ */
118
+ private function getChecksumsMiddleware()
119
+ {
120
+ return function (callable $handler) {
121
+ return function (
122
+ CommandInterface $command,
123
+ RequestInterface $request = null
124
+ ) use ($handler) {
125
+ // Accept "ContentSHA256" with a lowercase "c" to match other Glacier params.
126
+ if (!$command['ContentSHA256'] && $command['contentSHA256']) {
127
+ $command['ContentSHA256'] = $command['contentSHA256'];
128
+ unset($command['contentSHA256']);
129
+ }
130
+
131
+ // If uploading, then make sure checksums are added.
132
+ $name = $command->getName();
133
+ if (($name === 'UploadArchive' || $name === 'UploadMultipartPart')
134
+ && (!$command['checksum'] || !$command['ContentSHA256'])
135
+ ) {
136
+ $body = $request->getBody();
137
+ if (!$body->isSeekable()) {
138
+ throw new CouldNotCreateChecksumException('sha256');
139
+ }
140
+
141
+ // Add a tree hash if not provided.
142
+ if (!$command['checksum']) {
143
+ $body = new HashingStream(
144
+ $body, new TreeHash(),
145
+ function ($result) use ($command, &$request) {
146
+ $request = $request->withHeader(
147
+ 'x-amz-sha256-tree-hash',
148
+ bin2hex($result)
149
+ );
150
+ }
151
+ );
152
+ }
153
+
154
+ // Add a linear content hash if not provided.
155
+ if (!$command['ContentSHA256']) {
156
+ $body = new HashingStream(
157
+ $body, new PhpHash('sha256'),
158
+ function ($result) use ($command) {
159
+ $command['ContentSHA256'] = bin2hex($result);
160
+ }
161
+ );
162
+ }
163
+
164
+ // Read the stream in order to calculate the hashes.
165
+ while (!$body->eof()) {
166
+ $body->read(1048576);
167
+ }
168
+ $body->seek(0);
169
+ }
170
+
171
+ // Set the content hash header if a value is in the command.
172
+ if ($command['ContentSHA256']) {
173
+ $request = $request->withHeader(
174
+ 'x-amz-content-sha256',
175
+ $command['ContentSHA256']
176
+ );
177
+ }
178
+
179
+ return $handler($command, $request);
180
+ };
181
+ };
182
+ }
183
+
184
+ /**
185
+ * Creates a middleware that adds the API version header for all requests.
186
+ *
187
+ * @return callable
188
+ */
189
+ private function getApiVersionMiddleware()
190
+ {
191
+ return function (callable $handler) {
192
+ return function (
193
+ CommandInterface $command,
194
+ RequestInterface $request = null
195
+ ) use ($handler) {
196
+ return $handler($command, $request->withHeader(
197
+ 'x-amz-glacier-version',
198
+ $this->getApi()->getMetadata('apiVersion')
199
+ ));
200
+ };
201
+ };
202
+ }
203
+
204
+ /**
205
+ * @internal
206
+ * @codeCoverageIgnore
207
+ */
208
+ public static function applyDocFilters(array $api, array $docs)
209
+ {
210
+ // Add the SourceFile parameter.
211
+ $docs['shapes']['SourceFile']['base'] = 'The path to a file on disk to use instead of the body parameter.';
212
+ $api['shapes']['SourceFile'] = ['type' => 'string'];
213
+ $api['shapes']['UploadArchiveInput']['members']['sourceFile'] = ['shape' => 'SourceFile'];
214
+ $api['shapes']['UploadMultipartPartInput']['members']['sourceFile'] = ['shape' => 'SourceFile'];
215
+
216
+ // Add the ContentSHA256 parameter.
217
+ $docs['shapes']['ContentSHA256']['base'] = 'A SHA256 hash of the content of the request body';
218
+ $api['shapes']['ContentSHA256'] = ['type' => 'string'];
219
+ $api['shapes']['UploadArchiveInput']['members']['contentSHA256'] = ['shape' => 'ContentSHA256'];
220
+ $api['shapes']['UploadMultipartPartInput']['members']['contentSHA256'] = ['shape' => 'ContentSHA256'];
221
+
222
+ // Add information about "checksum" and "ContentSHA256" being optional.
223
+ $optional = '<div class="alert alert-info">The SDK will compute this value '
224
+ . 'for you on your behalf if it is not supplied.</div>';
225
+ $docs['shapes']['checksum']['append'] = $optional;
226
+ $docs['shapes']['ContentSHA256']['append'] = $optional;
227
+
228
+ // Make "accountId" optional for all operations.
229
+ foreach ($api['operations'] as $operation) {
230
+ $inputShape =& $api['shapes'][$operation['input']['shape']];
231
+ $accountIdIndex = array_search('accountId', $inputShape['required']);
232
+ unset($inputShape['required'][$accountIdIndex]);
233
+ }
234
+ // Add information about the default value for "accountId".
235
+ $optional = '<div class="alert alert-info">The SDK will set this value to "-" by default.</div>';
236
+ foreach ($docs['shapes']['string']['refs'] as $name => &$ref) {
237
+ if (strpos($name, 'accountId')) {
238
+ $ref .= $optional;
239
+ }
240
+ }
241
+
242
+ return [
243
+ new Service($api, ApiProvider::defaultProvider()),
244
+ new DocModel($docs)
245
+ ];
246
+ }
247
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Glacier/MultipartUploader.php ADDED
@@ -0,0 +1,281 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Glacier;
3
+
4
+ use Aws\CommandInterface;
5
+ use Aws\HashingStream;
6
+ use Aws\Multipart\AbstractUploader;
7
+ use Aws\Multipart\UploadState;
8
+ use Aws\PhpHash;
9
+ use Aws\ResultInterface;
10
+ use GuzzleHttp\Psr7;
11
+ use Psr\Http\Message\StreamInterface as Stream;
12
+
13
+ /**
14
+ * Encapsulates the execution of a multipart upload to Glacier.
15
+ */
16
+ class MultipartUploader extends AbstractUploader
17
+ {
18
+ const PART_MIN_SIZE = 1048576;
19
+
20
+ private static $validPartSizes = [
21
+ 1048576, // 1 MB
22
+ 2097152, // 2 MB
23
+ 4194304, // 4 MB
24
+ 8388608, // 8 MB
25
+ 16777216, // 16 MB
26
+ 33554432, // 32 MB
27
+ 67108864, // 64 MB
28
+ 134217728, // 128 MB
29
+ 268435456, // 256 MB
30
+ 536870912, // 512 MB
31
+ 1073741824, // 1 GB
32
+ 2147483648, // 2 GB
33
+ 4294967296, // 4 GB
34
+ ];
35
+
36
+ /**
37
+ * Creates an UploadState object for a multipart upload by querying the
38
+ * service for the specified upload's information.
39
+ *
40
+ * @param GlacierClient $client GlacierClient object to use.
41
+ * @param string $vaultName Vault name for the multipart upload.
42
+ * @param string $uploadId Upload ID for the multipart upload.
43
+ * @param string $accountId Account ID for the multipart upload.
44
+ *
45
+ * @return UploadState
46
+ */
47
+ public static function getStateFromService(
48
+ GlacierClient $client,
49
+ $vaultName,
50
+ $uploadId,
51
+ $accountId = '-'
52
+ ) {
53
+ $state = new UploadState([
54
+ 'accountId' => $accountId,
55
+ 'vaultName' => $vaultName,
56
+ 'uploadId' => $uploadId,
57
+ ]);
58
+
59
+ foreach ($client->getPaginator('ListParts', $state->getId()) as $result) {
60
+ // Get the part size from the first part in the first result.
61
+ if (!$state->getPartSize()) {
62
+ $state->setPartSize($result['PartSizeInBytes']);
63
+ }
64
+ // Mark all the parts returned by ListParts as uploaded.
65
+ foreach ($result['Parts'] as $part) {
66
+ list($rangeIndex, $rangeSize) = self::parseRange(
67
+ $part['RangeInBytes'],
68
+ $state->getPartSize()
69
+ );
70
+ $state->markPartAsUploaded($rangeIndex, [
71
+ 'size' => $rangeSize,
72
+ 'checksum' => $part['SHA256TreeHash'],
73
+ ]);
74
+ }
75
+ }
76
+
77
+ $state->setStatus(UploadState::INITIATED);
78
+
79
+ return $state;
80
+ }
81
+
82
+ /**
83
+ * Creates a multipart upload for a Glacier archive.
84
+ *
85
+ * The valid configuration options are as follows:
86
+ *
87
+ * - account_id: (string, default=string('-')) Account ID for the archive
88
+ * being uploaded, if different from the account making the request.
89
+ * - archive_description: (string) Description of the archive.
90
+ * - before_complete: (callable) Callback to invoke before the
91
+ * `CompleteMultipartUpload` operation. The callback should have a
92
+ * function signature like `function (Aws\Command $command) {...}`.
93
+ * - before_initiate: (callable) Callback to invoke before the
94
+ * `InitiateMultipartUpload` operation. The callback should have a
95
+ * function signature like `function (Aws\Command $command) {...}`.
96
+ * - before_upload: (callable) Callback to invoke before any
97
+ * `UploadMultipartPart` operations. The callback should have a function
98
+ * signature like `function (Aws\Command $command) {...}`.
99
+ * - concurrency: (int, default=int(3)) Maximum number of concurrent
100
+ * `UploadMultipartPart` operations allowed during the multipart upload.
101
+ * - part_size: (int, default=int(1048576)) Part size, in bytes, to use when
102
+ * doing a multipart upload. This must between 1 MB and 4 GB, and must be
103
+ * a power of 2 (in megabytes).
104
+ * - state: (Aws\Multipart\UploadState) An object that represents the state
105
+ * of the multipart upload and that is used to resume a previous upload.
106
+ * When this options is provided, the `account_id`, `key`, and `part_size`
107
+ * options are ignored.
108
+ * - vault_name: (string, required) Vault name to use for the archive being
109
+ * uploaded.
110
+ *
111
+ * @param GlacierClient $client Client used for the upload.
112
+ * @param mixed $source Source of the data to upload.
113
+ * @param array $config Configuration used to perform the upload.
114
+ */
115
+ public function __construct(GlacierClient $client, $source, array $config = [])
116
+ {
117
+ parent::__construct($client, $source, $config + [
118
+ 'account_id' => '-',
119
+ 'vault_name' => null,
120
+ ]);
121
+ }
122
+
123
+ protected function loadUploadWorkflowInfo()
124
+ {
125
+ return [
126
+ 'command' => [
127
+ 'initiate' => 'InitiateMultipartUpload',
128
+ 'upload' => 'UploadMultipartPart',
129
+ 'complete' => 'CompleteMultipartUpload',
130
+ ],
131
+ 'id' => [
132
+ 'account_id' => 'accountId',
133
+ 'vault_name' => 'vaultName',
134
+ 'upload_id' => 'uploadId',
135
+ ],
136
+ 'part_num' => 'range',
137
+ ];
138
+ }
139
+
140
+ protected function determinePartSize()
141
+ {
142
+ // Make sure the part size is set.
143
+ $partSize = $this->config['part_size'] ?: self::PART_MIN_SIZE;
144
+
145
+ // Ensure that the part size is valid.
146
+ if (!in_array($partSize, self::$validPartSizes)) {
147
+ throw new \InvalidArgumentException('The part_size must be a power '
148
+ . 'of 2, in megabytes, such that 1 MB <= PART_SIZE <= 4 GB.');
149
+ }
150
+
151
+ return $partSize;
152
+ }
153
+
154
+ protected function createPart($seekable, $number)
155
+ {
156
+ $data = [];
157
+ $firstByte = $this->source->tell();
158
+
159
+ // Read from the source to create the body stream. This also
160
+ // calculates the linear and tree hashes as the data is read.
161
+ if ($seekable) {
162
+ // Case 1: Stream is seekable, can make stream from new handle.
163
+ $body = Psr7\try_fopen($this->source->getMetadata('uri'), 'r');
164
+ $body = $this->limitPartStream(Psr7\stream_for($body));
165
+ // Create another stream decorated with hashing streams and read
166
+ // through it, so we can get the hash values for the part.
167
+ $decoratedBody = $this->decorateWithHashes($body, $data);
168
+ while (!$decoratedBody->eof()) $decoratedBody->read(1048576);
169
+ // Seek the original source forward to the end of the range.
170
+ $this->source->seek($this->source->tell() + $body->getSize());
171
+ } else {
172
+ // Case 2: Stream is not seekable, must store part in temp stream.
173
+ $source = $this->limitPartStream($this->source);
174
+ $source = $this->decorateWithHashes($source, $data);
175
+ $body = Psr7\stream_for();
176
+ Psr7\copy_to_stream($source, $body);
177
+ }
178
+
179
+ // Do not create a part if the body size is zero.
180
+ if ($body->getSize() === 0) {
181
+ return false;
182
+ }
183
+
184
+ $body->seek(0);
185
+ $data['body'] = $body;
186
+ $lastByte = $this->source->tell() - 1;
187
+ $data['range'] = "bytes {$firstByte}-{$lastByte}/*";
188
+
189
+ return $data;
190
+ }
191
+
192
+ protected function handleResult(CommandInterface $command, ResultInterface $result)
193
+ {
194
+ list($rangeIndex, $rangeSize) = $this->parseRange(
195
+ $command['range'],
196
+ $this->state->getPartSize()
197
+ );
198
+
199
+ $this->state->markPartAsUploaded($rangeIndex, [
200
+ 'size' => $rangeSize,
201
+ 'checksum' => $command['checksum']
202
+ ]);
203
+ }
204
+
205
+ protected function getInitiateParams()
206
+ {
207
+ $params = ['partSize' => $this->state->getPartSize()];
208
+ if (isset($this->config['archive_description'])) {
209
+ $params['archiveDescription'] = $this->config['archive_description'];
210
+ }
211
+
212
+ return $params;
213
+ }
214
+
215
+ protected function getCompleteParams()
216
+ {
217
+ $treeHash = new TreeHash();
218
+ $archiveSize = 0;
219
+ foreach ($this->state->getUploadedParts() as $part) {
220
+ $archiveSize += $part['size'];
221
+ $treeHash->addChecksum($part['checksum']);
222
+ }
223
+
224
+ return [
225
+ 'archiveSize' => $archiveSize,
226
+ 'checksum' => bin2hex($treeHash->complete()),
227
+ ];
228
+ }
229
+
230
+ /**
231
+ * Decorates a stream with a tree AND linear sha256 hashing stream.
232
+ *
233
+ * @param Stream $stream Stream to decorate.
234
+ * @param array $data Data bag that results are injected into.
235
+ *
236
+ * @return Stream
237
+ */
238
+ private function decorateWithHashes(Stream $stream, array &$data)
239
+ {
240
+ // Make sure that a tree hash is calculated.
241
+ $stream = new HashingStream($stream, new TreeHash(),
242
+ function ($result) use (&$data) {
243
+ $data['checksum'] = bin2hex($result);
244
+ }
245
+ );
246
+
247
+ // Make sure that a linear SHA256 hash is calculated.
248
+ $stream = new HashingStream($stream, new PhpHash('sha256'),
249
+ function ($result) use (&$data) {
250
+ $data['ContentSHA256'] = bin2hex($result);
251
+ }
252
+ );
253
+
254
+ return $stream;
255
+ }
256
+
257
+ /**
258
+ * Parses a Glacier range string into a size and part number.
259
+ *
260
+ * @param string $range Glacier range string (e.g., "bytes 5-5000/*")
261
+ * @param int $partSize The chosen part size
262
+ *
263
+ * @return array
264
+ */
265
+ private static function parseRange($range, $partSize)
266
+ {
267
+ // Strip away the prefix and suffix.
268
+ if (strpos($range, 'bytes') !== false) {
269
+ $range = substr($range, 6, -2);
270
+ }
271
+
272
+ // Split that range into it's parts.
273
+ list($firstByte, $lastByte) = explode('-', $range);
274
+
275
+ // Calculate and return range index and range size
276
+ return [
277
+ intval($firstByte / $partSize) + 1,
278
+ $lastByte - $firstByte + 1,
279
+ ];
280
+ }
281
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Glacier/TreeHash.php ADDED
@@ -0,0 +1,118 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Glacier;
3
+
4
+ use Aws\HashInterface;
5
+
6
+ /**
7
+ * Encapsulates the creation of a tree hash from streamed data
8
+ */
9
+ class TreeHash implements HashInterface
10
+ {
11
+ const MB = 1048576;
12
+ const EMPTY_HASH = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855';
13
+
14
+ /** @var string Algorithm used for hashing. */
15
+ private $algorithm;
16
+
17
+ /** @var string Buffered data that has not yet been hashed. */
18
+ private $buffer;
19
+
20
+ /** @var array Binary checksums from which the tree hash is derived. */
21
+ private $checksums = [];
22
+
23
+ /** @var string Resulting hash in binary form. */
24
+ private $hash;
25
+
26
+ public function __construct($algorithm = 'sha256')
27
+ {
28
+ $this->algorithm = $algorithm;
29
+ $this->reset();
30
+ }
31
+
32
+ /**
33
+ * {@inheritdoc}
34
+ * @throws \LogicException if the root tree hash is already calculated
35
+ */
36
+ public function update($data)
37
+ {
38
+ // Error if hash is already calculated.
39
+ if ($this->hash) {
40
+ throw new \LogicException('You may not add more data to a '
41
+ . 'complete tree hash.');
42
+ }
43
+
44
+ // Buffer incoming data.
45
+ $this->buffer .= $data;
46
+
47
+ // When there is more than a MB of data, create a checksum.
48
+ while (strlen($this->buffer) >= self::MB) {
49
+ $data = substr($this->buffer, 0, self::MB);
50
+ $this->buffer = substr($this->buffer, self::MB) ?: '';
51
+ $this->checksums[] = hash($this->algorithm, $data, true);
52
+ }
53
+
54
+ return $this;
55
+ }
56
+
57
+ /**
58
+ * Add a checksum to the tree hash directly
59
+ *
60
+ * @param string $checksum The checksum to add
61
+ * @param bool $inBinaryForm TRUE if checksum is in binary form
62
+ *
63
+ * @return self
64
+ * @throws \LogicException if the root tree hash is already calculated
65
+ */
66
+ public function addChecksum($checksum, $inBinaryForm = false)
67
+ {
68
+ // Error if hash is already calculated
69
+ if ($this->hash) {
70
+ throw new \LogicException('You may not add more checksums to a '
71
+ . 'complete tree hash.');
72
+ }
73
+
74
+ // Convert the checksum to binary form if necessary
75
+ $this->checksums[] = $inBinaryForm ? $checksum : hex2bin($checksum);
76
+
77
+ return $this;
78
+ }
79
+
80
+ public function complete()
81
+ {
82
+ if (!$this->hash) {
83
+ // Clear out the remaining buffer.
84
+ if ($this->buffer) {
85
+ $this->checksums[] = hash($this->algorithm, $this->buffer, true);
86
+ $this->buffer = '';
87
+ }
88
+
89
+ // If no hashes, add the EMPTY_HASH.
90
+ if (!$this->checksums) {
91
+ $this->checksums[] = hex2bin(self::EMPTY_HASH);
92
+ }
93
+
94
+ // Perform hashes up the tree to arrive at the root checksum.
95
+ $hashes = $this->checksums;
96
+ while (count($hashes) > 1) {
97
+ $sets = array_chunk($hashes, 2);
98
+ $hashes = array();
99
+ foreach ($sets as $set) {
100
+ $hashes[] = (count($set) === 1)
101
+ ? $set[0]
102
+ : hash($this->algorithm, $set[0] . $set[1], true);
103
+ }
104
+ }
105
+
106
+ $this->hash = $hashes[0];
107
+ }
108
+
109
+ return $this->hash;
110
+ }
111
+
112
+ public function reset()
113
+ {
114
+ $this->hash = null;
115
+ $this->checksums = [];
116
+ $this->buffer = '';
117
+ }
118
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Handler/GuzzleV5/GuzzleHandler.php ADDED
@@ -0,0 +1,181 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Handler\GuzzleV5;
3
+
4
+ use Aws\Sdk;
5
+ use Exception;
6
+ use GuzzleHttp\Client;
7
+ use GuzzleHttp\ClientInterface;
8
+ use GuzzleHttp\Exception\ConnectException;
9
+ use GuzzleHttp\Exception\RequestException;
10
+ use GuzzleHttp\Message\ResponseInterface as GuzzleResponse;
11
+ use GuzzleHttp\Promise;
12
+ use GuzzleHttp\Psr7\Response as Psr7Response;
13
+ use Psr\Http\Message\RequestInterface as Psr7Request;
14
+ use Psr\Http\Message\StreamInterface as Psr7StreamInterface;
15
+
16
+ /**
17
+ * A request handler that sends PSR-7-compatible requests with Guzzle 5.
18
+ *
19
+ * The handler accepts a PSR-7 Request object and an array of transfer options
20
+ * and returns a Guzzle 6 Promise. The promise is either resolved with a
21
+ * PSR-7 Response object or rejected with an array of error data.
22
+ *
23
+ * @codeCoverageIgnore
24
+ */
25
+ class GuzzleHandler
26
+ {
27
+ private static $validOptions = [
28
+ 'proxy' => true,
29
+ 'verify' => true,
30
+ 'timeout' => true,
31
+ 'debug' => true,
32
+ 'connect_timeout' => true,
33
+ 'stream' => true,
34
+ 'delay' => true,
35
+ 'sink' => true,
36
+ ];
37
+
38
+ /** @var ClientInterface */
39
+ private $client;
40
+
41
+ /**
42
+ * @param ClientInterface $client
43
+ */
44
+ public function __construct(ClientInterface $client = null)
45
+ {
46
+ $this->client = $client ?: new Client();
47
+ }
48
+
49
+ /**
50
+ * @param Psr7Request $request
51
+ * @param array $options
52
+ *
53
+ * @return Promise\Promise
54
+ */
55
+ public function __invoke(Psr7Request $request, array $options = [])
56
+ {
57
+ // Create and send a Guzzle 5 request
58
+ $guzzlePromise = $this->client->send(
59
+ $this->createGuzzleRequest($request, $options)
60
+ );
61
+
62
+ $promise = new Promise\Promise(
63
+ function () use ($guzzlePromise) {
64
+ try {
65
+ $guzzlePromise->wait();
66
+ } catch (\Exception $e) {
67
+ // The promise is already delivered when the exception is
68
+ // thrown, so don't rethrow it.
69
+ }
70
+ },
71
+ [$guzzlePromise, 'cancel']
72
+ );
73
+
74
+ $guzzlePromise->then([$promise, 'resolve'], [$promise, 'reject']);
75
+
76
+ return $promise->then(
77
+ function (GuzzleResponse $response) {
78
+ // Adapt the Guzzle 5 Future to a Guzzle 6 ResponsePromise.
79
+ return $this->createPsr7Response($response);
80
+ },
81
+ function (Exception $exception) {
82
+ // Reject with information about the error.
83
+ return new Promise\RejectedPromise($this->prepareErrorData($exception));
84
+ }
85
+ );
86
+ }
87
+
88
+ private function createGuzzleRequest(Psr7Request $psrRequest, array $options)
89
+ {
90
+ $ringConfig = [];
91
+
92
+ // Remove unsupported options.
93
+ foreach (array_keys($options) as $key) {
94
+ if (!isset(self::$validOptions[$key])) {
95
+ unset($options[$key]);
96
+ }
97
+ }
98
+
99
+ // Handle delay option.
100
+ if (isset($options['delay'])) {
101
+ $ringConfig['delay'] = $options['delay'];
102
+ unset($options['delay']);
103
+ }
104
+
105
+ // Prepare sink option.
106
+ if (isset($options['sink'])) {
107
+ $ringConfig['save_to'] = ($options['sink'] instanceof Psr7StreamInterface)
108
+ ? new GuzzleStream($options['sink'])
109
+ : $options['sink'];
110
+ unset($options['sink']);
111
+ }
112
+
113
+ // Ensure that all requests are async and lazy like Guzzle 6.
114
+ $options['future'] = 'lazy';
115
+
116
+ // Create the Guzzle 5 request from the provided PSR7 request.
117
+ $request = $this->client->createRequest(
118
+ $psrRequest->getMethod(),
119
+ $psrRequest->getUri(),
120
+ $options
121
+ );
122
+
123
+ // For the request body, adapt the PSR stream to a Guzzle stream.
124
+ $body = $psrRequest->getBody();
125
+ if ($body->getSize() === 0) {
126
+ $request->setBody(null);
127
+ } else {
128
+ $request->setBody(new GuzzleStream($body));
129
+ }
130
+
131
+ $request->setHeaders($psrRequest->getHeaders());
132
+
133
+ $request->setHeader(
134
+ 'User-Agent',
135
+ $request->getHeader('User-Agent')
136
+ . ' ' . Client::getDefaultUserAgent()
137
+ );
138
+
139
+ // Make sure the delay is configured, if provided.
140
+ if ($ringConfig) {
141
+ foreach ($ringConfig as $k => $v) {
142
+ $request->getConfig()->set($k, $v);
143
+ }
144
+ }
145
+
146
+ return $request;
147
+ }
148
+
149
+ private function createPsr7Response(GuzzleResponse $response)
150
+ {
151
+ if ($body = $response->getBody()) {
152
+ $body = new PsrStream($body);
153
+ }
154
+
155
+ return new Psr7Response(
156
+ $response->getStatusCode(),
157
+ $response->getHeaders(),
158
+ $body,
159
+ $response->getReasonPhrase()
160
+ );
161
+ }
162
+
163
+ private function prepareErrorData(Exception $e)
164
+ {
165
+ $error = [
166
+ 'exception' => $e,
167
+ 'connection_error' => false,
168
+ 'response' => null,
169
+ ];
170
+
171
+ if ($e instanceof ConnectException) {
172
+ $error['connection_error'] = true;
173
+ }
174
+
175
+ if ($e instanceof RequestException && $e->getResponse()) {
176
+ $error['response'] = $this->createPsr7Response($e->getResponse());
177
+ }
178
+
179
+ return $error;
180
+ }
181
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Handler/GuzzleV5/GuzzleStream.php ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Handler\GuzzleV5;
3
+
4
+ use GuzzleHttp\Stream\StreamDecoratorTrait;
5
+ use GuzzleHttp\Stream\StreamInterface as GuzzleStreamInterface;
6
+ use Psr\Http\Message\StreamInterface as Psr7StreamInterface;
7
+
8
+ /**
9
+ * Adapts a PSR-7 Stream to a Guzzle 5 Stream.
10
+ *
11
+ * @codeCoverageIgnore
12
+ */
13
+ class GuzzleStream implements GuzzleStreamInterface
14
+ {
15
+ use StreamDecoratorTrait;
16
+
17
+ /** @var Psr7StreamInterface */
18
+ private $stream;
19
+
20
+ public function __construct(Psr7StreamInterface $stream)
21
+ {
22
+ $this->stream = $stream;
23
+ }
24
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Handler/GuzzleV5/PsrStream.php ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Handler\GuzzleV5;
3
+
4
+ use GuzzleHttp\Stream\StreamDecoratorTrait;
5
+ use GuzzleHttp\Stream\StreamInterface as GuzzleStreamInterface;
6
+ use Psr\Http\Message\StreamInterface as Psr7StreamInterface;
7
+
8
+ /**
9
+ * Adapts a Guzzle 5 Stream to a PSR-7 Stream.
10
+ *
11
+ * @codeCoverageIgnore
12
+ */
13
+ class PsrStream implements Psr7StreamInterface
14
+ {
15
+ use StreamDecoratorTrait;
16
+
17
+ /** @var GuzzleStreamInterface */
18
+ private $stream;
19
+
20
+ public function __construct(GuzzleStreamInterface $stream)
21
+ {
22
+ $this->stream = $stream;
23
+ }
24
+
25
+ public function rewind()
26
+ {
27
+ $this->stream->seek(0);
28
+ }
29
+
30
+ public function getContents()
31
+ {
32
+ return $this->stream->getContents();
33
+ }
34
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Handler/GuzzleV6/GuzzleHandler.php ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Handler\GuzzleV6;
3
+
4
+ use Aws\Sdk;
5
+ use Exception;
6
+ use GuzzleHttp\Exception\ConnectException;
7
+ use GuzzleHttp\Exception\RequestException;
8
+ use GuzzleHttp\Promise;
9
+ use GuzzleHttp\Client;
10
+ use GuzzleHttp\ClientInterface;
11
+ use Psr\Http\Message\RequestInterface as Psr7Request;
12
+
13
+ /**
14
+ * A request handler that sends PSR-7-compatible requests with Guzzle 6.
15
+ */
16
+ class GuzzleHandler
17
+ {
18
+ /** @var ClientInterface */
19
+ private $client;
20
+
21
+ /**
22
+ * @param ClientInterface $client
23
+ */
24
+ public function __construct(ClientInterface $client = null)
25
+ {
26
+ $this->client = $client ?: new Client();
27
+ }
28
+
29
+ /**
30
+ * @param Psr7Request $request
31
+ * @param array $options
32
+ *
33
+ * @return Promise\Promise
34
+ */
35
+ public function __invoke(Psr7Request $request, array $options = [])
36
+ {
37
+ $request = $request->withHeader(
38
+ 'User-Agent',
39
+ $request->getHeaderLine('User-Agent')
40
+ . ' ' . \GuzzleHttp\default_user_agent()
41
+ );
42
+
43
+ return $this->client->sendAsync($request, $options)->otherwise(
44
+ static function (\Exception $e) {
45
+ $error = [
46
+ 'exception' => $e,
47
+ 'connection_error' => $e instanceof ConnectException,
48
+ 'response' => null,
49
+ ];
50
+
51
+ if ($e instanceof RequestException && $e->getResponse()) {
52
+ $error['response'] = $e->getResponse();
53
+ }
54
+
55
+ return new Promise\RejectedPromise($error);
56
+ }
57
+ );
58
+ }
59
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/HandlerList.php ADDED
@@ -0,0 +1,424 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws;
3
+
4
+ /**
5
+ * Builds a single handler function from zero or more middleware functions and
6
+ * a handler. The handler function is then used to send command objects and
7
+ * return a promise that is resolved with an AWS result object.
8
+ *
9
+ * The "front" of the list is invoked before the "end" of the list. You can add
10
+ * middleware to the front of the list using one of the "prepend" method, and
11
+ * the end of the list using one of the "append" method. The last function
12
+ * invoked in a handler list is the handler (a function that does not accept a
13
+ * next handler but rather is responsible for returning a promise that is
14
+ * fulfilled with an Aws\ResultInterface object).
15
+ *
16
+ * Handlers are ordered using a "step" that describes the step at which the
17
+ * SDK is when sending a command. The available steps are:
18
+ *
19
+ * - init: The command is being initialized, allowing you to do things like add
20
+ * default options.
21
+ * - validate: The command is being validated before it is serialized
22
+ * - build: The command is being serialized into an HTTP request. A middleware
23
+ * in this step MUST serialize an HTTP request and populate the "@request"
24
+ * parameter of a command with the request such that it is available to
25
+ * subsequent middleware.
26
+ * - sign: The request is being signed and prepared to be sent over the wire.
27
+ *
28
+ * Middleware can be registered with a name to allow you to easily add a
29
+ * middleware before or after another middleware by name. This also allows you
30
+ * to remove a middleware by name (in addition to removing by instance).
31
+ */
32
+ class HandlerList implements \Countable
33
+ {
34
+ const INIT = 'init';
35
+ const VALIDATE = 'validate';
36
+ const BUILD = 'build';
37
+ const SIGN = 'sign';
38
+
39
+ /** @var callable */
40
+ private $handler;
41
+
42
+ /** @var array */
43
+ private $named = [];
44
+
45
+ /** @var array */
46
+ private $sorted;
47
+
48
+ /** @var callable|null */
49
+ private $interposeFn;
50
+
51
+ /** @var array Steps (in reverse order) */
52
+ private $steps = [
53
+ self::SIGN => [],
54
+ self::BUILD => [],
55
+ self::VALIDATE => [],
56
+ self::INIT => [],
57
+ ];
58
+
59
+ /**
60
+ * @param callable $handler HTTP handler.
61
+ */
62
+ public function __construct(callable $handler = null)
63
+ {
64
+ $this->handler = $handler;
65
+ }
66
+
67
+ /**
68
+ * Dumps a string representation of the list.
69
+ *
70
+ * @return string
71
+ */
72
+ public function __toString()
73
+ {
74
+ $str = '';
75
+ $i = 0;
76
+
77
+ foreach (array_reverse($this->steps) as $k => $step) {
78
+ foreach (array_reverse($step) as $j => $tuple) {
79
+ $str .= "{$i}) Step: {$k}, ";
80
+ if ($tuple[1]) {
81
+ $str .= "Name: {$tuple[1]}, ";
82
+ }
83
+ $str .= "Function: " . $this->debugCallable($tuple[0]) . "\n";
84
+ $i++;
85
+ }
86
+ }
87
+
88
+ if ($this->handler) {
89
+ $str .= "{$i}) Handler: " . $this->debugCallable($this->handler) . "\n";
90
+ }
91
+
92
+ return $str;
93
+ }
94
+
95
+ /**
96
+ * Set the HTTP handler that actually returns a response.
97
+ *
98
+ * @param callable $handler Function that accepts a request and array of
99
+ * options and returns a Promise.
100
+ */
101
+ public function setHandler(callable $handler)
102
+ {
103
+ $this->handler = $handler;
104
+ }
105
+
106
+ /**
107
+ * Returns true if the builder has a handler.
108
+ *
109
+ * @return bool
110
+ */
111
+ public function hasHandler()
112
+ {
113
+ return (bool) $this->handler;
114
+ }
115
+
116
+ /**
117
+ * Append a middleware to the init step.
118
+ *
119
+ * @param callable $middleware Middleware function to add.
120
+ * @param string $name Name of the middleware.
121
+ */
122
+ public function appendInit(callable $middleware, $name = null)
123
+ {
124
+ $this->add(self::INIT, $name, $middleware);
125
+ }
126
+
127
+ /**
128
+ * Prepend a middleware to the init step.
129
+ *
130
+ * @param callable $middleware Middleware function to add.
131
+ * @param string $name Name of the middleware.
132
+ */
133
+ public function prependInit(callable $middleware, $name = null)
134
+ {
135
+ $this->add(self::INIT, $name, $middleware, true);
136
+ }
137
+
138
+ /**
139
+ * Append a middleware to the validate step.
140
+ *
141
+ * @param callable $middleware Middleware function to add.
142
+ * @param string $name Name of the middleware.
143
+ */
144
+ public function appendValidate(callable $middleware, $name = null)
145
+ {
146
+ $this->add(self::VALIDATE, $name, $middleware);
147
+ }
148
+
149
+ /**
150
+ * Prepend a middleware to the validate step.
151
+ *
152
+ * @param callable $middleware Middleware function to add.
153
+ * @param string $name Name of the middleware.
154
+ */
155
+ public function prependValidate(callable $middleware, $name = null)
156
+ {
157
+ $this->add(self::VALIDATE, $name, $middleware, true);
158
+ }
159
+
160
+ /**
161
+ * Append a middleware to the build step.
162
+ *
163
+ * @param callable $middleware Middleware function to add.
164
+ * @param string $name Name of the middleware.
165
+ */
166
+ public function appendBuild(callable $middleware, $name = null)
167
+ {
168
+ $this->add(self::BUILD, $name, $middleware);
169
+ }
170
+
171
+ /**
172
+ * Prepend a middleware to the build step.
173
+ *
174
+ * @param callable $middleware Middleware function to add.
175
+ * @param string $name Name of the middleware.
176
+ */
177
+ public function prependBuild(callable $middleware, $name = null)
178
+ {
179
+ $this->add(self::BUILD, $name, $middleware, true);
180
+ }
181
+
182
+ /**
183
+ * Append a middleware to the sign step.
184
+ *
185
+ * @param callable $middleware Middleware function to add.
186
+ * @param string $name Name of the middleware.
187
+ */
188
+ public function appendSign(callable $middleware, $name = null)
189
+ {
190
+ $this->add(self::SIGN, $name, $middleware);
191
+ }
192
+
193
+ /**
194
+ * Prepend a middleware to the sign step.
195
+ *
196
+ * @param callable $middleware Middleware function to add.
197
+ * @param string $name Name of the middleware.
198
+ */
199
+ public function prependSign(callable $middleware, $name = null)
200
+ {
201
+ $this->add(self::SIGN, $name, $middleware, true);
202
+ }
203
+
204
+ /**
205
+ * Add a middleware before the given middleware by name.
206
+ *
207
+ * @param string|callable $findName Add before this
208
+ * @param string $withName Optional name to give the middleware
209
+ * @param callable $middleware Middleware to add.
210
+ */
211
+ public function before($findName, $withName, callable $middleware)
212
+ {
213
+ $this->splice($findName, $withName, $middleware, true);
214
+ }
215
+
216
+ /**
217
+ * Add a middleware after the given middleware by name.
218
+ *
219
+ * @param string|callable $findName Add after this
220
+ * @param string $withName Optional name to give the middleware
221
+ * @param callable $middleware Middleware to add.
222
+ */
223
+ public function after($findName, $withName, callable $middleware)
224
+ {
225
+ $this->splice($findName, $withName, $middleware, false);
226
+ }
227
+
228
+ /**
229
+ * Remove a middleware by name or by instance from the list.
230
+ *
231
+ * @param string|callable $nameOrInstance Middleware to remove.
232
+ */
233
+ public function remove($nameOrInstance)
234
+ {
235
+ if (is_callable($nameOrInstance)) {
236
+ $this->removeByInstance($nameOrInstance);
237
+ } elseif (is_string($nameOrInstance)) {
238
+ $this->removeByName($nameOrInstance);
239
+ }
240
+ }
241
+
242
+ /**
243
+ * Interpose a function between each middleware (e.g., allowing for a trace
244
+ * through the middleware layers).
245
+ *
246
+ * The interpose function is a function that accepts a "step" argument as a
247
+ * string and a "name" argument string. This function must then return a
248
+ * function that accepts the next handler in the list. This function must
249
+ * then return a function that accepts a CommandInterface and optional
250
+ * RequestInterface and returns a promise that is fulfilled with an
251
+ * Aws\ResultInterface or rejected with an Aws\Exception\AwsException
252
+ * object.
253
+ *
254
+ * @param callable|null $fn Pass null to remove any previously set function
255
+ */
256
+ public function interpose(callable $fn = null)
257
+ {
258
+ $this->sorted = null;
259
+ $this->interposeFn = $fn;
260
+ }
261
+
262
+ /**
263
+ * Compose the middleware and handler into a single callable function.
264
+ *
265
+ * @return callable
266
+ */
267
+ public function resolve()
268
+ {
269
+ if (!($prev = $this->handler)) {
270
+ throw new \LogicException('No handler has been specified');
271
+ }
272
+
273
+ if ($this->sorted === null) {
274
+ $this->sortMiddleware();
275
+ }
276
+
277
+ foreach ($this->sorted as $fn) {
278
+ $prev = $fn($prev);
279
+ }
280
+
281
+ return $prev;
282
+ }
283
+
284
+ public function count()
285
+ {
286
+ return count($this->steps[self::INIT])
287
+ + count($this->steps[self::VALIDATE])
288
+ + count($this->steps[self::BUILD])
289
+ + count($this->steps[self::SIGN]);
290
+ }
291
+
292
+ /**
293
+ * Splices a function into the middleware list at a specific position.
294
+ *
295
+ * @param $findName
296
+ * @param $withName
297
+ * @param callable $middleware
298
+ * @param $before
299
+ */
300
+ private function splice($findName, $withName, callable $middleware, $before)
301
+ {
302
+ if (!isset($this->named[$findName])) {
303
+ throw new \InvalidArgumentException("$findName not found");
304
+ }
305
+
306
+ $idx = $this->sorted = null;
307
+ $step = $this->named[$findName];
308
+
309
+ if ($withName) {
310
+ $this->named[$withName] = $step;
311
+ }
312
+
313
+ foreach ($this->steps[$step] as $i => $tuple) {
314
+ if ($tuple[1] === $findName) {
315
+ $idx = $i;
316
+ break;
317
+ }
318
+ }
319
+
320
+ $replacement = $before
321
+ ? [$this->steps[$step][$idx], [$middleware, $withName]]
322
+ : [[$middleware, $withName], $this->steps[$step][$idx]];
323
+ array_splice($this->steps[$step], $idx, 1, $replacement);
324
+ }
325
+
326
+ /**
327
+ * Provides a debug string for a given callable.
328
+ *
329
+ * @param array|callable $fn Function to write as a string.
330
+ *
331
+ * @return string
332
+ */
333
+ private function debugCallable($fn)
334
+ {
335
+ if (is_string($fn)) {
336
+ return "callable({$fn})";
337
+ } elseif (is_array($fn)) {
338
+ $ele = is_string($fn[0]) ? $fn[0] : get_class($fn[0]);
339
+ return "callable(['{$ele}', '{$fn[1]}'])";
340
+ } else {
341
+ return 'callable(' . spl_object_hash($fn) . ')';
342
+ }
343
+ }
344
+
345
+ /**
346
+ * Sort the middleware, and interpose if needed in the sorted list.
347
+ */
348
+ private function sortMiddleware()
349
+ {
350
+ $this->sorted = [];
351
+
352
+ if (!$this->interposeFn) {
353
+ foreach ($this->steps as $step) {
354
+ foreach ($step as $fn) {
355
+ $this->sorted[] = $fn[0];
356
+ }
357
+ }
358
+ return;
359
+ }
360
+
361
+ $ifn = $this->interposeFn;
362
+ // Interpose the interposeFn into the handler stack.
363
+ foreach ($this->steps as $stepName => $step) {
364
+ foreach ($step as $fn) {
365
+ $this->sorted[] = $ifn($stepName, $fn[1]);
366
+ $this->sorted[] = $fn[0];
367
+ }
368
+ }
369
+ }
370
+
371
+ private function removeByName($name)
372
+ {
373
+ if (!isset($this->named[$name])) {
374
+ return;
375
+ }
376
+
377
+ $this->sorted = null;
378
+ $step = $this->named[$name];
379
+ $this->steps[$step] = array_values(
380
+ array_filter(
381
+ $this->steps[$step],
382
+ function ($tuple) use ($name) {
383
+ return $tuple[1] !== $name;
384
+ }
385
+ )
386
+ );
387
+ }
388
+
389
+ private function removeByInstance(callable $fn)
390
+ {
391
+ foreach ($this->steps as $k => $step) {
392
+ foreach ($step as $j => $tuple) {
393
+ if ($tuple[0] === $fn) {
394
+ $this->sorted = null;
395
+ unset($this->named[$this->steps[$k][$j][1]]);
396
+ unset($this->steps[$k][$j]);
397
+ }
398
+ }
399
+ }
400
+ }
401
+
402
+ /**
403
+ * Add a middleware to a step.
404
+ *
405
+ * @param string $step Middleware step.
406
+ * @param string $name Middleware name.
407
+ * @param callable $middleware Middleware function to add.
408
+ * @param bool $prepend Prepend instead of append.
409
+ */
410
+ private function add($step, $name, callable $middleware, $prepend = false)
411
+ {
412
+ $this->sorted = null;
413
+
414
+ if ($prepend) {
415
+ $this->steps[$step][] = [$middleware, $name];
416
+ } else {
417
+ array_unshift($this->steps[$step], [$middleware, $name]);
418
+ }
419
+
420
+ if ($name) {
421
+ $this->named[$name] = $step;
422
+ }
423
+ }
424
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/HasDataTrait.php ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws;
3
+
4
+ /**
5
+ * Trait implementing ToArrayInterface, \ArrayAccess, \Countable, and
6
+ * \IteratorAggregate
7
+ */
8
+ trait HasDataTrait
9
+ {
10
+ /** @var array */
11
+ private $data = [];
12
+
13
+ public function getIterator()
14
+ {
15
+ return new \ArrayIterator($this->data);
16
+ }
17
+
18
+ /**
19
+ * This method returns a reference to the variable to allow for indirect
20
+ * array modification (e.g., $foo['bar']['baz'] = 'qux').
21
+ *
22
+ * @param $offset
23
+ *
24
+ * @return mixed|null
25
+ */
26
+ public function & offsetGet($offset)
27
+ {
28
+ if (isset($this->data[$offset])) {
29
+ return $this->data[$offset];
30
+ }
31
+
32
+ $value = null;
33
+ return $value;
34
+ }
35
+
36
+ public function offsetSet($offset, $value)
37
+ {
38
+ $this->data[$offset] = $value;
39
+ }
40
+
41
+ public function offsetExists($offset)
42
+ {
43
+ return isset($this->data[$offset]);
44
+ }
45
+
46
+ public function offsetUnset($offset)
47
+ {
48
+ unset($this->data[$offset]);
49
+ }
50
+
51
+ public function toArray()
52
+ {
53
+ return $this->data;
54
+ }
55
+
56
+ public function count()
57
+ {
58
+ return count($this->data);
59
+ }
60
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/HashInterface.php ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws;
3
+
4
+ /**
5
+ * Interface that allows implementing various incremental hashes.
6
+ */
7
+ interface HashInterface
8
+ {
9
+ /**
10
+ * Adds data to the hash.
11
+ *
12
+ * @param string $data Data to add to the hash
13
+ */
14
+ public function update($data);
15
+
16
+ /**
17
+ * Finalizes the incremental hash and returns the resulting digest.
18
+ *
19
+ * @return string
20
+ */
21
+ public function complete();
22
+
23
+ /**
24
+ * Removes all data from the hash, effectively starting a new hash.
25
+ */
26
+ public function reset();
27
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/HashingStream.php ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws;
3
+
4
+ use GuzzleHttp\Psr7\StreamDecoratorTrait;
5
+ use Psr\Http\Message\StreamInterface;
6
+
7
+ /**
8
+ * Stream decorator that calculates a rolling hash of the stream as it is read.
9
+ */
10
+ class HashingStream implements StreamInterface
11
+ {
12
+ use StreamDecoratorTrait;
13
+
14
+ /** @var HashInterface */
15
+ private $hash;
16
+
17
+ /** @var callable|null */
18
+ private $callback;
19
+
20
+ /**
21
+ * @param StreamInterface $stream Stream that is being read.
22
+ * @param HashInterface $hash Hash used to calculate checksum.
23
+ * @param callable $onComplete Optional function invoked when the
24
+ * hash calculation is completed.
25
+ */
26
+ public function __construct(
27
+ StreamInterface $stream,
28
+ HashInterface $hash,
29
+ callable $onComplete = null
30
+ ) {
31
+ $this->stream = $stream;
32
+ $this->hash = $hash;
33
+ $this->callback = $onComplete;
34
+ }
35
+
36
+ public function read($length)
37
+ {
38
+ $data = $this->stream->read($length);
39
+ $this->hash->update($data);
40
+ if ($this->eof()) {
41
+ $result = $this->hash->complete();
42
+ if ($this->callback) {
43
+ call_user_func($this->callback, $result);
44
+ }
45
+ }
46
+
47
+ return $data;
48
+ }
49
+
50
+ public function seek($offset, $whence = SEEK_SET)
51
+ {
52
+ if ($offset === 0) {
53
+ $this->hash->reset();
54
+ return $this->stream->seek($offset);
55
+ } else {
56
+ // Seeking arbitrarily is not supported.
57
+ return false;
58
+ }
59
+ }
60
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/History.php ADDED
@@ -0,0 +1,152 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws;
3
+
4
+ use Psr\Http\Message\RequestInterface;
5
+ use Aws\Exception\AwsException;
6
+
7
+ /**
8
+ * Represents a history container that is required when using the history
9
+ * middleware.
10
+ */
11
+ class History implements \Countable, \IteratorAggregate
12
+ {
13
+ private $maxEntries;
14
+ private $entries;
15
+
16
+ /**
17
+ * @param int $maxEntries Maximum number of entries to store.
18
+ */
19
+ public function __construct($maxEntries = 10)
20
+ {
21
+ $this->maxEntries = $maxEntries;
22
+ }
23
+
24
+ public function count()
25
+ {
26
+ return count($this->entries);
27
+ }
28
+
29
+ public function getIterator()
30
+ {
31
+ return new \ArrayIterator(array_values($this->entries));
32
+ }
33
+
34
+ /**
35
+ * Get the last finished command seen by the history container.
36
+ *
37
+ * @return CommandInterface
38
+ * @throws \LogicException if no commands have been seen.
39
+ */
40
+ public function getLastCommand()
41
+ {
42
+ if (!$this->entries) {
43
+ throw new \LogicException('No commands received');
44
+ }
45
+
46
+ return end($this->entries)['command'];
47
+ }
48
+
49
+ /**
50
+ * Get the last finished request seen by the history container.
51
+ *
52
+ * @return RequestInterface
53
+ * @throws \LogicException if no requests have been seen.
54
+ */
55
+ public function getLastRequest()
56
+ {
57
+ if (!$this->entries) {
58
+ throw new \LogicException('No requests received');
59
+ }
60
+
61
+ return end($this->entries)['request'];
62
+ }
63
+
64
+ /**
65
+ * Get the last received result or exception.
66
+ *
67
+ * @return ResultInterface|AwsException
68
+ * @throws \LogicException if no return values have been received.
69
+ */
70
+ public function getLastReturn()
71
+ {
72
+ if (!$this->entries) {
73
+ throw new \LogicException('No entries');
74
+ }
75
+
76
+ $last = end($this->entries);
77
+
78
+ if (isset($last['result'])) {
79
+ return $last['result'];
80
+ } elseif (isset($last['exception'])) {
81
+ return $last['exception'];
82
+ } else {
83
+ throw new \LogicException('No return value for last entry.');
84
+ }
85
+ }
86
+
87
+ /**
88
+ * Initiate an entry being added to the history.
89
+ *
90
+ * @param CommandInterface $cmd Command be executed.
91
+ * @param RequestInterface $req Request being sent.
92
+ *
93
+ * @return string Returns the ticket used to finish the entry.
94
+ */
95
+ public function start(CommandInterface $cmd, RequestInterface $req)
96
+ {
97
+ $ticket = uniqid();
98
+ $this->entries[$ticket] = [
99
+ 'command' => $cmd,
100
+ 'request' => $req,
101
+ 'result' => null,
102
+ 'exception' => null,
103
+ ];
104
+
105
+ return $ticket;
106
+ }
107
+
108
+ /**
109
+ * Finish adding an entry to the history container.
110
+ *
111
+ * @param string $ticket Ticket returned from the start call.
112
+ * @param mixed $result The result (an exception or AwsResult).
113
+ */
114
+ public function finish($ticket, $result)
115
+ {
116
+ if (!isset($this->entries[$ticket])) {
117
+ throw new \InvalidArgumentException('Invalid history ticket');
118
+ } elseif (isset($this->entries[$ticket]['result'])
119
+ || isset($this->entries[$ticket]['exception'])
120
+ ) {
121
+ throw new \LogicException('History entry is already finished');
122
+ }
123
+
124
+ if ($result instanceof \Exception) {
125
+ $this->entries[$ticket]['exception'] = $result;
126
+ } else {
127
+ $this->entries[$ticket]['result'] = $result;
128
+ }
129
+
130
+ if (count($this->entries) >= $this->maxEntries) {
131
+ $this->entries = array_slice($this->entries, -$this->maxEntries, null, true);
132
+ }
133
+ }
134
+
135
+ /**
136
+ * Flush the history
137
+ */
138
+ public function clear()
139
+ {
140
+ $this->entries = [];
141
+ }
142
+
143
+ /**
144
+ * Converts the history to an array.
145
+ *
146
+ * @return array
147
+ */
148
+ public function toArray()
149
+ {
150
+ return array_values($this->entries);
151
+ }
152
+ }
vendor/aannnaa7/aws-sdk-php-minimized/src/Iam/Exception/IamException.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Iam\Exception;
3
+
4
+ use Aws\Exception\AwsException;
5
+
6
+ /**
7
+ * Represents an error interacting with the AWS Identity and Access Management service.
8
+ */
9
+ class IamException extends AwsException {}
vendor/aannnaa7/aws-sdk-php-minimized/src/Iam/IamClient.php ADDED
@@ -0,0 +1,236 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Iam;
3
+
4
+ use Aws\AwsClient;
5
+
6
+ /**
7
+ * This client is used to interact with the **AWS Identity and Access Management (AWS IAM)** service.
8
+ *
9
+ * @method \Aws\Result addClientIDToOpenIDConnectProvider(array $args = [])
10
+ * @method \GuzzleHttp\Promise\Promise addClientIDToOpenIDConnectProviderAsync(array $args = [])
11
+ * @method \Aws\Result addRoleToInstanceProfile(array $args = [])
12
+ * @method \GuzzleHttp\Promise\Promise addRoleToInstanceProfileAsync(array $args = [])
13
+ * @method \Aws\Result addUserToGroup(array $args = [])
14
+ * @method \GuzzleHttp\Promise\Promise addUserToGroupAsync(array $args = [])
15
+ * @method \Aws\Result attachGroupPolicy(array $args = [])
16
+ * @method \GuzzleHttp\Promise\Promise attachGroupPolicyAsync(array $args = [])
17
+ * @method \Aws\Result attachRolePolicy(array $args = [])
18
+ * @method \GuzzleHttp\Promise\Promise attachRolePolicyAsync(array $args = [])
19
+ * @method \Aws\Result attachUserPolicy(array $args = [])
20
+ * @method \GuzzleHttp\Promise\Promise attachUserPolicyAsync(array $args = [])
21
+ * @method \Aws\Result changePassword(array $args = [])
22
+ * @method \GuzzleHttp\Promise\Promise changePasswordAsync(array $args = [])
23
+ * @method \Aws\Result createAccessKey(array $args = [])
24
+ * @method \GuzzleHttp\Promise\Promise createAccessKeyAsync(array $args = [])
25
+ * @method \Aws\Result createAccountAlias(array $args = [])
26
+ * @method \GuzzleHttp\Promise\Promise createAccountAliasAsync(array $args = [])
27
+ * @method \Aws\Result createGroup(array $args = [])
28
+ * @method \GuzzleHttp\Promise\Promise createGroupAsync(array $args = [])
29
+ * @method \Aws\Result createInstanceProfile(array $args = [])
30
+ * @method \GuzzleHttp\Promise\Promise createInstanceProfileAsync(array $args = [])
31
+ * @method \Aws\Result createLoginProfile(array $args = [])
32
+ * @method \GuzzleHttp\Promise\Promise createLoginProfileAsync(array $args = [])
33
+ * @method \Aws\Result createOpenIDConnectProvider(array $args = [])
34
+ * @method \GuzzleHttp\Promise\Promise createOpenIDConnectProviderAsync(array $args = [])
35
+ * @method \Aws\Result createPolicy(array $args = [])
36
+ * @method \GuzzleHttp\Promise\Promise createPolicyAsync(array $args = [])
37
+ * @method \Aws\Result createPolicyVersion(array $args = [])
38
+ * @method \GuzzleHttp\Promise\Promise createPolicyVersionAsync(array $args = [])
39
+ * @method \Aws\Result createRole(array $args = [])
40
+ * @method \GuzzleHttp\Promise\Promise createRoleAsync(array $args = [])
41
+ * @method \Aws\Result createSAMLProvider(array $args = [])
42
+ * @method \GuzzleHttp\Promise\Promise createSAMLProviderAsync(array $args = [])
43
+ * @method \Aws\Result createUser(array $args = [])
44
+ * @method \GuzzleHttp\Promise\Promise createUserAsync(array $args = [])
45
+ * @method \Aws\Result createVirtualMFADevice(array $args = [])
46
+ * @method \GuzzleHttp\Promise\Promise createVirtualMFADeviceAsync(array $args = [])
47
+ * @method \Aws\Result deactivateMFADevice(array $args = [])
48
+ * @method \GuzzleHttp\Promise\Promise deactivateMFADeviceAsync(array $args = [])
49
+ * @method \Aws\Result deleteAccessKey(array $args = [])
50
+ * @method \GuzzleHttp\Promise\Promise deleteAccessKeyAsync(array $args = [])
51
+ * @method \Aws\Result deleteAccountAlias(array $args = [])
52
+ * @method \GuzzleHttp\Promise\Promise deleteAccountAliasAsync(array $args = [])
53
+ * @method \Aws\Result deleteAccountPasswordPolicy(array $args = [])
54
+ * @method \GuzzleHttp\Promise\Promise deleteAccountPasswordPolicyAsync(array $args = [])
55
+ * @method \Aws\Result deleteGroup(array $args = [])
56
+ * @method \GuzzleHttp\Promise\Promise deleteGroupAsync(array $args = [])
57
+ * @method \Aws\Result deleteGroupPolicy(array $args = [])
58
+ * @method \GuzzleHttp\Promise\Promise deleteGroupPolicyAsync(array $args = [])
59
+ * @method \Aws\Result deleteInstanceProfile(array $args = [])
60
+ * @method \GuzzleHttp\Promise\Promise deleteInstanceProfileAsync(array $args = [])
61
+ * @method \Aws\Result deleteLoginProfile(array $args = [])
62
+ * @method \GuzzleHttp\Promise\Promise deleteLoginProfileAsync(array $args = [])
63
+ * @method \Aws\Result deleteOpenIDConnectProvider(array $args = [])
64
+ * @method \GuzzleHttp\Promise\Promise deleteOpenIDConnectProviderAsync(array $args = [])
65
+ * @method \Aws\Result deletePolicy(array $args = [])
66
+ * @method \GuzzleHttp\Promise\Promise deletePolicyAsync(array $args = [])
67
+ * @method \Aws\Result deletePolicyVersion(array $args = [])
68
+ * @method \GuzzleHttp\Promise\Promise deletePolicyVersionAsync(array $args = [])
69
+ * @method \Aws\Result deleteRole(array $args = [])
70
+ * @method \GuzzleHttp\Promise\Promise deleteRoleAsync(array $args = [])
71
+ * @method \Aws\Result deleteRolePolicy(array $args = [])
72
+ * @method \GuzzleHttp\Promise\Promise deleteRolePolicyAsync(array $args = [])
73
+ * @method \Aws\Result deleteSAMLProvider(array $args = [])
74
+ * @method \GuzzleHttp\Promise\Promise deleteSAMLProviderAsync(array $args = [])
75
+ * @method \Aws\Result deleteSSHPublicKey(array $args = [])
76
+ * @method \GuzzleHttp\Promise\Promise deleteSSHPublicKeyAsync(array $args = [])
77
+ * @method \Aws\Result deleteServerCertificate(array $args = [])
78
+ * @method \GuzzleHttp\Promise\Promise deleteServerCertificateAsync(array $args = [])
79
+ * @method \Aws\Result deleteSigningCertificate(array $args = [])
80
+ * @method \GuzzleHttp\Promise\Promise deleteSigningCertificateAsync(array $args = [])
81
+ * @method \Aws\Result deleteUser(array $args = [])
82
+ * @method \GuzzleHttp\Promise\Promise deleteUserAsync(array $args = [])
83
+ * @method \Aws\Result deleteUserPolicy(array $args = [])
84
+ * @method \GuzzleHttp\Promise\Promise deleteUserPolicyAsync(array $args = [])
85
+ * @method \Aws\Result deleteVirtualMFADevice(array $args = [])
86
+ * @method \GuzzleHttp\Promise\Promise deleteVirtualMFADeviceAsync(array $args = [])
87
+ * @method \Aws\Result detachGroupPolicy(array $args = [])
88
+ * @method \GuzzleHttp\Promise\Promise detachGroupPolicyAsync(array $args = [])
89
+ * @method \Aws\Result detachRolePolicy(array $args = [])
90
+ * @method \GuzzleHttp\Promise\Promise detachRolePolicyAsync(array $args = [])
91
+ * @method \Aws\Result detachUserPolicy(array $args = [])
92
+ * @method \GuzzleHttp\Promise\Promise detachUserPolicyAsync(array $args = [])
93
+ * @method \Aws\Result enableMFADevice(array $args = [])
94
+ * @method \GuzzleHttp\Promise\Promise enableMFADeviceAsync(array $args = [])
95
+ * @method \Aws\Result generateCredentialReport(array $args = [])
96
+ * @method \GuzzleHttp\Promise\Promise generateCredentialReportAsync(array $args = [])
97
+ * @method \Aws\Result getAccessKeyLastUsed(array $args = [])
98
+ * @method \GuzzleHttp\Promise\Promise getAccessKeyLastUsedAsync(array $args = [])
99
+ * @method \Aws\Result getAccountAuthorizationDetails(array $args = [])
100
+ * @method \GuzzleHttp\Promise\Promise getAccountAuthorizationDetailsAsync(array $args = [])
101
+ * @method \Aws\Result getAccountPasswordPolicy(array $args = [])
102
+ * @method \GuzzleHttp\Promise\Promise getAccountPasswordPolicyAsync(array $args = [])
103
+ * @method \Aws\Result getAccountSummary(array $args = [])
104
+ * @method \GuzzleHttp\Promise\Promise getAccountSummaryAsync(array $args = [])
105
+ * @method \Aws\Result getContextKeysForCustomPolicy(array $args = [])
106
+ * @method \GuzzleHttp\Promise\Promise getContextKeysForCustomPolicyAsync(array $args = [])
107
+ * @method \Aws\Result getContextKeysForPrincipalPolicy(array $args = [])
108
+ * @method \GuzzleHttp\Promise\Promise getContextKeysForPrincipalPolicyAsync(array $args = [])
109
+ * @method \Aws\Result getCredentialReport(array $args = [])
110
+ * @method \GuzzleHttp\Promise\Promise getCredentialReportAsync(array $args = [])
111
+ * @method \Aws\Result getGroup(array $args = [])
112
+ * @method \GuzzleHttp\Promise\Promise getGroupAsync(array $args = [])
113
+ * @method \Aws\Result getGroupPolicy(array $args = [])
114
+ * @method \GuzzleHttp\Promise\Promise getGroupPolicyAsync(array $args = [])
115
+ * @method \Aws\Result getInstanceProfile(array $args = [])
116
+ * @method \GuzzleHttp\Promise\Promise getInstanceProfileAsync(array $args = [])
117
+ * @method \Aws\Result getLoginProfile(array $args = [])
118
+ * @method \GuzzleHttp\Promise\Promise getLoginProfileAsync(array $args = [])
119
+ * @method \Aws\Result getOpenIDConnectProvider(array $args = [])
120
+ * @method \GuzzleHttp\Promise\Promise getOpenIDConnectProviderAsync(array $args = [])
121
+ * @method \Aws\Result getPolicy(array $args = [])
122
+ * @method \GuzzleHttp\Promise\Promise getPolicyAsync(array $args = [])
123
+ * @method \Aws\Result getPolicyVersion(array $args = [])
124
+ * @method \GuzzleHttp\Promise\Promise getPolicyVersionAsync(array $args = [])
125
+ * @method \Aws\Result getRole(array $args = [])
126
+ * @method \GuzzleHttp\Promise\Promise getRoleAsync(array $args = [])
127
+ * @method \Aws\Result getRolePolicy(array $args = [])
128
+ * @method \GuzzleHttp\Promise\Promise getRolePolicyAsync(array $args = [])
129
+ * @method \Aws\Result getSAMLProvider(array $args = [])
130
+ * @method \GuzzleHttp\Promise\Promise getSAMLProviderAsync(array $args = [])
131
+ * @method \Aws\Result getSSHPublicKey(array $args = [])
132
+ * @method \GuzzleHttp\Promise\Promise getSSHPublicKeyAsync(array $args = [])
133
+ * @method \Aws\Result getServerCertificate(array $args = [])
134
+ * @method \GuzzleHttp\Promise\Promise getServerCertificateAsync(array $args = [])
135
+ * @method \Aws\Result getUser(array $args = [])
136
+ * @method \GuzzleHttp\Promise\Promise getUserAsync(array $args = [])
137
+ * @method \Aws\Result getUserPolicy(array $args = [])
138
+ * @method \GuzzleHttp\Promise\Promise getUserPolicyAsync(array $args = [])
139
+ * @method \Aws\Result listAccessKeys(array $args = [])
140
+ * @method \GuzzleHttp\Promise\Promise listAccessKeysAsync(array $args = [])
141
+ * @method \Aws\Result listAccountAliases(array $args = [])
142
+ * @method \GuzzleHttp\Promise\Promise listAccountAliasesAsync(array $args = [])
143
+ * @method \Aws\Result listAttachedGroupPolicies(array $args = [])
144
+ * @method \GuzzleHttp\Promise\Promise listAttachedGroupPoliciesAsync(array $args = [])
145
+ * @method \Aws\Result listAttachedRolePolicies(array $args = [])
146
+ * @method \GuzzleHttp\Promise\Promise listAttachedRolePoliciesAsync(array $args = [])
147
+ * @method \Aws\Result listAttachedUserPolicies(array $args = [])
148
+ * @method \GuzzleHttp\Promise\Promise listAttachedUserPoliciesAsync(array $args = [])
149
+ * @method \Aws\Result listEntitiesForPolicy(array $args = [])
150
+ * @method \GuzzleHttp\Promise\Promise listEntitiesForPolicyAsync(array $args = [])
151
+ * @method \Aws\Result listGroupPolicies(array $args = [])
152
+ * @method \GuzzleHttp\Promise\Promise listGroupPoliciesAsync(array $args = [])
153
+ * @method \Aws\Result listGroups(array $args = [])
154
+ * @method \GuzzleHttp\Promise\Promise listGroupsAsync(array $args = [])
155
+ * @method \Aws\Result listGroupsForUser(array $args = [])
156
+ * @method \GuzzleHttp\Promise\Promise listGroupsForUserAsync(array $args = [])
157
+ * @method \Aws\Result listInstanceProfiles(array $args = [])
158
+ * @method \GuzzleHttp\Promise\Promise listInstanceProfilesAsync(array $args = [])
159
+ * @method \Aws\Result listInstanceProfilesForRole(array $args = [])
160
+ * @method \GuzzleHttp\Promise\Promise listInstanceProfilesForRoleAsync(array $args = [])
161
+ * @method \Aws\Result listMFADevices(array $args = [])
162
+ * @method \GuzzleHttp\Promise\Promise listMFADevicesAsync(array $args = [])
163
+ * @method \Aws\Result listOpenIDConnectProviders(array $args = [])
164
+ * @method \GuzzleHttp\Promise\Promise listOpenIDConnectProvidersAsync(array $args = [])
165
+ * @method \Aws\Result listPolicies(array $args = [])
166
+ * @method \GuzzleHttp\Promise\Promise listPoliciesAsync(array $args = [])
167
+ * @method \Aws\Result listPolicyVersions(array $args = [])
168
+ * @method \GuzzleHttp\Promise\Promise listPolicyVersionsAsync(array $args = [])
169
+ * @method \Aws\Result listRolePolicies(array $args = [])
170
+ * @method \GuzzleHttp\Promise\Promise listRolePoliciesAsync(array $args = [])
171
+ * @method \Aws\Result listRoles(array $args = [])
172
+ * @method \GuzzleHttp\Promise\Promise listRolesAsync(array $args = [])
173
+ * @method \Aws\Result listSAMLProviders(array $args = [])
174
+ * @method \GuzzleHttp\Promise\Promise listSAMLProvidersAsync(array $args = [])
175
+ * @method \Aws\Result listSSHPublicKeys(array $args = [])
176
+ * @method \GuzzleHttp\Promise\Promise listSSHPublicKeysAsync(array $args = [])
177
+ * @method \Aws\Result listServerCertificates(array $args = [])
178
+ * @method \GuzzleHttp\Promise\Promise listServerCertificatesAsync(array $args = [])
179
+ * @method \Aws\Result listSigningCertificates(array $args = [])
180
+ * @method \GuzzleHttp\Promise\Promise listSigningCertificatesAsync(array $args = [])
181
+ * @method \Aws\Result listUserPolicies(array $args = [])
182
+ * @method \GuzzleHttp\Promise\Promise listUserPoliciesAsync(array $args = [])
183
+ * @method \Aws\Result listUsers(array $args = [])
184
+ * @method \GuzzleHttp\Promise\Promise listUsersAsync(array $args = [])
185
+ * @method \Aws\Result listVirtualMFADevices(array $args = [])
186
+ * @method \GuzzleHttp\Promise\Promise listVirtualMFADevicesAsync(array $args = [])
187
+ * @method \Aws\Result putGroupPolicy(array $args = [])
188
+ * @method \GuzzleHttp\Promise\Promise putGroupPolicyAsync(array $args = [])
189
+ * @method \Aws\Result putRolePolicy(array $args = [])
190
+ * @method \GuzzleHttp\Promise\Promise putRolePolicyAsync(array $args = [])
191
+ * @method \Aws\Result putUserPolicy(array $args = [])
192
+ * @method \GuzzleHttp\Promise\Promise putUserPolicyAsync(array $args = [])
193
+ * @method \Aws\Result removeClientIDFromOpenIDConnectProvider(array $args = [])
194
+ * @method \GuzzleHttp\Promise\Promise removeClientIDFromOpenIDConnectProviderAsync(array $args = [])
195
+ * @method \Aws\Result removeRoleFromInstanceProfile(array $args = [])
196
+ * @method \GuzzleHttp\Promise\Promise removeRoleFromInstanceProfileAsync(array $args = [])
197
+ * @method \Aws\Result removeUserFromGroup(array $args = [])
198
+ * @method \GuzzleHttp\Promise\Promise removeUserFromGroupAsync(array $args = [])
199
+ * @method \Aws\Result resyncMFADevice(array $args = [])
200
+ * @method \GuzzleHttp\Promise\Promise resyncMFADeviceAsync(array $args = [])
201
+ * @method \Aws\Result setDefaultPolicyVersion(array $args = [])
202
+ * @method \GuzzleHttp\Promise\Promise setDefaultPolicyVersionAsync(array $args = [])
203
+ * @method \Aws\Result simulateCustomPolicy(array $args = [])
204
+ * @method \GuzzleHttp\Promise\Promise simulateCustomPolicyAsync(array $args = [])
205
+ * @method \Aws\Result simulatePrincipalPolicy(array $args = [])
206
+ * @method \GuzzleHttp\Promise\Promise simulatePrincipalPolicyAsync(array $args = [])
207
+ * @method \Aws\Result updateAccessKey(array $args = [])
208
+ * @method \GuzzleHttp\Promise\Promise updateAccessKeyAsync(array $args = [])
209
+ * @method \Aws\Result updateAccountPasswordPolicy(array $args = [])
210
+ * @method \GuzzleHttp\Promise\Promise updateAccountPasswordPolicyAsync(array $args = [])
211
+ * @method \Aws\Result updateAssumeRolePolicy(array $args = [])
212
+ * @method \GuzzleHttp\Promise\Promise updateAssumeRolePolicyAsync(array $args = [])
213
+ * @method \Aws\Result updateGroup(array $args = [])
214
+ * @method \GuzzleHttp\Promise\Promise updateGroupAsync(array $args = [])
215
+ * @method \Aws\Result updateLoginProfile(array $args = [])
216
+ * @method \GuzzleHttp\Promise\Promise updateLoginProfileAsync(array $args = [])
217
+ * @method \Aws\Result updateOpenIDConnectProviderThumbprint(array $args = [])
218
+ * @method \GuzzleHttp\Promise\Promise updateOpenIDConnectProviderThumbprintAsync(array $args = [])
219
+ * @method \Aws\Result updateSAMLProvider(array $args = [])
220
+ * @method \GuzzleHttp\Promise\Promise updateSAMLProviderAsync(array $args = [])
221
+ * @method \Aws\Result updateSSHPublicKey(array $args = [])
222
+ * @method \GuzzleHttp\Promise\Promise updateSSHPublicKeyAsync(array $args = [])
223
+ * @method \Aws\Result updateServerCertificate(array $args = [])
224
+ * @method \GuzzleHttp\Promise\Promise updateServerCertificateAsync(array $args = [])
225
+ * @method \Aws\Result updateSigningCertificate(array $args = [])
226
+ * @method \GuzzleHttp\Promise\Promise updateSigningCertificateAsync(array $args = [])
227
+ * @method \Aws\Result updateUser(array $args = [])
228
+ * @method \GuzzleHttp\Promise\Promise updateUserAsync(array $args = [])
229
+ * @method \Aws\Result uploadSSHPublicKey(array $args = [])
230
+ * @method \GuzzleHttp\Promise\Promise uploadSSHPublicKeyAsync(array $args = [])
231
+ * @method \Aws\Result uploadServerCertificate(array $args = [])
232
+ * @method \GuzzleHttp\Promise\Promise uploadServerCertificateAsync(array $args = [])
233
+ * @method \Aws\Result uploadSigningCertificate(array $args = [])
234
+ * @method \GuzzleHttp\Promise\Promise uploadSigningCertificateAsync(array $args = [])
235
+ */
236
+ class IamClient extends AwsClient {}
vendor/aannnaa7/aws-sdk-php-minimized/src/Inspector/Exception/InspectorException.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Inspector\Exception;
3
+
4
+ use Aws\Exception\AwsException;
5
+
6
+ /**
7
+ * Represents an error interacting with the **Amazon Inspector** service.
8
+ */
9
+ class InspectorException extends AwsException {}
vendor/aannnaa7/aws-sdk-php-minimized/src/Inspector/InspectorClient.php ADDED
@@ -0,0 +1,82 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Aws\Inspector;
3
+
4
+ use Aws\AwsClient;
5
+
6
+ /**
7
+ * This client is used to interact with the **Amazon Inspector** service.
8
+ *
9
+ * @method \Aws\Result addAttributesToFindings(array $args = [])
10
+ * @method \GuzzleHttp\Promise\Promise addAttributesToFindingsAsync(array $args = [])
11
+ * @method \Aws\Result attachAssessmentAndRulesPackage(array $args = [])
12
+ * @method \GuzzleHttp\Promise\Promise attachAssessmentAndRulesPackageAsync(array $args = [])
13
+ * @method \Aws\Result createApplication(array $args = [])
14
+ * @method \GuzzleHttp\Promise\Promise createApplicationAsync(array $args = [])
15
+ * @method \Aws\Result createAssessment(array $args = [])
16
+ * @method \GuzzleHttp\Promise\Promise createAssessmentAsync(array $args = [])
17
+ * @method \Aws\Result createResourceGroup(array $args = [])
18
+ * @method \GuzzleHttp\Promise\Promise createResourceGroupAsync(array $args = [])
19
+ * @method \Aws\Result deleteApplication(array $args = [])
20
+ * @method \GuzzleHttp\Promise\Promise deleteApplicationAsync(array $args = [])
21
+ * @method \Aws\Result deleteAssessment(array $args = [])
22
+ * @method \GuzzleHttp\Promise\Promise deleteAssessmentAsync(array $args = [])
23
+ * @method \Aws\Result deleteRun(array $args = [])
24
+ * @method \GuzzleHttp\Promise\Promise deleteRunAsync(array $args = [])
25
+ * @method \Aws\Result describeApplication(array $args = [])
26
+ * @method \GuzzleHttp\Promise\Promise describeApplicationAsync(array $args = [])
27
+ * @method \Aws\Result describeAssessment(array $args = [])
28
+ * @method \GuzzleHttp\Promise\Promise describeAssessmentAsync(array $args = [])
29
+ * @method \Aws\Result describeCrossAccountAccessRole(array $args = [])
30
+ * @method \GuzzleHttp\Promise\Promise describeCrossAccountAccessRoleAsync(array $args = [])
31
+ * @method \Aws\Result describeFinding(array $args = [])
32
+ * @method \GuzzleHttp\Promise\Promise describeFindingAsync(array $args = [])
33
+ * @method \Aws\Result describeResourceGroup(array $args = [])
34
+ * @method \GuzzleHttp\Promise\Promise describeResourceGroupAsync(array $args = [])
35
+ * @method \Aws\Result describeRulesPackage(array $args = [])
36
+ * @method \GuzzleHttp\Promise\Promise describeRulesPackageAsync(array $args = [])
37
+ * @method \Aws\Result describeRun(array $args = [])
38
+ * @method \GuzzleHttp\Promise\Promise describeRunAsync(array $args = [])
39
+ * @method \Aws\Result detachAssessmentAndRulesPackage(array $args = [])
40
+ * @method \GuzzleHttp\Promise\Promise detachAssessmentAndRulesPackageAsync(array $args = [])
41
+ * @method \Aws\Result getAssessmentTelemetry(array $args = [])
42
+ * @method \GuzzleHttp\Promise\Promise getAssessmentTelemetryAsync(array $args = [])
43
+ * @method \Aws\Result listApplications(array $args = [])
44
+ * @method \GuzzleHttp\Promise\Promise listApplicationsAsync(array $args = [])
45
+ * @method \Aws\Result listAssessmentAgents(array $args = [])
46
+ * @method \GuzzleHttp\Promise\Promise listAssessmentAgentsAsync(array $args = [])
47
+ * @method \Aws\Result listAssessments(array $args = [])
48
+ * @method \GuzzleHttp\Promise\Promise listAssessmentsAsync(array $args = [])
49
+ * @method \Aws\Result listAttachedAssessments(array $args = [])
50
+ * @method \GuzzleHttp\Promise\Promise listAttachedAssessmentsAsync(array $args = [])
51
+ * @method \Aws\Result listAttachedRulesPackages(array $args = [])
52
+ * @method \GuzzleHttp\Promise\Promise listAttachedRulesPackagesAsync(array $args = [])
53
+ * @method \Aws\Result listFindings(array $args = [])
54
+ * @method \GuzzleHttp\Promise\Promise listFindingsAsync(array $args = [])
55
+ * @method \Aws\Result listRulesPackages(array $args = [])
56
+ * @method \GuzzleHttp\Promise\Promise listRulesPackagesAsync(array $args = [])
57
+ * @method \Aws\Result listRuns(array $args = [])
58
+ * @method \GuzzleHttp\Promise\Promise listRunsAsync(array $args = [])
59
+ * @method \Aws\Result listTagsForResource(array $args = [])
60
+ * @method \GuzzleHttp\Promise\Promise listTagsForResourceAsync(array $args = [])
61
+ * @method \Aws\Result localizeText(array $args = [])
62
+ * @method \GuzzleHttp\Promise\Promise localizeTextAsync(array $args = [])
63
+ * @method \Aws\Result previewAgentsForResourceGroup(array $args = [])
64
+ * @method \GuzzleHttp\Promise\Promise previewAgentsForResourceGroupAsync(array $args = [])
65
+ * @method \Aws\Result registerCrossAccountAccessRole(array $args = [])
66
+ * @method \GuzzleHttp\Promise\Promise registerCrossAccountAccessRoleAsync(array $args = [])
67
+ * @method \Aws\Result removeAttributesF