Project homepage Mailing List  Warmcat.com  API Docs  Github Mirror 
{"schema":"libjg2-1", "vpath":"/git/", "avatar":"/git/avatar/", "alang":"", "gen_ut":1752658255, "reponame":"libwebsockets", "desc":"libwebsockets lightweight C networking library", "owner": { "name": "Andy Green", "email": "andy@warmcat.com", "md5": "c50933ca2aa61e0fe2c43d46bb6b59cb" },"url":"https://libwebsockets.org/repo/libwebsockets", "f":3, "items": [ {"schema":"libjg2-1", "cid":"5b3575e2add45427ca29af3fe8385e6a", "commit": {"type":"commit", "time": 1552363063, "time_ofs": 480, "oid_tree": { "oid": "947c62045f10330d61566016900491c12844bf32", "alias": []}, "oid":{ "oid": "4ed522eb9c4825300813ac6f6bc7b134665da3a1", "alias": []}, "msg": "minimal-http-client-custom-headers", "sig_commit": { "git_time": { "time": 1552363063, "offset": 480 }, "name": "Andy Green", "email": "andy@warmcat.com", "md5": "c50933ca2aa61e0fe2c43d46bb6b59cb" }, "sig_author": { "git_time": { "time": 1552254848, "offset": 480 }, "name": "Andy Green", "email": "andy@warmcat.com", "md5": "c50933ca2aa61e0fe2c43d46bb6b59cb" }}, "body": "minimal-http-client-custom-headers" , "diff": "diff --git a/minimal-examples/http-client/README.md b/minimal-examples/http-client/README.md\nindex e10d17d..fc56f6c 100644\n--- a/minimal-examples/http-client/README.md\n+++ b/minimal-examples/http-client/README.md\n@@ -1,6 +1,7 @@\n |name|demonstrates|\n ---|---\n minimal-http-client-certinfo|Shows how to gain detailed information on the peer certificate\n+minimal-http-client-custom-headers|Shows how to send and receive custom headers (h1 only)\n minimal-http-client-hugeurl|Sends a \u003e 2.5KB URL to warmcat.com\n minimal-http-client-multi|Connects to and reads https://warmcat.com, 8 times concurrently\n minimal-http-client-post|POSTs a form containing an uploaded file and a form variable, and captures the response\ndiff --git a/minimal-examples/http-client/minimal-http-client-custom-headers/CMakeLists.txt b/minimal-examples/http-client/minimal-http-client-custom-headers/CMakeLists.txt\nnew file mode 100644\nindex 0000000..a81d45d\n--- /dev/null\n+++ b/minimal-examples/http-client/minimal-http-client-custom-headers/CMakeLists.txt\n@@ -0,0 +1,79 @@\n+cmake_minimum_required(VERSION 2.8)\n+include(CheckCSourceCompiles)\n+\n+set(SAMP lws-minimal-http-client-custom-headers)\n+set(SRCS minimal-http-client-custom-headers.c)\n+\n+# If we are being built as part of lws, confirm current build config supports\n+# reqconfig, else skip building ourselves.\n+#\n+# If we are being built externally, confirm installed lws was configured to\n+# support reqconfig, else error out with a helpful message about the problem.\n+#\n+MACRO(require_lws_config reqconfig _val result)\n+\n+\tif (DEFINED ${reqconfig})\n+\tif (${reqconfig})\n+\t\tset (rq 1)\n+\telse()\n+\t\tset (rq 0)\n+\tendif()\n+\telse()\n+\t\tset(rq 0)\n+\tendif()\n+\n+\tif (${_val} EQUAL ${rq})\n+\t\tset(SAME 1)\n+\telse()\n+\t\tset(SAME 0)\n+\tendif()\n+\n+\tif (LWS_WITH_MINIMAL_EXAMPLES AND NOT ${SAME})\n+\t\tif (${_val})\n+\t\t\tmessage(\u0022${SAMP}: skipping as lws being built without ${reqconfig}\u0022)\n+\t\telse()\n+\t\t\tmessage(\u0022${SAMP}: skipping as lws built with ${reqconfig}\u0022)\n+\t\tendif()\n+\t\tset(${result} 0)\n+\telse()\n+\t\tif (LWS_WITH_MINIMAL_EXAMPLES)\n+\t\t\tset(MET ${SAME})\n+\t\telse()\n+\t\t\tCHECK_C_SOURCE_COMPILES(\u0022#include \u003clibwebsockets.h\u003e\u005cnint main(void) {\u005cn#if defined(${reqconfig})\u005cn return 0;\u005cn#else\u005cn fail;\u005cn#endif\u005cn return 0;\u005cn}\u005cn\u0022 HAS_${reqconfig})\n+\t\t\tif (NOT DEFINED HAS_${reqconfig} OR NOT HAS_${reqconfig})\n+\t\t\t\tset(HAS_${reqconfig} 0)\n+\t\t\telse()\n+\t\t\t\tset(HAS_${reqconfig} 1)\n+\t\t\tendif()\n+\t\t\tif ((HAS_${reqconfig} AND ${_val}) OR (NOT HAS_${reqconfig} AND NOT ${_val}))\n+\t\t\t\tset(MET 1)\n+\t\t\telse()\n+\t\t\t\tset(MET 0)\n+\t\t\tendif()\n+\t\tendif()\n+\t\tif (NOT MET)\n+\t\t\tif (${_val})\n+\t\t\t\tmessage(FATAL_ERROR \u0022This project requires lws must have been configured with ${reqconfig}\u0022)\n+\t\t\telse()\n+\t\t\t\tmessage(FATAL_ERROR \u0022Lws configuration of ${reqconfig} is incompatible with this project\u0022)\n+\t\t\tendif()\n+\t\tendif()\n+\t\n+\tendif()\n+ENDMACRO()\n+\n+\n+set(requirements 1)\n+require_lws_config(LWS_ROLE_H1 1 requirements)\n+require_lws_config(LWS_WITHOUT_CLIENT 0 requirements)\n+\n+if (requirements)\n+\tadd_executable(${SAMP} ${SRCS})\n+\n+\tif (websockets_shared)\n+\t\ttarget_link_libraries(${SAMP} websockets_shared)\n+\t\tadd_dependencies(${SAMP} websockets_shared)\n+\telse()\n+\t\ttarget_link_libraries(${SAMP} websockets)\n+\tendif()\n+endif()\ndiff --git a/minimal-examples/http-client/minimal-http-client-custom-headers/README.md b/minimal-examples/http-client/minimal-http-client-custom-headers/README.md\nnew file mode 100644\nindex 0000000..ac49a87\n--- /dev/null\n+++ b/minimal-examples/http-client/minimal-http-client-custom-headers/README.md\n@@ -0,0 +1,45 @@\n+# lws minimal http client custom headers\n+\n+This http client application shows how to send and receive custom headers.\n+\n+This currently only works on http 1, so the app forces that even if h2 enables.\n+\n+## build\n+\n+```\n+ $ cmake . \u0026\u0026 make\n+```\n+\n+## usage\n+\n+Commandline option|Meaning\n+---|---\n+-d \u003cloglevel\u003e|Debug verbosity in decimal, eg, -d15\n+-l| Connect to https://localhost:7681 and accept selfsigned cert\n+-n|no TLS\n+\n+The app looks for a custom header \u0022test-custom-header\u0022 sent by warmcat.com.\n+\n+```\n+ $ ./lws-minimal-http-client-custom-headers\n+[2019/03/11 05:46:45:7582] USER: LWS minimal http client Custom Headers [-d\u003cverbosity\u003e] [-l] [--h1]\n+[2019/03/11 05:46:45:7671] NOTICE: created client ssl context for default\n+[2019/03/11 05:46:46:7812] USER: Connected with server response: 200\n+[2019/03/11 05:46:46:7812] NOTICE: callback_http: custom header: 'hello'\n+[2019/03/11 05:46:46:7814] USER: RECEIVE_CLIENT_HTTP_READ: read 1024\n+...\n+```\n+You can use the -n and -l to make this test app connect to localhost:7681 over http,\n+and confirm the \u0022dnt:1\u0022 header was sent either by tcpdump or by running the test\n+server on :7681 with -d1151\n+\n+```\n+[2019/03/11 05:48:53:6806] PARSER: WSI_TOKEN_NAME_PART 'd' 0x64 (role\u003d0x20000000) wsi-\u003elextable_pos\u003d0\n+[2019/03/11 05:48:53:6807] PARSER: WSI_TOKEN_NAME_PART 'n' 0x6E (role\u003d0x20000000) wsi-\u003elextable_pos\u003d567\n+[2019/03/11 05:48:53:6807] PARSER: WSI_TOKEN_NAME_PART 't' 0x74 (role\u003d0x20000000) wsi-\u003elextable_pos\u003d-1\n+[2019/03/11 05:48:53:6807] PARSER: WSI_TOKEN_NAME_PART ' ' 0x20 (role\u003d0x20000000) wsi-\u003elextable_pos\u003d-1\n+[2019/03/11 05:48:53:6807] PARSER: WSI_TOKEN_NAME_PART '1' 0x31 (role\u003d0x20000000) wsi-\u003elextable_pos\u003d-1\n+' 0x0D (role\u003d0x20000000) wsi-\u003elextable_pos\u003d-1NAME_PART '\n+[2019/03/11 05:48:53:6807] PARSER: WSI_TOKEN_NAME_PART '\n+```\n+\ndiff --git a/minimal-examples/http-client/minimal-http-client-custom-headers/minimal-http-client-custom-headers.c b/minimal-examples/http-client/minimal-http-client-custom-headers/minimal-http-client-custom-headers.c\nnew file mode 100644\nindex 0000000..c374666\n--- /dev/null\n+++ b/minimal-examples/http-client/minimal-http-client-custom-headers/minimal-http-client-custom-headers.c\n@@ -0,0 +1,220 @@\n+/*\n+ * lws-minimal-http-client\n+ *\n+ * Copyright (C) 2018 Andy Green \u003candy@warmcat.com\u003e\n+ *\n+ * This file is made available under the Creative Commons CC0 1.0\n+ * Universal Public Domain Dedication.\n+ *\n+ * This demonstrates the a minimal http client using lws.\n+ *\n+ * It visits https://warmcat.com/ and receives the html page there. You\n+ * can dump the page data by changing the #if 0 below.\n+ */\n+\n+#include \u003clibwebsockets.h\u003e\n+#include \u003cstring.h\u003e\n+#include \u003csignal.h\u003e\n+\n+static int interrupted, bad \u003d 1, status;\n+static struct lws *client_wsi;\n+\n+static int\n+callback_http(struct lws *wsi, enum lws_callback_reasons reason,\n+\t void *user, void *in, size_t len)\n+{\n+\tchar val[32];\n+\tint n;\n+\n+\tswitch (reason) {\n+\n+\t/* because we are protocols[0] ... */\n+\tcase LWS_CALLBACK_CLIENT_CONNECTION_ERROR:\n+\t\tlwsl_err(\u0022CLIENT_CONNECTION_ERROR: %s\u005cn\u0022,\n+\t\t\t in ? (char *)in : \u0022(null)\u0022);\n+\t\tclient_wsi \u003d NULL;\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER:\n+\t{\n+\t\t unsigned char **p \u003d (unsigned char **)in, *end \u003d (*p) + len;\n+\n+\t\t /*\n+\t\t * How to send a custom header in the request to the server\n+\t\t */\n+\n+\t\t if (lws_add_http_header_by_name(wsi,\n+\t\t\t\t (const unsigned char *)\u0022dnt\u0022,\n+\t\t\t\t (const unsigned char *)\u00221\u0022, 1, p, end))\n+\t\t\t return -1;\n+\t\tbreak;\n+\t}\n+\n+\tcase LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP:\n+\t\tstatus \u003d lws_http_client_http_response(wsi);\n+\t\tlwsl_user(\u0022Connected with server response: %d\u005cn\u0022, status);\n+\n+\t\t/*\n+\t\t * How to query custom headers (http 1.x only at the momemnt)\n+\t\t *\n+\t\t * warmcat.com sends a custom header \u0022test-custom-header\u0022 for\n+\t\t * testing, it has the fixed value \u0022hello\u0022.\n+\t\t */\n+\n+\t\tn \u003d lws_hdr_custom_length(wsi, \u0022test-custom-header:\u0022, 19);\n+\t\tif (n \u003c 0)\n+\t\t\tlwsl_notice(\u0022%s: Can't find test-custom-header\u005cn\u0022,\n+\t\t\t\t __func__);\n+\t\telse {\n+\t\t\tif (lws_hdr_custom_copy(wsi, val, sizeof(val),\n+\t\t\t\t\t\t\u0022test-custom-header:\u0022, 19) \u003c 0)\n+\t\t\t\tlwsl_notice(\u0022%s: custom header too long\u005cn\u0022,\n+\t\t\t\t\t __func__);\n+\t\t\telse\n+\t\t\t\tlwsl_notice(\u0022%s: custom header: '%s'\u005cn\u0022,\n+\t\t\t\t\t\t__func__, val);\n+\t\t}\n+\t\tbreak;\n+\n+\t/* chunks of chunked content, with header removed */\n+\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ:\n+\t\tlwsl_user(\u0022RECEIVE_CLIENT_HTTP_READ: read %d\u005cn\u0022, (int)len);\n+#if 0 /* enable to dump the html */\n+\t\t{\n+\t\t\tconst char *p \u003d in;\n+\n+\t\t\twhile (len--)\n+\t\t\t\tif (*p \u003c 0x7f)\n+\t\t\t\t\tputchar(*p++);\n+\t\t\t\telse\n+\t\t\t\t\tputchar('.');\n+\t\t}\n+#endif\n+\t\treturn 0; /* don't passthru */\n+\n+\t/* uninterpreted http content */\n+\tcase LWS_CALLBACK_RECEIVE_CLIENT_HTTP:\n+\t\t{\n+\t\t\tchar buffer[1024 + LWS_PRE];\n+\t\t\tchar *px \u003d buffer + LWS_PRE;\n+\t\t\tint lenx \u003d sizeof(buffer) - LWS_PRE;\n+\n+\t\t\tif (lws_http_client_read(wsi, \u0026px, \u0026lenx) \u003c 0)\n+\t\t\t\treturn -1;\n+\t\t}\n+\t\treturn 0; /* don't passthru */\n+\n+\tcase LWS_CALLBACK_COMPLETED_CLIENT_HTTP:\n+\t\tlwsl_user(\u0022LWS_CALLBACK_COMPLETED_CLIENT_HTTP\u005cn\u0022);\n+\t\tclient_wsi \u003d NULL;\n+\t\tbad \u003d status !\u003d 200;\n+\t\tlws_cancel_service(lws_get_context(wsi)); /* abort poll wait */\n+\t\tbreak;\n+\n+\tcase LWS_CALLBACK_CLOSED_CLIENT_HTTP:\n+\t\tclient_wsi \u003d NULL;\n+\t\tbad \u003d status !\u003d 200;\n+\t\tlws_cancel_service(lws_get_context(wsi)); /* abort poll wait */\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn lws_callback_http_dummy(wsi, reason, user, in, len);\n+}\n+\n+static const struct lws_protocols protocols[] \u003d {\n+\t{\n+\t\t\u0022http\u0022,\n+\t\tcallback_http,\n+\t\t0,\n+\t\t0,\n+\t},\n+\t{ NULL, NULL, 0, 0 }\n+};\n+\n+static void\n+sigint_handler(int sig)\n+{\n+\tinterrupted \u003d 1;\n+}\n+\n+int main(int argc, const char **argv)\n+{\n+\tstruct lws_context_creation_info info;\n+\tstruct lws_client_connect_info i;\n+\tstruct lws_context *context;\n+\tconst char *p;\n+\tint n \u003d 0, logs \u003d LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE\n+\t\t /*\n+\t\t * For LLL_ verbosity above NOTICE to be built into lws,\n+\t\t * lws must have been configured and built with\n+\t\t * -DCMAKE_BUILD_TYPE\u003dDEBUG instead of \u003dRELEASE\n+\t\t *\n+\t\t * | LLL_INFO | LLL_PARSER | LLL_HEADER | LLL_EXT |\n+\t\t * LLL_CLIENT | LLL_LATENCY | LLL_DEBUG\n+\t\t */ ;\n+\n+\tsignal(SIGINT, sigint_handler);\n+\n+\tif ((p \u003d lws_cmdline_option(argc, argv, \u0022-d\u0022)))\n+\t\tlogs \u003d atoi(p);\n+\n+\tlws_set_log_level(logs, NULL);\n+\tlwsl_user(\u0022LWS minimal http client Custom Headers [-d\u003cverbosity\u003e] [-l] [--h1]\u005cn\u0022);\n+\n+\tmemset(\u0026info, 0, sizeof info); /* otherwise uninitialized garbage */\n+\tinfo.options \u003d LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;\n+\tinfo.port \u003d CONTEXT_PORT_NO_LISTEN; /* we do not run any server */\n+\tinfo.protocols \u003d protocols;\n+\n+#if defined(LWS_WITH_MBEDTLS)\n+\t/*\n+\t * OpenSSL uses the system trust store. mbedTLS has to be told which\n+\t * CA to trust explicitly.\n+\t */\n+\tinfo.client_ssl_ca_filepath \u003d \u0022./warmcat.com.cer\u0022;\n+#endif\n+\n+\tcontext \u003d lws_create_context(\u0026info);\n+\tif (!context) {\n+\t\tlwsl_err(\u0022lws init failed\u005cn\u0022);\n+\t\treturn 1;\n+\t}\n+\n+\tmemset(\u0026i, 0, sizeof i); /* otherwise uninitialized garbage */\n+\ti.context \u003d context;\n+\n+\tif (!lws_cmdline_option(argc, argv, \u0022-n\u0022))\n+\t\ti.ssl_connection \u003d LCCSCF_USE_SSL;\n+\n+\tif (lws_cmdline_option(argc, argv, \u0022-l\u0022)) {\n+\t\ti.port \u003d 7681;\n+\t\ti.address \u003d \u0022localhost\u0022;\n+\t\ti.ssl_connection |\u003d LCCSCF_ALLOW_SELFSIGNED;\n+\t} else {\n+\t\ti.port \u003d 443;\n+\t\ti.address \u003d \u0022warmcat.com\u0022;\n+\t}\n+\n+\t/* currently custom headers receive only works with h1 */\n+\ti.alpn \u003d \u0022http/1.1\u0022;\n+\n+\ti.path \u003d \u0022/\u0022;\n+\ti.host \u003d i.address;\n+\ti.origin \u003d i.address;\n+\ti.method \u003d \u0022GET\u0022;\n+\n+\ti.protocol \u003d protocols[0].name;\n+\ti.pwsi \u003d \u0026client_wsi;\n+\tlws_client_connect_via_info(\u0026i);\n+\n+\twhile (n \u003e\u003d 0 \u0026\u0026 client_wsi \u0026\u0026 !interrupted)\n+\t\tn \u003d lws_service(context, 1000);\n+\n+\tlws_context_destroy(context);\n+\tlwsl_user(\u0022Completed: %s\u005cn\u0022, bad ? \u0022failed\u0022 : \u0022OK\u0022);\n+\n+\treturn bad;\n+}\ndiff --git a/minimal-examples/http-client/minimal-http-client-custom-headers/warmcat.com.cer b/minimal-examples/http-client/minimal-http-client-custom-headers/warmcat.com.cer\nnew file mode 100644\nindex 0000000..67de129\n--- /dev/null\n+++ b/minimal-examples/http-client/minimal-http-client-custom-headers/warmcat.com.cer\n@@ -0,0 +1,92 @@\n+-----BEGIN CERTIFICATE-----\n+MIIGCDCCA/CgAwIBAgIQKy5u6tl1NmwUim7bo3yMBzANBgkqhkiG9w0BAQwFADCB\n+hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G\n+A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV\n+BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTQwMjEy\n+MDAwMDAwWhcNMjkwMjExMjM1OTU5WjCBkDELMAkGA1UEBhMCR0IxGzAZBgNVBAgT\n+EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR\n+Q09NT0RPIENBIExpbWl0ZWQxNjA0BgNVBAMTLUNPTU9ETyBSU0EgRG9tYWluIFZh\n+bGlkYXRpb24gU2VjdXJlIFNlcnZlciBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP\n+ADCCAQoCggEBAI7CAhnhoFmk6zg1jSz9AdDTScBkxwtiBUUWOqigwAwCfx3M28Sh\n+bXcDow+G+eMGnD4LgYqbSRutA776S9uMIO3Vzl5ljj4Nr0zCsLdFXlIvNN5IJGS0\n+Qa4Al/e+Z96e0HqnU4A7fK31llVvl0cKfIWLIpeNs4TgllfQcBhglo/uLQeTnaG6\n+ytHNe+nEKpooIZFNb5JPJaXyejXdJtxGpdCsWTWM/06RQ1A/WZMebFEh7lgUq/51\n+UHg+TLAchhP6a5i84DuUHoVS3AOTJBhuyydRReZw3iVDpA3hSqXttn7IzW3uLh0n\n+c13cRTCAquOyQQuvvUSH2rnlG51/ruWFgqUCAwEAAaOCAWUwggFhMB8GA1UdIwQY\n+MBaAFLuvfgI9+qbxPISOre44mOzZMjLUMB0GA1UdDgQWBBSQr2o6lFoL2JDqElZz\n+30O0Oija5zAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNV\n+HSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwGwYDVR0gBBQwEjAGBgRVHSAAMAgG\n+BmeBDAECATBMBgNVHR8ERTBDMEGgP6A9hjtodHRwOi8vY3JsLmNvbW9kb2NhLmNv\n+bS9DT01PRE9SU0FDZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDBxBggrBgEFBQcB\n+AQRlMGMwOwYIKwYBBQUHMAKGL2h0dHA6Ly9jcnQuY29tb2RvY2EuY29tL0NPTU9E\n+T1JTQUFkZFRydXN0Q0EuY3J0MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21v\n+ZG9jYS5jb20wDQYJKoZIhvcNAQEMBQADggIBAE4rdk+SHGI2ibp3wScF9BzWRJ2p\n+mj6q1WZmAT7qSeaiNbz69t2Vjpk1mA42GHWx3d1Qcnyu3HeIzg/3kCDKo2cuH1Z/\n+e+FE6kKVxF0NAVBGFfKBiVlsit2M8RKhjTpCipj4SzR7JzsItG8kO3KdY3RYPBps\n+P0/HEZrIqPW1N+8QRcZs2eBelSaz662jue5/DJpmNXMyYE7l3YphLG5SEXdoltMY\n+dVEVABt0iN3hxzgEQyjpFv3ZBdRdRydg1vs4O2xyopT4Qhrf7W8GjEXCBgCq5Ojc\n+2bXhc3js9iPc0d1sjhqPpepUfJa3w/5Vjo1JXvxku88+vZbrac2/4EjxYoIQ5QxG\n+V/Iz2tDIY+3GH5QFlkoakdH368+PUq4NCNk+qKBR6cGHdNXJ93SrLlP7u3r7l+L4\n+HyaPs9Kg4DdbKDsx5Q5XLVq4rXmsXiBmGqW5prU5wfWYQ//u+aen/e7KJD2AFsQX\n+j4rBYKEMrltDR5FL1ZoXX/nUh8HCjLfn4g8wGTeGrODcQgPmlKidrv0PJFGUzpII\n+0fxQ8ANAe4hZ7Q7drNJ3gjTcBpUC2JD5Leo31Rpg0Gcg19hCC0Wvgmje3WYkN5Ap\n+lBlGGSW4gNfL1IYoakRwJiNiqZ+Gb7+6kHDSVneFeO/qJakXzlByjAA6quPbYzSf\n++AZxAeKCINT+b72x\n+-----END CERTIFICATE-----\n+-----BEGIN CERTIFICATE-----\n+MIIFdDCCBFygAwIBAgIQJ2buVutJ846r13Ci/ITeIjANBgkqhkiG9w0BAQwFADBv\n+MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFk\n+ZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBF\n+eHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFow\n+gYUxCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO\n+BgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMSswKQYD\n+VQQDEyJDT01PRE8gUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkq\n+hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAkehUktIKVrGsDSTdxc9EZ3SZKzejfSNw\n+AHG8U9/E+ioSj0t/EFa9n3Byt2F/yUsPF6c947AEYe7/EZfH9IY+Cvo+XPmT5jR6\n+2RRr55yzhaCCenavcZDX7P0N+pxs+t+wgvQUfvm+xKYvT3+Zf7X8Z0NyvQwA1onr\n+ayzT7Y+YHBSrfuXjbvzYqOSSJNpDa2K4Vf3qwbxstovzDo2a5JtsaZn4eEgwRdWt\n+4Q08RWD8MpZRJ7xnw8outmvqRsfHIKCxH2XeSAi6pE6p8oNGN4Tr6MyBSENnTnIq\n+m1y9TBsoilwie7SrmNnu4FGDwwlGTm0+mfqVF9p8M1dBPI1R7Qu2XK8sYxrfV8g/\n+vOldxJuvRZnio1oktLqpVj3Pb6r/SVi+8Kj/9Lit6Tf7urj0Czr56ENCHonYhMsT\n+8dm74YlguIwoVqwUHZwK53Hrzw7dPamWoUi9PPevtQ0iTMARgexWO/bTouJbt7IE\n+IlKVgJNp6I5MZfGRAy1wdALqi2cVKWlSArvX31BqVUa/oKMoYX9w0MOiqiwhqkfO\n+KJwGRXa/ghgntNWutMtQ5mv0TIZxMOmm3xaG4Nj/QN370EKIf6MzOi5cHkERgWPO\n+GHFrK+ymircxXDpqR+DDeVnWIBqv8mqYqnK8V0rSS527EPywTEHl7R09XiidnMy/\n+s1Hap0flhFMCAwEAAaOB9DCB8TAfBgNVHSMEGDAWgBStvZh6NLQm9/rEJlTvA73g\n+JMtUGjAdBgNVHQ4EFgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQD\n+AgGGMA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0gBAowCDAGBgRVHSAAMEQGA1UdHwQ9\n+MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9BZGRUcnVzdEV4dGVy\n+bmFsQ0FSb290LmNybDA1BggrBgEFBQcBAQQpMCcwJQYIKwYBBQUHMAGGGWh0dHA6\n+Ly9vY3NwLnVzZXJ0cnVzdC5jb20wDQYJKoZIhvcNAQEMBQADggEBAGS/g/FfmoXQ\n+zbihKVcN6Fr30ek+8nYEbvFScLsePP9NDXRqzIGCJdPDoCpdTPW6i6FtxFQJdcfj\n+Jw5dhHk3QBN39bSsHNA7qxcS1u80GH4r6XnTq1dFDK8o+tDb5VCViLvfhVdpfZLY\n+Uspzgb8c8+a4bmYRBbMelC1/kZWSWfFMzqORcUx8Rww7Cxn2obFshj5cqsQugsv5\n+B5a6SE2Q8pTIqXOi6wZ7I53eovNNVZ96YUWYGGjHXkBrI/V5eu+MtWuLt29G9Hvx\n+PUsE2JOAWVrgQSQdso8VYFhH2+9uRv0V9dlfmrPb2LjkQLPNlzmuhbsdjrzch5vR\n+pu/xO28QOG8\u003d\n+-----END CERTIFICATE-----\n+-----BEGIN CERTIFICATE-----\n+MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU\n+MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs\n+IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290\n+MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux\n+FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h\n+bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v\n+dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt\n+H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9\n+uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX\n+mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX\n+a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN\n+E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0\n+WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD\n+VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0\n+Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU\n+cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx\n+IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN\n+AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH\n+YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5\n+6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC\n+Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX\n+c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a\n+mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ\u003d\n+-----END CERTIFICATE-----\n","s":{"c":1752658255,"u": 2109}} ],"g": 4103,"chitpc": 0,"ehitpc": 0,"indexed":0 , "ab": 0, "si": 0, "db":0, "di":0, "sat":0, "lfc": "0000"}