diff --git a/.Trash-1000/files/beta-0.1.19.zip b/.Trash-1000/files/beta-0.1.19.zip new file mode 100644 index 0000000..02ab9c6 Binary files /dev/null and b/.Trash-1000/files/beta-0.1.19.zip differ diff --git a/.Trash-1000/info/beta-0.1.19.zip.trashinfo b/.Trash-1000/info/beta-0.1.19.zip.trashinfo new file mode 100644 index 0000000..dd00edb --- /dev/null +++ b/.Trash-1000/info/beta-0.1.19.zip.trashinfo @@ -0,0 +1,3 @@ +[Trash Info] +Path=beta-0.1.19.zip +DeletionDate=2025-07-09T23:36:34 diff --git a/Dockerfile b/Dockerfile index d3bbe74..3d26048 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,31 +2,35 @@ FROM python:3.11-slim ENV PYTHONUNBUFFERED=1 -# Install build deps and netcat for the DB-wait -RUN apt-get update && apt-get install -y \ - gcc \ - default-libmysqlclient-dev \ - pkg-config \ - netcat-openbsd \ - curl \ - && rm -rf /var/lib/apt/lists/* +# 1) Install build deps, netcat, curlβ€”and gosu for privilege dropping +RUN apt-get update \ + && apt-get install -y \ + gcc \ + default-libmysqlclient-dev \ + pkg-config \ + netcat-openbsd \ + curl \ + gosu \ + && rm -rf /var/lib/apt/lists/* WORKDIR /app + +# 2) Copy & install Python requirements COPY requirements.txt . RUN pip install --upgrade pip \ && pip install -r requirements.txt +# 3) Copy the rest of the app COPY . . -# Create a non-root user and give it ownership of /app -RUN useradd -ms /bin/bash appuser \ - && chown -R appuser:appuser /app +# 4) Create the non-root user and make sure the upload dir exists and is chown’d +RUN groupadd -g 1000 appuser \ + && useradd -u 1000 -ms /bin/bash -g appuser appuser \ + && mkdir -p /app/data/uploads \ + && chown -R appuser:appuser /app/data/uploads -# Switch to appuser for everything below -USER appuser - -# Prepare entrypoint -COPY --chown=appuser:appuser entrypoint.sh /entrypoint.sh +# 5) Install the entrypoint (keep this as root so it can chown the volume at runtime) +COPY entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"] diff --git a/Makefile b/Makefile index 247fa04..604c7d4 100644 --- a/Makefile +++ b/Makefile @@ -5,20 +5,23 @@ DOCKER_COMPOSE=docker compose PROJECT_NAME=plant_price_tracker # Commands -.PHONY: help up down rebuild logs status seed shell dbshell reset test +.PHONY: help up down rebuild logs logs-web logs-worker logs-flower logs-all status seed shell dbshell reset test help: @echo "Available targets:" - @echo " up - Build and start the app (bootstraps .env if needed)" - @echo " down - Stop and remove containers" - @echo " rebuild - Rebuild containers from scratch" - @echo " logs - Show logs for all services" - @echo " status - Show container health status" - @echo " seed - Manually seed the database" - @echo " shell - Open a bash shell in the web container" - @echo " dbshell - Open a MySQL shell" - @echo " reset - Nuke everything and restart clean" - @echo " test - Run test suite (TBD)" + @echo " up - Build and start the app (bootstraps .env if needed)" + @echo " down - Stop and remove containers" + @echo " rebuild - Rebuild containers from scratch" + @echo " logs-web - Show recent logs for the web service" + @echo " logs-worker - Show recent logs for the Celery worker" + @echo " logs-flower - Show recent logs for the Flower UI" + @echo " logs-all - Show recent logs for all services" + @echo " status - Show container health status" + @echo " seed - Manually seed the database" + @echo " shell - Open a bash shell in the web container" + @echo " dbshell - Open a MySQL shell" + @echo " reset - Nuke everything and restart clean" + @echo " test - Run test suite (TBD)" up: @if [ ! -f $(ENV_FILE) ]; then \ @@ -51,8 +54,24 @@ rebuild: preload: @docker exec -it $$(docker ps -qf "name=$(PROJECT_NAME)-web") flask preload-data -logs: - $(DOCKER_COMPOSE) logs -f +logs-web: + @echo "[πŸ“œ] Tailing last 200 lines of web service logs…" + $(DOCKER_COMPOSE) logs --tail=200 -f web + +logs-worker: + @echo "[πŸ“œ] Tailing last 200 lines of worker service logs…" + $(DOCKER_COMPOSE) logs --tail=200 -f worker + +logs-flower: + @echo "[πŸ“œ] Tailing last 200 lines of flower service logs…" + $(DOCKER_COMPOSE) logs --tail=200 -f flower + +logs-all: + @echo "[πŸ“œ] Tailing last 200 lines of ALL services logs…" + $(DOCKER_COMPOSE) logs --tail=200 -f + +# alias old 'logs' to unified +logs: logs-all status: @echo "[πŸ“Š] Health status of containers:" @@ -100,4 +119,3 @@ migrate: upgrade: flask db upgrade - diff --git a/app/__init__.py b/app/__init__.py index d70e83c..7f7f143 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -1,260 +1,52 @@ # File: app/__init__.py import os -import json -import importlib -import time import logging from datetime import datetime from dotenv import load_dotenv, find_dotenv from flask import Flask, request -from flask_sqlalchemy import SQLAlchemy -from flask_migrate import Migrate, upgrade, migrate as _migrate, stamp as _stamp -from flask_login import LoginManager -from flask_wtf.csrf import CSRFProtect - -# ─── Core extensions ─────────────────────────────────────────────────────────── -db = SQLAlchemy() -migrate = Migrate() -login_manager = LoginManager() -csrf = CSRFProtect() +from .config import Config +from .extensions import db, migrate, login_manager, csrf +from .plugin_loader import register_plugins def create_app(): - # ─── Load .env ─────────────────────────────────────────────────────────────── - dotenv_path = find_dotenv() - if dotenv_path: - load_dotenv(dotenv_path, override=True) + # 1) load .env + if p := find_dotenv(): + load_dotenv(p, override=True) - # ─── Flask setup ───────────────────────────────────────────────────────────── - project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) - migrations_dir = os.path.join(project_root, 'migrations') + # 2) create Flask + app = Flask(__name__, static_folder=os.path.join(os.path.dirname(__file__), '..', 'static')) + app.config.from_object(Config) - app = Flask( - __name__, - static_folder=os.path.join(project_root, 'static'), - static_url_path='/static' - ) - - # install INFO‐level logging handler + # 3) logging handler = logging.StreamHandler() handler.setLevel(logging.INFO) app.logger.setLevel(logging.INFO) app.logger.addHandler(handler) - app.logger.info("πŸš€ Starting create_app()") + app.logger.info("πŸš€ Starting Flask app") - # main config - app.config.from_object('app.config.Config') - app.logger.info(f"πŸ”§ Loaded config from {app.config.__class__.__name__}") - - # ─── Init extensions ───────────────────────────────────────────────────────── + # 4) init extensions csrf.init_app(app) db.init_app(app) - migrate.init_app(app, db, directory=migrations_dir) + migrate.init_app(app, db) login_manager.init_app(app) login_manager.login_view = 'auth.login' - app.logger.info("πŸ”— Initialized extensions (CSRF, SQLAlchemy, Migrate, LoginManager)") + app.logger.info("πŸ”— Extensions initialized") - # ─── AUTOMATIC MIGRATIONS ──────────────────────────────────────────────────── - with app.app_context(): - app.logger.info("πŸ› οΈ Checking for schema changes…") - try: - upgrade() - app.logger.info("πŸ› οΈ Alembic reports DB is at head") - except Exception: - _stamp(revision='head') - upgrade() - app.logger.info("πŸ› οΈ Stamped and upgraded to head") - try: - _migrate(message="autogen", autogenerate=True) - app.logger.info("πŸ› οΈ Autogenerated migration revision created") - except Exception: - app.logger.debug("πŸ› οΈ No new migrations detected") - upgrade() - app.logger.info("πŸ› οΈ Database fully migrated") - - # ─── Core routes & error‐handlers ───────────────────────────────────────────── + # 5) register core routes, errors, etc. from .errors import bp as errors_bp # noqa: E402 app.register_blueprint(errors_bp) from .routes import init_app as register_core_routes # noqa: E402 register_core_routes(app) - # ─── JSON‐driven plugin loader with unbuffered prints ───────────────────────── - print("πŸ”Œ Discovering plugins…", flush=True) - plugins_dir = os.path.join(project_root, 'plugins') - loaded_plugins = [] - - for name in sorted(os.listdir(plugins_dir)): - manifest = os.path.join(plugins_dir, name, 'plugin.json') - if not os.path.isfile(manifest): - continue - - plugin_info = { - 'name': name, - 'models': [], - 'routes': None, - 'cli': [], - 'template_globals': [], - 'tasks': [], - 'tasks_init': [], - 'subplugins': [] - } - errors = [] - - try: - meta = json.load(open(manifest)) - except Exception as e: - print(f" βœ– manifest load error for '{name}': {e}", flush=True) - continue - - # 1) models - for model_path in meta.get('models', []): - try: - importlib.import_module(model_path) - plugin_info['models'].append(model_path) - except Exception as e: - errors.append(f"model '{model_path}': {e}") - - # 2) user_loader - ul = meta.get('user_loader') - if ul: - try: - m = importlib.import_module(ul['module']) - fn = getattr(m, ul['callable']) - fn(login_manager) - except Exception as e: - errors.append(f"user_loader '{ul}': {e}") - - # 3) routes - rt = meta.get('routes') - if rt: - try: - m = importlib.import_module(rt['module']) - bp_obj = getattr(m, rt['blueprint']) - prefix = rt.get('url_prefix') - app.register_blueprint(bp_obj, url_prefix=prefix, strict_slashes=False) - plugin_info['routes'] = f"{rt['module']}::{rt['blueprint']}" - except Exception as e: - errors.append(f"routes '{rt}': {e}") - - # 4) CLI - cli = meta.get('cli') - if cli: - try: - m = importlib.import_module(cli['module']) - fn = getattr(m, cli['callable']) - app.cli.add_command(fn) - plugin_info['cli'].append(f"{cli['module']}::{cli['callable']}") - except Exception as e: - errors.append(f"cli '{cli}': {e}") - - # 5) template_globals - for tg in meta.get('template_globals', []): - try: - mod_name, fn_name = tg['callable'].rsplit('.', 1) - m = importlib.import_module(mod_name) - fn = getattr(m, fn_name) - app.jinja_env.globals[tg['name']] = fn - plugin_info['template_globals'].append(tg['name']) - except Exception as e: - errors.append(f"template_global '{tg}': {e}") - - # 6) subplugins - for sp in meta.get('subplugins', []): - sub_info = {'name': sp['name'], 'models': [], 'routes': None} - for mp in sp.get('models', []): - try: - importlib.import_module(mp) - sub_info['models'].append(mp) - except Exception as e: - errors.append(f"subplugin model '{mp}': {e}") - srt = sp.get('routes') - if srt: - try: - m = importlib.import_module(srt['module']) - bp_obj = getattr(m, srt['blueprint']) - app.register_blueprint(bp_obj, url_prefix=srt.get('url_prefix'), strict_slashes=False) - sub_info['routes'] = f"{srt['module']}::{srt['blueprint']}" - except Exception as e: - errors.append(f"subplugin routes '{srt}': {e}") - plugin_info['subplugins'].append(sub_info) - - # 7) tasks - for task_mod in meta.get('tasks', []): - try: - importlib.import_module(task_mod) - plugin_info['tasks'].append(task_mod) - except Exception as e: - errors.append(f"task '{task_mod}': {e}") - - # 8) tasks_init - for hook in meta.get('tasks_init', []): - try: - m = importlib.import_module(hook['module']) - fn = getattr(m, hook['callable']) - fn(app) - plugin_info['tasks_init'].append(f"{hook['module']}::{hook['callable']}") - except Exception as e: - errors.append(f"tasks_init '{hook}': {e}") - - if errors: - print(f" βœ– Plugin '{name}' errors: " + "; ".join(errors), flush=True) - else: - print(f" βœ” Plugin '{name}' loaded", flush=True) - loaded_plugins.append(plugin_info) - - # summary - print("🌟 Loaded plugins summary:", flush=True) - for info in loaded_plugins: - print( - f" β€’ {info['name']}: " - f"models={info['models']}, " - f"routes={info['routes']}, " - f"cli={info['cli']}, " - f"template_globals={info['template_globals']}, " - f"tasks={info['tasks']}, " - f"tasks_init={info['tasks_init']}, " - f"subplugins={[s['name'] for s in info['subplugins']]}", - flush=True - ) - - # ─── Context processors, before/after request, teardown ───────────────────── - @app.context_processor - def inject_current_year(): - return {'current_year': datetime.now().year} + # 6) register all plugins + register_plugins(app) + # 8) any context-processors, before/after teardown… @app.context_processor def inject_now(): return {'utcnow': datetime.utcnow()} - @app.before_request - def start_timer(): - request._start_time = time.time() - - @app.after_request - def log_analytics(response): - from plugins.admin.models import AnalyticsEvent # noqa: E402 - try: - duration = time.time() - getattr(request, '_start_time', time.time()) - ev = AnalyticsEvent( - method = request.method, - path = request.path, - status_code = response.status_code, - response_time = duration, - user_agent = request.headers.get('User-Agent'), - referer = request.headers.get('Referer'), - accept_language = request.headers.get('Accept-Language'), - ) - db.session.add(ev) - db.session.commit() - except Exception: - db.session.rollback() - return response - - @app.teardown_appcontext - def shutdown_session(exception=None): - db.session.remove() - - print("βœ… create_app() complete; ready to serve", flush=True) return app diff --git a/app/celery_app.py b/app/celery_app.py index 9bd0816..fa04606 100644 --- a/app/celery_app.py +++ b/app/celery_app.py @@ -1,12 +1,8 @@ -# File: app/celery_app.py - import os import json import importlib -from celery import Celery -# 1) Create the Celery object (broker/backend will be set from our Flask config) -celery = Celery('natureinpots') +from app.celery_instance import celery def init_celery(app): @@ -20,15 +16,18 @@ def init_celery(app): # 2. Make all tasks run inside the Flask application context TaskBase = celery.Task + class ContextTask(TaskBase): def __call__(self, *args, **kwargs): with app.app_context(): return TaskBase.__call__(self, *args, **kwargs) + celery.Task = ContextTask # 3. Discover all plugins by looking for plugin.json in plugins/ plugins_dir = os.path.join(app.root_path, '..', 'plugins') task_modules = [] + for plugin_name in sorted(os.listdir(plugins_dir)): manifest = os.path.join(plugins_dir, plugin_name, 'plugin.json') if not os.path.isfile(manifest): @@ -76,9 +75,7 @@ def init_celery(app): return celery -# 5) Immediately bootstrap Celery with our Flask app so that -# any `celery -A app.celery_app:celery worker --beat` invocation -# will pick up your plugins’ tasks and schedules. +# Immediately bootstrap Celery whenever this module is imported from app import create_app _flask_app = create_app() init_celery(_flask_app) diff --git a/app/celery_instance.py b/app/celery_instance.py new file mode 100644 index 0000000..b1677de --- /dev/null +++ b/app/celery_instance.py @@ -0,0 +1,4 @@ +from celery import Celery + +# Simple, standalone Celery instance +celery = Celery('natureinpots') diff --git a/app/extensions.py b/app/extensions.py new file mode 100644 index 0000000..40ce529 --- /dev/null +++ b/app/extensions.py @@ -0,0 +1,11 @@ +# File: app/extensions.py + +from flask_sqlalchemy import SQLAlchemy +from flask_migrate import Migrate +from flask_login import LoginManager +from flask_wtf.csrf import CSRFProtect + +db = SQLAlchemy() +migrate = Migrate() +login_manager = LoginManager() +csrf = CSRFProtect() diff --git a/app/plugin_loader.py b/app/plugin_loader.py new file mode 100644 index 0000000..d7618bf --- /dev/null +++ b/app/plugin_loader.py @@ -0,0 +1,118 @@ +import os +import json +import importlib +from flask import current_app +from datetime import datetime + +def register_plugins(app): + project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) + plugins_dir = os.path.join(project_root, 'plugins') + loaded = [] + + app.logger.info("πŸ”Œ Discovering plugins…") + for name in sorted(os.listdir(plugins_dir)): + manifest = os.path.join(plugins_dir, name, 'plugin.json') + if not os.path.isfile(manifest): + continue + + errors = [] + try: + meta = json.load(open(manifest)) + except Exception as e: + app.logger.error(f" βœ– manifest load error for '{name}': {e}") + continue + + info = {'name': name, 'models': [], 'routes': None, 'cli': [], + 'template_globals': [], 'subplugins': []} + + # 1) models + for model_path in meta.get('models', []): + try: + importlib.import_module(model_path) + info['models'].append(model_path) + except Exception as e: + errors.append(f"model '{model_path}': {e}") + + # 2) user_loader + ul = meta.get('user_loader') + if ul: + try: + m = importlib.import_module(ul['module']) + fn = getattr(m, ul['callable']) + fn(app.login_manager) + except Exception as e: + errors.append(f"user_loader '{ul}': {e}") + + # 3) routes + rt = meta.get('routes') + if rt: + try: + m = importlib.import_module(rt['module']) + bp_obj = getattr(m, rt['blueprint']) + app.register_blueprint(bp_obj, url_prefix=rt.get('url_prefix'), strict_slashes=False) + info['routes'] = f"{rt['module']}::{rt['blueprint']}" + except Exception as e: + errors.append(f"routes '{rt}': {e}") + + # 4) CLI + raw_cli = meta.get('cli') + if raw_cli: + # wrap a single dict into a list so we can iterate uniformly + cli_entries = raw_cli if isinstance(raw_cli, list) else [raw_cli] + for cli_entry in cli_entries: + try: + module_path = cli_entry.get('module') + callable_name = cli_entry.get('callable') + m = importlib.import_module(module_path) + fn = getattr(m, callable_name) + app.cli.add_command(fn) + info['cli'].append(f"{module_path}::{callable_name}") + except Exception as e: + errors.append(f"cli '{cli_entry}': {e}") + + # 5) template_globals + for tg in meta.get('template_globals', []): + try: + mod_name, fn_name = tg['callable'].rsplit('.', 1) + m = importlib.import_module(mod_name) + fn = getattr(m, fn_name) + app.jinja_env.globals[tg['name']] = fn + info['template_globals'].append(tg['name']) + except Exception as e: + errors.append(f"template_global '{tg}': {e}") + + # 6) subplugins + for sp in meta.get('subplugins', []): + sub = {'name': sp['name'], 'models': [], 'routes': None} + for mp in sp.get('models', []): + try: + importlib.import_module(mp) + sub['models'].append(mp) + except Exception as e: + errors.append(f"subplugin model '{mp}': {e}") + srt = sp.get('routes') + if srt: + try: + m = importlib.import_module(srt['module']) + bp_obj = getattr(m, srt['blueprint']) + app.register_blueprint(bp_obj, url_prefix=srt.get('url_prefix'), strict_slashes=False) + sub['routes'] = f"{srt['module']}::{srt['blueprint']}" + except Exception as e: + errors.append(f"subplugin routes '{srt}': {e}") + info['subplugins'].append(sub) + + # Report + if errors: + app.logger.error(f" βœ– Plugin '{name}' errors: " + "; ".join(errors)) + else: + app.logger.info(f" βœ” Plugin '{name}' loaded") + loaded.append(info) + + # summary + app.logger.info("🌟 Loaded plugins summary:") + for p in loaded: + app.logger.info( + f" β€’ {p['name']}: models={p['models']}, routes={p['routes']}, " + f"cli={p['cli']}, template_globals={p['template_globals']}, " + f"subplugins={[s['name'] for s in p['subplugins']]}" + ) diff --git a/app/task_loader.py b/app/task_loader.py new file mode 100644 index 0000000..56b2ffa --- /dev/null +++ b/app/task_loader.py @@ -0,0 +1,53 @@ +# File: app/task_loader.py + +import os +import json +import importlib +from app.celery_app import celery + +def register_tasks(app): + project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) + plugins_dir = os.path.join(project_root, 'plugins') + task_modules = [] + + app.logger.info("πŸ”Œ Discovering Celery plugins…") + for name in sorted(os.listdir(plugins_dir)): + manifest = os.path.join(plugins_dir, name, 'plugin.json') + if not os.path.isfile(manifest): + continue + + try: + meta = json.load(open(manifest)) + except Exception as e: + app.logger.error(f"[Celery] Failed to load {name}/plugin.json: {e}") + continue + + # a) collect task modules + cfg = meta.get('tasks') + if isinstance(cfg, str): + task_modules.append(cfg) + elif isinstance(cfg, dict) and cfg.get('module'): + task_modules.append(cfg['module']) + elif isinstance(cfg, list): + for entry in cfg: + if isinstance(entry, str): + task_modules.append(entry) + elif isinstance(entry, dict) and entry.get('module'): + task_modules.append(entry['module']) + + # b) run tasks_init hooks (now passing Celery, not Flask) + for hook in meta.get('tasks_init', []): + module_name = hook.get('module') + fn_name = hook.get('callable') + if not module_name or not fn_name: + continue + try: + m = importlib.import_module(module_name) + fn = getattr(m, fn_name) + fn(celery) + except Exception as e: + app.logger.error(f"[Celery] tasks_init {name}:{module_name}.{fn_name} failed: {e}") + + if task_modules: + celery.autodiscover_tasks(task_modules) + app.logger.info(f"[Celery] Autodiscovered tasks: {task_modules}") diff --git a/beta-0.2.0.zip b/beta-0.2.0.zip new file mode 100644 index 0000000..739a944 Binary files /dev/null and b/beta-0.2.0.zip differ diff --git a/beta-0.1.15.zip b/betas/beta-0.1.15.zip similarity index 100% rename from beta-0.1.15.zip rename to betas/beta-0.1.15.zip diff --git a/betas/beta-0.1.16.zip b/betas/beta-0.1.16.zip new file mode 100644 index 0000000..357366d Binary files /dev/null and b/betas/beta-0.1.16.zip differ diff --git a/betas/beta-0.1.17.zip b/betas/beta-0.1.17.zip new file mode 100644 index 0000000..a35eac6 Binary files /dev/null and b/betas/beta-0.1.17.zip differ diff --git a/betas/beta-0.1.18.zip b/betas/beta-0.1.18.zip new file mode 100644 index 0000000..abc6fdf Binary files /dev/null and b/betas/beta-0.1.18.zip differ diff --git a/betas/beta-0.1.19.zip b/betas/beta-0.1.19.zip new file mode 100644 index 0000000..60d86d8 Binary files /dev/null and b/betas/beta-0.1.19.zip differ diff --git a/betas/beta-0.1.20.zip b/betas/beta-0.1.20.zip new file mode 100644 index 0000000..b7ef53d Binary files /dev/null and b/betas/beta-0.1.20.zip differ diff --git a/data/uploads/plant/1/0ff30f3857b84c19a2ee8234098b6661.jpg b/data/uploads/plant/1/0ff30f3857b84c19a2ee8234098b6661.jpg new file mode 100644 index 0000000..31c68e6 Binary files /dev/null and b/data/uploads/plant/1/0ff30f3857b84c19a2ee8234098b6661.jpg differ diff --git a/data/uploads/plant/1/109934aa6d404c95bb3927b8db7b4508.jpg b/data/uploads/plant/1/109934aa6d404c95bb3927b8db7b4508.jpg new file mode 100644 index 0000000..c0a4fb2 Binary files /dev/null and b/data/uploads/plant/1/109934aa6d404c95bb3927b8db7b4508.jpg differ diff --git a/data/uploads/plant/1/1cf30a8eed194888b6e51b74638c4631.jpg b/data/uploads/plant/1/1cf30a8eed194888b6e51b74638c4631.jpg new file mode 100644 index 0000000..2735373 Binary files /dev/null and b/data/uploads/plant/1/1cf30a8eed194888b6e51b74638c4631.jpg differ diff --git a/data/uploads/plant/1/3b5c0aff41a94a08b2d8cc7045906f61.jpg b/data/uploads/plant/1/3b5c0aff41a94a08b2d8cc7045906f61.jpg new file mode 100644 index 0000000..17f21e2 Binary files /dev/null and b/data/uploads/plant/1/3b5c0aff41a94a08b2d8cc7045906f61.jpg differ diff --git a/data/uploads/plant/1/3c8f4291db3349029fdbcd4f7eccfeb6.jpg b/data/uploads/plant/1/3c8f4291db3349029fdbcd4f7eccfeb6.jpg new file mode 100644 index 0000000..855c510 Binary files /dev/null and b/data/uploads/plant/1/3c8f4291db3349029fdbcd4f7eccfeb6.jpg differ diff --git a/data/uploads/plant/1/7fa82c187d364ae889a97481102f1f1b.jpg b/data/uploads/plant/1/7fa82c187d364ae889a97481102f1f1b.jpg new file mode 100644 index 0000000..ebdb703 Binary files /dev/null and b/data/uploads/plant/1/7fa82c187d364ae889a97481102f1f1b.jpg differ diff --git a/data/uploads/plant/1/aceaa8e104b947f1bff699e74363023b.jpg b/data/uploads/plant/1/aceaa8e104b947f1bff699e74363023b.jpg new file mode 100644 index 0000000..5e8ec1c Binary files /dev/null and b/data/uploads/plant/1/aceaa8e104b947f1bff699e74363023b.jpg differ diff --git a/data/uploads/plant/1/bf8a3b199c724aa080cceb251f23d893.jpg b/data/uploads/plant/1/bf8a3b199c724aa080cceb251f23d893.jpg new file mode 100644 index 0000000..3e083be Binary files /dev/null and b/data/uploads/plant/1/bf8a3b199c724aa080cceb251f23d893.jpg differ diff --git a/data/uploads/plant/1/c66926aae52347cfabf473a04796ff76.jpg b/data/uploads/plant/1/c66926aae52347cfabf473a04796ff76.jpg new file mode 100644 index 0000000..4e0b46c Binary files /dev/null and b/data/uploads/plant/1/c66926aae52347cfabf473a04796ff76.jpg differ diff --git a/data/uploads/plant/1/f13c92a973c644ad84d02d55b5c54ba7.jpg b/data/uploads/plant/1/f13c92a973c644ad84d02d55b5c54ba7.jpg new file mode 100644 index 0000000..11953ff Binary files /dev/null and b/data/uploads/plant/1/f13c92a973c644ad84d02d55b5c54ba7.jpg differ diff --git a/data/uploads/plant/1/f229419ce91940c7907ced10420f933a.jpg b/data/uploads/plant/1/f229419ce91940c7907ced10420f933a.jpg new file mode 100644 index 0000000..ad6cc68 Binary files /dev/null and b/data/uploads/plant/1/f229419ce91940c7907ced10420f933a.jpg differ diff --git a/data/uploads/plant/10/186ff5c003db4a98b3536e547c7c779d.jpg b/data/uploads/plant/10/186ff5c003db4a98b3536e547c7c779d.jpg new file mode 100644 index 0000000..4f9346e Binary files /dev/null and b/data/uploads/plant/10/186ff5c003db4a98b3536e547c7c779d.jpg differ diff --git a/data/uploads/plant/10/4050a825225541ccb16d96a6711dd120.jpg b/data/uploads/plant/10/4050a825225541ccb16d96a6711dd120.jpg new file mode 100644 index 0000000..815a879 Binary files /dev/null and b/data/uploads/plant/10/4050a825225541ccb16d96a6711dd120.jpg differ diff --git a/data/uploads/plant/10/56d7e13642664b40b57d7444442fa887.jpg b/data/uploads/plant/10/56d7e13642664b40b57d7444442fa887.jpg new file mode 100644 index 0000000..47a5e17 Binary files /dev/null and b/data/uploads/plant/10/56d7e13642664b40b57d7444442fa887.jpg differ diff --git a/data/uploads/plant/10/5f79c3ae0b2a4de491246e55b5fde44a.jpg b/data/uploads/plant/10/5f79c3ae0b2a4de491246e55b5fde44a.jpg new file mode 100644 index 0000000..36ddba3 Binary files /dev/null and b/data/uploads/plant/10/5f79c3ae0b2a4de491246e55b5fde44a.jpg differ diff --git a/data/uploads/plant/10/5f8ba9b97937453fbc38afc8c655e059.jpg b/data/uploads/plant/10/5f8ba9b97937453fbc38afc8c655e059.jpg new file mode 100644 index 0000000..b5154ee Binary files /dev/null and b/data/uploads/plant/10/5f8ba9b97937453fbc38afc8c655e059.jpg differ diff --git a/data/uploads/plant/10/aa2c98341ae8495583e8b48862b36699.jpg b/data/uploads/plant/10/aa2c98341ae8495583e8b48862b36699.jpg new file mode 100644 index 0000000..34ab4f6 Binary files /dev/null and b/data/uploads/plant/10/aa2c98341ae8495583e8b48862b36699.jpg differ diff --git a/data/uploads/plant/10/e320d9cd30b047bf9d4e261b4c780c1d.jpg b/data/uploads/plant/10/e320d9cd30b047bf9d4e261b4c780c1d.jpg new file mode 100644 index 0000000..0a2676f Binary files /dev/null and b/data/uploads/plant/10/e320d9cd30b047bf9d4e261b4c780c1d.jpg differ diff --git a/data/uploads/plant/108/02c8face5d6a4005802797a14af7b837.jpg b/data/uploads/plant/108/02c8face5d6a4005802797a14af7b837.jpg new file mode 100644 index 0000000..9b9d378 Binary files /dev/null and b/data/uploads/plant/108/02c8face5d6a4005802797a14af7b837.jpg differ diff --git a/data/uploads/plant/108/f1994e3f0c5a4ebcaa19c66f2ce55241.jpg b/data/uploads/plant/108/f1994e3f0c5a4ebcaa19c66f2ce55241.jpg new file mode 100644 index 0000000..793ff59 Binary files /dev/null and b/data/uploads/plant/108/f1994e3f0c5a4ebcaa19c66f2ce55241.jpg differ diff --git a/data/uploads/plant/109/145bd5d890184c32b2c6aa4eaf0d83ec.jpg b/data/uploads/plant/109/145bd5d890184c32b2c6aa4eaf0d83ec.jpg new file mode 100644 index 0000000..54cce4f Binary files /dev/null and b/data/uploads/plant/109/145bd5d890184c32b2c6aa4eaf0d83ec.jpg differ diff --git a/data/uploads/plant/109/75f779aed67645e78483abc5d032cc73.jpg b/data/uploads/plant/109/75f779aed67645e78483abc5d032cc73.jpg new file mode 100644 index 0000000..a5bb6b4 Binary files /dev/null and b/data/uploads/plant/109/75f779aed67645e78483abc5d032cc73.jpg differ diff --git a/data/uploads/plant/109/76507a9eff9a4f71b164d6960e02cf7e.jpg b/data/uploads/plant/109/76507a9eff9a4f71b164d6960e02cf7e.jpg new file mode 100644 index 0000000..341f0f2 Binary files /dev/null and b/data/uploads/plant/109/76507a9eff9a4f71b164d6960e02cf7e.jpg differ diff --git a/data/uploads/plant/11/25e61ab4af294e97849c2e3d3ebf96e8.jpg b/data/uploads/plant/11/25e61ab4af294e97849c2e3d3ebf96e8.jpg new file mode 100644 index 0000000..79fbba6 Binary files /dev/null and b/data/uploads/plant/11/25e61ab4af294e97849c2e3d3ebf96e8.jpg differ diff --git a/data/uploads/plant/11/51485221dc344885b6550a7df2f79a94.jpg b/data/uploads/plant/11/51485221dc344885b6550a7df2f79a94.jpg new file mode 100644 index 0000000..46777a2 Binary files /dev/null and b/data/uploads/plant/11/51485221dc344885b6550a7df2f79a94.jpg differ diff --git a/data/uploads/plant/11/69afe7199c814fb795c33423e16fc6af.jpg b/data/uploads/plant/11/69afe7199c814fb795c33423e16fc6af.jpg new file mode 100644 index 0000000..81204b1 Binary files /dev/null and b/data/uploads/plant/11/69afe7199c814fb795c33423e16fc6af.jpg differ diff --git a/data/uploads/plant/11/b87d3ae057bd4dee849308cb522972e9.jpg b/data/uploads/plant/11/b87d3ae057bd4dee849308cb522972e9.jpg new file mode 100644 index 0000000..d88e9b3 Binary files /dev/null and b/data/uploads/plant/11/b87d3ae057bd4dee849308cb522972e9.jpg differ diff --git a/data/uploads/plant/11/c0c68d91169944cca723c31c7d1430d2.jpg b/data/uploads/plant/11/c0c68d91169944cca723c31c7d1430d2.jpg new file mode 100644 index 0000000..fbbd116 Binary files /dev/null and b/data/uploads/plant/11/c0c68d91169944cca723c31c7d1430d2.jpg differ diff --git a/data/uploads/plant/110/266c7f8096384c819baaedb6ca180414.jpg b/data/uploads/plant/110/266c7f8096384c819baaedb6ca180414.jpg new file mode 100644 index 0000000..63cefda Binary files /dev/null and b/data/uploads/plant/110/266c7f8096384c819baaedb6ca180414.jpg differ diff --git a/data/uploads/plant/110/67542c62605d4ad49a4858b92cbe7f09.jpg b/data/uploads/plant/110/67542c62605d4ad49a4858b92cbe7f09.jpg new file mode 100644 index 0000000..6c566dd Binary files /dev/null and b/data/uploads/plant/110/67542c62605d4ad49a4858b92cbe7f09.jpg differ diff --git a/data/uploads/plant/110/df339dba5c344d3682e2390cacc085cd.jpg b/data/uploads/plant/110/df339dba5c344d3682e2390cacc085cd.jpg new file mode 100644 index 0000000..ddf7e79 Binary files /dev/null and b/data/uploads/plant/110/df339dba5c344d3682e2390cacc085cd.jpg differ diff --git a/data/uploads/plant/12/0777c803d1f84c2da5d7db0779996a06.jpg b/data/uploads/plant/12/0777c803d1f84c2da5d7db0779996a06.jpg new file mode 100644 index 0000000..3061368 Binary files /dev/null and b/data/uploads/plant/12/0777c803d1f84c2da5d7db0779996a06.jpg differ diff --git a/data/uploads/plant/12/3ea746f738e34a50a2fe6ee7f4522a5f.jpg b/data/uploads/plant/12/3ea746f738e34a50a2fe6ee7f4522a5f.jpg new file mode 100644 index 0000000..a469bb1 Binary files /dev/null and b/data/uploads/plant/12/3ea746f738e34a50a2fe6ee7f4522a5f.jpg differ diff --git a/data/uploads/plant/12/3f9ac62901aa4ab0b4e0dff91ea0d601.jpg b/data/uploads/plant/12/3f9ac62901aa4ab0b4e0dff91ea0d601.jpg new file mode 100644 index 0000000..743473c Binary files /dev/null and b/data/uploads/plant/12/3f9ac62901aa4ab0b4e0dff91ea0d601.jpg differ diff --git a/data/uploads/plant/12/715c4d4b27fa48c995dde3b323d40ca7.jpg b/data/uploads/plant/12/715c4d4b27fa48c995dde3b323d40ca7.jpg new file mode 100644 index 0000000..1fd2005 Binary files /dev/null and b/data/uploads/plant/12/715c4d4b27fa48c995dde3b323d40ca7.jpg differ diff --git a/data/uploads/plant/12/7dc0e91ec8544d19916ff7f1663aa994.jpg b/data/uploads/plant/12/7dc0e91ec8544d19916ff7f1663aa994.jpg new file mode 100644 index 0000000..9fd378e Binary files /dev/null and b/data/uploads/plant/12/7dc0e91ec8544d19916ff7f1663aa994.jpg differ diff --git a/data/uploads/plant/13/1fe89ba5a9a5418daddda7388cf049d2.jpg b/data/uploads/plant/13/1fe89ba5a9a5418daddda7388cf049d2.jpg new file mode 100644 index 0000000..29849a6 Binary files /dev/null and b/data/uploads/plant/13/1fe89ba5a9a5418daddda7388cf049d2.jpg differ diff --git a/data/uploads/plant/13/9cb645c2db2e4d269c245acf4a13c423.jpg b/data/uploads/plant/13/9cb645c2db2e4d269c245acf4a13c423.jpg new file mode 100644 index 0000000..64ddaee Binary files /dev/null and b/data/uploads/plant/13/9cb645c2db2e4d269c245acf4a13c423.jpg differ diff --git a/data/uploads/plant/13/d0802efbc7094285a03f4a47b14b306c.jpg b/data/uploads/plant/13/d0802efbc7094285a03f4a47b14b306c.jpg new file mode 100644 index 0000000..c5246b9 Binary files /dev/null and b/data/uploads/plant/13/d0802efbc7094285a03f4a47b14b306c.jpg differ diff --git a/data/uploads/plant/14/4fb10fe3dee2460bac5e705ac7928bc2.jpg b/data/uploads/plant/14/4fb10fe3dee2460bac5e705ac7928bc2.jpg new file mode 100644 index 0000000..4f0b3f9 Binary files /dev/null and b/data/uploads/plant/14/4fb10fe3dee2460bac5e705ac7928bc2.jpg differ diff --git a/data/uploads/plant/14/7cfd8a984912483db2656a4e90799d6b.jpg b/data/uploads/plant/14/7cfd8a984912483db2656a4e90799d6b.jpg new file mode 100644 index 0000000..f4609a0 Binary files /dev/null and b/data/uploads/plant/14/7cfd8a984912483db2656a4e90799d6b.jpg differ diff --git a/data/uploads/plant/14/9c0d9fb448e34dc5ab62390b67bbdfd5.jpg b/data/uploads/plant/14/9c0d9fb448e34dc5ab62390b67bbdfd5.jpg new file mode 100644 index 0000000..bebc492 Binary files /dev/null and b/data/uploads/plant/14/9c0d9fb448e34dc5ab62390b67bbdfd5.jpg differ diff --git a/data/uploads/plant/14/bdc8b95661874052beac3bda1ef99d60.jpg b/data/uploads/plant/14/bdc8b95661874052beac3bda1ef99d60.jpg new file mode 100644 index 0000000..0f213a8 Binary files /dev/null and b/data/uploads/plant/14/bdc8b95661874052beac3bda1ef99d60.jpg differ diff --git a/data/uploads/plant/14/e42aeff454c74e98926f22ef1d49368e.jpg b/data/uploads/plant/14/e42aeff454c74e98926f22ef1d49368e.jpg new file mode 100644 index 0000000..ba33cad Binary files /dev/null and b/data/uploads/plant/14/e42aeff454c74e98926f22ef1d49368e.jpg differ diff --git a/data/uploads/plant/15/0af823a45d514bb294edfb7d4536a402.jpg b/data/uploads/plant/15/0af823a45d514bb294edfb7d4536a402.jpg new file mode 100644 index 0000000..6d7f1c2 Binary files /dev/null and b/data/uploads/plant/15/0af823a45d514bb294edfb7d4536a402.jpg differ diff --git a/data/uploads/plant/15/86b618f3072d4b639c0bf3f6837df341.jpg b/data/uploads/plant/15/86b618f3072d4b639c0bf3f6837df341.jpg new file mode 100644 index 0000000..0339298 Binary files /dev/null and b/data/uploads/plant/15/86b618f3072d4b639c0bf3f6837df341.jpg differ diff --git a/data/uploads/plant/15/93461c166b56437ba46a81ed63d21bb0.jpg b/data/uploads/plant/15/93461c166b56437ba46a81ed63d21bb0.jpg new file mode 100644 index 0000000..067bbee Binary files /dev/null and b/data/uploads/plant/15/93461c166b56437ba46a81ed63d21bb0.jpg differ diff --git a/data/uploads/plant/15/cc20753d71c94dce96e4a45f71cea8e9.jpg b/data/uploads/plant/15/cc20753d71c94dce96e4a45f71cea8e9.jpg new file mode 100644 index 0000000..1dae38f Binary files /dev/null and b/data/uploads/plant/15/cc20753d71c94dce96e4a45f71cea8e9.jpg differ diff --git a/data/uploads/plant/15/f5904d5f72104a6c84e9a6c84f1b8ff4.jpg b/data/uploads/plant/15/f5904d5f72104a6c84e9a6c84f1b8ff4.jpg new file mode 100644 index 0000000..9cd3321 Binary files /dev/null and b/data/uploads/plant/15/f5904d5f72104a6c84e9a6c84f1b8ff4.jpg differ diff --git a/data/uploads/plant/15/fa68d4e789bf4f57b778db5e29041839.jpg b/data/uploads/plant/15/fa68d4e789bf4f57b778db5e29041839.jpg new file mode 100644 index 0000000..4ca4deb Binary files /dev/null and b/data/uploads/plant/15/fa68d4e789bf4f57b778db5e29041839.jpg differ diff --git a/data/uploads/plant/16/0b52d55d99024d419ea7d5deea1fcb9d.jpg b/data/uploads/plant/16/0b52d55d99024d419ea7d5deea1fcb9d.jpg new file mode 100644 index 0000000..38e7e93 Binary files /dev/null and b/data/uploads/plant/16/0b52d55d99024d419ea7d5deea1fcb9d.jpg differ diff --git a/data/uploads/plant/16/2b8c0bedc0c4458487476803c39fa19d.jpg b/data/uploads/plant/16/2b8c0bedc0c4458487476803c39fa19d.jpg new file mode 100644 index 0000000..4ec57b3 Binary files /dev/null and b/data/uploads/plant/16/2b8c0bedc0c4458487476803c39fa19d.jpg differ diff --git a/data/uploads/plant/16/2bd0c35393ba411cbdae21578868822c.jpg b/data/uploads/plant/16/2bd0c35393ba411cbdae21578868822c.jpg new file mode 100644 index 0000000..0d086c9 Binary files /dev/null and b/data/uploads/plant/16/2bd0c35393ba411cbdae21578868822c.jpg differ diff --git a/data/uploads/plant/16/93316f6df94e4a30809a12f81ef62cc6.jpg b/data/uploads/plant/16/93316f6df94e4a30809a12f81ef62cc6.jpg new file mode 100644 index 0000000..c37a90e Binary files /dev/null and b/data/uploads/plant/16/93316f6df94e4a30809a12f81ef62cc6.jpg differ diff --git a/data/uploads/plant/16/bb986ac5a83e44b0a7d885cf940b4d02.jpg b/data/uploads/plant/16/bb986ac5a83e44b0a7d885cf940b4d02.jpg new file mode 100644 index 0000000..90e3494 Binary files /dev/null and b/data/uploads/plant/16/bb986ac5a83e44b0a7d885cf940b4d02.jpg differ diff --git a/data/uploads/plant/16/d6f05f8a17c04b4287ce56cc242bad8a.jpg b/data/uploads/plant/16/d6f05f8a17c04b4287ce56cc242bad8a.jpg new file mode 100644 index 0000000..4b2b18a Binary files /dev/null and b/data/uploads/plant/16/d6f05f8a17c04b4287ce56cc242bad8a.jpg differ diff --git a/data/uploads/plant/16/e0d0dc570da44e33a610287108823c8a.jpg b/data/uploads/plant/16/e0d0dc570da44e33a610287108823c8a.jpg new file mode 100644 index 0000000..773f6ad Binary files /dev/null and b/data/uploads/plant/16/e0d0dc570da44e33a610287108823c8a.jpg differ diff --git a/data/uploads/plant/17/0b80d1a06f4747619bac8ff137d4b8bd.jpg b/data/uploads/plant/17/0b80d1a06f4747619bac8ff137d4b8bd.jpg new file mode 100644 index 0000000..daf4399 Binary files /dev/null and b/data/uploads/plant/17/0b80d1a06f4747619bac8ff137d4b8bd.jpg differ diff --git a/data/uploads/plant/17/0dd3a367f4f84927bbe6c849b1093de5.jpg b/data/uploads/plant/17/0dd3a367f4f84927bbe6c849b1093de5.jpg new file mode 100644 index 0000000..fc99f99 Binary files /dev/null and b/data/uploads/plant/17/0dd3a367f4f84927bbe6c849b1093de5.jpg differ diff --git a/data/uploads/plant/17/29997bfb01f84d0fb0a2bae3a040856a.jpg b/data/uploads/plant/17/29997bfb01f84d0fb0a2bae3a040856a.jpg new file mode 100644 index 0000000..63d85a1 Binary files /dev/null and b/data/uploads/plant/17/29997bfb01f84d0fb0a2bae3a040856a.jpg differ diff --git a/data/uploads/plant/17/2c6988132afa4bbc81328318c9ac4b4c.jpg b/data/uploads/plant/17/2c6988132afa4bbc81328318c9ac4b4c.jpg new file mode 100644 index 0000000..cd930e7 Binary files /dev/null and b/data/uploads/plant/17/2c6988132afa4bbc81328318c9ac4b4c.jpg differ diff --git a/data/uploads/plant/17/bf66b3c24c364664bae01f7534b942cd.jpg b/data/uploads/plant/17/bf66b3c24c364664bae01f7534b942cd.jpg new file mode 100644 index 0000000..a9fd576 Binary files /dev/null and b/data/uploads/plant/17/bf66b3c24c364664bae01f7534b942cd.jpg differ diff --git a/data/uploads/plant/17/ca41764ae3e24357ac35337145eba8c9.jpg b/data/uploads/plant/17/ca41764ae3e24357ac35337145eba8c9.jpg new file mode 100644 index 0000000..9a8115f Binary files /dev/null and b/data/uploads/plant/17/ca41764ae3e24357ac35337145eba8c9.jpg differ diff --git a/data/uploads/plant/18/25e7efa6c0ab46e3b9d6fdddd780c997.jpg b/data/uploads/plant/18/25e7efa6c0ab46e3b9d6fdddd780c997.jpg new file mode 100644 index 0000000..20a87f6 Binary files /dev/null and b/data/uploads/plant/18/25e7efa6c0ab46e3b9d6fdddd780c997.jpg differ diff --git a/data/uploads/plant/18/3f1da9868b664e72b882450c2bf85b40.jpg b/data/uploads/plant/18/3f1da9868b664e72b882450c2bf85b40.jpg new file mode 100644 index 0000000..9f31d1d Binary files /dev/null and b/data/uploads/plant/18/3f1da9868b664e72b882450c2bf85b40.jpg differ diff --git a/data/uploads/plant/18/5fe72b4241d244f29223d465ab1a2446.jpg b/data/uploads/plant/18/5fe72b4241d244f29223d465ab1a2446.jpg new file mode 100644 index 0000000..fc99f99 Binary files /dev/null and b/data/uploads/plant/18/5fe72b4241d244f29223d465ab1a2446.jpg differ diff --git a/data/uploads/plant/18/80a097675bc04dd5983016003491900a.jpg b/data/uploads/plant/18/80a097675bc04dd5983016003491900a.jpg new file mode 100644 index 0000000..02e8070 Binary files /dev/null and b/data/uploads/plant/18/80a097675bc04dd5983016003491900a.jpg differ diff --git a/data/uploads/plant/18/ae9e8c539fc9418d9a8d4c5ee50e2367.jpg b/data/uploads/plant/18/ae9e8c539fc9418d9a8d4c5ee50e2367.jpg new file mode 100644 index 0000000..ed1ac03 Binary files /dev/null and b/data/uploads/plant/18/ae9e8c539fc9418d9a8d4c5ee50e2367.jpg differ diff --git a/data/uploads/plant/18/b13e194b26994320ac2b380b876dd738.jpg b/data/uploads/plant/18/b13e194b26994320ac2b380b876dd738.jpg new file mode 100644 index 0000000..07744d1 Binary files /dev/null and b/data/uploads/plant/18/b13e194b26994320ac2b380b876dd738.jpg differ diff --git a/data/uploads/plant/18/e530c42a0ea9454daf68c4164a7c6b3e.jpg b/data/uploads/plant/18/e530c42a0ea9454daf68c4164a7c6b3e.jpg new file mode 100644 index 0000000..1296b30 Binary files /dev/null and b/data/uploads/plant/18/e530c42a0ea9454daf68c4164a7c6b3e.jpg differ diff --git a/data/uploads/plant/19/2644f53c6eaa4a16961d82c45f58b1e4.jpg b/data/uploads/plant/19/2644f53c6eaa4a16961d82c45f58b1e4.jpg new file mode 100644 index 0000000..c89872a Binary files /dev/null and b/data/uploads/plant/19/2644f53c6eaa4a16961d82c45f58b1e4.jpg differ diff --git a/data/uploads/plant/19/5441cf38ed8d48afb28225a5754d2ad6.jpg b/data/uploads/plant/19/5441cf38ed8d48afb28225a5754d2ad6.jpg new file mode 100644 index 0000000..491fba8 Binary files /dev/null and b/data/uploads/plant/19/5441cf38ed8d48afb28225a5754d2ad6.jpg differ diff --git a/data/uploads/plant/19/65a5618aaf14483fa22e19d5c253432f.jpg b/data/uploads/plant/19/65a5618aaf14483fa22e19d5c253432f.jpg new file mode 100644 index 0000000..06d77d8 Binary files /dev/null and b/data/uploads/plant/19/65a5618aaf14483fa22e19d5c253432f.jpg differ diff --git a/data/uploads/plant/19/8c45ba9b7a9c4cf28aaa5eaa7148baa2.jpg b/data/uploads/plant/19/8c45ba9b7a9c4cf28aaa5eaa7148baa2.jpg new file mode 100644 index 0000000..6a7bb18 Binary files /dev/null and b/data/uploads/plant/19/8c45ba9b7a9c4cf28aaa5eaa7148baa2.jpg differ diff --git a/data/uploads/plant/19/a587941b9db84f1abc7d7d689037b1e9.jpg b/data/uploads/plant/19/a587941b9db84f1abc7d7d689037b1e9.jpg new file mode 100644 index 0000000..368728c Binary files /dev/null and b/data/uploads/plant/19/a587941b9db84f1abc7d7d689037b1e9.jpg differ diff --git a/data/uploads/plant/19/bab5ba66a91646f388d0f0ec2caf48b3.jpg b/data/uploads/plant/19/bab5ba66a91646f388d0f0ec2caf48b3.jpg new file mode 100644 index 0000000..5628119 Binary files /dev/null and b/data/uploads/plant/19/bab5ba66a91646f388d0f0ec2caf48b3.jpg differ diff --git a/data/uploads/plant/19/d8b57faf9d8c45fb8f597023451e97fe.jpg b/data/uploads/plant/19/d8b57faf9d8c45fb8f597023451e97fe.jpg new file mode 100644 index 0000000..06d77d8 Binary files /dev/null and b/data/uploads/plant/19/d8b57faf9d8c45fb8f597023451e97fe.jpg differ diff --git a/data/uploads/plant/2/04853e14934843939e665e7b13065bec.jpg b/data/uploads/plant/2/04853e14934843939e665e7b13065bec.jpg new file mode 100644 index 0000000..0058ea7 Binary files /dev/null and b/data/uploads/plant/2/04853e14934843939e665e7b13065bec.jpg differ diff --git a/data/uploads/plant/2/193c31a376ff49179b761201ee2df5f1.jpg b/data/uploads/plant/2/193c31a376ff49179b761201ee2df5f1.jpg new file mode 100644 index 0000000..21a1a6a Binary files /dev/null and b/data/uploads/plant/2/193c31a376ff49179b761201ee2df5f1.jpg differ diff --git a/data/uploads/plant/2/35c39f482df44664be8948cff97f20da.jpg b/data/uploads/plant/2/35c39f482df44664be8948cff97f20da.jpg new file mode 100644 index 0000000..c159897 Binary files /dev/null and b/data/uploads/plant/2/35c39f482df44664be8948cff97f20da.jpg differ diff --git a/data/uploads/plant/2/38ec39518fd44d1ea3e53fc0abff551a.jpg b/data/uploads/plant/2/38ec39518fd44d1ea3e53fc0abff551a.jpg new file mode 100644 index 0000000..e4afbd8 Binary files /dev/null and b/data/uploads/plant/2/38ec39518fd44d1ea3e53fc0abff551a.jpg differ diff --git a/data/uploads/plant/2/5bb12e93391347d69708c69d0afaa343.jpg b/data/uploads/plant/2/5bb12e93391347d69708c69d0afaa343.jpg new file mode 100644 index 0000000..728ce03 Binary files /dev/null and b/data/uploads/plant/2/5bb12e93391347d69708c69d0afaa343.jpg differ diff --git a/data/uploads/plant/2/6e99a10132664c0ea3e4c181c460a583.jpg b/data/uploads/plant/2/6e99a10132664c0ea3e4c181c460a583.jpg new file mode 100644 index 0000000..5e20541 Binary files /dev/null and b/data/uploads/plant/2/6e99a10132664c0ea3e4c181c460a583.jpg differ diff --git a/data/uploads/plant/2/7e42b9367d4948f0a4aea5ab1d8cb07e.jpg b/data/uploads/plant/2/7e42b9367d4948f0a4aea5ab1d8cb07e.jpg new file mode 100644 index 0000000..25b2448 Binary files /dev/null and b/data/uploads/plant/2/7e42b9367d4948f0a4aea5ab1d8cb07e.jpg differ diff --git a/data/uploads/plant/2/7fcea62f65b747d7b9f931a3f82a9ed5.jpg b/data/uploads/plant/2/7fcea62f65b747d7b9f931a3f82a9ed5.jpg new file mode 100644 index 0000000..0033646 Binary files /dev/null and b/data/uploads/plant/2/7fcea62f65b747d7b9f931a3f82a9ed5.jpg differ diff --git a/data/uploads/plant/2/9ec8c9aaa9c645608374b511deebff46.jpg b/data/uploads/plant/2/9ec8c9aaa9c645608374b511deebff46.jpg new file mode 100644 index 0000000..0ff8ec0 Binary files /dev/null and b/data/uploads/plant/2/9ec8c9aaa9c645608374b511deebff46.jpg differ diff --git a/data/uploads/plant/20/01f910c8154841dd8d4e4ec22da82408.jpg b/data/uploads/plant/20/01f910c8154841dd8d4e4ec22da82408.jpg new file mode 100644 index 0000000..79fbc4a Binary files /dev/null and b/data/uploads/plant/20/01f910c8154841dd8d4e4ec22da82408.jpg differ diff --git a/data/uploads/plant/20/5524c61bb36d4466a2099aed4d8c07af.jpg b/data/uploads/plant/20/5524c61bb36d4466a2099aed4d8c07af.jpg new file mode 100644 index 0000000..d1f2623 Binary files /dev/null and b/data/uploads/plant/20/5524c61bb36d4466a2099aed4d8c07af.jpg differ diff --git a/data/uploads/plant/20/61a4e6bc720147d3b017ac1b9ff466c0.jpg b/data/uploads/plant/20/61a4e6bc720147d3b017ac1b9ff466c0.jpg new file mode 100644 index 0000000..b7ba816 Binary files /dev/null and b/data/uploads/plant/20/61a4e6bc720147d3b017ac1b9ff466c0.jpg differ diff --git a/data/uploads/plant/20/6813a97042c9468db79af40f1972b42b.jpg b/data/uploads/plant/20/6813a97042c9468db79af40f1972b42b.jpg new file mode 100644 index 0000000..c9ba2fb Binary files /dev/null and b/data/uploads/plant/20/6813a97042c9468db79af40f1972b42b.jpg differ diff --git a/data/uploads/plant/20/77601aeb12554db2966d24dee9b1e06e.jpg b/data/uploads/plant/20/77601aeb12554db2966d24dee9b1e06e.jpg new file mode 100644 index 0000000..d01d7f1 Binary files /dev/null and b/data/uploads/plant/20/77601aeb12554db2966d24dee9b1e06e.jpg differ diff --git a/data/uploads/plant/20/80eb39816d174ec983f033f82c9edccf.jpg b/data/uploads/plant/20/80eb39816d174ec983f033f82c9edccf.jpg new file mode 100644 index 0000000..9c4c82a Binary files /dev/null and b/data/uploads/plant/20/80eb39816d174ec983f033f82c9edccf.jpg differ diff --git a/data/uploads/plant/20/9d3cef7b91b949e1809a72ff144131f5.jpg b/data/uploads/plant/20/9d3cef7b91b949e1809a72ff144131f5.jpg new file mode 100644 index 0000000..5ea7d6c Binary files /dev/null and b/data/uploads/plant/20/9d3cef7b91b949e1809a72ff144131f5.jpg differ diff --git a/data/uploads/plant/20/f1a4aa964d694a6f8925dd2b4815ad84.jpg b/data/uploads/plant/20/f1a4aa964d694a6f8925dd2b4815ad84.jpg new file mode 100644 index 0000000..55c36fe Binary files /dev/null and b/data/uploads/plant/20/f1a4aa964d694a6f8925dd2b4815ad84.jpg differ diff --git a/data/uploads/plant/20/f31b48b54d054c618afecd96eb6be73e.jpg b/data/uploads/plant/20/f31b48b54d054c618afecd96eb6be73e.jpg new file mode 100644 index 0000000..7c9b004 Binary files /dev/null and b/data/uploads/plant/20/f31b48b54d054c618afecd96eb6be73e.jpg differ diff --git a/data/uploads/plant/20/f63b8b7c2105485f95782c7db7e845bb.jpg b/data/uploads/plant/20/f63b8b7c2105485f95782c7db7e845bb.jpg new file mode 100644 index 0000000..5a0e57a Binary files /dev/null and b/data/uploads/plant/20/f63b8b7c2105485f95782c7db7e845bb.jpg differ diff --git a/data/uploads/plant/21/2e960a6c07b7460b93fe11d38eecb321.jpg b/data/uploads/plant/21/2e960a6c07b7460b93fe11d38eecb321.jpg new file mode 100644 index 0000000..bdd360f Binary files /dev/null and b/data/uploads/plant/21/2e960a6c07b7460b93fe11d38eecb321.jpg differ diff --git a/data/uploads/plant/21/484c5d3a2eaf44bbb5089cb99f7ef10d.jpg b/data/uploads/plant/21/484c5d3a2eaf44bbb5089cb99f7ef10d.jpg new file mode 100644 index 0000000..9d4facf Binary files /dev/null and b/data/uploads/plant/21/484c5d3a2eaf44bbb5089cb99f7ef10d.jpg differ diff --git a/data/uploads/plant/21/83adbe9a401d42c5b3fefb337a7de32e.jpg b/data/uploads/plant/21/83adbe9a401d42c5b3fefb337a7de32e.jpg new file mode 100644 index 0000000..737702a Binary files /dev/null and b/data/uploads/plant/21/83adbe9a401d42c5b3fefb337a7de32e.jpg differ diff --git a/data/uploads/plant/21/cc8e1385c2b94fc28bc9b30306a8220c.jpg b/data/uploads/plant/21/cc8e1385c2b94fc28bc9b30306a8220c.jpg new file mode 100644 index 0000000..a464d5b Binary files /dev/null and b/data/uploads/plant/21/cc8e1385c2b94fc28bc9b30306a8220c.jpg differ diff --git a/data/uploads/plant/22/7bb698cedf5d4da085303647b284b82d.jpg b/data/uploads/plant/22/7bb698cedf5d4da085303647b284b82d.jpg new file mode 100644 index 0000000..2e8ae5b Binary files /dev/null and b/data/uploads/plant/22/7bb698cedf5d4da085303647b284b82d.jpg differ diff --git a/data/uploads/plant/22/aab3f816eda54be2abb06d23e623e4be.jpg b/data/uploads/plant/22/aab3f816eda54be2abb06d23e623e4be.jpg new file mode 100644 index 0000000..3c0ae8a Binary files /dev/null and b/data/uploads/plant/22/aab3f816eda54be2abb06d23e623e4be.jpg differ diff --git a/data/uploads/plant/22/cd6ef9f4178447ae80d6da72b9fd066f.jpg b/data/uploads/plant/22/cd6ef9f4178447ae80d6da72b9fd066f.jpg new file mode 100644 index 0000000..2cbd8ae Binary files /dev/null and b/data/uploads/plant/22/cd6ef9f4178447ae80d6da72b9fd066f.jpg differ diff --git a/data/uploads/plant/22/ce4517ffd47b4edda8f6286223be70d2.jpg b/data/uploads/plant/22/ce4517ffd47b4edda8f6286223be70d2.jpg new file mode 100644 index 0000000..c3d2a53 Binary files /dev/null and b/data/uploads/plant/22/ce4517ffd47b4edda8f6286223be70d2.jpg differ diff --git a/data/uploads/plant/22/d6b582fdd0f7401f8ed9c1f5293599cd.jpg b/data/uploads/plant/22/d6b582fdd0f7401f8ed9c1f5293599cd.jpg new file mode 100644 index 0000000..6d2e667 Binary files /dev/null and b/data/uploads/plant/22/d6b582fdd0f7401f8ed9c1f5293599cd.jpg differ diff --git a/data/uploads/plant/22/da80e67a0d324e88904a3dc03d290461.jpg b/data/uploads/plant/22/da80e67a0d324e88904a3dc03d290461.jpg new file mode 100644 index 0000000..c1f5bc2 Binary files /dev/null and b/data/uploads/plant/22/da80e67a0d324e88904a3dc03d290461.jpg differ diff --git a/data/uploads/plant/22/e786cdb447424e469ffb57d843dfe203.jpg b/data/uploads/plant/22/e786cdb447424e469ffb57d843dfe203.jpg new file mode 100644 index 0000000..72fcf43 Binary files /dev/null and b/data/uploads/plant/22/e786cdb447424e469ffb57d843dfe203.jpg differ diff --git a/data/uploads/plant/23/1fdec55cf38a4aa8bf4fcb7c04e25a07.jpg b/data/uploads/plant/23/1fdec55cf38a4aa8bf4fcb7c04e25a07.jpg new file mode 100644 index 0000000..944d065 Binary files /dev/null and b/data/uploads/plant/23/1fdec55cf38a4aa8bf4fcb7c04e25a07.jpg differ diff --git a/data/uploads/plant/23/244e35c16de64456bb53b435c4dfb36e.jpg b/data/uploads/plant/23/244e35c16de64456bb53b435c4dfb36e.jpg new file mode 100644 index 0000000..b8c4e35 Binary files /dev/null and b/data/uploads/plant/23/244e35c16de64456bb53b435c4dfb36e.jpg differ diff --git a/data/uploads/plant/23/387749a612f840d185a56c785eb99520.jpg b/data/uploads/plant/23/387749a612f840d185a56c785eb99520.jpg new file mode 100644 index 0000000..8399d39 Binary files /dev/null and b/data/uploads/plant/23/387749a612f840d185a56c785eb99520.jpg differ diff --git a/data/uploads/plant/23/3bd6f36c3ca64c1d8245aaafde8c3fa7.jpg b/data/uploads/plant/23/3bd6f36c3ca64c1d8245aaafde8c3fa7.jpg new file mode 100644 index 0000000..0b11cd4 Binary files /dev/null and b/data/uploads/plant/23/3bd6f36c3ca64c1d8245aaafde8c3fa7.jpg differ diff --git a/data/uploads/plant/23/59d5bd5801294101997390e4b136c6b2.jpg b/data/uploads/plant/23/59d5bd5801294101997390e4b136c6b2.jpg new file mode 100644 index 0000000..5fff0b1 Binary files /dev/null and b/data/uploads/plant/23/59d5bd5801294101997390e4b136c6b2.jpg differ diff --git a/data/uploads/plant/23/ca107094f61840a3af1a446d464f4415.jpg b/data/uploads/plant/23/ca107094f61840a3af1a446d464f4415.jpg new file mode 100644 index 0000000..0c67a5a Binary files /dev/null and b/data/uploads/plant/23/ca107094f61840a3af1a446d464f4415.jpg differ diff --git a/data/uploads/plant/24/19beed7325b24b3dad7734776a64dfa1.jpg b/data/uploads/plant/24/19beed7325b24b3dad7734776a64dfa1.jpg new file mode 100644 index 0000000..60bd54a Binary files /dev/null and b/data/uploads/plant/24/19beed7325b24b3dad7734776a64dfa1.jpg differ diff --git a/data/uploads/plant/24/1dbe4ba7480744019b96aa26dafe3de9.jpg b/data/uploads/plant/24/1dbe4ba7480744019b96aa26dafe3de9.jpg new file mode 100644 index 0000000..d314c1e Binary files /dev/null and b/data/uploads/plant/24/1dbe4ba7480744019b96aa26dafe3de9.jpg differ diff --git a/data/uploads/plant/24/1e4944f939b0470eb9c3f82fce090626.jpg b/data/uploads/plant/24/1e4944f939b0470eb9c3f82fce090626.jpg new file mode 100644 index 0000000..96dd4b3 Binary files /dev/null and b/data/uploads/plant/24/1e4944f939b0470eb9c3f82fce090626.jpg differ diff --git a/data/uploads/plant/24/334fa3952bcb4720bb3f4fcec12602d0.jpg b/data/uploads/plant/24/334fa3952bcb4720bb3f4fcec12602d0.jpg new file mode 100644 index 0000000..1117ca0 Binary files /dev/null and b/data/uploads/plant/24/334fa3952bcb4720bb3f4fcec12602d0.jpg differ diff --git a/data/uploads/plant/24/380fffb7e1884f98ae984ddcf6198d57.jpg b/data/uploads/plant/24/380fffb7e1884f98ae984ddcf6198d57.jpg new file mode 100644 index 0000000..f9679c6 Binary files /dev/null and b/data/uploads/plant/24/380fffb7e1884f98ae984ddcf6198d57.jpg differ diff --git a/data/uploads/plant/24/3c2ac327c93c4b9baed8343e061436e3.jpg b/data/uploads/plant/24/3c2ac327c93c4b9baed8343e061436e3.jpg new file mode 100644 index 0000000..5a92dd7 Binary files /dev/null and b/data/uploads/plant/24/3c2ac327c93c4b9baed8343e061436e3.jpg differ diff --git a/data/uploads/plant/24/e0b2c03d6bc441209ad105f1cc946961.jpg b/data/uploads/plant/24/e0b2c03d6bc441209ad105f1cc946961.jpg new file mode 100644 index 0000000..41210ea Binary files /dev/null and b/data/uploads/plant/24/e0b2c03d6bc441209ad105f1cc946961.jpg differ diff --git a/data/uploads/plant/25/1176ecbc43b04af6b29ac0b09af2580f.jpg b/data/uploads/plant/25/1176ecbc43b04af6b29ac0b09af2580f.jpg new file mode 100644 index 0000000..fbebc70 Binary files /dev/null and b/data/uploads/plant/25/1176ecbc43b04af6b29ac0b09af2580f.jpg differ diff --git a/data/uploads/plant/25/6675e07b9966412a9612c42689ff5725.jpg b/data/uploads/plant/25/6675e07b9966412a9612c42689ff5725.jpg new file mode 100644 index 0000000..3d499a7 Binary files /dev/null and b/data/uploads/plant/25/6675e07b9966412a9612c42689ff5725.jpg differ diff --git a/data/uploads/plant/25/8a1662652805457984d997a71174c1bc.jpg b/data/uploads/plant/25/8a1662652805457984d997a71174c1bc.jpg new file mode 100644 index 0000000..5cee84c Binary files /dev/null and b/data/uploads/plant/25/8a1662652805457984d997a71174c1bc.jpg differ diff --git a/data/uploads/plant/25/b96dfcc6335b4942a512f82808f2add6.jpg b/data/uploads/plant/25/b96dfcc6335b4942a512f82808f2add6.jpg new file mode 100644 index 0000000..98edaa0 Binary files /dev/null and b/data/uploads/plant/25/b96dfcc6335b4942a512f82808f2add6.jpg differ diff --git a/data/uploads/plant/25/cee35f20dc8d41eba38ce1497c074422.jpg b/data/uploads/plant/25/cee35f20dc8d41eba38ce1497c074422.jpg new file mode 100644 index 0000000..1bed0ef Binary files /dev/null and b/data/uploads/plant/25/cee35f20dc8d41eba38ce1497c074422.jpg differ diff --git a/data/uploads/plant/25/f3d3e43ff6ae4ba9b5bd40cb3a9696d5.jpg b/data/uploads/plant/25/f3d3e43ff6ae4ba9b5bd40cb3a9696d5.jpg new file mode 100644 index 0000000..f168db0 Binary files /dev/null and b/data/uploads/plant/25/f3d3e43ff6ae4ba9b5bd40cb3a9696d5.jpg differ diff --git a/data/uploads/plant/3/24838a02358e4d5a82091ac1ac8eda47.jpg b/data/uploads/plant/3/24838a02358e4d5a82091ac1ac8eda47.jpg new file mode 100644 index 0000000..31cf774 Binary files /dev/null and b/data/uploads/plant/3/24838a02358e4d5a82091ac1ac8eda47.jpg differ diff --git a/data/uploads/plant/3/2a1ddf29df27476bbc2e7f0707b058f5.jpg b/data/uploads/plant/3/2a1ddf29df27476bbc2e7f0707b058f5.jpg new file mode 100644 index 0000000..73f1e14 Binary files /dev/null and b/data/uploads/plant/3/2a1ddf29df27476bbc2e7f0707b058f5.jpg differ diff --git a/data/uploads/plant/3/62832cb58fbf43d7bd648ce7e1b46a07.jpg b/data/uploads/plant/3/62832cb58fbf43d7bd648ce7e1b46a07.jpg new file mode 100644 index 0000000..b5c2933 Binary files /dev/null and b/data/uploads/plant/3/62832cb58fbf43d7bd648ce7e1b46a07.jpg differ diff --git a/data/uploads/plant/3/8720ad3ea6b740aca3e5a189c9cb99f7.jpg b/data/uploads/plant/3/8720ad3ea6b740aca3e5a189c9cb99f7.jpg new file mode 100644 index 0000000..c6b99e1 Binary files /dev/null and b/data/uploads/plant/3/8720ad3ea6b740aca3e5a189c9cb99f7.jpg differ diff --git a/data/uploads/plant/3/8cd71f2685b14d50af02e6334302487d.jpg b/data/uploads/plant/3/8cd71f2685b14d50af02e6334302487d.jpg new file mode 100644 index 0000000..192f0c7 Binary files /dev/null and b/data/uploads/plant/3/8cd71f2685b14d50af02e6334302487d.jpg differ diff --git a/data/uploads/plant/32/b994ce928f534eb7ada58c8ef859fa1a.jpg b/data/uploads/plant/32/b994ce928f534eb7ada58c8ef859fa1a.jpg new file mode 100644 index 0000000..8238ac5 Binary files /dev/null and b/data/uploads/plant/32/b994ce928f534eb7ada58c8ef859fa1a.jpg differ diff --git a/data/uploads/plant/4/04b3df9334774b46910581918c2be290.jpg b/data/uploads/plant/4/04b3df9334774b46910581918c2be290.jpg new file mode 100644 index 0000000..fa226f3 Binary files /dev/null and b/data/uploads/plant/4/04b3df9334774b46910581918c2be290.jpg differ diff --git a/data/uploads/plant/4/55d1cc2c83c149e08c0c87d8e24e771c.jpg b/data/uploads/plant/4/55d1cc2c83c149e08c0c87d8e24e771c.jpg new file mode 100644 index 0000000..4abf679 Binary files /dev/null and b/data/uploads/plant/4/55d1cc2c83c149e08c0c87d8e24e771c.jpg differ diff --git a/data/uploads/plant/4/f72e1805fc3145dbbc175e4107b48a0e.jpg b/data/uploads/plant/4/f72e1805fc3145dbbc175e4107b48a0e.jpg new file mode 100644 index 0000000..281fa77 Binary files /dev/null and b/data/uploads/plant/4/f72e1805fc3145dbbc175e4107b48a0e.jpg differ diff --git a/data/uploads/plant/4/fae348fedb4d4d19a5a49cce1e1a272b.jpg b/data/uploads/plant/4/fae348fedb4d4d19a5a49cce1e1a272b.jpg new file mode 100644 index 0000000..a2b5a52 Binary files /dev/null and b/data/uploads/plant/4/fae348fedb4d4d19a5a49cce1e1a272b.jpg differ diff --git a/data/uploads/plant/47/8b5668c0726a40258f4d95e969f4d5cb.jpg b/data/uploads/plant/47/8b5668c0726a40258f4d95e969f4d5cb.jpg new file mode 100644 index 0000000..c27b4ea Binary files /dev/null and b/data/uploads/plant/47/8b5668c0726a40258f4d95e969f4d5cb.jpg differ diff --git a/data/uploads/plant/48/a15842a2fa0b49a9aee5aa0d69c41f52.jpg b/data/uploads/plant/48/a15842a2fa0b49a9aee5aa0d69c41f52.jpg new file mode 100644 index 0000000..5fe54c4 Binary files /dev/null and b/data/uploads/plant/48/a15842a2fa0b49a9aee5aa0d69c41f52.jpg differ diff --git a/data/uploads/plant/49/2f77a8c6839146888191bba872ac6cba.jpg b/data/uploads/plant/49/2f77a8c6839146888191bba872ac6cba.jpg new file mode 100644 index 0000000..9f0f68e Binary files /dev/null and b/data/uploads/plant/49/2f77a8c6839146888191bba872ac6cba.jpg differ diff --git a/data/uploads/plant/49/371a4f74f9834d4c8b7d5c9ae59285c4.jpg b/data/uploads/plant/49/371a4f74f9834d4c8b7d5c9ae59285c4.jpg new file mode 100644 index 0000000..278eec0 Binary files /dev/null and b/data/uploads/plant/49/371a4f74f9834d4c8b7d5c9ae59285c4.jpg differ diff --git a/data/uploads/plant/49/3dbdaacc670e468c81a3986a71a54bfb.jpg b/data/uploads/plant/49/3dbdaacc670e468c81a3986a71a54bfb.jpg new file mode 100644 index 0000000..37a845e Binary files /dev/null and b/data/uploads/plant/49/3dbdaacc670e468c81a3986a71a54bfb.jpg differ diff --git a/data/uploads/plant/49/93161b3a5e8b45df912a8cd97b5df76f.jpg b/data/uploads/plant/49/93161b3a5e8b45df912a8cd97b5df76f.jpg new file mode 100644 index 0000000..2c40820 Binary files /dev/null and b/data/uploads/plant/49/93161b3a5e8b45df912a8cd97b5df76f.jpg differ diff --git a/data/uploads/plant/49/d2757ab690104448a43ee0c66fc412af.jpg b/data/uploads/plant/49/d2757ab690104448a43ee0c66fc412af.jpg new file mode 100644 index 0000000..613fbef Binary files /dev/null and b/data/uploads/plant/49/d2757ab690104448a43ee0c66fc412af.jpg differ diff --git a/data/uploads/plant/5/65d737e022624395b99feae93a58053a.jpg b/data/uploads/plant/5/65d737e022624395b99feae93a58053a.jpg new file mode 100644 index 0000000..4624a13 Binary files /dev/null and b/data/uploads/plant/5/65d737e022624395b99feae93a58053a.jpg differ diff --git a/data/uploads/plant/5/7fb28607505d433d9adef7c718f5d529.jpg b/data/uploads/plant/5/7fb28607505d433d9adef7c718f5d529.jpg new file mode 100644 index 0000000..e2caf1d Binary files /dev/null and b/data/uploads/plant/5/7fb28607505d433d9adef7c718f5d529.jpg differ diff --git a/data/uploads/plant/50/19f549089f624ddda604bde215036876.jpg b/data/uploads/plant/50/19f549089f624ddda604bde215036876.jpg new file mode 100644 index 0000000..95917e1 Binary files /dev/null and b/data/uploads/plant/50/19f549089f624ddda604bde215036876.jpg differ diff --git a/data/uploads/plant/50/3a0736b7cb6d4e91b87201992e744af9.jpg b/data/uploads/plant/50/3a0736b7cb6d4e91b87201992e744af9.jpg new file mode 100644 index 0000000..c4f0025 Binary files /dev/null and b/data/uploads/plant/50/3a0736b7cb6d4e91b87201992e744af9.jpg differ diff --git a/data/uploads/plant/50/4c8bee89789745d29ef215d7aa20df55.jpg b/data/uploads/plant/50/4c8bee89789745d29ef215d7aa20df55.jpg new file mode 100644 index 0000000..abb4517 Binary files /dev/null and b/data/uploads/plant/50/4c8bee89789745d29ef215d7aa20df55.jpg differ diff --git a/data/uploads/plant/50/5a564cfc1af941ffb97a3bb5c02b9e78.jpg b/data/uploads/plant/50/5a564cfc1af941ffb97a3bb5c02b9e78.jpg new file mode 100644 index 0000000..83606f8 Binary files /dev/null and b/data/uploads/plant/50/5a564cfc1af941ffb97a3bb5c02b9e78.jpg differ diff --git a/data/uploads/plant/50/785607129bde4b4fba2db48c8d4f53c7.jpg b/data/uploads/plant/50/785607129bde4b4fba2db48c8d4f53c7.jpg new file mode 100644 index 0000000..8623a5b Binary files /dev/null and b/data/uploads/plant/50/785607129bde4b4fba2db48c8d4f53c7.jpg differ diff --git a/data/uploads/plant/50/86180954be6044179d068140a5995fdf.jpg b/data/uploads/plant/50/86180954be6044179d068140a5995fdf.jpg new file mode 100644 index 0000000..d10fdef Binary files /dev/null and b/data/uploads/plant/50/86180954be6044179d068140a5995fdf.jpg differ diff --git a/data/uploads/plant/50/ac89dc2797f94f9ca0ac72db3e57a9e7.jpg b/data/uploads/plant/50/ac89dc2797f94f9ca0ac72db3e57a9e7.jpg new file mode 100644 index 0000000..46bc38a Binary files /dev/null and b/data/uploads/plant/50/ac89dc2797f94f9ca0ac72db3e57a9e7.jpg differ diff --git a/data/uploads/plant/50/f0167e573bac4ce8b1aeef9bf3ee31e8.jpg b/data/uploads/plant/50/f0167e573bac4ce8b1aeef9bf3ee31e8.jpg new file mode 100644 index 0000000..e686426 Binary files /dev/null and b/data/uploads/plant/50/f0167e573bac4ce8b1aeef9bf3ee31e8.jpg differ diff --git a/data/uploads/plant/50/ff1fb2ccfeda47a2a108d41b960afca0.jpg b/data/uploads/plant/50/ff1fb2ccfeda47a2a108d41b960afca0.jpg new file mode 100644 index 0000000..e462b18 Binary files /dev/null and b/data/uploads/plant/50/ff1fb2ccfeda47a2a108d41b960afca0.jpg differ diff --git a/data/uploads/plant/51/0c65a93f23f84c5d9f9bd1f01eb8e48b.jpg b/data/uploads/plant/51/0c65a93f23f84c5d9f9bd1f01eb8e48b.jpg new file mode 100644 index 0000000..c88e515 Binary files /dev/null and b/data/uploads/plant/51/0c65a93f23f84c5d9f9bd1f01eb8e48b.jpg differ diff --git a/data/uploads/plant/51/1d42df101e674f38b1bca16c44d390c5.jpg b/data/uploads/plant/51/1d42df101e674f38b1bca16c44d390c5.jpg new file mode 100644 index 0000000..1cf93eb Binary files /dev/null and b/data/uploads/plant/51/1d42df101e674f38b1bca16c44d390c5.jpg differ diff --git a/data/uploads/plant/51/9c0319acea7b4f9e946cffc98464d715.jpg b/data/uploads/plant/51/9c0319acea7b4f9e946cffc98464d715.jpg new file mode 100644 index 0000000..85fd37d Binary files /dev/null and b/data/uploads/plant/51/9c0319acea7b4f9e946cffc98464d715.jpg differ diff --git a/data/uploads/plant/51/ffef2b66f3db4a0292011d75f354b571.jpg b/data/uploads/plant/51/ffef2b66f3db4a0292011d75f354b571.jpg new file mode 100644 index 0000000..95da01f Binary files /dev/null and b/data/uploads/plant/51/ffef2b66f3db4a0292011d75f354b571.jpg differ diff --git a/data/uploads/plant/52/11e6e3dddef04758bfa77f08dad1c3bf.jpg b/data/uploads/plant/52/11e6e3dddef04758bfa77f08dad1c3bf.jpg new file mode 100644 index 0000000..e606777 Binary files /dev/null and b/data/uploads/plant/52/11e6e3dddef04758bfa77f08dad1c3bf.jpg differ diff --git a/data/uploads/plant/52/4d60f49e34bc401bb7d06dc5433244e1.jpg b/data/uploads/plant/52/4d60f49e34bc401bb7d06dc5433244e1.jpg new file mode 100644 index 0000000..f29539e Binary files /dev/null and b/data/uploads/plant/52/4d60f49e34bc401bb7d06dc5433244e1.jpg differ diff --git a/data/uploads/plant/52/511baa68242c47599a0a5c278eaf0d57.jpg b/data/uploads/plant/52/511baa68242c47599a0a5c278eaf0d57.jpg new file mode 100644 index 0000000..48df888 Binary files /dev/null and b/data/uploads/plant/52/511baa68242c47599a0a5c278eaf0d57.jpg differ diff --git a/data/uploads/plant/52/5ee26eae723a4ac1bfa8dae787b27da0.jpg b/data/uploads/plant/52/5ee26eae723a4ac1bfa8dae787b27da0.jpg new file mode 100644 index 0000000..eb570ac Binary files /dev/null and b/data/uploads/plant/52/5ee26eae723a4ac1bfa8dae787b27da0.jpg differ diff --git a/data/uploads/plant/52/60e92952108b41f5a59ca5474adae85d.jpg b/data/uploads/plant/52/60e92952108b41f5a59ca5474adae85d.jpg new file mode 100644 index 0000000..1709f33 Binary files /dev/null and b/data/uploads/plant/52/60e92952108b41f5a59ca5474adae85d.jpg differ diff --git a/data/uploads/plant/52/c12d0ad63a20468182e9d38cb570301b.jpg b/data/uploads/plant/52/c12d0ad63a20468182e9d38cb570301b.jpg new file mode 100644 index 0000000..a80f322 Binary files /dev/null and b/data/uploads/plant/52/c12d0ad63a20468182e9d38cb570301b.jpg differ diff --git a/data/uploads/plant/52/ff1403a15dd44714aa12e4404f7503a6.jpg b/data/uploads/plant/52/ff1403a15dd44714aa12e4404f7503a6.jpg new file mode 100644 index 0000000..23a6c39 Binary files /dev/null and b/data/uploads/plant/52/ff1403a15dd44714aa12e4404f7503a6.jpg differ diff --git a/data/uploads/plant/53/50b22cbfacf740d4a808aa5801ab3211.jpg b/data/uploads/plant/53/50b22cbfacf740d4a808aa5801ab3211.jpg new file mode 100644 index 0000000..56966fc Binary files /dev/null and b/data/uploads/plant/53/50b22cbfacf740d4a808aa5801ab3211.jpg differ diff --git a/data/uploads/plant/53/78dffb287cef4f1685bf78f64c5d9617.jpg b/data/uploads/plant/53/78dffb287cef4f1685bf78f64c5d9617.jpg new file mode 100644 index 0000000..9db7e2e Binary files /dev/null and b/data/uploads/plant/53/78dffb287cef4f1685bf78f64c5d9617.jpg differ diff --git a/data/uploads/plant/53/8bd84b30c76840c29a3d1928e2d88d5a.jpg b/data/uploads/plant/53/8bd84b30c76840c29a3d1928e2d88d5a.jpg new file mode 100644 index 0000000..33f3df1 Binary files /dev/null and b/data/uploads/plant/53/8bd84b30c76840c29a3d1928e2d88d5a.jpg differ diff --git a/data/uploads/plant/53/94a976366d364e56bba640ce7a09b580.jpg b/data/uploads/plant/53/94a976366d364e56bba640ce7a09b580.jpg new file mode 100644 index 0000000..479b5cd Binary files /dev/null and b/data/uploads/plant/53/94a976366d364e56bba640ce7a09b580.jpg differ diff --git a/data/uploads/plant/53/f7a449d6d1b747a284c9500f30e7a125.jpg b/data/uploads/plant/53/f7a449d6d1b747a284c9500f30e7a125.jpg new file mode 100644 index 0000000..3449d1f Binary files /dev/null and b/data/uploads/plant/53/f7a449d6d1b747a284c9500f30e7a125.jpg differ diff --git a/data/uploads/plant/54/0bd27f7cfa6e4f988f3c19b83bf9947b.jpg b/data/uploads/plant/54/0bd27f7cfa6e4f988f3c19b83bf9947b.jpg new file mode 100644 index 0000000..52a5536 Binary files /dev/null and b/data/uploads/plant/54/0bd27f7cfa6e4f988f3c19b83bf9947b.jpg differ diff --git a/data/uploads/plant/54/18af2f03208544e3aa3ee59b23471c29.jpg b/data/uploads/plant/54/18af2f03208544e3aa3ee59b23471c29.jpg new file mode 100644 index 0000000..40c624a Binary files /dev/null and b/data/uploads/plant/54/18af2f03208544e3aa3ee59b23471c29.jpg differ diff --git a/data/uploads/plant/54/2720802e481849ceb5b4143638b2c37e.jpg b/data/uploads/plant/54/2720802e481849ceb5b4143638b2c37e.jpg new file mode 100644 index 0000000..8a6e4d0 Binary files /dev/null and b/data/uploads/plant/54/2720802e481849ceb5b4143638b2c37e.jpg differ diff --git a/data/uploads/plant/54/315d24fafaf641f89d018bb516bc61a0.jpg b/data/uploads/plant/54/315d24fafaf641f89d018bb516bc61a0.jpg new file mode 100644 index 0000000..7b66e1a Binary files /dev/null and b/data/uploads/plant/54/315d24fafaf641f89d018bb516bc61a0.jpg differ diff --git a/data/uploads/plant/54/6080e26e89e643499808b0f1c59ac592.jpg b/data/uploads/plant/54/6080e26e89e643499808b0f1c59ac592.jpg new file mode 100644 index 0000000..1331d5b Binary files /dev/null and b/data/uploads/plant/54/6080e26e89e643499808b0f1c59ac592.jpg differ diff --git a/data/uploads/plant/54/b4ef2b9be18448efbda264e84e5e0982.jpg b/data/uploads/plant/54/b4ef2b9be18448efbda264e84e5e0982.jpg new file mode 100644 index 0000000..91cffaa Binary files /dev/null and b/data/uploads/plant/54/b4ef2b9be18448efbda264e84e5e0982.jpg differ diff --git a/data/uploads/plant/54/c1896c3e3b4d44db8d8b490339922e33.jpg b/data/uploads/plant/54/c1896c3e3b4d44db8d8b490339922e33.jpg new file mode 100644 index 0000000..5ce7934 Binary files /dev/null and b/data/uploads/plant/54/c1896c3e3b4d44db8d8b490339922e33.jpg differ diff --git a/data/uploads/plant/55/194192b0573e4280a7e09b9d36c460f9.jpg b/data/uploads/plant/55/194192b0573e4280a7e09b9d36c460f9.jpg new file mode 100644 index 0000000..513d9b3 Binary files /dev/null and b/data/uploads/plant/55/194192b0573e4280a7e09b9d36c460f9.jpg differ diff --git a/data/uploads/plant/55/1b6e65e4a2bb4ea5a6e392483d95a4eb.jpg b/data/uploads/plant/55/1b6e65e4a2bb4ea5a6e392483d95a4eb.jpg new file mode 100644 index 0000000..eb5d9cf Binary files /dev/null and b/data/uploads/plant/55/1b6e65e4a2bb4ea5a6e392483d95a4eb.jpg differ diff --git a/data/uploads/plant/55/250ef49b64934000ad1fefeea67c8c7e.jpg b/data/uploads/plant/55/250ef49b64934000ad1fefeea67c8c7e.jpg new file mode 100644 index 0000000..2520e11 Binary files /dev/null and b/data/uploads/plant/55/250ef49b64934000ad1fefeea67c8c7e.jpg differ diff --git a/data/uploads/plant/55/27a9b7b071354a0098ff51fa0f333efb.jpg b/data/uploads/plant/55/27a9b7b071354a0098ff51fa0f333efb.jpg new file mode 100644 index 0000000..d585f20 Binary files /dev/null and b/data/uploads/plant/55/27a9b7b071354a0098ff51fa0f333efb.jpg differ diff --git a/data/uploads/plant/55/31ba54287b0a40198dcb80e4c0e37c00.jpg b/data/uploads/plant/55/31ba54287b0a40198dcb80e4c0e37c00.jpg new file mode 100644 index 0000000..32cbb0d Binary files /dev/null and b/data/uploads/plant/55/31ba54287b0a40198dcb80e4c0e37c00.jpg differ diff --git a/data/uploads/plant/55/3b9a5e21bc2642549711a45e17ee6b91.jpg b/data/uploads/plant/55/3b9a5e21bc2642549711a45e17ee6b91.jpg new file mode 100644 index 0000000..4073fa9 Binary files /dev/null and b/data/uploads/plant/55/3b9a5e21bc2642549711a45e17ee6b91.jpg differ diff --git a/data/uploads/plant/55/3ce43f9a88b94dacb9c7da6c0ff21f13.jpg b/data/uploads/plant/55/3ce43f9a88b94dacb9c7da6c0ff21f13.jpg new file mode 100644 index 0000000..d456da7 Binary files /dev/null and b/data/uploads/plant/55/3ce43f9a88b94dacb9c7da6c0ff21f13.jpg differ diff --git a/data/uploads/plant/55/550d9c67c1a04827b68d6fbd2d5043ea.jpg b/data/uploads/plant/55/550d9c67c1a04827b68d6fbd2d5043ea.jpg new file mode 100644 index 0000000..2cd6522 Binary files /dev/null and b/data/uploads/plant/55/550d9c67c1a04827b68d6fbd2d5043ea.jpg differ diff --git a/data/uploads/plant/55/60b6e380e554484fb804b2b53fe388bb.jpg b/data/uploads/plant/55/60b6e380e554484fb804b2b53fe388bb.jpg new file mode 100644 index 0000000..c559e5c Binary files /dev/null and b/data/uploads/plant/55/60b6e380e554484fb804b2b53fe388bb.jpg differ diff --git a/data/uploads/plant/55/7477e7c73cc34ca7abc88bbb029c9d0a.jpg b/data/uploads/plant/55/7477e7c73cc34ca7abc88bbb029c9d0a.jpg new file mode 100644 index 0000000..0339c18 Binary files /dev/null and b/data/uploads/plant/55/7477e7c73cc34ca7abc88bbb029c9d0a.jpg differ diff --git a/data/uploads/plant/55/f74045a26ed44e93be8905d2b980eafd.jpg b/data/uploads/plant/55/f74045a26ed44e93be8905d2b980eafd.jpg new file mode 100644 index 0000000..26d1bf5 Binary files /dev/null and b/data/uploads/plant/55/f74045a26ed44e93be8905d2b980eafd.jpg differ diff --git a/data/uploads/plant/56/0829f90e927a4d2c9a908f2600d0b323.jpg b/data/uploads/plant/56/0829f90e927a4d2c9a908f2600d0b323.jpg new file mode 100644 index 0000000..8719d1e Binary files /dev/null and b/data/uploads/plant/56/0829f90e927a4d2c9a908f2600d0b323.jpg differ diff --git a/data/uploads/plant/56/870893fc10254afbb557f8afe6e4f647.jpg b/data/uploads/plant/56/870893fc10254afbb557f8afe6e4f647.jpg new file mode 100644 index 0000000..f1d755b Binary files /dev/null and b/data/uploads/plant/56/870893fc10254afbb557f8afe6e4f647.jpg differ diff --git a/data/uploads/plant/56/9a09e4582376410e85f54c29cd620717.jpg b/data/uploads/plant/56/9a09e4582376410e85f54c29cd620717.jpg new file mode 100644 index 0000000..a0f49dd Binary files /dev/null and b/data/uploads/plant/56/9a09e4582376410e85f54c29cd620717.jpg differ diff --git a/data/uploads/plant/56/ad6d098cad3d4df6abac1a6da7603771.jpg b/data/uploads/plant/56/ad6d098cad3d4df6abac1a6da7603771.jpg new file mode 100644 index 0000000..f4eab1e Binary files /dev/null and b/data/uploads/plant/56/ad6d098cad3d4df6abac1a6da7603771.jpg differ diff --git a/data/uploads/plant/56/d57e1ad3210b4b0380569ab848365b5c.jpg b/data/uploads/plant/56/d57e1ad3210b4b0380569ab848365b5c.jpg new file mode 100644 index 0000000..1abb733 Binary files /dev/null and b/data/uploads/plant/56/d57e1ad3210b4b0380569ab848365b5c.jpg differ diff --git a/data/uploads/plant/56/dfd42772c95943fe8790bfb6603f388c.jpg b/data/uploads/plant/56/dfd42772c95943fe8790bfb6603f388c.jpg new file mode 100644 index 0000000..f61a930 Binary files /dev/null and b/data/uploads/plant/56/dfd42772c95943fe8790bfb6603f388c.jpg differ diff --git a/data/uploads/plant/56/e3758475346843aabea3899caa57bc62.jpg b/data/uploads/plant/56/e3758475346843aabea3899caa57bc62.jpg new file mode 100644 index 0000000..02af693 Binary files /dev/null and b/data/uploads/plant/56/e3758475346843aabea3899caa57bc62.jpg differ diff --git a/data/uploads/plant/57/04d2380271c44539847e39b4a2c8cbc4.jpg b/data/uploads/plant/57/04d2380271c44539847e39b4a2c8cbc4.jpg new file mode 100644 index 0000000..7342d71 Binary files /dev/null and b/data/uploads/plant/57/04d2380271c44539847e39b4a2c8cbc4.jpg differ diff --git a/data/uploads/plant/57/61487448fe2349718fecf260288de405.jpg b/data/uploads/plant/57/61487448fe2349718fecf260288de405.jpg new file mode 100644 index 0000000..8a352b6 Binary files /dev/null and b/data/uploads/plant/57/61487448fe2349718fecf260288de405.jpg differ diff --git a/data/uploads/plant/57/79136a9b2ea440e4a2ba0f8cbc1c15de.jpg b/data/uploads/plant/57/79136a9b2ea440e4a2ba0f8cbc1c15de.jpg new file mode 100644 index 0000000..f91429c Binary files /dev/null and b/data/uploads/plant/57/79136a9b2ea440e4a2ba0f8cbc1c15de.jpg differ diff --git a/data/uploads/plant/57/836fa9e54ac24e538f5df8d54af24cc7.jpg b/data/uploads/plant/57/836fa9e54ac24e538f5df8d54af24cc7.jpg new file mode 100644 index 0000000..1cee527 Binary files /dev/null and b/data/uploads/plant/57/836fa9e54ac24e538f5df8d54af24cc7.jpg differ diff --git a/data/uploads/plant/57/cc7029dc57254e6c8a62a8f699c59f8d.jpg b/data/uploads/plant/57/cc7029dc57254e6c8a62a8f699c59f8d.jpg new file mode 100644 index 0000000..0779227 Binary files /dev/null and b/data/uploads/plant/57/cc7029dc57254e6c8a62a8f699c59f8d.jpg differ diff --git a/data/uploads/plant/57/e0b7923d661245fcb5212904da4a70ee.jpg b/data/uploads/plant/57/e0b7923d661245fcb5212904da4a70ee.jpg new file mode 100644 index 0000000..5a1f20e Binary files /dev/null and b/data/uploads/plant/57/e0b7923d661245fcb5212904da4a70ee.jpg differ diff --git a/data/uploads/plant/57/f55b773d9c704a95981abff660d83448.jpg b/data/uploads/plant/57/f55b773d9c704a95981abff660d83448.jpg new file mode 100644 index 0000000..e8a7dcd Binary files /dev/null and b/data/uploads/plant/57/f55b773d9c704a95981abff660d83448.jpg differ diff --git a/data/uploads/plant/57/faa9b217c8064fe5a3f4f5a55baae119.jpg b/data/uploads/plant/57/faa9b217c8064fe5a3f4f5a55baae119.jpg new file mode 100644 index 0000000..64d792f Binary files /dev/null and b/data/uploads/plant/57/faa9b217c8064fe5a3f4f5a55baae119.jpg differ diff --git a/data/uploads/plant/58/01992d705dfa4637b47235a596f7fad8.jpg b/data/uploads/plant/58/01992d705dfa4637b47235a596f7fad8.jpg new file mode 100644 index 0000000..6446b4b Binary files /dev/null and b/data/uploads/plant/58/01992d705dfa4637b47235a596f7fad8.jpg differ diff --git a/data/uploads/plant/58/0685ffda3c2d4e26ae0fd7683c24aa8e.jpg b/data/uploads/plant/58/0685ffda3c2d4e26ae0fd7683c24aa8e.jpg new file mode 100644 index 0000000..5a9dbaf Binary files /dev/null and b/data/uploads/plant/58/0685ffda3c2d4e26ae0fd7683c24aa8e.jpg differ diff --git a/data/uploads/plant/58/61b6491ff66847dc98f2d816184123ae.jpg b/data/uploads/plant/58/61b6491ff66847dc98f2d816184123ae.jpg new file mode 100644 index 0000000..4b8bf82 Binary files /dev/null and b/data/uploads/plant/58/61b6491ff66847dc98f2d816184123ae.jpg differ diff --git a/data/uploads/plant/58/c0dd2d683e064a12b8f96d55120fb182.jpg b/data/uploads/plant/58/c0dd2d683e064a12b8f96d55120fb182.jpg new file mode 100644 index 0000000..89c3968 Binary files /dev/null and b/data/uploads/plant/58/c0dd2d683e064a12b8f96d55120fb182.jpg differ diff --git a/data/uploads/plant/59/3276e29ad2054a3083654aaf824632ba.jpg b/data/uploads/plant/59/3276e29ad2054a3083654aaf824632ba.jpg new file mode 100644 index 0000000..5afa324 Binary files /dev/null and b/data/uploads/plant/59/3276e29ad2054a3083654aaf824632ba.jpg differ diff --git a/data/uploads/plant/59/fbe8dc55dabf4458a37cbbc3277a4b57.jpg b/data/uploads/plant/59/fbe8dc55dabf4458a37cbbc3277a4b57.jpg new file mode 100644 index 0000000..0b5e266 Binary files /dev/null and b/data/uploads/plant/59/fbe8dc55dabf4458a37cbbc3277a4b57.jpg differ diff --git a/data/uploads/plant/6/8fa428b8ae7247a09f38d09d46609e2d.jpg b/data/uploads/plant/6/8fa428b8ae7247a09f38d09d46609e2d.jpg new file mode 100644 index 0000000..399840e Binary files /dev/null and b/data/uploads/plant/6/8fa428b8ae7247a09f38d09d46609e2d.jpg differ diff --git a/data/uploads/plant/60/1b19f967903e4c85b1dbce02f1f1c01f.jpg b/data/uploads/plant/60/1b19f967903e4c85b1dbce02f1f1c01f.jpg new file mode 100644 index 0000000..4b869a6 Binary files /dev/null and b/data/uploads/plant/60/1b19f967903e4c85b1dbce02f1f1c01f.jpg differ diff --git a/data/uploads/plant/60/48302a61e6c441c3a9426eace86fc4cf.jpg b/data/uploads/plant/60/48302a61e6c441c3a9426eace86fc4cf.jpg new file mode 100644 index 0000000..d921378 Binary files /dev/null and b/data/uploads/plant/60/48302a61e6c441c3a9426eace86fc4cf.jpg differ diff --git a/data/uploads/plant/60/c595b7bb9974479c9491f522ab2d6b94.jpg b/data/uploads/plant/60/c595b7bb9974479c9491f522ab2d6b94.jpg new file mode 100644 index 0000000..fc3fcb9 Binary files /dev/null and b/data/uploads/plant/60/c595b7bb9974479c9491f522ab2d6b94.jpg differ diff --git a/data/uploads/plant/60/d6b6a8d9c06b4439a4d96e3609f29ebb.jpg b/data/uploads/plant/60/d6b6a8d9c06b4439a4d96e3609f29ebb.jpg new file mode 100644 index 0000000..acee530 Binary files /dev/null and b/data/uploads/plant/60/d6b6a8d9c06b4439a4d96e3609f29ebb.jpg differ diff --git a/data/uploads/plant/61/523a645eb8c646f9842ab87cea2b61b7.jpg b/data/uploads/plant/61/523a645eb8c646f9842ab87cea2b61b7.jpg new file mode 100644 index 0000000..d0e488f Binary files /dev/null and b/data/uploads/plant/61/523a645eb8c646f9842ab87cea2b61b7.jpg differ diff --git a/data/uploads/plant/61/a762b13025bf4d00a62b0d122ccd4fbb.jpg b/data/uploads/plant/61/a762b13025bf4d00a62b0d122ccd4fbb.jpg new file mode 100644 index 0000000..27af95f Binary files /dev/null and b/data/uploads/plant/61/a762b13025bf4d00a62b0d122ccd4fbb.jpg differ diff --git a/data/uploads/plant/62/33ba6f94cc854377be23befad5cb39a6.jpg b/data/uploads/plant/62/33ba6f94cc854377be23befad5cb39a6.jpg new file mode 100644 index 0000000..f969da3 Binary files /dev/null and b/data/uploads/plant/62/33ba6f94cc854377be23befad5cb39a6.jpg differ diff --git a/data/uploads/plant/62/6beb8862469b4377917388ad48bd84f4.jpg b/data/uploads/plant/62/6beb8862469b4377917388ad48bd84f4.jpg new file mode 100644 index 0000000..ad00b81 Binary files /dev/null and b/data/uploads/plant/62/6beb8862469b4377917388ad48bd84f4.jpg differ diff --git a/data/uploads/plant/63/1c805ee8c2d647879ec637a98fa4edc5.jpg b/data/uploads/plant/63/1c805ee8c2d647879ec637a98fa4edc5.jpg new file mode 100644 index 0000000..cbaa54a Binary files /dev/null and b/data/uploads/plant/63/1c805ee8c2d647879ec637a98fa4edc5.jpg differ diff --git a/data/uploads/plant/63/999f7aab4b41409f9b8b4964bc767070.jpg b/data/uploads/plant/63/999f7aab4b41409f9b8b4964bc767070.jpg new file mode 100644 index 0000000..10ff2ac Binary files /dev/null and b/data/uploads/plant/63/999f7aab4b41409f9b8b4964bc767070.jpg differ diff --git a/data/uploads/plant/63/d1d6d1b6b0c1485ba097046d7125fea4.jpg b/data/uploads/plant/63/d1d6d1b6b0c1485ba097046d7125fea4.jpg new file mode 100644 index 0000000..2f38fd9 Binary files /dev/null and b/data/uploads/plant/63/d1d6d1b6b0c1485ba097046d7125fea4.jpg differ diff --git a/data/uploads/plant/63/eb78ab4cb16742d3a8d32c96c9da5052.jpg b/data/uploads/plant/63/eb78ab4cb16742d3a8d32c96c9da5052.jpg new file mode 100644 index 0000000..4935318 Binary files /dev/null and b/data/uploads/plant/63/eb78ab4cb16742d3a8d32c96c9da5052.jpg differ diff --git a/data/uploads/plant/64/0597cc3469a946d0a2a735919a16d0bf.jpg b/data/uploads/plant/64/0597cc3469a946d0a2a735919a16d0bf.jpg new file mode 100644 index 0000000..645d17b Binary files /dev/null and b/data/uploads/plant/64/0597cc3469a946d0a2a735919a16d0bf.jpg differ diff --git a/data/uploads/plant/64/2682fbc16d2b422989e9d286d6eb3f5b.jpg b/data/uploads/plant/64/2682fbc16d2b422989e9d286d6eb3f5b.jpg new file mode 100644 index 0000000..96e4a04 Binary files /dev/null and b/data/uploads/plant/64/2682fbc16d2b422989e9d286d6eb3f5b.jpg differ diff --git a/data/uploads/plant/64/a514c766b6544f9f9d7714496df8861f.jpg b/data/uploads/plant/64/a514c766b6544f9f9d7714496df8861f.jpg new file mode 100644 index 0000000..dc1431d Binary files /dev/null and b/data/uploads/plant/64/a514c766b6544f9f9d7714496df8861f.jpg differ diff --git a/data/uploads/plant/64/cec29feb56c0448c9c06d7d6211e9fad.jpg b/data/uploads/plant/64/cec29feb56c0448c9c06d7d6211e9fad.jpg new file mode 100644 index 0000000..f67164c Binary files /dev/null and b/data/uploads/plant/64/cec29feb56c0448c9c06d7d6211e9fad.jpg differ diff --git a/data/uploads/plant/65/92b3a6500fcd4763bd8328d192e9ec79.jpg b/data/uploads/plant/65/92b3a6500fcd4763bd8328d192e9ec79.jpg new file mode 100644 index 0000000..888eca7 Binary files /dev/null and b/data/uploads/plant/65/92b3a6500fcd4763bd8328d192e9ec79.jpg differ diff --git a/data/uploads/plant/65/9c326026ca3f43f68b3801ad575f6c98.jpg b/data/uploads/plant/65/9c326026ca3f43f68b3801ad575f6c98.jpg new file mode 100644 index 0000000..5d0ac0d Binary files /dev/null and b/data/uploads/plant/65/9c326026ca3f43f68b3801ad575f6c98.jpg differ diff --git a/data/uploads/plant/65/c8f4aa28ea6b45d88e27ba0a988080ab.jpg b/data/uploads/plant/65/c8f4aa28ea6b45d88e27ba0a988080ab.jpg new file mode 100644 index 0000000..528bea8 Binary files /dev/null and b/data/uploads/plant/65/c8f4aa28ea6b45d88e27ba0a988080ab.jpg differ diff --git a/data/uploads/plant/66/31f65be5caf34956ad5947dc95c3eb20.jpg b/data/uploads/plant/66/31f65be5caf34956ad5947dc95c3eb20.jpg new file mode 100644 index 0000000..f0ede63 Binary files /dev/null and b/data/uploads/plant/66/31f65be5caf34956ad5947dc95c3eb20.jpg differ diff --git a/data/uploads/plant/66/b1d774dad0aa42f59d64dacd757bb8a0.jpg b/data/uploads/plant/66/b1d774dad0aa42f59d64dacd757bb8a0.jpg new file mode 100644 index 0000000..97c8495 Binary files /dev/null and b/data/uploads/plant/66/b1d774dad0aa42f59d64dacd757bb8a0.jpg differ diff --git a/data/uploads/plant/67/3b0c89a83c0a4976a37b603d06f767a5.jpg b/data/uploads/plant/67/3b0c89a83c0a4976a37b603d06f767a5.jpg new file mode 100644 index 0000000..73766f3 Binary files /dev/null and b/data/uploads/plant/67/3b0c89a83c0a4976a37b603d06f767a5.jpg differ diff --git a/data/uploads/plant/67/7d7c3f8c817742f0a313cd127e761952.jpg b/data/uploads/plant/67/7d7c3f8c817742f0a313cd127e761952.jpg new file mode 100644 index 0000000..e0ae5ac Binary files /dev/null and b/data/uploads/plant/67/7d7c3f8c817742f0a313cd127e761952.jpg differ diff --git a/data/uploads/plant/67/a0c4b9593899435cbc60172f67d166b2.jpg b/data/uploads/plant/67/a0c4b9593899435cbc60172f67d166b2.jpg new file mode 100644 index 0000000..14b56e6 Binary files /dev/null and b/data/uploads/plant/67/a0c4b9593899435cbc60172f67d166b2.jpg differ diff --git a/data/uploads/plant/68/8fc33b7084ca4555aec2991927012709.jpg b/data/uploads/plant/68/8fc33b7084ca4555aec2991927012709.jpg new file mode 100644 index 0000000..cb442e2 Binary files /dev/null and b/data/uploads/plant/68/8fc33b7084ca4555aec2991927012709.jpg differ diff --git a/data/uploads/plant/68/d558477fa319470aa5834acfd0a5877d.jpg b/data/uploads/plant/68/d558477fa319470aa5834acfd0a5877d.jpg new file mode 100644 index 0000000..d85af3b Binary files /dev/null and b/data/uploads/plant/68/d558477fa319470aa5834acfd0a5877d.jpg differ diff --git a/data/uploads/plant/68/ed6a91ecbd0e490bb8a6808726d1280a.jpg b/data/uploads/plant/68/ed6a91ecbd0e490bb8a6808726d1280a.jpg new file mode 100644 index 0000000..caafd33 Binary files /dev/null and b/data/uploads/plant/68/ed6a91ecbd0e490bb8a6808726d1280a.jpg differ diff --git a/data/uploads/plant/68/efa53b3747a64cfdab029dde9b67a666.jpg b/data/uploads/plant/68/efa53b3747a64cfdab029dde9b67a666.jpg new file mode 100644 index 0000000..cd4d8b2 Binary files /dev/null and b/data/uploads/plant/68/efa53b3747a64cfdab029dde9b67a666.jpg differ diff --git a/data/uploads/plant/69/ba0671426de74a3ca5a401fb277e94ba.jpg b/data/uploads/plant/69/ba0671426de74a3ca5a401fb277e94ba.jpg new file mode 100644 index 0000000..6088517 Binary files /dev/null and b/data/uploads/plant/69/ba0671426de74a3ca5a401fb277e94ba.jpg differ diff --git a/data/uploads/plant/7/2b2c5c4ce5964615afc1902404a62c92.jpg b/data/uploads/plant/7/2b2c5c4ce5964615afc1902404a62c92.jpg new file mode 100644 index 0000000..ae00914 Binary files /dev/null and b/data/uploads/plant/7/2b2c5c4ce5964615afc1902404a62c92.jpg differ diff --git a/data/uploads/plant/7/95cd3c8d9df34d918f2e1af893c7bdd5.jpg b/data/uploads/plant/7/95cd3c8d9df34d918f2e1af893c7bdd5.jpg new file mode 100644 index 0000000..0ce477e Binary files /dev/null and b/data/uploads/plant/7/95cd3c8d9df34d918f2e1af893c7bdd5.jpg differ diff --git a/data/uploads/plant/70/4c6bfea4cbd54ff196db6d6b7bc6cd5c.jpg b/data/uploads/plant/70/4c6bfea4cbd54ff196db6d6b7bc6cd5c.jpg new file mode 100644 index 0000000..7f03936 Binary files /dev/null and b/data/uploads/plant/70/4c6bfea4cbd54ff196db6d6b7bc6cd5c.jpg differ diff --git a/data/uploads/plant/70/69079a2d5c794fc8b27416e9c3063cd8.jpg b/data/uploads/plant/70/69079a2d5c794fc8b27416e9c3063cd8.jpg new file mode 100644 index 0000000..29fe1f4 Binary files /dev/null and b/data/uploads/plant/70/69079a2d5c794fc8b27416e9c3063cd8.jpg differ diff --git a/data/uploads/plant/71/9d98c395620345b8a45e8b204d397e24.jpg b/data/uploads/plant/71/9d98c395620345b8a45e8b204d397e24.jpg new file mode 100644 index 0000000..5a57f31 Binary files /dev/null and b/data/uploads/plant/71/9d98c395620345b8a45e8b204d397e24.jpg differ diff --git a/data/uploads/plant/71/e6ae10a9914a4ac987affc826eb0d625.jpg b/data/uploads/plant/71/e6ae10a9914a4ac987affc826eb0d625.jpg new file mode 100644 index 0000000..e542b7f Binary files /dev/null and b/data/uploads/plant/71/e6ae10a9914a4ac987affc826eb0d625.jpg differ diff --git a/data/uploads/plant/72/04fb76792b92488ea70a99ba9380914b.jpg b/data/uploads/plant/72/04fb76792b92488ea70a99ba9380914b.jpg new file mode 100644 index 0000000..bd12135 Binary files /dev/null and b/data/uploads/plant/72/04fb76792b92488ea70a99ba9380914b.jpg differ diff --git a/data/uploads/plant/72/68489615f6814a8d9c561f963c1b4c4a.jpg b/data/uploads/plant/72/68489615f6814a8d9c561f963c1b4c4a.jpg new file mode 100644 index 0000000..bb6121b Binary files /dev/null and b/data/uploads/plant/72/68489615f6814a8d9c561f963c1b4c4a.jpg differ diff --git a/data/uploads/plant/72/8a790f60ada44862a1d8eae89b7a1383.jpg b/data/uploads/plant/72/8a790f60ada44862a1d8eae89b7a1383.jpg new file mode 100644 index 0000000..3364b72 Binary files /dev/null and b/data/uploads/plant/72/8a790f60ada44862a1d8eae89b7a1383.jpg differ diff --git a/data/uploads/plant/72/efee94adbffd44a3b75dc1270d8d9537.jpg b/data/uploads/plant/72/efee94adbffd44a3b75dc1270d8d9537.jpg new file mode 100644 index 0000000..b83914e Binary files /dev/null and b/data/uploads/plant/72/efee94adbffd44a3b75dc1270d8d9537.jpg differ diff --git a/data/uploads/plant/73/aacc57809c0f4701ad8db34d287d1c7e.jpg b/data/uploads/plant/73/aacc57809c0f4701ad8db34d287d1c7e.jpg new file mode 100644 index 0000000..74f4adf Binary files /dev/null and b/data/uploads/plant/73/aacc57809c0f4701ad8db34d287d1c7e.jpg differ diff --git a/data/uploads/plant/73/b4618b394d1a4ec78bfd6083b1db566f.jpg b/data/uploads/plant/73/b4618b394d1a4ec78bfd6083b1db566f.jpg new file mode 100644 index 0000000..5c71f99 Binary files /dev/null and b/data/uploads/plant/73/b4618b394d1a4ec78bfd6083b1db566f.jpg differ diff --git a/data/uploads/plant/74/343709ccb2464068a034bf574117c50e.jpg b/data/uploads/plant/74/343709ccb2464068a034bf574117c50e.jpg new file mode 100644 index 0000000..fff898c Binary files /dev/null and b/data/uploads/plant/74/343709ccb2464068a034bf574117c50e.jpg differ diff --git a/data/uploads/plant/74/37999148e9fe45fd99a2e9eed0041ce6.jpg b/data/uploads/plant/74/37999148e9fe45fd99a2e9eed0041ce6.jpg new file mode 100644 index 0000000..f2229dd Binary files /dev/null and b/data/uploads/plant/74/37999148e9fe45fd99a2e9eed0041ce6.jpg differ diff --git a/data/uploads/plant/74/3a750424511c4301b8c0e89c43b1034f.jpg b/data/uploads/plant/74/3a750424511c4301b8c0e89c43b1034f.jpg new file mode 100644 index 0000000..e5c9f53 Binary files /dev/null and b/data/uploads/plant/74/3a750424511c4301b8c0e89c43b1034f.jpg differ diff --git a/data/uploads/plant/74/9ab4dee6d3fb4cb09b4cce6823d5bdea.jpg b/data/uploads/plant/74/9ab4dee6d3fb4cb09b4cce6823d5bdea.jpg new file mode 100644 index 0000000..84220aa Binary files /dev/null and b/data/uploads/plant/74/9ab4dee6d3fb4cb09b4cce6823d5bdea.jpg differ diff --git a/data/uploads/plant/74/b2c6e135bb4d45aea601d129d7235068.jpg b/data/uploads/plant/74/b2c6e135bb4d45aea601d129d7235068.jpg new file mode 100644 index 0000000..719a2ec Binary files /dev/null and b/data/uploads/plant/74/b2c6e135bb4d45aea601d129d7235068.jpg differ diff --git a/data/uploads/plant/75/08fc524e71ef4a1e8717a8b0f64ef35f.jpg b/data/uploads/plant/75/08fc524e71ef4a1e8717a8b0f64ef35f.jpg new file mode 100644 index 0000000..0c045ab Binary files /dev/null and b/data/uploads/plant/75/08fc524e71ef4a1e8717a8b0f64ef35f.jpg differ diff --git a/data/uploads/plant/75/c8d33660e3fc4a47addd704f8e448576.jpg b/data/uploads/plant/75/c8d33660e3fc4a47addd704f8e448576.jpg new file mode 100644 index 0000000..c3012b2 Binary files /dev/null and b/data/uploads/plant/75/c8d33660e3fc4a47addd704f8e448576.jpg differ diff --git a/data/uploads/plant/75/d9a271b6f67a459782a5a531d7eb0267.jpg b/data/uploads/plant/75/d9a271b6f67a459782a5a531d7eb0267.jpg new file mode 100644 index 0000000..71b0c2b Binary files /dev/null and b/data/uploads/plant/75/d9a271b6f67a459782a5a531d7eb0267.jpg differ diff --git a/data/uploads/plant/76/2aa1ed3651494f76a20433264cdb66ec.jpg b/data/uploads/plant/76/2aa1ed3651494f76a20433264cdb66ec.jpg new file mode 100644 index 0000000..01f9668 Binary files /dev/null and b/data/uploads/plant/76/2aa1ed3651494f76a20433264cdb66ec.jpg differ diff --git a/data/uploads/plant/76/3364110fbc8745a7a312316ee15d11c5.jpg b/data/uploads/plant/76/3364110fbc8745a7a312316ee15d11c5.jpg new file mode 100644 index 0000000..05c0355 Binary files /dev/null and b/data/uploads/plant/76/3364110fbc8745a7a312316ee15d11c5.jpg differ diff --git a/data/uploads/plant/76/399d9ebcdca4419c8a00a8ed964006ac.jpg b/data/uploads/plant/76/399d9ebcdca4419c8a00a8ed964006ac.jpg new file mode 100644 index 0000000..398f3fd Binary files /dev/null and b/data/uploads/plant/76/399d9ebcdca4419c8a00a8ed964006ac.jpg differ diff --git a/data/uploads/plant/76/65cc32ae53164dc8a22b6354978c2725.jpg b/data/uploads/plant/76/65cc32ae53164dc8a22b6354978c2725.jpg new file mode 100644 index 0000000..769fd4b Binary files /dev/null and b/data/uploads/plant/76/65cc32ae53164dc8a22b6354978c2725.jpg differ diff --git a/data/uploads/plant/76/6875bef3f5624bf7a8d5f12e680c148a.jpg b/data/uploads/plant/76/6875bef3f5624bf7a8d5f12e680c148a.jpg new file mode 100644 index 0000000..6b98c04 Binary files /dev/null and b/data/uploads/plant/76/6875bef3f5624bf7a8d5f12e680c148a.jpg differ diff --git a/data/uploads/plant/76/7268aa4ee02e4ddca5a3e8d03d759dbe.jpg b/data/uploads/plant/76/7268aa4ee02e4ddca5a3e8d03d759dbe.jpg new file mode 100644 index 0000000..4690cde Binary files /dev/null and b/data/uploads/plant/76/7268aa4ee02e4ddca5a3e8d03d759dbe.jpg differ diff --git a/data/uploads/plant/76/a524a93b062d4d029570632314419908.jpg b/data/uploads/plant/76/a524a93b062d4d029570632314419908.jpg new file mode 100644 index 0000000..3bc494c Binary files /dev/null and b/data/uploads/plant/76/a524a93b062d4d029570632314419908.jpg differ diff --git a/data/uploads/plant/76/b9a9b81228cf41b381172fae09ae65f7.jpg b/data/uploads/plant/76/b9a9b81228cf41b381172fae09ae65f7.jpg new file mode 100644 index 0000000..6e6ccd6 Binary files /dev/null and b/data/uploads/plant/76/b9a9b81228cf41b381172fae09ae65f7.jpg differ diff --git a/data/uploads/plant/77/4c6d4acfa7ce41a0b72626cc6e492e8a.jpg b/data/uploads/plant/77/4c6d4acfa7ce41a0b72626cc6e492e8a.jpg new file mode 100644 index 0000000..f82e131 Binary files /dev/null and b/data/uploads/plant/77/4c6d4acfa7ce41a0b72626cc6e492e8a.jpg differ diff --git a/data/uploads/plant/77/82825d9f88d64afdbad94e079e01e552.jpg b/data/uploads/plant/77/82825d9f88d64afdbad94e079e01e552.jpg new file mode 100644 index 0000000..fcfd8cf Binary files /dev/null and b/data/uploads/plant/77/82825d9f88d64afdbad94e079e01e552.jpg differ diff --git a/data/uploads/plant/77/a175d344194649dfaf49f3fa0b688072.jpg b/data/uploads/plant/77/a175d344194649dfaf49f3fa0b688072.jpg new file mode 100644 index 0000000..126445e Binary files /dev/null and b/data/uploads/plant/77/a175d344194649dfaf49f3fa0b688072.jpg differ diff --git a/data/uploads/plant/77/a99fbb2aaf5a49b9befd4ac0f3fd98a1.jpg b/data/uploads/plant/77/a99fbb2aaf5a49b9befd4ac0f3fd98a1.jpg new file mode 100644 index 0000000..f2f4140 Binary files /dev/null and b/data/uploads/plant/77/a99fbb2aaf5a49b9befd4ac0f3fd98a1.jpg differ diff --git a/data/uploads/plant/77/cfb89bee9bcc4c22b12142b93b75a30a.jpg b/data/uploads/plant/77/cfb89bee9bcc4c22b12142b93b75a30a.jpg new file mode 100644 index 0000000..e86688a Binary files /dev/null and b/data/uploads/plant/77/cfb89bee9bcc4c22b12142b93b75a30a.jpg differ diff --git a/data/uploads/plant/77/e9e72a48592b475d8ca278a8430a0c07.jpg b/data/uploads/plant/77/e9e72a48592b475d8ca278a8430a0c07.jpg new file mode 100644 index 0000000..4351e52 Binary files /dev/null and b/data/uploads/plant/77/e9e72a48592b475d8ca278a8430a0c07.jpg differ diff --git a/data/uploads/plant/78/0bfc5601d28f4190a95d594d962a8221.jpg b/data/uploads/plant/78/0bfc5601d28f4190a95d594d962a8221.jpg new file mode 100644 index 0000000..fe5102a Binary files /dev/null and b/data/uploads/plant/78/0bfc5601d28f4190a95d594d962a8221.jpg differ diff --git a/data/uploads/plant/78/144def61e72448e287dd36eb3ca140d6.jpg b/data/uploads/plant/78/144def61e72448e287dd36eb3ca140d6.jpg new file mode 100644 index 0000000..ef6953c Binary files /dev/null and b/data/uploads/plant/78/144def61e72448e287dd36eb3ca140d6.jpg differ diff --git a/data/uploads/plant/78/190cdde575f64195aa0a7abdb3ab4a97.jpg b/data/uploads/plant/78/190cdde575f64195aa0a7abdb3ab4a97.jpg new file mode 100644 index 0000000..35346c7 Binary files /dev/null and b/data/uploads/plant/78/190cdde575f64195aa0a7abdb3ab4a97.jpg differ diff --git a/data/uploads/plant/78/273d12f2710c4ed58e19298aa0788e3c.jpg b/data/uploads/plant/78/273d12f2710c4ed58e19298aa0788e3c.jpg new file mode 100644 index 0000000..fe95a3c Binary files /dev/null and b/data/uploads/plant/78/273d12f2710c4ed58e19298aa0788e3c.jpg differ diff --git a/data/uploads/plant/78/2d380ecf076c4b848a6a36aa7beb47ec.jpg b/data/uploads/plant/78/2d380ecf076c4b848a6a36aa7beb47ec.jpg new file mode 100644 index 0000000..7c3b10d Binary files /dev/null and b/data/uploads/plant/78/2d380ecf076c4b848a6a36aa7beb47ec.jpg differ diff --git a/data/uploads/plant/78/2f68a034b6cc42ea8abc336ece226b85.jpg b/data/uploads/plant/78/2f68a034b6cc42ea8abc336ece226b85.jpg new file mode 100644 index 0000000..38cdccd Binary files /dev/null and b/data/uploads/plant/78/2f68a034b6cc42ea8abc336ece226b85.jpg differ diff --git a/data/uploads/plant/78/40934a81a5b14608a5d790089cae0f18.jpg b/data/uploads/plant/78/40934a81a5b14608a5d790089cae0f18.jpg new file mode 100644 index 0000000..5d2a553 Binary files /dev/null and b/data/uploads/plant/78/40934a81a5b14608a5d790089cae0f18.jpg differ diff --git a/data/uploads/plant/78/45b9aef1e3f04837889e6c05049d89c9.jpg b/data/uploads/plant/78/45b9aef1e3f04837889e6c05049d89c9.jpg new file mode 100644 index 0000000..adf3edb Binary files /dev/null and b/data/uploads/plant/78/45b9aef1e3f04837889e6c05049d89c9.jpg differ diff --git a/data/uploads/plant/78/93cd9458eb004e098ba31a6a0cfafcbd.jpg b/data/uploads/plant/78/93cd9458eb004e098ba31a6a0cfafcbd.jpg new file mode 100644 index 0000000..48af572 Binary files /dev/null and b/data/uploads/plant/78/93cd9458eb004e098ba31a6a0cfafcbd.jpg differ diff --git a/data/uploads/plant/78/a8f06747e95a4a17a7aebde56a1ecfdd.jpg b/data/uploads/plant/78/a8f06747e95a4a17a7aebde56a1ecfdd.jpg new file mode 100644 index 0000000..aca27b3 Binary files /dev/null and b/data/uploads/plant/78/a8f06747e95a4a17a7aebde56a1ecfdd.jpg differ diff --git a/data/uploads/plant/78/e17e4101e76847d98b32a1accfc6d2c0.jpg b/data/uploads/plant/78/e17e4101e76847d98b32a1accfc6d2c0.jpg new file mode 100644 index 0000000..b06858e Binary files /dev/null and b/data/uploads/plant/78/e17e4101e76847d98b32a1accfc6d2c0.jpg differ diff --git a/data/uploads/plant/79/069a562cf6ff4579a6e74e782c57444a.jpg b/data/uploads/plant/79/069a562cf6ff4579a6e74e782c57444a.jpg new file mode 100644 index 0000000..3b30021 Binary files /dev/null and b/data/uploads/plant/79/069a562cf6ff4579a6e74e782c57444a.jpg differ diff --git a/data/uploads/plant/79/1b47f788311d4e5bbc847f7dee537676.jpg b/data/uploads/plant/79/1b47f788311d4e5bbc847f7dee537676.jpg new file mode 100644 index 0000000..1a1633c Binary files /dev/null and b/data/uploads/plant/79/1b47f788311d4e5bbc847f7dee537676.jpg differ diff --git a/data/uploads/plant/79/1c64047214724413a6e041a9c81d1cd6.jpg b/data/uploads/plant/79/1c64047214724413a6e041a9c81d1cd6.jpg new file mode 100644 index 0000000..a21ae96 Binary files /dev/null and b/data/uploads/plant/79/1c64047214724413a6e041a9c81d1cd6.jpg differ diff --git a/data/uploads/plant/79/6a62cf5844cb4a428fbeee8e58e44772.jpg b/data/uploads/plant/79/6a62cf5844cb4a428fbeee8e58e44772.jpg new file mode 100644 index 0000000..2deec61 Binary files /dev/null and b/data/uploads/plant/79/6a62cf5844cb4a428fbeee8e58e44772.jpg differ diff --git a/data/uploads/plant/79/70d1d9602050493193a5b6e026f8c41f.jpg b/data/uploads/plant/79/70d1d9602050493193a5b6e026f8c41f.jpg new file mode 100644 index 0000000..ae82443 Binary files /dev/null and b/data/uploads/plant/79/70d1d9602050493193a5b6e026f8c41f.jpg differ diff --git a/data/uploads/plant/79/abfbcb802eea485a9969521a1afea2f8.jpg b/data/uploads/plant/79/abfbcb802eea485a9969521a1afea2f8.jpg new file mode 100644 index 0000000..e542b7c Binary files /dev/null and b/data/uploads/plant/79/abfbcb802eea485a9969521a1afea2f8.jpg differ diff --git a/data/uploads/plant/79/b40728fa0d5a4ddab36ba01a100b7b61.jpg b/data/uploads/plant/79/b40728fa0d5a4ddab36ba01a100b7b61.jpg new file mode 100644 index 0000000..b726d0b Binary files /dev/null and b/data/uploads/plant/79/b40728fa0d5a4ddab36ba01a100b7b61.jpg differ diff --git a/data/uploads/plant/79/ca43444f057642968808636e6ddcfd21.jpg b/data/uploads/plant/79/ca43444f057642968808636e6ddcfd21.jpg new file mode 100644 index 0000000..0b2acf7 Binary files /dev/null and b/data/uploads/plant/79/ca43444f057642968808636e6ddcfd21.jpg differ diff --git a/data/uploads/plant/79/d2b88f0ca94245daa0a2e200321c3c48.jpg b/data/uploads/plant/79/d2b88f0ca94245daa0a2e200321c3c48.jpg new file mode 100644 index 0000000..1dd5189 Binary files /dev/null and b/data/uploads/plant/79/d2b88f0ca94245daa0a2e200321c3c48.jpg differ diff --git a/data/uploads/plant/8/a455fa76a8d54f02a9d8975e3743cb05.jpg b/data/uploads/plant/8/a455fa76a8d54f02a9d8975e3743cb05.jpg new file mode 100644 index 0000000..72c4453 Binary files /dev/null and b/data/uploads/plant/8/a455fa76a8d54f02a9d8975e3743cb05.jpg differ diff --git a/data/uploads/plant/8/e720fb7cdb7f477f8b57e3e32196cd5c.jpg b/data/uploads/plant/8/e720fb7cdb7f477f8b57e3e32196cd5c.jpg new file mode 100644 index 0000000..68aac77 Binary files /dev/null and b/data/uploads/plant/8/e720fb7cdb7f477f8b57e3e32196cd5c.jpg differ diff --git a/data/uploads/plant/80/007aa6d462c74bcaa1aad8bea7f6c652.jpg b/data/uploads/plant/80/007aa6d462c74bcaa1aad8bea7f6c652.jpg new file mode 100644 index 0000000..331bb2c Binary files /dev/null and b/data/uploads/plant/80/007aa6d462c74bcaa1aad8bea7f6c652.jpg differ diff --git a/data/uploads/plant/80/0085cd39ceb04c4999572f7d1ca930b2.jpg b/data/uploads/plant/80/0085cd39ceb04c4999572f7d1ca930b2.jpg new file mode 100644 index 0000000..ff688af Binary files /dev/null and b/data/uploads/plant/80/0085cd39ceb04c4999572f7d1ca930b2.jpg differ diff --git a/data/uploads/plant/80/168bcb2aa30742d48a367904837e2bf4.jpg b/data/uploads/plant/80/168bcb2aa30742d48a367904837e2bf4.jpg new file mode 100644 index 0000000..933924a Binary files /dev/null and b/data/uploads/plant/80/168bcb2aa30742d48a367904837e2bf4.jpg differ diff --git a/data/uploads/plant/80/238567f39ce44270ab4f3ed1c35c0f1e.jpg b/data/uploads/plant/80/238567f39ce44270ab4f3ed1c35c0f1e.jpg new file mode 100644 index 0000000..262f0e8 Binary files /dev/null and b/data/uploads/plant/80/238567f39ce44270ab4f3ed1c35c0f1e.jpg differ diff --git a/data/uploads/plant/80/38bf1d8e7b5d4e6aac2bad1d7ec48d4c.jpg b/data/uploads/plant/80/38bf1d8e7b5d4e6aac2bad1d7ec48d4c.jpg new file mode 100644 index 0000000..1c63ba8 Binary files /dev/null and b/data/uploads/plant/80/38bf1d8e7b5d4e6aac2bad1d7ec48d4c.jpg differ diff --git a/data/uploads/plant/80/64c56c94c894453a95b624669f4dc250.jpg b/data/uploads/plant/80/64c56c94c894453a95b624669f4dc250.jpg new file mode 100644 index 0000000..61025f8 Binary files /dev/null and b/data/uploads/plant/80/64c56c94c894453a95b624669f4dc250.jpg differ diff --git a/data/uploads/plant/80/88f2224a3e9a45318f6b2bb0541235b3.jpg b/data/uploads/plant/80/88f2224a3e9a45318f6b2bb0541235b3.jpg new file mode 100644 index 0000000..1929743 Binary files /dev/null and b/data/uploads/plant/80/88f2224a3e9a45318f6b2bb0541235b3.jpg differ diff --git a/data/uploads/plant/80/94e8ec4101854bb39e4f8ad622317c98.jpg b/data/uploads/plant/80/94e8ec4101854bb39e4f8ad622317c98.jpg new file mode 100644 index 0000000..7973d6f Binary files /dev/null and b/data/uploads/plant/80/94e8ec4101854bb39e4f8ad622317c98.jpg differ diff --git a/data/uploads/plant/80/9dfb8bb582b34810a187da96faa25b92.jpg b/data/uploads/plant/80/9dfb8bb582b34810a187da96faa25b92.jpg new file mode 100644 index 0000000..14e199e Binary files /dev/null and b/data/uploads/plant/80/9dfb8bb582b34810a187da96faa25b92.jpg differ diff --git a/data/uploads/plant/80/a9435967b18c4c259eb8ad75edd3a9e3.jpg b/data/uploads/plant/80/a9435967b18c4c259eb8ad75edd3a9e3.jpg new file mode 100644 index 0000000..ad2f040 Binary files /dev/null and b/data/uploads/plant/80/a9435967b18c4c259eb8ad75edd3a9e3.jpg differ diff --git a/data/uploads/plant/80/da1b5232a72c4e11bbc326951533415b.jpg b/data/uploads/plant/80/da1b5232a72c4e11bbc326951533415b.jpg new file mode 100644 index 0000000..35a24bb Binary files /dev/null and b/data/uploads/plant/80/da1b5232a72c4e11bbc326951533415b.jpg differ diff --git a/data/uploads/plant/80/e506c085bb754a71a86d3d1df73505e3.jpg b/data/uploads/plant/80/e506c085bb754a71a86d3d1df73505e3.jpg new file mode 100644 index 0000000..2a9d3aa Binary files /dev/null and b/data/uploads/plant/80/e506c085bb754a71a86d3d1df73505e3.jpg differ diff --git a/data/uploads/plant/81/0f96a352d1404400b03f264d94cca9e8.jpg b/data/uploads/plant/81/0f96a352d1404400b03f264d94cca9e8.jpg new file mode 100644 index 0000000..680dcae Binary files /dev/null and b/data/uploads/plant/81/0f96a352d1404400b03f264d94cca9e8.jpg differ diff --git a/data/uploads/plant/81/10853455b1ac441fa8d42b47fbd3daa5.jpg b/data/uploads/plant/81/10853455b1ac441fa8d42b47fbd3daa5.jpg new file mode 100644 index 0000000..2004c76 Binary files /dev/null and b/data/uploads/plant/81/10853455b1ac441fa8d42b47fbd3daa5.jpg differ diff --git a/data/uploads/plant/81/1c5efc76e6c24446a66edd3cf2ba7960.jpg b/data/uploads/plant/81/1c5efc76e6c24446a66edd3cf2ba7960.jpg new file mode 100644 index 0000000..cb0c8a2 Binary files /dev/null and b/data/uploads/plant/81/1c5efc76e6c24446a66edd3cf2ba7960.jpg differ diff --git a/data/uploads/plant/81/2c6975b09c164c90a631ec7b0dc5ae23.jpg b/data/uploads/plant/81/2c6975b09c164c90a631ec7b0dc5ae23.jpg new file mode 100644 index 0000000..56c1dcd Binary files /dev/null and b/data/uploads/plant/81/2c6975b09c164c90a631ec7b0dc5ae23.jpg differ diff --git a/data/uploads/plant/81/755d9c5478424fdab22d4ffab68ae601.jpg b/data/uploads/plant/81/755d9c5478424fdab22d4ffab68ae601.jpg new file mode 100644 index 0000000..d646c21 Binary files /dev/null and b/data/uploads/plant/81/755d9c5478424fdab22d4ffab68ae601.jpg differ diff --git a/data/uploads/plant/81/c8a11d6cac154208ace6963c823ce496.jpg b/data/uploads/plant/81/c8a11d6cac154208ace6963c823ce496.jpg new file mode 100644 index 0000000..f867cca Binary files /dev/null and b/data/uploads/plant/81/c8a11d6cac154208ace6963c823ce496.jpg differ diff --git a/data/uploads/plant/81/d9163fea8f8f47bdbd81aa8af9ca40ea.jpg b/data/uploads/plant/81/d9163fea8f8f47bdbd81aa8af9ca40ea.jpg new file mode 100644 index 0000000..d3ad784 Binary files /dev/null and b/data/uploads/plant/81/d9163fea8f8f47bdbd81aa8af9ca40ea.jpg differ diff --git a/data/uploads/plant/81/dce4d92ac9a4465992df00853dafd717.jpg b/data/uploads/plant/81/dce4d92ac9a4465992df00853dafd717.jpg new file mode 100644 index 0000000..e03a1d4 Binary files /dev/null and b/data/uploads/plant/81/dce4d92ac9a4465992df00853dafd717.jpg differ diff --git a/data/uploads/plant/81/f6cc7178679343a897e8a86cfd982cae.jpg b/data/uploads/plant/81/f6cc7178679343a897e8a86cfd982cae.jpg new file mode 100644 index 0000000..476ce9b Binary files /dev/null and b/data/uploads/plant/81/f6cc7178679343a897e8a86cfd982cae.jpg differ diff --git a/data/uploads/plant/82/19799837ff9d4958b577ff124e28a380.jpg b/data/uploads/plant/82/19799837ff9d4958b577ff124e28a380.jpg new file mode 100644 index 0000000..4711db8 Binary files /dev/null and b/data/uploads/plant/82/19799837ff9d4958b577ff124e28a380.jpg differ diff --git a/data/uploads/plant/82/26e9236b715a4399b1b28578003bbfd2.jpg b/data/uploads/plant/82/26e9236b715a4399b1b28578003bbfd2.jpg new file mode 100644 index 0000000..277e6a7 Binary files /dev/null and b/data/uploads/plant/82/26e9236b715a4399b1b28578003bbfd2.jpg differ diff --git a/data/uploads/plant/82/35a9b6710fb248e3b33609ce54c4fbad.jpg b/data/uploads/plant/82/35a9b6710fb248e3b33609ce54c4fbad.jpg new file mode 100644 index 0000000..ea25bc2 Binary files /dev/null and b/data/uploads/plant/82/35a9b6710fb248e3b33609ce54c4fbad.jpg differ diff --git a/data/uploads/plant/82/99c2c0db2c7546a6b12f994bf7ffcb50.jpg b/data/uploads/plant/82/99c2c0db2c7546a6b12f994bf7ffcb50.jpg new file mode 100644 index 0000000..990007d Binary files /dev/null and b/data/uploads/plant/82/99c2c0db2c7546a6b12f994bf7ffcb50.jpg differ diff --git a/data/uploads/plant/83/595c8d6bbffa4b808a303ec44a437a21.jpg b/data/uploads/plant/83/595c8d6bbffa4b808a303ec44a437a21.jpg new file mode 100644 index 0000000..142691c Binary files /dev/null and b/data/uploads/plant/83/595c8d6bbffa4b808a303ec44a437a21.jpg differ diff --git a/data/uploads/plant/83/f716914d3c9c47849c4a5e8ef5b2c440.jpg b/data/uploads/plant/83/f716914d3c9c47849c4a5e8ef5b2c440.jpg new file mode 100644 index 0000000..f045c50 Binary files /dev/null and b/data/uploads/plant/83/f716914d3c9c47849c4a5e8ef5b2c440.jpg differ diff --git a/data/uploads/plant/84/7cd2fd39b4c44cceac9758c31350f213.jpg b/data/uploads/plant/84/7cd2fd39b4c44cceac9758c31350f213.jpg new file mode 100644 index 0000000..4b35adf Binary files /dev/null and b/data/uploads/plant/84/7cd2fd39b4c44cceac9758c31350f213.jpg differ diff --git a/data/uploads/plant/84/9710ab393a304f488ae7b2a1dbe97c6c.jpg b/data/uploads/plant/84/9710ab393a304f488ae7b2a1dbe97c6c.jpg new file mode 100644 index 0000000..27c78e9 Binary files /dev/null and b/data/uploads/plant/84/9710ab393a304f488ae7b2a1dbe97c6c.jpg differ diff --git a/data/uploads/plant/84/faa5e8df25c04164bb3381a66687c611.jpg b/data/uploads/plant/84/faa5e8df25c04164bb3381a66687c611.jpg new file mode 100644 index 0000000..6c7a164 Binary files /dev/null and b/data/uploads/plant/84/faa5e8df25c04164bb3381a66687c611.jpg differ diff --git a/data/uploads/plant/85/19b4b1ac3f204ed393afd07f02ffcaf1.jpg b/data/uploads/plant/85/19b4b1ac3f204ed393afd07f02ffcaf1.jpg new file mode 100644 index 0000000..e8f6de2 Binary files /dev/null and b/data/uploads/plant/85/19b4b1ac3f204ed393afd07f02ffcaf1.jpg differ diff --git a/data/uploads/plant/85/1f3d49a5463a4bbbacec2d4175e95f1d.jpg b/data/uploads/plant/85/1f3d49a5463a4bbbacec2d4175e95f1d.jpg new file mode 100644 index 0000000..863b026 Binary files /dev/null and b/data/uploads/plant/85/1f3d49a5463a4bbbacec2d4175e95f1d.jpg differ diff --git a/data/uploads/plant/85/a0757bb5b9f942f5b8dda2ce938d268d.jpg b/data/uploads/plant/85/a0757bb5b9f942f5b8dda2ce938d268d.jpg new file mode 100644 index 0000000..42c644a Binary files /dev/null and b/data/uploads/plant/85/a0757bb5b9f942f5b8dda2ce938d268d.jpg differ diff --git a/data/uploads/plant/85/a4e3eead57f84fb6a383f0eb4e14ab09.jpg b/data/uploads/plant/85/a4e3eead57f84fb6a383f0eb4e14ab09.jpg new file mode 100644 index 0000000..3a472c0 Binary files /dev/null and b/data/uploads/plant/85/a4e3eead57f84fb6a383f0eb4e14ab09.jpg differ diff --git a/data/uploads/plant/85/ea52c707830344179ab75496174b7b2f.jpg b/data/uploads/plant/85/ea52c707830344179ab75496174b7b2f.jpg new file mode 100644 index 0000000..8b005d2 Binary files /dev/null and b/data/uploads/plant/85/ea52c707830344179ab75496174b7b2f.jpg differ diff --git a/data/uploads/plant/86/f347b384a783449d924237bd417d005f.jpg b/data/uploads/plant/86/f347b384a783449d924237bd417d005f.jpg new file mode 100644 index 0000000..95f594d Binary files /dev/null and b/data/uploads/plant/86/f347b384a783449d924237bd417d005f.jpg differ diff --git a/data/uploads/plant/87/6dc365d1e9e54774a4504be0b91391fb.jpg b/data/uploads/plant/87/6dc365d1e9e54774a4504be0b91391fb.jpg new file mode 100644 index 0000000..4eaa856 Binary files /dev/null and b/data/uploads/plant/87/6dc365d1e9e54774a4504be0b91391fb.jpg differ diff --git a/data/uploads/plant/87/c4f6340b6d6e4684a52029ee95db2e81.jpg b/data/uploads/plant/87/c4f6340b6d6e4684a52029ee95db2e81.jpg new file mode 100644 index 0000000..1be34bd Binary files /dev/null and b/data/uploads/plant/87/c4f6340b6d6e4684a52029ee95db2e81.jpg differ diff --git a/data/uploads/plant/87/f9ba1f7de29f4cce9d84dba398dcf17b.jpg b/data/uploads/plant/87/f9ba1f7de29f4cce9d84dba398dcf17b.jpg new file mode 100644 index 0000000..e8568bf Binary files /dev/null and b/data/uploads/plant/87/f9ba1f7de29f4cce9d84dba398dcf17b.jpg differ diff --git a/data/uploads/plant/88/85f5bf09fa764694979e19d6856ea3a7.jpg b/data/uploads/plant/88/85f5bf09fa764694979e19d6856ea3a7.jpg new file mode 100644 index 0000000..52bdf30 Binary files /dev/null and b/data/uploads/plant/88/85f5bf09fa764694979e19d6856ea3a7.jpg differ diff --git a/data/uploads/plant/89/2cb94430c3c442428755e344d4ea0bfd.jpg b/data/uploads/plant/89/2cb94430c3c442428755e344d4ea0bfd.jpg new file mode 100644 index 0000000..0b05bfd Binary files /dev/null and b/data/uploads/plant/89/2cb94430c3c442428755e344d4ea0bfd.jpg differ diff --git a/data/uploads/plant/89/62202668fe8a429ca5e00f00b8c662a9.jpg b/data/uploads/plant/89/62202668fe8a429ca5e00f00b8c662a9.jpg new file mode 100644 index 0000000..84a7dcf Binary files /dev/null and b/data/uploads/plant/89/62202668fe8a429ca5e00f00b8c662a9.jpg differ diff --git a/data/uploads/plant/89/acfcb68b5f8440af9f6d47d26b5ea477.jpg b/data/uploads/plant/89/acfcb68b5f8440af9f6d47d26b5ea477.jpg new file mode 100644 index 0000000..36ab16a Binary files /dev/null and b/data/uploads/plant/89/acfcb68b5f8440af9f6d47d26b5ea477.jpg differ diff --git a/data/uploads/plant/9/0116b4d386fe417e809530076a1d33e2.jpg b/data/uploads/plant/9/0116b4d386fe417e809530076a1d33e2.jpg new file mode 100644 index 0000000..4206b99 Binary files /dev/null and b/data/uploads/plant/9/0116b4d386fe417e809530076a1d33e2.jpg differ diff --git a/data/uploads/plant/9/328ea20ca00644c792e180f7e6fdaa41.jpg b/data/uploads/plant/9/328ea20ca00644c792e180f7e6fdaa41.jpg new file mode 100644 index 0000000..ea51865 Binary files /dev/null and b/data/uploads/plant/9/328ea20ca00644c792e180f7e6fdaa41.jpg differ diff --git a/data/uploads/plant/9/ac0c508c20e44399b7580567979f3a87.jpg b/data/uploads/plant/9/ac0c508c20e44399b7580567979f3a87.jpg new file mode 100644 index 0000000..1a996ed Binary files /dev/null and b/data/uploads/plant/9/ac0c508c20e44399b7580567979f3a87.jpg differ diff --git a/data/uploads/plant/9/dd569346e0424337ac5236301ef58aac.jpg b/data/uploads/plant/9/dd569346e0424337ac5236301ef58aac.jpg new file mode 100644 index 0000000..451520d Binary files /dev/null and b/data/uploads/plant/9/dd569346e0424337ac5236301ef58aac.jpg differ diff --git a/data/uploads/plant/90/373bfdebe6f3428086cbea3947487939.jpg b/data/uploads/plant/90/373bfdebe6f3428086cbea3947487939.jpg new file mode 100644 index 0000000..3776a62 Binary files /dev/null and b/data/uploads/plant/90/373bfdebe6f3428086cbea3947487939.jpg differ diff --git a/data/uploads/plant/90/4685fd93530f4473b54ac08b4942a043.jpg b/data/uploads/plant/90/4685fd93530f4473b54ac08b4942a043.jpg new file mode 100644 index 0000000..cc31f11 Binary files /dev/null and b/data/uploads/plant/90/4685fd93530f4473b54ac08b4942a043.jpg differ diff --git a/data/uploads/plant/90/fbf6b0349bb840808783c9aeed5b063e.jpg b/data/uploads/plant/90/fbf6b0349bb840808783c9aeed5b063e.jpg new file mode 100644 index 0000000..016158d Binary files /dev/null and b/data/uploads/plant/90/fbf6b0349bb840808783c9aeed5b063e.jpg differ diff --git a/docker-compose.yml b/docker-compose.yml index beb742a..9bc0f82 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -98,6 +98,9 @@ services: build: . env_file: - .env + volumes: + - .:/app:delegated + - ./${UPLOAD_FOLDER}:/app/${UPLOAD_FOLDER} environment: - SECRET_KEY=${SECRET_KEY} - MYSQL_HOST=${MYSQL_HOST} @@ -116,6 +119,9 @@ services: build: . env_file: - .env + volumes: + - .:/app:delegated + - ./${UPLOAD_FOLDER}:/app/${UPLOAD_FOLDER} environment: - FLASK_ENV=production - CELERY_BROKER_URL=redis://redis:6379/0 diff --git a/entrypoint.sh b/entrypoint.sh index 7a268b2..0fa20ff 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -1,30 +1,28 @@ #!/usr/bin/env bash set -e -# Resolve DB host/port from vars or defaults +# 1) Wait for MySQL to come up DB_HOST="${DB_HOST:-${MYSQL_HOST:-db}}" DB_PORT="${DB_PORT:-${MYSQL_PORT:-3306}}" - echo "[⏳] Waiting for database at $DB_HOST:$DB_PORT..." until nc -z "$DB_HOST" "$DB_PORT"; do sleep 1 done echo "[βœ”] Database is up" -# Only the "flask" entrypoint needs uploads + migrations +# 2) Ensure the shared upload directory is owned and writable +UPLOAD_DIR="/app/${UPLOAD_FOLDER:-data/uploads}" +mkdir -p "$UPLOAD_DIR" +chown -R appuser:appuser "$UPLOAD_DIR" +chmod -R u+rwX,g+rwX,o+rX "$UPLOAD_DIR" +echo "⏺️ Ensured upload directory exists and is owned by appuser: $UPLOAD_DIR" + +# 3) If we're launching Flask, run migrations and optional seed if [ "$1" = "flask" ]; then - - # Prepare upload dir (web only) β€” path comes from .env UPLOAD_FOLDER (e.g. "data/uploads") - UPLOAD_DIR="/app/${UPLOAD_FOLDER:-static/uploads}" - mkdir -p "$UPLOAD_DIR" - echo "⏺️ Ensured upload directory exists: $UPLOAD_DIR" - - # Run DB migrations echo "[πŸ› οΈ] Applying database migrations" flask db upgrade - # Ensure any missing tables - echo "[πŸ› οΈ] Ensuring tables exist" + echo "[πŸ› οΈ] Ensuring any missing tables" python < +
+
+
+
Total Images
+

