From 55f5ccfdf403b1f8f5d17e6e3dc88a0f31d73bc9 Mon Sep 17 00:00:00 2001 From: Dm1tr1y147 Date: Sat, 4 Jul 2020 22:31:26 +0500 Subject: [PATCH] Completely remove csv-db files and continued working on frontend. Created styles base --- include/db_op/article.h | 26 -- include/db_op/db.h | 51 ---- include/db_op/db_cli.h | 8 - src/articles_op/html.c | 4 +- src/articles_op/process_md.c | 47 ++- src/db_op/article.c | 49 --- src/db_op/db.c | 282 ------------------ src/db_op/db_cli.c | 103 ------- src/netw_op/request.c | 5 +- static/404.html | 2 +- static/about/index.html | 11 +- .../articles/First article/First article.md | 15 + static/articles/First article/chart1.png | Bin 0 -> 35230 bytes static/articles/index.html | 6 +- static/articles/style.css | 0 static/articles_list.db | 1 + static/gallery/index.html | 11 +- static/index.html | 26 ++ static/style.css | 77 ++++- 19 files changed, 153 insertions(+), 571 deletions(-) delete mode 100644 include/db_op/article.h delete mode 100644 include/db_op/db.h delete mode 100644 include/db_op/db_cli.h delete mode 100644 src/db_op/article.c delete mode 100644 src/db_op/db.c delete mode 100644 src/db_op/db_cli.c create mode 100644 static/articles/First article/First article.md create mode 100644 static/articles/First article/chart1.png delete mode 100644 static/articles/style.css diff --git a/include/db_op/article.h b/include/db_op/article.h deleted file mode 100644 index 5593d84..0000000 --- a/include/db_op/article.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef _ARTICLE_H -#define _ARTICLE_H - -#include -#include -#include - -#include "../../include/db_op/db.h" - -#ifndef ARTICLE_T_TYPE -#define ARTICLE_T_TYPE - -typedef struct { - unsigned int id; - char *header; - char *content; - char *author; - char *topic; -} article_t; - -#endif - -int expand_line_article(int n, char *buff, entry_s *rec); -char *serialize_article(entry_s *rec); - -#endif \ No newline at end of file diff --git a/include/db_op/db.h b/include/db_op/db.h deleted file mode 100644 index 57de6fc..0000000 --- a/include/db_op/db.h +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef _DB_H -#define _DB_H - -#include -#include -#include -#include -#include -#include - -#ifndef ARTICLE_T_TYPE -#define ARTICLE_T_TYPE - -typedef struct { - unsigned int id; - char *header; - char *content; - char *author; - char *topic; -} article_t; - -#endif - -typedef enum -{ - BLOGPOST_T, - ARTICLE_T -} types; - -typedef struct -{ - types type; - union { - article_t a; - } data; -} entry_s; - -#include "./article.h" - -#define LINE_SIZE 512 - -int open_db(char *file_name, types type, FILE **file, char ***head, int *head_length); -int open_table(char *file_name, FILE **file); -int read_head(FILE *file, char ***head); -int get_entry(FILE *file, entry_s *rec, int n, int (*process_line)(int, char *, entry_s *)); -int append_table(FILE *file, entry_s *rec, char *(*process_line)(entry_s *)); -int remove_entry(FILE *file, int n); -int read_whole_table(FILE *file, entry_s **rec, int (*process_line)(int, char *, entry_s *)); -int find_by(FILE *file, entry_s **entries, int (*check_line)(int, char *, entry_s), int (*process_line)(int, char *, entry_s)); - -#endif \ No newline at end of file diff --git a/include/db_op/db_cli.h b/include/db_op/db_cli.h deleted file mode 100644 index 6bab56d..0000000 --- a/include/db_op/db_cli.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef _DB_CLI_H -#define _DB_CLI_H - -#include "../../include/db_op/db.h" - -char *get_all_articles_list(); - -#endif \ No newline at end of file diff --git a/src/articles_op/html.c b/src/articles_op/html.c index 4f747f2..bb12226 100644 --- a/src/articles_op/html.c +++ b/src/articles_op/html.c @@ -25,7 +25,7 @@ int gen_html_article(article_info article, char **out) process_md(article, &content); - int line_length = snprintf(NULL, 0, template_str, article.title, content) + 1; + int line_length = snprintf(NULL, 0, template_str, article.title, article.title, content) + 1; *out = malloc(line_length); if (*out == NULL) { @@ -33,7 +33,7 @@ int gen_html_article(article_info article, char **out) return -1; } - snprintf(*out, line_length, template_str, article.title, content); + snprintf(*out, line_length, template_str, article.title, article.title, content); free(template_str); diff --git a/src/articles_op/process_md.c b/src/articles_op/process_md.c index 2f2b891..b05db32 100644 --- a/src/articles_op/process_md.c +++ b/src/articles_op/process_md.c @@ -11,20 +11,6 @@ int process_md(article_info article, char **out) while ((buff = strtok_r(rest, "\n", &rest)) != NULL) { - - if (strcmp(buff, "***") == 0) - { - char *tmp_out = realloc(*out, strlen(*out) + strlen("
\n") + 1); - if (tmp_out == NULL) - { - perror("Couldn't allocate memory for new element"); - continue; - } - *out = tmp_out; - strcat(*out, "
\n"); - continue; - } - if ((buff[0] == '*' && buff[1] == ' ') || (buff[0] == '-' && buff[1] == ' ') || (buff[0] == '+' && buff[1] == ' ')) { char *begining = ""; @@ -52,7 +38,7 @@ int process_md(article_info article, char **out) free(append); continue; } - + if (is_in_list) { char *tmp_out = realloc(*out, strlen(*out) + strlen("\n") + 1); @@ -66,6 +52,19 @@ int process_md(article_info article, char **out) is_in_list = 0; } + if (strcmp(buff, "***") == 0) + { + char *tmp_out = realloc(*out, strlen(*out) + strlen("
\n") + 1); + if (tmp_out == NULL) + { + perror("Couldn't allocate memory for new element"); + continue; + } + *out = tmp_out; + strcat(*out, "
\n"); + continue; + } + if (buff[0] == '#') { int n = 1; @@ -147,7 +146,7 @@ int process_md(article_info article, char **out) memcpy(internal, buff + i + n, j); internal[j] = '\0'; - size_t append_line_length = snprintf(NULL, 0, "<%s>%s ", tag, internal, tag) + 1; + size_t append_line_length = snprintf(NULL, 0, "<%s>%s", tag, internal, tag) + 1; char *append = malloc(append_line_length); char *tmp_out = realloc(*out, strlen(*out) + append_line_length); if (append == NULL || tmp_out == NULL) @@ -157,10 +156,10 @@ int process_md(article_info article, char **out) } *out = tmp_out; - snprintf(append, append_line_length, "<%s>%s ", tag, internal, tag); + snprintf(append, append_line_length, "<%s>%s", tag, internal, tag); strcat(*out, append); - i += n * 2 + j; + i += n * 2 + j - 1; free(append); free(internal); @@ -189,7 +188,7 @@ int process_md(article_info article, char **out) memcpy(src, buff + i + 2 + n + 2, k); src[k] = '\0'; - size_t append_line_length = snprintf(NULL, 0, "\"%s\" ", src, internal_text) + 1; + size_t append_line_length = snprintf(NULL, 0, "\"%s\"", src, src, internal_text) + 1; char *append = malloc(append_line_length); char *tmp_out = realloc(*out, strlen(*out) + append_line_length); if (append == NULL || tmp_out == NULL) @@ -199,10 +198,10 @@ int process_md(article_info article, char **out) } *out = tmp_out; - snprintf(append, append_line_length, "\"%s\" ", src, internal_text); + snprintf(append, append_line_length, "\"%s\"", src, src, internal_text); strcat(*out, append); - i += 2 + n + 2 + k + 1; + i += 2 + n + 2 + k; free(append); free(src); @@ -232,7 +231,7 @@ int process_md(article_info article, char **out) memcpy(href, buff + i + 1 + n + 2, k); href[k] = '\0'; - size_t append_line_length = snprintf(NULL, 0, "%s ", href, internal_text) + 1; + size_t append_line_length = snprintf(NULL, 0, "%s", href, internal_text) + 1; char *append = malloc(append_line_length); char *tmp_out = realloc(*out, strlen(*out) + append_line_length); if (append == NULL || tmp_out == NULL) @@ -242,10 +241,10 @@ int process_md(article_info article, char **out) } *out = tmp_out; - snprintf(append, append_line_length, "%s ", href, internal_text); + snprintf(append, append_line_length, "%s", href, internal_text); strcat(*out, append); - i += 1 + n + 2 + k + 1; + i += 1 + n + 2 + k; free(append); free(href); diff --git a/src/db_op/article.c b/src/db_op/article.c deleted file mode 100644 index 1e27e7e..0000000 --- a/src/db_op/article.c +++ /dev/null @@ -1,49 +0,0 @@ -#include "../../include/db_op/db.h" - -int expand_line_article(int n, char *buff, entry_s *rec) -{ -#define entry rec->data.a - - entry.id = n; - - char *tmp = strtok(buff, ";"); - if (tmp == NULL) - return -1; - - entry.header = malloc(strlen(tmp) + 1); - entry.header = tmp; - - tmp = strtok(NULL, ";"); - if (tmp == NULL) - return -2; - - entry.content = malloc(strlen(tmp) + 1); - entry.content = tmp; - - tmp = strtok(NULL, ";"); - if (tmp == NULL) - return -3; - - entry.author = malloc(strlen(tmp) + 1); - entry.author = tmp; - - tmp = strtok(NULL, "\n"); - if (tmp == NULL) - return -4; - - entry.topic = malloc(strlen(tmp) + 1); - entry.topic = tmp; - - return 0; -} - -char *serialize_article(entry_s *rec) -{ - int line_length = snprintf(NULL, 0, "%s;%s;%s;%s\n", entry.header, entry.content, entry.author, entry.topic) + 1; - char *line = malloc(line_length); - if (line == NULL) - return ""; - - snprintf(line, line_length, "%s;%s;%s;%s\n", entry.header, entry.content, entry.author, entry.topic); - return line; -} diff --git a/src/db_op/db.c b/src/db_op/db.c deleted file mode 100644 index 05faabe..0000000 --- a/src/db_op/db.c +++ /dev/null @@ -1,282 +0,0 @@ -#include "../../include/db_op/db.h" -#include "../../include/utils_op/utils.h" -#include "../../include/utils_op/arr.h" - -/** - * @brief Opens a table of specified type. If no such table, creates one and returns 1 - * - * @param file_name - * @param type - * @param file - * @param head - * @param head_length - * @return int - */ -int open_db(char *file_name, types type, FILE **file, char ***head, int *head_length) -{ - char *type_string; - switch (type) - { - case BLOGPOST_T: - type_string = "blogpost"; - break; - - case ARTICLE_T: - type_string = "article"; - break; - - default: - err_msg("This type is not supported"); - return -1; - } - - FILE *root_file; - if ((root_file = fopen(file_name, "a+")) == NULL) - { - err_msg("can't open database file"); - return -1; - } - - char *buff = NULL; - size_t size = LINE_SIZE; - - while (getline(&buff, &size, root_file) >= 0) - if (strcmp(type_string, strtok(buff, " ")) == 0) - { - int ret = open_table(strtok(NULL, "\n"), file); - - *head_length = read_head(*file, head); - - fclose(root_file); - - return ret; - } - - free(buff); - - struct stat st = {0}; - if (stat("./db", &st) == -1) - mkdir("./db", 0700); - - int table_file_name_size = snprintf(NULL, 0, "./db/%s.csv", type_string) + 1; - char *table_file_name = malloc(table_file_name_size); - snprintf(table_file_name, table_file_name_size, "./db/%s.csv", type_string); - - fseek(root_file, 0, SEEK_SET); - fprintf(root_file, "%s %s\n", type_string, table_file_name); - - fclose(root_file); - - int ret = open_table(table_file_name, file); - - free(table_file_name); - - return 1; -} - -/** - * @brief Open table file - * - * @param file_name - * @param file - * @return int -1 if couldn't open file - */ -int open_table(char *file_name, FILE **file) -{ - if ((*file = fopen(file_name, "a+")) == NULL) - { - err_msg("can't open table file"); - return -1; - } - - return 0; -} - -/** - * @brief Read table head - * - * @param file - * @param head - * @return int - */ -int read_head(FILE *file, char ***head) -{ - fseek(file, 0, SEEK_SET); - - int length = 0; - *head = malloc(length * sizeof(char *)); - - char buff[LINE_SIZE]; - fscanf(file, "%[^\n]", buff); - - char *tok; - int i = 0; - for (tok = strtok(buff, ";"); tok && *tok; tok = strtok(NULL, ";")) - insert_to_arr(head, length++, tok); - - return length; -} - -/** - * @brief Get the entry on line n - * - * @param file - * @param rec - * @param n - * @param process_line - * @return int - */ -int get_entry(FILE *file, entry_s *rec, int n, int (*process_line)(int, char *, entry_s *)) -{ - char *buff = NULL; - int i = 0; - size_t size = LINE_SIZE; - - fseek(file, 0, SEEK_SET); - - while (getline(&buff, &size, file) >= 0) - { - if (i == n) - { - int res = (*process_line)(n, buff, rec); - return res; - } - else - i++; - } - - free(buff); - - return -1; -} - -/** - * @brief Insert entry to the end of table - * - * @param file - * @param rec - * @param process_line - * @return int - */ -int append_table(FILE *file, entry_s *rec, char *(*process_line)(entry_s *)) -{ - fseek(file, 0, SEEK_END); - char *buff = (*process_line)(rec); - - if (fprintf(file, "%s", buff) < 0) - return -1; - - free(buff); - return 0; -} - -/** - * @brief Remove entry located at line n - * - * @param file - * @param n - * @return int - */ -int remove_entry(FILE *file, int n) -{ - if (n == 0) - { - err_msg("you shouldn't remove table head. Aborting"); - return -1; - } - - int tmp_file_name_length = snprintf(NULL, 0, "./db/tmp%d.csv", n) + 1; - char *tmp_file_name = malloc(tmp_file_name_length); - snprintf(tmp_file_name, tmp_file_name_length, "./db/tmp%d.csv", n); - - FILE *tmp_file = fopen(tmp_file_name, "w"); - - char *buff = NULL; - size_t size = LINE_SIZE; - - int i = 0; - - fseek(file, 0, SEEK_SET); - - while (getline(&buff, &size, file) >= 0) - { - if (i != n) - fprintf(tmp_file, "%s", buff); - - i++; - } - - fclose(tmp_file); - free(buff); - - int fd = fileno(file); - char file_path[1024]; - - int path_length = snprintf(NULL, 0, "/proc/self/fd/%d", fd) + 1; - char *path = malloc(path_length); - snprintf(path, path_length, "/proc/self/fd/%d", fd); - - memset(file_path, 0, sizeof(file_path)); - ssize_t l = readlink(path, file_path, sizeof(file_path) - 1); - free(path); - - if (l < 0) - { - err_msg("couldn't get table path"); - return -1; - } - file_path[l] = '\0'; - - if (remove(file_path) != 0) - { - err_msg("couldn't remove original file"); - return -1; - } - - if (rename(tmp_file_name, file_path) != 0) - { - err_msg("couldn't rename tmp file"); - return -1; - } - free(tmp_file_name); - - return i; -} - -int read_whole_table(FILE *file, entry_s **entries, int (*process_line)(int ,char *, entry_s *)) -{ - char *buff; - int i = 0; - size_t size = LINE_SIZE; - - fseek(file, 0, SEEK_SET); - - printf("Begining line-by-line reading\n"); - - while (getline(&buff, &size, file) >= 0) - { - - if (i == 0) - { - i++; - continue; - } - - printf("Read line [%d]: %s\n", i, buff); - - int res = (*process_line)(i, buff, &((*entries)[i])); - if (res < 0) - return res; - - i++; - - printf("---%lu---\n", sizeof(entry_s)); - *entries = (entry_s *)realloc(*entries, sizeof(entry_s) * i); - } - if (i == 1) - return -1; - - free(buff); - - return ++i; -} \ No newline at end of file diff --git a/src/db_op/db_cli.c b/src/db_op/db_cli.c deleted file mode 100644 index e1fe8b0..0000000 --- a/src/db_op/db_cli.c +++ /dev/null @@ -1,103 +0,0 @@ -#include "../../include/db_op/db_cli.h" -#include "../../include/utils_op/arr.h" - -char *get_all_articles_list() -{ - FILE *db_file; - char **db_head; - int length = -1; - - int ret = open_db("root.db", ARTICLE_T, &db_file, &db_head, &length); - if (ret == 1) - { - perror("No such database\n"); - } - - entry_s *articles_table = (entry_s *)malloc(sizeof(entry_s)); - if (articles_table == NULL) - return ""; - - size_t entries_amount = read_whole_table(db_file, &articles_table, expand_line_article); - - printf("\nStarting processing table\n"); - - size_t topics_amount = 0; - char **articles_by_topics_lists = malloc(topics_amount * sizeof(char *)); - char **topics_list = malloc(topics_amount * sizeof(char)); - if (articles_by_topics_lists == NULL || topics_list == NULL) - return ""; - - printf("Initialized lists arrays\n"); - - size_t topics_list_size = 1; - - for (int i = 0; i < entries_amount; i++) - { - printf("Processing entry [%d]\n", i); - - article_t rec = articles_table[i].data.a; - - int pos = check_if_contains(topics_list, topics_amount, rec.topic); - if (pos == 0) - { - topics_amount++; - - char **tmp_topics_list = realloc(topics_list, topics_list_size + strlen(rec.topic)); - if (tmp_topics_list == NULL) - continue; - else - topics_list = tmp_topics_list; - - topics_list_size += strlen(rec.topic); - - pos = topics_amount - 1; - - topics_list[pos] = rec.topic; - - char **tmp_articles_by_topics_lists = realloc(articles_by_topics_lists, topics_amount * sizeof(char *)); - if (tmp_articles_by_topics_lists == NULL) - continue; - else - articles_by_topics_lists = tmp_articles_by_topics_lists; - } - - int line_length = snprintf(NULL, 0, "
  • %s
  • \n", rec.header) + 1; - char *tmp_line = malloc(line_length); - if (tmp_line == NULL) - return ""; - - snprintf(tmp_line, line_length, "
  • %s
  • \n", rec.header); - - char *tmp_articles_by_topics_lists_line = realloc(articles_by_topics_lists[pos], strlen(articles_by_topics_lists[pos]) + line_length + 1); - if (tmp_articles_by_topics_lists_line == NULL) - continue; - else - articles_by_topics_lists[pos] = tmp_articles_by_topics_lists_line; - - strncat(articles_by_topics_lists[pos], tmp_line, line_length); - } - - char *articles_table_list_str = malloc(topics_amount * strlen("

    \n
      \n")); - if (articles_table_list_str == NULL) - return ""; - - for (int i = 0; i < topics_amount; i++) - { - int add_len = snprintf(NULL, 0, "

      %s

      \n
        %s
      \n", topics_list[i], articles_by_topics_lists[i]); - char *tmp_line = malloc(add_len); - if (tmp_line == NULL) - continue; - - snprintf(tmp_line, add_len, "

      %s

      \n
        %s
      \n", topics_list[i], articles_by_topics_lists[i]); - - char *tmp_articles_table_list_str = realloc(articles_table_list_str, strlen(articles_table_list_str) + add_len + 1); - if (tmp_articles_table_list_str == NULL) - continue; - else - articles_table_list_str = tmp_articles_table_list_str; - - strcat(articles_table_list_str, tmp_line); - } - - return articles_table_list_str; -} \ No newline at end of file diff --git a/src/netw_op/request.c b/src/netw_op/request.c index 398a83b..cd156c7 100644 --- a/src/netw_op/request.c +++ b/src/netw_op/request.c @@ -211,8 +211,9 @@ void handle_get_request(int fd, char *request) char *id_str = (char *)malloc(strlen(path) - strlen("/article/") + 1); memmove(id_str, path + strlen("/article/"), strlen(path) - strlen("/article/") + 1); - int id = strtol(id_str, NULL, 10); - if (id < 0) + char *remaining; + int id = strtol(id_str, &remaining, 10); + if (id < 0 || strcmp(id_str, remaining) == 0) { res_404(fd, path); return; diff --git a/static/404.html b/static/404.html index 4ddcb3b..adec609 100644 --- a/static/404.html +++ b/static/404.html @@ -6,7 +6,7 @@ -

      Not Found

      +

      404 Not Found

      The requested URL: %s was not found on this server.

      Return home

      diff --git a/static/about/index.html b/static/about/index.html index b7591d9..14dcb72 100644 --- a/static/about/index.html +++ b/static/about/index.html @@ -4,16 +4,19 @@ + About - + +
      - + + Modernize
      -

      Me

      - the pig +

      About me

      \ No newline at end of file diff --git a/static/articles/First article/First article.md b/static/articles/First article/First article.md new file mode 100644 index 0000000..5fb39f9 --- /dev/null +++ b/static/articles/First article/First article.md @@ -0,0 +1,15 @@ +# My first article on this site +This is my own site written in pure C with templates in html and some css styles. All articles are stored in markdown format and are processed by server to convert them to html and send to client. Links list on the homepage is also generated dynamically to show all the articles, currntly avaliable on disk. + +![Data flow](https://c.imge.to/2020/07/03/P5RIaj.png) +*Data flow* + +As for all the pages of this site are pure html, it can be read from really old computers or text-based browsers. Server Side Rendered (SSR) webpages are also good for search engines. + +Anyway, I just like such oldschool sites with minimal styles but still featuring pretty enougth design. + +As for me, I'm *Shishkov Dmitriy*. High school student from Russia. I started doing programming about two years ago. As most self-taught coders I began with basic HTML. Then I switched to PHP-based templating programm generator DevelStudio. Some time later I started learning JS, React, NodeJS and similar web technologies. So I studied full-stack web. + +But I wanted to try more low-level programming. In school I studied C++, but my friend recommended to start with C to better understand memory-management. + +So, since then I'm studying C programming, working on some projects. Some of them avaliable on my [Github](https://github.com/Dm1tr1y147). \ No newline at end of file diff --git a/static/articles/First article/chart1.png b/static/articles/First article/chart1.png new file mode 100644 index 0000000000000000000000000000000000000000..4aa221bf70f3854b5c64af2d7f190ea248450f5c GIT binary patch literal 35230 zcmb@tcQl+)v_7oY1W|(^dW(n<1Tmt7kmx;8q7x;0H&LPoAxH>==)H?NN)SZvy^AtB zql|gq-$?FV-@WU8-&%LA-}jf5$yw*@XYXh4_ndv66QQoEc$0*I1Pcr6=5r-^O)M-z zG!_;%GZ8N47ZXq9IOb27`U`CZ5Cr@C`)}O1arf@s{r&yM#zr9_AjH#=$M!oUS8hN(9q@OWqf>mYinx{508tB3mO_4Utizp z>FM_N_S)Lov9Yo3?d`O*G-+w+_4W1c?(XvP^5NlOd3kwFO-&OM6Bid3dwct=tSp81 zw2D|*cd?$!Kh^fa-ZcvISb0DplFQ?ELmp2FTlVDx=x8j=fGaGV-vE#yjPf<_MC{+B;kLM*e2JUFCUO#% zkL=#Ik6^0=*9#9=b`I8QAd#4VEFDFHrUT4<0Q8{1Ie|W~@!9+7Mer~zXnK*Vq$b}x z_ewBc;Wq$wx~{1{z&Q(%(JJ06XvFRV7GhH^p-%ZYR#0fMIOp}^BzXGBGw2QXB(#5< zVIOMb3R-NIaZ-DAe}>#QsN`+5h%427CTr?3Hja z?Qe0{t__6AVDPZGBQMUnB6ooWb!XYX&JMuAuDzZFGg230id-i#{dE-1iLWszruhTS z6=se9V-}1R6=oQ7`2HFm-KuuC6|o;HQH7br{_HF?lIkH2#>4|EqVjpnnpRM!V$5v+ z_2=u+D2xj*FrD(nS^vQd#HxZrwlP+icm7`+e(fuaAO8!UFKD!eH4=mVI$HmINyPF0 za3KbUVj5=T|GnYY=%@DnD+x^-F))7v3;GrRjhm+bAMwEuYs}#P7sLN&d@x-6M<5K3 z{|hCqmz@6dKU|1`5i5Zi`M)zf&<_D;4%m~P-EYWr+Hs`#JwXl`Mnvt{M|4LWrzfDh zi?(b;{37m`E_qt|QI|w9Rtus$ebpN0s|z#f%O-ienwd>rU)4v~@u6($pA3snaaoN%k%|3N8>r;*z~EE1*FV)H0R6H*n6ie}0(Lxe$jg68NZE@5AuPsl}I9^QjQB zET@6~rd-go-XqdZ>2M0D+*8;0tII2j(QJc>{!O}b5f3SZox6KKenG3r_KIQnzjVeL z*RcmulGN`G<}tC-%5R0DQ@JG{(VBTYY_k-Dt!-9D*O`NKyab~jP;ELhcY|5S_?;s{ z^=LHVbEmFXGRGqOu@BxG-*T8{N$94!Uh1J-$`@k>V}-)qTnZ}B>ep7F%J7EYb&|*t zo%aFz?m|O`Kstq*O{p2^ngWfB6{3D!6RfsEI0aS@LSNcHuVB)V$Wow#bG!zyNGjkj zgf|%<-@}Qb~`og!?)%SY>=)$XsOMhDaUt61!Wlq!X+$6oCt>}Ye&CHkK}Bf z?<8cl<+Lcdm!4Jck=4j|@9@#vata|bOVX8`HBu2+|^ZLu3;_ilei?Gy71o-QC_9?HReh#) z5^GqG%)G1G!IXhGOrU>0d=SxPDPi*L%zCslBbVU7jeq-go>u^Ir077k_w?=0bVzLV z>XiDVXuAid(DetJ^k~$ z3zw1DRK8&k)}p87aVh%}l=bs&PsRd+c5;>!^l0&5Ysy^myLkMmg}aKZNILHAzz`Jy z)pp;PH4neB_qyHL4bUR4wfON)#^#sk74IeOa(7_w99Mae>0^z9q~sraQG+E7dhE*m z_r3?E@X9e!<$qL`?5I|zVWs_Xqai=CW$&H86ty`he{4bvbL5=ZQ#)=nH;Q7Z7+~l~ zP-SV_cBZAgZ~G&0a#7X}I##3En|*BQ20CPQCAD^Fif5kMQagM@UZyI`s*zbWIGiL~ zf_S7YW*84Z0^ipmK;B+oCS`B5e`HVL!_>)jYTKpR@q(6QQ-EMs;6r|wN+YxUlMw4W z6&`%(y!NHfvWv?cYTb5;+TV-PA zAeLV@X&#QCLL(tJ1Xr5d74f;q8ltg z{xs=@pa#otVZQ(bsaYZ7q4dus%R9^1_A7)GB@b%6_H_x(0$*zldlPk)C5-Mxe3*h% zp!AS=3eS$qzMR-hBG^UW>wArC1^-bOVeZ-?GoZiog9ZhSP%ltS$Gg%@^P`{N|E0mX ziBvde{ydZQI*69f2*Z-q?FtKOpH7da=kSvySvm6++3mL)}MwDEre({ zo$_%Q|H#ZAetTv>)Fj7LC2YUS6tACl5*w8NfGC|>?fwmvU^qI>jo(3;dD6DCMU(`p z%&C(^#>J&=?D2yMRW=?3KXNR!#&Q_eTsvm{T>8q>uMl;hz@qvmD6LA<^u8fYHFQp+ z64Wg#jFzwvA>2JnQdoMg)3 z6C(RX@R@{n8uXg{%`Q59PfGPNRG)%U_~@tSk}hKL16ia?vMtBs3$n&o`rhaf(N4PJ z=MB4LkrjiWM7Uwl#t$W0&0UFdgwv-bwd?Z4PUKYu_lD*+Kb8Jfx%}tb|H1W$P7K5gR>}xs9Y-r?=dt)Vch?hJeoefo#@_ zDa+kUA-7TKe_{ThzCdPXoM}=xD}y%-l~JEi^zkqOw?hWsVHe*--B$)FSd@;m6-^=t z=fd*|()HKzKz>0VV(Hp(y^oeWye0FpLdPn&GzE4CxAZou+XJkbGMR#vgAt|m2&aaP zY!($uCX%3KB&Q1ob=e=qFSz5~_e1FCyQj1gzB}XpxSi{%{-Oe6PbrLVU|s|{{ICm< z+yXkTt0ob)QzN+d1wr0yr-&%zb5m-sj>_ueu(BH-#X7p1y~4?j){WBS$YyOeKl2>X zF-@62Q88Q?LBK<-nuNGZPstRfz&T^+=5FQU&l^|_m-j_>8K{CfJf!p~N(MO&!$u#M zS5or4gnSN(*`cq1i10OJi~8>*urV%2xsi1DhA-%%2X&Q^(D+A2UEG!|%EOnh`?Vi; zgVg3w8!@-?1}0P*;_hac*(Q~d>-1vlYIgTb?=KGKkl-!{Q`W{rUfgPtdlh^iWBq} z?{)%1-?TEqLY~WwDdKop%k=xRQJaB3_hK(h1WPSz+Y5t3&}we|mQdW-gcd%F*QKO& zR?z%Sz3e=}-KSs1(Y@grpI&Lcq<_5lREQG=VR{k#DQp)w{JunbOfZF;=%68L|wK9KY}f zp5zj{!>>1_j|3?d8*94(24?Ojc$eoDjqlzf6^SM9k+X7!B#9+WYD_)v2ie*()cPntlYe&zO!C;8 zr7bikW;2i50kx}y=8In$F)S0D0^3dL_W5xWUX)nw5e(de7DY8|uB**V{^DI$) z*%O~KrLJKSvbL|W#|SZY3Lqt?x><%RSiQ^feh=*C*7^d3&!=0>imT? zhi{RBlZQdiT8~<^?YkokCH$K; zS#RPH|KXix;jt<3lSjmQPZkw|MKLZ+(~zngMJbL^5|vL6rK8jx#I-D=+ut1Ma(mw% zh<~{LsleZ(fBwBmc}lzvZXXwMxQX{;VyP(_jgWf772NIg|t; zSe39fP>L^wrHHJ*f&QM5PXQ+*=3y!KJn>$RCB<)G6Qf|8h8ZkEHB@bd&+hP~%YTjR zY~puWu0<@;;zkft$zJc}Djt|V>&X>yDk@C)XhiM)?S9>NGPl;?8dnAji$+LWci?p* z2;nfX?$}-|!qCBw?Dy6k%(0a<32V43A$XegZ_ns7?>|EEYif8vf8QdwDY+Q_eCRp3 zV7(Psa8J$*D(*rq?UB&1u*>~CjJ^%8c1Nc%H>rJaIrCB86Oh5A`Hg}1@I_#HFuI~S zt`Fq41hHHk{3X-kPragQbQG>l^ z5A301I$~61kdZoz#6up-lEp<5seD!|+e_?woU|{h88vy^!`QAiPnQ@s$Lh&VnURye zBwSapBy_MTURZ;I`D}Y|uI-CROhtSNF&pI}jZI*d$e-w@n18+7hB?bb@t>rCt=HW7 zXmeA~HKQeaBjVlT$UCN^!7k;lk9`N@mxZmmY@bn$OX$3m@qU@}68yTv zMBRE&_P9}LU~x~)zp!awwn)xXd=9fC^v(J0=()%&ypnb@KUuadK7?R#D=Mm!zoDAP z2tNsP7`cB}KGrFFp|tq2L$LX$i~WgW(kJSmXg1|@IQ!{-3N1D=*pk@a2DRd(;<0_9kbeyJ60P4}&A=7f^ zx4t!Mq=T%}voER3G%EX=_v(s|jw>J@#t#G6pxt{go%8XPfiw21Lei?~N@P{l{32Ti z>|cc*YKJV0MS@T&)LWD4S)AlBbZ}&)HAMmM1&EqrLG^sH!kyS&a99@Ck(h$Vv;SO; zTm$P)7S!|jF4Xoa5FkuSX^(*Y0LnI`v+p7vKl^~*12b2`ejhAk&OUU`53bKMz4O-pF9^bQRLU(Z+Vv2c_C__q_3E?>j5jn zhjO_~m%;T&seiB-L(g(924C+FwqQZ6@?GWV13@P2PGHJz9`7Awx46jj6M7Nlh)Rw^ zTl@5|9N?V6FnuB21JG~79Lj#lzsHT7OeF>(Hs27>Cw#!-9|<20t~(B{qhX2EhLd5EO*k z8EG;1!wvW8T;VJzPm?jnZfn?*R~mvizl>#!z_nZ0Ll5oss&Ta-X0D*=bGd(O-|VN^ zufyIJ&~SivZxFM;^QkSYl%5mQaObZ&T)gwua&<5gwPEG#j-g#E5e3dqp!~91a&qQ} z?B)~|nuO-a|Ep^`L>^jS?gFV9Qam=HOwhK@Iuxoyul>Sp-1iq=02gVOECO2TRkVD$ z&#V&%Ob6;+F?Dxee2yG>W^!m9D=^~EAep9mDx6|%ACS?IsO;9+w;Fr@d;C2{sP5}$ zx-ppJGp3Mk5Vh{X~hyZ=YF8YJf-P>-=l6<*lN6r@kL^=}W z=lqK;ZI7qm4YLV-u3qSR1jym+rDgTY3hK5ax_thu=x^p!-_aIOZP%x`-@#E)1OOQ?QXxW_P=rs|X}8#yk0JYM+y60T$ZkGHGjOyWCe= zRbfq{rHDUA}E;i`ZrF7?SO7{rzwWN(HX8&@W&R=R8HWe4wZm_q>B-fGO)y|F=@!r zndCNSOd?Fx6-@e7kE43sEkW(NcTP1-pT%59ODxURb#w4{xu5XOs=cfD%}1q34t0=h zRea=kDH8BgeD>2ox0D186i`e02;txJd;TrxZ^wU!J&yB_b?18FV`_iHXLqZOGZ~Zv z%PMbvs^jSO|EVIBL(VF3;=#P{wtb6ID)Ko@Gb$qG2I8H9_jn`VEMp-5Ds(KRcA)yp zaI)+&;}kUC(75~Fvl^c`;-A>44(_U0;#;}{8l^^h>>1pAM40>tyIKA7dydCJzX$I&Cmkp=mn?>liH%zy&^@n)nN=44 z-f$-dPZj5;pLm+sW!ISk7*s*8IVazC4BlJU<^(i%|EwwFW5ln3rnbre@2q*Vh&46{Oy zd<*2{zA_taP1lis(P!G*g3kJ?3F>Bmk|_kWK)FVLi#;`=~F3U z`<^mpoKm$9W{CafQ9)`s5dnFv2pJgW;Ne_$u9+wjloie;7lYV$+c6-@S?VTv8Rw@$ z&i^Lyu%o7fnE={gr_;Px`+v@8U<9q;D{qm#KDPV?z}G48Q%iL<9#Y=vjC{w#IEmj3N?FfC+khA;(wqxIFDmUm(e^x` z4AYq`&0Ms#(($~1r4^3m>{n7HoVDeVj(cDQ;@*8Y1+#$apJiSUbr}s&OqsA|@z3#5 z|H)Ftb7!_mBi{NIelrc{ardC5fg*YKGd-vzvW^1v$6&wg)wrIpVkZzcsxue7@Dk@CHGBM?nLi2DgU9)?KUDl*Ei-;$%)B@LS*8N|w~=&rYb8xZo3_=ika#I` zCUlmr0-ktet=*MSy!8S`&)AZWa|L4B>9N9qeIBcf?B+zws_6Zj@&wlf>2ua;eM$jf z(Fc$=crx4Q$d*%ULgMtyKz*8K$!-0zsxA13sl`RB1u^oPk~JrOl(_`a;4@(v3HcG; ze)w!juBH&HHzOe_a+Ib!1?q4H;i)2xif1-pwUrxV`K*=uoELR9O0{&Ivmids-$GtG zFhc|V36$w7b(2;TMyBM)_ZqThOu>u&>P-i7KJGC0pJ3rIYCc2LDkO7GK_1Go+;0We z9>14~(O)VzTSj7g%zSM)u5LZ}3`#H;$dzV0KE6P+p0hZieR zxgPQ8H;O~ZZO-Az6OtC7wqIdtaqy3cn)kzL2>xFZm37$5GoYv{!PdeG_WgCeiY`=}`~*yByF1wN-CWL`SdnM7DDF!5Ox>Ug(z6lYQ*-`6ExNqr)WPPAe_}6| z*fQ1+5CT3wVx8cYIW7y$-Kt~iy_o)s$eM43{H}V$`28~%=lT`RvXExFZ~3q_!2p9+ zhAc_aCxRK*u*A#S?b%Sh9Q{!0cwbr^zXD7>A>{1`6Ncv%gC%-^&;zp;j~c#wWzVy|p<b`Wdsqc;BJUu zcdmVU!E|upWVfi%BSj-{hM*SXTys1RAi{`&ELC8Pw^hu6Nn=4>*EmlB8Wb}tASF3eZ_ z36MY6V?sj6t9!x;A9ip~oG*_H)0vT`M|)V2BvGe(>qMjdcLDwVG7Fb-NHbGje9PA# z)k)I3r;771*00;TA_+5ABXm@oq>_cPtM~?wr4?>w8wYaccJJV zd=oYL{rIMVC{QfEc(ivn?cw(PQ-}kd$yI>6X#KGPN14_T%f-Wc94HfM*K_s*@qYU+ z3ZAMKUCDnx`RqG~Jg8o6gb8oogqyTLQJv!pA6{26jwkkrCVD6pP0zx)J2qpYv^dN4D>lZ^v<1Z1Y8 zQage8hUKFcYSfNm7*4b7^;T}6s2ru_=7}&_k}srtTh$nw892GLe#4k!-z20i)7baV ztMuy)UYa0pVtXZI8hzNZz>^0EeA4|5%={>{fD&c6YuetpJ1vJyR$2c8$v$ExSR04? zccWNJx9sp`#C;}W0{gHn3kP|PDh`?vu@0LVIDVem%Cg?5xrnx4ImFswyQV=*D2dFix#3qjTJDe$Rb4@{R>&^0; z&&Rxb{+PwMx)lY8cP+fPOcXI3_#@c+YDd2!{jkmoL|grys6ywDF0%Nd0|wW&TAnbg z`O(@WxIYGcRFw;w0-o-y&|u;ZpNEzS46ibtoc#$NE!itfV_@DHk36}cZWte*-P#-Q z*%hxDFb6lh-LAi0-vm-2%cpb;G$aaZXURA|!Ehp%TLgmfXM$#@-z%Zmt>NffnofVt zD`zI9LDxnxQ@=bJ|IalkdmqS=mouU)Xj_BZN3w-t8*d@NxEOb4gdo}KvJvql1=N7QeiEHJQ06lqP$-vtE2 z955|~zr^r&tqO2;_vA*=#Vtl{-V8XtEk05Eccu#D)y6sGKFa!Ol(}s$OUH2b`9zCv z4xJg490oRT14omX^5Ap^_EAjN{@sPx`vBRez*+7EH$15irw;&r%(J3=w^9G9QMm3gJ-fyh&geks@>8Vw!U+n?_&;{08CXx(X4(hfJF zKwY6Aa!F`(MFRwxC--I`?3x;wV-HjezY2a+J%NK&M+skP8OF-g6cW$RY+kptUILn}r-P{s7gz0iy~8lq_=%V5$UR)hKQ? z1gbQ$9D-3RLGm8WqH&YZYGlcc320KpB<4ymL9VCXI}EXZ0!}6W<#ELoDCftDw1zxJGV3dC#uFa`4m{8{Mx0F0I_kFamP0y2wM zBM%>&zmAksAu)6#eir~@BmYy;lz7dNl$C>UP|gbDLtTsyF@mK#%)fzjnPJu! z-UC0}qb#RkmQYXmJAVJ%Kxn?CFaMXF`o00KQkW2`p=AM-u}f8l8S48X8o>&yk9v5 zxE1@*6_EX7sEbUtBkh|5HgBz$=fcU?lk#1wry{-4hd!7P!S2{0j-iyyf4FAROya5m z^^j{zdayq=^dMk3t0$I1$Upu7#>mGl|BUQ8jB7CnX^UEWS+`vFx(cxmX8()i>TeJ5 z{VtHFNQ%0Gb#eP+gbE@Id1d=?81tY$NceL!J$wtAz# z6B-_PmR_s;bpORKaN`tcS^$6RU)ux&h2_{<{*L>|co25q3kC(lbi&b?&KaG}KQHR; z#au6CCC^d!x5_;y1qNs^F&VrLbCIku6mz=0wvXXI?ArxwMN~}|Sy5H<;7MHg{zFu^ z`nN{RfjY<^nEnH<5&ge$y}uF;Ch)Zb*YY;u*}v8%MwtY!ZWx z@^F{!I(S0Sf9_B14SImW=4*Qve}UiX+5OAIks!D$MwJIv@%_A>k5r`W?9VA+-PMcX zD<*RP9mo{M_Vm~yifejt_cjee-kber7GUt)p(sdIxZR|*piKq*=EQ*h%k3gF4CukX zEXc>`1fF|+OSM1qToS)n#~6vpVodIERY6IjN0U3RGvuc+GIRkuzb}?PNF6%x_OHOw5OY_%|4;UOk4FPlhzpbaonYwh1mBU|%T|W5uu^y+g zHeW?L>cNlx#yc_3M#t;(T%PY}r-#uAzt~C*71c9{Md9u%Ip#5oz1+$PB3k&fsIWd( z_cz({GF~p4W6~Tv@%r^cx(krh&@HIYsyrXMsO5@mIqjr{cAKY=ZN80cz8g*BE~c>9 z!`QDd8Xd74vcP@5h@uSetC7;nhw}h;h%OP9R=l&m^ zy;lVA><4LQnYeBg+k30c*{ujEEuoi=HZ}?S%z7W213m9WX~m}IvloWTJSCTY!)iQ_ zIG><)g%yJ@Q_K)>!0Fw==C3FlrWfkLpXnL&w0bMKHN;YU7TZrsNJ-v)}Tg#5dz zPt|pD!_?ylmR>7;w;ySl$#cHHPqRm71sbTlke)^7RaOiC;;-)IZGU5Vv&0pgOHSJy z#Y5V^+jiCxyn)*B9=L#)5z>ebT3-%oN;ObyoYMlZy_PC&Y?+5@6q1P;1+B` zXd2Yuu_6y5=6Lmp+^bxO=fQ}CZ6~mC>Gr65FQ}&A0Jk4XhSXDb(~2QSnYcHD%D-~9 zXOrW0&C}dgij*&waxT=q+xMMoU5lWyX~?ra#W~dy>Y?5A4dhabuK0U_$~_vxY~FVr zjw^}B;B)PXpbt?&i*++#aFCuFS2Bwd@ETdT3_cgRkh(30sWe#eZa+0(V5PQxsX`I& zpU=2l?+qllOKT8ty01G$pQg!=)=Z&^XL%N2+SJ!tu^da$k`4%8IdEzJmbYafwi_utRXAt6Zp=ro% z;u@_nb;L}({gs5-MKwu_C`+5m50XMPfoVU(qMapl0n2xRS)uIG{4pF0ZCJ^9N^`?k!q-INcdL#N}-bGFee(b1~>t+7< z=-8&|K43pHM`pdh`}4uKX9jx0^N|ffrgMv*32*Af_&MAl=x-5{$&TB3QqtJbIXRjT z%E=&oD=YC$)u=tc6Fy4&r5;AafTU}e3g4_Mc2=&jJJyYI$Cy+a7df<}aFw1_|3VpQB1AN6TaY~jxvAMR|5@=f2E^iPu;6^uuO z*~8Ij?de6~BS*`Zht}UROLk0tQ;bsY2HJf&N|xDwC-{xa7`lhHORJn1HKw-x?0&QG zX3-jG&p;&QoA&u|Qu0U(t>7-O(W(4k&3A$Z@*1 zc}t?iE@B%GBW#^98%fR{Q|hozae(>ffvn>A2M4axsmM?5nu2i zaptZ#XLq8a&=&tD*JqhobWvtD&vb5s>ez7%*WD0TK98oSw5+wife-@1XG?T!t(9O; zn9FB0e~?8==}(eW?1*>gWSMUF4b6s46n>spoyy#pq}e^y!#NgF-Y=tC_af$Rb3@N{ ztB5-z18A1@#JuJrD55QUz4fzbi>KZyXZw;VtiEa5i!({J0@Z{JbgYgWd^(F9qvaG( z0+|+$oENuHvo12_*Ij4vJzkW{{3)<$^R^+HSKKhOdw+ggW*jHBwP$h_H<$0rttTO7 zRen(Xw+X9(M;D8Yf^~xA%@6xaUc6JEaL%daNlp)TetB;p$hj>2D7PrGM}@lhtum2& z+}rS^xlXnf4+s$%xY zN|RPWEuZ3CW>4#_TpAY{W&yVqh8B4|DWxjUT0abm%!(G~>Wk_}MlhJ({+3OWwY((L zI1_5f4^*!>DpGT?0w?r?JvQ-`G61V2PD{?qQL zx=;_S9YOvk;8ot%r~F%T4JCH;$q`A0_k^+?8xN+fQVDcS#=mGHK(n#iZ8(U18Pd~0 z;}63n6k=N8NK2?4X$`@nctq^g%s7rP#fulQ6TuhdqMCP&@IS#Mf`%_NPI_-c# zB^-G{o(OxaJUe5Hb>rfJlGujfpJleNOPz5YOSg-=yEn&p8!{by9FYZu+C8upgqme@ zzvmZh_27Bkw!N~#l*0PwAE_y|ep70zV|-SmeZuYY>J(D(0gEeKgfROcq_loWcj-m> zR`N)PqX{zaf}fte7b8vy%**WFo}ih3tf@wqa&KO0MAhN<+J|O<=ph;ArG)%@OE5ug z{Re`4K=6r882lrG9=q>yg`8@dr9o{ITlv}chu7500;(z4A-1x!Lv*c%f_NSQ8VGU^ z`EmsLG>f4WkGE0T5ibQt>o`SERKA{s({-~3 zcquBS@apS-(RU-UxI$^ryq|u-LWmG$uuy?sKjSd8hCUu4e*Wz_-2#uLjVi2ngJw7c z9?Mnzq9p}>6U5Wl*r&Ev=NU|o-y^-{4%D9cFw58M_W)n^)V(r;@?-Q!n`}#1j=Kiwzv9r3d~K0pg4T-2 z#ea?aOJ)>*Kir47Pu^4*0e_ns$8(ftb{^i-DXip{@fkk}U9$liBsxc;pZ3v(%1uMj znZF0M7lgeP_T;;3Z);}v0ikY5wvEts;4mrO+5&unROPOE;QiFk6pVpSyDg{#3* zvpiBTz4$^eG!o5Zvpli5Ad9UItxkM34QipTCf%E4DG@Bq%EE^v+h3TN$_V9rZJzq# zp%~T0egm{NfCXLv9p(`k%#WFSibe1xLPoW|Vm;O%+{&BH@+|Cjiy*2y1$@bdTAeQ# zD{K>*hL#v%nWA^$w$j^6;{g;&X2%K--BqOdnEOAYOLQ;pdZzmWwi3%B9j7?s`nE45 z!fD)?Z2M(X(3#0$Pnd6@6Z?UK(eKkV-k&&KycjIqN2k!=8{9)~-#!hhC*^;cN-Nj! zt5f!b@ddzss+3_fJYEouEa=MFjJkt>zNc9qFJ&vdXEVv~TM{`97f2a?Pfh82(Alrc z=@&sU;+NeFgid^ijq&*o6^?1RQwmZ?SVGss0-f_8f&P`^>P)x2B&?o!fUBo6$0j-- ziXe=;fHK3)$n{fzSj4ZB=!y()Y7ct(_|Dly*ykydL^bAoS`t0ZZT)m{0hHi#(wGCD zlK0tjqlx-}6#__E&FDyHO+f(aBs?0oQSAbcP!L-m@~o#%KB2$+{9yl69D2vLuP6~+ zaHnx}U&jJWR?sZMIaEiMDGBK{XSuIsQMc)t<;KUfXY!*urfd-mD&z&Qx9`;}%8`7uKjh zGQp{CeD9*X1UE1Klktwx$#L{FoGnLJDXysJg{9sBXMgSw?$w4V+PL|r=e;L^6*y%O z!WpCUoJg;S_mj^bju|w%3!qXBcpl%tRDxJ6^lQsNHKfqLu$=i8|>?Dj-5 zf{3rDm!o$Gk=z5CJ80NR=>bLx>o!boMT4blMjx5e&Y-Ul8~fP4mGjbZ8rFOG2CQ~d zy@(C_U@vh6dvn&kho7RbC^=?-&;2U)Kh}2}nzF{)CS{lML9)T8WO%dUEPs=kG zNZWGm#%=ghj$E3KwdSTVzP@>&!AwSwlPj-~nKsjgc#!hf+yw6JVY@)nrVN*b9C^D- z%t!K$I7YBQfq8QY^W*8pBnu3}ju_hDvxCFGa91PXR8;nbMWsealh7}qJDodT zcezKAJoar|Mj!iFOJu)iS%4Xm6eY3Cvhnu07euL*yE9YYRqt1qA(lgcSp*{U?!qWG_=T{3?iDTei@My(&62h>CQ}s3Vy|2; zy(dA8VuV3IR&G5RFr4v=BX}AxfMR;H=HC!ev;VPdp}hD=@>k%>jR4^v_*h0E1_n1m zcgdR@Wt@>=JkfG7wm4QnBaENRQ6n4X=MnTQFCB(pW5+M1SX}9==GX(t3lglfzQ$@! zT%t>`X31c|lr1+=FEj9wo*5qop?S@Alk!pG#vk_ZRNuqCoZUv2)k&*UtdF^C_f|ei zQ|q&nb<0Z6=dFMYm){$gBI8Q3f{M4^E-MU@cDKZobBr{X^e-VPF@*H_J{om16URz} zt`q?eb=476L6WDZE`5FKF7JE(_29w#>if0(6f+PiB-p-DEi8Z{6mE*I;Ca8 zpZP6EAXxfMTH2`f^pD23$jNnmBs_8+=C((a`U5G~2tgoVo76$}Hrub_SDW*TXeAIV zO~G|>_G!k4$zEveRgLhExTq(M#yC`54rh8iTCqB}vB|@~*(I}TXpzvnTE|?4l$$k+ zxbU(v_@X}jial7!4((ODH2j8Uw@(iqp#&y%g9&wr54=W_PTh(qkzqhU(F|T<07;8> z)z%*WIEC~_)^_udrq2Z}%dee(e9$e>Npe&C75MPxrkT#zT2aZg$^G$_1lIXc_a-N- zZz8|a@~y9)zT%C_J#q=3`7#^+yrvCNrm+E!ZWWZf?t`-Y;zdHz682(XHL?EBdiQYk zZHgw=zBX#qG-sV{bVRLiQ_cGOzHot*>JBLHW}s&F65~7CH zC0P6^X+nmfCx566yGTzmf=r(qzd;Qo&)c3v-iEY$W-`GTZs$2`q?cH`{b`;Am0clO zd_}-PpLE>uuP4wN3_U)fo(i7_AU^F^A4)5ETCYJ<&nhNaYN@0KYPa$Hu4StU;rZDf zy3FPlKQjnzZMp^XAC?Hnrmx!-{9zfo>NAc0q~yr<+$;6Wcf$2h`$?6tFU?zVzUJD6 zK%({XNfR6{%)=Bo9yX?lFCA`%fM#zxn!rQ|B}-M*2N=bKk1wddPB*bvt(~oYO*|mi ze8mF{mZPjKn#&1~TdZh`UHf=W6tnIH`|8A?Pj%uXA9eI3iW#+iILL_-_kM|peYb0e zc|@8uAVz=v-Wt=j)PO7>Lmw{oq^>qdPxYr|JOsit941hpMo z?e_HnmDr1Z#|jh7E+Hv7A}gSuPw+RU;8A01iI6`XWw+3W)QXQYf}%|BFbtk`1CoNp zNrFzsTjIAcaz^TB8BSN@E-lgfoEN+>5a)JvqL!|;K}Ptj1%8k59fICB`=Yz;p+uy1 z`WHJh5?g(g8PgFgtGo@Jm^!X-k05+^2Pqve&1Ty=HA7kDOV?@`-L~|@CL6`T;EFTE>xXa*D z-mcomDhV6r?}|GnvFE_3X23DTUCz%tQL2Iv*EeTF{+~3GBrx^-YO%0Fk4G%|%25H@ zi55d%z-1RpjpXkmyG2_fuV~JK(d(l%smDcq=F^}agxT>9#=Up$zVobvGS5B{rFr&X zZm<$;TY9b-Ju(N4t%M4G>>A!#+id&({G0$Y6w_mS-|FrMETYiB?^;@4^vUvpSQp_3 z?{S2{+kI>QXQQls^Rv%c4I)Z!B`YGky?uH22vL8&K7Ktkr30B}ED#egQg3&!TKj}{ zM&QuiiyJTrlk%?cbv4=dws$o@UgjtN5S)2BGl+fALG6R?J^5+&0@{zcrAf&9t#|Dk zSEAR7$S`hym!T`V7E`CD$T$h2$B!C|nfI+Y@TN>K(tn-RU9H$W__-KNv>md9f1hefv%pG!lij1pnyG#KN=5_Ef|~9^>C-irSejn(=fNM4sy< z7{drYDTh}1Yb_4E*0o(Yvx!OUeX&z^!D6-XN9nIrw1qBkryQgVGV$|ZPD30~4)@5+ z4#o}+?#f3FJieSnEEWcnbRk>oQn5bCAz8>}k4{x&)4$5a_ko2PgsZ80vs6J>t|kym zG9)yP>t47Wt~h=aBy=_id5v0FPAtx8?E_zbRj#8Pp%6q@Af&qFi zgjc$HOpc6Q%yk{cLh({eJ`^W;+`6r_pj_A~&it4NIR){7PAYIB z;FDz`{b!+Jd&-jqSRMDCmr>~tWn74TRE_Q2``zQTTo7-y^XWI0#wGUD?72lFl;lRs zbw)$pw~kwYdPSE`k%|1M)x>F+m=gcFmm#lo$>ZJ4sUs>CP$i( zhbJQZ>Sb(a{!7R7G`&}Mq`!}|-H_xjy4VkxIHR1Zwm+*=I^h04t-W4#F;I1Vs1qlgGFvcCymT0h_~TvoS8m)V z%Ehl8;3E9GH|`JTY17XL*LR65%A{`Pa(?&X*G4jVWC}IwHk{wT*fKImrHv93Y@Sm3 z)%J*8ovc`777bHJEWH2bckjNyB>vR*y_Z*KsqZ;hjS0vc9-!qDa0WugupvB8#k6R) zyf6Ijqy~~iybOGq(>Y#LBSf2XiL%(`-a?iC3>F8Ui}{uFuT}h?Z-u*l!#Z^mG17Z(-z9VbW*2X6j2d=_PEs^6R#Q9=FYT7E#9 zx6HPX%Ay&%wi5SfB6A#8b3r$zmP-?-pWj-8O7Axd^i+6YG*xUC`$0K}oxJ$HL5WVh zFZJ~%XDs?EdysnkqrL%?2T|O#r$xyHsHkAliyRsXR5T?=tC?y~a8plbIWJsZ`h|4B*qIK=g zhhy!p{cpAfz%AC*h>?FrlM=#b@tCqZRk&Q1>mVj%`tCXK<5t(J?#5Lz(cOJHJT<7WAW5a0p(hF>%Rh%`%xG53x7srsQhMzKhLu%Y2GmeT9&OEq0FCb zXT%%Z(=alQ23M*Y)kTO^Cgu+~c(Mjht21A%Ij^6HqGjImbizewgYdtQj48aBpAhMb zD*mvKJq4dWOUmMu4GPbFCt zb~(USwxG!mtVBS6aVo19Qz2{~qaH*u1IxQYliCB8#TP>ieiBBk)S52|GYsci$6=#b z3PZw{3y7jQ>0?x^*%fb5+!d&yve{7hO+$`FlMbf|aoRmaz+&E2yV|>yevd+jh1d&+ zu*O7u=iq5{)8Y>kpKag>5Q29+L=$Z6dbNbpSTqCrV*G8og$aelkEKihN{OU(R^{3 zm*ZcMkeiKP(1{ua=1=5pB(GIdr}*?Ft8sJA`uKlfJt`y>``@rn#kHHEw1nh7RHKP< z_Ab(fZH~ux$C4HVkANoyR1RmgnN=_5i5A$Fc zNbGl0!|1No_M@FSJAH&n4YGb7UdE?Sr5{2MfH@&y>fl~*Wd_3y2X|*p=Ood&Ph@oy7 z2*WtJ=F;ArB%HdnM<~4F@$Dd0pWKqvf5c>x4)`R9_N3V(n1DMqLxay4swzFrYo2i+ zV9)nemeVH5e|~oK4S2cDj8f5jMcc)gj$xX3j7lA{ZTVsvY-&=$(##z$xS9lEbL7u) z>m^a(?2*2;tgB&r-4MoJIirVU=d`v@QliJve^y=xeq73u_$*W7xYF+owfS|>@Z(UL z;(*<|H^AY1h(|Iq`UeV3oqDFXtbcyKQZP}dIx+5|$H=wc^1HAUquV`f!vyOVL<9E_ zQ0@_uPpu&d$+V}n$ohRO0n&2}G61tK=9Mj{;VBx)HL-!RSaw@}6hsGz9;y_uBO#~C z6)~FxB;>X*H`XGB99}hrWnuTBfY{j2B4Q=T{w8?ZA{FS&%x$_eV5c`>I^a)CowiT# za~WE8x5exmw)lxkiun!`&bFK)MJJRg$=m9uk4FD(1p2n>YN?u89sG600Y9Vma0rg; zD!snrc$(`l_NBv~k%ckpP{_*C(zwv8UjwuB^X=z8rB{OK=Eg(}O>4xc#&`roHH_1( zL0~d0>Vd~&pOdD6E%bxbay~Y=72<$w!6a*wM)h5v+Ba+m+AJ3!V8zjTu#y()a34QM z@)2KPUm(m@J!vg_g9*O&-46kwk{#XRHI1KBHm_NRRb5GCf+ljAoi}(XRiB_4RFs#( z(iI!L)?{JQ3Ep7jVkT(9$%7lBMPmN2bj!|+QU!x^aEjs_7O~GaGrC=eX5)BV*g*0+ z4Wra@NBVZRDTPGZngH5q9+Nk}vinYvVryD=iAsOIx{4gVN^h((Z?!^W{QL3B-rpvk>eXZZ?02I-z4_j(Bd-amjyN-uE?C#QRVQdO~Q| z_ku06F`D!3o}F)ecop4-?GTW=TJJ`Q;3FM5Zfi|Cc8`}+a}_=AiAhRx3tOJK#9&D1 z8hlD)V-Gy&76Gw5s$=SeG0G`+_j8GzOr_`dL_?smv_oR_9#EU}IkcW`k#pF#8-Z=9 z18{OoF3pQrusSH_ zy5*zKUTIVZG9du>M%Fcr#OOd_58C(01I5^Vf}33TYmQ>*95AY>fx362AR7YRK6!}* zyk!PLCP$6En+hJ8gXez7n;@4b8k8;Z(2At`NAj zgBP(SKzr+sVeAE0bWS*F^ly`s!8eCwGI zX%>atM$_lk&(`yC`lh3fskOsuQRsCls=7fBRUUCql*jIrISR~Lh@i{E9{GMlg3_l= zlyo<*WIWch{&NndyRg;)rtb3NkhEE1qLXNHqo3mb`{Bh#8F5eSI9n)M<>a^LbK{il zSD#Wo@l@R<@5T21rMMl=7t7ZSHRjI`dN=u#A~5x6eVmlOzr;thQGgA9O!ekYqhzT0 z=Y5hd$IW<1$&fnRXR3POWY?{pc?q*@LLOqCfe5o0ki7=0sN+L#Rh-ABU$2t3Njwnl zwt#t5bu%Dv??Q9 zpGbJ6Y4z6t&q37;$T92x<_{A1Kz*Mpw%glsak;X~_i8^1MB$AedLSTzc62dpfsw@3 zr^8>G;B;CNPd2YtdJyJ<6k*OeUm^!vkRj>BFz z{aY~z6uI&@T}>p+eQkn6W2^yti@tcb^wXFaE{i|I_eBaTuqI2OJPs^$NDL@mWK*dw z10{cuT4)~ld93+9wmtAJSe~zeBcNJShzo2XG${!CL$mq8kpR0KfKC0i@SnIWJ0Yuj z%peVK7?gDmT@&kS5}soZhxbxJAfFmd!BEiP8CGf+^RpCG9)n>)4p1sH;N|*%Uk3$$ zeJ$o&u}hn~2H@p_RgU!;{;!f)1auOVf4QzHP`&sc79RLR?5>9cY@rd;r>pGgWs?cb zO$J$Xp`O?B*=T!EBzMl7e$DmU4RyHwg^A-jI+~j*j-=Sut9KdTOEB91!S;c#DfzWG zK?|lsZLS5rUSQryR>+I%U&x>!a86Q*?K*|0IF%I1pusDZKYT zkU3BusJmQyEzvzx(7#q*o_VYZX?*nuJA+=-wW5;2=^FFr2lodGB{#-_#%D4P;9B+Z zitG7?%rM`zLN!zk%+(Npm!%Ns!**Q@Uc2TBB@Drq(8c`9P`N^Zl2l;xFclMIxz?}@ z<#s#=Rixct=qW)a2wf$*6;1p{ThRsI1mSH%Z}kjw2oy_v zwOSnC;%0->eMA3|9bd%-1GW1C0ve52QP}~lQ=S9&uL8-cb1<(8VVLCq}K)Yo7~iA+p&=hIJZ?j~L4e>$m} zey;)-OMCR7$aFO*iTYY_+s*Jdk+Nxd6|e!#VPLqoE=L0a4})!8tBb6^OgoPCLfJfOfELTyO4=+}lK*^_-TQ~Ukp$t-I5wj|PSyejxzGw3O zXZK^B^FUz`s1*Yf3*tGPIRJZg5Z=$fCRvzNyJpxHDPmPKY&Z)8%RKM{^eiz!tYgq- z_~9RLyRKbjjCz`?k966i1L>TP{ZKz7UUs?55kPh5pj|%7U*gKA*$C@MI_9^CGS9yF z(gfq;fBWW~7rc3(zLNGT|3t{m3nz;k;PZx*?6!u%Q34!KH$@qg&r(>EmVo6fFSctM zRh1d65gOBtNv0gElkPtdbPM&Ddy$*^ot!SUGyXNPtbx0~V?ACGWi>~AV#DW3IZqx7 z@=+Q67CEOE7n84ExoViLKHusaeaNgz#ky<$L*)g&qJPGnLSFU?!L{NC+cE}ZypNdX z4+>Q`M$fvNV2`%P*V4W79DqAuQI;WKX@Rf0l5vg*P!4EE(f;QGNNd`fULdfUlRxww z_&!+2uG}o3C?>S6(L~u5#a7d+X|2YwMCnfMGm2H>u_ta@@+T-v5);DI3S{dOfQ+u|^noOj&FKwZ;#C@)vi`lY#rw ze`a)BCL^*4WvV5rlj}8zdaptf>G2MpsJPPK%#3knl{Kd2XO39YBph(aqOkcM7ICDo zKv;4SFw9My`!rkeI3~3ud>^Y;B=wP^8HQP#1sFl8?LP~~)BoNE;TZKcDe%z>>^x2c z>S=5KO|T@!Z{SSK><(G<=iJ z76li%))b?Y$x3;z$DlxoBRWoSZbKYcX`!6zp{sfzScJ?5{i}rQIlgXC%oD4)0HdSZ zo6KV>n#ag$!ro(D9Qi<#XDJ*snUuLeDU*dw=?UvR^zxx4dXnG?$NLKtqIS{FuYx7j zMugqeXc>o|qX}K<1cN0AIE1}oajNGB#n*sYg&S@bMu2h)3J!0e-aOQBn;IOgRd#4n;@7eY87vDz+?ow{@otHO*DU1 z2vBW2Kb*xh!aT{sk@a2UFyXQPj$iXr{s0G_7RL9-*^o_=r?vNOh^<;+$fz4+eKCR> zT|2Nr_W4Fa`^Biqgq2Q zcbKEvi7ik^M}LQ#-~^AkzJVr=Zzky~Df?JZHhzBD%)W!%`gVq0e!4%IrAt*P$>Mq9 zrj*eDBdP-4>H~1%V;3rUgTn?Okt0!7Q6~bUR{Wf*IN^gZ1v%O&``D7Mpngjb#ifPB zdeC!Ubhk(5t?SPCY?6&&)xy5TeKrB5<*+Z-UsL`yx?}tAfT8O_^@94x6*%(=P2Atd z>bdkn-u}*3blwYUzbO=EiXy{bH#&@zAmvQDK{y#mLetfc^}46)|El744_2u&bpjoj zifJC%W`Or(U$^t<>@X+mJw${Eg>@%5Y9ZbTqvx6rf%3-x&ZGJNokxw71T>^qPuvi| zS+HuJ?W`y1)5sVzn+J#E4b)YI>~MiC0?@q$YnxjYg4P{`R3)!|Qh*nX!wiIa)Dk?JzC#KFws(+fC9tMQauDX|#zvotc*Q={AJEjc>7hHNcj>1wJ8=1*^6=lECm z`aw{e-d`|n0sjH(`d)wk;S9ZSla*-Q+H>-bTw|5bD%0cPaHe97UOQ&7ZOf~iYGU+8kf{6_!@jQ z`)6HN(|LXOIFArz3Y#r+n- zeV_ai&#eY8KyIXc;-lR!K%VA=ZF(KpYU03j_G9NcS!(*kZpfU3V}9OmPzawi%mmZ8 zj`Y5IYD&)KI3M5JtcFW_dvqibuuguk?vm|Z9zR23HGjp0t(sXpsot_5=Z+V#Z5rQD z7HaB4G&MgQ^frSli6B$jq#R)<#SMlwl6((L&gJPU2FvVXTE;- z5@@|+1BuS}lG9V2+-5ZkwK9O;=>rjUntd|}ATOo5bMvnhiN1P#YmlkmBd(;ud8;Xu zWh;vB;v$od$*oc1mBO=WYM-f|n83}a*$vPEKUeo5osL=4$CIU%rTthJr_aV_!%WBa zN0zi_jwPHNjyLO&WYs-3^vg|zd1LV}Zx1@skCqbB1vv!YZoG(EhT&@V9ear(APkhV z3HI{$cHWtN(f)=gys4Ud{7^MOCuxxqftcQn88n`)R2 z+lhZra}>?-lie#5s*TP~RxEYnotcxSB2`n^qc*;_u2+=FX%UH zn0S)v*ea*GJ93xdKhh%K@^&s#IB>J+`?9ucY?w=wBWZPvGGM{~3cVeNuU#1QY^WU->teQ0{s4>xDd_g7zZ9E@^ktvtvy zs|(kU!ZZhCJ%gWFEM0&S^EyDTfJ)8dBf}X{7j9x`Kn-uBGN2 z6(Q@zvyJupL*K=Bb)3^vUtC(ZMRxd#qLJ?>-q7ASCej;yLf86@V`o=#x0-1l3uj-Om1f_^Oxx9-iB zhCe{KML#fhF)xp)oCjVt8#Pvz5WuDP5fy^J9Fs+lHw-J&*vSocBI86M#UBV1b|0(o z1}*P&Rn~YiotZz`l6kcLU?bozBdN@kW0@+Enut*swjZ>VMGDb}A1bhzqjVnswCB6j zKTtPZIH(V!2BjC|{^wm`LqFY+9IFls_rSeCjbV z7gN#{(e5D2hcEDJn$~1{K{L)$t(V@MjXAO@!Y)DbBfT6jm{OgHBRnB9G*c$ynNm2i zeWWd_XoklxRtys@Z|$XMKXPbh3CBpVm2Tm@^xLj3k4WCLxeXC*oU~w1#3nWZ&&S~I z-)Q8#<;S(84xVTyHk(xJzN9co!^}mHifR$KpJ)3GNU4$aEw=HSJ4h0ICJ345>I)1e z4VT58R8QSVJtFRZ_BPaVhn+@~TgHVal~|gc$b(G#a}ql#87%f~zjo^dj-mnqp4;m{ z@los!!RTC4Pdkh5*8`}u>5&$a%=0;=CT-fC7BalEThk|qWG}aS`%?$b*q`zO{zBv; z`KJsDdGM~;%<`;}Z#j1%|4R#i-FZQlySYg2fX9diJ#SVCCtqZYY9Uc`j)3jZ%wX8| zm(G7xLi+yO_7UkWxix%R-_A@+VKXy#VQs|)t3pWQ<51MKen-Q_=N2U3*VVax`*%Om znCN*RX?eA>Vm@1K6e}%yE9t((;BY6$c`Fht+xbdiiEs=%43i5vWvSJ7wkdA-@+$6e z;?UdCRU}2+&gneS8~Y<+Hnxw0Y{TR6IK+wXl*`r%Prf6^-Jcipdd{YCAj3=8&- z=CB-p>7f~^0tsZ{jJNEh-Uve>_v< zUrY%(FWOJQh@lU+9;*yuAMCxkywl0&zidY-@^1ujB$H`?e#j;>bT?;uuVq3wioHjG z9U%;6$Bjl}7x8e+8-drw0ke2;)qJMgvPC(sX?=B2CPMTQm}%-IBh7q%G+&_4aP;ZJ zsOkDhuD1Kl+zVddgk->c;u}Bq zK_ZY!A&Z}fNQi>abmbKC;1@-no<`$Y3!?z>PH3x?M&R!kKNmkg8#;irlF@z}LLM?( z5hAScmW+eGZhy<)sYPJFN>!1kKCM&iYyaU4OL;VRAFd{E8LJkND6RX316*cArx5t)=7u_PClp!NYIA zbO`65;}#w#Ixo^px{2mn~+h1HgQ;mI27DVIXGBo7vC%Mo=9LAwIg57kiq!u}joakel^~%l3imUy? zTYG76&6-yT@bcqCKyraidY*Y()T&INu4};8zcUIQvM4KkSrq0PUlcUBhEl z9isI>?Pnlp_f8>D%DZjr3o&uRnJoJ_H1nxIf)7h7)0G}lV9q+1_c%&>$_9LHdp9*& zyuEJJqV=cMPhuyr15Bf>I-Re&o}~tNXDvf=Pn79eE~5syY=8nxeD7rBmHRZMlJm{A z^7e5oCvLAgko%Bl!dO#0DH)j>lENH8XSOmPyEE8(9cBNh4FPJ7_m;~O-UsONp0$5d z-q$RQ>^}CT@E{{`h_#R-jQbsdt&5Iv9uLX{H^~7|7HzlRDz*C91b<6>rvm>zlg;Vu zN?$p7ak34JkY?m3uFMy|ojRTCy=gh%Rw{UdZfAjG)u)2gIrL$`ODCo(7t=Qv|MsLJ zjKF*Z#13!??&}bnl_aFK1w32OGRfE?A#i{m`k@^?nM#V7qC^FxGT%g3L(D#a8&Rw3 zRy1sFxu4W{T@a91Rx;MJblUIV)Vv%Sy+5AIj57OM1JOoWdQ##K(B>R}(<%On-(*1# z-SpsdzsKH<2|e|FG#RRt@m}chZ7zfr=w!bAc}r}4d;|-Ex_Rh~50z0vt_|7xjQXF* z4BO6}=8$m9YKb-T95)qtb?sX)R67GPXPJXDmYCUOs|g zu_QLOpe@Julx5cCDFUhlZpp8zLu7Ka+Jzcv!bXz+23>z3iS+P}s@01t3$;DH;*@M8+4!AqzXQ?qY7l_e(Y7Vg zpgn^9Tzf-cE}K?^HZFh9NLE|UNcJ9e^}7g`jes0kBn$dn zx#9y7@}afLbrgF)mU7kprbqYJb>j%$j)Wu?*}wwBBFE>HGj=2jzG5@uuX^&T zn)I++q-Zq_JS>w=~mAFGQX7VqTiXN*onQXmSVT5K++T;WfeJ*?2yh_eA zTFPsBi!dk&=i9-b!+A{Wr(0(fR02vqjgJVW<{{~A;r+l~%krwM!-G9jNsIPKeEuh9 zE*p`?mUo56xVw1OQ$BNSHlkBUe*6MN(MneAd1Zve>Mn{|6B$vMf)WA&G(#uMO}6CA zB9HB5g<^(M>OHvbi%BW{$p+{&mKD=L{^MdTOM{&w#L6`UUHsQc{`m;itayFYjezC zWDV_>*{Rmo%4M3&B}c>UrV5{$-D%r3%Fvdm`{sov>I879NKEhD*XdOv%m&7vFz0^l z#hNmZV9R%+iOiaymeseemv@t56N0Yay#02*=WT2~l zts?Keeux0@Xll2~A2rVZ-0mvax4jf0L)%Fe^#dtLPxJT0z;dNEjp2r@gzCHr2&1A*( zxx;RE^_W^`&3i^5X=wa_-ICiD5_B#;L`A79`Wx>ZD*;;RvwpNe2yfKpz884{ zqe=D++XTOqYRv$!g9Xh0EVzqm=o6YoUzs#6H@Q7hlZj8?6?;5R{EL|Uk)ZQ}eV?1m zbDXtCY4iFTf4rvl_3=kYvY!yvHvm&7z>JnLB%g~Rj>WWp;eDg+HMpmR0Ic<@1EQsn zSPpWTtHTCpX=wgJm@r1zAhVi^tnloRE9BJLGyG@jQ3s1=_^W(guDDcrt@7Ad(khaG z-SW3``jZ(Xd3ij?$p20*<)M4y<~0iRqkbc&R#})S=OZ!pBLPD0LV&3I0~PkX9bL`k zU)ZdzTw=bwg*R89Uf}a105YWa9s$YN^m3D4{_B2`pEg)|H5~X>Q*pE(Yw^Q(VzY1h zEf2bcq+O;?aQRi_@6gy@tllY>yg#i&RO%rVsmu~+I{uJq^U+3X6zt{*K;HzH#S^rw z3wL=^eSE}&Y=oPAi!;1z^HsLUmw1;~$u9HhF7rdB`TXv9>HPGJ zLK#>W^A{=GvTpzjl$yZC(3V+M({!2dsWtDr?~mr+FNGL=`TN>sC?*P1V&b+0 zoe#bRO5XlN%!;OM^Zvr^ob1W25#eZTn;F`9J>hVuKZ>1vRYpbTTCdC9d%L*c9-oqa z%8So&Y$gRZ0d(R&sfu10TQTYDs#L4o^*8=CmWQ5Eu&$7}Yw9rH7?6xJI*9e! zm{Vw5AeZ<2js+(SwI;y*!N?F+^)G=X2XHuoWe6I!_BpY3<=g9NC(6T-d;0z;3KQ8T zJ?I@L;QCd3GWE-oe42I~*S=*Y+PA;uUq5GLxQd-W;PD$)GO&JnqmEAUi&q3$E`2fq z<Lg&`B7pTk0z8Vv&MYdC#F0kxX}IF6wOjSGLbDAt%>Mdu z+pV?fjd9Y3>9h`63pt#kG_$HSR`s_^XN7M(b|GWRiJ=W~Xy6RVpp!o|O z*#fHeyEi{}m=9yAV5J(H^)~(1txo4Ug%2x40gAh=DJ`Zl52jG6fSE}LH) zbK2e!r?^zZQyJH|7<}9^d`pZ62gSv8`&Ohm4lNSH z&Yd)w56%L9{kHUaw(RA7%yuS{JoHQc&u&`DQVc0{x`GbW(ZJEV= z2bjC>iUsPozI9(v5l%aky*$a&QFLAFoLep2{&}I=)=>H#TDo|R|t00anMnxu^%KuBy=tI7C+`~h8~OJoDgVleXz`G*^Ahkg}R z^y?|L9_ymavD8i9Ur(4JRM8(l$eqa_hB?hcrV=g;O7OlIfd*U391Tf|iFgW}HoZGD zr#Eb&cSGzj+zX=NZxhJeiW`DBz6*`eKc_jpR5!r;RsMSX0IE3;zY=pCgMWDqPH0Iz z?i4+tM_gfO7BHM~uG7znFmxE3JGN0^%X$bm$Hzxk`@IrG^D#vBW19tJzs$zj!zSbuai@t3 zgSVFGvg!7&>{s9!J!vKOe7)7rv6>i@_T_^e|L@%%@S>U}?b5?+=Y+8vyi=b&1Mgcf zqfCn7Z_t(Go`}_#1@Ek3wjPYS=;DRhaHbU{6!2r~jJqCQ^_rJ2CFb#S?3oAj=p;6H z^@j|wX0QAeYsH4tzpOK4CbGgcC$w%Yta;)UWBW`Zjb}fCmmYR9k16tb>mHeI^LqG=_|JXZblAnn493mq>?5ioy zm^2OVURCDl;+KE^)jisawLjDGhUTVy8i&=<@>d@|_OuvUuSsbSVyqTya429|_{6Q8 zajxe)7_>rp0z%0F(}VIr?Rm`EandZ^TK-(&t9f%h_O%7J;88xb(uRD7*bvmAI|rNy$Ujd^D&K# z?xvVCB!ooY2kN&Mg{)6?NT^wu^d{ZHW+%Nansc8=jxN}EMSXR7U7>UrAShAyaQ|`1r4?81xsYo*G~xx%)T3>_Yw}8=Bbg4%Wg~OEI|DQAD|#vZ}KqgzW`>s zo0s!JHmMM&T@MYE2_uzLxaLz?Y_VtZsvk2|f%kiheAWlZR5nuWr<#;Zox>#;t3v&6 zFz23*q0s8pyHNOG2k8D!qIVe2U}KCCQJuQ@!|b8R@Z~i4AWz&6>Z0uz|Pr^x+UC zmiuU^8!P7%xgD`3&$?~N)($ySxovH4!o?oOm}+fWGBpv7MGxi()}*-tN1hzL~jk6kkIaN21^3NVYp{JFSN zvtlArjydfM9*FnHsE4c&IeaomHqK*heL<4k%x#x=@iMzJ+mRdetL%Jfi?sA)D}X9r zF$h=|YR#BS{*jkS59ls;^3C$UljII1#`>dar$%>Xxq)9m&Xx zVyYNW)4;_fR(u|qg~>!f8R$|RZhoc@5B3LQn!{fjAv@1>|#Q_ysimDcnM znwP});&I^?gj3@!vDVAx_w)8$CLUkrMVv@mqX%$)N@bi4;_AuTi??#=D)&bImJ;0gWLnY}mP$X3M|EeP=1?vB3Z*aPc^%3;KZ+xmnHMds?G7_`h8 zH$;>F5j?lilq*2(=b}BJqN#l(k~bPLZ7nT%tP7}$V*l=cC0gPVcX5am3Ht#zXkHd> zQE6y*NU1s9=8sn}m_4Q%>LUztD>>Y7M4hW7ObO#ksIU|w;psBma^6w*UfL5prxZ%~ zrCji)={0fitGgA+x-!E`L9(pG-6%w1g|Au0IMmphRpPrI|2zi8n}2yDRqT_3Q<1c!KY5EPU75Us`KSEP{9m3-6|Lv;k^}B74`?>tq zk0xTNHn|cZQ_Hi*L!~^q&#CfUQT2Q%&mRf!XiI4^4^Dzh($i1RT?b$IN=K7WOUzor zGT;omWf7pgMNg;==DS;x5TeA28gE|I(Mb#T)UFB%i%JzV>x8Fa8mGDv7S?NP_OVRe z2aJF629jJ5R$GwUt#^{G1t(=LkK|>lqG(NL4G|O2*T{MdM`ImR>KGJEFQ3xGutr!! z#wr(j>fNmtT$@BVh(zIGmg0^`O{XF=@P}Rb2YzI--s5e6i-hH`KJUY7prDLq-?x?B zhtK`Xmh^KlL^dEO1sozEXeHD463Mo-gvhG;4P9e}Z!rxnFXw`DM9duB0nNIKndFj&m{i?3U5Vnr~U?Um5nw_2iRiAhGf`UQN})M2s8t zcFTe&2!Dr*9+HHZloJ>0qkW0_*xWTm=t^g1k@bI+UcFtX>_V`$%VjS88El{6cvwr$-45-s_}cW~v``*Vd}y z1W9L38c)4D5nd}@^u1ZiAAnAqw z`j5~dBn|EK2Vu2a!-`|&raWCuvYa$_7&Xxbs{-Qd&DnH9|ANy(y zPleR48#M?kSM0X~GAZnhMarw32etF`s5wtb@R(6Vf9ylwJU5Lx?_C-0LuF+O)cCJI zklrz!;lQb{*dh-DHgrIA)UCOjgIM207P(qY&`6} zPv7kpl(rhT*sg3vLYkrcuM;rksFwl5@7;2>Lq6QCPX%|Bz~^?Nw5yRMBsPr4a@^Bu z{>jsXdI6ScH$O-WS>n&;tRwJ{V{8KEjoQd5IohUA0(t1>rdBqoX*tgSIvj}=pdltp zeun!hUuWz4nFJ6BJR1Z$2EbcO!f-BA?TOpDi8m>_9EpXfW`bQh;D!|30MyMOUeY=w z^9Q^Dp94EszmnMAJYjpCi0O0{&<`d03pbmRnI7F!MgU!PJpoqml9e_ue6M*(6U+^_ zaQ7F+*~_XWL*OS!-*@_`ezDc}5!bE#%K?N>K+md9kj@r(BnS8j$l36gBC!eGOoafg zK#2Ud`(iG}F7I)>Jx9Qj-#mmji`k(l^7&_56f^@98IMY9@rP~HR;2vUyXeM(NbZc< zFV$`Ef^GCHnlE2J7q);Gw$6Bs-*GQ0&=e*a%zq>swzOI)jYp)Z(Yg%iq5{jz6dI2NiO5pHSetg;^>hAde=x(1Cr}}AT6dyg z*q>+o4QnT3lcRC6J=^O56zD}*&v1~p)3Zwc$r}2?8#{U8Nai{O~jZ|CB zP9n^E76=m)c>>AYPSJJ*7L(WoGb#S6-UL%|3TCcobgANs4GqIxm|1Klv`TA}U_~>N z~6`5Jd0UF@y;JS`H0c#Fz_yjn5GI%5JKvv z(aZ0w@`NtB@|tH;*f(jgwb$8uTx+Dnas>yhq?ikQn> zqhFY8v;eo??yuWE`q)+HIX2Tbaf&-VqY`&5A zW2TIT`CYmMoKLTMGe1E{Scek6^Ufs4-ZH~kzf$lFbH~%;=lmu;@!dW-(3FNEG^st2 zJ6FJ8#En$Q+4t|GqPu7qn1XUKZx=t^ADX}RG@)MfTbF6Gw?saFtRoh(UW7^BF0W+{ z-T!4&=#s;HT^Y&zdIxp`)^7h6h%H0n#m1wCXN}1nZGT{IG2?avJa@xAx^>hOROG`l?1Gq8QLdXBIvJ?2sFs4zQ_b)(OSS`Wi)Hd@rsx z3jV%cqiE-Sv&-Z1XmM^3`tFu(n>Iv^jt&I8%YI-cad~*3|z6K z_d!Qq(FXOEg+HwP2mCS`0o2P$d7Q&ydTt>-$ypGYdl7syFr@ar#5Y=FrX0u27^K?#E3 z=x}}VU9uqB&XxPA-!60JOS=J3O^;{o2rycE>#MH$6N1JeyS%BbRruQK+a~gVy{4y) zND$o_I~hXN0)7eJ*#CUV4bYJD@n>rY7E_Il&j6ztLSkDi3P{jw0|+k# zuMRE@Olx7^4-T1Cx0crxi4b6E<^Ipoj(~QOne$<+voYIsDPOgJG*tv?_{Vnt^W9;f zdFL5u;`rhs5ITC0n*N$JRpZp-Z!~zdLo!A%2;=-TijSXrkL*l^#w z1p$ePoc7?yp^l(KNRpG?O9|vug6{$iF^!jUov@at6R)T)CqC`3)6ebv3xk_=5#!r4 zge=74*B&NZBE|spWtYJL;BMN|E_)h~*}tv-tDw^!0Wd0l3vv9xfqj(;D{0ULKc<9hc*_PRob(*75X|Nr<1*i$&0LB9>?h5A3Q zb^XG1K?nW8g8c8-0v+F}AOd~G6g1S3(11;22sVxN&AQkdVCOIe0sj)l*TyT53J>Ac z{styx=ajBn7hGa@H`;<_0QvZ^3b37e2%nK%$HISIUACR@|Ja+rY6_$H$b8+<|0yx} zu_9a0?seTqlX}j`K^qf9^SY-bTw9sIzNiHDMbLg8`0u{>*7W~lEDzEDAK`;l(P;nw zRmZuurrqTaC{pPn=@MpS6=tYv6N{cEp2#W~g-|9ZHo7GKwy>F@-cM{?Pr7atv75Q; zD~c4L>jE?Y0tE^nZ2ypi&k?BZ26G^)Yd$wW6fA^94I`jSU%Ns@do%uT}4~DPSHBz{{n{atyus7 literal 0 HcmV?d00001 diff --git a/static/articles/index.html b/static/articles/index.html index 7e0a1eb..937d301 100644 --- a/static/articles/index.html +++ b/static/articles/index.html @@ -4,16 +4,20 @@ + %s - +
      + Modernize
      +

      %s

      %s
      diff --git a/static/articles/style.css b/static/articles/style.css deleted file mode 100644 index e69de29..0000000 diff --git a/static/articles_list.db b/static/articles_list.db index e69de29..c9eba98 100644 --- a/static/articles_list.db +++ b/static/articles_list.db @@ -0,0 +1 @@ +1593768639 First article \ No newline at end of file diff --git a/static/gallery/index.html b/static/gallery/index.html index 3f15417..58d7d46 100644 --- a/static/gallery/index.html +++ b/static/gallery/index.html @@ -1,15 +1,22 @@ + + Gallery - + + +
      + Modernize
      - %s +

      Work in porgress

      + \ No newline at end of file diff --git a/static/index.html b/static/index.html index d2f6abb..3d5f9cd 100644 --- a/static/index.html +++ b/static/index.html @@ -4,6 +4,7 @@ + Test @@ -12,6 +13,8 @@
      + Modernize

      Home

      @@ -24,6 +27,29 @@

      Articles

      %s
      + \ No newline at end of file diff --git a/static/style.css b/static/style.css index 8d64ebb..281ca3c 100644 --- a/static/style.css +++ b/static/style.css @@ -2,8 +2,7 @@ margin: 0; padding: 0; box-sizing: border-box; - - font-family: "alte_haas_grotesk_bold", "Helvetica Neue", Helvetica, Arial; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; } ::selection { @@ -11,8 +10,8 @@ color: #ffffff; } -html { - min-height: 100vh; +html, body { + height: 100%; } body { @@ -21,28 +20,74 @@ body { padding: 45px; } +a { + font-family: monospace; + color: #000000; +} + header { height: 65px; - margin-bottom: 20px; + margin-bottom: 30px; } header img { height: 100%; } -main h1 { - margin: 20px 0; -} - -main li { - list-style-type: none; -} - -li a { +header #modern { + line-height: 65px; + text-align: center; + vertical-align: top; + margin-left: 30px; + font-size: 18px; color: #000000; font-family: monospace; } - -li:hover a { +header #modern:hover +{ text-decoration: none; } + +main { + max-width: 800px; +} + +main>* { + margin-bottom: 30px; +} + +main img { + max-width: 100%; +} + +main>ul { + padding-left: 30px; +} + +main p, main blockquote, main li { + font-size: 20px; + line-height: 30px; +} + +main a:hover { + text-decoration: none; +} + +main blockquote { + margin-left: 20px; + padding-left: 10px; + border-left: #000000 solid 5px; +} + +main>#header { + font-size: 45px; +} + +@media (max-width: 800px) { + body { + padding: 30px; + } + header #modern { + margin-left: 25px; + } +} \ No newline at end of file