From c370e1bd17a0ac3ce2fedc11cb01d73b8b722f44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Schneider?= Date: Mon, 1 Sep 2014 12:17:22 +0200 Subject: [PATCH] mandaye_cud: update to the last mandaye version --- MANIFEST.in | 1 + mandaye_cud/__init__.py | 2 +- mandaye_cud/config.py | 177 +++++---- mandaye_cud/default-config.ini | 50 +++ mandaye_cud/mappers/linuxfr_example.py | 35 +- mandaye_cud/static/css/style.css | 498 ------------------------- mandaye_cud/static/images/a1.gif | Bin 1505 -> 0 bytes mandaye_cud/static/images/a10.jpg | Bin 8414 -> 0 bytes mandaye_cud/static/images/a16.gif | Bin 407 -> 0 bytes mandaye_cud/static/images/a18.gif | Bin 158 -> 0 bytes mandaye_cud/static/images/a22.gif | Bin 43 -> 0 bytes mandaye_cud/static/images/a33.gif | Bin 367 -> 0 bytes mandaye_cud/static/images/a50.gif | Bin 121 -> 0 bytes mandaye_cud/static/images/a8.gif | Bin 295 -> 0 bytes mandaye_cud/static/images/a8.png | Bin 222 -> 0 bytes mandaye_cud/static/images/eo.png | Bin 7808 -> 0 bytes mandaye_cud/static/images/ko.png | Bin 666 -> 0 bytes mandaye_cud/static/images/ok.png | Bin 781 -> 0 bytes mandaye_cud/static/js/example.js | 0 mandaye_cud/wsgi.py | 10 +- 20 files changed, 186 insertions(+), 587 deletions(-) create mode 100644 mandaye_cud/default-config.ini delete mode 100644 mandaye_cud/static/images/a1.gif delete mode 100644 mandaye_cud/static/images/a10.jpg delete mode 100644 mandaye_cud/static/images/a16.gif delete mode 100644 mandaye_cud/static/images/a18.gif delete mode 100644 mandaye_cud/static/images/a22.gif delete mode 100644 mandaye_cud/static/images/a33.gif delete mode 100644 mandaye_cud/static/images/a50.gif delete mode 100644 mandaye_cud/static/images/a8.gif delete mode 100644 mandaye_cud/static/images/a8.png delete mode 100644 mandaye_cud/static/images/eo.png delete mode 100644 mandaye_cud/static/images/ko.png delete mode 100644 mandaye_cud/static/images/ok.png create mode 100644 mandaye_cud/static/js/example.js diff --git a/MANIFEST.in b/MANIFEST.in index 768f87d..292a2f9 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,3 +1,4 @@ include COPYING MANIFEST.in VERSION +include mandaye_cud/default-config.ini recursive-include mandaye_cud/templates *.html recursive-include mandaye_cud/static * diff --git a/mandaye_cud/__init__.py b/mandaye_cud/__init__.py index 9ecee59..40692a7 100644 --- a/mandaye_cud/__init__.py +++ b/mandaye_cud/__init__.py @@ -1 +1 @@ -__version__="0.0.1" +__version__="0.1.0" diff --git a/mandaye_cud/config.py b/mandaye_cud/config.py index c7a1980..7a7f434 100644 --- a/mandaye_cud/config.py +++ b/mandaye_cud/config.py @@ -1,16 +1,36 @@ import logging import os -_PROJECT_PATH = os.path.join(os.path.dirname(__file__), '..') +from ConfigParser import SafeConfigParser +from mandaye.exceptions import ImproperlyConfigured + +# get configuration files from : +# 1. default-settings.ini from source code +# 2. os.environ.get('SETTINGS_INI') if it exists +# else /etc/mandaye-cam/config.ini +# and then /etc/mandaye-cam/local-config.ini +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +SETTINGS_INI = (os.path.join(BASE_DIR, 'default-config.ini'),) +if os.environ.get('SETTINGS_INI'): + SETTINGS_INI += (os.environ.get('SETTINGS_INI'),) +else: + ETC_DIR = os.path.join('/', 'etc', 'mandaye-cam') + SETTINGS_INI += ( + os.path.join(ETC_DIR, 'config.ini'), + os.path.join(ETC_DIR, 'local-config.ini') + ) + +config = SafeConfigParser() +config.read(SETTINGS_INI) ## SQL Backend config # Database configuration # http://docs.sqlalchemy.org/en/rel_0_7/core/engines.html # rfc 1738 https://tools.ietf.org/html/rfc1738 # dialect+driver://username:password@host:port/database -db_url = 'sqlite:///' + os.path.join(_PROJECT_PATH, 'mandaye_cud.db') +db_url = config.get('database', 'url') -debug = False +debug = config.getboolean('debug', 'debug') # Log configuration LOGGING = { @@ -22,8 +42,9 @@ LOGGING = { 'format': '%(asctime)s %(levelname)s %(message)s', 'datefmt': '%H:%M:%S', }, - 'syslog': { - 'format': '%(name)s %(levelname)s %(uuid)s %(message)s', + 'file': { + 'format': '%(asctime)s %(levelname)s %(uuid)s %(message)s', + 'datefmt': '%Y-%m-%d %H:%M:%S' } }, 'handlers': { @@ -33,67 +54,56 @@ LOGGING = { 'formatter': 'console' }, 'syslog': { - 'level': 'INFO', + 'level': 'DEBUG', 'class': 'entrouvert.logging.handlers.SysLogHandler', - 'formatter': 'syslog', + 'formatter': 'file', 'address': '/dev/log' }, }, - 'loggers': { - '': { - 'handlers': ['console'], - 'level': 'DEBUG', - 'propagate': False, - }, - 'mandaye': { - 'handlers': ['console', 'syslog'], - 'level': 'DEBUG', - 'propagate': False, - }, - 'mandaye_cud': { - 'handlers': ['console', 'syslog'], - 'level': 'DEBUG', - 'propagate': False, - }, + 'loggers': { + '': { + 'handlers': ['console'], + 'level': 'INFO', + 'propagate': False, }, - } + 'mandaye': { + 'handlers': ['console', 'syslog'], + 'level': 'INFO', + 'propagate': False, + }, + 'cam': { + 'handlers': ['console', 'syslog'], + 'level': 'INFO', + 'propagate': False, + }, + }, + } +if config.getboolean('debug', 'log_debug'): + LOGGING['loggers']['']['level'] = 'DEBUG' + LOGGING['loggers']['mandaye']['level'] = 'DEBUG' + LOGGING['loggers']['cam']['level'] = 'DEBUG' ## PATH -# Template directory -template_directory = os.path.join(_PROJECT_PATH, 'mandaye_cud/templates') # Configuration directory -config_root = os.path.join(_PROJECT_PATH, 'conf.d') +config_root = config.get('dirs', 'config_root') +# Templates directories +templates_directories = [] +if config.get('dirs', 'templates_directories'): + templates_directories = config.get('dirs', 'templates_directories').split(' ') +templates_directories.append(os.path.join(BASE_DIR, 'templates')) # Static url -static_url = '/mandaye/static' +static_url = config.get('dirs', 'static_url') # Static folder -static_root = os.path.join(_PROJECT_PATH, 'mandaye_cud/static') +static_root = config.get('dirs', 'static_root') # Data dir -data_dir = os.path.join(_PROJECT_PATH, 'data') +data_dir = config.get('dirs', 'data_dir') -# Raven Sentry configuration -raven_dsn = None - -# Email notification configuration -email_notification = False -email_prefix = '[Mandaye mandaye_cud]' -smtp_host = 'localhost' -smtp_port = 25 -email_from = 'traceback@entrouvert.com' -email_to = ['admin@localhost'] - -# Use long traceback with xtraceback -use_long_trace = True - -# Ask Mandaye to auto decompress a response message -# Decompress response only if you load a filter -auto_decompress = True - -# Encrypt service provider passwords with a secret -# You should install pycypto to use this feature -encrypt_sp_password = False -# Must be a 16, 24, or 32 bytes long -encrypt_secret = '' +# template vars +template_vars = {} +if config.has_section('template_vars'): + for option in config.options('template_vars'): + template_vars[option] = config.get('template_vars', option) # Supported authentification authentifications = { @@ -102,25 +112,62 @@ authentifications = { # sp mappers mappers = { - 'linuxfr': 'mandaye_cud.mappers.linuxfr_example' + 'linuxfr': 'mandaye_cud.mappers.linuxfr_example', } -# Beaker session configuration -session_opts = { - 'session.type': 'file', - 'session.cookie_expires': True, - 'session.timeout': 3600, - 'session.data_dir': '/var/tmp/beaker' -} +# Raven Sentry configuration +raven_dsn = config.get('debug', 'sentry_dsn') + +# Email notification configuration +email_notification = config.getboolean('email', 'notification') +email_prefix = config.get('email', 'prefix') +smtp_host = config.get('email', 'smtp_host') +smtp_port = config.getint('email', 'smtp_port') +email_from = config.get('email', 'from') +email_to = config.get('email', 'to').split() + +# Use long traceback with xtraceback +use_long_trace = config.getboolean('debug', 'use_long_trace') +# Ask Mandaye to auto decompress a response message +# Decompress response only if you load a filter +auto_decompress = config.getboolean('mandaye', 'auto_decompress') +# Ask mandaye to add a toolbar with Mandaye's links +mandaye_toolbar = config.getboolean('mandaye', 'toolbar') +# Authentic 2 auto connection +a2_auto_connection = config.getboolean('mandaye', 'a2_auto_connection') # Choose storage # Only mandaye.backends.sql at the moment -storage_backend = "mandaye.backends.sql" +if config.get('mandaye', 'storage_backend') == 'sql': + storage_backend = "mandaye.backends.sql" +else: + ImproperlyConfigured('Storage backend must be sql') + +# Encrypt service provider passwords with a secret +# You should install pycypto to use this feature +encrypt_sp_password = config.getboolean('mandaye', 'encrypt_sp_password') +# Must be a 15, 24, or 32 bytes long +encrypt_secret = config.get('mandaye', 'encrypt_secret') + +session_type = config.get('session', 'type') +if session_type not in ('file', 'dbm', 'memory', 'memcached'): + raise ImproperlyConfigured('Sesssion type %r not supported' % session_type) +if session_type == 'memcached': + session_type = 'ext:memcached' + +# Beaker session configuration +session_opts = { + 'session.type': session_type, + 'session.url': config.get('session', 'url'), + 'session.cookie_expires': config.getboolean('session', 'cookie_expires'), + 'session.timeout': config.getint('session', 'timeout'), + 'session.data_dir': config.get('session', 'data_dir') +} # Import local config try: - from local_config import * + from cam.local_config import * except ImportError, e: - if 'local_config' in e.args[0]: - pass + if not 'local_config' in e.args[0]: + raise ImproperlyConfigured('Error while importing "local_config.py"') diff --git a/mandaye_cud/default-config.ini b/mandaye_cud/default-config.ini new file mode 100644 index 0000000..9122bf3 --- /dev/null +++ b/mandaye_cud/default-config.ini @@ -0,0 +1,50 @@ +[DEFAULT] +base_dir: . + +[database] +; http://docs.sqlalchemy.org/en/rel_0_8/core/engines.html +url: sqlite:///%(base_dir)s/mandaye_cud.db + +[dirs] +config_root: %(base_dir)s/conf.d +data_dir: %(base_dir)s/data +static_root: %(base_dir)s/mandaye_cud/static +static_url: /mandaye/static +templates_directories: + +[debug] +debug: false +use_long_trace: true +log_debug: false +; you need to install python-raven for this feature +sentry_dsn: + +[mandaye] +toolbar: true +a2_auto_connection: false +; only sql at the moment +storage_backend: sql +auto_decompress: true +; if you want to encypt password set to true +; you need to install pycrypto for this feature +encrypt_sp_password: false +; if encrypt_sp_password then you need to choose a secret +; must be a 16, 24, or 32 bytes long +encrypt_secret: + +[session] +; file, dbm, memory or memcached +; if memcached you need to install python-memcached and memcached +type: memcached +url: 127.0.0.1:11211 +cookie_expires: true +timeout: 3600 +data_dir: %(base_dir)s/data + +[email] +notification: false +prefix: [Mandaye CAM] +smtp_host: localhost +smtp_port: 25 +from: traceback@entrouvert.com +to: admin+mandaye-mandaye_cud@entrouvert.com diff --git a/mandaye_cud/mappers/linuxfr_example.py b/mandaye_cud/mappers/linuxfr_example.py index 42c4f65..46990b8 100644 --- a/mandaye_cud/mappers/linuxfr_example.py +++ b/mandaye_cud/mappers/linuxfr_example.py @@ -35,6 +35,7 @@ form_values = { urls = { 'associate_url': '/mandaye/associate', 'connection_url': '/mandaye/sso', + 'disassociate_url': '/mandaye/disassociate', 'login_url': '/mandaye/login' } @@ -42,24 +43,20 @@ mapping = [ { 'path': r'/mandaye/login$', 'method': 'GET', - 'response': [{ + 'response': { 'auth': 'login', - 'condition': 'response.code==302', - },] + 'values': {'condition': 'response.code==302'}, + }, }, { 'path': r'/mandaye/sso$', 'method': 'GET', - 'response': [{ - 'auth': 'sso', - }] + 'response': {'auth': 'sso',} }, { 'path': r'/mandaye/slo$', 'method': 'GET', - 'response': [{ - 'auth': 'slo', - }] + 'response': {'auth': 'slo',} }, { 'path': r'/mandaye/associate$', @@ -78,31 +75,25 @@ mapping = [ { 'path': r'/mandaye/associate$', 'method': 'POST', - 'response': [ - { - 'auth': 'associate_submit', - 'condition': "response.code==302" - }, - ] + 'response': { + 'auth': 'associate_submit', + 'values': {'condition': "response.code==302"} + }, }, { 'path': r'%s$' % END_POINTS_PATH['single_sign_on_post'], 'method': 'POST', - 'response': [{'auth': 'single_sign_on_post'}] + 'response': {'auth': 'single_sign_on_post'} }, { 'path': r'%s$' % END_POINTS_PATH['single_logout'], 'method': 'GET', - 'response': [{ - 'auth': 'single_logout', - }] + 'response': {'auth': 'single_logout',} }, { 'path': r'%s$' % END_POINTS_PATH['single_logout_return'], 'method': 'GET', - 'response': [{ - 'auth': 'single_logout_return', - }] + 'response': {'auth': 'single_logout_return',} }, ] diff --git a/mandaye_cud/static/css/style.css b/mandaye_cud/static/css/style.css index 8dd6da2..e69de29 100644 --- a/mandaye_cud/static/css/style.css +++ b/mandaye_cud/static/css/style.css @@ -1,498 +0,0 @@ -/* theme derived and inspired by TerraFirma - * - */ - -html, body { - margin: 0; - font-family: sans-serif; - font-size: 12px; -} - -body#iframe { - background: white; -} - -html { - background: #F9F9F7 url(../images/a1.gif) repeat-x; - color: #44b2cb; -} - -a -{ - color: #44b2cb; - text-decoration: underline; -} - -a:hover -{ - text-decoration: none; -} - - -div#wrap { - background: white; - width: 640px; - margin: 5em auto; - padding: 15px; - -moz-border-radius: 6px; - -webkit-border-radius:6px; - -moz-box-shadow: 0 0 4px rgba(0,0,0,0.75); - -webkit-box-shadow: 0 0 4px rgba(0,0,0,0.75); - position: relative; -} - -#header -{ - position: absolute; - background: url(../images/a8.png) repeat-x; - -moz-border-radius: 6px 0 0 6px; - -webkit-border-radius: 6px 0 0 6px; - width: 450px; - height: 92px; - color: #fff; - padding-left: 20px; -} - -#header h1 -{ - font-size: 23px; - letter-spacing: -1px; - padding-top: 30px; - margin: 0; -} - -#header span -{ - margin: 0; - font-size: 13px; - font-weight: normal; - color: #FCE2CA; -} - -#splash -{ - position: absolute; - right: 20px; - background: url(../images/eo.png) no-repeat; - width: 153px; - height: 92px; - -moz-border-radius: 0 6px 6px 0; - -webkit-border-radius: 0 6px 6px 0; -} - -div#content { - margin: 1em 1ex; - margin-top: 130px; - padding: 1ex; -} - -div#content h2 { - margin-top: 0; - font-weight: normal; - color: #656551; - font-size: 18px; - letter-spacing: -1px; - line-height: 25px; - margin-bottom: 20px; - padding: 0 0 10px 15px; - position: relative; - top: 4px; - background: url(../images/a22.gif) bottom repeat-x; -} - -#footer -{ - font-size: 70%; - position: relative; - clear: both; - height: 66px; - text-align: center; - line-height: 66px; - background-image: url(../images/a8.png); - color: #fff; -} - -#footer a -{ - color: #8C8C73; -} - - -form#login-form p { - float: left; - width: 40%; -} - -form#login-form input.submit { - float: right; - width: 18%; - margin-top: 30px; -} - -div.login-actions { - clear: both; - padding-top: 1em; -} - -div.login-actions p { - margin: 0; -} - -form p { - margin: 0 0 1em 0; -} - -form p label { - display: block; -} - -form p input, -form p textarea { - margin-left: 10px; -} - -ul.messages { - margin: 0; - padding: 0; - list-style: none; -} - -ul.messages li.error { - color: #e80404; -} - -ul.errorlist { - margin: 0; - padding: 0; - color: #e80404; - list-style: none; -} - -input, textarea { - padding: 5px; - border: 1px solid #cccccc; - color:#666666; - background: white; - color: black; -} - -textarea:focus, input[type="text"]:focus, input[type="password"]:focus { - border: 1px solid #4690d6; - color:#333333; -} - -input[type=submit] { - color: #ffffff; - background:#4690d6; - border: 1px solid #2a567f; - font-weight: bold; - padding: 2px 8px 2px 8px; - margin: 0; - cursor: pointer; -} - - -input[type=submit]:hover { - border-color: #0e1d2b; -} - -form#login-form ul.errorlist { - margin-bottom: 1em; - width: 80%; - font-weight: normal; -} - -/* OpenID Stuff */ - -#openid_btns, #openid_btns br { - clear: both; -} - -#openid_highlight a { - border: 1px solid #888; -} - -#openid_input_area input[type=submit] { - padding-top: 0; - margin-top: 0; - margin-left: 1em; -} - -.openid_large_btn { - width: 100px; - height: 60px; - border: 1px solid #DDD; - margin: 3px; - float: left; -} -.openid_small_btn { - width: 24px; - height: 24px; - border: 1px solid #DDD; - margin: 3px; - float: left; -} - -a.openid_large_btn:focus { - outline: none; -} -a.openid_large_btn:focus { - -moz-outline-style: none; -} -.openid_selected { - border: 4px solid #DDD; -} - -#openid_input_area { - clear: both; - padding-top: 2.5em; -} - -li.indented { - margin-left: 50px; -} - -ul.NoBullet { - list-style-type: none; -} - -div#content h4 { - margin-bottom: 5px; - margin-top: 30px; -} - -div#content p { - margin-top: 0; -} - -div.errors { - margin: 0; - padding: 0; - color: #e80404; - list-style: none; -} - -div#breadcrumb { - font-size: 80%; - margin-bottom: 1em; -} - -div#user { - position: absolute; - top: 115px; - right: 12px; -} - -a#logout { - font-size: 100%; -} - - -.ui-tabs .ui-tabs-hide { - display: none; -} - -h4 { - padding-left: 0.5em; -} - -h4 + div, div#profile { - padding-left: 1em; -} - - -div#menu { -position: relative; -background: #46461F url(../images/a17.gif) repeat-x; -height: 67px; -padding: 0px 20px 0px 5px; -margin: 136px 0px 0px 0px; -} - -#menu ul -{ - padding: 0; - margin: 0; -} - -#menu ul li -{ -display: inline; -line-height: 52px; -padding-left: 3px; -} - -#menu ul li.first -{ -border-left: 0px; -} - -#menu ul li a -{ -background-color: transparent; -background-repeat: repeat-x; -padding: 8px 12px 8px 12px; -font-size: 12px; -color: #fff; -font-weight: bold; -} -#menu ul li a:hover -{ -background: #fff url(../images/a18.gif) repeat-x top; -color: #4A4A24; -text-decoration: none; -} - -#eo -{ -position: absolute; -top: 0px; -line-height: 52px; -color: #BDBDA2; -right: 30px; -font-weight: bold; -font-size: 12px; -letter-spacing: -1px; -} - -#eo a { - color: inherit; - text-decoration: none; -} - -ul#tab-nav { - list-style: none; - padding: 0; - width: 160px; - float: left; -} - -ul#tab-nav li { - line-height: 300%; - position: relative; - right: -1px; - border: 1px solid transparent; -} - -ul#tab-nav li.ui-tabs-selected { - border: 1px solid #ccc; - border-right: 1px solid white; -} - -ul#tab-nav a { - display: block; - padding-left: 1ex; - outline: none; - -moz-user-focus:ignore; -} - -ul#tab-nav a:hover { -} - -ul#tab-nav a:active { -} - -/* XXX: add a class to divs, so it works in IE */ -div#tabs > div { - border: 1px solid #ccc; - float: left; - width: 420px; - padding: 10px; - min-height: 26em; -} - -a.bigbutton { - display: block; - -moz-border-radius: 6px; - -webkit-border-radius:6px; - border: 1px solid black; - margin: 2em 0; - line-height: 300%; - text-align: center; - text-decoration: none; - font-weight: bold; - -webkit-box-shadow: 0 0 4px rgba(0,0,0,0.75); - -moz-box-shadow: 0 0 4px rgba(0,0,0,0.75); -} - -a.bigbutton:hover { - background: #eee; -} - -div#providers { - display: none; -} - -#modalOverlay { - height:100%; - width:100%; - position:fixed; - left:0; - top:0; - z-index:3000; - background-color: rgba(0, 0, 0, 0.8); - cursor:wait; -} - -div#popup { - display: none; - position:fixed; - width:500px; - left:50%; - margin-left:-250px; - z-index:3100; - top: 10%; -} - -div#popup div { - position: relative; - margin: 0; - background: white; - border: 1px solid black; - border-color: #333 black black #333; -} - -div#popup h2 { - text-align: center; -} - -div#popup ul { - max-height: 70px; - overflow: auto; - margin: 0 1em 1em 1em; - padding: 0 1em 1em 1em; -} - -div#popup h3 { - margin-bottom: 4px; - padding-left: 10px; -} - -div#popup p { - margin: 5px; -} - -div#popup a#close { - float: right; - padding: 1ex; -} - -a.roleid_button { - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - border-radius: 5px; - background: #5C5C5C; - color: #44b2cb; - font-weight: bold; - padding-top: 5px; - padding-bottom: 5px; - padding-right: 10px; - padding-left: 10px; - margin: 0; - cursor: pointer; - text-decoration: none; -} - -a.roleid_button:hover { - background: black; -} diff --git a/mandaye_cud/static/images/a1.gif b/mandaye_cud/static/images/a1.gif deleted file mode 100644 index ad8322c7863b400c390a0a0e0059063e0e6c01b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1505 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 HJuLknnPF}y diff --git a/mandaye_cud/static/images/a16.gif b/mandaye_cud/static/images/a16.gif deleted file mode 100644 index c49f5f7d7b66bf1110190c175467a86474101614..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 407 zcmZ?wbhEHbWMOb-xXQrb<|gm!tK#9I6d!Mwkl^tD|NqcXBX@U&FJC@{hZ_Y1XoZIA z#>QGlMVZCL*&I5wEih2`&!1mONkGLm$;l4U(I$R=nt_2@adFmueyYL2+5rLTMn)_F z0opM!=HcO{-rnjlF;=OmPLYuo(b1OS;l^HGD&M|+_VQ9qOLGYh)(;6W@bOXq`SbhV zzkh%I`uXF>_g}w${QLLs>(@^|etdcP^3m(pkKep``u+RYPoLiX{rl(LyBF`@zhQs@ z#h)x-rVfY%`N@H8i$mW8W(_7EkIP9r4J>$C0llQv19J&_z-}LkZ^&A~P0`26|vGRHpWpoa`Tf_g@2_7!`tjq-*RLNweR}!n)0^+#KY#!J>D#xDZ{I$7 z^XAFdukU~U{Py9)(+?kB{QC9d?c1ks-aPvB>D7xD_da}h{_WeRmoM-A`0XvZTq!P=vS_2q XlY=vk81rxh)x6xgu4#b+6N5DX4LCxD diff --git a/mandaye_cud/static/images/a8.gif b/mandaye_cud/static/images/a8.gif deleted file mode 100644 index 1d12ac540b9ea03468e09deec170dde26011a5fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 295 zcmbV{J4-?V07g%EiCQA)F?*W|La3n>3GS^_jJVi?=tZQxZfQ?@t1>HC)8)~ER@AxLOHx~bcnxzH$i=l(kLHLNuXUC%V-nNrm;dfiqce*XoJeHU6iL3 z#*0y#=4%9H_y=ay_^Sq+Za!J9la}*f51FBB)+3*;aT|Lo8oBQK+4o>yPpa!VFdXcE ke7T!4iv_0;H}cO>_%)r1c48n{Iv*t(u1=&kHeO=k_F!6D#GjXrX;|B`GdAc};NL)VJ zcaZmh0uS?fzQ-lL&+_CQ1p^gZZheNZ{Z~k8T)a3jPoz;IFN;_^Hcz>QbfrYteahHJ+&?W{? LS3j3^P6~uf`Ap!_Y?sU1k0{2`&<_6%9B;s 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 A&j0`b diff --git a/mandaye_cud/static/images/ok.png b/mandaye_cud/static/images/ok.png deleted file mode 100644 index 89c8129a490b329f3165f32fa0781701aab417ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 781 zcmV+o1M>WdP)4-QibtN)VXQDpczE`xXAkUjh%RI>;okxb7K@0kpyQ1k_Y(|Oe7$m(^ zNYX>mI||sUbmn+c3<&FnE=4u#()KBS^SH8e)Qs5i!#lY=$-1gbH6VluzU=m=EP78&5vQ z-?+fFP-G2l&l_QzYealK$;1Rl?FkzXR&Jv@fBPNjCr#AYRyJ7UJQ0v#?)7Ott=>3`#-pV!7>9}>Q1jL)H6h&gkP@3nI=+F3nA~M>u#(n* z8T!#8oEw&-mED4!h4s!N@Jo3S7N&Q6%6l3}nlcd~X@>;uelvPsSkXIgg~e+^T1zSf z3SNj(5%jK~i8@b;C