This commit is contained in:
jomjol
2021-09-24 19:57:48 +02:00
parent f15e5f060a
commit 68b0fb83ee
38 changed files with 72 additions and 94 deletions

View File

@@ -111,6 +111,8 @@ esp_err_t set_content_type_from_file(httpd_req_t *req, const char *filename)
return httpd_resp_set_type(req, "image/jpeg"); return httpd_resp_set_type(req, "image/jpeg");
} else if (IS_FILE_EXT(filename, ".ico")) { } else if (IS_FILE_EXT(filename, ".ico")) {
return httpd_resp_set_type(req, "image/x-icon"); return httpd_resp_set_type(req, "image/x-icon");
} else if (IS_FILE_EXT(filename, ".js")) {
return httpd_resp_set_type(req, "text/javascript");
} }
/* This is a limited set only */ /* This is a limited set only */
/* For any other type always set as plain text */ /* For any other type always set as plain text */

View File

@@ -83,17 +83,20 @@ FILE* OpenFileAndWait(const char* nm, const char* _mode, int _waitsec)
printf("open config file %s in mode %s\n", nm, _mode); printf("open config file %s in mode %s\n", nm, _mode);
FILE *pfile = fopen(nm, _mode); FILE *pfile = fopen(nm, _mode);
/*
if (pfile == NULL) if (pfile == NULL)
{ {
TickType_t xDelay; TickType_t xDelay;
xDelay = _waitsec * 1000 / portTICK_PERIOD_MS; xDelay = _waitsec * 1000 / portTICK_PERIOD_MS;
std::string zw = "File is locked: " + std::string(nm) + " - wait for " + std::to_string(_waitsec); std::string zw = "File is locked: " + std::string(nm) + " - wait for " + std::to_string(_waitsec) + " seconds";
printf(zw.c_str()); printf(zw.c_str());
printf("\n"); printf("\n");
LogFile.WriteToFile(zw); LogFile.WriteToFile(zw);
vTaskDelay( xDelay ); vTaskDelay( xDelay );
pfile = fopen(nm, _mode); pfile = fopen(nm, _mode);
} }
*/
return pfile; return pfile;
} }

View File

@@ -50,14 +50,14 @@ std::string std_hostname = "watermeter";
std::string ipadress = ""; std::string ipadress = "";
std::string ssid = ""; std::string ssid = "";
std::string getIPAddress() std::string* getIPAddress()
{ {
return ipadress; return &ipadress;
} }
std::string getSSID() std::string* getSSID()
{ {
return ssid; return &ssid;
} }

View File

@@ -7,8 +7,8 @@ void wifi_init_sta(const char *_ssid, const char *_password, const char *_hostna
void wifi_init_sta(const char *_ssid, const char *_password, const char *_hostname); void wifi_init_sta(const char *_ssid, const char *_password, const char *_hostname);
void wifi_init_sta(const char *_ssid, const char *_password); void wifi_init_sta(const char *_ssid, const char *_password);
std::string getIPAddress(); std::string* getIPAddress();
std::string getSSID(); std::string* getSSID();
extern std::string hostname; extern std::string hostname;
extern std::string std_hostname; extern std::string std_hostname;

View File

@@ -216,26 +216,5 @@ extern "C" void app_main(void)
printf("vor dotautostart\n"); printf("vor dotautostart\n");
TFliteDoAutoStart(); TFliteDoAutoStart();
////////////////////////// Test SmartLED Liberary //////////////////////////////////////////////
/*
xDelay = 5000 / portTICK_PERIOD_MS;
printf("main: sleep for : %ldms\n", (long) xDelay);
// LogFile.WriteToFile("Startsequence 06");
vTaskDelay( xDelay );
SmartLed leds( LED_WS2812, 2, GPIO_NUM_12, 0, DoubleBuffer );
leds[ 0 ] = Rgb{ 255, 0, 0 };
leds[ 1 ] = Rgb{ 255, 255, 255 };
leds.show();
vTaskDelay( xDelay );
leds[ 0 ] = Rgb{ 0, 0, 0 };
leds[ 1 ] = Rgb{ 0, 0, 0 };
leds.show();
*/
} }

View File

