From 0ee275371735ab3eabf91cad8a9f25634523ab5b Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 15 Oct 2017 10:09:18 +0100 Subject: [PATCH 01/31] Retire the goog, except as the lastest resort. You know what I'm sayin --- src/freedombone-app-pihole | 10 +++++++--- src/freedombone-image | 4 ++-- src/freedombone-image-makefile | 4 ++-- src/freedombone-utils-dns | 4 ++-- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/freedombone-app-pihole b/src/freedombone-app-pihole index 7b9a8c6b..23f43a80 100755 --- a/src/freedombone-app-pihole +++ b/src/freedombone-app-pihole @@ -135,7 +135,7 @@ function pihole_change_upstream_dns { data=$(tempfile 2>/dev/null) trap "rm -f $data" 0 1 2 5 15 dialog --backtitle $"Ad Blocker Upstream DNS" \ - --radiolist $"Pick a domain name service (DNS):" 25 50 16 \ + --radiolist $"Pick a domain name service (DNS):" 26 50 17 \ 1 $"Digital Courage" on \ 2 $"German Privacy Foundation 1" off \ 3 $"German Privacy Foundation 2" off \ @@ -151,7 +151,8 @@ function pihole_change_upstream_dns { 13 $"PowerNS" off \ 14 $"ValiDOM" off \ 15 $"Freie Unzensierte" off \ - 16 $"Google" off 2> $data + 16 $"DNS.Watch" off \ + 17 $"Google" off 2> $data sel=$? case $sel in 1) exit 1;; @@ -203,7 +204,10 @@ function pihole_change_upstream_dns { 15) PIHOLE_DNS1='85.25.149.144' PIHOLE_DNS2='87.106.37.196' ;; - 16) PIHOLE_DNS1='8.8.8.8' + 16) PIHOLE_DNS1='84.200.69.80' + PIHOLE_DNS2='84.200.70.40' + ;; + 17) PIHOLE_DNS1='8.8.8.8' PIHOLE_DNS2='4.4.4.4' ;; 255) exit 1;; diff --git a/src/freedombone-image b/src/freedombone-image index f5b4fc99..17a57ee8 100755 --- a/src/freedombone-image +++ b/src/freedombone-image @@ -87,8 +87,8 @@ NAMESERVER1='213.73.91.35' NAMESERVER2='85.214.20.141' NAMESERVER3='213.73.91.35' NAMESERVER4='85.214.73.63' -NAMESERVER5='8.8.8.8' -NAMESERVER6='4.4.4.4' +NAMESERVER5='84.200.69.80' +NAMESERVER6='84.200.70.40' # An optional freedombone configuration file CONFIG_FILENAME= diff --git a/src/freedombone-image-makefile b/src/freedombone-image-makefile index a8cbe02b..59729f4e 100755 --- a/src/freedombone-image-makefile +++ b/src/freedombone-image-makefile @@ -64,8 +64,8 @@ NAMESERVER1 ?= '213.73.91.35' NAMESERVER2 ?= '85.214.20.141' NAMESERVER3 ?= '213.73.91.35' NAMESERVER4 ?= '85.214.73.63' -NAMESERVER5 ?= '8.8.8.8' -NAMESERVER6 ?= '4.4.4.4' +NAMESERVER5 ?= '84.200.69.80' +NAMESERVER6 ?= '84.200.70.40' # Using taskset to pin build process to single core. This is a # workaround for a qemu-user-static issue that causes builds to diff --git a/src/freedombone-utils-dns b/src/freedombone-utils-dns index 31a30ab7..7c5c5b84 100755 --- a/src/freedombone-utils-dns +++ b/src/freedombone-utils-dns @@ -33,8 +33,8 @@ NAMESERVER1='213.73.91.35' NAMESERVER2='85.214.20.141' NAMESERVER3='213.73.91.35' NAMESERVER4='85.214.73.63' -NAMESERVER5='8.8.8.8' -NAMESERVER6='4.4.4.4' +NAMESERVER5='84.200.69.80' +NAMESERVER6='84.200.70.40' # parameters used when adding a new domain DDNS_PROVIDER="default@freedns.afraid.org" From b584bed3a59f03a64328f5cc2509d4a8cd4ed51a Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 15 Oct 2017 10:18:39 +0100 Subject: [PATCH 02/31] Another DNS option, for added diversity --- src/freedombone-app-pihole | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/freedombone-app-pihole b/src/freedombone-app-pihole index 23f43a80..437a1255 100755 --- a/src/freedombone-app-pihole +++ b/src/freedombone-app-pihole @@ -135,7 +135,7 @@ function pihole_change_upstream_dns { data=$(tempfile 2>/dev/null) trap "rm -f $data" 0 1 2 5 15 dialog --backtitle $"Ad Blocker Upstream DNS" \ - --radiolist $"Pick a domain name service (DNS):" 26 50 17 \ + --radiolist $"Pick a domain name service (DNS):" 27 50 18 \ 1 $"Digital Courage" on \ 2 $"German Privacy Foundation 1" off \ 3 $"German Privacy Foundation 2" off \ @@ -152,7 +152,8 @@ function pihole_change_upstream_dns { 14 $"ValiDOM" off \ 15 $"Freie Unzensierte" off \ 16 $"DNS.Watch" off \ - 17 $"Google" off 2> $data + 17 $"uncensoreddns.org" off \ + 18 $"Google" off 2> $data sel=$? case $sel in 1) exit 1;; @@ -207,7 +208,10 @@ function pihole_change_upstream_dns { 16) PIHOLE_DNS1='84.200.69.80' PIHOLE_DNS2='84.200.70.40' ;; - 17) PIHOLE_DNS1='8.8.8.8' + 17) PIHOLE_DNS1='91.239.100.100' + PIHOLE_DNS2='89.233.43.71' + ;; + 18) PIHOLE_DNS1='8.8.8.8' PIHOLE_DNS2='4.4.4.4' ;; 255) exit 1;; From 45acf8738a6df0d37922ee588a43b6533a393c61 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 15 Oct 2017 10:25:23 +0100 Subject: [PATCH 03/31] Add a scary warning if you choose Google DNS --- src/freedombone-app-pihole | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/freedombone-app-pihole b/src/freedombone-app-pihole index 437a1255..fa095ae3 100755 --- a/src/freedombone-app-pihole +++ b/src/freedombone-app-pihole @@ -213,6 +213,8 @@ function pihole_change_upstream_dns { ;; 18) PIHOLE_DNS1='8.8.8.8' PIHOLE_DNS2='4.4.4.4' + dialog --title $"WARNING" \ + --msgbox $"\nGoogle's main purpose for providing DNS resolvers is to spy upon people and know which sites they are visiting.\n\nThis is something to consider, and you should only really be using Google DNS as a last resort if other resolvers are unavailable." 12 60 ;; 255) exit 1;; esac From f5ddd9ce480732299fc95d3a9e5e3c77ae56505a Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 15 Oct 2017 10:51:49 +0100 Subject: [PATCH 04/31] Another dns resolver --- src/freedombone-app-pihole | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/freedombone-app-pihole b/src/freedombone-app-pihole index fa095ae3..0ce715a0 100755 --- a/src/freedombone-app-pihole +++ b/src/freedombone-app-pihole @@ -135,7 +135,7 @@ function pihole_change_upstream_dns { data=$(tempfile 2>/dev/null) trap "rm -f $data" 0 1 2 5 15 dialog --backtitle $"Ad Blocker Upstream DNS" \ - --radiolist $"Pick a domain name service (DNS):" 27 50 18 \ + --radiolist $"Pick a domain name service (DNS):" 28 50 19 \ 1 $"Digital Courage" on \ 2 $"German Privacy Foundation 1" off \ 3 $"German Privacy Foundation 2" off \ @@ -153,7 +153,8 @@ function pihole_change_upstream_dns { 15 $"Freie Unzensierte" off \ 16 $"DNS.Watch" off \ 17 $"uncensoreddns.org" off \ - 18 $"Google" off 2> $data + 18 $"Lorraine Data Network" off \ + 19 $"Google" off 2> $data sel=$? case $sel in 1) exit 1;; @@ -211,7 +212,10 @@ function pihole_change_upstream_dns { 17) PIHOLE_DNS1='91.239.100.100' PIHOLE_DNS2='89.233.43.71' ;; - 18) PIHOLE_DNS1='8.8.8.8' + 18) PIHOLE_DNS1='80.67.188.188' + PIHOLE_DNS2='89.234.141.66' + ;; + 19) PIHOLE_DNS1='8.8.8.8' PIHOLE_DNS2='4.4.4.4' dialog --title $"WARNING" \ --msgbox $"\nGoogle's main purpose for providing DNS resolvers is to spy upon people and know which sites they are visiting.\n\nThis is something to consider, and you should only really be using Google DNS as a last resort if other resolvers are unavailable." 12 60 From 82842b0ccbddf098cdf9f55fb9bf1337f329b2fb Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 15 Oct 2017 11:25:52 +0100 Subject: [PATCH 05/31] Missing bracket --- doc/EN/index.org | 2 +- website/EN/index.html | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/EN/index.org b/doc/EN/index.org index 893757a5..2c31773d 100644 --- a/doc/EN/index.org +++ b/doc/EN/index.org @@ -45,7 +45,7 @@ After installation it's possible that you might want some advice on how to run y If you find bugs, or want to add a new app to this system see the [[./devguide.html][Developers Guide]]. -Ready made disk images which can be copied onto USB or microSD drives are [[./downloads/v3][available here]. +Ready made disk images which can be copied onto USB or microSD drives are [[./downloads/v3][available here]]. #+BEGIN_CENTER This site can also be accessed via a Tor browser at http://pazyv7nkllp76hqr.onion. This documentation is under the [[https://www.gnu.org/licenses/fdl-1.3.txt][GNU Free Documentation License version 1.3]] diff --git a/website/EN/index.html b/website/EN/index.html index 4ad49b2e..215f5992 100644 --- a/website/EN/index.html +++ b/website/EN/index.html @@ -3,7 +3,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + @@ -300,7 +300,7 @@ If you find bugs, or want to add a new app to this system see the available here.

From 080eb8e947f850a817f4a433bf21ff93199f9097 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 15 Oct 2017 11:27:22 +0100 Subject: [PATCH 06/31] Use current directory for images --- doc/EN/index.org | 2 +- website/EN/index.html | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/EN/index.org b/doc/EN/index.org index 2c31773d..f48edf86 100644 --- a/doc/EN/index.org +++ b/doc/EN/index.org @@ -45,7 +45,7 @@ After installation it's possible that you might want some advice on how to run y If you find bugs, or want to add a new app to this system see the [[./devguide.html][Developers Guide]]. -Ready made disk images which can be copied onto USB or microSD drives are [[./downloads/v3][available here]]. +Ready made disk images which can be copied onto USB or microSD drives are [[./downloads/current][available here]]. #+BEGIN_CENTER This site can also be accessed via a Tor browser at http://pazyv7nkllp76hqr.onion. This documentation is under the [[https://www.gnu.org/licenses/fdl-1.3.txt][GNU Free Documentation License version 1.3]] diff --git a/website/EN/index.html b/website/EN/index.html index 215f5992..b72e8704 100644 --- a/website/EN/index.html +++ b/website/EN/index.html @@ -3,7 +3,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + @@ -300,7 +300,7 @@ If you find bugs, or want to add a new app to this system see the available here. +Ready made disk images which can be copied onto USB or microSD drives are available here.

From 15d003e3f118adfc6cf697bc6d14db38358fac09 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 15 Oct 2017 23:48:01 +0100 Subject: [PATCH 07/31] Remove package check --- src/freedombone-utils-guile | 1 + 1 file changed, 1 insertion(+) diff --git a/src/freedombone-utils-guile b/src/freedombone-utils-guile index 16e9756c..752cfac8 100755 --- a/src/freedombone-utils-guile +++ b/src/freedombone-utils-guile @@ -50,6 +50,7 @@ function install_8sync { export GUILE_CFLAGS="-I${GUILE_BASE_PATH}/include" export GUILE_LIBS="-L${GUILE_BASE_PATH}/lib -lguile -lqthreads -ldl -ltermcap -lsocket -lnsl -lm" ./bootstrap.sh + sed -i 's|PKG_CHECK_MODULES|##PKG_CHECK_MODULES|g' configure configure make make install From 1bbbda7c07d5dbbf4f562a64481c85572aa819ed Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 23 Oct 2017 18:39:29 +0100 Subject: [PATCH 08/31] Install cryptpad on mesh clients --- src/freedombone-app-cryptpad | 156 ++++++++++++++++++++++++++++++++ src/freedombone-image-customise | 1 + src/freedombone-image-mesh | 22 +++++ src/freedombone-utils-guile | 1 + 4 files changed, 180 insertions(+) diff --git a/src/freedombone-app-cryptpad b/src/freedombone-app-cryptpad index 135fa962..83b7d257 100755 --- a/src/freedombone-app-cryptpad +++ b/src/freedombone-app-cryptpad @@ -215,6 +215,162 @@ function remove_cryptpad { userdel -r cryptpad } +function mesh_install_cryptpad { + if [[ $VARIANT != "meshclient" && $VARIANT != "meshusb" ]]; then + return + fi + + if [ ! -d $rootdir/var/www/cryptpad ]; then + mkdir $rootdir/var/www/cryptpad + fi + if [ -d $rootdir$CRYPTPAD_DIR ]; then + rm -rf $rootdir$CRYPTPAD_DIR + fi + + git_clone $CRYPTPAD_REPO $rootdir$CRYPTPAD_DIR + + if [ ! -d $rootdir$CRYPTPAD_DIR ]; then + echo $'Unable to clone cryptpad repo' + exit 783251 + fi + + # an unprivileged user to run as + chroot "$rootdir" useradd -d $CRYPTPAD_DIR/ cryptpad + + cd $rootdir$CRYPTPAD_DIR + git checkout $CRYPTPAD_COMMIT -b $CRYPTPAD_COMMIT + + chroot "$rootdir" chown -R cryptpad:cryptpad $CRYPTPAD_DIR + + cryptpad_nginx_site=$rootdir/etc/nginx/sites-available/cryptpad + echo 'server {' > $cryptpad_nginx_site + echo " listen 80 default_server;" >> $cryptpad_nginx_site + echo " server_name P${PEER_ID}.local;" >> $cryptpad_nginx_site + echo '' >> $cryptpad_nginx_site + echo ' # Logs' >> $cryptpad_nginx_site + echo ' access_log /dev/null;' >> $cryptpad_nginx_site + echo ' error_log /dev/null;' >> $cryptpad_nginx_site + echo '' >> $cryptpad_nginx_site + echo ' # Root' >> $cryptpad_nginx_site + echo " root $CRYPTPAD_DIR;" >> $cryptpad_nginx_site + echo '' >> $cryptpad_nginx_site + echo ' index index.html;' >> $cryptpad_nginx_site + echo '' >> $cryptpad_nginx_site + echo ' add_header X-XSS-Protection "1; mode=block";' >> $cryptpad_nginx_site + echo ' add_header X-Content-Type-Options nosniff;' >> $cryptpad_nginx_site + echo ' add_header X-Frame-Options SAMEORIGIN;' >> $cryptpad_nginx_site + echo '' >> $cryptpad_nginx_site + echo ' if ($uri = /pad/inner.html) {' >> $cryptpad_nginx_site + echo " set \$scriptSrc \"'self' 'unsafe-eval' 'unsafe-inline'\";" >> $cryptpad_nginx_site + echo ' }' >> $cryptpad_nginx_site + echo '' >> $cryptpad_nginx_site + echo ' location = /cryptpad_websocket {' >> $cryptpad_nginx_site + echo " proxy_pass http://localhost:$CRYPTPAD_PORT;" >> $cryptpad_nginx_site + echo ' proxy_set_header X-Real-IP $remote_addr;' >> $cryptpad_nginx_site + echo ' proxy_set_header Host $host;' >> $cryptpad_nginx_site + echo ' proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;' >> $cryptpad_nginx_site + echo '' >> $cryptpad_nginx_site + echo ' # WebSocket support (nginx 1.4)' >> $cryptpad_nginx_site + echo ' proxy_http_version 1.1;' >> $cryptpad_nginx_site + echo ' proxy_set_header Upgrade $http_upgrade;' >> $cryptpad_nginx_site + echo ' proxy_set_header Connection upgrade;' >> $cryptpad_nginx_site + echo ' }' >> $cryptpad_nginx_site + echo '' >> $cryptpad_nginx_site + + echo ' location ^~ /customize.dist/ {' >> $cryptpad_nginx_site + echo ' # This is needed in order to prevent infinite recursion between /customize/ and the root' >> $cryptpad_nginx_site + echo ' }' >> $cryptpad_nginx_site + echo ' location ^~ /customize/ {' >> $cryptpad_nginx_site + echo ' rewrite ^/customize/(.*)$ $1 break;' >> $cryptpad_nginx_site + echo ' try_files /customize/$uri /customize.dist/$uri;' >> $cryptpad_nginx_site + echo ' }' >> $cryptpad_nginx_site + echo ' location = /api/config {' >> $cryptpad_nginx_site + echo ' default_type text/javascript;' >> $cryptpad_nginx_site + echo ' rewrite ^.*$ /customize/api/config break;' >> $cryptpad_nginx_site + echo ' }' >> $cryptpad_nginx_site + echo '' >> $cryptpad_nginx_site + echo ' location ^~ /blob/ {' >> $cryptpad_nginx_site + echo ' try_files $uri =404;' >> $cryptpad_nginx_site + echo ' }' >> $cryptpad_nginx_site + echo '' >> $cryptpad_nginx_site + echo ' location ^~ /register/ {' >> $cryptpad_nginx_site + echo ' try_files $uri =404;' >> $cryptpad_nginx_site + echo ' }' >> $cryptpad_nginx_site + echo '' >> $cryptpad_nginx_site + echo ' location ^~ /login/ {' >> $cryptpad_nginx_site + echo ' try_files $uri =404;' >> $cryptpad_nginx_site + echo ' }' >> $cryptpad_nginx_site + echo '' >> $cryptpad_nginx_site + echo ' location ^~ /about.html {' >> $cryptpad_nginx_site + echo ' try_files $uri =404;' >> $cryptpad_nginx_site + echo ' }' >> $cryptpad_nginx_site + echo '' >> $cryptpad_nginx_site + echo ' location ^~ /contact.html {' >> $cryptpad_nginx_site + echo ' try_files $uri =404;' >> $cryptpad_nginx_site + echo ' }' >> $cryptpad_nginx_site + echo '' >> $cryptpad_nginx_site + echo ' location ^~ /contact.html {' >> $cryptpad_nginx_site + echo ' try_files $uri =404;' >> $cryptpad_nginx_site + echo ' }' >> $cryptpad_nginx_site + echo '' >> $cryptpad_nginx_site + echo ' location ^~ /what-is-cryptpad.html {' >> $cryptpad_nginx_site + echo ' try_files $uri =404;' >> $cryptpad_nginx_site + echo ' }' >> $cryptpad_nginx_site + echo '' >> $cryptpad_nginx_site + echo ' location ~ ^/(register|login|settings|user|pad|drive|poll|slide|code|whiteboard|file|media)$ {' >> $cryptpad_nginx_site + echo ' rewrite ^(.*)$ $1/ redirect;' >> $cryptpad_nginx_site + echo ' }' >> $cryptpad_nginx_site + echo '' >> $cryptpad_nginx_site + echo ' try_files /www/$uri /www/$uri/index.html /customize/$uri;' >> $cryptpad_nginx_site + echo '}' >> $cryptpad_nginx_site + ln -s $cryptpad_nginx_site $rootdir/etc/nginx/sites-enabled/cryptpad + + cd $rootdir$CRYPTPAD_DIR + + get_npm_arch + + cat < $rootdir/usr/bin/install_cryptpad +#!/bin/bash +cd $CRYPTPAD_DIR +npm install --arch=$NPM_ARCH --build-from-source +npm install --arch=$NPM_ARCH -g bower@1.8.0 +chown -R cryptpad:cryptpad $CRYPTPAD_DIR +su -c 'bower install' - cryptpad +cp config.example.js config.js +EOF + + if [ ! -f $rootdir$CRYPTPAD_DIR/config.js ]; then + echo $'Cryptpad config file not found' + exit 628252 + fi + + sed -i "s|httpPort:.*|httpPort: $CRYPTPAD_PORT,|g" $rootdir$CRYPTPAD_DIR/config.js + sed -i "s|// domain:|domain:|g" $rootdir$CRYPTPAD_DIR/config.js + sed -i 's|openFileLimit:.*|openFileLimit: 1024,|g' $rootdir$CRYPTPAD_DIR/config.js + sed -i "s|domain:.*|domain: 'http://P${PEER_ID}.local',|g" $rootdir$CRYPTPAD_DIR/config.js + + chroot "$rootdir" chown -R cryptpad:cryptpad $CRYPTPAD_DIR + + # daemon + echo '[Unit]' > $rootdir/etc/systemd/system/cryptpad.service + echo 'Description=Cryptpad' >> $rootdir/etc/systemd/system/cryptpad.service + echo 'After=syslog.target' >> $rootdir/etc/systemd/system/cryptpad.service + echo 'After=network.target' >> $rootdir/etc/systemd/system/cryptpad.service + echo '' >> $rootdir/etc/systemd/system/cryptpad.service + echo '[Service]' >> $rootdir/etc/systemd/system/cryptpad.service + echo 'User=cryptpad' >> $rootdir/etc/systemd/system/cryptpad.service + echo 'Group=cryptpad' >> $rootdir/etc/systemd/system/cryptpad.service + echo "WorkingDirectory=$CRYPTPAD_DIR" >> $rootdir/etc/systemd/system/cryptpad.service + echo "ExecStart=/usr/local/bin/node $CRYPTPAD_DIR/server.js" >> $rootdir/etc/systemd/system/cryptpad.service + echo 'Environment=PATH=/usr/bin:/usr/local/bin' >> $rootdir/etc/systemd/system/cryptpad.service + echo 'Environment=NODE_ENV=production' >> $rootdir/etc/systemd/system/cryptpad.service + echo 'Restart=on-failure' >> $rootdir/etc/systemd/system/cryptpad.service + echo '' >> $rootdir/etc/systemd/system/cryptpad.service + echo '[Install]' >> $rootdir/etc/systemd/system/cryptpad.service + echo 'WantedBy=multi-user.target' >> $rootdir/etc/systemd/system/cryptpad.service + chroot "$rootdir" systemctl enable cryptpad.service +} + function install_cryptpad_main { if [[ $(app_is_installed cryptpad_main) == "1" ]]; then return diff --git a/src/freedombone-image-customise b/src/freedombone-image-customise index 2c8769e1..ce92d438 100755 --- a/src/freedombone-image-customise +++ b/src/freedombone-image-customise @@ -697,6 +697,7 @@ initialise_mesh() { install_tox install_web_server install_pelican + mesh_install_cryptpad if [ $ENABLE_ZERONET ]; then install_zeronet fi diff --git a/src/freedombone-image-mesh b/src/freedombone-image-mesh index a9699a34..783f6375 100755 --- a/src/freedombone-image-mesh +++ b/src/freedombone-image-mesh @@ -85,6 +85,24 @@ VPN_MESH_TLS_PORT=653 SCUTTLEBOT_PORT=8010 +CRYPTPAD_PORT=9003 +CRYPTPAD_DIR=/etc/cryptpad + +function enable_cryptpad { + if [ ! -d $CRYPTPAD_DIR ]; then + return + fi + if [ ! -d $CRYPTPAD_DIR/customize/api ]; then + mkdir -p $CRYPTPAD_DIR/customize/api + fi + wget 127.0.0.1:$CRYPTPAD_PORT/api/config -O $CRYPTPAD_DIR/customize/api/config + if [ ! -f $CRYPTPAD_DIR/customize/api/config ]; then + echo $'Unable to wget api/config' + exit 89252 + fi + chown -R cryptpad:cryptpad $CRYPTPAD_DIR +} + # Debian stretch has a problem where the formerly predictable wlan0 and eth0 # device names get assigned random names. This is a hacky workaround. # Also adding net.ifnames=0 to kernel options on bootloader may work. @@ -873,12 +891,16 @@ if [ -f $MESH_INSTALL_SETUP ]; then #create_ram_disk 1 #setup_amnesic_data change_avahi_name + if [ -d $CRYPTPAD_DIR ]; then + systemctl start cryptpad + fi configure_toxcore create_tox_user #setup_tahoelafs mesh_setup_vpn initialise_scuttlebot_pub setup_ipfs + enable_cryptpad mesh_amnesic make_root_read_only diff --git a/src/freedombone-utils-guile b/src/freedombone-utils-guile index 752cfac8..3f22334a 100755 --- a/src/freedombone-utils-guile +++ b/src/freedombone-utils-guile @@ -54,6 +54,7 @@ function install_8sync { configure make make install + export GUILE_LOAD_COMPILED_PATH="$INSTALL_DIR/8sync" } function install_guile { From 8f13c6e193301e57603fb1d2597882c61ba6a0f0 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 23 Oct 2017 20:12:10 +0100 Subject: [PATCH 09/31] Preparing for cryptpad icon --- src/freedombone-app-cryptpad | 3 +++ src/freedombone-image-customise | 17 +++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/freedombone-app-cryptpad b/src/freedombone-app-cryptpad index 83b7d257..9f8c30b8 100755 --- a/src/freedombone-app-cryptpad +++ b/src/freedombone-app-cryptpad @@ -226,6 +226,9 @@ function mesh_install_cryptpad { if [ -d $rootdir$CRYPTPAD_DIR ]; then rm -rf $rootdir$CRYPTPAD_DIR fi + if [ -f $rootdir/root/$PROJECT_NAME/img/icon_cryptpad.png ]; then + cp $rootdir/root/$PROJECT_NAME/img/icon_cryptpad.png $rootdir/etc/cryptpad/icon_cryptpad.png + fi git_clone $CRYPTPAD_REPO $rootdir$CRYPTPAD_DIR diff --git a/src/freedombone-image-customise b/src/freedombone-image-customise index ce92d438..70c1ad8b 100755 --- a/src/freedombone-image-customise +++ b/src/freedombone-image-customise @@ -928,6 +928,23 @@ if [ \$no_of_users -gt 0 ]; then chmod +x /home/$MY_USERNAME/Desktop/Users.desktop chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Desktop/Users.desktop + if [ ! -f /home/$MY_USERNAME/Desktop/cryptpad.desktop ]; then + echo '[Desktop Entry]' > /home/$MY_USERNAME/Desktop/cryptpad.desktop + echo 'Name=CryptPad' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop + echo 'Type=Application' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop + echo 'Comment=Realtime collaborative editing of documents' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop + echo "Exec=$BROWSER http://127.0.0.1" >> /home/$MY_USERNAME/Desktop/cryptpad.desktop + echo "Icon=/etc/cryptpad/icon_cryptpad.png" >> /home/$MY_USERNAME/Desktop/cryptpad.desktop + echo 'Terminal=false' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop + echo 'Categories=Application;' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop + chmod +x /home/$MY_USERNAME/Desktop/cryptpad.desktop + chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Desktop/cryptpad.desktop + else + if grep -q "Offline" /home/$MY_USERNAME/Desktop/cryptpad.desktop; then + sed -i 's|Name=.*|Name=CryptPad|g' /home/$MY_USERNAME/Desktop/cryptpad.desktop + fi + fi + if [ ! -f /home/$MY_USERNAME/Desktop/social.desktop ]; then echo '[Desktop Entry]' > /home/$MY_USERNAME/Desktop/social.desktop echo 'Name=Social' >> /home/$MY_USERNAME/Desktop/social.desktop From 7f8609a3aa57481c4730dbd1fb3853220378ade4 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 23 Oct 2017 20:24:09 +0100 Subject: [PATCH 10/31] Importing gpg full public keys from the control panel --- src/freedombone-controlpanel-user | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/freedombone-controlpanel-user b/src/freedombone-controlpanel-user index 5f4fb93c..42487622 100755 --- a/src/freedombone-controlpanel-user +++ b/src/freedombone-controlpanel-user @@ -439,7 +439,7 @@ function add_gpg_key { trap "rm -f $data" 0 1 2 5 15 dialog --title $"Add someone's PGP/GPG key" \ --backtitle $"Freedombone User Control Panel" \ - --inputbox $"Enter their email address or Key ID below" 8 60 2>$data + --inputbox $"Enter their email address, Key ID or full key below" 8 60 2>$data sel=$? case $sel in 0) @@ -448,18 +448,29 @@ function add_gpg_key { address_is_valid= - if [[ $ADD_EMAIL_ADDRESS == *"@"* && $ADD_EMAIL_ADDRESS == *"."* ]]; then + if [[ "$ADD_EMAIL_ADDRESS" == *"@"* && "$ADD_EMAIL_ADDRESS" == *"."* ]]; then address_is_valid=1 - else - if [[ $ADD_EMAIL_ADDRESS == "0x"* ]]; then - address_is_valid=1 - fi fi + if [[ "$ADD_EMAIL_ADDRESS" == "0x"* ]]; then + address_is_valid=1 + fi + publicstr=$"BEGIN PGP PUBLIC KEY BLOCK" + if [[ "$ADD_EMAIL_ADDRESS" == *"$publicstr"* ]]; then + address_is_valid=1 + fi + if [ $address_is_valid ]; then clear - gpg --search-keys "$ADD_EMAIL_ADDRESS" - gpg_set_trust "$ADD_EMAIL_ADDRESS" + if [[ "$ADD_EMAIL_ADDRESS" == *"$publicstr"* ]]; then + echo "$ADD_EMAIL_ADDRESS" | gpg --import + dialog --title $"Add someone's PGP/GPG key" \ + --backtitle $"Freedombone User Control Panel" \ + --msgbox $"GPG public key was imported" 6 50 + else + gpg --search-keys "$ADD_EMAIL_ADDRESS" + gpg_set_trust "$ADD_EMAIL_ADDRESS" + fi else dialog --title $"Unrecognised email address" \ --backtitle $"Freedombone User Control Panel" \ From 66595013373c187031ed73caccf8d7fa3b90db2d Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 23 Oct 2017 20:28:04 +0100 Subject: [PATCH 11/31] Extra large input box --- src/freedombone-controlpanel-user | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/freedombone-controlpanel-user b/src/freedombone-controlpanel-user index 42487622..10fb31af 100755 --- a/src/freedombone-controlpanel-user +++ b/src/freedombone-controlpanel-user @@ -439,7 +439,7 @@ function add_gpg_key { trap "rm -f $data" 0 1 2 5 15 dialog --title $"Add someone's PGP/GPG key" \ --backtitle $"Freedombone User Control Panel" \ - --inputbox $"Enter their email address, Key ID or full key below" 8 60 2>$data + --inputbox $"Enter their email address, Key ID or full key below" 8 999999 2>$data sel=$? case $sel in 0) From 75b72cb787344636f79023ff5493e6b1942674da Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 23 Oct 2017 21:05:15 +0100 Subject: [PATCH 12/31] Use editbox --- src/freedombone-controlpanel-user | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/freedombone-controlpanel-user b/src/freedombone-controlpanel-user index 10fb31af..59db36a8 100755 --- a/src/freedombone-controlpanel-user +++ b/src/freedombone-controlpanel-user @@ -437,9 +437,9 @@ function refresh_gpg_keys { function add_gpg_key { data=$(tempfile 2>/dev/null) trap "rm -f $data" 0 1 2 5 15 - dialog --title $"Add someone's PGP/GPG key" \ + dialog --title $"Enter email address, Key ID or full key below" \ --backtitle $"Freedombone User Control Panel" \ - --inputbox $"Enter their email address, Key ID or full key below" 8 999999 2>$data + --editbox $data 8 60 sel=$? case $sel in 0) @@ -459,7 +459,6 @@ function add_gpg_key { address_is_valid=1 fi - if [ $address_is_valid ]; then clear if [[ "$ADD_EMAIL_ADDRESS" == *"$publicstr"* ]]; then @@ -479,6 +478,7 @@ function add_gpg_key { fi ;; esac + rm $data } function remove_gpg_key { From e928240e98131449c339f9a86bfebc78bd760df3 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 23 Oct 2017 21:09:12 +0100 Subject: [PATCH 13/31] Save public key to file --- src/freedombone-controlpanel-user | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/freedombone-controlpanel-user b/src/freedombone-controlpanel-user index 59db36a8..3f257aad 100755 --- a/src/freedombone-controlpanel-user +++ b/src/freedombone-controlpanel-user @@ -439,7 +439,7 @@ function add_gpg_key { trap "rm -f $data" 0 1 2 5 15 dialog --title $"Enter email address, Key ID or full key below" \ --backtitle $"Freedombone User Control Panel" \ - --editbox $data 8 60 + --editbox $data 8 60 2>$data sel=$? case $sel in 0) From 333c4d7656e4313ff89fd4d8c3f508ecefd4a5f0 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 23 Oct 2017 23:13:13 +0100 Subject: [PATCH 14/31] cryptpad icon --- img/icon_cryptpad.png | Bin 0 -> 1792 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 img/icon_cryptpad.png diff --git a/img/icon_cryptpad.png b/img/icon_cryptpad.png new file mode 100644 index 0000000000000000000000000000000000000000..9f7714fe511c2fb83cbf6fa96870768be7fa2403 GIT binary patch literal 1792 zcmah~XH?UN77rtX05ygU0slZsnH7DqSAq#7h=dXGAs`WyjnWX2AvGijK~|WGl^sPM zP(ij>P@oLiNXslT0x}wwAYoLR9>4V4yXW5DI`^FW@g_Pt*h<0`;UEx5l1RWg3%FY_ z+b|IUTKPr!3CPpYo{Yz*cL>@ev+1k&H|FN%{@V)l*F=E-x4tfyG$~gI4hhkm9b7<| zrE%YXjQ0gw9Eb&0CJ2mJD8VfZ1QM6}XM{kHpU4YBD2;d#51oU{$x5j0^>t{2KoArW zhb2c$^75uqON}9*?fdk8<8=c_z9w)u|FMGIP^HA^{NbBMx-( zf1;KVtu6)kH?tHi}+A~3S)18hMt{b1eN+dLl)IWT*}6R>xcx;moIKT8rGO8xfk&x`Eu?$F1TAgM!&qXX!K_F{xS* zM}K+un`7BfVUu9&7bmIPV})Wb59bq)_lN8khrn1rih{qCVkAimGO^$vh7{USi14V8LJ#BC_r^oCzjhw z=SK6=g`V=4p13oP`m#Y9(@A^_BS=rH#K#)fiy*e{WZWVO%8lU6er`08?sk$F4`d#D zNe;>b`_TE_m0AW$6zxNcui19OI@i7X33i#BY?_%Y+| z6I<)a00VHO2qoSuiTR3!bZTX!g@MRkKJ0sAUnifmPV9Eg33!D($FPbDv!7_muJ8e)~_K8qtshl>!J z0^9$i`a_fDlM<7tJ#xcByW{XxW+XdMXd4mYlUqqSc9N9grt+uXK)I@S50~ngLM*aP z#7pPm6WfTS_=+4yNKeK4=}%d+lyg{WPQjS8&buE0H_14cY!#MT*AJc(P;?MOKk&Wq z@S-O9ArA{rwQ6xM;;%Q6&L--?4B5K6FCg1H!jX#1>!;ZjBGe>tYPrWXgE{9B6;70k zcLA{3DnxX`W*}KprrR#!*HfB+Z+66ueHfJDQJ%XYj}AXumeGw_XT%j^^8?-aYBO>K z%%+i5VAx%`>zGb#W83!6Nn4Y~q#+3L(l1hEUhsY)ShGoCpnYiT={TCd`D_T?JnPz4 zqov>F7JPvOWGaSF$Dw9ol(KyaW&ay(PZ%Hgm8FeGPjsELPD5+oaexAIkSs>J{~!5( zJjNmV5sBAFn=OB$sa8W1Hapj=&!_66OI~M|!WMAfvOs84)rx*%tuP^lxO3F-?eNY_ z25#(*88T$B`(D&=y<02TC5iLMI0WO(9m(tHyH+&c5AiVwZsb0acK7-b{d<1Ki3dz2 zxr};;(ayVDr^akbYe}ZNgFQiL4HuHue!pgBUJbS1&{oJ5oxk!t(*CV>$ZV}gN#zkI zc?7Lo`jct?TIM@QRXry@V{)-%wLss~q0;2R@e88(Tt%wFYuzHJrG+$}%OUOPpV$7 zM>1>WO0z>+;4qK-CBsnXo9^8TuWEHT3o!7j`u?Q()B3hnA Date: Tue, 24 Oct 2017 11:05:35 +0100 Subject: [PATCH 15/31] Copy icon after directory creation --- src/freedombone-app-cryptpad | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/freedombone-app-cryptpad b/src/freedombone-app-cryptpad index 9f8c30b8..c675a1b3 100755 --- a/src/freedombone-app-cryptpad +++ b/src/freedombone-app-cryptpad @@ -226,9 +226,6 @@ function mesh_install_cryptpad { if [ -d $rootdir$CRYPTPAD_DIR ]; then rm -rf $rootdir$CRYPTPAD_DIR fi - if [ -f $rootdir/root/$PROJECT_NAME/img/icon_cryptpad.png ]; then - cp $rootdir/root/$PROJECT_NAME/img/icon_cryptpad.png $rootdir/etc/cryptpad/icon_cryptpad.png - fi git_clone $CRYPTPAD_REPO $rootdir$CRYPTPAD_DIR @@ -237,6 +234,10 @@ function mesh_install_cryptpad { exit 783251 fi + if [ -f $rootdir/root/$PROJECT_NAME/img/icon_cryptpad.png ]; then + cp $rootdir/root/$PROJECT_NAME/img/icon_cryptpad.png $rootdir$CRYPTPAD_DIR/icon_cryptpad.png + fi + # an unprivileged user to run as chroot "$rootdir" useradd -d $CRYPTPAD_DIR/ cryptpad From 25dfda1493d7f5d8fb44eedc32ca3f6f81cff383 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 24 Oct 2017 11:30:46 +0100 Subject: [PATCH 16/31] Run cryptpad install script for mesh --- src/freedombone-app-cryptpad | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/freedombone-app-cryptpad b/src/freedombone-app-cryptpad index c675a1b3..88ea5c11 100755 --- a/src/freedombone-app-cryptpad +++ b/src/freedombone-app-cryptpad @@ -342,12 +342,16 @@ chown -R cryptpad:cryptpad $CRYPTPAD_DIR su -c 'bower install' - cryptpad cp config.example.js config.js EOF + chmod +x $rootdir/usr/bin/install_cryptpad + chroor "$rootdir" /usr/bin/install_cryptpad if [ ! -f $rootdir$CRYPTPAD_DIR/config.js ]; then echo $'Cryptpad config file not found' exit 628252 fi + rm $rootdir/usr/bin/install_cryptpad + sed -i "s|httpPort:.*|httpPort: $CRYPTPAD_PORT,|g" $rootdir$CRYPTPAD_DIR/config.js sed -i "s|// domain:|domain:|g" $rootdir$CRYPTPAD_DIR/config.js sed -i 's|openFileLimit:.*|openFileLimit: 1024,|g' $rootdir$CRYPTPAD_DIR/config.js From feb629211f5192b466a7b5b0b82941704633642c Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 24 Oct 2017 11:31:43 +0100 Subject: [PATCH 17/31] Typo --- src/freedombone-app-cryptpad | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/freedombone-app-cryptpad b/src/freedombone-app-cryptpad index 88ea5c11..301f4f67 100755 --- a/src/freedombone-app-cryptpad +++ b/src/freedombone-app-cryptpad @@ -343,7 +343,7 @@ su -c 'bower install' - cryptpad cp config.example.js config.js EOF chmod +x $rootdir/usr/bin/install_cryptpad - chroor "$rootdir" /usr/bin/install_cryptpad + chroot "$rootdir" /usr/bin/install_cryptpad if [ ! -f $rootdir$CRYPTPAD_DIR/config.js ]; then echo $'Cryptpad config file not found' From 92bb07ce341f9304613f3d070a854283bd63fa2b Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 24 Oct 2017 13:30:57 +0100 Subject: [PATCH 18/31] Duplicate entry --- src/freedombone-app-cryptpad | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/freedombone-app-cryptpad b/src/freedombone-app-cryptpad index 301f4f67..6528b1fb 100755 --- a/src/freedombone-app-cryptpad +++ b/src/freedombone-app-cryptpad @@ -313,10 +313,6 @@ function mesh_install_cryptpad { echo ' try_files $uri =404;' >> $cryptpad_nginx_site echo ' }' >> $cryptpad_nginx_site echo '' >> $cryptpad_nginx_site - echo ' location ^~ /contact.html {' >> $cryptpad_nginx_site - echo ' try_files $uri =404;' >> $cryptpad_nginx_site - echo ' }' >> $cryptpad_nginx_site - echo '' >> $cryptpad_nginx_site echo ' location ^~ /what-is-cryptpad.html {' >> $cryptpad_nginx_site echo ' try_files $uri =404;' >> $cryptpad_nginx_site echo ' }' >> $cryptpad_nginx_site @@ -484,10 +480,6 @@ function install_cryptpad_main { echo ' try_files $uri =404;' >> $cryptpad_nginx_site echo ' }' >> $cryptpad_nginx_site echo '' >> $cryptpad_nginx_site - echo ' location ^~ /contact.html {' >> $cryptpad_nginx_site - echo ' try_files $uri =404;' >> $cryptpad_nginx_site - echo ' }' >> $cryptpad_nginx_site - echo '' >> $cryptpad_nginx_site echo ' location ^~ /what-is-cryptpad.html {' >> $cryptpad_nginx_site echo ' try_files $uri =404;' >> $cryptpad_nginx_site echo ' }' >> $cryptpad_nginx_site From 460eece8cfcc481cae3db8d90384744787336557 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 24 Oct 2017 13:34:17 +0100 Subject: [PATCH 19/31] Link within chroot --- src/freedombone-app-cryptpad | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/freedombone-app-cryptpad b/src/freedombone-app-cryptpad index 6528b1fb..4ac6c6bb 100755 --- a/src/freedombone-app-cryptpad +++ b/src/freedombone-app-cryptpad @@ -323,7 +323,7 @@ function mesh_install_cryptpad { echo '' >> $cryptpad_nginx_site echo ' try_files /www/$uri /www/$uri/index.html /customize/$uri;' >> $cryptpad_nginx_site echo '}' >> $cryptpad_nginx_site - ln -s $cryptpad_nginx_site $rootdir/etc/nginx/sites-enabled/cryptpad + chroot "$rootdir" ln -s /etc/nginx/sites-available/cryptpad /etc/nginx/sites-enabled/cryptpad cd $rootdir$CRYPTPAD_DIR From 14e21bc6ddc0495e4f5f5e15a6ae3b6b8b3b74a0 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 24 Oct 2017 13:53:27 +0100 Subject: [PATCH 20/31] Set up the web server for cryptpad on the mesh --- src/freedombone-app-cryptpad | 1 - src/freedombone-image-mesh | 5 +++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/freedombone-app-cryptpad b/src/freedombone-app-cryptpad index 4ac6c6bb..5f648627 100755 --- a/src/freedombone-app-cryptpad +++ b/src/freedombone-app-cryptpad @@ -323,7 +323,6 @@ function mesh_install_cryptpad { echo '' >> $cryptpad_nginx_site echo ' try_files /www/$uri /www/$uri/index.html /customize/$uri;' >> $cryptpad_nginx_site echo '}' >> $cryptpad_nginx_site - chroot "$rootdir" ln -s /etc/nginx/sites-available/cryptpad /etc/nginx/sites-enabled/cryptpad cd $rootdir$CRYPTPAD_DIR diff --git a/src/freedombone-image-mesh b/src/freedombone-image-mesh index 783f6375..ad9e6604 100755 --- a/src/freedombone-image-mesh +++ b/src/freedombone-image-mesh @@ -92,6 +92,11 @@ function enable_cryptpad { if [ ! -d $CRYPTPAD_DIR ]; then return fi + + # Set up the web server + ln -s /etc/nginx/sites-available/cryptpad /etc/nginx/sites-enabled/cryptpad + rm /etc/nginx/sites-enabled/default + if [ ! -d $CRYPTPAD_DIR/customize/api ]; then mkdir -p $CRYPTPAD_DIR/customize/api fi From ce49d06d1837e38bc602b3eb8471de25cdb6cbda Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 24 Oct 2017 14:05:26 +0100 Subject: [PATCH 21/31] Use hostname when opening cryptpad from desktop icon So that copying and pasting a link to a document makes sense --- src/freedombone-image-customise | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/freedombone-image-customise b/src/freedombone-image-customise index 70c1ad8b..1fa38c24 100755 --- a/src/freedombone-image-customise +++ b/src/freedombone-image-customise @@ -933,13 +933,16 @@ if [ \$no_of_users -gt 0 ]; then echo 'Name=CryptPad' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop echo 'Type=Application' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop echo 'Comment=Realtime collaborative editing of documents' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop - echo "Exec=$BROWSER http://127.0.0.1" >> /home/$MY_USERNAME/Desktop/cryptpad.desktop + echo "Exec=$BROWSER http://${HOSTNAME}.local" >> /home/$MY_USERNAME/Desktop/cryptpad.desktop echo "Icon=/etc/cryptpad/icon_cryptpad.png" >> /home/$MY_USERNAME/Desktop/cryptpad.desktop echo 'Terminal=false' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop echo 'Categories=Application;' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop chmod +x /home/$MY_USERNAME/Desktop/cryptpad.desktop chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Desktop/cryptpad.desktop else + if ! grep -q "${HOSTNAME}.local" /home/$MY_USERNAME/Desktop/cryptpad.desktop; then + sed -i "s|Exec=.*|Exec=$BROWSER http://${HOSTNAME}.local|g" /home/$MY_USERNAME/Desktop/cryptpad.desktop + fi if grep -q "Offline" /home/$MY_USERNAME/Desktop/cryptpad.desktop; then sed -i 's|Name=.*|Name=CryptPad|g' /home/$MY_USERNAME/Desktop/cryptpad.desktop fi From c2aa4d210de4069fe6dc690fd18f15b50a2f9556 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 24 Oct 2017 23:35:47 +0100 Subject: [PATCH 22/31] Add an icon to VPN connect to another mesh --- img/avatars/connect.jpg | Bin 0 -> 6404 bytes src/freedombone-image-customise | 12 ++ src/freedombone-image-mesh | 9 +- src/freedombone-mesh-connect | 230 ++++++++++++++++++++++++++++++++ 4 files changed, 250 insertions(+), 1 deletion(-) create mode 100644 img/avatars/connect.jpg create mode 100755 src/freedombone-mesh-connect diff --git a/img/avatars/connect.jpg b/img/avatars/connect.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c68690da067e59ed0fba2aab7f325d6b0eda4d9d GIT binary patch literal 6404 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 literal 0 HcmV?d00001 diff --git a/src/freedombone-image-customise b/src/freedombone-image-customise index 1fa38c24..ffa51d2e 100755 --- a/src/freedombone-image-customise +++ b/src/freedombone-image-customise @@ -982,6 +982,18 @@ if [ \$no_of_users -gt 0 ]; then # fi #fi + if [ ! -f /home/$MY_USERNAME/Desktop/vpn.desktop ]; then + echo '[Desktop Entry]' > /home/$MY_USERNAME/Desktop/vpn.desktop + echo 'Type=Application' >> /home/$MY_USERNAME/Desktop/vpn.desktop + echo 'Name=Connect Meshes' >> /home/$MY_USERNAME/Desktop/vpn.desktop + echo 'Comment=Connect to another mesh network via the internet' >> /home/$MY_USERNAME/Desktop/vpn.desktop + echo 'Exec=mate-terminal -e /usr/local/bin/${PROJECT_NAME}-mesh-connect' >> /home/$MY_USERNAME/Desktop/vpn.desktop + echo 'Icon=/usr/share/${PROJECT_NAME}/avatars/connect.jpg' >> /home/$MY_USERNAME/Desktop/vpn.desktop + echo 'StartupNotify=false' >> /home/$MY_USERNAME/Desktop/vpn.desktop + chmod +x /home/$MY_USERNAME/Desktop/vpn.desktop + chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Desktop/vpn.desktop + fi + if [ -f /tmp/.ipfs-users ]; then echo '[Desktop Entry]' > /home/$MY_USERNAME/Desktop/sites.desktop echo 'Type=Application' >> /home/$MY_USERNAME/Desktop/sites.desktop diff --git a/src/freedombone-image-mesh b/src/freedombone-image-mesh index ad9e6604..7148304a 100755 --- a/src/freedombone-image-mesh +++ b/src/freedombone-image-mesh @@ -784,7 +784,7 @@ function generate_stunnel_keys { cp /etc/stunnel/stunnel.pem /home/$MY_USERNAME/stunnel.pem cp /etc/stunnel/stunnel.p12 /home/$MY_USERNAME/stunnel.p12 - chown $MY_USERNAME:$MY_USERNAME $prefix$userhome/stunnel* + chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/stunnel* echo "stunnel keys created" >> /var/log/${PROJECT_NAME}.log } @@ -797,6 +797,13 @@ function mesh_setup_vpn { generate_stunnel_keys sed -i 's|tun-mtu .*|tun-mtu 1532|g' /home/$MY_USERNAME/client.ovpn + chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/client.ovpn + chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/stunnel* + + # create an archive of the vpn client files + cd /home/$MY_USERNAME + tar -czvf vpn.tar.gz stunnel* client.ovpn + chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/vpn.tar.gz systemctl restart openvpn } diff --git a/src/freedombone-mesh-connect b/src/freedombone-mesh-connect new file mode 100755 index 00000000..32aec07c --- /dev/null +++ b/src/freedombone-mesh-connect @@ -0,0 +1,230 @@ +#!/bin/bash +# +# .---. . . +# | | | +# |--- .--. .-. .-. .-.| .-. .--.--. |.-. .-. .--. .-. +# | | (.-' (.-' ( | ( )| | | | )( )| | (.-' +# ' ' --' --' -' - -' ' ' -' -' -' ' - --' +# +# Freedom in the Cloud +# +# Blogging functions for mesh clients +# +# License +# ======= +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +PROJECT_NAME='freedombone' + +export TEXTDOMAIN=${PROJECT_NAME}-mesh-blog +export TEXTDOMAINDIR="/usr/share/locale" + +MY_USERNAME='fbone' + +OPENVPN_SERVER_NAME="server" +OPENVPN_KEY_FILENAME='client.ovpn' +VPN_COUNTRY_CODE="US" +VPN_AREA="Apparent Free Speech Zone" +VPN_LOCATION="Freedomville" +VPN_ORGANISATION="Freedombone" +VPN_UNIT="Freedombone Unit" +STUNNEL_PORT=3439 +VPN_TLS_PORT=553 +VPN_MESH_TLS_PORT=653 + +function vpn_generate_keys { + # generate host keys + if [ ! -f /etc/openvpn/dh2048.pem ]; then + ${PROJECT_NAME}-dhparam -o /etc/openvpn/dh2048.pem + fi + if [ ! -f /etc/openvpn/dh2048.pem ]; then + echo $'vpn dhparams were not generated' >> /var/log/${PROJECT_NAME}.log + exit 73724523 + fi + cp /etc/openvpn/dh2048.pem /etc/openvpn/easy-rsa/keys/dh2048.pem + + cd /etc/openvpn/easy-rsa + . ./vars + ./clean-all + vpn_openssl_version='1.0.0' + if [ ! -f openssl-${vpn_openssl_version}.cnf ]; then + echo $"openssl-${vpn_openssl_version}.cnf was not found" >> /var/log/${PROJECT_NAME}.log + exit 7392353 + fi + cp openssl-${vpn_openssl_version}.cnf openssl.cnf + + if [ -f /etc/openvpn/easy-rsa/keys/${OPENVPN_SERVER_NAME}.crt ]; then + rm /etc/openvpn/easy-rsa/keys/${OPENVPN_SERVER_NAME}.crt + fi + if [ -f /etc/openvpn/easy-rsa/keys/${OPENVPN_SERVER_NAME}.key ]; then + rm /etc/openvpn/easy-rsa/keys/${OPENVPN_SERVER_NAME}.key + fi + if [ -f /etc/openvpn/easy-rsa/keys/${OPENVPN_SERVER_NAME}.csr ]; then + rm /etc/openvpn/easy-rsa/keys/${OPENVPN_SERVER_NAME}.csr + fi + sed -i 's| --interact||g' build-key-server + sed -i 's| --interact||g' build-ca + ./build-ca + ./build-key-server ${OPENVPN_SERVER_NAME} + if [ ! -f /etc/openvpn/easy-rsa/keys/${OPENVPN_SERVER_NAME}.crt ]; then + echo $'OpenVPN crt not found' >> /var/log/${PROJECT_NAME}.log + exit 7823352 + fi + server_cert=$(cat /etc/openvpn/easy-rsa/keys/${OPENVPN_SERVER_NAME}.crt) + if [ ${#server_cert} -lt 10 ]; then + cat /etc/openvpn/easy-rsa/keys/${OPENVPN_SERVER_NAME}.crt + echo $'Server cert generation failed' >> /var/log/${PROJECT_NAME}.log + exit 3284682 + fi + + if [ ! -f /etc/openvpn/easy-rsa/keys/${OPENVPN_SERVER_NAME}.key ]; then + echo $'OpenVPN key not found' >> /var/log/${PROJECT_NAME}.log + exit 6839436 + fi + if [ ! -f /etc/openvpn/easy-rsa/keys/ca.key ]; then + echo $'OpenVPN ca not found' >> /var/log/${PROJECT_NAME}.log + exit 7935203 + fi + cp /etc/openvpn/easy-rsa/keys/{$OPENVPN_SERVER_NAME.crt,$OPENVPN_SERVER_NAME.key,ca.crt} /etc/openvpn + + create_user_vpn_key ${MY_USERNAME} +} + +function generate_stunnel_keys { + echo "Creating stunnel keys" >> /var/log/${PROJECT_NAME}.log + openssl req -x509 -nodes -days 3650 -sha256 \ + -subj "/O=$VPN_ORGANISATION/OU=$VPN_UNIT/C=$VPN_COUNTRY_CODE/ST=$VPN_AREA/L=$VPN_LOCATION/CN=$HOSTNAME" \ + -newkey rsa:2048 -keyout /etc/stunnel/key.pem \ + -out /etc/stunnel/cert.pem + if [ ! -f /etc/stunnel/key.pem ]; then + echo $'stunnel key not created' >> /var/log/${PROJECT_NAME}.log + exit 793530 + fi + if [ ! -f /etc/stunnel/cert.pem ]; then + echo $'stunnel cert not created' >> /var/log/${PROJECT_NAME}.log + exit 204587 + fi + chmod 400 /etc/stunnel/key.pem + chmod 640 /etc/stunnel/cert.pem + + cat /etc/stunnel/key.pem /etc/stunnel/cert.pem >> /etc/stunnel/stunnel.pem + chmod 640 /etc/stunnel/stunnel.pem + + openssl pkcs12 -export -out /etc/stunnel/stunnel.p12 -inkey /etc/stunnel/key.pem -in /etc/stunnel/cert.pem -passout pass: + if [ ! -f /etc/stunnel/stunnel.p12 ]; then + echo $'stunnel pkcs12 not created' >> /var/log/${PROJECT_NAME}.log + exit 639353 + fi + chmod 640 /etc/stunnel/stunnel.p12 + + cp /etc/stunnel/stunnel.pem /home/$MY_USERNAME/stunnel.pem + cp /etc/stunnel/stunnel.p12 /home/$MY_USERNAME/stunnel.p12 + chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/stunnel* + echo "stunnel keys created" >> /var/log/${PROJECT_NAME}.log +} + +function mesh_setup_vpn { + vpn_generate_keys + + cp /etc/stunnel/stunnel-client.conf /home/$MY_USERNAME/stunnel-client.conf + chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/stunnel* + + generate_stunnel_keys + + sed -i 's|tun-mtu .*|tun-mtu 1532|g' /home/$MY_USERNAME/client.ovpn + chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/client.ovpn + chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/stunnel* + + # create an archive of the vpn client files + cd /home/$MY_USERNAME + tar -czvf vpn.tar.gz stunnel* client.ovpn + chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/vpn.tar.gz + + if [ -f vpn.tar.gz ]; then + dialog --title $"Generate VPN client keys" \ + --msgbox $"\nNew VPN client keys have been generated in the /home/fbone directory.\n\nYou can find it by selecting \"Places\" then \"Home Directory\" on the top menu bar. Transmit the vpn.tar.gz file to whoever is running the other mesh network so that they can connect to yours.\n\nThey should uncompress vpn.tar.gz to their /home/fbone directory, then connect using your IP address or domain name." 15 70 + fi +} + +function connect_to_vpn { + dialog --title $"VPN Connect to another mesh network" \ + --backtitle $"Freedombone Mesh" \ + --defaultno \ + --yesno $"\nHave you received the vpn.tar.gz file from the other mesh administrator and uncompressed it into the /home/fbone directory?" 10 70 + sel=$? + case $sel in + 1) return;; + 255) return;; + esac + + data=$(tempfile 2>/dev/null) + trap "rm -f $data" 0 1 2 5 15 + dialog --title $"VPN Connect to another mesh network" \ + --backtitle $"Freedombone Mesh" \ + --inputbox $'Enter the IP address or domain name of the other mesh.' 10 60 2>$data + sel=$? + case $sel in + 0) + ip_or_domain=$(<$data) + if [ ${#ip_or_domain} -gt 1 ]; then + if [[ "$ip_or_domain" == *'.'* ]]; then + + if [ ! -f ~/client.ovpn ]; then + rm $data + exit 1 + fi + if [ ! -f ~/stunnel.pem ]; then + rm $data + exit 1 + fi + if [ ! -f ~/stunnel.p12 ]; then + rm $data + exit 1 + fi + + sed -i "s|route .*|route $ip_or_domain 255.255.255.255 net_gateway|g" ~/client.ovpn + + clear + cd ~/ + sudo stunnel stunnel-client.conf + sudo openvpn client.ovpn + fi + fi + ;; + esac + + rm $data +} + +data=$(tempfile 2>/dev/null) +trap "rm -f $data" 0 1 2 5 15 +dialog --backtitle $"Freedombone Mesh" \ + --title $"Connect to another mesh network" \ + --radiolist $"Choose an operation:" 10 75 2 \ + 1 $"Connect to another mesh network" on \ + 2 $"Generate VPN keys for another mesh network to connect to me" off 2> $data +sel=$? +case $sel in + 1) exit 1;; + 255) exit 1;; +esac +case $(cat $data) in + 1) rm $data + connect_to_vpn;; + 2) rm $data + mesh_setup_vpn;; +esac + +exit 0 From 62bea42aca3c6ed85b8d19ae1f712bf57929499e Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 25 Oct 2017 13:29:07 +0100 Subject: [PATCH 23/31] vpn tls port on mesh --- src/freedombone-mesh-connect | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/freedombone-mesh-connect b/src/freedombone-mesh-connect index 32aec07c..ab38bccb 100755 --- a/src/freedombone-mesh-connect +++ b/src/freedombone-mesh-connect @@ -41,7 +41,6 @@ VPN_LOCATION="Freedomville" VPN_ORGANISATION="Freedombone" VPN_UNIT="Freedombone Unit" STUNNEL_PORT=3439 -VPN_TLS_PORT=553 VPN_MESH_TLS_PORT=653 function vpn_generate_keys { @@ -154,7 +153,7 @@ function mesh_setup_vpn { if [ -f vpn.tar.gz ]; then dialog --title $"Generate VPN client keys" \ - --msgbox $"\nNew VPN client keys have been generated in the /home/fbone directory.\n\nYou can find it by selecting \"Places\" then \"Home Directory\" on the top menu bar. Transmit the vpn.tar.gz file to whoever is running the other mesh network so that they can connect to yours.\n\nThey should uncompress vpn.tar.gz to their /home/fbone directory, then connect using your IP address or domain name." 15 70 + --msgbox $"\nNew VPN client keys have been generated in the /home/fbone directory.\n\nYou can find it by selecting \"Places\" then \"Home Directory\" on the top menu bar. Transmit the vpn.tar.gz file to whoever is running the other mesh network so that they can connect to yours.\n\nThey should uncompress vpn.tar.gz to their /home/fbone directory, forward port $VPN_MESH_TLS_PORT then connect using your IP address or domain name." 15 70 fi } @@ -162,7 +161,7 @@ function connect_to_vpn { dialog --title $"VPN Connect to another mesh network" \ --backtitle $"Freedombone Mesh" \ --defaultno \ - --yesno $"\nHave you received the vpn.tar.gz file from the other mesh administrator and uncompressed it into the /home/fbone directory?" 10 70 + --yesno $"\nHave you received the vpn.tar.gz file from the other mesh administrator, uncompressed it into the /home/fbone directory and also forwarded port $VPN_MESH_TLS_PORT from your internet router to this system?" 10 70 sel=$? case $sel in 1) return;; From f5a8c426451471e14d7a3e4e4f54a93361419039 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 25 Oct 2017 13:37:53 +0100 Subject: [PATCH 24/31] Setting vpn tls port from control panel --- src/freedombone-app-vpn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/freedombone-app-vpn b/src/freedombone-app-vpn index f10ad362..dda7b38b 100755 --- a/src/freedombone-app-vpn +++ b/src/freedombone-app-vpn @@ -123,7 +123,7 @@ function vpn_change_tls_port { VPN_TLS_PORT=$tlsport write_config_param "VPN_TLS_PORT" "$VPN_TLS_PORT" sed -i "s|accept =.*|accept = $VPN_TLS_PORT|g" /etc/stunnel/stunnel.conf - sed -i "s|accept =.*|accept = $VPN_TLS_PORT|g" /etc/stunnel/stunnel-client.conf + sed -i "s|connect =.*|connect = :$VPN_TLS_PORT|g" /etc/stunnel/stunnel-client.conf for d in /home/*/ ; do USERNAME=$(echo "$d" | awk -F '/' '{print $3}') From ef686e62644a7a0b5a49c0c4e20c76fb69534f4a Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 25 Oct 2017 14:02:19 +0100 Subject: [PATCH 25/31] Handle firewall when changing vpn tls port --- src/freedombone-app-vpn | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/freedombone-app-vpn b/src/freedombone-app-vpn index dda7b38b..0d0f051b 100755 --- a/src/freedombone-app-vpn +++ b/src/freedombone-app-vpn @@ -106,13 +106,17 @@ function install_interactive_vpn { } function vpn_change_tls_port { - EXISTING_VPN_TLS_PORT=$VPN_TLS_PORT + if ! grep -q "VPN-TLS" $FIREWALL_CONFIG; then + EXISTING_VPN_TLS_PORT=443 + else + EXISTING_VPN_TLS_PORT=$(cat $FIREWALL_CONFIG | grep "VPN-TLS" | awk -F '=' '{print $2}') + fi data=$(tempfile 2>/dev/null) trap "rm -f $data" 0 1 2 5 15 dialog --title $"VPN Configuration" \ --backtitle $"Freedombone Control Panel" \ - --inputbox $'Change TLS port' 10 50 $VPN_TLS_PORT 2>$data + --inputbox $'Change TLS port' 10 50 $EXISTING_VPN_TLS_PORT 2>$data sel=$? case $sel in 0) @@ -134,17 +138,29 @@ function vpn_change_tls_port { done if [ $VPN_TLS_PORT -eq 443 ]; then + if [[ "$PREVIOUS_VPN_TLS_PORT" != "443" ]]; then + firewall_remove VPN-TLS ${EXISTING_VPN_TLS_PORT} + fi systemctl stop nginx systemctl disable nginx else + if [[ "$PREVIOUS_VPN_TLS_PORT" != "$VPN_TLS_PORT" ]]; then + firewall_remove VPN-TLS ${EXISTING_VPN_TLS_PORT} + firewall_add VPN-TLS ${VPN_TLS_PORT} tcp + fi systemctl enable nginx systemctl restart nginx fi systemctl restart stunnel - dialog --title $"VPN Configuration" \ - --msgbox $"TLS port changed to $VPN_TLS_PORT" 6 60 + if [ $VPN_TLS_PORT -eq 443 ]; then + dialog --title $"VPN Configuration" \ + --msgbox $"TLS port changed to ${VPN_TLS_PORT}. Forward this port from your internet router." 10 60 + else + dialog --title $"VPN Configuration" \ + --msgbox $"TLS port changed to ${VPN_TLS_PORT}. Forward this port from your internet router." 10 60 + fi fi fi ;; From b1d03ec817e46aff9d1ab0aff7d0e2a360c52602 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 25 Oct 2017 17:22:31 +0100 Subject: [PATCH 26/31] cryptpad hostname --- src/freedombone-image-customise | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/freedombone-image-customise b/src/freedombone-image-customise index ffa51d2e..3240ea2c 100755 --- a/src/freedombone-image-customise +++ b/src/freedombone-image-customise @@ -897,7 +897,7 @@ function configure_user_interface { #!/bin/bash ethernet_connected=\$(cat /sys/class/net/eth0/carrier) users_list=\$(lstox | awk -F ' ' '{\$1=""; print \$0}' | sed -e 's/^[[:space:]]*//' | sort -d | uniq) -if [ ! \$users_list ]; then +if [ \${#users_list} -eq 0 ]; then no_of_users=0 else no_of_users=\$(echo "\$users_list" | wc -l) @@ -933,15 +933,15 @@ if [ \$no_of_users -gt 0 ]; then echo 'Name=CryptPad' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop echo 'Type=Application' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop echo 'Comment=Realtime collaborative editing of documents' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop - echo "Exec=$BROWSER http://${HOSTNAME}.local" >> /home/$MY_USERNAME/Desktop/cryptpad.desktop + echo "Exec=$BROWSER http://\${HOSTNAME}.local" >> /home/$MY_USERNAME/Desktop/cryptpad.desktop echo "Icon=/etc/cryptpad/icon_cryptpad.png" >> /home/$MY_USERNAME/Desktop/cryptpad.desktop echo 'Terminal=false' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop echo 'Categories=Application;' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop chmod +x /home/$MY_USERNAME/Desktop/cryptpad.desktop chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Desktop/cryptpad.desktop else - if ! grep -q "${HOSTNAME}.local" /home/$MY_USERNAME/Desktop/cryptpad.desktop; then - sed -i "s|Exec=.*|Exec=$BROWSER http://${HOSTNAME}.local|g" /home/$MY_USERNAME/Desktop/cryptpad.desktop + if ! grep -q "\${HOSTNAME}.local" /home/$MY_USERNAME/Desktop/cryptpad.desktop; then + sed -i "s|Exec=.*|Exec=$BROWSER http://\${HOSTNAME}.local|g" /home/$MY_USERNAME/Desktop/cryptpad.desktop fi if grep -q "Offline" /home/$MY_USERNAME/Desktop/cryptpad.desktop; then sed -i 's|Name=.*|Name=CryptPad|g' /home/$MY_USERNAME/Desktop/cryptpad.desktop From 76a3f0a5332ea1b7f9fdf385fc69de9fa26a7803 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 25 Oct 2017 17:41:13 +0100 Subject: [PATCH 27/31] cryptpad images --- img/mesh_cryptpad1.jpg | Bin 0 -> 114786 bytes img/mesh_cryptpad2.jpg | Bin 0 -> 79804 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 img/mesh_cryptpad1.jpg create mode 100644 img/mesh_cryptpad2.jpg diff --git a/img/mesh_cryptpad1.jpg b/img/mesh_cryptpad1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5c6984c4f75467f1b00c1ac10407a3797b281cff GIT binary patch literal 114786 zcmd432V7H2w>P{Kh{m88AaDdx0*WL^Q94mDAR>eoLXjXv=}nZXAb6sJN>ji9(nARy z5dtcRSdJjQ7g4N8x6xFvy|csd9MAK-_ult@-~E2?H^#LkI){G64TUKb}B)AuQio{HakA{&&pZre=UrJ}7xQqk1V zF?68n?4#>zXwr^a&=0$KdU@_K3pnZT7V6;c=?W7;2nY&p5ZwY|j*76`AB$fvY z3O+qdGp(7vv8w%khXRGVHly<{6hIObCjUk5znMUcP6&724ql4do6B!BxWlU>-N9Ws zr@iORrA=%1ag5e`{5R?S)qHK1=PpIt1X(7xMCt!A9SAzLhYn%5RH`8ei97?L{v3n_ zK{z;xWWe!%88qD(pyztO1@^rUWyo#_LSxVnYo!}Zf(j?O(Ms8$F&=($$N94WejwUZ z5M&4nPd$~NH)q?-Wh@>dth9jnW5G#o1SeJk8TxY`K#)J%uGEaBp&*{gd7t^AP1+fE ztU_eQYUDu;Bmd715Eu*|ZzWpk17h?)`9l86{%W}%G9=-gG_{GL?KW}N8}!B#e?s+h zy8l29|L>E>|IMbR8$j%vga`{Ux2*j;poYefe@>9KGF5oqKLe7>?$6xMC-Nu5h%OZf zl3>4j1TAfn*mLODsR9YW(*Bh-@}I!|B=ht6lN?VLP%rII+aE*cTc&oO{B@>4aIoxt zVU71!%0DTsJP|7hh|iNj9%u*>`BSDp@&8*ruq!J0PXa%4Xf7emaR$UQXc$UQ-0VdC zTbN*cE(@%mts(s1$-l~eN#MayT);MA0+lSH2!FE$D*lPpe?bX?$YAJ+G(Zm^_P0KO z@xi~pMTY%*p1<(%k0cq#Wl01~<}Z{0FK|Z~aBe{V2Xgya4?mGm9*`cw6W0^{4~SqQ ze|0~@fSdkTfgI4ufNVE*OrN?GF#53lZv`cAr^W>xrlCXrS4wadSUvv|G~LMvkM-8d zk3I$s?d_1*B8>zbEen1#?*5mC|3}$TN1+pNL;p?&vU^kQ=*)cAI{VPju#ua0@kj>Z zV?af*JpP}QLii&jFQ1+f= z*ss-p^P-N($vu%$9grJnzu#Mh^(!$1<18R2}jz$h<*J|PN$oeh}GD}+@O?5!K;ZC8UuO{Zf{3wrgL&0I|Q|FAnk9iC^LAP zNVmtGBm|4nA? zMoG||8$^}-h$9=7_OAYm-69sWi9Z2t5hcfhpw+{j4H>yehAxxAlbwAdPh;%)Z%4MJ zWVq!#x~q|Cx<4R_Ka#XT%}Lqe?h3tsj}fnTVW&?x-xf++)NGm&80_>ft%TL;Mab#) zMNut*_6h3OF4IGxgr7dZf_PC}vjq!@VgoSaS#@uGK2$#I(*AX#rfo$NcAW*rn@q%8 z$yASfMI9D5|9!weOXjl9Zp({I3f!x2VBv=7egszigSm{@&3!WYTGzkl1@B@psks&f9C=1+Do5$Pk+3xp3o>aXg^WW#6U63 zxBuNhjrZA}WfPVKrurT6BLP)K3(%pSah3m+@;@tAE6>}9iL6a|zTmMAG3JOa31zX}PpLU$!5=rUlxR=bH5rkx5_H|s(`8ZQcu8yxEwohSx1$ZTiQ zym;Sa8wXmH*jzdKi4wln<4~EJ5KVv9bcZxjHWYs%j`Ga%CJ{#+pUt zJ6a3~waQGsYv`fb`93_@*{EZgNE{Y(GIqj9Q;{zoY>n$HGea(VzH@Ld(PSyDH+oDu7u+Xz_vz7&3t*VsF!V(;G0tl5i%?T`}`tG7EHxAc>cD2kbsy zC%oSB(EI_L*`cdD0(TcC=b#f=QV>!1QExN?vo^mfi7Fi*DJ=-;m7u9;X~e>|f}?w* zYVPGq)exmV8dvaT4vCM@(|2vUxO2PAMrhF}qPJ~pjY>mc2PUg*Cg>ht^$WN29``u8 zbEfArl4erkGM(f#w_dH9H??|`(&9eY^!+zu2H;iG?M(d2`egCEad)sBKRF<(b)F|F z)H%uLT$g1?33m8F%glv<)zLSx7s~P>oI;GSCmCRiK^sZAHJ>I!tJwY5=&l_Jd}ex9 zQwr^E(USox3E?~MS7!w+igF?UJ~(a6eQVD%M=d`N3~KqGphEr~#1%gR1Fe44Szp{feMetA zD3rhOLJ>jB=xj6@;x$L>iW-{ZbDWZVJbkDHDjGuZN(!kNNuhWN^y37qR05m0irveA zSPV%r9*H~WEf-yl>W8FhqQ-Vn2CP!-c0UFobZibk%)n6gmxo0y2K2oQybEyRN%k~A zK^x06fbIj&96;rAm!vpwX;Vl%to9lwRT9|`%ow{$dRdt__e7@r!CPNQ!Gy# zkP#FD8mUW1%C@-*d!X^sQe`?KO(hIBc`B6#97ME@9>l^x1T^9h*%p#oOHW6`<49O& zX|FeiQ=0C2NXGh_`lTqvZbSEI$Mj4v2=&W`p;XN?lMuus+&tSGSfu}B<*0S7G57a^qPb`Og?6OZGW znkc+KbsE%z0~C<#oscc z6+@=RV?~M#q6K763zq3vx4GsVma>c@+u#PwvH9jku24R(S=e|y0nbY;0o^bF`Upew zR5BPXeD`}GSYW~-?n%q)%I4dqQxlE~9xRBkzA`Sv;)-lE)ds`nZf|&A;D}1{Au+ty z^=LRe?8G80d0D#1Gi}J;G&}>v0wp@w)^0RH5c2fQr%Bzl6e%V{SbS1CusV=-vigU* z7qH3o?|?T@AOR#p!dYyta0iuTE>cXvAap<}LXwO?OHrZZ`xG>FEjBXLc2JAs+a?#N%^9g+cJIMYWtc|3$vz8aOZ;RTvN-ib_ARFu5nsJwa zL7}1n-UZte5WOT}9X>%Uj)g>uFa+eW$&5b-qTwPT-7`>Wu?LliV4_3;MZ`Yc1Ok;z zfEeuLGlI>HB&+&;!jM!U7Li5up_kL6DV*@F5y@f-cEGqvaBY!*@au8^R*U z7`4H?<_L zy?d`UM`vsyFlXZ_MM<&X|Hb$5Hy6z%eP37PW+XZ_?pQ6R9Nk%7IY%Cb>JS^R_Q z-aaz+0#w>npb(>SNGZ*%9#7)VpiAyXfNR?Hb4B}Ui)1}4w<-c z^4PpHd-u)fCo`u*W^<;eI%MnZ>i82c+Ge$!+(%$Rf_Q*9!i%{rS-cnf_zmFp5RcZ* zhc~nf@1&SKO!t?G30a(f-uH5F>#F24IR+Tu`ff#Wc>_%m?okgEJB|M|cUq z{xJ($Z9n>Mal*`k3{_As;!s4#$SNCC{Q(g*vDBhMWDa zz-;vAG}ebMy`MTZ1re>8@ZiAApusT)UW$Zm>yvcPq$(Z86W5n3{xQP<)vM*YAs*Z8 zfS!qwhAjINf#a8w+A5-fkXZn<58|;bRz#5v6ux=n)bY)|w|kdrvaOevG=txS_{;=6 zq0a?O?rJ-m8G5l&hXU~uAf#vxLdd)7Y%1Eq+$#+_FNJI}9Xwg&WlIyK)LjT5iD66> zm1JBY{{4C-JB|QV11w-!NGLb{epp?;M7n5){fc5ZnZUvVaaHzs11Gaa~L}&CS6!tJmEj+?^KVE_&)r z*jTS;sLYjRFEVTk5rEf7%qpSr?t5p6XcuVj8>893mnQCg*|K`ZgoB+o4j59z;%r4$ z0HsdJ6=ko#T}@ZQs6ryOtwt+xK|4I#oAmi{`!2g>)$BbA^)qEoIa9mxZOAk+u!WJU zc~_lATuyW;HQA?PVRdEHhT^&J;=sZoTDcTX@4?Wy*S9VF7dXOGo%N5qV$_H1EK0su z+-kCR%38%aiwHKvMsTI)Z8 zWxM=&C}KRoL_tW^2$$rnqJ0U*^6=vPDf`rlz?-{+gKOWH&5u3FWZvDinaPMi*(1+1 zf~|$YV6`+~kbTsXn;dx8AJix3_ z$slRPV6^hPH&-E%mb}Q-!zr(TH3Q{i;9$l8T!ZBScBFZsczHxTnTGomIQEb*eW!4)!~rCgA?1q=?jPq>``OG&7gunT(=+pjtu(d(J8yP`8VBus)z1^3^ zn-2!xJncH0oeQeKmbNt2qKBrf?T(DrjsAEvJ1^{kql`km^6f^uZ9_TtA5>3fmE!Su zlr4lMfB@l`Fp>latIGgm0~LazbmIX>ybvp&7s9c5;k5v*u5vs*1Yam&fvi~~oy!kz z6=rv2-B#FtDf^U#C8z*SWS1s33b9TwAy>@YL~qwot>aw}+pdbp(2e*fY-WekD$T-~ zJa}XgWDYiad0qri7{)bWgTR-4H!fYjL0Y(jOd86i# z!TE;j$S5>5mjTQWxFy8s|$z+p9T*5jY9sAp>XHMuIpkfPzZ21qbcm^6eDR! zlRO~FhcGyk`P(YFna!yon~#`Qnpp)&k#!?k5JCqy6Tqi|C~OD{oLgKtp|xu&>*>;H z*3|;P5WlHAW(rw9APs;%15gEs0lj39p%NWrbgK3VX@nk%ymwe)^$n#6Q0v!$WS|gJ zLyFp=_u=MXAxwx18QpxG%dBB42;tduTu=H=yWVnjky}PZWA;L{QHw`skT?R8A$6Ln z%K#oD9)pr3^Jh6UTv}Ziu6%oZIAb#7=EC#B6tmx9xdX`qC}?OJl7R!~afqmN0uAL; zbuCv{X|MM^#KJ?+Xc_^cZZ7J-wR@oTF6aQ8g3&mvRZmgXt1ja_5sU3NJA~qQQqNsX zI3N<7%+v1|JN*9IUS2*jRM}nH0%0+_5x`%gf_ZML3=jLrIoZ6SDX}IqupI*KBv46k zMgYDhSg_!*1#SegfJu@@?j2TaeBYLlR~}8~$*3}as6vHUq`L|hDxf{A5+U`d_@tXH z#%Vcu?o;epeDBxT=T`B_Col~Q9~7^4`TDNcTnO5kKGwfnwRF{J=2EQO^zG43x7$0- zbebGD#Up7D6&PwjjHmu2Se85)clOXzhwjkF2=_+D1Jr2gn(3NX99k|HKe(4Sp@^;@V6I5_;o& z>Qv}U+PySU7o=zyZrgQ-wB-J{|Lg03J^PC1#+LnFR!{=dCd!Ow z9+rJ!fBtg!%Vo!HJKYN$ot8N#ypF2JWp*lkeuEWcK)RA1Xkbo|!71SO4{~zMELIK| z>sk}OT6N0JS!u>Xv%c&=E zqc%7w9);3w3YrfW4_oS9@ZLQ(LDU6{&;z0()2al)AP^-y?C2$}dCg&Feh;>@Q01+n zVNluk^Q5mGX&v{!nYe*N*d3FA+5YgrrPT%Aqr>ma3Nu4KWo;PBF3|pXH2Gfp+;sR_ z?>~yGmo=Ve(WT)Kt<~0=tSrFJo<#9CYeA6=8MW>9WFmH zptyav(d!8ySj_d2&k>C!s2Eg54UxOW=d>0tOcPg9(x*X({>^ zDso3Wb~xQt7gM=yB)5+YuASD3&um2zF}l2v3o@;&5yIx9R$Iwz@wy=UpeX(|*;5Cv z1Yh@sb?x6Q+70}wlnfTc*MHoPt;W>CR|t$1vud9^Ueu_HvEaFZ;sU8 zNLTQAS!70e@ggwp>Zt!LXTL?~$xe5noV3bO&U5#5qvmOHa=OT~MuM#<6p2EdWCmyq zuN|g%+!Hd&BSO-A!a)lB!G{<&o_P=VWhCtXqLp+Sd@bsnuR|7QOnXCUml$N1U$ zx)ff`bmG~^K1+-1bHp!Y7BA!_&#t9UrpO3FK@J{#hrq>9tCCNnVAGI3#;KV~Ju^Qu zbUvi))1YhO?)v4pz=^&)VtA@928*jSq=MHf;N1hfMi6?CvZM9`3OHvIwVKJn7p ziA$>rZ>UdZNLxEuZ>gNR7}VRP7WAx>?+=@g?iMGizJ43M8szOx5Bun=6yn2x_~aoL z3t1jdE33jzxJfr2fBEFe=*PfkqE)x;LynC#XioLr*!=8{90GVq7?@G81;+ym1hR)d z*EKV6*c|c~`cTW;Ho>?@5RcMpML8>oIB1iGPZ9CKwRA?3Aqhv)5^dbvXcH%ZiYth7 z`?NcJN54_J7X5ZgMgYfuzD&k-N|cl_M6ct-WknBGp6zlE$neUqQ>I@Gh9nQ+sJdt3 zS*!xn{o5rC*6-*4{#=4nFq=30{QUW@$*F*ehbA9i4h@arAOx2ygaHID$AHTK>BjS< z&IW-yGT;l8y&qj12Pi|D&J^HRgFu0x<)xw4lmwI3HBZDui;BT9*DK>}@!0BfVan60jz z73bV_G5zfyH!51;5uiV<3?-MB0YOAW`{%R{NgWIs(tdV)c6lDuW5qe}=I3ijr$R;C zgUeXO7F~Nij!d3dL>aqeOMYF7|A%L8g$5(H*R~mpzZtF#G}>L4=~r%4DiSn!JOF{F zV1Wji1F>ix;DblhvU%P;HkfrWZvMBoIgMBPn1lTmR;-YllG{V_g6W}de{3z$8@buvU%#le zdvQoTGvgD|?R-_krr_hGE2S|iN5jVFb@XUR z%jf_{&3KFIS|uOd2;y1cn;oI}P}gNWHA9VfRLc!=4=_e|J}nR*ZK z+IT7}%%t|8>jnG(P`6cqLsjc4@3*6l5;t~$qSfM)K#l3?nQnDsT_F=e$Q4}Y{HMk_ zS)5{@y4Y#Cw{cdLop;OihZ228>T7nn+xrE$@6z-N4JexqkaVWaO; zwi{-jIX8Q_D`d3z327=hNYl&9Tvg6v!pYt!U2{0?ecbV>jsQgB+2;C2UJQDj{Ka65 zRS(8X`C#1Uq~)D?Qg?ZYU^PNuZ9+MEAX*6kE{>5rUdagJdFTGSM8!|Mbc)``7lvF6 zp7(IOISrZubA7MvgnfKtvK_rw@){qZ!@_S!P0Ws7G*Mg}BwFMvTh^Js)x-olKRnej zwpZ=Y+svTn+G(A}saM_8taz!uHclNzx#Dkd1<6+ks$y!PDSl0@Zg)|t3b7lm!K|Qc zY}k?rSv)QRz=i{t)<$F3bW@edlH}}wjZ2$qFMu{c*>F5hJ3gN1CVCi*6;6bMD`(ik zolh~o-$F<-E*KCa)AtfoLU-mMYCZXbJ(}i;={+aBcXgJxU+rD;8A!G@lKNm;_38QU zXKe7V$$8l5tYAVF+95rAMik`@9*PrVxws6|3dP z=>`+Ut}~(~d(Cy^6mqRiYlG8TDUInJGwErKmrX-EI0b4P5q|5Sj)e|CWfx9TLbzys z+1s*(L8;Hi5JvZG{&iwn|FM3^*FK{oos@BA;dDCjOo1#izNcs;FEfAxj!cnwf(X=O zLRq~_l8890t71VVfc4RNjQ{`&Z})y3JPsc(fwlqFhb+O5XJ*22SJte8p$n<42-ldF zWE<_0pX2Pm5IZP0ax2B}p@sib_v8Zh;F11&>AN3imGxJjU*|4EzJ0kT;1#C}T+kp) zjPhuc=lPUfNJicFIDR$b0UYm}_gY(hip+CU*PP9yz;{XD@`1Q+V~RP(Ek_3fE_e{k zq%&Z6Xnk#F*u{~%Nbc$cOd*_LR*8$8ij+7fTe@daQjsMp4svT#xESnZ-`0C`IGvO! z{h+?DAt=+`|Nhb4t^S<++hg}!Wl}=kr+3z+4~CK2;q!y9L+|+A6n(jIU$twDe%oYe zwq`14pDJ$Bs)yg&V_fbW;+X>;9JA#x7BmK)H}_DF^;Ss(N=rJP7Z2F@q+F5kC~7G^6pXSu|KI`0{0$L*vE`O~#Nfs)2nN*<9asjBkQTYA!K{fhY$AH6K* zU&_lWD23efiBXhB1~R*v9cm5(=R%(qkui>RKp`&)M!Ma#BJcvdaW**s@_cMyyd#Rqqvte zLGPb%n|DpUIy@NVW<1;$(qG>h9QvEOw*3n*@l65831axG!ADgM1j{HLOx%cD{_WhN zN}^yH1T`k@lhmUK0H`2k+tVmr0cC2EAVkB0JXYd32`p3wFf#m_;61`R?>!du$)HQw zai5bxd-*Lh?vCnNpW{cYD*MGJy};3==>kPMIeFKFy=zB$l3=Af>23P!DZpuBxtjUj zG`DuI0FKMf;x2j=0z>w4NGRSXS?s}4!C#PhQIm=52bFVS)1_)%rnbu^9T+ImHB1jpNtYE)&Eb)@Aw-9r@b zw|k7aCZbk5NREi@u8b~VQ991b(8D*3tbtHeNB}BXgEJzYC0Dia>UOVX({Oq$!K&0E zx6VMQ-%G6;D?vY{?n?&n@mvf7uVl0f+G`V1U5KdX&94<)T5 z=kp1kDK}16O@Hi=T3b#rSWEw-;COmXKV5&Co;W_I{S6c&ZQXF^%! zGg4LJ)?SpnHXa#IUkhGU-*!s1LGuX~L&SKh7fpm=lY~k(k4d{O?In$dq$sUU#WAY# zL}v;ra?8|EHnX98Uu<`&ke*Fq zas9|JyEw7J;BB0*w9Ay@E>#7&m-W*md6Ls(Uqc@!u{aZYYKYzR8EIG93tp1Nt~P?X zznP~KWXF_UN=4|p$gMd})}tzT-C>VwdaM}N3lLG-%N$GT&m-@%F;Z73yH77lEfp+Y zTOcQP5C`3%b;Udf$`39qGeI0K{!C==>h0jLPgq|b7uI?5MPTwny1pC_MartxDxZ>H z8lx(vRKrUIQhS#8PTAV-ktr$7t}twdda$^)V?0^9-->gNbH&-mEp<-+q zeJx6Mt4dw$fTUTW`wEC?7(_@*;H;~oRx|iS5+iX?Y-!}vcCI?4)j8ZUbq z%`8O-7Gd!`-h-VHRoGT5cGN-Djl%ftJCv#IZrA*yZ%Z${zrrVZ-#as8CQl+@zZ6 z>rG3vsVsZZvQ|Dh?NVO-SBI|vL$HilfX#GCAbJ)RhB0ih!#}X&@ffMYvL#(}FwZ-N zuc!xoR&_|ltxdKDyek&0*%T1k_SjCmEZK{y6PQ|?tG=h;&p8%`+J|AQanWl+`?WmL}Im=$f$x3T6G!AkA~VN z8vNTxZXY`<&50&$6VLYTv`z6VvefNwS=Z*hRUIcIlF6Wr@YN*47#VwEzPC|)HG z7T-=675d>W3-ekZ)?PJTdM&x9bk*7`kR|FgTZ91I7!Jjr{{>O0Z~fC*R+k(r_~j6fw9Sh4`EhLneq^U3qg&{t0lD@9GsLc9r(}N(Ty)qMD=FpZ5@ZJE}9dP9{u%i~N7U-mMIE?`g zo__`EUny<^8U4>Zr1vxLvh?&AQW_6CN8mVKSYUs}u8AM=vOvof)FN?skOqMZ!AcUu42jM1ey6XbT(*hQm$8Rnh2Sh9dBfD@dQXBFK~H-`9t=?G1`0u1{fv?V!_d$ zM6ui?;t(uIURg4%n8-r!?3})~LGQTs&W}SGADnMi|3&!pUxX3XT*9_1tZ@nd4KW^2 zU11${8lIj2kt==6g~I;l**zB<6f(khe_6k(u%pWsKmikCfyr@Y1QS8AK!o^HbZ{*f zBJhL*JRlxUKqBD#3J58ThfOagYxq>b*RNN1TI@=io_Ib#0IL$H1{#FH!`yK>?`js~51 z<++oFhk}*#mjIYvSrc-w`U0SVa%c&xI}?8{E>#ZP_8cp-;d1yB2ADp?)rtR@CXDdP zLb(R3g#fG+L2|mx2x*T5j;f^1wSSxcip+Go8GtxE0>I~A0(pf^gq|(~f~08RG>HKG z{;jeY?qcO)X-)=xlXPGLKt!;V;J^YuE{5C*bJ^pn0I%$Ru;<7kl5moSEHEx;_tye| zv68*d0EpYdT>)p@>Hnpu5E+!h3ycdP!U>Fp5WG1GSaS^->+Q;&824^^x(mG7f>8%C z_!JW~=l)oLd65XXH>iTg`9+mh1o9_UKG+nXlOBoz6SaNn%JR^~$&hUgdT(!ovB=zB z=6~ub>=^?(z_kVebOQhW<`hoj;RwCLEFY{$Jm*v(;Z+AFHBW9h7bk%^UbmunxIa}M zrjOVM`e3W^AO`eU;DG|azXKPS71G?biV#<3AqYx$bp1bhZ%8TG`?B-xPey@KvR1ky z%K!!|`U9xJc>KDKKo(v~00lh!fKf%i%mgo}L<|=c_gJ8oIE6_Kbqp>yTu}k|V8L@O z$_l6;%L092%D)CY$Y57&7Oa_wKg1xxGYa@XV>x0UAOZ%0*)+Z3|LP< z#1$*}Yg#3sH3%NWs#QoN55&X04gr5nD~N+njug~=Iqh!_kCZx8-HHCv8iG7d^ee^WouuvsUlI85%<@1wrf z32ke`%0+fm8kAI+9-AAu6-<9M7hR*{f6T#kvxz_TW{&H(oz8{{=XPbQ`Z^+{CBEAY zdw3h2E-*TLZqJ~^4`@%>B34cCt?ahZHnLnU`>gk7Ov{m`*48-EqQi+y7pmEGjQ(;LVbdiR$spZ$M zibb!aJW;2bE7NLTw;GQAfbJRX_Di}`ru1EfEvDaNV)E?=bih2XBqUEih*{j9ndG7W zEURswWhgEVqaV3NHzCKMJKuw*LKOS|Ye5>W1LGE{tecu+++E;dp+fxsq~M>^@8#kl z#sw(Ppp^5+`lvOw%85+b`*YFBNe&HJe>}ErTUhG!584^p^N@}y4GJ3bw0sam3oKDz zh!-==C6eqGYCYshfghyJWYadANXU5%-`BXOJ76!+TPv%6 z?BdSeL}syliQR$&|E1)7+rYsc-;`e0uTQhq`?AOI+Q%Qz1Jle`cV5a2&k_mMQx}uB zX`9H|-MTG*{zflnwzR6f@ruEHeZd_G5wTkjZ&|b9|8hohZbw4Q{|Pf3lUrg11z+iX zfnT(@x;k5Nte#qW3^ob`v~-t(4r@}m zrb~&J(XN&Q{l2z|T|{C>r*e^3Li%N^u-VJKKcI+I$vM{vc5$0pbLXP$^~;wF)oBkV zq$z?enwo}|V{2S)i!P?Bw|*+nj(cR+*c+am|LA1+#z)is&$XAs^(xlvm)U%CDM?k( zvX)?D+1x9xFgrgb**8D69mKZ+-+idfznbG#yj4F-@w=e=AYs{(W}4`>+0{fw!^LyE z=N2=jb5voMp#WujPquAlRosxC(RIq$WAFSg+GX$%jwi)k5uQR=j)>)E@ zPbgiB?E5|#p1m%p)<31j@mcL2v%_zne%gFH-*_`c+skjh?`)$*aE6i}J37M7%0N@F zU_435@|||ZC)-!QnSG&u3_Hj?@ZqiY=Wkl)YX;AReo%d(e_PohwZeF)z`IW)+Fii- z6)|n0Bh>9@sUNOWD)oVdM)XPv&xHa%mCkLc5BfCH_6r%j@)S4O5|!_#a&cS2gWg|? z{%++iWc=urg|Q|X(_~0B~Qw1Dvy3H84xDb zjn`iFPFsn36R*;~I>zLM$f~O>Q83T4{&-?BqUOsSf0VDO|74ecYDBC{y|28SOS|+- z$~$wv-#L}eLPCPiuRXrArRVV-eBtLizo{qZteMX=zHM^;df`oF`wAYfB*_7f?SrZU(XfE)u>@hZql69`2 z@BQ}{>GbF*!oE%c@zhTdb-b{%$b=XLNX_o zrg?a^KfWWC$w{VbY_Bua)c+$ckKJirrB=~Q{H{I)!~3#oUhTvmq>llV%WTee`7DaC zDY@UtyrQR{%*Ezr_;uJ*x?44;=S_E{Q@#|}yOuoeKNqs^p}Bf7?rB9`dXwjUrFy@V zD`y{cxGMMq?yVdA3{_+6&mNC_^^)mgN@*HcLhWh#whb1nq|6$Mz+)j3lBFxPl&107 z*}*TmRPM>GA5f%8g_Zrf8!v!5)vL(?O%bl=_xHY6b4q`Vxc_0zDIK%f2HBYSDU;AA z>yMZP1RjhjtZpnxV()nh+HSf-ce?)pB-W1U2K<1;|D%89(j@ktrqAhG@`i+>+`v4g zav77(4HgU6VO{?A_IBv+akE4%lInItjkh#CFXGjLfxcc?pR-jf1{}YONW{%5%XIFO z92vb{d*(0%#4zs$fBys5j@xBt9 z&8%h`^fdRW#J{L6YNV916LLCq)g$Gab+^6&|F@1?V3?lxufLzZ+&IWAD0DBC-gF?n zsL`A)dYI7fN8dhutE61C%1maZr9j6PYQO5*(I1fK`iI}PH3D!Kug2z*&gCh`KXHu_ zd49Z3>Gzr&Z_8|MoY8*RSks}oPIdZ?Jz!aPvO_f0pzlhtNg9$ZgwDIXBPus;n`e8H z=Kj!c(lH|PqbWvJ*`%cHH!aU~kCCEP-QHymbLO*l?u?2xc5)WlaOFYMw*QwIrnPqd z?-H+Q?4p;ZJ9oOUQf<#^7r=A);1b*3c?zTTdg8*2GR^p?KQoRlX^mYzT4{D`F<_GR z$%~dTqp!5rZRq_*_1fj7;AQpa>mPphPA{m8m3A-gEc6~Pc_-{M%edJr% zt+3+?j^RL80>6B+xJ2yyay{G3>22w|%Iy;HF}yURyQ9PVpU41p}##f%lY)ZAv|kiih|=kpv2<#8TQ?IyN@4P-v>ng zr6IFx(KkuD5Ish;xVVGfT8&eueNwx`V>e_I^!d7=+`;}@|1ZP)Gd@H`7)do(?TCul zhr2ONt~2m$*&RQvt7x4*ONuxB^qffe+VU}!dFQuR=EY90inm5}G1<)9@-f#dZh@ub zIHieuoGFu}*;<;I!+%n*LMo-U`l#LIx5R}d#lBM_KHt8_ej!dy23%~^yqVbFS1>)< zmz6J#uHopCMElbRn8n^M6UB`R%!Ng@lkS>>5nh%aMHAU=DZZa3dx7~DD;Jv#iZX0j zKKa`b$H2xbmx9`FINtl7`9yW@vBT@Rv(vOs+XeSU*pDunje$SAZ`^yQC)@y%! zTxB_DnPg*GX!L0K_s#aV6i17C&sr3kGKGf6%!`h!c}k0LrIn9T^3LWdZk_J80An6$ zOIavBrFbv*a;dDRzNNS|BXQuqdeX*@UUO-5Q+kBSp8Za5iw3W{wk+Zw z%&A>?yid{pW_gUYc0)t)r&9@^i;jPP7M{fh+t$uxrT%1QVM4{O##f6Qrqx`>f;Osd z8uEyfIQeYXC3?f#0EQ|TiKM;1>0fR1W+ z(NbQ0zYJ^2=XZ|x^c`%wIk97i{`8GUgZ+i+nf4k^C6qZ$5h2;2Z(8-ZlXq5ne03;b zK3t=C0PeS(5bRmp#NHi7Ep(!d4{0^0IOYU?qr7(ALKHP<)u$;XFk|z%nU+*#qNwsV zm-f`lN^Zs=2Pc14w(9>Zfh*yDD>2*~Gz(eRTp!DB;BMU>mCk~|vJv~54flE7rNzh? zDi;=31`m7+=R4svV&{_2HVV3MuQ>uoNkW}`zt=1*q+)rM&4UM(PVkoQ)Og{G1V0~< zLdghQbYM)j;HH!E+Ij(Q6=NSpYJcY$yYo)g4=4(Qmwx^Q1p)kLNEhAh<$ zeGem`^2+l;UsR!x>9!0LjWoaii7fhx-u*2RN2V2>U(vEwlQ@=6rcs#dmtZIyTk7Eb zlab)!uld_TMcw)ih2-a(O#;8|)6PH1ek$BK+gcbR@yO^#zr(}EJVFtv$~W_1;=6^9 z3Xd->9c_5iFwxLhA1r^Tbs%}tzV%bOU5csx)?L4wn-y;!8@VOjDZH!s`+fU{+>hF- zM8fhDu!xSoG5aIhwM_E;)Qif+A^)d~{It4u@AOOA-;RwPSi~(SybE!AAJbBo`TF<6 z3eU|?N{C=BV)HiI?v&kb1{;=&vFqborhHo;4xEcs&`_r2u&F&osx5p8g7^1DXI>lc z_b~{O+L5GN?}{?(uz(MI&L*Kd&ZcLGYuhW#h$ysGy$`y*vGiTtsS?l6PmEr)UH_i@ zQT%w(6*yd~C=|UZqxNEanCS9NE9QD(ZC8L@WZh(nO@qFv^!8?o%8QSW_ir*d=&EMg zX+FGdAe0vUQo1lkm-wbP!;5*{Hg~u{E7@g~@X)p3#r5(mtIQ3ggI2aBiKD~}S0$x5 z8`GX5UH+rz69^hn_LIghU(*U+e9U^EwEtF5wp+`X+MS)j#U&N$2bW~RJ^DLC%iG*T zEC-qA?LDo_*`oaq21DbEnI%ipw+73_a4+Sp$4m=6t(kFYMn<+ag+Ya4=~k-edSox_ zmF}~6EF-^%GS-$VDk_w6ncDA`AN$%q#XaM;o|i$Ve(`1edrm`oiqWGM(JfnD&JT_G z*w+Y8eC%1gwdtury|J%}e_rds{nvWD_ba>7haPVyxs@%59tHXWetvI^--?lK>EeEq@5j?{>_L`r z>y_K~dsv(e+{&_;?{d$u!gy;XW0=MFq}OTmKV~{pL^aK)_IqUn-mt4vQc`jqc5`Ys z+L93H82Igu{#bje(X69MTmE+uxf`XG!Ckk@pYG;YmoS=-Eqlj29J9TwsCL(#o$Zgp zJFYLMs!ZLctUp|O3RA4hpDCaEd+Lpan&_ROPaHXwTeBYDNpbobU1KHPL>?t3KGF1P z2+#8@n-X``ITEz->f8M;$>tUBHmV2rJ)J8)9%^k}#W7@~b6YRG0epoovjjF6F zdfd6y;;Va~|I{8v(o>QrzfyEqEAyKP(9G~hSq9g75-u!L+G|glUnU+&xFJLtF%gQ+ z^;z74Nw<4xeW22mZIEH*J@Xdz8_{BTXemfmH}yf!=7D{}Gt=pEc|6`}LDxg{g@e<2 zn8)>frAd#>tm7=7wMQOsi*od^u=FOV+NRr9KdkQ4oAxpoKlsP*=Z$W?wyQlpH!DXm z+;1h;9&j1#SKFs*1HH!O8n0BAhBBAruN-B1wmR3_4ebGDFa5iNaZR>G!J^#$c83in z4?b;K$eOWRX7Bcz?QeP8Ql3>(XyI8dHhq7->4B!O@YK}{HQzQq>Q5-$vb{c%+WDRL zs!iqZXZPQF2~O`nAhjnIu)iT9|C0T=qF}7=oCc=is`5b#VQ-cl%(GSNni! z93A9J#5k%2AeUOYb0GcTQmD!u;f0YpqZbNC_U$_`Z=&DkQ~3H+R^yWcPY+hy$_f9r z>az52A~6@(wF0l_#x9d`6=sEe{ObIwE@|v}UAV`$Qq)$lPDxW{OvqqPJl7$8^ZI-4 zlTzLBQzCN1oziXZz&*-Wb%mg3?B7NFHd%TZ_&ZfL*D0M!*^lJFEAk*6l-_kVNz?@3#+(7 zz9h-99}u1JYB}*_b!PQf<%`;UpMeWt@~-tuPvCBc?+0teW8R-Xh)H9zDbZd@t0p*l zz50p58#w2q{&?{6m4{w;RE`ix-|gn+kIibFNE1+z`uY5;9<)97LF0rNsPoVRY0xfX zx9R3>5hiH3?AYweZ>7EN)}qG!{akhIZA@^Xi|D1~S>LCqe2BajnLE^R) z`5Usd6BlJOj(p{mZX(r4o96!BB{yO>Dq8C5_>BF8Nb+-dtB`oPQ0(j26!1qVjlD|x zuB}=Rc1@p*4^DcSY2_6``rdHrd9l%~|MLVm#6SHe+9fSI?6qt9e^K`qU{SU0!l=>JD+DnzjoKZALteBRjc4M3IWF1ysQKb-Mh6{<2^l<75UnX z02{{$XV<)^5C>i?&~PK&mQ;dv_uDF{YnBUeQNemd$_G@KvGuC4$pWimSTnU5dX2TT ziZM@3nmowU-}G1YIlyyu(~ogp@cV?l?4B;{g?p-(?hsJMH;Bh?URD z83i{~ZpK|Xl4NxR85|V$eU9u)oaUDz8Ex&d?(||n4pU}2|H$dLOh&(bE>cQRa3M>! zHq`fWx}u)#Jjna1DX(Tz?Ls9I$$n`Fa0d+rXPeJ!K48)F_ro^ooNKX;`gIiSW?vd> zAU*yjGJ`MOz67&fglr3+rHVA{6PI1j>>Pww21x5NSjA~9`y`W?yrUca-BM9%YXd-! zjdNX6?6P@=6LSuq*W$;!x?JGwL)hk9P^{-JG%A~`ZZ_6h`6`nOS{eFuL#GUZs3;ZB z=Il>VoHp+(3oJ-W*U5*?7o@m(pyDawmCQxTRP)u;;VEI87-kK)>vo<}PaInSsZ|Uh zmM4`PWH163$lNR_kGCw8$Apc;HEgj3>Uw(n5IDD9?|A;s*)>DNIXQnZ^)f=V5uj8` z8}!{cIb$}(ACwzx7c&lQR1~;;Jtm2rI~uT=t>Hhe>UOl4^80+KFXw@u?6bRtEqp*8 zk41W%uDPKb!vyMr(=MrwJVz5#B664W5{kr`8t3F64o{ui{Kyz|pmrIE6HgxX8la2$ zd86uik48Dhkdb=6&xB=UWQ_&Z$`iLCH0^QL+~XFTuY4iXzZ0-AZYSeEFuHvfFV-wG zv*FLxZdh2Xyx}QT|C@#*Y}bJvH!fHy^%i4!6x^WOv32mK)#uTe(?hBQ&!)nc)Bc!k zkvA_FTrUzXF%_VBXU1FAj!2?O*vEfc+v6y>8tvoc;t~R=TcZ#NL^>zNldj$ zO!uG9tEuaVf?l`>kSxh?sz_#KsSXvedfb&S*dJ=yMF7Xh&W=e zTH6+o>-GXFhIq_{Q4}DinVX%QL>e-m7>9Fql-BR?PuI8kL82eTFdLORJ&)Fy> zGL=1FkYO?;2bGlZNWDBzpR-Ewhg1>{sROrpuC$BjOYz`}(= zI@W}&95P=)HUN|tecBW{*xIptHs>OW--tM7aWoh&dx;&2FFnA1OKAXYk5;4=>7eQi zqU&+ruxt8Wk{%l;n{@DW&a8|(o;9baD=XC-d-O&ZSZrGweT8?_2$~x&y9w_C@?+vo zCdL?x{q^4k4W26O%K0{s?={~JV$pHN(#F^uq}ItRp&~O3M%Y2V*_o`aU&eEm+e;~P z0hzA6pv%{Xsd=JY>apOYxtbovC}=1BD|U{4$ErS~Rj38KS1l?>1{L#;l_Q0(8}2ah z@FD4%TCZh3*=xkL=(?-ST))L?L$`wX7x!I#?p+x`vLeX}Uur0iO#ih=HToT|Hqbof zang@**t5iSDf3*e^MJ1kxVTqueQ!6^EMR-!<|jK{%xG%J$uD5F!6n%y%a<5(QMxG0 zvA@Q?ocq<(b&XbI*A>-ols2NC-a9o=_}=yKT2FMoYuwTGOI^gZ1)u>W?&_Es8MQE( z?Ncg7dD?`I8U6W%LpmDdNyf=;+0PqErwJ&L=k+mmjupx)!sK=yr+$8V%S@#k#dG%) zzx29-p4T^R>$d<@=gs+eB>CQCnNzy#{&TQ;Y=j0WLu#?6dUU17H5;6R!PW09y)M+3!*k}o*g#rV6epB8$Pb2N3W)t79&Vs~2@K4f=aaFIVR ziHL|mo}8X+o2~yi5I*5pDs$3`UiMW=K*bBIeeWqUQ$C3Vltcho`wddRD|#BWs+@6u z*XQa25Bja?yhyJ)5oF$ji%Bx7M2$WyD54*VSHqWyQPw z#Z5Tv*Z}Kkm|%H_G1>CEV(e1;SJYei$~c?K{!Q0}!baU}k--Nzh#ay>x0?YVMb+X2B20%1B+ zHrH3rYjJGQ9M!ef)KLQz43NieG1rPlVRCMsIj6h4eH9CyhG~O5fE>sj&{=e7ESto+ zk1~>G0a$_cJWx37!-bgd(>;DpS;#UrCMm@Ve(d|nCyMoAtkf*N#zR!Oex=v*DIEwB zSJhcu*Y#m}@F~WLfG;!fiVdJ-eo*$c%A^8%V2(|LZYt?U-UH-_cu*C&%_u)wi5ZdB z%e$`Jsb4ht9cU86$H?S+i3_f);&jWKWlC8ZUK%JDVA#cr^*WwO&RtIs7XSHgV>&jzq6l?79g)#Y@c?zt8&yn(VBdzf06^Q$e3->3}D%Uut@Owp)heG;i=7Xe>lg6 znhD8oZml?+oXr4D>ZVBHO->8eOeq?-%znHO#qx@dPq7NwZp-xS`-e(Lr>0l;~(zAL{fnI`N-g`IsB94SI~JPhKi!jU{uaGNSqrBnk{&y!RUd7rR%SH zaMiWR*^I`Q)QP^YVy+rSRoVKMD0GuueC=-mZ|=PvdwW^vVZuJ22)+?9ka ztyywkRUgPkdgOH$i3Bz75dQ-PMdz|`c1{`l{$$=~qmljK7dq`9UCR45brURd+@5_( zs*L983thR8jzCs08OqttXLO8|*89-NHTLOa@%_9VKQugW+|*HV+Za3B=Qt+e&fB_L!qJ_eRC-r}T?Na={5{Tm%5Or3m$=OB{i3P-+Nvds0oLc+*SfW1;{br8 zYya3niSB9y))ruOso?ZX_R8?ov*hLG=9Wp}My%4(GEUG415$e*-yIShpy3kOdwGNz zgsD-WZxt5;6DpZ+iu^c`7^@5POLjhvIUM8mnuQjJ-WC@Ej|Ldx2b>pN!YK<+u`yWH z`y`QAyDKs0VM+&M@?)9w?V9g7?xzmx>h(LdG&kq8Kr-od-r@2ab~mJuv6O)xGcZL= zrSe%?TFTW4gZ2eL!p5!+0DEnj6Dea`p(Pd9@N~gN;MMm%ez&5S!r9T+>Zk+S4b z9FO&cDqXCXhyTk#x#gG+hHzQZD3-@?p&XZg2F{y%=J9>sm`NZ{s<$i~w}sR0&q zg@?kHy9JdNtAOzwE_A?v(Pg_T2E(J8&k$6iVpWLy^M;mvK&)0S9^BQDCy#n;FP?Rm z>GPn)RnZhpH9~>KGmp7nK35qaVz0OkEx4THj8;>@MR`+~x)nu*YSlRq?;pFlW7ftT zDe?!+g@WSU#rPKQd+DF4$K`5;Jfb_a>}SNg(7dDUeiwc-o;Teg<<4j&Je^=OF3x5O zW|L!+V;z;in1zwyiE~d#Ma$gN)F|io>Ibxd`DUUV68&ZURqs1QsZKRgqH-dzn>Z$<&b^VOC@Z`0>~r2_Wr!_nErgx{?*ZpNKL}~tf zhyF&fhhkJFX2IonRPTUA%J5T8Cr^YKRj10gRxff5u2)rO4y+dGM*9avTU_sFx-!sb z@lV4?bzkUT3hnC?_>!meaPD0t%p%yY`57)#}abZx||U>+P6tZzj#nC>!_my*2k<^>;p7^P1PrZt44) zPIn%9(f0b=n}vr2TLVB&8`?cjB5@g>SvMYJoNzRFO&DF_K8d!XWd9&z^vSGja@!L) zg!+@oV)a4c;*bRGyufFquvW^M@T=atfuly%u+y90&D4DHfYx%(e8VN*L?@)uXoT0w zFANlt?)SKXrPJNWQA;ElhddYZUFR9+`u{yRgj10K2dYll22`| zK@Ore%{~v-zXt5gnR#56+f&;bdBp&ar^INODNoz!Uz+ECEO0{=hl|C5h$tm+xDcOJ z*lz2$rdX-j1r$Z%C3S0c(C#?WKfdqsqK2IA$K5xxUmt>fe2(RmUm+u11^&vXZk2NA2vhuGj8JiZepRR5rAgjUAwS83`wv zWy&2YfvjO70VOnsO^`86HD}6dY2G8!o%c;7BMW%dwA}8rTVYLCVyn8H*>??pc?1}B7TvA7=@j56)C~-Jk;3Y_30+#Y zCfW4;AQY3hK~0B4H06(2M8{5Qn(?hqp&L&Eaet7P-t5}XBh_r;VxXNw7hk&0>fd+q z&z`ip(+23sbpo;-+jb_+7JZ`6fsVO-&hz4gutrG8-?gWKWkRpi#M~$CMY$%n6JHiW z*$qxDLn-41FdKn4x$f<{#FII_``$gdt*m=`vj+iA*HRC9QTaJ5Kv1tT0xCIb%$NCR z1LUGLheKdJGm?&6SNm`K3CifPOsb1A3nP3&nS!zC+iU)rdC&o>6Bas|xZq)XKk{&I zyVyOrKb~@)61*~-olxdgC$9vK7ZPT@A1L%BLOe+(d}2|buFq3Q_*3j_huCECB$v=T zZM4g?i~3oP&MsdL#O>KGbyYSsFm$KV5~FU)G)|xA(L8~;PXYzcd=I=e%_GjoD1P`3dNUfab$S&dT~Hy zJ^K4a)pFx^G3c^N_{J&gzLD(v57A8A=`dDfu#w=TAmjT=y1?%;6~+ukVrad>34!$- zl$$bN5DNDE@fr#Sp@Os+#e4O#Z-~Dwm2c?krYsYqZjx+d-Jj3y^jB>_j2rP=%W&O} zdC}F%?GLmMuWT%>$o?^DdgjHLjtY|6C1lk?XMkXA&uvFLVxA8ylX4J~z$dVOxLgy% zJZ9u>BM@O>*B42(XEw$~9!@5AAMP(g^JC~9x zhF;&5t^29>WYei$MC0Kyu*bfE*7EwXqg>uM;(v{_8Hu*SF-JMa@VXs|(tL<`E1PSS zzA<3kEuyw0ao5)z1sh6BkDBHH5R6jRSF^FPF|o0^jma^iY{4PQVr+AJmn@<(QiK8u0mnxC zD~#!Kefe6w9s`skDOe`70E_# z1N$oJw6>peDk0`oLnA(!TYB;7ob)JXJ}`J;bIgOe zs)x%|9u}xi#@$pbYg&R@yzsyafukOs<(p7;;w}b?F41WWctL*Nkc|AeWm>w0mm$5l zvblNOQ+-xf{JprT#8y`M9$s{jiJwsoVQ>(xu~t_(I{@w|4p3)Y*VNgqTeom-0@uG$ zXN1H6bw>ZE#4Uh2<5eS(#4+Lf8_4C|+g}9Q&1(WJvuKM#p$V@c-it0B-`|}cSC8)2 z*Nv{9H%j0t6I`1|Q?X>yX#Y}go3nxFqKz}`M&8wjdhsiK)&l$sUPgI_BFe^3dsJYQ z!>_Rhbm)KjjQ_f!X$Df)v^E6eX zq0;?d_0G7+Wwy>DS%x-d1JpWF;Ec8tGouVE8$Di)266kgwKLwP?yt@)+`O^O%j5gi z=kKp4@_*Y+1yFszZdnI~3bZu3e_-Zl3Y;0;G^J%8F*Lg?{x0S>#LbGG2E>8n7S67C zC@|S}*=%%=_UJj0E*DQb+c!|sXT-2Y17xI;)2e}ka(lF7`Kt81W6@>&#nb)^8@-A6 ziq(DU6{pLYuG;dN*n_G4b-8P2%6NFN%xW9u0Ez9$$#~=J6_`<|ew3uQktU#0yRP?!1#%jtkGX z@L$>ZVbyYpS9eIEmy?b3PV^mqF;UgWM#qsUUTnuTAJ1sjR(;7% zDNiVC%P;YIUq=MQQanFi{CPuq8Zhj8?W`EvBC6uk+5as5k_^Yq{2fx_ZhB(l@}MCQ zA$Xi`p7~ll#@Tos%06JVEsW*o z4F(9IrlHE7FWum#|KQg{ajUFNO-r^NC-=z4A+-KW{v;@Uzi;u3~&8>$Kl29u8me z`a3{Kp=J+MSH$#AVL`t2;m;eZo&fZZlT7mcy6#u##{w)2?pK?-WhlC#@2oLd1K;Ag~y|- z+545;&l_`zF}hd5J>TX54$9|KiMvuFLqk}q_LuE!WT80l(#<>k)zM}xoy_yFfVWtR zyRk9O(VI_K1H#UFDU8sIMk+Tib)5s$%C4BrC}Ns|Wsk(mza}QoDSc|6z?W;?Rl&T>JUa%k?9XzG# zcdF1^`m0Tb<+h)9tj*RAZS#tg%6I7wS%a09%V_lGi?v{=)OAnXY5jN$)TB z>V=pFKV(e9z#08}&t*TJQh*kJShR}2AKZLi?lxv{zw3l*)vRLCDz>X(%6aha`unR- z@pI3o;`TUYv08~QYsYghJn>5HzRqVlXoSnYJ!Y+(+EqqSj|)a7)kC>fqo-_#MM!AJ z<~h1yLr6$}ZPt2v7ZVo*r0%7Nr*&Le$`F_;HaNjjrxBk;gAn@zrSMHIy8>ds~irRc@+O zc;~IySOa5=c6&!ApSI^E$}#A?dlcyHZODS3irPrWmT-mtQ`?G((58vjbrn=pFAqH#EMdFvqUK=`Q`}K< z0K=h_lPSu_lom{=Ar9->dX@|43>s5y1*B<7nk(Ajep$^7hM9Dyn;%f%xw7%}V#DY=_RDPRk%hMVP+j ze+&`uf=HtnvT&T-=?TMt4`qn(G?nc?}_6&++Kp zc2rc9V~{5Nvm3mc?ks_0gMtADk-Wh0ZkUIG)5Ca(BSXR%EHlIsiYebp;84DWF1{fl z#^nL7CvO1v37{Vf#8;Gi0_g7;Z~~~gW%sjjUPKTDa?9YhQ2z2F5EQSO8z_^K7>IG7 zv|p#53H+78bteCK$uI+%WRsd+*L?B~F}~uj3pzSwdp1y7H2sgD|FPea39u=wAUEyP zMe_|vbF-Ej*p<5XTxDClP*)-Lk*l*}bD=K2rZ^ZSY-+423JhRN6*z3Y z8*Hor5N^DX1zt4tGWp-`b-ao;c{ z?n+|m&0?epMv&lUqUDNvR9x3u{xN(y zg}eSw{;VlqUivt(^ul{Mn}r{Odup3yO0XpL3ux);SJVL`E2$`%SD_&g@lo2h?U}rg zGrd%3lX6RZj2S#xC+l&x(E_F*Sb?0K#XpggM(34(qEuT!t$!lx^?p#5Gn2?ArQ%&_ zWeOr#& zLxx!z%cYwYW|vV?ZFAenRZjFFc#z6!aKfdTi!K#W%zxkgw#%HC3O_`O{{ID!g^Y$d zZ#FA0m0COjUaS#0W5YTs&xVFy-$b0<`3z%sLACNLN6?m+oO^iUV&yR_0k1-HnFiWEc};pFGZt-60J*UU-rHiYbp}?eHVZePoRXK?R&(SU;xLRjIoth_jSP$COyLU(PMV=HbD+ z<1EP!1rDTY^uzu3pgIHx+Q(c-loXUUXJInJY7|s(LL#Le4BG+8yUA$-TifWL3fa}V zyHgh?EQwty2@2Z}BVzS<B*PJ?0{qFr|TC`UoeM@(~Y|bc*2JQpZ#P&dfzQeVTfkDd+gkx`YAdGYE`E z`3LE^Xgbo*CoGdas76_sr7SWc%hN-rFGlI?9G980<1TUc0z{w0ewh8XE;$Bw&ew@l z;Y$wjNc$q{N~#hQN$lEE6%5<*{le$Vm!teU6Rs@f>| z@?BliL|ZC?s1h!mEfxx3CF#Rb7$8fapFvwO9$j^-hOV6dzlosB^62_suD&*u`v+^~ z_9z9x{rKk$DN2ryN8Bb^V6eU%?t(#G@^ZMhQBr5j4qtiR)Vvytkfr3bQnOl-fMS#Z z1yKXPvNju;i^4rTwYqxM{!W))n8bs*$TQ>Fx^r`wd)@*Bcc z@VR#-+h&|5=L#hKFa_N3eI1jie;xdqQJ}cn2<4Ls(Hy+Tj_-Ijqrk_p`LpJ z9Mg0J1P<QU>H2U3h2U#OH>?CF2raDKmKN|}#8H@ShFAc8#=3%1hgevdMG zpZ3xdM(&oDW8vPMcerZs?AbHisxl9%>5OGF=MI+n5S9THD7<`90x@j=Hh~o)iZ?bn zjGwNZ#jX!!$}h{V9JL$LYFH1$kj81VNPIrq%N zm#PVW;m&^$alJv|_SO9hiW9Cq$_P`O*jwJ%zNyindk|GYs` zx8B_TuVX+knDvqWqwLBQ^_>S3>hYu<4`*GINkUkbJaWrHoFXE|(=Y6(XBE)vR&0G2 zav~xZAi>#r8Y*MZho**U3liQYLtT(EaP$n1EqZwSf}iVDz71b9UCs(zrf36>^%2|x zfmX6HmuR2R*S%!JICujU43~A(DmF~(QYW#gk9{oZ|11U>X1Tu|d^m!yp3ovhfWEWq z`7Yc5H;t89Z{8mwHwO(R?P}Y%2vi^2nLbT>;H?uvz*WAGLu_)7oK z+D`Gr;%P32M&V@i$mM9#rxs3%32IGCg;QD~O-O))dWwutXE*qN?Emac@X+p!{uOtB5wz zwRNaa+R_1NQA((gB8!9QK3SNCYHOi;$g-9$JnZI~xm2mEs=M(#_sVSQ8E;YjF zzDKTy?dZr;&3im@+kwg}Mm~Ke&E_1Zp1Xqah$ZEovPQ~QeAfx9T~}kElTEb+_YZv& zC&&hj0K{xqD34;VLb4}@y9zVIV-dZDDo_#XrY8?t0g}?4l+IZ!|`_Lr-P?cCz@>KUv2Zu z^BB#!? z2K&@A!!*7!e63L5p!6{2EW{uO)IH-6^h_uJ;g~wbNjfdlxjy(A-_~DcQhE2aj}*j( zOFh6a;Kk+fGN;vR%k;|0qh^(eW#klCol#iWu^-gzo&31)-|je zxyg8GwzIUYX$MT|{AT!?!g{$N@3f$GX>wb8I2jJ<0ddQ1qh)6L?aty&SRYnzsGJ=M z?5O@%k87gw_l^ELK*alhf}|g|^K0PBlGfP)IbToCiE4BQGI7|=%Sj*)1`0O`Hf3f$pjOGug-7JM+wd)ffDb z$NzETpabpvixWG)%+L%DHfR7wz$(hZAfhlv zy7Fsi@>8^ZO2shbG284Q!Sl*A=N~K>6{m<_<#w+pgimIafS!vi?2K}my=EZdm?nA{ zC(hw3pyo{eOi)zbSI#6@nK^8Ksk)T{P@POO*F@H;-D=GhZ&U4t+dESFsMev$h9^Ay z17kxu@Mbq$mij9dclyg5h9@9Het~q_9~3gBPH-2!XY&yuLghN!lR~k;|~3@zF+U?R*3i#~ERzl67LjxmVj# z@sU5C^@UilNr+GT29#c`1MZQuFLggP9R^oV`Vw!@l^fg63=u0;2foRm(#JYuL@^}; zk$a#n&3Mr^GXT2IKmmAXUqcxm&d0|(A2FEhM_Xrumi#{GB!mp9nL6X7EF6FBSw&ZUAZ$0?<_&5)NA$9f$8E3(K7(=xGSzXpjiC>;>E7}P+A+3W|o`D?b z@#nXy#%AkA+44runrB)SOOTHcg{bj%*-ssc{zmT={&@RJQ>*ot?fQStye?G9sV3NM zR0t+!E^Xi|R@tjU#~}r&&9wEmJZze$4YhWike2<_=AAf%$^I1pA^ z&9z0Nnwd7~#4q%3OhGl)sT0!BPx>D#p=b`GscGd|L|PS&LFvN`oS0mV~fM>2cMiVX!?b?9qL6IR&cYV@so{49(m8GXA`EX0tc=J8))F z66PA6P^ePrR#77z^G zWd0@!QagBMd3-{l6kIu5&uI*e$W>>6tY2eMFV@!xrypc)0zaLS127>!eWdz2vA^|!6p83Wr4-{fr2 zeHGzPD{~NGJW1MgZ~7#i$I^GfTuRVQ$|Ed5G`cj+NCIo~N@rT1i81cQ4>Jj9lU3Lb zFrkB845Z<@eTy;GV3sTD4)&mXGgwbJz3M+NsCEte-^28tx4rDim)sc~v*fyA6dJXPcCah7! z5+^;&a&C>5OOek3qQK!}+pUQ>o+w{;CCu~N_i9ZtACSzTZE>wW#)B;k>W;>tAFGjM zW$G+%b8yQ?-yZpsLvwr3IZMD0YR}q22lFd=IC^e?UNuo=E)MQVFNa42w|>noBW)x= zFPtDgx%w*4#H21Ze{7B?QdE=Npofy(4&=;bhuE!=8!sy<#DqK|=QLiN>B>Av9d&BCW zO#+^oi+z@y27Q)%6r2VCk?%A)Z7E0<(RmGLtiOH1Dk=8{t?vk<9G|$Jg2!!2Zz~~V zZ_~pw>PSfDqt!BkQrLTy=&q>T)q3@7^WNkct%Z}>H$@Z{J8>WR(>i1MM8V6ymH};z zXQD70|8y-4>EU&65^X)khD9m#=!CJFKc=qILaX|W**HHy=6=G2LEQ{U4=Mnq1v+{R_ys{nR@6eNNc) zr1Vki^SJ2C0omL?T9+NRvjQI%TK>T3dlE{Kq}%c@zY0jitx*iOf}P8elBOhOoG`g( zR=$>i<-ffeU-l&3Y->k`B_rH3ZzU!}+khUV)-i$4%EOBL(m7ZN>pbmYZTRqc#@e`8 zqnu?}lnwvU0~i> z2x4?^7s}TMGzEjjrGu4Pvyejt!HwUCr&T-J!^3lOGD*mX zF?j0W5!ZR86K`Ak<>%lJN3R|lSy4Q2x~71C-teqGdrF&bYi%Cx#VGK0|M78pQfA7p zs$Z`H`+Izb+8iX1Ttn}Z6g#oXS*)v5ANm^2GSysTmzM5Sk?~=bN3JQ~9Ml(05QDai z_v7NGp7PySlbqjg(;6PCH)yRUmS@IzG2~dI!?`pfUP@0k8ieAfTHEFqNBG{RSeAVb z=8>%qPSKwdhKBkEd(JNn=Q}}|0n01?U@^2Zd0sK}#U#4HMsuZP`J-w(v* zT$$pO5)GR=FPMrLn`NtFMUohq^G8jHMmQp|cs}$Z{6BAi@<)8=rk~^RMTzQ} z<7u>qVQP&xkMw4xLRg@9*pWYfFn$2S7Pae|tL_1{#+A+ztPbXGwyu*t$Vj;wxpk{X z0{!a--YbRPX0tP8SXn9@D>bsp3(O1j>8Y5}4m6C#e-A^q`RHVfnNBMeq{o9CiRE5t zUbKEppqVx=S0W#*kWT7}R$wepm%Ic>-j5>9KgpU$@Im<-ePxx6yILnBWBV%^Ya+h<23%bJqiY6 zNRJ=U{V@*z{wOVnb5@|ty*A13lO|(jKC_xoTq2D{RU+5YWoBqB@}7{0j_DEOVJbxNt1D)vo=sVwDzG=veTAj~v{&ZU83d8V=}eDkGgl#1$f+ za*k~~^wQ_m3~6TG&NBT$V6}wFCf;^@dnPotGHG(LdzDffc5-54ot}X}JVR!AY4L zkazoO1qF;&s0QSu5A<2FFNX&W3bUz^kX%y#6y@zOfej$~P!ryix-o_B>?h~Q1t{84 z2bGGwcu_*7Z(%!PzS6$#`kh*r^6OcU@nm?4qq4Wt6nFU*%<0Wmp=0ixAjfiP(UCtj zZ69x&@Ianyd6cOw=U@RTY``CAPGG@GXmGgau%+q2>TQ$U9^>{fv|;=6Xram<4j#Q! ziV^X18s*{#7QETZCo>^mhL zec9L7yPhxPL4NXUKTKW5^;o)`zu81?sFy~d#K-1#B~srAn=6B4kLAlwRHtt4W)ta@s_WdUef{1Mh=I?=;??~HxWMcR{phwMtt^c z?EBrUu0^dnFpGz_9>z9mAPQ0v(P?gQO|>~t)lFC+$v0;-D{J7>tN<_Sz}eT=XT?VW zJ=obCoB5nQ>Ttbl$873Ew>e2L|4bDo(D6REcXS0p>=zj!6 zglFtJJ-@d15T`{n5k-?-vQ^}=WB5Q9PFa{zpNb9D8OTA(NJ+AzteFG1d2a8elDWXlWzkju- z+4a#WqW{wQ&%pf4g#VSuI%JCIdu;Z#Q;YpoCm{6qs{MM0HV&oZSJ+$m61Dr>dKdjq z&hN;?rBD5&>wf_N&L#kN9pbd!UH&)lO(2y0JM<5bKqOtuY(UE_ki_)gQ~s5~e~$x{ z@$V&Gf5Tsu`pa4Q5)t!5_9Y$vOP3$A9u)j9)!byAuO2R4(DWG$qy7R1@<0RC`*#P( z@jCQZ#@AW>3Pr@YL3<;;U+F&2nJ?!WTCaVD;3+mY&Kh>!7hoxLPwV@op|s#lR?G!v zSkM30JOZI@jDhZjRx)`^mjwM+{7*bmFS*r2C^%L*(^1rtvx20&8Z$p{C<>Vr^7_Vy zu92TIHz{T^F=wGx&h-D-)KFKq$0Rcsgf%Oe_`=el;kJ?(^01{#4n0V4FZ4G5DBXsw z0hA|7TE+V7hsfPaj=!}RXY17aR#^I5s#WbAQ?P^sjc)&lfF5^JHY124o z1ZC$&XGtaYCSycnQj@8MpaMUmC7-h7=he#rL{3UlP z%UI$@>Lp(QW(<5Vde9jhppY`dO32l>XXJ>#o@c~@ zI1R(wGr|;W`VGyI~Tt4;1$_+ClcA zgG1lD-=!N0UD-P3_@sA|8*n*)HT+i<&gNLNuZNi!IiQHcN zuw_c`U~FJ-6pgCXbBE;LXW)-p=v4Z0Q=Ux^-_arkl&cEUNf5z#5X*G7g|!gm%gwFbEDki_UJA1LNvkya`8a# zcN-A6kwWjJ2_BUpPJZ5qsB}wJV_oHrMO9*M^I6V#E+Qf=`Q5i)GpjcLVQyOd^Tw$Q zUL$qOmn<16R+Wp+QEBb_{oG%vF9LdXKze;+xM|sToK!3~87X5C(ANLq-DGxwBLARmn0u46@GvGy(B`91E)lBWV%gm zi33m!2PP>BRU*0y`Nm4J&3@kC5!o%DEGU0BT|Kybk8>VKE zwvHr1^ZysUe-(j?XF5Vi+L7~w1(EnCWZ&YLFb+bgJ0i`FCY6QbMHM*@ZR8L|h}Z6Z zzVlt^ik`V(GR<@v5(kba%vNJCqFO??zY|i+VO`x0Ggv1ZR@IR1%#FAce={yR_b$Kv zy|=Z2D+FXb*3}l=A(U?!?tIjy<{u-cyg&W6#9mgSVnoG_b@^r(KeJklK??J`{@gTF zw@J&L_rxD1eRJtslRmmqXIr@QYb4{5ntJO{65WpLASDFhj3_)5bTChNjk*1|AQlS& zB$B|9S3}d3k;D}W=x0GluXd^Qk2RRA&Uqi#>x+Ig0L$p$fr*r zgnB#Mg9%=)Cc>hZQqqhFnWfogDkgc1{m`O)j&=$HV-1$6ka1BCBP8uYIWhjENpuW8DKuG4`y3~oG zSF_hhBm{$#sKh=cvcX{3eY>u3 zDgKb4%)ydt3)?>S$H;ChH zYgg_WR0HD2pxsO)T#x?7>tg9_KGrbwlTZdX+XtXc`i$0;{Ft|*H8r!P4!m8iC7D!i z_sBY&<-v+wKR#q&0>1o#D@l007vO*KVOd^CikoS9@_E1OpOQK&rsbo_3wG+jVb4@V zh;)cvd9Ey)DeuyZ?yCuB79J=k(krP!5hk_0tnd!XcT1)c_iolaowa$?F<3KOLJn7c z9=@*&9rHk)Jq&iy{6v%G-=RcP`^pR7mVJ4(x5t`_ocOX|)-^wt*)%_V-1Oa`_@o0BtoqYTQylqIg{^tYp zWL5u9HZ4^w;QDm^ju5#g%bNDerTR&QSTZHCg@6mLOz9U*CS=Kj_xrqo^KRQPr<;BG?Xfnc zcI5%t4?;I?^Tn@&8`nq+L+x3=@cG8(@nC2}-LELH228?uOc_{SMLdnL?!~7pr19OI z?rfFK=IB?P4<%kIcW4w@0|>Ol(GDkeQ}X{}?>)epYPP>o&;SWF1P}-{Apt^@E+|qH zNGJj!R6*&|rHB*@y@a07oAfFwARxs;CqYoEFA6G6#D;)f5WkJS?qHFe3KA+OFM_u+8UOVsfVbn$}8kH+0{j0; z@{-mU_y6-H4nMXsaWj>=_`1={OpNo>*BfN8SIycWspUG>%YF@WQS@bSG6I@%uK#r6 z{+P>O+au}e`icf%P%ak94UX6Ue=zb?htH;JDcXXs;3GaF@QL4#yDtRzCd|f^_ej#3 zgEeaWajgkQW;(LvsP?Z#8C9huV;`lT3bG-QlkIenazY6%8+3Fkab;#T!IzZ65n0v( zGQ%hP`B=Y+r)G0JfuJaK4i1?{HsO1ppH6SdMY4u3!fkIYRLqg_Ke(caX<)VF>u)P0 zRjZtZvu0HvGxHep)xTVb(g;EkJ_g1{X!RyyUpKT08JjRz4iI5b^(6p|E7e?!}r`yx7?WfD!^U!+y&C9$zO$*;!NJX79qivt35PyXRF^joLvMVzzZYTw&1}woir%m4$Q}g)E)2 zDXks&@V2E8da+uf>#HJ}Ij2-?Np}+PjuGA;XP(CW3iypZjsQh13twRRc)`A~u&|(m zB%N2H#Tk_jHV#kcxio%y;(H%p~=-%a0bi+uuFjou9CJS#4C)2z( z>QDMpbK`=tS{qbk8do}PQID`DBt8~}Q!xdVIXp*k^*rk97$1;g(4>C!*h?W~Sc9W; zi(NI$r&2A2ch3ol8+2gVdO>0C~-j6Z;lMkN$rZXXKl=BYfRL{g(t_J zh`UzSLcHp0Eo>LxBjM24;C6$y*+Y!49Fg=!Tvc;vMUf);1FvOulx$l$ft2<`B0}`HJ_~r7}Z;4*LfRt zLLzDC>(W{Xa91@7TcldgQ555BvMU~Pn{eCYN_nB!1o64CF-oSj%z0|jab7Y566_fs z0-Z&iy(_-{-QhzGkZvBvww&sB`lChxwb%O%2^}JN9$B$o`mhr?J~!^$-TM5l$AZdS z!OOo~6oY=%_u`Lgao-7vSVO|>B_=)11zPVyRD$QQcwmg)fj7&vvpJ(L2r}{}(q4IN z14BHaAw+~=+`*=V4>5(K;$|kY@oZq9M_w&4FCy+L1Oz^|u(p<-_eEf>j;dnXO)T8~ z-W^4)0}c@Cyo0mS{w>Y9M(SxONd+chLxtv=HW9<)M>6o&d78wBIRHEN9INRh{A9q` zCmw~TTe>JpUpRjo2k~LE5w|!g`;tfaEOEK;qw0k5dDqzDEY;yrCn)YwGrPv4WuI}2 z$B>C^_(6UxZLYqOU_LcVPnaM10o(Rr31oo1&Kj zbLGc{c}JqCmlV-&+~myl)Jy8P z7Ci3@sVe2GH)UGrgT*tzP(g}lGRjC$eD&<~=4Fk~w7{cX7p=Tii<2(vu&gAJA8y^4 z=C)2Oy4SN%)kWz;R6mk-xp~wUbKPolCDi~MbUNz?FckLAd}Tw{A& z766u*-S@9MjN?{D1eFbD_GP*|4MYqE8FjNkIK%5CcUqaSCzBE-7EB85#e)lM@#8;35Q&@gvpz9*SyyEfT8s zo{su11$c?;r2J%vNmSi3eXq@jPn{PTJ$CQIws|Gs6LcK2$DaLa-??217=hVe7o73_ zCqwn+WQmj|;2fgq=UO7Bh7b+}SK{YGLeFrGFVH^a-nXr|H_>$C(f)Px)8^eytKxK8 z&5LGtl=Y}ZLRVqoh?U+s1LA!rRA$H9*Q-~p{bt8-rgSY*+>WiyiKF0 zd_3!`0k3$6FWNR+LbR>baPo9l#r-Z>Qva#DpG2N-1?XKr5EW$Y02;eQG~eca9fLd` zv>W<-=>(AZ+^d^IPbDyqmMN{kPII>GQ%aHc3ADdT(HS^Q;vNRWmH`jPUHyFzzT*eL zFoh47m3?`0&ML%yxiAx^<59V;=7M@kH3;SVh<)v%Nys{ydc>=^>8_s*(#{kqI0x>x;7<3*lYC znw-BlN&XbnA&~_0n~BwEAEk$zX8M>`Xjhwt$Uw0t!-E&yXjl)M^8MQj^<( zZ{2d&Q#H(N_ys1NBI;_zw(j(-Xg3H@P3|S5*py`Tcv_B`9w2RVYqoq*xnmRvk1C(u zVcvD4h}JKTFBy_w&)~~*3zAY=DN}jerbbE?mR~U=mL*b_XcJb4K~1JHlEboZA&x+? ztL&0mkvw__rml|Go_JpO*2CW$G{^N-ZMx~JXmr_1&ld<_@!CkkhX>1+U!fd~?t&)p z`IqPK=)b=lUNx<^PP&c~6@eh@y9LsgOX!Lw_T(dkj1RL~pc)TP{Mw4x+a<8PozN>7 zMP27mxPs&elA_J-$luT@0@^f@#XZy)OJ4VqaFJ8n_)gwxP zH)f_){Z=DB@m4A!0o6S8$NYQCg+0SpuR@m;O&3XT`d&^H_6S1sP}?4+(yP=4Ht7-^ z{#GHT?{YsI1)@@gq@IJL2h34;xE9{bJ)2eWj^;cS;>a)t*c*ik5@ z<#>OX?kXtnY^;bLT8`)>o!jr6R)kQbUI;guWtVLBLJ`~_`KG#umncLPE+k9Debh0J zdAOBBnTs!qb=EKY&KctN?o0iR!f!yEC>bv9JGnHSWKmVAPdeS%%f5K`Bhr>dYzMNK zeM<6R!ZY{Cx&`1lXJSUICQ?W!*LBSf*0R>HH4P(z#1uO zDF(Hh31X}@9*R<58-IaLnbsSd-q#}^irKi6@CJ}~Gx0EA-;O=YMZsLUOjCh#j%i7D zK(S$ro!*qz#JlG#^l!%wHcPyd@Cl5Q7t+V#@#zajv6$xZF=!)smb1fGQRO=hOG*BU z3B!Q`3z|`H*)V6vE`2$;XwLFxQ*-aoJ69(7x!&_e{AI&?e(Au|C0endH^&3NKfDX!~fOWFZHL=x^~l>8Ya5kL(<>$GgHw+ z>!vAJ}-Za$-ZhvLCekQ?T_9l>apk zKmizZK4!LRukTd7&Fs*g+o}4Y3%I@u@oIEs8G+*W?yk#Smi7pUO^k!drQa+kbWfH~pMd)oqJt7d>^-iI4f&>`#*Uvhv{WV; zf@)P@7Yl}9I!61i8Da^bsNa)OUbnJ3988&2RbmSII5E!vHja!sR4vewEei@CZL&l)ny zgt|Fr(SSSD{+fznB)sdcgI@AaTBXB&GUkM_I7qz3w`H|AH|cdR-iGK1(8Q6p(v;k0IsqBzVZUe zLa9|v3K?@wEJ|ion`vgFE@wa75tR%tTs}j-@_$WW7$Lao`oKogPr4X3a7!*D7L>RYwk?v>6H>fYP*c4+kW0fUnk!9*W^aVm zpM%rX^(Bz(bS0(irHfxnnJK2MytJytJgjo5skJH$W6i@}4=zSbBIF%Hm5^r-Nnx+g zlhFjaK*Z^<0-qJOm!3n+NUefnJ)VpgQx_EW44S{34Y{m+Z|CW2xMt=RNJ=Ff7>cRV zPbN9Z1dBHBsYu9VxQmyJ8{Y;cQVzQ)$<&)o9oy7|v1CeOj(8Ze!mg+ex5ZEKz7pUV z0-M1~Q}!g^D~N0+|G`cUuu_OUae--rKMFB-;g;q-!B2b^m$XbzNxz1)eH~mmo>OGg zfgwCZBy~NjYSN)wGBJS^C-AjA7Qu<>iMKKor6o(5i%ecMoVw7enfJo(-XA#~5{U@~ zz<2eSDN7Wo+SRKu7y@w|ib+eKO$8S3RkgLX%=U>LBR?*;bqE}oeDAQX;QQFewbpH> z(Dv|s>^y}%89qMlxpp(CA^0`T9hKialSZDa-L*B2lHU0H2N#ZH{l$#PA@+SRv#>!}!z7vZl;d z*aQ}P_knPgp#v1&^f^yZ_K_jY9Vi$JM+E!x^(Vw9WaC>or;$@P`1 zC#>sJ2zjo{*JSE(yUn~qFVcyXs6pRt8J|YMx5smaQHYw0NoBlfXJods_JDB;_$#}m zNV_#;V#3k%_1+n2H*>92#cw=lR%9k`|CL;^NBnSb@wQe~7n{L(*&5 zD;~${;wrBJ@jJXer;)sj6caeppJ8WEQfHDZ^sp#`i{-ezBUW;eU7Ux8Id(z zA~h4VLOxfE_`C6016ae@2%$nBor!zHeZjjdg9xf{e>5Gzqi@>>G`bG-WjNF@_C<4f zg-wo|W6EKdR$Au=c^ae=R^D$CBq^9y3@toply{J1_NdZ0O!% zx!vu9HgG4SsJM-4Dq$rmf7Mu`zdsc7 zO&NCeX4YB8>-3gI@eZMPLmxkyiybVCN{<;g$O+D{n7=c0Emi!HV)gq2mCOZwsD4Bx zE6_vz3HsqDgQS_jvlGjK{6wKdEr0e41NAAbnFn4Aq-!oIp@@FXjavNB!F=I_I?jb8 zj)jU#i3`^ztj}ht-kZ4B@lc_?D64Gaw&O0tZKdI3=+5ez?|OxPpu~n% zVEfM9Pq4Kz4`R3892X8}g-o ztcjtqP2%I(L@J>P(4u8n2!)(zf+{JUh!^Z`sXM^M&`3Pn-j zKtL8n;m)1pcqEc|RsA~`N6ke3u0$_o5pS2?D%|cyO87)MBtiLh!()NO~5C96!Karx{T^?~;X?a4#u zQzn3CNfy?(UgNZ0CADNv3+@|pM;qjQ`-NIfaKoUiBKu^VhOtbyCPZH|P$DRcCNU`t zbipo(=0K$inIsn^;*p@MuVY!Suqf}hoNqRHmc|wxG2=I#xaQwmWW9@$z_Qwr5E(B- ztQr*CWk}wNBlb_(4<)u1WzEOcw%lM!Qew-7;Wjt0YtmywEuk^0;pO<&bA|RCxTN3| zFW>WobOfqSZtak~(}>N$;#Gd7#c`{|CjQD(XQzr!SUgG`56m%DspE^xkj$RRlnv&Y zsqL;J3Ww@FP9#|xjB_!n4hd9>%~^fs%h-icKxnOGnt?~3W%@&gDGKmBeC{a=%$T;G ze2tSN+&z{hiJ%m$q^m3mWAa%!!AK3G8trkg0~?wO0PnJ}&4nzb<=7N^UjdDV*JQNlR;S@E+xU}f(cfs%s8*%dzXTL-r zT5X-mq1cV{T;Jh`K8Qh0E!31%YZE%i2d&!5Yo2C|z*AUf3a-}Qw9j@nHs+0a)Knen z_2QWzX48k%8)zY1lRZPc6~g=7eO3{IDt}s^5Be^nX5V*RWPqYkznC&HbwaW*T~0V% z0N-+6>1Mv3W&El(){DE*b*$hMWRO*Y`xRC>DA)C1GC7>R6+UwkC)J2(UUc_O58ST0 zaeIg7o#mI>jt_6m+qDOGrr(+0(f+t&wI9svSUJA=eyrzn-IFq(OXPYWefm8>1*E?- zZ&!QJ@sr`i>-SH}A}_uAa{I`8tV{|u{2^;3Kcr$Y1c zvoI!TdHM~qx?oJ89I)Ah;j0{iFegxABlJXLKy2KreyEOPDjfXD+&%MH-l*%O3`w$k zVG4IDe=qG1>@^K8RoN0}Ju=3AL9^~5t=ML)h}#eoEpK5`q-AEP6zt2*%f~U67pSo6 z56$@?Ysq6U2i&B|2Q1Ca66brU8t_>zFrB0Haaca*<6h`Coy^(qKZh~VP(24YR_qDy znQTCS&Tr-WTOTyji!w0O*a&0eyWF;BsY%gDa|y==__{s(L-u*=cWmc+UBq8li*81p_=Z zvnHe4mH6@*kYbVeS2GAG!4@7DchdqoljpmG2vU};FdU?JbJr-p<{lNVG>)6f>F7UF zeYLhqX^2`WZ)ZtKx%k}uy8LGG39LqcTa|v^906G<{ItAP{fRf9G~eo+^9TYf^eM=e z2^oLWm^=$kQ#(j)^_jTEhK;G#&}Y5jE{E2`;DD|IXAm-8BTEm&-M64rz-}uSJMtNetamr0NJc75#8T(A zwA;8{gZuW!cn*+or~X(BC^AOwE9Dh#98n7qEj)L5=$Yd&7Z#aA$Oa+VKtK={Bf&4n zl7ODHkLGo~FTYM|@!+PvT*y&>xmryRobC5!Wk$lATiqbDd9q`)^=A^!>-TRMbjh~5 z*ykmI?3SLUw9Q$D8XjG05x`$Psr)(<7z~sg@1xl;wl2GZBs^L6Pmy!2n=m$GIu6w{ zWA5U{t2N!U3gUtsPgK5f{>PJ@#^2{I~qqNZWtbwc!iVD@|msQC$Z#^o`SkA-@ zze+#KDjt(x)u0cSAc{Nk-cK@j5TG4>K9@vcw->?53Do&y-4#4um)JC@KCK@T&ere_ zRWPX{-BgpRju4HV;(Dhe^x*b01cUg{Q*k;A^mU3%5be7i!zY?c6 zQpIs}K2i8hC|jtenF%SLK5PRv{mB4IqVr+%a1vUPiWXm;!&~q3!QJ1c4`Krj*oxEB zAj*tGPNYGm9$v8NYRS~J{}hi3@YW13L|9z7Gw}3-=H8Ja_7L>AfjFhXlCXFT_->5T zdPs)_b3l^Ur5lKZ!i+rbr>A*+G||H+dMHf|tmmh`RKNjC@k9%zfVUbHDhCZ>dAta86`I}GoYefF+dh;h0oIJyE?rqy zuyITzEtF(YrmJgdWOI*boMen--+2=6@P@pJksD{_4=$sGZ&}b$H07>e=<0*3Y^QZ^ zdcv% zd0%-ShuR#Daed^mZfC!4UE{EF?P~cXJB!Q)SxOd`d)cG`)qz^BzwVwgnoIIen-yr} zFm^>{IZHa%S(fNqHbe#?#!d3vx||N)PQkfQ@HRs6rT2wJK#vuSTLt9^YoXF=$Pr)5 za1^jINV$#lQW0i`dXrfMTwKk@|%5H}P<^8xMI#~#P6DmGx zJOG;Y9vjCpc`D`FOGFOm!a~!f4)TL;987_|KbfqLkYjg-(K4ODDPx{oekbAx@bj*t zOL7*4IoB_u(!-Q(5;&QlWSC)3`WLgxEYlk9P~@Q8lM2-*@X;sY@hdes<@bY>4n<^5 z78(@tzkC{&>6X<+ErEp#|71ASzI?3sj$M)I!ZVX}IQe8B=ic++_@~^VBS`5p;PA?G zS#!<)Pf5o@L~?Ce?ymANm|Wf$f04}Wdggz7uK5suV#H)Xk4MA|(DIJxX-Bcs;V=M|-8}tg!jVjz>vtk@uSF2-g2A_~krgZml ze>KP{!jdxDW$e2svY7N%JdN8<=;1*OT0gOr_1sCmYJO~<8a_hN?os)14!5vMYMPz+I7^2!g z_vF}ppinru11Z)r?pR$*WoeJQ5LRn}7j|LUV8qPTu1Wq=MQM+8Ndax{BJFze1kY8~ z6+cy=3!mFs{Rk|TEmyMwNi1c19%I}*W3AJ7&y*EZfQ)-{)sBby{yRVeElG+`N} z=}q!Dx#j1Qed8Jz>q<%%T7!=ivy}bOm5))**|Y)C2vKoQA=a)8qMnveIj&V*X8lyl z%;jFGqkrivH{YJ6+U$h+EpOBGx<_TkmoOjerhvfvqtry1{w1z*Pu0(XX7bfX4CLf<_+4_-=|-jUju^d{iC-1qXzAy*jugrEu8#=-fB{ZUH?e< z$-p(Vipm-F(f95_g-oIPYp>zUZyFd0Xf+CpI3fLz7Hfd62r;MWs2N+)6edL2s=~oYbYdFKC{kaVN1m3c(T<`h4Ld>CVPvDz6iYPkYK=aPRW$# z>8DS-Sg{i@61?2fmBWF)C>85k4XT5ECa0~fL}jP4zYA^}x{wX7 z!iRcyinr6F4;-qj!Tf#_m<4^NB(OT;%4<*Ea0(YAzNNl`gLvucDgIqmWk*wJc_oiS zo*HXa1!A7tx4^50RfMp54T_|b^4k|GstUgektDY!FbZt#F?NLq!=TTVGySf7 zp#3eBg{!psxQGe+dv}>q?wG;K;L`%y1DhPY%eplc$IM-gb0u3z#~?&S5i#&cEU6^% zd+jj}V^m(gaF^Snx1gNu)#m4V#B+Qyn&wx~(!Kax5EZdXqtRVeZBa1ip)AzwDv}1b zMyEwyn7}7WL7VYDhIf*ARP1u#@y)+NzFe*I7$x^7`g^MhdJJsn0~ zs!6(ay|jzXV6QRUU@U$n;4BehZHf%2+O&enLS!l6xPth2#0#NgdraXo(QVMJrE{~~ z2+FA6QtE-|DJ&H~#txd8d*0*Q54@{?k#=|3!)bD_5)TJK#_jDKmeuMTul7I1z8;0- zk@iwltCNMVCO^(lwlZ#}U2!I#!Y-bmK-E@SK+tDPSv3xumK`=B$Q(bkx}fB3YfDmP z5Rw3^jF&|sPvVnQNqT6WfEph+7iEb;<^kOl5eM@9{GgVrxg+lyoefK;RTpVOnJ6kC1F{6z!||lSa;AM7vg#%_KJSt z(QKvaAqqxn!eGAFLFBPxi$NRq^ zO-Ay>5}F#1^DDcYV3#Kf;Oio0$VfhSa#SDN#V(5rnb8`C?Fb!*s<2{-T;q==y#7}+ z1?3*#3-ySpU`u%5q@#SSsD2XBw?Doz%c4TYaH8BGZLrlI0l5J|6>$Cb@Or1s5z z*e{?dzCWSRZjCi}2zB(%c~js?SOm0(muyA7n8F9-b8yz8X;WSD!9wQo1{H=)PI@FK zZUe@q_z$W@v=X}rVskd3ZX#i!-)R(Fs&95nug9{xP~RKT=)9${0(`vp<<{^y%dD@( z)CDdTG2vaP4#G;C^((SM1AM9!?!)A?;sZL7%56*Urks52w{11EUP1%M(eB<=ov-Ab zyNWPa-9|2Sf|}hb5mN2yh#Xv^l`M7wT}a^S?-sfrxdnsD6O9lfVE(cEKyq(7xTX_b z5@?mCq2|>nb1WF6_3MM*@p+*7Nm*&vn`r5Yt`{JQDW>XAPUZoFVh^!4+@fZ`c;K!%j8^9OuDLTJI{B?s@@S} z#TG_KuL#APhUA)5LsM2_)mV6Q;IN((=NjMKtOvDK&D{k@m-z$xWO0I=KDiJ$q-{Qj z({n1Tv^nR&q=+p{;H}U{G)k5f$*AGa!xDIC#QZk6I5vbiTfbGJ3cmxM`ADp`mEF;zp)b@~b8}Fgz`0AT3hnmvO-x}rLzx*;dDI;XH!HOg~IfTK# zvpfPbmQcn(R9%VJ2-jGTFa=;ZjG;DU>4{C?{sl|}Q=Ysb$1GiJFc`i#m{X3{t6GQz zrJ2f-t?`ta?25!#4e}#GV)ji1&GG~TALWW=BSmuJKppzvpl0&ChH}5aEWJ7RY((Q?7h|ewLxKcgjX@s4sR)fG(&LQfgQ|1yzD@9r*%HLEd6sC1S znj*OzD%LuWgE5`mx3@8rYH$3ko(batFcz9@K*%b;2&G9VDBcv`I&_zb4Tgr&1~XjD z%HIqy7Wg1o5bVK$Ln6$nm5z4TlYLKP@r5yRgDI=d`hIY&P6+qrjpYfw#<_62$oNg> zq}iQ2qvEwaQ502*;_7vEm|4O&WKgvTCUYH2D(a}b=AW<8cbQD^L!H2 zBn4u9NaMT(4U*MF&Ag;ix60~<6LQ-gk?kNAsuG5I&&wpPe3K<7x47cG9@=BjwaPTP zxkq1+D!wIj4r2?cJ5T15Nm))%J`&Co@sPD9KvBuV{V}WGhPZ8j`jB!O>viKHo&x_9 z$4bTmvZWOBl~t5+-R$(kf@5D%x>uBM3a=%5TDr_~mruMkTM?GcUP@nID7iKy^;xLz z;JBq`+?tqEhUY-}H;PP;%c_#9iLg>uqx7P=vcMf~qh-9lMeS{nEv~8g%TA8f_-?wi zy1BODW^I#t?+Lp+j+BKvqXDkYXt0P(5~qd_@2t`k%^J%sLx>HL9A-u>$IlSV+$_zr zrkW%aYjV1JVE#;3pVCze;ghbC8Vz@F@NuKE%A8&}4+ED}Rng{1R1vHUC zg2oN3v)r20F>B))oJS{q$^K#zx?wD6R_Pg^LR@$!8m5RcIn{4w7nHrGDqYE>QDLPt ztQyJD&>$daEif}^kvmuOyo)=6@)~`J`iDW5x4Qunjs_JAZ}oJ)#pp4e>rP(G8{9_2 zjCXiP!4A|jbD0&wz$%|6(Mj3jRxujc3OscnIlAisCvetS>K!vy)@E^_Lz=hGhJCm- z33F8WWN+*Tu$*k_QMjUYeQgtJA%0e>AonnO*&^byh9b4q?=9Q~m-?0Dz7H6s_bBK~YT2ej$bB-3<=Wtu_L+|TqYYQCG)X`8d zA1Rn&>SMS5rq6)Kjc44N?g6Kup4752_6%1k5J74oMsBjVwAQ=#)R4q&=7fQoz6?o6Zf;6O{m5vi9hKJI)j`aJg zN;yz$rPC;+S5k)OxU1kHdXpJ}K-Xi&;52u#EN8u?O#cuev8mr(XxTl76Hf5L7ja|Kt*bUxEa!93`NgE?cG40!jWDy#2BfM&mej7{oaeiLO<=I0n zwo2)yV*xVYDiXZP(i7FLD(=!a4q@*`6j~=wFDVs*SEW}D$rozE@C(kk9v+1S<(rxs zFZgXU<3CxM}d?FUlAA!P@K`R|4YtS$>!-f=Uh;cR-`O6F@_}F8GXP;jlbo z+7)-j#$p7z!p~MD&9Gh*NkGLKC{!yS(J>gx)HG?qQm<4i=o4_9)vI&|Ly;tR8&E| zGY*jxGaBDBl#ulZbv=TKy}v|ANm3DUqIzakO0O}lvkO-QCsw%*Vai9_0GDzX877{{ zCU(g~ij140B+N(W#>80w;9U|C{*-lR3(6` z#2T$9#W;sjy>6tiVut786k1iinWHc9K*<4n!s6T$ z$SQY{MVBZH^<{&*&U_176PNW|UoF-Uoxr7(&NaU=nKQJlYRsY^e{@3XB#&Q?DxGF6 zqtrN~ugn_1y;yF0%{-QQN+u0YQfj@3Daw^N$r{_|qozORqseVqI?N|2p5u6xhv`IQ z)};Z@Nkf=-$saH(UIIT`)FP1-0x>zyzBM7|g!P^$`ru24V=Z~>N9$!-RB;|CwaGja z7*0f4sK}1jq<6P6$EIEZ=A4#5B_KTn4+`S&9pt=cpd(>jye$ikDsI3!54I${g~eU4 z-Bp5%mqV=osl*`!Lfl~SG5CehoTSAS`A~-s`Qc~2( zi^F9ucV-oj1<*7{$9Du^%i*;LKe`nw$&m3>0cR zLc9huwSE-WM#ZcnAEE9mJ2%GF7)3W~8PJu4op}3WbLHoHbKI4EEtQ2Tb0q7pHTavy zE(_X=D2;yNgHaSfs3A+W5bNlLld!p%RxkUKN3nyImDs=|kluy(tRz}Wjs68rd!JPq zml)>F8%-*KqFw$Tk83gWFH*1Jc)sxhqN7>&s4sG~^MV3hFzpIQ_!`qmc6 z6I+sN*G*Rwv!U4&#`V34R*|_jPI&1nOAm0g%DthJi)OuK3zOvbLigIV92JYfPt4tO zk?s*Zbk@e};zy#B{SS3qqHvmi`{4c=d-%F%x@M(VEWAg^ocS5HQ!@oOPAiDT%A`&d zVzQ=aG`w*XL%C0V=i+h{nzaooV#(gX0`$!nUMSvz^O3n;Eqs3Zgtwu!FyVRpjGu6& z)}A}?@0nY2JBp%wE3-cLte9obOJK?J%R01G;Z@B{rK#JOU&ik}WcqQ1Yez`y@(V7p zkp3w5J)NMQkqxxw*0=O4Ize4VWnkC${>`&M3uKYUwglsy(VvJr9iEs(l+?`B`r znf$$nEI-JHM;5lD=AJKp!5ERpu4+puVZw{^Z$GPa*bWnNW9eTBDU&E%)@iLP?98bM z?@qsRa3)<##Iz=S&FuVFPgI1+@cpkv>35BSk7yrJY5`7iz4r1E81^tbc6Pg6=*Ve6 zc1yS6Wl-*6p(}zrS}LE7R>M?^R|<8GtoqGnoL-2~d3!VbXx`@S>*#y3!DHPjdjl44 zek6`#zw8Z6ef8A*`t%{o7oHD$1Ymju)NT~@vJM@wTlU#xp z3eS#~)aP)qx7%Wm7o%EQH@3#M%jR~uR=3LlCEOgP+(9@Tb%KROv}#p zoZfsw)#iNlb#$^M#!HU+26)~Q5u#29I|P`R(Y?FmkDzN;+ZOVQ|No@_Koe>jEqYH& zr?*|oGm<)Tgc5It*mpH8JPPnVqSjONbUa|~R>;Y&YYUGye8c`JVP?Z8Ozl`v>G+AY zx)7_bhJ}BX@V~%#v|*&Z8uD-csB9Q$ul~Q}=iilibrx6w4Q?tG=dzN+x+r5Q7bMzt z)jZ2dx@7uP)CY*(f%r*sWQ~=*1@P74=!X2HWYCjq7eLIV~%Wi{W8at}nAW7%FXn`7p zrx$vqzKFVi*>*rEtp_&QKP!_y4S{DpIKNRD$2Uh28{+By$&hzT!1J`;HBOTfk1+@J zy);m_(tXSrqWY#f%5V^K<|l*9{+NgLa?+4~8t{6qk5*O_AW1jSO1qa^=1U>hzdDqx zs~Nr_uCM7Iom73?np9aFZaU$UQYrUEpO|XS!f4%=`!?=qgG;xUy~(2}dchaZRUT;q zCGc=fz@b!*af8G`Y9WkBs?c4v6+<FU1vYC#DOB7D=62J;z%iDLaz^ z_Iwv14R@eRom!DW5g>N=z6B2gBXSSgJ%Z_cyZEK^OdhF$!=S-;&&lyr>}`IibNfUt zFd*^pEmEWMWFKe8x*CVr_LfzDyQ8$o$Zq$YG$l794kdZJ*BArS=er%%CP;m}D`|%A zt`v12R&?EQ**f`TN9`eAx$zffGhJN@#mGysxh}5`yCi>plR&=R^k-V!W5@V>$0Q>_ zRsJ(miI3uQk}In@(=QHR##ua0+%j;^Q|-NUNikcgG1js%u zkns;NfZ+bWaGnB@ze$({lx1&EZ4KPnyo0nWm}@R#`WzJEvf4b}6PJh}|;B=hd= z^#Y2?n+H_=SBd=FvS7fO_EA6p-2VRLFCqRW4G<~z`<bH}&6vbj%0L|CSX-@UI-T_@$TDlTm*u7Y{*E@&5qw=)VU63aL)t$04Ht z$)bPhh3@}1=*?|#eN<9^b=+4`Rq>b+kpfV`mn^8W?=U-|!c$A2p1T}Lmv=^yRS zzdHVRZNUI=!k-txe-E~=sQ)f!@3#g&&ofBdH^{fOn*2W3pH}tXas20LpLZ@b@1O31 ze>9i;YR44aSr^dEKWw@n?&GKcJ%)3a7dZ*ynVh{m548SE8w-VqzXP;=r-Ok}4h9%* z^FOfvik4&?%llThb$*A{i2q^`!*;|-dh0*a=!sLK05P7;F)%RS_ebRc;lJ8I(f=xk zQRgQ^$NX7mhJ!+lZPb$&_bUK(rC0o4(f=(y`p*~$stYRH*QNh0-~thw2U@s2P!=Ny z3ej>IXMhnHsDP3FtBvq7=H)Jsc|Z^3V7?EsH{Z*^*m{z%e<2g~7yvCz1!hI#Q80Y@ zzrtW(JQ%Et%F+e$LD7s-zpM2}Gy}uKgqr;Zu0ouFQ9N3Y;eWeD|3#6d#}Mzt6kL zpnkwn^;hHn5d;Ib5eZ{3@Lx3lMtA^r@-VPq2!kN!vz0ouzqk=!cICfob>JwTJT1-mc!JGO0wN=(bfMX_wRTt z{u>xL1F$op@_+G_!wBwo8C##&VD9Y~?sF1Q|K6|z-W~T%wW8RjyNljT0jU`M+6a0mFh?~5K|ao-t=IvmYQUK5doSGuKYRZE@SdM5 z=TC;UAO;wh*Xy?xg`rpGcl>Y*rI|`@2As_YRS%1rKNN|+C(%-Al<} zh^gEmnxOKcA(AJ(J$~KHK0k5TTowG>|D)sC0Yd-O`Qz`O5IU&r>4$o;H8y7oObDpf z`FCZ2K93m=@5Cysol-rj%Ud=-4vgNFXAqLFrXJic&yK(RQ%>#Y?>6 zmp&GopEE4$x=vgTGjNxy-ET3~Kdj|%n*hSUJ~MZ$;|s73^J8J4${au)Q?xuF`CVJ$ zMzZq5jt&|}$5gKngTljipLg7|MD1hW7TU;k4oILeX(;h)#3PAPm z0BRjwd(uSi%?{AoOz|99gmHj`{2A;KXr+g{9aQt53_aq)c`w*?UG8+;yYvqDI07(4 zOJzQTh2{d-Hh0y~ejd4e{TpfJY~coTgGDD*v4EFm=I2Ft@+JKKL0U*4|;m>=^(5sDHuhypVR zGBErP=Ds{0s`veS5;94K5uz}Rtt=6vM8a4GLnuo`)`$s-?8Ml!jh!O97KIr5E^CV= z>yTZ@7DBe3d-VByzTfZf_j>;LJ%Q-E?wb)K$a}81WGY?( zBlR2N$4#vB-LD*5>fc=fRfU+WC(T9=!Tk;wj4mm!CtNZ1Dwak=!%asF5CJywW=tu$$*D=4}5Yq`J(*_)> za}B1;TS7qA)Oq3vYN|*Gg#zZVST1E}6R-dscDUaX>)Dcu=Dv;rciH9Zl^;2RjHdXS zI%MJ!-)!WEOu7asxg$+gqCw(8^X@Pguefa+ny@O}3gyNg8hnYDVa z+b)`nIS_~53XDOj87b>Z%Edmefb;&W;Jzdqh$@8A!l}4*0T>$H9O6&4*zP<3kFoCUJ49N@B3Y`J{qf0VDTM0?JJ+omXGGmdGtr+yAGv^e4W1F zhU5Z@C4adR-AuR!VRJiXmSt076#6KShD#NZO)x?duq8h@y($LZ$XQ-6m=!)TaMGz7 zC}r2-VE52t+8>|y1-2w3$lc$NpL4rUpj;5TqbI+1W*hB8s_2?M)C+svC5CNFQlROz zo#K+C1R4maDE43p7+Y{(^38FzgeAEKUogjJY<2<(_YU}@;ve)qu4EsvXr~n_st^i}L&psU70e{0;H0Bl&KU4sY+U=1>FT8wPSzsSb#;d#DiK+WyaP zcb6U`=gFau%q1~Q9Av?&FNmpB68>~o`;sflNDc=!4#Y7BVEvU^(q50&CJDC@>$?|= z%TmE2Q|xbDhe zK-2F>PWId{oN2%KQqhD&Aj_JmF9B0pX=ArDhy!XRufT_a*~#lZ5Mv+cX(JVb>LR0y z>A|qhhid>D!%$qsZV-!F(gTeZM}J&2tu3ktSC(kxs@pF0UhW4MP-H4F46d9wyhKdT zD7UMUN0DrR9WkQ2I6>)E2qghM2W4v-7vu76Gu0gwM%6=!v9^39Y)%;z89SM3K)~Uu z$P|b~EOB$}H$+~}dY8!gk+F*rgG}5n!9TeMVZ?B!2^KS79mEc;&e~qjO+lBWlB9Yt zx&FT)_PdxL3PM;i0kZXXYk?|fNxlRnQKF|82ImKY%;qqo9$A){%Y(rZ6(^-;`B5(gnJMlO%Yny3RDkXMH~5|~JKcV&~5oi;WvKvz3}8qC?Xg^E4} z)qB;jTA@9HW}{ZQrFScW{`#Kx7O8H{CK_Nn4IFq)?VeHX&Kt8Ez5(xdR}OwdZ20{M zzDEYj9PS*^St=pBFR+&hgzt{=(bXK0*w1p_(K~5;yWS*Q@%j@4Rpb?5AYAf+BNNM+ zs+SxXxOdr(pKvs%4d6>^w``XJWp@G%%J2@J9$L2C%ebHi$NuEJcfW_Dy8a-59Moq`Adj)YlBe(4~1}10Ci%Jk00TC zj!?$9YDExd)KsZDsBIXDq(>1UZY=kncs^!17>E)cBv|kAjS#N&++Bj5#Ggr|0gToG zwf+e)06&1o5J`*ao<0pnkh|Xf2qgSVrAwO;E}84P6;drk^-b`}UcGbrasJ4Zg9ckV zRIk(99U25Zz$b8JF~9*({P%&c;!?DH4@moED_~S2B{W9dkgFM%OsEK1uaF zX7fxi1t5999CH6U4+Y`Mvrv@Ofdei9gG(La9jpPI@L{+hNbh(eX|D}o!EmwlmCoxI zyRo_vY_}0hRbPGki>!)+f^zGYh{7@{XJ!*lXFARulSl9Z5vtrJ`l823w#ZndAB3$? z4MZJ1JFhl%mW$Fyx7p8lthc4c_K%9x4n1Xs5OnoH7;fk9Q6~=Lh$)y%BWyMxLGUJa z6(OVci3ALgrDXm**^;u~b~4UlZR;uYj?Fi)DHR^mb@24fPA({f1n}%(BnTK32}>kt zFr{LVfJ6#L<|$}P1JnU0?Og1ZC%cJbzai;NQc~DKis%>pN8=I--n{LTRBT>a(&$?+DR=iv+x&O^LDmbB0{$LH@uS zk=gIo9LZ-^YHujsvkkHIIQQPzAq1^1Sn$dUl0<@0_h61{n%))Uf=~iC1Q>XYx(uyP zZdmZfrk@_1l=JLopdx?NVYT6+J4s4MS|7)~dI)+Li$($qJ z&j18d-~cPhTmT*;$kMEFm;0uLT5-oqG87mI2Qn3bPMWc$ciK7@j|P^M$EJ;I>oCcsYp zN%eBoSxe)3?k`U%bTE|rrLiQ%!8)Rt5a1sNVsqX8<~0bxwu3Cs?BneBg0QaA#(cA7 zn-|xnt>oQ6IG>ev>wY?VGctxcVTD5lvRU;kd$)&%@9`!I1T_G?wnWmw7zBc0ohFO( zP6anb7vYq+v61~vOx%`3@Vp`>w@2$Y#OM6kWCF9h`I67DivQ8(zn0dMvDeO}+VTziV2EP}^^n-l1hPES{W(%)biRbSAzjGTWA0)HmRA!c z`9fD9cg#=f2RtC@;mTn0a$h`k{l3V+ek|=yG+Qz_+QTi$oQy*-zS?Agh<0cs%AR`E zB;V=h2Vismq^-fX#;x{wCGk$BA#j_Bmr}x|jRKdEX_K24PJok15SI^xmjqYBGv2{Z@Kl;QTSY6KOF*TT#CzRgQ}3)rE@ zp4!q*opS5MH4@-u6+%#TSOVf$rj*PGWxpG5h$&fe$nW9!9LxIgxvV}dU3>j~j}v~> z0L~0Xo_s!*D7wpWeb+veGgc`Y^Bi zo5g8d(zLcgAJ$dJLL4SF5UERanh$>Y%AI&Teo=@y4;B6>qIB_-&y#c4+70g3va%?n-U#jyE^R;CL>}?WQcE$QYu~M_ z$*RH?V~G$(jPz|FjeU%vNrkR4Yc@{s`uFEdi^n>`<%chK@j^OSHQb)A*CEX{kL}J) zaOzdwha5c`9+r3<)%HpC@hGT>kn83c0F^)()t78pl6scqFr!9Gdw>3f@Ur?5SN2PG^Fno`qIy5N=kK@T>~IOf8|t12?s0BxZm;%mEaRYY zX?7B2fSyyHNDznycc93#K8ZjYObNh;|M5ae1Dd=pAPLH#M3JTGAY){U8fGycUFqzt;m2jzC!qq8BBKWJyU-?tzo#YUcui zVvu;i8j7?_?g67DXD38Z6a2Sp|K^d*_@8wN)T7nOS*;?D$cW(~|6mzo8BGa1iJ$-? zORB>Xv7dy4L7+&&Ae3BX`m^r;Lkcum|NZ6PoKX=;P-L8BUHX5BiL2Wr8R3Z6KtWOG z;w8h!pY`7;;r{-1|1Y*E*l~D*T7T4A(%%vW0z5>Gk$VXTxj-r|1W6zlI`aA#ogv{r z2Y-q9hbIU`kl2XfH7E?8{&(p}zDq5d=JR569op|Ad>aZ3Ugpf|a$N&JWY5Vs+y z-or>{$e2a-;5A@E3L_A0ptx*+sKj9sE)&!w3H8vwwM)L%@-O!g2EhRLm-cpX1dvBS zj$jK3s(lSVNk~I38ew3(L(#}pI~=hdLP@~f`MYm%_umKs$HNH!qjMseCqGCKa7g>& zj2VJ`H1GwnTg5_F9I()cbenin*q(BhB;;tm>!rV7+S zz|j69S~P%_1PY@=Qv=)Er;-c6KU+2s?k^*>GqxjvYZ6pCH&-@R4Uv$)B_kd>ISsJB z!CxBM1Z@kJ|Ij!*Q2&b`l6{O2$c&6I$o;Y}vyMXlMXX`6>Hks>C=Wzng?}+aK2G?< z&pxq@8I%;kYyvqY*lcJ1N32-fKJaUhBVdrvnGdxCl>G4znP^agfg#Bx1^?#9GSrd) zf%Rb6A5dJe96}!X52;G7k?sDcQ+f$B-5xUY7YzI%)c=Q{C8BCEFg(a^T1|_Jg$TfT z|1nkpaR?Y){fO|P;{p{Aky-c`n2?ErWF8co1CpgWFnTsYdG=unhM8_FgN!i1>VGj)tOQI>f#G=|7l#Z-9-$+)AG#nglsc{$6!-)Rvg-rAkk#w= zFHZhw2k=5R`6dZ?AcP7TUlBIQs6+rrY5B+fJaGlYZXgk`Hu*dNG{t}QvHyz_D0c+C zKlp(o0E1Hy)CObPq1^2Nw#e8B3KrQ+cl;PJLR5!1wn?&X2W`jyB5`;Gq(uB-hY0+S z3xeUbKNgFQvGn5wGDQQ#05TaJ%2ddBXl&5(fds<;eK9E3g)C?E-%0E{AOG|(oK^)+AA6Q!z!iX`7I2ORy&UFM= zdqK0pbAvO*r(4 z`#>+`3&Gw0-v0VXO9rH+VqS8SyB;7(MlKl1o}g;|$yY5ufuxJcFu8*$xke}4t+t@#=Nox$%Lah9TBr?|hN)j^d<^K&yPM=Q&kD{G- z*gOc`*bN;cE#s?py?a2LI3{YN!seFMj>10wNS&(OZwM7vJpX*yByI0TJC8YZLTuXx z{r}S<;iEU#QsrC}QtKl{A1Hgtb?Ez2@GzUHy~u~3&8|Y&#@HK19?airP1$~OM6Mbm z>^0QFz37z_r)BAI8m{GDe8I1F=~diZ6;>7>`Hv?J#LRhBKZyMamtY*u?b%7x@Q|fk z+2&C>^57D~o7+F!yabneiVrSw{sWX($`&+bBfD<7&|*Xt?y)?) zb=^~Bu9UU>3beuQ@s>%}=oZJkn@^G#QwmQFi|+$_?36za^ZIOy^F!y>GVC4pV|%Lr)FK9Ny{Q1p=aH^WL$XdgXuSP;yke)pT}(; zm46uvZfZSHS(Maet2VwmRyVk@f6)52Z0lIY_f6CEw5h($gBLlQm)LZRQcNw>gO3My zZti3(?9wO6(l7X$t|l9@YdOgx=AZJlmoD4K{$#IYfq8v+l+HRaRkIV2ZIw_o=i^(n z3R+~UWyjLL4SG7P7jDW%JsR=kXsue7o%8J4lzleWS~qjxD>ngc#pKKGA1hj1qTEt? zvFIA?;khS%JUzUrwI+Or|48Mz4#nn)9pzECfX9`qTPB<*<6kZ#&E`M2k{Ld^PM^T5 zrB9MM2wwfneBTHB%GyyHx)PF+}es=rWpk{6lkCO z)7H^HR?~^g5mgdY)7j{W%l|W;tiLMxJyUW)|KD#?)A zwtK#Yf=eR|&wm{OJ+P9)D24J)I(EEYdw1b*HmPL%ToN7u#kWHbVBKwA!EIi7hkJ04 z`3t{0P}dg`Dc!oz zrt=vzIr9TboWbhTrZ<5siS;>x9?Sz%{<$l*zJq156W$nNQpMf|<4Z!h6hl^0fSTx_ zZP9tQ4!$BYiMkXpMy><;fo=s;%^BprrmOvz<*V4^aokQ<(Kkh%I$zh&DP4K{`2{>} zHRbj6f&Tn{sNs6LeCO*o`XA{W(MJBm7w;Y%;B|`fXRXfVJddffh}+D%m7kI)I=l~k zSqnE74~*~Xuvyj+pQ}}arJdn3J2sImpJ_&;K#O_%`6KPS^>y>5CAokS_SgGLADM}d zvTlkkaSE(xwt2!YU%$7kFBoCF8)~%0IILdwZRB1i%zsi0o0&aOy89b)_rcHKkgSL2 z!-vK)TDtl-G(>dG?P@9e-`egm=XbmPpJZyr7t&s&)GIwy&k3$S6+c%i-liABE)Ev z0vKX5nKTAk9}7EuTgX<4Xv$6O1ZG~R&)|NDpU0zwcxTzTstqo5J!620NweSe;ySAD zRXt|$WK3In?;yzVSPL4!A~2nt~h5+-=0`)nh$nlx|{hy)OihkWo+3E>2{s z(8&1>IbxG0%6TpxZYal4?|VF_T}>w<&Y@95qeg$~x(`3+xwuZvIOG7hj@CU#(Ce1Y zPl^dOW7Du=H?OO-^}Z+E@chX+g6e^dabO?5S~kAAc7aqo_K}~q_TaUV=-9Tx&9~{_ zzF;bVA}RE=e8<%aJoaNoMIT~)R{d{@rgy28%U(Rir~cOOfQ33le(!jqM6Jmrnb?4u zDQ9rZ;=tQ)BL$u;w$D<2vP-EWw+_(XzJ1HE(9mS6*6QGw8|C=IRy9!XqX$Y@f=xQ) z*>&~y9&kCi$O)>M1orHSa8ixS@u(Rqz(2|fN+T{(GA1j)(rHwmUBL5S!!xpQ7_y^0 zTWR)8j;_98Pf9s9uSmT-yUDm4x|_lO@KT6PXyD9nCmJEmr>X#Z2B%{V`^oMR;V}^`y)vtP&y(xz`-_JvrgY#rmj{MYo*)#z4ED|jw7@Jka ziTNZ*vK9=et;6tK-IUd=3J*V6+$}OP32>5M^cmx1iF-cupw=MawZ<4laOp|Krtzyz z;3YThn0qP~@4~MqR>JGGxW5~-aOaY&8d(EZhawun-*4f(gGxN!1-JkB;jXC=*R68I zQ8#>boBsW7VccM(tI#XXJ7&6fRW6T(2ZJl(Y4nB9zBc3lH{;Op(^6u~?$G8Bnwat) z!r$l@qd)V_SJA}W{q|L@JDW5c++0zLgN*8t*>CVG;lq2pPBTXGVpI&8ic`(xD~y@6 zL+>GFoS*H}kFUINGgf-~bjmz>s9CrNp4(<0oJUFA4S(wl5&`bIzLVa~)zIfVuO`k% z2@`F$WUR+!6yQuXrmoj_+&@iZS`?OZzIO|~C-)#;E9Tt0!ks%6z86C#4m$FN!f-|X zu4*2ky>l6-WM{jU_Rpp#HtKU=&h>056L+;L1?;f9+9(tM?0p*SUS5}zcix)vO4&NP ztPXwPujjd6&B0n;%Q71OI%DeT3atM+NGw=5Ft)k;q7~@rO50kt(`a)Q%Xo$M@cJ^E%cG9Y^qROqal` z&18a)FN!25e*R_5$5owUFR3HB7;&*HD6q5X5`BFQjz3r3!cGB)JMmET?q|R9rv0M| z$`{(KzFT+OJGVB#R=2mEGhxA(AMn?NqD@bQan!$)2ss&d7O9!;JS6L1A=ms2mUZ7l zWMbGYk`h6q(FjXZ_L54UiF8(CkbPgy^)dI7kME?-1uV5aL$+4)xXyOUJbqP=>j3_F zt@YBUPpn}lTfQA>h~!Lf)lUqVx@4WmlKb#$(9Z6p)gC_};}mDc9xAJ>p)uad`FZM9 zCvw=<`RzAT9lnK0-v;4>fw`;jAD1Fv&uCeg-0+<>_UI;2vmeSDS|{DhN<0JZf|%a*>f1)OA^i(p201q#;aB8-VU0i)memi-060Q&XPxVxvHS9mV4%hd!&wLPyZ|XGazt1tzKO=1(^g^<7L{sF zY38%O+|0%)6hk@8*e4s=E%X4qFPTzqlV5KBMREMzz_&L7ZSOtnUlf&5im1H49TkPD z7D1eUJ92NazgDGBg?DW?qGL<(=K5vtj(9J83JzLOMQb$&9&~{3r|(@BO&r+`8sm#p zKWX~l#U`U|iTIxEaZ@o&M%kKo^J~vJ=26f6*1g;MO+LJrXrI=4r5vv|;U0I#H{D25 zyezJJ=9o2ymRX3J?!rv{cpK-DwV=stg6fDsw@%BvHXYH`qI`QU=l#dE^G&zL!8+Bj z^}YNXOJ-vGReVuqTs9wB)O7Cqr;2jJL>XG?LPz8?L+l-M;LN4nH9TE9_h(YCRt(QB zoNd_%dTryDt1IfnV{pA6eH-L1F0%tIw(1j(ESJ3^Xt*9$5D*YLzECIon1#g6+%?m#$}zUe1R8 zif}ia5v&K?Ok>8NpXlB4G6W}nAf$WQvaswAlt?+W=QHLf7PSWGnQ6zGYbnt1j|KzL z*tnc+E74H(?!yb8Xe;P8Ps%i8Jk*V8rLvheHo?CU2zul{T_MjCmpo|R=eQbwL)|&o z_G);anz2#0c3xtCmTZfRbTc%U3s;m7|EghG?(^Ul=eI?DzQZ{@p?Cy?xI9gW0-Qzz z0qy!{PS7;bBhHCnKB10|metewzGA|tU8n_k-r;x(X>3Pgx@XLQH}}BQN!askU##P< zD5+s86#qk7TRA^&|HIDfZ?nH4nLb&LF;})&Xl%>cjP8dHM}Gd)Xy+HEdF$7iFSp*7 zt=DH+ZtM`U_f~>+wB*-nP0hYcMVy=upBJ-bLpgkNUh$^Nw(-ZKc#S8iSt?RAy_qw-DI4Uoj|Im^Naul@tLcYdP-bF zh#^sh@VI77R+VLB=-diAD|3RUO92aI;>$Re4X=*4G4J^FdR3;gqJ6KqchE|pG(vjb zqvEP*znq_-;Le$MV;`*h-bI};l?#z$32t!PkPl7x`6KAHePNL@uPPD&3xM?_(AV%k z%*15abhc&2M89*^pUp|b_p)$Ys`Z8Wh|-Hv*lt%lcDP<Mdg(LFFTcoE+uv>_T;8&Qj_IHb03X{*qH-=CuZALe|OiyiB%e;lm**;)= zsxs|M*I%KqaMSdQcgkKV|(4=a%4yjRo%ILFkRfTGO zm;U;6t>U+JPH|@is-|DGQ4C}bsM%C3LaMLw7--liqFF9`pE0wUcA=#Xr)-{Qga2g9 z7Fk`t^Me}Q%KzHrRksYANmYFCI6q3*5v&4{D(^}-I)0dNjB<=xe1)gB+J<#9y|-UF z*;U~=y#jvx0V-b|bG@*S^e-lzu2?1&R$MZlvoTQhM^J7&kO-aAeR^KWswc!o#Z0VC zm_})g$4lu)-sI|9!A;7qPcmUG-+x>RhuvdRaiU5LO>$IIElm5Qd0{a91)Oz?-tv;b zU>Zx-X|sC)`nODOGMTcvr?Jor^|8D1O#Wa&tC-(St5g%F2?>qqCAO4c@EgVwNC^cx z^C%0hl3N*b58sq%@v5QpnDq3FjRhTR5QgMMP46(P)R|DznSL#())*h32;70?MLUg$ zIeipuNclo+qq+H49rzhGK8|o|@0Ljh3`(R$KG%WHj`1mz!4BivN^?0mQS@tc=itzL z7T(~b{By#I*^Ql{gE5WGF)b#o#^2zv)2oQ>(8WHB8b?E<&O$Rww_3f3_ED)>V{r`_CL7ihvYmLyH<3!<8) z@Qp|jP9@ef*22&rKKYZ^%egirT}2QVreytl8I5QpsU<_~EIH`-kUngyd{W(BDuZ5^ zZp|f(b?&fv?6queG3TvpT}f07{BmY4sXI%#($)*qH+Y&lT`xR6lf@*vclA&QPtMdYFny8Axvb-r9l{f@MD8^1MuZ@eo^hR*Hc#f&!v zKlyBu!hjR(n2AaA!Qu63hxwFSwM^D{g@vM~avqYnXTl3_buu@bkQPPPU>ZZF-)Z3a zTJkr-P&`iz(CfzvTZ4kwp4r0iY@dQEhxu4^7-Ja7N`xih`4ATwm^En>-ELnXe`7ZL z@I!P+NSgj*uS+z24`1KkuEz4Fr!j9RZ0o`Wv>0dR@_4SW9FNNueW8i*hha`ADp^N9 zzL2CqOUECs3$v4Y11;g+(bmpPWGYu=7gWVcOr7YRudxkHyx`A9Cs~h&!}`!RT6ATsA^4qTH1^mx9fJ94@bbXgGEKd@{5i-;U^6EB2|M5 zyD392(uAX*0??KbW?~YT8YEg|7;S7i%r!8R znVE4KS`t~`I{EoQtFPLDZQju^8BOkS|3sNs`g-q2!X|JQWA=Nc+eYWfi=YQW>D05JeabeMcE_LS zK;_V|8`_i%u8mLzhJbJ5)##G*nv-bB`0$`2=Z0net^svJLrvN@CIL53(TS)m@=d76NUV;CxFe1W!IeYgrz~qoW_Wu;ONynlo*>;aoOa7Tyt0FMKt8S$ixJ=9ZC+}joGZy`wm=w9Dtk4|IDE#=Sx%{P; zTD6dnFvh2Gac(g?bUR`S3E$jul;#4S1Tq=AKli6O2VUCk*1uM+r;KbvD!{N$ce=$4 z0uvXMt72j%Xd*n$RA==t4rtLgP3k=Pu@Z>FYZr&8P<+QTGwX8j>FKg?3v32vESifT z>NmAB`S6R5Y8U*O9w>U8T0B?5%Xm)Y{P`q3s51V^Ju|-3+S=MQYRW9a{QlGdy0b#| zh6*(D+42kwl+j4^`zz2{Rh8Vi?$fISl%8@?WtNd@$OoLkm8#@IR9vWIP+vfkNLihVtGN&; zs07XjTLPe~nrV|4LQwRz?EbbJ_3>V4_`d+Jt&EPXy#ODRKZp37_ zA;+s~`8j)BS%UDP|Jiy7MgG;cNOL%b-T%uyPp4zlm;SH6Azc-m2obG;o&5`1*YD>) zsNJXrkN7aXQ0#eEs>u+CGR>(Dd~F$GHC|DURKU(d8L{>bJ)@N8Y}G1%GVlfD)=t_c7Tw#}7oNUS#MH~$9mZzSE$N$6 zz)BKmK}{--+dVsTDX2~@7F*jY-^;)CyikyPUTmJ8UFOeI&vMevAKsvA zco8*Gg3A}On(M3YE2aB7v&GrAqlBfNbsL{L8sBArhSpG!?ft+>}w9p&+PBB`=L?kyDYyU z{&DwNw%<>5=ha3v_=eB<+l0H_;6FCZBAjuUO#NT%l$f*)!QX$|^dD5kkGz?AbiU$t z$MU~E{I~P8l}^QJD?t-;>e-W-Pn*4zZ2h_}wI^t$>pD@rCNym%Z6!0etZ!~#@=`xf zf#rhRnA7C;mGph)UyDMiEwY2FlGLr?O0hDP;g{e|l`bi~3CRS7_MSwi4HdPk*~me| zw&KKRs9NfbIQEtkLVPraDUxyxY{U3GHpT_7QBZ9&xNhLk9${{#d7v2zKicV|9w({t zY{OgT>|U&dyCH`IVfH5<*V@VkKV@N}+3Z`M(Z=a}QK--vl$i{x7G={d{uB)s{t@s% zrZ>OBB-CMgY22d2=6*Od3p$>Zrc&kI@;(q6A~VL@;T?*vqL*}MtNS4f-b!$}U|<+r z6MQ2*y>O6EQg8Rc*7^`Kf9jkswAcp|l`NiK_d&IH5y{&*_Svg+)JJp0(>%h+Ryq~h z{B_Lf#iDf1ZYi@;^2}c4{`=(V4)}{mg&tivjZ)r%5 zRG5#t?b#H`*7 zK?}U?vTSSl7RS_xXOz=2JDbBs`zx(28jIW|I#bf(In36qL*L#>4{%-ejU3Ta6SP0* zo))AyY;@AqeQiV&7Lm5K0mTnz9hjpYKf(9DiThNeDq{H)G@tXqo{G{PEUQ3Qd;;G8 z&@!Kp{Nm}e#j$$-9IqiE%Q46OptEp@RzO^my>sgYWAxx7tEL=RN15V99E0PEyuF6& ze1cKe8>w;qH!rlMS5$U40^>JxJ}5U!iI$$~Tij3Ynm4>{q7tb5`RC7zw-j7%qt2cg zNnp#FHqe>9_!?z;alyDXcT{SR#pkt0jZH~=SLO)19Xe;L-kCFADWYoyC-(xl+a4TD zdn*q8s=HXg7*a)VBa@oX&&G@vPW`b73fx#yp=7{abf~b2u7bPC3C2~apfS_2!lzb( zDm998ZNomk-^S;>@z2pKaSpohl~+RzdGdL2m1D^lwZ-;(^j2$Kk*yl%E;Yo9oFPcnQ~iccaypI9VpjBUsMz8ra!*Lrrh5aIiM?jdj084yHDx7 z1fKtGj-VT8>00ecG$@-Gdi9y(qm+kb>iK7NLGa$5xSVmH7)M}h(X-<|8RF~n%G-j5 zZaQ{x5H(>bj~kUmRXLn@dbB&oR`uuKL`5DZ-+Nf`^)io}DtB(Qd9q*jJUFUmDo>-} zR1EJL3(;AB%7HgNfTER-4iqUrYy;6S7l#-FBAp zVsWeG^fo5fR}Q~2dX(YLpLmcrn;>^=Q?X&I^@C&j%JK)?`KhDf9$HBxLswI$iS!_Y z-;h@s(>~f%=F~P0QEs)T)l36E>(eN}W1w?V9vm+=_jjSLJ@h3!f)9SVf|GM|JyG56ex1+BtU) zMEkg^y$!Zs=P`7|kqV8?pF1&)?haR3B{?Q?1l-sNahf-~06Bl=r@AnybUt?4!Cdwk_`LM%qij4?#!XjJkyk1_ z%+Qia!HZ@=-b>u~ah=-A9fD#TpZ)uqpj=K-H{wKff~3OrT18#&(}k+@h}BX3U!EIr z^2aS@r}UZ1EGf zkNo5Evs`Xl2jz~$4Nb<#xR@?Vm>xSmn8&QFy`$|{X14DV;m1f@~!-0j{pP%mt zOV!kVpL*My`SyxWp`CJ=PFyAS&QEpyR~^!}>H+z+@S>GX53li0n=2VqCjDQjtmV2l zIF)j@%0|6hcC6>6N_-KhOwX}|-;l?(kxSmb6yKMBr8bMaQ&zC01Wo&MrC#hox0(2L zAF@d0h`vg=CuiXsBiy$x*S_Lg_DlBj=5Gjp&B53-?$+ljppm+^1F^Neb+5fsk<70` zH?wAu%GY+^4y^IkrCIMYt2S?Q1%=4JY(X6J&ps=1XGrIX&1bV%bqxyT!9JfVS`lV# zx)1Ta0EtDo%6>Y;mtTEV)*ba~i3Rjq2aOkx7r&H}4U9)G)KIZ(-c|eb>fM#oN3681 zbYGAbcyI7i#e1+OX7s#!xriH-JOiiuwkWB&Ap{0%<&>Pu0I=EM4@73yWhRpIge@%cpzqI2Ijv6?VWlc!v1;C9LhA}rsYsrd-nuCl_=w^qSL#Z zW!WDSr5uytJba{!<%~?rKb!ms}bdF{mMb{ zc_`%v?o+6lWf62Nk23i881V~s1K<5E;Iz-lTs4E-{Djuty|dQuBokrkPAM|TTmeQ|@?-3I`;CYw=Chm$zDZu9>7z{acW%S@v-8hcIu{T^QJe!4-)sFV3^Y|KHZ&YZwGD>GuPz@=|*!}X{{lKA^9ac>c$0D8N->@p!0sDsh$^W?j zV*zb8A$V>Cb2OftpR(WSKI$HEgK6SMmi2dzNR<0&8!t_hN$5ko6q~uZ_3ZVSRaw?H zMKgMgL`iO|_I=rp0m_CkS$xwr`u=NnGkGWYUfV^&gC49|rbQ+i%{^k5H1goY&h@B% zK3xkE!uNvCuY2gAv2gj$`qYZPI18!n`G=YX%+ysjWzvL*UTn=NLCGkMdH0Vn{CLW3 z(Rwo)1!n{eR*D{{_cg4qHbA?&Wdadhh?QZ#*AmjNRvmNEY~nMHFXAI3YjB`Sk+?WC zqG6(xgnkudVJ6J}f&Kl&!oYnfm^PW8@?t?BT>rHU?ba^S5Q6#(Qw+^(Vd2k=`v>H| zHtQIWg#AfH$?4dCJrb32-0ZWLNCsoDgg$^3@K4QMd?D)eOw=KX^ww&N(=0Z;={Ll} zi6wYb$cKK>UaMkD{(%&Ig;IGRQY1<*L^6xL+*PGp@i#+&0-=&pNyIsJbw(&uj>R91@sr|Y8F0!BU(yIh+W>naCTY{YQPWsp2 ze#K4`f8CL3&{B-JEM=HGQ1|WTx`slMo6+8J^IP{lz2u!A(WSiz1Nk|7b=H%tU$(h3QpCmJYwW~Ti4q|h5 z22N{eDfe4hGm8{Rg6s+hgCgi8>zM5LW*aSe=iXugCk+@)|STA}`-Rd^ri z5*SJA{?T~!Yy7gf+B<3{_RFcIl?b6#y>RueTpqJ89VrajFB!^P!cSbZ)X}NUvO0Z* zS^PA!D-*n+dAXTi1orgudH>sH4?V8xt@eIJ8V&GDskd(!)+{TN21{>d{#X-lVyo8( z-^za`$N6SebsvBjOI zeLx*1lYGTSZ6B9sKUq)6vcbEO(G7*o3%$9KVu%@LG32KPA{FK9dvw~tg#%`&k`$r2 z34tdC;a{|cgaiVg&>p?1 ze9NU08ND{&14X*z-O}hS=oWas{`k&!&9an=s+#j7dX2~|#@8rkDHeX~5R}N2Tkf1^ zsJ6{hlywudsNvG5#?RDxlMWf45vL6q-<`0*1X!aL&BV5(r@j3(qohyis<+DWZ1+s& zOpeaq%1NCYVO;o?8eAJ17F2xkd4RAqt-4B%&FGyqDYsJ`r+Eyo1UbGA)}pe>oqA&4 z(32XiYGc5*5IONubuPhFr^J%8g*hOjM_*^A>0Y>RCQhte1gZTBNq`~*>OiXbG-O4X`@|^wYoQh-}p8KQG z+}sEW)j!aSM*mekL6bXu{yw%)2lbj0$dH^f+8YdJyM;a0%;B{A56bAi>76qZA1zrh zp%!M29M-rYrTIJ+er`ctB^Gg(D)AUGyvtklvBaf2THFQ#YZrbxO0}wgGM{OrsT5SZ zZFcEfZjR{jndJ?eAuX80^Fh`22EnFn-qW=BW#T1p*~aCpM+&B=B11 zr^ULXHQY|;B|RTTC5O^F%3ES0pyKOh1wsPpw6pxjbu!~}*jYo`KZCkQC4W1}Lhe+g z*3y>SqzJLwbs6%r=rGwle|F4on|)a$?uHZv*7A8o<4C2sq$<+F*(qY9Qi#boUmT8} zaPboO{zes%c^j6~jmh*dX3FVSf1zfIt@@(Pf6)ont!y(CdfSz~yFjl*>v^lfywpiu z_9S!W>o4Rb@>kBXNVNGYp%>tAhKu#t=M)tY?<)rf3Q%z|tPC z%x64f(=ZG->)DuD?wME1_wT`q#3iu>_7!MxYh-4Q&-ot^#en-T znwem$p2Li}#6&l0-+ex-yS{mWFWk8_9B*)|P)2Me!08Jgk!|rIYo8lDMdw5c7r#4G zWv_JZZKFeN<8Y;1$()|m+bl5=qTC=)kIVELsLM8r7O)a&d}KZd)wG_} zrhgzH#?-)MR*Ah8$eeIi0!w!ygIHjk8K2n~lcvbW25VRQAYLN#?4g-IyjzTNg-W1h zNKIQ-=2YmYNw~%Hq-5$Kk>l*A;=%ajz`c4B)o$CJ@5Oc=znMjDBf70_)S&*tP))lo zdo<(YFh3JF?Z#b9W43nkj}G#P=ka192y>W9^y%*@P;CQ7D;0BVrBwIA<_WwTb7Op0d<+PR@q zV9tHvPJWh^6ie=dO&{2Z^(Mx(^IAx8^AVxk(>2A|uC)r+t( zD@LJoDWYFOCv?$O4Be@;)h=-ob6?=J3XU4~1>e;KR6o$GUPTTLk2ge~Z&1%Tp8U9Y zfozHSWear3&S`O-(sMmxdF8JZu~6oOUO1(a(k*3WEFCOGJ_9%Z%v5dt(xb;Sy# zz|YyV-?w~ry_<=7re{v|M#pWDLXWS4+5OS}=7HBotTkd{K*c#17y~Q{wk|v`g6u_k zFrnCzfTD`igau5rwpK!TOmQ($``vg|aP*{#e6mO6&z>kGPq!>1YdE$wLt6HIqed=u zA&-EXc+@?6Jfn>@dXq=%D7IWxfaURpkAR8P&=w`}P4@Dh?3y6q4Yg>k+Ef+=9ql4Q zM2Iq#1X@+%=17h(BTU8lY+F?tXsHa@O+7b8y?Y}5W6F%j3{+<=}v`4*u=8;zIdo<8M-K88IIk4#V28>plm5G z{V9yE$z}ZYC>lE*i-Mcu?%b?kW3XmT$H8r|h=3=W5jQE1H$MwYSKQ%1qm{$Dg3ccA z5L6%cl_*ll;Hfdkdhrny5i^1|8hpAp{uQhlJn|TnC52-6cVS zyIUA6xVsZ11eXK|E`cBe1W1BI1QH;7`M&+PcI$s{>%H1nuU^&LIbC=9_Vn~^yQh!z zIW1&c-=xyOr4xxB#pT;vI>Ff<7sdSD@soFH13vYWVaI`Opqo-kH9i}y>#@>5U?8O& z`^@>h=b*8SmIje_A@q?0f>LGEXC0^MRX&0IO zZlu#o2m3^yD))jyDvE*_Zt?KND=ECLC{o*YjZWq_@9{;IG>4c`-vi|!TB8Pf@5 z1zGwYM#Wh_r>T@Y;(@#%pkW}5CywPm5S)sRrp2sDX|#pqCM|n`cmI$h>;(pXX`&o~9_0uERM^ zGlsSm=YcA*<2&XE6+k`tAf5F=238Uf$p8Y(ny%;DrmVBPRhqk>ESoI!qjI|(0b=L5 z6IPSA%IwRnO01;xGE!Cu3v3(mz!}hw{u2P(2|u=OhW8vMh1BJBIi#`=NL4UMmD8p0 z-dxT2oxh^{A0+YrO_csmgkSY9Xa=yZC%zrqKZb#YazB$vc1^!~8lvND;PUIBp+|Ka=j5b%Dj_pa|ono}#NR5fE+AHK_XK@^Z%gD&? zpbolvKVFk*UtfjS6bS%v+}w*kM}Pq5iulZ(*AD* zWxaLPam0u9@15OTON+;i$-8$`>FM#Ilp>8=TI;D#5`TRb@r*85`DlupPY;uuK0JaA z6zGRiocaZi5H=NEU$Mt<`WAn?o>@41Gy|wNrSH|7#DIrrFdD|c+Rb~@GBAjQMG(+! z&Ycl^g{POCw+u21Y|D6RTZa8>SO(;fCYB@riF9vlb*lH|q{Y2#$nqJfDc6M_+V0-D zgy4s%aF7k4Ly<1=&QZke)0-i9)ev(;gWB;@5TnI#kdRXdWOjLenQ|^6l$8pfh6t*M zs-A_OF_Ri)h3;CCL1!@=t>{Xirpt#8k7%dFGOk043EK@;68$kc2cx4(vJ%?PxwW?y zcxg6X>^qKdx1L~&p5}~gi$GgP&og%g$b0wC%goF_=$hN5&o)`}($?p#jLHj}gqDQTASE<+%FzR4Yo3JK9-1|rZ zU{<-7b+Se^S!xe{JU$bv{&LDqkO{A7m3A%7B=M52+7moORy?Ozn#sf#0AW4UQ|t4= zU6vETs#ZE5+NCD7oZop%G5Hrn)6ecoA^9UQ7OMFaKldtUvJ*V8jpF>s>cu*mG4yjD zj0t{vLkQ-zQ|(;=%;orqupTFWW!(Oql|Dk+vIi)9k!*(7s|FC~*`N|FI58@8uX3=f z!eO;6Vyv^hNP_{h1&_xb_MxNjbBB{veT_-zUPsQ{hrnTG@mc=z;~!NX4UadRV$?ju z`|r$NXvFJQsODUs&fJ;tzNx-rso4J0f9=D?Wg<%ec({?OW9au_X!3x9Xlz2SpOL2g z3ryD`Brm&6HA8J#3MoZIc+)gJ=hFn_I%R{d@{|%O*HX0HL$oEzD;$j|39$VkV9(h; zKxDW#Tv@N4)moNPhcs~9W_&yeKSvT!XcV5k;rfVPkyYqNnj6_o%g*}fw6|FGO?!X| zVE>D&=ZXfkG{^gHmq`3rw8JKtTF_AU+Y@Iw>h>Cgyq%%tI-DCQzDH{+vrRV3RsUpZj+-CYfL0=t;^T3$f zpi0H_nIAE)W!{=j`%RtZZVC4}1WjKTTt43aA8#xD)K79ZgnJx(r@s~~JjQyCe?;?9 zxY@ySdaxk!F;;M-)L@b2OtZsB;Uk)#_<#OeLf}mE|50cOocVt|ybYZB|5W%-4II}$ z6mk=yWJeQWOM8{4`Wrv? zLEvSp9^97U^Cn=q=b0!sloYG|=`SeVH$kUkqVg4yUM{C`r}hgfrq}4WJ}!{bSeAnI zub9y;aVd|+=Ak83Q*{p4-0@+$2|dF7Xm)09lV`cFD3Sc(?pDTws^}B8L#LEiF7;aa zrLFnO$7*2KV$X;fQtl=yQPB_fi976fV10*d!2z(7<=nX71Sw`Xk-X0w3}2YkRirZm zrN|I998heHUqzOy9UB)XhIQn)*6#5>j*_Ct;4-Jd31$5;w0I9r>{d=yUh?w5h+|m~g0@G<#jPTfDLQOB`xNkfkr!?@(=9N0w{R#cLTyV?Y z9P2zhqxVx+)S?YvAp9)<(LgZho1-^bIFpg(BTFI{O|2XX+-eCQiM(nTl~E}1IYE;p ze=B`d*6(FL3tO<mJ4T+EfkYlhTY^ zleqn2)M}4{nZm9`oTO4!6W@SQH`lO1bca#L4)c8~%rjvnbqBDSF-9b;%xOq|6EFqN z${IH74oe^a&O<=Mbh<706dR*W9s_v4yCCT@80cgFis@<)yWZ7nc@{osX3Y|ulFA-- z>AX2yu)|4rB*cD<(+U@*Ky9*)My<}?2=+#tJzFqSpor8x=Nz0z^C%dqqjkiiYp$0= zS9SlMwc}Tdh9ii3tVzN#w%?7QnLi9g2HhrX4Nxrh8Td9)7Qvt9vhk zzkBc(G)C}bxz#A2IxeDkmRUzB$_xLoiskVk0mUPYppWD_CBh#W^02Wp$1)$w1D3J` zG$mL4S8qQ78!6&^?Hd_h`AE)u4HsT?M1}ssYES6tLpM=0w*WV=HrAieOYg})oFxD7 z`l0W7tgY&s>NcJP$`ezc6E-gMuYr@yv6z^jeT5?L7_{j7y2@ndyI46mlqa zyBz$d{?9MtUngy+8xC9le@M1Rub>@3g?hfzqBpuOLQD8x?1O=9Z4t-(>v08nPZRTN z{5B03_XR7yT_I!w8xr*!+5xqk?wyc z$K(W@;N_}<^-2YZOl@xNBvlL!Qk}qB7ePmZgl@oxZ^$+!5pj=qGM@e3eqNte81D)L zGxyFTHMhm5T4**hPGfcTWADsxTb4n)HZ2TAxv|Azq7gW2J_-3+AIem~cY(LR3PG6U8uFi12a0>HIIJcIf z(tqL`6`nZ(Ri*nkN-G6z?{iPlP3lB6nPt(Y)*qv45H=a&NYNKUZUTc1f8uab}f{XJ$Fb&Dn#0n&|$T% z>a(SN)|prmv=mG4nk@c;@LERg6g4<*RBPFZ*UzY{j63m^veR}sbrrg@v3EDwZK>*` z7YMrdh`e};L2vdqAzLG1y6fFzk(ew!>I4INK`f0i&2U2FN!_`!2E2%gu{S&*Ov7N4 z?GJIKAd2PL6g;uGI#+t#YI!D`^UhoOh+|UzWY|)%Iy@8hc*@ z^UP%ucvKN9Lq9&4k=D^^C+AVFh(V%A^CRt}myW$65#_`BCQhRHe?%L50kaN@xP#GiAw=FFqx8gGKx@HFo(-JlHb*;Vz%GtT0M-(9V#b@@3VJ zqFti80KW!1AhRsjv0=NIDs~vGMWmVL6HNLN?Td^X2PtEf+060jI$PZ>-?Jps{Pz_O z*~ub!^Lvyf?sr(D*$u3>xgU$V|9AMO2f8|6OYEbDq8L6+kKF#Rhp~0TgrWF!xQd_VZJhXM$XOTt1Jd5Osb zs%Z?VS}oxCzaN;9w>gG8AU)k5`AxYK*Z=$SKkb7YN5bJdnb#$t9Vzq@QFIIMoyk0X zf5O3TfVhY<(SnH5yE{J2jxTM0OJsyjPF<&dO8s%MbU~G$(E?F$8vSs z5v6jfoi_>(8d}g@D5?z2WUINJaVCn_Hk@#kw?q1T@^@ifW-Tq}1aJzQF)lHNs`1c2 z?%Tt6@*#pRy;aAB&-@|&MJrof8bJuw3({I$20gqYs-M|f5H+k#b=m|YxmkWhK+=&m3Tb0ZoU|D@kcJKV zu$pVU;NWpIJQSI#dz0blUbvEW-A$VXy>+QOh z-xFl8%ATkn7PL&j;aDbhR<-Zp^vtrBn?Zhn7de2+`|N8ZB{aVmc*mI!mWFitw|m|7 z-40QeW|_P^6+RVoa|H*Tm>qzwP9+imchDD&mh=pjZb{*gO% zE0jiAj-*{eJQQAoVDX;y)SU-DbDlmp0gk1HT)GvZ`l`sAy5DubU50w0hROc$8r@#* zu?p4mCR`xg>EBX74bM*{{(>gvJ@s-)7X+UH>=y8d>7%X$k%0dw-?AnbiZ5RYRlZMWM7EPDHlIrI?{iXA=4iXVi|e})@{g@vXIFV#f@L*Y&6 zT=CmnLy|3@&!o_eod5|D^5*{WNZ_a4`@8#k167C)RRrROXa6R0Ul~TLo{g8|@X5DL zKM!3$`U~n_{R{GGyE|~Wou2tqQ1t7u^a=0-CK(tUGhbyjb7v)69YzInJ0=N}b)R_V zt@AQ}c|GET&iPwaPY!C%ho(Gx_su$$v>;p>a^ReA?S38g1I6%*G4R8ypj76K8*9_9 z2m5lEHuP?c5zf`blH5ZT>OBmg3xUb!3FUv_zQwCtcLeX@Sm%O=l%K{PC=aP3N#WE2 z5j=O5He(eENR(Ap(E!l7{TbW?;VREY$fwH7v2x=Tfuusxb#@`3sX&pc$XyHIdfxP{ z2^YBywEsM>;(kafR0~r1W4&hXtPx13^0|PBK4$2{8s(c~&a;Urr;to}9=+lcC%3U4 z@PD*obO`dC*lUmA(K>G7s!eZ;e$~v5-}D3Hhvz|-%FT7*)t^j?Rb1>{3)bNioY}4- z7m+1#f5zgUH*V}@B&4q=5yn^7Rd$c&K^u!J`!aqEd{9SFogRI~eGy~eOZzLL!r zeKMO*s242*lOjA?hETQqEnG_heaau?eDzylu@v`-X;|Qf-c#Dbi(l1P`7p^n1b$NX zYl|8uGqYr(=i-qd3@!8B$V+rgF}j#2v4?Av{c+J1AQ$;W;i5PY@hr0BL$?aVjGHG@ zA4w^9TVuKqT1}LX>C1wQn{>#s0kb=U;pRa$^$Kn&zO1KWaBJbnIVpU6b{7hTOud z7|Fh?p}P~oM2SbbOpQIxeRRM~D%#KeEngfw=4%ORtPo&{ry3cOSvXp8YUC+f=0vL# zZZqQV(|HxIXQjbvdYw0k5~(aJ%JhDXGV`)>ZPrleyo5gQ?PEBQzT@ujEErGR_QT!Y zIL`Ji{jO))M?KPs?xN~lxE1d*`-V^V$EFy@?kkH$jA~g z;^j1I>L*+8X^(Z%6Z^T=d=jbHF_XWdiMoDq@m#+_LoMUDPR%))YSm6FwU3LEh9{TR z%ZBt34~6XYn+J;D3QTIrSWNQ#yqHE|f3t_GmoaVYmSCj$bA)@Kpm2F^B5({NBu(`$ ztUJqa5Tn6~c5?DcUz(s@k<2BCg?6`z(;jk9>E!19JCYkbU zd;O+0tQm)LnYLF!ltadKlZ7aplqnhsWq4P;#N^G%tev8mKLxmHM32PlJDbZlCHb&9 z`YL^2AJa=&rVM}il{3Q`y@mL|FMq4Xac{-z9NP&nwP)6}cL1bYW?cpT#EkE|0<49Ba2(xUa#df1&NEK^B*V;QFDM|(gCbEXx@AuC^h$VSI&e9F)h)p9EoX%?QF(eY|qZuun zZ)+D9uRhE!yFY~=aWA8O6jbMMBBSks!I? zqMinA3s^u_nLWlMy?}#pxS^eR>I7E@0^LkMG9Z_xpbqW`O zEbGM?=~2L+&Fc!)cpBTTf#Ki4dZxoyj%uM$)mKqbC|@GN!(#oQ0wDNV^O!F5A5dsQ zX?5*C7d9;{EKj1vn!44ZYqbWUM#&OZJ`AJp1R0UTt{x0|e;A8aK6Pmhk7h%JPykY8 zTFgcts!+&L?^Qge^V*zoH9;nCvQ#-@g&O7FI_e$Z&1>R z920e~z3W>VEQn3y!>1Oo93Hx%x_x@47DggTNSgdG#jd4ZMJw(>moQ0^vG)!5tlP^6 zi|4gPB8plb=&iUUfk`x*AbU-f&ymy`Q@NgYLrkA+bTe@N0rF${2+(EmfqFm}IQfl-=O`02>(Bm`N7q}+$LrL87`D*xspasyy|;;Wb^Bid zPFVn}TM>nkf#{*V!AR8AA`8kgy32p%oOyU?7dJJc6N=GD0_G!k zGTXM9krZAc$}$4WB6<|4NSE~NNIdpW=jV2SXX)AC%ATu75P0Ll%U{4QBR{s(!{c?D zb^ku>a4ev<+mO)b88>%EKOlhneTJd=gy2(QlgXX-cYHmzm@s@SzI;jVM59kpyed=`k% z9x%o{#`nF`)r{OlP*F-z@!jasPQ*i{Co22_dgz~#>ve|LSd3Np6Gal?ov|+hRinwd zf~)8j%R=E5XM)-^wL}r~TeNo=(k*<3z)J^(uiSSoL3U2x;%iz5sSYxm{iB}c{S84% z*Nz+``=sBMmLG9JBBj~2eP4LGr_J$XsE}?O5rr>E7-OvX)6G5}J7p_Hy&M zae8(?{RPe;HrZ~Ia0yRX3ENVfbKP9c{ltbeF8ZRAv46dq)}1BF);v-`tYc7e$R%;~bwd#d(`-r~w>GetzV z16iB6wyw6D5AWK-C_Z1hgrvolS-Wyq5;mw zNI_~J8fw$Nx9GNj4b`&-u&H|+@E|+sI$PB-E2BmI5DqY=UULfl;>$+|`52hu^5R*+ z4)n$Y2nmaW&HK>|t=t;~=2mwI8)^gdOqka}lbdIi#^|SBu5nJUvZRpO+9fc)!+0q9 zD|iqQLlE%wPiya~U@@;O|Hc1$SC>eH3ydA@gd_zNqk1Gow?ZMMe*);J8-Q-!^9EG6 zXp9upBS02_j6b3W&P05B82LDr>I%P~E;f8u-4OjlUP%Dvz+87$*&;^oqC{GU_lM#? zr2h!bcHGpuZmAib zkZe>90&fDzi+6|-?+{B(je(9ndZz*vL_#0bSj=hX+yR3E{6ppp%`g&rW8fjV@PXRa z5Q~=WHDELBoa@c}6MD(MRE^H0?frE5(fc7;wcqUY-{rw1}LQi&LAkL zl@MeQ8XsLr{6CzE5sHhgqIB}vm-wq_c4}spkT~2}BG?*bxhc&ru9h+v)}tc*BExv! zbN51~?d>~6Fe2C>m=OR(FeMN}{1d;wy9dT#&0zOnLI5=Xfq&EPbKmFC{3pkK>_7g+ z2$Vs|Fz{3vrW&StCyH7$67ISLu+neTw_(C_{TB9j3Rx$a-!=N8_3&*^t%mybj|$4EBqH&<9P zx`+yY#KO`01mFioAb9L%_tPLlT?kr zAK#I0aCVEB5>9Jtc)dMr=kWnKnryipJ#)(gFlSCALlL&yjzR)hVVI_v{fMnxZ>V&* zF(so0xA~8M(COzyKAyoS>FpYX=uO?9KZcOzASyomZm$PzBL)SzfXY>N2`B2a-J&D)k%~ffeAy`DKBJSbvC& zgu&xX@{U33qgXlp{u^_y;`5Y-EqF?@69VOPZ8<08d)ZpBcgx!E4z(?Zucbt}$MzpRf(5RJ*A)(a6UGzPG;r0gP<=Z~ZcjIjNiSJ!SZ0R>2}No16m2wkx;vI5xO(Mb zZryFnt|DJtMO=?(GN|@MS{Ms2mN81CwZK4lU}n2uMwu%EC+p2R?yFblF_yNvkA3pc zjpQGyx=iC!|Fi5!fq{2dhmF$AsMIKH&l{=uf#Fw8q)SZRgAL4H`+D$GUBqih1izJ&gCPzv&$8pw~t{FhYI_AYp zUMH>r2I)!elq)J``rNTa+xgQ=-1(mx1_ZJl%bi3nl7?h$Ji+GjBI?-DgW1?)yZ3mS z#|8>l%l6H50k_xX5YO9VN1WhmTcMGn64wyRrg05XE#-YCBK+RLq`|sOJ0*8errlDc z?n(TeAfHNY^TRZ>FwDAk$@p2iUo@ECG8vnbpS2ou!3dG%Uk;ZhqS@S@MKTc<}iZbD1>T*+AFx5ehqC>tSN1 ziDwR?G~q|Lrl&(vZ6yO@F5#?8=my=p(J=f*7tWG4%%y!+2WbN+K}9V5t}(U^H{L|A zMJDWtJ7s_3aPm4N^$UXHtv>&o^*0LSnIHRA0*kw4Xb^gsy{{Gzz3j2b)J4be)>y!H zul?93EHHg{iMiQ7Y`hsl8BElf5D*O?BI#L`GQ%8_Q#Rehh%Q%$JTi$5}+YQ{7h97NbvQk zTWp%n90F$UbYe-X$2@!|a+#d^o>M&g%106E5Qv&2Ub=%<3`y=QKp!kTO{B``oZ#^f z*k_k(6om$ZskgB5+22U!nmkhK={|#HZ0GkV3K23&N(Z-yPDsgC1m0DQP*P2{;U7fr zAbxQbrC(X$V53hMM{ylYQxmRb#5GcgPq~uI)$Vo%=8I?0Zd3~<*y*gvpTMPB1pQW4^@zx(nr zTd7Mu>K20kxGI{7>_RL3Mhkhf^a&-uk614c^eQ>+k^^ZG8j)WnZu zRzM;Irzsi{lJT}!%T}YaM6jhH<=&y}Ogwv#q(J3*UD6a;3~Y65V1g`Oha&C-AX?|JuPVM z=H%JANZ}Ots)-7t^o>7x-70s=6@61;KrK<&P z1{8}uHqh3{3TQ)T2{@)%UNG`f6k4DCqR>cR`4l~qZ^5XxUkgXmYyuIF^9^ln;f^W3 zVW+{ZZv7ilYY_WdJ@E3%?l-wi5iXpmPUJtpy?OozKb8COyU5W4` zaEO6Ybfw0phC|fOh|btU8TN+w%%<}8RPQZC1SrS^nAHSzi$t#_!RS|ufLQJ?NJI5b zpZhl-kJYbNii%0y&nQL{`N#H)>_c}LoxfoT8J=)XB#%)vZ@x^yr8IkPQ7$IPTHDn< z87Ubrql|fykwaj+xVFT>BVMjQl0{}xe75CCocWG46L&>j=99R9dA9{}NQUAOeo1_9amsBu{P{38gWQN*h@l%<9^60D# zi>x6bd2t{}#R2E2y~(Hug#tFQ6``|NWi&p$o@d71d!wlrvq!+*Pl}IS0@#l) zOEjATYLi}B+t*>#Iw@oF&0#a~hv^UV35G@S*oTL`e@o~PTHQGGn>yTWr`~!W3GYXP z(7LD3)H@DzCjC)hO!LG$8Hr{uSW3D%G4W)EGqp!lOO?xr5q6gG6lb&$>15P7G7_~^ zQfH>pufM^LM~z$1otaS!*bPQ?hj7#MpQ&ZmSm3b4>pVrY*yTL}#8K7tfQh1T-B1kz0JJac?xMicZz`jH{%GL>!K z=zv$4EaH#iysk)2)-YC@rbP}_zW4AE&Ltm&#f(r}y{YfcQIeG(#;D+g2ZFYP>wRt1 zU4f-Yx8f}!!iUjA#Eqsvlw3U;-`q^~1Dl_tzDX(*Y{Zb#dMKSrTbAF1o%BsGxpC3UpcsX-rw zp~UXC1L2Yw#Dx;=%WRKwg|v@)v?{Xir}bMrie*kY^nY)231_9mW>!}ia+zcv=yG}% z_Y4p(jU=%m-gPKd3xcdO!10FXf*q>m@uUwz!-$F5Wq{QSP~@wIqXF6nfGcU*3;neM zu+Q8>{k6S%gSsU|pfgJ0W!qtDQX(7`lNvoIwfJYuCZzf7%w@+jH(8T%laoeIv2dU4 z@lHHpUWyAap;OHl7&=;xSiD3Ua5Fmm_{oQl?%o(Q->r&2DuNf@j1&voi~~FDh+CU3 z*#yEa!%nMUgI@MxT}|?9gdDvp^djo;Ws*pjgCWN?;hJOmTu~aUVgYPaY?)4^&NRm8 zk0^V$AXYQZQPWfIms^>&4REYPUc+*Nu5jT3-0X%}D(@b_h?BVYwnN8QK~JxWBS+xO z3ID;N0j<1C{tFVm0$4HP*hCLZMi!J>w&1pI)iYpU7aO{YjmSW|t0(g->@e}zI!#{Y zT~jr$QxXcwIS+ROi^C%`>X#gwIWBZ+D}(NQIxXCrkHk7?VN}zm#il|*SxCV?Ov*~)Li9)_$rAKb-lx7*85RpQs@J$6`>E{HQMZeXd_f{@|+0wTvN=h z{GQF{uNwtO?{J!CW^q<5FQW)$U?!nI-U@a$Q^(z2hS@xM{z@^eGuRdWZs zX9fS0D3JGmp5Z^0uykMUfA@$jy}qj8XGj5sTuSC$ki|ZxK!<;r zZy9(*TSdGDH`h>WJf;a?Kv)6ciiPwQpmnpD>;X8=yzC*Jr3CsXVY~ShR@YcAPAazr ziIId8WfyIrDN0t^iZ?83%rUH6<#=zNRA7pJurW#Ag5;xhHn2wGAiUQ`L~Q&77hlNI z5XJYAh0{^jXmTMu>k=!e?H^NDqXkOfw}6LwMs1sWqJFZuoiPurl#J(d5I|RFn{rg- z77W{)CDFrNW0;Lh2F93Qx8GDKJ+xE(M;ZiNO7BHO-=&9o!P^$&|2B#Ov*UIaVnqc@ zn0qfJcy+b}c!&A|?E2jS77C8jSM?Tg^}vw;CU{LdlOjldo#b={x!7jtSW5cfvgEO;($kgAtkqUm9mU6mjNWnz^*I zozy(wHI~+!JW||HB6T%R`H|LLEkE3%+lLRfZO!)HN6?yNgI;0r87%iH+Unb!oJN(Oo?)L4)nj*X^_7yC zh@a=anvuh`dbVyY@I{0!xr&66%!vHC=Lke?TVxXEHXA219|DtOF>;&WEe5MG1lbq9 z`aMFwh$p^vNx@k!@>X!!Ff(h=UEU}-8PjS!caI{e9j#Hc$Qgj=MGvi@*yq*6;W}

_gT}I7PDOMmAXPT0Z3K(}w}y5Rwak6)Ol!KC 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 Ot=In%HS+zp{=Wd+|N2k> literal 0 HcmV?d00001 diff --git a/img/mesh_cryptpad2.jpg b/img/mesh_cryptpad2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5a4ed7bcce2853b1b88ebe2f5509434908c05505 GIT binary patch literal 79804 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�K61JK$|Z@WW5DQkV5~WX(R|IKjJfpV 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%0ASh)GQ_W#lED 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 literal 0 HcmV?d00001 From c488eaee816a2130e35634e137062dc820ccaf4e Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 25 Oct 2017 18:02:46 +0100 Subject: [PATCH 28/31] Cryptpad documentation --- doc/EN/mesh.org | 16 +++++ website/EN/mesh.html | 158 ++++++++++++++++++++++++++----------------- 2 files changed, 112 insertions(+), 62 deletions(-) diff --git a/doc/EN/mesh.org b/doc/EN/mesh.org index 9054839c..c4847301 100644 --- a/doc/EN/mesh.org +++ b/doc/EN/mesh.org @@ -54,6 +54,7 @@ The Freedombone mesh roughly follows MondoNet's ten social specifications: - Voice chat (VoIP) and video calls - Private and public sharing of files - Blogging + - Collaborative editing of documents and presentations - Creating and broadcasting audio media/podcasts - Social network stream. Follow/unfollow other peers - No network administration required @@ -303,6 +304,21 @@ One important point is that by default the microphone is turned off. When doing At present video doesn't work reliably, but text and voice chat do work well. +** Collaborative document editing +The mesh system includes the ability to collaboratively edit various sorts of documents using CryptPad. CryptPad is an almost peer-to-peer system in that it is designed for a client/server environment but that the server aspect of it is very minimal and limited to orchestrating the connected clients. With CryptPad installed on each mesh peer it effectively enables peer-to-peer collaborative editing. Documents are ephemeral and forgotten unless they're exported or copy-pasted to permanent storage. + +#+BEGIN_CENTER +[[file:images/mesh_cryptpad1.jpg]] +#+END_CENTER + +To create a document click on the CryptPad icon. Depending upon the specifications of your system it may take a few seconds to load, so don't be too disturned if the browser contents look blank for a while. Select _Rich Text Pad_ and give yourself a username. + +#+BEGIN_CENTER +[[file:images/mesh_cryptpad2.jpg]] +#+END_CENTER + +If you have the chat system running you can then copy and paste the URL for your pad into the chat, and the other user can then open the link and edit the document with you. You can repeat that for however many other users you wish to be able to edit. + ** Social Network Patchwork is available as a social networking system for the mesh. Like all social network systems it has a stream of posts and you can follow or unfollow other users. You can also send private messages to other users with end-to-end encryption. diff --git a/website/EN/mesh.html b/website/EN/mesh.html index 398838df..5db019ba 100644 --- a/website/EN/mesh.html +++ b/website/EN/mesh.html @@ -3,7 +3,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + @@ -274,13 +274,13 @@ for the JavaScript code in this tag. -What the system can do +What the system can do - -Disk Images +Disk Images - -Building Disk Images +Building Disk Images - -How to use it +How to use it @@ -324,15 +324,16 @@ The Freedombone mesh roughly follows MondoNet's ten social specifications:

  • Evolvable: The network should be built with future development in mind. The platform should be flexible enough to support technologies, protocols and modes of usage that have not yet been developed.
  • -
    -

    What the system can do

    -
    +
    +

    What the system can do

    +
    • Discovery of other users on the network
    • Text based chat, one-to-one and in groups
    • Voice chat (VoIP) and video calls
    • Private and public sharing of files
    • Blogging
    • +
    • Collaborative editing of documents and presentations
    • Creating and broadcasting audio media/podcasts
    • Social network stream. Follow/unfollow other peers
    • No network administration required
    • @@ -350,13 +351,13 @@ This system should be quite scalable. Both qTox and IPFS are based upon distribu
    -
    -

    Disk Images

    -
    +
    +

    Disk Images

    +
    -
    -

    Writing many images quickly

    -
    +
    +

    Writing many images quickly

    +

    There may be situations where you need to write the same disk image to multiple drives at the same time in order to maximize rate of deployment. In the instructions given below the dd command is used for writing to the target drive, but to write to multiple drives you can use a tool such as GNOME MultiWriter.

    @@ -384,9 +385,9 @@ The MultiWriter tool is also available within mesh client images, so that you ca

    -
    -

    Client images

    -
    +
    +

    Client images

    +
    @@ -435,16 +436,16 @@ sudo dd bs=1M -

    Router images

    -
    +
    +

    Router images

    +

    Routers are intended to build network coverage for an area using small and low cost hardware. You can bolt them to walls or leave them on window ledges. They don't have any user interface and their only job is to haul network traffic across the mesh and to enable peers to find each other via running bootstrap nodes for Tox and IPFS. Copy the image to a microSD card and insert it into the router, plug in an Atheros wifi dongle and power on. That should be all you need to do.

    -
    -

    Beaglebone Black

    -
    +
    +

    Beaglebone Black

    +
    @@ -481,9 +482,9 @@ There is still a software freedom issue with the Beaglebone Black, but it doesn'
    -
    -

    Building Disk Images

    -
    +
    +

    Building Disk Images

    +

    It's better not to trust images downloaded from random places on the interwebs. Chances are that unless you are in the web of trust of the above GPG signatures then they don't mean very much to you. If you actually want something trustworthy then build the images from scratch. It will take some time. Here's how to do it.

    @@ -571,9 +572,9 @@ The resulting image can be copied to a microSD card, inserted into a Beaglebone
    -
    -

    Customisation

    -
    +
    +

    Customisation

    +

    If you want to make your own specially branded version, such as for a particular event, then to change the default desktop backgrounds edit the images within img/backgrounds and to change the available avatars and desktop icons edit the images within img/avatars. Re-create disk images using the instructions shown previously.

    @@ -583,9 +584,9 @@ If you need particular dconf commands to alter desktop appearance or beha

    -
    -

    How to use it

    -
    +
    +

    How to use it

    +

    When you first boot from the USB drive the system will create some encryption keys, assign a unique network address to the system and then reboot itself. When that's done you should see a prompt asking for a username. This username just makes it easy for others to initially find you on the mesh and will appear in the list of users.

    @@ -595,9 +596,9 @@ After a minute or two if you are within wifi range and there is at least one oth

    -
    -

    Boot trouble

    -
    +
    +

    Boot trouble

    +

    If the system doesn't boot and reports an error which includes /dev/mapper/loop0p1 then reboot with Ctrl-Alt-Del and when you see the grub menu press e and manually change /dev/mapper/loop0p1 to /dev/sdb1, then press Ctrl-x. If that doesn't work then reboot and try /dev/sdc1 instead.

    @@ -607,9 +608,9 @@ After the system has booted successfully the problem should resolve itself on su

    -
    -

    Set the Date

    -
    +
    +

    Set the Date

    +

    On the ordinary internet the date and time of your system would be set automatically via NTP. But this is not the internet and so you will need to manually ensure that your date and time settings are correct. You might need to periodically do this if your clock drifts. It's not essential that the time on your system be highly accurate, but if it drifts too far or goes back to epoch then things could become a little confusing in regard to the order of blog posts.

    @@ -619,9 +620,9 @@ On the ordinary internet the date and time of your system would be set automatic

    -
    -

    Check network status

    -
    +
    +

    Check network status

    +

    Unlike with ordinary wifi, on the mesh you don't get a signal strength icon and so it's not simple to see if you have a good connection.

    @@ -644,9 +645,9 @@ When you are finished close the window and then select the Network Restart
    -
    -

    Connecting to the internet

    -
    +
    +

    Connecting to the internet

    +

    If you need to be able to access the internet from the mesh then connect one of the peers to an internet router using an ethernet cable, then reboot it. Other peers in the mesh, including any attached mobile devices, will then be able to access the internet using the ethernet attached peer as a gateway. Freifunk works in a similar way.

    @@ -669,9 +670,9 @@ Where myclient.ovpn comes from your VPN provider and with the password "<

    -
    -

    Connecting two meshes over the internet via a VPN tunnel

    -
    +
    +

    Connecting two meshes over the internet via a VPN tunnel

    +

    Maybe the internet exists, but you don't care about getting any content from it and just want to use it as a way to connect mesh networks from different geographical locations together. VPN configuration, pem and stunnel files exist within the home directory. Edit the configuration with:

    @@ -707,9 +708,9 @@ Using the password "freedombone". From a deep packet inspection point of
    -
    -

    Mobile devices (phones, etc)

    -
    +
    +

    Mobile devices (phones, etc)

    +

    To allow mobile devices to connect to the mesh you will need a second wifi adapter connected to your laptop/netbook/SBC. Plug in a second wifi adapter then reboot the system. The second adaptor will then create a wifi hotspot which mobile devices can connect to. The hotspot name also contains its local IP address (eg. "mesh-192.168.1.83").

    @@ -731,9 +732,9 @@ On some android devices you may need to move the downloaded APK file from the
    -
    -

    Chat System

    -
    +
    +

    Chat System

    +

    Ensure that you're within wifi range of at least one other mesh peer (could be a router or client) and then you should see that the Chat and Other Users icons appear. Select the users icon and you should see a list of users on the mesh. Select the Chat icon and once you are connected you should see the status light turn green. If after a few minutes you don't get the green status light then try closing and re-opening the Tox chat application. Select the plus button to add a friend and then copy and paste in a Tox ID from the users list.

    @@ -792,9 +793,42 @@ At present video doesn't work reliably, but text and voice chat do work well.
    -
    -

    Social Network

    -
    +
    +

    Collaborative document editing

    +
    +

    +The mesh system includes the ability to collaboratively edit various sorts of documents using CryptPad. CryptPad is an almost peer-to-peer system in that it is designed for a client/server environment but that the server aspect of it is very minimal and limited to orchestrating the connected clients. With CryptPad installed on each mesh peer it effectively enables peer-to-peer collaborative editing. Documents are ephemeral and forgotten unless they're exported or copy-pasted to permanent storage. +

    + +
    + +
    +

    mesh_cryptpad1.jpg +

    +
    +
    + +

    +To create a document click on the CryptPad icon. Depending upon the specifications of your system it may take a few seconds to load, so don't be too disturned if the browser contents look blank for a while. Select Rich Text Pad and give yourself a username. +

    + +
    + +
    +

    mesh_cryptpad2.jpg +

    +
    +
    + +

    +If you have the chat system running you can then copy and paste the URL for your pad into the chat, and the other user can then open the link and edit the document with you. You can repeat that for however many other users you wish to be able to edit. +

    +
    +
    + +
    +

    Social Network

    +

    Patchwork is available as a social networking system for the mesh. Like all social network systems it has a stream of posts and you can follow or unfollow other users. You can also send private messages to other users with end-to-end encryption.

    @@ -829,9 +863,9 @@ The Secure Scuttlebutt protocol which Patchwork is based upon is intended to be
    -
    -

    Sharing Files

    -
    +
    +

    Sharing Files

    +

    You can make files publicly available on the network simply by dragging and dropping them into the Public folder on the desktop. To view the files belonging to another user select the desktop icon called Visit a site and enter the username or Tox ID of the other user.

    @@ -846,9 +880,9 @@ You can make files publicly available on the network simply by dragging and drop
    -
    -

    Blogging

    -
    +
    +

    Blogging

    +

    To create a blog post select the Blog icon on the desktop and then use the up and down cursor keys, space bar and enter key to add a new entry. Edit the title of the entry and add your text. You can also include photos if you wish - just copy them to the CreateBlog/content/images directory and then link to them as shown.

    From 7a6173bf7b7c031fab86173adb37bea0efe754f4 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 25 Oct 2017 20:14:45 +0100 Subject: [PATCH 29/31] Describe vpn connection of meshes --- doc/EN/mesh.org | 22 ++---- website/EN/mesh.html | 155 +++++++++++++++++++------------------------ 2 files changed, 73 insertions(+), 104 deletions(-) diff --git a/doc/EN/mesh.org b/doc/EN/mesh.org index c4847301..52250d21 100644 --- a/doc/EN/mesh.org +++ b/doc/EN/mesh.org @@ -242,27 +242,13 @@ sudo openvpn myclient.ovpn Where /myclient.ovpn/ comes from your VPN provider and with the password "/freedombone/". ** Connecting two meshes over the internet via a VPN tunnel -Maybe the internet exists, but you don't care about getting any content from it and just want to use it as a way to connect mesh networks from different geographical locations together. VPN configuration, pem and stunnel files exist within the home directory. Edit the configuration with: +Maybe the internet exists, but you don't care about getting any content from it and just want to use it as a way to connect mesh networks from different geographical locations together. -#+begin_src bash -nano ~/client.ovpn -#+end_src +In your home directory on a system connected via ethernet to an internet router you'll find a file called *vpn.tar.gz*. If you want another mesh to be able to connect to yours then send them this file and get them to uncompress it into their home directory also on an internet gateway machine. If they have an external IP address or domain name for your router then they will be able to VPN connect using the *Connect Meshes* icon. They should also forward port 653 from their internet router to the mesh gateway machine. -Edit the IP address or domain for the mesh that you wish to connect to within the /route/ command: +You should create a new *vpn.tar.gz* file for every other mesh which wants to be able to connect to yours. If you are prompted for a password it is 'freedombone'. -#+begin_src bash -route [mesh IP or domain] 255.255.255.255 net_gateway -#+end_src - -Then you can connect to the other mesh with: - -#+begin_src bash -cd /home/fbone -sudo stunnel stunnel-client.conf -sudo openvpn client.ovpn -#+end_src - -Using the password "/freedombone/". From a deep packet inspection point of view the traffic going over the internet will just look like any other TLS connection to a server. +From a deep packet inspection point of view the traffic going over the internet between mesh gateways will just look like any other TLS connection to a server. ** Mobile devices (phones, etc) To allow mobile devices to connect to the mesh you will need a second wifi adapter connected to your laptop/netbook/SBC. Plug in a second wifi adapter then reboot the system. The second adaptor will then create a wifi hotspot which mobile devices can connect to. The hotspot name also contains its local IP address (eg. "/mesh-192.168.1.83/"). diff --git a/website/EN/mesh.html b/website/EN/mesh.html index 5db019ba..b05e69a1 100644 --- a/website/EN/mesh.html +++ b/website/EN/mesh.html @@ -3,7 +3,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + @@ -274,13 +274,13 @@ for the JavaScript code in this tag. -What the system can do +What the system can do - -Disk Images +Disk Images - -Building Disk Images +Building Disk Images - -How to use it +How to use it @@ -324,9 +324,9 @@ The Freedombone mesh roughly follows MondoNet's ten social specifications:
  • Evolvable: The network should be built with future development in mind. The platform should be flexible enough to support technologies, protocols and modes of usage that have not yet been developed.
  • -
    -

    What the system can do

    -
    +
    +

    What the system can do

    +
    • Discovery of other users on the network
    • Text based chat, one-to-one and in groups
    • @@ -351,13 +351,13 @@ This system should be quite scalable. Both qTox and IPFS are based upon distribu
    -
    -

    Disk Images

    -
    +
    +

    Disk Images

    +
    -
    -

    Writing many images quickly

    -
    +
    +

    Writing many images quickly

    +

    There may be situations where you need to write the same disk image to multiple drives at the same time in order to maximize rate of deployment. In the instructions given below the dd command is used for writing to the target drive, but to write to multiple drives you can use a tool such as GNOME MultiWriter.

    @@ -385,9 +385,9 @@ The MultiWriter tool is also available within mesh client images, so that you ca

    -
    -

    Client images

    -
    +
    +

    Client images

    +
    @@ -436,16 +436,16 @@ sudo dd bs=1M -

    Router images

    -
    +
    +

    Router images

    +

    Routers are intended to build network coverage for an area using small and low cost hardware. You can bolt them to walls or leave them on window ledges. They don't have any user interface and their only job is to haul network traffic across the mesh and to enable peers to find each other via running bootstrap nodes for Tox and IPFS. Copy the image to a microSD card and insert it into the router, plug in an Atheros wifi dongle and power on. That should be all you need to do.

    -
    -

    Beaglebone Black

    -
    +
    +

    Beaglebone Black

    +
    @@ -482,9 +482,9 @@ There is still a software freedom issue with the Beaglebone Black, but it doesn'
    -
    -

    Building Disk Images

    -
    +
    +

    Building Disk Images

    +

    It's better not to trust images downloaded from random places on the interwebs. Chances are that unless you are in the web of trust of the above GPG signatures then they don't mean very much to you. If you actually want something trustworthy then build the images from scratch. It will take some time. Here's how to do it.

    @@ -572,9 +572,9 @@ The resulting image can be copied to a microSD card, inserted into a Beaglebone
    -
    -

    Customisation

    -
    +
    +

    Customisation

    +

    If you want to make your own specially branded version, such as for a particular event, then to change the default desktop backgrounds edit the images within img/backgrounds and to change the available avatars and desktop icons edit the images within img/avatars. Re-create disk images using the instructions shown previously.

    @@ -584,9 +584,9 @@ If you need particular dconf commands to alter desktop appearance or beha

    -
    -

    How to use it

    -
    +
    +

    How to use it

    +

    When you first boot from the USB drive the system will create some encryption keys, assign a unique network address to the system and then reboot itself. When that's done you should see a prompt asking for a username. This username just makes it easy for others to initially find you on the mesh and will appear in the list of users.

    @@ -596,9 +596,9 @@ After a minute or two if you are within wifi range and there is at least one oth

    -
    -

    Boot trouble

    -
    +
    +

    Boot trouble

    +

    If the system doesn't boot and reports an error which includes /dev/mapper/loop0p1 then reboot with Ctrl-Alt-Del and when you see the grub menu press e and manually change /dev/mapper/loop0p1 to /dev/sdb1, then press Ctrl-x. If that doesn't work then reboot and try /dev/sdc1 instead.

    @@ -608,9 +608,9 @@ After the system has booted successfully the problem should resolve itself on su

    -
    -

    Set the Date

    -
    +
    +

    Set the Date

    +

    On the ordinary internet the date and time of your system would be set automatically via NTP. But this is not the internet and so you will need to manually ensure that your date and time settings are correct. You might need to periodically do this if your clock drifts. It's not essential that the time on your system be highly accurate, but if it drifts too far or goes back to epoch then things could become a little confusing in regard to the order of blog posts.

    @@ -620,9 +620,9 @@ On the ordinary internet the date and time of your system would be set automatic

    -
    -

    Check network status

    -
    +
    +

    Check network status

    +

    Unlike with ordinary wifi, on the mesh you don't get a signal strength icon and so it's not simple to see if you have a good connection.

    @@ -645,9 +645,9 @@ When you are finished close the window and then select the Network Restart
    -
    -

    Connecting to the internet

    -
    +
    +

    Connecting to the internet

    +

    If you need to be able to access the internet from the mesh then connect one of the peers to an internet router using an ethernet cable, then reboot it. Other peers in the mesh, including any attached mobile devices, will then be able to access the internet using the ethernet attached peer as a gateway. Freifunk works in a similar way.

    @@ -670,47 +670,30 @@ Where myclient.ovpn comes from your VPN provider and with the password "<

    -
    -

    Connecting two meshes over the internet via a VPN tunnel

    -
    +
    +

    Connecting two meshes over the internet via a VPN tunnel

    +

    -Maybe the internet exists, but you don't care about getting any content from it and just want to use it as a way to connect mesh networks from different geographical locations together. VPN configuration, pem and stunnel files exist within the home directory. Edit the configuration with: +Maybe the internet exists, but you don't care about getting any content from it and just want to use it as a way to connect mesh networks from different geographical locations together.

    -
    -
    nano ~/client.ovpn
    -
    -
    -

    -Edit the IP address or domain for the mesh that you wish to connect to within the route command: +In your home directory on a system connected via ethernet to an internet router you'll find a file called vpn.tar.gz. If you want another mesh to be able to connect to yours then send them this file and get them to uncompress it into their home directory also on an internet gateway machine. If they have an external IP address or domain name for your router then they will be able to VPN connect using the Connect Meshes icon. They should also forward port 653 from their internet router to the mesh gateway machine.

    -
    -
    route [mesh IP or domain] 255.255.255.255 net_gateway
    -
    -
    -

    -Then you can connect to the other mesh with: +You should create a new vpn.tar.gz file for every other mesh which wants to be able to connect to yours. If you are prompted for a password it is 'freedombone'.

    -
    -
    cd /home/fbone
    -sudo stunnel stunnel-client.conf
    -sudo openvpn client.ovpn
    -
    -
    -

    -Using the password "freedombone". From a deep packet inspection point of view the traffic going over the internet will just look like any other TLS connection to a server. +From a deep packet inspection point of view the traffic going over the internet between mesh gateways will just look like any other TLS connection to a server.

    -
    -

    Mobile devices (phones, etc)

    -
    +
    +

    Mobile devices (phones, etc)

    +

    To allow mobile devices to connect to the mesh you will need a second wifi adapter connected to your laptop/netbook/SBC. Plug in a second wifi adapter then reboot the system. The second adaptor will then create a wifi hotspot which mobile devices can connect to. The hotspot name also contains its local IP address (eg. "mesh-192.168.1.83").

    @@ -732,9 +715,9 @@ On some android devices you may need to move the downloaded APK file from the
    -
    -

    Chat System

    -
    +
    +

    Chat System

    +

    Ensure that you're within wifi range of at least one other mesh peer (could be a router or client) and then you should see that the Chat and Other Users icons appear. Select the users icon and you should see a list of users on the mesh. Select the Chat icon and once you are connected you should see the status light turn green. If after a few minutes you don't get the green status light then try closing and re-opening the Tox chat application. Select the plus button to add a friend and then copy and paste in a Tox ID from the users list.

    @@ -793,9 +776,9 @@ At present video doesn't work reliably, but text and voice chat do work well.
    -
    -

    Collaborative document editing

    -
    +
    +

    Collaborative document editing

    +

    The mesh system includes the ability to collaboratively edit various sorts of documents using CryptPad. CryptPad is an almost peer-to-peer system in that it is designed for a client/server environment but that the server aspect of it is very minimal and limited to orchestrating the connected clients. With CryptPad installed on each mesh peer it effectively enables peer-to-peer collaborative editing. Documents are ephemeral and forgotten unless they're exported or copy-pasted to permanent storage.

    @@ -826,9 +809,9 @@ If you have the chat system running you can then copy and paste the URL for your
    -
    -

    Social Network

    -
    +
    +

    Social Network

    +

    Patchwork is available as a social networking system for the mesh. Like all social network systems it has a stream of posts and you can follow or unfollow other users. You can also send private messages to other users with end-to-end encryption.

    @@ -863,9 +846,9 @@ The Secure Scuttlebutt protocol which Patchwork is based upon is intended to be
    -
    -

    Sharing Files

    -
    +
    +

    Sharing Files

    +

    You can make files publicly available on the network simply by dragging and dropping them into the Public folder on the desktop. To view the files belonging to another user select the desktop icon called Visit a site and enter the username or Tox ID of the other user.

    @@ -880,9 +863,9 @@ You can make files publicly available on the network simply by dragging and drop
    -
    -

    Blogging

    -
    +
    +

    Blogging

    +

    To create a blog post select the Blog icon on the desktop and then use the up and down cursor keys, space bar and enter key to add a new entry. Edit the title of the entry and add your text. You can also include photos if you wish - just copy them to the CreateBlog/content/images directory and then link to them as shown.

    From 881d5e2cfb00ea78c60020bdb680475e1d00ade0 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 25 Oct 2017 20:24:28 +0100 Subject: [PATCH 30/31] Mesh connect image --- doc/EN/mesh.org | 4 ++ img/mesh_connect.jpg | Bin 0 -> 43251 bytes website/EN/mesh.html | 138 +++++++++++++++++++++++-------------------- 3 files changed, 77 insertions(+), 65 deletions(-) create mode 100644 img/mesh_connect.jpg diff --git a/doc/EN/mesh.org b/doc/EN/mesh.org index 52250d21..9dc76842 100644 --- a/doc/EN/mesh.org +++ b/doc/EN/mesh.org @@ -246,6 +246,10 @@ Maybe the internet exists, but you don't care about getting any content from it In your home directory on a system connected via ethernet to an internet router you'll find a file called *vpn.tar.gz*. If you want another mesh to be able to connect to yours then send them this file and get them to uncompress it into their home directory also on an internet gateway machine. If they have an external IP address or domain name for your router then they will be able to VPN connect using the *Connect Meshes* icon. They should also forward port 653 from their internet router to the mesh gateway machine. +#+BEGIN_CENTER +[[file:images/mesh_connect.jpg]] +#+END_CENTER + You should create a new *vpn.tar.gz* file for every other mesh which wants to be able to connect to yours. If you are prompted for a password it is 'freedombone'. From a deep packet inspection point of view the traffic going over the internet between mesh gateways will just look like any other TLS connection to a server. diff --git a/img/mesh_connect.jpg b/img/mesh_connect.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2db3f49791a3c7e1683470f635062f7dbd399be4 GIT binary patch literal 43251 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 - + @@ -274,13 +274,13 @@ for the JavaScript code in this tag. -What the system can do +What the system can do - -Disk Images +Disk Images - -Building Disk Images +Building Disk Images - -How to use it +How to use it @@ -324,9 +324,9 @@ The Freedombone mesh roughly follows MondoNet's ten social specifications:
  • Evolvable: The network should be built with future development in mind. The platform should be flexible enough to support technologies, protocols and modes of usage that have not yet been developed.
  • -
    -

    What the system can do

    -
    +
    +

    What the system can do

    +
    • Discovery of other users on the network
    • Text based chat, one-to-one and in groups
    • @@ -351,13 +351,13 @@ This system should be quite scalable. Both qTox and IPFS are based upon distribu
    -
    -

    Disk Images

    -
    +
    +

    Disk Images

    +
    -
    -

    Writing many images quickly

    -
    +
    +

    Writing many images quickly

    +

    There may be situations where you need to write the same disk image to multiple drives at the same time in order to maximize rate of deployment. In the instructions given below the dd command is used for writing to the target drive, but to write to multiple drives you can use a tool such as GNOME MultiWriter.

    @@ -385,9 +385,9 @@ The MultiWriter tool is also available within mesh client images, so that you ca

    -
    -

    Client images

    -
    +
    +

    Client images

    +
    @@ -436,16 +436,16 @@ sudo dd bs=1M -

    Router images

    -
    +
    +

    Router images

    +

    Routers are intended to build network coverage for an area using small and low cost hardware. You can bolt them to walls or leave them on window ledges. They don't have any user interface and their only job is to haul network traffic across the mesh and to enable peers to find each other via running bootstrap nodes for Tox and IPFS. Copy the image to a microSD card and insert it into the router, plug in an Atheros wifi dongle and power on. That should be all you need to do.

    -
    -

    Beaglebone Black

    -
    +
    +

    Beaglebone Black

    +
    @@ -482,9 +482,9 @@ There is still a software freedom issue with the Beaglebone Black, but it doesn'
    -
    -

    Building Disk Images

    -
    +
    +

    Building Disk Images

    +

    It's better not to trust images downloaded from random places on the interwebs. Chances are that unless you are in the web of trust of the above GPG signatures then they don't mean very much to you. If you actually want something trustworthy then build the images from scratch. It will take some time. Here's how to do it.

    @@ -572,9 +572,9 @@ The resulting image can be copied to a microSD card, inserted into a Beaglebone
    -
    -

    Customisation

    -
    +
    +

    Customisation

    +

    If you want to make your own specially branded version, such as for a particular event, then to change the default desktop backgrounds edit the images within img/backgrounds and to change the available avatars and desktop icons edit the images within img/avatars. Re-create disk images using the instructions shown previously.

    @@ -584,9 +584,9 @@ If you need particular dconf commands to alter desktop appearance or beha

    -
    -

    How to use it

    -
    +
    +

    How to use it

    +

    When you first boot from the USB drive the system will create some encryption keys, assign a unique network address to the system and then reboot itself. When that's done you should see a prompt asking for a username. This username just makes it easy for others to initially find you on the mesh and will appear in the list of users.

    @@ -596,9 +596,9 @@ After a minute or two if you are within wifi range and there is at least one oth

    -
    -

    Boot trouble

    -
    +
    +

    Boot trouble

    +

    If the system doesn't boot and reports an error which includes /dev/mapper/loop0p1 then reboot with Ctrl-Alt-Del and when you see the grub menu press e and manually change /dev/mapper/loop0p1 to /dev/sdb1, then press Ctrl-x. If that doesn't work then reboot and try /dev/sdc1 instead.

    @@ -608,9 +608,9 @@ After the system has booted successfully the problem should resolve itself on su

    -
    -

    Set the Date

    -
    +
    +

    Set the Date

    +

    On the ordinary internet the date and time of your system would be set automatically via NTP. But this is not the internet and so you will need to manually ensure that your date and time settings are correct. You might need to periodically do this if your clock drifts. It's not essential that the time on your system be highly accurate, but if it drifts too far or goes back to epoch then things could become a little confusing in regard to the order of blog posts.

    @@ -620,9 +620,9 @@ On the ordinary internet the date and time of your system would be set automatic

    -
    -

    Check network status

    -
    +
    +

    Check network status

    +

    Unlike with ordinary wifi, on the mesh you don't get a signal strength icon and so it's not simple to see if you have a good connection.

    @@ -645,9 +645,9 @@ When you are finished close the window and then select the Network Restart
    -
    -

    Connecting to the internet

    -
    +
    +

    Connecting to the internet

    +

    If you need to be able to access the internet from the mesh then connect one of the peers to an internet router using an ethernet cable, then reboot it. Other peers in the mesh, including any attached mobile devices, will then be able to access the internet using the ethernet attached peer as a gateway. Freifunk works in a similar way.

    @@ -670,9 +670,9 @@ Where myclient.ovpn comes from your VPN provider and with the password "<

    -
    -

    Connecting two meshes over the internet via a VPN tunnel

    -
    +
    +

    Connecting two meshes over the internet via a VPN tunnel

    +

    Maybe the internet exists, but you don't care about getting any content from it and just want to use it as a way to connect mesh networks from different geographical locations together.

    @@ -681,6 +681,14 @@ Maybe the internet exists, but you don't care about getting any content from it In your home directory on a system connected via ethernet to an internet router you'll find a file called vpn.tar.gz. If you want another mesh to be able to connect to yours then send them this file and get them to uncompress it into their home directory also on an internet gateway machine. If they have an external IP address or domain name for your router then they will be able to VPN connect using the Connect Meshes icon. They should also forward port 653 from their internet router to the mesh gateway machine.

    +
    + +
    +

    mesh_connect.jpg +

    +
    +
    +

    You should create a new vpn.tar.gz file for every other mesh which wants to be able to connect to yours. If you are prompted for a password it is 'freedombone'.

    @@ -691,9 +699,9 @@ From a deep packet inspection point of view the traffic going over the internet
    -
    -

    Mobile devices (phones, etc)

    -
    +
    +

    Mobile devices (phones, etc)

    +

    To allow mobile devices to connect to the mesh you will need a second wifi adapter connected to your laptop/netbook/SBC. Plug in a second wifi adapter then reboot the system. The second adaptor will then create a wifi hotspot which mobile devices can connect to. The hotspot name also contains its local IP address (eg. "mesh-192.168.1.83").

    @@ -715,9 +723,9 @@ On some android devices you may need to move the downloaded APK file from the
    -
    -

    Chat System

    -
    +
    +

    Chat System

    +

    Ensure that you're within wifi range of at least one other mesh peer (could be a router or client) and then you should see that the Chat and Other Users icons appear. Select the users icon and you should see a list of users on the mesh. Select the Chat icon and once you are connected you should see the status light turn green. If after a few minutes you don't get the green status light then try closing and re-opening the Tox chat application. Select the plus button to add a friend and then copy and paste in a Tox ID from the users list.

    @@ -776,9 +784,9 @@ At present video doesn't work reliably, but text and voice chat do work well.
    -
    -

    Collaborative document editing

    -
    +
    +

    Collaborative document editing

    +

    The mesh system includes the ability to collaboratively edit various sorts of documents using CryptPad. CryptPad is an almost peer-to-peer system in that it is designed for a client/server environment but that the server aspect of it is very minimal and limited to orchestrating the connected clients. With CryptPad installed on each mesh peer it effectively enables peer-to-peer collaborative editing. Documents are ephemeral and forgotten unless they're exported or copy-pasted to permanent storage.

    @@ -809,9 +817,9 @@ If you have the chat system running you can then copy and paste the URL for your
    -
    -

    Social Network

    -
    +
    +

    Social Network

    +

    Patchwork is available as a social networking system for the mesh. Like all social network systems it has a stream of posts and you can follow or unfollow other users. You can also send private messages to other users with end-to-end encryption.

    @@ -846,9 +854,9 @@ The Secure Scuttlebutt protocol which Patchwork is based upon is intended to be
    -
    -

    Sharing Files

    -
    +
    +

    Sharing Files

    +

    You can make files publicly available on the network simply by dragging and dropping them into the Public folder on the desktop. To view the files belonging to another user select the desktop icon called Visit a site and enter the username or Tox ID of the other user.

    @@ -863,9 +871,9 @@ You can make files publicly available on the network simply by dragging and drop
    -
    -

    Blogging

    -
    +
    +

    Blogging

    +

    To create a blog post select the Blog icon on the desktop and then use the up and down cursor keys, space bar and enter key to add a new entry. Edit the title of the entry and add your text. You can also include photos if you wish - just copy them to the CreateBlog/content/images directory and then link to them as shown.

    From 576011af74ecd76e6e36874bfb684651e7adc82a Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 26 Oct 2017 13:03:20 +0100 Subject: [PATCH 31/31] Update current image hashes --- doc/EN/mesh.org | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/EN/mesh.org b/doc/EN/mesh.org index 9dc76842..e8667b1f 100644 --- a/doc/EN/mesh.org +++ b/doc/EN/mesh.org @@ -98,7 +98,7 @@ wget https://freedombone.net/downloads/current/freedombone-meshclient-i386.img.x wget https://freedombone.net/downloads/current/freedombone-meshclient-i386.img.xz.sig gpg --verify freedombone-meshclient-i386.img.xz.sig sha256sum freedombone-meshclient-i386.img.xz -995dd64538f46f6abf83ba258cca6cb82a72399cb9a099caeafc1de947ef795c +61e474afae14774d7aa479b6727fd5e77bdc1854e547b3c5b630bf10542a9581 unxz freedombone-meshclient-i386.img.xz sudo dd if=/dev/zero of=/dev/sdX bs=1M count=8 sudo dd bs=1M if=freedombone-meshclient-i386.img of=/dev/sdX conv=fdatasync @@ -114,7 +114,7 @@ wget https://freedombone.net/downloads/current/freedombone-meshclient-insecure-i wget https://freedombone.net/downloads/current/freedombone-meshclient-insecure-i386.img.xz.sig gpg --verify freedombone-meshclient-insecure-i386.img.xz.sig sha256sum freedombone-meshclient-insecure-i386.img.xz -b06e6ff5e56577025e6b994fe0bb28f02da7d2905ac32a2f38d7d074ffe801fc +fec843303d7d280859f75f7a8edccd70512915a34d4cc0787b5de7d8fbde5c81 unxz freedombone-meshclient-insecure-i386.img.xz sudo dd if=/dev/zero of=/dev/sdX bs=1M count=8 sudo dd bs=1M if=freedombone-meshclient-insecure-i386.img of=/dev/sdX conv=fdatasync @@ -155,7 +155,7 @@ wget https://freedombone.net/downloads/current/freedombone.tar.gz wget https://freedombone.net/downloads/current/freedombone.tar.gz.sig gpg --verify freedombone.tar.gz.sig sha256sum freedombone.tar.gz -fd0b3fe1527de893f4ece7ffe95fdf0c41e635a3f82d22a51b707c1aee541e88 +e2715e27b142a21fa257eab15778ddc96f86fda70f8d91d47c4c9aa19f22e272 tar -xzvf freedombone.tar.gz cd freedombone git checkout stretch