@alternative-path/testlens-playwright-reporter 0.3.9 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.d.ts CHANGED
@@ -157,9 +157,15 @@ export interface SpecData {
157
157
  export declare class TestLensReporter implements Reporter {
158
158
  private config;
159
159
  private axiosInstance;
160
+ /**
161
+ * Get bundled CA certificates for TestLens
162
+ * Combines custom CA bundle with Node.js root certificates
163
+ * This ensures SSL works with both testlens.qa-path.com and other HTTPS endpoints
164
+ */
165
+ private static getBundledCaCertificates;
160
166
  /**
161
167
  * Automatically detect and load system CA certificates
162
- * Uses Node.js built-in root certificates (works across all platforms)
168
+ * Uses bundled certificates as primary source, falls back to system certificates
163
169
  */
164
170
  private static getSystemCaCertificates;
165
171
  private runId;
package/index.js CHANGED
@@ -22,32 +22,63 @@ async function getMime() {
22
22
  }
23
23
  class TestLensReporter {
24
24
  /**
25
- * Automatically detect and load system CA certificates
26
- * Uses Node.js built-in root certificates (works across all platforms)
25
+ * Get bundled CA certificates for TestLens
26
+ * Combines custom CA bundle with Node.js root certificates
27
+ * This ensures SSL works with both testlens.qa-path.com and other HTTPS endpoints
27
28
  */
28
- static getSystemCaCertificates() {
29
- // Use Node.js's built-in root certificates (available in Node.js 12.3.0+)
30
- // This includes all common root CAs and works reliably across Windows, macOS, and Linux
29
+ static getBundledCaCertificates() {
30
+ const allCerts = [];
31
+ // First, add our bundled TestLens CA certificate chain
32
+ try {
33
+ const certPath = path.join(__dirname, 'testlens-ca-bundle.pem');
34
+ if (fs.existsSync(certPath)) {
35
+ const certData = fs.readFileSync(certPath, 'utf8');
36
+ // Split the bundle into individual certificates
37
+ const certs = certData.match(/-----BEGIN CERTIFICATE-----[\s\S]+?-----END CERTIFICATE-----/g);
38
+ if (certs && certs.length > 0) {
39
+ const buffers = certs.map(cert => Buffer.from(cert, 'utf8'));
40
+ allCerts.push(...buffers);
41
+ if (process.env.DEBUG) {
42
+ console.log(`✓ Loaded bundled TestLens CA certificates (${buffers.length} certificate(s))`);
43
+ }
44
+ }
45
+ }
46
+ }
47
+ catch (error) {
48
+ if (process.env.DEBUG) {
49
+ console.log('⚠️ Bundled CA certificate not available');
50
+ }
51
+ }
52
+ // Then, add Node.js built-in root certificates for general SSL support
31
53
  try {
32
54
  if (tls.rootCertificates && Array.isArray(tls.rootCertificates) && tls.rootCertificates.length > 0) {
33
- // Convert string certificates to Buffer
34
- const rootCerts = tls.rootCertificates.map(cert => Buffer.from(cert));
55
+ const rootCerts = tls.rootCertificates.map(cert => Buffer.from(cert, 'utf8'));
56
+ allCerts.push(...rootCerts);
35
57
  if (process.env.DEBUG) {
36
- console.log(`✓ Using Node.js built-in root certificates (${rootCerts.length} certificates)`);
58
+ console.log(`✓ Added Node.js built-in root certificates (${rootCerts.length} certificates)`);
37
59
  }
38
- return rootCerts;
39
60
  }
40
61
  }
41
62
  catch (error) {
42
- // Fall through to file-based detection if tls.rootCertificates is not available
43
63
  if (process.env.DEBUG) {
44
- console.log('⚠️ Node.js built-in root certificates not available, trying file-based detection');
64
+ console.log('⚠️ Node.js built-in root certificates not available');
45
65
  }
46
66
  }
67
+ return allCerts.length > 0 ? allCerts : undefined;
68
+ }
69
+ /**
70
+ * Automatically detect and load system CA certificates
71
+ * Uses bundled certificates as primary source, falls back to system certificates
72
+ */
73
+ static getSystemCaCertificates() {
74
+ // First, try to use our bundled certificates (Node.js rootCertificates)
75
+ const bundledCerts = TestLensReporter.getBundledCaCertificates();
76
+ if (bundledCerts && bundledCerts.length > 0) {
77
+ return bundledCerts;
78
+ }
47
79
  // Fallback: Try to load from file system (for older Node.js versions or special cases)
48
80
  const platform = os.platform();
49
81
  const certificates = [];
50
- // Fallback: Try to load certificates from common file system locations
51
82
  const certPaths = [];
52
83
  if (platform === 'darwin') {
53
84
  // macOS: Common certificate locations
@@ -156,42 +187,44 @@ class TestLensReporter {
156
187
  // Determine SSL validation behavior
157
188
  let rejectUnauthorized = true; // Default to secure
158
189
  let ca = undefined;
159
- // Automatically detect and load system CA certificates
160
- // This helps resolve "unable to get local issuer certificate" errors
161
- const systemCerts = TestLensReporter.getSystemCaCertificates();
190
+ // Use bundled CA certificates as primary source (Node.js rootCertificates)
191
+ // This ensures consistent behavior across all platforms
192
+ const bundledCerts = TestLensReporter.getBundledCaCertificates();
162
193
  // Load custom CA certificate if explicitly provided (for advanced users)
194
+ // Custom certificates will be combined with bundled certificates
163
195
  if (this.config.caCertificate) {
164
196
  try {
165
197
  if (fs.existsSync(this.config.caCertificate)) {
166
198
  const customCert = fs.readFileSync(this.config.caCertificate);
167
- // Combine system certs with custom cert if system certs are available
168
- if (systemCerts && Array.isArray(systemCerts) && systemCerts.length > 0) {
169
- ca = [...systemCerts, customCert];
199
+ // Combine bundled certs with custom cert
200
+ if (bundledCerts && Array.isArray(bundledCerts) && bundledCerts.length > 0) {
201
+ ca = [...bundledCerts, customCert];
202
+ console.log(`✓ Using bundled CA certificates + custom certificate: ${this.config.caCertificate}`);
170
203
  }
171
204
  else {
172
205
  ca = customCert;
206
+ console.log(`✓ Using custom CA certificate: ${this.config.caCertificate}`);
173
207
  }
174
- console.log(`✓ Using custom CA certificate: ${this.config.caCertificate}`);
175
208
  }
176
209
  else {
177
210
  console.warn(`⚠️ CA certificate file not found: ${this.config.caCertificate}`);
178
- // Fall back to system certs if custom cert not found
179
- ca = systemCerts || undefined;
211
+ // Fall back to bundled certs if custom cert not found
212
+ ca = bundledCerts || undefined;
180
213
  }
181
214
  }
182
215
  catch (error) {
183
216
  console.warn(`⚠️ Failed to read CA certificate file: ${this.config.caCertificate}`, error.message);
184
- // Fall back to system certs if custom cert read fails
185
- ca = systemCerts || undefined;
217
+ // Fall back to bundled certs if custom cert read fails
218
+ ca = bundledCerts || undefined;
186
219
  }
187
220
  }
188
221
  else {
189
- // Use automatically detected system certificates
190
- // On Windows, systemCerts will be undefined to let Node.js use Windows certificate store
191
- // On Unix systems, systemCerts will contain certificates or be undefined
192
- ca = systemCerts;
193
- // If ca is undefined, Node.js will use its default certificate store
194
- // This is the correct behavior, especially on Windows
222
+ // Use bundled certificates as primary source
223
+ // This works reliably across all platforms (Windows, macOS, Linux)
224
+ ca = bundledCerts || undefined;
225
+ if (ca && process.env.DEBUG) {
226
+ console.log(`✓ Using bundled CA certificates (${Array.isArray(ca) ? ca.length : 1} certificates)`);
227
+ }
195
228
  }
196
229
  // Check various ways SSL validation can be disabled (in order of precedence)
197
230
  if (this.config.ignoreSslErrors) {
package/index.ts CHANGED
@@ -185,33 +185,66 @@ export class TestLensReporter implements Reporter {
185
185
  private axiosInstance: AxiosInstance;
186
186
 
187
187
  /**
188
- * Automatically detect and load system CA certificates
189
- * Uses Node.js built-in root certificates (works across all platforms)
188
+ * Get bundled CA certificates for TestLens
189
+ * Combines custom CA bundle with Node.js root certificates
190
+ * This ensures SSL works with both testlens.qa-path.com and other HTTPS endpoints
190
191
  */
191
- private static getSystemCaCertificates(): Buffer[] | undefined {
192
- // Use Node.js's built-in root certificates (available in Node.js 12.3.0+)
193
- // This includes all common root CAs and works reliably across Windows, macOS, and Linux
192
+ private static getBundledCaCertificates(): Buffer[] | undefined {
193
+ const allCerts: Buffer[] = [];
194
+
195
+ // First, add our bundled TestLens CA certificate chain
196
+ try {
197
+ const certPath = path.join(__dirname, 'testlens-ca-bundle.pem');
198
+ if (fs.existsSync(certPath)) {
199
+ const certData = fs.readFileSync(certPath, 'utf8');
200
+ // Split the bundle into individual certificates
201
+ const certs = certData.match(/-----BEGIN CERTIFICATE-----[\s\S]+?-----END CERTIFICATE-----/g);
202
+ if (certs && certs.length > 0) {
203
+ const buffers = certs.map(cert => Buffer.from(cert, 'utf8'));
204
+ allCerts.push(...buffers);
205
+ if (process.env.DEBUG) {
206
+ console.log(`✓ Loaded bundled TestLens CA certificates (${buffers.length} certificate(s))`);
207
+ }
208
+ }
209
+ }
210
+ } catch (error) {
211
+ if (process.env.DEBUG) {
212
+ console.log('⚠️ Bundled CA certificate not available');
213
+ }
214
+ }
215
+
216
+ // Then, add Node.js built-in root certificates for general SSL support
194
217
  try {
195
218
  if (tls.rootCertificates && Array.isArray(tls.rootCertificates) && tls.rootCertificates.length > 0) {
196
- // Convert string certificates to Buffer
197
- const rootCerts = tls.rootCertificates.map(cert => Buffer.from(cert));
219
+ const rootCerts = tls.rootCertificates.map(cert => Buffer.from(cert, 'utf8'));
220
+ allCerts.push(...rootCerts);
198
221
  if (process.env.DEBUG) {
199
- console.log(`✓ Using Node.js built-in root certificates (${rootCerts.length} certificates)`);
222
+ console.log(`✓ Added Node.js built-in root certificates (${rootCerts.length} certificates)`);
200
223
  }
201
- return rootCerts;
202
224
  }
203
225
  } catch (error) {
204
- // Fall through to file-based detection if tls.rootCertificates is not available
205
226
  if (process.env.DEBUG) {
206
- console.log('⚠️ Node.js built-in root certificates not available, trying file-based detection');
227
+ console.log('⚠️ Node.js built-in root certificates not available');
207
228
  }
208
229
  }
209
230
 
231
+ return allCerts.length > 0 ? allCerts : undefined;
232
+ }
233
+
234
+ /**
235
+ * Automatically detect and load system CA certificates
236
+ * Uses bundled certificates as primary source, falls back to system certificates
237
+ */
238
+ private static getSystemCaCertificates(): Buffer[] | undefined {
239
+ // First, try to use our bundled certificates (Node.js rootCertificates)
240
+ const bundledCerts = TestLensReporter.getBundledCaCertificates();
241
+ if (bundledCerts && bundledCerts.length > 0) {
242
+ return bundledCerts;
243
+ }
244
+
210
245
  // Fallback: Try to load from file system (for older Node.js versions or special cases)
211
246
  const platform = os.platform();
212
247
  const certificates: Buffer[] = [];
213
-
214
- // Fallback: Try to load certificates from common file system locations
215
248
  const certPaths: string[] = [];
216
249
 
217
250
  if (platform === 'darwin') {
@@ -348,39 +381,41 @@ export class TestLensReporter implements Reporter {
348
381
  let rejectUnauthorized = true; // Default to secure
349
382
  let ca: Buffer | string | Buffer[] | undefined = undefined;
350
383
 
351
- // Automatically detect and load system CA certificates
352
- // This helps resolve "unable to get local issuer certificate" errors
353
- const systemCerts = TestLensReporter.getSystemCaCertificates();
384
+ // Use bundled CA certificates as primary source (Node.js rootCertificates)
385
+ // This ensures consistent behavior across all platforms
386
+ const bundledCerts = TestLensReporter.getBundledCaCertificates();
354
387
 
355
388
  // Load custom CA certificate if explicitly provided (for advanced users)
389
+ // Custom certificates will be combined with bundled certificates
356
390
  if (this.config.caCertificate) {
357
391
  try {
358
392
  if (fs.existsSync(this.config.caCertificate)) {
359
393
  const customCert = fs.readFileSync(this.config.caCertificate);
360
- // Combine system certs with custom cert if system certs are available
361
- if (systemCerts && Array.isArray(systemCerts) && systemCerts.length > 0) {
362
- ca = [...systemCerts, customCert];
394
+ // Combine bundled certs with custom cert
395
+ if (bundledCerts && Array.isArray(bundledCerts) && bundledCerts.length > 0) {
396
+ ca = [...bundledCerts, customCert];
397
+ console.log(`✓ Using bundled CA certificates + custom certificate: ${this.config.caCertificate}`);
363
398
  } else {
364
399
  ca = customCert;
400
+ console.log(`✓ Using custom CA certificate: ${this.config.caCertificate}`);
365
401
  }
366
- console.log(`✓ Using custom CA certificate: ${this.config.caCertificate}`);
367
402
  } else {
368
403
  console.warn(`⚠️ CA certificate file not found: ${this.config.caCertificate}`);
369
- // Fall back to system certs if custom cert not found
370
- ca = systemCerts || undefined;
404
+ // Fall back to bundled certs if custom cert not found
405
+ ca = bundledCerts || undefined;
371
406
  }
372
407
  } catch (error) {
373
408
  console.warn(`⚠️ Failed to read CA certificate file: ${this.config.caCertificate}`, (error as Error).message);
374
- // Fall back to system certs if custom cert read fails
375
- ca = systemCerts || undefined;
409
+ // Fall back to bundled certs if custom cert read fails
410
+ ca = bundledCerts || undefined;
376
411
  }
377
412
  } else {
378
- // Use automatically detected system certificates
379
- // On Windows, systemCerts will be undefined to let Node.js use Windows certificate store
380
- // On Unix systems, systemCerts will contain certificates or be undefined
381
- ca = systemCerts;
382
- // If ca is undefined, Node.js will use its default certificate store
383
- // This is the correct behavior, especially on Windows
413
+ // Use bundled certificates as primary source
414
+ // This works reliably across all platforms (Windows, macOS, Linux)
415
+ ca = bundledCerts || undefined;
416
+ if (ca && process.env.DEBUG) {
417
+ console.log(`✓ Using bundled CA certificates (${Array.isArray(ca) ? ca.length : 1} certificates)`);
418
+ }
384
419
  }
385
420
 
386
421
  // Check various ways SSL validation can be disabled (in order of precedence)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alternative-path/testlens-playwright-reporter",
3
- "version": "0.3.9",
3
+ "version": "0.4.1",
4
4
  "description": "Universal Playwright reporter for TestLens - works with both TypeScript and JavaScript projects",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -14,6 +14,7 @@
14
14
  "lib/",
15
15
  "postinstall.js",
16
16
  "cross-env.js",
17
+ "testlens-ca-bundle.pem",
17
18
  "README.md",
18
19
  "CHANGELOG.md"
19
20
  ],
@@ -0,0 +1,88 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIFvDCCBKSgAwIBAgIQCCpc5jpiqFvmHWmaKaa8zTANBgkqhkiG9w0BAQsFADA8
3
+ MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRwwGgYDVQQDExNBbWF6b24g
4
+ UlNBIDIwNDggTTA0MB4XDTI1MTExNDAwMDAwMFoXDTI2MTIxMzIzNTk1OVowGDEW
5
+ MBQGA1UEAwwNKi5xYS1wYXRoLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
6
+ AQoCggEBAMFsdDGpKLNQ9GayoFXQpE9VLNxEZ/76AaiJMj30Nkuf245KxcPdmPMQ
7
+ rklyBsKv2r4vGwqIrIh4ey59Zpi5z/GMtSP6DwPU/MGGRQGJ9Mpc2dhpxNvka7hW
8
+ 9+t/uFAMbwvAhAe82fahsd6q/jtRMChkKQ2Ndln41PPnTPzqqoc2GWdYJO69W1x0
9
+ 5CbovMOOoGKkskrS2TNe5+vYp8c8AWR6ga3zR2lxMVDAAXKcD/ejMq/FMR8TD9rf
10
+ 6pWnsalQE7UAIgSltu9hrJRttCnyC6343WIQKspd3x+fZ6WdqtR4YywLij9DMBgJ
11
+ KwYUHMjoY4lfkSgowhgnuCUFeqVhBrsCAwEAAaOCAtwwggLYMB8GA1UdIwQYMBaA
12
+ FB9SkmFWglR/gWbYHT0KqjJch90IMB0GA1UdDgQWBBSsbNiBXRvG7yzfgQnHA4Fm
13
+ Gvve1TAYBgNVHREEETAPgg0qLnFhLXBhdGguY29tMBMGA1UdIAQMMAowCAYGZ4EM
14
+ AQIBMA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATA7BgNVHR8E
15
+ NDAyMDCgLqAshipodHRwOi8vY3JsLnIybTA0LmFtYXpvbnRydXN0LmNvbS9yMm0w
16
+ NC5jcmwwdQYIKwYBBQUHAQEEaTBnMC0GCCsGAQUFBzABhiFodHRwOi8vb2NzcC5y
17
+ Mm0wNC5hbWF6b250cnVzdC5jb20wNgYIKwYBBQUHMAKGKmh0dHA6Ly9jcnQucjJt
18
+ MDQuYW1hem9udHJ1c3QuY29tL3IybTA0LmNlcjAMBgNVHRMBAf8EAjAAMIIBfgYK
19
+ KwYBBAHWeQIEAgSCAW4EggFqAWgAdgDYCVU7lE96/8gWGW+UT4WrsPj8XodVJg8V
20
+ 0S5yu0VLFAAAAZqBmF/qAAAEAwBHMEUCIHg3mktTsuS8r57mR014haS8fqwcbqa1
21
+ P3so9Qd02JFBAiEAsHQf6eH9AL0HoG5jEVfz4aZdNp/Y8unnDO+ZWSfW/wcAdgDC
22
+ MX5XRRmjRe5/ON6ykEHrx8IhWiK/f9W1rXaa2Q5SzQAAAZqBmF/lAAAEAwBHMEUC
23
+ IQCZhIaG3vpxTThIdHhvNCymkHGKFLggUBcPCqYMdYVFpAIgW+BszH9Kdon3IKNJ
24
+ xKx5e4K+XZ+NhfXqqnCmPYeCwzQAdgCUTkOH+uzB74HzGSQmqBhlAcfTXzgCAT9y
25
+ Z31VNy4Z2AAAAZqBmF/1AAAEAwBHMEUCIQDGh+jKNI6NO30js2yl0ItBltCDGA5d
26
+ 3A1qoPf81FCF8wIgFTxoXXotS8nhDzOeyJh1wL6wKMxcwKXUUMcOKEjFsH4wDQYJ
27
+ KoZIhvcNAQELBQADggEBAMY6zXuf7YSu4s/nHd4qSjOq7mAPvWKSumPMXcRp4FfX
28
+ 16dAyqaiasX2B7dXccks4QeCUyNxCjh89irTYwgDcde8J05PEM9dpxUglyWE6gEB
29
+ r+pp8xJzT9hP2TmLhkNsFKhiT8aR+wz9fiALVDeQLyUS1GOSmnAXbH8MjZkm5Cxb
30
+ Taqb+N8alKrMf7Y9Cwf77KRFpKqm+b1e6h/EuVIJWAFau1jKVS5Qd6KTjyf0sRys
31
+ 7nvF3JqKVIb6BlTimNUq1wYMJKX6mOb/MlHo8juzKMb+MYUA5ZHrO36u3nOgThiI
32
+ oOJavnwzLhk7AWp8urdy9yTj8P3b/3H3VtCfYMeAabE=
33
+ -----END CERTIFICATE-----
34
+
35
+ -----BEGIN CERTIFICATE-----
36
+ MIIEXjCCA0agAwIBAgITB3MSTyqVLj7Rili9uF0bwM5fJzANBgkqhkiG9w0BAQsF
37
+ ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6
38
+ b24gUm9vdCBDQSAxMB4XDTIyMDgyMzIyMjYzNVoXDTMwMDgyMzIyMjYzNVowPDEL
39
+ MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEcMBoGA1UEAxMTQW1hem9uIFJT
40
+ QSAyMDQ4IE0wNDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM3pVR6A
41
+ lQOp4xe776FdePXyejgA38mYx1ou9/jrpV6Sfn+/oqBKgwhY6ePsQHHQayWBJdBn
42
+ v4Wz363qRI4XUh9swBFJ11TnZ3LqOMvHmWq2+loA0QPtOfXdJ2fHBLrBrngtJ/GB
43
+ 0p5olAVYrSZgvQGP16Rf8ddtNyxEEhYm3HuhmNi+vSeAq1tLYJPAvRCXonTpWdSD
44
+ xY6hvdmxlqTYi82AtBXSfpGQ58HHM0hw0C6aQakghrwWi5fGslLOqzpimNMIsT7c
45
+ qa0GJx6JfKqJqmQQNplO2h8n9ZsFJgBowof01ppdoLAWg6caMOM0om/VILKaa30F
46
+ 9W/r8Qjah7ltGVkCAwEAAaOCAVowggFWMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYD
47
+ VR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAdBgNV
48
+ HQ4EFgQUH1KSYVaCVH+BZtgdPQqqMlyH3QgwHwYDVR0jBBgwFoAUhBjMhTTsvAyU
49
+ lC4IWZzHshBOCggwewYIKwYBBQUHAQEEbzBtMC8GCCsGAQUFBzABhiNodHRwOi8v
50
+ b2NzcC5yb290Y2ExLmFtYXpvbnRydXN0LmNvbTA6BggrBgEFBQcwAoYuaHR0cDov
51
+ L2NydC5yb290Y2ExLmFtYXpvbnRydXN0LmNvbS9yb290Y2ExLmNlcjA/BgNVHR8E
52
+ ODA2MDSgMqAwhi5odHRwOi8vY3JsLnJvb3RjYTEuYW1hem9udHJ1c3QuY29tL3Jv
53
+ b3RjYTEuY3JsMBMGA1UdIAQMMAowCAYGZ4EMAQIBMA0GCSqGSIb3DQEBCwUAA4IB
54
+ AQA+1O5UsAaNuW3lHzJtpNGwBnZd9QEYFtxpiAnIaV4qApnGS9OCw5ZPwie7YSlD
55
+ ZF5yyFPsFhUC2Q9uJHY/CRV1b5hIiGH0+6+w5PgKiY1MWuWT8VAaJjFxvuhM7a/e
56
+ fN2TIw1Wd6WCl6YRisunjQOrSP+unqC8A540JNyZ1JOE3jVqat3OZBGgMvihdj2w
57
+ Y23EpwesrKiQzkHzmvSH67PVW4ycbPy08HVZnBxZ5NrlGG9bwXR3fNTaz+c+Ej6c
58
+ 5AnwI3qkOFgSkg3Y75cdFz6pO/olK+e3AqygAcv0WjzmkDPuBjssuZjCHMC56oH3
59
+ GJkV29Di2j5prHJbwZjG1inU
60
+ -----END CERTIFICATE-----
61
+
62
+ -----BEGIN CERTIFICATE-----
63
+ MIIEkjCCA3qgAwIBAgITBn+USionzfP6wq4rAfkI7rnExjANBgkqhkiG9w0BAQsF
64
+ ADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNj
65
+ b3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4x
66
+ OzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1
67
+ dGhvcml0eSAtIEcyMB4XDTE1MDUyNTEyMDAwMFoXDTM3MTIzMTAxMDAwMFowOTEL
68
+ MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv
69
+ b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj
70
+ ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM
71
+ 9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw
72
+ IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6
73
+ VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L
74
+ 93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm
75
+ jgSubJrIqg0CAwEAAaOCATEwggEtMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
76
+ BAQDAgGGMB0GA1UdDgQWBBSEGMyFNOy8DJSULghZnMeyEE4KCDAfBgNVHSMEGDAW
77
+ gBScXwDfqgHXMCs4iKK4bUqc8hGRgzB4BggrBgEFBQcBAQRsMGowLgYIKwYBBQUH
78
+ MAGGImh0dHA6Ly9vY3NwLnJvb3RnMi5hbWF6b250cnVzdC5jb20wOAYIKwYBBQUH
79
+ MAKGLGh0dHA6Ly9jcnQucm9vdGcyLmFtYXpvbnRydXN0LmNvbS9yb290ZzIuY2Vy
80
+ MD0GA1UdHwQ2MDQwMqAwoC6GLGh0dHA6Ly9jcmwucm9vdGcyLmFtYXpvbnRydXN0
81
+ LmNvbS9yb290ZzIuY3JsMBEGA1UdIAQKMAgwBgYEVR0gADANBgkqhkiG9w0BAQsF
82
+ AAOCAQEAYjdCXLwQtT6LLOkMm2xF4gcAevnFWAu5CIw+7bMlPLVvUOTNNWqnkzSW
83
+ MiGpSESrnO09tKpzbeR/FoCJbM8oAxiDR3mjEH4wW6w7sGDgd9QIpuEdfF7Au/ma
84
+ eyKdpwAJfqxGF4PcnCZXmTA5YpaP7dreqsXMGz7KQ2hsVxa81Q4gLv7/wmpdLqBK
85
+ bRRYh5TmOTFffHPLkIhqhBGWJ6bt2YFGpn6jcgAKUj6DiAdjd4lpFw85hdKrCEVN
86
+ 0FE6/V1dN2RMfjCyVSRCnTawXZwXgWHxyvkQAiSr6w10kY17RSlQOYiypok1JR4U
87
+ akcjMS9cmvqtmg5iUaQqqcT5NJ0hGA==
88
+ -----END CERTIFICATE-----