{{ total_images }}

+
+
+
diff --git a/plugins/media/tasks.py b/plugins/media/tasks.py index d8ec2e2..1f3ae0c 100644 --- a/plugins/media/tasks.py +++ b/plugins/media/tasks.py @@ -8,7 +8,7 @@ from PIL import Image, UnidentifiedImageError from celery.schedules import crontab from flask import current_app from app import db -from app.celery_app import celery +from app.celery_instance import celery from plugins.media.models import Media, ZipJob # ─── Constants ──────────────────────────────────────────────────────────────── @@ -142,4 +142,4 @@ def init_media_tasks(celery_app): Called by the JSON‐driven loader so tasks_init no longer errors. Celery scheduling is handled via on_after_configure. """ - celery_app.log.get_default_logger().info("[Media] init_media_tasks no-op") + print("[Media] init_media_tasks called (no‐op)") diff --git a/plugins/plant/growlog/routes.py b/plugins/plant/growlog/routes.py index e650660..a2ad9b9 100644 --- a/plugins/plant/growlog/routes.py +++ b/plugins/plant/growlog/routes.py @@ -7,7 +7,6 @@ from flask import ( ) from flask_login import login_required, current_user from app import db -from app.celery_app import celery from .models import GrowLog from .forms import GrowLogForm from plugins.plant.models import Plant, PlantCommonName diff --git a/plugins/utility/routes.py b/plugins/utility/routes.py index df96787..49454d2 100644 --- a/plugins/utility/routes.py +++ b/plugins/utility/routes.py @@ -35,7 +35,7 @@ from plugins.plant.models import ( ) from plugins.media.models import Media from plugins.utility.models import ImportBatch -from plugins.media import _process_upload_file +from plugins.media.routes import _process_upload_file bp = Blueprint( 'utility', @@ -79,6 +79,9 @@ REQUIRED_HEADERS = {"uuid", "plant_type", "name", "scientific_name", "mother_uui @bp.route("/upload", methods=["GET", "POST"]) @login_required def upload(): + # ------------------------------------------------------------------------- + # POST handling + # ------------------------------------------------------------------------- if request.method == "POST": file = request.files.get("file") if not file or not file.filename: @@ -89,44 +92,46 @@ def upload(): # ── ZIP Import Flow ──────────────────────────────────────────────── if filename.endswith(".zip"): - tmp_zip = tempfile.NamedTemporaryFile(delete=False, suffix=".zip") - file.save(tmp_zip.name) - tmp_zip.close() + # 1) Save to shared UPLOAD_FOLDER + upload_dir = current_app.config["UPLOAD_FOLDER"] + os.makedirs(upload_dir, exist_ok=True) + tmp_path = os.path.join(upload_dir, f"tmp_{uuid.uuid4().hex}.zip") + file.save(tmp_path) - # validate ZIP + # 2) Validate ZIP + contents try: - z = zipfile.ZipFile(tmp_zip.name) + zf = zipfile.ZipFile(tmp_path) except zipfile.BadZipFile: - os.remove(tmp_zip.name) + os.remove(tmp_path) flash("Uploaded file is not a valid ZIP.", "danger") return redirect(request.url) - names = z.namelist() - if "plants.csv" not in names or "media.csv" not in names: - os.remove(tmp_zip.name) + names = set(zf.namelist()) + if not {"plants.csv", "media.csv"}.issubset(names): + os.remove(tmp_path) flash("ZIP must contain both plants.csv and media.csv", "danger") return redirect(request.url) - # extract export_id from metadata + # 3) Extract export_id from metadata.txt export_id = None if "metadata.txt" in names: - meta = z.read("metadata.txt").decode("utf-8", "ignore") + meta = zf.read("metadata.txt").decode("utf-8", "ignore") for line in meta.splitlines(): if line.startswith("export_id,"): export_id = line.split(",", 1)[1].strip() break if not export_id: - os.remove(tmp_zip.name) + os.remove(tmp_path) flash("metadata.txt missing or missing export_id", "danger") return redirect(request.url) - # prevent duplicates + # 4) Prevent duplicate imports if ImportBatch.query.filter_by(export_id=export_id, user_id=current_user.id).first(): - os.remove(tmp_zip.name) + os.remove(tmp_path) flash("This export has already been imported.", "info") return redirect(request.url) - # record batch + # 5) Create batch record batch = ImportBatch( export_id = export_id, user_id = current_user.id, @@ -136,174 +141,15 @@ def upload(): db.session.add(batch) db.session.commit() - # hand off to Celery - try: - import_text_data.delay(tmp_zip.name, "zip", batch.id) - flash("ZIP received; import queued in background.", "success") - return redirect(request.url) - except Exception: - current_app.logger.exception("Failed to enqueue import_text_data") - flash("Failed to queue import job; falling back to inline import", "warning") + # 6) Rename ZIP to include batch.id + final_path = os.path.join(upload_dir, f"{batch.id}_{uuid.uuid4().hex}.zip") + os.rename(tmp_path, final_path) - # ── Fallback: inline import ───────────────────────────────────────── + # 7) Enqueue Celery task + from plugins.utility.tasks import import_text_data + import_text_data.delay(final_path, "zip", batch.id) - tmpdir = tempfile.mkdtemp() - z.extractall(tmpdir) - - # load plants.csv - plant_path = os.path.join(tmpdir, "plants.csv") - with open(plant_path, newline="", encoding="utf-8-sig") as pf: - reader = csv.DictReader(pf) - if reader.fieldnames != PLANT_HEADERS: - missing = set(PLANT_HEADERS) - set(reader.fieldnames or []) - extra = set(reader.fieldnames or []) - set(PLANT_HEADERS) - os.remove(tmp_zip.name) - flash(f"plants.csv header mismatch. Missing: {missing}, Extra: {extra}", "danger") - return redirect(request.url) - plant_rows = list(reader) - - # load media.csv - media_path = os.path.join(tmpdir, "media.csv") - with open(media_path, newline="", encoding="utf-8-sig") as mf: - mreader = csv.DictReader(mf) - if mreader.fieldnames != MEDIA_HEADERS: - missing = set(MEDIA_HEADERS) - set(mreader.fieldnames or []) - extra = set(mreader.fieldnames or []) - set(MEDIA_HEADERS) - os.remove(tmp_zip.name) - flash(f"media.csv header mismatch. Missing: {missing}, Extra: {extra}", "danger") - return redirect(request.url) - media_rows = list(mreader) - - # import plants - neo = get_neo4j_handler() - plant_map = {} - added_plants = 0 - - for row in plant_rows: - # common name - common = PlantCommonName.query.filter_by(name=row["Name"]).first() - if not common: - common = PlantCommonName(name=row["Name"]) - db.session.add(common) - db.session.flush() - - # scientific name - scientific = PlantScientificName.query.filter_by(name=row["Scientific Name"]).first() - if not scientific: - scientific = PlantScientificName( - name = row["Scientific Name"], - common_id = common.id - ) - db.session.add(scientific) - db.session.flush() - - raw_mu = row.get("Mother UUID") or None - mu_for_insert= raw_mu if raw_mu in plant_map else None - - p = Plant( - uuid = row["UUID"], - common_id = common.id, - scientific_id = scientific.id, - plant_type = row["Type"], - owner_id = current_user.id, - vendor_name = row["Vendor Name"] or None, - price = float(row["Price"]) if row["Price"] else None, - mother_uuid = mu_for_insert, - notes = row["Notes"] or None, - short_id = row.get("Short ID") or None, - data_verified = True - ) - db.session.add(p) - db.session.flush() - - plant_map[p.uuid] = p.id - - log = PlantOwnershipLog( - plant_id = p.id, - user_id = current_user.id, - date_acquired = datetime.utcnow(), - transferred = False, - is_verified = True - ) - db.session.add(log) - - neo.create_plant_node(p.uuid, row["Name"]) - if raw_mu: - neo.create_lineage(child_uuid=p.uuid, parent_uuid=raw_mu) - - added_plants += 1 - - db.session.commit() - - # backfill mothers - for row in plant_rows: - if row.get("Mother UUID"): - Plant.query.filter_by(uuid=row["UUID"]).update({ - 'mother_uuid': row["Mother UUID"] - }) - db.session.commit() - - # import media images - added_media = 0 - for mrow in media_rows: - puuid = mrow["Plant UUID"] - pid = plant_map.get(puuid) - if not pid: - continue - - subpath = mrow["Image Path"].split('uploads/', 1)[-1] - src = os.path.join(tmpdir, "images", subpath) - if not os.path.isfile(src): - continue - - try: - # build FileStorage for convenience - with open(src, "rb") as f: - fs = FileStorage( - stream = io.BytesIO(f.read()), - filename = os.path.basename(subpath), - content_type='image/jpeg' - ) - - # now save to our UPLOAD_FOLDER - now = datetime.utcnow() - secure_name = secure_filename(fs.filename) - storage_dir = os.path.join( - current_app.config["UPLOAD_FOLDER"], - str(current_user.id), - now.strftime("%Y/%m/%d") - ) - os.makedirs(storage_dir, exist_ok=True) - - unique_name = f"{uuid.uuid4().hex}_{secure_name}" - full_path = os.path.join(storage_dir, unique_name) - fs.save(full_path) - - file_url = f"/{current_user.id}/{now.strftime('%Y/%m/%d')}/{unique_name}" - - media = Media( - plugin = "plant", - related_id = pid, - filename = unique_name, - uploaded_at = datetime.fromisoformat(mrow["Uploaded At"]), - uploader_id = current_user.id, - caption = mrow["Source Type"], - plant_id = pid, - created_at = datetime.fromisoformat(mrow["Uploaded At"]), - file_url = file_url - ) - db.session.add(media) - added_media += 1 - - except Exception as e: - current_app.logger.warning(f"Failed to import media file: {subpath} β†’ {e}") - current_app.logger.debug(traceback.format_exc()) - - db.session.commit() - neo.close() - os.remove(tmp_zip.name) - - flash(f"Imported {added_plants} plants and {added_media} images.", "success") + flash("ZIP received; import queued in background.", "success") return redirect(request.url) # ── CSV Review Flow ───────────────────────────────────────────────── @@ -345,12 +191,12 @@ def upload(): suggested = all_sci[suggestions[0]].name item = { - "uuid": uuid_val, - "name": name, - "sci_name": sci_name, - "suggested": suggested, - "plant_type": plant_type, - "mother_uuid": mother_uuid + "uuid" : uuid_val, + "name" : name, + "sci_name" : sci_name, + "suggested" : suggested, + "plant_type" : plant_type, + "mother_uuid" : mother_uuid } review_list.append(item) session["pending_rows"].append(item) @@ -399,6 +245,9 @@ def upload(): flash("File uploaded and saved successfully.", "success") return redirect(request.url) + # ------------------------------------------------------------------------- + # GET β†’ render form + # ------------------------------------------------------------------------- return render_template("utility/upload.html", csrf_token=generate_csrf())