@@ -51,9 +51,7 @@ esp_err_t info_get_handler(httpd_req_t *req)
if (_task.compare("GitBranch") == 0) if (_task.compare("GitBranch") == 0)
{ {
std::string zw; httpd_resp_sendstr_chunk(req, libfive_git_branch());
zw = std::string(libfive_git_branch());
httpd_resp_sendstr_chunk(req, zw.c_str());
httpd_resp_sendstr_chunk(req, NULL); httpd_resp_sendstr_chunk(req, NULL);
return ESP_OK; return ESP_OK;
} }
@@ -61,9 +59,7 @@ esp_err_t info_get_handler(httpd_req_t *req)
if (_task.compare("GitTag") == 0) if (_task.compare("GitTag") == 0)
{ {
std::string zw; httpd_resp_sendstr_chunk(req, libfive_git_version());
zw = std::string(libfive_git_version());
httpd_resp_sendstr_chunk(req, zw.c_str());
httpd_resp_sendstr_chunk(req, NULL); httpd_resp_sendstr_chunk(req, NULL);
return ESP_OK; return ESP_OK;
} }
@@ -72,36 +68,30 @@ esp_err_t info_get_handler(httpd_req_t *req)
if (_task.compare("GitRevision") == 0) if (_task.compare("GitRevision") == 0)
{ {
std::string zw; httpd_resp_sendstr_chunk(req, libfive_git_revision());
zw = std::string(libfive_git_revision());
httpd_resp_sendstr_chunk(req, zw.c_str());
httpd_resp_sendstr_chunk(req, NULL); httpd_resp_sendstr_chunk(req, NULL);
return ESP_OK; return ESP_OK;
} }
if (_task.compare("BuildTime") == 0) if (_task.compare("BuildTime") == 0)
{ {
std::string zw; httpd_resp_sendstr_chunk(req, build_time());
zw = std::string(build_time());
httpd_resp_sendstr_chunk(req, zw.c_str());
httpd_resp_sendstr_chunk(req, NULL); httpd_resp_sendstr_chunk(req, NULL);
return ESP_OK; return ESP_OK;
} }
if (_task.compare("GitBaseBranch") == 0) if (_task.compare("GitBaseBranch") == 0)
{ {
std::string zw; httpd_resp_sendstr_chunk(req, git_base_branch());
zw = std::string(git_base_branch());
httpd_resp_sendstr_chunk(req, zw.c_str());
httpd_resp_sendstr_chunk(req, NULL); httpd_resp_sendstr_chunk(req, NULL);
return ESP_OK; return ESP_OK;
} }
if (_task.compare("HTMLVersion") == 0) if (_task.compare("HTMLVersion") == 0)
{ {
std::string zw; // std::string zw;
zw = std::string(getHTMLversion()); // zw = std::string(getHTMLversion());
httpd_resp_sendstr_chunk(req, zw.c_str()); httpd_resp_sendstr_chunk(req, getHTMLversion());
httpd_resp_sendstr_chunk(req, NULL); httpd_resp_sendstr_chunk(req, NULL);
return ESP_OK; return ESP_OK;
} }
@@ -117,18 +107,18 @@ esp_err_t info_get_handler(httpd_req_t *req)
if (_task.compare("IP") == 0) if (_task.compare("IP") == 0)
{ {
std::string zw; std::string *zw;
zw = std::string(getIPAddress()); zw = getIPAddress();
httpd_resp_sendstr_chunk(req, zw.c_str()); httpd_resp_sendstr_chunk(req, zw->c_str());
httpd_resp_sendstr_chunk(req, NULL); httpd_resp_sendstr_chunk(req, NULL);
return ESP_OK; return ESP_OK;
} }
if (_task.compare("SSID") == 0) if (_task.compare("SSID") == 0)
{ {
std::string zw; std::string *zw;
zw = std::string(getSSID()); zw = getSSID();
httpd_resp_sendstr_chunk(req, zw.c_str()); httpd_resp_sendstr_chunk(req, zw->c_str());
httpd_resp_sendstr_chunk(req, NULL); httpd_resp_sendstr_chunk(req, NULL);
return ESP_OK; return ESP_OK;
} }
@@ -142,28 +132,15 @@ esp_err_t info_get_handler(httpd_req_t *req)
return ESP_OK; return ESP_OK;
} }
#ifdef DEBUG_DETAIL_ON
LogFile.WriteHeapInfo("info_get_handler - Done");
#endif
return ESP_OK; return ESP_OK;
} }
esp_err_t starttime_get_handler(httpd_req_t *req) esp_err_t starttime_get_handler(httpd_req_t *req)
{ {
#ifdef DEBUG_DETAIL_ON
LogFile.WriteHeapInfo("starttime_get_handler - Start");
#endif
httpd_resp_send(req, starttime.c_str(), strlen(starttime.c_str())); httpd_resp_send(req, starttime.c_str(), strlen(starttime.c_str()));
/* Respond with an empty chunk to signal HTTP response completion */ /* Respond with an empty chunk to signal HTTP response completion */
httpd_resp_send_chunk(req, NULL, 0); httpd_resp_send_chunk(req, NULL, 0);
#ifdef DEBUG_DETAIL_ON
LogFile.WriteHeapInfo("starttime_get_handler - Done");
#endif
return ESP_OK; return ESP_OK;
} }
@@ -217,12 +194,15 @@ esp_err_t hello_main_handler(httpd_req_t *req)
} }
res = send_file(req, filetosend); res = send_file(req, filetosend);
/* Respond with an empty chunk to signal HTTP response completion */
httpd_resp_send_chunk(req, NULL, 0);
if (res != ESP_OK) if (res != ESP_OK)
return res; return res;
/* Respond with an empty chunk to signal HTTP response completion */ /* Respond with an empty chunk to signal HTTP response completion */
// httpd_resp_sendstr(req, ""); // httpd_resp_sendstr(req, "");
httpd_resp_send_chunk(req, NULL, 0); // httpd_resp_send_chunk(req, NULL, 0);
#ifdef DEBUG_DETAIL_ON #ifdef DEBUG_DETAIL_ON
LogFile.WriteHeapInfo("hello_main_handler - Stop"); LogFile.WriteHeapInfo("hello_main_handler - Stop");
@@ -299,10 +279,6 @@ esp_err_t img_tmp_virtual_handler(httpd_req_t *req)
esp_err_t sysinfo_handler(httpd_req_t *req) esp_err_t sysinfo_handler(httpd_req_t *req)
{ {
#ifdef DEBUG_DETAIL_ON
LogFile.WriteHeapInfo("sysinfo_handler - Start");
#endif
const char* resp_str; const char* resp_str;
std::string zw; std::string zw;
std::string cputemp = std::to_string(temperatureRead()); std::string cputemp = std::to_string(temperatureRead());
@@ -333,7 +309,6 @@ esp_err_t sysinfo_handler(httpd_req_t *req)
}\ }\
]"; ]";
resp_str = zw.c_str(); resp_str = zw.c_str();
httpd_resp_set_type(req, "application/json"); httpd_resp_set_type(req, "application/json");
@@ -341,10 +316,6 @@ esp_err_t sysinfo_handler(httpd_req_t *req)
/* Respond with an empty chunk to signal HTTP response completion */ /* Respond with an empty chunk to signal HTTP response completion */
httpd_resp_send_chunk(req, NULL, 0); httpd_resp_send_chunk(req, NULL, 0);
#ifdef DEBUG_DETAIL_ON
LogFile.WriteHeapInfo("sysinfo_handler - Done");
#endif
return ESP_OK; return ESP_OK;
} }
@@ -401,7 +372,7 @@ httpd_handle_t start_webserver(void)
httpd_handle_t server = NULL; httpd_handle_t server = NULL;
httpd_config_t config = { }; httpd_config_t config = { };
config.task_priority = tskIDLE_PRIORITY+5; config.task_priority = tskIDLE_PRIORITY+1; // 20210924 --> vorher +5
config.stack_size = 32768; //20210921 --> vorher 32768 // bei 32k stürzt das Programm beim Bilderaufnehmen ab config.stack_size = 32768; //20210921 --> vorher 32768 // bei 32k stürzt das Programm beim Bilderaufnehmen ab
config.core_id = tskNO_AFFINITY; config.core_id = tskNO_AFFINITY;
config.server_port = 80; config.server_port = 80;
@@ -411,15 +382,14 @@ httpd_handle_t start_webserver(void)
config.max_resp_headers = 8; config.max_resp_headers = 8;
config.backlog_conn = 5; config.backlog_conn = 5;
config.lru_purge_enable = true; // dadurch werden alte Verbindungen gekappt, falls neue benögt werden. config.lru_purge_enable = true; // dadurch werden alte Verbindungen gekappt, falls neue benögt werden.
config.recv_wait_timeout = 30; // default: 5 config.recv_wait_timeout = 5; // default: 5 20210924 --> vorher 30
config.send_wait_timeout = 30; // default: 5 config.send_wait_timeout = 5; // default: 5 20210924 --> vorher 30
config.global_user_ctx = NULL; config.global_user_ctx = NULL;
config.global_user_ctx_free_fn = NULL; config.global_user_ctx_free_fn = NULL;
config.global_transport_ctx = NULL; config.global_transport_ctx = NULL;
config.global_transport_ctx_free_fn = NULL; config.global_transport_ctx_free_fn = NULL;
config.open_fn = NULL; config.open_fn = NULL;
config.close_fn = NULL; config.close_fn = NULL;
config.lru_purge_enable = true; // neu, um schlechte Serverbindung zu verhindern
// config.uri_match_fn = NULL; // config.uri_match_fn = NULL;
config.uri_match_fn = httpd_uri_match_wildcard; config.uri_match_fn = httpd_uri_match_wildcard;

