From d6d87b3988603266faf4d6b708529de711f20cf8 Mon Sep 17 00:00:00 2001 From: shinedday <shinedday@gmail.com> Date: Mon, 16 May 2022 10:45:39 +0200 Subject: [PATCH] Reformat view code, and add play tab --- db.sqlite3 | Bin 147456 -> 294912 bytes ping/admin.py | 6 +- ...periment_metrics_alter_experiment_media.py | 37 +++++ ping/models.py | 23 +++ ping/templates/ping/entry.html | 1 + ping/templates/ping/experiment.html | 1 + ping/templates/ping/index.html | 5 + ping/templates/ping/play.html | 55 +++++++ ping/urls.py | 9 ++ ping/views/__init__.py | 1 + ping/views/experiment.py | 4 - ping/views/network.py | 22 ++- ping/views/play.py | 149 ++++++++++++++++++ uploads/current_experiment/ant/__init__.py | 0 uploads/current_experiment/ant/agent.py | 28 ++++ uploads/current_experiment/ant/amas.py | 20 +++ uploads/current_experiment/ant/env.py | 15 ++ uploads/current_experiment/ant/scheduler.py | 7 + uploads/media/amas.py | 20 +++ uploads/media/ant.zip | Bin 0 -> 1335 bytes uploads/media/philosophers_7r4Esmi.zip | Bin 0 -> 3181 bytes 21 files changed, 389 insertions(+), 14 deletions(-) create mode 100644 ping/migrations/0003_currentexperiment_metrics_alter_experiment_media.py create mode 100644 ping/templates/ping/play.html create mode 100644 ping/views/play.py create mode 100644 uploads/current_experiment/ant/__init__.py create mode 100644 uploads/current_experiment/ant/agent.py create mode 100644 uploads/current_experiment/ant/amas.py create mode 100644 uploads/current_experiment/ant/env.py create mode 100644 uploads/current_experiment/ant/scheduler.py create mode 100644 uploads/media/amas.py create mode 100644 uploads/media/ant.zip create mode 100644 uploads/media/philosophers_7r4Esmi.zip diff --git a/db.sqlite3 b/db.sqlite3 index e33654f60a42bd1bdaf59e30dc8587fc89bd53be..8db1a619382a48f53c27a90a51d809a2091ac1f2 100644 GIT binary patch literal 294912 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 delta 1497 zcmZo@5Nc@PoFFB{Fp+_QL4^SUTqo)nF)>Wsn6QMOS%mBLWOf0~jg7mxHouk<XBE53 zz`^g$!vB&#fqyrD8GkqbEdJH}-WwZ@`5lD$n6()TGV{{oQ!5Hmi!yUl^Geu7n3;7M zQ?e5C((~gJQ*tx&;&bxTrG(j-wHXsjOETgMQj2mki;FY!^He5x>+7@Wi?cEtGfw~L z#3;<k338JN0|Ue4JNnAfB3uj%44nKC4E*o-PxIg6-^;&%zlJ}DKZ3t|W1}7a<OusU zVx0Wp4E%5TZ}Okw-@`wjzl*<`Kbt>%W1}tq<Z%DB%qqM_li342H#R=v*=!VhsfbyH zUw1P51<#F*clkE!-oM_!BE;a!Fr6cTQHhJs0c1M^1B35GN6GEJ35@2<jL)~XCNrk6 zGciYQYz$>)Zp^ou{wIr3i&15|dN$*c?MC^G=L{xYU}2WxPo2&_fk~5xe>4AD{^k4& z`DgP_-PowfKRtCm(`<H-N2K`cr?WdSn{I4$=AT~g&)hia0SmJf%aiHs7nn>pHm+b{ zuax3saMY}we*Y?y=(ej&EZod0T=S;0Utsjy*yzW#ecmm`G*v!UK1~MxMf@&&&-gm{ zG&eSi^VP@dvodHlDjHfE=^2_?=$RYp85x-uRF-7q=P9_P7H5~_7wG2}mXyS&=U3+E z>8DmC<`(3n>K9~W=HwUW7i6Rs73(Lar{<OD6;vu1Dj=I<V5wjlqsPjij$*vIDYEJH zq!@34X}m6e;|ZExkK}q|OyhOXjW;tyc0EDkkxVzjG+mpOp&m7G3@ykt-T=dRUIqpR z7XA!o{@eUp`TO}Z_%1*oG@(MMjeV>6SoozGR3|p7Fz%n&m@lBh!m24KFA0yx>GR~7 z#OfK8nOW75g$?!0O$#!M5{nCxQj3Zz{qu4%^HLd<nb1|48Ddezh_1@e0z(xj*|YHP zVBmkxzk{FqF8^u%MG&~LF__<)e+z>U#0M~ve+z>!j18qR6)`X{#7%e8XOi=RBy<)* zW_3omS3!PaMiVhJWD;Oj=R{ItXaNdYW_}9>{^R`h{1zJ<wfO5@+1VIGeYI6fQj1H% zi}Lf*71HvHauZ7wtQ4v;3l!2ab5a#R<y>+}YD!vSW{E;dYOz9cMt*T>ac*i#W}<#- zUYTA&r5hU?gQ~AEO7<dTTvbY9u0Gg|<ovv}%yhl1;`}^wRyGDzX<19;eCnK$nw*`Q TQk<WgI{jWglNgI$Rb~MIb%&`> diff --git a/ping/admin.py b/ping/admin.py index f8dd658..4cadb75 100644 --- a/ping/admin.py +++ b/ping/admin.py @@ -1,7 +1,9 @@ from django.contrib import admin -from .models import Client, Agent, Experiment +from .models import * admin.site.register(Client) admin.site.register(Agent) -admin.site.register(Experiment) \ No newline at end of file +admin.site.register(Experiment) +admin.site.register(Metrics) +admin.site.register(CurrentExperiment) \ No newline at end of file diff --git a/ping/migrations/0003_currentexperiment_metrics_alter_experiment_media.py b/ping/migrations/0003_currentexperiment_metrics_alter_experiment_media.py new file mode 100644 index 0000000..d014e25 --- /dev/null +++ b/ping/migrations/0003_currentexperiment_metrics_alter_experiment_media.py @@ -0,0 +1,37 @@ +# Generated by Django 4.0.4 on 2022-05-13 12:19 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ping', '0002_experiment'), + ] + + operations = [ + migrations.CreateModel( + name='CurrentExperiment', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=60)), + ('cycle', models.PositiveIntegerField(default=0)), + ('nbr_agent', models.PositiveIntegerField(default=0)), + ], + ), + migrations.CreateModel( + name='Metrics', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('experiment_name', models.CharField(max_length=60)), + ('cycle', models.PositiveIntegerField()), + ('agent_id', models.PositiveIntegerField()), + ('_metrics', models.BinaryField()), + ], + ), + migrations.AlterField( + model_name='experiment', + name='media', + field=models.FileField(blank=True, null=True, upload_to='media'), + ), + ] diff --git a/ping/models.py b/ping/models.py index c6a47a1..ecc1779 100644 --- a/ping/models.py +++ b/ping/models.py @@ -1,3 +1,5 @@ +import pickle + from django.db import models from django.forms import ModelForm @@ -30,3 +32,24 @@ class ExperimentForm(ModelForm): class Meta: model = Experiment fields = ["name", "description", "media"] + +class Metrics(models.Model): + experiment_name = models.CharField(max_length=60) + cycle = models.PositiveIntegerField() + agent_id = models.PositiveIntegerField() + _metrics = models.BinaryField() + + def set_data(self, data): + self._metrics = pickle.dumps(data) + + def get_data(self): + return pickle.loads(self._metrics) + + metrics = property(get_data, set_data) + + +class CurrentExperiment(models.Model): + + name = models.CharField(max_length=60) + cycle = models.PositiveIntegerField(default=0) + nbr_agent = models.PositiveIntegerField(default=0) \ No newline at end of file diff --git a/ping/templates/ping/entry.html b/ping/templates/ping/entry.html index b718dd6..a46a985 100644 --- a/ping/templates/ping/entry.html +++ b/ping/templates/ping/entry.html @@ -16,6 +16,7 @@ <div class="topnav"> <a href="/network">Network</a> <a class="active" href="/experiment">Experiment</a> + <a href="/play">Play</a> </div> <form action="/experiment/new/" method="POST" enctype="multipart/form-data"> {% csrf_token %} diff --git a/ping/templates/ping/experiment.html b/ping/templates/ping/experiment.html index 86454db..e725a12 100644 --- a/ping/templates/ping/experiment.html +++ b/ping/templates/ping/experiment.html @@ -16,6 +16,7 @@ <div class="topnav"> <a href="/network">Network</a> <a class="active" href="/experiment">Experiment</a> + <a href="/play">Play</a> </div> <form action='new' method='GET'> diff --git a/ping/templates/ping/index.html b/ping/templates/ping/index.html index e39a748..4e63881 100644 --- a/ping/templates/ping/index.html +++ b/ping/templates/ping/index.html @@ -15,6 +15,7 @@ <div class="topnav"> <a class="active" href="/network">Network</a> <a href="/experiment">Experiment</a> + <a href="/play">Play</a> </div> @@ -46,6 +47,10 @@ {% endfor %} </table> + <form action='./agent/kill' method='GET'> + <button type='submit'> Kill agents</button> + </form> + {% if agents %} <table> <tr> diff --git a/ping/templates/ping/play.html b/ping/templates/ping/play.html new file mode 100644 index 0000000..2b9de00 --- /dev/null +++ b/ping/templates/ping/play.html @@ -0,0 +1,55 @@ +<!DOCTYPE html> +<html> + +<head> + <meta charset="utf-8"> + {% load static %} + <link rel="stylesheet" type="text/css" href="{% static 'ping/index.css' %}"> + + <title>Play - IOTAMAK</title> + <meta name="viewport" content="width=device-width, initial-scale=1"> + +</head> + +<body> + + <div class="topnav"> + <a href="/network">Network</a> + <a href="/experiment">Experiment</a> + <a class="active" href="/play">Play</a> + </div> + + <p>Scheduler :</p> + + <form action='./scheduler/step' method='GET'> + <button type='submit'> Step</button> + </form> + + <form action='./scheduler/stop' method='GET'> + <button type='submit'> Stop</button> + </form> + + <form action='./scheduler/start' method='GET'> + <button type='submit'> Start</button> + </form> + + <p>Experiment :</p> + + <form action='./global/exit' method='GET'> + <button type='submit'> Exit</button> + </form> + + <form action='./global/share' method='GET'> + <button type='submit'> Share</button> + </form> + + <form action='./global/start' method='GET'> + <button type='submit'> Start</button> + </form> + + <form action='./global/load' method='GET'> + <button type='submit'> Load</button> + </form> + +</body> +</html> \ No newline at end of file diff --git a/ping/urls.py b/ping/urls.py index f7f3002..133b8fb 100644 --- a/ping/urls.py +++ b/ping/urls.py @@ -8,7 +8,16 @@ urlpatterns = [ path('network/pressed/', views.pressed, name='pressed'), path('network/update/', views.update, name='update'), path('network/agents/', views.agents, name='agents'), + path('network/agent/kill', views.kill, name='kill'), path('experiment/new/', views.entry, name='entry'), path('experiment/', views.experiment, name='experiment'), path('experiment/<int:experiment_id>/check/', views.check, name='check'), + path('play/', views.main_play, name='play'), + path('play/scheduler/start', views.scheduler_start, name='start'), + path('play/scheduler/step', views.scheduler_step, name='step'), + path('play/scheduler/stop', views.scheduler_stop, name='stop'), + path('play/global/exit', views.experiment_stop, name='exit'), + path('play/global/share', views.experiment_share, name='share'), + path('play/global/start', views.experiment_start, name='start_exp'), + path('play/global/load', views.experiment_load, name='load_exp'), ] \ No newline at end of file diff --git a/ping/views/__init__.py b/ping/views/__init__.py index 2b38d03..c041ce8 100644 --- a/ping/views/__init__.py +++ b/ping/views/__init__.py @@ -1,2 +1,3 @@ from .experiment import * from .network import * +from .play import * \ No newline at end of file diff --git a/ping/views/experiment.py b/ping/views/experiment.py index 4ba32dc..ca83afb 100644 --- a/ping/views/experiment.py +++ b/ping/views/experiment.py @@ -41,12 +41,8 @@ def empty_tmp(): def check(request, experiment_id): # get the path - print(experiment_id) exp = Experiment.objects.get(pk=experiment_id) - print(str(exp.media)) - print(str(settings.MEDIA_ROOT) + str(exp.media)) # check if it's a zip -> wrong format : not zip - print() if not zipfile.is_zipfile(str(settings.MEDIA_ROOT) + str(exp.media)): exp.status = "Wrong format : zip file expected" diff --git a/ping/views/network.py b/ping/views/network.py index 84e9734..5a13bc7 100644 --- a/ping/views/network.py +++ b/ping/views/network.py @@ -41,14 +41,7 @@ def update(request): ), Cmd( cmd="python3 -m pip install --force-reinstall dist/iotAmak-" + version + "-py3-none-any.whl" - ), - Cmd( - cmd="cd ../../../" - ) # , - # Cmd( - # cmd="rm -r Desktop/mqtt_goyon/example/" + self.experiment_name - # ) - + ) ] for i_client in range(len(ssh.clients)): print("Hostname :", ssh.clients[i_client].hostname, " User :", ssh.clients[i_client].user) @@ -76,6 +69,19 @@ def agents(request): return HttpResponseRedirect(reverse('ping:index')) +def kill(request): + ssh = get_ssh_client() + + commands = [ + Cmd( + cmd="for pid in $(ps -ef | grep 'python ' | awk '{print $2}'); do kill $pid; done", + do_print=False + )] + for i_client in range(len(ssh.clients)): + ssh.run_cmd(i_client, commands) + return HttpResponseRedirect(reverse('ping:index')) + + def index(request): template = loader.get_template('ping/index.html') diff --git a/ping/views/play.py b/ping/views/play.py new file mode 100644 index 0000000..c7e0a72 --- /dev/null +++ b/ping/views/play.py @@ -0,0 +1,149 @@ +import os +import shutil +import sys +import zipfile +from ast import literal_eval +from subprocess import Popen +from time import sleep + +from django.conf import settings +from django.http import HttpResponse, HttpResponseRedirect +from django.template import loader +from django.urls import reverse +from iotAmak.tool.ssh_client import Cmd +from paho.mqtt.client import Client as MQTTClient + +from ..models import Experiment, CurrentExperiment, Metrics + +from .network import get_ssh_client + +client = MQTTClient(client_id="django-ihm") + +def subscribe(mqttclient, topic, fun): + mqttclient.subscribe(topic) + mqttclient.message_callback_add(topic, fun) + + +def agent_log(client, userdata, message) -> None: + """ + Called when the amas receive a log from any agent, print it in stdout + """ + print("[Log] " + str(message.payload.decode("utf-8")) + " on topic " + message.topic) + + +def agent_metric(client, userdata, message) -> None: + result = literal_eval(message.payload.decode("utf-8")) + agent_id = result.get("id") + + exp = CurrentExperiment.objects.all()[0] + + metric = Metrics(experiment_name=exp.name, cycle=exp.cycle, agent_id=agent_id, metrics=result) + metric.save() + + +def update_nbr_agent(client, userdata, message) -> None: + exp = CurrentExperiment.objects.all()[0] + subscribe(client, "agent/"+str(exp.nbr_agent)+"/metric", agent_metric) + exp.nbr_agent += 1 + exp.save() + +def empty_current_experiment(): + folder = str(settings.MEDIA_ROOT) + "current_experiment" + for filename in os.listdir(folder): + file_path = os.path.join(folder, filename) + try: + if os.path.isfile(file_path) or os.path.islink(file_path): + os.unlink(file_path) + elif os.path.isdir(file_path): + shutil.rmtree(file_path) + except Exception as e: + print('Failed to delete %s. Reason: %s' % (file_path, e)) + +def experiment_load(request): + + empty_current_experiment() + + exp = Experiment.objects.get(status="Selected") + + with zipfile.ZipFile(str(settings.MEDIA_ROOT) + str(exp.media), 'r') as zip_ref: + zip_ref.extractall(str(settings.MEDIA_ROOT) + "current_experiment") + + # drop metrics table + Metrics.objects.all().delete() + + # drop current experiment table and create new instance + CurrentExperiment.objects.all().delete() + cur_exp = CurrentExperiment(name=Experiment.objects.get(status="Selected").name) + cur_exp.save() + + return HttpResponseRedirect(reverse('ping:play')) + +def experiment_start(request): + + broker_ip = "192.168.201.209" + ssh = get_ssh_client() + + experiment_path = str(settings.MEDIA_ROOT) + "current_experiment/" + Experiment.objects.get(status="Selected").name + + # Connect to the broker + client.username_pw_set(username="goyon", password="mosquitto") + client.connect(host=broker_ip) + client.loop_start() + subscribe(client, "amas/agent/new", update_nbr_agent) + + # start subprocess scheduler + p1 = Popen([sys.executable, experiment_path+'/scheduler.py', broker_ip]) + sleep(1) + # start subprocess amas + send_client = [c.to_send() for c in ssh.clients] + p2 = Popen([sys.executable, experiment_path+'/amas.py', broker_ip, str(send_client)]) + # start subprocess env + p3 = Popen([sys.executable, experiment_path+'/env.py', broker_ip]) + return HttpResponseRedirect(reverse('ping:play')) + + +def main_play(request): + template = loader.get_template('ping/play.html') + context = {} + return HttpResponse(template.render(context, request)) + + +def scheduler_step(request): + client.publish("ihm/step") + return HttpResponseRedirect(reverse('ping:play')) + + +def scheduler_stop(request): + client.publish("ihm/pause") + return HttpResponseRedirect(reverse('ping:play')) + + +def scheduler_start(request): + client.publish("ihm/unpause") + return HttpResponseRedirect(reverse('ping:play')) + +def experiment_share(request): + # get selected experiment + exp = Experiment.objects.get(status="Selected") + + # open ssh connection + ssh = get_ssh_client() + + # file transfer + commands = [ + Cmd( + cmd="rm -r Desktop/mqtt_goyon/example/" + exp.name + ) + + ] + for i_client in range(len(ssh.clients)): + ssh.run_cmd(i_client, commands) + + ssh.update(exp.name, str(settings.MEDIA_ROOT) + "current_experiment/" + exp.name) + + return HttpResponseRedirect(reverse('ping:play')) + +def experiment_stop(request): + client.publish("ihm/exit") + client.publish("ihm/step") + return HttpResponseRedirect(reverse('ping:play')) diff --git a/uploads/current_experiment/ant/__init__.py b/uploads/current_experiment/ant/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/uploads/current_experiment/ant/agent.py b/uploads/current_experiment/ant/agent.py new file mode 100644 index 0000000..5accea6 --- /dev/null +++ b/uploads/current_experiment/ant/agent.py @@ -0,0 +1,28 @@ +import random +import sys + +from iotAmak.agent import Agent + + +class Ant(Agent): + + def __init__(self, identifier: int, broker_ip: str): + self.x = 0 + self.y = 0 + super().__init__(identifier, broker_ip) + + def on_act(self) -> None: + self.x += random.randint(-5, +5) + self.y += random.randint(-5, +5) + self.log("X : "+str(self.x)+" Y : "+str(self.y)) + + def send_metric(self): + metric = super(Ant, self).send_metric() + + metric["x"] = self.x + metric["y"] = self.y + return metric + +if __name__ == '__main__': + a = Ant(int(sys.argv[1]), str(sys.argv[2])) + a.run() \ No newline at end of file diff --git a/uploads/current_experiment/ant/amas.py b/uploads/current_experiment/ant/amas.py new file mode 100644 index 0000000..99a0586 --- /dev/null +++ b/uploads/current_experiment/ant/amas.py @@ -0,0 +1,20 @@ +import sys + + +from iotAmak.amas import Amas + + +class AntAmas(Amas): + + def __init__(self, broker_ip: str, clients, nbr_agent): + self.agent_to_create = nbr_agent + super().__init__(broker_ip, clients) + + def on_initial_agents_creation(self): + for _ in range(self.agent_to_create): + self.add_agent("ant") + + +if __name__ == '__main__': + s = AntAmas(str(sys.argv[1]), sys.argv[2], 5) + s.run() diff --git a/uploads/current_experiment/ant/env.py b/uploads/current_experiment/ant/env.py new file mode 100644 index 0000000..a4f1c42 --- /dev/null +++ b/uploads/current_experiment/ant/env.py @@ -0,0 +1,15 @@ +import sys + + +from iotAmak.environment import Environment + + +class AntEnv(Environment): + + def __init__(self, broker_ip): + super().__init__(broker_ip) + + +if __name__ == '__main__': + s = AntEnv(str(sys.argv[1])) + s.run() \ No newline at end of file diff --git a/uploads/current_experiment/ant/scheduler.py b/uploads/current_experiment/ant/scheduler.py new file mode 100644 index 0000000..9aac6b6 --- /dev/null +++ b/uploads/current_experiment/ant/scheduler.py @@ -0,0 +1,7 @@ +import sys + +from iotAmak.scheduler import Scheduler + +if __name__ == '__main__': + a = Scheduler(str(sys.argv[1])) + a.run() \ No newline at end of file diff --git a/uploads/media/amas.py b/uploads/media/amas.py new file mode 100644 index 0000000..1b8e3f3 --- /dev/null +++ b/uploads/media/amas.py @@ -0,0 +1,20 @@ +import sys + + +from iotAmak.amas import Amas + + +class PhiAmas(Amas): + + def __init__(self, broker_ip: str, clients, nbr_agent): + self.agent_to_create = nbr_agent + super().__init__(broker_ip, clients) + + def on_initial_agents_creation(self): + for _ in range(self.agent_to_create): + self.add_agent("philosophers", [str(self.agent_to_create)]) + + +if __name__ == '__main__': + s = PhiAmas(str(sys.argv[1]), sys.argv[2], 5) + s.run() diff --git a/uploads/media/ant.zip b/uploads/media/ant.zip new file mode 100644 index 0000000000000000000000000000000000000000..412da9c2e93f2efd75892236c484c9a8068ba3c3 GIT binary patch literal 1335 zcmWIWW@Zs#0D(_I8$v)d4D&NEFeK)c=*P!r=4F<|$LkeT!W45bybIY75+KaH)P#|N zVFnWe0}oVjVtQ&`iC#fvZ_vf8!wMp`{7>ZdDpyVl+2$C}B>9B>+n&It9Y>~kuNK?7 z_~-A;Nv4^<jpC0KpWpetLgebr2>!4a=T?{;eEEWHx?1L?=*0}Z>!(^66;8Ny*k{FK z#h^<|Y&oAVxHhjxL06e0v2+vrxxmHG=U7y};y$2fu)#gk+u<$uk8RI1bdMKvp1ZxG zwbGSww-c*A|BVj~vF9!coywa$O>*_OlH5}ndQtXKi#F7@^Dln-`N^JH!HI?3c_+)l z9ri8uulsk}W+wAVyM-+}{L@u0%gjpu!211x!}~v0E3MZp*?z-sS$LYdg^SVCfa3w~ ze9^1(-in>H+nwfnrB`p>>cc^@(^gIWm-N-A%hzz<Mlr7<zED=_b5kA8{!II(;WYV& zd6L${aKl7?``_2w#0>6z<FCwqF=txBw?&+PSrMU|7qTH_df!UHHw+96`xzM+xM882 zn^>$@P?;NeFzc`Z&tCp-{EMdF5@3>j6LezX{lKmOVfBt<MHB8G{I{=c(o#zwHs#Lc z%b%xz3%<be(Y&s1%H`}22NYv%Y_mRzG>W_At(j1^MB<?mtFZ6RH#@&5x<9XSNO{<j zu}Jzi*E=aWzlqC@k1P@0qHOKCk!h#)r3s&n__C+Wta_Kkbz{}yCkrZ*%TGLia^*%< z^mg4_WjFS&Q81p688hS2p>vLD3#$cd0~`_<RVC;A^uH|k@7mo`?(LQnmNduyd6d*S zp}gaQNrB6kBTW@Cnn`u{=g+>WIQjn~HQBm#%V)1mSiLV#wB~l{l55Ln#Oz@}1j@9K z4Ivh*CbiCDU|{&lz`(!-4V2WpGQEOI-~NMKhYWby-Z#CUa64*3Q+Q&#Yz^1MfUT1^ zn96#Z-?+Vd)5|}_r~g0ocPjLl<d|+N=e2c`Qot$SFLSwVCaUx`8eiaw`+m*p!<)TY zCUeA(|JnI1C??_ym#%_Pu$zh0uWu~;p0NT;76xqaJg(TW@!j!vS9W!I@%@$%Sh#MX zQ_nn!jklacUcFbGbyUaRQvdzSvVGCJ1^wL2zA+<wFgs*JNHHg$U^W8-Ln{LVg8<YA z#mO0|DWy57MS2C5r_bn~(ANsoSf}&s>7%D!+NaKko;aglc*gh4HEq9h9=@7qJ#~Xl zv}ka(aW+gzTc&yB_;b}~%Z?q_zHv)y#qs0M)zY3FJ-#~nW059<<Dw>Ar)IZ8PJwW- z*Q#Pmr@KlY%gS;ReJMKiS!M<kLx49UlL!Ou%nvCD6d)94Q2^77y)XdjVq^em)`j{K zRx}{2<zT>;&=ESj86hQ5A|%-(Ys8iq5E>USK{P^=2C_bEQGn2w#0=4g93cVTtZX0^ QtPHFSYK#mFznMWi0P8LD@Bjb+ literal 0 HcmV?d00001 diff --git a/uploads/media/philosophers_7r4Esmi.zip b/uploads/media/philosophers_7r4Esmi.zip new file mode 100644 index 0000000000000000000000000000000000000000..36a06f59b5c16b862e0b44f85cc23505f35b0377 GIT binary patch literal 3181 zcmWIWW@Zs#00G_RB_SXhh9wvn7z#2nbMlMx3o=rRiuL2;GxIV_;^XxSDq*@f7#yos zhrCkVP-Vc(z~IKiz#xjQD=|GauSBn)a&MS-|7-(+eeS2~X9R_EXHD}B3SFi2bVK{P zThaX0tHY)Vvn91kq|A<8x__UUM3P+NvUb;7?DMXh8_#b~Ty7)G^(69K`o<G}4ojKB zWS99YT%dU{d{)%TB=t2%ja<(>H`Y#^S!HuE*+ckAZ@c^FB+*AcGOs_Y|J`pZHpTte z9-$fLe<v^aXg&XJu$Jl{s|}YX#{c6pb7T6|X~5<rk=`W`pCqN<;2PC@l;<d$L^$`2 z&Nm%R8)}$?I$2lvyzI$%%kd_8jk7yjbol2*;Yu9q*-9U=>YeJDF4nW`4S%T4<E2Zv zA1LdXFW~Eum-H9gaO=Rr2b~uB340lrtYQw;S{2Y7b1hJBQj+@jrneWqPuOoaW0ify zhnp$!Y`l>oI$Bpnl3jb4G(UO#=C)cVwUaN!>e`Lnj;!8%T^l@JUn$zr9?CGk%5^Ve z=G(1pQG5Fn_G(;7kQU!7G&S#@hH-427^~ma4J`My7u9{0TVW$KGhOn#&V^5{99Qah z9uecbrF433?WqeNwoK3{i7R1LpAzI=a&lp=NyvArUt!v3URs{b5OLdaUa5C`z{kJl z`UR&BCnd|Pt*BYg_l|YL-KO+O-{)Awmad$c8+tmctn}>Vm31p#2wL8pYnl+fGIRE< zv(pbeJHUNw+6=EfYzr2?+JAii44?M*7oT-z8RQl3E`NFV*6;eAJl9rl44e|)9@l+f zulJ9Ap7&g42uArWy?G~d_Pmu-XLGLJ#Ve~fP4IKlbfd}-w&eyDZg*MJXVf%TmVTG{ zy`9;6qw}eC)}IU4rA?hUi6gj5E_sVJ$6Iyp@6P-U_m+E!S#sHP=u52?Tz$HD?~mvm z@w}>aD=RBEv&r%mmff0vGW){Zrx(O_@f{QTalvP5_T&}wPfmE>7?W3c*XvYS_q(eR zt9vT;@SR@hv@G&bwY{p%?W;?yr>xGtyC(Nv*3LJ}bEeoGyuMK3Sz+RVQ+w4W@6Ag5 z6PV`{+w%B}<l<K@)>%hh2OfECc;x<9qZ{ipt3_NS-J7N^l4EN=wYIdtE;&vA*_W0U z36AoXIU0{!?nLT@tTyxB8aKIi@4xmCmG%3>_0t|3Mf=rmGE>)`tFQkxW7$HD9f?=t z5m_uYa&^cG>F?}685kIzGBPlLvMWl)Ow3Iz)+?yY4LF!}*nnp*|2O_c({Cj(Nxunt zkyyW>n)8tF92b*q%}@A#ecwD;=j=iwiPs;$+}nJ@f1>aS=X>{0y|k!WFk|1|y`k5l z8KWd5BQ(!uxIRc<z_haHW$;18@YhxjOB^@@JEg6e!~4vSdtByJ+1Qw-B0foiBi!xw z^K!}dt*3lU7tc^Kdy`XCP*+rb=J%6`msy){_n7hT?H4`lqhhV+wP{5#Pw|D?4m~4< z0ETS~%U^{qv;8}BcdmGD=?pfh#YZv=bl91v|M_~|YHQp!uhhbWRqY(ljb#M)E^VlY z=~c;pSpR(U4QH*>f8Re{e2s0}yUk`FmR_IO_1^L6Gk!!+<vFemNr^O7Z(?9zc*e-U zfKi4e=jWwmrt4)D=jW|{_B1FUz)S1Yc|YBtpbbF*Mq5lS8JldrU~GQH*l0t@CC1b0 z&r_B?n<{c#Ts*x&#I>14RAiN+NPwO4{v9g%hUTJoS)92$7!zEV9u3guGMebZE!5q8 z`g3>C0VCJWqpY4QU0tVo3H*$bP0BSgGFm=8G_CE+rjvK3IL&ql(a{grWk9$aREmmT z%3|taVqh@kU|<kNFGW-H%D`o)Z})8jfxY@~>LplGbzfP`KJ3Jqv#|Z$#xED5Ih?jV zeIpQUG-=O-Y5%@w3Dv8=JiaYtr^>A5mHBBVi|^b^2$g<)Q1;GS-de6~Er-YUAw}~w z{x)5E;g!j+`{D71t4-X=-{*eStg-)j((9#6P2I5q1u5A_*_)gqc4|3rTzS#jF-NOg zA}IUYDXuli7gmaXHJ;YeUM8sVlIO#XWVeoGVP=m!-*5kZ;`kOf`L`P0f3$3+YM<CI zUUVYn!Oa|Y=Nrr{R}z-qTbZGh`6l6&%EZ#OC31mvN>BbUoikl|T4$M7QjxgO)|3xo zbG9?e?c1=lr21i2vPri;`>)>X6{mZ{oLX;uUH94i)-09P&ojHHOqGy1cEKXG_+={3 z)FQnNJ%_h<3AwkdHC*|0p^1@y(bSnXC$efbRvbUJ(t=BLMtk#$S`)iBzP*zEF|mvK zZ%q1lHtTlxlGdZ0p9CXTa-C0`x<F};O}R>Q>{P$lR`<OtSl3wWnR)Nv%%+9+W?wsO zRv1_1x+~1M&uq(qkGWY3jyf4^z38{mbc4F2$R^Dfza##OX6b+T>i**Jru+Kk`i;Fw zA6X|Hp2NUcebK9t{qx_@hg<5_{r<k{>wTxlzqbR{$!4wRxp<cC(#o%sc6oZ2oEPN& zTxps6zVGRwGZMEt{eM+o`CfnNVg2Q`CN8_>xEGgP{@GQ3G5_{z=5IFD-#0hTm)#W9 z8S-|++;1By_~$#ld0iZ<lJ%js^GlE_#~tyeI+cfEnf<I<rynO?mk!(+d*u0fhg{8x zJ@+^`rkl3S?4NP)qn+ap|G8UtCm0$`uu8dnaMxy8<AeU^4KGEnPF>ovps+yQMKzGS z@H(6O<z2OFJkx(zPw?1Xz3|Y{4;Q#fJ9A5p)FUO{yuy_spC`!8o65kzV2!POO3N?G z29-~JXSog;2(-L!-FG-hpDXZI_JP&w1(P;UTx!^wQmyf5_iVAG$LH^ueNIiQTAti; zT7oSyyp+|GO;^KpUc|~;mvq(%j^|T24?pbHjk<F=?a)pI?>zRkEY6MTjB{J=E&LX* zIngwkE2I8XB>#)6rGC#gYP)}0@$Ta`znHYA{*0Aea&ou5!!}Pd*_0ttzanPF!J7I- z=fx3u@M7iakVj?Fdovgq7)lth<iX60T)l!y-BTO64l4*WJdFJy%O@_ZQKoN^awb?t zC~42Oa`jnz>UE#Y|M&2;ucXKM*30SvlIKHjb7m)IuUW{`F{#46MdF}xk&@#V{p^G( z3jba{IaC~cvZSRvypX?O>xJ;$*EVf`_bj@-?4-$mr11S1vNoiclTR?4fq|iwfq_91 zy>KW_&PYuu%}FiNE2unuM)!oiR-nc@oo7!UJ@wK)bw2dO8U4aDzGtp!`<?Uf)jaE| z8+4*YgR70RVM^LE%_GO3t3F$H?6~%gTUslQAAhcv_U!2K)zKe|G#MNhHR(DvyA^T@ zgp0ja6<a#pRr**~mXqj9(W%ceGng0xycwB9z_k$r1GdH^q#>yQq3|>%VWwbjOoFsC zGJs4mL-#kVX^C(M2Lras5@EzlX0$dfwCY4Q0b3n{FyRObnh8iX3bHBKN_2!NHLPf+ zK+1Py1F+>PgaMWuXa+#@7_tf25;VdD22L~+Ajuoq0Bi{lVZcmu1CWzpfHx}}NGS&c O2ZIa~1A{dehz9_Z1{22s literal 0 HcmV?d00001 -- GitLab