{"id":4721,"date":"2026-02-18T09:04:39","date_gmt":"2026-02-18T17:04:39","guid":{"rendered":"https:\/\/www.donluc.com\/?p=4721"},"modified":"2026-02-18T09:04:39","modified_gmt":"2026-02-18T17:04:39","slug":"project-12-robotics-web-server-mk32","status":"publish","type":"post","link":"https:\/\/www.donluc.com\/?p=4721","title":{"rendered":"Project #12: Robotics &#8211; Web Server &#8211; Mk32"},"content":{"rendered":"<div style=\"width: 1200px;\" class=\"wp-video\"><video class=\"wp-video-shortcode\" id=\"video-4721-1\" width=\"1200\" height=\"675\" preload=\"metadata\" controls=\"controls\"><source type=\"video\/mp4\" src=\"https:\/\/www.donluc.com\/wp-content\/uploads\/2026\/02\/DL2602Mk04W.mp4?_=1\" \/><a href=\"https:\/\/www.donluc.com\/wp-content\/uploads\/2026\/02\/DL2602Mk04W.mp4\">https:\/\/www.donluc.com\/wp-content\/uploads\/2026\/02\/DL2602Mk04W.mp4<\/a><\/video><\/div>\n<p>&#8212;&#8212;<\/p>\n<p>#DonLucElectronics #DonLuc #Camera #ESP32CAM #ESP32 #IoT #Project #Fritzing #Programming #Electronics #Microcontrollers #Consultant<\/p>\n<p>&#8212;&#8212;<\/p>\n<p><a href=\"https:\/\/www.donluc.com\/wp-content\/uploads\/2026\/02\/DL2602Mk04a.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.donluc.com\/wp-content\/uploads\/2026\/02\/DL2602Mk04a.jpg\" alt=\"Web Server\" width=\"720\" height=\"527\" class=\"alignnone size-full wp-image-4723\" srcset=\"https:\/\/www.donluc.com\/wp-content\/uploads\/2026\/02\/DL2602Mk04a.jpg 720w, https:\/\/www.donluc.com\/wp-content\/uploads\/2026\/02\/DL2602Mk04a-300x220.jpg 300w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><\/a><\/p>\n<p>&#8212;&#8212;<\/p>\n<p><a href=\"https:\/\/www.donluc.com\/wp-content\/uploads\/2026\/02\/DL2602Mk04b.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.donluc.com\/wp-content\/uploads\/2026\/02\/DL2602Mk04b.jpg\" alt=\"Web Server\" width=\"720\" height=\"480\" class=\"alignnone size-full wp-image-4724\" srcset=\"https:\/\/www.donluc.com\/wp-content\/uploads\/2026\/02\/DL2602Mk04b.jpg 720w, https:\/\/www.donluc.com\/wp-content\/uploads\/2026\/02\/DL2602Mk04b-300x200.jpg 300w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><\/a><\/p>\n<p>&#8212;&#8212;<\/p>\n<p><a href=\"https:\/\/www.donluc.com\/wp-content\/uploads\/2026\/02\/DL2602Mk04c.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.donluc.com\/wp-content\/uploads\/2026\/02\/DL2602Mk04c.jpg\" alt=\"Web Server\" width=\"720\" height=\"480\" class=\"alignnone size-full wp-image-4725\" srcset=\"https:\/\/www.donluc.com\/wp-content\/uploads\/2026\/02\/DL2602Mk04c.jpg 720w, https:\/\/www.donluc.com\/wp-content\/uploads\/2026\/02\/DL2602Mk04c-300x200.jpg 300w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><\/a><\/p>\n<p>&#8212;&#8212;<\/p>\n<p><strong>ESP32-CAM Video Streaming Web Server<\/strong><\/p>\n<p>ESP32-CAM to stream live feed from the OV2640 camera to a Cell Phones browser. <\/p>\n<p><strong>DL2602Mk04<\/strong><\/p>\n<p>1 x ESP32-CAM<br \/>\n1 x OV2640 Camera<br \/>\n1 x ESP32-CAM-MB Adapter<br \/>\n1 x Cell Phones<br \/>\n1 x USB Battery Pack<br \/>\n1 x Micro USB Cable<\/p>\n<p><strong>DL2602Mk04p<\/strong><\/p>\n<p><strong>DL2602Mk04p.ino<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"arduino\" data-enlighter-title=\"\">\r\n\/****** Don Luc Electronics \u00a9 ******\r\nSoftware Version Information\r\nProject #12: Robotics - Web Server - Mk32\r\n12-32\r\nDL2602Mk04p.ino\r\nDL2602Mk04\r\n1 x ESP32-CAM\r\n1 x OV2640 Camera\r\n1 x ESP32-CAM-MB Adapter\r\n1 x Cell Phones\r\n1 x USB Battery Pack\r\n1 x Micro USB Cable\r\n*\/\r\n\r\n\/\/ Include the Library Code\r\n \/\/ ESP Camera\r\n#include &quot;esp_camera.h&quot;\r\n\/\/ WifI\r\n#include &lt;WiFi.h&gt;\r\n\r\n\/\/#define CAMERA_MODEL_AI_THINKER\r\nconst char* ssid1 = &quot;Robot_Mk32&quot;;\r\nconst char* password1 = &quot;&quot;;\r\n\r\n\/\/ Pin definition for CAMERA_MODEL_AI_THINKER\r\n#define PWDN_GPIO_NUM     32\r\n#define RESET_GPIO_NUM    -1\r\n#define XCLK_GPIO_NUM      0\r\n#define SIOD_GPIO_NUM     26\r\n#define SIOC_GPIO_NUM     27\r\n#define Y9_GPIO_NUM       35\r\n#define Y8_GPIO_NUM       34\r\n#define Y7_GPIO_NUM       39\r\n#define Y6_GPIO_NUM       36\r\n#define Y5_GPIO_NUM       21\r\n#define Y4_GPIO_NUM       19\r\n#define Y3_GPIO_NUM       18\r\n#define Y2_GPIO_NUM        5\r\n#define VSYNC_GPIO_NUM    25\r\n#define HREF_GPIO_NUM     23\r\n#define PCLK_GPIO_NUM     22\r\n\r\n\/\/ WiFi Addr\r\nextern String WiFiAddr =&quot;&quot;;\r\n\r\n\/\/ Camera Server\r\nvoid startCameraServer();\r\n\r\n\/\/ Software Version Information\r\nString sver = &quot;12-32&quot;;\r\n\r\nvoid loop() {\r\n  \r\n}\r\n<\/pre>\n<p><strong>app_httpd.cpp<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"arduino\" data-enlighter-title=\"\">\r\n\/\/ WiFi Server\r\n#include &quot;esp_http_server.h&quot;\r\n\/\/ Timer\r\n#include &quot;esp_timer.h&quot;\r\n\/\/ Camera\r\n#include &quot;esp_camera.h&quot;\r\n\/\/ Converters\r\n#include &quot;img_converters.h&quot;\r\n\/\/ Camera Index\r\n#include &quot;camera_index.h&quot;\r\n\/\/ Arduino\r\n#include &quot;Arduino.h&quot;\r\n\/\/ LED\r\n#include &quot;driver\/ledc.h&quot;\r\n\/\/ Disable brownout problems\r\n#include &quot;soc\/soc.h&quot;\r\n\/\/ Disable brownout problems\r\n#include &quot;soc\/rtc_cntl_reg.h&quot; \r\n\/\/ Driver\r\n#include &quot;driver\/rtc_io.h&quot;\r\n\r\n\/\/ WiFi\r\nextern String WiFiAddr;\r\n\r\n\/\/ \r\ntypedef struct {\r\n        size_t size; \/\/number of values used for filtering\r\n        size_t index; \/\/current value index\r\n        size_t count; \/\/value count\r\n        int sum;\r\n        int * values; \/\/array to be filled with values\r\n} ra_filter_t;\r\n\r\ntypedef struct {\r\n        httpd_req_t *req;\r\n        size_t len;\r\n} jpg_chunking_t;\r\n\r\n#define PART_BOUNDARY &quot;123456789000000000000987654321&quot;\r\nstatic const char* _STREAM_CONTENT_TYPE = &quot;multipart\/x-mixed-replace;boundary=&quot; PART_BOUNDARY;\r\nstatic const char* _STREAM_BOUNDARY = &quot;\\r\\n--&quot; PART_BOUNDARY &quot;\\r\\n&quot;;\r\nstatic const char* _STREAM_PART = &quot;Content-Type: image\/jpeg\\r\\nContent-Length: %u\\r\\n\\r\\n&quot;;\r\n\r\nstatic ra_filter_t ra_filter;\r\nhttpd_handle_t stream_httpd = NULL;\r\nhttpd_handle_t camera_httpd = NULL;\r\n\r\nstatic ra_filter_t * ra_filter_init(ra_filter_t * filter, size_t sample_size){\r\n    memset(filter, 0, sizeof(ra_filter_t));\r\n\r\n    filter-&gt;values = (int *)malloc(sample_size * sizeof(int));\r\n    if(!filter-&gt;values){\r\n        return NULL;\r\n    }\r\n    memset(filter-&gt;values, 0, sample_size * sizeof(int));\r\n\r\n    filter-&gt;size = sample_size;\r\n    return filter;\r\n}\r\n\r\nstatic int ra_filter_run(ra_filter_t * filter, int value){\r\n    if(!filter-&gt;values){\r\n        return value;\r\n    }\r\n    filter-&gt;sum -= filter-&gt;values[filter-&gt;index];\r\n    filter-&gt;values[filter-&gt;index] = value;\r\n    filter-&gt;sum += filter-&gt;values[filter-&gt;index];\r\n    filter-&gt;index++;\r\n    filter-&gt;index = filter-&gt;index % filter-&gt;size;\r\n    if (filter-&gt;count &lt; filter-&gt;size) {\r\n        filter-&gt;count++;\r\n    }\r\n    return filter-&gt;sum \/ filter-&gt;count;\r\n}\r\n\r\nstatic size_t jpg_encode_stream(void * arg, size_t index, const void* data, size_t len){\r\n    jpg_chunking_t *j = (jpg_chunking_t *)arg;\r\n    if(!index){\r\n        j-&gt;len = 0;\r\n    }\r\n    if(httpd_resp_send_chunk(j-&gt;req, (const char *)data, len) != ESP_OK){\r\n        return 0;\r\n    }\r\n    j-&gt;len += len;\r\n    return len;\r\n}\r\n\r\nstatic esp_err_t capture_handler(httpd_req_t *req){\r\n    camera_fb_t * fb = NULL;\r\n    esp_err_t res = ESP_OK;\r\n    int64_t fr_start = esp_timer_get_time();\r\n\r\n    fb = esp_camera_fb_get();\r\n    if (!fb) {\r\n        \/\/Serial.printf(&quot;Camera capture failed&quot;);\r\n        httpd_resp_send_500(req);\r\n        return ESP_FAIL;\r\n    }\r\n\r\n    httpd_resp_set_type(req, &quot;image\/jpeg&quot;);\r\n    httpd_resp_set_hdr(req, &quot;Content-Disposition&quot;, &quot;inline; filename=capture.jpg&quot;);\r\n\r\n    size_t fb_len = 0;\r\n    if(fb-&gt;format == PIXFORMAT_JPEG){\r\n        fb_len = fb-&gt;len;\r\n        res = httpd_resp_send(req, (const char *)fb-&gt;buf, fb-&gt;len);\r\n    } else {\r\n        jpg_chunking_t jchunk = {req, 0};\r\n        res = frame2jpg_cb(fb, 80, jpg_encode_stream, &amp;jchunk)?ESP_OK:ESP_FAIL;\r\n        httpd_resp_send_chunk(req, NULL, 0);\r\n        fb_len = jchunk.len;\r\n    }\r\n    esp_camera_fb_return(fb);\r\n    int64_t fr_end = esp_timer_get_time();\r\n    Serial.printf(&quot;JPG: %uB %ums&quot;, (uint32_t)(fb_len), (uint32_t)((fr_end - fr_start)\/1000));\r\n    return res;\r\n}\r\n\r\nstatic esp_err_t stream_handler(httpd_req_t *req){\r\n    camera_fb_t * fb = NULL;\r\n    esp_err_t res = ESP_OK;\r\n    size_t _jpg_buf_len = 0;\r\n    uint8_t * _jpg_buf = NULL;\r\n    char * part_buf[64];\r\n\r\n    static int64_t last_frame = 0;\r\n    if(!last_frame) {\r\n        last_frame = esp_timer_get_time();\r\n    }\r\n\r\n    res = httpd_resp_set_type(req, _STREAM_CONTENT_TYPE);\r\n    if(res != ESP_OK){\r\n        return res;\r\n    }\r\n\r\n    while(true){\r\n        fb = esp_camera_fb_get();\r\n        if (!fb) {\r\n            Serial.printf(&quot;Camera capture failed&quot;);\r\n            res = ESP_FAIL;\r\n        } else {\r\n            if(fb-&gt;format != PIXFORMAT_JPEG){\r\n                bool jpeg_converted = frame2jpg(fb, 80, &amp;_jpg_buf, &amp;_jpg_buf_len);\r\n                esp_camera_fb_return(fb);\r\n                fb = NULL;\r\n                if(!jpeg_converted){\r\n                    Serial.printf(&quot;JPEG compression failed&quot;);\r\n                    res = ESP_FAIL;\r\n                }\r\n            } else {\r\n                _jpg_buf_len = fb-&gt;len;\r\n                _jpg_buf = fb-&gt;buf;\r\n            }\r\n        }\r\n        if(res == ESP_OK){\r\n            size_t hlen = snprintf((char *)part_buf, 64, _STREAM_PART, _jpg_buf_len);\r\n            res = httpd_resp_send_chunk(req, (const char *)part_buf, hlen);\r\n        }\r\n        if(res == ESP_OK){\r\n            res = httpd_resp_send_chunk(req, (const char *)_jpg_buf, _jpg_buf_len);\r\n        }\r\n        if(res == ESP_OK){\r\n            res = httpd_resp_send_chunk(req, _STREAM_BOUNDARY, strlen(_STREAM_BOUNDARY));\r\n        }\r\n        if(fb){\r\n            esp_camera_fb_return(fb);\r\n            fb = NULL;\r\n            _jpg_buf = NULL;\r\n        } else if(_jpg_buf){\r\n            free(_jpg_buf);\r\n            _jpg_buf = NULL;\r\n        }\r\n        if(res != ESP_OK){\r\n            break;\r\n        }\r\n        int64_t fr_end = esp_timer_get_time();\r\n\r\n        int64_t frame_time = fr_end - last_frame;\r\n        last_frame = fr_end;\r\n        frame_time \/= 1000;\r\n        uint32_t avg_frame_time = ra_filter_run(&amp;ra_filter, frame_time);\r\n        Serial.printf(&quot;MJPG: %uB %ums (%.1ffps), AVG: %ums (%.1ffps)&quot;\r\n            ,(uint32_t)(_jpg_buf_len),\r\n            (uint32_t)frame_time, 1000.0 \/ (uint32_t)frame_time,\r\n            avg_frame_time, 1000.0 \/ avg_frame_time\r\n        );\r\n    }\r\n\r\n    last_frame = 0;\r\n    return res;\r\n}\r\n\r\nstatic esp_err_t cmd_handler(httpd_req_t *req){\r\n    char*  buf;\r\n    size_t buf_len;\r\n    char variable[32] = {0,};\r\n    char value[32] = {0,};\r\n\r\n    buf_len = httpd_req_get_url_query_len(req) + 1;\r\n    if (buf_len &gt; 1) {\r\n        buf = (char*)malloc(buf_len);\r\n        if(!buf){\r\n            httpd_resp_send_500(req);\r\n            return ESP_FAIL;\r\n        }\r\n        if (httpd_req_get_url_query_str(req, buf, buf_len) == ESP_OK) {\r\n            if (httpd_query_key_value(buf, &quot;var&quot;, variable, sizeof(variable)) == ESP_OK &amp;&amp;\r\n                httpd_query_key_value(buf, &quot;val&quot;, value, sizeof(value)) == ESP_OK) {\r\n            } else {\r\n                free(buf);\r\n                httpd_resp_send_404(req);\r\n                return ESP_FAIL;\r\n            }\r\n        } else {\r\n            free(buf);\r\n            httpd_resp_send_404(req);\r\n            return ESP_FAIL;\r\n        }\r\n        free(buf);\r\n    } else {\r\n        httpd_resp_send_404(req);\r\n        return ESP_FAIL;\r\n    }\r\n\r\n    int val = atoi(value);\r\n    sensor_t * s = esp_camera_sensor_get();\r\n    int res = 0;\r\n\r\n    if(!strcmp(variable, &quot;framesize&quot;)) {\r\n        if(s-&gt;pixformat == PIXFORMAT_JPEG) res = s-&gt;set_framesize(s, (framesize_t)val);\r\n    }\r\n    else if(!strcmp(variable, &quot;quality&quot;)) res = s-&gt;set_quality(s, val);\r\n    else if(!strcmp(variable, &quot;contrast&quot;)) res = s-&gt;set_contrast(s, val);\r\n    else if(!strcmp(variable, &quot;brightness&quot;)) res = s-&gt;set_brightness(s, val);\r\n    else if(!strcmp(variable, &quot;saturation&quot;)) res = s-&gt;set_saturation(s, val);\r\n    else if(!strcmp(variable, &quot;gainceiling&quot;)) res = s-&gt;set_gainceiling(s, (gainceiling_t)val);\r\n    else if(!strcmp(variable, &quot;colorbar&quot;)) res = s-&gt;set_colorbar(s, val);\r\n    else if(!strcmp(variable, &quot;awb&quot;)) res = s-&gt;set_whitebal(s, val);\r\n    else if(!strcmp(variable, &quot;agc&quot;)) res = s-&gt;set_gain_ctrl(s, val);\r\n    else if(!strcmp(variable, &quot;aec&quot;)) res = s-&gt;set_exposure_ctrl(s, val);\r\n    else if(!strcmp(variable, &quot;hmirror&quot;)) res = s-&gt;set_hmirror(s, val);\r\n    else if(!strcmp(variable, &quot;vflip&quot;)) res = s-&gt;set_vflip(s, val);\r\n    else if(!strcmp(variable, &quot;awb_gain&quot;)) res = s-&gt;set_awb_gain(s, val);\r\n    else if(!strcmp(variable, &quot;agc_gain&quot;)) res = s-&gt;set_agc_gain(s, val);\r\n    else if(!strcmp(variable, &quot;aec_value&quot;)) res = s-&gt;set_aec_value(s, val);\r\n    else if(!strcmp(variable, &quot;aec2&quot;)) res = s-&gt;set_aec2(s, val);\r\n    else if(!strcmp(variable, &quot;dcw&quot;)) res = s-&gt;set_dcw(s, val);\r\n    else if(!strcmp(variable, &quot;bpc&quot;)) res = s-&gt;set_bpc(s, val);\r\n    else if(!strcmp(variable, &quot;wpc&quot;)) res = s-&gt;set_wpc(s, val);\r\n    else if(!strcmp(variable, &quot;raw_gma&quot;)) res = s-&gt;set_raw_gma(s, val);\r\n    else if(!strcmp(variable, &quot;lenc&quot;)) res = s-&gt;set_lenc(s, val);\r\n    else if(!strcmp(variable, &quot;special_effect&quot;)) res = s-&gt;set_special_effect(s, val);\r\n    else if(!strcmp(variable, &quot;wb_mode&quot;)) res = s-&gt;set_wb_mode(s, val);\r\n    else if(!strcmp(variable, &quot;ae_level&quot;)) res = s-&gt;set_ae_level(s, val);\r\n    else {\r\n        res = -1;\r\n    }\r\n\r\n    if(res){\r\n        return httpd_resp_send_500(req);\r\n    }\r\n\r\n    httpd_resp_set_hdr(req, &quot;Access-Control-Allow-Origin&quot;, &quot;*&quot;);\r\n    return httpd_resp_send(req, NULL, 0);\r\n}\r\n\r\nstatic esp_err_t status_handler(httpd_req_t *req){\r\n    static char json_response[1024];\r\n\r\n    sensor_t * s = esp_camera_sensor_get();\r\n    char * p = json_response;\r\n    *p++ = &#039;{&#039;;\r\n\r\n    p+=sprintf(p, &quot;\\&quot;framesize\\&quot;:%u,&quot;, s-&gt;status.framesize);\r\n    p+=sprintf(p, &quot;\\&quot;quality\\&quot;:%u,&quot;, s-&gt;status.quality);\r\n    p+=sprintf(p, &quot;\\&quot;brightness\\&quot;:%d,&quot;, s-&gt;status.brightness);\r\n    p+=sprintf(p, &quot;\\&quot;contrast\\&quot;:%d,&quot;, s-&gt;status.contrast);\r\n    p+=sprintf(p, &quot;\\&quot;saturation\\&quot;:%d,&quot;, s-&gt;status.saturation);\r\n    p+=sprintf(p, &quot;\\&quot;special_effect\\&quot;:%u,&quot;, s-&gt;status.special_effect);\r\n    p+=sprintf(p, &quot;\\&quot;wb_mode\\&quot;:%u,&quot;, s-&gt;status.wb_mode);\r\n    p+=sprintf(p, &quot;\\&quot;awb\\&quot;:%u,&quot;, s-&gt;status.awb);\r\n    p+=sprintf(p, &quot;\\&quot;awb_gain\\&quot;:%u,&quot;, s-&gt;status.awb_gain);\r\n    p+=sprintf(p, &quot;\\&quot;aec\\&quot;:%u,&quot;, s-&gt;status.aec);\r\n    p+=sprintf(p, &quot;\\&quot;aec2\\&quot;:%u,&quot;, s-&gt;status.aec2);\r\n    p+=sprintf(p, &quot;\\&quot;ae_level\\&quot;:%d,&quot;, s-&gt;status.ae_level);\r\n    p+=sprintf(p, &quot;\\&quot;aec_value\\&quot;:%u,&quot;, s-&gt;status.aec_value);\r\n    p+=sprintf(p, &quot;\\&quot;agc\\&quot;:%u,&quot;, s-&gt;status.agc);\r\n    p+=sprintf(p, &quot;\\&quot;agc_gain\\&quot;:%u,&quot;, s-&gt;status.agc_gain);\r\n    p+=sprintf(p, &quot;\\&quot;gainceiling\\&quot;:%u,&quot;, s-&gt;status.gainceiling);\r\n    p+=sprintf(p, &quot;\\&quot;bpc\\&quot;:%u,&quot;, s-&gt;status.bpc);\r\n    p+=sprintf(p, &quot;\\&quot;wpc\\&quot;:%u,&quot;, s-&gt;status.wpc);\r\n    p+=sprintf(p, &quot;\\&quot;raw_gma\\&quot;:%u,&quot;, s-&gt;status.raw_gma);\r\n    p+=sprintf(p, &quot;\\&quot;lenc\\&quot;:%u,&quot;, s-&gt;status.lenc);\r\n    p+=sprintf(p, &quot;\\&quot;hmirror\\&quot;:%u,&quot;, s-&gt;status.hmirror);\r\n    p+=sprintf(p, &quot;\\&quot;dcw\\&quot;:%u,&quot;, s-&gt;status.dcw);\r\n    p+=sprintf(p, &quot;\\&quot;colorbar\\&quot;:%u&quot;, s-&gt;status.colorbar);\r\n    *p++ = &#039;}&#039;;\r\n    *p++ = 0;\r\n    httpd_resp_set_type(req, &quot;application\/json&quot;);\r\n    httpd_resp_set_hdr(req, &quot;Access-Control-Allow-Origin&quot;, &quot;*&quot;);\r\n    return httpd_resp_send(req, json_response, strlen(json_response));\r\n}\r\n\r\nstatic esp_err_t index_handler(httpd_req_t *req){\r\n   httpd_resp_set_type(req, &quot;text\/html&quot;);\r\n   String page = &quot;&quot;;\r\npage += &quot;&lt;meta name=\\&quot;viewport\\&quot; content=\\&quot;width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0\\&quot;&gt;\\n&quot;;\r\npage +=&quot;&lt;style&gt;.test{-moz-user-select: none;-o-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;}&lt;\/style&gt;&quot;;\r\n\r\npage += &quot;&lt;script&gt;var xhttp = new XMLHttpRequest();&lt;\/script&gt;&quot;;\r\npage += &quot;&lt;script&gt;function getsend(arg) { xhttp.open(&#039;GET&#039;, arg +&#039;?&#039; + new Date().getTime(), true); xhttp.send() } &lt;\/script&gt;&quot;;\r\n\/\/page += &quot;&lt;p align=center&gt;&lt;IMG SRC=&#039;http:\/\/&quot; + WiFiAddr + &quot;:81\/stream&#039; style=&#039;width:280px;&#039;&gt;&lt;\/p&gt;&lt;br\/&gt;&lt;br\/&gt;&quot;;\r\npage += &quot;&lt;p align=center&gt;&lt;IMG SRC=&#039;http:\/\/&quot; + WiFiAddr + &quot;:81\/stream&#039; style=&#039;width:300px; transform:rotate(0deg);&#039;&gt;&lt;\/p&gt;&lt;br\/&gt;&lt;br\/&gt;&quot;;\r\npage +=&quot;&lt;div unselectable=\\&quot;on\\&quot; onselectstart=\\&quot;return false\\&quot;&gt;&quot;;\r\n\/\/page += &quot;&lt;p align=center&gt; &lt;button style=background-color:Green;width:90px;height:80px onmousedown=getsend(&#039;go&#039;) onmouseup=getsend(&#039;stop&#039;) ontouchstart=getsend(&#039;go&#039;) ontouchend=getsend(&#039;stop&#039;) &gt;&lt;b&gt;Forward&lt;\/b&gt;&lt;\/button&gt; &lt;\/p&gt;&quot;;\r\npage += &quot;&lt;p align=center&gt;&quot;;\r\n\/\/page += &quot;&lt;button style=background-color:Green;width:90px;height:80px; onmousedown=getsend(&#039;left&#039;) onmouseup=getsend(&#039;stop&#039;) ontouchstart=getsend(&#039;left&#039;) ontouchend=getsend(&#039;stop&#039;)&gt;&lt;b&gt;Left&lt;\/b&gt;&lt;\/button&gt;&nbsp;&quot;;\r\n\/\/page += &quot;&lt;button style=background-color:Red;width:90px;height:80px onmousedown=getsend(&#039;stop&#039;) onmouseup=getsend(&#039;stop&#039;)&gt;&lt;b&gt;Stop&lt;\/b&gt;&lt;\/button&gt;&nbsp;&quot;;\r\n\/\/page += &quot;&lt;button style=background-color:Green;width:90px;height:80px onmousedown=getsend(&#039;right&#039;) onmouseup=getsend(&#039;stop&#039;) ontouchstart=getsend(&#039;right&#039;) ontouchend=getsend(&#039;stop&#039;)&gt;&lt;b&gt;Right&lt;\/b&gt;&lt;\/button&gt;&quot;;\r\npage += &quot;&lt;\/p&gt;&quot;;\r\n\r\n\/\/page += &quot;&lt;p align=center&gt;&lt;button style=background-color:Green;width:90px;height:80px onmousedown=getsend(&#039;back&#039;) onmouseup=getsend(&#039;stop&#039;) ontouchstart=getsend(&#039;back&#039;) ontouchend=getsend(&#039;stop&#039;) &gt;&lt;b&gt;Backward&lt;\/b&gt;&lt;\/button&gt;&lt;\/p&gt;&quot;;  \r\n\r\npage += &quot;&lt;p align=center&gt;&quot;;\r\n\/\/page += &quot;&lt;button style=background-color:yellow;width:140px;height:40px onmousedown=getsend(&#039;ledon&#039;)&gt;&lt;b&gt;Light ON&lt;\/b&gt;&lt;\/button&gt;&quot;;\r\n\/\/page += &quot;&lt;button style=background-color:yellow;width:140px;height:40px onmousedown=getsend(&#039;ledoff&#039;)&gt;&lt;b&gt;Light OFF&lt;\/b&gt;&lt;\/button&gt;&quot;;\r\npage += &quot;&lt;\/p&gt;&quot;;\r\npage +=&quot;&lt;\/div&gt;&quot;;\r\n\r\n   return httpd_resp_send(req, &amp;page[0], strlen(&amp;page[0]));\r\n}\r\nvoid startCameraServer(){\r\n    httpd_config_t config = HTTPD_DEFAULT_CONFIG();\r\n    httpd_uri_t index_uri = {\r\n        .uri       = &quot;\/&quot;,\r\n        .method    = HTTP_GET,\r\n        .handler   = index_handler,\r\n        .user_ctx  = NULL\r\n    };\r\n\r\n    httpd_uri_t status_uri = {\r\n        .uri       = &quot;\/status&quot;,\r\n        .method    = HTTP_GET,\r\n        .handler   = status_handler,\r\n        .user_ctx  = NULL\r\n    };\r\n\r\n    httpd_uri_t cmd_uri = {\r\n        .uri       = &quot;\/control&quot;,\r\n        .method    = HTTP_GET,\r\n        .handler   = cmd_handler,\r\n        .user_ctx  = NULL\r\n    };\r\n\r\n    httpd_uri_t capture_uri = {\r\n        .uri       = &quot;\/capture&quot;,\r\n        .method    = HTTP_GET,\r\n        .handler   = capture_handler,\r\n        .user_ctx  = NULL\r\n    };\r\n\r\n   httpd_uri_t stream_uri = {\r\n        .uri       = &quot;\/stream&quot;,\r\n        .method    = HTTP_GET,\r\n        .handler   = stream_handler,\r\n        .user_ctx  = NULL\r\n    };\r\n\r\n\r\n    ra_filter_init(&amp;ra_filter, 20);\r\n    Serial.printf(&quot;Starting web server on port: &#039;%d&#039;&quot;, config.server_port);\r\n    if (httpd_start(&amp;camera_httpd, &amp;config) == ESP_OK) {\r\n        httpd_register_uri_handler(camera_httpd, &amp;index_uri);\r\n\r\n    }\r\n\r\n    config.server_port += 1;\r\n    config.ctrl_port += 1;\r\n    Serial.printf(&quot;Starting stream server on port: &#039;%d&#039;&quot;, config.server_port);\r\n    if (httpd_start(&amp;stream_httpd, &amp;config) == ESP_OK) {\r\n        httpd_register_uri_handler(stream_httpd, &amp;stream_uri);\r\n    }\r\n}\r\n<\/pre>\n<p><strong>camera_index.h<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"arduino\" data-enlighter-title=\"\">\r\n\/\/ Camera\r\n#define index_html_gz_len 3635\r\nconst uint8_t index_html_gz[] = {\r\n 0x1F, 0x8B, 0x08, 0x08, 0x8A, 0xF8, 0xFE, 0x5B, 0x00, 0x03, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E,\r\n 0x68, 0x74, 0x6D, 0x6C, 0x00, 0xDD, 0x5C, 0xFD, 0x72, 0xDA, 0xB8, 0x16, 0xFF, 0x7F, 0x9F, 0xC2,\r\n 0x71, 0x77, 0x8B, 0x3D, 0x6B, 0x08, 0x10, 0x92, 0xA6, 0x26, 0x90, 0x0D, 0x84, 0xB6, 0x3B, 0xD3,\r\n 0xAF, 0x6D, 0xF6, 0xEE, 0xEE, 0xCC, 0xCE, 0x4E, 0x2B, 0x6C, 0x19, 0xD4, 0x18, 0x8B, 0xDA, 0x72,\r\n 0x80, 0xB2, 0x7E, 0x8E, 0xFB, 0x40, 0xF7, 0xC5, 0xEE, 0x91, 0x64, 0x1B, 0x9B, 0x8F, 0x10, 0xA0,\r\n 0x85, 0x4E, 0x9B, 0x19, 0x90, 0xE5, 0xA3, 0xA3, 0x73, 0xCE, 0xEF, 0x7C, 0x48, 0xC6, 0xEA, 0xC5,\r\n 0x91, 0x4D, 0x2D, 0x36, 0x19, 0x62, 0xA5, 0xCF, 0x06, 0x6E, 0xF3, 0x87, 0x0B, 0xF9, 0xA5, 0xC0,\r\n 0xBF, 0x8B, 0x3E, 0x46, 0xB6, 0x6C, 0x8A, 0xCB, 0x01, 0x66, 0x48, 0xB1, 0xFA, 0xC8, 0x0F, 0x30,\r\n 0x6B, 0xA8, 0x21, 0x73, 0x8A, 0xE7, 0xEA, 0xFC, 0x6D, 0x0F, 0x0D, 0x70, 0x43, 0xBD, 0x23, 0x78,\r\n 0x34, 0xA4, 0x3E, 0x53, 0x15, 0x8B, 0x7A, 0x0C, 0x7B, 0x40, 0x3E, 0x22, 0x36, 0xEB, 0x37, 0x6C,\r\n 0x7C, 0x47, 0x2C, 0x5C, 0x14, 0x17, 0x06, 0xF1, 0x08, 0x23, 0xC8, 0x2D, 0x06, 0x16, 0x72, 0x71,\r\n 0xA3, 0x92, 0xE5, 0xC5, 0x08, 0x73, 0x71, 0xB3, 0x73, 0xF3, 0xF6, 0xA4, 0xAA, 0xBC, 0xF9, 0xA3,\r\n 0x5A, 0x3B, 0x2B, 0x5F, 0x1C, 0xCB, 0xBE, 0x19, 0x4D, 0xC0, 0x26, 0xFC, 0xBA, 0x4B, 0xED, 0xC9,\r\n 0xD4, 0x81, 0x69, 0x8A, 0x0E, 0x1A, 0x10, 0x77, 0x62, 0x5E, 0xF9, 0xC0, 0xD4, 0x78, 0x81, 0xDD,\r\n 0x3B, 0xCC, 0x88, 0x85, 0x8C, 0x00, 0x79, 0x41, 0x31, 0xC0, 0x3E, 0x71, 0xEA, 0x5D, 0x64, 0xDD,\r\n 0xF6, 0x7C, 0x1A, 0x7A, 0xB6, 0xF9, 0xA8, 0x72, 0xCE, 0xFF, 0xEA, 0x16, 0x75, 0xA9, 0x6F, 0x3E,\r\n 0xEA, 0x3C, 0xE3, 0x7F, 0x75, 0xC1, 0x27, 0x20, 0x9F, 0xB1, 0x59, 0x39, 0x1B, 0x8E, 0xA3, 0x7E,\r\n 0x75, 0x9A, 0xE9, 0x39, 0x87, 0x9E, 0x00, 0x5B, 0x8C, 0x50, 0xAF, 0x34, 0x40, 0xC4, 0x9B, 0xDA,\r\n 0x24, 0x18, 0xBA, 0x68, 0x62, 0x3A, 0x2E, 0x1E, 0x47, 0x8F, 0x06, 0xD8, 0x0B, 0x8D, 0xDC, 0x7D,\r\n 0xDE, 0x5F, 0xB4, 0x89, 0x2F, 0xFB, 0x4C, 0x98, 0x2A, 0x1C, 0x78, 0x92, 0x30, 0x1D, 0xEB, 0x51,\r\n 0x0F, 0xD7, 0x05, 0xE1, 0xC8, 0x47, 0x43, 0xB8, 0xE4, 0x5F, 0xF5, 0x01, 0xF1, 0xA4, 0x91, 0xCC,\r\n 0x93, 0x5A, 0x79, 0x38, 0xCE, 0x09, 0x7E, 0x72, 0xC6, 0xFF, 0xEA, 0x43, 0x64, 0xDB, 0xC4, 0xEB,\r\n 0x99, 0xE7, 0xFC, 0x36, 0xF5, 0x6D, 0xEC, 0x17, 0x7D, 0x64, 0x93, 0x30, 0x30, 0x6B, 0xD0, 0x33,\r\n 0x40, 0x7E, 0x0F, 0x78, 0x30, 0x3A, 0x34, 0x8B, 0x95, 0xF2, 0xAC, 0xC3, 0x27, 0xBD, 0x3E, 0x33,\r\n 0x79, 0x4F, 0xF4, 0x28, 0xC6, 0x26, 0xA7, 0x46, 0x46, 0x14, 0x21, 0x08, 0x72, 0x49, 0xCF, 0x2B,\r\n 0x12, 0x86, 0x07, 0x81, 0x19, 0x30, 0x1F, 0x33, 0xAB, 0x1F, 0x39, 0xA4, 0x17, 0xFA, 0x78, 0x9A,\r\n 0x08, 0x50, 0x8E, 0x79, 0x43, 0xA3, 0x38, 0xC2, 0xDD, 0x5B, 0xC2, 0x8A, 0xF1, 0x64, 0x5D, 0xEC,\r\n 0x50, 0x1F, 0xA7, 0x04, 0xC5, 0xAE, 0x4B, 0xAD, 0xDB, 0x62, 0xC0, 0x90, 0xCF, 0x16, 0x89, 0x91,\r\n 0xC3, 0xB0, 0x3F, 0x4F, 0x8B, 0x41, 0xE1, 0x05, 0xCA, 0x84, 0x41, 0x7C, 0x49, 0x3C, 0x97, 0x78,\r\n 0x78, 0x15, 0x5B, 0xC9, 0x21, 0x4F, 0x2A, 0xFA, 0x62, 0x35, 0x14, 0x32, 0xE8, 0xA5, 0x16, 0x10,\r\n 0x93, 0xD6, 0xA5, 0xE1, 0x2B, 0xE5, 0xF2, 0x4F, 0xF5, 0x3E, 0x16, 0xF6, 0x42, 0x21, 0xA3, 0xF7,\r\n 0x1B, 0x99, 0xFB, 0xC6, 0x2F, 0x03, 0x6C, 0x13, 0xA4, 0x68, 0x33, 0xF0, 0x94, 0xF3, 0x32, 0x58,\r\n 0x5A, 0x57, 0x90, 0x67, 0x2B, 0x1A, 0xF5, 0x09, 0x58, 0x1B, 0x09, 0x57, 0x70, 0xA1, 0x07, 0xDC,\r\n 0x7E, 0x88, 0xF5, 0xE9, 0x3A, 0x18, 0x62, 0x8F, 0x58, 0x0D, 0xC4, 0x12, 0x0D, 0x06, 0x68, 0x5C,\r\n 0xCC, 0x68, 0xC1, 0x2F, 0x63, 0x4D, 0x20, 0xD4, 0x2C, 0x0D, 0x3A, 0xEF, 0xFA, 0x4A, 0x51, 0xE1,\r\n 0xAE, 0xA5, 0xC7, 0xEA, 0x0A, 0x15, 0x33, 0xEA, 0x7E, 0x2F, 0x28, 0x27, 0x11, 0xFB, 0xA8, 0x1B,\r\n 0x32, 0x46, 0xBD, 0x60, 0x8D, 0x99, 0x3F, 0x86, 0x01, 0x23, 0xCE, 0xA4, 0x18, 0x83, 0x62, 0x06,\r\n 0x43, 0x04, 0xF9, 0xAA, 0x8B, 0xD9, 0x08, 0x63, 0x08, 0x5D, 0x0F, 0xDD, 0x01, 0xDC, 0xBD, 0x9E,\r\n 0x8B, 0xA7, 0x56, 0xE8, 0x07, 0x90, 0x39, 0x86, 0x94, 0x00, 0xA5, 0x5F, 0xCF, 0x01, 0x90, 0x25,\r\n 0x2C, 0x5A, 0xDD, 0x29, 0x0D, 0x19, 0x17, 0x09, 0x44, 0xA4, 0xC0, 0x8F, 0xB0, 0x09, 0xB4, 0xA4,\r\n 0xD9, 0xCB, 0x89, 0xCD, 0xCB, 0x73, 0x63, 0x4C, 0xAB, 0x8F, 0xAD, 0x5B, 0x6C, 0xFF, 0x9C, 0x4F,\r\n 0x17, 0x22, 0xD5, 0x94, 0x88, 0x37, 0x0C, 0x59, 0x91, 0x27, 0x84, 0xE1, 0x1A, 0x7D, 0x84, 0x25,\r\n 0xE2, 0x29, 0xAA, 0xD5, 0xD4, 0x67, 0xCD, 0xD3, 0xE1, 0x58, 0x29, 0xE7, 0x18, 0x35, 0x5D, 0xD4,\r\n 0xC5, 0x6E, 0xCA, 0x2E, 0x36, 0xA2, 0xF4, 0xA7, 0xD8, 0x09, 0x32, 0xD9, 0x23, 0x93, 0xA1, 0x6A,\r\n 0x4F, 0x7E, 0xCA, 0x31, 0x52, 0x44, 0xDB, 0xC8, 0x75, 0x05, 0xD8, 0x05, 0x18, 0x64, 0x42, 0x84,\r\n 0x9E, 0x91, 0x59, 0x89, 0x4A, 0x3E, 0xF2, 0x7A, 0x18, 0x00, 0x1C, 0x1B, 0x49, 0x33, 0x93, 0x52,\r\n 0x97, 0x4D, 0x6F, 0x96, 0x15, 0x10, 0x3B, 0x92, 0x40, 0x2E, 0x78, 0x7C, 0xA2, 0x56, 0x86, 0xBA,\r\n 0x52, 0x4D, 0x73, 0x23, 0x18, 0x3A, 0x67, 0x0A, 0x9E, 0x35, 0xE7, 0x10, 0x8C, 0x2B, 0x81, 0xE3,\r\n 0xE4, 0xEB, 0x84, 0xE3, 0x9C, 0x94, 0x4F, 0x6A, 0x73, 0xD1, 0xCF, 0xE7, 0xC9, 0xD7, 0x8A, 0x7A,\r\n 0x8A, 0x71, 0x2C, 0xA0, 0xD9, 0xA7, 0x77, 0xD8, 0x9F, 0xE6, 0x59, 0xD5, 0x9E, 0xD6, 0xEC, 0xE4,\r\n 0x3E, 0x02, 0xBF, 0xBC, 0xC3, 0x79, 0x82, 0x6A, 0xC5, 0xAA, 0x56, 0x62, 0x82, 0x12, 0x68, 0x88,\r\n 0xBA, 0x2E, 0xB6, 0x13, 0x57, 0xB3, 0xB1, 0x83, 0x42, 0x97, 0xE5, 0xA4, 0x43, 0x65, 0xFE, 0x17,\r\n 0x09, 0x5B, 0xFF, 0xCD, 0xCB, 0x78, 0x43, 0xD8, 0xF2, 0x9F, 0x69, 0x12, 0x20, 0x68, 0x38, 0xC4,\r\n 0x08, 0xFA, 0x2C, 0x2C, 0x4B, 0xCD, 0x62, 0x72, 0x13, 0x6E, 0xB1, 0xA4, 0xC0, 0xCC, 0x99, 0x27,\r\n 0x09, 0xFF, 0xC5, 0xB9, 0x4C, 0x87, 0x5A, 0x61, 0x30, 0x73, 0xF2, 0x25, 0x14, 0x66, 0x22, 0x4E,\r\n 0xE0, 0x12, 0x61, 0xC6, 0xD0, 0xF3, 0xB8, 0x6E, 0x45, 0xE6, 0xC3, 0xC4, 0xD3, 0x25, 0x42, 0x2D,\r\n 0xE2, 0x93, 0x15, 0x31, 0x2E, 0xD7, 0x79, 0x50, 0xCA, 0x29, 0xD6, 0x4A, 0x40, 0x61, 0x1E, 0x25,\r\n 0x26, 0x7B, 0x80, 0x3C, 0xAC, 0x1F, 0x0E, 0xBA, 0xD3, 0x78, 0x78, 0x05, 0x62, 0x43, 0x32, 0xF0,\r\n 0x7B, 0x5D, 0xA4, 0x95, 0x8D, 0xB2, 0x71, 0x02, 0x1F, 0x7A, 0xCE, 0x60, 0x52, 0xE4, 0x6A, 0x75,\r\n 0xA1, 0xFA, 0x9E, 0xCE, 0xD7, 0xEB, 0xD8, 0x81, 0xE6, 0xB4, 0x59, 0x85, 0x4F, 0xAE, 0x70, 0x57,\r\n 0x4A, 0xDC, 0xE1, 0x57, 0x18, 0x7C, 0x9D, 0x51, 0x17, 0xED, 0xB5, 0xD4, 0x10, 0x03, 0xFA, 0xB9,\r\n 0x28, 0xE3, 0xEF, 0x60, 0x58, 0x64, 0x44, 0xD8, 0x37, 0x0E, 0xCB, 0xE5, 0x09, 0xB6, 0xB4, 0x45,\r\n 0x59, 0x49, 0xF4, 0x2E, 0xCA, 0x6C, 0x02, 0x6C, 0x3C, 0x28, 0x21, 0x3E, 0x94, 0x92, 0xFA, 0x42,\r\n 0xCF, 0xAA, 0xB9, 0x1D, 0xE2, 0xBA, 0x45, 0x97, 0x8E, 0xE6, 0xB2, 0x47, 0xCE, 0xCE, 0xF3, 0x76,\r\n 0x9D, 0x37, 0xFF, 0xBD, 0xBC, 0x43, 0xF0, 0xB9, 0xAF, 0xC0, 0x7B, 0xFF, 0x41, 0x34, 0x03, 0xE5,\r\n 0x9E, 0x20, 0x59, 0x67, 0xD1, 0x07, 0x0C, 0x5D, 0x34, 0x98, 0xCC, 0x91, 0x51, 0x29, 0x18, 0x11,\r\n 0x58, 0x89, 0xCD, 0x15, 0xA3, 0x21, 0x0D, 0x88, 0x58, 0xE6, 0xF9, 0xD8, 0x45, 0x3C, 0xC9, 0x2F,\r\n 0x96, 0xE1, 0xB9, 0xE2, 0x91, 0xB9, 0x95, 0xF0, 0x94, 0x65, 0xF4, 0x61, 0x4B, 0x87, 0x92, 0xCC,\r\n 0x00, 0xB1, 0xBF, 0x0A, 0xE3, 0xE5, 0x92, 0x7B, 0xCE, 0xB6, 0xD5, 0x7B, 0x7D, 0x38, 0x76, 0xDC,\r\n 0x9E, 0x8F, 0x27, 0x09, 0x5B, 0x23, 0xFE, 0x36, 0xE5, 0x4A, 0x6F, 0x79, 0x8D, 0x16, 0x7E, 0x2D,\r\n 0xB5, 0x2E, 0xD5, 0x82, 0x68, 0x6E, 0xC8, 0xA2, 0x45, 0x92, 0x05, 0x96, 0xAA, 0x2E, 0x40, 0x9F,\r\n 0x06, 0x9B, 0x30, 0x4D, 0x1C, 0x83, 0xBC, 0xE9, 0x62, 0x87, 0x89, 0x85, 0x37, 0xCF, 0x8E, 0x27,\r\n 0x39, 0x0F, 0x29, 0xCE, 0xAA, 0xB7, 0xC4, 0x33, 0x5D, 0x3F, 0x25, 0xB6, 0x59, 0x46, 0xCB, 0x7D,\r\n 0x6A, 0x39, 0x79, 0x22, 0x78, 0x92, 0x62, 0x85, 0x7A, 0xD0, 0x33, 0x90, 0x01, 0x0C, 0x4A, 0xE0,\r\n 0xBF, 0xB4, 0xEA, 0x19, 0x5F, 0x3F, 0xAF, 0xBE, 0x15, 0xC5, 0xCB, 0x9E, 0x85, 0x90, 0x48, 0x4A,\r\n 0x6C, 0xC6, 0x0B, 0x6A, 0x73, 0x98, 0xCD, 0x70, 0x5F, 0x58, 0x79, 0xC0, 0x6A, 0x6B, 0x80, 0x20,\r\n 0x59, 0x72, 0x13, 0xC2, 0x36, 0x13, 0x74, 0x5B, 0x34, 0xEF, 0x6C, 0x79, 0x56, 0x39, 0xE3, 0x9B,\r\n 0xBD, 0x92, 0xE5, 0xD2, 0x20, 0x83, 0x03, 0xEA, 0x82, 0x24, 0x21, 0xC3, 0x75, 0xB9, 0xA4, 0x3B,\r\n 0x8D, 0x8D, 0x7A, 0xBA, 0x3C, 0xEC, 0x32, 0x18, 0x64, 0xA1, 0xC9, 0x4B, 0x56, 0xE1, 0x7B, 0x9D,\r\n 0xEC, 0x2A, 0x8A, 0xE1, 0x31, 0xD4, 0x37, 0xBE, 0x6F, 0x31, 0x2D, 0x2C, 0xDC, 0x2C, 0x1B, 0x06,\r\n 0x95, 0xC5, 0x25, 0x58, 0x54, 0xEA, 0x13, 0xDB, 0xC6, 0x5E, 0x6E, 0x73, 0x1C, 0xCD, 0x76, 0xFC,\r\n 0xC7, 0xF1, 0x96, 0x5F, 0x5E, 0xCC, 0x9E, 0x4E, 0x5C, 0xF0, 0x67, 0x00, 0xD9, 0x27, 0x03, 0x72,\r\n 0xC9, 0xAF, 0x58, 0x2E, 0x0A, 0x82, 0x86, 0xCA, 0xF7, 0xE2, 0x99, 0x87, 0x0B, 0x82, 0xC4, 0x26,\r\n 0x77, 0x0A, 0xB1, 0x1B, 0xAA, 0x4B, 0x7B, 0x74, 0xEE, 0x9E, 0xB8, 0x2F, 0x16, 0xC3, 0x0A, 0xA0,\r\n 0xDA, 0x50, 0x73, 0xCB, 0x72, 0x55, 0x8C, 0x9A, 0x75, 0xA9, 0xCD, 0xC7, 0x8F, 0x9E, 0x3E, 0x79,\r\n 0x72, 0x56, 0x7F, 0xEC, 0x75, 0x83, 0x61, 0xFC, 0xF9, 0xBB, 0xB8, 0x05, 0x8B, 0x5E, 0xC6, 0x60,\r\n 0x21, 0x1A, 0x5C, 0x1C, 0x0B, 0x6E, 0x73, 0x12, 0x1C, 0x83, 0x08, 0x2B, 0x84, 0x8A, 0x63, 0x63,\r\n 0x99, 0x5C, 0x09, 0x49, 0x00, 0x4E, 0xDA, 0x45, 0xFE, 0x12, 0x12, 0x41, 0x26, 0x7C, 0x5A, 0x11,\r\n 0x29, 0x4D, 0x15, 0x9E, 0xDD, 0xA5, 0xE3, 0x79, 0xD1, 0x85, 0x36, 0xB1, 0xDB, 0xC7, 0x54, 0xD8,\r\n 0x5E, 0xC5, 0x10, 0x86, 0x89, 0xE1, 0x7C, 0x33, 0xB2, 0x82, 0x26, 0x95, 0x2F, 0x36, 0x7B, 0x66,\r\n 0xFD, 0x2F, 0xA7, 0x76, 0x7C, 0x34, 0xC0, 0xDC, 0xDB, 0xE3, 0xCE, 0xD5, 0x6C, 0xE6, 0x21, 0x48,\r\n 0x47, 0xAA, 0xCD, 0x77, 0x58, 0x38, 0x2E, 0xC0, 0xBB, 0xD4, 0xAC, 0x0B, 0x5C, 0x64, 0x08, 0xE6,\r\n 0xE7, 0x57, 0x13, 0x11, 0xE3, 0x15, 0x75, 0x11, 0x09, 0x7F, 0x59, 0x23, 0x90, 0x60, 0x47, 0x87,\r\n 0xC2, 0xB3, 0xEE, 0x90, 0x1B, 0x82, 0x69, 0x2B, 0x65, 0xB5, 0xF9, 0x9F, 0xBF, 0x9E, 0x5F, 0x69,\r\n 0x10, 0x64, 0xE5, 0x71, 0xA5, 0x5A, 0x2E, 0xEB, 0x17, 0xC7, 0x92, 0x64, 0x63, 0x5E, 0x4F, 0xD5,\r\n 0xE6, 0x8D, 0x60, 0x55, 0x3D, 0x07, 0x56, 0xE5, 0x6A, 0x6D, 0x7B, 0x56, 0xE7, 0x6A, 0x53, 0x70,\r\n 0x02, 0x26, 0xE3, 0x27, 0x67, 0xE7, 0xDB, 0x33, 0x7A, 0x02, 0x32, 0xFD, 0x01, 0x9C, 0xCE, 0x41,\r\n 0xBB, 0xB3, 0x5D, 0x94, 0x3B, 0x53, 0x9B, 0x9C, 0xCF, 0x59, 0xAD, 0x3C, 0xAE, 0x9D, 0xEF, 0xC0,\r\n 0xE7, 0x54, 0x8D, 0xB7, 0x92, 0xDC, 0x65, 0x93, 0x96, 0xDA, 0x6C, 0xFF, 0xFA, 0x4C, 0xAB, 0x81,\r\n 0x8C, 0xD5, 0xA7, 0x67, 0xDB, 0xF3, 0xAE, 0xA9, 0xCD, 0xDF, 0xB8, 0x90, 0x27, 0x55, 0x60, 0x54,\r\n 0xDB, 0x41, 0xC8, 0x13, 0xB5, 0xF9, 0x42, 0x70, 0x02, 0x2E, 0xE3, 0xCA, 0x93, 0x1D, 0x44, 0x02,\r\n 0xF7, 0xFA, 0x4D, 0x70, 0x02, 0xFF, 0xE2, 0xEE, 0xF5, 0x40, 0x4E, 0x90, 0x28, 0x85, 0x69, 0xEE,\r\n 0x89, 0xD3, 0xC5, 0xEC, 0x93, 0xBB, 0x7D, 0x5F, 0x18, 0x7F, 0x0A, 0x21, 0xA7, 0xB3, 0xC9, 0xC6,\r\n 0x41, 0x1C, 0x8F, 0x03, 0x95, 0x64, 0xE3, 0x61, 0xF1, 0x9B, 0x91, 0x24, 0x7D, 0x4A, 0xA0, 0x36,\r\n 0x2B, 0xE5, 0x35, 0x1A, 0x88, 0xB1, 0xD9, 0x2C, 0x28, 0x06, 0xE7, 0x14, 0x50, 0x15, 0x60, 0x25,\r\n 0x62, 0x58, 0x19, 0xA0, 0x31, 0xF8, 0xE8, 0x89, 0x9A, 0x89, 0xEB, 0xAD, 0x52, 0xC4, 0x12, 0x69,\r\n 0xD1, 0x58, 0x6D, 0x9E, 0x9D, 0xAC, 0xB3, 0xF7, 0x0E, 0x70, 0x74, 0x45, 0x05, 0xF7, 0x70, 0x10,\r\n 0x6C, 0x8C, 0xC8, 0x6C, 0xA8, 0xDA, 0x6C, 0xA5, 0xED, 0x5D, 0x70, 0x29, 0x56, 0x77, 0xC0, 0x25,\r\n 0x23, 0x8E, 0x84, 0xA6, 0x58, 0x8D, 0xA1, 0xA9, 0xAA, 0xB3, 0x88, 0xF8, 0x92, 0xC0, 0xAC, 0x93,\r\n 0x76, 0x17, 0x5C, 0x78, 0x11, 0xF7, 0x51, 0xC0, 0x36, 0x46, 0x25, 0x19, 0x08, 0x69, 0x2D, 0x6E,\r\n 0x1D, 0x0C, 0x91, 0x54, 0x94, 0xEF, 0x00, 0x8F, 0x00, 0xB1, 0xD0, 0x17, 0x4F, 0xDF, 0x37, 0x46,\r\n 0x64, 0x36, 0x14, 0xEA, 0x61, 0xDA, 0x3E, 0x18, 0x2A, 0x19, 0x71, 0xBE, 0x07, 0x5C, 0x86, 0xD8,\r\n 0x22, 0xC8, 0x7D, 0x8F, 0x1D, 0x07, 0x4A, 0xD6, 0xE6, 0xD8, 0xE4, 0x86, 0x03, 0x3E, 0xF2, 0x5A,\r\n 0xE9, 0x88, 0xEB, 0x8D, 0xD7, 0x88, 0x73, 0xEC, 0xBE, 0xD4, 0x42, 0xB1, 0xBC, 0x7C, 0xDD, 0xF2,\r\n 0x9A, 0xA6, 0x72, 0x6E, 0xB9, 0x42, 0xA8, 0x00, 0x13, 0xDC, 0x13, 0x7B, 0xBE, 0xAD, 0x79, 0x54,\r\n 0xD5, 0xE6, 0x73, 0x1F, 0x4D, 0xC4, 0xCF, 0xB0, 0xBB, 0x2C, 0x7A, 0xDE, 0x61, 0x5B, 0xF9, 0x1D,\r\n 0x36, 0x72, 0xBB, 0xAC, 0xC0, 0x9E, 0xFB, 0x18, 0x7B, 0xBB, 0x71, 0x39, 0x85, 0x62, 0x06, 0x8D,\r\n 0xDD, 0x98, 0xC0, 0x82, 0xF5, 0x06, 0x0F, 0x09, 0xFA, 0x16, 0x16, 0x5C, 0x68, 0xD4, 0xDD, 0x38,\r\n 0x2C, 0x60, 0x8C, 0xDA, 0xBC, 0xFA, 0xB3, 0xB5, 0x71, 0x92, 0x92, 0x0F, 0x9F, 0x1E, 0xE2, 0xE1,\r\n 0x32, 0x3B, 0xC5, 0x02, 0xAA, 0x0B, 0x9B, 0xCD, 0xE5, 0x91, 0xF3, 0xD0, 0x0D, 0xE7, 0x12, 0xBD,\r\n 0x12, 0x01, 0xC5, 0xF3, 0x19, 0x35, 0xA3, 0xE6, 0xC3, 0x74, 0xFC, 0x7A, 0x19, 0x0C, 0x84, 0x78,\r\n 0xDF, 0x43, 0x64, 0xF3, 0xBA, 0x92, 0x0C, 0x14, 0x48, 0x29, 0xCF, 0xA1, 0xB5, 0x2F, 0xB8, 0xE4,\r\n 0xB4, 0x07, 0xC3, 0x2C, 0xD6, 0xFA, 0xD0, 0xC0, 0x81, 0x20, 0x03, 0x6A, 0x6F, 0xFE, 0x38, 0x22,\r\n 0x1E, 0xA7, 0x36, 0x01, 0xB5, 0x57, 0xD0, 0xD8, 0xB8, 0xCA, 0x24, 0x0C, 0xBE, 0x72, 0x79, 0xB9,\r\n 0x0A, 0x19, 0xDD, 0xA5, 0xB2, 0xDC, 0x84, 0x9E, 0x37, 0xD9, 0xA5, 0xAC, 0xB4, 0x5D, 0x1A, 0xDA,\r\n 0xDB, 0x73, 0x80, 0x9A, 0xF2, 0xC6, 0x71, 0x88, 0xB5, 0x7D, 0x55, 0x82, 0x8A, 0xF2, 0x82, 0x0E,\r\n 0x1E, 0x38, 0xFE, 0x2B, 0x67, 0x71, 0x6C, 0x6D, 0x9E, 0x20, 0xB0, 0x05, 0x28, 0x76, 0xDA, 0xCA,\r\n 0x4D, 0xE7, 0xF5, 0xCD, 0x9B, 0x77, 0xFB, 0xC9, 0x0E, 0x30, 0xE7, 0x81, 0x12, 0x03, 0xD7, 0xF6,\r\n 0xD0, 0x39, 0x01, 0x84, 0xA8, 0x6E, 0x83, 0x53, 0x55, 0x02, 0x75, 0x7D, 0xF3, 0x76, 0x5F, 0x28,\r\n 0x55, 0x0F, 0x07, 0x53, 0xF5, 0x5B, 0xC0, 0xE9, 0xBD, 0x8B, 0xEF, 0xB0, 0xBB, 0x05, 0x56, 0x72,\r\n 0x20, 0xC7, 0x4B, 0x79, 0xC9, 0x5B, 0x07, 0xDB, 0xC8, 0xA5, 0xA2, 0x7C, 0x07, 0xDB, 0x38, 0xF0,\r\n 0x8A, 0xF7, 0x42, 0xE8, 0x6D, 0x82, 0x47, 0x8E, 0x54, 0x9B, 0x9D, 0xF1, 0x90, 0x06, 0xA1, 0xFF,\r\n 0xC0, 0x82, 0xBA, 0x1C, 0x91, 0x5D, 0x9E, 0x0C, 0xCE, 0x44, 0x91, 0x88, 0x24, 0x8F, 0x06, 0xF9,\r\n 0x93, 0xFD, 0x14, 0x93, 0x6A, 0xB9, 0xF6, 0x45, 0x51, 0xE1, 0xCC, 0xBF, 0x26, 0x30, 0xBD, 0x2D,\r\n 0xEA, 0x4E, 0x8F, 0xD7, 0x9D, 0xE7, 0xED, 0xFD, 0xA4, 0xB2, 0xDE, 0xC1, 0x0A, 0x4E, 0xEF, 0xA0,\r\n 0x05, 0x47, 0x91, 0xBF, 0x76, 0xA6, 0x30, 0x6D, 0xB9, 0x89, 0x88, 0x07, 0xC2, 0xDE, 0x79, 0x9B,\r\n 0x0D, 0x44, 0xF6, 0xA1, 0xFA, 0x78, 0x97, 0xD0, 0x49, 0xC4, 0xC8, 0x47, 0xCE, 0xC9, 0x2C, 0x6E,\r\n 0x4E, 0xBF, 0x68, 0xD4, 0x9C, 0xAC, 0x95, 0x76, 0x97, 0xA0, 0xE1, 0x9A, 0x58, 0x98, 0xB8, 0xFC,\r\n 0xA5, 0xC7, 0x4D, 0x01, 0xC9, 0x8C, 0x95, 0x98, 0x28, 0x6D, 0x79, 0xB5, 0x0B, 0x36, 0xD5, 0x5D,\r\n 0xB0, 0xC9, 0x4A, 0x94, 0x87, 0xE7, 0xEC, 0x2B, 0x55, 0x9A, 0x4A, 0xF5, 0xFC, 0x6B, 0xC2, 0xD3,\r\n 0x1D, 0x6E, 0x9E, 0xD3, 0x60, 0x8C, 0xDA, 0x6C, 0xBD, 0xDD, 0x4F, 0x4E, 0xE3, 0x93, 0x3D, 0x30,\r\n 0xA7, 0xED, 0x94, 0xC1, 0x84, 0x52, 0x87, 0x5E, 0x8A, 0x8D, 0xB6, 0x40, 0x63, 0xC4, 0x05, 0xFF,\r\n 0x73, 0x4F, 0x68, 0x8C, 0x1E, 0x8E, 0xC6, 0x17, 0xAE, 0x30, 0xA3, 0x6F, 0x01, 0x1F, 0x1F, 0x8D,\r\n 0xDE, 0xF7, 0x06, 0x68, 0x63, 0x8C, 0xE2, 0x71, 0x6A, 0xF3, 0x1D, 0x1A, 0x29, 0xCF, 0x5F, 0x5D,\r\n 0xED, 0x05, 0xAB, 0x64, 0xD2, 0xC3, 0xE0, 0x95, 0xAA, 0x7C, 0x68, 0xCC, 0x5C, 0xEC, 0x6D, 0x1E,\r\n 0x54, 0x7C, 0x90, 0xDA, 0x7C, 0x89, 0xBD, 0x40, 0x69, 0x53, 0x3F, 0x3E, 0x76, 0xB4, 0x17, 0xD4,\r\n 0xC4, 0xCC, 0x87, 0x81, 0x4C, 0x2A, 0x7D, 0x68, 0xBC, 0xFA, 0x03, 0xE2, 0xFB, 0xD4, 0xDF, 0x18,\r\n 0xB2, 0x78, 0x9C, 0xDA, 0x7C, 0x51, 0x7C, 0x25, 0x5A, 0x7B, 0x81, 0x2B, 0x99, 0xF5, 0x30, 0x88,\r\n 0xA5, 0x3A, 0x1F, 0x1A, 0x34, 0xDB, 0x1A, 0x6D, 0x0C, 0x18, 0x8C, 0x51, 0x9B, 0xD7, 0xED, 0x3F,\r\n 0x15, 0xED, 0x9A, 0x8E, 0x3C, 0xFE, 0x36, 0x99, 0xD2, 0x79, 0xAD, 0xEF, 0x05, 0x35, 0x3E, 0xF5,\r\n 0x61, 0x10, 0x13, 0x4A, 0x1F, 0x1A, 0x2D, 0xF1, 0x66, 0x69, 0x17, 0x6D, 0x1E, 0x63, 0xC9, 0x40,\r\n 0xFE, 0x42, 0x05, 0xB4, 0x94, 0x16, 0xDA, 0x4F, 0x94, 0xA5, 0xF3, 0xEE, 0x63, 0x25, 0x38, 0x53,\r\n 0xF2, 0xD0, 0x38, 0x39, 0xC8, 0xC2, 0xEF, 0x6D, 0xCC, 0xB6, 0xF9, 0x35, 0x3F, 0x33, 0x56, 0x6D,\r\n 0x3E, 0x83, 0x0B, 0xE5, 0x5A, 0x5C, 0xEC, 0xAB, 0x8E, 0x65, 0xE7, 0xDF, 0x07, 0x6A, 0x39, 0x7D,\r\n 0xBF, 0x09, 0xE0, 0x60, 0xD5, 0x40, 0x7B, 0xDE, 0x56, 0x2F, 0xE9, 0xE6, 0x86, 0xC7, 0xF0, 0xBD,\r\n 0x93, 0xD7, 0xFB, 0x05, 0x70, 0x26, 0xC4, 0xDE, 0x30, 0xCC, 0xE8, 0xBD, 0x0F, 0x18, 0x93, 0x37,\r\n 0xDC, 0xC5, 0x5E, 0x53, 0x1E, 0x6C, 0x5D, 0x87, 0x94, 0x24, 0x93, 0xCF, 0x03, 0x30, 0x2B, 0x06,\r\n 0x8C, 0xB8, 0xAE, 0xDA, 0x7C, 0x8E, 0x99, 0x72, 0xC3, 0x9B, 0x17, 0xC7, 0x92, 0xE0, 0xE1, 0x5C,\r\n 0xE2, 0xB7, 0xC8, 0xF9, 0x61, 0x64, 0x34, 0x50, 0x9B, 0x37, 0xFC, 0x64, 0x2E, 0xF0, 0xE2, 0x57,\r\n 0x9B, 0x33, 0x13, 0x46, 0xC4, 0x9E, 0x4F, 0x41, 0xA8, 0x14, 0xA4, 0xF8, 0xFC, 0xA3, 0xAA, 0x24,\r\n 0xAD, 0x4C, 0x5F, 0xB3, 0x23, 0x88, 0x15, 0xEE, 0x65, 0xEB, 0xA7, 0xE3, 0x3F, 0xED, 0x59, 0xAB,\r\n 0x7F, 0x01, 0xBC, 0x38, 0xF6, 0xD0, 0x12, 0x73, 0xAF, 0x40, 0xE1, 0x42, 0x1E, 0x8D, 0x5E, 0xC1,\r\n 0x2A, 0x7D, 0x43, 0x5F, 0x58, 0x62, 0x76, 0x48, 0x23, 0x55, 0x6B, 0xEE, 0xF0, 0x46, 0xF2, 0x14,\r\n 0xF0, 0x61, 0x41, 0x2B, 0x8E, 0x71, 0xC4, 0xF5, 0x90, 0x37, 0x53, 0xF3, 0xFF, 0xEF, 0xBF, 0xEB,\r\n 0x7C, 0x86, 0x0C, 0x7A, 0x19, 0xC1, 0x54, 0x25, 0xF0, 0xAD, 0x86, 0xBA, 0xEA, 0x7D, 0xFF, 0x15,\r\n 0x9A, 0x1F, 0x2F, 0x53, 0x7D, 0x8E, 0x78, 0x89, 0xAD, 0x2F, 0x02, 0xCB, 0x27, 0x43, 0xD6, 0xFC,\r\n 0xC1, 0xA6, 0x56, 0x38, 0xC0, 0x1E, 0x2B, 0x21, 0xDB, 0xEE, 0xDC, 0x41, 0xE3, 0x25, 0x09, 0x18,\r\n 0x06, 0x2B, 0x68, 0x85, 0xEB, 0x37, 0xAF, 0xDA, 0xF2, 0xDC, 0xC3, 0x4B, 0x8A, 0x6C, 0x6C, 0x17,\r\n 0x0C, 0x27, 0xF4, 0x04, 0x1F, 0x4D, 0x9F, 0x26, 0x4D, 0xA5, 0xAB, 0xB5, 0xF4, 0xA9, 0x0B, 0x4E,\r\n 0xDB, 0xAE, 0xCB, 0xF4, 0xA0, 0xB5, 0x4A, 0x3C, 0xC6, 0xF5, 0xA9, 0x85, 0x02, 0x5C, 0x48, 0x02,\r\n 0xBD, 0x60, 0xB6, 0x1B, 0xAD, 0x52, 0xBC, 0xF6, 0xB9, 0xAC, 0xF0, 0x53, 0x34, 0xA0, 0xF4, 0x6D,\r\n 0x5D, 0x10, 0x89, 0xE7, 0x54, 0x05, 0x53, 0xB4, 0xE5, 0x2F, 0xBE, 0x45, 0xEA, 0x61, 0x39, 0x44,\r\n 0x3C, 0x0D, 0xCB, 0x12, 0x4B, 0xCF, 0x4A, 0xA8, 0xC3, 0xEE, 0x80, 0x30, 0x4E, 0x59, 0xA8, 0x14,\r\n 0x62, 0xAA, 0x38, 0x95, 0x98, 0x3E, 0x66, 0xA1, 0xEF, 0xD5, 0x23, 0x00, 0x36, 0x60, 0xCA, 0x75,\r\n 0xE3, 0xC3, 0x8F, 0x53, 0x2B, 0x3A, 0x16, 0x6F, 0x50, 0x52, 0xF7, 0xF2, 0x0E, 0xF9, 0x8D, 0x1F,\r\n 0xA7, 0xAD, 0x12, 0xB1, 0xA3, 0xC7, 0x30, 0x07, 0xB4, 0xDB, 0xD1, 0x87, 0xBA, 0xC3, 0x8F, 0xF1,\r\n 0x6B, 0xD7, 0x7A, 0x89, 0xF5, 0xB1, 0xA7, 0x75, 0x1A, 0xCD, 0x29, 0x1F, 0x4D, 0x5D, 0x5C, 0x72,\r\n 0x69, 0x4F, 0xFB, 0xE0, 0xE3, 0x4F, 0x21, 0x06, 0x66, 0x8C, 0x2A, 0x3F, 0x4E, 0xAF, 0x23, 0xC5,\r\n 0x21, 0x1E, 0x09, 0xFA, 0xD8, 0x36, 0x94, 0x80, 0x21, 0x16, 0x06, 0x26, 0x74, 0x77, 0x4A, 0xB2,\r\n 0x1D, 0x7D, 0xD0, 0x23, 0x3D, 0x82, 0x69, 0x14, 0xAB, 0x91, 0x5A, 0xD9, 0xA5, 0x96, 0x78, 0x4F,\r\n 0xB0, 0x44, 0x7D, 0xD2, 0x23, 0x5E, 0x5D, 0xCA, 0x86, 0x1B, 0x2D, 0x98, 0x09, 0xCC, 0xC3, 0x5D,\r\n 0x8A, 0x03, 0xC0, 0xD1, 0xD0, 0x0A, 0xD2, 0x0F, 0x0B, 0x7A, 0x64, 0x38, 0x0B, 0x04, 0x3E, 0x1E,\r\n 0xD0, 0x3B, 0x9C, 0xA5, 0xE9, 0x2D, 0x67, 0x92, 0xC4, 0x67, 0x41, 0x37, 0x5A, 0xE9, 0x01, 0xE6,\r\n 0xC6, 0x51, 0x39, 0x32, 0xFA, 0x2B, 0x99, 0xAE, 0x18, 0x53, 0x89, 0x0C, 0xD2, 0xD0, 0x5A, 0x46,\r\n 0xDB, 0xB8, 0xD6, 0x61, 0xE4, 0x75, 0xE3, 0x48, 0xF3, 0x42, 0xD7, 0x3D, 0x6A, 0x5C, 0xEB, 0xFF,\r\n 0xFE, 0x7B, 0x5D, 0xE7, 0x4E, 0xD0, 0xA9, 0xCF, 0x10, 0x6F, 0x34, 0x1A, 0xD2, 0x15, 0x2E, 0xC1,\r\n 0x90, 0x29, 0xF6, 0x46, 0xBB, 0x71, 0x74, 0xD4, 0x36, 0xD2, 0xEB, 0x46, 0x5B, 0x37, 0xC5, 0x7D,\r\n 0x01, 0xB4, 0x11, 0x7F, 0x43, 0xAF, 0x71, 0xFD, 0xF8, 0x71, 0xE7, 0xA8, 0xD1, 0x68, 0x5F, 0x72,\r\n 0x17, 0x33, 0x8F, 0xE0, 0x52, 0x2B, 0x20, 0x6C, 0x49, 0xBE, 0xC4, 0xBE, 0x6C, 0x5F, 0x62, 0xED,\r\n 0x4E, 0x37, 0x1D, 0xFE, 0x51, 0x40, 0xBD, 0xEC, 0x0D, 0xCD, 0xD1, 0x98, 0x6E, 0x60, 0x2D, 0xD0,\r\n 0x81, 0x39, 0xE6, 0x6D, 0x47, 0xB4, 0x0B, 0xC9, 0xAB, 0x2E, 0x19, 0x5A, 0x47, 0x1B, 0xEB, 0x26,\r\n 0xE6, 0x1F, 0x85, 0x7C, 0xE1, 0x48, 0x68, 0x60, 0xDE, 0xF6, 0x65, 0x5F, 0xF3, 0x74, 0xB3, 0x07,\r\n 0x1F, 0xBA, 0x1E, 0xD5, 0x53, 0x38, 0xC1, 0x1B, 0xFC, 0xC9, 0x8D, 0xF0, 0x58, 0xEA, 0x5F, 0xB9,\r\n 0xAE, 0x56, 0x90, 0xC7, 0xBA, 0x0A, 0x7A, 0x09, 0x2A, 0x51, 0x07, 0xF1, 0x68, 0x10, 0x36, 0xA6,\r\n 0x9E, 0xE5, 0x12, 0xEB, 0xB6, 0xA1, 0x71, 0xC3, 0x61, 0x08, 0x11, 0x79, 0xE0, 0xF4, 0x35, 0xB5,\r\n 0xB1, 0x1E, 0x45, 0x20, 0x9E, 0xF0, 0x3B, 0xE9, 0xA1, 0xD2, 0x7D, 0x3E, 0xC4, 0x3E, 0x98, 0xC6,\r\n 0x1C, 0x84, 0x99, 0xF4, 0x68, 0xA5, 0x55, 0xFA, 0x18, 0xF0, 0x20, 0x8C, 0x96, 0x90, 0xDC, 0x27,\r\n 0x5A, 0xBE, 0xC6, 0x66, 0x64, 0x6C, 0x83, 0x50, 0x44, 0x03, 0x50, 0xFE, 0x6E, 0x83, 0xBE, 0xFF,\r\n 0x18, 0x47, 0x15, 0xEE, 0xBA, 0x7A, 0xEC, 0x9D, 0x1F, 0x67, 0xEE, 0x0B, 0x75, 0xAA, 0xE3, 0x62,\r\n 0xDE, 0x6C, 0x4D, 0x7E, 0x05, 0xE7, 0x92, 0x99, 0x0B, 0xDC, 0xE4, 0x76, 0x1D, 0xCD, 0x2C, 0xBD,\r\n 0x02, 0xB5, 0xBB, 0x9A, 0x3A, 0xAD, 0x84, 0x40, 0x36, 0x58, 0x4D, 0x96, 0x2B, 0x75, 0x40, 0xEA,\r\n 0xAD, 0x26, 0xCD, 0x14, 0x32, 0x20, 0xA4, 0xAB, 0x09, 0xB3, 0xE9, 0x1B, 0x28, 0x87, 0x12, 0xAC,\r\n 0x11, 0xF1, 0x6C, 0x3A, 0x82, 0x98, 0xA6, 0x43, 0x0D, 0x44, 0x2A, 0x11, 0x0F, 0x74, 0x78, 0xF1,\r\n 0xFB, 0xAB, 0x97, 0x8D, 0x42, 0xB6, 0xC0, 0x16, 0x22, 0xE3, 0x93, 0x1C, 0xF0, 0xB1, 0xC4, 0xF3,\r\n 0x38, 0x87, 0xF2, 0xE7, 0x82, 0x79, 0x5E, 0x29, 0x70, 0x40, 0x39, 0xC5, 0x07, 0xF0, 0xC1, 0xDB,\r\n 0x05, 0x0E, 0x74, 0x98, 0x32, 0xA8, 0xBB, 0x79, 0x37, 0xE1, 0xF3, 0xCD, 0x98, 0x41, 0xE6, 0x42,\r\n 0x43, 0x80, 0x1F, 0x5F, 0xBE, 0xB7, 0xBA, 0x90, 0xAD, 0xAE, 0x11, 0xC3, 0x25, 0x8F, 0x8E, 0xC0,\r\n 0x0D, 0x24, 0xE7, 0xC8, 0xA0, 0x8B, 0xE3, 0xB1, 0xB8, 0x31, 0xC8, 0xDF, 0x90, 0xB0, 0xB6, 0xF2,\r\n 0xD3, 0x83, 0xB3, 0x67, 0x44, 0xAB, 0xB7, 0x2E, 0x61, 0xB8, 0xF9, 0x09, 0xB8, 0x1B, 0x5E, 0x7E,\r\n 0x74, 0x17, 0x82, 0x20, 0x32, 0xB6, 0xF2, 0xB3, 0x34, 0x16, 0xFA, 0x3C, 0xE1, 0x0B, 0x76, 0x3C,\r\n 0xB6, 0x53, 0x4F, 0xF3, 0x57, 0x83, 0xC3, 0xE3, 0x5B, 0x37, 0x82, 0x7B, 0x09, 0x32, 0x3F, 0xD7,\r\n 0x01, 0x2D, 0xBB, 0xC7, 0xC9, 0xE6, 0x7F, 0x4C, 0x2A, 0xE8, 0x75, 0x3F, 0x2F, 0x17, 0xA8, 0xE9,\r\n 0xEB, 0x86, 0x9F, 0x56, 0xAC, 0x15, 0x19, 0x25, 0x8A, 0x25, 0x0F, 0xEF, 0x11, 0x0C, 0x73, 0xC9,\r\n 0xEF, 0xEE, 0x25, 0xC8, 0xFE, 0x50, 0x0F, 0xB2, 0x84, 0x0B, 0xB2, 0x84, 0xBA, 0x11, 0xA6, 0xB2,\r\n 0xA4, 0x69, 0x2F, 0x99, 0x7D, 0x74, 0x0F, 0xF3, 0x24, 0xE1, 0xE9, 0xC6, 0x78, 0x35, 0x55, 0xEE,\r\n 0xBD, 0x3B, 0x10, 0x60, 0xB4, 0x20, 0xC0, 0x48, 0x37, 0x46, 0xA9, 0x00, 0x69, 0xCA, 0x4C, 0x04,\r\n 0x98, 0xAC, 0x09, 0x3F, 0xB9, 0xA1, 0x02, 0x19, 0x3E, 0xAF, 0x21, 0x9C, 0x25, 0x5F, 0xDD, 0xB8,\r\n 0xBA, 0x87, 0x36, 0x39, 0x38, 0x08, 0xB2, 0x5E, 0x2D, 0xC8, 0x7A, 0xA5, 0x1B, 0xA7, 0x17, 0x57,\r\n 0xB2, 0x90, 0x40, 0xF2, 0x26, 0xDA, 0x84, 0x67, 0x34, 0x83, 0x68, 0x9F, 0xF9, 0x37, 0x38, 0xEF,\r\n 0x64, 0x6E, 0x48, 0x9C, 0x57, 0xD3, 0x41, 0x97, 0x1A, 0x72, 0xB1, 0xCF, 0xB4, 0xC2, 0x5B, 0x17,\r\n 0xC3, 0x2A, 0x23, 0x7E, 0x95, 0x4F, 0x69, 0xFF, 0xFA, 0x4C, 0xA1, 0xBE, 0x22, 0x8E, 0xAD, 0x2B,\r\n 0x7E, 0x7A, 0xEC, 0x51, 0x91, 0x27, 0x93, 0x15, 0xCC, 0xFF, 0xAF, 0x07, 0x70, 0x29, 0x85, 0xF5,\r\n 0x49, 0xA0, 0x38, 0x98, 0x1F, 0x0A, 0xC0, 0x47, 0x1C, 0x7B, 0x4A, 0x6C, 0x25, 0x96, 0x42, 0x37,\r\n 0xF9, 0x95, 0xD6, 0xD5, 0x26, 0xBA, 0x71, 0x34, 0x49, 0x2C, 0x0A, 0x52, 0xF2, 0xDA, 0x92, 0x8A,\r\n 0x08, 0x32, 0x7E, 0x3E, 0x88, 0x8C, 0x9F, 0x73, 0x32, 0x7E, 0x06, 0xC0, 0x66, 0x11, 0xD0, 0x97,\r\n 0x12, 0x82, 0x1A, 0x65, 0x3D, 0xAE, 0x85, 0x50, 0xBA, 0xEA, 0xD9, 0x65, 0x66, 0xBC, 0xA8, 0x94,\r\n 0x57, 0xF2, 0x0C, 0xF0, 0xC5, 0xB1, 0xFC, 0xFF, 0xCB, 0xFE, 0x0F, 0x86, 0xED, 0x24, 0xF8, 0xD7,\r\n 0x4C, 0x00, 0x00\r\n};\r\n<\/pre>\n<p><strong>setup.ino<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"arduino\" data-enlighter-title=\"\">\r\n\/\/ Setup\r\nvoid setup()\r\n{\r\n \r\n  Serial.begin(115200);\r\n  Serial.setDebugOutput(true);\r\n  Serial.println();\r\n  \r\n  \/\/ Delay\r\n  delay( 100 );\r\n\r\n  \/\/ Camera Setup\r\n  camera_config_t config;\r\n  config.ledc_channel = LEDC_CHANNEL_0;\r\n  config.ledc_timer = LEDC_TIMER_0;\r\n  config.pin_d0 = Y2_GPIO_NUM;\r\n  config.pin_d1 = Y3_GPIO_NUM;\r\n  config.pin_d2 = Y4_GPIO_NUM;\r\n  config.pin_d3 = Y5_GPIO_NUM;\r\n  config.pin_d4 = Y6_GPIO_NUM;\r\n  config.pin_d5 = Y7_GPIO_NUM;\r\n  config.pin_d6 = Y8_GPIO_NUM;\r\n  config.pin_d7 = Y9_GPIO_NUM;\r\n  config.pin_xclk = XCLK_GPIO_NUM;\r\n  config.pin_pclk = PCLK_GPIO_NUM;\r\n  config.pin_vsync = VSYNC_GPIO_NUM;\r\n  config.pin_href = HREF_GPIO_NUM;\r\n  config.pin_sscb_sda = SIOD_GPIO_NUM;\r\n  config.pin_sscb_scl = SIOC_GPIO_NUM;\r\n  config.pin_pwdn = PWDN_GPIO_NUM;\r\n  config.pin_reset = RESET_GPIO_NUM;\r\n  config.xclk_freq_hz = 20000000;\r\n  config.pixel_format = PIXFORMAT_JPEG;\r\n\r\n  \/\/ Init with high specs to pre-allocate larger buffers\r\n  if(psramFound()){\r\n    config.frame_size = FRAMESIZE_UXGA;\r\n    config.jpeg_quality = 10;\r\n    config.fb_count = 2;\r\n  } else {\r\n    config.frame_size = FRAMESIZE_SVGA;\r\n    config.jpeg_quality = 12;\r\n    config.fb_count = 1;\r\n  }\r\n\r\n  \/\/ Camera init\r\n  esp_err_t err = esp_camera_init(&amp;config);\r\n  if (err != ESP_OK) {\r\n    \/\/Serial.printf(&quot;Camera init failed with error 0x%x&quot;, err);\r\n    return;\r\n  }\r\n\r\n  \/\/ Drop down frame size for higher initial frame rate\r\n  sensor_t * s = esp_camera_sensor_get();\r\n  \/\/ 320x240 for better WiFi performance\r\n  s-&gt;set_framesize(s, FRAMESIZE_QVGA);  \r\n  \r\n  \/\/ Set camera rotation 180 degrees\r\n  \/\/ Horizontal mirror\r\n  s-&gt;set_hmirror(s, 0);  \r\n  \/\/ Vertical flip\r\n  s-&gt;set_vflip(s, 1);    \r\n\r\n  \/\/ WiFi\r\n  WiFi.softAP(ssid1, password1);\r\n  IPAddress myIP = WiFi.softAPIP();\r\n  \r\n  Serial.print(&quot;AP IP address: &quot;);\r\n  Serial.println(myIP);\r\n\r\n  Serial.print(&quot;Camera Ready! Use &#039;http:\/\/&quot;);\r\n  Serial.print(WiFi.softAPIP());\r\n  \/\/WiFi.softAPIP();\r\n  WiFiAddr = WiFi.softAPIP().toString();\r\n  Serial.println(&quot;&#039; to connect&quot;);\r\n\r\n  startCameraServer();\r\n\r\n  \/\/ Delay 1 Second\r\n  \/\/delay( 1000 );\r\n\r\n}\r\n<\/pre>\n<p>&#8212;&#8212;<\/p>\n<p><strong>People can contact us:<\/strong> https:\/\/www.donluc.com\/?page_id=1927<\/p>\n<p><strong>Consultant, R&#038;D, Electronics, IoT, Teacher and Instructor<\/strong><\/p>\n<ul>\n<li>Programming Language<\/li>\n<li>Single-Board Microcontrollers (PIC, Arduino, Raspberry Pi, Arm, Silicon Labs, Espressif, Etc&#8230;)<\/li>\n<li>IoT<\/li>\n<li>Wireless (Radio Frequency, Bluetooth, WiFi, Etc&#8230;)<\/li>\n<li>Robotics<\/li>\n<li>Automation<\/li>\n<li>Camera and Video Capture Receiver Stationary, Wheel\/Tank , Underwater and UAV Vehicle<\/li>\n<li>Unmanned Vehicles Terrestrial,  Marine and UAV<\/li>\n<li>Machine Learning<\/li>\n<li>Artificial Intelligence (AI)<\/li>\n<li>RTOS<\/li>\n<li>Sensors, eHealth Sensors, Biosensor, and Biometric<\/li>\n<li>Research &#038; Development (R &#038; D)<\/li>\n<li>Consulting<\/li>\n<\/ul>\n<p><strong>Follow Us<\/strong><\/p>\n<p><strong>Luc Paquin \u2013 Curriculum Vitae &#8211; 2026<\/strong><br \/>\nhttps:\/\/www.donluc.com\/luc\/LucPaquinCVEng2026Mk01.pdf<br \/>\nhttps:\/\/www.donluc.com\/luc\/<\/p>\n<p><strong>Web:<\/strong> https:\/\/www.donluc.com\/<br \/>\n<strong>Web:<\/strong> https:\/\/www.jlpconsultants.com\/<br \/>\n<strong>Facebook:<\/strong> https:\/\/www.facebook.com\/neosteam.labs.9\/<br \/>\n<strong>YouTube:<\/strong> https:\/\/www.youtube.com\/@thesass2063<br \/>\n<strong>DFRobot:<\/strong> https:\/\/learn.dfrobot.com\/user-10186.html<br \/>\n<strong>Elecrow:<\/strong> https:\/\/www.elecrow.com\/share\/sharepj\/center\/no\/760816d385ebb1edc0732fd873bfbf13<br \/>\n<strong>TikTok:<\/strong> https:\/\/www.tiktok.com\/@luc.paquin8<br \/>\n<strong>Hackster:<\/strong> https:\/\/www.hackster.io\/luc-paquin<br \/>\n<strong>LinkedIn:<\/strong> https:\/\/www.linkedin.com\/in\/jlucpaquin\/<\/p>\n<p><strong>Don Luc<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>&#8212;&#8212; #DonLucElectronics #DonLuc #Camera #ESP32CAM #ESP32 #IoT #Project #Fritzing #Programming #Electronics #Microcontrollers #Consultant &#8212;&#8212; &#8212;&#8212; &#8212;&#8212; &#8212;&#8212; ESP32-CAM Video Streaming Web Server ESP32-CAM to stream live feed from the OV2640 camera to a Cell Phones browser. DL2602Mk04 1 x ESP32-CAM 1 x OV2640 Camera 1 x ESP32-CAM-MB Adapter 1 x Cell Phones 1 x USB &#8230; <a title=\"Project #12: Robotics &#8211; Web Server &#8211; Mk32\" class=\"read-more\" href=\"https:\/\/www.donluc.com\/?p=4721\" aria-label=\"Read more about Project #12: Robotics &#8211; Web Server &#8211; Mk32\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[94,50,397,49,38,80,412,59,115,5,287,58,82,10],"tags":[6,92,102,4,19,83,85,24,9,84,27,95,33,34,108,414],"class_list":["post-4721","post","type-post","status-publish","format-standard","hentry","category-robotics-projerts","category-arduino","category-arduino-digitalelectronics","category-consultant","category-digitalelectronics","category-esp32","category-esp32-cam","category-fritzing","category-e-mentor","category-microcontrollers","category-program","category-arduino-programming","category-program-esp32","category-projects","tag-arduino","tag-battery","tag-components","tag-consultant","tag-electronics","tag-esp32","tag-fritzing","tag-microcontroller","tag-programming","tag-programming-esp32","tag-projects-2","tag-robotic","tag-technology","tag-video-blog","tag-vlog","tag-web-server"],"_links":{"self":[{"href":"https:\/\/www.donluc.com\/index.php?rest_route=\/wp\/v2\/posts\/4721","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.donluc.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.donluc.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.donluc.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.donluc.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4721"}],"version-history":[{"count":1,"href":"https:\/\/www.donluc.com\/index.php?rest_route=\/wp\/v2\/posts\/4721\/revisions"}],"predecessor-version":[{"id":4726,"href":"https:\/\/www.donluc.com\/index.php?rest_route=\/wp\/v2\/posts\/4721\/revisions\/4726"}],"wp:attachment":[{"href":"https:\/\/www.donluc.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4721"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.donluc.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4721"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.donluc.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4721"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}