View File

@@ -1,4 +1,4 @@
const char* GIT_REV="e2a4034"; const char* GIT_REV="f15e5f0";
const char* GIT_TAG=""; const char* GIT_TAG="";
const char* GIT_BRANCH="rolling"; const char* GIT_BRANCH="rolling";
const char* BUILD_TIME="2021-09-23 18:31"; const char* BUILD_TIME="2021-09-24 19:25";

View File

@@ -42,21 +42,19 @@ const char* libfive_git_branch(void)
return GIT_BRANCH; return GIT_BRANCH;
} }
std::string getHTMLversion(void){
string line = ""; char _char_getHTMLversion[20]="NaN\0";
const char* getHTMLversion(void){
FILE* pFile; FILE* pFile;
string fn = FormatFileName("/sdcard/html/version.txt"); string fn = FormatFileName("/sdcard/html/version.txt");
pFile = fopen(fn.c_str(), "r"); pFile = fopen(fn.c_str(), "r");
if (pFile == NULL) if (pFile == NULL)
return std::string("NAN"); return _char_getHTMLversion;
char zw[1024]; fgets(_char_getHTMLversion, 20, pFile);
fgets(zw, 1024, pFile);
line = std::string(trim(zw));
fclose(pFile); fclose(pFile);
return line; return _char_getHTMLversion;
} }

View File

@@ -1,4 +1,4 @@
const char* GIT_REV="e2a4034"; const char* GIT_REV="f15e5f0";
const char* GIT_TAG=""; const char* GIT_TAG="";
const char* GIT_BRANCH="rolling"; const char* GIT_BRANCH="rolling";
const char* BUILD_TIME="2021-09-23 18:30"; const char* BUILD_TIME="2021-09-24 19:25";

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,6 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<link rel="icon" href="data:,">
<title>Make Alignment</title> <title>Make Alignment</title>
<meta charset="utf-8"/> <meta charset="utf-8"/>

View File

@@ -1,6 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<link rel="icon" href="data:,">
<meta charset="utf-8"/> <meta charset="utf-8"/>
<title>Make Analog Alignment</title> <title>Make Analog Alignment</title>

View File

@@ -1,6 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<link rel="icon" href="data:,">
<meta charset="utf-8"/> <meta charset="utf-8"/>
<title>Check</title> <title>Check</title>

View File

@@ -1,6 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<link rel="icon" href="data:,">
<title>Edit Config</title> <title>Edit Config</title>
<meta charset="utf-8"> <meta charset="utf-8">

View File

@@ -1,6 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<link rel="icon" href="data:,">
<title>Edit Config</title> <title>Edit Config</title>
<meta charset="utf-8"> <meta charset="utf-8">

View File

@@ -1,6 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<link rel="icon" href="data:,">
<meta charset="utf-8"/> <meta charset="utf-8"/>
<title>Make Digital Alignment</title> <title>Make Digital Alignment</title>

View File

@@ -1,6 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html style="width: fit-content"> <html style="width: fit-content">
<head> <head>
<link rel="icon" href="data:,">
<title>jomjol - AI on the edge</title> <title>jomjol - AI on the edge</title>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">

View File

@@ -1,6 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html style="width: fit-content"> <html style="width: fit-content">
<head> <head>
<link rel="icon" href="data:,">
<title>jomjol - AI on the edge</title> <title>jomjol - AI on the edge</title>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">

View File

@@ -1,6 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<link rel="icon" href="data:,">
<title>Make Reference</title> <title>Make Reference</title>
<meta charset="utf-8"/> <meta charset="utf-8"/>

View File

@@ -1,6 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html style="width: fit-content"> <html style="width: fit-content">
<head> <head>
<link rel="icon" href="data:,">
<title>jomjol - AI on the edge</title> <title>jomjol - AI on the edge</title>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">

View File

@@ -1,6 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html style="width: fit-content"> <html style="width: fit-content">
<head> <head>
<link rel="icon" href="data:,">
<title>jomjol - AI on the edge</title> <title>jomjol - AI on the edge</title>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">

View File

@@ -1,6 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html style="width: fit-content"> <html style="width: fit-content">
<head> <head>
<link rel="icon" href="data:,">
<title>jomjol - AI on the edge</title> <title>jomjol - AI on the edge</title>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">

View File

@@ -1,6 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html style="width: fit-content"> <html style="width: fit-content">
<head> <head>
<link rel="icon" href="data:,">
<title>jomjol - AI on the edge</title> <title>jomjol - AI on the edge</title>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">

View File

@@ -1,6 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html style="width: fit-content"> <html style="width: fit-content">
<head> <head>
<link rel="icon" href="data:,">
<title>jomjol - AI on the edge</title> <title>jomjol - AI on the edge</title>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">

View File

@@ -1,6 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html style="width: fit-content"> <html style="width: fit-content">
<head> <head>
<link rel="icon" href="data:,">
<title>jomjol - AI on the edge</title> <title>jomjol - AI on the edge</title>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">

View File

@@ -1,6 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html style="width: fit-content"> <html style="width: fit-content">
<head> <head>
<link rel="icon" href="data:,">
<title>jomjol - AI on the edge</title> <title>jomjol - AI on the edge</title>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">

View File

@@ -1,6 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html style="width: fit-content"> <html style="width: fit-content">
<head> <head>
<link rel="icon" href="data:,">
<title>jomjol - AI on the edge</title> <title>jomjol - AI on the edge</title>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">

View File

@@ -1,6 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<link rel="icon" href="data:,">
<title>jomjol - AI on the edge</title> <title>jomjol - AI on the edge</title>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">

View File

@@ -1,6 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<link rel="icon" href="data:,">
<title>OTA Update</title> <title>OTA Update</title>
<meta charset="utf-8"> <meta charset="utf-8">

View File

@@ -1,4 +1,6 @@
<html><head> <html>
<head>
<link rel="icon" href="data:,">
<title>jomjol - AI on the edge</title> <title>jomjol - AI on the edge</title>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">

View File

@@ -1,6 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<link rel="icon" href="data:,">
<title>Set PreValue</title> <title>Set PreValue</title>
<meta charset="utf-8"> <meta charset="utf-8">

View File

@@ -1,6 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<link rel="icon" href="data:,">
<title>Reboot</title> <title>Reboot</title>
<meta charset="utf-8"> <meta charset="utf-8">

View File

@@ -1,6 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html style="width: fit-content"> <html style="width: fit-content">
<head> <head>
<link rel="icon" href="data:,">
<title>jomjol - AI on the edge</title> <title>jomjol - AI on the edge</title>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">

View File

@@ -1,6 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<link rel="icon" href="data:,">
<meta charset="utf-8"> <meta charset="utf-8">
</head> </head>

View File

@@ -1,6 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<link rel="icon" href="data:,">
<title>Overview</title> <title>Overview</title>
<meta charset="utf-8"> <meta charset="utf-8">