From e0c489f62557a86332e708af7639b5f933d56313 Mon Sep 17 00:00:00 2001 From: kcar Date: Fri, 11 Jul 2025 13:52:19 +0000 Subject: [PATCH] Initial commit --- .gitignore | 10 + Dockerfile | 38 + Dockerfile.macos.dev | 38 + Dockerfile.macos.prod | 38 + README.md | 108 + __pycache__/main.cpython-311.pyc | Bin 0 -> 5715 bytes .../default_institute/default_curriculum.xlsx | Bin 0 -> 752436 bytes .../default_institute/default_timetable.xlsx | Bin 0 -> 36523 bytes data/init/fpgs_data/fpgs_curriculum.xlsx | Bin 0 -> 752436 bytes data/init/fpgs_data/fpgs_timetable.xlsx | Bin 0 -> 36384 bytes data/init/fpgs_data/users/kca_planning.xlsx | Bin 0 -> 14751 bytes data/init/fpgs_data/users/kca_timetable.xlsx | Bin 0 -> 22961 bytes data/init/global_schools/Kent.csv | 624 ++++ .../kevlarai_data/kevlarai_curriculum.xlsx | Bin 0 -> 752436 bytes .../kevlarai_curriculum_lessons_df.csv | 21 + .../kevlarai_curriculum_statements_df.csv | 8 + .../kevlarai_curriculum_topics_df.csv | 15 + .../kevlarai_data/kevlarai_timetable.xlsx | Bin 0 -> 36523 bytes .../kevlarai_data/users/kcar_planning.xlsx | Bin 0 -> 14751 bytes .../kevlarai_data/users/kcar_timetable.xlsx | Bin 0 -> 22961 bytes data/init/sample_schools.csv | 105 + docker-compose.yml | 16 + docker-entrypoint.sh | 43 + main.py | 133 + modules/__init__.py | 0 modules/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 133 bytes .../document_processor.cpython-311.pyc | Bin 0 -> 5294 bytes .../__pycache__/logger_tool.cpython-311.pyc | Bin 0 -> 11589 bytes modules/__pycache__/pdf_utils.cpython-311.pyc | Bin 0 -> 2469 bytes .../__pycache__/redis_config.cpython-311.pyc | Bin 0 -> 2266 bytes .../__pycache__/test_analyzer.cpython-311.pyc | Bin 0 -> 7541 bytes modules/auth/__init__.py | 0 modules/auth/supabase_bearer.py | 81 + modules/database/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 142 bytes modules/database/admin/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 148 bytes .../graph_provider.cpython-311.pyc | Bin 0 -> 23473 bytes .../neontology_provider.cpython-311.pyc | Bin 0 -> 11965 bytes modules/database/admin/calendar_provider.py | 280 ++ modules/database/admin/graph_provider.py | 401 +++ modules/database/admin/neontology_provider.py | 212 ++ .../admin/school_curriculum_provider.py | 797 +++++ modules/database/admin/school_manager.py | 512 +++ .../admin/school_syllabus_provider.py | 54 + .../admin/school_timetable_provider.py | 526 ++++ modules/database/init/__init__.py | 0 .../init/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 147 bytes .../__pycache__/init_calendar.cpython-311.pyc | Bin 0 -> 13582 bytes .../__pycache__/init_school.cpython-311.pyc | Bin 0 -> 6575 bytes .../init_school_curriculum.cpython-311.pyc | Bin 0 -> 35844 bytes .../init_school_timetable.cpython-311.pyc | Bin 0 -> 28862 bytes .../__pycache__/init_user.cpython-311.pyc | Bin 0 -> 24773 bytes .../init_worker_timetable.cpython-311.pyc | Bin 0 -> 15504 bytes .../init/__pycache__/xl_tools.cpython-311.pyc | Bin 0 -> 2467 bytes modules/database/init/init_calendar.py | 260 ++ modules/database/init/init_school.py | 158 + .../database/init/init_school_curriculum.py | 697 +++++ .../database/init/init_school_timetable.py | 487 +++ modules/database/init/init_user.py | 379 +++ modules/database/init/init_user_timetable.py | 326 ++ .../database/init/init_worker_timetable.py | 241 ++ modules/database/init/xl_tools.py | 35 + modules/database/neo4j/__init__.py | 0 modules/database/neo4j/utils/__init__.py | 0 modules/database/neo4j/utils/neontology.py | 221 ++ modules/database/schemas/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 150 bytes .../__pycache__/entities.cpython-311.pyc | Bin 0 -> 1190 bytes .../__pycache__/owners.cpython-311.pyc | Bin 0 -> 1191 bytes .../__pycache__/structures.cpython-311.pyc | Bin 0 -> 1217 bytes modules/database/schemas/entities.py | 29 + modules/database/schemas/graph/__init__.py | 0 .../database/schemas/graph/nodes/__init__.py | 0 .../schemas/graph/nodes/schools/__init__.py | 0 .../graph/nodes/structures/__init__.py | 0 .../schemas/graph/nodes/workers/__init__.py | 0 .../schemas/graph/relationships/__init__.py | 0 modules/database/schemas/nodes/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 156 bytes .../__pycache__/base_nodes.cpython-311.pyc | Bin 0 -> 2489 bytes .../__pycache__/calendars.cpython-311.pyc | Bin 0 -> 2607 bytes .../nodes/__pycache__/users.cpython-311.pyc | Bin 0 -> 611 bytes modules/database/schemas/nodes/base_nodes.py | 52 + modules/database/schemas/nodes/calendars.py | 36 + .../schemas/nodes/schools/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 164 bytes .../__pycache__/curriculum.cpython-311.pyc | Bin 0 -> 3739 bytes .../__pycache__/pastoral.cpython-311.pyc | Bin 0 -> 1097 bytes .../__pycache__/schools.cpython-311.pyc | Bin 0 -> 3881 bytes .../__pycache__/timetable.cpython-311.pyc | Bin 0 -> 5810 bytes .../schemas/nodes/schools/curriculum.py | 56 + .../schemas/nodes/schools/pastoral.py | 14 + .../database/schemas/nodes/schools/schools.py | 60 + .../schemas/nodes/schools/timetable.py | 88 + .../schemas/nodes/structures/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 167 bytes .../__pycache__/schools.cpython-311.pyc | Bin 0 -> 2246 bytes .../__pycache__/users.cpython-311.pyc | Bin 0 -> 931 bytes .../__pycache__/workers.cpython-311.pyc | Bin 0 -> 697 bytes .../schemas/nodes/structures/schools.py | 23 + .../schemas/nodes/structures/users.py | 8 + .../schemas/nodes/structures/workers.py | 5 + modules/database/schemas/nodes/users.py | 5 + .../schemas/nodes/workers/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 164 bytes .../__pycache__/timetable.cpython-311.pyc | Bin 0 -> 4779 bytes .../__pycache__/workers.cpython-311.pyc | Bin 0 -> 1717 bytes .../schemas/nodes/workers/timetable.py | 63 + .../database/schemas/nodes/workers/workers.py | 19 + modules/database/schemas/owners.py | 29 + .../schemas/relationships/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 164 bytes .../calendar_sequence.cpython-311.pyc | Bin 0 -> 2578 bytes .../calendar_timetable_rels.cpython-311.pyc | Bin 0 -> 8399 bytes .../__pycache__/calendars.cpython-311.pyc | Bin 0 -> 3083 bytes .../curriculum_relationships.cpython-311.pyc | Bin 0 -> 10548 bytes .../entity_curriculum_rels.cpython-311.pyc | Bin 0 -> 1654 bytes .../entity_relationships.cpython-311.pyc | Bin 0 -> 4993 bytes .../entity_timetable_rels.cpython-311.pyc | Bin 0 -> 2207 bytes .../owner_relationships.cpython-311.pyc | Bin 0 -> 1118 bytes .../planning_relationships.cpython-311.pyc | Bin 0 -> 4325 bytes .../__pycache__/timetables.cpython-311.pyc | Bin 0 -> 26231 bytes .../relationships/calendar_sequence.py | 29 + .../relationships/calendar_timetable_rels.py | 96 + .../schemas/relationships/calendars.py | 34 + .../relationships/curriculum_relationships.py | 119 + .../relationships/entity_curriculum_rels.py | 15 + .../relationships/entity_relationships.py | 49 + .../relationships/entity_timetable_rels.py | 18 + .../relationships/owner_relationships.py | 9 + .../schemas/relationships/owner_structures.py | 0 .../relationships/planning_relationships.py | 48 + .../relationships/school_structures.py | 0 .../calendar_sequence_relationships.py | 11 + .../curricular_sequencing_relationships.py | 2 + .../planning_sequencing_relationships.py | 11 + .../timetabling_sequencing_relationships.py | 41 + .../relationships/structures/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 175 bytes .../__pycache__/schools.cpython-311.pyc | Bin 0 -> 4702 bytes .../relationships/structures/schools.py | 65 + .../schemas/relationships/timetables.py | 305 ++ .../relationships/worker_structures.py | 0 modules/database/schemas/structures.py | 27 + modules/database/services/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 151 bytes .../__pycache__/admin_service.cpython-311.pyc | Bin 0 -> 10157 bytes .../__pycache__/auth_service.cpython-311.pyc | Bin 0 -> 5464 bytes .../__pycache__/neo4j_service.cpython-311.pyc | Bin 0 -> 11131 bytes .../school_admin_service.cpython-311.pyc | Bin 0 -> 18825 bytes modules/database/services/admin_service.py | 193 ++ modules/database/services/auth_service.py | 100 + modules/database/services/graph_service.py | 67 + .../services/graph_storage_service.py | 0 modules/database/services/jwt_service.py | 45 + modules/database/services/neo4j_service.py | 198 ++ .../database/services/school_admin_service.py | 412 +++ modules/database/services/school_service.py | 472 +++ modules/database/supabase/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 151 bytes modules/database/supabase/utils/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 157 bytes .../utils/__pycache__/client.cpython-311.pyc | Bin 0 -> 6033 bytes .../utils/__pycache__/storage.cpython-311.pyc | Bin 0 -> 17422 bytes modules/database/supabase/utils/client.py | 77 + modules/database/supabase/utils/storage.py | 289 ++ modules/database/tools/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 148 bytes .../filesystem_tools.cpython-311.pyc | Bin 0 -> 32069 bytes .../neo4j_db_formatter.cpython-311.pyc | Bin 0 -> 1065 bytes .../neo4j_driver_tools.cpython-311.pyc | Bin 0 -> 7924 bytes .../neo4j_session_tools.cpython-311.pyc | Bin 0 -> 24567 bytes .../neontology_tools.cpython-311.pyc | Bin 0 -> 7320 bytes .../tools/__pycache__/queries.cpython-311.pyc | Bin 0 -> 1203 bytes modules/database/tools/db_operations.py | 74 + modules/database/tools/filesystem_tools.py | 560 ++++ modules/database/tools/navigation/__init__.py | 0 .../tools/navigation/user_navigation.py | 491 +++ modules/database/tools/neo4j_db_formatter.py | 21 + modules/database/tools/neo4j_driver_tools.py | 153 + modules/database/tools/neo4j_http_tools.py | 64 + modules/database/tools/neo4j_session_tools.py | 504 +++ modules/database/tools/neontology/__init__.py | 18 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 511 bytes .../__pycache__/basenode.cpython-311.pyc | Bin 0 -> 15157 bytes .../baserelationship.cpython-311.pyc | Bin 0 -> 13482 bytes .../__pycache__/commonmodel.cpython-311.pyc | Bin 0 -> 9500 bytes .../graphconnection.cpython-311.pyc | Bin 0 -> 12361 bytes .../__pycache__/result.cpython-311.pyc | Bin 0 -> 6415 bytes .../__pycache__/utils.cpython-311.pyc | Bin 0 -> 5100 bytes modules/database/tools/neontology/basenode.py | 315 ++ .../tools/neontology/baserelationship.py | 305 ++ .../database/tools/neontology/commonmodel.py | 196 ++ .../tools/neontology/graphconnection.py | 253 ++ modules/database/tools/neontology/result.py | 114 + modules/database/tools/neontology/utils.py | 116 + modules/database/tools/neontology_tools.py | 121 + modules/database/tools/queries.py | 25 + modules/document_processor.py | 94 + modules/langchain/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 143 bytes ...nteractive_langgraph_query.cpython-311.pyc | Bin 0 -> 34901 bytes .../langchain/interactive_langgraph_query.py | 510 +++ modules/langchain/neo4j_graph_qa.py | 61 + modules/logger_tool.py | 174 ++ modules/msgraph/__init__.py | 0 modules/msgraph/msapi_config.py | 41 + modules/msgraph/msgraph_client.py | 40 + modules/pdf_utils.py | 43 + modules/redis_config.py | 38 + modules/services/__init__.py | 0 modules/services/textgen/__init__.py | 23 + modules/services/textgen/client.py | 366 +++ modules/services/textgen/example.py | 119 + modules/services/textgen/models.py | 140 + modules/test_analyzer.py | 130 + pyrightconfig.json | 9 + requirements.conda.yml | 74 + requirements.txt | 79 + routers/__init__.py | 0 routers/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 133 bytes .../__pycache__/admin_routes.cpython-311.pyc | Bin 0 -> 28800 bytes routers/__pycache__/auth.cpython-311.pyc | Bin 0 -> 6938 bytes routers/__pycache__/health.cpython-311.pyc | Bin 0 -> 1305 bytes routers/admin/admin_panel.py | 2769 +++++++++++++++++ routers/admin_panel_routes.py | 113 + routers/admin_routes.py | 498 +++ routers/assets/__init___.py | 0 .../assets/__pycache__/pdf.cpython-311.pyc | Bin 0 -> 23033 bytes .../__pycache__/powerpoint.cpython-311.pyc | Bin 0 -> 22453 bytes .../assets/__pycache__/word.cpython-311.pyc | Bin 0 -> 23270 bytes routers/assets/pdf.py | 423 +++ routers/assets/powerpoint.py | 398 +++ routers/assets/shared.py | 0 routers/assets/word.py | 418 +++ routers/auth.py | 139 + routers/connections/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 145 bytes .../__pycache__/arbor_router.cpython-311.pyc | Bin 0 -> 2039 bytes routers/connections/arbor_router.py | 29 + routers/connections/handleID_3.py | 19 + .../connections/ollama_format_timetable.py | 34 + .../connections/openai_format_timetable.py | 45 + routers/database/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 142 bytes routers/database/department.py | 4 + routers/database/handle_connection.py | 14 + routers/database/init/__init__.py | 0 .../init/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 147 bytes .../init/__pycache__/calendar.cpython-311.pyc | Bin 0 -> 2362 bytes .../__pycache__/curriculum.cpython-311.pyc | Bin 0 -> 3319 bytes .../__pycache__/entity_init.cpython-311.pyc | Bin 0 -> 14434 bytes .../init/__pycache__/get_data.cpython-311.pyc | Bin 0 -> 2040 bytes .../init/__pycache__/schools.cpython-311.pyc | Bin 0 -> 7494 bytes .../__pycache__/timetables.cpython-311.pyc | Bin 0 -> 9502 bytes routers/database/init/calendar.py | 32 + routers/database/init/classes.py | 16 + routers/database/init/curriculum.py | 50 + routers/database/init/entity_init.py | 280 ++ routers/database/init/get_data.py | 28 + routers/database/init/schools.py | 115 + routers/database/init/timetables.py | 166 + routers/database/schools.py | 99 + routers/database/student.py | 5 + routers/database/teacher.py | 5 + routers/database/tools/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 148 bytes .../calendar_structure_router.cpython-311.pyc | Bin 0 -> 11533 bytes .../default_nodes_router.cpython-311.pyc | Bin 0 -> 9702 bytes .../__pycache__/get_events.cpython-311.pyc | Bin 0 -> 5998 bytes .../__pycache__/get_nodes.cpython-311.pyc | Bin 0 -> 37511 bytes .../get_nodes_and_edges.cpython-311.pyc | Bin 0 -> 11714 bytes .../tldraw_filesystem.cpython-311.pyc | Bin 0 -> 12291 bytes .../worker_structure_router.cpython-311.pyc | Bin 0 -> 8687 bytes .../tools/calendar_structure_router.py | 220 ++ .../database/tools/default_nodes_router.py | 257 ++ .../tools/default_school_contexts_router.py | 0 routers/database/tools/get_events.py | 101 + routers/database/tools/get_nodes.py | 563 ++++ routers/database/tools/get_nodes_and_edges.py | 174 ++ .../tools/get_school_curriculum_context.py | 3 + routers/database/tools/navigation/__init__.py | 0 routers/database/tools/tldraw_filesystem.py | 196 ++ .../database/tools/worker_structure_router.py | 190 ++ routers/dev/__init__.py | 0 .../dev/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 137 bytes .../document_conversion.cpython-311.pyc | Bin 0 -> 8017 bytes .../__pycache__/test_analysis.cpython-311.pyc | Bin 0 -> 3452 bytes routers/dev/document_conversion.py | 139 + routers/dev/pdf_utils.py | 46 + routers/dev/test_analysis.py | 49 + routers/dev/tests/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 143 bytes .../timetable_test.cpython-311.pyc | Bin 0 -> 2602 bytes routers/dev/tests/timetable_test.py | 37 + routers/external/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 142 bytes .../__pycache__/youtube.cpython-311.pyc | Bin 0 -> 4471 bytes routers/external/youtube.py | 74 + routers/health.py | 23 + routers/langchain/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 143 bytes ...nteractive_langgraph_query.cpython-311.pyc | Bin 0 -> 5284 bytes .../neo4j_graph_qa.cpython-311.pyc | Bin 0 -> 9043 bytes .../langchain/interactive_langgraph_query.py | 80 + routers/langchain/neo4j_graph_qa.py | 153 + routers/langchain/test.ipynb | 151 + routers/llm/private/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 145 bytes routers/llm/private/ollama/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 152 bytes .../ollama/__pycache__/ollama.cpython-311.pyc | Bin 0 -> 6861 bytes .../ollama_wrapper.cpython-311.pyc | Bin 0 -> 2400 bytes routers/llm/private/ollama/ollama.py | 108 + routers/llm/private/ollama/ollama_wrapper.py | 28 + routers/llm/public/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 144 bytes routers/llm/public/openai/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 151 bytes .../openai/__pycache__/openai.cpython-311.pyc | Bin 0 -> 5075 bytes routers/llm/public/openai/openai.py | 77 + routers/msgraph/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 141 bytes .../router_onenote.cpython-311.pyc | Bin 0 -> 9037 bytes routers/msgraph/router_onenote.py | 110 + .../rpi_whisperlive_client.cpython-311.pyc | Bin 0 -> 1300 bytes routers/rpi/rpi_whisperlive_client.py | 18 + routers/solid/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 139 bytes .../pod_provisioner.cpython-311.pyc | Bin 0 -> 6672 bytes routers/solid/pod_provisioner.py | 142 + routers/transcribe/__init__.py | 0 routers/transcribe/utterance.py | 42 + run/__init__.py | 0 run/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 129 bytes run/__pycache__/routers.cpython-311.pyc | Bin 0 -> 6428 bytes run/__pycache__/setup.cpython-311.pyc | Bin 0 -> 1515 bytes run/dependencies.py | 45 + run/initialization/__init__.py | 26 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1555 bytes .../initialization.cpython-311.pyc | Bin 0 -> 80720 bytes .../__pycache__/manager.cpython-311.pyc | Bin 0 -> 8100 bytes run/initialization/initialization.py | 1704 ++++++++++ run/initialization/manager.py | 146 + run/routers.py | 88 + run/setup.py | 31 + tests/.archive/pytest_init_calendar.py | 64 + tests/.archive/pytest_init_curriculum.py | 61 + .../.archive/pytest_init_school_timetable.py | 54 + tests/.archive/pytest_init_user.py | 44 + tests/.archive/pytest_transcribe.py | 35 + tests/__init__.py | 0 tests/_transcribe.py | 34 + tests/conftest.py | 3 + tests/formatting.py | 53 + tests/pytest_arbor.py | 33 + tests/pytest_init_curriculum_graph_qa.py | 123 + tests/pytest_init_x.py | 294 ++ tests/pytest_langgraph.py | 85 + tests/run_tests.py | 179 ++ .../test_inputs/init_curriculum_db_cases.json | 150 + 362 files changed, 27286 insertions(+) create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 Dockerfile.macos.dev create mode 100644 Dockerfile.macos.prod create mode 100644 README.md create mode 100644 __pycache__/main.cpython-311.pyc create mode 100644 data/init/default_institute/default_curriculum.xlsx create mode 100644 data/init/default_institute/default_timetable.xlsx create mode 100644 data/init/fpgs_data/fpgs_curriculum.xlsx create mode 100644 data/init/fpgs_data/fpgs_timetable.xlsx create mode 100644 data/init/fpgs_data/users/kca_planning.xlsx create mode 100644 data/init/fpgs_data/users/kca_timetable.xlsx create mode 100644 data/init/global_schools/Kent.csv create mode 100644 data/init/kevlarai_data/kevlarai_curriculum.xlsx create mode 100644 data/init/kevlarai_data/kevlarai_curriculum_lessons_df.csv create mode 100644 data/init/kevlarai_data/kevlarai_curriculum_statements_df.csv create mode 100644 data/init/kevlarai_data/kevlarai_curriculum_topics_df.csv create mode 100644 data/init/kevlarai_data/kevlarai_timetable.xlsx create mode 100644 data/init/kevlarai_data/users/kcar_planning.xlsx create mode 100644 data/init/kevlarai_data/users/kcar_timetable.xlsx create mode 100644 data/init/sample_schools.csv create mode 100644 docker-compose.yml create mode 100644 docker-entrypoint.sh create mode 100644 main.py create mode 100644 modules/__init__.py create mode 100644 modules/__pycache__/__init__.cpython-311.pyc create mode 100644 modules/__pycache__/document_processor.cpython-311.pyc create mode 100644 modules/__pycache__/logger_tool.cpython-311.pyc create mode 100644 modules/__pycache__/pdf_utils.cpython-311.pyc create mode 100644 modules/__pycache__/redis_config.cpython-311.pyc create mode 100644 modules/__pycache__/test_analyzer.cpython-311.pyc create mode 100644 modules/auth/__init__.py create mode 100644 modules/auth/supabase_bearer.py create mode 100644 modules/database/__init__.py create mode 100644 modules/database/__pycache__/__init__.cpython-311.pyc create mode 100644 modules/database/admin/__init__.py create mode 100644 modules/database/admin/__pycache__/__init__.cpython-311.pyc create mode 100644 modules/database/admin/__pycache__/graph_provider.cpython-311.pyc create mode 100644 modules/database/admin/__pycache__/neontology_provider.cpython-311.pyc create mode 100644 modules/database/admin/calendar_provider.py create mode 100644 modules/database/admin/graph_provider.py create mode 100644 modules/database/admin/neontology_provider.py create mode 100644 modules/database/admin/school_curriculum_provider.py create mode 100644 modules/database/admin/school_manager.py create mode 100644 modules/database/admin/school_syllabus_provider.py create mode 100644 modules/database/admin/school_timetable_provider.py create mode 100644 modules/database/init/__init__.py create mode 100644 modules/database/init/__pycache__/__init__.cpython-311.pyc create mode 100644 modules/database/init/__pycache__/init_calendar.cpython-311.pyc create mode 100644 modules/database/init/__pycache__/init_school.cpython-311.pyc create mode 100644 modules/database/init/__pycache__/init_school_curriculum.cpython-311.pyc create mode 100644 modules/database/init/__pycache__/init_school_timetable.cpython-311.pyc create mode 100644 modules/database/init/__pycache__/init_user.cpython-311.pyc create mode 100644 modules/database/init/__pycache__/init_worker_timetable.cpython-311.pyc create mode 100644 modules/database/init/__pycache__/xl_tools.cpython-311.pyc create mode 100644 modules/database/init/init_calendar.py create mode 100644 modules/database/init/init_school.py create mode 100644 modules/database/init/init_school_curriculum.py create mode 100644 modules/database/init/init_school_timetable.py create mode 100644 modules/database/init/init_user.py create mode 100644 modules/database/init/init_user_timetable.py create mode 100644 modules/database/init/init_worker_timetable.py create mode 100644 modules/database/init/xl_tools.py create mode 100644 modules/database/neo4j/__init__.py create mode 100644 modules/database/neo4j/utils/__init__.py create mode 100644 modules/database/neo4j/utils/neontology.py create mode 100644 modules/database/schemas/__init__.py create mode 100644 modules/database/schemas/__pycache__/__init__.cpython-311.pyc create mode 100644 modules/database/schemas/__pycache__/entities.cpython-311.pyc create mode 100644 modules/database/schemas/__pycache__/owners.cpython-311.pyc create mode 100644 modules/database/schemas/__pycache__/structures.cpython-311.pyc create mode 100644 modules/database/schemas/entities.py create mode 100644 modules/database/schemas/graph/__init__.py create mode 100644 modules/database/schemas/graph/nodes/__init__.py create mode 100644 modules/database/schemas/graph/nodes/schools/__init__.py create mode 100644 modules/database/schemas/graph/nodes/structures/__init__.py create mode 100644 modules/database/schemas/graph/nodes/workers/__init__.py create mode 100644 modules/database/schemas/graph/relationships/__init__.py create mode 100644 modules/database/schemas/nodes/__init__.py create mode 100644 modules/database/schemas/nodes/__pycache__/__init__.cpython-311.pyc create mode 100644 modules/database/schemas/nodes/__pycache__/base_nodes.cpython-311.pyc create mode 100644 modules/database/schemas/nodes/__pycache__/calendars.cpython-311.pyc create mode 100644 modules/database/schemas/nodes/__pycache__/users.cpython-311.pyc create mode 100644 modules/database/schemas/nodes/base_nodes.py create mode 100644 modules/database/schemas/nodes/calendars.py create mode 100644 modules/database/schemas/nodes/schools/__init__.py create mode 100644 modules/database/schemas/nodes/schools/__pycache__/__init__.cpython-311.pyc create mode 100644 modules/database/schemas/nodes/schools/__pycache__/curriculum.cpython-311.pyc create mode 100644 modules/database/schemas/nodes/schools/__pycache__/pastoral.cpython-311.pyc create mode 100644 modules/database/schemas/nodes/schools/__pycache__/schools.cpython-311.pyc create mode 100644 modules/database/schemas/nodes/schools/__pycache__/timetable.cpython-311.pyc create mode 100644 modules/database/schemas/nodes/schools/curriculum.py create mode 100644 modules/database/schemas/nodes/schools/pastoral.py create mode 100644 modules/database/schemas/nodes/schools/schools.py create mode 100644 modules/database/schemas/nodes/schools/timetable.py create mode 100644 modules/database/schemas/nodes/structures/__init__.py create mode 100644 modules/database/schemas/nodes/structures/__pycache__/__init__.cpython-311.pyc create mode 100644 modules/database/schemas/nodes/structures/__pycache__/schools.cpython-311.pyc create mode 100644 modules/database/schemas/nodes/structures/__pycache__/users.cpython-311.pyc create mode 100644 modules/database/schemas/nodes/structures/__pycache__/workers.cpython-311.pyc create mode 100644 modules/database/schemas/nodes/structures/schools.py create mode 100644 modules/database/schemas/nodes/structures/users.py create mode 100644 modules/database/schemas/nodes/structures/workers.py create mode 100644 modules/database/schemas/nodes/users.py create mode 100644 modules/database/schemas/nodes/workers/__init__.py create mode 100644 modules/database/schemas/nodes/workers/__pycache__/__init__.cpython-311.pyc create mode 100644 modules/database/schemas/nodes/workers/__pycache__/timetable.cpython-311.pyc create mode 100644 modules/database/schemas/nodes/workers/__pycache__/workers.cpython-311.pyc create mode 100644 modules/database/schemas/nodes/workers/timetable.py create mode 100644 modules/database/schemas/nodes/workers/workers.py create mode 100644 modules/database/schemas/owners.py create mode 100644 modules/database/schemas/relationships/__init__.py create mode 100644 modules/database/schemas/relationships/__pycache__/__init__.cpython-311.pyc create mode 100644 modules/database/schemas/relationships/__pycache__/calendar_sequence.cpython-311.pyc create mode 100644 modules/database/schemas/relationships/__pycache__/calendar_timetable_rels.cpython-311.pyc create mode 100644 modules/database/schemas/relationships/__pycache__/calendars.cpython-311.pyc create mode 100644 modules/database/schemas/relationships/__pycache__/curriculum_relationships.cpython-311.pyc create mode 100644 modules/database/schemas/relationships/__pycache__/entity_curriculum_rels.cpython-311.pyc create mode 100644 modules/database/schemas/relationships/__pycache__/entity_relationships.cpython-311.pyc create mode 100644 modules/database/schemas/relationships/__pycache__/entity_timetable_rels.cpython-311.pyc create mode 100644 modules/database/schemas/relationships/__pycache__/owner_relationships.cpython-311.pyc create mode 100644 modules/database/schemas/relationships/__pycache__/planning_relationships.cpython-311.pyc create mode 100644 modules/database/schemas/relationships/__pycache__/timetables.cpython-311.pyc create mode 100644 modules/database/schemas/relationships/calendar_sequence.py create mode 100644 modules/database/schemas/relationships/calendar_timetable_rels.py create mode 100644 modules/database/schemas/relationships/calendars.py create mode 100644 modules/database/schemas/relationships/curriculum_relationships.py create mode 100644 modules/database/schemas/relationships/entity_curriculum_rels.py create mode 100644 modules/database/schemas/relationships/entity_relationships.py create mode 100644 modules/database/schemas/relationships/entity_timetable_rels.py create mode 100644 modules/database/schemas/relationships/owner_relationships.py create mode 100644 modules/database/schemas/relationships/owner_structures.py create mode 100644 modules/database/schemas/relationships/planning_relationships.py create mode 100644 modules/database/schemas/relationships/school_structures.py create mode 100644 modules/database/schemas/relationships/sequencing/calendar_sequence_relationships.py create mode 100644 modules/database/schemas/relationships/sequencing/curricular_sequencing_relationships.py create mode 100644 modules/database/schemas/relationships/sequencing/planning_sequencing_relationships.py create mode 100644 modules/database/schemas/relationships/sequencing/timetabling_sequencing_relationships.py create mode 100644 modules/database/schemas/relationships/structures/__init__.py create mode 100644 modules/database/schemas/relationships/structures/__pycache__/__init__.cpython-311.pyc create mode 100644 modules/database/schemas/relationships/structures/__pycache__/schools.cpython-311.pyc create mode 100644 modules/database/schemas/relationships/structures/schools.py create mode 100644 modules/database/schemas/relationships/timetables.py create mode 100644 modules/database/schemas/relationships/worker_structures.py create mode 100644 modules/database/schemas/structures.py create mode 100644 modules/database/services/__init__.py create mode 100644 modules/database/services/__pycache__/__init__.cpython-311.pyc create mode 100644 modules/database/services/__pycache__/admin_service.cpython-311.pyc create mode 100644 modules/database/services/__pycache__/auth_service.cpython-311.pyc create mode 100644 modules/database/services/__pycache__/neo4j_service.cpython-311.pyc create mode 100644 modules/database/services/__pycache__/school_admin_service.cpython-311.pyc create mode 100644 modules/database/services/admin_service.py create mode 100644 modules/database/services/auth_service.py create mode 100644 modules/database/services/graph_service.py create mode 100644 modules/database/services/graph_storage_service.py create mode 100644 modules/database/services/jwt_service.py create mode 100644 modules/database/services/neo4j_service.py create mode 100644 modules/database/services/school_admin_service.py create mode 100644 modules/database/services/school_service.py create mode 100644 modules/database/supabase/__init__.py create mode 100644 modules/database/supabase/__pycache__/__init__.cpython-311.pyc create mode 100644 modules/database/supabase/utils/__init__.py create mode 100644 modules/database/supabase/utils/__pycache__/__init__.cpython-311.pyc create mode 100644 modules/database/supabase/utils/__pycache__/client.cpython-311.pyc create mode 100644 modules/database/supabase/utils/__pycache__/storage.cpython-311.pyc create mode 100644 modules/database/supabase/utils/client.py create mode 100644 modules/database/supabase/utils/storage.py create mode 100644 modules/database/tools/__init__.py create mode 100644 modules/database/tools/__pycache__/__init__.cpython-311.pyc create mode 100644 modules/database/tools/__pycache__/filesystem_tools.cpython-311.pyc create mode 100644 modules/database/tools/__pycache__/neo4j_db_formatter.cpython-311.pyc create mode 100644 modules/database/tools/__pycache__/neo4j_driver_tools.cpython-311.pyc create mode 100644 modules/database/tools/__pycache__/neo4j_session_tools.cpython-311.pyc create mode 100644 modules/database/tools/__pycache__/neontology_tools.cpython-311.pyc create mode 100644 modules/database/tools/__pycache__/queries.cpython-311.pyc create mode 100644 modules/database/tools/db_operations.py create mode 100644 modules/database/tools/filesystem_tools.py create mode 100644 modules/database/tools/navigation/__init__.py create mode 100644 modules/database/tools/navigation/user_navigation.py create mode 100644 modules/database/tools/neo4j_db_formatter.py create mode 100644 modules/database/tools/neo4j_driver_tools.py create mode 100644 modules/database/tools/neo4j_http_tools.py create mode 100644 modules/database/tools/neo4j_session_tools.py create mode 100644 modules/database/tools/neontology/__init__.py create mode 100644 modules/database/tools/neontology/__pycache__/__init__.cpython-311.pyc create mode 100644 modules/database/tools/neontology/__pycache__/basenode.cpython-311.pyc create mode 100644 modules/database/tools/neontology/__pycache__/baserelationship.cpython-311.pyc create mode 100644 modules/database/tools/neontology/__pycache__/commonmodel.cpython-311.pyc create mode 100644 modules/database/tools/neontology/__pycache__/graphconnection.cpython-311.pyc create mode 100644 modules/database/tools/neontology/__pycache__/result.cpython-311.pyc create mode 100644 modules/database/tools/neontology/__pycache__/utils.cpython-311.pyc create mode 100644 modules/database/tools/neontology/basenode.py create mode 100644 modules/database/tools/neontology/baserelationship.py create mode 100644 modules/database/tools/neontology/commonmodel.py create mode 100644 modules/database/tools/neontology/graphconnection.py create mode 100644 modules/database/tools/neontology/result.py create mode 100644 modules/database/tools/neontology/utils.py create mode 100644 modules/database/tools/neontology_tools.py create mode 100644 modules/database/tools/queries.py create mode 100644 modules/document_processor.py create mode 100644 modules/langchain/__init__.py create mode 100644 modules/langchain/__pycache__/__init__.cpython-311.pyc create mode 100644 modules/langchain/__pycache__/interactive_langgraph_query.cpython-311.pyc create mode 100644 modules/langchain/interactive_langgraph_query.py create mode 100644 modules/langchain/neo4j_graph_qa.py create mode 100644 modules/logger_tool.py create mode 100644 modules/msgraph/__init__.py create mode 100644 modules/msgraph/msapi_config.py create mode 100644 modules/msgraph/msgraph_client.py create mode 100644 modules/pdf_utils.py create mode 100644 modules/redis_config.py create mode 100644 modules/services/__init__.py create mode 100644 modules/services/textgen/__init__.py create mode 100644 modules/services/textgen/client.py create mode 100644 modules/services/textgen/example.py create mode 100644 modules/services/textgen/models.py create mode 100644 modules/test_analyzer.py create mode 100644 pyrightconfig.json create mode 100644 requirements.conda.yml create mode 100644 requirements.txt create mode 100644 routers/__init__.py create mode 100644 routers/__pycache__/__init__.cpython-311.pyc create mode 100644 routers/__pycache__/admin_routes.cpython-311.pyc create mode 100644 routers/__pycache__/auth.cpython-311.pyc create mode 100644 routers/__pycache__/health.cpython-311.pyc create mode 100644 routers/admin/admin_panel.py create mode 100644 routers/admin_panel_routes.py create mode 100644 routers/admin_routes.py create mode 100644 routers/assets/__init___.py create mode 100644 routers/assets/__pycache__/pdf.cpython-311.pyc create mode 100644 routers/assets/__pycache__/powerpoint.cpython-311.pyc create mode 100644 routers/assets/__pycache__/word.cpython-311.pyc create mode 100644 routers/assets/pdf.py create mode 100644 routers/assets/powerpoint.py create mode 100644 routers/assets/shared.py create mode 100644 routers/assets/word.py create mode 100644 routers/auth.py create mode 100644 routers/connections/__init__.py create mode 100644 routers/connections/__pycache__/__init__.cpython-311.pyc create mode 100644 routers/connections/__pycache__/arbor_router.cpython-311.pyc create mode 100644 routers/connections/arbor_router.py create mode 100644 routers/connections/handleID_3.py create mode 100644 routers/connections/ollama_format_timetable.py create mode 100644 routers/connections/openai_format_timetable.py create mode 100644 routers/database/__init__.py create mode 100644 routers/database/__pycache__/__init__.cpython-311.pyc create mode 100644 routers/database/department.py create mode 100644 routers/database/handle_connection.py create mode 100644 routers/database/init/__init__.py create mode 100644 routers/database/init/__pycache__/__init__.cpython-311.pyc create mode 100644 routers/database/init/__pycache__/calendar.cpython-311.pyc create mode 100644 routers/database/init/__pycache__/curriculum.cpython-311.pyc create mode 100644 routers/database/init/__pycache__/entity_init.cpython-311.pyc create mode 100644 routers/database/init/__pycache__/get_data.cpython-311.pyc create mode 100644 routers/database/init/__pycache__/schools.cpython-311.pyc create mode 100644 routers/database/init/__pycache__/timetables.cpython-311.pyc create mode 100644 routers/database/init/calendar.py create mode 100644 routers/database/init/classes.py create mode 100644 routers/database/init/curriculum.py create mode 100644 routers/database/init/entity_init.py create mode 100644 routers/database/init/get_data.py create mode 100644 routers/database/init/schools.py create mode 100644 routers/database/init/timetables.py create mode 100644 routers/database/schools.py create mode 100644 routers/database/student.py create mode 100644 routers/database/teacher.py create mode 100644 routers/database/tools/__init__.py create mode 100644 routers/database/tools/__pycache__/__init__.cpython-311.pyc create mode 100644 routers/database/tools/__pycache__/calendar_structure_router.cpython-311.pyc create mode 100644 routers/database/tools/__pycache__/default_nodes_router.cpython-311.pyc create mode 100644 routers/database/tools/__pycache__/get_events.cpython-311.pyc create mode 100644 routers/database/tools/__pycache__/get_nodes.cpython-311.pyc create mode 100644 routers/database/tools/__pycache__/get_nodes_and_edges.cpython-311.pyc create mode 100644 routers/database/tools/__pycache__/tldraw_filesystem.cpython-311.pyc create mode 100644 routers/database/tools/__pycache__/worker_structure_router.cpython-311.pyc create mode 100644 routers/database/tools/calendar_structure_router.py create mode 100644 routers/database/tools/default_nodes_router.py create mode 100644 routers/database/tools/default_school_contexts_router.py create mode 100644 routers/database/tools/get_events.py create mode 100644 routers/database/tools/get_nodes.py create mode 100644 routers/database/tools/get_nodes_and_edges.py create mode 100644 routers/database/tools/get_school_curriculum_context.py create mode 100644 routers/database/tools/navigation/__init__.py create mode 100644 routers/database/tools/tldraw_filesystem.py create mode 100644 routers/database/tools/worker_structure_router.py create mode 100644 routers/dev/__init__.py create mode 100644 routers/dev/__pycache__/__init__.cpython-311.pyc create mode 100644 routers/dev/__pycache__/document_conversion.cpython-311.pyc create mode 100644 routers/dev/__pycache__/test_analysis.cpython-311.pyc create mode 100644 routers/dev/document_conversion.py create mode 100644 routers/dev/pdf_utils.py create mode 100644 routers/dev/test_analysis.py create mode 100644 routers/dev/tests/__init__.py create mode 100644 routers/dev/tests/__pycache__/__init__.cpython-311.pyc create mode 100644 routers/dev/tests/__pycache__/timetable_test.cpython-311.pyc create mode 100644 routers/dev/tests/timetable_test.py create mode 100644 routers/external/__init__.py create mode 100644 routers/external/__pycache__/__init__.cpython-311.pyc create mode 100644 routers/external/__pycache__/youtube.cpython-311.pyc create mode 100644 routers/external/youtube.py create mode 100644 routers/health.py create mode 100644 routers/langchain/__init__.py create mode 100644 routers/langchain/__pycache__/__init__.cpython-311.pyc create mode 100644 routers/langchain/__pycache__/interactive_langgraph_query.cpython-311.pyc create mode 100644 routers/langchain/__pycache__/neo4j_graph_qa.cpython-311.pyc create mode 100644 routers/langchain/interactive_langgraph_query.py create mode 100644 routers/langchain/neo4j_graph_qa.py create mode 100644 routers/langchain/test.ipynb create mode 100644 routers/llm/private/__init__.py create mode 100644 routers/llm/private/__pycache__/__init__.cpython-311.pyc create mode 100644 routers/llm/private/ollama/__init__.py create mode 100644 routers/llm/private/ollama/__pycache__/__init__.cpython-311.pyc create mode 100644 routers/llm/private/ollama/__pycache__/ollama.cpython-311.pyc create mode 100644 routers/llm/private/ollama/__pycache__/ollama_wrapper.cpython-311.pyc create mode 100644 routers/llm/private/ollama/ollama.py create mode 100644 routers/llm/private/ollama/ollama_wrapper.py create mode 100644 routers/llm/public/__init__.py create mode 100644 routers/llm/public/__pycache__/__init__.cpython-311.pyc create mode 100644 routers/llm/public/openai/__init__.py create mode 100644 routers/llm/public/openai/__pycache__/__init__.cpython-311.pyc create mode 100644 routers/llm/public/openai/__pycache__/openai.cpython-311.pyc create mode 100644 routers/llm/public/openai/openai.py create mode 100644 routers/msgraph/__init__.py create mode 100644 routers/msgraph/__pycache__/__init__.cpython-311.pyc create mode 100644 routers/msgraph/__pycache__/router_onenote.cpython-311.pyc create mode 100644 routers/msgraph/router_onenote.py create mode 100644 routers/rpi/__pycache__/rpi_whisperlive_client.cpython-311.pyc create mode 100644 routers/rpi/rpi_whisperlive_client.py create mode 100644 routers/solid/__init__.py create mode 100644 routers/solid/__pycache__/__init__.cpython-311.pyc create mode 100644 routers/solid/__pycache__/pod_provisioner.cpython-311.pyc create mode 100644 routers/solid/pod_provisioner.py create mode 100644 routers/transcribe/__init__.py create mode 100644 routers/transcribe/utterance.py create mode 100644 run/__init__.py create mode 100644 run/__pycache__/__init__.cpython-311.pyc create mode 100644 run/__pycache__/routers.cpython-311.pyc create mode 100644 run/__pycache__/setup.cpython-311.pyc create mode 100644 run/dependencies.py create mode 100644 run/initialization/__init__.py create mode 100644 run/initialization/__pycache__/__init__.cpython-311.pyc create mode 100644 run/initialization/__pycache__/initialization.cpython-311.pyc create mode 100644 run/initialization/__pycache__/manager.cpython-311.pyc create mode 100644 run/initialization/initialization.py create mode 100644 run/initialization/manager.py create mode 100644 run/routers.py create mode 100644 run/setup.py create mode 100644 tests/.archive/pytest_init_calendar.py create mode 100644 tests/.archive/pytest_init_curriculum.py create mode 100644 tests/.archive/pytest_init_school_timetable.py create mode 100644 tests/.archive/pytest_init_user.py create mode 100644 tests/.archive/pytest_transcribe.py create mode 100644 tests/__init__.py create mode 100644 tests/_transcribe.py create mode 100644 tests/conftest.py create mode 100644 tests/formatting.py create mode 100644 tests/pytest_arbor.py create mode 100644 tests/pytest_init_curriculum_graph_qa.py create mode 100644 tests/pytest_init_x.py create mode 100644 tests/pytest_langgraph.py create mode 100644 tests/run_tests.py create mode 100644 tests/test_inputs/init_curriculum_db_cases.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..591b3e2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +.env +.DS_Store +.vscode +.idea +.pytest_cache +.coverage +.coverage.* +.coverage.*.* +.coverage.*.*.* +.coverage.*.*.*.* \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..95bab27 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,38 @@ +FROM python:3.11-slim + +WORKDIR /app + +# Install system dependencies +RUN apt-get update && apt-get install -y \ + libreoffice \ + poppler-utils \ + libpq-dev \ + gcc \ + python3-dev \ + postgresql-client \ + curl \ + && rm -rf /var/lib/apt/lists/* + +# Set up virtual environment +RUN python -m venv /opt/venv +ENV PATH="/opt/venv/bin:$PATH" + +# Install Python packages +COPY requirements.txt . +RUN pip install --no-cache-dir --upgrade pip && \ + pip install --no-cache-dir -r requirements.txt + +# Copy the application +COPY . . + +# Create necessary directories +RUN mkdir -p static templates/admin logs + +# Create entrypoint script +COPY docker-entrypoint.sh /usr/local/bin/ +RUN chmod +x /usr/local/bin/docker-entrypoint.sh + +EXPOSE ${PORT_BACKEND} + +ENTRYPOINT ["docker-entrypoint.sh"] +CMD ["python", "main.py"] \ No newline at end of file diff --git a/Dockerfile.macos.dev b/Dockerfile.macos.dev new file mode 100644 index 0000000..68a3d0a --- /dev/null +++ b/Dockerfile.macos.dev @@ -0,0 +1,38 @@ +FROM python:3.11-slim + +WORKDIR /app/backend + +# Install system dependencies +RUN apt-get update && apt-get install -y \ + libreoffice \ + poppler-utils \ + libpq-dev \ + gcc \ + python3-dev \ + postgresql-client \ + curl \ + && rm -rf /var/lib/apt/lists/* + +# Set up virtual environment +RUN python -m venv /opt/venv +ENV PATH="/opt/venv/bin:$PATH" + +# Install Python packages +COPY requirements.txt . +RUN pip install --no-cache-dir --upgrade pip && \ + pip install --no-cache-dir -r requirements.txt + +# Copy the application +COPY . . + +# Create necessary directories +RUN mkdir -p static templates/admin logs + +# Create entrypoint script +COPY docker-entrypoint.sh /usr/local/bin/ +RUN chmod +x /usr/local/bin/docker-entrypoint.sh + +EXPOSE ${PORT_BACKEND} + +ENTRYPOINT ["docker-entrypoint.sh"] +CMD ["python", "main.py"] \ No newline at end of file diff --git a/Dockerfile.macos.prod b/Dockerfile.macos.prod new file mode 100644 index 0000000..68a3d0a --- /dev/null +++ b/Dockerfile.macos.prod @@ -0,0 +1,38 @@ +FROM python:3.11-slim + +WORKDIR /app/backend + +# Install system dependencies +RUN apt-get update && apt-get install -y \ + libreoffice \ + poppler-utils \ + libpq-dev \ + gcc \ + python3-dev \ + postgresql-client \ + curl \ + && rm -rf /var/lib/apt/lists/* + +# Set up virtual environment +RUN python -m venv /opt/venv +ENV PATH="/opt/venv/bin:$PATH" + +# Install Python packages +COPY requirements.txt . +RUN pip install --no-cache-dir --upgrade pip && \ + pip install --no-cache-dir -r requirements.txt + +# Copy the application +COPY . . + +# Create necessary directories +RUN mkdir -p static templates/admin logs + +# Create entrypoint script +COPY docker-entrypoint.sh /usr/local/bin/ +RUN chmod +x /usr/local/bin/docker-entrypoint.sh + +EXPOSE ${PORT_BACKEND} + +ENTRYPOINT ["docker-entrypoint.sh"] +CMD ["python", "main.py"] \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..94851ef --- /dev/null +++ b/README.md @@ -0,0 +1,108 @@ +The main issues are with system-level dependencies like `libreoffice` and `gcc` which aren't typically managed through conda on macOS. + +```yaml:backend/requirements.conda.yml +name: classroomcopilot-backend +channels: + - conda-forge + - nodefaults +dependencies: + - python=3.11 + # Core dependencies + - pip + - setuptools + - wheel + # Server dependencies + - fastapi + - uvicorn + - python-dotenv + - python-multipart + - python-jose + - pyjwt + - jinja2 + # Database and Auth + - sqlalchemy + - sqlalchemy-utils + - asyncpg + - redis-py + # Neo4j + - neo4j-python-driver + # Data Processing + - pandas + - scipy + - requests + - openpyxl + - scikit-learn + # Testing + - pytest + - pytest-html + # Database clients + - postgresql + - libpq + # Additional dependencies via pip + - pip: + # Supabase + - supabase + # Neo4j specific + - neontology + # Document Processing + - python-pptx + - python-docx + - pdfminer.six + - Pillow + - psutil + # Web Scraping and Processing + - emoji + - extruct + - w3lib + # Google APIs + - youtube-transcript-api + - google-api-python-client + - google-auth-oauthlib + # LangChain Ecosystem + - "langchain[llms]" + - langchain-community + - langchain-openai + - langgraph + # OpenAI + - openai + - ollama + # Microsoft Authentication + - msal +``` +I've made several important changes to make the conda environment more compatible: + +1. Removed system-level dependencies that should be installed via the system package manager: + - `libreoffice` - Install via Homebrew on macOS (`brew install libreoffice`) + - `gcc` - Install via Xcode Command Line Tools on macOS + - `poppler` - Install via Homebrew on macOS (`brew install poppler`) + +2. Changed channel configuration: + - Using only `conda-forge` with `nodefaults` to avoid package conflicts + - This provides better consistency across platforms + +3. Fixed the `langchain[llms]` specification by adding quotes to handle the square brackets properly + +For macOS users, here are the steps to set up the environment: + +1. First, install system dependencies: +```bash +# Install Xcode Command Line Tools (if not already installed) +xcode-select --install + +# Install other system dependencies via Homebrew +brew install libreoffice poppler postgresql +``` + +2. Then create the conda environment: +```bash +conda env create -f backend/requirements.conda.yml +``` + +3. Activate the environment: +```bash +conda activate classroomcopilot-backend +``` + +This setup should now work properly on macOS while still maintaining compatibility with the Docker environment for production. The system-level dependencies are handled by the appropriate system package manager (Homebrew for macOS) rather than conda, which is the recommended approach for these types of dependencies. + +Would you like me to make any additional adjustments to the environment configuration? diff --git a/__pycache__/main.cpython-311.pyc b/__pycache__/main.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a9bb1c27def9bfd7217e3718e8ed06ed938659dc GIT binary patch literal 5715 zcmb^#TWlN0agWExkvx*3NQ!z|XUi`sHf8yd*osp`vgDU!*_9NhVv}Ad-pZoPSN4vw z#YzE_8mM9fh#DA(fjEFZ3fG1G;R0=u0x4iODd5ke!2*W^gc?W#)PD?YpoaU?**l67 zWjjcV-Y)0%c4z0YJ3BMW-*`MO1kb;_j!l2#N9Y^+vHEx`jYmIY5&9HKNMe#GO5c_w zld?oD46-0>!7M;DV_lslvDX=dZoVh|ybf@?zpYlXK#<(--P5GieqwPx8rTkHUWnO)>-k2AN2H@>Z22-JE z$Qa|34XJQ6Y_vVe##B?Z$r2+dn+E#x!w zxgpp0)1E*QzhHUKlIG0!1?B>}$WEXO3`k$KO|;&=J+*um*cae!@E!|R#SO|-o*BB9 z#xu`;h9n=zS~qV^Fp~dP{dMrtH{oYK3$}UNOjQyoaNZapEuepJ{m2XS4gJ8iZ1^A6 zas%xbuO;2db^B|tcpkq3k!tmk!t>}>W9_N?fSE^drke7Hj~iAg#HVrmynxeEHj_vz zf-)Ub1ULkVsRWjVSTZTdn9L^PSdefQuy8sK1G>Ys={enbB$H0#xPm1(QFd90DLEKT zVOfry!_Z|*&{%dLM-2WG?qwWNl-FE+$2kzBa{MZ zgjuA40y;n6Fi1#-n9?WG=S-wtVMOQ0-Z<0O-#0cWzA-wi*NqL1o;`77P#iryJSYwg zPUL;vv79p9J=;?~ma%N&Jf3?<4WIf85JtiTlu!~W4CngcJ<4y(SVaM$52g#?Pz3Wh zgSe*F0tp+48w7i1Uaye&7aU?>%AXK0fp}ZrmMbFYqiQBxqqsVmurH%-6Oc%L!wYENir|bs0^z99Th~cIybIY5G z;XS4Bo<)A8rR~}wb=xb&mV>31gDTg!5@@+{So5{0{4TRTMh2ff}yg*8gzY! z06eB(kt@3pA1t}sm-pRwZ&%&h4Smnv;YzQMt1V}tg1`r;>IbT-&lLHdAEf%gpO4&O z{&e)qqiT2nDp2a7s`pe??<#V;f3WI^3oZSmEh0C>W$ubXtEDs$JD6I1o+CI0{1|bHmci*+47RJ_yp%?J5Z=@$V z#t?+vYM3&@?k5XYLlzH0pbOQ*(3kA1;ZVImtYZrS-jLk6J_yclxI#b(+t9-x2r8}x z>w8woJyxs7I?2}fNc_A7*2nYxTqJKL=sGrPt@zex%}_68Jo6haLJXQ`rMi4QtOBG8 zrhJe<7;>&95NrE<`!SWi)1Tj7&D1c&E-aWymvA8gP8u9EnG+yUOvDLY)qGcDLlxjq!Poyac8AF(qS!tGn*|wyVDFD|HQ@@}KZ( zn{?+e0H}X^OH|*972ldHy)|j}6zg!Q4y$!o3%4%iR?D{_@5tp5wIy@=O#o2;D&On5 zJNxyl`K7)+S!uLnihQ=jXH`DC!q-zhS3=NJ9hy#OX#Z#vT2EjB)4(9`-xiqyD^Ei#- zWF{u%Im)RQ@`Ai$PsAuXf9CY)xL6^QcpW4ry&&~N>aHOvu})`XMYm=%MA4mKpkflw z;-v1$lFY?9aW&tnujE^hjo_>Zm%Ld>iipYcwe^BPP6h{o$|A(lk|7)I8XFrHc245y z1oRPLKx8Z!96EL18;}E@9vuvW<=fQW+_i#B#(uXrhwIBnb^kbPv+86c$CYolZJL`y5kn`GowE(A$QQ zqv?(uWYZavCOasCU75?m0uv`4r^}^xt}>8fijgr#C<{4a9tXH{B2c?7oAec zDHZG*>QbLqHRLTAMMJ)VQ8d)5KCf!%b+xu?s9&wE8gdtmq9IqoC=ZaJ)>aMeP;0A( z_NcYBY)1}n;oSR)ONjz&&|2L0zV8yq2O}2SFT)>%7n_Pqpu_~qmVHdq)q&-}a(ub* z+DI9}=NkBqMV8 z8!vI=DmVV$vk8Wmj$CzKwOn(mTlU=^D>fb~H6AJkdrQGy%HK};+bMsz+0=sF$l46+ JN8SNz{||BS%dG$a literal 0 HcmV?d00001 diff --git a/data/init/default_institute/default_curriculum.xlsx b/data/init/default_institute/default_curriculum.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..ad428f8e1f23f3e4f59f462abfd710b75fe5ae84 GIT binary patch literal 752436 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�=ft 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

Bd>kvn;uDz_8Vbl^_P9h;@pJpvw7|6 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 G#8yUma+uSlm-e!05*|eW@ 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

PLn{=kdvbFAJ2aKYF<;F>z?_ zHA38UC+gL&crk8!qNiK`)FkBk^cA%3!BD9_2@$p%Z)1!;WZJn^BZKx<|CoL+xLMjqY(36Wk-w%4<|eRvV2d_ZKcs zad(I*@53pU9W*_v64x$A{Fvtim(sckEsbz*8z z_7GCinwYuTDIyaYg40AeeU9TS~anQ?@7=oSLJ?#MSd4EieZXLt<<9aqf&L6d&7qwbva(PGd_ra8-0 z-Ec(nV*?Nv8qdKWCugmoc2Uor*d7Bxa*akzo!O-0z7q?6{qR6@XbTYV9Z`#&MqdGe zDp=#N+04Vq#Z5-;tC%!k{bqHyxvr{?;A(dBklL7F%j2iAR&W@kW6qBi_}|pBN65WE z;E&Y2-fbz`h$DL>jLN}j&$BysvMadoqz-oCNf22XFIc#>`!xRaD0#AL8q7gt9RPLm ztpfzxAn?ZN=mm7?)qfABdv-E^0Zn=JUx4WzosOPC)n5GvV7hxJ^Jh?uSN{f>?vK;a z6Uff1e-TV~<7EB>lK1ML1k+tP9X)~=y!wa0bQezMk02DU{w^@xnbXk&=+d*l2~2n5 zWc~n}^6aky(;Yb--Giz<`-{MI2Ttbqpcv2oY%txP)6pHs&a*!mOt<4?ewP-z1d{OV zj|5k4I*t4RQF!(Tf-BdZB>#Xuc=rDQSAv~JZb640{m$Upm7gD-z65eCWN{2;aqJIp zEM#+d52UefNn_fQa<-v>z+#}4LEIHF+?7F`6)_x`f>fCn-92|@Q~~SE0zz*exK>zH zvWDLjLf$?|t?8(b1y}D#Npce_booQx(U9~c((3Vt+2#cB^MMaET~oLE#e7or2gHI? zw+6(bQ}qYMlCLVhwjeo$OR|Z@#i+B1#cMhQx9^Qb(X^_gSw=M_&~pif1f964*hMpw zy4Xdtwu+%WCqHPOq!P&>-Re^1CGe2GvybL$B}5xO>=)0Dp=1}!iQ!}y%S{*XXDJ?y zl4$*ih7zaAp0+h5#-FA?Ehc_#s_eWfPE+ivj}2t#rs>a$nWk;cirHSjR}_3FPSftX zPeJmv6_sPKGKPp_uquX;W3U>JP9##`Xy=n%X5?zK+9y06JHy7=C0)9x`q>mCZ~j{b zwgFxpIVqk0i4(X)p-YSKsH@|E72iV}W&6#chg4Pxcvb+SdR%%QY zF@`DIQVdkR>`9zC)dN(Nh1(GI!<7!vgd(?1RV%_i!JAeV9H`#0N@$92;u-p0F;`a6 zFQdpEK;OcoZvBWMvW|w4p6uwWjrSMAR$T$={}vhqwEtRMU(y~7Ty}*%vNHF7t>bMx z9ewW>Mn}?gx~)nh-6!Z2u70R6DtcP%);N36lvsEING#ST=m1De!!QP#21K6G0(jue zxxQl{xu3Dg4sZH#wRs7f|7R=G#Fl&}UH<3m-r}`ZeWreM;b{4DeQv{Ii7-dGq z6qcGwUpEcyP>g$-_5gWQXs|x-PbyRixRimFf0B$vGB^aRLOEPR&FIl;3nD% zAXRh2CZo)+w}#5Q8q6}YJxIoFHry>cN!{9FVsn)m(~Rj>0;UdS8ewLoj$u$bPT@AC zFcm=a^$-`5=K<-%%vzUlNoP)QH&uuA^|D{Z8(K HlF}zOcc~dI02iU11|>vI{k9 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

`#@lFG ze#Uhi`sz?;@vyv6FSC9z>M`#R;QtKgAN@Qj*J#Z-EU)(oVugdfsdYf#*dh)Bou|3O zqX~#W^`&Y7=Oq-&)ckUF#a27yn@qLv;Y{T{XXH*T-czVhdx8{K+O?Vp;2O7<3-7}5 zWJg~k!rpkV<_rx#s9{JAlaVqL195+?I;~S%sYQ{DsFG?2-x8K;I{z>R|8tCCbP&kM zOb8(3JcIn6S&)xJDM!MRg;o{<_i)aB!T!V~PnS z_UkBs2y$ef->7yx*G;?A%xo!v&eVZ1>0|?^sEM*9im7T~OuPG`rUyd%Iku~i=TC%r zW7$cBa39!3rqzy(Jnrz$yP@{;oIzce+6qK#K%QxpgsA}v%fS==aOU5gZ{Z2FBYmH> zL5peC&V(>xLgSq^0rr%sZ&7&MX`i)xV9GoI9~{aDwhoMhM5iYao%AHg&(QJ1n=D3C z1c`vK(>%cTfj3u)35L5UJ&AM%I(~%qr2Y(vf4OE-&2$-&V1-HUXnq0+-$6)CAWRQ0 zwy1X8fH%U9YVn3YZUFw1Es(f@{{*y0&{%}=gj?N68Krh`@2*b?2u-K7MuMD{t41v) z$Ivv|NfUTJRa>cQ$e3Ym0D~Yw`cCdbTX-f@H5o#(N+R>8b(A5ersMB_u(s|<;)wm7 z%me?F35kzUBEJYg>RyOJ(4Q7IpTsNj%5iJ&cih?Dnj7@&fA?-D>w)u*N`v|QnU~+Z z-%*_Ddq;giZ*%(?!uqKn-*IHYa=IpM)vN&>SBDyP5G%U+*!n9Abx-8A!U4wEl znR!I{;bgQvRGhPGOe+(+zmSX@R;F!;zQ|?A2hFp~#Ece_F~iEk_0gwaiqgi|O~~{C z(I@R8R%3i2xp7!I3}kui_ze46i^|e$v5tp^l&i<0U7AHxWcphDD$;1&9cKoW!^Wa7 zve@xm?{D>~5SyM)zPzMtF&6E}Y?pqmztyWk?8kgE^OCa2Sad#S(?%q9RdtDu!jW*K0X%$0c6P-1F?oq1=6^>lqGEdFm_#^cCIk)xGYP{Oh_=YV3Os$ibUk$qOp^K9Znatq&q{q{rHtK*M#=Rd!h z`vWk@2e%%cRXvC^mgW&d2sdo4XPzhgXz=xtj6UVvB3JU~mAB6h1nBRzcOth4xV9H- z=|El`z=vcxUr-^5_lxyC*eJ(ib!V#g4vd{17`qC8qNBFVnNb0MMZU2(G=7#Nux5R5 z>@<}$e!MA!;2FPAvmbt_)=lnZ%G%%jbbdL3^xmp`HAN2^& zD7IuHKbX75p?UpBk;036BZHQEYFSTwu4(2Cl^qnBbqjPDGdPabl;(|Bv%D~@w`v}| zN$=7krL7XjxPJM|e5k8*!=7{B80^rabwRSs4?JBfq#_v0*Kj`Fpeb^}Id5zF$C9DL z$$_enarh1xs4^S3zeKL=AsMp0a>GSP%tdSny979o*w7s$u^+g zt4OZJl=B|`(HB`$F*tVi3I`p3%B|zr0SO87H=8L_nM8uf{x{ZHVZFq>axNdqv6#5i zdmP4UdM}*7-aGTPxio2%clwI>kxQ+4DPyNEuq^zEVZ@$Z50b?<;u7|r^^uH<`J%G_ zy|QSN1<6g!^*DCVc;-4BZPOl^5m|gqqcK6lQh)IA#1(PxWD$IFV^)^Nn9yrf8q8jO z9LpkWpxP+>ZP41wd#U;Rr^mkdNdCdJYx#Rg$r$)5ux-FPh?for^yN3@4yZbn>AdEd z_%M2f%A47>@lg5G2PTado9vekhOWIlj32B$y-@53>k`z(EP6cN5mptisc$Y79z8z_ z4&6J#FnVQSc9LwgjN%8&`-}Ct4kw4D0<*0pV_!cKJoE<^tzq0PVJl|7

pfO(^yjqg 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

u3#n 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 literal 0 HcmV?d00001 diff --git a/data/init/fpgs_data/fpgs_curriculum.xlsx b/data/init/fpgs_data/fpgs_curriculum.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..ad428f8e1f23f3e4f59f462abfd710b75fe5ae84 GIT binary patch literal 752436 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�=ft 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

Bd>kvn;uDz_8Vbl^_P9h;@pJpvw7|6 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 G#8yUma+uSlm-e!05*|eW@ zlF`;Cg)OO3-*(z0ngsLbKElZXQINYkcOADEv6#UXsc4I9-&{lUr{b%M*AO?l;SWjqt~ z2g789G0nIG5zp>&}MRl9{eMEsr?)45Fx8m{>B3>zblk(o^!d1CY-rB6_SUmDYS zC>Nb60aZI)jOOiyYwFXggI8aQu+hs zHnU-u>~3SWH+ud1-M@zDquzvfj_f_G$1XI-q6r^n4mxZHJb@6fH_%N69n^XvjXdxK zdLpO@eOX3M!d=H;Elt4KD#*spMmDw{va#V(g*O2V=5KWegE3lmZd!1sx*RZeygx*WZvD zu$=v?@Mo-lu?QVnH!6iH!N>L@nh_PyjKD8Bai0R35io91MxSG$@Va3>qaP}kc4x=H zL@tao$D4<@D7HbeUoZs7APRmcYcAK!-iwSH;aBX`eyJkM9Wi z;g2NkQwaG1le{bZ5lI=+;EIPfX;uvMmP2uITL2;_BYZ>q&iI~3q3yBagGiJb<;HGDkK?ZI7EK;Ij9!{kf_S3VHR5^L zo?U8=1&Jr`(P8%?o=Cy0HQ2TgPwZjaLOijDks=UJ-X~mozoH5f&jNc8Xzi5(WX+$7 zAZvRNXhq}`4MkHypk)suxTF~MIWO+0gOdG@I*>g1N?qHYz!w;juY}5;R(g;0&@^He!%6fS2?P=RrA+`EE=+3HK#?^IV-5b&~Oa0iA@w?v^SDY0@ z7iPu$d@c_&Cf%0PioSF;bVPBi&R5IpYLz&So?D--buM8GENhTM$s&ztj-y+@DE(uq z9QA*jDrflQA5-NrzwW`nxA_=Kxq5mu_%;iWZxb$6c!}_B7Qnap7)rUJ$WR_X)SroR zjmShf7%c}ab%)SEiSw|}bIW5uwEfEmMB859$KMFg+LW}~p+CtyxiEL4)?ikuHS=)R z@3o-Q=9%@rjM=Ek9^=JY1K?d|eiFDbw+~(4kFe>pJZ6YPPVj#{8QkYBgttD>~@=z18}P zG@0P_CD%cZ^$UtJZQsnYG87d#(q)nD#f5?Gl}+sDUgXkHvv!u#N1Mv$%WEaqaeDcs z9b<_qHHq#|k9Im6_}RtdmGNU4*G|r}kjxB#hFZ(t<2j14 z`YEMxAT96KRyd{*TzvT$MU=N7F13>5qDEDRTzcG6e}t>1W9qxdxiyAqajE@Qnl+T; z*Ptg%C@+6O*1Wh(!$2~2Z784%zds@uG*By>9suS|50Rx{F(*Y7B10)F70!Yx3 zhd_d4fCSe8zqaOqZ%qc@YJv<7*q*l{`*g2~yyZzC0l;8C$+t5Z1_$ikuvwCqp5@J( z6u{sBq6ts>;oDkOCOij>AH-_)G%Eyt56VRQl)s-I_95MTPRPxX-xUkLf|6Oerhmnyt@uul_UpXw7S5yG^Uv>Wo`GbTXWiE9RPYO>_% zJkqDBKEC7AEATzb)!@{*PtiVIO%GjuO_o3Wc*3pO@2B`S2maa5k|5)rDi>Oq*_;=u zuM8vWsHmBqTV0Ql*sbq~cs|WlC;0#mV>czFro%PA{oIYG_UkE@Qc z6I$|Ok@eZZ)YUw#1+6>vg>J_)AJQsEUtXd1oK17M_Kn(fMO&`t%I&T|@`dK*E;D)- zFt3mQ+o7vmf)4Oh=vqUENvDE@6Pay0XNrmM9k5^a7CY3Ybvn#Tl#E2AFouoJ@PVR+!G@DE<6_1O z1}|%0L-Of5ws_^>vAn~g3Y&)o@Dr{zH+a$)RCNUK)D{Hcrbov7dje|M1_&2PKmp;V z2bJl{0gQkw(?vBF`tg}t9RNlMK|emULfc)QT^9egsJvkM{Rkq2!sr00CkG_*7#hky znwo)}kbdeI>OlDi3>BSMNAR#B8>RqWp~YbYjvj_j8Sdz?s!r7n56^T+rcHBS1S5hvuzvVrM-S8Vvu>l6iF=M?7`sBi;HQ0$AqIKfLQG7I^O7Sy6aM=lm(Ly4 z>Fzw~^UOM%@YH9pFehPQ{sb@Uzegq*HW98IfQ4}fJ#KoZx_|KSr%5QwAWMUcN?>k8 zmWB6GF`mIDVPwQ^d{}*%3zgwM?K2tXGP%A>FmY1-rT%_B}hK8Hguk4JhH~ap%X+kv0 z4+J5ZEN^ul*}>KXBh-$ywQPtqH@-w;*|>aO7BJc82CqYM!5InenGoFZ&&!ezW6M8I zk^F8bn@8!A>I`M@21U+3yN|T({`gr>C)DR$3{Q#C*rfx%MqfYlV}q78GiX@HUe zG%ZX)(}FISDFV)%Aoa5HjJ_}S%Da%3PN*Qp8Wn|6VpD`{_6u8FIG2W$ENt(Dy?RtF;$ur%{$-?~zh^BFA1M?SZYK_U{~c39lEJCw5fr?Zq3J03TL`*dQk`D) z+G^>zKyN+`O=_p4+nHc$o8#d}2sFxXjX8yh2qQ=yy#hl5hSY+4@isBc3t3tKuK zVVq7p-W)K{%z!cFXk=6zJB*4uxC@2UNMKZ)eG?i(=0brxy#ns^6vn*h6z!Zq;%Q7E zG80e-nF)y0!8fB`-6nub-7s$v6fBV84Oc+OgpVXZXgEcKDRI_vFBMFNX(ZG>Qf>KK z#JU$Y@3n|HDIJ^LnY`9^g{&g&+xfwq;q=)!e1+*-@xMb*&m1J&p#x|; z(35{Vq5qoOLU#xD0GZnYv=9E_(l$KQ20p@YZy|R_s12M&Y6Bl(xHpFm)CSH%ZQvse z_r8S+q=us0;^iaY1Xl!0Tb>2tmx>}n93ke$4*WjH<4>*md1I38N2%fX8IkL0u~iCk z(`HM*e~$h55%p_+v6*CUe!k)J8mi{^{SLAw?X{wclq$( zN!A0!WuJrUZCSxL+c1ZJ3c8GL_lj!&YLtw>5b~hM)YPlNVgxb5x}dGR z|J@DLa?QGne{hy-a+;=;%bOP+j;OCig8Q|3tL#}*;gzOt#jild=^$YbuQcl4GFt=) z(Kj;N6vkfTsXw@@%kbs_@)1g_Sf_2boU7kmXL&Fxu1u|cTIj=&(c$EXkbdl?E ze^dd0(MT8u0k{2FM1>nfF9ne?Y9M+6>4O?fEhoCpM9s*q?1e_dg2#wUy^0j@3J{n2 z_)mY^36lnvOhtSBiHFF*0qj+{e>EDm>G2FTE~xUtgwrwNQ0!eX;*9@Yk&9l9k0Ff& zgX^)p-c^u8NK_S_+_+@FI#^qfnc+Wb!;Q?#B|Zj3q^pXSnA)2s2#MJ=@!6KMT~p;F0_#S{7|lF6+J)i8kRq{6_7WS}(1 z5lYh?p){)zN^=aMG*1GhSq+rtI8d5lS|DoHqN?sp(V|U4J~$m#4RjzF!cRTVn*bfS zVeU2QXHJHvn&?EH>QBnnW_P(g4+d)6J%#rouhgTph5Dr-&ab$s# zkOjg)%*%(VkEA4sc{qr9_Jn#f2ZB$hfD@ERaO~n4#YqtJzz9!za9Imt-iE2774S|U zVjd2Oc^EB-dG-W)C(O~lh+A%gRIVfWwdr>qmrxuxrsRrmTGvVfJ>{hAj~=6H9pCtF zPenYlR$1EEvg(cau7-rZQq7^UwlseQ$7!*b(dtef%dWW$LIV9|^q>Inm7)~oBOx%u zJ|Gt1D;=6ZDIdpu4=hH6ai9N(Y5ud^tikLw9+OI&_zB%Bw)gX6P=LaX`ps zkeeqW-Q_sY$>XS_yNz(P$r!BqY*-#hB*75P^*Z1AM{ZuU9s4hmrqchTq$xGu%+yOr zEBt}ZL+^bzHO#BT{{JOSOz8hq(qxCX!$UOAL*~U3%K=WuV8to0WA^vt)z@l~#!i~P z_e0H&*`ntCP;DK~v3WN7w!s?Eoit?o!~0sV&TrV;WWV4#Y9VK$>M{%$!pT4xot+a9MUU2`HD9jGuor{DOTg-T(#>nac*UG_PwU_pm3s{9HIvM4U#4U4bYq&n3_WA2(27 zo=}~IRKZgOm5-8j>70JTx^w9=o>*$xNpKlBHP!9#=J{0lu#D$p)Iivvr(LmPd3~(@ad8mZXM!gfB^8D(# zeDRPt*I^0Wc%35)qYm$;8}g!lnVU^`=aJ>3e@D3;`LsSUTv?Fi`fAqrLUjA@kN9t0hkkcYyBJ^K z2wM-_e(K@FE3b!DK3-7yxXu>7er9i6*4Cik3;Uig21qbg6V}QqiUv`K6`;I7gCs@Y zk)&uDNs6YBq$miIqGe>VDsm1$*39e?JMEM;jtk*gI=#9uVi}A^-B+Xd8A5p0R&&#z zI_t!3j=@&5n{VRRQ9nxeGklh_(j&|AKS88fMu=g*3(-4-E|-s$yE;s2`4tsf0pD+aPwGzPL(3}mfua{U*T0y*K|)-lA;RF%H&b*}ztJL(YjG3EQ0 z$3IKN*VA{6$NyM5Uw7wSVfdTM@LL#wli?VGVPYimqrZuWzJ447W5Y2R$be215o0%v z-$gS7)AFL!IP%kM%xF$mAsJ7i=V|i0ys6=c@n6|-CPwB<8z(=+S$+(SoQnv_9Gvq*~8FI4aB2*zvGc4Z(R3UpVP=zr- z6)FK$c<>lw>eli>C3gOdQ!(Jjl_G8MhTig-HVDPQ&l0m4W*90k5zcCgC_+*m170Ma zwX-GU#{J9c-+Pvxi0Te=ji=@IzB_h5(AP%>O0vptuaB7CC&^HU> z@OO}>m;ZHrZYPMtb5uYau9uDYk#~q6flC$Ma_}SXz>lbavVAjUdAa4i{=-8BZ#Pjw z=-X6b*bWmV1gkXbn+>Iy4O29`g4LeuvR3me@E}O7bN(IA0lf!oIP+W^jewlEoX*JZ zKHHqP@vX^jQO(9{hZ>pTK7Y6?cr30&8N)qW)&IDX|@Hty}`!RPnZO{yEHp8 zh6U)l0zonhAUqf>tPE{vdT*D63jmk0AhASVYSr(pCd8fwoQre61I|2_||g@uvd?$w!L-Zb4*P9C0LX^ zVY}WxMp|(;($I8y^Ohq|G0}Y5?L!q`0&o-wJQtbZG?I#an!r)yfhIfezfU`{)`SsW zL^dZ)7~utzJM>|MSNB4oJ`6}lYa&^19->6mN3vc`$au8fWC#%_~BuR ziMFnPlM7jw&HTr*?6Ch>mTiZh#NR5*M|J_irSH(JNZ>hu3-V6DB~IVp_awh9Ew`r4 z&Mj$iv!-iThj?BbI&HyIn+V7I_|(Z)TwnM8&vUD+FY$1EM@}39Skw_mlZ!YSxK!bV z<2xw1;Ar9iu&5xFLW2H`2hxAomFD<&AQ(!ZSmfIbf7WB;BeN+T_mNSf$66Fbwy8gP_WQ+g|o=rEw9?lq9!6zf>z zGIfcVzfC-s7*!EVB#2)k4mdtSQzdlXJx3w+F4XeIR9F<6# z(OUEG>b6RGCyZVkUtd`s6)`W8HM$W$)a9e%Xlu$f>lH+8iCfWDOCxh@`CUnry(c>~ zGiP~4%P{SS^cPBH`Y6RxIHao4c;y=%U|Jm}VvHhr)GblKkF?`8OpP28QC*@dX%6wI zzc%J2e5FXa4GnB1?Sy6YN8&{tvW!E>GQy=wS`{qg5GJ|BYA;d zSs54;iTjr^kxxj6h#O-fw;^L9U$pGwmEDj8b;}M>_ispomLjw2RHr`rXy#IPW_0Xi z7BzzO4Te^RlU1+*F&IBj3~0hIMzC=ONZLlx_a!b1k;L*yah2P9yGeTSB7yO-S=<^a zgU+@_;sl%epfa5ao9pIo$MuQ~CQZ$gRxtU$TZVPAzM zishMZ{mGi%-6K9f&RgiG-NSv7UfZi|6|xz*tF?r}DM==~>7k-1Zj+SKks5-;(?wbF z6=PnYwlVGybp@Y7)ZP05fqCu#^R^g3#mEF;o;$$2=ST&t-M>Kb&WMWp39+Z(+DEKh z#ON;{*tw9QX5=pL6#2C~Lq&DlH)=*tVIyp*5`G%{eY|^%4~Cly&b}d+TB+6UuB#P| z^HKYC+%MU{$G9SKtv|h+H<+ zLrY&Um%s{e(ZPwrE2JxZ=7Zfo4C0Dbf5EIqbTA?TZvaRC&Kz;{!Qki@pyhyO4vsz; z9Q|*k<-lw*u0(vk;OEzi_gU|A{yUEcI?P%`gbt6cQJ z-r!DC^0idWaa>I^t6M*TCC z&9`MFn{tzGUOMJlM&cZyXu1`y^ZQMk)N4K0on7x()%&}QlZT|4<^8#|mY+8+mM=ek zYM$qRZPR1|B_ms;r$EMTa;tupy1L7UV!jwy-58#uOmNCd#Xfad-EfHFe;?vvtq#~0 zqPRM={(&|HqWGQevOpCiimM}0JQv}vH=?*YEbeWDyGEk8dIjxNuHxdeB|Cq8PZmx6 z!!pB0VuTqFb&;c9jd2ipz<`61^fVa5z=eH1N!D)`!5}|q)FS=BpCjG8r_1tQUTQ~G zbdT)y<4N+jtURI}WOls4TK1Qix&Nz+)KY~@J75=FlBW8l0r)k>Jx=XBZ6y1vU&DTs zPHeX)%*@LWWPX(Yn&}_d!mnXKQqx(fo@f&hO`f*;uAJ)RA?Vi5FiCZ~HdWtb0)=Xm z+c;$E%aRo`RrOzH$~ePRRSzyp7nrK*0X^8zwmPAy`fYV?`!j&XCh(EMUy);#>Or8f z34EmOkc&whz!7;SF4CtxXk0=b3{FcM516)QVp+IH1}3XM1LIWB?i5mx&vV2yc;s|= zVkY`gpUJf&6NFSJ_sAU{tAE69RvytiB=D|ZS*Oq^mFgOpNaCJxX@9zY{igC~|Y08jh~p^-WePb_5sp4bCC zaR<;y(gw!b?IvC(|gyCIKh)H*kraA#TD-?xfo|Pb+tMd8UwSw%1KzmI!OnD$>p_3i6Tlnt(9{Sg z9y}0H@dhmYBr=8%_}%}9vo`^!^6mPDMH)zx(4-{$dqyKYqQNn*oF*I6rn_^ z$XG;X_O)%pHqRwe6v8G%6UjCecIJHRa=*|0-1q%_-}@fldtAqnb^ee4!L`nFoooHp zTEFu;)0<=Xfi9Qh#!z5%`paX6tbuu{bj(W`VqQuE4A~0|nQjP%tWiR5*pC>e?58UT z#qvWFMk6F$@1r3!VL+%i)ELTH9AMXI>_c)b8vE!<-FcvnPZy@nBTOAbehpBkX(A{8 zR{6#5qN^1y8@qnwequq(cs8<;fc?e-H#V?$ed#&~_d-sv8vs&R2RY?`+(B8t7w#-r zyMt1e$-?|_TalFnZ0dFJS))UN7@L}<1lZJUa7QffIbc(>z#Xw{T@WD7N%I^#$JCP( zK1YAfX0R@&lO4aZodpDzuHP)E@3nQ9h-V=k3(eAw3431S;+(b4s-6UB~p|E2rs$`E7$jb#9kA z7w3cy`_{yoQT=e&)2V|;_GeJvSMBW~n6-ZBF5o_AmP++^94jr8>k~cSLD&;j+8kMo z+|2-J!aJ40L z0?wH-CmVRRI(GC$;dkonNISuC>`n=ys1AZyv3E`%qo)7ob+MVr;8Ioi^X=U$&SS4$ z{3d+ZF@rCWKBJy|w{)-EvcRFx;wE%b)YcrjW`v$b|G3i;g?+gTTPT^`oyc!Vv0mbp zUc*jN9h$lfMO%KF!jVGq%5pQH_uJn#EIA?bIS5WyhNG(yHA|l#_Fq_H4-l(gF3ee% zpZHPNc1~zr$LUd@#BN`UIlG_`!#Ah)noV3EqC1YyYY%eD%lgcRDPR08pg|Lx(EKpR zBBeK{u>US0Cv5qNV9kCOxYW!i7|kl{&1qIuMR<3jv`B;4kUOZj5Z>PA9(q<7KP-}p zCROHCem;U4+54*_^wQcC)Tx!%u%t!iv>HOcBae@5BpD)fUNr=#y9q(qQ)eiDhDXl9 z6>edM$l!XHU*U>-+I&`51c+4HaBpv`bs6!dV@q8|68FKHg^@q9DxY?&P7U{X`4#xz ztexw+jWT-K;k~fSXf0AimFq;$*d7o={j%SjLsaQ6$~_BmQ2`)r_ajtBSg)-W>rswH;O`wG>;7#LdC@`VzY-pDdQ4c53;TA zDuU+b=b?Swe8$r6d($XBy?3FXonSD6(oConv@bXh?%=LK(L+}+&}*0X=W!VG7gCxN zS@P~Tq9(cWDUH~h8i!Eok*}ylxu|kF_NEjHys10liM^@j4c1Q$;nLKz5|Z3~oPm1T zenZn;j8EpL(4x5wCrHDnt2N%D^)g95sC79|yH|C5=AV_v>kfsm2 zNHbgKQnL&?^}4!dWz2Mmnxtk`BOGs30xhyDCL|+E9Jq1W8ChqArAu(ey3b3DN@4jM91Sg(4s1Ce$`CTO$Stkl{Zp@2^tqE(??i9P@(u|A|t&Q zLJi0cd;se>08p0dQF)PE}dJdOV1h36A7qv)UVZI{QK3?;QP z`Br$Ic5u)?|E<0CW%)pGTqfb@P@mqmiX=i_*9HYxB?V^dB6d@)-Z-pMzaCN3r&*N- ztCU2G9FGaH%N7@(h{?9gJ}ayM+eEL?pt2@@flRCIBa_Um#<9!lefsS8?S-LgQc|;R zi4RKR>?4zp*kz-^Ux>JAua9usZG(^K6;=>-`N$tqK-whNL=J_CdObx4-H;3KE|uV> zcJ1+z7f|5ZA|C3PT~>Tj`cYQAN9BXr=B{HFzkB8>(e4wO8lQB;j2&*rGdxS<{Tvpd zuIF^rlH`{-ktr@DWiQ|>!ueK*sA<`(I&H)oXW5LKHcF0)?<0?8hPwKRAl=4Ni0fE* ze8LZx4?0yY=g&(ax;ZmO#N2Kj#8pK~ntrDmk8D4CUOQkb)DIth)EU-g0ij-J<4`7} zS9rti;!Apu!$o?QOP-wKe}1#XU{yCD!8K6m^xb$XZEG)FO`uL1xJ&SdgU9g${!g;dc z;LQ71w=VWp{pIaBkyV|%m=-hKXyy89Dk({NHF$E{`#Qr>zKHR;l7ZsInVxH7w42vf zZaFxNfV13t@fJACtGC*`?&2L``%1y~{hFB>zhOh%d3iO)3^Vx7?8z#olhf(_CP7I_NMAj_{Siww~~8jA)`uxOx*MT65=G{8YL(1mDl8lu4) zJi`8xEpuq(IP!!MrVGIU1i0VzTo#&aaU982Y21s?Rhh8mLPyS#+rxZwvlvN&ukboJ z%qYq?#2Um7_VTU9TQ!DjP6q9LKQk_RhbpUOxyf0Ac8nNi#rK2!@iO8ck#A1b8z`YE z4T~9z^<2G818brA`Li^0*iWbtb*~h~#)f3%iVNA>3y6quY7vQ=&CT^jL|^UZW}Fd0 z!8?ZeMJv47l+cZ{r@M~bqYcVB+-UA|+Ls^#<&lT*9ZGNbd_AYgn7{NodpggZttoIj zA$*+vJ3{d0J_mw9_t#^T03Q`hBph?*Yi{0_!tv;d2Aca<&n zAS^_YP!VCe?tzAACDu)|7LpA%s=%1y!+(BHFrb(2ER zq&f}nbv=i(XuW`&`o|HB^}4VcA7Vo8WQhx%wiieh;oJ;C!m+u2r>?KIV>3<_r{MkJ zYMt)s%;v@WS*WYO3a;~+M4D5)t7BLey4l-NG@PDBMkT_svJ$o@pd6|jb@|_{9lqF+ zPOjekkHZ&%?Rdqi|6-?bo*v$)%dYY6k~-#Z9JL+y?l#_fmFYy+YTSbx)>&oPuOg+b z*;=RDrZvao5@u$yyBgaF`(QJdi(h0UYL<$Z=sJ*l=M1_j1RK$sW3b`iAtK=^I|h zvYidMZ~5hU=8SLDQJvJx5iO5Ip-GOeW0tLxe3@BdwTI#fnS_y_eh6A*vB85h%y9hz zFyjYaYJDK?B{|6*gBjVh$TI*l$l^kJ_5vONGjK!`Pk4vV}6zeQWj)g^*$iBiC}9wT5|%_Oj`V-$3AS}1S+5z4fP`)tNy?sX}@ z0&#*E1uad9j8!pfmg2-FaV7##?L0EI0IVU7o{iIH?kJG$4WHBU?gPb@$Y zq5zOe8Jx3fP&camsQf;zs95t7+cqMt=Vz2GSOmYK3PK?{7^` zcpcth&24zzCsvPnEx)Kg;}d_N=X|I6MI&sf<4iljpkg>UUE9eN)zG-5&2 z90x-*=G|FEi~I;nnkO#a8=KvbcUIU3(1^wJvbTAFMtU(cGLE4U9}JE3Vrawy(1;J9 zkzP9Py$$oF+D1ItG>y}Hg##7?H`=|X9a_>7z#(5++bt>0AR8or2dnY&N>7c&OyRxNAj%cXdc@s&=XHlU2!^Ja*Krc75^rz^9qc{%Hd&qCM*0$wkS_4WbU; z$=CX}odqV;UVZ(jy7nf0fB$7!E6w`m$qhRRyiovDreoXN7G5Rhl$f zSJg@-d5FG=P;Su1!kA;OmcmhG} zPDysXUwsIoSa}E|#>3d#M)CJ%XUFQZ1RG{+RFgoi+KJ-MV-i1I1RvbV4SM|JS7eC@ zIl-wy7mcM91VJ!O#MjK+gpL6-KZ+E6KsT`2@ANuR&dmly&A?_=R`3}qv`CiN5aE>R z7?#-V^*KHaR)$Stpmr>i#{lVHWX;KvGh5#!+26k10O4k^AiNZIJYu%pK#_iCN^g4# zY8o6Us=P6U)j(rQ4j@Jl*5xR&cj30?Fg^%xxKq4C|8e-!j{sY=*IiR!WTTJCVop@`TR^~6_>EQXKY3}%E`m0J0E1*a$$1r*(0GZ& znA6Iukh8fBTrBpSIHG* z@)GewdGSR;Ry^MtMElmI2=I4)!=F+v6E5*Il+gq%u7h5y-v*IS$<*lJ=a-ua#EnNy z>;+!J^a3s~XjTmdT%JoSxPv6`%$<(02A6E2Na7}dD}#kMv$Dnvq5urS#l(N{>eTn) z0nwy96jyUC?FuT>1(gSE+slYh9zFg0YS}3*!Ltqd+gG<3(2gHoLoslNeZ{?ild?PD za(WKjL?*e`-S@WTl5vFO6H(qwTSNG#wE7sb9R2+iz5V(^xHMh%TNzS}WX0ovl=dH7o$YUWUpKL+b1P18 zuCqmGQQEA*cXn(*d;hP7&%fjOLmrB3w9EN?l;V_}+`?t-grf`T$EjaUesAOviFoYc zE3P2zq~^D{8o!Fatyv;}s%Kx0{8HD411zy)r8aB`GC8A)Wo>TzH~p z7*qhjG}CC2+o1xGBQCxpHv3M_Sz)yj+(yGX-wwgFxLD>cL+^gS;GDVly$8~K`tIHh zL;DSG=b$G1X^cMAFh8q@2Mw8X!fBJn&zY+?EAy2$rm-3}h37Diuz(Phb6W+!@{@H< zJlC~#JAIGTYPC)ESyeTr{v!?Av68KZ=Pxy@)Vz|?duAGQuJS?tokY0z(l9POgghLK z_h8TC`+ZV`U|5;!fOl}q+rtb?I*-(N+FXzx7Qet`V}a<|$DTeoClhYydu(@XXz;)N zXvj&%A4iY!JTTRQFkSSu+ed5VuIQLpI$FvMG1T=ceUoERnkteGc5njhpd|+_J(Qk6 zVts(tO6_3=oPyeq>TEQCcP<`>i-n~*0j}2?0FCAx4?tSDyym!fD?f+)l z)iN%l?Vu%oh3&y%%UX`}Yl)tYyz2RB`p=l~G5v`Y*x zoxlGL{oQ>+M6$an^+EgpMJC#4wsGQvDC9w=kOy&6ArE>?fIJ8X!<=-4m>WlcJjhg< zzTOe>x9UK>Yz3(XvCnTq{&_eH@#QYCIsV7`Z2wBxpx2f1eo>|3VXF?kdl7@?6BJSqn1bT9DImZUw4)jH7f(EMiv41D#rL|XM)KU@`U3e|B0;T#Pv_^d!r`VeVyKDYr5|EQ}mz(aQa1$^E~O3 z&zijP=OWjm_@*%O;M?D4jx$5g)@p@U{d{ZkRi8y`sNQ}sHfbL1ng7Y31-JKao@QK=Fx z)RObXG+tbP!p;}q-=AqbZ&VH~QVrrKWOs)40{28Ybqt3^?uqJa;U~Iy5EbIYJ1j|uF{FTdtU~8mt81fh9K#>WAkesa=c-R_iqAFft zJJPlRP5nK+Tb-^TcQ@xkg?S35kS6}KKd)KF{Q<)(Qd4Q1g@3Q|3>>`R%`Me!i=(?Z z*)sys3rl1|Hp3K28qUr@V_V8q5N|m%q-KrT=97k{swkA00P;cM5)Ww}D1+GBkReq? zhDFE#`A~p-2tYm*1;}TJK|U0Nd@$rn3txkLC%#N>pRv4Z14<#F6aq@&F{Pe^QYZ() zUxH4sp0O;kk`43M^fHKhJAubx_TVucL zX<`5mTysXVsvv|lNXIpy+yr$@EhsmEjz$3R@KA0-0pMw2051arct!y5bYYnK2oC_y z2mqcI9nXCTVXk~pLZ{a#4GkH9)Bizf*l&bHNUn)+!YvT5xRiqhXCY*2Xm)&^7bS31cijAFVvw zt?i;9*793|K=JZ6q&P#3??EX+U??;6P%H!GY9Mz<~_W!GXjWg9Et^4rCZX%p#3-r5h-%Ejm{n zV;2K{wTmvu!LOIMwTzWr2LgxXgh;-8gp7Q#wqj+2NuV||Tv-0yI2bh5 zzBbX-FwqgWjg>QIg#2#ES_pmkeRgM=_M}{i=<(eB3^$gyx}_$aPWT2?Z1Hi+s%CzN z`ZEpV-`Y<|1R5iM%zhTBd?wj_YWkzSXRT#JRa)4`o8Ga@4oTwKTEtgwF-MDj3OO#ds@9Yu_-f+q~KlNEl8ZGd_V$XIK$J;tXZU-SYEY6&Qw69D znXYzJl%N53`fjHV8h_75R#w`bj2T`St)RLXbz}Vptzfq)JwkF#C_CSS~we?_-u{t{B00LPC#6%v@HGWX~7GF0mmwE-Q^CTmgwPnON&F6!1&+huSA3}D_3|68d`CPX)Ly+=BtgKXP z>=cx^-e4szJFN3TgA!L33=Kkaq4Pn564x8(d>o=I2K-zWqrVJ-vwu4dQ>wM#5Fp{u zn0q8LSh55Xc6m(SI@rnODGapYX`_@a8cuvTefUh<~jn`R|3%c~g!B_Vi5jEqWm=3`; zlNKosrBkxFxI}EW9r>)V4iwXk=K72Apgv@H(`WHAcI2RQiG}dtL9cqM>AgyP=BXNtVYRL-<&;=*8f?@aQx9R znahctUb-$3KhO3xJjz}Cz^)ULS#M-RrkXKillh6aL0MDun&;WAI*L2?-TUkJv^5-M zJ&@S6bKk|S%x7Y@A1LETDzxL&ee02{`#y)Q;EPH=?n$8?msYS6UU*o3e8zmTQdF;Q z=e~6Yztu7DAx9;Qj3p4Bd;VVn)NOqkSP!lkn-5cLL8;h$z|cU00t-ro`6z}3ZATXa z924md(`$CwPz=GVT{Mnt`;?>~PxfgsFmgl&>fReDwqc@X>>-DS>nX81mFo!Ja{CB1LM$fixjw8| z1?`_1bfk4`$a)CXCiXU)p@L>IEbC~!HtEn^m2e@Xe1DM!3eW~Y6}RW)+N~mjI(`?vMkJ> zthua&b#RoX+lKk{ifkYjtqZUq!bXUgnN`j0Ih(AJ{ms>v>)uW0z!z^kbHL4;HxGTU zM17*>O$gUG-kr~Bk@GPj4bb;mh{{td3F=GhUtI4Y~16a7p~Vx#6`4sGGfff$TR&09i7dYeJR7=UUN7-dqfRt02>)C(h^nTic$Y<^^1L(U#u3jHH!U z1~xfKyCL5wO{GO{0e1*p?eq2mdqg?k8W2tPit4{L@YTLc%FatYQ0kNev(1I=l)Kn$ zpT}k!hN-OvFx%&0wxKi3eH_p9cgkrs<6hl$EoyoHU5@kog{koJAcUlDZ8D&z>pWn0 z%6=xucPeke`Gmc^(gNxGe&*>az3j9Gb-}--R^u{KH_D5amPQ(HR?PjGk1xBTm$)jT z`}YBJ;o#fiGYZZIgk1^ax-xvrk-3CknwHkg%=4s)@$UC$#CqJOUk$zFvkO!Hkr=xA zgm!I3A}?LnSCOeM(h^?RclWb`g7aVYfrAOR(mSLM^iDZfIWb4_r@HMICKp#*TU%T5 zM^4B5owuFpO+ID$*Y_2eH%!w0R|c-2j4ny7->q;62!~8J;rPegfEiq7!#;&{UE8k6OOwv*!9Jtd`%5`-WHW zmSg7V>cO^cCd0PpU6uKKqg! z8Z&zrPB;G$&baSt;N)z=tb4Zyr-~FYX<kC9hBlbP_B3bG zSloHa`!?r+rGJNd9sufc$jJdv=g}hF0Z`{n$GAgI4uJX#W9F#DHxiMk?}3z2kCyv= zem3!ylnrenN+p+cIeMS|6+T6FhcZW>_dsr0eM4sgLS7(DIr#nZmgb1;IuJO_`M2aT zH2Bs;_B@|JO6zsv7m_=aqs*Zk6-439yL%yytr0Pe0lrD+_>s3$r?YEU7OJquoq0y@ zNz*WORQ(4q0Oj?wdSeF#QhxUl9Q5)Rm|?%2nWmu&^q8V~`nHWvv#2DD1AaMPHj%uPd`FK5_Ki39W-AO$%;`tkw!a|#+8NC_K}5k@ z%ezk32y9dv%hUz1&=Q5&C=9v0Gr&fpz(zIEWYV+Gueixj0?&XFINYkFaS??QI0!1J zqA;CX4`qB{H)3BKQ==L8BJk${^+aKeiLFM$w}~I*_56%$@A7CNY=_@{C6l<%OM7|r z8;BWO-%f?TajM_Zx#RfV3@hob%E61a&3>oufzQ22)U<6@-3dPT2`#b#eD0I!n1+~a zp)4Q9{ZW-fTS)DYi;&t0WX>? z;ZU6rPCZbWpfdHFqQSTJAJ|h%FXnuEzW-niGv$Ja-AR*K4HQyPj`xQTs=JlMQ-RB~7-4ID4W>cbbuzie%G1Z<)9F`*Vi= z&Frga=Ma5JUZ0>95Pi||*7MvfU%zBE$~YV<`Cf$x=}{|dE@lruCKw9dh&a@9#&m#s ze+c6N73Pyp*F1>ld+Q=~|Ko4OuR}C4bn$VYGINx>_7;$|+&(Hp4MVP5hy9C*yUWp~ zZ17K0&!Le6J-2dNX@NtI5cj2UX^Bs4{P~cdcaFGLVq_Xw%s3LkI6mltOFAzLWEwBP6y3Vul4Jo>e8T%%RgSK^hFg&P zw98H2Ru(E3AaKa?KT1S3_}0XbM4vBN5H~)ZK5cn7F(I5ymMM=ed}`NzuN~xzh_SYNph<-osAMC@FUQgIWRJ&ZeBZhkne-^gx7Wp z;olv-Y!QF-sCxA!@$z+(|B7LV*on&Wh}6P~Y*yEv4&)e|dxq7NR~R(t6D@`=x9mz!d0 z#;$nqUuqsBOKB4=m+3OggT2HVsh@w_m-od6{C*Q))vrrYzU5yg*>bIC^_q{5Wq@LK z>a0fJ2{7^KcyJECjJ!O)WFC+L1F0(r$q`PU9L(2{;7j8jjUAcz%eZKfj?V1kP^CA= z_6MSs&mN+dTUmfNs-S`y0v-q^fFghf`cH0afg02p(difiNYC)l6-1ybn1*!)4Y00Y z4%QXK`!Alpxiyw_J_&_hF^ZC+Q9nFlC?DDkl^-lmlfzGY<%r_F;qx1x)UIxgt=^o1 z8X!3&DTMjv+SXXVt13t#2M@)dkfUT6!Q9+uIXqx!J_^d17m>Feojs{F^K;;)WWdUI zait7gPPNyt$1_!L^S|0IJT)TuTs1%cO7b2(!Os_8dy35Z>ixRS6uAKHHDzwL&; z-CgPjK4+*ewBD)?`{6`;qW+D!deQP=try9=KF^iD;JTrgG@RgC04=^!B%k92!G@Cb z5d+{rRdfLW4hfx^y+AJja01b!4*)p9SG$yy{fJt7y(5hZ4Zbb{H27>O(BMm^Vhz4h zXz*R4pe9LFXz-OngYPqeId@(|kKATMDWL!EgZo;nDFw(!hP4Z#T)8HSx|Fb)4QuGJ z!*vSCs`;MM=10#txMV|JDPr|>%DnBV25Z`0}_Cqt5p~X%C%!I~v*&`!{QAR}5#MO+?^x5n7NFJ6b08rFq9!G5gyEw`@ZQ$g zd*?P2rH_BwFG_)WT|#c!HzSuE`G@Qodf8)VA(A{GU+_p)vu&e0m5P6J+A)yTXdly_ zHuyk_!DE)s$h&%IZvMm2VsNzcu#wv#V~f@!#!|e2<|=tfkrbfcRL~;dKq(*Mh9|%w zG0uDDM3X2n{d?xV+CxCUshBL&!dM$`F|CF$tvoTUV3_*I9JKNTt=?iqePhsyh)4~M z95Rj^3wsMmH3(vFyw41Qds-8DhWgf3Oc$ZSaLXd4@^tzqU#3dc`W(*2yNOmWw7cyD zWFp@b@l0^HJIXm@HpGnVC)tP9zJ$s^KcPkxyJE@57OM=DLSYLUE&pmrHcn6(FdG)> zg~~vwXu!sfK~Dmdb4sytju}?oS}W(k(7*x8IaI8iQwrsrkAM|^np60IDk|#Y-B1ci zGYC+<-ERg-^P0$EHt~Y6P(gV4`=kqEvG*g%u!xOPX<&7SYI(WrgZHx^!w1%pEGSpx zD4#OCJ2|=;T^3>#FLPGcy#{-7uNV-Z_Djg$hOzUKj=_AF(rA$}|G@$@5f#(d!dQUd zQfVB6Bz+=y15u1L5`%ezX7C0HFg%|`14qydq!CdH`AAAGW66k^^w90E$fVGMTntaM zysbUBRS-Dr`5)0B&aH_dG@q2**6Rx+T;J`FQ4+Mz!7YZEF|~7ae|c8b;>|t6_6%sO%Pxu=ODHk@iY`JGZ^`TQ_(-d- zQ}Ly9-aGTFy;nC|(M>BJ?W+cKQbQMG$Bt$m9mLqNRB@pzz>XE;d}~J390YbOfj4dt z*s+AxzE8wUwByGM-mH$DxWX;c5my?0HV#jB^^32bYVKCAQ1X7dYo}ql zi%49?h2DjOs?l;e1c%YR_@u;#=Sn>3GJ#MtzKzDSvY;$n1A-Uo?L3V=ySbD<%7 z4!|Vz_f&ut1pPgO5*#1Ck)^7p=P%f1FczuKVYZoq*(MCn^XGtVrhsh*0~L=2Wi0K) zCl%>$2CfPV637Ts0e=7j+?jO-?#!}S6M0hl*5!aktQcHL0gcYlH=>|XWGlM!0dQ>9 zs^2|-KiSZ-;@K!sGyD8#kF6nz7L$vXnG86h^m~;u$Vk9p9M!y>D+_>27K6?LjNTG% z8~{m~|DX&DJcXt*Mj3`U15IUV`YRdTSkW;G83-4RcpzLjqCmJHlYwyY6bKj2DDdsb z0EM#v3hUD4KE+%_0=5Dt`O!x_Ftb6Z$A?~m{7(3FaB(Owv-e=k?2~I0r@a4WX8&*c zUzO$`y#9sZgdIq+kB<5=qO8#0OHK435pXI8Z)n z_2MX+q20 zxZc5>zhkho9v6F3!hIR${4#-eXAv#(3Dkdp;(Qs7jEHgSTpkuV0l|bg(PiJAF7p)T zT&xHqxezguOD;xoDZ)rD6d<|eLi$mZKyq~Xxy*?0F+e_Vn}jnr8;gR88t-x;0|DV> zuA)6*lufjiOR+WBV`c**14Mhy{>)Ivfd=2xx3pzmu>-bV6S8*%c z4xUyw6L`aiTpS#(rQMR4&fnJ5q`dOSV`l2r-;U>*27iUbv`M=v=apKrC*>{{hhqG% zj7G{^QbP6!tC0l}p&;4cR#u&=d9#Vb48LFgETZu$W{gt-dtUs9_Oo#R~*u_>R8ij#cpNN=f!BN_dk1Ict0@Lf=Dfuv}=8?HNuc~bne&*}} zldVT&GWUjd2pB>I1G4HEI0pipkxW_vT(Ph-b2{c2U5{T|@n(l$CSa);BfwIsWQ;78 ziD9W2z*6VQK$gk`EENM->bVhMseTk~!# zrICVPH7Dk5KZY2P9DyjOt*F(IhjJELF~kKWB_yMdEku}87hSK$T6~aU37)VmDPb75 z43%yV$LB{0>ieWyrBRZ8BFs~dC)HM`ZZ*cS4h3`ynOcQ1oB%+&i3qq#orlGSjjk^Kegg|8Z8#03vP)q{oj< zAwAZ1h4dJPT;4`v;dE^(DsikNDt zk_1ZlH6=dhOP{g4+qF2-9BFD3CR7r1;>U|eF9grkv~~`k=HX=9Y>?R=7izP)30Sut zscPOxLf(aso(EaiRgDTNwskUNOFZLlI1igTUGaZeL&vp_Q7fNKP$QO>u+J=9J6L^^ zu-a)t+|zP?nsC^pGC!&eQZzVHwiak@MyY3ouMCU$Lf$_pYU%0NW(MBc4?_~wn71Cp zyfqBZCzXM>9t3ag2T0-z6}o#h=G%rxAa0L^)qtx8L9E*Q%pkbxHIZkqFQ{y~#{Bko z`|E4at)(O&dY!lT$K76mRTUTz3YKxKY8Mzf#AukmQvUin3mUd`|oN}QYFGH2EW(CyLJ>A76yzFL9^Axd+N4kKh_ zZ=;3LVTMH>0}{;;6{pnL|DQQAxQ8=UN*;pUsi^Q(!MMf!1so>)Cvw5WKwyUp=n0>V zN6f#ei34NtzZ+9EBWk%{AkRm$_u78IVPMJgrTt9L_mBHi&W1WB3l+^=UmPj>&~(`Q zIAQj}xUZkz(+uBPy}Zx4O0OMz0$+UbGFYmL)3^|#can5d+VLRaR7B4%rt+k46vvI( zcSJ48M@=W=JGv36EvJ<|IYur88S`5rM>AH2CnZ}uzYVMa|5?nu_o2%E7S(SiygQqK z#vd0V+%z3?CN8_7(1+nUUL+$I2M)gpbNH7qhhK;}{3cW;Oj7&%VV7M>)OH~5H zy`>Pmf0G~TQM&EuBcx=#93f!qBlf08PcA{c1tIv-jpo9m&n`hvXg}xL*lgq@_rWH> zb6-pp>AMd%MYZS7{?;E>`Lk_j?~8e_>w;!y#~qH|qAORu&yO7|46+)S`b(mZEbFm^ zn-!KzFM0V}_-n^x-%QGC6qHlw-#pHjGRq9INX(@_iK$6s;e2aK)a-^t1L)l)w8-4p zkj#?lm|W2>T3_p}$_`wvz4^#|4lt3&aLM(Hp0)BuyNIXin9(4w7sDK`v zLrNZfGzD!ys5iYqqGo?G1#P-H*2ZRK-MHr^piKb*v>EQ`>DV1^hn#gEaJC+jJ7h0m zypk7xs?gPWhm^zUbg++u|N6>=J=N5_*s&rN3vam_A1Lwb3x0a<)qRl{ajA!}C@&&D zHdg!%5{-W)nP_sfKocHFCM`H469sP`!h@#%{=h&`q#hJew*f_R3P6#x0{uTqmV?xe zQB+>y=F!D0@EG;rF*qosXpW^WqTJH9nWlSwj<}v|`j71|P>x_0G3AXfSgo5_3nndQ zqbqa{6>K-zH&p#f*cSAK(Apst#Mf#*US+gPveCY8xo*|7R*g*+TdT&du8t3^diK95Ir__3 z<#$93K9l~j`+B2)(Qon2+kUB2 zJu0px(e6r#IBjR#dcKWXc|V+<4xmFvBsh?Bi7iVmen~%!x7T|a7c3E&cS20#<(4TV zGRnR4uk-5huV(J_t*7YWiqlH+m(*{ctFo>!>1=HraFfb(c`0n>?)@>ig%(%k7#H%U zL|iS;Ucgg=^RY8A%)F)kzO(Or^A_BYsVuYN&-{rBUWI+4JsltK)|dF4F&pYrYHE*j zcG{wAPDzyZlwk6XnD*=6aVE3DhY}cbGM{eiC`+1)nOC)#Q}S8An!?k!!$V@A+FIU3 zN^gF2_G`ol-MHfm+cM8h;fdk!+Z&aed-@JcMYC2f%+4hCI85BqPJCWiJI`gZ{(744 z*>*?IGrr}iJ`ZIiCfZ&}{gjqChVn-|U(i(18`Y!tP+s;PBzN~Zj{d>>H zj_&WXM$ZP>m6+$K6NPTzq@T0>xEwxu(?X)AMzh6e_-SxKc}w%C^xrWbIjJkVhJH=W zURb5re)9Dz;^20hXx~@QB*+SU-O$Irxu@7`b6J0j*d4Ju{Xy;$-W7LRRE5lW1;5g^ zZ;lVqEEiX+x3^I*KdW9pEV45%aq-TL=_hx>lel8tom|cfm@7P!*y;BClA})f>AOej z>F@V$j`s`a&YL)@THY0O&rMfIJZsOyD^iWfDHGSL&EkZ8{^#R{ORY-^i9dc)yYU+5 z3=u1WS9>pNRBtbnNH&+qGB~XgdrffZ*!Y0ntL=nFTU-i zgYPD#mh-=e2ZGzCx8IBl{aF;W>!wU(a9g+0XNRxn|D+@NiZ5I5GKx-@rq1W`xAOXz zww)+u68D~uZev`2sH9WV=->T^`!|tsZfSg*i-bhd*KbANimJwo7DabF=Yfa+aT}xM z&(rzbwa4Y4(wOek4-TUi8%qtyd^S6tONUpRJN`LDMg{Pa&ZL7^zxMUn4Z2h3uJI1_ovS+3li(xSb3y5Nan9oh-0yJt zm90bgfy<0XG8X$jPFgzrwLaLVrsH$O%%}h9_$$_y;CHESGzJ{4i%z6RYH-IpQ@x*V zulNt&W8xv9{}}T3Ll)~l^p#klv!S`G;`%cM9t@$YMQcWX$4ngl$_o&3Sf>3d=&a<2MFD-d`z}E3pBG6cm)e++k;|5Hsy+|S=$S+igAir4~wvh>F+QZ z=-Sww-n5=D?vnFD`_ev+g1)aVJ4}}LpEtA4JaKv*#jSf&ZkO496IbOO)|p#>M$FOQ zkCBae`CE8@UjCN*Ew^escTse^L#%xvP24A^#g?sATUN@0u=aE-J&TQh@=)(-Bk_G| zZ=-!-qJpzshui@Ne`fbC@n4$W==%!2mgf`Mx(N>Z4E!yxgr=A(oUXLkj@MP-!&mVW z)*f_hM)XULoG5rF1Mp5Nv3}vV(TSt1XqO5XzNRe$?n-|ehz2qwZ=+$f-47|pA z^y^Kf(_5+ZG8!Mc^xw2qQ%kW=&&N)7F1bp?RN~{yN#3zi zQauJ6Wh{h9Th%vCyCiHcJ8cc*E)@r^`e)D*S{_GG2rU0{bIMzkx$61vsJj?P3l=BHPUq>t)zH33Ie4I zG0YBJv>C5pFKzqVxDcM+>0NK*vNcQH7||2kBD6}uaNlBvOT!Ge7c*QtolAkZU1ArI zYvIvHnKv45oC)zRxk=(|h*O#TPq<%9ytI z<644Bd^T+;J#-N4&?0r~39l`#L9wsf*XLFe4;L6+@vtsgIaJ_h6;dyn*QHW? zpAukhhuC??+ap%&f)wn5FWXK1xQm!W%%O>{J&W@+zg_6Jy@@Bob1!_3tn(-8)_!`o zy6M+(MCvHToJX_{i8jW2emUgp1t(Ma4aB7Z^qs*@RenTJ$X9+?a9#97mc(Q_Lv669Qh>1t8(pd zK{Ioe7^xoP9<2=lRe_CVzb$MkXmgF?_A)36E)Hn3;y-yp2e!_nkzcz zXq`llS8OhRt5S8c)D=lqWCy9~nd97zsl+^!H!|&#npIgzI#mOf#;F#m16zxA2E9&u zH~}UBt^4c+IwUzC`w+v50W^Zv#VxoD3t6Vq-24eA&|7o@^j5|6&cO7J!}Kl&y*ohf zY|#4-=&f5dSa~$pnsSh@kEd_IzK?Dk)Sd^=WSC>To8`rwN=cK7^Fi}270p@g-?U%0 ztb9xH@BhAX+p6xJL-;G%=K%pTi@7WMPBW*v`RY_2*3HcDx~6^@a-Vj86`_4g-o?%7 z*6Pg6%I$4avS)mvpC8%xFQAbbTC8QxtZ>|_O+R4S7uTksd}VdLms0Vq3lr5puMf&5 zXEA~8V@K_qyY_c#ijC#H`^lAs(dbv{uU^Di7m5_M=PjImIT#t@W7h6ww^LrJPu<^w z4~;To=6m1I++OfZqI~MAqP~vb9SM{w@s4`)x{TFe(AW>e_@!X!+rg?K`{}Zwx>d0S zhd?*yrml8s*(sS0*A$CLH(iBzx2hU9)iTvG{-51D<8{i!)hc1K!ST2e!>+cdW|;93 zuEJ!SB?}HzlJ(1uMrf6R#~H;uP9^4X1~89v6+&g28H7qV2$chU0fJX`_#G>`@HBb^ z=K#mRz!)Z(L!0f)PCNp`<~tj z;AHYHKWv&kX zn^r~JJ`fx7Gf!OYn!U|%-dXi)!y=WG#O?v+&$rP{Ud98x#|P+-Tz5}0wm3LX_D${X ztDx||dNoN(kS?c8Nc_mtQ&zcF!tZ#ES$ckc1~*e)PAMOotfW+MG*~pkqwziO&ktev ztJu>QT1De;_=fwDbggH8AFbRuz3Rfz)WcVeU*{SOez_1kTAjlq-~K)>y#A>1l*w*S zW?cU2`+%F7_p03Z4)rYkoqSs|_M6v}$8+F`Ie$Xs(Vlbj`Zu(1-Lh)?5^pg7JoVSD zkor}Ajv#Y3<-g2C>&0#zf6tJXsX~tS0~lP>&I7m>NddU_wgljsu<_pW+!X-VhO}!M z-_rkZ3m7xbMUTxa)^NQ=lqH8mhbmi!(0o<_V|aRYJQf?MzGEJ;_ADJTzS6whvk}%H z??>kyyvWC!&L?IJALyz!ozMF^LC+C&t?FRMoBpX)TZc%Ryy~_tzw{)}*x<5kWyi~y zX*A)b4Q);~$K=<#|A)0VkB72-`^Vd)C{m%6M5&CeL<&ikvSgdpPK#}b>`@XWqOxSj z*tcP37_#q5Nk)rhhESBEjO9vi_mJ-|#nncz8%mdD;zE|6?&z)k6}HtNFeM*xTK^ zn=J18o{&#_8Kq=<4j26R)xm2o?pe6lH{{qhUb$BCpTQt{e^rw|?#`1Zs6vwQL)S#p zUduMo7d?~#r}KqX`r@ZmIuxo8LpE|+MJZ3z?6T#{zt5~OObu7-KY!(9znV3LEbnzi zS$b+>>Qn1~ajH#C*q14j@%A_7rKxAg^?$k}F5S5qW4*3?PkYnRzikmMzJXi?=oF2qFQ06pR#qNrus+Q9g|S#+c6Y&@}WA#soWOW(NIul==TgmO|I#if;&n z(Qepi;k5jcPD6BELn}Ru7kMGzciw#!7D7cPYQ_3_3*d>ZW5W~EV(%7P&6a3NXm@URITl6q6TMDSiY@xtxQO2pdv9KI@2DLIHl7i;7!ZdUpFQ6`X zbz(bNwmnz~fs`n)2l^QBi;P;a{s;>A#bSY9%HUTgtCn(xlC-ajb)U#nm?-^`nE2*l zyZbSW*oz%@Zhp5@Zx+=D__dRU%bVCszUl zJyaM>Jnl)?Yom4e6{{2s0>W30;v8D=zhiLZ{J9$P+}1S}`+?DmNISY?E zVs_mP;%1>pj?E=UNhw)=Axq21mrQM4Ag`sR zCEECOsnXf)aj=EwrEt~Xt#rAYkbqc10&*G;35b*%Bp}g+kbqo*1SAd;kbU%tgJFfN z&@=dAF##!Htg*OQzoa-=Q(=XO?bF8B25v0nTd|*^g@Xw@<5WN_x&&!+Y{i2@SVb1S z70q@8Ldj!ceUzM~JoEZV`LYqIP+Czrk!?mBEYTNstgNQ>4;7SKe4V!6ZRyq;8O!CJ z;?J_s*xR8HSx8BXF8pA}dm4YbN8qL5EP7~Dba*6Wh5yyRWh2-gAv{IlOX8@~Al0gvU#f~flb5>325(6?yuFfR<>JM2?Nj4*ua3rvnWd-2_M>Gj zpHfUuH3bIuEajKa?;MXF`lz1x^{afpc23);FQ4u>@eYk9{`}RN7MgNwJwv>%&2(_| ziM+tbj*!>ADa+)A@5CC?+`n}>r?uaXnI8VC^GCv5T~RIl*Zq8|X2y4ePDXIZ*X2cz zu8a)L6MsK-z3_$gM{3WRoR*AM3eV2-GkPBUSnB9&p`dZ@tU@xw z=g=Fg1Ks1kUOXzRCrfA5s%wQs%ifeKnrUf??z-8$<~K-8pK5m!zY$+_++?r{H`*F|n)^0P9lXb&ti8_|JjpLo z)%6+qeD!+_U*Qe4d|+@s;_KH&9k>;%5cCCHE2&mda}@Et-zdpnyS4U(6S*#ek<>Sf zKAqL;ek83}@$vH~8g;b_%MrD0Oxo~GkJ#_Q*MC*MbCx|n&fAswT}Y?TtZoal-(P^~ zfBo?~M;=GjvwhdccMyxmSrL;nmMAP>4A#2jR~~u5U6P8prV}y6)mSQ;H`E7pc#{oIjO`1G&944 z`Rg76YJA#q#ribOdSG@kk=a=~+M(YPYSFSYZAfcDpC(SQg zN4ZT;BIb!CRkPTv9jokvuhnL}rvy4hZNrlISW#syHZDoj3PfJUbEYh=|&Tik_V;p=d z_~)bbAO^D?0PT)g0NRPU1KPQj0NULGwA-8*6uql(;^2i6R_HN{sr2ymkZr+-e{j6T zCag}`X~flkWS2|~{VczsX6$8Co>)v;dxA%k&A#mpw|S1>3>s)_E-tPW#RjXWDju;| zv3HuA;5p@|#J^ON6buB?LJ7ffk852>=91+DV z0Ti>WLXV!vQc%nsAr>d(2`Dpze#z-tE>>q2W`0-5DFm^}(eZqt+&%HmW(z=j7K$unYiQzH?B<93|0$FSVJ#z}NopNV1fR*otiz>C6~GaZw7r%w z1lLsn?F9hsYiI!N>(~giV*%PT0oub*ToGQ}fM6Icz;t0%5})6e0iWnSqM(j_a5Q5R z?t*#-`kC2jc3sUU6d|}zbKAe9v*7Dy!8g8LE_#q@IHmUX;N-zH!Kq*CusNPD)k~OM zIaAS=b0a5icrAU<9w7|=8adx8ucqmqegbcTV;3hU{Gi{;rj(%k)NH@%c?T4UnE9_- zO8acZ##v=HB=*jG2m5Une6+B(zCi1;l1EQ*-z&$n;sl!uqPW@Vf$PY}L-{lmMlo=~aLF?Eo)=|=KfkqA%C#lNH6zQGkK zSz&%8$v&RbdSGhlhh*~8AkNma>>#=2H`50tM4$pgWEiT{Ebr+Fwm4<}c5?Hm%dj`S z0<}%5s&q>YDg0%ToUR8HwLo3<7?JUoHI1|W!1~%FvFD*Rup4iL-MmNGjR(SRYDh0u z<-5##qp>U6oYC~j)Mns1Rls#Tfa_F~)FLM<^CUz)ggrhudVoZ6g$_0zSxxe=YcBf7 zg0HwaR22a+ttM%*r<+1HRyC&XtvWNByl=QCWcxHX#G;xuO0*g^+JdtvBtKmqdNOM1 zQ|7DErhtnYxAKEU@#bNjD}-ot!|B*lUu~#-pM0p--F&f4D)W-|5~8q>%zk1i4v!t3rW$C%smIb zq`)r($y{W+wyuo`KC&I7Ym+WD3@2$;Pv^htC-*6uHksy!)c=jr%lj0gs(8>;AS3Ip z@nbx{2mc+@9ViwuE0OBoZKV1qLWEgq211TDRR1EN`nQfqz4cANX2C1eDzxABjujM{ zSbSg)HV}cko5`-&055C3|HmlfWFF$!T&dP&cU$*M=_jNLg3rE+8t^O<4UqYs?C1J~ zRTv}hAY1fBVXeI}WlSpcb#2#xbjO6W{aS1Fy?0Dak7oc(&a=vW=F108i)spMPCUs^ z%(T&Tl$@2}k2AH5gm+=TU__)cN=t?@=~5Z9+vnkwCe84`pHA1Kz?BSer8ys5`O=MO zQl{X_by#4tGEm6GfF@-Mu8dkPczwcr>b4!lfGZh%U=Jcq!IkT%73=5CSbyv-xDsxf z@nSI6F^z8bRV>*V{vT7}Ld!HlG`73lx}*DtA%WP^Qrydzn5m89c{k68e>!Z4?ZA|= z*w`H(?^vm$E)~3On7T8pX#x784(N+I6aHUX%v#LUcc8M28Xm0T?=-WFyu;L1h7>ES zbjxN^I4KK2pOo(cTeI)t%uw!tOSCL-=|Taxq|5@Bdd$G3JK&NSV1_Do!1TEpxMW9I z@H&D$!m>SvWL8;GU=LoJjg9hPGz;4?qto+lKl%7Vg4Kene-d!En>4HKPE$*g6a~n# zamkgff4J!LMHzjg&V`CMZkeY47X~OnT3Yw+ebYHoVW5qrJa zY$w9c&LC=84#Lmw0YAHd1+~l^)Uq7lXZH-nUCwZiZJa-9qp;w09($f;>jV#PLk=I< zgGh6j5BE?;=8iHnIlYOCGBj1k7vhWy7^m}C9~WS1hiOi%ml{6zqzTIvJtWg1X~l516X3Ol?CA&Hl5i0}VnxZFy#)Rt-4getRhDtRD$tc6Tl zr>YRf!*KM^`MtpI&r+V|2y0R2x`{)#J+cV?{v_q)QP8V#TQ*R7CUX)JZ<=z z{E_`bB)s>}jV*Q!i=wAAPAZAJT;(q9-7sw!!(Y!=KY6&m3%7R~1*V3*%Kb;CSyTLv z#RwKF3P4%)i5rwvr-=fu6`IGtj-)ZiH8<2*w>Ty4%kHTnCdy+=n}^C zB=BXBR8jd0n=%e#4IzOKM?(Uyk4O>nc_2j`0x2RFqzDs`A~xiqdCBO8Q!|ozoYru3 zI65F1&Bg6aK!K@A8Rn%VnbB5^D3QQ1PL4xEEhY;F{5G1tSQv-iceH&bc>WX*FOOOg zo`fp9Ns_lHdV*6l+8j$OJES7hJ;Yw~g?qFxH29b8&P*83qvafu>KQ8-&n}qAUBs%S zvo1K;{h`Pz-P@HEu1}ZKg)N4(0>9GED z5zdf^hxK0$>%R-ue?AT%4G%IqeK6y1ES~#Wo32f-J4atY-L#Ity8R7q;0w_e_gwwL z`0SEA8~fcx#P`pLP}WDu>mSLV?r)aevmQ?cnF4MJu?j&ep!524MEj_h_m#i2qWso&U{?nTnL4Gkp1jzQQfjd<9Pw;HD5w@AQNf#-wv2m0fM)3;~EF<9^ z>gP~j*q6_U8%ClXls{ zvd+G0qL+$N*;0g(dB&wZP(KrD{-zR0p5A!lb2vhCv_<2-3#A7QcR6 zPhg$)y(PO?T|h4wSD@1y`E+gdz#?c2sNSnqXQw2=pCC5=nLh62atjF=ER}^j?>}{1 z$8NBY7);NQ_!iQ2E%mj|j3xdJdwyx@=_T*!@uYcouiqIG&?()1N^?r(@Ykl9vVz*z zmgx#n$;>%-FH*gA!C#KsY<_W@y47Sd$$oy45a;@}z`qGa3G~m}TD;yZ?$zvwv3KC{ zljjs1bYw}+d>mf0zMI=W?*k?25JFFQ&S;VD{MM)rfO3aUas6T<>kp%R{A(OXqE9->wS z616TPszN0awfZ4yb%Cm2ZVjqJB}A=$P!)bX>57T2jH;Y0t%NkT95(GN_tWhMQLYoe zVm+GWDkZ#lccxr_l*GP|bF*c(HlO?TtoL=l5yE@5bkURgHkDgGMX|qVL+gwDUS?LM zR$k%Q?p1zqiIJUE?I+$SRa1HdB0E_RgVb3pt-4GK*`Go2SO1nx&8CVgv!fE|R5@K^ za0kV2{+}u_o(%3_)3Yhy4s}|g$+Be?IHZC&WQ;gOK^!6@4nY_;$ACi=aEJ^JRW*P^ zAO=sCQotc)9GIUj8F2`^Vk}K%m68b@I7E)Rha&gim>^#2KOtotTvl(Hcf#Fi#6pH) zCVfWbn)SrfO3Ry6)e@Z^xf;ts+OCR2Geh0u%1!7{!@>$39mYcQAAv))L|DW)Sj4zG z@f%(^FSY=~a0}EuZJ~?>nH<4UvKGbPiL;DkFq@gUz$gZYKLE(K+^ZNu3oK$BvWSts zhgziXVI1juAiyHFg+*KkeGkLX_u$(Kv$~pA%~7a>o`>hS7O=Blpywe>Mxtj(#^?86 zm22Eji-Y;y5lw4@AbZ06{t=Y-apZ>A^vAF7tOh;@FVM#Rhc@S6Ab6d(@;_VVmS){k z5`TV8%b1dQ^2sek4fXlTBvN$};-XKg>e=9>z{2(DGPgZkhw?d=86m*{PKEw=4d zn%F($Z&9u9mq-sOI)9(jOEgEx>*}eu@Gj3Jeen*=iBd{I?_AZWTj8&~DNl362n%?h z0C=C!KM~2F$Cu}yiETGm$Sd6<1A!0bkD;R^8Ui2M(!v~N8ix*yN`Mn%^U~c7semSE z6rf20f+mItn#dpmH5HP!JV@FMA!$1VNt*`|k~TwO!w-&zkhHCYZBFDNNZPcirMkGp z0_Ik>W@5qmV-*OMM`yG^Ef;+&K`hz-!Q*;V&=@f=e|CRyBg_9 z;+0D0l7YUnQ1Y6E3=x=3HfV=H{^~s{+5|XOgwIh=ter=?g+iWDbtA$`~k_D^M~Q zVk_Y^vM_y&8$@N!VgfginK~WVJzbOrT`On{zXPk|_fvBlAflsiJCwZbSY; z0sfLr1^&W9@)tY?_zM|A0TK91FXS(}7%F&%_r3F<2%!5P2tZS`ZoC+^o%d#pCVIC6 z?rTLz&ib(Jyx*+0Uwq%P+C*Sp1m7uB<^o*h`&;X5YR1h2Qf04%h#W)*cAEE1Bem%< zx`uFe`&Fky4#>x^(Ldo#Hyv+%a+OL5UE5IZU+7zxnFP?50Jeq%05(Mg*pd)nvjbq8MT7op z1i+RAz-DJC{`?qK4UjD&q#pyFt`k>wsBuvqd($9C9)lcttb9OHR83fI zLMuNp!$u8=B;?2@&_ck}&V?K~t+XT?a^$qx?PHK5tDWpmFaai&hXE$_jRj1~7hzIe zGWWCYngEkh119AQOsYc$)TaoJ{wW1tly7ajFDTbp7_e@kP8q0Qn}n~}pG-`nAP#Z? zU!uVM4%b){XeJfv8vDTQ&0Xn=C7sec9Ijnp_Q|)_M$SQ9@6b)Y3X?bjU2*cWD0jZL z8(IslE~HLq=;aF=zm>2EATIdKAQ``gu*SsAe348W4d8_`{6diNUj<$W-lPLB1aH!3 zx6gn#8a$o-->)qIQVh!gQd~ulLIXjHnS>V|xAOrh(g7(n04b&u)FLM|{Bk9b&;H=3 z0Z{Rg3N{uwo#0^?mj90hf0P*tLnu1;gHbWr4nlH@U}ZBDu~(oG!V0;ksbpQ zR%~tRoso6}^AAEM>8vT z@9*;_8E3VS)I2{8)N&VwRW0gzYJ*emd_elD7op7j>C(bn_rZvR5rYZy#e(OO_0VIO z%^^C8QTY}#$h?ioJz(!K8gjeB1;h0&4cnZFy+J=vJP6%f7%QKkWCaHHf%Vxur_-qK z(xl%{f|m1^`3QpBkf2ersc?^v1(NwfrqoQV64iCUIaI7Iv`Y0p51B7yO0Z)_Go%WT zDV0Fx3zdnEa(dmP?G*X;KdcUX?c3;n_a+noym8w58nvrAG z9F#(>`;ugT!+_Q_uzyAEl%LCeeyY;_%5hEgh-X^c6Ag;QrRI!7ir2Tgeyj zJluTWy&&42G51q-2gx~i#~C8!=OX`S%T3{XQvNrj<;D*)Wc$ga#L^X^Tptk16@Va9 z9fC}gfK1*5Kqgy2rn>bDGfV4ZCJjI6et_Z>wA9qLPa?%B0$6WW?YK+;p*HYtUDS$c zHrA!zd5`!VkY~C}y{1rDhVn!@wItUE=;v&FWV?7y=L{npH9I zbi0eNOYjaW)st0mIC`dS7#7~~d<(Ql;74Rip+%xFs9uH+6Q4 zCGev_uBQKkT>Tt!zA->yFgEko-)BI1;)Lt+z zJJ0oOuUbZhaO>yhewxM-SF4&GQu2-Pp-ZvoJgMOp$m75xkE4yo<~~X&De&vAD2!|S z8mU!b#jLZlq17MCY9v-xbHduIW7)g;dkJo>Usv06Gol;&C*DOBM-`vB&h;|!`+_&Z zEBsG6JI>nD!V8hJ1Ebyp9jZ!qXBGj-dH;VD?T+U~|7h6Hiw2V(Ev+>P7!btA&+a+v zk|&VeL6d;vxLiK$bm21Mo8HlNGjU*kk2)4u2L%gvX{joP;w_s{;{?Y=&c$N;@L#E0 z%AwdZBv&pq|1_W}t@vs0@+fz1t!In6SuFRpAK9LojoRGdTW}?hrWx|?l8JOdEr;ryDe*Gea)XR2zuGH{*CQ=4rl58UWda8rdL0);SH5fxb8Rd z_5BkTun&8=|Dk%~d|Td1nA$Ry5U!sur~6L?lT{m$>5?&xGx@;E>7L4P*Ux8fTW^@} zQ*wF zBujc8(B^+O1#p{>;VaYlp}|3DHGXxEz!PHJ|K9xWoU%q1oc(`jepfCD8aS}DQ$cjG zdKG=uxWZb{23$lA^6XfSxu)^h!GVV0K_4Ke?Q}~YsucE_SFb?n*On{ihSY}Dph1K}=uyjX{i{_2G*+lYP zyOJk;{cecW@B)P4hTnYlUz=>)&e|e7!IX@a{~XwLnA;OC^$6(W zQ=pGe%Ljx+4htWiSVa*@vpEc%{y@0SSw=cQ0Tb5cqtcQ!K)4>wZhs1d>o8AC|97KB zz@jjOa5*4^>o7vNo&w=oM*%E)1cd7_bc#O;3MsgCGPf~b;KDWi&d+NoYbbS_DDc_} ze3kHFanz$ARn>Po%=h){&hf06gv7ZFo}aN%CNM1LxSKeA3XBuMDGH1$b-BGItXT=3 z!Y6-~jjX;)>wOhU@qMttWQcZw>@3RH_%0*yZkSa;Z*>}0F@WmJ9dl6Y&|Y1( z{%BC^9!7yZcxeD?oe65i`Xe5$KXwnY(13n}i-4&mCFS&oXAY$8vvnYnet0A=@44C4 z@9CDwvaY;u1|`OoAqO!VumoF1cU+QAq=PsaxD=|AW(aq?CeJb5xNO#~;dkG`*eG~0BiBrAIH~s-V=@zc{!nG9vE!zXP#8p}(%PHQ#bSteYtjM`^lN-3` zB2@x&Fcf-kLMsMjCI9ud0{VY{TjA);>&C}1;AjcrDAFUfZly=c0vvq;j;;ZHkrxk+ zTKvmV1e|QwgNVAJgb(b&1`BW$z7Mf}-je@t)BL;KDnzoXBnap9M z^cyWo>#G$=o||xg*!RheABiwPSWNdDT(?IAfrVw2-y&}<+ih$E`@GO(_|1(iBjGSn zEJh@oTv~$0q-T?7x3gh(shk|d8bkVpL((r6l7119^os`Rmw_>)Un-D(5h495fb{Fb z4#QIlL=>^Moe0#-90S%ZM1}0jff-TZ&D^aS^4c!=YSXVV->Ii>)1BLK$HGMje0Gzf zyb}Y!bN((kYFh7Z{IBm@GVr6R8C5R)_YXuojM#MpyRgl{$LP^M1qc29ez@ca)}2}3O%%H(E246r z<_d2iy->@qo>Z3m~2MC{^WGG1okYsA$ z&6&xdE|#rpL}RUNRgvN(F{SKm0PK9__klEEHo~a2$gA_dd_JIpYewk27I3#GX_zl; z+-Pj#3ZZ)Z(FY)|a3TA?qIi;X^1Vy2%#Ev0ZI4(9=irW5aX+1?NvZi1|o1UJ&0;>7Fo}-}x3gd0A z%C-41mUBmeJk@~_Rk=KVH+qs>c1m=je6xxzt30b&uf~EDP3{j*E8nH;^tme zx7n_sc0qK6zDj{lG(1|MRqypP{*}vSy}B#rHR;%rb`2-d&4W>&vRktTN2YBO?!-8$ z-W4N|X@s9&>5k=Os#ji@K@R=WG5Z6A;l;(_#}10zUTb_=dLl`74sHErrYo^^7i*W2y- z!;_efd11Dr=GR=m;WsIs9Nl*2hXS0s>fA18&`Y)2Mr=$i>atcTqc)=}G+AjuBTH_% z5f2p-VwrwfQ5l09#x5SoE-$p9#*$&8jo(AU$~Mrm(F3&qDq z#oor=-k&S=DjZAMpQ|J-3H{aj8Op-w{;XncCTwRJ+dulb$@FR{$ zf+J2ZwHJ={o$Ib4-$;1z(8FWcFW%J5YKNs^NCrdP>R^D=Fd z@t0h`YN@Edh<0g+EK_oo|IvBBJZNpBs~pjw2JH$5&%18^D{!;CC)MlE_o8GUb(*@t zuNDpKg1e)F0y(rA_Ur8*iVx%u-v0b>?#rA;O|<5XzdJ_c?+-5eipVfyl*sLk{?<$9 z<_&N3Lk9@z8Rr z;=Z83kcZT`0!%b*?z>yUD<_Wa4J$pA{bp2W9$N}MaNp_}>TBOTZfjEGn4JzA}WG!>8sEl+K= z&NY)4;U>^G%8RrNAlua+c}8nATt$b?K#BI}x#hpNos$=F+++8z%|REYOMq_fmq0KV=V5JsoqfzXrV)0g;Vhu4PN&`J zqqiLhIrO{RHG|fT6{Y{cG339~rMViink{XF8ggbaXJQ)noAW3bKo%}g*DHz}gA{^E z5_T)U2{$fGHwM{_(z6ui3W8O9W%q;@Z*6kF%5z}R(A)OHW?yyQ3NhT0hyP-XaVAl- zlAji?<0V+I@Mmj5rTRT&v$DlZtL4H2nicCtW~m$Qn(FCaN5Ss=LR&MUVt-?ApU7Y) z{KitA=X-GG#>yzy4b^{;Olx2-bId^M$yqocwxB)#{T-Ahy9G6$;Ko1aYH;$cbcVOe zX-)P3vgiMiIat3>@;_pxUG3+8XwS-=s$cm{=J$_J^FOlhnd-nAo`W^4apx0tUhV-A z-%+^qj-?ghqjiNW$i&U%AE1&qI0WiV{VI0S$Z`A-N*z5^{lMzD(y!yRCdCuPx*Wc< z;W_JfbKjFF1uv@hUimJ+r!udTm#ESPL5Ga^y++pUrE+_7-p^kO$_X z#jcB5I$yjM_IHC#-Av7bhr8D|OuZFUT=@@tX2C9IxL>JCW}E$zn=H*1RT}LM^j-Ja z)qv;UVq1`R_lB(_@#Ld``M=36O+JhMZ!ZU~tELIE51cZ){*KZ)reSFl*#4n=*Ybky z!hyun?45Yex$aBbTIOAaq-TB{u%d<+qE8TrpB|>vpc{JU$10ZNz4LtX$ljAS)QJZQ zzQVO)9Z>zwD4qR6qi!%T*3&1V;4pZhcyd%M3wyhU%uHZmDY+C64t*?|LWBXu8N+~@ zBLhl929!>L0abwkWy65dsYM4fDK?>a%-iTChJt8=IFV09yo?M00~g_B0e$27PkFW1 zl|4-oX+!p966~PIQ*WE<0<=sU({G}@itvwuxqnM;^ojCDEH9Kkl8+gzU!Hh99=)(^ zm=<#J&)5)AD5kw#%n_H>*7;>A%*pmWC;sPLcTgR!eM02HhcC{aZ6CxUydx#%{N`e) zZy98I;9m~`Lp!_R3YA|++fluJPg4cC%XgatJ7?>Q|J9onG*YL&9N?xLa`haMKV@QIP&_Sw6$W<#Kb)GF)`cMq(lm`6J$pGcLjsQ zPBjD1&yJ<9q*TmQ$cn|4n2H0!K#C_mEBS2!S7;kyp z?Mqat{YJu)mb49RXg&QzU?pfr!$cIO6syXW=jKxL01GOxF!|(=$(M*sJ}a1fOf*bB zqmlmRMB?~H3lt$!o^34{Cx`QlfU{&;-Ko$7vvR1++EOg=EA){y!u!mQtf`0=DzHmR zmQ!Il-pMP?yW`Pb!phD=+$v>NwK2jBpHFv8DHN zs`QwK-PK#(uBEJI$s?&8`5&iK!Knm{@rfkNfVe-LB3!|fZx!!-0(bj4IAtO%=>;o?Ohv&d2ddoT+`gPUsR-3F0jjkzAE8<%2-P~lF3$?X)L01T1Jz0es+Ec{ z<{@Jm2nV+3&mtcW2NyF5tKryUJ`-_)d~$^7$|X;}|5K`6lBE~1qo{8wdbrJU4$6>5<@~su-=X3228YK4i-QPj6 z(m3`4*C4EwKnMQigR_3)#ZGLMVDJ$xPtw#=ylrrIm^jCR|Mo+l0sM;q{EH6!3&$4x zdS+XmW)AQ#8bsh~8bn}QBm(>4AOh1N0y7{2+d>4sf@5ga(S9wgtDy}F5W?vX`fyy_ zD!6FI@qVHGoeqPGPqZs+1snFb(nI>4+E-U_{_Kv+I~i8KY^`FSNQU9Iye>2Ld%SBQ z?JT`h*^ZXHiuIHI0lnEJFPzpBjZ5qdIY+1(znZhY#?VfFx70JbV$?_^0Rr$W1mIa> zUGZu-t?cqs`u8KP+mZ-+`t<=_%^zY^&H`X%od14A92&1M@V&n(;1q)bNL;kJ%l0< zP})L~Urrn~bwA1TZ7E+H`*7Eu`oA~M2v%PAe>NP0st_OrUJWHYrNiGQiq^wwyi3rr zb(%)ap(OTtS+6e^2~_DA-~I6(Etfv?0NZDDpGq5B&B#p^(QJt8-X@bTJz_Y*O7Iye z{~&ZHRole+C6#@UV4|n*4U`E`Ej23k3sB8`saGRFHS?9EPXN_4iAiC~Omq-VjKDrm zCYODF9?FM(o*1d#yJ%k^$R=PI@^bl=dlo{+j8j7>3cL)h_OZ{yK6k%hJtN>dTIKR# zv87&cK&_|z^mCy7y0Y)YNQCH@?cRJR!c#TtQ)%piC|jraZnLDF-b`ihA#b6*<;yzK*T`;phSqewrCG;u#TCY#(FLQq9Ub}bq zhlWN8#o}ywAniK#b%>$jTsLKyf6+XZQAx8nhsk*{H=ZI_i@B!Thf2!}YX!VV{ z%aglQd0O#zQi3cOk9ouGc~ZRk>UhX=oM3V^J4o~7wQGUNqG`Gh$#pib;1#~Wz$-h_ z(rysuv@%Qtmbs2ctoJkoE)S&iiVhjSdH8nji^9V1nTrX_Wu0{yZ?gMPIOk*{ZldyU z@~G*XMCJaVxJzx9el@ZbHO1SKxfU_KbL6MT$SIzC6h zHmrmT56W!fOXFJ0NACM#Y|kkOK@GBP^Lr+u(yC$t2UxwZYaVs%&RtW5g#a z_;i5=J}JZLhi1Lln$0*0EgDBg^@<$BS(`qA_en3)2AlIP(Sp?Bcx5#w47_Qxa?Y}N zEOqu7KODG>>;YSM7+2hWjv~fUdWP-8LL_}eJ9+JnJI(XqYvnXL55@2f?M+h3JSk}2 zelx-L^3la1;%n-Bn6HXNh1&h@AF@Tdj?SB73#`69*oEaT)t)YZShF2xd_okr*7imw z%8dKToZXxd4X$8?C9`N7HUft$Kxu2^ghmTcaEMLvRvNqlK%@Qo;C^8hU{?WxT{OTh zAsm8TSir6HcwJaBO};LqK1&y>cEFJV-!1$V1QhSb4l_Y*0@5lNic&cAAwv>PF>Z(tw#Hk@h-NoV{OSK!W#Ss9OW zIrE6@-86%()?S(`kWKbrD@wbS)iRt~Y2L;(hoqepnz71N z>pRpv5kcfsuVQ99wdO4$GQWB-161L63@Ts{MSYD_MNa3yEnECT|R9vT8v zEE1sfkpLwH0gBH60@Qv8Q2G#{_R0{pSY3*Gdu6XotnVv*TJcu6*sia(cRxF6V%y3! z-~Nd;1|w3KrwT`76XKBI6u)P#ZC?<1t#((4M|{EESdoREGy3-WlJYVHR4yeIQL5A_ zCt8&A1vOt&Pe1*9S2i~>{oMa=YL)DnlfC~|t8|-$yQOKTlv2iK?x?T5(481!^iZra zJ;`TzZX0bUub|zHQ#riWnj;P~XG!EymPY-Gyd`tHoL`b8dxod()fTh}ddXPQqkRi{ z?xk35>@59v)qvjayf&#ftefaXkEJZtWYr?iZGJgl&@S2p02Zgr(&y0R%hvs!7HE5%2#X@Y=(GPWe%>$8on$ifg6HHE-g&>mb&<2uq%(Z`f$1 z_eh6+Zljf>VFxrKl%p1jKb=kiM|1&>$YTW@aRaicsX{q$#7vwh{WhKd{o7Z{17wY&k3C0xpn&_N=p+7$n|%!z`@jz9VYTpkJ`bKMO^vGbJ%P4P z!#%(b-!tDM?C_?wV!W})>-aAmjK<>U;<%u3sfB;b0?&>qvbLUUia&H_%IT=|y_Sgn zYuAD{@4WQ(-&9B4_Qz!YQLzD9reBd(#n@>{cNKA89SqS{CS~Nig9AGy=JP+|)TMLD zQ8Jjd7>effiIB%RDZ?6TL~7p$uG7`uBda}YAr#*l6{~^2UDL`;(7;o^JoeyR``%62 zW2F9reGycE84FMWg4{s`7=QeJy`Pv<@qv`TtG$L7gD0_R6et6s=_A4)$VmVd^dTX3<{P^yty(Aoh6gg z1feeYXDg7nYDi~bU_FG-zbR6Z_8`f4K>_3aLZM6*WY!~i0GMhdvwn{NjJGT>U~2#v z4*;0=R_K_jLMbm#LNi z;Lb1ZSRxBfzhdou=YP?Dt$63^({7rpuGZBXb{SJBu6dTW*4;-pUspN%+^@IUytdVL zF}TfkK>R$^MN~dA1OuD5J+oqZ@5JAJULv*sj*;TjZB9M!Xt+rhbHPHD zyA#i4rM%YG0+sDN499t7IFw*G4jumfIY&^{UUiPDD*syDZ^>&HZ3kYIe#wGyf9KEY z-@ATz{>;E|JA8`=+tKSvY))@+;QFtUTjj63YTQ0PY zQ@F56Yvg7gugVAZGXK7Tv2zsb&`@a>wZ8w(%JQIlBb-HH$t={==)-6-WabTlcbR8$gG*Gt^Bhlv&8J(&E|CZeEI-as;zz-S(i;q zkOdlOE-ZPMw!r}6Vm8zjfCgrxFk5lS@ddS1MVcZx3I)s897*x8NQ#G?X}~Ce<*N(J zcRT2)a)^&srvM{_YwuUB+Yn+S>ITqVpL) zIPgpKuXJbAD!Nhs+Ym@!3IyyIKOdP7?D~Ck)6B(2kEJ8rKAg`;9BeMp)=n?39KDg0 z#0`MGB^FQeebsB9Yn)YP_hz4z;gF^#|DHO2{ObJTJ+*G4M%q?{av!aQ)L{$mn)`F{ zo!M%OGb76Ai#H6gYd^eRz1c=Sl4kdpcyLnvl!}`ZRk(CmFEO|M5xx~Y86<2QZ2O{$ z9#1Oe<86(k1?-G3NKB9whVy=e+5Yyc;34#DV~Y%H{&~9b1yQlOxZC?z9{hO)nv%3R zN#-u-*V#c`SS$$iQHVgFjR^GSh(NCg0=+Z{^mzq<3FZ~tb-E^vMqYv+dia6MwBw2(!z5txv=Z@+{J?u(gjLL7qQNB zO*x;{<boa$xaA)cs>1cAmkv26h$4*hg717nc%`UK4}#^Qy^J1s{SJZZwzM! z(CbFO$Kcg3>lj<9TrSAODd6?!l*+wDlN_0R943^4^SpdUk6tehA1{8SXco81il-jpn({DUf{Ss;BA>A(GGvo=DH6iHKOd$c*%=nJPmxYV*m%XRD< zNCR;0OvUTI9OT@Y+Ck>!f?2$6VV8AHWl2?k(3(M}u#0Cf>HzP@qq_(BJjKfZ8`r@_ zc$L6QYp&y;f3BOY>!$HAD+ieY;uVauUWQw*(oY_n?zz^W((z$;Y}HEM#36-{FLV7h zjS1r^Y;^M22h^g@X7qiQ?y9O?R^Lzo7^@$|G+G<6(sgU_gYLj{I##MQhf35^$Pr8W zj!(=aiC^sd)j>%zcileiP0@Q?A6N3#x{MmfRKIe2k(d!ubFH)Z`Hc&`{_yG`Tc@qP5cG$|8uwjP!#k_tHE-z#_+$>(T3jwZHokvp zpZU=uP8@Yl4mpo;yZFT%3td>w)-Hbkjuvn_z6h44_-n{&D#gCd6Rr!x*k7@0 zen<^q`c|Ug7$~9mqNrGR@Drx5JER7556%EEHfvyPL^?3GcL-yG3}(hMLPA2aXUWzgSwi;g+ZZ$UJ%mz{ zE$gI+l5CTGNo0ASuYT`udH?7ApZDBza_@A`%-x^Q^Lak^-X-UJml5(0RdKoXSDv>& zs4~gU-+!N)=u#N5$9rzRJCTVewN6ZvN5#G0=v9IZQ-#jt8w+fOXwLD(1v?jN!BHtG zv|ML&?c`{4gx+w^8jg~JiH8rNfQ35Zfw_+NYLV2l8EZA_~ z!U(+QCC)Wa1E?yi$w5#~?_g9!$i-E?7f}(dF+QMLIfJ`RnRf68Cr}P?0wWM7P!(~# z&wvxSmMdg1l?6_qDmZ~>#u&>ZyyZn&R9Ei(x!~j0E(h}hGDqa3&z=Fa2N}jQff4sc zvVeW}5e0k`F<^Q5ebuJ@pWEq4Qt2YZi57TRvF}>0^Efq^!<9U)JLXIj{X(6fJX}Ax zT;DLjD%>}?t!dp1v4k#ZoR6{dnXhV8CO%T&BhQFz=&EcmjTd{4oYyu96RqGF(*R2d zv_cfnp4fv?*&&f!Fb%R>W4K_t18~=*_U1$((_J5?`*SQzcMW*OHJ6`+z_^}#jkT1m zpLz>kPGlX7X}-QbtoUqL@lmki)mLsk<5Y)mJ1MeHL=%p8oh3zL)u;hn5MzW4ii<63 zATS#ycT^utf+)KPX08giY+GpLS@q2co|gXT)=E<1swm+>h2En1pie--X|9(ieDIfM z%bjS#;!@QF!3|qCtLK}rv#ou!UobGPvP+*|r!X!gvK;$3n{bXxkd4z8LRFf|3HBr{ zbxmsxJb3GI(NzZZO%lkrhvCeuG=b8Z_iVDt$yv48C(7LA06!hfOO0Y!h z)8TKze1_EAoaA4*Gc58a*}?}J^$L`$!%>PZFicq?ktcz1%st1Y3L)X#OWdlld{SUi z!^wB&I!+?oTo%GN<^nh8)`xI&dce(v12-oP+}u4ZaC3UqyJm8S6QBId^}Yh%E`3WC zxH-r$s-B9>f`tm1z^q2SS|==Q$>9h$r#DmbAS+JV4hHD8Sk~;_dX*#r<8A9&1K~;Y zsqK3FkYK3eO0(@D2Z;FknM(f(^ZCS35_Oz^LW$fRr!X z)S|1bmVi=h1cxyvB=REe@nfK~L~uEefzHx$$DF~Ki#8#|N&-S>Du%;{! zLJo+PV;Be7$E4xED&g08WZ;R~0{lFJ^%v0AaHcN$B{wEo{vK=eE{r-1vL$vKZFXOCyl&DnVSM#p?9$nKO zKR^6thTTF?V@cA+v>=V%s4mNY;jrrP|H5Ino<~SuNm$C*lGl?I#;5)tELKzGfryBR z@HX~PM)wyFNF!GkkFkfkn3+YG@!#;N((18y+~5{G&Ng|6#aW||3;)hTbacwC;w#sb z%_gd0eOtZ7#_%Y1q3ndv3eQO%A;FVb_ixF7vP8(i!{-g*dk_0{yOx$y_aRQBfACN| zI5ybF?_fO$fn!6s#4QAl4Jm2;x;NZ|2k^^<58&5z1bzu2@T)pzP`8Ny`iOXdUqS%C zUdHe<6rLhfJ<@zbup9?1WB_Eo_s}{cv_9e3{g4vkvHR=umgtBGjZfjwo;QSMVMPxs zr>QpEnEFK4_&w4|N~Q`L%zUOrvr#eq!5ZvTM?VstBjspt$avDE_m-5gN?JX&|4)@| zqCnZ?z1k1sznZQ;(;5?e^*!cfG+y%N9^*Rsv_qwcC5r}2_F-Vwgtl~-vB}xIK-5uV zWwj5$<{BJ4R2mW)36m)QT>EpFMERGvt=usOjM1mXu6^p3wN-Yy0KK zmV&PQc!H_p3l7FGHDBC#(jYkDVpltQK!=`K`5mjNFZ7S<`5$521Xr?FFcQWELWC%1 z+e!kAD1~4|9l(g^i3mna28{RvYnmU0sjj?81dEZ}%J$eGUb=hm4e5KIh%19{u@7z5B6g%i{{yW%jOg6CAC`Vy3L1bjR@{+FrxB&tp`M8a61LX)e(1S=m z41gQJ12<5P*Y6Dd(W_b@>E1|rY>@n8hQ@&ASHc6FIX7hZ11gGMd*gjxlGuptZ<$^* z-k>kuWpw7W5n9tAnepBW+I(bhc%R3UB#_A6LLqvtH=CcYsMlW>O4D(3KVdE$t<{0@ zu6#A1b2%`qN%cjdVJw==nfJ?U(JS?<@)>!*utnvWOb_`Kb#9l{C?|CN%u46x3L=ETAag|a1zi~uzNh6X<2*yjjN8{@rmXfG5F#Mqx{%0e zfCk`OOanqJ0)&{itK?SM?k-Rr7()A}k@o*a+CKo?NUIsN|30+;H*h1X@$#jHg*>;5 zysu2N{g%FUA8ZX|81K*I)un3Q2iUVy3apcRRhJt7#U4T?_r>HTeohOXFE(sU@R`ry z==qXxBG{ZRrAwiMGjhqE|BhJNaMP#8gVlRYHhuS*44%@y!C$=McgMlU zfB`fRblZiXTU!L(!azQfW-c>~*52Zh^ulh)dhXzwC>idwjMG3N z&oT!fZUAJ`DfK!QBxr79mU07Q_ETN=F;Q||pdVz|BU`=|Goc)FoZ z+6*fFv#BAWqNo@iqq@u&MuQBOnQx2jeJl2CysIvG5$13+UbQ7=pn;`3YKy>(&}SLGK3F+O(_~V_c916+(j|5k+4MH0a2OmG17K zq@tv?z9js3iuCqNX53GJ0a5(@?|)M3gcl_Kc9OhrM}2BOWCBX0N-Dh4dgIsa;(tn{ zbI_%1p9j!)Hs9DBNK^_qV+Q|=e6-&6nLI0H{TX0^f7$1CP94gL`B1KPclTI|G}bbU$hT3krLfjq^q^#UZe)c zq9d8LU)LB5jvFSuy)Cj`RIncLG_JZPT*A7yn4Kl`#S_X2k!#U=V`BJIo7 zX;D!8iM_WNAKCwJez?!DkEma+PmZnN!ypq=vF8u3U!&B(%AS1#n= zbr(zPh{C?G16J$TwHLK!6J*+4c9vLLoTK%@T@;8rrGs5dADI0`le-IR5qD5pa}?fFmpdj&uPWJpgdD4~bS{ z!Qs$_Xl3qcOwg1jvOZv zH8HU-b^7`@H~#+=RxP5nuk!T_*b+}_&kFz1%=D)Z6ydx7@& zk7l2t4NGbnzxg2H{etLTZsDT(fyBSSaD77*R;v)_6YTuk+KV+0{hgg_SYNxe{r&s* zvDM2|Es$Ad=|K$j0mM*c@Vd-HPiV<|u+Y5<+6mInjxy@TlE^sn-KtPYjcDcMZp|%2 zZ`N50w-b)blf9jJO~1wYwg$5M*O{8%+@4Y|IcaMP0$f4Z(mcEoH1m^OkiZ7N{e*dt;#!u1EA^ydn! zIsC{~O5hh*egdd;b;m)VwS`HOPB`WlGD1A&H_$YX0ZfgD#S>wmsZ?cgo7CNNb=xK2 zEqZ%*EIZ3C%v4EL6oVd8TNKn5<=~O7KuGUl$J$l55CG7{hD7FKA72ANhhpQ@BQdz5 zV)^t)TEQAadV#s&##nIHAft%g%Z2EqAj3&!r3hU^G!wb7 zHD|GbOzK#s-8HeUhLe%G1A*Yv{LosP^e!0gB$CimW1Aann-qbNtd8Hk2pZz5sRi+# zOlXco`TIT|ePKA;>Rv~ogoYMHvJCCQ4=dC{}fBl3-qh*#yR%!O@RPDYIW0N?7AuQ z@+N;h+a$`ZBCrsj;i3v4(hc`G8=#gc8|M@-5{AkNzsOqZhSnN2;IkK=mY^VeT@6C6 z6vAGox1%aEg}rVH_Bs-%%8U?InJJJfh2HYI>V_-#;LF|HYk*vtM5z#Oy4jhl65}RO zunzOOaL5lcnXb%AXCwON+wNj+C!Q46Z}_c`wvmo!aZFmXIESGYP|kL7Ukjr}KLVN9 zJ>SQDo*dg->viw2^^yrkp|m+yH}UcHSS#`BkeF&6!@R(CVX^iV@vZY;m~EK7>_?7q zIIfHf^Ed)YK`j6`zF?-F7oG#H2&}@Fxzzo4xloIVvf41HIZdoJhGAB~71wn*PNT9f zG%)GCkz+H%h#%mH_yNGQ>W&qFA5aB;fFt+;uYemLrf!}B0g_`7$by=u3qWGFqYt86 zGypv(@^Cl2BYt!ki18K^h{kk#+fRz`cNFxtPmhPiZjNQW&PRuNO!X?jn51Uc?Q15x0YfTSm5S54%QdzP`_d`Qz;Db6nhPoP0pD zs4J^!pc=2MTWe^bF#2%XE_T@#!;SDP*#Jo{AUsPf!n5G?{}W?flUy+1mcbF>m<9GZkqkuZn@6nC-D%aqs zVOCNP)qsKXW74S6&C-gu6T*oNU^#3@Tu+=|;W^K99)`gVLiYCAGvR_^M^r!*P;j~W zJk(hQq!C~Oo`*z+VINz;(UND_94k0lavtsqP)idNLynfHAoK1yLh9`tEjbVK?l{!h z7V7*NIa+ca>ipc>zxMoj%AiH|#U7CpQ0E)j7xj-#1%yGJA;X9KXy9|G^QE0St3aLK zs)ec`lg-Ht%b@`Qio=;X`wBQ$;0(#3iZJZjYyB0uZOYx=xA_^-A)U?{bdVyX`8%!9iAPkr=EM?~IZ!!A|5#-qX`pD(_!`0Ykdon zpg`;b;m_~-|ByT@mO@hrJ93nnTl(&H#g$r_XbhtDe|YI(|Dg9_`oVZ{%iaUCe3vFpy5HH+|mDg08h|w ziyAE^{B3B>-^poy@$Yf>9C?|ok;y+Fz>pCTLso&6JNrXi=Cr2oVc{ID$4Qx+byd7! zlcp>mbhoR!4<~&zm?~ILZq;p3ip|h*{4rL6XSA~|!CF!?@aOExqy+M%nyi^du~Y8b z_s3NPm)o8drmC63f+6SSB{4KXy-|uipzuu%x!4aDIJGrq zxldbG)^{T}BNYO6STqFeGKmndL!*&^oh$_Gx-dcp1Y%BQdMX6$`Z1UXpD>P|5j~h; z7TLhma3k~@Dj-!6ok4utjaiz1xRdSb6nk(D+K2u*V%`|8^lNU%P5po$3S#rrXIzH!c!R?IW)4z& z%}o590}Nl=yLt|d#L^XA!p@_V=>Nx`hy795H}>k}?-h~j^JG6`iNqT#BCt_-!bU-F z1{(!K5u#ps1slb8M7?4N>Xo9((+>?DH}%B$0;C=(Memxw_nQB^d;2`O=p1C&<_8Qt zS5Dux)2CUQ-}P#j8EsKOe^5~W84VtKhI=nmnTl#wm#xC0cWs<>%nbc`FXaO2YmWLd zeqkgCtKFQr6_Ic%pfj1XlVu(O8+m**cMUwMUk?|`@m955I{(7el{~ywB(XOIqrfo6a6si06IVr)^j~G{xPIkLO z!lSpjcHW$qH9PWJND>ntf6A=Mpl359&d95HX=VXgGA5AL?WR*PxM-6oFJ+UiZS z?&u*ck=kNUck}67!o?KwLcFP(i(N`(^Bm?*50^FC`AOHL+B^^$pWgIx0S0NMGOWOi| z!&zb^<^$i)awe%*;f=ku?OCzCT@IeRl?;+vkXXs<3X+=6(v+TUIUn=Qj+1f*AsiET zI67~&hz|aw@B400;SxI_YWP6eKv!_b)m ziQDn-N$lY<7PvXti6(q4LPvD7yGi+q_VVb)abPG zi|G@%kaG%5BFZS5+s1$G%q-0uQ>{Kl$mMo32?i94?0)DTzj3D=&&tx#>HC>84+cFa zpFF7BOePx%=1~V4^AW{7x$tTUdDX13hfH;~z*$g4%E&cLk8y#J_P!&pk8$UtcG3WS z9-sz+0>od8!zo2rSl}XXbVKd5rKl%4w_1X5rE0gD7D;FOT=6LP=;rQ*QMZo0>2ZEu z=Lr#QV`m9$V<-Yh{|V(o``G!|_#8M1i3Y8g*NqwYtU0q|0weX=6*Z881t&o!FlO%_(16GMv%I}tAnZclMbEkwkC&AG)SO{Apm-a zp)$tAc+YXGk=CzgW3%1b^~tllp6f&Ep;agOc?HLW?4)~~1he?#`a2G=1~lloK3W55 zkowe!_X?kmEiZX+--fZ<>4|>lS16v@?IXhS-FVVxedZ? zz)WY!eTmb9HXg@88^e$`svvEIVn(5PZAz zEqJ~1!9_A8JM-g|`_&eje4C4hRM>XX=6cxrOFK;x0!+g=y!S^u*6U!`Z}QXM#)*h* zey%4Q9dL!Sp|;X~C9ZuT46!_8=Iof&l381hrnDlsi@c%JaoSJcj+ugz6Lf#YoF+Hs zgV!sJLc`f9G+oO5FNPYwWAXl9ug8AlAbu`uy&GDwS+D=^>i0h}f!{Ig57EX9a1T5b z=;7LTpH|E~1bcimHm7ICe~kvzFOq<({R2YTARpjr6QQVdDvf-z!iNmUEP=>)O{{tN zy) zEbWx5HM9WvX*sM0MV91VVy|d2!WIaR@oft1hIh3RS`}}gm>!UjLh);C>Mo2I<4%k) z%^{Q|nO>AYhCNmb_E^pwWVu06H;4qwEeDoc0xY*1WKg>kW7e-<#9ef6Pk@Q}1`DZ= z)`INkr5AsoZQ>`N?>7FGr>ooCpP$1i-}FOi_hNr2Y5C6*|8}&=4GwN^F1eIQOUn3p z{8=ntL)$K17N79%ihFNk!`!N$(emc!>_bP(73Sjl?9I*2kH3FUEsM#Yi9W+?k`~Fi zl_*@bEk>bGoL+Vck7pkln?euHzbq>o-<$9&W9=Z}SLT?z`TZB<``u6kMy^rI`JJ2NHS0NlTpum_T zU3>NleTwvtR^Ekpou?0aCr;|X(r6^{O*GopMhiKioCbF32+CDw=^8UgT62Dn2@Jrn z?}BwAX>CDEl%Y>vJmLgPBU$bnyACXk5oGy0AxlFNSsGBxV9|l4Aqh)k1R~@C7*hqO z{tGMBuSu_`5=O8?^t*^iqI-ye1tA%$mwSm3r;>3`gt6jge=f2joM1&TB@Z{+rUyx# zmE05yWnv=G=ENtBiE50FiSA7u7|AuF!SR#dU<5)r6fm}iB;~~yrFr<%xzBdw%<(wN|@!xIcwOwYbTL6SacCMGOAg4;+EMKIfJN)|=8RK0%M+QzOrqr{jJt4f zY6zs?ICMm-dBN=>bGiH?sk5rG!SdV-?#qLY4a!Z2IJo`g7b*e=RMMBSSaUbg0~p7m_xik&^_%S=TJy(Zp#1rc^K z79|EmB(W5%(!pAbnA5X1Z3Dk6O zz4w6tK$|a~D&FTzLK(CXYAP?r8}u#3xRMHaJ`i9#)*tB+aYeRc%|J+hTM5Ku&6PII zm)M=O{L6L9mMtD}2giE4EIs$XMTgSHOED`ti2oMt>ORRD!%lZsBF`)Nrfshj&w@nG z&HXZBHm}`#dyK2!YHwPOomXhgGck0@tWq4ea)8J3F;8IA5UvRDd+c)s@-Iv}x0GP(TF?ps)H)WA=>C{fdu=cmJ}i|$fKr$!wXj_ie~ll$QMLt>@Wm3O^DgI!0^?k6TMwfiSnHJuo#u8RGB z&@=~(RVo-OPcT;BNrhKONULV+M28^c3f6=L>=5_A3s~tIG46wlxYcmE=zrq`Yw}bfQD9OP;E7&6AuU9I@%Juf)U%r=FQ>%aTHg=An-dTu_xwR z4D*L3>{gGlh#z(4XrM0v)rwn()~wssUKaL4`3*Fp3lysTS`}fJ7=hNLm9qXTFv*Yc zZNw1gp*5Q^(gTCqL(R0lE103m`aeLRvTOo@DhkCX((@0xzO(Pt?0Vd zLmOCMA^3LbTk-%<|BxU}1#Dm&UcEy%?W9^H^0Z$bE|6%RCT8%K{2{IMUOnT=<(GK( zW9O)-G_T3nBVA46`?KV#Mt0T;u&bG1S2HWGY(C6=m@CMN%WKOD4$T$VomtBIv{mse z0J5Dz@l^n1dR~mzATFr~fGigP*;53NT|)p_CIZNys2h|Eb37B~_*3LS7WhA$;Q#E( zBzMy5(d#vb_oDv1c)V z28B#Tmiacok$8$Y636wF&^HyZp}7y_#sgSaoP52+1Px@xm{NyX!~~zIH@(DMZj$fM zOY=4fyg_3(6?W{3ZzJ!#VN6~*Fhv!;_iRk3vD4*&DR_UEnV7(040|J>qAS*%(>n$B zd##wyd}s?;(SuV<4l}T#DLSyCZz3zY99hwQI_@W^(^$5=3XG}AXB`LGVvJ(}&-5t* zKf~-Pg51$7Y*$W|rI2f{!q31D72TuOeJ%Eg0jDUXl?Hn}07a+Uutn1sguAaASkrD< z+1nNEx%=MwfDW#CR`7PoiIM2)^Ck?veyw5PbKP^g&hsJsM%08{!d z8T+>PiR=IUxZkgRqWK}oj>TUzOMQFI4ObG2o$5QL>Dwv@gGzvNrG*3-)SIN6K(JE0 zW9&%+kKw}kxK>3Y6qChHp|}{E+NkfvsOgUB)IT%ytw%qU&fAWZ;~-noH#k21Q6IQ5 zB~9SQNt_;69PY1Q5zkri<2Pl-XKZpNGoNcs zDN8%;bLB@;`dYZ?+aas*B3Da?21l*AyG?>ZFBc1ilJ!>{_^+trwyvb_SBkaBot2Mh z)zOb%ATR1TH}l@_Ob$uOZpQ?%KjS~(cSeM;C+(dgDb37hyJNa(^_HkzZl2UxjZHDk zef91ey=@&X9HfJ}c?T#@@q2T}4&S6%IZoF{cEJVMwMhjGEM_x-&Axjew~Aqm26bSc zu9sRstI{s)=|ky@ku+WE26=E_pI78L}Z4L90UAefoUK%Fi9`!TDG0cC?f>`If&rjejU)A+wLqo$tiO{evL~DwHV(t|Au%Q@Edkp=e)vpLA6QCsX0mze>T>d7KaoCVw;i2RVO` zhD(`eK9yYP9QDVRaFM;JA1-2Tj*+QXpSc{PMu;*j`EuBNd2$c$T^14^mt-~Tkm`2F z+#o+f>Y`eTO8hUcS79Hny&)D6ZT%J+wm0RCMLUH1zfhFJW^z82pQTb<67w^Eg(gk5 zCMTnNMT5&GrCWqELnYUo-oz^l`kxX@UJr1!BQ^Uq&;L8e>DVwX%$bZz9(afmRIg43 zyb5j;xZ1>0)_(;ioiRSiSmJlMltn5w%)Zum6L$DyWQRv2eVmA-F9(Xc&4|lQgdIK^ zc6cYm^m;$*kH=CXEbp+#WJV%NE6z37FXO?i?@gnb>8L4|lJZuJxurq?dl27FHQmfKN% zFlzj*Q|Q~j`0|Qd+E4qkDqG9@I?hRN%2MDNTaPUp_v%)Qyz$NvY5Q9F=aPAn_DnVv z24m9vOe6UMkIPC~;SF2Koq|AeEYZmzwb6K}&*M|`pfo?rWL_EI^d@7#>67_@(@AAi z@h$8ypbQ%R5gIO;2Mzazh9~2a-QRsg8jj?OKSIOdwIU>a(n+qk zxq{v7J80vcEC%!2rsA&-{dxi&N98&`Lb=Y!{7PmbX_MIJvu(?P&f?p^I;gM}+>Rhm z^$5^kRl0xlXZdwKP2T1UWRE!og#JPS{e`ltl@GW;zF^0sTyba&g<{Ic6?hD$I;2(c z!cIZpNGwqoo2sZc)MtqGUUHCtSErY8dSJ*hK`MR)3sUhetR5J$BLLWOSW^=tJ&0~9 z14uuL!KH;}hGd2t={4U!{1kF526_|+{t(no8VJrb5Xd2?NoVGUXCf#m*FX}hFsuFFaUD*A~gd6O0-+tI}lCF_YYH3cq2_ShS(P}~E9|AObXj|(lcms7~V3$@! zu}tDixLr4ZkBK%%V0S_(>%Rii#WB9uF+>^wM{ky=DsKSPW6S}lM~gtchX~YzA~Rg9 z5<+m_`t{e?*KY4_AR~h0if_P(&|-E{ug>efUm}*? z4Sv+FRjqdZHjH9gQ>cXM>ibuJv6JcoH|*Ysb~SJC-?>7$uBplU<~GSALO~NMZwHmP zv#mWWh)3ZE6g3MZtMRRhw*jRR1Rlqgvi>VD36AlV14@Okc*XLUN<4y62?$CBMbRll zQFI%M%jq2%ao=RFF;ZR7qU;Di14?%a0=u8kA#qQu$%Q6>m6r z05eI@{YgC1_XGn?1b5q#OjpZgH2n#m#5*#r#Ik4!FTTjxoi^|0(LZJ*9bsr3^=&>Q zhv0g1zOQyHfC%o*0?@<@FOA2ebdgOv7*;nJ8=8B@cLpRF%)CZ3!c>PBspGDr>W4OZ}kM(+5S9sv|m^{#aie?K;G@odDt zx;SJt9KO^%GG|P8{rmFzkDQx>xz>xkzn`5Gd1kmIfG^tr!cLBG`0YY@-<-JTdiix0 zPat3q0RejykpJI3{Y_uK9Ed*bDtqd5!xbMdZ%3Cy{u)2*@ue#vzv~k>RA($#kI*{@ zvMEEDSI=23UKfOw>Hd^2msv5>5^O!^4W?P^r{GgL&*uDnBd(6YMc@oOIsPJCyi_ zcY#4ARs3zQ?oro(-etg^y)vAqv`4u&_dfU$(r}#-eXItsH+#0W|g!(Adj?#RKQhW2~*Hzt3YFAG98S z(W=ylJAJ5dG14hE=y9G5*Yz<@CjevD3)J=*YLX)Itkg_qI97nd<1d80ncfig=BIfG zhf)X}$_N={5Sj-ZN+HD8UXuBBUs7joFC2A)P>?`z^ zz4e{!M`b9Ke#zl|h^bIz>cC-+7aZ%UVy~Z*68ajt&pTzU+^JN*EIwYo@r#4q_oH!n z-;%)?${3c8v1pflya;iVL-=p}F;_dTV$pH9%w8{4cN|Y2TFNTWs#tu1=}o49fKd$b zhFC?x4Za3($m6ga%SZXrN4_38B!0l3bvHGNB2f&;$W!f&f+9dv_?gGf+8D zS+zYAAk<^X?QP4XRrP)b!pgfpRzAfJo_L@#bLgI$1iG8uhxdy-3$0!^ zP`0(Q^*h*mvA2T5S7V7(X0@W%x!*hukc$g`&&py{PFVBOQ@Q%Y9Is2JLXLMa93*@g zrl5<`W87P_zAV>I32}+7fgoGWz^w53M>^JBwxJ3{gWRtQ;Kmk~vetly4z?x_DHM0% zQWb%7HHE9Q49_^^!$ver8w}!fskde1eI$uMbw1fS*#?DQwtLbD+;YT%Pbqvw# zg;BIXqk#Xqn(;4pk?1o_j^vijC9Yb$j?F@HgtlM`TNZKn(7W=}c55coQ$Kexm#tHv0)trGHbo|_`aUwm!hZzs{7RoE*MI&fL5BjV#r*9 z3&&Lvm~H3H*SToJ$rT$IiDg&RH)eoGcAyZLy?7+56{7}c$fDLgP1Ipmj|D_tuLjb1 z7H&|Ii$ZZv&HfT4>jf3h*$z#~%r4T+$q^sp`B$WS@W73($&dIJs)A#n$@}7y2 zI@i|h&c)wqEg?&hpB>6l3(*zD|y(mo%#6---iB*i49Gtzu_>a8>rL5(xid`rs z1&9z7loqGsQXd+4G2$U8Y%rz#a_B4$`~f`T=oBE1jsfBiKruH92ab*b_yhQY+~&VQ z?p@?U9<@BGYX&ZZa9`BYS#(kN5pnK=j0OMFy{mb=xN;a@#XOb*1m>pWK5ITn znYO)ozrJ4MmbSZC*VM_>Lh-Ev3(|PiJ;4e$p4npTwviFUG%v)V;=HQ};`O`p4Dlaein!ff_sI3^|B z|E)}S5zXn~Xx2?J*@&Nglo%64RId-~{QdhkZ}jFjdEujZkNoRo<+i5!S6643D=X#4 z|2nc8N$1}R8@uvX@R59Q^Ti7lT|F`%7vG=PN3I)qVJmXTqb#wvUVqI^tp9|LgL3XT z*UQIvX%P=rvcCXB#gICiBAX&JEA^<^D9}*)vk!r#$Sq~fY*l=UV&Wttg<@9NZm?dA zdaypRX%75k*lseB?M4sTZgOF}iOL<8_w;v;=DzH>{ife-b4t7~7z_nJ`Qw?j-q5|n zF0|Xl^5Im4qGl7bJ#ltL-$Ob@-kAFeLHA3uYp&eQOjGea{FD$vV0oiIcgAy0Tx;HN zPN)RCllqG8l9t;S(xel<7o|y$mh|;&4n)an-%|I(XyN6xdcN?q)XmAArF7AG?auao zsov`udz5!_Q<}J)E%+(Mfd~5>q%W8pJ^4QL85}-~ z@%3?v;9IGVBt=fCedwzVI-4_ExA&Tsvew?SIq1CC*r5vK;R+;~pU|3m?y6hzCdO|v ztXb2%hh}ia&esdWE=XfL<}vCl@Oa%)dedt6nxw3aUzjzTuCA4K7Uf=2FLYfr9@$*fi&Dmvju@Zr%vwsyyt6=?;e1cIt;t19&|gpD4pq>H5f}{R z%jYPgIDtqoM|bcfTDJ$EHuk;KZqhb+Nva#TE@932H73vrdI1QHe}%xL#UpoHF)v9; zD2Yv;+NYx%6w$Q$Kk_s*G~3%d|HM3R(|LQ5RoTC3kx`u4`E8coVZI|MT;?wBo6o-9 zN;b-_e4&*-_REr)zO)P8<$5m8W}n82Z7jR^QOV%3^FfuHjh7CZGu{*YalQD?w27YR$gtv= zDczZ^Vt0m_;gnbt%3QdlYp$T(0JqGmd5M^BePWkM5bKIdbKL`DdGR^@se^Pxxp2rM=6uML%IhuNfRGE@*#MuMw>>k(^OT9ntzU0~e+i z2s|I!Pu^p^>vwA}pS>-sT=8%f4fUjJ4=wvTg(yAJzAbz#$~R`82m3w(PlNC$xn0*| zEYieVaC9DrNY?g)#}6D@Kk9FApf@v(g=N(2m66XKdm4>zJAFt;qpL}``v}b*8U`qH z(!2=&OD@?(OA~tj7|k*G#Pg1@hog(V>uqamH&@}EKjK234tJ7c>>UR#9(mG$9`Jv< zk#b$_Wr!{gdpkCV%rUtBMUwZ1Sor0^Ba?mG^_IM};?j@p6i)hhZKU>3T&(^Q+<2ds zP%VHtw8puRZgpvN48<*9-+4vphpkdu7<=jCm}!ORq^SvXbOE;0oB4(eSBx~by(QV1 z^>*bRg$iN*3(h?88oH0X5|}3BH~RaS zgx|fW?^^1DuA}Fra>deuBc{(!Klc4AY3pbu?d-LfE2E|2nZ9f8hDEPK0OpC1O=)B+CeK=9 z{PV5PY8O*>cN9)>jV7G^bOf!C8Z~%(Bj%lN?R&ws7K=Reu&k9(I?XK_WtDfAOV=5z zUnuBhTRovG(hs4}qL=v`^Zw0+cQ;F{i(?kQEY3RHJY7WLA6A)T6SO9BO+@1^y*2-S zFrHw=_w0G&=`qHR@4AIQ`D1j*7^_Fc?F~o!Bk|u(DXs_~y-V2<0*-u^ks@^^dG zX;I_kc-C8sZ{IV!&^2{$E;ioAd-X3xJqhw{(+t-U?>382+NU!-8KAi_d^T+RpvRjc z229!S?a5<3;Tl3S4nx7=BW|h_RY5<+Ixpoq{ykLuteHpm7ux5?Dxq#uoYlw6an7C7 zB8ReOsag54nagkPiO|@0PU7E%`P&`pEho!AGrG|)?ETM;WO``MWl*y6?7U$&Id8Ty z@73&|qUm8tTyXSkZq~cw-LjWWObhvxa~#|Uqf}#hW;Wf-N9%`uqv$=I7=Fx0-l}P# zKawhZ+4f9AfEvwvG|hvF7Kf8XW@v-xqn+`g-|n~dZryE&m(dyzUhiMM-`VG%{CoBH z-?}MjW5HQ}BY`>IJkjogt%jkjl)ATma}h(2T9*IjHTOGTdNzTY*V_Km1UIOE*Ys`b z-OA7)o(o=Im^gZ$_r7Xp!{3b`YaW<+G4jH*G_v~e6H?3ZJ@h&L+B6ox3~|H zL-$k2Z#8}mleRY>pWE&3iW+`jmb4s%t~l*W=&dKs=Mn7W`h~Yvnuk_=CepH&mOSMB zH|~k9iQ)zPOyoBf+a!)wm1RqqZTMAhwl)2*5ICw8_wKK@~_|867yU3=-y)ayI@`wwUjjX?Z(G#o7XlQdoIbTUFmx8SIaLTfl4eB ziW40&5u?Oug(GLjw)Z(s<&d88SJP6kb)CQJbtx9?9K=aeem#&CaDp!o&q0QF2XM7NLQJ-tNf77~A_j^_goZ)BLr3|K!CnxbjKk zK$gU42}h==Y=}8u)f#%cPu z;a!>yDfLsd+oF*l{OUV4{)EmonzwS-vZdK9CCv=uWU8s!}bjtkGL(jD#NZ*ED6$iS5DTtD|wum z<5|MB*0lKCldt}zJz9HZ*RbnL?vK}ow*uNf`CW6hZg;gi)Q+Az@Zk>ivs=cRRO2S? zizmUKuibmttMF67@@bzTBhz!;bDd8gEB?7^#V^&bz-85b{?JX_(|1Qso?8;Rbo5F& zy7sBs(|zaYpVOX;vL`-NQ^+VFsb=l@R4Wvlm@9rLya|D7fEEBi31GY1emLfumvxLA^{{@FTefBI^O_j0yzA%1pPP7)KsO75uy&6cs6gR)31qJA`qHX>V35I5R*r&E|UdI7+dFhOeap z0|%A#FOc}ucX}ZZK4m8S)O!$x36;P|1fs?wb&uP?M0qWLgcMR%IlgI3gKDm-EqurTOluAJ>JwwG0+~dy+ctPYFr5 z8J>8_E7i+ce5u!>A|vODZM)mLhQ$jOjh|oKbQ#X%*mF-v=R6AY>Q%^ZbxU}7*;GzN zC-6A5RP@xlcWyUpXtZJRh@>RwXc4tl|BW|%$}BeI{KgF#?PIbJ=>zInT*+My~vjcPnc5ijuH*&vk>VeChjX zVt&TXd)#ql(+jzv9P`L9&~lf`=NC+TfiWl4HE;x`?Djo6=4E`8YJme~V^(4&?e~Q# z&VDv!V{X3jTM|+e7f&>LC?yDwj{WGpGtf44cJ)be(ut^E0#nf?vznFGKT%!IVX|bp z_QN%Gd`Z-oS_!SP+WRo(sEZbg&wZE_6ktzmyX9vGUvO=*x7%{`TMn^RrqfJKV1&ECq{<_nb@SID9u4?@hK> z3%($q=q);FV~-n3wDy~OciKl}MiBkiavE!D6;&wl1M_85Z^*X2Zak7C%y#TjhFbme zeT4ak?FOZVfm$D`cfVlGzsAF3@%+Vsp6H_5`63Bi-E!NFyQLrP3uxcS>zKq(d4uEe#UVY`RzZ?oImUh8W6ZJEp2tXwwEOk#V-2J2jsjA!5<{%LtvF+gQB6XrjWM1RYX{vE z=Bh9`UE9rov+up%<+Cmn3>yNM@omw0CA#Tm^pVp1!RPIJ>4YnPo}Gcq%>t7e50h`u zNq?mPCDKm!$7vM@gb^iYV_ynQIV_0Nu2;p=JMs_1MBHnh8M76Q^0 z8c;gq4~%gWy{}&ipE%BlxCDD+;~$`1im#K;=m&Xs3a?~tk_(>$JAlij0;dX(Jz$4U z;Vxm|umRro)BYrZ;d9OMKuUX=*|q(r!PAO_O#;7-At~ z)FKJKQ|%dQnrS(61f|wP_e4=oex(O*YUAR?Rdx@d zz|rEHFLJoL1GBL;LW!w38aJ7`@lDVvYfDz@Sm74KB}B3YmD`ch5r z^Atm-SJJ6eo)&qGL0Hmtajs<2sp+25sYV3UH8iBu887t)g@=UCR=ac2(5ZuB9&*Nh zDDRX7FUhKN#h#r}?+r~Azq$-{a}~IK-#NcS)f!gw97O%FnEvfutH#)6)z-HO&7S?0h-e~t$f zHB49qS)Cc%eh|JtcoS_s&SYR@#_O;{MO_25!1HUj6RWz^qDyl6(-K1=gLcDWG|%&& z3-Jq2Or^`7e$^|>5nSA3bmRW+#NDcC)IO1gIilI%_b{VNRAy`I(C@GA-14(`C4?Du zw$AZ(H}>ZmTOmK!78lni1U!jErQz?M+BU5Jy618>ZFzuY_qt1O<`Mb2{v#n&?MGN~ zmF*>{n8W*BZVn2TUMQhIF|-QR4hJ_RJAm6Dx#dit)+Yk1chl$t7qAKTELZ* zl?hg7%SdAH#Ik-AjdUds8`rV_Ib2>-LDK2`08=5Psw<_eTEeHpm||~+!o+={?V%`A zCrUzK`qf%6{i@gqZFhhX?J+x=LW|E=+g@(O^pxaJf;_}qu*3RzbSN{iRYD8HWV~)- z;BdsK677<4j0c~?4$UzT9?w>Nee{(NEOp?F&ri?)6ndad-g3WPP>FqX_Iq5JE*i4)mbJjkYNl7eYKZUNpI*y_Xlb zwATpJ5n5f++=;@)>a$yXxs>9y#%AbeQ7119nR;0vaF(D&7FC5&Jkd8Ns<;_$+Pu6= zfc5dOrl+tvrjjdw(Bc4f4>bb-q3UGo`ndwA+Qpc0mBoW7aOg<^d7|ysqaTdLcvC?| z0_Bb2JCd%s0%ZbT#Vv5SlxuF2l9s`-rl$r}uvmb!(*1B&^mO4gQbJX)cO|>2ozM5H zk3?jb#?EPUc3By_qYUi=8dvJb>NU3;j;f5g6HPMMA;)VBlS5G zTEo^%bmS{yWml%yUBX^F8oK)Q9C(#52}=G^X9K|K9=`s@Ku7FSGg7*rk<{Kft&3nT z$~`(=P7;(KjFEV~NbP*;70W5byBGNXOlWshTnHt-=E~M>GQfRkm~w^Hoh~0 z?JcY+k&SW-_nmmDP(IC*b%tqxGb#w7# z;Upwap6^J6K?~#pCAc6LNI>KQ2_P3>qSS@TD|QxhQsjmFJp2_hQiSWDE3alAS`0R? zNL`b$c(NG$B`wnsTrOy85rTqBLep+>H&~3OCr)3bUJ{wQCC2eN+VAy{M7 z&+UB0>PU0&JN7K!bWg#6CsxB4h$RE%-Ffvdhh;2NPP3vPBYWH0G>w>zfK>Saq>9NP zu#vd}uu&p*>33Q>;}1Zp+=z0Ye_d|qd(x9=GKl>F=*Fu2S#?|J2RW}B9JkHtN7~x$ zcH8K)-#Q}_3e?>f6ZxDDgIN?V*aRR6l=T`a1+Q#mNUbK6^e(l?tOwixn$BT{um5rb zXj+Fr(>j2rwg63k8RJg70W`f5DH|{RgZrz)K77C1jdC7@w~1g?#;o$MC~_YFYblU; z&n~45$SZKiqg!RFz|(7zlmRHU$F%q`2m?@RuMvv)4mvCYVu{DbS4C%#ctQ(^CH|58!+c~~I9vwkR4@u5h^LoQU2TW{$_CCr z{~9_Isr*hz#a&Vu(mJnU&z4)ahpt(;noSAIgqZGe8A!w$^dr`QH_nsy=6ZP&T?ZKB zDKN$dSzrtagfS$5F@gcNQ*xl$^!qp@`Al&x)T?BO(L6zl@$bjRfz|4ODv~-j6i2QZ zur z^{%+SG}AF}k1Uw`IhcDGF}E~gZfP)gB-jXQjxY8qw}t3*PjYGQ3K-P! zi9b=vwfb2Wm;cfTr9#ZyQPOD`Pd%ak1gvdXGOu`CN@BGgZo|9I=cmhBK0UE&J%TlN zR7PF$W~=5FX22G9uUm5eHgPG*+4&%>1GN;!~2Y0S!(h?dW@cd5Be8yNyja2n3c5^|!8IF8d3M3y*JB3rBGi4kt z)^)yXL4qxH{7Fx|$-o087_SaTezLkERO#Q?v|gM7=vYb!s+t5@T_Zkv!FNzgN3L_40Fe)v+#8Pcy(C zwt+poAOqxh2=*}X5bWWySmn4oAV&i!hh%Mdwet%lRUi5`jGyjc{^hX4Zufcj^$&{x z%s4~%{>O0u|5oIhS(Tyk+TdW>hpCYGA#TGwEgPOjHMsJ>d4qMPGd?}c#LrXDo%QV9 z#|48?_mLg<#e^)cKkylkrs5IdR?#WBwj+uEDW^Ci1Bf9I5^8#3cV(AMv&#pk-Q94i z%6tcJ?6OJL))!Xa?#O^iV8P6DLTU>i2!p0XYbq5`K-w0I@sYriUqSK$q=Dh})fw&V zr7oJVVy8G81x+)@Gps!cOS+Sn3}blPL8!vzjp%1jfCv?4q7(kpe|E+hLyzZ~CJ^JU z8AuKmfG$kh=K9!6l$Gd*&0-k^!|rd9b-j@G>e8+zb)$?_6uWR&0Mk_frqf&jOqU{H zx)i{)E`aH2klMRmznl|s_b{Rm=n_Ch-wkx7tVW110ppBH<(jB}F%pcX4K#_xxB|`1 zwCiv+-P%R3_%ShwG<858vqVPBDP&kq89W#aJeUF|U_&Pa8#)0tTz{#{$gkKb&r0!K zCOyy63ls5dG$>**>9VYnFvnpn8v0l~m=!E0)6dMy3yj)n(7Nl#lY$3h;s+0A>VII% z@s5Rl;)-%{Sn9_IB7>**x1#qE2YA*uO)V#5Z?!#jUC{?7`ldvShGkT4o0kuv&xGu! z4s@DP1Z8%J3UuKCveh> zlYU)<_Rgj?HM_>TrvnK<*5AM#S>cQU1%*lck|`1kL;R9j`4LT^P_fMkmL!uj z*pne(d(?EfYr^}E7LJ*DxohS{M6`*YlUg*fc5ci^TYmTc;CHtD7IDT-&^XQRUf<@W z+ZR1{V!du0W0XDrNpiDob&V{SWo#b6k>5a73&I09vIxPEMSvq!K~-xKa3oK}j~{Qb z3wupDS+$Q(!3 zHnw`+?9-=?oR42CHc;$*WKIYptr>7Bj$c`$$f_t#RwNJS=-pAwv? zKPqA9%bg$0izKL0i$_{SK?+S2L@S+=*}MZinvIpW8*u9^GV>- z&*&o-gi}apY1~ILkrDycN5Z6R(MLkc_wRx_hV6fU+aekiXkjvVwL3}Poi7|E;ydSP zYxk;y_F9~c6Ux8}OGQ*5S5H)1W9G(6Er7^&unJ!%PAb3`ahOw{c6G3F+H|z?_tZa# zMLsf3l-`Z?fu7Vc@eK)|=dvoPx-d4KRSa^0?4@d73*6uvV2+?yRDS`b1F)MAwWKC_ zBJD8?YEa}!lBhi&TD2Bds?TiHJ^1{g)C@*!L9wKKt<<3_CT<-$7zDxmd zy#a#j4FK0S1sc_|Mp*SH(b-Q7c+ZCjf7(vf!&|?6z$wO2@SIE1)TvAxFa^G;wdr_0 zH%JZuTR~d8Wi+Z^? zAsiK4!NyiU@iB$wYGM_O&7!3F%E`v2IeN`Mk<;VvVr?dOk(DB8k9$}0j^4%6owu-e zgAPfl`n%3DkAWlxj$H-PFM=4x``+>F-@?eCYlGC)MZAFb4q*oGis3&Cd_cV~nGJ|& zUm&7a5h8j6A)=G8OD|{(j4jztJN#emYuw-YKlvySnBA{#Mx6Vq@q(!uUoZTXo?hyR zz8Pcng05aH&VVf&aZH#(|%8df3RqKITb$>OeRl{(d zSYv3Pl$eKE>FR9;wcbRj=qj)+ zPjX5Tr=^zY!2CaKGqOO-A7BYats1#Tf#wVf`RoK9&UGXcd2!9kR&5z zxY{r0k@97|sblcttHdAhu)$@^l3#|oke^z!=}O)@aZ`ciUxVah1uME2O2n3PahcUu z(y`BDy)>M|0j1?23SGW{(zX$lwhbt445h>R%osGUgVZeO1grts7aRW!?M7UZV#W~3 z*Iz^|OPWGBXdE1Ch=?s0i0a=T0K9k?^!)d;+dxbK_IXo?Frqm%(|vfS4g7hYVXbgd4=!8?#D--1-RCkcpy z!6YCK*eG@P6%@N}I4NipnnOY^pj>T%*`U5boXZ9xstx~LI9n~-zePtd+6ZkEVpV1W zHlZV^iP4|&Nl~O{K9@E-wBYw_$UhBJ70u+NvmSae0o7@6NboU-^s-Lz(7`If7P@AzZNu2Gx5KKQPXo+02uA>oZ7G@C=oVT z28nwQK|ZZ!MB)1|)SB-u#c??s9Q-Cuk-|`kLDQ2>Ghh#UWr6QPUenK6CKQ6C6f|f? zzjNmwi4D3{mrE$baj7WamFCgL1uIVe7><4Kt8TQJ>3hs4kB4uB&i?ob-7jmTp9;B@qvqGH#uL26T7R$aWoiPX@TXhf_-hQy1Uujkc7Rv6L#iT^;lsGa6VQ%pgRara^rP_DtArw`)L+u)qWIlufD# zb#t{H3s!k8t)?OYQhwiI=V0q;KLYyJ)7>R+kDkMgyW&f)M4E`^QEPi*cgagilAo@o z2V)EAJ+6l$t^8)5#f>B?!{k(buO4ND2i1g_h3s%#Ko9mPJw-VI%3o41&Pni$*;`+z z0vnnE8&V@|n1Zlj3a}w3rS2DCLn?5>EL5$Mks=hB{ZivAF%>5W6mU+9&dI|GbLT|V zGdPh_(!z&2A@qkz`G1=VF@IpE@a2NDT96=M9Xs)8pzDmaw7nfIk6n^vyt8)mZB@32 z;5VmV$hs5y7Qpdf>EvL2ki43drRIPcSePAGUU7$8h>VNG<`o#WhM8A;>ZU_quNES88Cp zmQzA8&W}q~CXld;g^qGul(Rx$;lDyv%ykx;7Qo4C8h~mgYp~Y_xfgOiX z>JBR@b~$lT&stV%jDW^RxtzX<_>1JLw zs8B2Mrq1GmZNvh|j9!GyFa$E=2q80$fy`I|GQ$(d48zTU_1lD%7~h?zY?KTw_=ds# zfJxEW5d1a#A0`E(c1Vs=UaYvkMv{BoDzgF~>^vf+E)`NM5n(|5w^eSq2Y8Ftq zCR_IA3YQb<#&hp!As(!(n2lQCX{;5lP-yr({(qSIY1kij8lL z&LfdW2beTfTq&oZfbQR_8W@Enqy|v&fNh!_Dhi`+!X$t7h~f{UT5fA8L&lrHTpD}w z$g0P#QgVcmh(q7jEN1!h3v-QJK;nw=z(sO_i{Kzg92bx{l{~6;1R(KT;3A~=h^eJP zK@aqwNZcx5OSs^0YNk=bORR|VyKvjLH2xW)}|EeGJ*qhWw+NJ`+KKNY()n6ALMkn>b*TnY;X zh!l+!Y<%Nzb_smoZlKRc5vPFgKkf!bAzI1aJy1nb{xEjOmov|d4HtS_qmP~H8d8+*X4ra z-pQ|~5CBH)irKKjxx#>$PLU+-ckN0#T$@^FRjY2<874Ztcg^}sk3_c+Tlgsqzoy-V ziQrLO`bX~GzmrIGp3Vq9gwPupk@KP`f=u%h$TXiRf=ts0k!c!%OtU@Eh=-ly8O9Je zE@l!!SmptqKafTiq3s~Oc%bo#v3;_g=AU927~L#*bXtiDb_DI89WnCLXC((EQo_fa zGhsI&sRQddX!UeItO>5o)xrp%mDcA){AX~`7bF5e@Jx)cCA$KEU=EfOs~E+TlAj?~ zx@Q{!>&-DM?f+-_{4ekTQO!%>D;Aw{@d$|Xe-{4DCUKOR%eoggYW-{!Qv6he>yBm$i!_jwI1C@WlkM7F^itx zOjI1ZXk~ae8Cbc-vfW|7eQR<5^Sk`SV&)Q-!vor*?$7D%8eB&UlaY7$-y|y3%>;M` zUOGqbaq{x&=#cDgvwY+r@XY^5>payrW1@xxAvX6b*xWCO%{4=8t{K?eez3WmDcneA zCNBt6E>?)5vhS=O{ExOY?SIe3=G*U)MA z?wXwME1uaS&K1A)82DHTehMFr`<3hx*7LRgSt+`djxc~^wemzM^uv^hmcIW|aFu5a zqrgbI5bi!SuZJ4WDwRaJ6ARRU!q5C|_1%BZkOt@V^aPusHkK$owKaTBxCX1Q%SoE< z`kd-gL1L|;FF|teEo?k9*69ml#@jbvPV9aoxtu8EH=TSnt`I~k0uq5$uKXj)HjoHV zi^OrUiQtvuze^0p%fkEKESj&-64F>`h@XWPekJMiFg*H01(gU+R;Wru^gnGh<|1mF zcn}wnu_xymmZ~U81e0hxk6t5~ zM{&xv8C@(RTUiyt$DA(4&N(bqaBTL%o~!T}R5^1oWt87>?JSM{)h$c1HXTjcc^<}~ zy+u%fr`;Oi;U$>$$D1r}|DA|gKvNWHwebNKzfRXeP|G=~YXS=%&ksvN^0l|Y>w?uB zZiNS&YSk>t-39aYzgGDMC8MVzzWo2lBrEnXCj@-w*^X)N3jS}o=rYC1YU2Rt{ZpY z;n@YwH}=|jHi^FUp7!AuUdy&8suGw&50gt&{Zb|48YWjx4o=9U_*glnTC6m>5fz93 zW0M>n(6im8sF=~9FcgX=Mp=N(C20cWV<;nNlCw66efSd`D2OXkZWiFyRG!>|u9kO~ z%Ej;6WC>AR7hi7f>Q$#MF6J|bz`5xb!tS^Ws4K=nZ7pW&Qe%<+SICzt1=lZfi4%z0 zNBT6+rt$wR!;X`au-IEBH+|8YBY_uqUcCsZ1dJ|d3X>DgbOO~j-MI<=%`PYL5^6SJJ)ke?8Fo5xxRotrS}_!=B_$NL zNa_NK$*U0Im&=BcRT{2;WDO-kuQc6g!%7ruL)Xl;Ys4~wL7m$PonL~69_Z+FaquN_I{JU<42(h&(gUdY zfsS4uio-*3&3IYpjS2K@p=#J&b&(4bZf>;$Zx}JQ=x2FeEn+5>R0+g^L=h+rN`nIl z3?@Wvoe7i%HN`7mBqRq*fdh$D7-CZ71Z;dwbS4Q&pr8>yK_r$h{T~GlMj-?VeNvj> z*;P|yXfbyLLglZvualT#-VlD(wc?fmZ$rHk(z%~_n|Yy<$%EW-rf&Rj6d%TQq{!&= zpdzDm_rd7;(Bsi3%%79;f3{PfZrNwNJ;zImi6y`8 zQ_gayoP-U^lB#Z}mqTnxXTH=z=UA=}@9!$c)12(=7dDd#h^jhV^z zR5KX6C8}4Hy9=4-9JVAI3v*ndZ~!R7&`HdgBcWofMZ8USr*U(8x0N;j8i`&dJyw? zqT+hI_`iU9dz}`AI?w9oheI1y_kDzaUuiOWAP!8+gWvMxKMiQ8xiN6xC^Y=1=2Yyg z(&zW@Vd=_ij>4JlBFj{t>ussiKIWGvh)ER{VCOA8uG z219(d;B6`J6hu7{t5U)Z|DKdquWMS+KwPDrer!vT^1CiY@I~zg6WzBpq$zJkj!AH?LZ=s=5q*Xo(QCQ9YUJd0cmavr1@JQ%@YYaR>FWVXQ5;O^|avk2w~0wT748g zD0pS(fyIEXAEjFJ6>z&PNYNv^i0XzHW#Te42nsYmX zD-e{~4!GhWq6G8^lz<+A63}BnneCvjoH&*q{ z5<-yN!$kx7%8e}68V>f5OXyj=C;H%IbHtYm3lVo1$^9%5vZPK#QFp4|H)a^xmy_2N z_11@bivbzb`6K_luDSfrdyRjVD4J2?;Fmhl6>Db2+WY@js$S>+>S+@K{qIjb!8-dv z8B@#p`JHpd54Z#M58si;!2rH#i*0 z)4xSY%J5iGMgxlEImcJ--N%<2oe3e^8A!#HnMIm_^7j@f76LDaX9F(>{gWn52rm}^ zUhV?CoUGty0kwkvQs#O+@Dv#$TDm4!9WaP8kve4?>rJ;y)ar|dl9|`H-XS`C%r!S!pF;8R zm^t|)Bhe{2oioPBFiZd25j8D1GE_OE1A+nDHi=x!Z$64E4F=?TvCHkgvL)y22R3jh z8W_e8Y~ZmeFw6<{y8fyRs`f3;M5W&l3PuPwICr|j@n4lWHVyRyiQ$#n9fRMb-z(Db z_n>n!PYu(mC4<)b9c-Dcens|!^WM7KYzTKTlffBvRJy>H3~9Yw`=!pxTiPv zfdqLBW|=$==z)^VTWsYvXyO;)ka+4!6JpUM$NRE*R+5fb&b-i?RO&!PqePA*H8{{F zXhZf@oTaP@hmUM^e#@>ZZp|i3*iU)IdC7FTMF!z6j{BpC%aU4kGF)3Q=OSuJ zwG42MDA0zIhp%qOz<5vL?cTf~ZMXOAPTRw!t+W`wtjPVtTzR!lRGDrazFeARiFz@< z(iby2d^i>3;mxncFV5au@|nma!w=bo*ZBs~*fZ~wN+n)DesB2lZuYqgN3^L(fOQ(< zDeSF+e=PWMY4*MMRdW0UQOu8R5;`~=d;=pp>K%0=8j)K+ZI5$4H?1HtEq%wb+)h_X z>uC9*j=N8OIB}tHyKddCyULv9gH8=C#K1y<)xcN*n)hp*<(V_ToBK&b#ayg{vBE5; z+*|8t7F)Epor%4P#sV_LdsPbrg9d3$3$@9kY6m-qw`9^ET5Uu;Z9-Vs`np!)!gSmY z=-2viO;6(6xeAhPj(JV}1_LX&+}s&{H}LMInC1ryA85GjIYL&ADiZ5TjHA<7yU3Hu z+cVV}`^(M~4_CKHyie`r{l~c&r!Grl)RVC`6~=w$CooPseAu%%-X&W&a->sdhI*Jt ztcCRmML6ly|McPfY(J_Hm7${&r^btBc-itb%}6Q{1M2pD*tT_{@IExtkW!WX{I()@kv&h>)9Kv+I=AXJkHU4w~{ zLk8Ev59_^}6l)MWmp4fqA8jCXQN9fiyt`oM5Be?i;)L$#h$p z>PB$|O@6~5WxisIusU*@EFRJV0;I(jeOss;K{8vsnb!!ziSu}P3_~3YB5h>z5Fjx)Edqt-i z-`w;iFCO+*&_9taq{fzWXBhcib*xsgk4TGFac1+ta$r2Hp>N0`I-}>o4#z3qf@xvi z8#tZd_nL$GWUHuz7hH`hKT}|fpMwH_t_o9*zz;_@JU{PbH%S+dEKCIDkvi#o zTrL(Q8KzrnF8u2gmz3tXHM%AziZLOyS<_gz4u3xE^+&G|(zNUIJo@h>#p(TwGG;42 zEN(7=SvTl?)U$*vAwE{SYHNZO`)V)!1+%G<;y>7CaJrH+znl3hgpovnk**O&8bugM z1sEv{7%8hqzGp0VQY};-b=dwh8=HUM4x2i9;G-NlDot;X&#Eu+QKxVQMlrC_19^#Z zI%qap71ckDVO`r|qCN{!M&0;1iXn|YKV|8XoDt9Q-9Pi4uvtsv&dwm*F5hT`# z|0w8n9DdQotavsy!xQT#FP>iDBiDBED@7=BexD1Zqq}6AKWn%BU~6xiarttr0Nq6g zEnwj3j<+(69>-IrnnpL&Gp00=XO^u$6~Caz@n5@mY~p|7-+XHGGf~JbTYnErL9i*9 zV$p*FiKHp>4u!#LUiM2Y@P~MSMLA}`AHLB*45Z~)4aDT2c^UwVa&IMJcdIt>>*}hw z@rtpr^QIW`{;}D4IcDs$c(nTtnDSI1vUtv+$=+{r@`kcs!+LDXY2~Eo9vhn6b!`M{ zPh;M+u58v&{AlsGFkMDI42|<~$9^(gZ%KQ5tS`^Q));ychtk)RVYHvU6T%aa;S-ws zrZ(>PKHn--leuMfZV{SQc*={r2Hn@N&78NBT(J`VptB17&=go$=fbZ-l%SdEl`mGX zTT||QOprOReuOWi6jQikijnDG_#3)n#Xg%gXcS#r7wW>xGv4@a9d3e*l*wx0y#E`X zCU-b!bWvL)S$GjyIu7qN_k5sv3k!%dng}cDN#22<(de2v8K|>dJvyeV(4J)MC^~R$ zFqn|G7T6GxnqhROj#9R1~^% zv5halBk&B_dmKtOf+Hk#^gX9z;;~dAXMn#l5!kftvwe@dioN^4TOSKEPM7SBCnqy8 z+;I-X-$jXCZ^CS1Ao~pPSDh?Al2I{`E3CB4l23MsfF+3A<) zi2>`N2J0XcaIz|mvyVxrQvR8;rno_mrR;xBZKfhveN#2^J3=VjwRpIphgelVqy; zw?D#l{`lt?*IWpZAUHbhW`pwizBv5_;;fpZUa6)_-XurV zQ^Qm`na%o7o3gAy)GPfoWKiK2U=TE!7c$5J!u;cyTi|X^Rfe27D&7;Hv@vxVYHpETlj`$Ha+xTLkuLTH>-hV5GR0T6oF+( zmw{zSZxjqh4&*aOzA4q@E}rC&enyVYY3+ycUV20QIf1m&c+q?p#<$KQ_F@ie_SrZ! z5J}+f8P86biDrsSM^VI_K69isY0}|mn~&~nos64K>o5vW9A!bKCY+HY>hW)htJF29fGgkvSBTdIt`Og^l*AaLpu?cXMEnrB*`#%U{;i#Tn~h6lE#Wo$ zkE>LyMtqS#EW9IQ2b&*pX)_d@za_4)MTDAOtuxb50M`J2B!Npb6%tS&(B)!fSB=;6 zYQ8a3sW;Ac-jly+cR|tX8{C%{ZQ9?jf6HY*)XZ>nv(U_Ec_mJB7CH1VI>A^mCnZ1* z_>jB53q5}C_pV}+UZDlFf_eO2K>l&5uQRx1y*UO&bCsP-CnsUP;pNH)(xk4_<8C~z zP7~%k>*EAF@$yXqN%64)034xl3OUL}Tym~J3{9fBif2e?bkuX_DGR1cWT;w7OzB;* zZnQ2;ecv3*GfP+6-aWr1I@9^RcXK{9)iZ^4f92~TI{)|lZgq8$ElD)}a?*tlV$shh z*xI_7dOx^Cabk7cmDXXKyl7`<_o06>y8t=!kB5DM>vEoQ%0#V1#>Hg(%XGv3^@%F= z3~?@*i~$w$gC|ysvKel==TpRc^pZQ^p-NC6yQ+VjDfn-mXmR{^7^Ukb(K`+LByq6# z*qur8w?%k6fdXFy0y;7$twNl^oo$i8WxQ_TPWka@+P&6dlU zck&r|MDv5=x$JwMck)9zcl!rqNEML=19F0IN<;sY_;A02kbFHd`$7Zc=9fSK@iYM9 zDUAWdQ&R$n7Y7h84$X@jV|ms_Mu`hnLrt0FANbNZmIkcmD>ls&v}b5wHL~x)rxdVh zY#Gol32+CVqSJh*iRU*El=VpXQoZa&5u!JDq9a1KYO#JVG}9_|=&14eyt7J= zK~i>rt2JHg&?gZ{jL0N1|k65kra1HNQH1l`(u`20_zv+5LHye zudK!k7Xy`RqFeO{57JCgL?I3h>?r|aBJKm7KNlByOvXr=d7e6D<(htN#z6_F{ci9q zV8MkLxzPm)IU*tadAtDK*XJ~qlurR91&gsFA%E_m;V2SrX@AL%`t-$907=GUm|Ng( zR`n@4<8uH>?C&`koSPB@(Yho%wRsPA4{lhPx^wGgAa=5DA9$;eZ zC)`h-B70M1lZ}A8%A6-cYN!mS4A^71s+%rlFS9*kD(+YHmhTRTIJ-U9@jUt0*P_1% zWue&6WbtcTudj(n(NnlnV_t(#N58mkfODQW!qHFUXuBGXwj8|fM_Ha#d*EJx49YlK z;j^$2+rvGi`U~(~fIpOvXCGgDYW+6Y>2@0^ESUb-yWNnwO6Kyrzi^6}@96BUCp%p9 znT1$*AlCI=8Cg}Uj!MAFqS4vd&ruZPX#3!VU+tk?qz?cgG~l&J_|`s`_#+h5v2(K< zYkiF#`LfufLE0qMG+$Z~s67*)_ONS!+QW%UW2L4`Dt}p^IUWX2L`I7XO9r$Y3d?^< z7n(xD0cg4V35S@X#1Qa26X1E^jzoUQASjtLz?zoB{O>fUiJ@iO!+ko52wB0TRyljV zq2P_Zb?5b-=fWWg7WtKr3s9!JGK?~it0tmK$OW4P|B^&?E7!guKS!ID`*t=@SOXT- zs|*(91{PI`SX32Qlqr2uxly4yBdW3bCy->pIApV~g^xC**bS~D;>EMZEMspbGYz-# zZURMIeNRsP&xj~;MtgU-lJi=U)hW6iZJny7t_hooyrvka>8H_WHcJ9GRav z4BS1tc{M|y^({e6g)$ZV+LYf(CCS3)JQcz6o13T8rZFN@)}E{Lud^nXYvB_h$b3PN z?Z!3Z$Yg;aQ_5O!NfBvu2@=VVB|pG{MlKn6z zyO3Sk?p%*v_FR=`hqSJy{zT{a6qCf{{rt39eyaxhHYgB_)AxHRF8F*{`&F&*~QcS7sfF+Mb@u zuY^6TG}fv@76ZFcDcY$_L#w0ibk~fCirI<8&df^7@C!|fx3hQ`fx=&e13LcdBYVGc z>oJ*03!XpCem~mtwD`+~{?PKg@#v2)Ar?rIJw@My`RyhhA670TM%)%+yDm^izM4+^ z+flT3rwfIR-uaC}atEVN={bgoCs>J({mMR52$R~e_cK)`bKuEEk#BIp1!|u_7>J< z_Z9!rnxg?cv5`ckP3yc}8>I?ZiNQBvpvG$Gff^GAYHSZ7%=dsWpNmt_nblx|UjSj= z8U@P)2(SmsucY5g$rA<$03O{~#dH)PfHyz@a7SW2O5KwQ5FlR|AONQK_-%gxycDuy zdD?2gCL;WI`Tp+kyYtd5i~fprp8(tH_DYG1&P1Zdq5d8EY*$uytI+T_J_nY zqS%syGM$(5cYZY;)I9V+v1Kt8DAj3%V4enoxfBTIQc&~Q+i9Xtcq$vfW)+%_sCvXH zh$(;Nl5+x8kA5^K|McK=KojeLCcqtUe0m=`zd6;Eywkv4+5Wozg?~QTrFO7D&wJ&f zIMEY{jOLDCyWJ{+l{a@!4Y^REhJe0m$Uz}a7!=}!p=QsCeD06yZ0z}+@d%&G^bfMN1q-nvoqTF} z@|EcSt%SV9>VJF!Dj{zTaZmOfFxMY?evu?!oIpP@Lp~R#KJ>cdZc1a@5Q4~23*1*+ z(x%-g@Qbd;HM%_^-P+2lOiwrrPB@mtGTBhjhrVe$-d(XfDtI78wEuNS2SeLk)kUo= z@goM&_Gu-ZZ|Yh>fy#l#rAOwG>!O}v#ShGo)@YRp_c@&r30n9k|1)h-_sa%~hv0Xw zMY*_+lmE`lsaU?f$SM@gkdHeozpSgc4TzjJyM^pq8GO-s%y7SI{$OLA;6Z}C!0W~F zm&kGtHqbB|1 zN8$P^ZM2WVx<{B1DQuv79%p??t@7xMGwXq%qug!W#aWdy*5!$>`=;I%YSy&!83hW| zyMr|C3_3G-`1@1V*`MF@g!Kp_2b_8KiQb)Bxg9~8o`5t@0h1pACT|5y{*Bv{>&Mlb z_BaKcBgu9y*r&paS*qV*pXeWD()}iWdhtX_Fr6CQTS|a$dCIqISg1M_C~nT<9JQpJ zNl&oNnWefKs&ilY2zfmp$~-{+wxo)II>D(cBD%z>i)FU)S>;+zB~ffL@`*KyE=6_+ zWc`V%pgmf4>RY}C3{v(p$f`i_Js9u}r#M~rlMMHqp77uaaQbDA3^o=yLB2_BaXeS7 z(ZzFUB9pvZsQ$`(B8&NxEzY>$A@q8DbJ=NWiE6WP&&H8oZqPLI;{W06tK*`IwzdI5 zx&)N&R7yZVU>Le#D3vY=K@_E7C_zF{LAr+y3y^LJMY?6^?yjMkZ_mB=jqm;L`~BrP zM}O|M*Ix0gXRUMQrfQEtnsGmjO-QoVzX{|uA%oA#MC)JP*uh$J!tX0y%sTXxtLa_* zWL+VQ6i>|gm0Xz7$-Xi^T~1Y1)h^S_lq<4sK}jy4^U;ggdbqi3y+A^8dcYw@IWowp zB+^pA=(ncaqc6+d-Zv0K+fCvKpxzY&pk6FMr04`;Xt8-fi?#6qBD&ac==Db8P0MxN zAVa~Xuc}$c)t8hxIT4ZEbTp%xkCc=tX_O5|l$1j#Gjno0B~=ZnsbBCapHy9qCRUt3 zw$~)X;dF+aH(l?iJjcKE=E!3fcygiK3wDaX7juXT~@uy zoY-o^w>68t;7&IVY!f$_UDZeCC~jNg@`r{hGHedC>Kk1+U`?X^V$`Q!nkKded{MIN zYE;PiRa{m@@ps1SS^;@AhvLjInLCvt{TmjeGwO6k!Mx_~^+D=EhlX|`2%=?rJ1XhO zXBY~R4-^3gpa?K1&Kn*PAQfL>PX+a5)CX5So7{*G+;j}1%%<%slnlzwBkd{xhuGwT zLv*I*eo>@O9x07CUQb^J8VX~n8Np4qZP~`u(qd;et&NV`AId~%H&VX3m$Pm^3%_Wg z)x@oQ`V}@Xm!QpFWFin~C(6o;ZS?|MA5#Ybx6siAbx<&-4hqK9LBK0;LAV26F{j5G zj460|lY+BYpT*(=aVV&9@#IP6fiMJ4;cnpW1+P3gO)!9P$Gdid+-}>fYmavSqwX$* zdVK!@FIV#tW~Slol8CqnD1aDvvhq6=Ugp)~4Ftr%`DgFOLb=Okf-K?f0u2{cOt49QNymcv7K0GzjouvF%S!yS9#jGt$N4_>+ zE4lP|taq!NH=xBbKCsN%b2DqPymSxP-8ngjPWwNQ=C$KEcXoh}wbQMRD_eS=U^c>c z!sja%Ur)(HZvs$`R+n~CO1$QiWW&4b+#Z@C+Npf>fCv?!@5+w|W2aBG6$4Z#C8@F) z^`I^lDIh~5!vNG7)U~R}riJL|WQ&9-h#7Lb3493C@df`ath+0;)<)DJi5+lAqY~j&gYdBvC?g!&Bd;zp@O2Bs>9u2rGd%FjLrDC))6T?PBH z8FsUN>*c6dwW-8^ui6&q&7?`Q(UR*@U#I zSF!xD?z}gUmckUlJ??K@5eJLv&;b%{9laFz?&+=D(`nQ3s6Q_JS318_f9UtSO7nTX&M!y#VK{T+wM z-GB)O#@&F0X;{OBvEPX(Z9ica>P<^M0_&L~w(k$~_wb1n{+TN?E#$<(&T6msUk1;c zxyIsjgU~-&b{FKGw(wuwh+pbu=LdzZ6>V)c;;0`zeKuj{^f4h- z6DX=J8^F)`0idZc{g-tl`DS%E`TFXr#ik}o;CI<7U-2ffGe*987CW!IU8XEaJ+J## zQCqU2NDm}bMxqbmk8@i-3hmZk0GpA-*i7ed{qY<>iw5r^{IUb@BH)HisM6%%Uu0jK zq@(zZMx5;UjL6ocLp^FSrO6bgG|2#^$rPqEnF6KBYfzf(^eJ;K_RXbuPabQ8$X{q_ z^!|D>)+u znTywulAIp0a>RNAun4_mE%h9(WE?IAi444xweP6<5SGGR-<8lg>SxDH<68Vjc!Te-C`MDc zfot!)M&!7GQZ5{hacwwo?UNdJypz1xK1j9LpL4}20L*_w1o2LOHgeV$LaOGNYw&mI zcJM+VulvbX!QGhd&i1{jI6CSY9-#eKyHcCl9l1Ftr~KYCRGtrK+??=cCM|PMddl<< znL*KZQp51N;Ry(54ISD^KGB*_ykU3OXH4}qX23!#5W&!sxkk=Lu+ScJ1O6`EE}qL- z>H!;LR2gwwR2eVF_Ia3lG<-iVBunU~YaEp0O_|Ae$IH_NR( z>uYN(*$hHb>Ag{ljVXU0!Jq4av)Y@f=f7|s3Y#Kf4!I+_?yoFM!+b6SPblF`0G|eU zB16<9U2pO}|5{_n>QAF!apG<+m2R9q-&cW(XCO8`04`SyVv}Mo@HiE15Svm#Y)aM0 zpBv2bcg>4k(7WXjK`-z}hcq{4g8gM`Ut|K4vzyE{%?0@Mp zJR9Kj{3-nD7uyj2lM|~KS7!cu7Io`?hdTo8ujq=M)i>Sp1WH^pwfRIU8a^IsI=?jW z=-pknsiKe$eIt3;$=L4bLIg`!5a#Lm!{XSjK|b~j3M_o9!$0yR6j=DhD6sI0*TZ(G z#UUD$!Cjhdo`m;T!P~)|0iY^XW~ik`gJ-M zaflksI7BTNhj3#7%~^zg@tSP0?Nrig;JO!gzr-JZuy$><=Dci;kot)uOlS)Kq{aWY zKUjLFyzL>ldobd!8hK&Mj(5^&`yH}VA8_|abboM%EX;D57&zS9g|dgin@;4{hqp~m^( zcUR^$QA@g9uED+1*-rXx2M~*|YG8xg9n%p{o56ziP(YOj0IEDdBR}UVFSg7whB1$NLNc!KGz2lvo3jBWyTRV^E~1=pd+uTCaahJ? zAZb{eW4PK-?GE``d5f6V+zA_Eys|yik9`OKs!v4wN!|y45MoNm77J755uw3Axe;A=-XSwV(2A@3K^*WbdNF3h5bc{qX z14)HU3i1B1*}zL-R@eyeg;0YOY+o zm`e#n0|=^(5i|!R8%oTK6crGG8;HOLM2G@&2{Q?tdH};yaV06lQ`p7k07MsYE9Wim z2VUR`O28GsopTZI35_0TTIC!m@rl;|efPsH!Jp2ynMNVOPeI0rsDsfctdbzn6X|YE z7ob$?E=y#kZY=ja9CKJk;IP^-hn0vqtVD2F{NS+o^JB?0tB_m2M!wy4*5)k!_56VU=p} zo(=BGVBH+Bu9ABF?ueiUXs72a$tvIB0*o#%rk&0U+Ua_rovsIF3*t33_zZ!GXvdoo z=_$mkM*`bBtR>y9vPAKJF!SFoBs@1irI>Fj z8Q=cAM77YOFS+tl>rWDW&A`0>TxjicN!~3lOgVrMRcc@n8~y7orEe$|HxL_|XC3 zz7-#%n-$$(cB2XF;ZVC%%9f!s-k{~zSl!Urlp%mmVYw07BtlIpLE!0|@00Kq!J|ACD{8OX|a?#Nvcb6Hof} zH)4g5mb=;(9T7rERZ?Faj>`P%XKmG8{%f0_Fmz#~xtwUP6qU};x{X-Z0P z?~l(jE`*%Y^ERD9zD2;eb!W>@1;ZN$-`iLtcoyqLgMR&pqv9+paE zknQlLgg>NX(zreD^MH1iw8=JZ9SqWx65m5G^#>{3?+DTnm<>{u-V~j?GN9rZkQKBTjP7jH+?dd(rMRgz7_?zPe4{l;I4ea6 zKjf;G1XVB0N`lnAv2&ZWCRwg>GAJs=j5ya1<>eJx9rRdGrus3fj6(Ry?>QDDq>nAg zXnP=|g@TO6(Eu_Ux6I2rEpM|rGjDy>JDH~R4PlzC-6f6OGJ>IdtPPx@g^)@L=C}Cs zbn^f(5(2;o?#6WIxA|J*2o1YKc|>bHmCnAG&mw%=eB5`JCsCY-_ovKY<0_0Imz}7@U6k{|XX$<5Y`n$2}I?YxTQr-b&1Jh3@-CMO*qR z#5!paa;tv`w$HB^}<1boB`bRK8CwK1l%>ir{+75;#@drfyQ#gog6$b0T6Z` z;w_}U>j)D7fVBnw8x8==3;- z!f{=9#nE8O2zu!l)0<3?YzhBw{a>el^?&*EzE_7pEVc~dqAcx(_lNTk(=#t$4zm8> z$2&XzdLnn6>C#Xx)pwy2gfM zpGeg5qo(~NeylWOnAzTIBi#s#p#x%g21BWJPwBZi0QKrGMfv2y^{isDxSe z94tG4S#}UCn+ujLv@Fxvdx@Uh`81Mp_^KmNX^pEH%z@zk$){k&P0qstb09cxvDkk4 zRBc*S6n?PS^41Y$4s>Mv7Ww5se^PI}+u@ML>0o1Wf90{ZP?EsrqKPGcn`r<7eSLx! z6u$qa`m#>C>v@1koYPq_ETy}$H3+wcPQ7;tj&b`;L5J=J!cK`@yCc8B-J2 z5!j0@-oi8cUlatNvuA=~3Yo3t@jp+_*D@c!<)JFtwe)t0*Zqs{^L1UI61u0uvHM+g zR^%<(k>%5`RnxAH*-M*6&?JG^mvMgXI0;sTP$nrt3KL6#dybZ5Z!)Vp;M>JyGr-xdV}X@PF0fNpRT4+Kij#N$Wr+aID?^{#N*&MeGc)8E^8LkdyZ( z!7Z5$psD>9MKSUG*)tc|ex_EI$tFY=`vu{4BTHZ>bNQfiW{L}vfyQgAVlf?G_I1(? z*=x1V?f_?zsuE(qSPEILJ-|4G0LB5|50laTKt?~UaesK4_mNDt+PxX83HZv~qJ9wh zoaQY*;46FBepm=>OE3+43TOauM~XMwgd+>$&uu@E@aG0WyN9-ZCrX6lZ4i?!+Er^< z&$3lCbg0z9wH)K0=Mb(fu;5e7f*6W}6hm>Kz=Ei}j~@ZWfvgXG?6xvy0Vecuz_dy% z5^NUu=?xSK3T(C%Y!=)-=S7iGZ*}5+u0+N?G?Okpaf-F`3K>)^gwh2H+C;;`!XfvQ zLLh~YOXG+0Y%TAgI2Yj>NH9Cl!3^Ry3NuE70-7;5>ZI>e7AnRSPpsea*5g05sZojj>!Vb;$OAS}yI@J6`}rkL4P} z^mmQ2G4`VgNolJL@eSNbS=u1a=s)` zhXJtTx3XX?$zRS=anLI#3s#`_O&QTMZ}LVKnpVd&Br{J~!8pIKI#IyS-G5&9mdA0* z;1-6p+5?#IErzvv3s@_{Xw4*I*amGQ-i34AHVE+I9;Qy;8||g9jge$knm;{TzFq0O zd=c0lv~4Ag+&O(@?dJOxO?Ocz z!&^IJaKH*=#0TRLGMM3188Dpc6Qh{~*WFlS2ICO?4b+QQ#^Iw|;I+Lsw?21$?I=YXO@zC2I7g|=xk52e zyiB!c>)?-@&a!zH1|>i*p3Gl8yBIr+it=hUyM8ruQS?DqVr6&YU*kwsk$xNg-d7%y zTmF8j7Eu37hrfvFm$Dc8GkbG&&_60yb4-7pn1c=>ZpCzj!cX6c?@Dr@Lx}xiT^~nq zqX^gRvG0lnJTwU905FZPGR|k1z`us+Lix8u(nEq+trQ81Y^^P|vgCf^VBayg@TAy# zR08eh4zb{sgVUQ~3$i8>4}7B`7{G)+iajMv=)(mRhoBq?eYhB9;R0n50%Z{cW#PDM z5<8A(JTD=P3A_!mR2+2{YD6IjB(7(;Mrz$J@h{8?C~%yMuo5b^P~Qu#PSHPGJ6s}4 zdcOSkk*iJOId4+rTyJwNulxPR=bbl&VY%V*ZvtgB_fC0;+)e>_ICapkDTxYxv=eWEt< z5+A+?Gq?6g(C&c61$e^iYn4O({O~XuE1$VB3db~qXZ`c}q#HG@DJH3sK+r#af~F ztw^OyI3Zd*S%#9BSYBS1m>KJrH5pch2{xAY`H2U%?vL(5Tucdp1s24@EQk#jya7rG zd{9DQg9T$75KChg#6+%q;HP1^3FSb{!orrr8o(-zS(+w85fHKSdJpSj-Bq92HYde$ z!irxvm&Q`-#Bx}?wvxI>9|L>qAeWu|6ijbg$;I6XFuxgJamYs(14e;@K*fF&Q?cI! z6+0+Vx=DFG+;7z7hi>ii{QIIs0p%r)Yzq>$G9WFo4XpNhKvF~pyi#DCQEW4s1sYvA zZYyO;C3O++ao*V3v0pTdo?y8Nx3O^F{u#_qC93=0evRt>!TQ~-^$2rxg7 z+dAf3j|Q)t1%j=ge*s%RUo7Z8>d5at=JC)n6Gn1=L;`FY`)6`U1hwBE>~Cd>vqk)J z+spO&1;bZFlrJ7KzLW=E>TnbN~*=H*DxC@ILEDOtk)bm_$m#|BH1-@j(|3Z(a%5h;wfYEf^P4Lz<};6R*w9F!Ee1DV05FQg zfYEUPM#}+it_E;@dlgKtzU4FZ1F7@kHQyHg1(zdqyEyd93X1GUmLv*mezrD7;N)s|bneLXxWlvMt#Z*Pw0+I4Pq+&Hkz9mTwX9H~~SH!F$69lb_^!H!evoTRHcm<{7~yJyEkw?5Q8l zsPE}=d9CNqekFyrZ_s5%$%*d4%7M%$_XaXMZ#QQO&+dHW%!Tpv@PKy`Fc7o?lUOT2 zVs!+G^*Ml`6K3chsV-+1x;%#}jx)Z=h*^p=C6QUEuZmr;bBd$!Nh4B%tO#Dz` z#MG$K!WkQ)w^9)W6SY=<-YKLQu5boafnWwX2CP{*t7U0 zP#+3n8ZT#<`tS_YhXue0Li~T3?Ycfu4B&*O^j5xv_UoVxT#mB%kCsFi#$g02NMPFhM`Gi%V|Gw= zK}77oZ9Gf`=&M#EOzBs=XQw+$8ttKiz_yw>w*gH9+C2CdbQhryXY5MD!NY=ylH^76 z9VcY;77sW~^5EsAo7wWu2A&CPtqF!ez(eszA-~@4fUSq*$)^ldD}-2Fd!9{0w%*k;Ztbhm zqqOW#Jgi~2Itt(ZyVq_7J3y89k$7f}XSp`t`r4CEz-KKJ^ETf{cC%YDv0sWznGetz_J8Ji`;#;7&bY67@O zwu|c8?hlCzv4B4+zswfo@bUc#q=gZxDX$RY3T855muTeN~BEa7KRrIHM|^cui}SpP)HM zyXC7424zo$BVw7h(?QT#H6q=5_M@|;`(x}^SuSZnuuguer|kF$07&mgFw4tS>t4&0 z|M8`2wO9{bbA6m8y!WFSk#y@v^$9(Yg;kN1o?@OPZoj*&$iYMH%BS}o8m2}|7o!}m z{_!Ra0}zBv`uf}0E;;WzEAT$*qTH6%=fdQ#)3K|>V>?H-aJ zDg1LPBZ73{EkFHNCbrj{^Gw&1UXp>+W0O3!#$6g7{&U%Z7kSOQ zQTX-yWjxvLZ5Gei*=o=85D5vG>bi5x$Lxg_l_!+XUwnJ8pv`@>7Sd;BEji2IuJ+Z+!hpH?ybqI#-M0p0K*AsixIR)0mj_ap)L zPDi9xa2+gLF}RLFp3?|6na^32*7qq((44Quj_Gmm7meup-<1xWMViXN>@Bohe`G7! z8cNO3&GlI)pTP?#YM(hr-rZZMRXI!tLbXKdRY8C9QRn?)GJNT|F#xN;5ebo z#pmR7%V2!<9ud|{J=cqf$H5!2cn&O?slr zwIOIwgcmusEGHvG7jOMrWq-*Ebu=(<*>M%&Vx`ez*}C>@)|)&I7JL#c$m6kXHOuAP z6h|^N_-E2r1wo)0fGeyRa7tOex|Y}_YngD#TkEfN&?bwQ#Nx^E9y5ubep$LMb7sBn zbf(7yeqXFO>1n`gm&G5JIsvEU?9fk^@dt~UCZ7<0U`vHdtINq_A&ua2%<$~~!He9i*F7_0r^%I2LIjU5m*w8FMg%`4ucy3;VJ67nNOxvbsrv)e zrIcwO@fD&jD(%$V0baKFElJ8EX@!$!B;Q8%zGeK%BD2MPL^77arW$$kHg0 zsk83$2@8RHno2hp0#6-p3gy-n^0`Pva2u$7l4a!VSlnHAmTh>df7>q`pHU~GQEzvD zIXo(=JnBil=Q>o|0gP*&uATcbp^Ka8j05`o{T`%8Tg6>h9+PP&1VA9t(r3$;kNT== z(R%k>0&5<*O)u{IN!9u=_Jqg17C~^j$6lVC?cFZJRihBaeKz8XTNK;#giEf=nk5da z4Az1dF-^en6YP#h&RGf;WaLEjs#`sHzpP$4VdUvND>*?;4z=fAkDzSzZz|2uAcdcM zxH9f9U$C;CAc?Rs_l=4!KS*##+G^V`IA_M%y%BYVbT~sK8(dU-R>BP_T%Z@V!@e!l zvnYvwscKN`dAjQ-<)c=3$i{h?HpPAQ>rBu1>O6P$JU6>UPDVNrN8r8n&C~77azLoL zTd<8HQg~;KpLo@#zyB%U>)SW~{k`vXX7=4NzehuP?@#WlQ(aV4R{vq67JNQ;8`Wmr zD|#XNB<}q<%g0&9lFdNo#)mmdp*%^G3`rr@Qp|a%-#=8RQ|X1mwJ(1imcGl!L*{A7 zh(C$P5ic_gRQx3%ceQzNBqy72C)vg61(SE|VLo!y=5O5}FQ2RLhkAeLxE>yplBxTf zq>>422{hcLV+i=-=WpH=j^FR|XRouT8#f%byEqn@7xK{0r-|KRDraTm?zl^EU_4oy z3{k!gYJ&c1aIv?TB^mX5ohxu|sk$S)8GRM~fkaxcXS|Z5IMb*H!2jH>BDh-^}p6yL|=m%hu~y{T#La`eFU)kXsznWXvO!`Gi(r=Nrxczi`3(Apq^!{y5utXs2yE9n#< z-7~eyD&z_b-z60rZ@gb+9o|}Sv)1KL5H3m<(};78{`OX$i{!4guCl&EX}E9^bD#Bh z4!&(js(D^{=c0Rz>?%B7s_85L;j*H!3G~7=KEZPE@g*0m)3WtEHNX3?umzhT`*ABQ~t(mqAv?j+WsYVWPF5uL_GN1ga2wTD{FD)N6EkLYed}3 zn-AL_B)c2;i#py>n0=Ju{`%`5tT=5y7aEf zwmi$Bjx)nXf;!|qzBjylCx5r-NPU&5&Aa$>i?08i1G#n^byGtnsgGxfdpFM7agPmE zw7_9Uyz?izws>~uf^wyC09byZ7O?zyVEJ8n8Vw@7`j#n1bq9^QQjk66_YHTX>X=;O zeR!N}^&Llj3kn*9tE-rg>?FPWd%XvHuT>87zPR+i@DYlSS{*?v_Hz2c{{ z)OXK@NIq{D6DIWEgPt+<%y1Q@m#APM@z++ws`_t`tqi-3+M^$eJPfYL3C6qoT*ga!M!# zZ*SJbcLN}oeqqS<(WdQJPwp;DpD3Q9fnr;+r^^C|agEx$T)Om@FP{4XftoOBPRp4Z7%B&XDsQieu}#E z&PvRcU(mCNSu<~EyohQ6AoT1EI2s&oFfFITC4F_2F^&wRg%pSMD{UoxeGC^(6 zlMi=7XPZOO>IJ(}(}G_aEW#8=>keHgjHV~Xk)i$g(dB1L*9KAzrhZ8EfZ2(4@|h_a zru=ewsj$d2hP}hxS+bFA48j~VxC+>nYFU3bO`r(Avm&SpbC!zEG%}HceQqCiQ|22G ztv_Xilo_t^9lejuoO*iih}xG3LIY{6;P)*}+77q9$hLn8#XS*Igr&+?re}(QE-VE4 z-i7>Mgb<<_PU*H1Y-6NjIn;s;ABGBTvX+b{<{q0_i;i2}*Yj-$LmI*5xM83OpYf47>3uHvWcy+_`JFoscS>Ht8ZBY{eL4XT11p^n zKNoX1H;;dTkL8Osol5v^1bTzKKeSni$@`>EPIKGj)lMc)*pJk~SitGw*2z5SOF!va z?c2LieN&A5=f8QExKn!OxC3mjY+bs2!l`PC3p;L0RHrY8{?x{tP*$6^QL;Xr#Aun# zA~%XpQUc_I8t{VPa?LyK)z?&-#5L*(-Y--0uVrh-f34QM%Wu`5w~wC!y8+*)H>fGD zS$7Hg67FW~c<g!=qp3FoA zw_80VZWsl-f?u0++mIg>FGR$JeoOq;?$JYd^{pozcvlM51@%-q@U9iW0=lk%+Mx%8 zs}&Hg9`@=7LZ?7(T4~q6UzjYa;RaGuvOy2uis8!9N!w^!Ew~xib#uL#2M)iyl9ys8 z-Qy#c4takba>QIzYZJ#N!?)Kw9#C%KO7o{hfnT(}^Ac!hyq&bYINZ=Qy>G%a!u7}K zkIL$glJk(huJ+=OG-;A$uz9Kg8z>If<=4V}*R}Sl!vP@B8bA(Gz4|N}MnuHDNwEC# zM@N?R=Kj8%^Q)o<7802IO^{r&Iys~QPg1;D+YJX=fuAnVUHU+Wu z;_S@u$g%opyf<-S;;Z3!=NFsh1*1=8`X_vn_dKAjr9TROYnJI(XS8XU*QF+OYw+Lu zrXQV9H)5M#KXX}PE(KlCc)gs|7V;%wx52FM!i%o~H8g&TUe>5<`;~zCyHolZc2m>g z5}&gB+P+rp2@74n>xPW~oTk|GIVtu(Zmw1@fAD&FlI5mv?qAV5Y0pGBR>rXE%2f3x zo>X98zz~IF$!24`df~LE-Hc|+q%i97iU!C;W*`$a%6Yy9JGXqU=Dl(;=~gM?gbH7j z=-50*sJeVy+uiJ3M*Uv4O8$sn+~|5yWD1*H)_vyyB~LIi3DWr7o;$>Utna!pYi90e z|K_V;0^W}wa^k=7et-;0Y-{)CD}T(R)*zc}M!4Q5AQ%-(qRFz$H= z&UjP>R9DEl?-ue#5%l~Ulzzn-FAvs}*{L379aSsTt^UlZ*f-DF#k5qMi`XnBlNs;Pv{VY17&5yG+55jK{(! z<&2y@f|2#92_E;uDhc-TDze`ewPbXQUAs~&&uc<7zy0N(ZVOpG(hcwaViIh=BhgYK zN8Tnw*l$6yy7* z!N+?{S)TuOyTXpq=_BONGd7nt@)o9@ z;kK`Q63=L3d=3VcAR4G8S5d*Nn{%+-Bd^or)DL#7Ys<%;ZvgR-lZSS$2HQO<` z^gJ;B@*A{~<>T(u5$pMN>7^=(=w&#IfYZb4kZP8DhX_pY2DR}CrZz@nYGX90jnUSQ zZ_q`zcA+46lhtOJ`}GAH-MywlE3ZR$%4pE<(CvX;fflZ65M&g%)IMg3W7MA=U4XU) ziUEzUxkzgF@#GG2Br)mFGT%n4S>HtOaeNG{r#XNDlzI)S)0l3p@~ARyv}oP*Hwh^+a60MNq1noa9f~?0M8|Uo1NV}6u8H3g0?OOuQcDuN7r;bzT^SBmD=$}O66!b`$ z%^?f$N^~iM^(ElNmoLM$SI@{bi7!;6gL+6|kZO=sw~UcGgd~ z)e`6{c?X;={YEq7cc56vEwsRuYI&XbIn3dWq=stS?)p*ZB-zdW55MH~Q(EM66MI`S zdN(9%Bp=%{j`$Px%1?h_Wdvj2`ivvmtFLsEzOT&vxYaHH#eH@;>-9bz*@pgn)+=EZ zvLDgkUg=8mG8!_v-@F(WBwcNlpSMzcShMT)>S4$&vRn8`<#mr=3zG+(J11kAN%7yv zGVaFC>e4|EuqZORZ1&!MOWNE!Zz;`CUmDso_gWk=6{r#J6-6%HxoawY)smK0nCmVc zH1c6rDviNh`O7bj>5v^V`?_jXs~(w)&Gqr|PNCI%RM*Tb=9VRv#ZVVtT+>Si*-F_4 zKl%^nmMjiQ(U#~>WGiFOG2DT84I|0$K5HfE9>+1CB-Z}O|2$3u$L^*s#M<3WrTsK! z+bORNw5(?u%FdlYv8xBXNKEqm99At#{T?a znHnZJd3N(Sw$@9k0mk-QOee0bu!UEf?6*W`fAkeNX!!BArg-sl)wx}78HCPDX8gOP zN`N})c3b|AJ-UeClE+D5liv&o&YC_snYI`kf4ph)Fxm4qPs(RIAxr5&#RP|@yGr`> z7s(VL$9+@-j;91(i+ZSJGwc)5K7^yB&&B-7-f=979w2d3*~t80HF?|k2oOjA`D@J- z>m;ZkHAp%!JKiT!W!ofq&fYBCPred*SLtmVDn?C`X)t-o>fQO>h5uxRavm41JB!l^ z{k^vUJr*s$^vgIqb&_PsAAA0MlPUE+4S(ciw8`KXcJhnilDPZMd{UZWi?&KrD1vt< z@08URlI7JlU$Qeu3EAIZJJxlg5-}~^rO?m+ToM_RjFSD1R|LHIE%0VG@D;u!4o>k5 zRW*JAR?bHYgpP?X;co#Q1Rl^R5V7TQasncVEi^_!OE5CXop&b(~a4=W*| zXIfsz-8yRM21!osjS2Zbx$eTXfyq6r?DaS?-a7npw|W`~@Q?|wfz z29l`oLvQ^ef$9r%hxVC}?d3A7ypXk@9ee0E^(`hEq^f;NkgB4A0Dc$&{D1(b5&3w2 z00FY}4vkr0iGUh}rOfb@*YAC7G^j!RsAY**Xjn2@m`{ts-R5)m%Ci0ZdU07nNcH2C z#ZcFN4QdxrNvsZ?OX8ikD}3L!m)lUrO4?JzIvKxpZ+dq_VWT*lD!3=itRqHv>GADg z5Mp~{z@dbJL%EMR6j5*}4&YFP!J&{kCQ6myDiQ!O(%H%kN%+Fv55)j6!l)G^*%H`* z7$n8vZuj$Oe`JSE*^#J=^4{m9i{>(C?SR~B0`vVTy-+TY&=eRXW!a-lj$g%U}nG(ot?<4$)UMc|> zW4R|8sLr~Ab1@l7}<&WbY7OB4Q9P!X;oUgs%eSE)o2!B(qA> z5hjt53o)-Vfp=?Y!27y65p|Cpt9(j6642j43}y<_Y`;UXgIU1mh=Fecgtu!uH%EhI z4zJC9{Q-Aa7AEc8SUzYB-7X*ReBFPzxmoEk;HAS<52(X+wrdlg4~uVDny)#SdP+*3 zc)01gc_eH}vFFoJgG!3fSE{4iiNph7N}?Yta`&Y6|_g1srsRjNu5j<2H9B zOYfG^-#fnG=Z)gUms(2g3QHRJ>bXiq##1U8$6I=`KUZd!0EdcW0!ecVBu!gP(zFFh zvy)7d*cK$s@s#|&fc_41f5p#H{hefik8OE=MCp41Exwj{x2Vnt>+A!cne_yzbNt;F z{oQ&26;H7cr^2mgsF{Lk>n8G5SSLwQn$!>^_kQ0Hb9VOtb3jGW@-uQ&P_Y&qIFcj4 zd}eUqND~;$HvuqT1;Bh0xf%_aWPKS!4p`Dp-%LMPy?xh!Oqjp}VS*PECip;@FaTkK7la8SGd&_AkSz-3_-XJW zadHho+aMB0`Av>ozMRl;J@Xd0{8?}}M*Zsh?nc$!817dB?=G}eU?=M%-x$flI^@k!91(en-^&>x1G0w$^SR*3j3>w|JeA{+Fexv@mlCw zQvvSY{r|tglh*_5vRDQkK;X|gBS73ploC7#k`ECg$0!G$(^%jX-Pwi_*D2b5_r-Xc z+nyM0v2wpO?`1Lm^sJz&!Bc8Z-hANfSb)^;pGz;WzaOSF1}!HsSo^0dA~ z=EU3H(RcS}L^T`JH%iK*`jt;g4I6l7qK4qWw`Zt!-<`ytG^B6%mfiuEsT&aP!n&p} zlN*rKpOtO!ZgY*e$xiou_Sx;l%h!M)zaB$#N~}A3OZ0Kp6b-|e3*yo`TBf3IEToj1 zsmX|%fi{y_(ZP==%L*D7%yGn^&14SROqeeq3a%=ECR(VG$(+LH_WA+-_p?Y;OfTj;!PHBP34N!R}y*omoTgQtdVr#>(K7Px6_~DP?{4aJLk6bN~=n?bBHbY-o3>^Cu zU{~chGT0WlKiw=0q_We-m>=SLg9kG+*(W$7d=Q~qr*S_mMQ;SYf?cR1lciAZv<(AYb{GIIw9v@pr$Iq%zrp7UZ|dz1 z8t>HU8(NooNkp*FLcN1{xNm4-tHFHnLUGcA%rLiiP>sv7Py4Dhg>;!iN*dm&+N%>i z!#=*~7@Z5J+Ruds4Nr(XB1ic%FeIJl-@`XLW%Nsh5~J&zhW%zl9(7+=H>oFzviXLjLh-H?O~$z z#kbBMEe5H5m5PPoS3ZG9VuuDZoA4an>^u<;l}Hw2AkBD13Ng{B0eM=Iw5cbAAok!m zU5JcL4TvO4O`%Jt2ol>ZI|Hzokjw+Vn%xpz<@j0 zAG3|_lF)>ybn5P`(}WQzhGs`*gPy^2Z-5r%^$BCe#nkHBaMc~zx#WkOrN+p@uH$uf z*|=1|XY-F2vb{~IHR7%8)#A_8b#i=Bdc1l~nL>kh5X+oBCQZ9rk2)f?a{yAi_3P!^ zPv8qQNpZa589aLY0x`S>ok_fpY{aQ>-r1jEfk!m&B9(IEc~6cam6UVX^|6s$edFm%#?L4KNarf_B-5$fn69}>eU&~1C| zvQ#?;X3KpG5ee3zkOF2=w;AYFN?!w&n#bQfIo3xohx~IB<6+3-J1;qF)8ca-Z%v-*MB0)|C>hAVCzWzYSlzbB&Lbz} zzZj7}alg!!uSv_9nN~flEUf4!`TUqt0xTg5*g9beu!I$aty=-Mt{>RCl@9Gct4gs$ z*h}J~(!F4vD{pdS)iTZB?=PeoX6E&2trV<4Eheo7wU|Uu8bOYEkfS9KRK}Ue4z9LxaD`2UYKtOzL*Zxzj5KDTLVkhnEF(&a1 z{ut!ZT+deBE>YhsF`H(u_7X@4KMz1sTR2BlKkFreJp`h!Zap8Y7IYxmMi2AI<_-Wb z8sb6h_3uBFf5Z2a^J#{N zn6G(Xm+=q3Nq|O2fgS{l(~>O`Ns2f}<*QF_REHe-wMuBlH%Vm0wbXlsc%ZwMI5_+r zeCGZ;)Fg zqOSidwN|hwWnMKG>7-@DWBAMYknQqWyy%$>>NyZIO+@#vc%wD$?1;Ux-Mm)gw#gtj z!@6_rcr(@R_6aBWBK&-Z#Ct8xY(@ckQuvL%*L=?UdB!#XUdzY_w3AqW7j3xDO*gR5 z;^r*5Nwm}=yu^hwY3cxG?bto1Y<(SVc@!S>+7 z{O7+rHkG&;r~3&g254O9E9G%l?%OdvOtKb6IS|y$k@b!lgPT^m>@x~9xUrzY{XBO_D7)sET6)*~N(NdV8|qJqN;GxU zd=zceq0R>dSZBp3+9>1dzI=)72L>1ALfU{bI>#Q1p`7{*^grWGk@_!yDnfxjpdtEv zPjijmbS!4$`RFw%|C~}Y^}z{)*fy2gq^jz*a;iJ_!*`_0b;k~CocXk1WoEE4{%b&L zCL*L}BCL$R?6Ys8_8aqD{WZ@ihe?CU&23S)uJ7q&X1M%W&sYG5@dqU~KWKfxvzbl1 z5tL}X798dz=$1k_fK);hcXe*MeoZ;r&X}(4X{Wm6{b%G$emuD^Od@m_x*t zV--vdQRTWN&H8Yz-y+VvgV6)vv`Mla#|o*F{2Nt((@waeS5htgw{C_F1=MF~!L1g3 zqbxC8zzcu6%i29X?$^_KvM?)CKcZA*?HuLUm(EggX(Q_M2RoGY2O}Fv7d_i>xok=g z;plY(DoLA1qGEXle}-LBtL`yu6fFOuG0L##9AQ;=-WkOR^}^*=hjP~sDR=##+(m00 zK=aeQX_x`SNBrgS2A--JdK_qEe)8<3bQ<8HPOwT@62~kg>(^Bg-OXgJm)F z{TI%kJ(T@ABYfgGxADT^*YK;rMOFX!S=I9&gkD>sSm>|TL`oNX49pwp?O7jpzhZs3 zH-+Od{A*bi7BmSI*On?Q=oPY{SFoThsJ~x9{hbO6szVmkld8wDMfys971^m*p<=D6 zKT{3=D8qu_M-^w*m^x%ZPOwjpHdWhwXH>;+#fjk<28$KMQEoq*ELi?_Z|hmn$yT;y zgV<9QJFhJ`p>E`aw%~+bA}8bsC$tPFWY79gbIXagS#2r}3@;hI#0?lWN7gt*Cdt>q z|K=6%(gtbVnXlPa9Ed~cF{%Q{zVHqFd%FPn1c{&de_i*V|+#7*77OIMdz_jo&F9mOPXccQ5=flR|^2DE0Sg7YLaQD z@;IXuxC_VMvU}b+A>Tlbdn6E`4ZOLg55dsGKlClw+Ng&Z3m3U3^i(h<6) zjnTP!xd|s+%pP~|)?6<4Co@_8S#a=}ci?@%;1+e!J)mI_9v{GVIp;z7{B?G7r#C7t6iDaZijC)+C8|X?Ir&AD7VvcP^KCn;*47I5lef1B zM}DQ(*Up6++(`d@o>X@G10DackTA22w_lZc;w`@U-`^`JtK6y`Y4$bPhVQMvd@5cD zlUK!jY_)kGH^R@38vpj=eZ>5IL)UHSgntLxn~$ft7LWh5w6>1578SBqg-My}ww$ol z8$N!#-Iu<+X4b2N?ru7>te|r6ef(_w_~W4e83hl^#j%>ix{-H7kLUS@;~w3Y4{Cjm zca^p5Lj7d*hSCWu7+Wn>^M?|JTf%ZqCm%Czig3P~ZPl!NR9V_j!ag|@`v#e2iZ)4a z4kJAyQOt&G_*An;UD6a`Br6*#`qfZPV)nQs#wiE#6EvlR6Own5a%P>46Gbi!KB~$n z34L z>1ak-=iWeT86#7{mexv64a_&it^FEwVUJwPbrdhWuj}EY|K=e7;hH#ZyTSY%|9xlY z0lbp~cYa<_{HSmp|1eKrwDTXbI;}r*! zk%*ic)|Qu|bcCVPbi?MYxHf!f27I@!u^q)o9CZ(dEfQPd4e57#Bx>Dy+`W!Xs;-?V z4RG%o0Do6?C!#YF7Pd!P^NYlxjjpt^kS#N{-zY$~WFoz<%RQJg$aGud%^PnK@vj^) zzq}r9IX#?=OUVCzcil*v!nO7EFC)v^V{I5?LjHDx>KZI>bxjJr{J~Kz*|nUG z$B#`uJintnxMlsOSW;_AJK^z%qN3IMjeg`SFhLKUKzmT5uK^|D>LU zuwF1PBu)!HevJqj7$Sv%AvPEoBF#}2zt^p4Zp!mI1j1HWh)KbBxtp|9&&6R{?Itb9 zuKJshLRXkqlM{!cpxil{;&UeE)YG|4fq-|e`IJOCZw$^VxkdG>9iwS6@Z>%)-(g}7 zr5oFRv*m`PXz~6Fan15g`o*H>zi)_QUqRC*M@kcdObDacP@2dfrHLGrCL!vO=-3|4 zkyyrwPROIn0y)4ydjCqMe;*qOUGg35MID{KdC_BT=<;>kt3s^ZE;2MREeBJ(7@l*SCC1z37wq^osR zIGKttZ8M!a-#dkSfsB(#LA<|!X{LE(nrRuPnR?TK4S{KRvf-_coY0U@i9y`Fz<&vO$#*NR$gCxhvEwjBIx?sFiS%MMnPuH@BthR z%81@a+HuR5o?GK<_XVS^u!MV|!*wXE5;H3d!@t2o6|p=|=Wc0Ys|_Tgsx7g4ob^1w zm?==uxsg^aB9zG#`$iLvSObnY>?-i0?-5?~J@BGz5JlfZ6wT3J+i<$_0k}w3WiB#! zmoJO-=FzCKqLysZ)qzQ|BR*MQHaKK>vQJR^J=B>%IaRS)FpfxSq!Ipwu)NyJv-?)B zMDx*kv-VBHpWW#eDS|E5Fu=F5=(WIN>1ndwXWqFm?J-TO&DzNjVB zo$+IDHi)JlKIKnG>a6N(z2S?hcqRbT(mzkGnhy-27j3Fa#jt4E*zxnkEJ-fNefpUi zW_oW)btB<$lpG6b;?Ll7%41hKDilhzA>YPG{l$Hw*iu-;6V z-S1;v3A^eA@M`7SKF%rWX9(#x;6KxxZ zjP4qgGaGw<(@3YYsxGW5Jg6%wN_4yXHGOizsgkBTBYh(YwY^?t*`T~L#d55MxINAO z>(31&0!Tmv*n|jRibMc&Bm%%ZqcKE)i9xP|cRE`@h*kiEm1s@V7>@x$G|fbmz$h+Y+Tc)zu}JTt=fxINWL97UtvnS!FdWJ z{~!Ko=<)t7e&7o}jzbLn7hmvkG^CMrajMjV?_G?-h@mCuM)8N&V%tq zlQ3Z_BrH*YG^yH3nS(gTK5JXaIXzkS4|3eZj%Rv9`CAi7g#T0V0MnJ$0TdL<0*O>s+bcAqG|~reYcJBEXL?OkZ(ozp(5)?4Yi+ zR$-~)V8hNcfA`A0XJuc{>P3eMCjV~My<1p*J5x`dM=QWK5<@dKLK?Oa1KCCl*hXyF zMhwW|evmCxXy~CkJc+BzMTUWkmUS2TW(4hupTBgFG>i&hKql}HziMs$tdwNS0@F_* zz`dhdER;kM&Xs=%m@J7x z+=v9+CToMjWA#y02RI^L4_1aLj2FiGHf_MV02BIA%j?*q)(rb0QpXa zSRH#*9nBptaduc1Mv{{eM=~8~o9M`p(mbwB_SriQVQrhEWABAI>@J4 zYBqf?9U8{mFoTf3Q<8b^v3U=rf>JyABwl4f$LDVSDep{(G*jOcr0brWc-l}Aa-tq|vb4&UO29%i z-RUhbs=vYHMY+)udG2LUDO5{Vj!e!Sg5(Nha?T4RM|gqtpTXpu7m!RKdBNCE9R|v( z)#>7J;iEZ?a*!Pa-_AWvHv!q`XZ!ZtnUXjMcLat;Oh=J(u7GofZ|5Q-Tl%}_3>u#$ zO{<;-RG&uPM62(kOQY%Zy?eU_CfZo{^Bkt6_S=oCJ_$W8<=CH~zP$4Lqf8RE>$<&U z_22*bK_tq66F!-cP>r%~7(OZ1L^9Y0CD_I!VjIXM1`e2D8~9)wm=I!7yETP8B&MR= zGNsP-Z)Z^ODx<@+3WYj88>Tj9q9Vqq$0+r1tZ7yG zLh11{*C*%qeM0V~7bnvhN`}i{ltfl^wwL@>#M)cGlj^YxHF`wo7r{nxT6*cLEbviE|7X$P_5#3$QDr_vg?G2cuFu&N~KvnHUWWI}qh2 z#%Le$jN~<#_Ry}CLkt`1FE`8Y!GhWnRswtS1H~tp2Rlr*U-FdC4apAJ?$^7?$ZGxn zoH^9JXW~4)QV4b}RxEbu-sz5ckh^R>cK-4|sB>H{SX~V~d_wG~@*B$9>g*Hv#ftf0 zChZ@`j(<>3#DqQmfHkVcIHf0~!hQ>iBWS3LJcQ2!nCCv3T`Ww;#mFw3i1Z{8 zY}klQa2YLWcb?APrGA)nQb?h!zhP?fzc-?kV_k!ja%}ldHoIZafkc4|={{vWV}rN| zO{iw|R&}97ae~A08Ex_uLB}R`7+jNsZ>KDS2gHjX;?poo5e)WsbLj`Eit`7pFeg&3 zJcC5nIo5>NS76St^Ox_}mW@b>XMpIzv+?4%da{{(t><+m%Bf(L^-B<`ixJumdDKwE z86x!>L~3V1l|b7ik9d2)cN8h2W!gjRYi~7EA!e?TI){qJicZxX3XFz{-b+<^n3q11 zwq>bTm(Oys$9}iM_IHbs-+zC*P-yu0t8322e@4)#w2#t~hJC#iKJgwa?R^z2f97P4%FdnK|Z`VhB@VS`0xT>5@}UQLaWLXT2+z-S0mxWi#L}o_u~K^@4U(JS8FnV ze+=ljDQ`w=r(g$qI;DSfh?aRT%9dAo?-_lmYFVuFi8nNAT>lhb@TICUV(+5mk7?V_ z`L%k+V%3U#3rc`f=VO*$-WoG8UzB~O_arQ@WMVK!8m*0u8WP)0I`}CRIPfs(^kdvLt=L)|o@uwLszh%`d<3&)n zA3Sf`O&5(1uE4MLs^FZW3#!|+(<|@gqQEtB`?_5(n-O=Tdvc9i$lXJ7$RSJb)9HH3 z{oeYir4@ZcPJZ_!$(-E0Rr#y#m4hy~+>>&J`UcUQGMg~MS0pYg8+BO-Nj(bVXMS68M3gXN0*a>BR{({hVm9Lb8NG3 zzu>eP;b*&3-;tqBb(>B19f4)MdkHOPfR2Eisg$sT-R&z68AQ`OSqc_8_cRNmCtt4ym)j= z`0^694IJI=OgS8thl7VF64FGDZV2Qx=-4i0OK#G{@hDWq+AMx{&8WKLI#^dlbz$~Z z;bO;kFZ@D()!y{PN3}u9&GORi{NlEdo4bf73(LN^ZPBj#Mz)>jHL(JLX4PWm3K$|D zQ_5M}SURx9*nV@;xIU33h%erJ-D#jfN2~E*oNN$$H(Ch*5#ej>v!4fMYlrcS7zd8g{H1Nk`ovC z#gyr(Fm|43c2T{*E0pfJZ}(-6)tnACHrVzWx;Yg$AhhBeZQ zYH}3q>2h`+#eeejKA}Y~tC5`wRW22j#3oA>sI6WoT_`T}x=@uYt66%)NEHaosTDIL zgVYyFIfqPNmnHOZGnOteT}8ykP}ssb}nEM>>i(1*TTqU5JP8hlF>5-n?~qP1Ba`$+5b zXG`X*s3f%f>H}`+`o?%p-_YU0`f6I~hdwvZ^WjiYawKp5cDg^MSg~3eTe-d(lQf;J z#u2^}!`X5A`F{N^bjv}TgO+%~DNT04DU(5)xMbU$cJgG~vQ_x!AosCdxo)y;w^M{l zmAbjYup66o%_4T;NV2U+#Cm(~gi(B}18*ZOsnhg^`>qz;ts@_{YZEp1{ef4{^yA8e z16x)v?O%V0^M9FB$z?R?a9|itN^%X8Ys4=}5gg^K{e6nz?yH+@TyVpNaR*+Kz#F0+ z)fulOc6G0|JsV3t`C#vZX;+PIiLWE3QBN(h{Z;dB;QlB4&RBQ5+q+)QIGguMwBM9c z;k?5xAY}~1jtSdozENw*^l={>9qy!*b}d_0==m97#uozjq!GHS6Iu8L2;{4f9w<5* z7LIga+AUSQ+;#p!ozjJAqIgyox_Fw|{AaOpc)^{I)-z@O==O3&lU3~b9}|ryYL{$r zJ|~?<{x_AVZbjfFn#bW)$6Z`5_D%fEi=*rIT;rC~@d@5jJozA_xn{K}ue_$^ps6V| z5LF&q*%^#vFq+n`52qkMjO^l{v1k%lxEPVwY&9zp03$S$GTp zjf}nf8KI{C`zhwd25Dv1&@~Zuk+}5^oQl>LZjEePp<~JeOjGy@kzBX$M?UH7&wBOa z^*~mlD2)WIwRoIDcWL-7MOZ?v0xUrSmatL=OSl&~XGxqhu zF_a>;aV2CUMb57RCd15%Pi? z7Nw)g6TkiMtx02qX|wy^D`qzB=ROc5=H$|0l4)j)MGO085~25=_Ng(69tJrXd3}N5 z(|&kZhOu;1g^Lzj&*?*cnrXCYwWLXO!z-*Xd>*{8C!L1+;yafgb9KnO5xGg~5?qDz z$y6;Lz~=R`C2zJfIx`WFKem{V+%~h*_3qZJUsSYFNKuSsR9#RWe>1Jh{N?5_H^Fa* zkC=W7cR7Nt&3@lk-IuR)@6>R2pS>$gq6%LIZnLu{bx^AYUaMWXdnfw}tEk2hlk;52 z$thXGtG(8*JF2%dwuKx>MK38Ynr< zR}REv-oeHYO49sFV%yahJ~xOb)EsV~>~56y3bdIimgP9@p~F(*#}YQ_f*V(Z)^);%X@vA{HExoOehbF;6)a}3ya`| zMNq&Z_rIVpeM?}X$jQ5Ij6s1af2D0kMV@~c{cSpGo2|cwYfL}> zT0=mz+)2ZRdTLL5%y7%ESoxZpgw&Kze#O&--FOo>sfWqhy6CGay^d+C)B=3pxC90i zEb&%F15Phz_h!VY`J3PKZdxYyw2bL8mE9HqZx5CSZx;Y>&j4??`Vc)HkrB;tukT0f zGlB7(VX?Z!28*CJOJc%B^l#boT7?w(mno^5wF)pnRvQ>BD^6A2a!5WF1yfl)E~;|nzrX8Y{U_to;3^Dl+h zHe1_9^GjlH+$d1%7*m{5Y-!UOFYb`H6l<0*Bz?-H`)=$-ygSb+hoDY?v z(aOjTObYzUYCQkk!1VL&w023?3l_%&60?n5N}?o+){r}gQk^L8f{kILgQM=m4)D*5tI{X+3D*Qr)M~>I|Zmb3i zTR-#Hw_bQ8c*7{LeKz6E;Pd&md3zv^!pk&_IE4f?)8AD@*F*=0fBI}wvAZ(Xy4m8u zcgXj%j%G`1kmQbL&TFdbcRE=|g4-Up=4{V@sat+*^Uap$2%^et+qc}8KV*+Ics1us zl_{UU%c!W4F$7zYPhz?8foeF4dQpv)Sv0j-jwR5~* z$D&zf!ROZ9yC-w@Q0kU^#iDZ=c8t&f{Y!kfJ{aF(_|*3H--~v-p}z!>H-gU;2xQe^ z(b%wPxu}|GO#e@x4T$`QoG|>g+0kT*ndSPp4+cayv2{$P{pn-j5p3fK;`g+M$RpSo zWEfy1GJOx0eCg>&Rj{}4h#@t2%SFjm8_Mi#9vnOqXE!q?YFo3{uAw9RtM`=r@5e{n ze}ikgcT4JY%+C3}l)I${! zw@X31fqq8`75cmLd{Vd~&f$If{tnz4M~7T=q;jC_ZN}H$Ohkz1#;5m2Bq^O{JUZV$poQ8ATk&&>GGV9iv~8Ue*;D&h|p?rP~=%IhVM; zvwTXQi+-RnHn@U2c6KfkHn;)?ghf9Wi>OI&y>L_d9<{zp)q8i|MdGqD$8>5u%JeB}e)6h!$nI)DqtpB%vab z;M+n06hsmVNJ0TgC=NFXr0te_&t}1xB3d67`3_S=p(y5{(4!>K`cD6lTr68xrH0?I zQ4BF^7l$}961&Q9UqAfDU5r-9aO)!)lIX9@{FZM#>3mFA^y3rVv>12XeCq;#{nqu# z2*(B*!o$%gvHk48Ua??v>dhgY&w~>4-b-&6Z|~Ff*7P3vx%5oQ zRU-q|c3oYyPM^d#p;FH9Ib?#WLi%=m{89SfDvFZgwDX;*FPOdwjx(%VS`HiipOgaX zA?SrjSc>{f6p}X4>b@&8kH^IFN_tt)?i(m^irjO!|47ZHIz}$l*PJ4#`a$0l!ZQVZqsK>orp?Q5@ttISWSuH41N=0XIZmlCGPmG%U z9`>Hy7Zd!fCb6&Qk4TODO$}D$g}Y2`^t&o7-K^ZT6&;Em+Cm(U*jY{`cGVOLR`?{{&ID|_GSs1sQw>Wpa@>bip0Tb}z~ zI=9rkM8iF_*5DJm&u{k@F7j;~SBWgej{Mvp zRvpY6>f)bLY_4+|FK!hd+;>?@RGvtzDrV;EW%pXWWM6ppA{^DvEteE_lJ8mC@s7V6 zY;axzL^X5q;rS=zDV+oTj{1hd%jI7+w9^x+A|_9p>S7YzpQ=4et0ocL`!!yeU_SCE zA|#L0Nc_8xo>A`RV_+?dYZw{tt(QY^Z*c+wSL)UWc=`M`2{nH+OxFx6a4O(=y@1*_P= zK*FtXw0`r+sxy(1&wZlRiSZ#}uk|JDwIZ7-E~~8JAchKgxtJp(@b)KbHS;_ikNpBAl->)@p zZ%;PP_pBnf*Vv#GU;E&ID-+wh-KN>oYrL|CDVBRvbu_ z_aRZrBZ*QC66IY;l#Gxl@Aq*NT)q9?^nAF71!rJH)<4QP;wofHuH&aoM0noUdt2_} zn-zv&Ff>Idt1Est#{BZ;1AWtW8_QAhJNl5Li>R686DRLRYlEXOJM0OW0@0m!2Rke5K$93(*p;DTEH&RV*5NNnWsCibT`-)GVsAme}JPd=4&Vi1}PTi$V1W(}5+{uV)Zo;>uQ0E1C5+a*}6KqBNUqc?tt)>YxKTFhS z{%q;i=`Z@pLyLLghw8a8qU^budHfV20Fj)!}Ah;A3SnoTA(G(NW4WvQfMW zSCxr)6tS=R2Zjd9cw_Mo2L#eTRZwDEc*Pq)#Z0RBBhx@iQSa}C(ic6&s!Rl*#sKkSxD8*$OP%#Gx=ePMX%W(wZ zGqg}Y2gRZoo?%mRP-1q_gJP7j!8Ea%QTWaHmOs>^7(lTOa*ZXw5lQjnqQD*ZPxgI8V8 zIxSwoDmEVQAVE)*%rXt!DVWIsh<=ylxPsTzOsx;98#Cx(lXH-}Yt{c0e9GcjO3byv zf=6_PTvUTp??puvNWXR6aJuJu(WmtwCv$2FgzkOxMVw+yd|#z0YH)HHLk>bd1=K;` zN+IMoMI}Xii{iLv40RC2c#Z-pKAdV(lrpN^H(mt_I8|e83bbI{V1WO|fO)?W^KP)< zM`BQbIO7*BAkLdsbg%RE2vMX$MY0KrEo;u%{7zJ?*=}Fq;-8%pTSsxOk^{^3)Fk%p z&ELH}y=p%7qe)#y3wnzKw;b1!3O=1zoerJs{CO%$aYD>ZuA$*J59}zbY)t9OLx7_?DYt~*hx|*)c^z06x&+#ANBj@l2j!ujVd}s z-h8Ld7$Zbi8VtL);WNpQlXw%V*S(W?k3FqiAI?=+xy?bR<;EjoPgRlay{mKw?A6El zH!Qv*A@)0j*zXWx=jN5mk2ePBZ`4!9-ze`-)_hGg*Qwz-&=PhF0Gk^C;qzN)LHG<4{kW9S;nR*8@_3_J_l-__-?JnIQRUd1x&tM%dVoR;gUO7jR z`li;z^Fzok*Bx%lUS~TG^xQL3Kce)eZaP5smI`nCTc_W(ZEl3Q9)EV;BHf)~Khu6$ zKJyPWKVJ3RQ)!AE99zbKKDom&X!{M(wh6TT2HMVmw#Q>RhJ~{+vwMJtcCs`A-6)=u+0J&JD{e@(I?lIiQ^Gn8yco6x40w`twXCsG{muIESYJ}-!rd`Euf zRCt^_)SkHFsEOFnDcH~uVnah@2uR}q2WJ+vt2hPiLQbb6b4Pq6lb>L@O?NBWe{NqX|Exf#G(Jc-k8&s5Pv#vR z5Y^5=wMj&^NlGtFs?b4PHF8Pj@hiYMXj+U{5zWqH%;{ zF^Q;lhNyP-K-I;&z)tQ|Hb|=G7UAWnG5O`kN3@qtr-!*a?PIf!%^*(X62$Ew;&wpX z4v0IRSLVCi7^pWm>SH=EGrEJ#e4)XQ#y1 zCRY)L`Euj=sx@=cik2IvZdUT#+S+hup0g#5q}yqvRPIQHx!sx?<>L~Mzb8InyK8Hf zR_leX%VRyc9OkVKBI!0Id-uyye)F`g-SGOOt-|QsFr1qH__)4r;i!Lr$fPrs8|y)q z)LT|H@8hjUA%cquF9eC-Hop1 z^oO0Tzr&`Mc61Hbha^k3hQWa4`g(1Xfd? z&Q>)!z@o>1Mg1EAiv~#n7Ci?nx(irzu9tmkVsF=+01eeAmlWz-zVGSB`%v=I?c||9 zw=0&KH#*ikYZ*6E7`Z$=ls&KZ)27?4ikLn1Ym7Xax48WXf4V2MRmHwAteUd&^w)9W z5FpZ_yuoUr&kINX6|Lr<7t9f??_@Oqpl9x6v z*tkfcn!9_ZB$)l++TN0TjwFAwX-Dt*=DE*h=KxXMIb%^_T|%kz%P)&J8@*(_ROyHB zAHeSM9MmUs#aqty_D-6ciG+B40JvBZu+!lez)pu6 zgCvIG!9?8lI|a zS&}z(=>XT9KC+n5Ngsc2&#+nQCFUt(qc93)x&gS{Yr21GyE--VbIPmcoMiH|m7n0? z@rGXi*5EzV@Eg{F0Y>{2=YC=bH9YTA^I8&^_B|0O!0-IFI^f>&6l~l(1X8*$ zG$eEnLtjHcn5($ovY9$eANA`bpA?>PbRdQ8kVRg1%=>Bo-?>O1HGDY0(`GBX>69AW|Xpo22(mejINFrpE zNl(ZqOOR2Lma;0DmLQ|-y}UW*>0a2Y=)h*fmewvqk?T6)kQ2X`e@mC84Nve{jUps}` zuOF%X8lb#BlBENv4*DiUa$4-US-21PsMZRI*Hr-4`&aZpa_@~XOY=Mce2Dy4B-xcZ zVq#DT?lpND2&7XDG$U(p&tA$h<-qcxtxGN%V(e_%_2jFiJhy2$&a17`usK+;2U2FJ zD&xsPZNgteF8}Z}Cw}U`w_CXWLhAXu`gTj@B=TC@@&c0T{zB?G2LG_)KGm2YK>>aq zrTQIaMtq4bD%3EjdIV@VzS_7bXuhkcE8*5xq*qt}d8uWG@yE+gD1ggQh*35eQGkm? zLAXd#-!?CIpDg!Un-5p7KQSt@j++jRpQFQayqNjzmN@7r;%YEWU^7>hwYxdv>C9;y zWg8wKBbXQ@Qxq2>lR8_^j_-hWlEMq+MuZHw3_j8~z=ys8KCBC~`rTWZS^>{>#A7fE zNGUKd9lvMn@1q5Lqvy@%rD!-XXK^$prr2P?%&EFeVJqCGSTHW8qc|@@+x5IHoc7k1 zJge58pKXeu-KUGU(+6zBN3_F3>vEp@kH`sP8$Mtgmxyg#f^A%aZTtn>@Nuy?#x#aF z{#S$j9P97m3KGZv&Pc&MU_74az<2J@osX#eRkA|?Uf}mdd(#uC^P^7BJC6!JduJ7l zvD~o6$~l|Gj$$yw0c481vuNvx_AfH^{JYz}?|!(kZN9vm*JubCU|&Be@uzqqYdgoH z*$IzU(Er6OrTFZ15dAi=B7I$e=}iR_666^$A%R*sSjqHlN+pr@!NkNBfT-7JYBUp* zyhgkTr}ui@la_H%?6ViM=ru!rpGsB+{-SBbDzrJV}T2!PfCRN4jpKhzP z@2tZWzc)5K9FzBRVZyuWlgIJtV|T^hzkCGf#$xjJ@y=9|STlchd;fWMao@*o!fo7z z{02H)Psc_*(u!CSDzltR5sgm&_G<@e8K<64j_(JUeH3QP7CUrkmwif+yiM1T@1o<{ z86^7LQ%il}?LMUqg_jcauI_;ivLQCe1~$kBHb`1MfXO!A+7zK-MXJ~twExAIF(ct7 zY0mO>bqrF}djze%<{PU2MjZ&@7i9Ub1|5J|?NrX8xjV#F__cYZKk8!ELgEw$`H5k}wl} zE^kg3Zvl5tQCCN?N0X#EjNK$3QK?s5MC_jx>D%L*I$voIIA|3YUh4uZ8+~nJ83SoE z3nK*=(s*iy#?v=wJk9)w75vuEU5t6=TI%}6k^#@9B43Qw3cLqCl@)Rp#L%GWm#Q_dk_S%Tl;>nJjKa+Xl+X>LlE2=Ec=z z_H1|)D0#V1gTtdi4vz*7j|TV(LO48{@z!Bua~hp2=>djV*^s`c zaiZ_jj8=$60|~zn)^`}L_B~kcV{jVPfX`5zR_XGbJ(j@8wmh@P_V;@N=&V;T01PE4xM5)po%K65(Al-iOYrr*-z|X$W=W0$KTs+JC@^P~145Do@&_k`a%7;*Du8Hw0%KL6^Qu-6STEJw51mq)gYk7rE+2{Xt0W!ubwU@CG>Wu zus6et-C@!b&c3mr9_?(VarV8lkzXnDGI$ObrDsIVUoe zZC{GiaAQyoT-ZPRK~eFH0(1T>gr{iZ=k!Uo0>MwDGerr6TPH%e1q0!x6+Gl}Hy8*v zx#G_2{bI=xwt6F<;NYu^ zZm{G|sbG`#@0UMF40!DGU5}=Y+v$FusN~e=ZBO~pPjvblQ+PnDE9+;_%&e^=F;__} zB?iy}atJMe0ki-uhRVbQ1H{}Ah`Bg2cJDl;oWiEq_XF=Aun|+gXdovHMCZ595c;g< zwo~JXMU9Qs?04P6!@JJ2trw4vnz3azPnAzSd{y1gmia)D%(a^86U%(}1hbS*^b;v^ zEOw9C@&`r~wIa)&j@IRp1nFg+wKFevg1r%ZKJ zgMJH78VukPEqeaM8)es3pq8B+<2y1!WbZAJk9x00iI8+PD_)G8v}M%O&PS{5tmOhT z73u0;gRX8W1n&9o5V%+GT8hoxEhK%(s5?G$x7L+{iy4gXkz%$c3~h7`ycyWTV{Lw8 z|H0*h&=@Cc(ke2)A-48CbLKAVyS0*QBJb8m9tQ`!iZMBTzM3v+nk$MG_?8zh@F{Vz z4q=ho;KZZCxt%s0Lh!O{h?il5m)%9Y>>ha8UGOr-1?3#@Oy8-`iU9tjw+E9-oEu3;tXv8w$xi&vsTOUI?f|a z@0wefbW1QevU7M^Ls2rBuWG};m|x6lvE7+0SM+*GK3qsCdh0FIy|%=gt-Qjznv-8$ z^8Jt7vXNaOg0h5lZx@TBRZa5SY*ZCrNQP<>?xxeWId zNi>Hv@sAQ63Ak_i=44y7JGu%LPA-JV29es$GFSo~SEzBoS9pB4^< zk5zAv>tv{r5d(x;qXuuB0cy=^E^0ht2B{7oN7Nm&4&JwIM=p_q z13RTMR7gZbHiQZ`qz^fR0XTy`ID;2(27Pb_Rmd59V2Je(&UhLp0B6ug4AJQhLCYuP z3g~53!&?K_ zlU?Fz?_l4B`0oqxpYSfke|m`j-LHrWHnBlrjMq;JFif0#G!v)QH@Tfd1Ez9@*`j=* z(F$<@mAF3hlS{mEFOM%aJUV#Y1M5;!{7WsQd-$)TO7!3m8{E!}1q!&|!}?9`z&uPx zj!~#ZY0i6?Jjsu;!=!oS{-i4|=HUz38rBG$#HVpMExb<>?FZci6l%K@0nwSU2zV*m z$U;Y-#X4`(okhULPAIeB^Hkuvayd@woUv5F9bAlSNt*D?WLJOS+#VjhJjt6W__Q<~ z&>Z}6BOfQ|BHNaE`2MxxtgmTxW_sNCaX6CGlM!Y@{{*G4Pr`MA8XvvbdV8zoP8$a$ zZqwIyv$Mg&%}hbDxzhp=u9NW(j*cu@tMMU9JVT30lXw}90*W0wPKz-N&Aq29?ms%pt{=JkV^ZzCT+XfyjCRGH4Vpx2XbF(O_3Fx&b;k9*h$BP__tikhmtjf*O{|9Eh9;qIaOUp@4LG8Wbn={ur#m6>)*s$(Att~Tn3oW|=7ux)8yY;^z4 zpImg8qsbdwod4`DDIQ--eolS1%6Rtn?$({W+Qdry^|wE(m&gmc;O3tJVNB#fYg$=E z`}9Lo`54U0{k0U3PrLv`j5UCWG2{c}6O2beIA2g-l%dH0EsNf=+pTu5JkAk|mOvJN z8vst@MfvlXNHar0yYD%Fw_T2q038G07#^}iB_lFM33Wv3zTT-)UX%{n{&W|DK$J#>@lFoSZ>0U_I@-Gu;|DXAb^t~=uvD%bYB?1Qe9L8H!^dJ7 zq{HF?FO5n}hOg*v>C&0-{kVa?_YDMUfSvfMA6rTAK=5<=41Vyyvex}v)_TCQ)&-U| z1F)=hzhi|CM*yzIkt7*_jEqtkfTh)n0-#7u@cky@09lw_xDwWNA$YDXAMkNHSdPR? ziMJ;2S|OY{z zJN15$Z~GLC1qf~j1P=uRg6D%5TnB>HsCPxG8+(HR!F`{Cu~evaVX(|kL;z!k-w|n5 zYG>jz0t5r_*|IX03}w`(U_C&vV#2~NaPe{VeuM66TdY&WZbMG$4Ybf;I_Ah=Bl2o3 zE#TWAbxI|Tb`ilqO;PuWNPePqbf0M!9T4H@fCz^Pq*-*0k)2pg3p$@>q$O1Zz+`D( z;epUb2LazJGARO>5#>bM2|jSkJJz?o@h#cCFTBumTm)DL?js04uK+TXF6KvHn9fZN zPr%B~R_~>)$!met!60yUsqwo5r^kFSa*4Xdrzs(`Rz0zB+18r zjw@#2GgR~O=@kTMQS;DI&#yX)N5Ij=OS9k-qVFE@YDCD`Rr#%iwit^?m#;1Yo!z&p zNPqR})U<@Ht3;?#G-)c4EFRQKot8KosN8ES0M7|m2JpWzJiE&_ud9Bj22bbc{imaA z7kT3#YokNM*Qwj`c0ReTnEaH&YdCMe)h-I~zk@>V=FyR{e;VlJ2Nkpz`t%ifl1s4^ z(u#(}89Cx~bzLiF^ClA+|0nR>?|s1+8bd}vA|3=S)Z_C@f^xA3E5nlISHUO5>c*IV zTH;OKGz94D-g;3(z=jDn0=f_GbcNKwQR{2<2p2&OVST~v#~UA>`{tOx^!7<3Obtm= zLt0W9b#RIY2V<4D?}_KKromKp%GH>u<&y@$w>|y#Xdz zj_yySId^?K6|Z{TAS?Q)9w?*@SNI=X3DjqES>rk}+W-KWz+cf{1NN{mUMGTLZ1R^W zR(oyo*-9ZFx$73lg1183Byv*y<8r#caNfo#W&G*=-_!*E`sSG59ub1I? zTu&h2&H#O7|4*PPh_H#k9{`$!fIjQ7#}zcq@k$ZNUAZu^aI6d{zYrtzv4@F{up-dx z;1@!kQJsO08Bv;HMdQhZK6XL#v{ZthaWV#ypU&<{tPgJ=X+8j zAU_Ks+5r16(2~zw-|LY{x|f{sxKDkxB!p?fF82FmhV}Ox7?w>p3kB908Q>~ z$szzOOa*`KsH@th@3o7C8+ zYSRGQ^}Rsl5&3<5-WRCJK6-tx4Ne5@erv+}nu~;fY111NUrW<}bj z<5eyvp+DAE9`_MIjpQGJ*8C%Y8ojnAglx(FOWXPfeK^dwK3miae8T^8Eonjl!tu9{ zqAyel*DlvV{|l4e8o!RhV%-1-4w07JDS>ivABx2J6N~3#QLr@*ago$)mmB-Sr>E z3M7;N?MvxI+S$17&49-IfA99WMbEo?1yWlQF|7zDuKPi`f57GPH&nQit~4V=)D+52 zUp_6M($vK-OzX)bJ{!-^MfnL#gV!NH-0A+6ymFk=_>q_}P*A~rwwOK(DixrhQUVGp zDu6Enw_4Q8&Ey4`5f#wwA*M>BgaiUEIs~L}Z$bd@kNIzC;Brbui3@rN!AdEPdPG@| zh*}B=Q^J2z#f3?p1^CKcXT8uDPIi9f6BlK;8H^}oLihj}KxP0C;?X}tJUS5K(SZ;T z2at{eTz}ZJL;)B8+}u(?K(1jnI*?TO!B6Z~(lNr_^yv2h0Cqgj3|#RHe70oZ`X?nmK5YKu3Za=tzk60v!oyVM|^S;d1mm zV$B3^>hJMN^v z+lI*ZHTBVakx_n}wPm;SBwvsQ2u{@NB|-l@{x{m+{{k5Rv_F9JV>R=iT}xj88w5yx z+2nu?#-Wfyz{-AsYJ-||j)g#zVw#!yGibIVOm1|lC6NbxAt^@ z@5=~%MG<*mnLDM2Xefmm04~~`1}RE{DY#l?u817+nKd#2)w@j@?F23 z)yEJ-w5PU!NiC3PUBog!Z5Xk?Lb!vENJ-&V+z~WrU6Z4)kf(Ho0SQK5xo+E9tWdI{#S*A^{fW{Apn> zfQ2~&7RIwLQ;&2pXHWTq9j4F>ATI(fHa-`?oB?11h9HFp!7TwWFkb1p#KvE|(y`gn zywaab=aT%5g1}L037J5DLi6^Yu54WctkZ*W=FadZSM4ax$fpf&_NOXrpf~6( zl|ytsU*&i_qTO&zC3Ys+u3oPh8^d$I+ZlpDcsLjCT9OD%^L+c?_Mp%E<(C}6kQ*+86!wH^?(j)nlxbBXiFjpBGBmx3*&p#j8?>}y__Wk`^Mz`dCC{0L`pu+==^l+OB0|U3W zXC32c<@WYf!S`|%c0+oFrF#-9CZA>7Rv5->MW{Crp#xV9Frm_4+p&L@9}_}FA~Ao; zgaTwT12O|YWrhPX0|1%5fK0znnXG`!e&Qy8kziPi4afx82oO-Pfks6*O@-irJ=?R! zakT88GW$Pe`uCnWlC(@RELC_ql|Js7>whr2OG*J$-Mo~vK@kcx#!5z2T}*}Hjk?+{ z4Rbm*C%`AO13vlO;@p)^&4kE2@6K=KfsDZt;*uowZDb0!o72=H+K%>YL1(iCUlj!zq^%M|+< zn01r?ylJ7I`fsm3>b9wF-g-DqQ{3bWa1Bx;raQoxoBv5sO}AVf4?LFvqR9c#l%FOE z`zab05Dg264*IPsFH#fNGtG+OHLtvJo{FPhC2t3H0+1)A(jZ|wx8KE~TiQMSf`EG} zY3zk96mm6L9st@Vq=pq&V(VSbY}k8h!i7H!Pxz+5Cl)e&uuZ7!`gwN57^ZYU-#jz?Usly~v? z_7oNdjc3yT)B0*)%P=T{U>leK>+AcpzW;RA*^HDzMAMY$PnbyL+zTntl_%3?MoY3w zVSU#oHP<$_C^eA{Dh~AQzvOu~hZ^@QBIoZP_j}SBKAt^K|7Bk0lOfqDRT7<0AxR7a z)EeJZ&EuQxqQwBzD*jXp15m5}79tx`ZOwNhU8(ivMMh1|3Zs%<#r7eRgK_|6mwXKPZ*RGCEeqWbA#Y<=N4TA5! zx|P|THr=-P9haB42KiIl7Z<&=;aLaJnKilEB~}lW<3fkP7kom9ZC|s zE%Y;nGWf=1zmp=ZpYRy+yp415|Gf1kxy8d+jDpMZw#=nj7+q)Lh`&_V8pAEbtBbzd zFeZ6toFUo3lnli+O+iWz>PSnQ{FjY%ApD?rqNGpDNidh0a28h_FA>@qwV@Kq<|-Dt zK%FnTQ6?Pf>SRwoxF7~vB5L^=ZslA?_Y zN4wews^E)x3WrdC!*?9jZN?8y+wnYIj!ACzHw1aR2&p$HBqMRZr(mW-bf$Hz&L=iL zc6d^aU&P*Cyzb(GfPj2_{O2c0MP9L=3E_=aL&4sU{bX5kL4yXoP`XxLhr6J*SVwFr zX#oR#z;_r2!Bq&x(LOtCz-L;au~FT2W?3d#^N$UBewoG$ACKMu-GO7D(U{p#KSQBN zHhe3(BPlWBK_TA5F&$qbtHSq7)Qz>lXBPNC0l9udVhdBhb^lnzpVm}ZL}Ab@1$1=b zDT5vK?AuONCdDmH^YWsF*!ye7nZt5SrCD`T+fEZAo=PYy&1$0?&2;7SH@lWR-EEx; zu_`|JE)Su~M`U&)+mu;q|2Ut>NEio*Ms7qMU$Gp?ZWtY{PD5zr?`Ozou|hUXS!Q`n zwhQw%TOAY-niZNiy$}VKU@!FS0upnNCVM?i2u??h-nFalq8({f*_BSgOfWMa$^yPs z{lm8Dj8xh2iu}&$WmlzMo%K%yD!8fDtu$=9eP;QO60J%D6C>L;2{>+1wbD}#R>LZf z^H{D$@M+fq>p`u5kqs@)CGRuF+aEet+^(9$T*@=TjHW+n9pIm@0USh0790W{1Pa)) z2m(R^QYVght_uwU0!9J?f(ATsw`O$yZf0ZlU%$)@?l#uv-(+L)IKOm3kN6TlGn_3} z4foXNl~6uJ*|?iBI_^s)We~cm5|`n?`}_BBAABJea;-~+d}t0OmhywpB1?V62Ir_> zA*vI1m6eYvb+?YiQea~3iOP5`*Q%uPsbtXaej+zIPJ)s4ScNTLq5&m62~zyQa|MAs zT%bZLq_X22fukr*sfCKO-f?pyxpb2qAuWP3QsRj07NAu&sNY6M$rN?K-bGC9&ACU~ z3r9HE!H4mPa7R(8TcL(~05Q)dM6Don(YX?(08_4B?xGgp+k}g2b>AC(FD42VTbAHy z*f$WL9de$;;W(dIE-{{b&g!qgd(s8 z%keD#ccfEwXuFddyOs6myP81GTshy?V4~>fZEsULJkwd88*q56aH`ns5@Fo zt%dB1%>Ga6JN0Gm>)qZfi`|bL)gh>DWt-_%DZK$A=_PP#{Xg)~F zIW;p6n$I87^PF;ccanUFxi|(QMz}@tUTF~N`Vx+ns9I7NOW;cnm%w(_fywZn0xdd> z`w4GK1^jK2qsrmnB~Z6J-IUPbap%h%T{@d}@F>NfPX8QEA>3PaK`vBs#(d=PS+7_# zY4|9qm8E=#6=7~FFI8m-x(VmPw-ct(pOf+li}h2ZPU;e+f@cKei5X~f{8222IYVQW zVp+G!q4yWW`Cmh<@KjKkGQU9d##i>YO%O$1-=ob(DA%MtH6 zw{8|$HiiNko$HS-cx5*gECp`H&wRiTwYDm(#^ zc5hFQF`Q{EliPBf$JHIUX13$wZf)z4fP$@l7g6^{--B!nFE6g+PHj7F6N6{S^D+&Q zKTFP>xA9aO-;YylK>FTP-kz1t`&DDm{p)I!=&+30u|&i1sm;PKfs=J-<0Yu?E1b-I z858XJm(2NXgh64i*{J4bsm9`KCgQRc2BDS&gVD4-jq+;S_jtXsUX)>dl?@2d+*FGt zJPO|uJqYv&GG(Lh7%W(L!E@L3Erd`{nwwpY{@$I|tF;Ri5|C9oJ4M&dF@>b=^6_41 zyqXRD)(cu-R%|!!#DinasQQO$B~NwK>R-g6T8p0L5+K1Jppyox?;L>R9J^yu@3$WR zjEK;{tvfH5G{W(^#xyP>#oog*g>NfGX%ZMjLyA%$O*u2ZWeP5f7>d1C&Q2VJ{HK*; zW-QbkA7TTMC4F*4Y{jTWqOqhw((o~gwqpzTrUlwcx+}<@XmFm@c_L*OGz2{|L;a$M zI@vy4X|jX6$X>LWq@MI+ia?J0VpUU(BDCIN0+V@45&hQ$Yb(iYH22|;J@7MX16D5Q zwcuf=pFLf-WiQVK+Fnznle-hnTH-kwJ}f_dLp#jW9m04t%oc1mYs`9GF4&iZ^F0;A zmok52aiP%7M~vdnHx90`RdVwZxyZK<1oZqBGYQ?|un1a0v-A2Jxc*eR2tDw7h%MZ% zdimm)ozE-whzW>WxNLDD?ALWOcm#0+SJw1dDC>Aini|v{G;O$5Sb++$jaq}q=OP(e z+>|~~E$XIx+s=jPd`}l_b=pAv3u=5i8ijIY*G|EJGlb?b#;3{0KjOaiU3G07JJRXD zB46tPj?JB>6;}JPBs$D-gM`gOb&FTDO8X{3a-VRGy5&E-&bi!KJ0yufp9Rab!Eb<*G zBLfaHHo@8|(jQ;i1=1o!{1DxYmb0xU2ast|d_A6Ta|pp-jdbj+#{0k!cA!`tqHhj` z6TqBoxFzh5Z0NAw>+igWd#;ab3Jv#khDeDSxtrON4#M}bM=<(P3GoxnP=>F&?Kr{b zoj9N*oJ`4Hg@?aD4tqbk9C&syw}38W<>MCDs#3fwEkE6mH?nia2Fh*0cYN&%bogr5 zCRUsbt(nL+%7jeTJ900fGL*n4SM~E~312$d`wW_NjZ%Q0fgcMx;KW9c56$T4*qErR zeN$1B(l>x0#*?2P$`?iu0Z$tp_yQ9f|Jp4if(~?A0e$t3mQgHLzl0M}ysd1%@Pp(s zA336POMwp(*m|Nwcn_+`?Hw0or*?*wmoY=S(6E(}c;sKr+w{^imbV|KED`sIuJBE* zI?P}te5ft~>s-npMb{uw_$v?DI}|}JxjQGQ*_nxW7n&#&)wpi_>*VIlY;FImT( zf1{DjxXgV?uB{u1l`8ceU-@EJ)ZZQ__^E?KE1OFR-C!zOIPXu=fpeVnYd&PFPg~=iheQGR z%k+?LXU9nI80VZ!!C^TVz7YNN&)76i*Pz8TUO!;2QoG2%3d4ZP^svlYf|8x5Q09?V z(1ciiG#grTJPc#uRp}0sHWNEo_DUiW1vecP2!b#Vw0+f~N_d2lpzz?x>&AF4Z8w8r zFCPk+K|t@e$!a?|V;e!`o}%`4!nq58hcZL6(}odu?KL`MZBl^+V}Ln(j44|dl-^fqWJ6`(7wD;2^|O*6fHuFPuKLc+IfN)}i>I@>EufxqUE zJ4@mEO6r*EzB*Z&jHYs5VrRWsr6>0?>`%4yf(kt#k{N1SL3gyeNF>wNt6o)WoT8R2onKMw6} z@mp>BZK=WGR@2c%*B<4rt#FRFd-Q1mZsryFF@jpA6V9BP?)cL|uchByU>kU7#*f!x z|9!(l`&1-uOIw1P(fL4@>@%93`kqa7j9?i`9fCjS z-k5Wst49rSNHB^5@J7y3?yD_}Akar#0zT3!kV+4#{nwUrx?G*rLzxFEXvJUTU~dvd zTm*=797!yLj;w~QdC!FwHs00j6-U=%zLwk%bW?E0#4Vxy2#Vm<=lIMOi{6^4_xDm0T@aq}Td_je6g{K6OnJ^R855;J%icU3l0m<^+yYaD&( zZLTUPt#=UF0@Cwt*_MLb5XU}?b?h5-p;{!R6oa}5B5r2+yL#*FUy-^{OP%dwMEUYV zvJq#-F_ioa*c!;ov6q^+Y;btXAaPCteebH4yI_BS-s)GqCQl!FYXy$z(i8!hl5W$% zImA1>KMo@47+>TToqY&{qhIFG^CkB{(ZFJ(7pDF3DT-Z`EYvdwk1Uy%^U!yVWp|a2 zMtsG&*QoT0v*_)o76!~MGljRa%B30TZZ1fQbouoe6{>MA(wQ#o*ksFBrxPIgMK75* z7EE|fi)G5lCt0~qYQKdFaq^-36s1Yu-t%n+l^Bn;lkn^I|Dm`R(1ffU=B6lVMC4fU zMR)lQ*-;hZLja0;+9)jFMjjshMmVdIK1c=us5J8 z4yHPuT*)?r14-fimURc^n6|qk{S!{ip$^P5xU5TOknQZ*K0-XplB1ZRIai=P(ts#u zaFpTo#v>}fT@i6o$hW_$q33r~@8t&)fc$4Qhh0N{ua75mceyKZI+G&jt-uu=I z-Mhe9C_u-)hzZAp`-!KlBaV{ev5GmWT2wEE?_CnXi|=&Vn$K-=Wa*y#q)tv&eDIKmJ286B<=e6>E~>xh_ZBT1(6qZKUvsDuW?K`!K>&r#=@Au=dp5?Pc< z>dKj&bRzX6pfBG>8>rNEcifbg2&E0wPEr5K;C+b^t#%lfK{x2Sx@dG(ODSQyIHA*Q zW-xQaXDsWCR{q;x{j%BQV7zvfla)Bv{`~^%{;&45PX*O&f+(rkY^_m39N-)xhc-&_z^4Lj~+$`MsZg}dJ3f~qrgjhyc>L3&a8I|hat+uyr0 ztc&~f7;jZ^C~vcdK;7w*M;H?g>!Bri3>??ddu6^3(CqTCQp{FyJUpj0&wirjrtT@c zh1ouBTphgbs}C+Ti~H+xhUUPJ~qa z_trT#rt(GzPp}(l=yd${tfG2U^y$FY{;bucy|-UM*tI2eykR5|`PqW@D?T`+e!zo`WZ(#Qe-sjGgDP( z#~-#9|4FVJv(_B(G*gPNF!J0+9tPQP`UAhNef_519FSkypM+!`-&|s1%@&uRXqk*(+DE1gf0XTsBa)5DaUA?0^>b(f5;+k`=agh7^}? zlie@7y|bwXri0#E(PK}K?TkLH-VTqCk(K%fx5@%lhl6eg>zMagirwA5SBfs3W36ub zzW)YIo3#131*$_6jZ>B+7xU9@$JLuM4`>A#hKKKszwH-zs-Rb_+&%838ockgr=;F8 z)*AuG-n(C>8VK%>o_RbGo$W4kznqRkZ+YLm<(&R~5v=O^aB}df8ygM;?>*iz$>1#E&iZ&^#_lOas1d=##ar5u$X%^)JT z@{XhXEBt)zyfGR@L~-VmCU_>jU!Tk(Uv zOMb+{Q75(E^W`kk2zHNRzz0q-<=!$K!9=%qZ}eg9>}V~vwNm5hZo`vA^bCKEpaQ&RBo)w91Nu zqs*A_(x)4?#`F4e)u%7e4y?)GRtY#kCM$TfenelIu z-jo1+gjreiM9IqFup>_u>*0k(V?ca@g)bH6BFoOk?GFJ1v)ATCtyehbC3zVV!HIDr z<}8s;pHsV~dG(jcmjkYx)O))0v2kO4`z)f%6&H5Bf66Df^$dT1Gr`U5bY)Nexh0*k zajeB3!*@vR%x);Ea9khfILgdyuDo)f?04K}eOB5Z;y9_3kw9Fz&eF`RG*|CTLmzit zwYWWV{5I*LwwCDA5Bi68BKiEzmFr&T-6o4MwT0gs+{t0rL#8Wwzr*XouA)mlhg+R9 z>HG_IjzoCUxj$>D-r;%nh+DkXgO3u{_}ON(1PFpr{x<~^P;6H)cwZ#>kG0>g zW-kw^YX*i1W+fOj7XC9H{L@n}_X$_A^pyr6OcD(g(!5*0FG}v~8=cz4(xuCy5wZKW zSL0mjQHlO4e+x&i8CTE8RGdj(?8x{k7=*^3#3dAEHccBw{ZgjwbH0P4hf=K0(9lpp zYn~t@@XLqz{(v_g>0Qqtjoj?TD>T1T~DC|uI;jS4M zWB$S@8*6E>Q9BH@;gm*)uBm8ucU8JF(<0I*!JWjxhD~=ZtG)VE6>If6P>77;X1d~+ zak`Y>>re>N0OjO$^PHTjC0Ew|c-?r|{QZ|7sbOe>Pk|HJrqcrpLKyq}hZ=n3&AsQb z*?Vj)G_EXF|BinPmIx0`9a|~i@h3ZqoUVQXuAmJa?baNpFZ<qBu*wiik`}?@F*+si=@oW*rBMvv=tnU2X7~PI*n4?tUucJ3lxJC?T zW~;!?dZMfx{wiPOz>gEUzown#DzXyA@4`@c?LT=Xj~N<-l_wg!$1GLzbdggJaz`|@ zTs6fnhXj&F21)6A(tOr#oHLf#7k(k<*dH!I=1zN(&k7`MB&naNbI=}{Vam0hGwGO! z{zZT5HV!yOK_3i_JU<9+a9d96chM6Z^~u<$_1S-H#mjC@M_+H4uyplhpN$$@)$CiS z_h|CWcg`9>yFYc;ZO~Kbt8CwX2psW^@lg=bLc@OD?Mx_`PJLEo|iO3PPVFl+;)n%rFn71Aw*Vv4=IFjU?OvC2Q z@irJ6W&~z6*D1w^%+WH|=t)E&vh6LatIG9FEETn>H>478?W=NjDjTNv4~yv(NwI$+ zb&CUo@qe#9#a@~pG4rqFv>}8T?;o;M@m)a7b_Mm zzKIerS)r4Ajqhi30HJSYx#cI6Vw4wPG@rN;@mfMDNNXcFCZ3OtI;<@F5zJUk(|SpD zrb1ku9^aF&ArTW8y`b9cU%`;sOTtxZ3Kton0-7ne7oGBixc;MZo72?Gut_zB?qlSY zayj*7W$XRfm!(IaE*RXMvx1U}A)NL-8@E>>`lJb5#rgq!H)ur>0-DHLw@7j-Yw*^( zEgN&ZV1Apa&hyUOV{l>L+D7G=IB%v!C)70+W|{cU7I#zoP<&@#k{4+*^4jX(EK^+R zJTj{T*(0GBMFh6a$M1!I@K>CgsaVs$4}3@7IV5N&Un^Z<4J&dGs9UT6wMP}38BxA@ zChny{w7fRcO>yZ|z%e!X$VdNX#+Cb9yOG@ws?m86T=#=qmx38q_jqiqaWr|uG!Q>s z;`nLB8OO@KDf{5on)uo#g%OE$WUc78fuYV~#M$ImWHhEfDeJlJr4XuLN0ZuFu=Q~4 z>!K~BqnFX^c?<(om?-vDn{41O^?xRH!e)?;IQ>i3m2}3$aeXGXu9_s~yP^V0G0t(o+LERX z79-ir=}7+gn`}xND+|sF7RJ=IhU;H*p7V{?S^mbBe}o!;Rk%OqW{RI+vobCdMJiy zjg{k8S-?AMt8sD4s@ZUqqx^%PI5T^2(BF`YM73>YlW9W9m!U(^9S8!AWEqbY8kzy6 zOcKhvSPY&}OKfK#<&MY|2+c&oJmPx6G4uU}_*XdMZsN8U(ru#K=r-D=p|Io1)*%vA z=yb?uH|dV{w<6q&xnsLYSZm9qQs#MydN2P_m)4IEgviJBATlf) z2ZSm?Y(i*}xVgyFGZEJVLWFrcGJdEcg}ISY;jeQUQc`%lwm+hOAO$&7_wK^`#ntEZ z!dYYD@qVO4J1flCrTe+gk7bm&%;uEY=~?8exCUhSHs75PQ- zs$AVaE1$mye**gNMQ+e2U8;fcZ$r@5(bV30x~F*(Ij1Bjkivf0X42=M{m6KS$Vl~) z{d~-1K~u&zMMen(+UVtr9{;v>tG}woZkl~XX4a3<^2q267?*g?NZ;C~7J#feNc29^ z=>r>iU4@q1sx#GL&ll4cg80HPU1!7n=Hb<*XX9;V`)HpqJ*@jSzyI*V)s?>8WJHqx z=Sc6m#u);c?c>dfUH5M-Qo>eUv#@L2hznQ-fqrghL4&h!P`L&9TH?$7EJQn_nJ5Ub z^f%qARHw#A%K$=r#p}afl#v^$$+qZQJ_7txp{FC-k0a!FMPpWfVY5NXt(dJ}mb9Q4 zlQ?cyl_C8u5g=W0s)1L#3P>*riZzjzaOkrR)6v{#t$`Yza(H24Gv2z{#fYZae|UC9OI5|F_5Yjz?P z2OYy&I&QD;79_NAKzWXE>ad$uWTL^--?m+k;wCj*g8YB@q4IcY=#ha#K;kGNC#c5M z(}GD%Eu>9NUw0;U3b~1`9 zd7LM$o|5u@7$$^-ecwaTun5m7#Dd}}GHQfEmz|O4*F8C_oxFKT6xDpGDEJBpA9~>* zn%Br(4UK>3)%y_pyGHuL{Hpfi2E!E=d<{ z95b#A!Jx~Pt5pXz9NbQrz3sg;${w7(A5e>iC1T?PSMi6;Vt=P z&JNa4Oa}Ucw#TK-iF43W(27s0=i9mHI{KgksVuwO-gR;*+K;IFzrV#QT~S+dW_DET z*$v~zK1P$7)$LTCx0$3d8urPk^288+texM=GfT1}xq%|ZhUPwVh@_Zn3L z>Vup+63G#jbvxG-VGvy21Xn&^As1!DiQW-4Jm{qz&Mw~&8QeBp8g#I40i&VUUufan z+n8)z@j4DX>fd`aM?Xp^!W8{Bh+ME-ku6fpFI-u4Txn>c89|guX;~Dw1uMrFS6wzJKXmk; zsuyycEJje71zgvFr2BCSjs!vo$u+Ua49aE6Ic|@#Zr56V0_{Ljg$qRv&7f8*Cq8mF zc6b*sDC2FG?w(DNKewl z3gorUjP|$Vr(0dt$C7+iXampM8LdIb&vqlPe7_e3dJ#gdQvHU9{-)>c2zRZ^@Vr^R9rB|5zXAv}%RcWgb|d>VP`;!49^O1<6> zlx?P~Q8!y~@EtCU>ByT+bqj>49%bzL^6XH$szysmyH*k2;$!f?i;aJ&?hRdwzS#K@ zAx_}G9$kVL#;b@qypP)`LWwqZT9?3g4@FmFQ#fCJmDl0LSy*(O{WY-+TI8KQ1fI{$ z;y?0gvoV58h75z-MpI@vQ^zq&nq`i*?%(8jE@aw0WG(UiVj^q9IFsrkJXEHYF%VTx zPfyv66q2M%EgP9feoo^dVvXE~xfdDy@Jj}!yF4ki1MN)|w?~!XvB2U5LCeOk;V;G) z8SxVpXlA~+jm2Rsz6oYmk_G4dcn?0Ep7|H#TAu2E5(BN}6nLwBo84HT7Z7qR!Fih| z$J=xf%?RoXgr1nfjbu0OjrV}(!lJHnG(XnnUWU(fhF!z}qPMpn=eyb{W zG&Kk^sGn!x$mP(O52n!V&C1PYA2lf$OSB~#ND6IWpUfa;#e9FP|qwk&r{G z82kC4$Q21i7i9K4Es~}lu+m6^;f*3HD+O9oA+dYi75RC-N`i8W;6Fk4vqjPOgFJd@;{U|-(V1jTX`(Y6x+Zr<5oqR$GdcMEy zo=1<&owg$&4N1E|;nK?*d4rF*{U8#W=17I;9SJh=PSJz_K_h@C#On2WOZ8&+WPKy~ z^EPd=qgJuxCA|1d#k18c#n+i)I${OHkJD%`n<>R(8_$IM@q4~8*`I#Wuf3#^u*yWS z4V?zI!&H5yKJvIAYyn893XKCr$~`cqb^>5Fd+-OaaT0;LsJ;2OII|yrjh==yNK=91 zY+~DPI$|hIv9{CyqBdx;J$L-J0c|TmWEjKFag}&Z$Jc6AHylTV zNj?e{@#EQa9aX8;&<~X9@*IXLfpBL*>N50~P(U=gUmT^fcl~k8#191qwiH3+AeXrF^*Fua!^#h9HCc-< z&P5%QqH(glPGApq1|C!jp%#{8Fs~)w9M~vo;nln81(N$^x|o$9bXBZ zy<;tmPLO%Vr7X_WERh9q4JFw{bK}NuCI0BAER)U8m4v{XG=uV0@PeFMd9@y*O$Agj zagRhf6vN`_K*DkeGRqpn?2R99#WqGRD(VZ{K@(-}_Ac6O8XgjA^H=%jD=>{OvG=E# zGLElM$7o+}9yMtXnmN^7_%eQIhv5!$u#SL9pxQSRdq(9k{xKBmT|3Rl!4F^|9_LmT z$EQavkPy+O)hN%+meFl4nXm1lH1u3%c3;k{oar@V7D%a!h{rFpn$nEcMzv%O$QItRpQ0A3Fddap*l^f<}RB{_> zBybX<%Jz?^;uCG(9f`r~Z@+7DhDMwZt(W99B_nE~N=`nkTc8gkDp%AOSC1+3_163| z!k8z9#Ze{d#A8yg*Yn^L4e_=iMVUtEw=OwX^=iEOhNW0aXBdG=)*|I`Qx-Arm&E3L zJNvU)r!UIBO2#$A;7f_pa8uIn0PlX>CbR|@M9wRPoP?Dx)i+tJli$M*;IjI;jXM)- z44LRb1!-Y7xMYyKN!8S>bGe6hLd*k(yyhy+zmSEkM2+Hy?UscHrz5F*2JJ+UGq)5l zI^Ow#S4fj@D@m^jC8!AZ$%lm|S`xZC? z1Hu3PUjR5j$G;F0Dg8^;`zrcTA8k%QKJq*2mhqORYxQ`61kk*9=$hOY~~$q zi0p^QW=yF^^hq+T!fQo(T^6M-T1Z9<6o`k>z1$G|G+xjtaClo{6yT0~l5@8AExAh% z_BTi&1a<+;*Hg|MEL;|lUHLGv`c3!(6I61>KXcBL&FlLo9Rr4fQxGa7WX(A!a#`4A zOiWRKy#^FKAfuk_eX{cT{kLBMipkHWEaoVC5$hD5TF|O~8q>XEpcmuIExx#kj`waX zrVjHUrcDr+FfltZ5YndV{p^7;gZ=ri_3@r$>}q0_shsF)%_cSG<@Vvm?3vMWJ%&6f z7z^GVHpz5YVdF<*EM&37j`lwlGRJzD# z(#xco(e#|IP0P)JFdGbjL4ng;G9My}R`TzNliC=-0p7+SBzY^O5XPv%q{cb!ABngA z$IR=^4mKW{0*dTRw2u4ApEpvn<$Q>OlKF>=B1|3%gxQr z5h8zBka*|j*7~D$c`=*u(0@9Xk9U|K4#OCSHpa1>m96jUL+qpD#Y9Dlht<{gui~wd z@~m8sXe}}GceC*A6@+dp zmKUaVCRRzLW<`vwDBeJ}jof%y{SH*o_)0)}8+=qgmzM=^58Smn_EZ;W*ss#`tiE;s zi3(86Qb*&`%?d{cOWTMIiX?Hx7$7_eq)LBT7QL661s61C!;+FQ1p)pjoXZN$PQbP( z2*U@fkfYZmnkhpLL7^OVC3l7BR=udOJfN@{qGe3Gc?5^TcM{95=v33^Hfs*zv z-n`8AEpx^Lj#!De@ey>aq3%S%M$9w)p#lMF$}ll7*6ROQ=Tv--@RJ2fTjm_f^aw!H z!iPi%tr8wz-x7AU4~uGwL3)d2B;cKjGZ&yMuofHAca2RKklL+=658=HAuVj-PHp$q zlue4sh#_aRhiV9HdPQzm%F1JCNkW_SIivZB$)#Qu;%QRrQ3%Rpa@ZQ%s!e7calFEa zl={)+v<8^?f|Si$Wj9}usGiI@Bt$4SMtW{4B`;O(+q0<6xbo6c{$#}W4w4Xz9ygKi zY<4YNi@U^k z(Kbz_N1j&jhA;-wygq*)HUL?Rpa3pJdsqIV6c?;?%(Q_3(ui@pH(FcFUyl8Elq=eq zR?s_81cj`Y)cf17iEyJLVF31(BA>g?5}~l;j_$#AOHN{Cw-Py#nEdy@Q1f$Ya7lnVL5KKDvRC2 z1a%-`Xaxky;x;RcqEe2`<40D;5wgM1nhq)kK`L4NhE!8G17?K2dZ)XgF<<2eg8=>} z8b;2Jx14~NFBOUF(I{qS7>zoVs-0;B^1>_+(9RGjkfBF1*D$OrG2GM}upF#m1W(=A zyq>c^wZwD{N5=-dz~gx}KlDE{IusmXo!qhqLLN8o#ju!zFECx__9aJs3-&557sY%EI?PW-53AzT+V?ztj>5Vu{&upmH5(mm8;)TD!3 zR)k$|z%Mt7A|JmPlKUG@0#xPOR2S$t+N@gm9;E&*6|X0@C2Wdf`8{?Rs!9vykjCLi zqABS{gcAI$j@TX}^th=ijupUn$s3U(2&61UnL8Gnr{2Ls!6w2KX6SJ5;}?m0f<vo0arhOE~k~HcNV7~7?<6H>_3&DK%EE{b6W>Rms@s$<8 zgp0#Jqy6j|l!-v(uTC!~&c=%C)G>@pi+vfPW^Q(Wx!TVz6k0<4wH&Xr$B2~z<9`%W zsE3Ktic~VLI@Tjv2B;7PGFBqq0yW*1)Ic$6`0_A#1Dh(~)o}Z4Iu@#SU5>ng?{==A zdyo-T?LB}_7NTcHgv`q1Sl@T5cqLrhr124}R2o(jtTR*HlT$;oiNGUiCDu-^AX?Ls zy1aM|?I7PuQYGPs*hr9#_Ral!h_|_E(`nfr!dv!a4{*$4%QM^sVh3g^#>Sgn zRHXUIYLX(_mxxz6f@owRw9)O@(3zrQ3V?2uqgn<7G+;>!j_jXE}-v04(?p?hfGDMQeOO#aSy9-fAh0HnfPoUnpvzF{t& z<>6MWm7XoY9wke#zs>PoW_E~67+8MC5H5eZ578a+)wTZjo3a>`c;)eq z4VR>+1Gbu?5*}9}WnWr&S3(V`kZv!Qvu;qim44KrU9#n6gm%dZ0kzt}`VGry2Bfsz zYWgfW`V-q__A+Hm;mjet&WyDAzO||rH6y=MsZc;>^ySd;)R^RIfS)1jmF9_Npg>yn z?^Zn+4TG)a>P#)Em~2jxxVlgF0vuY$nB_1< zl8pn2RgE2{o^pTPq*sGt;kEig6}%x!K_*jE`l0Wd>^V!+vUFzBv!rbz>fEfcQ`g$a zA%iiSwVM-Usq;7^ar;bF(cpj#Wv1o>{`a_6~LR*ix(8nW(Hz+a#f)~~MaO_H(J;|Azn>}o##fpQN^ zKIu4XViLR6<&?6p3{%pkT1lE*#H$@zbiAa#>43CrrO~LdlDtwINLIWnSGFQ{)N*O3 z{vIMiH3`xtOFiO?Nl&(kIUTlEPc+V_K`5FTA7$^+;H@X;P``CRgDGSFUpX30iw!9A z)j-TwxQIM23-usYC^YsjqA-zsD8={oI5wpRkZof*EA_sH9b+y)=JoB8z1brraF(Og z1&1O7MWvf@Jl3bwcp|`ZT$FvLD;r9N5DMP$F;~RGpf#^^wj?72_q8va-^GW zECn&=v)j!3eEcdwP3)jCL4gIfZK*&TUJawH7QZa5h_UqVe$($mxlm$1Rh(w@w5z5C zLcIoqDJ|e)2~^ge0STkt4gRc+6yV3N02&^@N(`AFt0|Tic^!AnpA1mH=B2hQ20=cNZm=XC-Yi9MiVqL&P(T1OSzo<>d-l`&4}Z=sPcHs!OKd$hviN``l@CGH ziTttciC>V)V2z51p$ zvkHq(K@uuDl|0<3opdx64PlWWy0=&Nnts~?xqU+gn^0>(dg(CBYysQXH&Ro}CHu2; zvw)3w^Y-GmhWY&kp0O|mSmPr!p!(XF*iY8A(Zt9*%PU!~-5VFHNW;u4=GZQqqIaX% z*rB+!k_6qpv-%vCC74nn@A!nH?87>w*30B~5kRtyd_!-P8G3}1M{E6i8s96lOR(6A z@V*#Mu5>hauzG{wYoq^Hud~FRPRvgh z#5Fo-${}L#K|m^uFFbk8sbOb^=0#RTB;4Cvu~;PcG&*=}|5QCu&~8#D)`;{POw532 za&Xj}fE_>MJyOUBRA=K6>RLfRXqceZ5b@Z9o6cG{kSH|@{kdcMxy#t-Yxy{Z$v{7h zDEpJ=yC9^N)Czp-79(QwwkK_8jtC*x1eF+m=b7m7)R9wPFvPO)NvNPi$hU}B?v-j8 z-30aqT}B{oh>8ukU4=FlsyrS+m_na4m>Q>wA1ppD;CpwH%avZ*BBQKhQ=6(*a!)XK zsG7w2?X7A4J|-tNwy6!+cpGl(xWAw_pldIbQ*MHXYhm@A?l@kCObj;-`I>{+Twva2 zd}vq3ketI(Oha9sot*w~egXYqdf(1M@bsriRn-$Qlgtrfj?HX@(R&_WlGI6}WSDbm z7Id0yuWmT9c>bM{%_z6t#&IK(VM2a7B{QlXF0nGFy!^~@CUW9K*xR>v)A+g~r@pA& z)H7%iFBAJgmA5c-18^X&(9aVzz1y;68K}pZ2T-&dDo0Z;j=w%d)t}Tt)jZl)bW0T?ba`!kI#Ltj`&7+YklB+BQBHgfcg$F%8 z!{B{2sI87x#Lun^T)+`@<+frBN*lScYB;;5-#B~`veexaYM>bN z1eR2_XH_{pa`@LWt*vvVgqj&XmfVW7tIPdtBy26PrCd_#F|)zZ;>eS2B;cA8n9a-usE)cy6Qxmn*41fw&z?dPb2Va@7}bH z9Lyo;J&Pt$OY&^9Wm0T&0%;T^Vxq_axkw>V^>BbV zlUXNh)bLD;r2`{Fg?K zTgR*?dtmn#Xp+gX2RcuW9JU(hOdavZdxWIIH`u`X<^%C=^$Ust6Z4x4Q&VPzqDV8n zAJGBmt?sG3MT5Fw+j0P4GN(|_!;P}r$7gat&Jq_&CuCIG_tvcr^c_k&m&9&uCoxev z08}5#^`a`+KA5NqkG2_konCZwLYdpKZy5&LPq&qJdiK(VR#n!Pn~K#=wG@$WxiYl; zjQz(*t}ewV%^T<_Uoea=CYCktJ7|C*>gRVV5-DUXx583I-hY$arz5n5| z^J8}M?s<0l{@v-DA1+?Mf49vBCxZTQ%ha{(_Ze<8xCe^W-0Pyn=-muN*mH)7KvkSF zcO;)WxqZ|y((9@}_(M@|i4YAHc_y8#pNpB%u@gvHneJ94N|e7UW@wa$+ms!3LS0?< z%%Vn;3$6ADr{y!;R3kC1%*=$SU=g?V#QU7KMu26zTo(W~wpe7h>)2B&d;xw0=AkII z42X^E_fz{v;uyX)Z>5=vh_vn~O!cnRTi#q>23IYl!^uW-8)y5>830t>tD)bavLHzN z{G#_&dyT}!N(kM*;|Ad*a3a1j&F?0*NQU?tw5Y=ZOFD*wdc;yxs^A|cH9OvV; z;ee;=z9BeQ8M5p|Kp_1o^7cVb?Mu~@G(eq(tmQ6noFp@DWlRcyOw4QwHrYi<^ZqSp zd*wSb>&pJMl7^#$i|^?WU?tKYjhfUXgsp1g^!i-u@JFjint0fo3e@S^>!ssGYN8#pXEgDHBslpVpR%=YPm5 zUi@QJG*+lmv^#G+RS*FwYAw5^g|NQ7w5r?b)LM#iCGEdfD?cJRD}M!Dk3()Rf6%G4ToZ^lw&$id!gZCt zWpwip-+uR^9m0(g(qQ%Gg6p#OJ{f%s()8QfHQ~EBQ2H^ZnTsC!9)SPjX&xP}cUq4; z<}V*2dKof5jrf(qSsd2+O){?wM6oN%{+C5Qr^OD&c`z3ZIO{OI2-8BR4&$^PywvKc z?-gBY9Hq6jT2EG<*+n7V<)v8)h4?F!)ZN9^qV>s5Wzg2^LAM#VD~w}2PBD@2VqCMJ z!s^V*lq+Jh7dZk12(0WGQ#%n7BjZ|vw?JP3%i4BSuA}7QBkLpTEWo&xZV_4x#tEni z4KH3vWzz)_6UsZN8C9v=ZXhZQ)I2H(pgao$#1~p^a!73VP0Jw}a56;2kZIwst1(@~ zv8nhpJTC_K9h7uz!{F;sG8=>K6iup+tDY{$&^t`FV|bgJ6bp{v!JQ;3*EC+(csF!I zQQ7)7-EIVCnY4P$cr*IWi$ojQog}KB#+ICFb0d>-(=->B0CKye5>w^n3D3#A{Lswx zcNVn?pZtGbSa7#6{cPWOHES_|NViYqoInArkK?UO%rTWO@}kY3(aEaSC^`9^_`35b zyX3=ekEa%4O)CQu@5C3eRWQ{UA=x*+^CYkx3a`!f6@hK-O+vlzV&U=2Wtj#(yQWNo zMiY+1un2)-IfPcYJm!9VY3-+yy&)S>=rahC0Slgq9j$z7p4N2PIMz}DN zwFmWfEPNt{r=(6Y#MHGWb`x>HTi6?xLzr^&TZjT{<_S55Lr49F_O-? z;_CC5OpiY;9 ztNd?!`Jr_cAy{R(dToby^Swd$0)he6*oDzJWUs<NyKsE}Twf8*j`Gbv;(? zi8W(Sw$+-U=-hX`z1Dm8gb0nde-7Tlj(4*+BVK@jDEWl#Igg&xuBV(fFLm)pkQNs2 zZ9FA=8&luwlJ!;~d&iv}`kdy&{6TQf_dL}Po`E3V=$Ya+g;<@a>jE^6Hy%^W#U)9| zX3$ujDf21LI&t9deE404SF}%Qqt?86S*CS-*QQx4|Am>6lAs)(f6BIyS`f$jyluJr z;s3;K`MYO^mI<$ZHX?XGnOSmDuk&R_DEgy&gX|Qin&4hb0#*~1gD9Vont+~{AcuGH z{`lSN58e0p(UwDgl;I-oMY+uC5p27s{SR!W#V#b#BDssF<4!7dqu;+%OwPRO?e!*D zhmaDD-`P8vc;RzJOU-lnh0WuG?rx?K9u#^)`6%3_n@qa<{E~gMPEQYxk-;=Ec3`MG zg+0Z+tp`%t_E9b7c6#6L7j0bh*2r0FyB`CxTb-zRn6wC`Trm{IdAqzD5^d|F z`}Z1n#9qz|w1B95V($ylOVpHJs4lG`piA7t+}1($DcchcQ`8?V>$+Pn%qyd)w%QB1 z7*|VBR{R=5W_nu;>U6E5Ns`}}|622r)*HdP={%3rF?)xp*6zJj%u2@-9VlU&Sz!wC z|8OU5`UC>$nvet?^HDl$4ebPdTB=32%0>)_TThkixCC_QKdp7WxtYdCy;cLhrIrZMSh7-CXUdf1$ev6suOble0^2L~5^{pgUeU3;o~~ zv7+J-7OakVr*y(;)|j`goU`Rx94VBb+`pIIzo$1=8b1Bx{ymV%C@5Pt2^R?*y{ynr0-T^~5tts!{dp#$7Yx{oxo|fSqq3+*1Ba363@h|13t9^cv zov_>L^lr!+k#Y5`1?-V`$VW}AKcvM%)WJFe?nNlJm>;78qB0$lqoTl8oO!! z5t!cEW>c6Jx?su1F!5!swpcn`Xanup%X-z23{k+UN!cTvPybc}^#&H*<$AT3Jfsjq z6C?$55cF9M_xp&}_88#+2w)ro)j0M1C414xqrYS)q_$~~iocJl4w4Knrz_j#`}fEi zjRi`)J&_&~YC*Kh6WVGI`u@G{Dc`@RC{sgVAC$}E1!>S2$rktTU0N;M4vnD=>!p)6 zeL-C%k(3-G&V>9XgJIR!!@hN?rsi%@bc>*LETKp@(LJ8qr6+^ja%NVVXgVXuPSk6+u1y?Z<4g!+(czZI>iaP zH^Ju0Wv3?oAI&RB{lsQClL-4=R9`z>4ng-5x{FaEjA*_8iY)Dy9v{qY6lEC(Zz@0c zJ^y`SE2?$cyMM2l{r!6lmj>DCo@@BvvGr|Mc++COd;-6Qc5{bk2mBIoOy+YVO{arkeNd8@1;Asnq z$bTCemF81){|@rPg0OwOe~&ym0&Q+)cq0WF8Dl|@Fo+jx_E--vk;T+)pSOSCdilkI z_t&bC?2ybpEEGqLZ!xp1?SiO7$KVGI!p_hV@)Es#GA5JdY48P*CFM)JmpMg$`)!JD zm?FBf%|YMsFrxj2OEs}01I{S?;w>&pb-;`iXQ=mYAXK%1gyF3Bk)Skd{oozA}^fBUca4~iM77@@V!wTmH# z*`L=z?U@h$8cq|e@G~MO8vmPT6$-U?=hl0p37;}~<3k0NTR_))ySI3?B6oq1qVV)7G|_0Y`c&hj z-__7y0o52^>ld3>A75{Ti?Ld|glLw_CK(=C7O$Oqa1D4BUvv$E(P)?88_0plvpxQ@ z?7Ks2rKdy!`7DWPrF^YeX_j#H8zdK;sn=-9`V)!Bxd0*we=0zJ#P|$$HkmNk`X1Rg#B9pFh5y-Ms?W5jb24SEi)FR2+H8g~& z4l(T;GCMP9#DtNq^{{jO>Bbuq76b&rAa9jYB3P-ty|wo4#6NuME)$t=jeuiihO9$Y zN)u699(|8#^)79$1U}$mQbHm?uW)Jus&$Z7@*Z8ChTXAQbHKnVp1ILf2_goSB_IZ) zhNRVl2s%9Hup~K8%}c~B58PI$WERg(@m*<7KdN$!2aT`HB#UCs$xrk5`KA=3AuOFD zEJ#y%O~P9ibiFaS4$}>?CK&Vom^+u{x{@nB&pV>u;b>r+j3$8Mt$1-%SAch_iWd=- zO6rN?05}980yq#ZWU- z-nsYAT)A>x{`D`%Pk7Hl$DL`6i9iEEPz~CNHV65y=kMn*oL&Kp*+6rWfVuf~9Occe zT}S{UfPc_3jzJPx*2D|itz_L4W7}5w2#jeEl$g{DB7nM3H)!AHFaQ4Upq!-(5f-hm z`uf0<0?nx zLrL4Le?_l965B;6nbSkL#F6#PbXq~`SpoFdYht%0QBgI5w~nwH3CL;} z{-{k@KHvW+=f*DzzKIQ1lG|*Smr+k|nGH%k$J7QvxO?)G>G$j%kncs{%@N4{#;L!| z4~VTY6z~rBC+X?dXn5V{CCLQ(8!5mH3Bn+zB_QBd*Sxygk0}`;pNe3$(is-r*&4KfB%HfHyk0!E3 zc{)y$i`BK#t?2%dWv5*-o0n(){oncDXG@_#Mw#H(a4ALeLU+~c)cD2v^`bkf1Hl=e zIHS*$j}mjWW1?amFo7v<#;SzwNb5t>Z<8ZD6CCnw?4%`1Sa&d6uoZFXRYOne9)tP6|B_Ld^la3&UrRW*Q3)$o}55-BC#M4 zu!o`;XpsB8sgThf-{>!Py!Ei=QijieLGm9xg&Fpg9KX7-4zFk(*$%@JvZh#nayujl zSKhM#1*BZW@C3#1VqEZ9Ft1_z#h{!ZWr#}*v~@ouph-uw)O7gx74x7ljB$o43+q$cs>W}$sU+LxLn=_RpDgsMypxvcto|*{&Pr1Ik+@WF2(V_EL%AxVGF&BQ+`tk0Y z*`=fT>3n@}`F`ZECi?v%NtMY^@anWEp^!I14N}C(H=-Td0g4lWJ{+$rh)DE#xE8Yy zUmfnv+IYthkBHG&o-cCoqyL~L>ZW1gd^x3;-UqcOi65#(j(=L-?LwQYVE%=TFFsL{ zs#$FrP@koW*0K548Hwo%5>%#>I0fF+W%Sa6#l#8hs06y&G7;A;ePZS_>6OP?!r2HKi zVI8MwL#SefFpiQaU=SJNBiG$u5?j@g>+J-WOHM9Mw^~zhX#P0+hT!3Bb7xNU^COBZ zKC?cE=q)!hpaP(2n9jUf`8;|>O_VV5q zBxhjrS$c;8ugthQ9Ij^YPR96cIDbbPj5QIns*XQxh*fdNzbfGP&0;}Bl`b?ST`#mB zqw0sa+X5m43~!J$p!~;oOeZPosjjoM;J5oH@G*c4hn0gj4!R<~ICxZj@V{d{OTf3% zZtDk!%htC}DlK=?^ptI#AFYhMi6LD@*fA7T&%ubKC{+t^DOxU{X8+)O*+i$z9sDpx zK$UlqJL9;weF-K?UsF5>Pz(8CYSrfeL5hx6R~);*lp+e(pAiRf!~P1st{hSQ9GQnI zBs)rDrJez8UrQ)DP{IR+iV?#dAscnQZvXZzDKI#Jm4jildH;auy9Su~eYaHte3Ic|i>R^a)D8HZzB zYvXFRq<0rGbO^P)T;39eEhPeOtRho~BUqWLS#rhgoS&^BmG+Ta>0h9Z5rTCZn3fm0 zLN_(!94A1s$}U4_0vDD)@=lCB+y8~;63kusAaa7FX=IV2^~>`e0?wMT!PeuU3N@dp zp3#-c`Ep`$#i}zs8atkXV_{SqN`;`EU>&7^5FyS^Ew9?xpl#i1UY`<4M*YI6f=CPV z9ed;raGy$#0~0+5wP2&B)RQ-8a=M{2Bs)4Le|v=Epq;uUr!6w{eyQsZqQCp@^(JT9w|drnHPzL#bOWK}4<8`uBFsr0I`CXIJDcnQ$a;NFC|1!D zr8YdNk&5LhLwTRp`6VH^B>fVaioYp+tI!XM(ZJQyC4ah>+?L>Da*4qV@^J4Xe)C-Y z0uN5j#bi=r`r0bcK*R~H?Og1o((+CuRF9Xip(7wqNXncOxCEld{K%+K%m5250L}N{ zWW7gVOrk5>LOTUHK3B^^5*6kKR-SWE3@Ygu-YP*YDNo$`SWpVBl$|+YR3Ov<1gttt z8rwlJcuft6EYFLU*`gX}_oJ2)T^#S$U0)&(dS%Tc_lIp1jqmcuQ|9fH^KA$bYQXg| z?%nneG!*uam3svQC^gesvr}5LeEUixVYJ-J_z0OIp22#8SJ}5A8}amVgiV+sD>ide zo-JAv5KmdU;WB;iM^&*1ZS_NBo#d6vytQMc(5goycR%m zwd+t>5O4!*6j2%Ky;dB#S24!k6QP-S8CbXv;D3)JtKmB?(8+{+mhDJvC2CD;-O9z^ ze(m4t+du!quU+ur-2z?z3tuv*H#nCsT$t5Mas7ffGSkjJJR+ShNM~hA?u0-Zw|?sJ zFKJ^8X&Z0OL@Kung`5So#5LqAXZN-8C^ia5BCeh??C6CfkA7^wlKI3o~5R^ujmttTR(eR$UmuGDJCh>Lc~J_>mZ zWNqgR3jY$hM;LyukiXmkxS;Ou^Mk$lqH6-%PG3Zu_;zAi(cZ6V@^N=|``-L2%u4s> zYd7ML+s}FVEW=R6-?Hh4!5$1I9ITq?EL3JvA&qoEqUxZm0s9vBhpAQFi<}bV2l~E+ z!#D|yf{89`+_cNf6U-dQm~dTC=rCN7t;P33_UgdhJdMAL?{MjMC#%i*hRehO@iRq& zqI@(*(x?-I%H)al9vur&M|l@~A4x_rD3fs{w}3SfH$;f$8qm3Sa-bgzx<%3N&J?L#|7O~|0>4R8q83}+K z6+s0Z?dIEd)^19A%+B33Kgy|YC%TZ$YIM#W4lB3FRC}g>8*eWVd8|@W#O9%eDe7qcHFY2AWDl$evl?48G$? zwVomCS$4#xtm{x|Em1ErZ85gxIo1xC=*b>UR74stLx>GQZh$NO3D&-0#S1& z9jT)KkNTL=7eDeIleLg+<--{*asWkDTsjtkSa-d>jdLL#hoiKTm5=153qkrNGWqB4 z@m!dzgO8Vcotz=6RmVpqizw+Lw)*w^uWsDA{@vo^*2gz%w;^iLUUl*mK|R?kmBgY; z>@m|4II5Xqy(qbJ69QW+NbzRg*qo`Dcq;f32Kw+qW=$8%3XL3_fceC?xy`A3jb`Q%f zj*Io)0JIIrQdQ*pUG$+UzibdJBAAyHBVW7fXZVrG0G>R&eI{c(IXkU2ZfSSrauAyAQfR zf;|8I>#Gm`>EV;pXYYDUiYor-wxmHNKmQc4Xy{zgK9_9oP=s-`^A;25WH|@E{BD1j zZH_aqx0RFl^H1z~k#NHR8zc!dOs67-aK!BSa`sNXH-DAl`T3_#^Pp+emQ~;CZ-N%B zQaW(Cc+g~dM&zo-l~fVsj6%kT;BNy%dxC;9z##k1_Q~1fGXyACHh=DekC0c`ay;_zj4WP=$H>-nGkN96I5uV8$_u!?vHs>3`>9ZM3D7Y*Siy z<=4r#O$8Npq8&eUr4-^DdZ3Jre)Z?Li+%a7?E=?7%TR%S_zuAaA=eGUCH5p|abbH- zd$*+q3E%^#aZk4ed`5eBFk=r7z?ewU9_@aR*j~DGf4+9D?J0W)Wpi_6ZTYR{yVMa+ zvt0IUuC8UH1a3%VawvUjM=86!`jaoTfvdaYN)B$d+Y{`1Er~jL531sNy#4icJ5#$| z{5$uy*YH;E+}~dNlJ?#FG5YRj_!w^1bg`{ol&S=xp%51wOpnbK9qVE>Dr+HKwcIHh zW}P1siUbJ1`1+P)nu-^Lmtk<-lbRFoK@e}3;+ewv!#l+QV0l2#?{k#?uhQ;pJ(;}2U)x|7WlJ61;Q}kRp zV%}o!;CyF^*>LfU8cm{jRCt?Yb3YQ*MAt{g!6=CPw8DOi`)J%la2e~EE)@<63gvU` zvzZ9ZW{zK^x5L_{3kEe{oT7#$l$^B0wmCJtEr|RWHr&qIjmy0rgP8N9@YX$~*(w_U z;du3QH7-te`$hCXz{UMtII#vNCJY03i0^i3lU?v2<|XE^5FM*6D!oWm>9((mwu;U+ zg;?v5&Xk2?Oy=erVhke2)a;^DN5(_-R9AkewpSU6G8M5Iq^i_y9vSSy!N};5l=Ee} zT_n_9v?P_c*xsclyJ_MWB?d0zNJQ0f_Sm1-7*@CCitrc>!06->Rt^==5K4sb?MN~! zkybgefdrV{Y@&=6s(I#s39Dh55~+fu2j8se71rzOaOd7)?e@rrh!z6MPOQ$kCwDmq zDK@RH4o(Eh$k=O!t4*t|`^^I)(QYV=5gI+{a6Ukr2@zr|N2_KGpOo21H3Yj6#&$FA z*Z~WwaLpLoY|NuqQmk5~gTUlB(YRpQE}x|+kPxwGKQHJ-Oo1Zf(i&l~o!CFzZX$`U zIj^+oYenRXhEtw9f`Q@CW-C_U?nki5V!s$X$(t&+r%;Fcxr)_8{pp^78!&c&L*n%G zT)G&t_8qaSC!G~JT#EV*RF@L%ow$=l$a zV>KWJ;yBpHSIQ9OH(Nx)jEm@Z)_yRTd2yRRMs~#mSXD5D$C1Ss=Vw8Ig3f64x~9|D z$6?q`&Z-E)OCh4jlL$`R4RJ}YbnS9L@S7ADnPTfXHPbD3X)YUXQ$@YoRqS>c!9&Fc z&XZwPnqGa20cP*-4O*A+ba}JJrYGv`H^kh_ttwbcP! z==5x}C-k~*pid|qc>6Pg;_?O)8YqFUWc39_3Z*LEZ1Y+q0|VIq7x}A_ZV^` zN+tGhf0qEYtlE}?phfLQQ(F%Coq@G6T*9$SJ0tFmrGb&#;k$E8pK)H1uloGGY=Rx` zQksj%8_tD}0x9s)*s=-c_aXt~MGj{>ceJz_;=)BbhNV5$(-q|N5W)YqqbZ zDlz_P_|ySprbJBjYgveIXd#5o*FR6O@zHN@=O5nn`tdy24TZlu7MTZ}>(~m|5$RR2 zMOt%b_yLo_`Q2s^pGGleQ1Rzf36g@S=wE6ys!k|qNlwTMZ94D|Zj77JyUO(HIG!+X zK`Z7=MyKzk)gnZai_~SyoG1#`FGIT=;B~lAGt%L+o2C0-sx{&Xoq6Uq2TsJi}oN!Mlh4dc=4L?vS5-f2IR50i%we~^PZ=3e zQZ$D_b8I(bLCYZ;7beJ2>I2ML*aRPq~?Y)usrtlDP25lUlfTAR6ncVuFq z`APjo0gO#FP_sbs3B5F~B|=Ojs`Cktwh{yO`vI$XszR&U!?A!RzB1Tme-KJI~Q z5p9T7hM@Qs37Q5T3+D*}E&uukyIxec4o*V@l3|LCFt}d|!f`e`B^%1Q8@j8zq3J7s zcXnqJOv3QJHfxCc!r72A>5gsfJBRTRmXI_~kLJu7&gwM$wtFl&7*4yPpZo`vlH3xt zoU-dv4tny77?l(G8ASJhbd`-4_)ePsyLQZ5^`6=MD%g-I0Ns!l>2d?LS`?!a0aIHk z-l>LU9NBiUxciMd%blf6e2(nC+=oUcjawf>Nbkna8E_q2BGrJ?{CCH=o-3;j*|bQ? zjOr{dT9|Tzl%~>k?ATi3*9)J@6+2T%Ru{tyl6RLPpcCwND@ndf@g{YGE2a3Z84L6| zf2Y)DY8&!IW9Y)<++1ekG-JreFIky6bKeQYA~y0;^J_c{y}|P|^Z| zFj3<%#Es$D@uGZx&sw~*xo{4LKSrCQu^9`0)5xrBs3!s_Tyj!{_@i%+g+Uovhy<<_ zld{7u#6Fh8p?H)6zQe~>yV98($pCr?xS*FexfkxnWSA?I=%bX*QYgI=*T>#gKaoS( z4LYUlHOx4dvAaL!`g42mQ6-|UpWS3SOez3XepE!1?Af3DHzxlf;lBzvX_=)El2jh za=fKSWgsrvQ0#Di@1f+Bi}7KGw#Y!;=MT_Iyb_QB?H9v~BL)eVAD|W^WM2Kdqblyb zsIfGFa#G#P^zuqQYz)_K2;#039MTc{;BN+3Ig*yvA%6``~; zH=^9LdqVL8nWuhI+^MDbew&4WiRZ+WYVwF@sneg3A~udVrR(vu`ecfog6d&iCv!N% z)tdr6N3V5Sv0gk(wFdQZlywWH@y3pp1Mu-}`b^DitV||G9YAV_-bC@K7aTDo8;Z^Z zf%G*yBWyG;UXizU9HY=vbs+@?SMOBaY z1MI2wb^xk|7czHP&`pFs*}Q^7X2p$ZtJtkg$KPfuRHON18D@xR4Pncq$!4s!ldIr$ zw{SU``&xB?jHtRpt?0X`zI9YXiI1xf!N2I~OkKl<=?R$)saC*Bkh@@3uxr!Xt?Mec zP{(GqC$|MVQg;HkP4^u(^mI;;iC}rjYC83V769FNj@(OZsZg@Nl(~ecALlWAn4nK? z-~*QDNCh04E5#oVDZ5gT$`XMaq?FHb?Bfq_sbVsPudN#GMQIC{p?8MoNbPMBU_oP7 zS3O=}D&UJWwDZqDlBaIiPDxX>jYINAil0+3mT(%p92;js@Ol=dpxWgndlaYLFQlqU z&kfhuP4omSwcinWFHc2Z3*|L*JSy-8apz$ex6y-F|-kq^SP zJb^Y6n^7Im&QQJvV2hlNum-CAl49@rIBp3pZ|G%UvMop8# z;Tv2bASgSkjbz_Z>XQ1#(l?#DQ2l6Rl@)d$+pTQ>N942!Chv?St)l^wum$s{BX95{5n_I!Hp0YRE^WQI{{qa1l~bH8DJD!M zy(NX@|e$fy2!d@#t<7(6)|b~1GP*B zQwAXdPq_S2eeGqiza_XPb#|8=YQ#Q$>^C2gqogb0(`_gvkCw}`c;deYSpFXci(vP; z3iUpoE)z1mqig3yZYb^zGae(o+)DP>g)~+`@@hGQ$Wk=|Gm_TY4lPf7y_nS$@oo~- zJ~n%2z7EI;Sov&=1Odlo_mECAX`Yj!O03ECJ(cZI7H=`zka`q4PbTmw4|>rrzET{* z4NQWvNgmw9+&oc!L2n7Y8OyurP7wQ}t=a2{R%#xdo6x<%$QF3~3FUxOdbXd9eUc^c zqvY$12OCwD@W;F&OvRxX^kAnt?eB#NpN3;}A+fF3@9-8cDFuVn`&~z7U5o^64#vVsornG$ zuabmvKZZbWfHEZ=#i6#_@R%Ep41_MD@!s<72CyM5xdZOVR*p~G75Gx2);Dgx71UFu zn@rMqMJrGALII?U$iQ(BbQn;p(|dT^l>)vRtFoe_Qa)0Esx<&A22i0AX|gEl8KHqG z^g)TswANuoR24m@Qc!?CBTxPxx0b;6S8I%Jo54J#t%aGz0i+v`pF}`Bi~Pe;iQo_0 zhqJ@!Z*b0I!`6Y&PQPiiECymwJt4HfqXRKL``_y|SrZ%$(K#S$bK-alAZAV_ZzwgJ z^O7ndOFRfV443;QfFzQD1rih1-t&Q4y??DEpGwVREFw) z1*P?5ByBUji|cnzR+&;$?_efeHPuYCksc*G#^xd=LLv{3&|x>nL6|+87H{P0jpOqZ zQ>nNaf$bPRMjOGqavEam_O!D9VzirTPkQI`8A^mi3Ar zn6=f5q&u|EkAz0R>N(#I(p|z4iT^B=^?Fe~!*8g+Fpp}@Yo^Rzj^WlLg73E; zQ5b*g(e_A@cQ#nLd3cEgh!TS^aiR}J&v>g{!Rq5j4`~uRg}hUiV!rKND^A6JTagPyJ{+^o2blx|;cl)pek@dr*9L8H{nWs{)Y z0xp_#bLr9Df^k$SWL&I+<1BCda?}W-S3p6gDGX!r?x{~2d-4<0_~CQzY4hOi1GQt_ z2P_PE$7>MXE(K4G%rQ)g%+9r)L&a{PsM2P623m7}dwY3wxwJj0(r3=VKwibWS+RIU z@>gGJiv68Wu5G=5A;H&uHQU)|d{|NmhA`uQI>&hpC{HBi^()Zl3*r!Mq1LTOJHsh@ zz5vH99Tq1|`Jkz(tkI-aksW>J{q3|mOcX?-Dn8%c-;<=Pu1KbbQAi0QL(b|07PFf> zhu1Zumt2knX2GleHIWc^ozn`HQOl(g3s2v5(oL%R;CA%RYzx#7>44;_!^)j_4SnY6 zhy4?Xh6#6II~00ffirB|JW%O`{d^B1pB9yQ{n@aNY7DoUk0&-{o9N6kmimufFnqGBRhjxa#$IjNN) zK0kI>>Aro@cG5h=bNxQ0-*yRP#EW?4;{82fq@D=E08`B13(Jb!Wh znbj3!0?&Y={u9hyo1Afv7UlT3r9N>=xF`%~m*a#PDp4~c3aRVo)MV|T9toRmQ&m$4 zZco>pLM?U$+0tBD>qTjYw;z!>a$(Ar+AL0pLl6J?nA+kyk4L+5u;u~#)Dib@zxs(W zRqS%?+gJ{6r3sSAfX|hLJWee_{W`|ak%i{9id5LjlbkhTA?~Y-MMC8(_5xfrVewpn+w>Gub_;=y>rvl z0z+7`Q~LiQu|P!jY<3^MauN#uJMku!>refM3QAw{VgCJ<+0Fb1=jPsGFVw4 z8hon+FXf2s4!-q>x)c=5orlAfc?fp{x(kA}oizRHKUXc!CmaWWjH+-~0DL^$XRnUy zy%0QEYE;P+bro;tlIDk&%-7mv;4J*65AY02>aQ`7R-p*TE zr|FYX%h&psp$xlitR?_QvwtX-j4o&2-G}W-Vfd#{NmQI4yphi1!ayCe9+l`s zCV?hw?#b`wRhs)F@25Qn45Qd$` zeY^rskjCK>#DPGy5_I{`aCb*P&~{^h$q8+}dT57K5@mBQ`?JI% z9TQVmzA^r_H$QkU%D4PMv>W7#eoez;oX6Xb>Hl^6@eb-`>_&p7AjP;7WCMS#T~LUw zaQVBz;s}Z%1+uun4)}6t2iSaXC!`hRPV&skfqN>ft<{Ta2D+!)WeST8Dc9U1;u(>H(hJbWW8g5{mohcv`V5YAhpG zc5@HAvU??t%iKGibhS9-u`T~9{ly@AbMQ!kHQegY-A1y8yVF#`s8yqk{g2+|dVK_2 zpk!|aO*Vh^HmK4rP*bZyK!X&sS%nPRR@Er(7C(5_2p!m)4N!c+$R=NnUFZm)K@T>{8wGPz^kLp(nJ{mWv5!b76t(#}0Jb_w^ItQAb53@-35jPyw z1=Vy!>+L4gCfH*=B1!Qa(VpKYsbkGVMioty@%(o#w<_cCVSB0?)k3IhIB5I}+b+^y zv7)lq+Weg6lL{Qm7MZK)SKy*5&P#RZ+tOSvb_2x^>)60;A&j)Z&2|DjLjPmF!jzmb)!ap=nqYFQrX@7 zE4HmN>EQ+(5#~5stY-&-60diPXdeMnkd(-9#DS@;1V!u|y>5TQ#QSNvW!?EVVr>b|%_9(0zAifnR7nS-8){$iAFrCRrD>6%(AEZs2-TX~^h^5T)E zy682Zi3p{@eC5|lyOw@4tbwB|M3;nqfgI#a1jzyja%B|85rl%4%n{gvI?9!qEq{=e z1LwHdB$cwM!2Rekgxd_dWqH2m*6ljmkmOLjk*EY^t~4gEK>;^mE-aWqiaIrc3f;MC z{(edDZ2@=PZiu95lXqZKHB)*ddfeq(AFZ_1W)_b)wQyB-%XHV{vovsL6Bx7!x#@ie$Z) zsw$A(F|zp|6Xm7TaYFmF%Hy>H@(njbm%%g$ypqW|p7sRL7+iBTzoQ>Ux|0wdC1R0a zi#=_sM%I9Ij~-!DjLZkhKzSXYS<92l>suyd%%%qgT}jf5US7e8lyzoiL-I6Np1VJpp5mX_Q=)FR!uUr1e(z1_2@iBf<+wk+8h@J|Jy^JDt)ajrm^~en3N^6~6RI`7FWMh2 z@kXmh-Xx{aEQ)r>T8R08c$BcX!038F{OmQF16TV*^=;ix?;)y6@J{}+c5ddFTybkh)+&$O3*b$`mgM*(vw6{TrVH)zW4cvr>*DHA;`{FB7Y`w2XrePlKsK^a z@5FsxwOO1EnHs8j^rh~&z5Qgj&n3tY#?zUk1?-v&=X{u|>#+qmXI*2y_H5+U7*5ZJ zmRv#)-@p&;97n)1&D~*)ABi8~nEIJ6c$?bLb>(BIJ#aE)Ln;V!^=q(>)fBn)WI@bQ zmP?HWTL`ISw$7qM2nx2OVrBi`fARDGyfy;}G27aF^zii`e#L)guc)8Z1kiwXxLuX9Rnsw<@Td<62Vz3h6w(ZW`Oocn<9L)l&Zj1yRQC@leI&t= zt!-5RQf=V=D>`*_JazfCa-xK|S$0HfK zIK9kZ$b2yV__@$xnEuC|oXosxC$a;dC?4gq5haC>K=QikSxE#SBVpTUFW8LS21MQB zM7aZV0VB?mC+FYtSp0-gv% z6FDFGy!CP$iyeiIiq2zb2OFvaNY~M%Fg{0nHLwJMm`cZNbfHPcy%AKtqD`)~dzAHp8^ZA(1?OHe zR~?&)=-?i^)?I&);?^Idf}EGiO`PTfj`#Nr2_8-t$t*x|qOX|D?Q~@)VJnA&Ujh%u z=O8@8$8(mZBJ336)J{OXDo8YZXjiyUI#;7SWC|MCDTj3*q70k~<1#J#8PY(=D!8Td z&EybMkB#1RJ||j3?7N zZAfm_^wgR$$LUH*>>IU}4zeM#pA91)?@c6$6GANnU8B;f5 zJsrcJRXmYXHc#7AMXnBzmu~uNjs*|mJC)WJU%41&ro13J(xHT%P$D}~ik;>hB4E`7 zB<_kBfU={?TMKWy6avMMYmG-2=q)WMr+asa2bw6v1*$g)Y4yC;vr?{EH#Iv%7F_wU zBW`ZY7B^Og0fLq;MDEnfD(}i5{!`gIt)p<~;r7@HPz$C7dSZ8tZYjWPCt6BXl00l0 zkZa-`@EtAya5RI?puL~sTJ!?mZG~$8c0RD9uIh9As3=Eu2;&eq7XB?xt~Ad6#>K{lHF(i(~?>$&&9( zp24FoXqB1Fp53_><5@21TMZ#mK2M7i*l$PrhqcDIoyI9#Yu)nS|O>3U{&g+=7raeOG&4^1qrz9r7jWPM3H zGT&THdNWGVs+c}&oGZ|JpX5B_#oyrha0RwuxqdO7UZ>}DU_w^|URZ~$w5gWgCi_0Xr#TMmI!wk~ z)YP#gq1LPN(@%Ng&e;~=XV4-hZo6ft1t8=wb$QGxH9d^2UHpVVhSx-%eT2b-0#kmK zIX*BL+#dMVE7z`EzjDLNb8`mXJl?wi&NT%9X9(Uf<=5?Cp3dNLXpqtaEPHq-eKdR1 z6?tq|xETA)4VI$z2#u@~Y)#}{&;*BAxwxsv;eD60o#l>*_~?+gNxOl8mPNebv1eY^ z5*@r1Za|IwVtCpBG9#P+$&O6j8)?vv7@l5Dii<+exbjn0=*2jI5sh)Uc%PCJ_zVS0 z8=4m@qq&Y$isK~i4T3b){WNh&G7CP^x?TZ(pZ16jORbDD5y@>$ZevxbH!5;Rg7IdX z9N_aw)XZ@A=)L{LmDx4^cb)&;_#&i|W`I}|>hhL_57%fYDZ|srX7BwfkRs~Brs3BL zE7f>xyswoG@UO_l?R*3aq5wfkfSjxhrs_i7fBI2byT$qntN8z4>1{+pH)ly>SO_LmcDS{m8jm)Hcm5;V08^G5 z#hEJMlh4I7CQ@=4z)=k9E zNj?hpFuhquB87-h4$j_#IqcIuw35Z5Jy`C69$Os!fN@{?vc1~6?}|HKv9={tts7-i z^!_R_L7zf}?hN(mdRa<7I2(7y{VzEiPk0iNuWH%CiB|lVW|ucgps>#=fWxN${cE$a z3w?_U&eC#5EChb@_W(w1!Zjg8RJ?o1-F`fedOFd|Imr#Kx-3Vp{ncYQ_!AZUn;Ss+ z4nAT!@1X&%&tOGAncbc}+`_B;{!ElUN<}dA+O_6ACgU+Rlvg6WRY__6`$F8Te`OMs zn6A)t8bp^+I^v2)x!vVSC8S>Ba)XD36edy_58$L|n|t@}<1*nt(*$8gLx;OPH)MNz zhrWvI=kGSkH5+^9II^c3Km2+3+Trna;$eUWIL$V`Gzj?*%k$UD=NN@3d7%>S?x*5k zhkv}Yef&?0o%`;_U_MLzELL;42t(a!$mETR1`_~ z>XDN8kK{i6@je`_>#~hw@;hJL*m$vj@G`R$U)))Ldv-{0pGbtwyW~ESfED)GoPKxw zE1$bZ0itIIQ!plR?}YNcjlAcN+aLefe%#0uBLn27klF{w?pa0z6CCI$R8Cy03nWND zYD+B;{}hWdz;gRf*xSQL0DvdIT@ysvg0h4aVwA7My>q7Oq1nIuFWX??;X7KJ0-A(! zgZ7*ROMt)U`D=*hiOK{$Q;BFLPgQ@9y^P)pD(%G?plIL_vZ{~L?s0+U^>oj*ccOPCeH2wu{*bc2xL3Huh^yHUBD;HKE&SO^WF8pyIp z&6^fYoD1XAd1{+x__)D5g=frZ7;C~r=ES!v@vZ8G&*l(+6`j(-L?XF-qf;f(!m z!OJT(6T4<}2cAHA4HI1jMv8@s?Rs%6(J#<1y}>934suqe1CF@usx>>0~ z%EY#!KM_#BSlr8ZuMl@Mc7yY2dM_k-ZmNE5^fDUiT1vqr`Eq~(S0k_!&q8xoH?f$% zDhJ+;rf?{dUf@Paa+G<|o9cYi2uC{dA`YsMY!n%2z&DF=&=|R{PN&byGD1(+cK2htwQA}8f`(z^7IRE= zFRWaea5(On{Wk_Z$x6D1AH+ zj|Ie{6+E+EI>lMhW`~gGnntk&-CUVWs?O_t zWps?MuTw2*FM)Yt32!U3ZOM(SA<`JBcUffEChDD`Q{qndnI2Q8PzivwH(dRqe_>ML z)u-orwYQ8kX+N#@4CYMYe`~W*e+|T~wH7q}O|Cyp1#!Nn9GBHyb=JKig@B}}N8$l= zF>b@5mKcZBnJK|oPj^LgvZ)+0Yw+Z(`lhl+moVJAJ=gpTSn#CjH zd}eO}APsD{Z~;J+GIGQ#oF88vu9lyXkJVzuus1L|^qW)tB|pZ0Z;v|tPLp$i$#KCl zT>AynXE&Enl-L1O&KwLbh}!&6yi_{-|I+!0&cp?4o{Gvlu@346R!q%PC1XkPdOpcB zERIY4hpw+{Jh@sui_zT<-5Wz0hUVozxi~{nT)%Lkx?wF8ik1@MBtf7%+EpAb2eu&y z5!)TWQ|Q&YhXSrtE$87ot?-5(zkCP_ z!yzBF$N%20@PJmjKdZc%y)?<*?R~z_v&w7KE3Y=aS35DEn9tS)`76wFlblFbb-Jjo zOB{qlKW2DG&x_$>*ROuT(u7ZB527Ufb)(#y57K(F6wKpbv7AZE(v31REWH=cS9 zws9k`}Hbe<%NHVtPbYyZy}rQ7|!FA=tEHC@ab@?yBEc2QSK7w z#&z$a0L4}BjRV`ROcuOr7f;0BrX2Vx_%UEl?!S51^V~N+({G>H4x`ms61 z7H5!kPJOkS=~ls-aIj{7S5NDbMx2=N_n8&{TTJ-DK4)=K{JErb_`IyEK3wXn&V;EC z$0@op>2=HN2&3Pw6o7PDpWEi2h^Z~)1RYe0nLnC6e)#5(7JtC|3HoP@`82oUE8OHjBLCv0E4;mQ+uWJxV=i)rr$=w7KN6pl3)f2M zN8GS({1|JctO=mQjEY_T;)_GGr1V#+IO<*4sN^PJ3O}Tk>EB@dkPX-U6EGA|lGroQ z3JMJ?ry%Mp%b6M;wm`9pST*_PgnoGKS`FHC77W3tY3&kIi{)0~8O3Y+w56AMdqVmq z|8+_onFvO7dzU*ZSQ}H$%&v8e+I+)sZ#)#0x`^6Kob07IJ}1IC1 z#df8=x;Wgc=sTl%mHtyqDC7Ens{}wb7CsUBkE|k#PrYx=hSjycd%=mkjjw>t=uFP0 z=v)DBu}~LaZZn-Jse_A0-UA1@PX}aROLU%}ihTFO!JzHq_Gon}zpZ;KXXPlIjj99|ox!Bv=0rt{l4%O>_;&-jS_-rY9m4B!kbUC@%BkJ{}~`X|rA zWA=;G)L0v;eN1*^uHcQRj8V))$oSMZ;vgb#kleqg8WG1{EWTJO)=0g}@w8=-mv>g> zwg6A0i_hWv;7^Bk^kEb4v`PXWn}1{VY1H=gnGRP*w^A>I>|r5Orp*ZT(VZU~GUv8v z09vR>3v%Ot!_;L_fsH3Z7ZU2+-=&b2nnDLXNC4_%d$;hKy?c(&Nxw(KI>owZO0IwE zHbz{p$tFmQ0z(u1OUTEHx;lQu^okLNPuiziVTV9toONgW$5Et>5u`@rMr0}`CQ@>@ zDNy~BVdPq~#qQU$2kNe=hnEhgeH>8Mn8bJnB{;C=JBVWN>Z8VsFI4;hjlu>J-a}GYOL`Y_47~Ne+luLCNBWk&5iqPQhZp0v~-CTX(yS)+<7dq4x@g;nK z@yLeOMK%{$4r1^Bm$-A=t>nnk^Q-W#tAVPLS}obF26_gPs&$xFNo7$jUGuPcm?F6e zZf;ev;fr|;8?XUCiyvj4#NYp~6_Jq{nMq0>!#7fq%#4iVigozczougyyB_Q0)*Uz( zIM$>tdNy+OBMWa~o(CNd&%@Expy*jv$mn+zsAAHH#gGF*G(@}JPE5rAAdkxoB96}y z$A9d^@n?6S-L9#MzC&DP`LDHoG>Wh^{%&=zX-nlmPA+ecuBLN4|Gm|zEgI*6AzyRYS_QoLx$M`yY>NK8_r1|W~)Y~2zcbinj4eO=~8Ub}4_Ak2KbD1PpnHfWnF zCrf-$t|BQ_Ncy{`boYH(#p=Ca9_?YsjG8F>!6Q)9@p_`nB&{hgcn%iIB1gfmlmBt55i&$*# z(E;WUm;npN_($FX`exon4yKL1*3#^6+k%fbx%T#2xsOrkr8HxwstO|6szx<&Eg5C+ zR$?zE6O;qE0{K)75Q=n83Py4h&M>$TTUDL$Lc^aa0J<1eLrkfcO1>6?2l-~4B*YWH zWNn)kbE!_jG((8rpz31L?ZDcB#2g3ZOlVBZHw)Sf-zc&LFyw>9no_%zk&6#i)QCf* zGnKM?U<)w~A_~jzXFo~5BMy-kzY=!wBq?K7g1SuQS0rp*ZS3?>6;t_#y-`M-YN#(z-8{TiMEADVxm$VEx=*BptPC~z=8ZEhIdu&7cEqTn9`fNB)$ zhbqrIJ^;Che2Svh64jdZ8?{9_-uYGimR-J5Q2cI#n;|@ah$VtLJUpYOS8QgKvt$L( zyb5SE2Awm>Ai#y%vGhLTlq9EX=S17GEDAOkW%(5Jpy00OHFvi2lnGq9%F7(!{A6R@t$>}ppx_}PFY~S zEvaW{SK!7K_oWQY_Wi-LKdJ!9Jz4(lVfs9|eCR&0E!@ZNmu4SwwibsUl?~Wx;rTz; zwS^4RKGMILb|G4+55?E1_{wo{{S&N0yg>p=zS|r#!P*L6ZR8Wuru-h#tP_4iJs$o~ zs62jg@Lx$z*WThEuemQ7nMm3%{`#YUh9W1ROzP&~@KOvmk(CRp0TAJ%)9p)=vwz?1 zNpm~e78zEL5^rJxnLvV<;AlyU(`}kk}$JHh*fvm7Z^|Y|0y|? z3mCV@+V>@t!{eqdvc2(qqKpL&sR~0aUUjM(sjjEP8ztj?2Q!NDj|uo2sQgTDcgWUa zQ;IY+$u7#T@L4LExJE*m_<=V3&sBu)F zUx4$RQ%XQz;usU-M&$UvSnO-?ziLC!4imS0g34B#yzwIF6jn}N>b|kFhvaSBTn*#x z(J>@~=7qEeRF@r_$8SxbZuT_%{U_bq2(CP-dl31lrN~Oi`7T2I8n=TxY zI~Ax9O!7enV7roUiWA~Q9&T#CLa~braJrv=kbiH+aoLLgrl5F z!jVlh@%z|Eo0#+2#H3zW-BuS;uov-3V5`Sh~jfQ_Z5>VcL-vMyVoAeb0fgS?9|QIb^FK}gC0 z1HxAMQO24)Bw!m<_e32aan4B-bgzEGapR9l*qHb51K2!l043*Q1I<{EoOoU*7^KVR zGf`vcwh=kX0gvzQ-qgkxCj5lp61MJoyii^$;ukPZgkNAFh|rQ&dYR5>D8rYIO8I$ZSrpsPQP}ArM79SC8be1eRI~J-aj@Q?@z(jai|K}NmMpJOYw(c-Ys_bn z_D`vH{Oafxqed+T!_8vrzIOaf)5Mv1i%<&K$n;OI)x*-`5T|9-ep#P)(FXDsr3Esd zy-y?edoBy^YMW?BF#fO~pULR%Jp0AvL~)N`Of6+2wVTGBEG8d#mz4V|QD_ebh1wP% zABXH;e4WiaGJ`HupEi=1B4agNoIiRuLI5h8p`U8|)4kUwDUbj#kiHaz zgp3%~rPfxSz6`KI)vo<*vV^g>$4Lr^z4rB&U?HnhXb3lzvM%8lrnAVA&CNNxI3R(e zHb6;s-o`Q;ncC%PFZBfq8EKghXILw&7S(|;H-jk!Oy&1`3QQ75A9}`pV;gJKgPl@4 zTJ5Eqw(;Y=46<7O*LG%BC6SGZ-ZB_{WnQENBIyhH-aRSl`;e2SRJw7yR&9sl(JHwo zdbzk?b&rh}^xzE@0(4Fqo~}QEevJyf?Dw618YH!Ux`8Il93$#eo);Y>G>p^T7cjgy zoq1J?&&^=1@VXX*w@{b(&TN4p$UEX%k@1H@_$hDg@X#n; zRStw?0!pJebPt^jgsn~PJr^??AbQ3hKjePH3&2g7ajm?$RcBlAd-PhOKr;8S@QK+# zYGqk75dIbuxRWcfPecGH-{VvCn4mtBo0uy_T~{em|DeYX3>s5S=#*?&#if6I%#3lhfS}TEh7dQqQ0Bvk};xS_5m^LNGr2fL4! zpDXD`6f73QmeN6*_JqvW;Nl()EnL|(vHnV{@x~xBe|5=HIs8-pYSO(AaP)6KxaL0o z;2e;_bRG`NHc%vKX4?nCd|2=_Ni2MH(++!RMZEYtjvkI;L(yzq$v=1~pQ5o`0WO61 z)j8Qf)dxc?=KbTBO3L}eho80?T2gVWi~4|$w&?iN-jW}G@~OAvUk+&OQ@8d>yVXl; zK33yHKGWKVFF*Y7<4@S#rDrex*iAJ4S+VEIxpsDWK361*%{`v(i9{LlH|6Yoq%ma6 zNK%&x8F@geemc`&gyVCG6mP<}lQR2{&p-XdJNn~;-OIC=UN%j^C;v(7`jLOxE{&Z6 z{n{|RKfojB*9pg~r4SdNe)9a|KYb`+!M`LpcrqSnm#DTnUZbT}-NBDP{S(dlpP#7J z=<9T?qF$Ws8kdEh%TpgNU}JAo_)MT*@e$y`CyaGZxvmhk`ss*@0y8JXwL>j{kl9og zGG(wE33FaN>+L<7RC!WuU~s4M8h&;BzW$bH91H3O29wxM~Gn3YIduZfg^z#$W zQ*{oxS~QB#u6d^3+BnnDBm&}#XIA{H^%Hg@NMx06LxLZ7B+PypWqWLby9{)Wg4>l< z@2mOPr6q85X&h2{QfX{qww``-aQG?p35B~O%$QjQa1Ar_HeDA_lfLf>l>;clPgGsI9DLb+M)Y zGM)MFK$cH`M>Pv_JuAgKFuPt0c!g(I;gs1w9x^x_%37zN4E{M7nw)-&QYjKk@!Sjn zcqur&@W5+n_h=0ZfBqXedKVX1-M>3L`1XhdyU*y;7fRfl851GbV_@<02E)=Q$F4u0 z1@}LXEHz>fkb*GLhC=+)ArJHcudEVNMQEW%hl;_heC%hz(KtC-{c-xCA2xxaV16`i zeoTbi^ubq{M+H2mCn^00{CYRbv!nseV(IAz=^#V{>61FvP2R|92f}Lhq4v`U-=7^k z>7_CQuPX;e#_WvtCwP`1owMKini{5CFq7SEqBf3RWOxUv@kwqAAmHxtAL-W{yipA6 zwcwWB6qUb+OGEqsPW_lZ_g7JHQm=>u<>n@j*J9Aq_cXW{Z?f9R!K=Wubd#Yh#(Ogy ze{fv{S2pEza57@t5=0(YlfJumq6|4UC1Q% zKI>L;Q(E&)4m2zaE8u2Ay6oEgZu5>k%I^Bo8M_GW*&d%j#U-AGM?M?)=~^I2Ra?R>Q&yKb3Vk&@*Ucp8*_-?QoEba2GnIio z_k2f_wz~H^GODW7i53Y(T@F@nlb(?6^W-%vd~C51f*a+jXJv6y%y%sErl*a60pR80 z;OnD*;1OCKt?`~_$8tcsOyN*%Pri1SMT=GIBzUB4GsWWa(6*;;rpYf>KdV93szaIj zt+Q<(do-C--Ee6ve0xY(f5IUssqJ!*jWfa{op^_X@3Gt_{Vz8SBJXBzq z2u`b{>eXYZ?w-rjVAKKd@Yojz-Tx8RBF*pE>)Oc`kP$yHE${4SMCXixUu!)Om;%)$ zU&$Ao9Urr+k1D%WxgKI6s2PklS~E06h}>}%mBgN@bMvb@^#8UqBL$%rPH#yP4OE=Y zm{n_28PCjRTEC6ITN9;rf+}wM%ChF&_O89Mn`{>L{bCPyc$#J4v(-Nr>_bVDj|vYt zEyQFTW_`dkaj%MQV7>t`s39mIsS(xrqlY$)KZyoWn}DG7eK~#a?^i-l>$7VuqA=uB z7V7~Xj{4{dVjLZAI>8vTKg?yJiqlPN9ihbicMq?HPIt|Ml&Vkh|x`d^y@ zO{8DN+8-mSKsGr>RJ>A=2=G*qCz;-;842SSzLhx4`bHW-8L$>+x2TMcsR75C0u!^Y zB82;$f)W->Eog!-iR5+GGX1;Hfxc)EnX>^ zhSS~U+T$~u<}=tU*b=sASLL2Ea!cT7HkmY12;^4H%t+u5tG33Pf*a5~4o`u5=#A!@3Widg@dmJKr7lewdBQ z6EU@^K>CWec5V7b$5Hd7uMRq_njhbTH+yK3xwsa^i@vbU^uAY{lcP@US=!&D^z+lG zsiUuy#z>$G6egC+9`A}(Id`YWqkMgIb@t+0QU_MA3q7R#0`2AYOXItvs}Wf011G<* zqAE&3%``@*ln%;ZcbQxI4wE#a7cNbZ#jZ4{p|9foAO?JaeHa_G6sMVfHf4=`b-(G` z6X7%J!Sq{$gu~bNdUJ~Md$YO_twyI0NpD<^y4iNu~^dXmTB8*?}N97>^mp(vhx`S z8}Y*v#r|{?mLf(XPcaE`&AvepGqE8f;?WahmsxT&x?TDG1P8GlCI!0yU;X$e-%*a`#C*e zO~-3%R#&nCWyB;9zxeB0&#^3@PCc4-FoTSb7-+!{DqeuFP0`K4u>xZm=B|WR5>bwI$f{H{;V71ZdD&d z9bO72wu@8aHl{H(J|dlYk52a&nLiQxu@ILlhPV(CYr+IG;OZd)Plj;ve_9FV;3Ugx zcOVwnkD_DGRXjitL3J=$uAi!l+VY(9?`OxAgIM8*^Tyb6;CFgBPL3cD5t?7yuhaus z8TCIo+Wnbtg{OT*!)Z*-Z(se8s)g83BgC!K*RD#%LZmm>U}=s@!OHTpYl|&8b&50D zHSwONlnnmRvMYO+tF*zgRi}%&Dilu?D6$<_%S<$1ajr$TISLuHWnBo+&mYp0G3)Uh zt!&}=L{OHAefHVQFJAt>4NIWo6&U)dlw2{ggWliIGxmn5=M>z?MR@9d)@q(vzqT4c z{MDTDN*;05PjT?7BRKdBXFWT@-G)K{{FgM?895b4D@;y@pa~Q&dxD>264|iGV>O}T zcAsQ_CgB+S5aiC>#Z&A6oq3?(yHrR_bpI>**Q&>->66gR70*y+Hmo?mXN9b@`QUQm z=3oel^Af*w5|uTs82ofiBe5^0dYt6<`0YUoxDr8i{!8A6(fQ~BnQyqZgT^U<_yY`Q zHWqZaH}V!})ytF}qZ~AKA(9zWpd_!?{Af7^PrM&i#O{yq zU=DI(oPb|(Y$cz%#`iPbaGmf^Oi7%R1vbE%?%jT`)|g*lyGzwU`);})PbH^3QgdUh!GS?x{8L7@uXX< ziTtaE-KcNuJjhApfl&{op8%NFAEqCJwfEr1h9lhyp&($mQD-_lgHRlTTMiASn8i$hn5}x zpUZw=`ZYI)cyvewpNXLT^}RuL33tkME}GQB8e6xk2{&?|LH8kOUYb+s&S@$MvCMPf zJ1t|KB0O8>)$DfGXcGT^OPVWLjnl4;Ic5`lvO8D?z5H;A;Mg4ec+~UN4nb2=*$JN= zZmut1*tC%`2CXX`L+jsP^a+1|aSa3E3>apPBX=gEI)3c%>o2^#-+sN`okP!l*XP!p z3hk=98lx_5s$SE-8sjR6>uwn{1+4An;MJX6A*J%;w3##-@o8Nj!^hHz*?Q>=hF%z0 z8J+`Vh5x{pcei1OFd#)X_MN-#n-@RXWRqutWmV4Ww24=jgj{AkLe*^2`3jo|Ol=QI zcynaR0=ie#RcwrT^JJ!I<$d_A7V#z{IuX0L79VXn1BUy1pmT&q>gXo;vlx=V8Wc`{Io0*1N@YmhP!{T|3h^+xa~@J-Q7Tsb{9|gM@h~tr#Av z$387)?sTj6Oq+HGhr?cDN_izTzK1zFPDWqQ;e8>?qeC!Z0`t&X>HUazMKJw>QWfCm2c?S7ek=D(KffdLcJb){59on*`^~@q+yAs4!7se8`FU|^Z=jyy>wYg; z`*nzt%~X57mrYB1bx4OCwHJqLb$hs*VaPD*;Gh-{tA9^f0EHda`;jf2nG7Z^!8o#! zes3-ORx~0)=_|{sCN^dvkuZhvTua zvq;z}F<9QPjG3OxmX*4Gpo$E>rUIx@ys?+ia3o%w6y(-N8yT$iaZao<|QBabh|30 z#k3i_BiNtl^u-=NkUGcOcIziVUFdI)w;)U{jiP754s?1=dle0lKlQ&oQR086!~qrL zd@puuyL?km-h9qca1?cD%v(|H5q!` z$8dS1>6_Y|-M>&~C$4sKbTcd)4XNY+d<|4f$F(QQ9)+miMPYE{g}y;B_o8{fC$cX3 zp^GM36RR=Js@3O5Lv(^(I(TN`0#p2?_wzBXugu8!-pZ2CK%-O09Zh$zcOz2cfY72^~w=R7xbC#3(?kl;VPe^e@%Ph2~grW!F!i6Qzfm=XM=qXL}z`Q#rW0M1B(LMRr|m{kj%4o|P%t1;OI& z1J%Y=$IcKVQ^NGr(u3ubZ|Ph+Pn_as;i+reIlhFvZ?|Xz2M)A#Z)fCCbJX|8Yn4r! zZAX%*t{pw;phTm)zZ@mK)#8T<9}=CF+eG|2OIy(H!Xa1Anf1hULC+egm@A66*8E(DqsiZacItS0@c{k7{f0z=vm=ospdKh)H{`_GB^u0%@n8;a zQ98!KdlrZEIXA-gop@30`c_ilb6w?E_ZJb;9;G@!^%jXGDsK-T@xf=$sd^Is`~vs{ zQTT%OGPPmarhw!g`U_Q*bvPyN!3+{H^^HpAMyg)`6?d@hOzqJ{zhTrDrG*9lZX|hG1jQ%8I{l%+=1w(^V&sa6jvk-76 z7b`Ooh@}kMC+(ZXWwiCoJT9~bKZKjATcNK&;(T^b^Qh6LHT5hl+r=?hokUj@Ng3Hh zSn~s(69D84?_e^TPbAa!7%+?~zXAXCCRwR|G6*a5Iv9w2$Q0%Ji9dVF}S()WA z`}+OE)rxBFGq*gK+iiNHR zAVtIg?fO#!W)x2zRTi**HaGuxK+Z;1bocIea(;vbYItBgoj6~|QxT`uYT_VC*JoOi z&c&rtm*oK~+omXbFPiL5Xbz?YNQ`Wgg#igY40%oDPYo8d0FMo9qKGIAamiVmIALa0 zGcS0Z>Ni(6!ZAh1II&k^Pz!r$SOl)at4nI9_OiO39upb!VoX`F6u8r(TsAWxj`_2* zh+(emC6#vh?d_Dh8=mpadw41^e$&RzS~cL-A(%QQpFWSZN?}~B3~eMy;+??}G90_% zJIW)qZoNEAy*3KlEPte!x#{;RgIWGaYXl%sA;%9tL>#{2m9VoT{VCy@Z~Q|2Y)t&N z;`9$u79Ws8Lo3$^#Z@~{o>2Mkj!{vS8^X194!<5!-329qpx#6F9@I5%e@xSd_UoCSfz&C3_EeBzcl+u{IvWbQ4Rqo|==O!11uq*Xa9 z^^oG~@SbSUX0EK}12{T1k+myPWP(@aLvTjDi0VXL#S_;nuo<{2Z0h}ub+~ouIvET> z@-SDjF-Ey&hcU9(bl!y}Ro z4CVq6lAGyl6aUVz!7ar;?-GnNznQ60mk)7Qo=X2_r=2V-`dZi9y?BnQ4-EBG9%^k! zim9nUvbwX|PndBYkIoCXqLrKy*^ zZwVZUT)%{Ger%>#J__^601!W!*L6VL|G+iRgg?>esYv-^wSuk_JXWQ5xK%@D#yCxISXW#4UeT-93F|r#_HTRpX&)9ZaGbK7 zJE}Ep5nq@t#Zk33d()?N!*j#vfPzPPL_~+TxRf7tAxi2#0G}{s76kb(D*DQmv!~Kg z-&m-jBdslFN8`$wW@@Ud2uTgK7zU2XC7F!texcg>p>{%$wjw}xxxN|?(i!zG%_T+& z3VEa`atA6r6HnOF(SzP=5ykLaFA%{YHl*xp>6VBsxsQ?gsy)SppgYi(@bZOX38Sdp zNMe>Ld`vC!h57huxX_W;VmhjcMbPTYt>>ZO)Iq2!p48OEv}{-5AB60<*V9i8TUjP^ zNYp6V&WCrUTk}NrWfWB^tjs-4o-fr zGUF~a80mBY6nW~Vc}fR&*IQ9=t}Eo69EMrE`C+J?L!+wB%7qfreCE0w`+4s-*iiRC z%w-J;SHMQ1<`~VGn;QF1a%Dq{ksTilR{>p!*xxlp2{-q>1~p1=h*F$LPq&=CotD2Y z-dvsBvM7^cBdCO5ky0u)`o@2+dpf3gt1kS8^Th8I86dsdM3B58u>j@FV)S zrZc_jLSX;Y+`IVtTow#X=x#p~@*UhT!6SZQCM`t&ESzxysd6-5Y3~khh?#e~nZKm( zLnX9g;m$lbgq&0wGjL}EtzoUD)?Jf|y|t-{4beFcMAsjmzVmI=zB~9F)&P}zR=||Y z&b8APZIK4CHhOQ>7jge?dvJE;Qi;hlw3YH? zx(|pQIxApAz+7imilTO{4%|u;qaz3E6zCt39?G(3b)BdKw$y=UW7f1*hh4ds7pJ~L z?R3cM4{4>waVc%AA{ugl<%rdHtRkyA*MaIh5Iw_FkM7*Vw3|r1$&$m}W#WlAszD^( zEg7A@GxvIg!*vY1NmGM{tBS^=ZEa9or|teNFj*OhL-p|IG2@(k8+4L3+~q=(ydq$| zVsKP7i99PT1{GzTdEr$P?8Z?IlawU}M;G{QN5`yTT#=|K@Ez1AhteJ2EBFX`xYL8LGAKSJ0%ukQwlGR$1hEs?7(@7h z+dAmtdx?OEm7lPaBQf?tF)8Pku zVa?1D0AMoe>7W|1Gdp>T_h0Q51W$_y0Wf@Z<;;xcX^Od8QtXE3WO1RIVGr_LR zP`BuF(&COGD2Wi(qB$6={&uf7hn`wNf^fpcyEj%WQ{CsSq2|4=wm}r4N)N~Y-ln&^f* z!So~OPDe{YiJKSsx|^BbJa2F?a}B3n2_yPFHc5m72_#ZDf%@8-66U#fAcr;@!%5un!m<=ESCyB3MipHCv;X#|U(vE(C=DaT z>bNSymt3QKmcWO%&dT9D^WB*(L|q~D4Lm-jbgzGihGD{#GqT1AANk1OBN<&1yZtee z$lQO!ng)vvX0vP0a`Fm;pO&OZMa^NBg4C!HWow?6K$-gmPgs64OY+$9SY}S;<4F^l ziN1UbM4|L{fPuHRo>d2UzY^f$=^RhYQ`BA0dF&DwOxCPFb)K7}7h6#CRFwkvZ^Rlq z`>n;Zq=@`DjAiJRL`J9VWiecpeGA@lEf{{Jmv+fP3;1JWc5X$Efu5- zmaCukt3%#sdz6up73=e6~Is5XS#YN}oy}o?!vSfeN>f!TJ{i=yo@1W&ou#}g=dzJ+0_(8 z$EzOL-=ZWMUSbaAnMEEcf)_*_k?|)NHzELI<1?L>VlpF%xjmeM&2s9my}6dGXlfbT^Vsu;L2M!sB-GiB3n!O1eFl zC7z^2`((kI&rVJFs2ig%2So7)I7#2k~jiW#dnx$F8eXO;EjQVZnh(*3LarNm;B6UV08lXe7T9i##~oafd@^fJ?f`1)L=psb;$0xyN~4;T zrPq6_N>4|TohQuwJLRHcqOS#|!)hqc1*A>IBxNB#VZHJbNH9O_gH4Y5>5LFdYYYO4 z%{i>M;iiAWCm4dRoszof8A!}8L=5v=qo}l+Kn#mZcR`yDDnb=)fjp2X) zxBmug@FcKqNWwKCI<0wB!|e7qp6w|F;K*xdU=E2oC8ROjtLhuG`bZO_w5p@iUj$bL z`|d$;oix9ZCjvNdU)FCN<&>M-R+}&YW zgBgBmGHI9>TjZ0N?k$~r|$0-+QWXm62P6|f?6`^$A#dn^~}>+SX}JWs&8XITAGH_?XEtbF;GUj2^`=r6X;@z={4I_+&%hxH#b zo@*%(e#2%Am5H$*FFqgWLQbx^G?ee+w!ro2hwr9OzoEc6%cH6%ZZh(d|G{@s&s5b(Wu+-7LSXu(}-_RbqE zpPqihdX81r*83!#hkEBi2KR*6quY8)JNMh(^qR>@RT3XooACzGjj#Hrrk2Y!J0&Sg zp<_dC=V`0*-G7xeRjC-|BWSo&l1bqm{^}uH%`Gb+Hh=CG+dYjeJ}>)kX?TE4U*4U7 z5Lp6CkAq#z4M|A(#?oQ_e1CaG+{S6tOJy4h(s0~Vs2z|$NAxlNINe&36}2`T+ypx;*D8Wc{YYe5*1II7FuI<84rL|6)Mj4uB7zMnh zBQpzef3vx>Q=?q}6?ZfL@ue@9W-7WmbdZrU*ooP2uVDdKiU@E<^8DxO&31U?z*q)z zS2BZPI`Kxz*P#h~+H@|?&3sFXs}dnu2ATC(7Vl%P(n_V6R1%lk8T6s-AVJ@zqQY_q z3bc1vJ>@Ykc2neLazzvuDJDC}l9P?>&f81a$o-e#Hg9u3Ty-~nI+V&4&&0k$>J zDmxbn)mwstwp8JjYAaB)a}&9vU0*s~p?U&c=sBU2n%kOm71_(j7-3N`qieIMvyF4x zI%K2B zsp*X2Ce!?)bIcAYwpMY(PK#<}ooUUz5`xw6Utb&kqiVo9=(2KFB695n1kt4#mz}~Y zHAjDs)rWpr0eS5l*LfCCrl0LPUzEGs%X6a)F-o$a^4xie;>yd>1UrWwV!9Krvm>E4 ziYYICTThawa(P4koBU}M|4`bBGy3G~jrUz7?Lheqn?A@rB5b%I1^iv$6VlCWTu{(c za}218tdbKJt^8<(hF`3ONi?vm>p_y8;H9O=fYV2$eim4BQwDo^qMAmMY5;2d89M&~ zzu5NDX)QrAi?{#;#Tbk zjRJK#6{3n0>0miD@T)~d#-`VSO)I_Z2Ky8>g1(#|-MIk9;(b{^J?_;^kNP9j<}=m{ zv3sn)GD)r@QFCSeD6w}Xr;L2G%3L08dJW}7Atw=dxSz`{)gm*vkD;-%UK#=0Aa0-g zhN&!&X8ivK2aqyB#koDh=ui)cncWVy1dLDG+z+|C*mK@|oO!Z0m5O*mx~3LhsTS0v z4AS`Z%{(exYNOHxP#4m%M%-b842&zz|#UIBgPv&sXh!)3P34LLZ3WAW0;n&3fS+eBb+rND+E{dG+>z3hPft z0u;w624&(S!ZOhJ+Ulx{H^f+{sYkkczryi2dw>6Y@Rx&Ys*<)o!+0E03LLGW`ezwf z9eCx1DH5g-h}Z@7iq|N2b~yB*$Fg-RrEiU4Uu|yA$x&4tBT3=7+3#dCjgr_}LbeBNf#ngm z`jxr_Qs2#co9>n7KTx~vI08jOLc51R1V;dYaItyxU&tVmTp@}W8deuHI*@LtN>qwmF@Bc9MO1Tr02vb?a#2ar9=B95RrCh~wS_W}UaFZHN(y%e8wtYlm@8!oU z65?eCR&FAt(hS(p8ESgR_Db{aU8UtIC-c$08LEOz!OT9Wl9_Y)Ji4vvh#jkY$=#J! zx;cT-ZI0SJlq(euJI05iy10gZr>CfR;dW|&NJmwkQ!qOWY%)Vi)N~vREVLtTJ2CQ$ zr{49jBEsr}hP+vxT|F_WP_0VT1!bbGr~81(soP&m7{O}Sj&c2Je6D(J`K)DKXg(KM znR2!+T$44<77NVsP(S)HRBMa)x3%mpYuS8n$rFaGv7>lga9X3SHK{>Pv9EY*4p7uy z=(W_fzHkUN6I@o+Bj({Ok6UOgcM=^!#Mi=+RTGjJ^xNf~~#N^IUBBe!>O$QUalubv2l#i{ZB_bqy;{qu}S z!GJhX*{c|A5JQU4Vutq92e|+JboaE8@+Nsy&aM5u^jA-H`NBe@jvBbqRDXZBQtL55 zPL4xgnH`gY6aI`oI9OtAyi;c)&LpgKWOa>6My#gF=8N|QShK8@63ORbO1g6MS58w7da39A-LSXTd7)r}{ zwc1q24>^;HA;Op$gmY&*NQF(d&G~IzoOlT2n>}jpWg$=+li|u4jC3R4A}DgX{KUa4 zYTtur*ipe@+cQ*-V)A2#vx|pgg7}4Px5$$NiVOhsU&E!3QXkTuTb!aY92_&4`Sa(o z6};m<+V}MVo;S!XIYjbt>_ph1$!}d{Ypsv2GXrdmqOJrnYLpV-_f$l=VJ8vuTa3qz zADb`lwsxy5;jfJSldEI38zAAf=TsLR=U@63D7CqKDV2z9%jmq+D{Fv5y+oT(n)VSP+J>vpKMyp^)<>G*QG^3j&3VK0CIVm>ISmjj?Q=wf5?+r)xn8R9ut&_&nZ z>YGt4QS_~nzu^E`c<(7Fxw1-*MlKZtY!cgxy;Q0Srjhh`zh!?4n4TGUu5D!+dZEnZ zBr1OC)m2S49s55FCCpk9t3mO^hmG}4$>PN-NmGn&sh|P|T2~W_YLO^wC*yH-=&{zO zEWZOmern#(ddA*d>W9%jp;OtWytyrmE?dd>OL{1N6?hAg(In3`mWoKAR|5N4cec^TzPxg+x@ zlSfY{=S@SpR0eQX2{}^wuQjl81Bo#iiZf?hv>L;&?nBm^qNLXJRi^^n#u&o6>`Z`2 zdsST`8?d#&m?pN-mx{bL;>*5cVc$)V+ZF_~k{)Qo}@ zhkTjhW|kQez9-au+<`=szmfVJDhK?cp21c1WzO-fKoP2fOI_$ouyGM=D!*B7x1b0X zY*BZsydBEO5NncV7lVL5ME!rf`=%P1@0#uBrtD(~;h_ZXlX#gmHQ`gFbHx#>y)Z;` zqnd{1$QO-VY)_b{Weuj~g8FkHbyRNh5^OAb$MTevV}qZyW$Pa(h60|~>8drOR|S0R zIlwp%HF3A4g1rB!>LZ{fuDDA`y$6Kxa8E@f3XSqlX_VKSYdFY7D(>9yt@i1PZmAh8 zAB(MZi(!r=#5+LY7NT@)<;NVMUr_)~H&loNdC%g$m%J;mH9=m=Y|L%*(uwYTw8t+F z9p$&oha2h1sttNd%FZUuUjju6vzAoqP~r(8>{i0gngu^Ho`U`9tTvrJ8tKw9!n2C7 zMapaiULKn7NVsu5x}tg1MNxBpYxVNS(OhnC>8)97dC`x=KO9e^?3{2#Ph;=)p3@EN*2Nx?5{vsa8=jEmm)*g*I`#5b8!e7KPK$7LBaRd;7+1QwX`!Z-|2VTiM`mraR))`#01a=f?A4CA#O;*I=-k1J}U6hha1U| zVFrIhCG%U(MsdcS0T&VpLRLB~UD5I1P|S9q74UxnyUYe!0KYV<47qJA5T>6D%@n*R z3hf~J>Pn``K`ISH;q3iGME2Svb{apV9!cU#JwffywOcVn!L)deib zSBlnli%0KJ01FPY>&*t$_28Z`LxYf)-tEewr#`z?yDky_{D=Pz*dh#+KmXx>Oxr6_ zVoFP6$|>PsPUE1NqOk%#xz4Pn*a?rAM>oVfEKD37yQ}qIm)p z=nhIeCtwpb`jhGB!s{h6%6u}dkhP_3LdPE*X=!Y@mvDV}tul-k$W+{>+3_t+nEE(a ze@4ik58V7LjNVdf15j2Kyy5be0fzWjBzG|b!9%;l#|o8GF0Y)VTX{-YRtqxKU71Qc zD3(>~2_M|3w)CA!D1m-3W@oC+bQ)PyV+p*pkbx0(nOVF8bZv>7Jeia2;%9Y$IVuob zD62TtI!|rzg4*(2~upk2SY>tB?L>LiE^V>V?jdA%I(M~H3#yEx{yB7?jV(h-LL8BLE3i~1#!Ss z=828cBtHWbVK&S{_FfpnKqUhWM|{K+M_?Yh5L;{+M#Qn3jjwynGuHvQIVg`)o1+nU z0hW{!Yj|CHmm^;j#}~e(NZTMEr&hP`#R`PmtB2{qDT>R8l zbObGSZfCHhfK0UodUv(kw4KgVBk?~>AK5{J)sdKKsWKHvpriFLKcjE9cGz-oiC@xt znCdAs$`<4`wlWsojxwD~cgl*Rut9Y@X>WE+XXb-Mj2DH7RCX^?`V3Og5yyltrn>>v_`X^bR?$HaSAex-}IGVwC0ZAI#S5 z2MUNn1oQlyM>RYM4&6>m#iMx`%?Zf}Z5gja?;d%NwAULY!cuB6d^dO-udFRwtwUqZ zkmG4~JGv4*1VxfpPAl^qE6R@$ypWQnNvrUh%ktSe*#`K6WO2j6FW<}m3*-qa86i}X z{)kv@u9MVjxis>v@>$U!M^?62uBB5>37>)}x@KWs`4;2(q>9J_fvoof)2#MFz^c}N)ar38#ar`_goBwsDyVg>gqZ=BATK)k@|PRoC+kRDpA9N zOZhe&rm3cEEBy^=Mlw;7Xqpdqe@Ffnljs?7AjmCwaqez5yDhWb&;fGAhZduVbn*vR zP&`cB!(&HO3e%{2??U(=iw=wLr(gZXM_t%EqE)mEDb_889yLnxTJdgY}Au2j;rEH%ElNgFSrr$!R%F!m zE7d5+eu+aairUOK4r>jekV)sVkL(<97Ogw4OsDp6#4rnjQ@IVgD`L6;^>4%dN9;}~ zaqbSP_Nq8l_HnnD^6k0s^P`Xs5gg1j*m(E-7Qzpe!|04z&#uz!6kE;fA}_b=Q~dlp zh8=MqNGgPtjv|)Xy^r^B+J1pK=UZ&d7}hbBZglowy4cZ0-mu$@rHg^L zI#cI&TAN+DGQ+d1Fp$7(xOAzl11O_prg=k;b{}!ohPb%#zVV4sm?;l|5Zh3qs(-Ca zuwFUDd7cZTSec4p^(I+N0fu*3Xt^ATRW0eOiD}pB77~36(<2+Xd46|!kc!2X*5T<2 z^uCNu^TCIvLn5Nn^bHIFN%TTRQSa(&X?lnHbQ6G)cCX|pY zM#43S`n)E}B{LW@5WKR(F`cSHyH<(N>z%QGwX)jE?5%B7$Q@<+@s z+hD9uvyiu-?@!`#RK}3%jLm;v!u;tygUW=A@dKiF5+2|;fV{%Ni$js<8xq8DzSN;$ z97?Kd_G39=IM_JJkKLLJC-`oUdKVz$CiJ(5DHS(G`Ofln2FS4)iJ28qEq-j?ON(uG zkCQ~o{+1|kK?_ygKKs;3e5IlgF#>bq+Gx0zB4f4h2QCaj`T%AzJ!i?@}PY-SBxI3TgMWR=jI&ZuK}y{CItt_IN~$SY(_JwRoV zT*!*F4*=Egm4OJ6A0?%O&Ia&>2WkE59K7H<Rg=*?sj<33>&Yd5SA$f=?M_rFY8mu0N6V$6-zGvlH z^3nP9r=lgF;90*#%*Bo3f`eD}ifq-BiEWExruwk8gt?$uE(l?fE(J(55)McZnPQ`| zJV8&?Q(3s)rSv1(%FtkFyymdYd~jathPMwez=j{Qn170D@I_^Yy>yS-m2a>IL**Cz zh#tfNu?!1R1&47Dy;SrWe!7=D(J!k=hwa>+N4x{jH?WLdu;WTy8iv%G=D#NXROs!#hWriHsntH#iy(9^(z zi}IE&ZKJpT#FqJ2O2C{RwIQFEy)j9AVrk8p9ZfdyNu_pFW*o*NW7u3yftOx|x(-Nh z{IVkUs9H5QwYa&9I0m$UooTmafY7t~GQN+ zj9b;KB3uOW7jNgGNDbzQ|7eK*OZPf?{sM5{5~s&x!m*`HS@+bt;z;8fKeKWB%e z_!8)3E<;NVW3c<2O%A(N>%%-K-2ny6i%N7rpHZ`$KP>dd;sM3h@x;68%w;^c`HASm%sq;G5mHW#aNMH?j(b0NFs!= zUZpAa29mDLw3$Y!FFqYa7-}LB<0h2Fu%Yu7k!M>p3!euHg^A$`!c9Px4KLaNSBb^g6{1K%*JTu3FKJ??id6Gnox;;aH&EA=TFBayj-B94vwWQ3Jgo=ugAVDWG>b% zCWtC0?{qN`>X2l*B1vT$dal2I{dn=!Yu(D{ukCP8bj>5BPbxvf+K5ULFqzYdtmw+} zO_4efZ=^K>y`s`WF+GFQhI1F}729KnHQhE_oS!hnS%V)m+!FFq_~3jM0SP^H++3Y& zgffR^6{~Y@o_M50Y{^B5j0l|r{23$aR1s`ek1|z5jhJ__`?-(0`5^z@cQ44nPap7m zYViUSy!Wji-ZuJ{=tm|w1TO@jk9@ye#4P=^&5YKc z=r#I!xL3vDPZLQm8`R=o&BotRfAn?PtD*~3-6*xSn!}~-G@IpGXi-(W$g!acBIPKl zNz=7zDMV?q)wiz63=EUjXKl4GbsBo-_`WllBZjGD-ivD#tV>jN@_L>xw{v(< zR;*dyR(irYYE8h`9d0tCmPzs)e~g}H3y{nQbD#RMkv$n6bXX|#Hi42+#q``B-eOg+ z7XSPYi_4j@m;uIxKb%ssK@1N1_mi1$4xpC8APp6=8l`l!MkCctH{K)uG>~Qp*_8|L zgx`9|yF12y<*)~2f&AYOc@QeO)cL;LQ^kTK*%2Jq+zc$CMfgx1V*TdGr}Z3C6{GdK zG_yp?mWahXr;NvzU&upi7a!gQ0T0+aSXg zXyVT0NcUMO+LV&Avhsnp??~w+=1Wm8fp_Q%t|la#DhhpxSmN?_baApLWimYy&7;qQ z(mYBdt#vY4wTOsRaP(2@aXt>$7zrU4zb})Gy$(y?Ys>N2kBk+)sKkszW}?Y!k90#u zI>cU~gee9Zkb5At_6d0l6ff`*Fs@tGafE^PO|k(tph2k7fN!fAkd8=Iq$S zY?VXt3){MuLCG+O!52hK&4- z!foovSkyOP@$z5{;3!r#l}ZbaZ!mB()zJTeZEjIX5jwBxqH^d)Q7Cg(vltFDd+}KukH=mWu%fi4z=GYvM6vjG zoV?Oe@hSg4>QNqQDbjmV5w6w{BF1KtqH`U2&RAL0YND3?DkF;(Du;Ox0mUxSBI(A! zNdOK^qe6>{P0Uq8)tN!uY$B#in_$s+()@GPS-R4!9wh&=oU zU`Kb0-z`s17wI2|fB;t;6Ma)cl$Pi92Ej2B*$d}vCyXQS&%CS?Uc5m>;oRbJH42U4 ztAm}?k3|Kh=(OSSaa?(IzGdVZg4c;AWlGSy$H=!Ym7*15AU$WUky@$r`U_v1CDDj(RZsk>qezD zVxXbFgUIyi?g=oH!a0 z*F2T$B=H6DCXjkMEz?H6+^@ioltlJ{4sm$6_5Q>lCqtqSs-*#hp;#zDShdn-9h)9- z!}VD#7mmQFHhSdnCzG_G6RbMCtSCT1j1HkiD4C&sO1JyI;*^j*TN^4zY|PAfZyJvJ?$Le4 z6j`SMPcqBHU!r=ZXIAOW6FM$pGk6Lkw|YFl?;ziJ7Cp3K@qBGd{0$)|v^SkxPXzt95wDJ5ZbNPzSC@UI|wfqku;0sz>s8cF@sjxj;yA; zJ&N06afCfb?RCc~g8_0+zOm31>`!-BW9}MZ^$)gvgDRZ46tw-}FVpgA*|Ptk(Xu&J zELq7Ibj)3*WuW_4%m}lo)_@hOlZmj|6UhesQ8RloJrRxXtl|d<*#X*of^y#wEY{5B z3jZ}cQm8e#zd0pTTUHwj*9$s_@(S29E4+jf#Bhu4XZ4d}B&vk#?RbTC`7ffW-VChn zn)QFocZrUL{*)WyYH2vgQdjyS3Ip)9i5bxWq*?-h{pn{!1^zXE4s~oE%#d`hX8{56 z$>YVR+KdAq*3&rZ!{qY-;OY)`2u*L^CPNj-UR^7M0wQLB3o$G3Xi1U(?BjnG2Jy+; zlNDGC@wp73*(zUctQsS^c_bVPa4trjXV?n?+)$lS?3%uda0&*=FqH!&OJ2@GDttN1hAvicN$N7>CKIE1uDKh! zhFqm*7|0%o?(quUZ2%&st18fc^msxO!Aw2VivL116D1UK2Y4A&C-EghVJ|;f{MF*+ zr}#flpU$nRgC@!2Ea%8&SOGqgrQOq!JI zWF6Q=j*5FMOv|fkT6F;pA&y)d7Y*ldOpmAB;#qXqi;U})e zU*E&#o9P@u!z}3>5r6r+ajNksfa0;R$-F5zPq3No<2;v6lyY=6)E9>?+EU)Njjbwb ztz;OK9YO`HjO0lNiW>L|I&bR|R8|R(*%#~OTQfGGr$aE<9D%?Aq0#P%*W+c?1H2O~ zs3TR(BXP#BRgYsPOH=}?^E%3Q}~2!oa8Ov&ezYr{#(5AA>F3? zxw*P&&*nE*H_&6gIhjd;iktE4C$HNm7aQ8<7O7a!l_lBmKOpALj~OZ|G2_#2+cz)1 z>K?0{_fzUB#OKhb3A7MP>_BuzpNmI$IX{xpt>8G`eG4wp!QBM1d=&*lyba^S(rHbJ zgIV|a=YRO-*%wESHnmj9@mey}*r!pPuBdX}L>48#R+)Zxw#j~ z#C!q1<2m~J@q+*RHIDO3+cW(&|M<}Br3>}-VkSt+M;O&9V3dRB2VQGZW<7fIyDNw! zzOP9muq&l7UZruKk*%$(V!wEgf<{cXUY=d80rB$e6af**79tBPm5|Y^YbUEb6-y}3 z(`g69dD!rjKPJ=~KEzOLtUe!dR?p;r!S(bK1_l-oJ+$yZ!8yIY z+oMEi+q|5>NAnd|8Syep1quwuVFpNplCBCg*-yjc3~vLjk*ZOUSsLyTfLl;v002Zl zyT4-v7Gk<%fp)ux;m!O-_G&4bD1gdhjgJwm@``&=99iLF0R5pmaLn*$LsObG+;&=g zow)F0ub$;hFcgu<`O*Gn%HmDgTu5kKZX^87%`{p-jAO?r&__?_S%)u^Gu9L6l(gCE zeg32nd`T_M);IB}*N%}!Q%5aD0W)+$54?W#YLoP>I$YK9x|>ly^>HU_rt32S;-th^r!@Hx=> zC^=D?=!O9@Lyjs5-NlY~V`$CO2oH2S7ayq)8MNG?8yJvuyO6>GAS*WR4-!>C;WjC# zD$xY!E38*BxmPE3xOz6^HC`PHp1pyDXV}yC#Me&=0cmiog*9zd+2smGmC5~qXwS`5 zjbsc@Q~_XK5C9s~FMTzG5@tAyhIWz?g-m6dey&(GkIzM!aZu~Mu58f|iUm1FU^A)` zF-~q$djNgWY`=##BU(2>R+!YMfGd|p<*fj+5n`gdEHoQ^0v7s}Rx(x&elFR_v!Ie0e86{Ds3p8+XCDXi5V@msv`?X} z)zh0kJ&yN__YF8kKBQ*RSxTDGrZgzRkD$Z7+9PyN^o{8)Y=j7@M7aSMYEQVkZPsdG z_$sO1P55hPndx)}0;OJBol?wBZ%?Yf96UMI+vR6%)=&Si7(t}@y`jALLwIyMFG}5h zI%?CAZZ{{?G_UB&RpECeTfn7m>0H^uj*oRBrt_`j+Rs#2{2UC=Ka&7D5amt3w!|Q0 z^@!+!;U+!+O2@%@JIZmE71;hcrfQ?mY)aC#}i_P7Ng#3>90*8cGQb;nX+_~lqbNmXNx<^%R= zGd{|rSle>b9)=2Yk*8N{4vj}q0`aGfw0=IV7b$}t?@|pr+t)o z>Fmd7F}(s3L`dHRp}O)85g%x+U_#unXq%sH;jY$vUJQ|s5-%WaRCEab+V&dEB@THZx7COXU%9|4N`5E;})R@LI3>XU&NE zjoe{;JSa{aXqp_s&?ByGH#!91Qb{5K*ySY<;>Iurdoy!rLv2RF1EkMvmT~#b51vaz zP*N4cLyv~Yc_bPHD^Ts($+uuK3v-A{g$IPA{tRjY>-AUgxj}j8Xtkfw^iPZ_g9kR?? zc^zY($m4~hq*J4!z#v}i*H%+Jl+~(F^fpxM>=xS;?JjE-gqgkNQY)c21|oDksJiBC zwn=Je3tP?;i%rOx?=PdTGGq+JKf^7f7u{8DvrCrC$1 z!vP19$heXKvJGDquPtyLcyAMZv2I(OtLZW)!A>#`$x88k6=PxXJ_2g#o>(tF{dn>5 z#~&|#`J>b|<^=%cc#Q?p$33-%tD1k6Xvvwy0K9X5@1X$cT$bOi7pI$Zq&rbZf-rh` zmlqpF@_G#%u_AzgDl?SJQLO}ap|cY8$%}dQe_xLRpoHCWwIlG%E&)ZaJ}%E`_X>R% zU*RcyRs6Sydo0qQeUHU8rx|YufYCbFW8*hh%j+$aH&u$6F!Q~Du(=X@HIk@iVT(f1 zAckEg`UMlm8>YSB*37LzP|*-`3hAW&iq%Jh6jCA zYKn;n)77OZ(Y^kr8>nKO`AT4o=}*S>6PMWbciM7rz3@vk#OIA^leGR&g)9`IpVURE z8zYUa9$Z8n->z;ExQ2VPDZE<1S`71kYmcT8c$JlpCC%WeZE*&IZRrrf2yo3fDgZHKb zFtxx++>+yHGFDe#5;_a-2pg+^ebAf3PkNY)@Qssb5gsAC-{Ld3UFNqkjz&re+`e>2U~= za0$vUun&%YA4+kNyCtZLuIuF4YF=Av$>FsbXH6lc?S_UxS*>A(By9PKJaTi3cNmPD z2bY8=uhCv}T^}!O&2;elOHz0M;Djc3KAiwDl8S&YeB*Qp-fdvydxRWCc-MQNyH+Dh zwJ_tV4yfLlNBY6dSGsAcGc1e7M#yBQY?*0{aFTG;Derh@HyMip#1~ml0E55b9toR`3ayC2Z;&303d`>+MxR z2Laz6gNqIKV5}xynv#5sq;k6r>hv@mQUQeWA4E{Hlf+-eJhaZ0=L7p}b=0WnW?g7< zE=YZ#ovPE(S#}Dbu-OqQu8ifX+nF+h9ic<7OXIr+YafYG(D}H1tU(YZJA3aAcaY@* z?T*R$vIZ%Qn42v{cFx$Bu7VxhVjh^c&M7fF!1sEq)dK9`KD?e!vura_Y=DwOH`V~` zcv)Ai9Ohi#6B~Uv7>A#%b{4v}`s8EP&lfgTASIxHXZOp^RpZ?EmzlIoCueVH|KQ?e znRg&`n15JR>SO+lGe|jI75>bjwfdM2O0gk5Vu4b@B#-&9(l54GIIyC65&`7(P05|e zv3WE^nlM4o4aC&vRf{K!zeB-=Ft>zeLLz zNwU>hDdk)GyU_ie_eN5| zje8A}!jqXZjc2 z0PSbCD6Jrcn6x8}{uIREP2;MiVI0T_F-gxQ0>m|oe8J|sCxD~K%0%cMol-*K{L||L zr5#GBCE$Yg5FU4bLiyl4wlQ!p4`{OxE+;>s$x7KMN;duJe?B2}`edvGRv-LT^Y>HK zkexbdE7CoJtdQH-_A3A$XB9H?eG{yEFt#e}0_q1I4IMIg{%@C0oTgOdB_|iWV+Wi5 z(h@LJD>=cQvM}Yd9pFL={XB$}xv7)mBr%4Fn6Qxy^10m!Hgk1yeevXabs?A+`TYn8 zGhtW+%u_mLr^kWIF332J5~$tLC{00SLC7$65oItu{4DjX2o>7dEVbdKP^d#(&qNQs*5N<9px<4GH z*?2#K!Bmfr#8)M;E1IV}Q1S2iWLk+23?4+!<}<$8TfS%)zn^eWoF*XYfBRYBC% zJvgQ75-L1QI-yj=A*u@4Lhl<1!0l@H#!*%IIh0vu)T3MiFW5>I0Ple^>j8WMt*G() zhJk84Jj${%UyXaEe4O-wySf;P)d&x&H|RqLPk~LW$#%Kf;;lx}5GhK=#CV)-U%Iyo zrn);MMH)g(&q2C7(5&67Fg>8`i?4 z;s=Au9Q!Sey~5Jf3N5Nu3TE2mv0lSFaC-j~LByZGS^S#57rfWz@En^?HGtjVzVY6t zIP)c2B4I};!;QjswU-X~(Z5*BFUSZUbRoX1KW&I+fhUbP>o=AMIuh>F-Nb+KmgVkutngwx1ab=-*Ic{r1VHfBjkaW6Pwc7DSsN@>%;Q)BrlOpIfjU z3C(uwNMCJ7$%zQ<{Wxgo(JjOz8TYt5<#Mw()|52~UIba%2e*V|nOxqmUaRDJj58LD zI&pD($LkjH3oKn~2RC7!%T$h_{w1AR98)CW*ioQ@+brDFLJj~}6cT>YHXp*t1bdQ) z(&GvofMo>9^bC5@$o63Q&6(RnXd3{G=#{aBm>+-fg>rgKtbz&Vg(Uqee_;7kt>DGH zQ!x-UYqmIwFTk&0Fe$iM(Sn>_{_Sz+Nh017IyicbW{M~zhqEmP#NrUv<>nu5UoS-8!o!!qR5%;!41P+&>C z+L-ER#je6L8@0xcY_#OI>J(HB{*cg+8l)bhgGVc3R|c3Nx2bNGs4Cw)hanub%3MVG z6?M~ZHuAUlcCmgm7RZh`{iv+9PRcaA7ocUh>nD=(rm*EQSpn`0oq}Xdf{6QF_2@$YuQaZOG6RteAt15mS?OD{-lL9y#3N3^rsCiSewcM$d<6+5?r=kVI zCz3V%7KM30G3wT}-_KVlfKqU|t(T{O7?Mzi<{NA!5e2aYkjp_LU!si39kP6cCp>?5 za(mH7lyTsmht11Q{tvQ4v$5JXiFe`s7VwT>it_UGy^|G2iARS0Y})(MYNx8oV`lz6 znFeBgh7WLKIfch&ku6}3l^E|xY~AhsEZ=no1Sn~&PZaA7O`$9wlnR5U7~%vsFjmI1 zXLWi0WOqfn=+q+i_Y#)*dkRf>xO31Wl6>6q8pgiky5ML;`xm)c=q)6IM~w^q4;iNt zWq6WOcp+i0;Vo;J&()EBW!K9bHhlZOM5&A~VUqH`Zb-U6GHxFJ_2fSJ1W3A!;C$TP zdJJ78Ml93h=b;`r=Qh$1NCvc}=A)3>=<9stwv|!p5k7ByKNe)ZrjRUEk zf)|?Q=eLK5gT-npzIjok!a*#81rVVIx+5Mh2j`c#Q;D(&(K}u6M_dFC(Pt0`d)E%Uc6JLZn6oT{U$*b53Ycl(=eTop>5j;iZ`J zPaRWnPqG#sVO*Mg^>AR^ibb1aiGBS`4^h??fWU^m(4hf1_W(Z)k;DFhYkkA#x$qig zzf&Ui3nUTltT*;_@#qU)0R&B0r>3YaRXSO{2j7O+q@RKAi>S5)AF+M&NXi$M2G;Y@vYBo!|aDKYbs{avHmA0@lO`$d# zI>_2U+nppEZ^D(-K*mp9r4f;CtyS129IuJC_wa(?nLytqTG9$hV!;ZI5fhV(N32wn zYl5XUz>le_g5({q6o^3x%wZj?9vG*o0pqacC#|prBKHW>ua;0cCTlg(ed4J2`PgvA zUf`wvo-gz3E^)$ayE7VSRw0V#cUU}k_AOS|OQ4kNoRCCE$>)*nFk3m_uDn9Na6T7b zE+wvW=5aH$m{_pyS?h!gcK6YY7PItdR~KYbkSE&2jBy9-YR`p7BKN9m@fEj*dmEDB zkr(y(X~(K{f}878jOh_e8fi&h4$n~W7%4uJiuPDm1WF7>p&oP3Lt?H)=~0M#Oc>wx zO7zwIk-o}!`CGFJbZU&EEN9p&lvqV9P$2P=TE3DqP0^w=j~+IAJ(G?=g#k`j^PS@N z_G~mfKqc5I&PbwOS)p7}TXeCc{d*$iRkIOARYsa;S=FuBMC-;3&VDaN#ioC$PE`A; zQtYgpli+}S73>G7<@DmK0XjDvrqjFgfZ9+A{B*ELRN?KW$e8wtzwpsLX(&##=3-}Af;_TEwryyp=uBdbg?6TcV03qe z44dzeaGnFY1dLjOB>Zc= zd~}5#sg6W_#jc82ytkbv(42;$0T!ja3k`gAhnq8338im&fn4l0tA=$G7mm}r+y&WI z!9v$EpqQgx~arrN+h2oLN?`bQmD@nZeVo_A@s7o5_AgPOoSu# zOx;$arR5--%0Sclu$kMbnNGgz9Z-fx%lAA#amNfSOJd&$R;h#ThAMzvV{LMZJT7$p z^z5nIE(#&}YM=1089hX4XBDVaLMieM;N9T@^G-KPlOBLR81tAKI3XPfQEseh0^2&0YC!+YNdF1I-OA2h2P*BF>Od%fS2Grp=A4ZD1{0hE!pb6+|?iA@PF>I0X${ER- zZW-*+LLv4+wSt-lh@;t3h9X2yDOscwH*>B+V1z^rT#QWDj#Fet4t7nySX?V5Il#*& zDL>S&+)_UU0O?I;a)|=e1aNlQ@j_{Va}dfNyGs3w{l-XPj%rGzHSPveBW$3dSDSH% ziL$rB#&NQtMkcVr0g>7I6&7fGGXT{fjkeY-zB z6@CF`eN@~{tf2_Zx?(a@0cM$PMHSYRM#jgwm5P|X{iF*eQ(i#Sqk^dI3J0eklvhItELgC|)MvYF~pAy%=!7Um$~XxnYo352N)#0`;6 z0celZs59t*2NGqpD_rw23NQVvnL||$M!L9FS5fym+dS+btfeHe>J?bS1+u%(0#BWa zsdd71We;`mYzOGpJ+CoG)_pT1!vay9sVQuufU#0B8=`_x^$=wRupoxe=7mplcee6K z#BgM|P~n}68Kr}gQ^hJE&DYvbaDuj{B4raLGrmXe4!sXE{WTNymsEdP>36uA_g;XB zr4PsE#ZDYc`Hga=JX;4!)LUL7rPi_#=~@FuIvj-jvOd6(yKIUIp?X6_-Xo(0k~f8K zd>1@qi5r>Of5S8>)pD&^_grwnSp!bstV2=L14;p0hp5xSdd8f-t|5^V)_QjYT+=WI z>lSErqVy&Z57q|OJV~TsbK1RD9K4Liygj)^WqE-l^)c;qp|m`7bWe)9XYjR|l`NL%_X27}#_Tdv z#D});oB0c*>|@nLS$Vy@K=EsZYVpob2SnrjVZY|Z!;;(p3h4o1rJrH^L`M3hsf+6& zDp&aajRAdh`@9SCM#|@HwJFS-TU@2|{=_3_92gO0r|&ntbtnYcaCJ`cA%h4TU#vo# z5m*y|ec)!{+vt}v)0;gZL&?n)$$VkDg)Mk~zef0~|1z@S91(4>>ySD_!oQ~IrZx+m z43EK~IApy4lTA%`fUvOKT05FWB~<=C;*p8JgR*a?*=Ya8c7?2UXa)w~DuX@A5gPD( zxk=OO0qIx2Ces+wsN?I+{v4oVGsWD=UAGnodDacc+Hrj?VPO2SnB#`LhPQ1NfGQNJ zG6ni^#TvmYQkd2>CklhUv$f%=1J)ic2ytNN`pAkq6uk}A6n1afblA|#+ZFJRPCplx z5kTcgYjBN>KNrk$Ubwrkc!(0;K7j$F=so}YoT_56US|C0y1O&B8bnu$BLZ#Ayd>&c z-oBl9c1P0RT#@i)3BxpZu`(8H_4J&6D^3Umt zsVz+(K|oPpal>#=8T!mLxM{9%^A&w)13`l`pQ{`?y``Iy5nHznka&6?r{&H#`b6eL zULHg9riu^YeWT^n^{(-Ki6};i>rdo9+<(AVQtMCv%r-7fhv>?373RIok_#q8feFN! zGFX(oAg4SsIe@~j3JvnjG64#L3`(N_-tw>k^WiT=bG8NNF@ai4fjMK!jiwHxVvCgd zS;;M6iBmkk{)%P-j5>~HqzN~?mhFyB*2b8QXnj_OtQY1&7|?=zI4lPWo`nRQsg=I4 zChLp*NV{V2dci7Xnk^~U{I_~Lj#}exuQ6cr?HAWME#Y9DrZ^&I;#ww6W04)in2$If zlR~K@*~d~5$!8K!s|&M*AOrb2EZ?5cCZ|>VjDRtUpK)~o-CHCsh>V0l%_M5w7J+Cz zN{dNK7+aj)C<^E*r6}cbi5L42cbD|eVq+`W;2M?#iUni{L8M-bLho(iTl!6i$>3e& zGpH89bBWZj<%0F-r`PNG22}w-Jz2~)mtW#C{Ax*F5M8L}OZZKZlUA;b?1Z78N$*-p z(tz86lZB+=Rx1q%{|!|l>Af!c4p~y^_euq^9cCIZ9sH4!0WL{75JaLbO!Ubb>3YUv z-#21W%Gt}GSz@4`JKG!f6S7(Faz{7r-oi9&-e}v))Sw;)_Q1@8dM+1l z=s7B~H8pIRHD_?$z&PfSJ%ZKMQfm=tBKiTi9$@$k(oT|Au$tL}K}#Z z!~wuo=**mY@h5M#k$zoyUkttt4ftxcO&(DjCEFvTz*E|@>5z=)PiJg zbIQk(Y{Q0>hf|H4W6L74oah`=f5~Kx5@Y zAfUtGfiSYVM%Av?#j>J##R!5K~iBT1x7 zoJO8o8Ntb&uuKYHb}ba5!zUI~_lsQTpmapz$UM-oh7A@^7!MtLdFUxS*g&Q7mTRbW zB6QJYo9~X*W>S2`449F;FGacO=VqB92DC-^(Nfo~8FM}%W%H^x!+F`j){bM7?EpPS zC$g~23cLj%-7=EkgQy*jqbG5X0o{_=yG@h%Qb$0~S^8xA%QryN+Z2PS;3po~{DKK49l?<&7+XirSmp zm4Ni&ae{-HYA$t)HA*N z!7tNxc;NI8q$p_72mGgLPv3!%z`|Z%tWi(|^@X91T{j&Dr>o5qmbOu*)&@lhHgA~k z4K4t(PocmzDOq?kNOAy0K*=RfCmps0*(aYZ-Xjfrvv_UoKVE#ozu3Iz{@K86T-86= z*fri6=I9j-h!ZfiVPPITqvG4nv>rAqU$w`JPiUZ+l}OD7JT8t789QB zBk%_zrJ)MErgLeB0(o=Kk5;;D_g^Dh>u(p|FlTG=$dV&X1^ejn;w2jUjT-y&AO5Q} zvv_p*K=K79=mK29Fy?V%llBIz3a*KgzB!C7Fvr|aD)rmt^|LpyBc$;`R|Kc3h*aTV zM?KuFjU7Mdf%xIwatY&Nb{MD2QXY`rx}clo8y(5^!VJ#kv8$yqpCNEcFb!PeJ`39i z|AW@Vm*n4Iib%e{b3BQy;iKhKROBTm%RNFr@Tb5a#!g5x*siuqB;xHB+znTnfpLJ& zBeK@Viy!ubQmH%83Im`@63$XGK zSbzF>!T-1TV#|buJ6MnW44aH-2!+_=#sB>;|Fn2<&oow%U%moN49<1{%a?c{ z{V#ukmjMy-6@d}wf6a3De5v3v%UXuZZF#lQV}`3}2?YYJLOu#&To2L6kj z1tc!Eww^QlkCy~vw7>Zh47<2Gr-&`!_}ky97YtV+ddN>s@CU{Md{&E`y6sMMUU;hb zJPYSblv`qKo5+Bt-XxABn0J?OXG6$?2L*K8cz^yMb!W32S9WFRxgzuq*%K=nA^;Xy zWl3a66(q>2qKYii1SMKMaU_5wkRpIYAOV7?k>0=q58MMgLg5GS8+f9A6FrH)we~*e zo_lWsL@DeJJKF9pChk4={O+@V)?QmVV34lw9UjRcGN1nOPI-LtXN3P1HV2mTXb(sa zG8;qp(D0eZCo`M@yXcc|=Bv|1bY}R_^FhJDQoDXuUuLSy%Tk-Juq|(=5O0(JMJ^-z z3`R}ZLy3+^$x^=&=d1&`SyXAe*Dkr0hJ!8U6WfWn?8VUFaEJS;weY@E*w3>gR7*(@- z>(A%)y^L>LY}KYaiD~4~{POh)t?0 zs>y)rAC6(pW_W0`cSjrMh37l?OC0VW=UWsASnRE~e*AcLwtxS0t2p1bems8g z>F~jChAqF!o#p70PAU!uuix)4K%u<=j;8ts;e-fDe;1+|wBfsx9l&a*3uP_BnxywH zRqgTQ09pS+RhQEG*G3tBRWbotaW?X4`^U*scmUVe(|oHlVU^WEMBGKJeV~{$Gn25gRY(4vwp5*nkXwOez6CrkV$|eM4CVO4sVqH?+V7jA( zJF=5vEhXL)UyynM8)Bp;cf0`4KF!be(DrV%zo7mRziG`J>n^E>lV5G`Zaf(6Wjs-* zdsLhMutmT34(tB^V)Ef2f;-bC*BQlbk61yUBEdl=cupt>m~*OQS3SR>5OR| zqcmgVUiS}@hf%F=XjJ^}bx;t4w{zOKuU~3SqS3l^nz0e#bj-AJYdLsqM5~dPssFB= z?b8^zF4v0{7NyvfPFb~2o0Bg#zdB}p>*s7_>TBVz_RO-l0I}w(z~hTR3&zn_<%1}R zwOVbN=_KkmnofD7;y&J=ohF&GX5<}&)udzqiATYPX6%r1T`R~PatLII|))~Lyp&dq$ucG^HMLP5CzV$SXA z)~O6~wjq0e(Bu5GGM}nyq77-QT8h==fU-2?f$t~6O&U!(Y5j|GIQAbXp%8S=>9_=Y z!hDRT{B5R@S{N&}gmsp~fE{>vg%Cr>oLU=a6T%gz5uiV*lc#JoDPfKfEcgHR*A?pC z5gNu5MYI0(uai?`muUV%=5Z9|xfv6OuUDfV*Uzv0?%m0TT%P`-w#wiC@-LV3bHHq7 zIUnE3->|+uRL@KzJGxPeRgdE07660nit2Fe+HP02j=PG#~){3-<@>K@=|(&+C#*D62h341?FHipBDqas@l*e z3+A0R{)uaidN_u^+XVU3*{>#^g=p|K8q?&PKRz3&4YdUp-Y9ft7phE-62y;KZSf7r zXMf}lPxzJ8PhXdp%-J2wgA^yecU>XA)NMKA{zWoJiKb4s$F$iYn-avJRf*~B&ZOO% z++7~~b684GIEk;*DAZdC+CAs;j(2za@5X%HoqX$PO_&<7dGAi9Z_^f!@~6j8ODQuW39}{cqr~ZBVE^LT>|DD?n&bKW7a><-mHf-_E3Ykm{HO2?d|^w++m4iHtY0U* zux;Bc2qdW;qE~nBj`U0H^pO|(JA|jr+SP{(;W*_Y!)0*0>?2)2gZHA&%!}FX9~|7DgtCon3E<#C3Dt1W2~QPok4M!6qi z!<45_XF9lXdccd=oExwMQQ}2){))peob>>-{dW%77 zXCWX6oqzweaqdm+QOT?BJajZB8g*T8?yh}0$=k_~-@#TGi@nLkK1FKDPSR1Pljz@^ znXs;qBMaga<aVSjKBO3sLhIvhcc>v4{g;c1G=28 zm_+8<7E)ZjzSaCjb<3m|CVs?Uv$_&GK=+t`TKMkndsFnqn3s?xS}sP=^69oBcF5z2 zUrr6E%7+POW6s$a*^?A;Nyn z&^CuNqeq7xx-g)0cV9EprOS=KZ=`nW?(<>Se7>1y$p$4%zdAdB*82JvM3?E31$ub- z(;uE-N^q4*6k)`28Tfi0e(%}w?%7q!&>K2~cBsb`s`z}HdziMA`EXMjJLCE}^wq<8b6&`ND zZ46se^C3R0$GVS)jMSN7`P$QquHJd1SE&}1gD2;?-Nq|j}s|c;%UVa=YlT20&Evd`}YiUF9MVKEll+d3Os)J+yCSZo(VY_H1}&1R4O6~ zS{2NCoJTIYH-agTl&qlg6%oG(40l+_uJd zu!Ete=#1PI`3P=Q)z_TMb>WSR&xGQlfxKv|U_?#PCb2oCo`q%;Is)cGW{V)Hm1}Ojjm;YYUeGpGN z6&K>>R0xUN!w!%rz$w#4mmc|T!Q8s81Kte7uI{wot{>i#VM5Fo_lwOYwLJ^&tSGEf z2IV$USghE+CxCgJp|djr6)xSNqO*iOKXQJTpB9*tYKw-49eHln(LiJCMtOE!-Mlq( zmc*~jQCDuSnK()ym5B>()Az6y*o%bTv>b`&^?O~`X|3glEabRQeSvKEgMg*Cq1MmlOJZ=7_GiQqI?_o zi32%ycFT=6Iyr_v6vMDn!2C1YN79Z)?13)Oh)~^D6UIWMh^3R;6&qF|(*1?N8KZ6=Vx4tUoTgR<}o7Me$041quOd6tW0e>_a!4tX{BQZli9C_@bHZ%A_TG zjRQQ^c>jUUN=2Ayc^iy?fqj?*F-O!N#t_71C0|vzePAR~rSuj>Z*GpsgL@e6N_iM{ zE?`&fXUfVbWkwcQVi6L(LUBqe%;!J2$4~8!b1S)&@N{;U@FVE>pK73(MS*?yI_D-eZfd-^SrAX`fErOoP97 z53fu6rD=wT8pj6vfrE;UA)=Hm^<(VpXrf|S;=;)pXOcx}(4Nvp)Ii36GE39kS z#Cc_D?I*z&UaJE%Q7|Fnv>KAs3w@tyJeXFff)BUT94oveoyP+Jm@FA%0m3 zMw}7G5ek9C24&9RPE)knK5KUN+RbtQt9!>sxY?ZpUM{h~?iJ~vU;WFsDLm>A!aIeC zc{w|`TVH=lIofNiTZaaF6Q5}WP4ATqp~P?TeMb;>&QaYZlHXW%?PywMqrO`evOP%DL} z4e6%{5%w?E7ccSj3Xd;Z)Ck93RK5Tj*^p3RLMbKCEp+PSn!l&s6!Yr_uu5>Y7_aGsSgn#&QR3q6bz~a&;>fLw7@e&(aCH9TtFZN z2_m&19sEM^6HtrqQFyw3iH(i1g#>B>HtO5Tfavt%GAd28QAmsnbrXerCg3{0S>cWm zi?Wl24%{KkL8pi%8hVCM@B}`t(TCFuu3EW+Q6N;;C*pe2DCTlwEzUG^av~@I#4QAN z0Y5rQE#t)v%oo%@gTP!I{rz$_swnvsSAJB@WG6(jqh89?{^4$YO03`^QOKY24gp`J z+X0d{1-O-@gnI}S7ID%lv+^&pOz@zPs&Dj`NZf|KY2($#PJq^c)`k+oEHBK-Sc}27 zvix+#pGHQuCAH%6uATAF0oaKAdm6h&B-e_J(((sGQQor z_i4;n^9E5l0A^!}yktfKwdtzCDU|501=i?BGep0^b6cD~5FU8gY-1EM zdkF#7=t5A4w3_3OcLy-G)CaX}y(#`%%2xFj*jb>etllr7^M)BII)yqR>VwJ=)}c)$ z2Bf={yoyL0=mib=+@^$+G~pJh-WyqI^)a&?z)k7RhHk3PeZ&B(-svrD^tv@p1EKoH zYqd7|OQ9rAa8MVvQGzR>3dlOLup@)Oqh}1z2gl?nwl3FhYZN*@Pf1?l4_itD~k_3I% z$AOp7s+>nYiuTlZA2uw#~jk!L{OYDJugJme920Kg9R<0u1KaN4-msT;BoJ8g0dI zHC~gkLF?H`(hywd%7^M4g;YHqxzE;nliMTwZFn4dQGoSLr^{dQd6Sh?j0Tzq=OG*z z#%yaS^z!SGL9THt?0kKC7+QH76R1QgS?gTVX!T^IAeW;6j>nIDXJK|)WJ$NdF= z)uA@Z<#wO-D>ew$$DJce3w$YawbL052=ICV^iWvff@e~~9bGb0kugG6RYW~KHV*?* zpf}_`z}uoQqkJx;l{Gk=0IYw;y38s~x{pqlCmZq4oBG@yT=cAln=6}=$#s2G!ju|a z78^WN<-1*AhDwy;rnK&Qw%A3rRvmP?A8maSV}oP4T4XXv{nJ9$Tm6@?(xl2cBSvcO z6fkP@(RTr{uEC&(lm6?&?~Qw;=~~kZe+!Ih^DU_{bh-IfZLJKf9grICcjk+i6WcMZ z0f3s}PXR@3KJ_eXCz#soAOB#G#R*hRzfFuU*zM6S{{o`52Y!f)KK$J3tw8&@4a9Sf zKn);%3B|}xH6FX$58}+g-)jOGQI2y3c_{PVP<~jdn&fn637G?NXdY_D(~~6Lboldq z@7K@hhfMcpcB2$oWO>;AaVX39Xns)U@%P8lDq=)Rx2Z`S)n;^G{y^!lf}Ikis$si9;&gVx z@t7b?VmXe^r{Y*cD)=3Q{|`)n^Am8Sf^TGdr<=39DH}8UC;zxjPWMZm@qIB;O)pO2 zRKXi7c7r6>S`!zk5&d=HesVL3+se6^&a|D-bUhYrX2lV1*7s$xtmx{ObP zR6HDQI#B&<&i_L8eV)QmkF9ydG9m3Dp7a6)EUp9Y$M^!W7@MK&gr_?GwUVKv8a^pSUqE%mC@`lT?WNX4j63X0w%@mJ< ztvX+jp>2>KcLZsPZp`>W^y%&2f%lPv#`tF|9K)|8QK=gdI2{+O4e2x!Q);mq88n)aYmrR2sEZ^P-~Fh22l!@apcO#Z0b zsBJM-rc6gJb{B9i?))+$P~ z^8rDP3zfM_&4ZT2YaD65OzxgiQ%ImtQjByqJLV-XT+heQ+D?TwR9k7E8PAfoSE^*o zQOZrIq;HMArHqk-kW^+hN)|Gp)bxD=)|dNgbaDcqmU3IrNbQrjn}+NVzgsK$>Y&)6Qwr$(CZJS?g+qP}n z-ueHFz1gkWz1^$suD&|eRo&Iy?>Ud~TK{sBb}07>LgwnX2ho0|n;XzsSYfdU1S5R= z>O_M4yTkh*>>5M1K)49G`o<0?A{;`jIS+k?iTiC%+ZA`bn5x(|Jl&8x&r=N~l^)JX$V|H8~4u2t`R)+Fp3^#Z~mmvoA79ewl3Oqzo=w9_8N}9Ovd#oOEG|^;A!y5;I98gd0HPv0}}{aN>O` zXZ-ApI2btwwKy}^yCEnAq_@jNdO65+S+myh=jQfK;$5Oe(=GKq;1il~(fin!>#_bT zA`3AE_;r#SSOFHq^<1_i#mgjrx0z+A16T%>j54G>I0eV9Vjb3_0fx<1!y%-b8w9S= zj^@?pd-u%lf)y~cQ-x7InNm?~FwmIi_lzPqC>@i$S$K09T@Ko9^oK=}{(AsI|K0a) zJEnQ8!0Li-i)$8X*Bj+ zEfUCxk&NxitXwgs2p|lYf7_c#673nhFx~Mr>)s1`DR_&?74#fe`E0xv?11aA8^|hk zD_h33(FS|xEmzHqMxdd~0Ay@CCj|T_$fnQrelZ+6IoWuOT|cw85{5qR+>IN!4cn_W zm)lbZm(%{t9;Cb;B)F2i1hIoju}9Aw_%5rg)4k#D(4b93N9|3s)v>gPMDh(5cx){< z6HQaPg+yyU5w-+W7C!J(j`UjR_c%Hso|!MY!>*-iFe5uCPmus%SJeVj7y1`p!zIi^bFw9nJk|r$4Jq@Z#y5aW8?op}$ zkc2@eI`hC`|&jWzhKnFG{0M6mhadsjj++ zba#c>h&o!*sH*i)a`do$p~OaJ^sBYg%LEAgbSnM5ZEm{@>4KUW8FT1YG=h7H_PfmipEhQ>W)AKqFE4yj zl#jA>$}eRU0rVxr;5$CP_={XOX+@5#j~Nv7U&5bheTRF5BcPM>bl4+axFj7wTwZ>^ zuO}zr_nmq*FIb#gTwdu&A!5(v#p5X){LRD5Mc_)3p2`vjWBjl^U8|mXCxA{3&ku|jtpk<>=cvRx>43wrlbok1CDS474+-c_wf!6Q@W<72tPupYt@9>L~0gh z3=iZ!v5$(nha2`hQM+2R8!0t!yZvIzpqR+ zvL;ona4|nh?fcWzY!A->UL5}&yeK=#y%@3vK0Zs7NdA=_aBiX0N)am^mn~%D20HR< z^mXOUz!~;b^bA~KQfoP-hFqDlpmQN_df%;(Vlr5P@k0Z}7)E7RD(NPna6D<(EIcY^ z-Qyuuqp6l6tE%#_vW7~o*$%2$&)6IAm=g!dlM-kbl!8@jLeX8qE5R{#(l1!;L|>$| zax*;++x-3<3|W67;c@Iz&um^fX%wtO7*I;6nE5QZ(OPTID!SCOwugUdmo%=i9cV^Owl zPLI)os#E{6NHJMO9yKWC!DVdfqMIdcd;;mh_D6x~KxWj=L~CdYX0Q_EJs9I|FZgLi zo=ac<8nMbgjd7;4mw`c>fq>TKzu#H6Px@HSHvc`iD&ADPA~q1 zd{Te?WwLQ{((P>iEAQDh3Fzea8QcHJxjeYcN9o)Rf3@a8^z6ZXF9A0EfQ zxJyu(Jwo*Bc|pN3Bfj37CDH3?;m zk`z&_IoXaMW&nrZyO&L`PH-A5Ob(weB2r}4k|S%gh7yK%+K3c8!*g6mdwY9c`6=>0 zYyNG4vz6i6-oL-NQK37}?X3-O8|=CE=s?OrRBJ1Lw$*N|eHh+cMNeW$cLsmn&bJRk z<1Ln_EH{n2leCdko3fnjeHl|>@Zr7S)paak{dqBNhA_WvPJ*n_2F)cQO&@CX2Yd*p#OuPX` zoZ8KzLmg*wMw*a!;1C?c@&}rj&(uVV3>@vAadWH8jLoeRxrh4H#CJwQB$-q?%yecE zY4HRZ_}$5MljUWeE;->bo$kd%hy04 zf9%b9N}+kSPL`|nTM((I4nXLA>~0iow?p%6>Qo7R6xaaCppt0xoLs$SX5h^P@Yd05eWw6yu%7V2kimJ^%_)A3ZpWG zRYF?QBR5iVCea;hl3#{jw>{s?i4Za@v+M@VC@{#8ync4gxjtg-Im$j4|LlVxSo=P1 z>Nx#%&Y+}(0YvC~2d6LSmp2|Wd6z(b)@WTJc z7;WeSW;)~5tYLOtz&;FRRIj=%4ouSiEn7TM+iDKlCymwhyl~W#7LJ+6-V%_=EIXcr z*eQmA1E2JiY+ma-{B#QRc^^T8r?A9IEIIFUNW#x{lvg1s^g3w}HhwnNqJk4jTjrp7 z^h0a6^o+7oxH{2kj%}+dt1U^UDf+G78g()Lxb3*{10yw*J+tF;LL%Nzv<)~@jhT^r;VE6Qb#6^eiceE>s*-(;zaP54CvdzYP zb(d2fr$7&FRmzG&-(R9(a@gZtZKT-@cHU@ZwXY=m5mr?K|H)W#N265}Mbd3%Gl6!p z#`Okt_<(O$27p*25usS2^Lsr)SII>TsD=;!c)uN#Ppr4qChS5D)PjE*nPB?#T?P*B zz0?7W9kAG4f~7DK!EacQ#5209%>l0dh>_>k^;(z!lZk#9_z3ziS2~}faba##sZ97Tc{4J z2!5XbkjX`}$4qihHfo7#0xPZ!i8D;Ko^_CU=E(M`*Ivu#W^H}rn3=Lgu*mTfL*nh* z`|OM7jv&9hknrnN0hi(%dn2tu8+KT&=2Ip~;DFpfU5EK4 zaFiSBv{nAL#DN3U;zA?q5se8^LU*&hxwo=@%pG>!ee++%a#?Dop^oG3VQ7_{0QS0* zvj&f1c&F`XQhTA#W53UYWn2)~5W3=oSG}r2Jp5xEsAlH1jk=fTH5% z27Sci~!E&SslmJ*_&9TDZPydC36#ATfuT{X(DWPt?G6Sr|& zRF>OL_CMOAcaNt6>cR@rU>p!L{H>yCN8}a_!Ke(>K);_RFltpKP<19(ceV2z|9mF260 zSA&C{$S(Za&74jlxA^KyR+RlT>j$*f5dI?y?9e92gS6;>q+nk9r7bUy`I=l>?VLEf zPiz@gpF1)cRq8%o9_c6Wo2yX(r&i0F7R&$=l<}F{Me+j=X|@N^IlW#QB=+wZGroSU z*n)!MW~ra~r3gvGWngQq%C=0|CjYeO3kq&%vk11l>VJVl_oC2bk` zTJRyNQ;qVG!g<_Iq+uvbg3@8IhBQ3q&@0zaJUn@5bX@$|QQDQl4##57u;WSBT%Y$= zzVrvE0|9&Fpn9_Y{E*0j&Dihpq2EI@-Vt}49iY>_e;PU5#iQeb?N_dX4r#IlQzQ6b zC#aQY=c@non{U%lT;veb_HVnEmKK-kdL*(-n$A~^+9L#uB2lbNOF0@A(T=N2epx9r zu2ZhJnnOb4iOBczBvBr}C!pZGZ+XVofjHqXWG%rlJ;tPw3)R;~QY48OfdsWzeEE|V zouzly=|7wvT*CipRjU04^sKYOii2B{i`Wb|fJ0Tjzw%+^RILm0>#zaA>Gjkw$(YsWt;GyP%|!@Z9cU%s9V zE4;c|X2)uk(aAKDC*gzMeeHqZIL8XLpOwobmnAs{_hoT7GBKaga{eeN@0erK1>X4- z$q#==#u0z!nzE~MWQ24@bV)R2uJM}vD~FZmv{!=we=-nol6r^ZZ`YxKfwA@r3K#2D zz748JI9=&?TZD_X)$%G905j?8Eotpl3XD?hUvXIz4gxoBV6Ve~u1>&Tc{doLNGjKy zu+q`a$_Z!_=jI&!Wxv~HZpU6BDlTv`p4adtY9eMZK;whjD?kzjyAI4-OeXx`xA}J! z5{S@}y3_j1g@OghkZ@J^h;JGntzTRsRPW%vZO5~YJow5&yEEGW65}2dx4iMVB6@#k z-EesC;oZ;>joiGPVIYaQ(m44giqr9vP5S5%9)~YzD2k(+iGGjW#*J8B#Si$mMp-8 zHmEP#FE&aVJt9Gi0Mm;TK&#qk5-vFhLf_f-*7>|}e8|CUgehc?yDDX4o|l~fpjA?i zmXsyg-Isw&RcJnkk@uzIp$0C2^%t1r-%?@BneeZT*PRhsThgGN%H>2O4sEAF*2egq z*2VhdHSO@1lbj?2)UPL$ufu;zI$zde!b{?}^LuHc_7|I!|&Dz>2uCJ6l#g@{h4 zTrlpXENwBrB}VUW{PDAZjDeHlm>Q(Z2cUJ3diU$@TI@F58yxxI_<$3dSutw?4O zBCG{=DIS>5Y7(#M8aW!5nl9A)883Uh(89{TC=AD@EDQp>;xk`_Tq#K5<*qgpD-4NB zq$Jzl$y-&7d~mIghiF4zc8qI}G<=#<2B58^mdUFSFmQC`zaS|eQMm5Zt#s<-4|cy4 z{7SA$5ddjEcyUl5#?dXx;b=8_upoLyfWFpgX4noS8bL!zr^^?egrY1!#iq%}*{2S} z)M*K*cDqWU&~ST5v68EeDZZC$ITqqq@v|@Ps3-%Yq}4e847!jnhlnwzAZaIcD)mac zQYf}d?K``V1L8&h+a7EPWshzHd6Le$V!bv?iKpNJupL@|LLEGWq!JKsqYop5A+-#+ zikoCf?TFi39 zE3}Qbo6d{E)hJw}@IdgYByT$dvw}cJUniQ=&XA2vnPpUbh9{Bd?;~KcBe@d zMHvH8T!Q%!^j(or>4{bth_j=hf22>RBc0HTh_oOwDs}u_u*0E6@lcdy9ywSXpR1(I z;gl`VU6bH^Q&&9XGZ36R?X`vaCXbblQk(tkB0ING?05@tNz}D>l{OvPEcvFIJdo%? zM2?zU8aSjD^eK&)*;#Nu0EKg@8SU2$w-EBObf_ndgrI>EWAz!#Kg5`nckYkw;2I;2 zSmTUP0C{#QyvpaCDB3=YxCaL;Gsr)Ex6d`ylP(y|bPa?K#>excNs!}cuQ*%-8PrgOn`tpkvKL)|@_i8??R zQPG!z-H>rExV6|crToIYK`2ynyPs7o9R)+Nr7vYh4XyyQQsCD^m6#N7X7ODr2C3OM zSw3s`2B-?WC%IbjlaaJ-*%~moGZhV!XBm-&$`b8*aX|q)*IUv(*_#6}4)k}T44sM# z6t%Di_Na*HZN`oaD8ABm-NF{zAu6+%N~xeU{8x)rnot?j^{#5S7L~D=sB%D=*prxz_7h_Y1Ud^F(rh-y33(5BHnT zJb6vooLLvyMA*Db)iG5o{x(B?!b%R~R0HR7LU6&a)$7HkA#y8s3%z!jTPujuW(qPa zy8d`fJ1xJ?E4n-71ZnTVx?~*BziJGG(VZWUuZ3PU({RS^^orO*JmS@{VwcdF(Qloa z06R7DKUVua@mf%l(CFqxIDbwk5(WVK^Xr4vTbqzAjJm+%@6jJ;uxRdl7lE_$hoSVH zS7{syOB^mxvyqg>3=cXk76&;Ms=ub&Fszjq9VX`sn~`b4C+G@fo%kv^7HX{xw+|m$ zDYF5!=>on{Y&$%@M4~nV?nY|h!v!98k?C`k!p0TBfz|XRfyJ4LhG8MA{rwIjtgK_G zyo6h=>;w7v+msGKmUd8vLER$cnqaDPI4^{=NLy%TLzQWR$iTs0phGP^bB5J63Vya) zS2}Dw7ib1Cf*if`LI^T}I{wb;cS4v>G9J72W5{*=)tB7BE>s=-x6b-_>p&tIH+-oCs<$+OvQydP5R(aO zC;r%#p&<=RgO+}zP$(rm=^Z3YS~`Uv%d=uoa$maaHk*N6Gv#2*1gOVG@czwMwNJm; zm`dTsr&rF2-mkCutgy$lU3oOLX3KiU&(D|TT*)t3$4D{wBsrT5RIT~bd0u4=d+)$% z#WDmD4PKzdF;7WFHDhP9cpFk@anU466%0R*|DxHp;n|ZUX8JejsJ2t92i_S(rOemq z{Fo(7{;2S&n;1;za^4bygxSEJp&;l+E6d89rzLAQcWBC1C$(CMjDK}^0=qj;tfyYc zc_YYfz&Jk>Js(4v=b|Ftmmd~y2(KW+?cw(H5@DSEU$RlIL9oaGp^z#w9+<-0#lW|B zq-w)AQtV$bXh$qE)kxx`3w_ERB-Pz+$n>6xbSdiNP)hTCw7V;gFR1WEXh zdTUn;PQzN1d~p(6ab5W)GX6A~V~o*Jq93+LEi;)(W#c>C=28Wfy1~DkX$jHQ86ks4 z+P9RD)u)&EGJfSbef&5jfc9CQ{psI0-nI`^4SkVHQ9tkc&*vSCiZqGOhe-F**XNE} zW_!Ut%(C*Ca%$4TBNXRlUt%VWYtd-eP}AE*2DnoiEE$4~krSOZk1d z6L`6Aj(1(wyC}PWByNe7X9tJILQzs9sI#Y+5(hvtb3SCKK7x@-C=d0KGa&(~`&{Ry zT-sp>brmR0^<_|$Z(LH&nlmHDJU;iDS9ytB`|YtDxz2KY-1cqIQOf%TqKT&9Xe);e z0u*FqVcI&w+oBx6IL5$tFQk$Tx?^gt6p0&2)=X{DFlh(YolMAM8=E2y$fnH&0%sj@ zcm~soB(Nv-^CHSh{vJO2LC4|>RdbKRyx1~m`LkmvMCuJzw&nU^C<-+yj-R^;;Kp>w zh5=e{3ahM3Rc`EWOCMVwKVwL(uQn~&TI~}N6IC`fW$sZIi28jzYh%!$$p^>z1g*CmW5+TTOvlcFxK*vm6O6A%j*N6b9xM~AOS$W6(-r)J_^xxGsgKWVaoai1Th<3}#8|4H z2o51wE^00fiz$DL6D|s;UAfPVG2AMnJ7*;bQ-7j*z5c6)ZXLtG(r$1a=T`9{9h)%g zrztAlwq7tJsE}xAfVgsIJ8vcP&O5gFi<_$^9 z&w0ATQjmfeT)4Sz6L^O$1V{xMS>Q@&r?@zke3H9%OWJ9zM7bP%*VJiTS=}Vl)RM@wa>YlXV zsd}Upw}AW*81JckII9K9cF5d;+2gjA>qis8q~Ah_*rQyu?IK2tAdj$veh&P`MYVep zZ}9u1VVjsc+Y?q5eC+t(s_9lbf34-2GXiKGkJ)C=FQ=Btnn_WxMA_0Y*}gS3-%+DOdcuO(R&2AIkjPlG1*>6&V=vJDV)!j zJfXZk?Y)mDefyf4--W_LqX-f;d;##PHi5SYT{qXLUtaqvUzfR? zyybHeK<0I){UhwY&d-mFzz4^_v8AgkN=DNaRX)MtQ*S*Ke?u6kvnc68{Uae^6U7q` zU?{F9(fu(Q4<%>76>j$m?@-$K;+po#x4;Otedw{Tp5hbsN&gwN1u9qi4m892o%)8b z#KozJD?y>F6EnGl>(^CedJ#ag_`=X|Mfbg22<6W4Y;gDZ@Rz=p&L5~L`XML*+$Kj$ zD}Ew6>L9-qooLtWoh1kfP!=qm3dwtJ4`j|?RRcGk@Qqt3Tq)U^?Cn%!-X1qdHz(a z8|}31NwPo#n_yM8NfTq8N)zEXHfi`)OLE0lB_J|hPUfiBlR&?WlN!QBLcV;uhYVds zvml;Ra|@v#2Fds25WFE9^#xAalUExW;26ynMaHoPq*u)myBYOXwY$4H9T0Ovg9xUE zN0sYEMi0x7as9>XQ-Kt=>B}k-xNE|b)v6&f4Y?bWXHfqnV=D6*^8F~)-Ad;sei>I6 z+=;uJu1uKpL~6Hp3u);0Zwp}~=%2&tIyEUKTe^1ukk%vQ7uHthZ%K^ z#r!EyD6!n87+4aL+VApTZ}91(w;|`xe0MD-&#gdX-RXRLEjO7_V8I2*aWJF}#O zbV8F5FHW1`bpwCqrK}@RBZq{f7E>?$R^9Jw?c6~la=gE=b!EHGtkYUOpIw~tL*$IO z(M8a`dLGBN6_}*ykoYdH48z0(cVrmGPgpa3{OH~v?^Mz}O*5Y)$!6&uz(%(pOA>q? zM+e(Vhb&nIF8!nhHT}Hs;}lIYk89B6jWRk*{i>7uxw;&uH87Sdcd%!(lOJg%U;xnu z_j~>qeYnR59jpD8qgLKix;9zFf*q-2-6wDY?c>32Hv9vF zzbv4a99iTklpFKutuDJ|tz7i1bvnVP)=IEx4OPyI`R&{24sQr@OW(eqP~EwRTd@Tg7C0TJudCjxzA_vy`emJB z=`T{%9lkbz%-~o}&&EzGZvujBy5gx%*$YyOq$%Roc%!#ya7xK9020zwINGd1qps2E zMYCwnyG;x!H;#%T3*<#djB&jyn1S`xK+Gj9Uerc59>HwIw#a>^>Nam`Jmal?g{@J> zgQuKr4Fggr9rw1W<~T)|WX(m`c;}-5N5>%y%)ctCmZ5|^Bd9f^AqhW+ed$QW#;^t3Aol-2z6bs)OGpK0(C57863zPF!Y<5#v27$gl+YwK=(>@;RiIpB=c1;2##az(Mhn=ya_ zD-hD*s=}K=D!?uvOZ6+5L4o{2B%}}Q)f40Y2bW#(0p}g}PWZ^4tUN!jwm?i6zzzp$ zuee~N@|DTan(hZ{gE^M7v=j(U@Kjw@{ln6M+_A2rlN?kopuoh>Hy?8!MX<9tWqjubD~%2cbnEzQ6cukMCy#a;rn? zSdoGLRg!vXA7r-w*KiMxsVuO^Ru#H#pGvzrPu?k+@nlxuUDhf!m{9X^q^@oJWm;<{ zb_8;lJJ&;}?5!W$3UO5i5TkUJ3lJ#q9Ie%ygT;y^M%JTo<1f($aMNDz!Khvl>MJKY zGx|Y$lREidPEfB-?cB(UQMYD#jlkw8Ob<~^xJh=aB~$eZnwB|Y_y*iFl{8#7yWYg^%HMX} z%?Vyg8}0Y}umn13$L-;ENdYPk!DqT3=MEe)v#f1CgE|8%kjm{WpmcE9{{*&E8{r&s zdB|bup?vR9(vsSM+{INktJiVAEF7INANyD!yLwdA*z)?^(R86q%&*juyBNH!QcxuX$on|i{QbL_=#@LsMR&iMD|3|N9(b=)Cu-=U5yF$=w0Ckb`M)JPh=}<#iQg!3qv@ zW^YS9rt6qX!?qa^{JORaK#$J(k@{J#E~S0`Gzj-hg3$c5Y6y`UPNU)If+>lCP(+m@dP!odYsv1SZazhXOj=c z6z>{;Q4yJzPT~MB6QurwOS_EN9s+Z#z-i%FGY`R6FkUW zZB!;?loX3se+aU@1^3>k&jwQbGA?H2C1Zj`_);IR)b-4OuVd*kCFy5fz+&V>l&&;< zAHRh{1TxS(3Za&EB4colse8H`??^cvK~+fcCnCpwY_xr{bgFw+yWQ#EM8+}-awUwr z$OiZmhcbU%5IDrWeR;KGL#$dP7)SD@h{sH89rn+^XBwmU*!CzPStESz`Ss;5|%OIZ!5?*NR){@6O<@v<$L#d%;N-v`DF$B5Dp3DG)O`$5GUr z>IudfPiM@{Ce)5$5=hMAV&H)rKCkT=!Z_IA$y$S8v`OosO}J!%zaznH+Ga`NBvYJ2 zu1m?Hy!bd=4zMDPNlg;>P8a)*qZtYi71lx(blAT?(oSx)rSZINNr^7;}rCZ(c|l;!pSbwuvbk|9kHdELo+1Y=1Vem@*%qD9W=G<~_X(NC=Kd=0<)kz|xs*>6`Rhm) zUI{JgAZV9JwkeEumZ<;l${h~2OizTX%UcWji_#CGyK4x4e~q}`FS*=&^S%H(;cO1n z!HzZ(f-MjNjMT51e|&m8PhxEbdQAE4GujeWG^em~p6opOeM?1J=WZ znb(_fE$4hmB!SC_TXTVB-PZ6lo8W!*!U=`D8|FoEv^QO+&si=cDP=AyzM!IYLkh#7 zt+*b!+uum;Q1?3^{#FYFw43wky~}R?wmqgt@YwcZ^<_F~M2Wa^DW1oKLQ;!*nv8Pq zLO1UZCY+w9orAypffu_+2Aembu)3DNMy>a5BH&f}rc~wEe)lAWZ6g>UiJ+OMo4(M| z1EU0!VKBWP9wQg(2Iv1IvadD`9&Pv0x# zwVOb`V)Ua%+_BbkbRsz*Ni(+~s$xqt?9lw!JL=<+$2N39c9*4bmlS5Q~O*9sp3g6&-AvrN)C~s zb8Q>d`Kb8jkM~{@V*ALg=+*js3+b6HVTc|Az)B#x#h@!J_Q9qUOI9cXz=S8ST3;64 z22#GF$Gjkz-ou|i&3jl+nn#p>9qfL!JIJXk3c^GrmMt3PiiiteZ*h z8}!@vW@Ls={ye3NzmR%5>cm!@C~h>LGrc^Nv7{FAM2#iKTS=afW+&8&y6YpoNtlay z)d9R6XQocC{MH%;#jv-g&;!$clhj;Pe$AXo!QtWiH0>#RjX(eH9J6l-5O}__Y{K{;rzFaEu7pFF*h#xI0|Hp_DF`9x^lGm%bC4m|3)U=I*5UYzoQaR}}f6j4?G7xVuv4hr)h@SBg_NgLVz)?M>?A z6Y&I9!f&De%XO|Dd9Xr|KC8#9g*BBOGjggwNb}Rsi}aEtNhW5l0nIGodRdSx#=z{D z=c@TU*yyqK2grfG3>RoT)v9yOk|JaYz8IF7B9{~9QY%%lmxQVZ%hI<~r0ylkh{@5q z#+-~j9#js{OX%if!w&_qkr%FnK=)bhoV;Ucoz!7f!E{w41MHecgu|Ow0h{$+JJ-^8 zSp=zR6B+-c0ds&fQ`cH{Rgd_<<<1SYp#t4&lb;dWY~bQbo8B~kCGy3-zHr>c^4{1; zVljIbaTXJfGd?6AyS4zl4qwJk(>-tDf>3kq#%cUxH{=}`DrkIqWUzcm8fCRF&jiF&kDgJhJwD0qAb{be@!g>1WhkfKjp-+VaY=vwSWH|`E%`xGKGCxPcuwJ4o zdFQ!)JlCjAzTpH@!c~goopnIkFn`+0osio+F>K^gP{!9&ai6af*`Qf%el1+$=p86& zPz$lnjkyC@kpm!bRq8@*Ihr^9mC7*LSxPZZFeG3?Ufv6>-xyayVjX%AABnA&mCSf# z_zn2W!;O+3Q>68l?*$r^W2C7f>O!6*g;(I1I+EHTswAQE%PlZ{G2Mvy{FJ%pdTUUw z+D*Qu{nPH*b#Nrh8o#Mez@dmRn~JFjx%+2pXmpn2rW;w~?tnQ&hw1|T4LDv41%y2|A1Cmb@B+iS)}-dQ0boTfvOAyg)=k#O5p0&S;NFt0W7&eQ$r zGv#@f5c{!WC?Dr6D@HLmWvcAgrU#b3b7rgO_cm#f0*n&8h7fUQH6-hTX7U@=Bq!Y8Z1*zVoxiTNE zX=xR0reIw!n&Q_Wi)q2&6?gF*Xe^1==fYy??@X66zE9u>b;huwUrLoIDK&&@KVQ?* zi@6uep~?B_ILQs4F--eW5nCSmv~NSeUgZRNS1z7HCu8M%P_3M^>MXBXrJV&So$0bF zBPLA_bb9T#ZOf(HS(Jc2_tl-uC=$sG(5GJPmoB$4Fl$_;1TP z$&MA4vw@t&hAvKCM-zw|`_#5PV0Ro85?K3QKVW3_`<`SxidusKQq%S@>lBdM1r*N^ zI3$9ISAiq}s`4!*iA}AQ2)lcO8Vt2Cpj|z3S|J%lbI1Bx37@?5Ausedg7Z(5#NH5GM4YmhIb2lFa9c=6ynqwCU-P2 z_YU(NcXA!RtJ7)gKRXS5yPpW*>2gag?V;b0w}-M6v)b@H77*}c^4EVd-Ecvl+k9wK z7ku!t;J>P=eok%%A)OQoN=!d4&GeRiU=1enopDrWJZT3J`BO!XR7j{Mq`)kktTO6c zlqY_%5e;C3K!6oKhV)tcsdBLXsRb7BbRa414X6s%f+?TRE)o-+NBamRqRV%13gDo| zkuuR#VheeYwD5CQ{jj}l`gg*n=?dBbh}2r6EKpmmX++zvNhDW0$a_WElj8~a2k`k~ zKbp3D#$C()Xc0VC43K}&_84gF!a#k7PQgIoR)Wk%8V?!XH9Z0qo8S>~gUw@L@T`qX zwcnx`)Nu{(6KoczGO?Jn;C%}psL=5e4VKyonXo#`Bv~VXp06IvZC^*Ir>T%!)Klz5 zz}uYdNZ=J3t>z|%m+pj@>)gsTAEB$OIq9sYN5xhPcwhy-B*C7;k8VM6YKhkMgnIXd zDa2s-x9{n~GjvAWMgeOU9TKeI_8*8Nv-(For2E$7g)?Jimsu7C{2G?3h`vEgH{J_U z2Ev_M+@DgzFk^fTy}OOn>N&T=*UwB75~%5#aDz9?x?}D5A-ov z^q7}a#@a6-qp3C~7!(no;ZMM#b>K!uticE^y{DOMp*3r}Gx{5yiX%Cr@z?nt%J2l7 z>6;9Afq2~PrG?>lB*u|vSQ6Y8ov9`+N6t8iJ#- z-4Q+5I)yGVG}Gf-MeX2lma8b4&b?X`=qrn|4)z^f4DlD>3di)kgM$_?aG4D1CP)cG zDZyGBMXFJi4pGSK?-FO;{RG+^L!{5<4rL@xDWg=px-v%D163?;TQ|a zOsP}DgLWS^(`f;7kthT`SZ=qY*Ygr_bY_wZ+sMA5`*U&y?#~b2D0xgTxxqo0%pZNY zHjfum54(eu(c6IJQBsN7C&*~Kj10^x9PpbJa>@CB^s|CQh3t5lf>HSJ>hEo7lJs&Z zHCdXty@W$$3d;UmZ~-KM53DPw1%zLZ7S@C4W6}9_W$%ni!^47uHMg?9(v$iTO-sEO zmw9YBoCl;7i+vVS)6&T2v?xqQn>j;P!xs!HO%hG7v9|fio}lpDNjBGaGuJ1!F)PIt zDb{nMSr;&?_}?Ok57s4T3}Y8{j45QCZ*N=l@?SHiiHm9nC2y>XRNHrQY}zI8OM%I} z2Cte2*t;>aF?YU9J9N|XFBcQ6o{T|j)d(?^M1OuKvFcAXnI001cfT{uY^C#FE?w?Y zxiP=1(fBqNW4)8EK+28uA#D5(_P8p62BmVWmoi=AqLAXa49uDOBlTBo%8c~ibu0iJS4Zlfq+wcHL$88@=*eNUWz zNk#>nPz0&e#yD^4{1?;eJ%tno+PL-jln>_C#@i(y6fyglys_a_482Zy0StsRi{m$0 zl1f;z))Sulpu|DMPw9~3`%@$g@@FeiN#e?bqL|9k4ci6Q>{r10AF?t(KzFsNPNH80 zK0saS$j97KD9ER!d7on(wlB|uk8Ixl>N-6Ha}t5WS)B$8I{issW@s)Fy)?G<;J@06`T3 z5h*SX#$DpMgx5v!K`Z|)ke!x@j9#^7m3{6myv1neO;twIiX%Qpsn&Fgp$Fu9{d$-D zR>@P#=QfAkt^~JGq3uelT55sDY!Ux4T=en!cVzt_eKr=ZlIEqv}0%bKwwOMNDTWpNnc-?Fv`{9Y1fVq#2&3 zmTq;G9pMqu2$5)Gis{6^&Fs7~I=sG$Po(ooxt8d*jhBWM77L0u;ddC`3f>iEM&qWU zjGT%!{2nSR>NzFLclX9NcoOcBs#X5o1Vbte+xl!e)Uhi|w68wif$_@G=06xw+shF_ zj6N&z$X+rYti>{;(Ma(IUP@xu9rs7Yva@Y zfyMH9Dc;f)FCf!*F>T0vsk3>sun(PLazLiW2mSc4O)COvOy%5wWZ`B<54xU|;EqID zi}tR=t(J;1$g%M|(e{z8N0dS;Ftz_8SO}G-+!`U|&dp25f zqD?JiG$N9~EmV(1g;`O!k?>(+Vdtx^2iwc3PD?8FX6#9H=A-O91>LF%_52vtn*;MZ zmXhukmXl^Cex)C<*`X-nPA`^IuC$3rSFdGPB@^2iC8X>_=T1`sTRKS+??ZhkgXVF@ z#(YwUj<^kL%lmqj0&dUaVi9Tm!!F#3l^6dix=>{3P`n1XgF<9~68xs;`~_*8LV3nijoVfJ%o!gxG4|(sr5a(QVrgpS2LTA^ z=jRuYoa8T1R3LC5NFX4fKR{*w5(zv1^+t=05`~Sv4v3=0}^oT+?0Y8Y(HuD~c@g-ehvlXWhm1oUx&ElgXb3JUk!u+?) zm+&7Zr51P(#Mh{69;Nw7V2}>OuFG&()1?Cz|6Dxn@MJe)1BsX!9&KeY%=+V^-0QuB zia3^-iqKret5M8ElK7*>r7!lwNh9oKe#a5N%AMt{ls=94zJ^e(OaC-$L+wApa=h_w zymYZNz8teAO7apa^-l=>4ztfI;vatr*-;q(q%Lb$&^qnQ!E43bIhbGooY z-v~jppQ=)3q`NuPHG134QUWm7kEE1eIS=bwBuuy0Z8` z{fN;6p~&sq)5%DSC%eU@@-*R%W*4nWwi)m;=oM+05u7f<6h0Bhje1q<&A~*Z?8%@+ zb1LiffP^V|6WmZgsA^HTBa}A{__!R&z7&WIc|%{42FD6qj_j2gom{BmLq3ToFTf?^ z|0^_@Uk*h6N6;|-e?fyig!vCNi~kLpy#IhES=gcT6&k-XUV^)M*aIqeygC}IOl90! z%g~?bWdjwK=^2XntnB0hoIiVtz6Dajf7xHbyn&JqcaRj#o9g9cBR4sbvVGoiWd#0@ zll+(hF&g^IvDB}{%KZ1toKcNwa;sdnC=Y@9bL|;u-kbNoSZL8_i zk9~7TCu$p^rg-a!8UxKif-gyz+t z{7-#beJ8jaRfSoE(=_Y&keWkJAUM^;BtaaaW5!@lOV_>kej1L*@n;1uFSV<<{-4{T z<_ijS2+TfWTG(-i1sP-sJ7AJCdbUM#QMsSJKWpSA#nyi8AEh@iSJYt^J4*$g7C5Ct9Mq7xJZQC68o zNvH4h6i+K^B%14%kWdE{g&VUL2lT6A53Ooawvj4DyK(8~8XKA&99WJ5qtd^4=Eye) z75M;`D*%?S6u_`#VPLPLuVb(C3ZA~KgbWVd$2O%69_2Qx76MfMnr1S{Z9(GiWCt^q z{Xq)t`fetQ3NLO(tv_K|7dElHF1eCZe3`ajbSGD9?YWD|AxK-ME$1fjWl~JVfIoAH zS+@AbBS!8?Io;${MmBCGp+H;z%6mxd4z47+(RN9`dxOX^Br?npZ__Uq*kP~;rEfOx zqM=1UT$_W^b@2I)6t!6BYOt6SWtF}>7X9p^xM#yyJB~B860lpMt)D_~|^} zXTl{%@2i{GRl8NI%d#2MOxK%;l)+?rEj-KC+O>dKyZ+o9^ypKS*!f0k}fO`Lp!`nN81(;7lG0dnBs-n>Emr%Ua1bj=OyX#Sr5 z&M#6GG$K-1Q9ZOwUZ5`8YUFS`63fZN{464~PaN~4c1%!9F|A3CAj3naNK~)ePyLdj z85!b)J-X+tPa1cZ-IBamnSgIn56a|@Asgl4RH~@HtJFq(u&*Dq{#i1%Wsx*j6!*bC z9&}&vc%9HVh;M4rIcHJN>!yduuyhjKYJOo^gjnU50^DXEKtCA5n}bo#ZNpVK+IeS&QH z^}dw7mO=ha^^Bzw+69bA!lJ5YnX3u)w^bQk7((>3BJtnJkcH`>huxP+N?ZALxWtLi zy^Mj#xTKXGU#y?V^g|81?t)90tumXWv~mv{xvPeXIHvFJrYzKlS0IT`DD5=#u?#Mn z9waNzu{c+KvE&3qQyq)bL!q?wBFPczH_<+VmfPOB8MBQ?2pcF^`2?ctRcs{H9K@A^`h1S1KuH`(0ry264<%d1Kt8%$5%<5h8h$ePHSYDgf%Kq_v<*Z6hYtmEl(co8)Dk4nbAq`7J|thZet3_Ak;jB2ts zO@wD6F8=Ax?r2O6!cqd_*_hgpq&Bn&4EXx~ckiHp|KaHTocgdLWnk(;SpC5g-9-b} z%((Mna1#CoBQ?P*<3NLB+skufa0dh_JT zrB=Dpma)Vm&Q)Jt;OPzg`m501(^5zyb*WpKg~eE{dM$@T>w*6oepN|00;4CK z1ZA;3oZa&HX2sb3{OMiDxAu$BGDKug+21QqYBKm?vPOwle4E=Z|LScY4hJiQ0Mo4b zchmek`>g>?a}hAj@|qWdi#A$hlJHG;g3O@=is|E$?}-7XKNZup{mo-A*~U=6AA4y9 z(3&e7PVb99_(UK6S>Ch@r-`|JsG?18D6x~3@@C@iSW_UGb-8ARaguoNp*orQ^evRkR~(HcH@*r)6Fw`}kmiOAVK)LEmvEvgE&38zD{CAUqq4BQmJ9bZ0(jdJSv;G`L2^Xw@+~ z+T$+uD`;W(<=ViS+DH2kzL5`}JP(3sUPe1M^9`)yo*Q}Xa*z1kFW!%$P^3oM*@fsKtY7Zf~s&ySsFLG+4DppbdegD;!DyKCw8rd%T z3uWDLy|lY@S(S3VxME23teBLn>7wYN$ZG!8FAwx4ct~XJU3X|y*k#}d@w$+z-d}Bo z2PrAWO^%=W8;exh-bz0B@m6+>){(jJsX>Ro75L7nlu5Z*H#2_=Ga_7>jd93c^h8$K zXjv;b)$f0+UZj{ua-gdOoyE&k;fJFVb=+8}a2Vz~VN8Zpc^}iZJwL&n2F(%gt1xa; z5~zwstXJoJVA=oi;LBBN8-4CvXm8#!UcmI3Pt_dy`N4*m4I`8}+SSEbip7j+-!2U} z`PSqDG>*uo?p&^NmS&j=P!)ec>U>7Aayz z>KOTYGW7{=wd_Xx-gro}Knpq{0rC---v!2wA4*{X$SjC$yx|4GFz7-LdG`Y@&evr*F zRGS}!SYa$NcLj8&{qmWsyp=07b9OD=2 zMU-&v8_&lqiZlAp??=KLLhAT?KvJ8l@jnyiOeDWxs>q}3Le!h*oF{&2*-+yb#5DFV ztFQg|@M-8HdzKOmQO{8Xks=p%pYk6Gp0i%=UViaChy0X4`u(^NN6CfColoxl@7J4x@Iry(SB4r@=Nd?Lc)`vzFF|C-*&~~s{h)Q-f38Ub1I*pCemN4iB2tm zO{CL<7C{pA!`RFxh%vm%I~Ls=+S^_q%g$Kz)QU^{ni(xF5?@YRinHp7rRifSuR=q{-Ooil(C8DH*IeTe- z9t))r?bnhcicU(aU$TbeVI|_I>8R{KXM^|~^Y_WDB;aZ}ah=6}z^E8ROMUKLZ@XQh zRu;Kl?|!P_DbE^bu(w0c8z1Kxt>;$yJd4gUo-j>?&Qhqk{^VN{(i>2A6OE&BOqm*7 zIm4=yX@y-H#7#SW<81z`wDP!6TJNY(Ku=p0r5X6^+t6+*p zx(vh<=j1oCZ0Q?j5B-Qju;$uCQ-k+!=sn+Clc1s&VbD!MBsE8#&1s24nO9m*kj9R; zE9D!cB*Q1Z%tt&gJw|eL7vpWIG^?)4jBFQa5+i!`={!>WC}_9JJVm(Vm1|gSU1yD( z8X}h{Zlv)Ex&Qsuf+{nuSUKz-hT}KpD(QN3MZh)Hda5uk^L6Z~`%2{K;)jPaAFOUS zx6sdJ`S>a)MN3j(Jmx>~7GTPpvYNq8PmE||X!NZ;Js#prTxiuN=l z;mviDfZk0Bo?gg9KHmJ`HoO_G zgExO784n5Z!aA0_g^+^holfzVHE!ac(2$Ze2_)Ey1uAOJ=m5CR$HWd7Bt=5-5J_74 z0X;K=h^yDX-f6-v)OC^r4-aqwU-Ca2SLy$btMa4b-N3jS{U-ztrko4)JTrjTTq%o1 z4~00Ikzhf*JnDo%xr#uHCYWZ@=nR6>^@z~|_My>7t>b2dQ_#7P@7|@o|W75*W!drqygWeV*jtSEkmuZv{ zxWg;n6dB)C0Mp=J-v5=CVZUVX82|BRW3656`79Lyn8cFln#6w`Vbd|zpi%3ppunfpWM~YCvpPKuHoUAu9RzAJPAntU zC~wT`W=`vFBI=wLhG%l8=S1IeX2nGf1%BW+5uz*=?L}*C_{|+u=@6;jp3?U&T^lZ^ z^kZJ#d()_yRt=aSQcYtORf_W!;)#^EUp}XfuwJ;s8>ZMie75KQi1HbE1!~_2FI9{Y z#-oIASx*Q;^xNF(K~Q3WD5b*Jl%mM}L_+jr6P(9nbvOAmbDxf+@~J`BXAWDN)h2uG zZFcWwL|$smzH$FZi1vr}R_KtuorIQZU5W^)C7Oj1)OYF#eDtJT{(=h>8!JORL2+G}rLmvbmoS>_qE@6Y-E>?{-Xui^ zl6{2$GHe2`uD2pL&F4>ziIPlQDc3bSNo%c3g)GS`zgha7^65&&UMR19iFw0Wp$wSK z7}u?tAgb}_%LUwp$oiD{2`X<|IO|kW8a|mDTFtXVwg?6>iE8=eO*C-+t~Gm*Z=N*x zfS4C8cV8=c!{b=UpcvD*=rwd&=KY8M_ObJw5>NUE;eI~9wl{6xcY7B~c20bQpFfRr z<76Km>{5*(J?X5Nvlm`H|BCQ+-_J@vaFixVll&5!4bjTF_5J4iXYNJr&`dKPtR0CO z8l*(qFcb97gFkG7;GbZ5e*B6XGE2=8&$p=AuKR^2 zeo9q6T9k=j8;t-jco3(cTUpYi7GM_}ic$Y4XUCZTv%F<5LJMf`DIBCB;gay#$a0@Uwy z(NbnLTt%4y$LNA;xECy0uK~L<^S3|m5!$X7I}tD*#%X=YzqVBIe6&SDH~wX>fB`K% zqu>_F}!6ifE8F|jM-#woZ%&Wsm9~_HBrGJfY8Ml22?h{lx`x zZg;IN3nXEE6U20(smRc|Jexdk7)keoo3TV0Eo-(0o)DuMWAaD$^3lzW&RF$k(>QHj ziL$P5E*S>4?24<2&7wn1H1=diPmWb%Js&Woy0!g(Dbz=*Xel;MFJtLxQM*t#Co z1jd+VbbcIVR}vnWCW8tjJ4P0K(@**FVki8;-XfOrfhlh0{4*NKBcrtB83}KW@uyQ^ z=B*S2jmLK`&+I?76T3*?FUiOy>c^DBTAKo;GD-OQna!n`4vE$T|~ks0cC)pt1< zz>Ti$XIv*yJwZ6IAR^88frQ>D(#vaEzT9DyZGH_uH?)0PX+MK%h~Bw+JzXm)p@Q9h z`j-3V`WnUxAG>nd820oJ8em4fNtf)N???6QL%JpkewR+fz+ZSegX5Dq>v052mXUSL zK^gOh_1OdOTzXF=vFWyKchZ0vW5d0`f(KeB)pUk0BvGwr()B{9g{kqB-6rv;yz9G| zneP2*hk^L;Z1sr2oRp>=m#_Ohjnkv*nF$>GpV4+gmoBevkaQf*&)O57KRJIWJBrBM zLV6KY|KUMvDN0Ao{mz&Nz7rIf(jd0AzTJONK$qkgNnIC^O=%XGL(r>9|2D(F`s^J) zB18tCz9{e+p024cyEw{D4{EuWPrgb`vkv@esR)|Ahu}qes4-2F9|=nqxM)j93{^ybMhoSN#>IJCBV2 z_?2zC#ZYwE03nAy45e$0_v$lR&N@rP2!;tALlWh?`l|b9-jtmsaB^2c zR}pvmrQ=xApCFpjQG`C}OVApK@)gf*8%Ug-tLBhjmKqAkqIG_g%xT_^8zHWfwHM#C z&-BlPt|<~v>gtr z23nxxHv*$=#W?66F2bKJ;yGtY#iG%BF%yHi&h5Zk0$1Xnu?eefQuAJV`!k5J)NtVXdQmNz%lhWjg}E2I=~c`(xS#5(Gx_!X zgHOszd9kQ&Kr+uFA&;C*W6j+lH@8>O0uqJ@9nB}VCV`?MHd$Ma%@FZ*PlE_ z`b}2H`PlT{T`r+XHDHx1z-M6kRO_eV!8x+`EeAt|L+$aHTNezxdHW!<>xN|Iu~z$D zJ_W*h&RQ~{g!@DQlz1u-u&*&W#%e_u!_QlZ5wvP*@V+eWs|#5rFA9^rhHNuJn$q{r zpA7h**kz%x6&M|Ih_P+Ue_<}A1y9g_{gV7$Ocbp?uqeGQ2-s2ZO0@-EpZH^4{18Pp z5z}Z{{x5#NTy7U4&50s$U2*;0^Adq{NxLjEIW7tjc}uF%LB60~UZ_3cC{p9~H(Dc= zwut0ITfOObF}Nl_iq{Y)cn?<$;KGK6!bSNTUEY9lh>r2Qe0I9_m!?-1*Y}o|)Tr%1 zMvfMUi%DKN_XGaSCHO8sk?lt;w+wQ~R2+i+?e{-%B>J2AupUPn`tn2vaop;3NAt4$ zwk7!PvPp6HAz#mz1(d0-N8oRwhcdGs(f;k7vCY{3e>EGY~LMs^Piw7PO_+tL6 z=l%Ph#+J(dtLOcD>&o#|C5q_|Y*k1x_MU3xdq+{}m+uIMZ>MUxrWwY3ik?qB>gaIr z3A$y4Ebe%Zj4s2$EgYq{9Q}&vfxsq6OQJL;q6B5ViqjtEIWm_~i@fhK<~4Lu8gs*L ze&*b!S+$$IYpDr>YCsyW#Wxzcb@{$0SzXu4$F`)l z@!ZuO{oBF4?n*ULS>B<)L$cur$b{bnCkY8fBo;wnesZ(UTC)>0sH?YVxw;$CdX}b) zV(f>OMX#d*_xY53aUndDZa96ctDdvmPZ)f9diAj!J`ZPSPwoPZkeF1#NOpC3v(6RD zsNKbHUkI7_B+0ADYKCZnEaNg3GGGX;wb^J#FgpJ5-Y|IMiy=j?BDrhz=w6h)gDDN1d>qNLRves!H zSJTo;Xc0_7?uFz_f4JWV5+})^?dL6ufiE^KOH75C4xcgxaj5`g#R z0HGEnXTFGkOT7pZ3mj5|8?#_?A6|>D-jag)Cf-}@^W9T>zx^BDl#Xi=#|w|&{;%o~ zwGb}>+Tq1>B&JX07-C7EqZl`mZArmTNSCS|Y-o-}Gn`Bdd_-YJ-TSDjooY01x^}p} z8_ANP$}T@ITXsi&v_5y_OUUpQZhR6#+$b;{w)+$@RZLoU0z% zN}$1fb!CiM(01pUV(-M|G|!ZqAnNKWc%P()$BPz@JC z{Q!i84@0i@6eVX9@mU50rmjzYHa_UrqLL8%zd!I~E3}3V=Yx1d1NHXJ$A1obj z1dMe|EMH%jvR@f3V{DAVTWf^?3v4dA-EUbbV403~?ZSU6f^;P~gv6F}BjPnhnD)^D zx9X|u6DP@7&lm%5HfMiHIv0lajcUJ}d%3J{_q=WQdhRdxx_hAEaZh>P-du9xdAaCs zf7z#Le|$g!KcDfu9Jgzw}MEld#_#d#> z=?Xb1%4vdR|Z-#_h-ER z^ze^dKbR20g#b*5L&!mhA-vI_Hrq%??nbS3orucfRn4jj4j@)M3Ba%Wa3VTF6#^~yh9%$>ovJO9+;?4-e4ONi*~S7MqAWF^nBx|{P_TzRRnI~Mf2 zhmht*6rgVmI&#&YHwFv`H49{B9y;V=Q58>OoNX3zKiCFxkPd(n+``OM#NDZEy zdMUFvbNk|^9`j1wQOK7(B^$&y-fLP5TpnqK0MY0=AZl*wtD=QF6`r|^mZWsm^5rr( z9oS52;xc%I!gV#$MPLUZiA8_a{ptUSM!JaXfRdc_SEGQ4MvC_c@SV~?3*jY963u`+ z-_8emt;jo{5ex*-KM^JUwl9}xN#|gSO6F4-8(!ksS(4PJJMoR<2Zz4LlWW2{7MaHr zVrhmmIU$BKoOQfnZ0NIA-z_;dW!8V7`*QXo*4^``Z`{77j+uqt z1%_hf8pod+s+4*mHW?RlA!wF{XepE7EvxH}Ti59%pPaE`A7&ea9-B;qMmr;j+2a1K?anT78ItsI3d2vS&t#THs-R#dwc$m z3&g7X-=2?<@9fF^$Oz;^R2N)h9Bsc!8*s=`Vl zESLz6B`?NG)>D|=FX8w{@S6hh3$35E%Y|W|Umj{!1g27^bjMUjR6^JeWyXk4ryqM8 z^$VH^gyM8|dPb+q#)5KwX{4bj$v3kn^axRyika040Mw_pv$|vV33g)i_QMaxOcB-G zJ0&iu*YrlCo9edEr5}l-ej^au-r+KtT;^|Ci&!Uet zWmS9bl@PKI(^kVX4AWkYwtnrV#NHC}Z846-K)A@})2vAhLARUGrB)ru(|<}SXf>w8 z@VF4laQ~Ym6w(M>Q|)B;s*6uH#H^BOHa8K;Haj{DZa9+Jk&B1`ZAVx}IB%j+1q&TE z8+%}so@QTb)U<`nI*~W7Dt^!TA+&2h!KPs^jUf*m67N0{O{01tB++Kvj($9sz0|np zNWJquK8;K}3JqOFXTqE&`By`meQBF}F%9@&xc>g)pQtHOE4Enqy9XmL&dh50;)8-&)j?jVY7B5r=2e#ZT+%jBy#8p) z+KxR|j-9CRPol!1z1r^%>TQ@YDvMX*bDri|Uz%RoCA5r-gYc3Wg)B#nxnxvFJ>>Re; zHCeTt{I}>s1D3NTYJCV>uVYRtl`=A$;Y*MH$NfNuXLCUjUGJ}QVy6WgLwlmYQnP%r%EXezQFeID zAcZ`Se4t;!lZ2d@TQ7#3nmZ)M!P6*0!lq{{BYFQTX2*5%qfGLlSPr*|E-Au!ZezMV z5ozgCE<)-R9O>wIZd9`SCFyZ@>{gLIl_4lng~cE~Xg9Z|tAOh;W(51kLID@f#}R*o z>ds!u%~4qB>LA~RtF9xvRFClLP?iT=qm0ee)RF

PLn{=kdvbFAJ2aKYF<;F>z?_ zHA38UC+gL&crk8!qNiK`)FkBk^cA%3!BD9_2@$p%Z)1!;WZJn^BZKx<|CoL+xLMjqY(36Wk-w%4<|eRvV2d_ZKcs zad(I*@53pU9W*_v64x$A{Fvtim(sckEsbz*8z z_7GCinwYuTDIyaYg40AeeU9TS~anQ?@7=oSLJ?#MSd4EieZXLt<<9aqf&L6d&7qwbva(PGd_ra8-0 z-Ec(nV*?Nv8qdKWCugmoc2Uor*d7Bxa*akzo!O-0z7q?6{qR6@XbTYV9Z`#&MqdGe zDp=#N+04Vq#Z5-;tC%!k{bqHyxvr{?;A(dBklL7F%j2iAR&W@kW6qBi_}|pBN65WE z;E&Y2-fbz`h$DL>jLN}j&$BysvMadoqz-oCNf22XFIc#>`!xRaD0#AL8q7gt9RPLm ztpfzxAn?ZN=mm7?)qfABdv-E^0Zn=JUx4WzosOPC)n5GvV7hxJ^Jh?uSN{f>?vK;a z6Uff1e-TV~<7EB>lK1ML1k+tP9X)~=y!wa0bQezMk02DU{w^@xnbXk&=+d*l2~2n5 zWc~n}^6aky(;Yb--Giz<`-{MI2Ttbqpcv2oY%txP)6pHs&a*!mOt<4?ewP-z1d{OV zj|5k4I*t4RQF!(Tf-BdZB>#Xuc=rDQSAv~JZb640{m$Upm7gD-z65eCWN{2;aqJIp zEM#+d52UefNn_fQa<-v>z+#}4LEIHF+?7F`6)_x`f>fCn-92|@Q~~SE0zz*exK>zH zvWDLjLf$?|t?8(b1y}D#Npce_booQx(U9~c((3Vt+2#cB^MMaET~oLE#e7or2gHI? zw+6(bQ}qYMlCLVhwjeo$OR|Z@#i+B1#cMhQx9^Qb(X^_gSw=M_&~pif1f964*hMpw zy4Xdtwu+%WCqHPOq!P&>-Re^1CGe2GvybL$B}5xO>=)0Dp=1}!iQ!}y%S{*XXDJ?y zl4$*ih7zaAp0+h5#-FA?Ehc_#s_eWfPE+ivj}2t#rs>a$nWk;cirHSjR}_3FPSftX zPeJmv6_sPKGKPp_uquX;W3U>JP9##`Xy=n%X5?zK+9y06JHy7=C0)9x`q>mCZ~j{b zwgFxpIVqk0i4(X)p-YSKsH@|E72iV}W&6#chg4Pxcvb+SdR%%QY zF@`DIQVdkR>`9zC)dN(Nh1(GI!<7!vgd(?1RV%_i!JAeV9H`#0N@$92;u-p0F;`a6 zFQdpEK;OcoZvBWMvW|w4p6uwWjrSMAR$T$={}vhqwEtRMU(y~7Ty}*%vNHF7t>bMx z9ewW>Mn}?gx~)nh-6!Z2u70R6DtcP%);N36lvsEING#ST=m1De!!QP#21K6G0(jue zxxQl{xu3Dg4sZH#wRs7f|7R=G#Fl&}UH<3m-r}`ZeWreM;b{4DeQv{Ii7-dGq z6qcGwUpEcyP>g$-_5gWQXs|x-PbyRixRimFf0B$vGB^aRLOEPR&FIl;3nD% zAXRh2CZo)+w}#5Q8q6}YJxIoFHry>cN!{9FVsn)m(~Rj>0;UdS8ewLoj$u$bPT@AC zFcm=a^$-`5=K<-%%vzUlNoP)QH&uuA^|D{Z8(K HlF}zOcc~dI02iU11|>vI{k9 z)dr!g-1gOK?uS=IjW z_)OfdI{d&1=&(&`-W}bi6g?BqSDcmbu0_Q&rrC*mrNwIH6;ED z@wUIW)!H7D%(*^&o|SWLoNd0OlLgdkRV{Fm=2ds?@lia?08QfT0W3}Zkn6Ef%x-s} zcJ(m=@I;NX52$n#9zeyHJS3)o!krol#-*Xlm#vHtxQ+4v4DAM((F21-tzvx0Ui5aI zjflSOt#S~0SBcL9Xb{pxd7P$26-wy;zd5>KxBr_+4#49yR8S@FRVNsb0S8rfJtq1p z`SfW!&W;rdsbN zoV{jMd*VB+{p7IvBLZSwXYF@y5g8Nxeo0cyfV|zZ*~@@@-SX==RFLmR#5zEuCs7<9*a_Xl<|HVHaFqKWQxkTXw4O(?wi9*%defmnm z<@Xwb0$;<+ZBnAKULYH&ww}R8*t7;t5l3Y69FMIWXbs-rYn#NpUn!pwP>@M?fDEA8 zC6m8l0vjQ5Jw)^RF6S!YE)$SU!2X&k!%komj|WtKapcFjiWSO$+`oBjo(70?ES?s{ z4gp2;hUM_TYIvT1CkDCoUtHZd2p1$yFP~nkn<6wKQgtZ-Uet&#j;;d zKpoAKYk-)i)nR{0Y5$TM{e|T-8==Ej5l!N__Ys?r%O(m|)i917cA9n{jyn9^UZ^Ud z9=3WLIuKX6tVUoQE6Q8MG3KMj1_-&r&76$VqDbE#i5lU~LObR%&`WrO_Cq(*I>POR zslQebrbXqxX0q?}r?pm(4M=l^54&q4=m@ViIz8#GM2(5s!vLkEQy@7ev3^x{AQHCO zt&;G!vD?o=ImCH`jv1m2Uc)NmSGGANuWVPTUfD)|cx8Ls-`iI`Cc4fQjuWB1VnjH; z;ucnUB5Fi*{mO8m?Umj|LR*A=%8#c^KK+_^PD5?DBzhVzSjR}JOGRUCksI$3Lx3OQHWq+@{b@mz z*D1_oKb`$7*22_lZK_NFBb&O{T+tp_M}7Ih-$00Oe-lxDl6K8&dSkP!4|CXjC%x%I zOzO7m0b_P??lJIQF@-&ty@dg%-J*~|J~C&ZTdl70#JC*C9hb#+ynXa+^Uo}yGGyc? zB8_s!(nAGi$@sBHF#PQ94Ywxjp&d>ypXR*>u0Vl9E5akIe@Axp<_@j$INs{Ew)Vt= z%^YS4`Iao_mcrH_3#f-R&~^vnO_Nh3e*bS3&G*BQYBO&Y(^`@GI*Y0&7JlBQ3ix|V zT|?RfQZnGNQ%ew*58ldhGTQY#v-*!6+TP&JLm;^Xu~$IhT{Ne^c8lKQtKciH+9D4l z&c=A@%9u!?3^uOAP?Q(e3atGRy^u|2mP6ow+8YGzy4dug_J*AH>hL14w+m!=$zej_ zS(i=ISe)U-8`>T$;A=1KnT2L$2ufV*Wp=m_D=+tIV2@CoUV&9bBrf;{H)cF`|1o-? z2Bp=`A%PrcLs^&XyKZJ@3ixZ<%@G?4ao z768Jo6@LH6!=h>+8uzU1l*_Q0<${XjlJH^!pSGRH%TPgh0@T4>KiqTz(CD}Sh}7v3 z=o1jJg3$lX9lAlFhV&EOcOECVI~1m&{FmD`(;v2fv!+EfdeX`_ES_W%XdoO9mW zBZol8V^5a)aorfULEt6}`~bPtGA8)7yQRn=IR=Io(l!7wy;9D9PYgo-g_XJKEf(xe zCn6@$xDkLuym!mVwJc}Nw{cwJ@4nSZeiB07AnSVkGsL4pIeLmsY~ZK1S(_mnMqJL^ zHSlJQp#kBiN!4XHI?Ce)oc8v|tmS5$_U>Z1C8s-NcvVaNo0z&976*Io1J9o;PkscL z<01p~k0w*TsgF6!od2k|WESZmxp+>piyi}O-N7){gB(B+lUI1~G!a)b8`tH1Q& zVmQ%z131?T88L0Rx^Y+%Z_qq9M+&rK1*wG#^1SzPHOA1Zf8g`F*h_k#jdLZXkc zvzPubc)_Dm?&wkxu|ltykIpgqplm+KK2*LmMSR8KYB`GodeR!Bw`O>zJ5^=l&d%~3%Qx&7+vW-=7$1e*qAA?G zK?_=CTU_BM47=dIxaN-VKV7P^Ia%}{!JV1G#?=llEazhSQ2#}0%Ng? ztiso6N>doH#}X}%?VQt3%H{{mMM9NSas#v#zv{SN2cX$rD?*+bVX@c2;r^G1d|ox) zNGsk-d`D4rRE8--em~I49t@F9l8X5Ni>-piIdXl>V+S+YaJ+8=KcrTKYwzj;-(v}n zk1iihpdC>9HqPZ}pej2s1C5qC02)ore7(o%(3kACBJ5f8ln0pa;l>hvYhg#zxNt3* zV=7SgMpEl;Pud}#pmCACWyw_Ik+}$Jp#+M}Kawvk?C~1l47368IVTPh)C-7K3(2>f z$p&c#w1%ur#@;jOVF$d-t_Hn%Yf)6^U567&AFyhOb6R!{5&B;7OuovQLRSWd$a>mN z!SVPjV}SSeS{?cheDS3kJCH9e3GtWHH6ru^9nL!=m^HL(J#y~hnw|aN3DtDD{!E-7 zQu7pwu1vV;Jasc)bRL7y4*|C&4~)>PvzB@`CZ21)OLmkM zzIO8M0{HXZct=>TW;5QEuI&xl$~n42oA(}jM0^BnWLR73bfWJtlnLzQz6hdp+%@io ziRW^;+Jzi;b9X-iQJ$VpOnjiMyEnduL0@umXL)`lWrTwYIp%2c_x1ya%l!83C1t%2 z^#&~Ek&H*uAa18a6T+g!)5);o51Fnmm?HCAR)c`|U~ z9PVkaECATl9_|XPIYIa50&SzZj&SpgJFrLWOKpN$2}hMtdJet^c+6E4y8xb}U{B^G zr)guwEx!LF{hzk56O|MDM7LK5k%sGJeeQvCSK~I>V=&*_`*_cNw7H@3%njK0Ej9LF zXv5Ou{RH7@3B%Jtjtd?zQj@h?TD3+x^{mV?<9qyx?A&DrNb_m*F&D%<9&+;V>5WN6 z?i@Itx&B(-T*S!_?d^J5kJ?cv0e{YbTlZ4eyPGE~ugm_^=kxCR-4Ao{EqJ;NXRiCe z(iVy-tR}k^tfqg--<2LRD!#=ijJtZmw`%k;RIoM@enugDYtgmlbb;#hkqG&@cuT;d z7F##EumA9bLkM4gFO>zIapTsuD!eN-wV5w@TR&U`aQi zuHFYLUuAOqmOi1V2fcfhjI@i&zg3pA^fj(2?@R7d=J>N!_AwRRH$7y0QunvrInOK4 zHo@1WF<^58zo(^7SL%r^y_vgRLsYO_82%P?dyN$azT~O%z-k%4%WGPhDUfz14HWTH zd@a470V^Mv`MS>L^SbP2*<1sJ^eg~rLXV^`xk%>mTUTmgtJiBcvez(G94Jf7GpUO# z?ZPIBVElDAcqOt%&N9fJEGRFP!;$P)Ug{S|vcbI6cXfrK$lE=(k#kalhqVTZ0sN=6 z5I}fYo2C#TcN@L=Jsi9kG^uxNI+Hc+!3Oub%7bg~K<1z|R;U`w$Tk=w|7-Ywq{!`8 zm1D>O$ybkG$EV-KwSr4kV}GhV&^wUbwx+Vh>5H&Tq{+)+fQHiKZBc-b&|wx)>{xKn z?(4ocVqAl-IF0wLr|636K^yc2l{j)~YcM--%P(T)n`N0jnLt}7@aq9N){)GCCT+Hi z?^y6%?aiA5pe4|rpszN4ahj@W;?T2Y#FewpTp;n4;ZpfV{Y9zow|VBj1js$u-t2!n z&?6_sCy5nsFtl=)U1GsEJ~1^!GuWOiqHZA zk~1hlktRs6rHNYwkzgYkK^n=i$xV=;B1lpYBuL(pa}JWnm-IfP*?6fmgZVgSSU6Qj-Yy3PXrCn zHcerJUWrUWG;t|uJwdhv(5lX_PT>GY6|OMd-!Uz@({YRwyC+HX8i645mI%m;!N$V^ z>fx>u^9hMiJA$Fane_I?Q;2hhsw8MG-wQ{hp9Wy!DJKmtv>~G?bM#TnJEv&ZBMzPU z$d#5E8c3)+!4x^r05K zO0paD!(CmDak9ujE-Q{9$WMFYu+zI&#i6pBw$E#G3gyObjm#^4Bp$cm%4VE>#N&u{ zm^L*u=q4*bhncq9)^a2o8f33OLgI3x&p(A6Y|7{Rg@ilWH#V3Q0ef>9uZT`vO7@^1 z?2^ke8tQVXuGsQd*zQ1Zqsiq}TfrpN;P(#G!HJKDL4fe6%Yb#LtGc+*`1&jYV%U^R z^(j}GwwL}TsE9O&nm*du_R5jg=zb=0|B_nb@>`5(v*Z3>>Z?h5nWnUlAO!^alu`ue zYwvEHzD|<3N!wx2fcW;c9EJx#F#}=YBI+-vgh^u(7JY;+nSFt#F9G97mk0-iWZG+4 zMgeI0Z#DjgrICLa!!1&+Q-TrkDGOIG897WCd8t!U*ta;t<#NCRG~RneEhTm_iy)fb z?fZ$i?BV3I@bhzin@d_r^z)Qk**uRBIB>Fj0241Z zpsAaLro)4AhBC3CwqlGodN#YdV|9Lei|7PL+)5YcE*$#u9xZWse|Amh(Xs$t*cL;- z{L$$%UE6TS26eLViW}^L4RqFUvj4iA?rH6?^SckBy&br-j-9T8hmJ)IZqYr(HB_Ks z6P$VrdshPBJZ#$9of#z@)vX{A|VV7f^MRqj9 zBBalGkEgsI1`<#3{vGYe&e@5y>I_1v#E|`y^J2?wzx;OG>*dY5_iLhV__l5A_QBYD zNuK!O9m$N%MS(5u@b&xyqdrTq)h3pxmxVMlMW==Y?Xmt>2dKh|PMLpF_Y7Zpbdf@7 zOK;x--BUk*|F5RE9PCf(AGH#SbAI|k-P1HpMv1Yn@miBE{D#A+g8Y{yUVjN5dZo0d z?{-dWEEH0?7v=ZVjlpkr=&{XWm{#QL?2AsV976i-{URW+d{4oy=#+`f%0(#g>Yf%K zE8!?Sb2NON8fh?%p>q+k$M`qj%@GB4oUy%GPw}~}u}OR-ue_7C1%AMHQ4?oSujwVH zsbipvEHnDyuWq$i@;!F)S~t2=wzrgKzr3I1zO-MMAi6)B6NfYe9!fmJnsO&i%jGoCD4S`{pw6 z7>;_DfA69DXd>Ka@Bf2=ezv%JF7&s6uOkhoC)7e;YXUN z4US%jur~Eq5Ln4LOWfOb;yp(8$Ss-CuDFwN9$BXvij-lEvg6eKO{nF z49kAfaVA0S@ubPK8Ian>pLug-k*WUJt)4YHEy+dO=Q_@OdZEy2L5Z+1#g$$;@TQ1I zELj_i;nCvx(#qF_e1(0>Ii5uBpVAlCQ<0}kSg_`<7bVu`%a*wNf9#8++EE+#Z|YMC z#Z077ON3qv%{a-V$XXw#?c=b&R(jdMYr4uIwe48RUZhBU9q!{oD;TXFrdE;N+us`1 zaCgA4G5Ia4(S-WpmN;h|aU@Tc*Gp0pE!6G1aEnkfbt^T;V?0YXuCnvo-Ef}~j+Y8- zuY#Sdc1)=nLJKr})V&wJT1#puad#6H>C(=a(ziENJOtZMwAm3K0_6TaIa~$&6{j!W z85e5I9MvG=ZOfK@jqoRsOJrJ)F$CAk=3iAI{5jRWz!dB=63hkf0p*gK{Aas;4@nUB z<;gOrM_8+YWhpB)f0BH>>?{2spNXQd zx4yay>q&{g+0dM%GzgW{d}rDkcXNZ`M4L;MZG0N*VBC878%(@Y-VN?$cA4Jmm^)kM zs^EcPjs)4XN{;Msj`pFrbtXIpI~b?0{XI_ePO$Ms=5!11Ui~szVrGuqE3*ufs_|P2 zcfWGP-ccqTx9$k`v3hvh$AP|HcKPY~-s_0pCf>s;`GYw<_U?V|dRd})j%?aBY^wHQ z40Ue>%*gR6uD5#we5`^@B-EJGP0o(rvfYEV3_=P@!zDHSH^oEwE>RZM%KE1j>koAZ z&K^3)oG#}9-&k?$2VtcxB@cn9X!Eh#i11rq1zb#-A)yV;)vjM|TN{8)Yn!|^@>$8q z%^z$d82eo45I)hS8tz1$yN9TqEt~6(hC+4kPqL7U;d$JqUw(X8PfqOlEW9V}%OJY+ zUQdd6KM`@R%NIn3vcP!g_-X*g)S)%x^>XO`72A03m!D+O4t-|Ew#q7Q969UQ0PQ1W z)`HyAO!d?Jj|p5$?JX|}1`Wq0?}P-8pmC-F-3fDL0nUl<=g1l3%C%%iSk?O@xsyWp7*T=UZFXu02g>xisJFA|}stfV^%KFES*cH+_0l`;Jq54I{i z0T)tzANkO7SF7^wSuL4AzHZ4SiN@)?JN;GV(!PwXRf$l(P#>#ro1|InI+}R-M7Y)L zCI*{9bD1pja@j1G>E6p^){D3AhrGAy-@stWGBLTcw`@(wtV7--68Ux!qH#r>S`-Uk zxlXjL%=9j#pW`)p>0_0>iV@tOrp(+WsoOOa_l5jfS7-T#zv3*ILMuD{wl7PI&#shJ zNk(zn#z*}KHg!eU4p~5EEtv%P3+iNv_AW(bEzw^ydKnh}XF)G6S#IlT&Av?6qmMbeb)zFh z-&sX)Jj#Dj%Apq>{Rlnpw(77^B75ftdU26Xi#)TGbuxsbu8Xley0(<46kM8OOvJjB zhJWaq`O#*}+h?1j?V9?iA>*2AIVS%Fu?DI*NSnlqB;_fbVSE%zR+BTB_z(IvRlRXX9$^&nFikVCcR&HQS9ys^k#94YN=Cs! z)o+udPKtj~V?FV!YH;ROOgGC=n$C1+Ph5|8u(^$0kFwMLNSjP4-)`T#XC7q;!yif6 z#(M_`5837v8o1|zK_9w=6lQ{l;Bp9Es_?N_BYR6(gQ&JJD?EJnL4vPR2}94ZJ9WYf zU*(wJ*2>an2n*dk1G#GJ!Rp)7Y$uE|D~h4`DbfE!*WV-#q3QEq&|}A-x?Zkfg^VH7 zXeiEK(&@ZzDaew_kG2be6n1PNtpoI!=3t;M(x&WGrV&Su{{bWiw;%+aQGJKbG8w`Vl}Rl(!dHjV6z&QBSCAD6;yQL-tn$Gsdm(bf;25fh&z`?_DEHnQ(*#rxwIl0{F=*C6n=Cd2or>jzzr-`Q{A^B%t_3(wN+ChXJq?W{SY zPB(5(p8W2Z$CdN&h`_6v?&xnH)_eNQPlVrGot{4UI`=@nOkbbu?GPoL`6*i$deL(K z=)P*@*@5Io_TNg2$BlZHg#KR^f0_Gv*V*l&WW{)RkCT$^TTaoQV3xqRMXpaKWK*@e z6SX}~=C*dQx18_*Y9yh8M0Jwqn;g&<;h`}eU?x2J&5(AKVX9?#X66f zC{KFm+(sSnl3f{`mU3zr#_J#HE-${T`QrKbXmR==*5jQ8|8+1iO0iN$t|U9Uek&>GWZD-@w^zKVC{f|h z#%aO()NdSJl};ZV>*>qW-plBq%;HjXenf8T#8&rvtit+78s)#rEI022b3J(7_UY7N z<@4d2xWxYVKChyFUZD558Nm6DeOzoV$SHH}#@pj=97bsA;EMe$cde5H6Bpn6(3(D0 z^6)vX_gC4v$;5bx?`7v`-7Y={QRoqUs5-FBZ|RoEVa64XzQz1wDeM&sQ|Vq#P|ry zTl9I+P91UU$4V<kJa=H8HGLH zA5oT}KED*Sr1bM;!2XB_e>yQ1o7>%}MaCJ*c*PTSvZrWvd*Nfz$e-5fv7u8nZp?S8 zf=i?Woqtfhp0%>hJTS@}$igNxy*KpI-ukzDEPCCjj0yd|Q%k{f6QOff?Jf5dokh?S z7dgws|H~)p;lXs17r#Zf9+=CBcAg>2R{8z8yY)EPODDxkC!g-BMrFpoe3oT{W458Q z*kJhW*wU!o?kp`8ogb1uBIwJPe)ZUMh4a@Zl6X9d%Jy^AVP!H=mEBMH@tYbgS5rNB z@?68ovfEYVR*I`|+-3Uj=sKH}r=0(xTfH;!>&>+);a)nE_t;$x^J=J#W2pZAA(#YO zTcpJXB0f^MnDBiS0L^at+#?4K5 zF)+*Zj{V1w*koQr)!XIh;21ZBObPDSlH9Ki-|=^5r^H^oXR}VFqH>zUyWyo%ow8|f zB1-+U@`@JKBv&u4Qn2~a&2^@OLWujg1OrX8E~j`1=Y6}s+vUf^2T8E%s!08ROVkx^ z{#7vu_nm{#q&%dO^QO6iX``60SjgoYxyEctq^8SeFMA!8oJGdtX>6?*B&dv)PxHcR zbw`SlXtEsgM1!3lstmM={eaJ>b?+J#VKUKnJ4sA2$H;4H+ss(()F_v@a`E}`Oqw6p z;=g&F2^mqO)K2}zS+~DqR;uuVu)^mOj-JQ@UB7qyqFl=1`$pk^q6*0Igl^(EPLy%< z6hq~bzTdmJEdwf0=Q-sR_P}gwkGYRhajwU{yqfzpA-2kt$KPfLdni9v!lS6N+l8;L z-_D{{{Gsd=w6lRC_$?}COLLZ0267Y$w&{85z1{Y_J*^ZQmWhixW{4JT@@xTp|}JWv!f$=RbT)Bk<2pjxTYP9ZS)MjS_zC^T2rfa$s)9H=ZV z0v_yDg_c3N8|7f)bQBwHXqg=}&*sN?vV-ih`sT6eTU(W;rN&!TrZUM=1Qxw1`b}?TF0Y?G$$kIHr@qo;=KBU52*wxDtVw*v~WYO9hH9yjt|gyew4y5*^?W>jCmMP zr^{WrdDo?Lb!oEi{o zuiBVjZt;DU(b0_;)nLZ@7+n&?U%k2#Lc+C zQID-;QO)yIEgmFul=QX1=X|1WbPk?(t)y4wGr&KnrcQRIIxKa^mz#0kixofjF=T91 zVQLXn22;CL@~Ad;;;&1p4#aT3de5EP7$Wdj2;*PWW-C>SQocBRmAtA-E50>N($^2K z@BX6VvPlR4ZGSb$UcahprH;S;hw6kH-uzJP(81W(g;I57(!P;+&DYYt;rJ>=)eDbR z2NJo}T0)}2xG7sgevZ|pb%lH%Q%I^0DIQbMTuPK5R`6E5HSvn#ikvGIN~(@Z+Bfcr zM&pdd(U^piQ&0926v${KE#(y7{B>h@eHrQX9i=rk_ehJ-;oWK}KVjDaZF% z-NpACdDvV>D2Xqcp?bSal$y5 zXv&G;1LzV(U~sAvh@E7AbPxdO#521IDO!>h+#vp!yB-A|%p* zP~c7qDwEN?Ejq_}D<{l?mlBibD4<9d+QR+8lIjK54@;^*uDxl7=<|wRwE*(!`%(ch z(Scwx>4$J4i5{G$j{xCC&m$clO4ZIHao5nDia^(^1*{%jr^vwrv_&9)HfSM!=xF?u z5uScMsw&2;7O?g3;wpV$#SxYT&#OfP@3Du9mkEGdf;G_0fIgNNPGV7__1QXxDk9K= zmI(W-1QU+llGe>kT0#h;`Uj}fE`VPBz0|-!GeoZ`0lTlHy(^;j2e`mwpM`D2+lW6{ z%e90bSB~f|Qt_;m(+UUKAuJzitX2j!M)n0iblO64U*z6i8@DL(r)_dir+1; zPZ26$s`~%%NAPuh6Y6^$F#7g^DBwf}p$VD3zFm;bi$XY+53QAzU$56{-wgx>c5g^L zTm9$M)Ioh0USGkPj%GR#M6LiO((IrLaEaHW|Cn#j>M48fcmabWio&|cFr2LUX3A!W z?oXVGn2lMu>UZ$PN4agp~35P{_>Q(48ziGnZg;anlNL9mN{+m zNBaq%16at$(huHXc_X)!nnK*U`pWjug03IGR$DNi;H$?%QG1Lzfno zb+58$wA;?G+U2!lY}TCFQSDt>g19Vwq%xH220xNsd296rEvi>qr@v7)Jm~AXQI-_& zq4UE0pxd`W_QUoP9s^dcSqNT0M_+U!|}DYzf-h#;-eVvBSsS4*+eLg?wm z@CBMt6ok-3XL4+!J$I)IU>I-Q3&&NfK3U zb3<2e83vJVs5v8+hY=1_Noq}N6%R8_QJ-$Dj|tdNpVQ>SE7pZ%!Xs9n7T~G}Ctp|A zW6g|_RD3nBz0o0UaY3dA(NdU*^q^O2aDdp*Wz^mkEF^LtN3x4lN9sW|yVrssIIb=; zI)%5~c^# z(`(bE%%@q=HuMoq4omIwokBu5=!kiQ=#wdBPH-Pl53EZkHW_BVX=6p7=!~wsWr<35l)dt-J(H#H+nB$kizGH4OXd+biNO zq-5c>W9Ys?^*e@&0ZK3Ic`w*%eZp0=GDKW6L)0>p8e<7D)7xT*jnmdZ#^{SOljz=Z ztksw3uCA}OKe6_bh$(Eica@)%4}#1_O(UjcXv_jyz@JPT3=9v(xFYG6nNpeIz*=9p zbMC+na%G#b@ulaNw^J%>{kG@{i7vPttyFfU5~QpBYI8Y_GoLepf-8Ge$x||=zM!X* z5HIDegc4U;NE3t>E`NRZ!Hfl=d}&||rU4Smp;~>{@!?2sM`4ghEG}y|cCo+YU=Fno z+aHTz*|qqy?}))Q?3WBIt1czs8Xd$t!sWehu2%bb-bAh?MXn~9w+X!)rq$_41=wpGn*ZUibkX}$Rm#K-mY$jdFd?lw0D~Mf{0T;{RBqY?0{<` zJGxecagd!hYVWg{?v*m%I5=`N5gxB;`co+6*%m%`Pv8YS`S0FeIW3mg?(vx9xvhPJ zh+jdtHTCbpeZ8`<m;lpR(*r}=hf z0BBA4K+-Dz)Skn^`ckA>Wk8?&(_GV~6ME>`4_7X@7##fsKDl$dQ8?dfXK8(--+e(w za4T5}*SARYT%S`$o(<_9+3j!avrYHvx_mO-YxSf58t%Eg6M6ZAe^>%M{~vaDizgA^ z1~*5)9}w2Y!2;lNwjbK*<8sc0)dLx^@flbw%5wv?GRewwro*I+Lth`P4WzxjFxut` zJ*p#tA>+$L{OsU6--7jTXQ!JcUTS-G#VBjb;~<}4?cg+%)E4{6)RQr(O;*2COu*rA zV|hWIqb{Qnv8BH8j{T(>|0CDc9`jr{DR(&j$W5-La z&m{0%|1LI_P^~tT@cepDPmCa_i>>jzKhC(4%fEW3>r^R~PNl#;wqa>M!>TVm=PQO+ zdHg6vztyye39M>gXP;tRQMHXf(e)u`<1- zd<@EBb3-?Hp4`F+_}l%!e)F=5zh&Y*s!W$YeyuZi>SDM9i}xthWeZz45;mFTnA68) zMINUnpKRlZpTdOCzj`vNzxIyrf|@dSI+frS!Q`N%=R8jKb4O6sN6li z3h7z8q_h^^>4X41kHE^s_{+3V#VI5FL}OlXGGS;`&N1CdvB4c0)~ZxzWiAHC(hsNo z3}04TaFj@L|D@B7`hjhZtslIvHwp@$@KtbTDS8-drYc4ddr;8tNiF7BB|};~ykXA+jVdDgI$ z1U{xN=_enzO=x@5zeAhh^u&x$VN6{M<{S z*00Fxv4G88+P`cr1DnN#H>PEvzkzh8XQTmWW|`_BzBpo3UDSi>v=i3X2|6Y`Sw^yB z%n0m2{80y5H+Uq4({++E3`Z(J+$1c^0ePrF*Ct=Zurzs-|F%})2v{8&<9|TgjpA^F zhpXBLKf52O=0`%;bd%V7QCfW)Jo>u1i#zG5cd8rv6UOd@;hbV~f4b5rWPYy;Wb+HN zQQOJ(6VRU8l=3?V*M7kkXlOJ;m@7*)v*<3|WJcydZ(eX!txJIBMdr`bI&z%+n1zHf zbBm0U9u(HoI5BU)02xoJ1u~u=Sjx|ScD@^|AlalFIau`Twq z&ht^U9l8*D8U3sC8MXrd_}-b3wXUWp>#UUiHS$F_skO$-pBI-~CA!Z+qjs>tM70#r zR_+TjqdkaBTj*y*#*HMCKaI$=y#W(6B@pwO(n*T%B8pvtV{E`m9jij#o0NPVxYi+2 za`|wj0M}4|0qx*nzHP%y^9HT;5?!(N$?6vChf+mC5niTo1Iz07?VXkm2IzR#4%{dn zI>^#Wi%SqU-_ArY-Y*&IF$qkEui|&in)Ljm+b%baG8xMw8AVw06W%b=vij3DIJG_% z&_1q3g<}isR9krAfUB-wd&|s0&wrS;OTHnibG~bjz7RuX$K>nk`nrXDCXnz_2K&PQFq`T4;C~hlZg<7%fk&}J zJoreaFC3`xDpRc$21DZAkOYg41wDCOCX-<4U6e+>+WA~v28e`0l>~6RrF1BG(ZyZ! z?Nn>WUGS~0hu{j@Ag_gHxNxKVgiNMkO8>A7?RH$(b9jjiA|{+OMPC1=Q~e^DET&U^ zb>St>u~F@0F7g(K(UcXyU2jbFj?9$jt#YXQ(vfk}G?&dmo}tRLdJIKbWjbuzyrmgNwvYqw-nNZ67a!=J zcOyR!(<=Ts_F?&HJs}1$ogV}6rq*zIT5A}@T=XRLF<+oDxES1l44MwLeI8}=5qX`P z=CMXB=0WQsu9{B0uM02cu0;uN?qDuuBcl8|1Sq!9Wo%fffEQZNEb(W<`SAMxOKIpi zSU{k3nZiE-Vg%HD*Yj%$AS|BePm0O9# zAYE!{IajE}5>)Qwowguv;2iOw;T6!XV1282oSwg*(&!+$f0&&wxK<^SsdtEpNai1w zUGy1^x>E^(%oj9D3sQK0Ce2H9S;E;nu!!A{iKkQ2p|qz{<&bghPP8Z%#Q=7}m{YGt zGJ1Yo_}Ovt7hUmo;(1{{Ba_#%?rOA)1E1^t{UYg?&k3g+n6y@wrFvo2I@aUKN92?z{mG#sQ#jqk zxV54z)!bcebs>IYxcXHnJ*}|tgpsjkc17w#tlIcOeB-cOSc8958$GR%@PvV}W>HzH z4OXplAur2YBT?8&(?m11;)>luy!f)5&4hmlm+*wTiDptos)DvhMcjLvqI^{K;GCM-_}UV=Gdn+|{t_*G7NHwT=5neWT~TVcZ&Bk$TzP9{%-@ z!dLo-$-*ix%Dy@|tKC_TuUPUv`^~?rg+44vxHZyPGpr(&*WLcwket-Gzf}wUJy~PT z;EGgscYD5}>Q^r#f{&FfJsP$U`tZl{Y14y;wb0LL1vE2QwdZanJ)4`Iy;coR_(4B! zzk~kX{s#lR0}j5(Q^P*{tGn4BMPz_UQ@Y{JFi;!vJnv}k!u{(v)9YTQoM1<(^VOb2 z;p0Nhp2OA^VRe3pp|&PJjDVV?Ng%Z|o)2+Q&nh=pmE>P86OPQ6<4@pqAB9c(%PVjM1oOejfj32$uPX9Z`8D$=p5$jkF(CQ=JnduN=8ry?laoXA-lqDTHYma68bqi> z>R>afRX*;j`sN730*(aEGlJumbtt84d}!L6H~g$2c5I^p-!ydDQEP-zE$B6tmy8!> zYH_kMRKW8UcH=n`bhV+LCnN}`2;bCbldrY)f@lspH1cu_hdNrh=LxVgr9XceLydwK zvdM#;OYP&z3Qha;S#yF$+Dr_s6TAgQcRpoCFb)MmL&=i6BjUdY8 zY0EuzqYFyFU(IB6@7xmXerK^$WV7dtm<2`g)ZPf?zw#&y3m;n$s19{LyF6nt4U_(E zjw$s91eE&J%U>OgAmnjquTj2Poj1l z%?W%5v9o`{6e`kGHA5&1Mqr<~g@ZX()I&_ZkdjkZ0btg}qL;yQRk{J7Gg`6*=^99f zkC5OK{R6NP>h-;k4AiD;Jv*D7@Z44Ii0N>&=ITqWv(MQRbUe>$XX>{dUcd*G=(wKM z-W*MpJjt(3c)K6`GQ-L*evMIprUl<{lxd_f0H#Fz~sMz&IYDl@=HV<<# zyVrc03oW|X^}mtTD_t|igb<@Mdq0yP%C0YEyIJ$;5#|NZrdL|xQ&xwlL_kiY&b1b# ze^o!?@H8&X>~%LOMZi4(A0hJv{YbAgx&u(kRd+xwA1(f^#$wvmcvr9j(80fD{@&^r zN?AIKsQ8`vrIFMDf_y?t(2CTTYl?@dr>IYA`o$;`HTWN~W%nw5&`5LU<5bN9m=bLH zn<>2h}YF{*M`BG0lrs1+=b9qaBZ6i~u?Q-&3@>Yn4EXOMNchAuEM(ikI89z8UXO zn8Gykqqj~Ew_5wZYj}A>S83+|uP-DVvq7)RA+qpwvS7{q25gtZo5I(rf+(x*SNao< zGYDczf=&PHg%!<`xAK3>MUF*%iIsFAFt<#w{)d-4cYpGnJ}Gw~KJ^b8hUfA7)x6I7 zQC$yu!lQpu`Di@PQQr)n>oii&xsI^r4j6E-nrlz_@p!fR83lR2GziL>i(Dk|$oBYM zsv=lIa;1up3W;PDVGNQ#st7#Sd#>viT#1rKQI5SdMNo)l-(s@7pDrVtT=k|p1L@D@ zdJ^@n%SC;C&fR3UPp|^tSK(XmJ#2#~o>DZ8&N~F4I?(~H?-0?;7E}YuM;TbGP=p{e zOYFA$gwzE&v#uLX0YE|N8y)J8poXXcuH%CS1L-#udN@ok-BUEA74eNuvjD8-jspWg zICAO(cRd*PzJ@!k0c~?mTXl(8op!8Rcrn=wf^ZB_iFPuz;Q^~O8Q`iQX}a0N;p_&` zQJ8P^$v}V-*e=Gn~>CsONn1W37d`JPfaIN)HY=z&LhK9RUo+^UH z{Y?9XDuxzL?aXkAG|XIDPT|_Qv@T4j*ftS4n98-c?b4eT=Hh^C1imV8Z7Z59nB4e&B?V5;QYV*qdHFt`p=nEw9@0ryA32dCH)c&9e+wL(B9E-I0zKLjhl76e&zr^Sn=r6$vobjL>-wptzrRP6^=Bj7YsoVJPB z_v<8h(OUD{i_`9L;j@C0b}b}OQ8GOZg*4tu%3Mi=uNfMBFMXM!r!4+`LF^ykURKGDsMXeSd!2Z(wV&0+D(*0sq)e6#0M|ZT; zGLVwy48;i&a(6?!y5pho^$gQ{hFgdpZNz6V2q!Id-NE$dI>>_q;Apm=-I`Rrhig!d zUv`s@jPmP}IX9=Ys2z5XC~3zZYpNQSLI4daCzSYJqQ}#VWmw8ZfbYt9^bw3SuiyAO zVPH~RI8XbRPYUb9Q6#Lj2Z2mOw^riqX#4Y|kq(OM!*7zhQY%6F1Z42*FSN8EE6+l6 zI~z)RNLZw#u%8ZiY!_@yHMWS(AVH9oP`HYqpDQ2*m@fi}j+w~4DMtnp^xhAkb%2PU z(C)&INBAqU7TLUMldv5q%8%ftT!49{GJm?T$WiiRvKHfg!vt@62FCl*N&vVhq&;Og zD#yT&8J31sPzBo>X{oqpj%`LD2q%@^{IX}!bMxxPoeZ`R+ENn2$;)rhLV`GTwZR~m z@$yUrWt9{T*6X|=3^VSQ5ks$NNbI8^tX=!D28Uqp7f1U;HaA^|rFWRy7iUY{x0%M8 z-X#pKt%geP;QYBWmg+99hS07LVK?d~+!ivo%q^t#B2@8tv6*$;{0nu9%OPz)%>|{g zc^-MkVYVn!xxHD$!@|QxwR?T~*uzntSBlyf>?xrSH?d}lb%FvhgkcTVg zVN!Z#s`$v*%xvzA$+|9=ygYmsKR!6N?4!$q*XGdL&${jm?xs(w_<-0cM=30y$HL7` zbDzn&#kr7_AKb16s(7zh$-^?8Z7vH(H;2f6)_Jstr1Wz)Rj6X}@RF<2*a`PMpXDLn z)w;!*kd$6-BBv_eDOPe+x|8U#5U?>swp!=W7LwA<-BhTGw~n3Ckiw?BFWlTP_nD|$ zoC-Bi5| zF$!u58VXtpItqGeK1hdgn zl3X}tH}qV4QUbC!bo`Ozh%UcGu*oU03+;J0fW1uHqmU%H{Rs}>op47EDbtzhBXn?# z&5MH5Y6>xc1Pwk>BC!tP#|;ds$KV4cKU)p%HUNf%zUQ>|cGL0>H`!|77vRL!gZ;zJ z3(ONZnFQA?6>eA%4xUj6LJnVv@(|VPq0{6Ukz96{FmT<0Bb>Je(5Cj^;0e{bD*J*$KFm$F0)4`f`~alLf623 zD3l4tvth-qbI0b)dwG@4eL}A9EvSp9_C?s-UVSVWS9`f2Xiz(6nHm{7S`d#6-55Q5 zeWm6FW4TjsvQ6$wI*ML+ zPD;9-m$9FR(At}l6k%)aCY+>XIuJ`3K8d9q0$h&Z4G;w!wx49f1@v8bUWQ|H5P0%D z%uc;mws0R(w(bLD7Hyd!DTW}kY1vF&qP8@^2Sqcia1JeH?$3;XAo~2w3nNY7o(86Y zT2EZ{@m$k3{RvWhOmM6`HQ?l#Fs(?`M|ea+He)R%Zt-Mj-%LQ<_s<~*hk@Bozh zSVKE4(HStCT^HQ5`VyIiK`>F`$?(H>L4&)3z+(YHFkyzZn^NH65x|j&h&-%HQgI&A z9f!lzkrjAAg($^fM#CN|jUY42?r4X~Au&2oIhv2JxBzzrEUYSL`T$@TP&tl->(h{) z3*<;1v^Xv8Hp_raTD1MIoc-UGkVq@2oY1YgSTmAl(wKs@z!G?r)WYiN>G9n%f*O&SAsPAqGU>V6Lw1_WSImKOe-8|3-+W{MR z4Pitfx3GhR=PCa3Mg_?bgvx=~1*-(?;A;gm{vRF}gsB0eO8+$~ON40w-rb#^2}@+T z|9yTC$OxJBp?}BqL3%Ln{5`^79@x!VrTzBEuj=1+?Pk+IZZ+*X?qAaSc3(y?AIKc+ zx|yetNtYY?PALEw8q)`L(^=92phNwOBht3GNqgxpN08P7pnS+0f35LgcSR%w4Q`Me zQ?ly5J1Wu=eO>kd$S%8U_#dAEc2SYIE6jaR$h?=TDn}cmfzb zaE){Y*VON}O{xA_1J4e8b^Og;q=LrG-KPoJY+zmfcKdE4)XeV=5#rC^mhG^>n_X`K zkh$x;AYiv43xSkv7?)?S`3L9Fp?0%knEMDZh_rrw`HGYsz5373IkNR49%fHrOcqSJ z-(cV6fG=cB738*R2K0iMY6J?tp`PLeMQ^1!p@sQVVEoFfd*fi3l<=RGluw3;FrU>xKW@+$u=zh_5G z?dk2GN$lTIB2WIR6ES_~bYSBrl?)Wr;QHS{28og@Pht*i+%N(PNf&a51h5OFn>-o^ zLXXe5>G+YA=24zi)@nr*uxd(9T-6qT;*Pw*5}q4S`sc9gN@v%~_4pZkF@2DRGyLoN z&;VY&S=$i#39=oP5^dn|AEd8nvKgIiY9PhUniAX5y zm55At_GE&k!a~~7en~KBy~TCta!C{7tN)EH4sx9rL`b4?`#WAj35qkL|jE8 z<{Y^hhP%C129eqMUoDVm^yY2^9~6b?vw8)g;wC8`w@Zgb?B)Y=>A;8CHh~8wRtM-b zDW>oa@kK#83Sd+$p3>E;KB%DbkkiM%urF@D@^A2=G%BC)7z{;A7zZAW^TS z=C5G&;?wm4YK`1(n;Gu?5h-Kw6 zNb1@Vc1}8wc@Tuei;!0iOAop&)BIYx9uyhgqi;VBc!ZS9{Lc9R8 z;`9rx$jz{3ho=%kYM}feD23bt5O`L1**)yK10^JO4`QbSLLV9+1>@#1K<^npLZWWn zxJ?=bDKb99zsvoh($*X{Vv(bOfIBe$8Lh-DiQIFW#oKi@;f86o%5gfiOl$wQ(g?X{ z2u1k`_)KLt%n)b-h9It8Xai&<7Xg~b5LY8n_-VcQu%`&M2iQ_Enbsnt&|IBF{BbsJ zB~g5q40)bFfqh$-P(cL+@Z=6C1w?GRq08y@7rldHyJ1sd>ZzF>klI=H+@9Roeh2@X zXJ@mcjnewP1cMO7HJQ;5}G=n{V+y5 z7T$T^@%FXNsfFbLsZK+F2ZV={GTAvI`fQXxV6BTg+UC^a@=dAkb0cU^>%0=}euM!e zVU~Xk$UME)vWABIwuP)0vQkDnpM5XZMuu_5gfFBqWvvmpu#tM6;e}t&aIkL4N&+4K2Zw2SLGAcq7mQJ+SHtp< zxPb^qeHHqQmA!fUqWreW&iu~KqKQB4BK}dO{`o~Le;N>I7*P*vC6CNsv67{OK$jJD zrxuP6vuj%6rN+NbjrxKFdA%BC9zq-1YBn9dm7UVqsYru!0iw^Imre-}%

`#@lFG ze#Uhi`sz?;@vyv6FSC9z>M`#R;QtKgAN@Qj*J#Z-EU)(oVugdfsdYf#*dh)Bou|3O zqX~#W^`&Y7=Oq-&)ckUF#a27yn@qLv;Y{T{XXH*T-czVhdx8{K+O?Vp;2O7<3-7}5 zWJg~k!rpkV<_rx#s9{JAlaVqL195+?I;~S%sYQ{DsFG?2-x8K;I{z>R|8tCCbP&kM zOb8(3JcIn6S&)xJDM!MRg;o{<_i)aB!T!V~PnS z_UkBs2y$ef->7yx*G;?A%xo!v&eVZ1>0|?^sEM*9im7T~OuPG`rUyd%Iku~i=TC%r zW7$cBa39!3rqzy(Jnrz$yP@{;oIzce+6qK#K%QxpgsA}v%fS==aOU5gZ{Z2FBYmH> zL5peC&V(>xLgSq^0rr%sZ&7&MX`i)xV9GoI9~{aDwhoMhM5iYao%AHg&(QJ1n=D3C z1c`vK(>%cTfj3u)35L5UJ&AM%I(~%qr2Y(vf4OE-&2$-&V1-HUXnq0+-$6)CAWRQ0 zwy1X8fH%U9YVn3YZUFw1Es(f@{{*y0&{%}=gj?N68Krh`@2*b?2u-K7MuMD{t41v) z$Ivv|NfUTJRa>cQ$e3Ym0D~Yw`cCdbTX-f@H5o#(N+R>8b(A5ersMB_u(s|<;)wm7 z%me?F35kzUBEJYg>RyOJ(4Q7IpTsNj%5iJ&cih?Dnj7@&fA?-D>w)u*N`v|QnU~+Z z-%*_Ddq;giZ*%(?!uqKn-*IHYa=IpM)vN&>SBDyP5G%U+*!n9Abx-8A!U4wEl znR!I{;bgQvRGhPGOe+(+zmSX@R;F!;zQ|?A2hFp~#Ece_F~iEk_0gwaiqgi|O~~{C z(I@R8R%3i2xp7!I3}kui_ze46i^|e$v5tp^l&i<0U7AHxWcphDD$;1&9cKoW!^Wa7 zve@xm?{D>~5SyM)zPzMtF&6E}Y?pqmztyWk?8kgE^OCa2Sad#S(?%q9RdtDu!jW*K0X%$0c6P-1F?oq1=6^>lqGEdFm_#^cCIk)xGYP{Oh_=YV3Os$ibUk$qOp^K9Znatq&q{q{rHtK*M#=Rd!h z`vWk@2e%%cRXvC^mgW&d2sdo4XPzhgXz=xtj6UVvB3JU~mAB6h1nBRzcOth4xV9H- z=|El`z=vcxUr-^5_lxyC*eJ(ib!V#g4vd{17`qC8qNBFVnNb0MMZU2(G=7#Nux5R5 z>@<}$e!MA!;2FPAvmbt_)=lnZ%G%%jbbdL3^xmp`HAN2^& zD7IuHKbX75p?UpBk;036BZHQEYFSTwu4(2Cl^qnBbqjPDGdPabl;(|Bv%D~@w`v}| zN$=7krL7XjxPJM|e5k8*!=7{B80^rabwRSs4?JBfq#_v0*Kj`Fpeb^}Id5zF$C9DL z$$_enarh1xs4^S3zeKL=AsMp0a>GSP%tdSny979o*w7s$u^+g zt4OZJl=B|`(HB`$F*tVi3I`p3%B|zr0SO87H=8L_nM8uf{x{ZHVZFq>axNdqv6#5i zdmP4UdM}*7-aGTPxio2%clwI>kxQ+4DPyNEuq^zEVZ@$Z50b?<;u7|r^^uH<`J%G_ zy|QSN1<6g!^*DCVc;-4BZPOl^5m|gqqcK6lQh)IA#1(PxWD$IFV^)^Nn9yrf8q8jO z9LpkWpxP+>ZP41wd#U;Rr^mkdNdCdJYx#Rg$r$)5ux-FPh?for^yN3@4yZbn>AdEd z_%M2f%A47>@lg5G2PTado9vekhOWIlj32B$y-@53>k`z(EP6cN5mptisc$Y79z8z_ z4&6J#FnVQSc9LwgjN%8&`-}Ct4kw4D0<*0pV_!cKJoE<^tzq0PVJl|7

pfO(^yjqg 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

u3#n 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 z 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 literal 0 HcmV?d00001 diff --git a/data/init/fpgs_data/users/kca_planning.xlsx b/data/init/fpgs_data/users/kca_planning.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..40448680a0c469e153417ed587ca6fd8e0482b72 GIT binary patch literal 14751 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 literal 0 HcmV?d00001 diff --git a/data/init/global_schools/Kent.csv b/data/init/global_schools/Kent.csv new file mode 100644 index 0000000..3d03ba3 --- /dev/null +++ b/data/init/global_schools/Kent.csv @@ -0,0 +1,624 @@ +URN,LA (code),LA (name),EstablishmentNumber,EstablishmentName,TypeOfEstablishment (name),EstablishmentTypeGroup (name),EstablishmentStatus (name),ReasonEstablishmentOpened (name),OpenDate,ReasonEstablishmentClosed (name),CloseDate,PhaseOfEducation (name),StatutoryLowAge,StatutoryHighAge,Boarders (name),NurseryProvision (name),OfficialSixthForm (name),Gender (name),ReligiousCharacter (name),ReligiousEthos (name),Diocese (name),AdmissionsPolicy (name),SchoolCapacity,SpecialClasses (name),CensusDate,NumberOfPupils,NumberOfBoys,NumberOfGirls,PercentageFSM,TrustSchoolFlag (name),Trusts (name),SchoolSponsorFlag (name),SchoolSponsors (name),FederationFlag (name),Federations (name),UKPRN,FEHEIdentifier,FurtherEducationType (name),OfstedLastInsp,LastChangedDate,Street,Locality,Address3,Town,County (name),Postcode,SchoolWebsite,TelephoneNum,HeadTitle (name),HeadFirstName,HeadLastName,HeadPreferredJobTitle,BSOInspectorateName (name),InspectorateReport,DateOfLastInspectionVisit,NextInspectionVisit,TeenMoth (name),TeenMothPlaces,CCF (name),SENPRU (name),EBD (name),PlacesPRU,FTProv (name),EdByOther (name),Section41Approved (name),SEN1 (name),SEN2 (name),SEN3 (name),SEN4 (name),SEN5 (name),SEN6 (name),SEN7 (name),SEN8 (name),SEN9 (name),SEN10 (name),SEN11 (name),SEN12 (name),SEN13 (name),TypeOfResourcedProvision (name),ResourcedProvisionOnRoll,ResourcedProvisionCapacity,SenUnitOnRoll,SenUnitCapacity,GOR (name),DistrictAdministrative (name),AdministrativeWard (name),ParliamentaryConstituency (name),UrbanRural (name),GSSLACode (name),Easting,Northing,MSOA (name),LSOA (name),InspectorateName (name),SENStat,SENNoStat,PropsName,OfstedRating (name),RSCRegion (name),Country (name),UPRN,SiteName,QABName (name),EstablishmentAccredited (name),QABReport,CHNumber,MSOA (code),LSOA (code),FSM,AccreditationExpiryDate +118229,886,Kent,1001,Northfleet Nursery School,Local authority nursery school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Nursery,2.0,5,No boarders,Has Nursery Classes,Not applicable,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,,Not applicable,19-01-2023,91.0,57.0,34.0,0.0,Not applicable,,Not applicable,,Not under a federation,,,,Not applicable,19-07-2022,16-05-2024,140 London Road,Northfleet,,Gravesend,Kent,DA11 9JS,www.northfleetnursery.co.uk,1474533950.0,Mrs,Neerasha,Singh,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Gravesham,Rosherville,Gravesham,(England/Wales) Urban major conurbation,E10000016,563365.0,174145.0,Gravesham 001,Gravesham 001D,,,,,Outstanding,South-East England and South London,,10012024908.0,,Not applicable,Not applicable,,,E02005055,E01024279,0.0, +118254,886,Kent,2088,Crockenhill Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,187.0,83.0,104.0,29.4,Not applicable,,Not applicable,,Not under a federation,,10072997.0,,Not applicable,27-03-2019,04-12-2023,The Green,Crockenhill,,,Kent,BR8 8JG,http://www.crockenhill.kent.sch.uk,3000658300.0,Mrs,Karen,Dodd,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Sevenoaks,Crockenhill and Well Hill,Sevenoaks,(England/Wales) Urban city and town,E10000016,550590.0,167367.0,Sevenoaks 003,Sevenoaks 003A,,,,,Good,South-East England and South London,,,,Not applicable,Not applicable,,,E02005089,E01024421,55.0, +118255,886,Kent,2089,The Anthony Roper Primary School,Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,None,Does not apply,Not applicable,Not applicable,315.0,No Special Classes,19-01-2023,307.0,151.0,156.0,9.8,Not supported by a trust,,Not applicable,,Not under a federation,,10069650.0,,Not applicable,27-06-2019,16-04-2024,High Street,Eynsford,,Dartford,Kent,DA4 0AA,www.anthony-roper.kent.sch.uk/,1322863680.0,Mr,Adam,Nicholls,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Eynsford,Sevenoaks,(England/Wales) Rural town and fringe,E10000016,554368.0,165949.0,Sevenoaks 005,Sevenoaks 005A,,,,,Good,South-East England and South London,,100060999084.0,,Not applicable,Not applicable,,,E02005091,E01024431,30.0, +118257,886,Kent,2094,Cobham Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,219.0,No Special Classes,19-01-2023,218.0,109.0,109.0,7.3,Not applicable,,Not applicable,,Not under a federation,,10073366.0,,Not applicable,15-11-2012,07-05-2024,The Street,Cobham,,Gravesend,Kent,DA12 3BN,www.cobham.kent.sch.uk/,1474814373.0,Mrs,Jacqui,Saunders,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Gravesham,"Istead Rise, Cobham & Luddesdown",Gravesham,(England/Wales) Rural village,E10000016,567152.0,168444.0,Gravesham 013,Gravesham 013D,,,,,Outstanding,South-East England and South London,,100062312570.0,,Not applicable,Not applicable,,,E02005067,E01024302,16.0, +118258,886,Kent,2095,Cecil Road Primary and Nursery School,Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,378.0,No Special Classes,19-01-2023,444.0,228.0,216.0,16.2,Supported by a trust,Northfleet Schools Co-Operative Trust,Not applicable,,Not under a federation,,10069334.0,,Not applicable,05-12-2019,23-04-2024,Cecil Road,Northfleet,,Gravesend,Kent,DA11 7BT,www.cecilroad.co.uk,1474534544.0,Mrs,C,Old,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Gravesham,Coldharbour & Perry Street,Gravesham,(England/Wales) Urban major conurbation,E10000016,563896.0,173124.0,Gravesham 004,Gravesham 004E,,,,,Good,South-East England and South London,,100062310705.0,,Not applicable,Not applicable,,,E02005058,E01024284,64.0, +118262,886,Kent,2109,Higham Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,208.0,101.0,107.0,11.5,Not applicable,,Not applicable,,Not under a federation,,10073365.0,,Not applicable,25-01-2024,20-05-2024,School Lane,Higham,,Rochester,Kent,ME3 7JL,www.higham.kent.sch.uk,1474822535.0,Mrs,Catherine,Grattan,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Gravesham,Higham & Shorne,Gravesham,(England/Wales) Rural village,E10000016,571349.0,172256.0,Gravesham 010,Gravesham 010C,,,,,Good,South-East England and South London,,100062390148.0,,Not applicable,Not applicable,,,E02005064,E01024267,24.0, +118264,886,Kent,2116,Lawn Primary School,Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,262.0,No Special Classes,19-01-2023,230.0,117.0,113.0,52.7,Supported by a trust,Northfleet Schools Co-Operative Trust,Not applicable,,Not under a federation,,10077449.0,,Not applicable,11-01-2023,08-01-2024,High Street,Northfleet,,Gravesend,Kent,DA11 9HB,http://www.lawnprimary.co.uk,1474365303.0,Mrs,A,Wilson,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Gravesham,Northfleet & Springhead,Gravesham,(England/Wales) Urban major conurbation,E10000016,562102.0,174368.0,Gravesham 001,Gravesham 001C,,,,,Requires improvement,South-East England and South London,,100062311102.0,,Not applicable,Not applicable,,,E02005055,E01024278,108.0, +118266,886,Kent,2120,Bean Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,190.0,88.0,102.0,22.1,Not applicable,,Not applicable,,Not under a federation,,10073364.0,,Not applicable,06-11-2019,21-05-2024,School Lane,Bean,,Dartford,Kent,DA2 8AW,https://www.bean.kent.sch.uk/,1474833225.0,Mr,Graham,Reilly,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Dartford,Bean & Village Park,Dartford,(England/Wales) Rural town and fringe,E10000016,558989.0,172058.0,Dartford 012,Dartford 012B,,,,,Good,South-East England and South London,,100060855655.0,,Not applicable,Not applicable,,,E02005039,E01024134,42.0, +118271,886,Kent,2128,Capel Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,212.0,No Special Classes,19-01-2023,207.0,113.0,94.0,15.9,Not applicable,,Not applicable,,Not under a federation,,10073362.0,,Not applicable,15-01-2019,24-04-2024,Five Oak Green Road,Five Oak Green,,Tonbridge,Kent,TN12 6RP,www.capelschool.com/,1892833919.0,Mrs,Suzanne,Farr,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Capel,Tunbridge Wells,(England/Wales) Rural hamlet and isolated dwellings,E10000016,563919.0,145118.0,Tunbridge Wells 001,Tunbridge Wells 001A,,,,,Good,South-East England and South London,,10008670848.0,,Not applicable,Not applicable,,,E02005162,E01024798,33.0, +118272,886,Kent,2130,Dunton Green Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,187.0,90.0,97.0,31.6,Not applicable,,Not applicable,,Not under a federation,,10069525.0,,Not applicable,18-07-2018,08-04-2024,London Road,Dunton Green,,Sevenoaks,Kent,TN13 2UP,www.dunton-green.kent.sch.uk/,1732462221.0,Mr,Ben,Hulme,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Dunton Green and Riverhead,Sevenoaks,(England/Wales) Urban city and town,E10000016,551173.0,157352.0,Sevenoaks 008,Sevenoaks 008F,,,,,Good,South-East England and South London,United Kingdom,100062547929.0,,Not applicable,Not applicable,,,E02005094,E01035000,59.0, +118273,886,Kent,2132,Hadlow Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,187.0,107.0,80.0,38.5,Not applicable,,Not applicable,,Supported by a federation,The Bourne Partnership,10073361.0,,Not applicable,02-10-2019,13-04-2024,Hadlow,,,Tonbridge,Kent,TN11 0EH,www.hadlow.kent.sch.uk,1732850349.0,Miss,Nicole,Chapman,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,Bourne,Tonbridge and Malling,(England/Wales) Rural town and fringe,E10000016,563334.0,149843.0,Tonbridge and Malling 008,Tonbridge and Malling 008D,,,,,Good,South-East England and South London,,200000967219.0,,Not applicable,Not applicable,,,E02005156,E01024747,72.0, +118277,886,Kent,2136,Kemsing Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,184.0,99.0,85.0,14.7,Not applicable,,Not applicable,,Not under a federation,,10069522.0,,Not applicable,20-07-2022,19-01-2024,West End,Kemsing,,Sevenoaks,Kent,TN15 6PU,http://www.kemsing.kent.sch.uk,1732761236.0,Mr,Tom,Hardwick,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Kemsing,Sevenoaks,(England/Wales) Rural town and fringe,E10000016,555461.0,158873.0,Sevenoaks 009,Sevenoaks 009C,,,,,Good,South-East England and South London,,50002002944.0,,Not applicable,Not applicable,,,E02005095,E01024450,27.0, +118278,886,Kent,2137,Leigh Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,171.0,No Special Classes,19-01-2023,161.0,77.0,84.0,18.0,Not applicable,,Not applicable,,Not under a federation,,10073359.0,,Not applicable,08-02-2024,20-05-2024,The Green,Leigh,,Tonbridge,Kent,TN11 8QP,www.leighprimaryschool.com,1732832660.0,Mrs,Jenna,Halfhide,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Leigh and Chiddingstone Causeway,Tonbridge and Malling,(England/Wales) Rural village,E10000016,554871.0,146478.0,Sevenoaks 015,Sevenoaks 015B,,,,,Good,South-East England and South London,,50002001763.0,,Not applicable,Not applicable,,,E02005101,E01024451,29.0, +118279,886,Kent,2138,Otford Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,No Special Classes,19-01-2023,332.0,172.0,160.0,13.3,Not applicable,,Not applicable,,Not under a federation,,10069521.0,,Not applicable,18-10-2023,23-04-2024,High Street,Otford,,Sevenoaks,Kent,TN14 5PG,www.otford.kent.sch.uk,1959523145.0,Mrs,Helen,Roberts,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Otford and Shoreham,Sevenoaks,(England/Wales) Rural hamlet and isolated dwellings,E10000016,552632.0,159289.0,Sevenoaks 008,Sevenoaks 008E,,,,,Good,South-East England and South London,,100062548574.0,,Not applicable,Not applicable,,,E02005094,E01024452,44.0, +118280,886,Kent,2139,Pembury School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,510.0,No Special Classes,19-01-2023,404.0,199.0,205.0,11.6,Not applicable,,Not applicable,,Not under a federation,,10073358.0,,Not applicable,26-02-2019,04-04-2024,Lower Green Road,Pembury,,Tunbridge Wells,Kent,TN2 4EB,http://www.pembury.kent.sch.uk,1892822259.0,Mrs,Hannah,Walters,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Pembury,Tunbridge Wells,(England/Wales) Rural town and fringe,E10000016,562858.0,141702.0,Tunbridge Wells 004,Tunbridge Wells 004D,,,,,Good,South-East England and South London,,100062554668.0,,Not applicable,Not applicable,,,E02005165,E01024827,47.0, +118282,886,Kent,2142,Sandhurst Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,191.0,No Special Classes,19-01-2023,154.0,74.0,80.0,25.3,Not applicable,,Not applicable,,Not under a federation,,10069520.0,,Not applicable,06-02-2019,07-05-2024,Rye Road,Sandhurst,Sandhurst Primary School,Cranbrook,Kent,TN18 5JE,www.sandhurst.kent.sch.uk,1580850288.0,Mrs,Amanda,Norman,Executive Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Hawkhurst and Sandhurst,Tunbridge Wells,(England/Wales) Rural village,E10000016,580082.0,128340.0,Tunbridge Wells 014,Tunbridge Wells 014D,,,,,Good,South-East England and South London,,10000069892.0,,Not applicable,Not applicable,,,E02005175,E01024809,39.0, +118283,886,Kent,2147,Weald Community Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,175.0,No Special Classes,19-01-2023,126.0,55.0,71.0,11.9,Not applicable,,Not applicable,,Not under a federation,,10069519.0,,Not applicable,04-03-2020,27-03-2024,Long Barn Road,Weald,,Sevenoaks,Kent,TN14 6PY,www.weald.kent.sch.uk,1732463307.0,Mr,David,Pyle,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Seal and Weald,Sevenoaks,(England/Wales) Rural village,E10000016,552697.0,150900.0,Sevenoaks 012,Sevenoaks 012B,,,,,Good,South-East England and South London,,100062548945.0,,Not applicable,Not applicable,,,E02005098,E01024459,15.0, +118284,886,Kent,2148,Shoreham Village School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,105.0,No Special Classes,19-01-2023,84.0,40.0,44.0,21.4,Not applicable,,Not applicable,,Not under a federation,,10073357.0,,Not applicable,26-03-2019,25-04-2024,Church Street,Shoreham,,Sevenoaks,Kent,TN14 7SN,www.shorehamvillageschool.net,1959522228.0,Mrs,Gillian,Lovatt-Young,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Otford and Shoreham,Sevenoaks,(England/Wales) Rural village,E10000016,551878.0,161599.0,Sevenoaks 008,Sevenoaks 008E,,,,,Good,South-East England and South London,,50002000337.0,,Not applicable,Not applicable,,,E02005094,E01024452,18.0, +118285,886,Kent,2155,Slade Primary School and Attached Unit for Children with Hearing Impairment,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,No Special Classes,19-01-2023,418.0,223.0,195.0,13.2,Not applicable,,Not applicable,,Not under a federation,,10072996.0,,Not applicable,06-03-2024,22-05-2024,The Slade,,,Tonbridge,Kent,TN9 1HR,www.slade.kent.sch.uk,1732350354.0,Mrs,Karen,Slade,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,HI - Hearing Impairment,,,,,,,,,,,,,Resourced provision,10.0,10.0,,,South East,Tonbridge and Malling,Judd,Tonbridge and Malling,(England/Wales) Urban city and town,E10000016,558843.0,146765.0,Tonbridge and Malling 012,Tonbridge and Malling 012A,,,,,Good,South-East England and South London,,200000962234.0,,Not applicable,Not applicable,,,E02005160,E01024732,55.0, +118286,886,Kent,2156,Sussex Road Community Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,No Special Classes,19-01-2023,418.0,209.0,209.0,13.9,Not applicable,,Not applicable,,Not under a federation,,10072995.0,,Not applicable,24-11-2021,08-05-2024,Sussex Road,,,Tonbridge,Kent,TN9 2TP,http://www.sussex-road.kent.sch.uk/,1732352367.0,Mrs,Sarah,Miles,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Tonbridge and Malling,Judd,Tonbridge and Malling,(England/Wales) Urban city and town,E10000016,558245.0,145866.0,Tonbridge and Malling 013,Tonbridge and Malling 013A,,,,,Good,South-East England and South London,,200000961981.0,,Not applicable,Not applicable,,,E02005161,E01024757,58.0, +118288,886,Kent,2161,Boughton Monchelsea Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,206.0,102.0,104.0,19.4,Not applicable,,Not applicable,,Not under a federation,,10073356.0,,Not applicable,29-09-2023,22-04-2024,Church Hill,Boughton Monchelsea,,Maidstone,Kent,ME17 4HP,http://www.boughton-monchelsea.kent.sch.uk,1622743596.0,Mrs,Mandy,Gibbs,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Maidstone,Boughton Monchelsea and Chart Sutton,Faversham and Mid Kent,(England/Wales) Urban city and town,E10000016,576889.0,150785.0,Maidstone 012,Maidstone 012A,,,,,Good,South-East England and South London,,200003674284.0,,Not applicable,Not applicable,,,E02005079,E01024331,40.0, +118289,886,Kent,2163,East Farleigh Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,208.0,104.0,104.0,13.0,Not applicable,,Not applicable,,Not under a federation,,10073355.0,,Not applicable,22-06-2022,23-04-2024,Vicarage Lane,East Farleigh,,Maidstone,Kent,ME15 0LY,www.east-farleigh.kent.sch.uk,1622726364.0,Mr,Peter,Goodman,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Coxheath and Hunton,Maidstone and The Weald,(England/Wales) Rural village,E10000016,573555.0,152821.0,Maidstone 016,Maidstone 016B,,,,,Good,South-East England and South London,,200003673168.0,,Not applicable,Not applicable,,,E02005083,E01024343,27.0, +118290,886,Kent,2164,East Peckham Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,175.0,99.0,76.0,14.3,Not applicable,,Not applicable,,Not under a federation,,10073354.0,,Not applicable,04-07-2023,14-05-2024,130 Pound Road,East Peckham,,Tonbridge,Kent,TN12 5LH,http://www.east-peckham.kent.sch.uk/,1622871268.0,Mrs,Kate,Elliott,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,"East and West Peckham, Mereworth & Wateringbury",Tonbridge and Malling,(England/Wales) Rural town and fringe,E10000016,566468.0,149067.0,Tonbridge and Malling 008,Tonbridge and Malling 008B,,,,,Requires improvement,South-East England and South London,,100062628528.0,,Not applicable,Not applicable,,,E02005156,E01024744,25.0, +118291,886,Kent,2165,Headcorn Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,No Special Classes,19-01-2023,392.0,210.0,182.0,20.2,Not applicable,,Not applicable,,Not under a federation,,10073353.0,,Not applicable,05-05-2022,02-05-2024,Kings Road,,,Headcorn,Kent,TN27 9QT,www.headcorn.kent.sch.uk,1622891289.0,Miss,Sarah,Symonds,Head Teacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Headcorn,Faversham and Mid Kent,(England/Wales) Rural town and fringe,E10000016,583351.0,144445.0,Maidstone 017,Maidstone 017B,,,,,Requires improvement,South-East England and South London,,200003698713.0,,Not applicable,Not applicable,,,E02005084,E01024365,79.0, +118292,886,Kent,2166,Hollingbourne Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,105.0,No Special Classes,19-01-2023,96.0,48.0,48.0,24.0,Not applicable,,Not applicable,,Not under a federation,,10073352.0,,Not applicable,01-03-2022,12-03-2024,Eyhorne Street,Hollingbourne,,Maidstone,Kent,ME17 1UA,www.hollingbourne.kent.sch.uk/,1622880270.0,Mrs,Helen,Bradley-Wyatt,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,North Downs,Faversham and Mid Kent,(England/Wales) Rural village,E10000016,584016.0,154881.0,Maidstone 011,Maidstone 011D,,,,,Good,South-East England and South London,,200003719238.0,,Not applicable,Not applicable,,,E02005078,E01024387,23.0, +118293,886,Kent,2167,Ightham Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,209.0,105.0,104.0,3.3,Not applicable,,Not applicable,,Not under a federation,,10073351.0,,Not applicable,04-03-2020,07-05-2024,Oldbury Lane,Ightham,,Sevenoaks,Kent,TN15 9DD,www.ightham.kent.sch.uk,1732882405.0,Mr,David,Sherhod,Head Teacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,Pilgrims with Ightham,Tonbridge and Malling,(England/Wales) Rural village,E10000016,558908.0,156539.0,Tonbridge and Malling 006,Tonbridge and Malling 006E,,,,,Outstanding,South-East England and South London,,100062551218.0,,Not applicable,Not applicable,,,E02005154,E01024755,7.0, +118294,886,Kent,2168,Lenham Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Non-selective,210.0,No Special Classes,19-01-2023,213.0,104.0,109.0,21.1,Not applicable,,Not applicable,,Not under a federation,,10075877.0,,Not applicable,06-12-2023,13-05-2024,Ham Lane,Lenham,,Maidstone,Kent,ME17 2LL,http://www.lenham.kent.sch.uk,1622858260.0,Mrs,Andrea,McCluskey,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Harrietsham and Lenham,Faversham and Mid Kent,(England/Wales) Rural town and fringe,E10000016,589472.0,152164.0,Maidstone 011,Maidstone 011B,,,,,Good,South-East England and South London,,200003719333.0,,Not applicable,Not applicable,,,E02005078,E01024362,45.0, +118295,886,Kent,2169,Platts Heath Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,91.0,No Special Classes,19-01-2023,62.0,32.0,30.0,29.0,Not applicable,,Not applicable,,Not under a federation,,10073350.0,,Not applicable,21-04-2022,21-05-2024,Headcorn Road,Platts Heath,,Maidstone,Kent,ME17 2NH,https://plattsheathkentsch.co.uk/,1622850316.0,Mr,Darren,Waters,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Harrietsham and Lenham,Faversham and Mid Kent,(England/Wales) Rural village,E10000016,587729.0,150533.0,Maidstone 011,Maidstone 011B,,,,,Good,South-East England and South London,,200003703748.0,,Not applicable,Not applicable,,,E02005078,E01024362,18.0, +118297,886,Kent,2171,Brunswick House Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,421.0,No Special Classes,19-01-2023,421.0,207.0,214.0,25.2,Not applicable,,Not applicable,,Not under a federation,,10069518.0,,Not applicable,19-07-2023,21-05-2024,Leafy Lane,,,Maidstone,Kent,ME16 0QQ,http://www.brunswick-house.kent.sch.uk,1622752102.0,Mrs,Wendy,Skinner,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Bridge,Maidstone and The Weald,(England/Wales) Urban city and town,E10000016,575123.0,156195.0,Maidstone 006,Maidstone 006B,,,,,Good,South-East England and South London,,200003659753.0,,Not applicable,Not applicable,,,E02005073,E01024340,106.0, +118301,886,Kent,2175,North Borough Junior School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,7.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,360.0,No Special Classes,19-01-2023,353.0,201.0,152.0,28.6,Not applicable,,Not applicable,,Supported by a federation,St Paul's and North Borough Schools Federation,10079035.0,,Not applicable,19-10-2023,25-04-2024,"North Borough Junior School, Peel Street",,,Maidstone,Kent,ME14 2BP,www.north-borough.kent.sch.uk/,1622754708.0,Mrs,Dawn,Wakefield,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,North,Maidstone and The Weald,(England/Wales) Urban city and town,E10000016,576137.0,156985.0,Maidstone 004,Maidstone 004C,,,,,Good,South-East England and South London,,200003704716.0,,Not applicable,Not applicable,,,E02005071,E01024382,101.0, +118302,886,Kent,2176,Park Way Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,315.0,No Special Classes,19-01-2023,316.0,153.0,163.0,26.3,Not applicable,,Not applicable,,Not under a federation,,10073349.0,,Not applicable,13-11-2018,12-09-2023,Park Way,,,Maidstone,Kent,ME15 7AH,http://www.park-way.kent.sch.uk,1622753651.0,Mrs,Karen,Dhanecha,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Shepway North,Faversham and Mid Kent,(England/Wales) Urban city and town,E10000016,576965.0,154343.0,Maidstone 010,Maidstone 010B,,,,,Good,South-East England and South London,,200003686775.0,,Not applicable,Not applicable,,,E02005077,E01024392,83.0, +118307,886,Kent,2185,Mereworth Community Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,218.0,No Special Classes,19-01-2023,203.0,117.0,86.0,16.7,Not applicable,,Not applicable,,Not under a federation,,10069517.0,,Not applicable,07-07-2022,21-05-2024,39 the Street,Mereworth,,Maidstone,Kent,ME18 5ND,www.mereworth.kent.sch.uk,1622812569.0,Miss,Amanda,Lavelle,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,"East and West Peckham, Mereworth & Wateringbury",Tonbridge and Malling,(England/Wales) Rural hamlet and isolated dwellings,E10000016,565535.0,153533.0,Tonbridge and Malling 007,Tonbridge and Malling 007A,,,,,Good,South-East England and South London,,100062386957.0,,Not applicable,Not applicable,,,E02005155,E01024746,34.0, +118308,886,Kent,2187,Offham Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,205.0,100.0,105.0,5.9,Not applicable,,Not applicable,,Not under a federation,,10073347.0,,Not applicable,20-05-2015,23-01-2024,Church Road,Offham,,West Malling,Kent,ME19 5NX,http://www.offham.kent.sch.uk,1732842355.0,Mrs,Emily,John,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,"East Malling, West Malling & Offham",Tonbridge and Malling,(England/Wales) Rural hamlet and isolated dwellings,E10000016,565935.0,157744.0,Tonbridge and Malling 014,Tonbridge and Malling 014E,,,,,Outstanding,South-East England and South London,,10002907519.0,,Not applicable,Not applicable,,,E02006833,E01032620,12.0, +118309,886,Kent,2188,Plaxtol Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,109.0,No Special Classes,19-01-2023,98.0,49.0,49.0,10.2,Not applicable,,Not applicable,,Not under a federation,,10073346.0,,Not applicable,21-03-2023,21-05-2024,School Lane,Plaxtol,,Sevenoaks,Kent,TN15 0QD,http://www.plaxtol.kent.sch.uk/,1732810200.0,Mrs,Claire,Rowley,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,Bourne,Tonbridge and Malling,(England/Wales) Rural village,E10000016,560235.0,153454.0,Tonbridge and Malling 006,Tonbridge and Malling 006A,,,,,Good,South-East England and South London,,200000959103.0,,Not applicable,Not applicable,,,E02005154,E01024723,10.0, +118310,886,Kent,2189,Ryarsh Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,210.0,107.0,103.0,8.1,Not applicable,,Not applicable,,Not under a federation,,10073345.0,,Not applicable,26-04-2012,03-06-2024,Birling Road,Ryarsh,,West Malling,Kent,ME19 5LS,www.ryarsh.kent.sch.uk/,1732870600.0,Mr,Daniel,Childs,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,"Birling, Leybourne & Ryarsh",Tonbridge and Malling,(England/Wales) Rural village,E10000016,567182.0,159943.0,Tonbridge and Malling 014,Tonbridge and Malling 014F,,,,,Outstanding,South-East England and South London,,200000959182.0,,Not applicable,Not applicable,,,E02006833,E01032829,17.0, +118311,886,Kent,2190,Shipbourne School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,59.0,No Special Classes,19-01-2023,60.0,28.0,32.0,18.3,Not applicable,,Not applicable,,Supported by a federation,The Bourne Partnership,10073344.0,,Not applicable,28-03-2019,25-04-2024,Stumble Hill,Shipbourne,,Tonbridge,Kent,TN11 9PB,http://www.shipbourne.kent.sch.uk,1732810344.0,Mrs,Terri,Daters,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,Bourne,Tonbridge and Malling,(England/Wales) Rural hamlet and isolated dwellings,E10000016,559185.0,151948.0,Tonbridge and Malling 006,Tonbridge and Malling 006A,,,,,Good,South-East England and South London,,200000966854.0,,Not applicable,Not applicable,,,E02005154,E01024723,11.0, +118313,886,Kent,2192,Staplehurst School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,525.0,No Special Classes,19-01-2023,406.0,194.0,212.0,19.5,Not applicable,,Not applicable,,Not under a federation,,10073343.0,,Not applicable,26-01-2022,17-04-2024,Gybbon Rise,Staplehurst,,Tonbridge,Kent,TN12 0LZ,www.staplehurstschool.co.uk/,1580891765.0,Miss,Lucy,Davenport,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Staplehurst,Maidstone and The Weald,(England/Wales) Rural town and fringe,E10000016,578439.0,143382.0,Maidstone 019,Maidstone 019D,,,,,Good,South-East England and South London,,200003679143.0,,Not applicable,Not applicable,,,E02005086,E01024409,79.0, +118314,886,Kent,2193,Sutton Valence Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,205.0,100.0,105.0,20.5,Not applicable,,Not applicable,,Not under a federation,,10073342.0,,Not applicable,29-03-2023,09-05-2024,North Street,Sutton Valence,,Maidstone,Kent,ME17 3HT,http://www.sutton-valence.kent.sch.uk,1622842188.0,Mrs,Rebecca,Latham-Parsons,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Sutton Valence and Langley,Faversham and Mid Kent,(England/Wales) Rural village,E10000016,581028.0,149379.0,Maidstone 017,Maidstone 017D,,,,,Good,South-East England and South London,,200003720509.0,,Not applicable,Not applicable,,,E02005084,E01024411,42.0, +118336,886,Kent,2226,Eastling Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,105.0,No Special Classes,19-01-2023,101.0,39.0,62.0,20.8,Not applicable,,Not applicable,,Not under a federation,,10073341.0,,Not applicable,20-10-2021,04-06-2024,Kettle Hill Road,Eastling,,Faversham,Kent,ME13 0BA,http://www.eastling.kent.sch.uk,1795890252.0,Mrs,Melanie,Dale,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,East Downs,Faversham and Mid Kent,(England/Wales) Rural hamlet and isolated dwellings,E10000016,596524.0,156325.0,Swale 016,Swale 016B,,,,,Good,South-East England and South London,,200002532821.0,,Not applicable,Not applicable,,,E02005130,E01024566,21.0, +118337,886,Kent,2227,Ethelbert Road Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,209.0,108.0,101.0,5.7,Not applicable,,Not applicable,,Not under a federation,,10073340.0,,Not applicable,01-10-2014,29-05-2024,Ethelbert Road,,,Faversham,Kent,ME13 8SQ,www.ethelbert-road.kent.sch.uk,1795533124.0,Mrs,Michele,Kirkbride,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Watling,Faversham and Mid Kent,(England/Wales) Urban city and town,E10000016,601072.0,160785.0,Swale 014,Swale 014E,,,,,Outstanding,South-East England and South London,,10035063205.0,,Not applicable,Not applicable,,,E02005128,E01024626,12.0, +118338,886,Kent,2228,Davington Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,No Special Classes,19-01-2023,417.0,208.0,209.0,21.8,Not applicable,,Not applicable,,Not under a federation,,10069515.0,,Not applicable,22-06-2023,18-03-2024,Priory Row,Davington,,Faversham,Kent,ME13 7EQ,www.davington.kent.sch.uk/,1795532401.0,Mr,Chilton,Saint,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Priory,Faversham and Mid Kent,(England/Wales) Urban city and town,E10000016,601089.0,161986.0,Swale 015,Swale 015D,,,,,Good,South-East England and South London,,100062379818.0,,Not applicable,Not applicable,,,E02005129,E01024563,91.0, +118341,886,Kent,2231,Lower Halstow Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,188.0,94.0,94.0,13.3,Not applicable,,Not applicable,,Supported by a federation,The Federation of Lower Halstow Primary and Newington CofE Primary School,10073339.0,,Not applicable,14-03-2019,04-06-2024,School Lane,Lower Halstow,,Sittingbourne,Kent,ME9 7ES,www.lower-halstow.kent.sch.uk,1795842344.0,Mrs,Tara,Deevoy,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,"Bobbing, Iwade and Lower Halstow",Sittingbourne and Sheppey,(England/Wales) Rural village,E10000016,585951.0,166826.0,Swale 008,Swale 008E,,,,,Good,South-East England and South London,,200002532824.0,,Not applicable,Not applicable,,,E02005122,E01024575,25.0, +118346,886,Kent,2239,Rodmersham School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,70.0,No Special Classes,19-01-2023,117.0,59.0,58.0,3.4,Not applicable,,Not applicable,,Not under a federation,,10073338.0,,Not applicable,22-09-2011,24-04-2024,Rodmersham Green,,,Sittingbourne,Kent,ME9 0PS,www.rodmersham.kent.sch.uk/,1795423776.0,Mrs,Nicola,McMullon,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,West Downs,Sittingbourne and Sheppey,(England/Wales) Rural village,E10000016,591601.0,161273.0,Swale 013,Swale 013C,,,,,Outstanding,South-East England and South London,,100062397234.0,,Not applicable,Not applicable,,,E02005127,E01024628,4.0, +118348,886,Kent,2245,Rose Street Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,No Special Classes,19-01-2023,438.0,225.0,213.0,59.6,Not applicable,,Not applicable,,Supported by a federation,Sheerness West Federation,10076228.0,,Not applicable,30-11-2022,14-05-2024,Rose Street,,,Sheerness,Kent,ME12 1AW,www.swfed.co.uk,1795663012.0,Mrs,Samantha,Mackay,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Sheerness,Sittingbourne and Sheppey,(England/Wales) Urban city and town,E10000016,591895.0,174664.0,Swale 002,Swale 002A,,,,,Requires improvement,South-East England and South London,,100062377402.0,,Not applicable,Not applicable,,,E02005116,E01024613,249.0, +118354,886,Kent,2254,Canterbury Road Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,208.0,103.0,105.0,32.7,Not applicable,,Not applicable,,Not under a federation,,10073337.0,,Not applicable,06-03-2024,22-05-2024,School Road,,,Sittingbourne,Kent,ME10 4SE,http://www.canterbury-road.kent.sch.uk,1795423818.0,Mr,Timothy,Pye,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Roman,Sittingbourne and Sheppey,(England/Wales) Urban city and town,E10000016,591591.0,163352.0,Swale 010,Swale 010D,,,,,Good,South-East England and South London,,200002531732.0,,Not applicable,Not applicable,,,E02005124,E01024599,68.0, +118356,886,Kent,2258,Blean Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,469.0,Not applicable,19-01-2023,431.0,215.0,216.0,6.7,Not applicable,,Not applicable,,Not under a federation,,10073336.0,,Not applicable,09-03-2022,07-05-2024,Whitstable Road,Blean,,Canterbury,Kent,CT2 9ED,www.bleanprimary.org.uk/,1227471254.0,Mr,Ian,Rowden,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Canterbury,Blean Forest,Canterbury,(England/Wales) Urban city and town,E10000016,612837.0,159932.0,Canterbury 012,Canterbury 012H,,,,,Outstanding,South-East England and South London,,200000683406.0,,Not applicable,Not applicable,,,E02005021,E01035309,29.0, +118359,886,Kent,2263,Herne Bay Infant School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,2.0,7,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,360.0,No Special Classes,19-01-2023,304.0,154.0,150.0,35.7,Not applicable,,Not applicable,,Not under a federation,,10074072.0,,Not applicable,04-12-2019,17-01-2024,Stanley Road,,,Herne Bay,Kent,CT6 5SH,www.herne-bay.kent.sch.uk/,1227372245.0,Ms,Nicky,Brown,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Canterbury,Heron,North Thanet,(England/Wales) Urban city and town,E10000016,617893.0,167868.0,Canterbury 003,Canterbury 003D,,,,,Good,South-East England and South London,,200000682558.0,,Not applicable,Not applicable,,,E02005012,E01024083,99.0, +118361,886,Kent,2265,Hoath Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,105.0,No Special Classes,19-01-2023,103.0,45.0,58.0,16.5,Not applicable,,Not applicable,,Supported by a federation,The Federation of Chislet CE and Hoath Primary Schools,10073335.0,,Not applicable,18-01-2022,12-01-2024,School Lane,Hoath,,Canterbury,Kent,CT3 4LA,www.chislethoathfederation.co.uk,1227860249.0,Mr,Tim,Whitehouse,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Canterbury,Reculver,North Thanet,(England/Wales) Rural hamlet and isolated dwellings,E10000016,620491.0,164365.0,Canterbury 010,Canterbury 010C,,,,,Good,South-East England and South London,,10033152360.0,,Not applicable,Not applicable,,,E02005019,E01024086,17.0, +118363,886,Kent,2268,Westmeads Community Infant School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,7,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,180.0,No Special Classes,19-01-2023,156.0,84.0,72.0,23.1,Not applicable,,Not applicable,,Not under a federation,,10074071.0,,Not applicable,18-05-2022,03-06-2024,Cromwell Road,,,Whitstable,Kent,CT5 1NA,www.westmeads.kent.sch.uk/,1227272995.0,Ms,Kirsty,White,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Canterbury,Gorrell,Canterbury,(England/Wales) Urban city and town,E10000016,611013.0,166711.0,Canterbury 008,Canterbury 008D,,,,,Requires improvement,South-East England and South London,,100062300538.0,,Not applicable,Not applicable,,,E02005017,E01024072,36.0, +118364,886,Kent,2269,Whitstable Junior School,Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,7.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,255.0,No Special Classes,19-01-2023,232.0,126.0,106.0,28.9,Supported by a trust,The Coastal Alliance Co-operative Trust,Not applicable,,Not under a federation,,10077448.0,,Not applicable,18-06-2019,02-04-2024,Oxford Street,,,Whitstable,Kent,CT5 1DB,www.whitstable-junior.kent.sch.uk/,1227272385.0,Ms,Sarah,Kent,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Canterbury,Gorrell,Canterbury,(England/Wales) Urban city and town,E10000016,610711.0,166216.0,Canterbury 008,Canterbury 008C,,,,,Good,South-East England and South London,,100062300650.0,,Not applicable,Not applicable,,,E02005017,E01024070,67.0, +118365,886,Kent,2270,Aldington Primary School,Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,191.0,112.0,79.0,11.0,Supported by a trust,CARE Foundation Trust,Not applicable,,Not under a federation,,10073112.0,,Not applicable,07-02-2024,22-05-2024,Roman Road,Aldington,,Ashford,Kent,TN25 7EE,http://www.aldington.kent.sch.uk/,1233720247.0,Mr,Ben,Dawson.,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Ashford,Saxon Shore,Folkestone and Hythe,(England/Wales) Rural village,E10000016,606435.0,136475.0,Ashford 010,Ashford 010A,,,,,Good,South-East England and South London,,100062562493.0,,Not applicable,Not applicable,,,E02005005,E01024013,21.0, +118369,886,Kent,2275,Victoria Road Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,206.0,No Special Classes,19-01-2023,211.0,113.0,98.0,25.6,Not applicable,,Not applicable,,Not under a federation,,10069513.0,,Not applicable,15-01-2019,25-04-2024,Victoria Road,,,Ashford,Kent,TN23 7HQ,http://www.victoriaroad.co.uk/,1233620044.0,Mrs,Kelly,Collens,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Ashford,Victoria,Ashford,(England/Wales) Urban city and town,E10000016,600804.0,142343.0,Ashford 005,Ashford 005F,,,,,Good,South-East England and South London,,100062048541.0,,Not applicable,Not applicable,,,E02005000,E01034985,54.0, +118370,886,Kent,2276,Willesborough Infant School,Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,7,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,390.0,No Special Classes,19-01-2023,357.0,177.0,180.0,15.7,Not supported by a trust,,Not applicable,,Supported by a federation,The Willesborough Schools,10080431.0,,Not applicable,15-09-2022,08-05-2024,Church Road,Willesborough,,Ashford,Kent,TN24 0JZ,www.willesborough-infant.kent.sch.uk/,1233624165.0,Mr,Tom,Head,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,PD - Physical Disability,,,,,,,,,,,,,Resourced provision,,,,,South East,Ashford,Highfield,Ashford,(England/Wales) Urban city and town,E10000016,603174.0,141786.0,Ashford 006,Ashford 006B,,,,,Good,South-East England and South London,,100062560396.0,,Not applicable,Not applicable,,,E02005001,E01023995,56.0, +118371,886,Kent,5226,Willesborough Junior School,Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,7.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,None,Does not apply,Not applicable,Not applicable,510.0,No Special Classes,19-01-2023,511.0,249.0,262.0,18.8,Not supported by a trust,,Not applicable,,Supported by a federation,The Willesborough Schools,10069649.0,,Not applicable,22-03-2023,12-09-2023,Highfield Road,Willesborough,,Ashford,Kent,TN24 0JU,www.willesborough-js.kent.sch.uk/,1233620405.0,Mr,Tom,Head,Interim Executive Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Ashford,Highfield,Ashford,(England/Wales) Urban city and town,E10000016,603107.0,141715.0,Ashford 006,Ashford 006B,,,,,Good,South-East England and South London,,200002904249.0,,Not applicable,Not applicable,,,E02005001,E01023995,96.0, +118372,886,Kent,2278,Bethersden Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,140.0,No Special Classes,19-01-2023,131.0,70.0,61.0,25.4,Not applicable,,Not applicable,,Not under a federation,,10073334.0,,Not applicable,08-06-2023,21-05-2024,School Road,Bethersden,,Ashford,Kent,TN26 3AH,www.bethersden.kent.sch.uk/,1233820479.0,Ms,Rebecca,Heaton,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Ashford,Weald Central,Ashford,(England/Wales) Rural village,E10000016,592556.0,140108.0,Ashford 012,Ashford 012B,,,,,Good,South-East England and South London,,100062563194.0,,Not applicable,Not applicable,,,E02005007,E01024031,33.0, +118373,886,Kent,2279,Brook Community Primary School,Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,105.0,No Special Classes,19-01-2023,71.0,40.0,31.0,12.7,Supported by a trust,CARE Foundation Trust,Not applicable,,Not under a federation,,10073111.0,,Not applicable,11-05-2023,22-04-2024,Spelders Hill,Brook,,Ashford,Kent,TN25 5PB,www.brook-ashford.kent.sch.uk,1233812614.0,Mrs,Ellen,Ranson-McCabe,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Ashford,Bircholt,Folkestone and Hythe,(England/Wales) Rural village,E10000016,606030.0,143546.0,Ashford 010,Ashford 010C,,,,,Good,South-East England and South London,,100062561999.0,,Not applicable,Not applicable,,,E02005005,E01024015,9.0, +118374,886,Kent,2280,Challock Primary School,Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,210.0,100.0,110.0,7.6,Supported by a trust,CARE Foundation Trust,Not applicable,,Not under a federation,,10073110.0,,Not applicable,12-07-2023,13-05-2024,Church Lane,Challock,,Ashford,Kent,TN25 4BU,www.challockprimaryschool.co.uk,1233740286.0,Mrs,Susan,Sweet,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Ashford,Downs West,Ashford,(England/Wales) Rural village,E10000016,600941.0,150288.0,Ashford 002,Ashford 002C,,,,,Outstanding,South-East England and South London,,100062561620.0,,Not applicable,Not applicable,,,E02004997,E01023989,16.0, +118375,886,Kent,2282,Great Chart Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,No Special Classes,19-01-2023,420.0,219.0,201.0,17.6,Not applicable,,Not applicable,,Not under a federation,,10073333.0,,Not applicable,07-06-2023,03-06-2024,Hoxton Close,Singleton,,Ashford,Kent,TN23 5LB,www.great-chart.kent.sch.uk/,1233620040.0,Mrs,Wendy,Pang,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Ashford,Singleton East,Ashford,(England/Wales) Urban city and town,E10000016,598848.0,141528.0,Ashford 007,Ashford 007E,,,,,Outstanding,South-East England and South London,,100062617920.0,,Not applicable,Not applicable,,,E02005002,E01024017,74.0, +118377,886,Kent,2285,Mersham Primary School,Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,181.0,93.0,88.0,14.4,Supported by a trust,CARE Foundation Trust,Not applicable,,Not under a federation,,10073109.0,,Not applicable,23-02-2022,12-04-2024,Church Road,Mersham,,Ashford,Kent,TN25 6NU,www.mersham.kent.sch.uk/,1233720449.0,Mrs,Cheryl,Chalkley,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Ashford,"Mersham, Sevington South with Finberry",Ashford,(England/Wales) Rural village,E10000016,605060.0,139253.0,Ashford 010,Ashford 010F,,,,,Good,South-East England and South London,,100062562340.0,,Not applicable,Not applicable,,,E02005005,E01034988,26.0, +118381,886,Kent,2289,Smeeth Community Primary School,Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,140.0,No Special Classes,19-01-2023,122.0,66.0,56.0,13.1,Supported by a trust,CARE Foundation Trust,Not applicable,,Not under a federation,,10073108.0,,Not applicable,04-07-2023,03-11-2023,Caroland Close,Smeeth,,Ashford,Kent,TN25 6RX,www.smeeth.kent.sch.uk,1303813128.0,Ms,Jennifer,Payne,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Ashford,Bircholt,Folkestone and Hythe,(England/Wales) Rural hamlet and isolated dwellings,E10000016,607714.0,140096.0,Ashford 010,Ashford 010A,,,,,Good,South-East England and South London,,100062562341.0,,Not applicable,Not applicable,,,E02005005,E01024013,16.0, +118385,886,Kent,2298,Hawkinge Primary School,Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,No Special Classes,19-01-2023,396.0,189.0,207.0,17.9,Not supported by a trust,,Not applicable,,Not under a federation,,10073107.0,,Not applicable,12-06-2019,03-05-2024,Canterbury Road,Hawkinge,,Folkestone,Kent,CT18 7BN,www.hawkingeprimaryschool.co.uk/,1303892224.0,Miss,Aly,Ward,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Folkestone and Hythe,North Downs East,Folkestone and Hythe,(England/Wales) Rural town and fringe,E10000016,621648.0,139892.0,Folkestone and Hythe 002,Folkestone and Hythe 002B,,,,,Outstanding,South-East England and South London,,50034845.0,,Not applicable,Not applicable,,,E02005103,E01024541,71.0, +118387,886,Kent,2300,Sellindge Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,142.0,61.0,81.0,13.4,Not applicable,,Not applicable,,Not under a federation,,10073331.0,,Not applicable,03-02-2023,22-03-2024,Main Road,Sellindge,,Ashford,Kent,TN25 6JY,www.sellindge-ashford.co.uk/,1303812073.0,Miss,Joanne,Wren,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Folkestone and Hythe,North Downs West,Folkestone and Hythe,(England/Wales) Rural village,E10000016,610305.0,138188.0,Folkestone and Hythe 009,Folkestone and Hythe 009D,,,,,Good,South-East England and South London,,50010667.0,,Not applicable,Not applicable,,,E02005110,E01024546,19.0, +118393,886,Kent,2312,River Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,427.0,Not applicable,19-01-2023,413.0,210.0,203.0,18.4,Not applicable,,Not applicable,,Supported by a federation,Lydden and River Primary Schools Federation,10072994.0,,Not applicable,29-11-2013,24-01-2024,Lewisham Road,River,,Dover,Kent,CT17 0PP,www.river.kent.sch.uk/,1304822516.0,Mr,Neil,Brinicombe,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,"SLCN - Speech, language and Communication",,,,,,,,,,,,,Resourced provision,12.0,12.0,,,South East,Dover,Dover Downs & River,Dover,(England/Wales) Urban city and town,E10000016,629160.0,143403.0,Dover 010,Dover 010C,,,,,Outstanding,South-East England and South London,,100062290036.0,,Not applicable,Not applicable,,,E02005050,E01024233,76.0, +118398,886,Kent,2318,Langdon Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,105.0,No Special Classes,19-01-2023,86.0,51.0,35.0,22.1,Not applicable,,Not applicable,,Not under a federation,,10073330.0,,Not applicable,28-01-2020,07-05-2024,East Langdon,,The Street,Dover,Kent,CT15 5JQ,www.langdonprimaryschool.co.uk,1304852600.0,Mrs,Lynn,Paylor Sutton,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,"Guston, Kingsdown & St Margaret's-at-Cliffe",Dover,(England/Wales) Rural village,E10000016,633397.0,146333.0,Dover 012,Dover 012B,,,,,Good,South-East England and South London,,100062287609.0,,Not applicable,Not applicable,,,E02005052,E01024238,19.0, +118399,886,Kent,2320,Eythorne Elvington Community Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,140.0,No Special Classes,19-01-2023,107.0,47.0,60.0,52.3,Not applicable,,Not applicable,,Supported by a federation,The Federation of Shepherdswell Church of England and Eythorne Elvington,10069511.0,,Not applicable,14-12-2022,17-05-2024,Adelaide Road,Eythorne,,Dover,Kent,CT15 4AN,www.eythorne-elvington.kent.sch.uk,1304830376.0,Mr,N,Garvey,Head of School,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,"Aylesham, Eythorne & Shepherdswell",Dover,(England/Wales) Rural town and fringe,E10000016,628011.0,149789.0,Dover 006,Dover 006D,,,,,Outstanding,South-East England and South London,,10034882456.0,,Not applicable,Not applicable,,,E02005046,E01024204,56.0, +118400,886,Kent,2321,Lydden Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,84.0,No Special Classes,19-01-2023,78.0,37.0,41.0,11.7,Not applicable,,Not applicable,,Supported by a federation,Lydden and River Primary Schools Federation,10073329.0,,Not applicable,05-02-2019,26-03-2024,Stonehall,Lydden,,Dover,Kent,CT15 7LA,http://www.lydden.kent.sch.uk,1304822887.0,Mr,Neil,Brinicombe,Executive Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,Dover Downs & River,Dover,(England/Wales) Rural village,E10000016,626743.0,145568.0,Dover 010,Dover 010G,,,,,Good,South-East England and South London,,100062288383.0,,Not applicable,Not applicable,,,E02005050,E01033210,9.0, +118401,886,Kent,2322,Preston Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,133.0,No Special Classes,19-01-2023,117.0,58.0,59.0,7.7,Not applicable,,Not applicable,,Supported by a federation,The Federation of Preston and Wingham,10073328.0,,Not applicable,01-02-2024,20-05-2024,Mill Lane,Preston,,Canterbury,Kent,CT3 1HB,www.prestonprimary.org.uk,1227722235.0,Mrs,Helen,Clements,Executive Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,Little Stour & Ashstone,South Thanet,(England/Wales) Rural village,E10000016,625140.0,160901.0,Dover 001,Dover 001A,,,,,Good,South-East England and South London,,100062298104.0,,Not applicable,Not applicable,,,E02005041,E01024206,9.0, +118403,886,Kent,2326,Wingham Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,191.0,97.0,94.0,15.7,Not applicable,,Not applicable,,Supported by a federation,The Federation of Preston and Wingham,10073327.0,,Not applicable,17-11-2021,18-04-2024,School Lane,Wingham,,Canterbury,Kent,CT3 1BD,www.winghamprimary.org.uk/,1227720277.0,Mrs,Helen,Clements,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,Little Stour & Ashstone,South Thanet,(England/Wales) Rural town and fringe,E10000016,624160.0,157221.0,Dover 001,Dover 001D,,,,,Good,South-East England and South London,,100062298256.0,,Not applicable,Not applicable,,,E02005041,E01024209,30.0, +118405,886,Kent,2328,St Mildred's Primary Infant School,Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,7,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,270.0,No Special Classes,19-01-2023,269.0,135.0,134.0,21.9,Supported by a trust,Thanet Endeavour Learning Trust,Not applicable,,Supported by a federation,The Federation of Bromstone Primary School and St.Mildred's Primary Infant School,10074070.0,,Not applicable,24-11-2021,30-04-2024,St Mildred's Avenue,,,Broadstairs,Kent,CT10 2BX,http://www.st-mildreds.kent.sch.uk,1843862035.0,Headteacher,James,Williams,Executive Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Thanet,Viking,South Thanet,(England/Wales) Urban city and town,E10000016,639125.0,167790.0,Thanet 010,Thanet 010C,,,,,Outstanding,South-East England and South London,,200002882176.0,,Not applicable,Not applicable,,,E02005141,E01024706,59.0, +118406,886,Kent,2329,Callis Grange Nursery and Infant School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,3.0,7,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,296.0,No Special Classes,19-01-2023,288.0,159.0,129.0,21.2,Not applicable,,Not applicable,,Not under a federation,,10074069.0,,Not applicable,21-04-2022,15-05-2024,Beacon Road,,,Broadstairs,Kent,CT10 3DG,http://www.callis-grange.kent.sch.uk,1843862531.0,Mrs,Vikki,Bowman,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Thanet,Beacon Road,South Thanet,(England/Wales) Urban city and town,E10000016,638675.0,169146.0,Thanet 006,Thanet 006A,,,,,Good,South-East England and South London,,100062281748.0,,Not applicable,Not applicable,,,E02005137,E01024633,61.0, +118411,886,Kent,2337,St Crispin's Community Primary Infant School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,7,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,270.0,No Special Classes,19-01-2023,254.0,128.0,126.0,28.3,Not applicable,,Not applicable,,Not under a federation,,10074068.0,,Not applicable,11-09-2019,22-04-2024,St Crispin's Road,,,Westgate-on-Sea,Kent,CT8 8EB,http://www.st-crispinsinfants.org.uk,1843832040.0,Mrs,Louise,Davidson,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Thanet,Westgate-on-Sea,North Thanet,(England/Wales) Urban city and town,E10000016,632291.0,169367.0,Thanet 007,Thanet 007E,,,,,Good,South-East England and South London,,200001851326.0,,Not applicable,Not applicable,,,E02005138,E01024716,72.0, +118414,886,Kent,2340,Ellington Infant School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,7,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,180.0,No Special Classes,19-01-2023,134.0,71.0,63.0,47.8,Not applicable,,Not applicable,,Not under a federation,,10074067.0,,Not applicable,19-07-2022,23-04-2024,High Street,St Lawrence,,Ramsgate,Kent,CT11 0QH,www.ellington-infant.kent.sch.uk,1843591638.0,Mr,Adnan,Ahmet,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Thanet,Central Harbour,South Thanet,(England/Wales) Urban city and town,E10000016,637175.0,165319.0,Thanet 015,Thanet 015A,,,,,Good,South-East England and South London,,200003079680.0,,Not applicable,Not applicable,,,E02005146,E01024645,64.0, +118416,886,Kent,2345,Priory Infant School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,7,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,180.0,No Special Classes,19-01-2023,155.0,76.0,79.0,38.1,Not applicable,,Not applicable,,Not under a federation,,10074066.0,,Not applicable,21-06-2023,05-06-2024,Cannon Road,,,Ramsgate,Kent,CT11 9XT,www.priory.kent.sch.uk,1843593105.0,Ms,Tracey,Sandy,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Thanet,Central Harbour,South Thanet,(England/Wales) Urban city and town,E10000016,637770.0,165232.0,Thanet 016,Thanet 016A,,,,,Good,South-East England and South London,,100062283791.0,,Not applicable,Not applicable,,,E02005147,E01024646,59.0, +118436,886,Kent,2431,Shears Green Junior School,Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,7.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,480.0,No Special Classes,19-01-2023,483.0,232.0,251.0,28.0,Supported by a trust,Northfleet Schools Co-Operative Trust,Not applicable,,Not under a federation,,10073106.0,,Not applicable,19-01-2023,03-05-2024,White Avenue,Northfleet,,Gravesend,Kent,DA11 7JB,www.shearsgreenjuniorschool.co.uk,1474567359.0,Mr,Matthew,Paterson,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Gravesham,Coldharbour & Perry Street,Gravesham,(England/Wales) Urban major conurbation,E10000016,563816.0,172261.0,Gravesham 009,Gravesham 009A,,,,,Good,South-East England and South London,,100062310707.0,,Not applicable,Not applicable,,,E02005063,E01024264,135.0, +118438,886,Kent,2434,West Minster Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,570.0,Has Special Classes,19-01-2023,508.0,253.0,255.0,56.6,Not applicable,,Not applicable,,Supported by a federation,Sheerness West Federation,10076225.0,,Not applicable,01-12-2021,14-05-2024,St George's Avenue,,,Sheerness,Kent,ME12 1ET,www.swfed.co.uk,1795662178.0,Ms,Hazel,Brewer,Head of School,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Sheerness,Sittingbourne and Sheppey,(England/Wales) Urban city and town,E10000016,591524.0,173868.0,Swale 002,Swale 002C,,,,,Good,South-East England and South London,,100062626557.0,,Not applicable,Not applicable,,,E02005116,E01024615,269.0, +118449,886,Kent,2454,Aycliffe Community Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,135.0,No Special Classes,19-01-2023,93.0,54.0,39.0,61.3,Not applicable,,Not applicable,,Not under a federation,,10073325.0,,Not applicable,01-12-2022,19-04-2024,St David's Avenue,,,Dover,Kent,CT17 9HJ,www.aycliffecpschool.co.uk,1304202651.0,Mrs,Jacky,Cox,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,Town & Castle,Dover,(England/Wales) Urban city and town,E10000016,630152.0,139911.0,Dover 013,Dover 013E,,,,,Good,South-East England and South London,,200001851339.0,,Not applicable,Not applicable,,,E02005053,E01024249,57.0, +118453,886,Kent,2459,Riverhead Infants' School,Community school,Local authority maintained schools,Open,Not applicable,26-02-1997,Not applicable,,Primary,5.0,7,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,270.0,No Special Classes,19-01-2023,268.0,140.0,128.0,4.5,Not applicable,,Not applicable,,Not under a federation,,10080749.0,,Not applicable,22-03-2023,24-01-2024,Worships Hill,,,Riverhead,Kent,TN13 2AS,http://www.riverhead.kent.sch.uk,1732452475.0,Mr,Andrew,King,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Dunton Green and Riverhead,Sevenoaks,(England/Wales) Urban city and town,E10000016,551308.0,156016.0,Sevenoaks 011,Sevenoaks 011C,,,,,Good,South-East England and South London,,50002018912.0,,Not applicable,Not applicable,,,E02005097,E01024424,12.0, +118456,886,Kent,2465,Claremont Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,436.0,No Special Classes,19-01-2023,438.0,239.0,199.0,2.7,Not applicable,,Not applicable,,Not under a federation,,10069510.0,,Not applicable,12-01-2023,24-05-2024,Banner Farm Road,,,Tunbridge Wells,Kent,TN2 5EB,www.claremont.kent.sch.uk,1892531395.0,Mrs,Candi,Roberts,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Pantiles and St Mark's,Tunbridge Wells,(England/Wales) Urban city and town,E10000016,558955.0,138862.0,Tunbridge Wells 012,Tunbridge Wells 012E,,,,,Good,South-East England and South London,,100062554871.0,,Not applicable,Not applicable,,,E02005173,E01024820,12.0, +118459,886,Kent,2471,Whitfield Aspen School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,591.0,Has Special Classes,19-01-2023,585.0,329.0,256.0,36.1,Not applicable,,Not applicable,,Not under a federation,,10072993.0,,Not applicable,12-09-2019,02-05-2024,Mayfield Road,Whitfield,,Dover,Kent,CT16 3LJ,www.whitfieldaspenschool.co.uk/,1304821526.0,Mr,Jason,Cook,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,PMLD - Profound and Multiple Learning Difficulty,,,,,,,,,,,,,Resourced provision,168.0,168.0,,,South East,Dover,Whitfield,Dover,(England/Wales) Urban city and town,E10000016,630324.0,145151.0,Dover 010,Dover 010F,,,,,Good,South-East England and South London,,100062289581.0,,Not applicable,Not applicable,,,E02005050,E01024256,211.0, +118461,886,Kent,2474,St Paul's Infant School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,7,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,270.0,No Special Classes,19-01-2023,261.0,120.0,141.0,30.3,Not applicable,,Not applicable,,Supported by a federation,St Paul's and North Borough Schools Federation,10074064.0,,Not applicable,15-01-2020,24-04-2024,Hillary Road,,,Maidstone,Kent,ME14 2BS,www.stpaulsmaidstone.co.uk,1622753322.0,Mrs,Sarah,Aldridge,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,North,Maidstone and The Weald,(England/Wales) Urban city and town,E10000016,576222.0,157046.0,Maidstone 004,Maidstone 004D,,,,,Good,South-East England and South London,,200003707812.0,,Not applicable,Not applicable,,,E02005071,E01024383,79.0, +118465,886,Kent,2482,Langton Green Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,Not applicable,19-01-2023,414.0,209.0,205.0,5.1,Not applicable,,Not applicable,,Not under a federation,,10073324.0,,Not applicable,20-06-2012,21-05-2024,Lampington Row,Langton Green,,Tunbridge Wells,Kent,TN3 0JG,www.langton-green-school.org,1892862648.0,Mr,Alex,Cornelius,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Speldhurst and Bidborough,Tunbridge Wells,(England/Wales) Urban city and town,E10000016,554343.0,139529.0,Tunbridge Wells 006,Tunbridge Wells 006D,,,,,Outstanding,South-East England and South London,,100062566427.0,,Not applicable,Not applicable,,,E02005167,E01024853,21.0, +118468,886,Kent,2490,Bishops Down Primary and Nursery School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,233.0,121.0,112.0,11.7,Not applicable,,Not applicable,,Not under a federation,,10077232.0,,Not applicable,02-11-2023,16-04-2024,Rydal Drive,,,Tunbridge Wells,Kent,TN4 9SU,www.bishopsdownprimary.org/,1892520114.0,Mrs,Laura,Johnson,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,PD - Physical Disability,,,,,,,,,,,,,Resourced provision,7.0,8.0,,,South East,Tunbridge Wells,Culverden,Tunbridge Wells,(England/Wales) Urban city and town,E10000016,556995.0,140187.0,Tunbridge Wells 007,Tunbridge Wells 007B,,,,,Requires improvement,South-East England and South London,,100062586163.0,,Not applicable,Not applicable,,,E02005168,E01024800,25.0, +118479,886,Kent,2509,Singlewell Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,390.0,No Special Classes,19-01-2023,392.0,178.0,214.0,18.4,Not applicable,,Not applicable,,Not under a federation,,10069509.0,,Not applicable,25-01-2023,03-05-2024,Mackenzie Way,,,Gravesend,Kent,DA12 5TY,www.singlewell.kent.sch.uk,1474569859.0,Mrs,Michelle,Brown,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Gravesham,Singlewell,Gravesham,(England/Wales) Urban major conurbation,E10000016,565793.0,170786.0,Gravesham 011,Gravesham 011B,,,,,Good,South-East England and South London,,100062312820.0,,Not applicable,Not applicable,,,E02005065,E01024304,72.0, +118480,886,Kent,2510,Cheriton Primary School,Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,No Special Classes,19-01-2023,389.0,203.0,186.0,24.9,Not supported by a trust,,Not applicable,,Not under a federation,,10073105.0,,Not applicable,30-10-2019,24-04-2024,Church Road,,,Folkestone,Kent,CT20 3EP,http://www.cheritonprimary.org.uk/,1303276112.0,Ms,Sophia,Dover,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Folkestone and Hythe,Cheriton,Folkestone and Hythe,(England/Wales) Urban city and town,E10000016,619394.0,136651.0,Folkestone and Hythe 005,Folkestone and Hythe 005C,,,,,Good,South-East England and South London,,50025272.0,,Not applicable,Not applicable,,,E02005106,E01024494,97.0, +118484,886,Kent,2514,Brookfield Infant School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,7,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,180.0,No Special Classes,19-01-2023,180.0,85.0,95.0,18.9,Not applicable,,Not applicable,,Supported by a federation,Flourish,10074062.0,,Not applicable,20-04-2023,23-04-2024,Swallow Road,Larkfield,,Aylesford,Kent,ME20 6PY,https://flourish-federation.secure-primarysite.net/,1732840955.0,Miss,C,Smith,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,Larkfield,Chatham and Aylesford,(England/Wales) Urban city and town,E10000016,570115.0,158700.0,Tonbridge and Malling 003,Tonbridge and Malling 003F,,,,,Good,South-East England and South London,,10002912773.0,,Not applicable,Not applicable,,,E02005151,E01024765,34.0, +118487,886,Kent,2519,Vigo Village School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,142.0,78.0,64.0,15.5,Not applicable,,Not applicable,,Not under a federation,,10073323.0,,Not applicable,06-11-2019,16-05-2024,Erskine Road,Vigo Village,Meopham,Gravesend,Kent,DA13 0RL,http://www.vigo.kent.sch.uk,1732823144.0,Mr,Roger,Barber,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Gravesham,Meopham South & Vigo,Gravesham,(England/Wales) Rural town and fringe,E10000016,564387.0,161691.0,Gravesham 013,Gravesham 013C,,,,,Good,South-East England and South London,,100062312944.0,,Not applicable,Not applicable,,,E02005067,E01024275,22.0, +118488,886,Kent,2520,Madginford Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,654.0,No Special Classes,19-01-2023,642.0,353.0,289.0,10.1,Not applicable,,Not applicable,,Not under a federation,,10073322.0,,Not applicable,20-04-2023,12-09-2023,Egremont Road,Bearsted,,Maidstone,Kent,ME15 8LH,www.madginfordprimaryschool.co.uk,1622734539.0,Mrs,Amanda,Woolcombe,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Bearsted,Faversham and Mid Kent,(England/Wales) Urban city and town,E10000016,579076.0,154708.0,Maidstone 007,Maidstone 007B,,,,,Good,South-East England and South London,,200003691655.0,,Not applicable,Not applicable,,,E02005074,E01024327,65.0, +118490,886,Kent,2524,Palmarsh Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,140.0,No Special Classes,19-01-2023,191.0,82.0,109.0,30.9,Not applicable,,Not applicable,,Not under a federation,,10073321.0,,Not applicable,02-10-2019,04-06-2024,St George's Place,,,Hythe,Kent,CT21 6NE,http://www.palmarsh.kent.sch.uk,1303260212.0,Mr,Jamie,Leach,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Folkestone and Hythe,Hythe Rural,Folkestone and Hythe,(England/Wales) Urban city and town,E10000016,613796.0,133711.0,Folkestone and Hythe 010,Folkestone and Hythe 010D,,,,,Good,South-East England and South London,,50013151.0,,Not applicable,Not applicable,,,E02005111,E01024529,59.0, +118491,886,Kent,2525,Painters Ash Primary School,Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,No Special Classes,19-01-2023,406.0,203.0,203.0,22.4,Supported by a trust,Northfleet Schools Co-Operative Trust,Not applicable,,Not under a federation,,10073104.0,,Not applicable,01-03-2023,23-05-2024,Masefield Road,Northfleet,,Gravesend,Kent,DA11 8EL,www.paintersashprimary.co.uk,1474568991.0,,Georgina,Salter,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Gravesham,Painters Ash,Gravesham,(England/Wales) Urban major conurbation,E10000016,562691.0,172101.0,Gravesham 006,Gravesham 006E,,,,,Good,South-East England and South London,,100062310909.0,,Not applicable,Not applicable,,,E02005060,E01024288,91.0, +118493,886,Kent,2530,Tunbury Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,630.0,No Special Classes,19-01-2023,587.0,292.0,295.0,7.8,Not applicable,,Not applicable,,Not under a federation,,10073320.0,,Not applicable,08-06-2023,14-05-2024,Tunbury Avenue,Walderslade,,Chatham,Kent,ME5 9HY,www.tunbury.kent.sch.uk,1634863085.0,Mrs,Ruth,Austin,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,Walderslade,Chatham and Aylesford,(England/Wales) Urban city and town,E10000016,575737.0,162426.0,Tonbridge and Malling 001,Tonbridge and Malling 001D,,,,,Good,South-East England and South London,,100062393390.0,,Not applicable,Not applicable,,,E02005149,E01024722,46.0, +118495,886,Kent,2532,St Margaret's-at-Cliffe Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,189.0,96.0,93.0,9.0,Not applicable,,Not applicable,,Not under a federation,,10069508.0,,Not applicable,03-07-2015,03-06-2024,Sea Street,St Margaret's-At-Cliffe,,Dover,Kent,CT15 6SS,http://www.stmargaretsprimary.co.uk,1304852639.0,Ms,Helen,Comfort,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,"Guston, Kingsdown & St Margaret's-at-Cliffe",Dover,(England/Wales) Rural town and fringe,E10000016,636125.0,144710.0,Dover 009,Dover 009B,,,,,Outstanding,South-East England and South London,,100062288026.0,,Not applicable,Not applicable,,,E02005049,E01024236,17.0, +118501,886,Kent,2539,Stocks Green Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,218.0,No Special Classes,19-01-2023,216.0,115.0,101.0,5.1,Not applicable,,Not applicable,,Not under a federation,,10069507.0,,Not applicable,07-03-2024,22-05-2024,Leigh Road,Hildenborough,,Tonbridge,Kent,TN11 9AE,www.stocksgreenprimary.co.uk,1732832758.0,Mr,P,Hipkiss,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,Hildenborough,Tonbridge and Malling,(England/Wales) Urban city and town,E10000016,557065.0,148064.0,Tonbridge and Malling 010,Tonbridge and Malling 010B,,,,,Good,South-East England and South London,,100062628569.0,,Not applicable,Not applicable,,,E02005158,E01024752,11.0, +118505,886,Kent,2545,Sandgate Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,No Special Classes,19-01-2023,418.0,206.0,212.0,9.8,Not applicable,,Not applicable,,Not under a federation,,10073318.0,,Not applicable,16-09-2021,12-09-2023,Coolinge Lane,,,Folkestone,Kent,CT20 3QU,www.sandgateprimaryschool.co.uk/,1303257280.0,Mr,Matthew,Green,Head Teacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Folkestone and Hythe,Sandgate & West Folkestone,Folkestone and Hythe,(England/Wales) Urban city and town,E10000016,620849.0,135894.0,Folkestone and Hythe 006,Folkestone and Hythe 006H,,,,,Good,South-East England and South London,,50027156.0,,Not applicable,Not applicable,,,E02005107,E01024521,41.0, +118511,886,Kent,2552,Sandling Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,No Special Classes,19-01-2023,421.0,226.0,195.0,4.8,Not applicable,,Not applicable,,Not under a federation,,10073317.0,,Not applicable,05-02-2020,07-05-2024,Ashburnham Road,Penenden Heath,,Maidstone,Kent,ME14 2JG,http://www.sandling.kent.sch.uk/,1622763297.0,Miss,Claire,Coombes,Head Teacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Maidstone,North,Maidstone and The Weald,(England/Wales) Urban city and town,E10000016,576624.0,157776.0,Maidstone 002,Maidstone 002D,,,,,Good,South-East England and South London,,10014308132.0,,Not applicable,Not applicable,,,E02005069,E01024385,20.0, +118515,886,Kent,2559,Capel-le-Ferne Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,177.0,99.0,78.0,22.6,Not applicable,,Not applicable,,Not under a federation,,10071996.0,,Not applicable,30-03-2022,21-05-2024,Capel Street,Capel-le-Ferne,,Folkestone,Kent,CT18 7HB,www.capelleferneprimary.co.uk,1303251353.0,Mr,Anthony,Richards,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Dover,Alkham & Capel-le-Ferne,Dover,(England/Wales) Rural hamlet and isolated dwellings,E10000016,625026.0,139092.0,Dover 014,Dover 014A,,,,,Good,South-East England and South London,,100062290850.0,,Not applicable,Not applicable,,,E02005054,E01024198,40.0, +118516,886,Kent,2562,Lunsford Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,208.0,104.0,104.0,20.7,Not applicable,,Not applicable,,Not under a federation,,10073316.0,,Not applicable,14-06-2023,01-04-2024,Swallow Road,Larkfield,,Aylesford,Kent,ME20 6PY,http://www.lunsford.kent.sch.uk,1732843352.0,Mr,Gary,Anscombe,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,Larkfield,Chatham and Aylesford,(England/Wales) Urban city and town,E10000016,570068.0,158786.0,Tonbridge and Malling 003,Tonbridge and Malling 003F,,,,,Good,South-East England and South London,,200000966558.0,,Not applicable,Not applicable,,,E02005151,E01024765,43.0, +118523,886,Kent,2574,Downs View Infant School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,7,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,270.0,No Special Classes,19-01-2023,260.0,138.0,122.0,16.2,Not applicable,,Not applicable,,Not under a federation,,10080430.0,,Not applicable,18-10-2023,21-05-2024,Ball Lane,Kennington,,Ashford,Kent,TN25 4PJ,www.downs-view.kent.sch.uk/,1233632339.0,Mrs,Tracy Kent,Mrs Sarah Collins,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Ashford,Kennington,Ashford,(England/Wales) Urban city and town,E10000016,602119.0,145227.0,Ashford 003,Ashford 003B,,,,,Good,South-East England and South London,,100062561615.0,,Not applicable,Not applicable,,,E02004998,E01023999,42.0, +118524,886,Kent,2578,Kingswood Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,140.0,No Special Classes,19-01-2023,129.0,70.0,59.0,10.1,Not applicable,,Not applicable,,Not under a federation,,10073315.0,,Not applicable,19-07-2022,20-11-2023,Cayser Drive,Kingswood,,Maidstone,Kent,ME17 3QF,www.kingswoodkentsch.co.uk,1622842674.0,Mrs,Lynsey,Sanchez Daviu,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Leeds,Faversham and Mid Kent,(England/Wales) Rural town and fringe,E10000016,584054.0,150831.0,Maidstone 015,Maidstone 015C,,,,,Good,South-East England and South London,,10022897422.0,,Not applicable,Not applicable,,,E02005082,E01024375,13.0, +118526,886,Kent,2586,Senacre Wood Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,212.0,109.0,103.0,32.1,Not applicable,,Not applicable,,Not under a federation,,10073314.0,,Not applicable,04-12-2019,27-02-2024,Graveney Road,Senacre,,Maidstone,Kent,ME15 8QQ,www.senacre-wood.kent.sch.uk/,3000658430.0,Mrs,Emily,Sweeney,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Shepway South,Faversham and Mid Kent,(England/Wales) Urban city and town,E10000016,578633.0,153076.0,Maidstone 013,Maidstone 013F,,,,,Good,South-East England and South London,,200003717450.0,,Not applicable,Not applicable,,,E02005080,E01024399,68.0, +118534,886,Kent,2603,"Bromstone Primary School, Broadstairs",Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,Has Special Classes,19-01-2023,406.0,221.0,185.0,38.9,Supported by a trust,Thanet Endeavour Learning Trust,Not applicable,,Supported by a federation,The Federation of Bromstone Primary School and St.Mildred's Primary Infant School,10073313.0,,Not applicable,27-03-2019,21-05-2024,Rumfields Road,,,Broadstairs,Kent,CT10 2PW,www.bromstoneschool.com/,1843867010.0,Mr,James,Williams,Executive Head,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,VI - Visual Impairment,HI - Hearing Impairment,"SLCN - Speech, language and Communication",,,,,,,,,,,Resourced provision,35.0,35.0,,,South East,Thanet,St Peters,South Thanet,(England/Wales) Urban city and town,E10000016,637928.0,167475.0,Thanet 011,Thanet 011D,,,,,Good,South-East England and South London,,200003079311.0,,Not applicable,Not applicable,,,E02005142,E01024690,158.0, +118536,886,Kent,2607,Parkside Community Primary School,Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,Not applicable,19-01-2023,168.0,84.0,84.0,75.6,Supported by a trust,Thanet Endeavour Learning Trust,Not applicable,,Not under a federation,,10073312.0,,Not applicable,26-04-2023,30-04-2024,Tennyson Avenue,,,Canterbury,Kent,CT1 1EP,www.parksidecommunityprimaryschool.co.uk,1227464956.0,Mr,James,Williams,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Canterbury,Northgate,Canterbury,(England/Wales) Urban city and town,E10000016,616671.0,158965.0,Canterbury 014,Canterbury 014C,,,,,Good,South-East England and South London,,100062279371.0,,Not applicable,Not applicable,,,E02005023,E01024090,127.0, +118541,886,Kent,2615,High Firs Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,206.0,98.0,108.0,13.6,Not applicable,,Not applicable,,Not under a federation,,10073311.0,,Not applicable,12-10-2023,23-04-2024,Court Crescent,,,Swanley,Kent,BR8 8NR,www.high-firs.kent.sch.uk/,1322669721.0,Mr,Andrew,Kilbride,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Swanley Christchurch and Swanley Village,Sevenoaks,(England/Wales) Urban major conurbation,E10000016,551435.0,168115.0,Sevenoaks 003,Sevenoaks 003C,,,,,Good,South-East England and South London,,50002001954.0,,Not applicable,Not applicable,,,E02005089,E01024474,28.0, +118548,886,Kent,2627,Sandwich Junior School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,7.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,240.0,No Special Classes,19-01-2023,210.0,104.0,106.0,22.4,Not applicable,,Not applicable,,Not under a federation,,10079030.0,,Not applicable,24-03-2022,12-09-2023,St Bart's Road,,,Sandwich,Kent,CT13 0AS,www.sandwich-junior.kent.sch.uk/,1304612227.0,Mr,Martin,Dyson,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,Sandwich,South Thanet,(England/Wales) Rural town and fringe,E10000016,632790.0,157449.0,Dover 002,Dover 002C,,,,,Outstanding,South-East England and South London,,200001851331.0,,Not applicable,Not applicable,,,E02005042,E01024243,47.0, +118551,886,Kent,2632,Sevenoaks Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,630.0,No Special Classes,19-01-2023,587.0,312.0,275.0,15.2,Not applicable,,Not applicable,,Not under a federation,,10073310.0,,Not applicable,19-04-2023,15-04-2024,Bradbourne Park Road,,,Sevenoaks,Kent,TN13 3LB,www.sevenoaks.kent.sch.uk,1732453952.0,Mrs,Cassandra,Malone,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Sevenoaks Town and St John's,Sevenoaks,(England/Wales) Urban city and town,E10000016,552671.0,156229.0,Sevenoaks 010,Sevenoaks 010F,,,,,Good,South-East England and South London,,100062548252.0,,Not applicable,Not applicable,,,E02005096,E01024468,89.0, +118558,886,Kent,2643,Swalecliffe Community Primary School,Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,660.0,No Special Classes,19-01-2023,581.0,320.0,261.0,18.2,Supported by a trust,The Coastal Alliance Co-operative Trust,Not applicable,,Not under a federation,,10073102.0,,Not applicable,14-09-2023,24-01-2024,Bridgefield Road,Swalecliffe,,Whitstable,Kent,CT5 2PH,http://www.swalecliffeprimary.org,1227272101.0,Mrs,Sarah,Watson,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Canterbury,Swalecliffe,Canterbury,(England/Wales) Urban city and town,E10000016,613028.0,166878.0,Canterbury 005,Canterbury 005E,,,,,Good,South-East England and South London,,100062301012.0,,Not applicable,Not applicable,,,E02005014,E01024115,106.0, +118563,886,Kent,2648,Aylesham Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,No Special Classes,19-01-2023,391.0,191.0,200.0,39.1,Not applicable,,Not applicable,,Not under a federation,,10073309.0,,Not applicable,08-06-2023,16-04-2024,Attlee Avenue,Aylesham,,Canterbury,Kent,CT3 3BS,www.aylesham.kent.sch.uk,1304840392.0,Mr,Darran,Callaghan,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,"Aylesham, Eythorne & Shepherdswell",Dover,(England/Wales) Rural town and fringe,E10000016,623337.0,152432.0,Dover 006,Dover 006E,,,,,Good,South-East England and South London,,10034883661.0,,Not applicable,Not applicable,,,E02005046,E01035314,153.0, +118566,886,Kent,2651,Broadwater Down Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,148.0,69.0,79.0,34.5,Not applicable,,Not applicable,,Not under a federation,,10073308.0,,Not applicable,09-03-2023,17-04-2024,Broadwater Lane,,,Tunbridge Wells,Kent,TN2 5RP,www.broadwater-down.kent.sch.uk,1892527588.0,Mr,Alex,Cornelius,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Broadwater,Tunbridge Wells,(England/Wales) Urban city and town,E10000016,557682.0,138106.0,Tunbridge Wells 010,Tunbridge Wells 010A,,,,,Good,South-East England and South London,,100062555286.0,,Not applicable,Not applicable,,,E02005171,E01024795,51.0, +118568,886,Kent,2653,West Borough Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,510.0,No Special Classes,19-01-2023,503.0,257.0,246.0,22.2,Not applicable,,Not applicable,,Not under a federation,,10076223.0,,Not applicable,19-10-2022,20-02-2024,Greenway,,,Maidstone,Kent,ME16 8TL,http://www.west-borough.kent.sch.uk/,1622726391.0,Mrs,Lisa,Edinburgh,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Heath,Maidstone and The Weald,(England/Wales) Urban city and town,E10000016,573885.0,155150.0,Maidstone 008,Maidstone 008C,,,,,Good,South-East England and South London,,10014309300.0,,Not applicable,Not applicable,,,E02005075,E01024367,102.0, +118575,886,Kent,2662,Long Mead Community Primary School,Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,128.0,50.0,78.0,54.7,Not supported by a trust,,Not applicable,,Not under a federation,,10073101.0,,Not applicable,18-09-2019,31-03-2024,Waveney Road,,,Tonbridge,Kent,TN10 3JU,www.long-mead.kent.sch.uk/,1732350601.0,Mrs,Karen,Follows,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,Trench,Tonbridge and Malling,(England/Wales) Urban city and town,E10000016,558754.0,148444.0,Tonbridge and Malling 009,Tonbridge and Malling 009C,,,,,Good,South-East England and South London,,200000961885.0,,Not applicable,Not applicable,,,E02005157,E01024775,64.0, +118585,886,Kent,2674,King's Farm Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,2.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,492.0,No Special Classes,19-01-2023,437.0,237.0,200.0,53.2,Not applicable,,Not applicable,,Supported by a federation,Ifield School & King's Farm Primary School Federation,10069504.0,,Not applicable,28-02-2024,22-05-2024,Cedar Avenue,,,Gravesend,Kent,DA12 5JT,www.kings-farm.kent.sch.uk,1474566979.0,Mr,Chris,Jackson,Head of School,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,ASD - Autistic Spectrum Disorder,,,,,,,,,,,,,Resourced provision,13.0,15.0,,,South East,Gravesham,Singlewell,Gravesham,(England/Wales) Urban major conurbation,E10000016,565269.0,171511.0,Gravesham 011,Gravesham 011D,,,,,Good,South-East England and South London,,100062312756.0,,Not applicable,Not applicable,,,E02005065,E01024306,216.0, +118590,886,Kent,3010,St Pauls' Church of England Voluntary Controlled Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,105.0,No Special Classes,19-01-2023,107.0,52.0,55.0,10.3,Not applicable,,Not applicable,,Supported by a federation,The Compass Federation,10070335.0,,Not applicable,28-01-2020,01-05-2024,School Lane,,,Swanley Village,Kent,BR8 7PJ,www.st-pauls-swanley.kent.sch.uk,1322664324.0,Mr,Benjamin,Hulme,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Swanley Christchurch and Swanley Village,Sevenoaks,(England/Wales) Urban major conurbation,E10000016,552800.0,169829.0,Sevenoaks 001,Sevenoaks 001D,,,,,Good,South-East England and South London,,100062076900.0,,Not applicable,Not applicable,,,E02005087,E01024472,11.0, +118592,886,Kent,3015,Fawkham Church of England Voluntary Controlled Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,105.0,No Special Classes,19-01-2023,102.0,50.0,52.0,5.9,Not applicable,,Not applicable,,Not under a federation,,10078483.0,,Not applicable,22-11-2023,15-04-2024,Valley Road,Fawkham,,LONGFIELD,Kent,DA3 8NA,http://fawkhamschool.com,1474702312.0,Miss,Mandy,Bridges,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Fawkham and West Kingsdown,Sevenoaks,(England/Wales) Rural hamlet and isolated dwellings,E10000016,558819.0,166693.0,Sevenoaks 007,Sevenoaks 007C,,,,,Good,South-East England and South London,,10035185497.0,,Not applicable,Not applicable,,,E02005093,E01024437,6.0, +118597,886,Kent,3022,Benenden Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,210.0,No Special Classes,19-01-2023,211.0,96.0,115.0,11.4,Not applicable,,Not applicable,,Supported by a federation,The 10:10 Primary Federation,10074253.0,,Not applicable,24-02-2022,20-05-2024,Rolvenden Road,,,Cranbrook,,TN17 4EH,http://www.benenden-cep.kent.sch.uk,1580240565.0,Mrs,Lindsay,Roberts,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Tunbridge Wells,Benenden and Cranbrook,Maidstone and The Weald,(England/Wales) Rural village,E10000016,580826.0,132744.0,Tunbridge Wells 014,Tunbridge Wells 014A,,,,,Good,South-East England and South London,United Kingdom,10000069843.0,,Not applicable,Not applicable,,,E02005175,E01024789,24.0, +118598,886,Kent,3023,Bidborough Church of England Voluntary Controlled Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,210.0,No Special Classes,19-01-2023,207.0,109.0,98.0,6.3,Not applicable,,Not applicable,,Not under a federation,,10070333.0,,Not applicable,10-11-2022,20-05-2024,Spring Lane,Bidborough,,Tunbridge Wells,Kent,TN3 0UE,http://www.bidborough.kent.sch.uk,1892529333.0,Mrs,Julie,Burton,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Speldhurst and Bidborough,Tunbridge Wells,(England/Wales) Urban city and town,E10000016,556545.0,143127.0,Tunbridge Wells 006,Tunbridge Wells 006E,,,,,Good,South-East England and South London,,100062566429.0,,Not applicable,Not applicable,,,E02005167,E01024854,13.0, +118600,886,Kent,3027,Cranbrook Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,210.0,No Special Classes,19-01-2023,199.0,93.0,106.0,32.2,Not applicable,,Not applicable,,Not under a federation,,10070332.0,,Not applicable,22-06-2022,21-05-2024,Carriers Road,,,Cranbrook,Kent,TN17 3JZ,http://www.cranbrook-cep.kent.sch.uk,1580713249.0,Miss,Francesca,Shaw,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Benenden and Cranbrook,Maidstone and The Weald,(England/Wales) Rural town and fringe,E10000016,577605.0,136487.0,Tunbridge Wells 013,Tunbridge Wells 013C,,,,,Good,South-East England and South London,,100062552228.0,,Not applicable,Not applicable,,,E02005174,E01024790,64.0, +118601,886,Kent,3029,Goudhurst and Kilndown Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,210.0,No Special Classes,19-01-2023,211.0,107.0,104.0,15.6,Not applicable,,Not applicable,,Supported by a federation,The 10:10 Primary Federation,10078482.0,,Not applicable,20-03-2014,20-05-2024,Beaman Close,Cranbrook Road,Goudhurst,Cranbrook,Kent,TN17 1DZ,www.goudhurst-kilndown.kent.sch.uk,1580211365.0,Mrs,Lindsay,Roberts,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Goudhurst and Lamberhurst,Tunbridge Wells,(England/Wales) Rural village,E10000016,572817.0,137814.0,Tunbridge Wells 011,Tunbridge Wells 011C,,,,,Outstanding,South-East England and South London,,10008665566.0,,Not applicable,Not applicable,,,E02005172,E01024804,33.0, +118602,886,Kent,3032,Hawkhurst Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,210.0,No Special Classes,19-01-2023,183.0,100.0,83.0,42.1,Not applicable,,Not applicable,,Not under a federation,,10070331.0,,Not applicable,25-01-2023,15-04-2024,Fowlers Park,Rye Road,Hawkhurst,Cranbrook,Kent,TN18 4JJ,www.hawkhurst.kent.sch.uk,1580753254.0,Mrs,Jodi,Hacker,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Hawkhurst and Sandhurst,Tunbridge Wells,(England/Wales) Rural town and fringe,E10000016,576506.0,130526.0,Tunbridge Wells 014,Tunbridge Wells 014B,,,,,Good,South-East England and South London,,10000066322.0,,Not applicable,Not applicable,,,E02005175,E01024807,77.0, +118603,886,Kent,3033,Hildenborough Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,210.0,No Special Classes,19-01-2023,190.0,92.0,98.0,8.4,Not applicable,,Not applicable,,Not under a federation,,10069124.0,,Not applicable,01-03-2023,23-01-2024,Riding Lane,Hildenborough,,Tonbridge,Kent,TN11 9HY,http://www.hildenborough.kent.sch.uk,1732833394.0,Miss,Ruth,Ardrey,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,Hildenborough,Tonbridge and Malling,(England/Wales) Urban city and town,E10000016,556585.0,148896.0,Tonbridge and Malling 010,Tonbridge and Malling 010D,,,,,Good,South-East England and South London,,200000966230.0,,Not applicable,Not applicable,,,E02005158,E01024754,16.0, +118604,886,Kent,3034,Lamberhurst St Mary's CofE (Voluntary Controlled) Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,210.0,No Special Classes,19-01-2023,206.0,95.0,111.0,8.7,Not applicable,,Not applicable,,Not under a federation,,10069123.0,,Not applicable,08-03-2023,01-05-2024,Pearse Place,Lamberhurst,,Tunbridge Wells,Kent,TN3 8EJ,www.lamberhurst.kent.sch.uk,1892890281.0,Mrs,Caroline,Bromley,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Goudhurst and Lamberhurst,Tunbridge Wells,(England/Wales) Rural village,E10000016,567565.0,136008.0,Tunbridge Wells 011,Tunbridge Wells 011D,,,,,Good,South-East England and South London,,10000067311.0,,Not applicable,Not applicable,,,E02005172,E01024805,18.0, +118606,886,Kent,3037,"St John's Church of England Primary School, Sevenoaks",Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,210.0,No Special Classes,19-01-2023,202.0,90.0,112.0,10.9,Not applicable,,Not applicable,,Not under a federation,,10078481.0,,Not applicable,26-04-2023,19-04-2024,Bayham Road,,,Sevenoaks,Kent,TN13 3XD,www.stjohnssevenoaks.co.uk,1732453944.0,Mrs,Therese,Pullan,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Sevenoaks Eastern,Sevenoaks,(England/Wales) Urban city and town,E10000016,553550.0,155884.0,Sevenoaks 010,Sevenoaks 010C,,,,,Good,South-East England and South London,,10035184681.0,,Not applicable,Not applicable,,,E02005096,E01024461,22.0, +118607,886,Kent,3042,Speldhurst Church of England Voluntary Aided Primary School,Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,210.0,No Special Classes,19-01-2023,213.0,106.0,107.0,8.5,Not applicable,,Not applicable,,Not under a federation,,10069121.0,,Not applicable,07-02-2014,19-03-2024,Langton Road,Speldhurst,,Tunbridge Wells,Kent,TN3 0NP,http://www.speldhurst.kent.sch.uk,1892863044.0,Mrs,Stephanie,Hayward,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Tunbridge Wells,Speldhurst and Bidborough,Tunbridge Wells,(England/Wales) Rural hamlet and isolated dwellings,E10000016,555310.0,141309.0,Tunbridge Wells 006,Tunbridge Wells 006D,,,,,Outstanding,South-East England and South London,,100062566310.0,,Not applicable,Not applicable,,,E02005167,E01024853,18.0, +118608,886,Kent,3043,Sundridge and Brasted Church of England Voluntary Controlled Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,105.0,No Special Classes,19-01-2023,60.0,32.0,28.0,38.3,Not applicable,,Not applicable,,Not under a federation,,10078480.0,,Not applicable,12-10-2023,16-04-2024,Church Road,Sundridge,,Sevenoaks,Kent,TN14 6EA,http://www.sundridge.kent.sch.uk,1959562694.0,Mr,Tom,Hardwick,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,"Brasted, Chevening and Sundridge",Sevenoaks,(England/Wales) Rural village,E10000016,548465.0,154940.0,Sevenoaks 013,Sevenoaks 013A,,,,,Good,South-East England and South London,,100062548784.0,,Not applicable,Not applicable,,,E02005099,E01024417,23.0, +118611,886,Kent,3050,St John's Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,630.0,No Special Classes,19-01-2023,631.0,314.0,317.0,11.6,Not applicable,,Not applicable,,Not under a federation,,10069120.0,,Not applicable,22-03-2023,16-05-2024,Cunningham Road,,St John's Cep,Tunbridge Wells,Kent,TN4 9EW,www.st-johns-school.org.uk/,1892678980.0,Mr,Niall,Dossad,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,St John's,Tunbridge Wells,(England/Wales) Urban city and town,E10000016,558728.0,141298.0,Tunbridge Wells 003,Tunbridge Wells 003A,,,,,Good,South-East England and South London,,100062586186.0,,Not applicable,Not applicable,,,E02005164,E01024836,73.0, +118613,886,Kent,3052,St Mark's Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,420.0,No Special Classes,19-01-2023,360.0,193.0,167.0,23.1,Not applicable,,Not applicable,,Not under a federation,,10069119.0,,Not applicable,29-06-2022,21-05-2024,Ramslye Road,,,Tunbridge Wells,Kent,TN4 8LN,http://www.st-marks.kent.sch.uk,1892525402.0,Mr,Simon,Bird,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Broadwater,Tunbridge Wells,(England/Wales) Urban city and town,E10000016,556979.0,138070.0,Tunbridge Wells 010,Tunbridge Wells 010B,,,,,Good,South-East England and South London,,100062585738.0,,Not applicable,Not applicable,,,E02005171,E01024796,83.0, +118614,886,Kent,3053,St Peter's Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,210.0,No Special Classes,19-01-2023,213.0,116.0,97.0,13.1,Not applicable,,Not applicable,,Not under a federation,,10078479.0,,Not applicable,20-03-2014,27-09-2023,Hawkenbury Road,,,Tunbridge Wells,,TN2 5BW,http://www.st-peters.kent.sch.uk,1892525727.0,Mrs,Joanna,Langton,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Park,Tunbridge Wells,(England/Wales) Urban city and town,E10000016,559229.0,139204.0,Tunbridge Wells 009,Tunbridge Wells 009C,,,,,Outstanding,South-East England and South London,United Kingdom,10090053470.0,,Not applicable,Not applicable,,,E02005170,E01024824,28.0, +118615,886,Kent,3054,Crockham Hill Church of England Voluntary Controlled Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,140.0,No Special Classes,19-01-2023,137.0,70.0,67.0,0.7,Not applicable,,Not applicable,,Not under a federation,,10069118.0,,Not applicable,26-04-2023,23-05-2024,Crockham Hill,,,Edenbridge,Kent,TN8 6RP,http://www.crockhamhill.kent.sch.uk,1732866374.0,Mrs,Lisa,Higgs,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Sevenoaks,Westerham and Crockham Hill,Sevenoaks,(England/Wales) Rural hamlet and isolated dwellings,E10000016,544353.0,150691.0,Sevenoaks 013,Sevenoaks 013D,,,,,Good,South-East England and South London,,10035185257.0,,Not applicable,Not applicable,,,E02005099,E01024484,1.0, +118616,886,Kent,3055,Churchill Church of England Voluntary Controlled Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,420.0,No Special Classes,19-01-2023,201.0,94.0,107.0,28.4,Not applicable,,Not applicable,,Not under a federation,,10078478.0,,Not applicable,05-12-2019,12-09-2023,Rysted Lane,,,Westerham,Kent,TN16 1EZ,www.churchill.kent.sch.uk,1959562197.0,Mrs,Kathy,Jax,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Westerham and Crockham Hill,Sevenoaks,(England/Wales) Rural town and fringe,E10000016,544398.0,154520.0,Sevenoaks 013,Sevenoaks 013D,,,,,Good,South-East England and South London,,10035185216.0,,Not applicable,Not applicable,,,E02005099,E01024484,57.0, +118617,886,Kent,3057,St Peter's Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,210.0,No Special Classes,19-01-2023,194.0,102.0,92.0,14.4,Not applicable,,Not applicable,,Not under a federation,,10069117.0,,Not applicable,20-03-2019,03-06-2024,Mount Pleasant,,,Aylesford,Kent,ME20 7BE,www.stpetersaylesford.kent.sch.uk,1622717335.0,Mr,Jim,Holditch,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,Aylesford North & North Downs,Chatham and Aylesford,(England/Wales) Urban city and town,E10000016,573064.0,159050.0,Tonbridge and Malling 001,Tonbridge and Malling 001A,,,,,Good,South-East England and South London,,100062628349.0,,Not applicable,Not applicable,,,E02005149,E01024719,28.0, +118619,886,Kent,3061,Bredhurst Church of England Voluntary Controlled Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,140.0,No Special Classes,19-01-2023,130.0,70.0,60.0,5.4,Not applicable,,Not applicable,,Not under a federation,,10069116.0,,Not applicable,24-01-2024,20-05-2024,The Street,Bredhurst,,Gillingham,Kent,ME7 3JY,www.bredhurst.kent.sch.uk/,1634231271.0,Mrs,Michelle,Cox,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Boxley,Faversham and Mid Kent,(England/Wales) Rural village,E10000016,579632.0,162276.0,Maidstone 001,Maidstone 001C,,,,,Good,South-East England and South London,,200003720400.0,,Not applicable,Not applicable,,,E02005068,E01024335,7.0, +118620,886,Kent,3062,Burham Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,196.0,No Special Classes,19-01-2023,144.0,74.0,70.0,8.3,Not applicable,,Not applicable,,Not under a federation,,10069115.0,,Not applicable,05-12-2018,14-05-2024,Bell Lane,Burham,,Rochester,Kent,ME1 3SY,http://www.burham.kent.sch.uk,1634861691.0,Mrs,Holly,Goddon,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,Aylesford North & North Downs,Chatham and Aylesford,(England/Wales) Rural village,E10000016,572942.0,161845.0,Tonbridge and Malling 001,Tonbridge and Malling 001F,,,,,Good,South-East England and South London,,200000961192.0,,Not applicable,Not applicable,,,E02005149,E01024728,12.0, +118622,886,Kent,3067,Harrietsham Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,390.0,No Special Classes,19-01-2023,309.0,148.0,161.0,19.2,Not applicable,,Not applicable,,Not under a federation,,10070328.0,,Not applicable,21-02-2024,20-05-2024,West Street,Harrietsham,,Maidstone,Kent,ME17 1JZ,www.harrietsham.kent.sch.uk,1622859261.0,Mrs,Jackie,Chambers,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Harrietsham and Lenham,Faversham and Mid Kent,(England/Wales) Rural village,E10000016,586070.0,152776.0,Maidstone 011,Maidstone 011F,,,,,Good,South-East England and South London,,10022893860.0,,Not applicable,Not applicable,,,E02005078,E01034994,59.0, +118623,886,Kent,3069,Leeds and Broomfield Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,105.0,No Special Classes,19-01-2023,84.0,40.0,44.0,23.8,Not applicable,,Not applicable,,Not under a federation,,10069114.0,,Not applicable,19-10-2021,17-01-2024,Lower Street,Leeds,,Maidstone,Kent,ME17 1RL,www.leedsandbroomfieldkentsch.co.uk,1622861398.0,Mrs,Fiona,Steer,Executive Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Leeds,Faversham and Mid Kent,(England/Wales) Rural village,E10000016,582467.0,153353.0,Maidstone 015,Maidstone 015C,,,,,Good,South-East England and South London,,200003698499.0,,Not applicable,Not applicable,,,E02005082,E01024375,20.0, +118625,886,Kent,3072,"Maidstone, St Michael's Church of England Junior School",Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,7.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,178.0,No Special Classes,19-01-2023,178.0,89.0,89.0,18.5,Not applicable,,Not applicable,,Supported by a federation,St Michael's Church of England Federated Infant and Junior School,10078477.0,,Not applicable,22-11-2023,23-04-2024,Douglas Road,,,Maidstone,Kent,ME16 8ER,www.st-michaels-junior.kent.sch.uk,1622751502.0,Mrs,Lisa,Saunders,Executive Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Fant,Maidstone and The Weald,(England/Wales) Urban city and town,E10000016,575266.0,155120.0,Maidstone 006,Maidstone 006G,,,,,Good,South-East England and South London,,200003668897.0,,Not applicable,Not applicable,,,E02005073,E01033091,33.0, +118626,886,Kent,3073,St Michael's Church of England Infant School Maidstone,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,7,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,120.0,No Special Classes,19-01-2023,121.0,63.0,58.0,17.4,Not applicable,,Not applicable,,Supported by a federation,St Michael's Church of England Federated Infant and Junior School,10079671.0,,Not applicable,29-01-2014,17-04-2024,Douglas Road,,,Maidstone,Kent,ME16 8ER,http://www.st-michaels-infant.kent.sch.uk,1622751398.0,Mrs,Lisa,Saunders,Executive Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Fant,Maidstone and The Weald,(England/Wales) Urban city and town,E10000016,575266.0,155120.0,Maidstone 006,Maidstone 006G,,,,,Outstanding,South-East England and South London,,200003668897.0,,Not applicable,Not applicable,,,E02005073,E01033091,21.0, +118629,886,Kent,3081,Thurnham Church of England Infant School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,7,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,270.0,No Special Classes,19-01-2023,270.0,140.0,130.0,1.9,Not applicable,,Not applicable,,Not under a federation,,10079670.0,,Not applicable,22-02-2023,25-04-2024,The Landway,Bearsted,,Maidstone,Kent,ME14 4BL,www.thurnham-infant.kent.sch.uk,1622737685.0,Mr,Tony,Pring,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Bearsted,Faversham and Mid Kent,(England/Wales) Urban city and town,E10000016,579425.0,155670.0,Maidstone 005,Maidstone 005A,,,,,Good,South-East England and South London,,200003691727.0,,Not applicable,Not applicable,,,E02005072,E01024330,5.0, +118630,886,Kent,3082,Trottiscliffe Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,84.0,No Special Classes,19-01-2023,81.0,39.0,42.0,2.5,Not applicable,,Not applicable,,Not under a federation,,10069113.0,,Not applicable,15-09-2022,21-05-2024,Church Lane,Trottiscliffe,,West Malling,Kent,ME19 5EB,http://www.trottiscliffe.kent.sch.uk/,1732822803.0,Miss,Lucy,Henderson,Head of School,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,Pilgrims with Ightham,Tonbridge and Malling,(England/Wales) Rural village,E10000016,564298.0,160200.0,Tonbridge and Malling 014,Tonbridge and Malling 014F,,,,,Good,South-East England and South London,,200000963789.0,,Not applicable,Not applicable,,,E02006833,E01032829,2.0, +118631,886,Kent,3083,Ulcombe Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,105.0,No Special Classes,19-01-2023,63.0,31.0,32.0,50.8,Not applicable,,Not applicable,,Not under a federation,,10069112.0,,Not applicable,27-11-2019,03-06-2024,The Street,Ulcombe,,Maidstone,Kent,ME17 1DU,https://ulcombekentsch.co.uk/,1622842903.0,Ms,Emma,Masters,Executive Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,"SLCN - Speech, language and Communication",ASD - Autistic Spectrum Disorder,"SEMH - Social, Emotional and Mental Health",MLD - Moderate Learning Difficulty,,,,,,,,,,Resourced provision,6.0,15.0,,,South East,Maidstone,Headcorn,Faversham and Mid Kent,(England/Wales) Rural hamlet and isolated dwellings,E10000016,584797.0,148979.0,Maidstone 017,Maidstone 017C,,,,,Good,South-East England and South London,,10014312333.0,,Not applicable,Not applicable,,,E02005084,E01024366,32.0, +118632,886,Kent,3084,Wateringbury Church of England Primary School,Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,210.0,No Special Classes,19-01-2023,175.0,74.0,101.0,16.6,Not applicable,,Not applicable,,Not under a federation,,10078476.0,,Not applicable,08-03-2023,30-11-2023,147 Bow Road,Wateringbury,,Maidstone,Kent,ME18 5EA,www.wateringbury.kent.sch.uk/,1622812199.0,Miss,Debbie,Johnson,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,"East and West Peckham, Mereworth & Wateringbury",Tonbridge and Malling,(England/Wales) Rural town and fringe,E10000016,569089.0,152864.0,Tonbridge and Malling 007,Tonbridge and Malling 007D,,,,,Requires improvement,South-East England and South London,,10014312449.0,,Not applicable,Not applicable,,,E02005155,E01024781,29.0, +118634,886,Kent,3088,"Wouldham, All Saints Church of England Voluntary Controlled Primary School",Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Non-selective,420.0,No Special Classes,19-01-2023,401.0,196.0,205.0,13.7,Not applicable,,Not applicable,,Not under a federation,,10075829.0,,Not applicable,26-04-2023,10-10-2023,1 Worrall Drive,Wouldham,,Rochester,,ME1 3GE,http://www.wouldham.kent.sch.uk,1634861434.0,Mrs,Victoria,Baldwin,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,Aylesford North & North Downs,Chatham and Aylesford,(England/Wales) Rural hamlet and isolated dwellings,E10000016,571413.0,163394.0,Tonbridge and Malling 001,Tonbridge and Malling 001H,,,,,Good,South-East England and South London,United Kingdom,10092972751.0,,Not applicable,Not applicable,,,E02005149,E01035003,55.0, +118635,886,Kent,3089,St George's Church of England Voluntary Controlled Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,210.0,No Special Classes,19-01-2023,203.0,103.0,100.0,18.7,Not applicable,,Not applicable,,Not under a federation,,10078871.0,,Not applicable,14-12-2022,03-06-2024,Old London Road,Wrotham,,Sevenoaks,Kent,TN15 7DL,http://www.st-georges-wrotham.kent.sch.uk/,1732882401.0,Mrs,Elizabeth,Rye,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Tonbridge and Malling,Pilgrims with Ightham,Tonbridge and Malling,(England/Wales) Rural town and fringe,E10000016,560941.0,159482.0,Tonbridge and Malling 006,Tonbridge and Malling 006F,,,,,Good,South-East England and South London,,200000964122.0,,Not applicable,Not applicable,,,E02005154,E01024786,38.0, +118636,886,Kent,3090,"St Margaret's, Collier Street Church of England Voluntary Controlled School",Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,120.0,No Special Classes,19-01-2023,123.0,58.0,65.0,4.1,Not applicable,,Not applicable,,Not under a federation,,10069111.0,,Not applicable,04-05-2022,07-05-2024,Collier Street,Marden,,Tonbridge,Kent,TN12 9RR,www.collier-street.kent.sch.uk/,1892730264.0,Mr,Paul,Ryan,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Marden and Yalding,Maidstone and The Weald,(England/Wales) Rural hamlet and isolated dwellings,E10000016,571630.0,146064.0,Maidstone 018,Maidstone 018C,,,,,Good,South-East England and South London,,200003662059.0,,Not applicable,Not applicable,,,E02005085,E01024380,5.0, +118637,886,Kent,3091,Laddingford St Mary's Church of England Voluntary Controlled Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,101.0,No Special Classes,19-01-2023,81.0,37.0,44.0,25.0,Not applicable,,Not applicable,,Not under a federation,,10069110.0,,Not applicable,08-03-2023,30-04-2024,Darman Lane,Laddingford,,Maidstone,Kent,ME18 6BL,http://www.laddingford.kent.sch.uk,1622871270.0,Mrs,Lucy,Clark,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Maidstone,Marden and Yalding,Maidstone and The Weald,(England/Wales) Rural hamlet and isolated dwellings,E10000016,568865.0,147811.0,Maidstone 018,Maidstone 018B,,,,,Good,South-East England and South London,,200003718886.0,,Not applicable,Not applicable,,,E02005085,E01024379,20.0, +118638,886,Kent,3092,"Yalding, St Peter and St Paul Church of England Voluntary Controlled Primary School",Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,168.0,No Special Classes,19-01-2023,173.0,87.0,86.0,10.4,Not applicable,,Not applicable,,Not under a federation,,10078475.0,,Not applicable,30-01-2019,05-06-2024,Vicarage Road,Yalding,,Maidstone,Kent,ME18 6DP,http://www.yalding.kent.sch.uk,1622814298.0,Mrs,Sarah,Friend,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Marden and Yalding,Maidstone and The Weald,(England/Wales) Rural town and fringe,E10000016,570095.0,150173.0,Maidstone 014,Maidstone 014D,,,,,Good,South-East England and South London,,200003718898.0,,Not applicable,Not applicable,,,E02005081,E01024378,18.0, +118646,886,Kent,3108,Ospringe Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,210.0,No Special Classes,19-01-2023,213.0,113.0,100.0,30.5,Not applicable,,Not applicable,,Not under a federation,,10069108.0,,Not applicable,07-06-2023,16-04-2024,Water Lane,Ospringe,,Faversham,Kent,ME13 8TX,www.ospringeprimary.co.uk/,1795532004.0,Mrs,Amanda,Ralph,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Watling,Faversham and Mid Kent,(England/Wales) Urban city and town,E10000016,600216.0,160694.0,Swale 014,Swale 014F,,,,,Good,South-East England and South London,,100062380290.0,,Not applicable,Not applicable,,,E02005128,E01024627,65.0, +118647,886,Kent,3109,Hernhill Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,210.0,No Special Classes,19-01-2023,212.0,105.0,107.0,10.4,Not applicable,,Not applicable,,Not under a federation,,10078474.0,,Not applicable,07-03-2024,22-05-2024,Fostall,Hernhill,,Faversham,Kent,ME13 9JG,www.hernhill.kent.sch.uk,1227751322.0,Mrs,Sarah,Alexander,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Boughton and Courtenay,Faversham and Mid Kent,(England/Wales) Rural hamlet and isolated dwellings,E10000016,606692.0,161491.0,Swale 017,Swale 017B,,,,,Outstanding,South-East England and South London,,10023196116.0,,Not applicable,Not applicable,,,E02005131,E01024556,22.0, +118649,886,Kent,3111,Newington Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,2.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,236.0,No Special Classes,19-01-2023,252.0,139.0,113.0,33.3,Not applicable,,Not applicable,,Supported by a federation,The Federation of Lower Halstow Primary and Newington CofE Primary School,10069107.0,,Not applicable,15-05-2019,19-04-2024,School Lane,Newington,,Sittingbourne,Kent,ME9 7LB,www.newington.kent.sch.uk,1795842300.0,Mrs,Tara,Deevoy,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,"Hartlip, Newington and Upchurch",Sittingbourne and Sheppey,(England/Wales) Rural town and fringe,E10000016,585949.0,165334.0,Swale 008,Swale 008B,,,,,Good,South-East England and South London,,100062626974.0,,Not applicable,Not applicable,,,E02005122,E01024571,84.0, +118651,886,Kent,3117,Teynham Parochial Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,210.0,No Special Classes,19-01-2023,202.0,105.0,97.0,31.2,Not applicable,,Not applicable,,Not under a federation,,10078473.0,,Not applicable,29-03-2023,23-05-2024,Station Road,Teynham,,Sittingbourne,Kent,ME9 9BQ,www.teynham.kent.sch.uk,1795521217.0,Mrs,Elizabeth,Pearson,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Teynham and Lynsted,Sittingbourne and Sheppey,(England/Wales) Rural town and fringe,E10000016,595417.0,162735.0,Swale 016,Swale 016D,,,,,Requires improvement,South-East England and South London,,100062627014.0,,Not applicable,Not applicable,,,E02005130,E01024623,63.0, +118653,886,Kent,3120,Barham Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,210.0,No Special Classes,19-01-2023,210.0,102.0,108.0,12.4,Not applicable,,Not applicable,,Not under a federation,,10069106.0,,Not applicable,25-01-2023,15-04-2024,Valley Road,Barham,Barham C of E Primary School,CANTERBURY,Kent,CT4 6NX,www.barham.kent.sch.uk/,1227831312.0,Mrs,Alison Higgins,Jo Duhig,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Canterbury,Nailbourne,Canterbury,(England/Wales) Rural village,E10000016,620612.0,150003.0,Canterbury 018,Canterbury 018B,,,,,Good,South-East England and South London,,100062299377.0,,Not applicable,Not applicable,,,E02005027,E01024043,26.0, +118654,886,Kent,3122,Bridge and Patrixbourne Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,420.0,No Special Classes,19-01-2023,407.0,199.0,208.0,3.4,Not applicable,,Not applicable,,Not under a federation,,10078472.0,,Not applicable,04-10-2023,18-04-2024,Conyngham Lane,Bridge,,Canterbury,Kent,CT4 5JX,www.bridge.kent.sch.uk,1227830276.0,Mr,James,Tibbles,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Canterbury,Nailbourne,Canterbury,(England/Wales) Rural town and fringe,E10000016,618239.0,154550.0,Canterbury 018,Canterbury 018C,,,,,Good,South-East England and South London,,100062298950.0,,Not applicable,Not applicable,,,E02005027,E01024088,14.0, +118655,886,Kent,3123,Chislet Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,105.0,No Special Classes,19-01-2023,95.0,50.0,45.0,12.6,Not applicable,,Not applicable,,Supported by a federation,The Federation of Chislet CE and Hoath Primary Schools,10078870.0,,Not applicable,24-11-2022,18-04-2024,Church Lane,Chislet,,Canterbury,Kent,CT3 4DU,www.chislethoathfederation.co.uk,1227860295.0,Mr,Tim,Whitehouse,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Canterbury,Reculver,North Thanet,(England/Wales) Rural village,E10000016,622377.0,164226.0,Canterbury 010,Canterbury 010D,,,,,Good,South-East England and South London,,10033152283.0,,Not applicable,Not applicable,,,E02005019,E01024087,12.0, +118657,886,Kent,3126,Littlebourne Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,105.0,No Special Classes,19-01-2023,99.0,47.0,52.0,26.3,Not applicable,,Not applicable,,Not under a federation,,10069105.0,,Not applicable,23-05-2019,30-05-2024,Church Road,Littlebourne,,Canterbury,Kent,CT3 1XS,http://www.littlebourne.kent.sch.uk,1227721671.0,Mrs,Samantha,Killick,Head of School,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Canterbury,Little Stour & Adisham,Canterbury,(England/Wales) Rural town and fringe,E10000016,620956.0,157780.0,Canterbury 010,Canterbury 010A,,,,,Good,South-East England and South London,,200000681653.0,,Not applicable,Not applicable,,,E02005019,E01024084,26.0, +118659,886,Kent,3129,St Alphege Church of England Infant School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,3.0,7,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,232.0,No Special Classes,19-01-2023,206.0,105.0,101.0,16.3,Not applicable,,Not applicable,,Not under a federation,,10079668.0,,Not applicable,03-02-2023,03-06-2024,Oxford Street,,,Whitstable,Kent,CT5 1DA,http://www.st-alphege.kent.sch.uk,1227272977.0,Mrs,Liz,Thomas-Friend,Executive Head,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Canterbury,Gorrell,Canterbury,(England/Wales) Urban city and town,E10000016,610681.0,166250.0,Canterbury 008,Canterbury 008C,,,,,Good,South-East England and South London,,100062300537.0,,Not applicable,Not applicable,,,E02005017,E01024070,30.0, +118660,886,Kent,3130,Wickhambreaux Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,115.0,No Special Classes,19-01-2023,118.0,55.0,63.0,11.0,Not applicable,,Not applicable,,Not under a federation,,10065385.0,,Not applicable,26-02-2015,20-05-2024,The Street,Wickhambreaux,,Canterbury,Kent,CT3 1RN,www.wickhambreaux-school.ik.org/,1227721300.0,Mrs,Lisa,Crosbie,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Canterbury,Little Stour & Adisham,Canterbury,(England/Wales) Rural hamlet and isolated dwellings,E10000016,622169.0,158684.0,Canterbury 010,Canterbury 010B,,,,,Outstanding,South-East England and South London,,100062298259.0,,Not applicable,Not applicable,,,E02005019,E01024085,13.0, +118663,886,Kent,3136,Brabourne Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,105.0,No Special Classes,19-01-2023,104.0,49.0,55.0,11.5,Not applicable,,Not applicable,,Not under a federation,,10078471.0,,Not applicable,19-06-2018,06-06-2024,School Lane,Brabourne,,Ashford,Kent,TN25 5LQ,www.brabourne.kent.sch.uk,1303813276.0,Mr,Andrew,Stapley,Acting Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Ashford,Bircholt,Folkestone and Hythe,(England/Wales) Rural hamlet and isolated dwellings,E10000016,609183.0,141706.0,Ashford 010,Ashford 010C,,,,,Good,South-East England and South London,,100062561998.0,,Not applicable,Not applicable,,,E02005005,E01024015,12.0, +118664,886,Kent,3137,Brookland Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,105.0,No Special Classes,19-01-2023,87.0,43.0,44.0,16.1,Not applicable,,Not applicable,,Not under a federation,,10078470.0,,Not applicable,03-02-2023,14-05-2024,High Street,Brookland,,Romney Marsh,Kent,TN29 9QR,http://www.brookland.kent.sch.uk,1797344317.0,Mr,Martin,Hacker,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Folkestone and Hythe,Walland & Denge Marsh,Folkestone and Hythe,(England/Wales) Rural hamlet and isolated dwellings,E10000016,599003.0,125887.0,Folkestone and Hythe 011,Folkestone and Hythe 011D,,,,,Good,South-East England and South London,,50000252.0,,Not applicable,Not applicable,,,E02005112,E01024548,14.0, +118665,886,Kent,3138,"Chilham, St Mary's Church of England Primary School",Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,105.0,No Special Classes,19-01-2023,79.0,36.0,43.0,24.1,Not applicable,,Not applicable,,Not under a federation,,10069103.0,,Not applicable,02-02-2022,08-05-2024,School Hill,Chilham,,Canterbury,Kent,CT4 8DE,www.chilham.kent.sch.uk,1227730442.0,Mrs,Delia,Cooper,Interim Executive Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Ashford,Downs North,Ashford,(England/Wales) Rural village,E10000016,606875.0,153533.0,Ashford 001,Ashford 001B,,,,,Good,South-East England and South London,,10012840696.0,,Not applicable,Not applicable,,,E02004996,E01023987,19.0, +118666,886,Kent,3139,High Halden Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,105.0,No Special Classes,19-01-2023,102.0,45.0,57.0,17.6,Not applicable,,Not applicable,,Supported by a federation,Flourish Together Federation,10069102.0,,Not applicable,24-02-2022,19-04-2024,Church Hill,High Halden,,Ashford,Kent,TN26 3JB,http://www.high-halden.kent.sch.uk/,1233850285.0,Mrs,Kelly,Burlton,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Ashford,Weald Central,Ashford,(England/Wales) Rural village,E10000016,590169.0,137144.0,Ashford 011,Ashford 011C,,,,,Good,South-East England and South London,,100062617661.0,,Not applicable,Not applicable,,,E02005006,E01024032,18.0, +118672,886,Kent,3145,Woodchurch Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,182.0,No Special Classes,19-01-2023,157.0,88.0,69.0,26.1,Not applicable,,Not applicable,,Supported by a federation,Flourish Together Federation,10069101.0,,Not applicable,17-05-2023,07-05-2024,Bethersden Road,Woodchurch,,Ashford,Kent,TN26 3QJ,http://www.woodchurch.kent.sch.uk,1233860232.0,Mrs,Kelly,Burlton,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Ashford,Weald South,Ashford,(England/Wales) Rural village,E10000016,594165.0,134993.0,Ashford 012,Ashford 012C,,,,,Good,South-East England and South London,,10012848908.0,,Not applicable,Not applicable,,,E02005007,E01024038,41.0, +118673,886,Kent,3146,Bodsham Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,103.0,No Special Classes,19-01-2023,82.0,43.0,39.0,6.1,Not applicable,,Not applicable,,Supported by a federation,The Federation of Bodsham Church of England Primary School and Saltwood Church of England Primary School,10069100.0,,Not applicable,26-05-2022,23-04-2024,School Hill,Bodsham,,Ashford,Kent,TN25 5JQ,www.bodsham.kent.sch.uk,1233750374.0,Mr,Paul,Newton,Executive Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Folkestone and Hythe,North Downs West,Folkestone and Hythe,(England/Wales) Rural hamlet and isolated dwellings,E10000016,611020.0,145724.0,Folkestone and Hythe 001,Folkestone and Hythe 001C,,,,,Good,South-East England and South London,,50010714.0,,Not applicable,Not applicable,,,E02005102,E01024545,5.0, +118675,886,Kent,3149,"Folkestone, St Martin's Church of England Primary School",Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,210.0,No Special Classes,19-01-2023,202.0,90.0,112.0,18.3,Not applicable,,Not applicable,,Supported by a federation,The Federation of St Martin's and Seabrook CEP Schools,10069099.0,,Not applicable,24-04-2015,17-04-2024,Horn Street,,,Folkestone,Kent,CT20 3JJ,http://www.stmartinsfolkestone.com,1303238888.0,Mrs,Elizabeth,Carter,Executive Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Folkestone and Hythe,Cheriton,Folkestone and Hythe,(England/Wales) Urban city and town,E10000016,618951.0,136429.0,Folkestone and Hythe 005,Folkestone and Hythe 005C,,,,,Outstanding,South-East England and South London,,50023003.0,,Not applicable,Not applicable,,,E02005106,E01024494,37.0, +118676,886,Kent,3150,"Folkestone, St Peter's Church of England Primary School",Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,105.0,No Special Classes,19-01-2023,104.0,47.0,57.0,43.3,Not applicable,,Not applicable,,Not under a federation,,10078469.0,,Not applicable,26-06-2019,13-05-2024,The Durlocks,,,Folkestone,Kent,CT19 6AL,www.stpetersfolkestone.com/,1303255400.0,Mrs,Toni,Browne,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Folkestone and Hythe,Folkestone Harbour,Folkestone and Hythe,(England/Wales) Urban city and town,E10000016,623352.0,136165.0,Folkestone and Hythe 014,Folkestone and Hythe 014A,,,,,Good,South-East England and South London,,,,Not applicable,Not applicable,,,E02006879,E01024504,45.0, +118678,886,Kent,3153,Seabrook Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,105.0,No Special Classes,19-01-2023,104.0,45.0,59.0,13.5,Not applicable,,Not applicable,,Supported by a federation,The Federation of St Martin's and Seabrook CEP Schools,10078468.0,,Not applicable,08-11-2023,17-04-2024,Seabrook Road,,,Hythe,Kent,CT21 5RL,www.seabrookprimaryschool.co.uk/,1303238429.0,Mrs,Elizabeth,Carter,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Folkestone and Hythe,Hythe,Folkestone and Hythe,(England/Wales) Urban city and town,E10000016,618674.0,134958.0,Folkestone and Hythe 005,Folkestone and Hythe 005F,,,,,Good,South-East England and South London,,50022207.0,,Not applicable,Not applicable,,,E02005106,E01024528,14.0, +118679,886,Kent,3154,Lyminge Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,210.0,No Special Classes,19-01-2023,196.0,97.0,99.0,8.7,Not applicable,,Not applicable,,Not under a federation,,10069098.0,,Not applicable,09-11-2023,04-06-2024,Church Road,Lyminge,,Folkestone,Kent,CT18 8JA,www.lymingeprimaryschool.co.uk/,1303862367.0,Mr,Matt,Day,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Folkestone and Hythe,North Downs West,Folkestone and Hythe,(England/Wales) Rural town and fringe,E10000016,616220.0,141085.0,Folkestone and Hythe 001,Folkestone and Hythe 001D,,,,,Good,South-East England and South London,,50021153.0,,Not applicable,Not applicable,,,E02005102,E01024547,17.0, +118680,886,Kent,3155,Lympne Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,210.0,No Special Classes,19-01-2023,203.0,104.0,99.0,6.4,Not applicable,,Not applicable,,Not under a federation,,10070327.0,,Not applicable,14-10-2021,24-05-2024,Octavian Drive,Lympne,,Hythe,Kent,CT21 4JG,www.lympne.kent.sch.uk,1303268041.0,Mrs,Melanie,Nash,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Folkestone and Hythe,Hythe Rural,Folkestone and Hythe,(England/Wales) Rural town and fringe,E10000016,612226.0,135150.0,Folkestone and Hythe 009,Folkestone and Hythe 009C,,,,,Good,South-East England and South London,,50012208.0,,Not applicable,Not applicable,,,E02005110,E01024536,13.0, +118681,886,Kent,3158,Stelling Minnis Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,105.0,No Special Classes,19-01-2023,83.0,48.0,35.0,18.1,Not applicable,,Not applicable,,Not under a federation,,10078467.0,,Not applicable,09-06-2022,03-06-2024,Bossingham Road,Stelling Minnis,,Canterbury,Kent,CT4 6DU,www.stelling-minnis.kent.sch.uk,1227709218.0,Mrs,Julie,Simmons,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Folkestone and Hythe,North Downs West,Folkestone and Hythe,(England/Wales) Rural hamlet and isolated dwellings,E10000016,614898.0,148564.0,Folkestone and Hythe 001,Folkestone and Hythe 001A,,,,,Good,South-East England and South London,,50014408.0,,Not applicable,Not applicable,,,E02005102,E01024490,15.0, +118682,886,Kent,3159,Stowting Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,105.0,No Special Classes,19-01-2023,103.0,52.0,51.0,7.8,Not applicable,,Not applicable,,Not under a federation,,10069097.0,,Not applicable,13-11-2019,20-03-2024,Stowting,Stowting Hill,,Ashford,Kent,TN25 6BE,http://www.stowting.kent.sch.uk,1303862375.0,Mrs,Sarah,Uden,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Folkestone and Hythe,North Downs West,Folkestone and Hythe,(England/Wales) Rural hamlet and isolated dwellings,E10000016,612365.0,142429.0,Folkestone and Hythe 001,Folkestone and Hythe 001C,,,,,Good,South-East England and South London,,50012509.0,,Not applicable,Not applicable,,,E02005102,E01024545,8.0, +118683,886,Kent,3160,Selsted Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,105.0,No Special Classes,19-01-2023,99.0,54.0,45.0,9.1,Not applicable,,Not applicable,,Not under a federation,,10069096.0,,Not applicable,02-11-2022,15-05-2024,Selsted,"Wootton Lane, Selsted",Wootton Lane,Dover,Kent,CT15 7HH,www.selstedschool.org/,1303844286.0,Mrs,Angela,Woodgate,,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Folkestone and Hythe,North Downs East,Folkestone and Hythe,(England/Wales) Rural hamlet and isolated dwellings,E10000016,622244.0,144587.0,Folkestone and Hythe 001,Folkestone and Hythe 001B,,,,,Good,South-East England and South London,,50044106.0,,Not applicable,Not applicable,,,E02005102,E01024544,9.0, +118685,886,Kent,3167,Eastry Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,218.0,No Special Classes,19-01-2023,165.0,87.0,78.0,26.8,Not applicable,,Not applicable,,Not under a federation,,10069095.0,,Not applicable,14-06-2023,08-05-2024,Cooks Lea,Eastry,,Sandwich,Kent,CT13 0LR,www.eastry.kent.sch.uk/,1304611360.0,Mrs,Sarah,Moss,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Dover,Eastry Rural,Dover,(England/Wales) Rural town and fringe,E10000016,630665.0,154869.0,Dover 002,Dover 002A,,,,,Good,South-East England and South London,,100062284627.0,,Not applicable,Not applicable,,,E02005042,E01024202,44.0, +118686,886,Kent,3168,Goodnestone Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,70.0,No Special Classes,19-01-2023,53.0,21.0,32.0,9.4,Not applicable,,Not applicable,,Not under a federation,,10069094.0,,Not applicable,17-01-2019,14-05-2024,The Street,Goodnestone,,Canterbury,Kent,CT3 1PQ,www.goodnestone.kent.sch.uk/,1304840329.0,Mrs,Victoria,Solly,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,Little Stour & Ashstone,South Thanet,(England/Wales) Rural village,E10000016,625516.0,154670.0,Dover 001,Dover 001B,,,,,Good,South-East England and South London,,100062298258.0,,Not applicable,Not applicable,,,E02005041,E01024207,5.0, +118687,886,Kent,3169,Guston Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Non-selective,180.0,No Special Classes,19-01-2023,151.0,81.0,70.0,9.3,Not applicable,,Not applicable,,Not under a federation,,10075828.0,,Not applicable,21-10-2021,16-04-2024,Burgoyne Heights,Guston,,Dover,Kent,CT15 5LR,www.guston.kent.sch.uk/,1304206847.0,Mrs,Deby,Day,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,"Guston, Kingsdown & St Margaret's-at-Cliffe",Dover,(England/Wales) Rural village,E10000016,632307.0,143088.0,Dover 012,Dover 012B,,,,,Good,South-East England and South London,,100062620447.0,,Not applicable,Not applicable,,,E02005052,E01024238,14.0, +118688,886,Kent,3171,Nonington Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,86.0,No Special Classes,19-01-2023,38.0,19.0,19.0,57.9,Not applicable,,Not applicable,,Not under a federation,,10078869.0,,Not applicable,21-04-2022,14-05-2024,Church Street,Nonington,,Dover,Kent,CT15 4LB,www.noningtonprimary.co.uk/,1304840348.0,Mrs,Victoria,Solly,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,"SEMH - Social, Emotional and Mental Health",,,,,,,,,,,,,Resourced provision,,8.0,,,South East,Dover,"Aylesham, Eythorne & Shepherdswell",Dover,(England/Wales) Rural hamlet and isolated dwellings,E10000016,625273.0,152175.0,Dover 006,Dover 006A,,,,,Requires improvement,South-East England and South London,,100062287271.0,,Not applicable,Not applicable,,,E02005046,E01024190,22.0, +118691,886,Kent,3175,Shepherdswell Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,210.0,No Special Classes,19-01-2023,202.0,104.0,98.0,11.4,Not applicable,,Not applicable,,Supported by a federation,The Federation of Shepherdswell Church of England and Eythorne Elvington,10069093.0,,Not applicable,20-10-2021,02-05-2024,Coldred Road,Shepherdswell,,DOVER,Kent,CT15 7LH,www.shepherdswell.kent.sch.uk/,1304830312.0,Mr,Mark,Lamb,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,"Aylesham, Eythorne & Shepherdswell",Dover,(England/Wales) Rural town and fringe,E10000016,626077.0,147755.0,Dover 006,Dover 006D,,,,,Good,South-East England and South London,United Kingdom,100062288370.0,,Not applicable,Not applicable,,,E02005046,E01024204,23.0, +118693,886,Kent,3178,Birchington Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,570.0,No Special Classes,19-01-2023,475.0,235.0,240.0,25.3,Not applicable,,Not applicable,,Not under a federation,,10078464.0,,Not applicable,25-09-2019,05-06-2024,Park Lane,,,Birchington,Kent,CT7 0AS,www.birchington-primary.com/,1843841046.0,Ms,Kathleen,Barham,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Thanet,Birchington South,North Thanet,(England/Wales) Urban city and town,E10000016,630372.0,168670.0,Thanet 007,Thanet 007A,,,,,Good,South-East England and South London,,100062303819.0,,Not applicable,Not applicable,,,E02005138,E01024641,120.0, +118694,886,Kent,3179,"Margate, Holy Trinity and St John's Church of England Primary School",Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,420.0,No Special Classes,19-01-2023,407.0,208.0,199.0,55.3,Not applicable,,Not applicable,,Not under a federation,,10069092.0,,Not applicable,29-03-2023,21-05-2024,St John's Road,,,Margate,Kent,CT9 1LU,www.holytrinitymargate.co.uk/,1843223237.0,Mr,Rob,Garratt,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,ASD - Autistic Spectrum Disorder,,,,,,,,,,,,,Resourced provision,16.0,16.0,,,South East,Thanet,Margate Central,North Thanet,(England/Wales) Urban city and town,E10000016,635618.0,170614.0,Thanet 001,Thanet 001G,,,,,Good,South-East England and South London,,200003082079.0,,Not applicable,Not applicable,,,E02005132,E01035317,225.0, +118695,886,Kent,3181,St Saviour's Church of England Junior School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,7.0,11,Not applicable,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,384.0,Not applicable,19-01-2023,375.0,196.0,179.0,30.9,Not applicable,,Not applicable,,Not under a federation,,10078463.0,,Not applicable,18-10-2023,13-12-2023,Elm Grove,,St. Saviour's C.E Junior School Elm Grove,Westgate on Sea,Kent,CT8 8LD,www.stsavioursjunior.com,1843831707.0,Mr,Nick,Bonell,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Thanet,Westgate-on-Sea,North Thanet,(England/Wales) Urban city and town,E10000016,632054.0,169794.0,Thanet 007,Thanet 007C,,,,,Good,South-East England and South London,,100062304387.0,,Not applicable,Not applicable,,,E02005138,E01024714,116.0, +118696,886,Kent,3182,Minster Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,420.0,No Special Classes,19-01-2023,389.0,212.0,177.0,22.1,Not applicable,,Not applicable,,Not under a federation,,10069091.0,,Not applicable,18-01-2023,23-04-2024,Molineux Road,Minster-in-Thanet,,Ramsgate,Kent,CT12 4PS,http://www.minster-ramsgate.kent.sch.uk/,1843821384.0,Mr,Paul,McCarthy,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Thanet,Thanet Villages,North Thanet,(England/Wales) Rural town and fringe,E10000016,630821.0,164492.0,Thanet 014,Thanet 014B,,,,,Good,South-East England and South London,,200001487980.0,,Not applicable,Not applicable,,,E02005145,E01024702,86.0, +118697,886,Kent,3183,Monkton Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,105.0,No Special Classes,19-01-2023,106.0,49.0,57.0,23.6,Not applicable,,Not applicable,,Not under a federation,,10069090.0,,Not applicable,30-01-2024,20-05-2024,Monkton Street,Monkton,,Ramsgate,Kent,CT12 4JQ,http://www.monkton.kent.sch.uk,1843821394.0,Mr,Paul,McCarthy,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Thanet,Thanet Villages,North Thanet,(England/Wales) Rural village,E10000016,628701.0,165070.0,Thanet 014,Thanet 014C,,,,,Good,South-East England and South London,,10022964433.0,,Not applicable,Not applicable,,,E02005145,E01024703,25.0, +118698,886,Kent,3186,St Nicholas At Wade Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,210.0,No Special Classes,19-01-2023,195.0,86.0,109.0,15.9,Not applicable,,Not applicable,,Not under a federation,,10078462.0,,Not applicable,02-10-2019,21-05-2024,Down Barton Road,St Nicholas-At-Wade,,Birchington,Kent,CT7 0PY,www.st-nicholas-birchington.kent.sch.uk/,1843847253.0,Mrs,Taralee,Kennedy,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Thanet,Thanet Villages,North Thanet,(England/Wales) Rural village,E10000016,626348.0,166666.0,Thanet 014,Thanet 014C,,,,,Good,South-East England and South London,,100062303823.0,,Not applicable,Not applicable,,,E02005145,E01024703,31.0, +118701,886,Kent,3198,Frittenden Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,105.0,No Special Classes,19-01-2023,98.0,44.0,54.0,23.5,Not applicable,,Not applicable,,Not under a federation,,10069089.0,,Not applicable,24-11-2022,26-04-2024,Frittenden Primary School,,Frittenden,Cranbrook,Kent,TN17 2DD,http://www.frittenden.kent.sch.uk,1580852250.0,Ms,nichola,costello,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Frittenden and Sissinghurst,Maidstone and The Weald,(England/Wales) Rural village,E10000016,581389.0,140963.0,Tunbridge Wells 013,Tunbridge Wells 013E,,,,,Requires improvement,South-East England and South London,,10008667029.0,,Not applicable,Not applicable,,,E02005174,E01024803,23.0, +118702,886,Kent,3199,Egerton Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,210.0,No Special Classes,19-01-2023,188.0,103.0,85.0,20.7,Not applicable,,Not applicable,,Not under a federation,,10069088.0,,Not applicable,12-10-2023,16-04-2024,Stisted Way,Egerton,,Ashford,Kent,TN27 9DR,http://www.egerton.kent.sch.uk,1233756274.0,Mrs,Julia,Walker,Interim Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Ashford,Weald North,Ashford,(England/Wales) Rural village,E10000016,590598.0,147325.0,Ashford 002,Ashford 002F,,,,,Good,South-East England and South London,,100062563941.0,,Not applicable,Not applicable,,,E02004997,E01024035,39.0, +118704,886,Kent,3201,St Lawrence Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,84.0,No Special Classes,19-01-2023,76.0,35.0,41.0,3.9,Not applicable,,Not applicable,,Not under a federation,,10078461.0,,Not applicable,28-09-2022,05-02-2024,Church Road,Stone Street,,Sevenoaks,Kent,TN15 0LN,http://www.st-lawrence-sevenoaks.kent.sch.uk,1732761393.0,Mr,Daniel,Eaton,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Seal and Weald,Sevenoaks,(England/Wales) Rural hamlet and isolated dwellings,E10000016,557394.0,154844.0,Sevenoaks 012,Sevenoaks 012A,,,,,Good,South-East England and South London,,10035185576.0,,Not applicable,Not applicable,,,E02005098,E01024458,3.0, +118705,886,Kent,3282,Boughton-under-Blean and Dunkirk Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Methodist,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,203.0,100.0,103.0,24.1,Not applicable,,Not applicable,,Not under a federation,,10078141.0,,Not applicable,11-07-2019,03-06-2024,School Lane,Boughton-under-Blean,,Faversham,Kent,ME13 9AW,www.bad.kent.sch.uk,1227751431.0,Mr,Simon,Way,,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Boughton and Courtenay,Faversham and Mid Kent,(England/Wales) Rural village,E10000016,605832.0,159483.0,Swale 017,Swale 017C,,,,,Good,South-East England and South London,,200002540885.0,,Not applicable,Not applicable,,,E02005131,E01024557,49.0, +118706,886,Kent,3284,Lady Joanna Thornhill Endowed Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,None,Does not apply,Not applicable,Not applicable,420.0,No Special Classes,19-01-2023,418.0,198.0,220.0,11.2,Not applicable,,Not applicable,,Not under a federation,,10078140.0,,Not applicable,05-02-2015,18-04-2024,Bridge Street,Wye,,Ashford,Kent,TN25 5EA,www.ladyj.kent.sch.uk/,1233812781.0,Mrs,Rachael,Foster,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Ashford,Wye with Hinxhill,Ashford,(England/Wales) Rural town and fringe,E10000016,605082.0,146710.0,Ashford 001,Ashford 001D,,,,,Outstanding,South-East England and South London,,10012868707.0,,Not applicable,Not applicable,,,E02004996,E01024040,47.0, +118707,886,Kent,3289,St Peter's Methodist Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Methodist,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,209.0,108.0,101.0,21.5,Not applicable,,Not applicable,,Not under a federation,,10078139.0,,Not applicable,12-12-2018,01-05-2024,St Peter's Grove,,,Canterbury,Kent,CT1 2DH,http://www.st-peters-canterbury.kent.sch.uk,1227464392.0,Mrs,Kristina,Dyer,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Canterbury,Westgate,Canterbury,(England/Wales) Urban city and town,E10000016,614679.0,157910.0,Canterbury 020,Canterbury 020F,,,,,Good,South-East England and South London,,200000676740.0,,Not applicable,Not applicable,,,E02006856,E01032807,45.0, +118709,886,Kent,3294,St Matthew's High Brooms Church of England Voluntary Controlled Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,420.0,No Special Classes,19-01-2023,354.0,178.0,176.0,43.2,Not applicable,,Not applicable,,Not under a federation,,10069087.0,,Not applicable,19-07-2018,15-04-2024,Powder Mill Lane,High Brooms,,Tunbridge Wells,Kent,TN4 9DY,www.st-matthews-school.org,1892528098.0,Mrs,Claire,Harris,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Southborough and High Brooms,Tunbridge Wells,(England/Wales) Urban city and town,E10000016,558927.0,141801.0,Tunbridge Wells 003,Tunbridge Wells 003D,,,,,Good,South-East England and South London,,100062586205.0,,Not applicable,Not applicable,,,E02005164,E01024847,153.0, +118710,886,Kent,3295,Herne Church of England Infant and Nursery School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,3.0,7,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,270.0,No Special Classes,19-01-2023,316.0,171.0,145.0,7.8,Not applicable,,Not applicable,,Not under a federation,,10079667.0,,Not applicable,29-09-2021,21-05-2024,Palmer Close,Herne,,Herne Bay,Kent,CT6 7AH,www.herne-infant.kent.sch.uk/,1227740793.0,Mrs,E,Thomas-Friend,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Canterbury,Herne & Broomfield,North Thanet,(England/Wales) Urban city and town,E10000016,618672.0,165903.0,Canterbury 006,Canterbury 006C,,,,,Outstanding,South-East England and South London,,200000680285.0,,Not applicable,Not applicable,,,E02005015,E01024075,21.0, +118711,886,Kent,3296,Langafel Church of England Voluntary Controlled Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,331.0,No Special Classes,19-01-2023,325.0,175.0,150.0,32.0,Not applicable,,Not applicable,,Not under a federation,,10078868.0,,Not applicable,03-10-2018,26-02-2024,Main Road,,,Longfield,Kent,DA3 7PW,www.langafel.kent.sch.uk/,1474703398.0,Mrs,Catherine,Maynard,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,Not applicable,Not applicable,Not applicable,ASD - Autistic Spectrum Disorder,,,,,,,,,,,,,Resourced provision,30.0,29.0,,,South East,Dartford,"Longfield, New Barn & Southfleet",Dartford,(England/Wales) Urban city and town,E10000016,561395.0,168619.0,Dartford 013,Dartford 013D,,,,,Good,South-East England and South London,,200000538032.0,,Not applicable,Not applicable,,,E02005040,E01024160,104.0, +118712,886,Kent,3297,Southborough CofE Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,630.0,No Special Classes,19-01-2023,615.0,309.0,306.0,17.6,Not applicable,,Not applicable,,Not under a federation,,10074251.0,,Not applicable,21-06-2018,30-04-2024,Broomhill Park Road,Southborough,,Tunbridge Wells,Kent,TN4 0JY,http://www.southborough.kent.sch.uk,1892529682.0,Mrs,Emma,Savage,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Tunbridge Wells,Southborough and High Brooms,Tunbridge Wells,(England/Wales) Urban city and town,E10000016,557592.0,141923.0,Tunbridge Wells 002,Tunbridge Wells 002C,,,,,Good,South-East England and South London,,100062585335.0,,Not applicable,Not applicable,,,E02005163,E01024846,108.0, +118713,886,Kent,3303,St Katharine's Knockholt Church of England Voluntary Aided Primary School,Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,201.0,No Special Classes,19-01-2023,170.0,80.0,90.0,4.7,Not applicable,,Not applicable,,Not under a federation,,10069086.0,,Not applicable,16-11-2022,12-09-2023,Main Road,Knockholt,,Sevenoaks,Kent,TN14 7LS,www.knockholt.kent.sch.uk/,1959532237.0,Miss,Sarah-Jane,Tormey,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,"Halstead, Knockholt and Badgers Mount",Sevenoaks,(England/Wales) Rural hamlet and isolated dwellings,E10000016,546750.0,158787.0,Sevenoaks 008,Sevenoaks 008D,,,,,Good,South-East England and South London,,100061014242.0,,Not applicable,Not applicable,,,E02005094,E01024440,8.0, +118715,886,Kent,3307,"Chevening, St Botolph's Church of England Voluntary Aided Primary School",Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,210.0,No Special Classes,19-01-2023,179.0,87.0,92.0,2.8,Not applicable,,Not applicable,,Not under a federation,,10078460.0,,Not applicable,27-11-2019,18-04-2024,Chevening Road,Chipstead,,Sevenoaks,Kent,TN13 2SA,http://www.chevening.kent.sch.uk,1732452895.0,Miss,Karen,Minnis,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,"Brasted, Chevening and Sundridge",Sevenoaks,(England/Wales) Urban city and town,E10000016,549789.0,156509.0,Sevenoaks 011,Sevenoaks 011A,,,,,Good,South-East England and South London,,10013771396.0,,Not applicable,Not applicable,,,E02005097,E01024416,5.0, +118716,886,Kent,3308,Colliers Green Church of England Primary School,Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,112.0,No Special Classes,19-01-2023,112.0,52.0,60.0,4.5,Not applicable,,Not applicable,,Not under a federation,,10069085.0,,Not applicable,07-03-2019,11-01-2024,Colliers Green,,,Cranbrook,Kent,TN17 2LR,www.colliers-green.kent.sch.uk/,1580211335.0,Dr,Josephine,Hopkins,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Goudhurst and Lamberhurst,Maidstone and The Weald,(England/Wales) Rural hamlet and isolated dwellings,E10000016,575881.0,138768.0,Tunbridge Wells 011,Tunbridge Wells 011E,,,,,Good,South-East England and South London,,10000064641.0,,Not applicable,Not applicable,,,E02005172,E01024806,5.0, +118717,886,Kent,3309,Sissinghurst Voluntary Aided Church of England Primary School,Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,175.0,No Special Classes,19-01-2023,171.0,88.0,83.0,16.4,Not applicable,,Not applicable,,Not under a federation,,10073480.0,,Not applicable,01-03-2023,03-06-2024,Common Road,Sissinghurst,,Cranbrook,Kent,TN17 2BH,www.sissinghurst.kent.sch.uk/,1580713895.0,Mrs,Sarah,Holman,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Tunbridge Wells,Frittenden and Sissinghurst,Maidstone and The Weald,(England/Wales) Rural village,E10000016,578960.0,137839.0,Tunbridge Wells 013,Tunbridge Wells 013E,,,,,Requires improvement,South-East England and South London,,10000070036.0,,Not applicable,Not applicable,,,E02005174,E01024803,28.0, +118718,886,Kent,3312,Hever Church of England Voluntary Aided Primary School,Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,205.0,No Special Classes,19-01-2023,152.0,66.0,86.0,17.1,Not applicable,,Not applicable,,Not under a federation,,10069084.0,,Not applicable,23-03-2022,29-04-2024,Hever Road,Hever,,Edenbridge,Kent,TN8 7NH,www.hever.kent.sch.uk/,1732862304.0,Mrs,Helene,Bligh,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Cowden and Hever,Tonbridge and Malling,(England/Wales) Rural hamlet and isolated dwellings,E10000016,547634.0,144758.0,Sevenoaks 015,Sevenoaks 015A,,,,,Requires improvement,South-East England and South London,,100062593515.0,,Not applicable,Not applicable,,,E02005101,E01024420,26.0, +118720,886,Kent,3314,Penshurst Church of England Voluntary Aided Primary School,Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,105.0,No Special Classes,19-01-2023,84.0,46.0,38.0,13.1,Not applicable,,Not applicable,,Not under a federation,,10069082.0,,Not applicable,17-11-2022,04-06-2024,High Street,Penshurst,,Tonbridge,Kent,TN11 8BX,www.penshurstschool.org.uk,1892870446.0,Mrs,Susan,Elliott,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,"Penshurst, Fordcombe and Chiddingstone",Tonbridge and Malling,(England/Wales) Rural village,E10000016,552486.0,143627.0,Sevenoaks 015,Sevenoaks 015D,,,,,Good,South-East England and South London,,10035181676.0,,Not applicable,Not applicable,,,E02005101,E01024456,11.0, +118721,886,Kent,3317,"Lady Boswell's Church of England Voluntary Aided Primary School, Sevenoaks",Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,436.0,No Special Classes,19-01-2023,425.0,203.0,222.0,4.9,Not applicable,,Not applicable,,Not under a federation,,10079894.0,,Not applicable,25-05-2022,24-05-2024,Plymouth Drive,,,Sevenoaks,Kent,TN13 3RW,http://www.ladyboswells.kent.sch.uk,1732452851.0,Mrs,"Hannah Pullen,",Mrs Sharon Saunders,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Sevenoaks Town and St John's,Sevenoaks,(England/Wales) Urban city and town,E10000016,553202.0,155064.0,Sevenoaks 012,Sevenoaks 012F,,,,,Outstanding,South-East England and South London,,10035184700.0,,Not applicable,Not applicable,,,E02005098,E01024471,21.0, +118722,886,Kent,3318,Ide Hill Church of England Primary School,Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,154.0,No Special Classes,19-01-2023,153.0,85.0,68.0,5.9,Not applicable,,Not applicable,,Not under a federation,,10069081.0,,Not applicable,04-04-2019,13-05-2024,Sundridge Road,Ide Hill,,Sevenoaks,Kent,TN14 6JT,https://idehill.eschools.co.uk/,1732750389.0,Miss,Elizabeth,Alexander,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Sevenoaks,"Brasted, Chevening and Sundridge",Sevenoaks,(England/Wales) Rural village,E10000016,548483.0,151962.0,Sevenoaks 013,Sevenoaks 013B,,,,,Good,South-East England and South London,,50002011896.0,,Not applicable,Not applicable,,,E02005099,E01024419,9.0, +118724,886,Kent,3320,St Barnabas CofE VA Primary School,Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,210.0,No Special Classes,19-01-2023,202.0,96.0,106.0,34.2,Not applicable,,Not applicable,,Not under a federation,,10069080.0,,Not applicable,24-01-2024,20-05-2024,Quarry Road,,,Tunbridge Wells,Kent,TN1 2EY,www.st-barnabas.kent.sch.uk/,1892522958.0,Mrs,Moira,Duncombe,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,St James',Tunbridge Wells,(England/Wales) Urban city and town,E10000016,558893.0,140276.0,Tunbridge Wells 008,Tunbridge Wells 008D,,,,,Good,South-East England and South London,,100062543182.0,,Not applicable,Not applicable,,,E02005169,E01024833,69.0, +118725,886,Kent,3322,St James' Church of England Voluntary Aided Primary School,Voluntary aided school,Local authority maintained schools,Open,Not Recorded,01-01-1900,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,630.0,No Special Classes,19-01-2023,631.0,302.0,329.0,7.8,Not applicable,,Not applicable,,Not under a federation,,10079666.0,,Not applicable,06-03-2024,22-05-2024,Sandrock Road,,,Tunbridge Wells,Kent,TN2 3PR,https://st-james.kent.sch.uk,1892523006.0,Mr,John,Tutt,Executive Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Park,Tunbridge Wells,(England/Wales) Urban city and town,E10000016,559230.0,139720.0,Tunbridge Wells 008,Tunbridge Wells 008C,,,,,Good,South-East England and South London,,10000066049.0,,Not applicable,Not applicable,,,E02005169,E01024823,49.0, +118726,886,Kent,3323,Hunton Church of England Primary School,Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Not applicable,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,105.0,No Special Classes,19-01-2023,102.0,41.0,61.0,17.6,Not applicable,,Not applicable,,Not under a federation,,10069079.0,,Not applicable,12-05-2021,15-04-2024,Bishops Lane,Hunton,,Maidstone,Kent,ME15 0SJ,http://www.hunton.kent.sch.uk,1622820360.0,Mrs,Anita,Makey,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Coxheath and Hunton,Maidstone and The Weald,(England/Wales) Rural hamlet and isolated dwellings,E10000016,571802.0,149308.0,Maidstone 018,Maidstone 018A,,,,,Good,South-East England and South London,,200003720206.0,,Not applicable,Not applicable,,,E02005085,E01024345,18.0, +118728,886,Kent,3325,Platt Church of England Voluntary Aided Primary School,Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,210.0,No Special Classes,19-01-2023,173.0,85.0,88.0,16.2,Not applicable,,Not applicable,,Not under a federation,,10069078.0,,Not applicable,24-04-2019,22-02-2024,Platinum Way,St Mary's Platt,,Sevenoaks,Kent,TN15 8FH,http://www.platt.kent.sch.uk,1732882596.0,Mrs,Emma,Smith,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,Borough Green & Platt,Tonbridge and Malling,(England/Wales) Rural town and fringe,E10000016,562312.0,157440.0,Tonbridge and Malling 006,Tonbridge and Malling 006B,,,,,Good,South-East England and South London,United Kingdom,10094697223.0,,Not applicable,Not applicable,,,E02005154,E01024724,28.0, +118730,886,Kent,3328,Bapchild and Tonge Church of England Primary School and Nursery,Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,2.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,210.0,No Special Classes,19-01-2023,245.0,136.0,109.0,11.4,Not applicable,,Not applicable,,Not under a federation,,10069077.0,,Not applicable,17-07-2019,07-05-2024,School Lane,Bapchild,,Sittingbourne,Kent,ME9 9NL,www.bapchildprimary.co.uk,1795424143.0,Mr,Christian,Kelly,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,West Downs,Sittingbourne and Sheppey,(England/Wales) Urban city and town,E10000016,592811.0,163003.0,Swale 013,Swale 013D,,,,,Good,South-East England and South London,,10035063550.0,,Not applicable,Not applicable,,,E02005127,E01024629,28.0, +118734,886,Kent,3332,Hartlip Endowed Church of England Primary School,Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,105.0,No Special Classes,19-01-2023,108.0,59.0,49.0,15.7,Not applicable,,Not applicable,,Not under a federation,,10069076.0,,Not applicable,21-04-2022,05-03-2024,The Street,Hartlip,,Sittingbourne,Kent,ME9 7TL,www.hartlip.kent.sch.uk,1795842473.0,Mrs,Tracey,Jerome,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,"Hartlip, Newington and Upchurch",Sittingbourne and Sheppey,(England/Wales) Rural village,E10000016,583965.0,164247.0,Swale 008,Swale 008A,,,,,Good,South-East England and South London,,200002532833.0,,Not applicable,Not applicable,,,E02005122,E01024570,17.0, +118735,886,Kent,3337,Tunstall Church of England (Aided) Primary School,Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,420.0,No Special Classes,19-01-2023,422.0,200.0,222.0,2.1,Not applicable,,Not applicable,,Not under a federation,,10069075.0,,Not applicable,24-05-2023,23-05-2024,Tunstall Road,,,Sittingbourne,Kent,ME10 1YG,http://www.tunstall.kent.sch.uk/,1795472895.0,Mrs,Rebecca,Andrews,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Woodstock,Sittingbourne and Sheppey,(England/Wales) Urban city and town,E10000016,589964.0,161884.0,Swale 013,Swale 013E,,,,,Outstanding,South-East England and South London,,,,Not applicable,Not applicable,,,E02005127,E01024631,9.0, +118736,886,Kent,3338,Herne Church of England Junior School,Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,7.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,360.0,No Special Classes,19-01-2023,360.0,184.0,176.0,13.6,Not applicable,,Not applicable,,Not under a federation,,10073479.0,,Not applicable,01-11-2023,25-03-2024,School Lane,Herne,,Herne Bay,Kent,CT6 7AL,http://www.herne-junior.kent.sch.uk,1227374069.0,Mr,Mal,Saunders,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Canterbury,Herne & Broomfield,North Thanet,(England/Wales) Urban city and town,E10000016,618444.0,165965.0,Canterbury 006,Canterbury 006C,,,,,Outstanding,South-East England and South London,,200000683363.0,,Not applicable,Not applicable,,,E02005015,E01024075,49.0, +118737,886,Kent,3339,Whitstable and Seasalter Endowed Church of England Junior School,Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,7.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,228.0,No Special Classes,19-01-2023,210.0,107.0,103.0,16.7,Not applicable,,Not applicable,,Not under a federation,,10073478.0,,Not applicable,07-12-2022,15-04-2024,High Street,,,Whitstable,Kent,CT5 1AY,http://www.whitstable-endowed.kent.sch.uk,1227273630.0,Miss,Ellen,Taylor,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Canterbury,Gorrell,Canterbury,(England/Wales) Urban city and town,E10000016,610765.0,166471.0,Canterbury 008,Canterbury 008C,,,,,Outstanding,South-East England and South London,,100062619665.0,,Not applicable,Not applicable,,,E02005017,E01024070,35.0, +118738,886,Kent,3340,"Ashford, St Mary's Church of England Primary School",Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,420.0,No Special Classes,19-01-2023,420.0,215.0,205.0,25.0,Not applicable,,Not applicable,,Not under a federation,,10069074.0,,Not applicable,29-01-2020,25-01-2024,Western Avenue,,,Ashford,Kent,TN23 1ND,www.st-marys-ashford.kent.sch.uk/,1233625531.0,Mrs,Nicola,Hirst,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Ashford,Victoria,Ashford,(England/Wales) Urban city and town,E10000016,600448.0,143067.0,Ashford 016,Ashford 016C,,,,,Good,South-East England and South London,,100062559492.0,,Not applicable,Not applicable,,,E02007047,E01023992,105.0, +118740,886,Kent,3346,Wittersham Church of England Primary School,Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,140.0,No Special Classes,19-01-2023,141.0,66.0,75.0,17.0,Not applicable,,Not applicable,,Not under a federation,,10069073.0,,Not applicable,28-01-2020,24-04-2024,The Street,Wittersham,,Tenterden,Kent,TN30 7EA,www.wittersham.kent.sch.uk,1797270329.0,Mr,George,Hawkins,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Ashford,Isle of Oxney,Ashford,(England/Wales) Rural village,E10000016,589703.0,126905.0,Ashford 014,Ashford 014B,,,,,Good,South-East England and South London,,100062567595.0,,Not applicable,Not applicable,,,E02005009,E01023998,24.0, +118741,886,Kent,3347,Elham Church of England Primary School,Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,140.0,No Special Classes,19-01-2023,127.0,58.0,69.0,18.1,Not applicable,,Not applicable,,Not under a federation,,10069072.0,,Not applicable,19-07-2022,25-04-2024,Vicarage Lane,Elham,,Canterbury,Kent,CT4 6TT,http://www.elhamprimary.co.uk,1303840325.0,Mr,Dan,File,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Folkestone and Hythe,North Downs East,Folkestone and Hythe,(England/Wales) Rural village,E10000016,617633.0,143734.0,Folkestone and Hythe 001,Folkestone and Hythe 001A,,,,,Good,South-East England and South London,,50021810.0,,Not applicable,Not applicable,,,E02005102,E01024490,23.0, +118744,886,Kent,3350,Saltwood CofE Primary School,Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,222.0,No Special Classes,19-01-2023,208.0,105.0,103.0,7.7,Not applicable,,Not applicable,,Supported by a federation,The Federation of Bodsham Church of England Primary School and Saltwood Church of England Primary School,10069071.0,,Not applicable,11-05-2022,29-01-2024,Grange Road,Saltwood,,Hythe,Kent,CT21 4QS,http://www.saltwood.kent.sch.uk,1303266058.0,Mr,Paul,Newton,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Folkestone and Hythe,Hythe,Folkestone and Hythe,(England/Wales) Urban city and town,E10000016,615799.0,135758.0,Folkestone and Hythe 008,Folkestone and Hythe 008D,,,,,Good,South-East England and South London,,50017103.0,,Not applicable,Not applicable,,,E02005109,E01024550,16.0, +118745,886,Kent,3351,Ash Cartwright and Kelsey Church of England Primary School,Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,210.0,No Special Classes,19-01-2023,158.0,89.0,69.0,31.5,Not applicable,,Not applicable,,Not under a federation,,10073477.0,,Not applicable,25-09-2019,15-04-2024,School Road,Ash,,Canterbury,Kent,CT3 2JD,www.ashckschool.org,1304812539.0,Mrs,Fiona,Crascall,Interim Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,Little Stour & Ashstone,South Thanet,(England/Wales) Rural town and fringe,E10000016,628453.0,158532.0,Dover 001,Dover 001A,,,,,Good,South-East England and South London,,100062298485.0,,Not applicable,Not applicable,,,E02005041,E01024206,45.0, +118748,886,Kent,3356,"Dover, St Mary's Church of England Primary School",Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,210.0,No Special Classes,19-01-2023,155.0,75.0,80.0,66.5,Not applicable,,Not applicable,,Not under a federation,,10069069.0,,Not applicable,16-11-2022,06-06-2024,Laureston Place,,,Dover,Kent,CT16 1QX,www.st-marys-dover.kent.sch.uk/,1304206887.0,Ms,Helen,Comfort,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,Town & Castle,Dover,(England/Wales) Urban city and town,E10000016,632228.0,141684.0,Dover 012,Dover 012E,,,,,Requires improvement,South-East England and South London,,100062288992.0,,Not applicable,Not applicable,,,E02005052,E01033209,103.0, +118750,886,Kent,3360,St Peter-in-Thanet CofE Junior School,Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,7.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,360.0,No Special Classes,19-01-2023,365.0,190.0,175.0,32.3,Not applicable,,Not applicable,,Not under a federation,,10073476.0,,Not applicable,11-05-2023,05-06-2024,Grange Road,St Peter's,,Broadstairs,Kent,CT10 3EP,www.stpetersthanet.co.uk,1843861430.0,Mr,Tim,Whitehouse,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Thanet,Beacon Road,South Thanet,(England/Wales) Urban city and town,E10000016,638767.0,169105.0,Thanet 009,Thanet 009A,,,,,Outstanding,South-East England and South London,,200003081114.0,,Not applicable,Not applicable,,,E02005140,E01024635,118.0, +118751,886,Kent,3364,"Ramsgate, Holy Trinity Church of England Primary School",Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,210.0,No Special Classes,19-01-2023,210.0,113.0,97.0,12.4,Not applicable,,Not applicable,,Not under a federation,,10073475.0,,Not applicable,29-09-2021,21-05-2024,Dumpton Park Drive,,,Broadstairs,Kent,CT10 1RR,www.ramsgateholytrinity.co.uk,1843860744.0,Mrs,Erin,Price,Interim Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Thanet,Viking,South Thanet,(England/Wales) Urban city and town,E10000016,639141.0,166318.0,Thanet 010,Thanet 010E,,,,,Outstanding,South-East England and South London,,200003079311.0,,Not applicable,Not applicable,,,E02005141,E01024708,26.0, +118754,886,Kent,3373,St Mary's Church of England Voluntary Aided Primary School,Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,2.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,210.0,No Special Classes,19-01-2023,247.0,128.0,119.0,41.3,Not applicable,,Not applicable,,Not under a federation,,10072082.0,,Not applicable,07-12-2022,12-09-2023,St Mary's Road,,,Swanley,Kent,BR8 7BU,http://www.st-marys-swanley.kent.sch.uk,1322665212.0,Mrs,Amanda,McGarrigle,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Swanley St Mary's,Sevenoaks,(England/Wales) Urban major conurbation,E10000016,550895.0,168371.0,Sevenoaks 002,Sevenoaks 002A,,,,,Good,South-East England and South London,,200002881970.0,,Not applicable,Not applicable,,,E02005088,E01024476,102.0, +118764,886,Kent,3722,St Ethelbert's Catholic Primary School,Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Roman Catholic,Does not apply,Archdiocese of Southwark,Not applicable,210.0,No Special Classes,19-01-2023,209.0,88.0,121.0,33.5,Not applicable,,Not applicable,,Not under a federation,,10072744.0,,Not applicable,13-06-2019,03-06-2024,"St Ethelbert's Catholic Primary School, Dane Park Road",,,Ramsgate,Kent,CT11 7LS,www.stethelbertsschool.co.uk,1843585555.0,Mr,Simon,Marshall,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Thanet,Eastcliff,South Thanet,(England/Wales) Urban city and town,E10000016,638595.0,165666.0,Thanet 012,Thanet 012A,,,,,Good,South-East England and South London,,100062282199.0,,Not applicable,Not applicable,,,E02005143,E01024669,70.0, +118765,886,Kent,3728,St Anselm's Catholic Primary School,Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Roman Catholic,Does not apply,Archdiocese of Southwark,Not applicable,210.0,No Special Classes,19-01-2023,209.0,91.0,118.0,9.6,Not applicable,,Not applicable,,Not under a federation,,10072743.0,,Not applicable,19-06-2019,21-05-2024,Littlebrook Manor Way,Temple Hill,,Dartford,Kent,DA1 5EA,http://www.st-anselms.kent.sch.uk/,1322225173.0,Mrs,Laura,White,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dartford,Temple Hill,Dartford,(England/Wales) Urban major conurbation,E10000016,555174.0,174821.0,Dartford 001,Dartford 001C,,,,,Good,South-East England and South London,,200000531818.0,,Not applicable,Not applicable,,,E02005028,E01024154,20.0, +118768,886,Kent,3733,"Our Lady's Catholic Primary School, Dartford",Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Roman Catholic,Does not apply,Archdiocese of Southwark,Not applicable,218.0,No Special Classes,19-01-2023,217.0,106.0,111.0,6.5,Not applicable,,Not applicable,,Not under a federation,,10072740.0,,Not applicable,12-02-2020,16-04-2024,King Edward Avenue,,,Dartford,Kent,DA1 2HX,http://www.our-ladys.kent.sch.uk,1322222759.0,Miss,Isabel,Quinn,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dartford,West Hill,Dartford,(England/Wales) Urban major conurbation,E10000016,553550.0,174313.0,Dartford 003,Dartford 003E,,,,,Good,South-East England and South London,,10009429007.0,,Not applicable,Not applicable,,,E02005030,E01024184,14.0, +118777,886,Kent,3749,"St Thomas' Catholic Primary School, Canterbury",Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Roman Catholic,Does not apply,Archdiocese of Southwark,Not applicable,210.0,No Special Classes,19-01-2023,209.0,108.0,101.0,18.7,Not applicable,,Not applicable,,Not under a federation,,10072737.0,,Not applicable,20-04-2023,12-09-2023,99 Military Road,,,Canterbury,Kent,CT1 1NE,www.st-thomas-canterbury.kent.sch.uk,1227462539.0,Miss,Lisa,D'Agostini,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Canterbury,Barton,Canterbury,(England/Wales) Urban city and town,E10000016,615358.0,158108.0,Canterbury 014,Canterbury 014E,,,,,Good,South-East England and South London,,200000678008.0,,Not applicable,Not applicable,,,E02005023,E01024093,39.0, +118785,886,Kent,4026,Dartford Science & Technology College,Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Girls,Does not apply,Does not apply,Not applicable,Non-selective,950.0,No Special Classes,19-01-2023,876.0,11.0,865.0,20.8,Not supported by a trust,,Not applicable,,Not under a federation,,10001855.0,,Not applicable,16-03-2022,07-05-2024,Heath Lane,,,Dartford,Kent,DA1 2LY,http://www.dstc.kent.sch.uk,1322224309.0,Miss,Joanne,Sangster,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dartford,Princes,Dartford,(England/Wales) Urban major conurbation,E10000016,553232.0,173727.0,Dartford 003,Dartford 003F,,,,,Good,South-East England and South London,,100062308838.0,,Not applicable,Not applicable,,,E02005030,E01024185,155.0, +118788,886,Kent,4040,Northfleet School for Girls,Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Girls,Does not apply,Does not apply,Not applicable,Non-selective,1145.0,No Special Classes,19-01-2023,1251.0,30.0,1221.0,33.0,Supported by a trust,Northfleet Schools Co-Operative Trust,Not applicable,,Not under a federation,,10004754.0,,Not applicable,02-03-2022,27-03-2024,Hall Road,Northfleet,,Gravesend,Kent,DA11 8AQ,http://www.nsfg.org.uk,1474831020.0,Mr,C,Norwood,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Gravesham,Painters Ash,Gravesham,(England/Wales) Urban major conurbation,E10000016,562828.0,172592.0,Gravesham 006,Gravesham 006E,,,,,Good,South-East England and South London,,100062310786.0,,Not applicable,Not applicable,,,E02005060,E01024288,334.0, +118789,886,Kent,4043,Tunbridge Wells Girls' Grammar School,Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Girls,None,Does not apply,Not applicable,Selective,1039.0,No Special Classes,19-01-2023,984.0,0.0,984.0,2.5,Not supported by a trust,,Not applicable,,Not under a federation,,10007075.0,,Not applicable,20-09-2023,17-04-2024,Southfield Road,,,Tunbridge Wells,Kent,TN4 9UJ,http://www.twggs.kent.sch.uk/,1892520902.0,Mrs,Linda,Wybar,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,St John's,Tunbridge Wells,(England/Wales) Urban city and town,E10000016,558061.0,140816.0,Tunbridge Wells 007,Tunbridge Wells 007D,,,,,Outstanding,South-East England and South London,,100062585962.0,,Not applicable,Not applicable,,,E02005168,E01024838,18.0, +118790,886,Kent,4045,Tunbridge Wells Grammar School for Boys,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Boys,Does not apply,Does not apply,Not applicable,Selective,1308.0,No Special Classes,19-01-2023,1636.0,1586.0,50.0,5.5,Not applicable,,Not applicable,,Not under a federation,,10007076.0,,Not applicable,25-11-2021,21-05-2024,St John's Road,,,Tunbridge Wells,Kent,TN4 9XB,http://www.twgsb.org.uk/,1892529551.0,Ms,Amanda,Simpson,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,St John's,Tunbridge Wells,(England/Wales) Urban city and town,E10000016,558237.0,141498.0,Tunbridge Wells 002,Tunbridge Wells 002A,,,,,Good,South-East England and South London,,10008662060.0,,Not applicable,Not applicable,,,E02005163,E01024837,71.0, +118806,886,Kent,4109,Dover Grammar School for Girls,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Girls,Does not apply,Does not apply,Not applicable,Selective,885.0,No Special Classes,19-01-2023,882.0,24.0,858.0,15.2,Not applicable,,Not applicable,,Not under a federation,,10002018.0,,Not applicable,15-11-2013,08-04-2024,Frith Road,,,Dover,Kent,CT16 2PZ,http://dggs.kent.sch.uk/,1304206625.0,Mr,Robert,Benson,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,St Radigunds,Dover,(England/Wales) Urban city and town,E10000016,631484.0,142361.0,Dover 012,Dover 012D,,,,,Outstanding,South-East England and South London,,100062289176.0,,Not applicable,Not applicable,,,E02005052,E01024247,103.0, +118835,886,Kent,4522,Maidstone Grammar School,Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Boys,None,Does not apply,Not applicable,Selective,1416.0,No Special Classes,19-01-2023,1425.0,1341.0,84.0,5.4,Not supported by a trust,,Not applicable,,Not under a federation,,10004156.0,,Not applicable,16-01-2019,15-04-2024,Barton Road,,,Maidstone,Kent,ME15 7BT,www.mgs.kent.sch.uk,1622752101.0,Mr,Mark,Tomkins,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Maidstone,High Street,Maidstone and The Weald,(England/Wales) Urban city and town,E10000016,576678.0,154844.0,Maidstone 010,Maidstone 010A,,,,,Good,South-East England and South London,,200003683439.0,,Not applicable,Not applicable,,,E02005077,E01024371,57.0, +118836,886,Kent,4523,Maidstone Grammar School for Girls,Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Girls,None,Does not apply,Not applicable,Selective,1240.0,No Special Classes,19-01-2023,1197.0,64.0,1133.0,7.4,Not supported by a trust,,Not applicable,,Not under a federation,,10004157.0,,Not applicable,08-03-2023,29-05-2024,Buckland Road,,,Maidstone,Kent,ME16 0SF,http://www.mggs.org/,1622752103.0,Miss,Deborah,Stanley,,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Bridge,Maidstone and The Weald,(England/Wales) Urban city and town,E10000016,575292.0,156397.0,Maidstone 006,Maidstone 006B,,,,,Outstanding,South-East England and South London,,200003670344.0,,Not applicable,Not applicable,,,E02005073,E01024340,65.0, +118840,886,Kent,4534,Simon Langton Girls' Grammar School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Girls,None,Does not apply,Not applicable,Selective,1082.0,No Special Classes,19-01-2023,1244.0,33.0,1211.0,6.0,Not applicable,,Not applicable,,Not under a federation,,10005848.0,,Not applicable,27-09-2023,23-04-2024,Old Dover Road,,,Canterbury,Kent,CT1 3EW,http://www.langton.kent.sch.uk/,1227463711.0,Mr,Paul,Pollard,Head of School,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Canterbury,Barton,Canterbury,(England/Wales) Urban city and town,E10000016,616129.0,156292.0,Canterbury 016,Canterbury 016C,,,,,Good,South-East England and South London,,200000682990.0,,Not applicable,Not applicable,,,E02005025,E01024046,53.0, +118843,886,Kent,4622,The Judd School,Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Boys,None,Does not apply,Not applicable,Selective,1261.0,No Special Classes,19-01-2023,1472.0,1283.0,189.0,2.7,Not applicable,,Not applicable,,Not under a federation,,10006720.0,,Not applicable,07-05-2015,23-05-2024,Brook Street,,,Tonbridge,Kent,TN9 2PN,http://judd.online,1732770880.0,Mr,Jonathan,Wood,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,ASD - Autistic Spectrum Disorder,,,,,,,,,,,,,Resourced provision,21.0,22.0,,,South East,Tonbridge and Malling,Judd,Tonbridge and Malling,(England/Wales) Urban city and town,E10000016,558333.0,145666.0,Tonbridge and Malling 013,Tonbridge and Malling 013A,,,,,Outstanding,South-East England and South London,,100062594180.0,,Not applicable,Not applicable,,,E02005161,E01024757,26.0, +118846,886,Kent,5200,Snodland CofE Primary School,Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,420.0,No Special Classes,19-01-2023,407.0,220.0,187.0,30.2,Not applicable,,Not applicable,,Not under a federation,,10069067.0,,Not applicable,19-10-2022,21-05-2024,Roberts Road,,,Snodland,Kent,ME6 5HL,www.snodland.kent.sch.uk,1634241251.0,Mrs,Holley,Hunt,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,Snodland West & Holborough Lakes,Chatham and Aylesford,(England/Wales) Urban city and town,E10000016,569746.0,161866.0,Tonbridge and Malling 002,Tonbridge and Malling 002E,,,,,Good,South-East England and South London,,200000958756.0,,Not applicable,Not applicable,,,E02005150,E01024773,123.0, +118847,886,Kent,5201,Borough Green Primary School,Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,None,Does not apply,Not applicable,Not applicable,315.0,No Special Classes,19-01-2023,265.0,131.0,134.0,22.3,Not supported by a trust,,Not applicable,,Not under a federation,,10069648.0,,Not applicable,07-03-2024,22-05-2024,School Approach,Borough Green,,Sevenoaks,Kent,TN15 8JZ,http://www.bgpschool.kent.sch.uk,1732883459.0,Mrs,Karen,Jackson,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,Borough Green & Platt,Tonbridge and Malling,(England/Wales) Rural town and fringe,E10000016,561085.0,157405.0,Tonbridge and Malling 006,Tonbridge and Malling 006C,,,,,Good,South-East England and South London,,200000965163.0,,Not applicable,Not applicable,,,E02005154,E01024725,59.0, +118849,886,Kent,5203,Roseacre Junior School,Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,7.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,None,Does not apply,Not applicable,Not applicable,396.0,No Special Classes,19-01-2023,423.0,217.0,206.0,3.3,Not supported by a trust,,Not applicable,,Not under a federation,,10069647.0,,Not applicable,03-11-2022,05-06-2024,The Landway,Bearsted,,Maidstone,Kent,ME14 4BL,http://www.roseacre.kent.sch.uk,1622737843.0,Mr,Duncan,Garrett,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Bearsted,Faversham and Mid Kent,(England/Wales) Urban city and town,E10000016,579372.0,155693.0,Maidstone 005,Maidstone 005A,,,,,Outstanding,South-East England and South London,,200003691727.0,,Not applicable,Not applicable,,,E02005072,E01024330,14.0, +118852,886,Kent,5206,Herne Bay Junior School,Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,7.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,None,Does not apply,Not applicable,Not applicable,500.0,No Special Classes,19-01-2023,426.0,210.0,216.0,42.0,Not supported by a trust,,Not applicable,,Not under a federation,,10069646.0,,Not applicable,29-01-2020,09-05-2024,Kings Road,,,Herne Bay,Kent,CT6 5DA,http://www.hernebay-jun.kent.sch.uk/,1227374608.0,Mrs,Melody,Kingman,Acting Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Canterbury,Heron,North Thanet,(England/Wales) Urban city and town,E10000016,617911.0,167922.0,Canterbury 001,Canterbury 001A,,,,,Good,South-East England and South London,,200000697542.0,,Not applicable,Not applicable,,,E02005010,E01024078,179.0, +118853,886,Kent,5207,"St Francis' Catholic Primary School, Maidstone",Voluntary aided school,Local authority maintained schools,Open,Not applicable,,,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Roman Catholic,Does not apply,Archdiocese of Southwark,Not applicable,420.0,No Special Classes,19-01-2023,418.0,194.0,224.0,15.3,Not applicable,,Not applicable,,Not under a federation,,10072733.0,,Not applicable,18-09-2018,05-06-2024,Queen's Road,,,Maidstone,Kent,ME16 0LB,www.st-francis.kent.sch.uk,1622771540.0,Mrs,Elisabeth,Blanden,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Bridge,Maidstone and The Weald,(England/Wales) Urban city and town,E10000016,574157.0,155660.0,Maidstone 003,Maidstone 003F,,,,,Good,South-East England and South London,,200003717931.0,,Not applicable,Not applicable,,,E02005070,E01024341,64.0, +118858,886,Kent,5212,Ditton Infant School,Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,7,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,None,Does not apply,Not applicable,Not applicable,180.0,No Special Classes,19-01-2023,174.0,85.0,89.0,24.1,Not supported by a trust,,Not applicable,,Not under a federation,,10078307.0,,Not applicable,05-10-2022,24-01-2024,Pear Tree Avenue,Ditton,,Aylesford,Kent,ME20 6EB,www.ditton-inf.kent.sch.uk/,1732844107.0,,Claire,Lewer,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,Aylesford South & Ditton,Chatham and Aylesford,(England/Wales) Urban city and town,E10000016,571309.0,158026.0,Tonbridge and Malling 005,Tonbridge and Malling 005C,,,,,Good,South-East England and South London,,200000961077.0,,Not applicable,Not applicable,,,E02005153,E01024735,42.0, +118859,886,Kent,5213,"Holy Trinity Church of England Primary School, Dartford",Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,420.0,No Special Classes,19-01-2023,423.0,214.0,209.0,15.6,Not applicable,,Not applicable,,Not under a federation,,10069066.0,,Not applicable,03-02-2023,29-05-2024,Chatsworth Road,,,Dartford,Kent,DA1 5AF,http://www.holytrinitydartford.co.uk,1322224474.0,Mrs,Vikki,Wall,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dartford,Burnham,Dartford,(England/Wales) Urban major conurbation,E10000016,553399.0,174917.0,Dartford 003,Dartford 003A,,,,,Good,South-East England and South London,,200000530383.0,,Not applicable,Not applicable,,,E02005030,E01024180,66.0, +118860,886,Kent,5214,"St Bartholomew's Catholic Primary School, Swanley",Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Roman Catholic,Does not apply,Archdiocese of Southwark,Not applicable,350.0,No Special Classes,19-01-2023,324.0,158.0,166.0,19.4,Not applicable,,Not applicable,,Not under a federation,,10072732.0,,Not applicable,05-05-2022,07-05-2024,Sycamore Drive,,,Swanley,Kent,BR8 7AY,http://www.st-bartholomewsrc-pri.kent.sch.uk/,1322663119.0,Mrs,Giovanna,McRae,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Swanley White Oak,Sevenoaks,(England/Wales) Urban major conurbation,E10000016,551351.0,168878.0,Sevenoaks 002,Sevenoaks 002D,,,,,Good,South-East England and South London,,100062276753.0,,Not applicable,Not applicable,,,E02005088,E01024480,63.0, +118864,886,Kent,5218,Greatstone Primary School,Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,2.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,None,Does not apply,Not applicable,Not applicable,364.0,No Special Classes,19-01-2023,300.0,141.0,159.0,24.6,Not supported by a trust,,Not applicable,,Supported by a federation,The Lightyear Federation,10069645.0,,Not applicable,25-05-2022,15-05-2024,Baldwin Road,Greatstone,,New Romney,Kent,TN28 8SY,www.greatstoneschool.co.uk,1797363916.0,Mr,Matt,Rawling,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Folkestone and Hythe,Walland & Denge Marsh,Folkestone and Hythe,(England/Wales) Rural town and fringe,E10000016,607768.0,122481.0,Folkestone and Hythe 013,Folkestone and Hythe 013A,,,,,Good,South-East England and South London,,50003937.0,,Not applicable,Not applicable,,,E02005114,E01024532,67.0, +118867,886,Kent,5221,Wincheap Foundation Primary School,Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,None,Does not apply,Not applicable,Not applicable,445.0,Not applicable,19-01-2023,432.0,219.0,213.0,31.5,Not supported by a trust,,Not applicable,,Not under a federation,,10073718.0,,Not applicable,09-12-2021,24-04-2024,Hollow Lane,,,Canterbury,Kent,CT1 3SD,www.wincheap.kent.sch.uk,1227464134.0,Mrs,Nicola,Dawson,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,"SLCN - Speech, language and Communication",,,,,,,,,,,,,Resourced provision,17.0,20.0,,,South East,Canterbury,Wincheap,Canterbury,(England/Wales) Urban city and town,E10000016,614237.0,156789.0,Canterbury 019,Canterbury 019D,,,,,Good,South-East England and South London,,10033162353.0,,Not applicable,Not applicable,,,E02006855,E01035310,136.0, +118869,886,Kent,5223,Brookfield Junior School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,7.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,256.0,No Special Classes,19-01-2023,246.0,128.0,118.0,31.3,Not applicable,,Not applicable,,Supported by a federation,Flourish,10079029.0,,Not applicable,29-03-2023,23-04-2024,Brookfield Junior School,Swallow Road,Larkfield,Aylesford,Kent,ME20 6PY,www.flourishfederation.co.uk,1732843667.0,Mr,Nathaniel,South,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,Larkfield,Chatham and Aylesford,(England/Wales) Urban city and town,E10000016,570167.0,158770.0,Tonbridge and Malling 003,Tonbridge and Malling 003F,,,,,Good,South-East England and South London,,100062628494.0,,Not applicable,Not applicable,,,E02005151,E01024765,77.0, +118871,886,Kent,5225,Harcourt Primary School,Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,None,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,178.0,87.0,91.0,34.3,Not supported by a trust,,Not applicable,,Not under a federation,,10069644.0,,Not applicable,06-10-2021,13-04-2024,Biggins Wood Road,,,Folkestone,Kent,CT19 4NE,www.harcourt.kent.sch.uk/,1303275294.0,Mr,Anthony,Silk,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Folkestone and Hythe,Cheriton,Folkestone and Hythe,(England/Wales) Urban city and town,E10000016,620022.0,137406.0,Folkestone and Hythe 002,Folkestone and Hythe 002A,,,,,Good,South-East England and South London,,50030583.0,,Not applicable,Not applicable,,,E02005103,E01024492,61.0, +118879,886,Kent,5407,Thamesview School,Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Mixed,None,Does not apply,Not applicable,Non-selective,910.0,Has Special Classes,19-01-2023,955.0,498.0,457.0,40.0,Not supported by a trust,,Not applicable,,Not under a federation,,10006569.0,,Not applicable,20-06-2018,03-06-2024,Thong Lane,,,Gravesend,Kent,DA12 4LF,http://www.thamesviewsch.co.uk/,1474566552.0,Mr,George,Rorke,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,PD - Physical Disability,,,,,,,,,,,,,Resourced provision,,,,,South East,Gravesham,Riverview Park,Gravesham,(England/Wales) Urban major conurbation,E10000016,566808.0,172052.0,Gravesham 008,Gravesham 008B,,,,,Good,South-East England and South London,,100062312649.0,,Not applicable,Not applicable,,,E02005062,E01024298,354.0, +118884,886,Kent,5412,Simon Langton Grammar School for Boys,Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Boys,None,Does not apply,Not applicable,Selective,1280.0,No Special Classes,19-01-2023,1247.0,1117.0,130.0,5.0,Not supported by a trust,,Not applicable,,Not under a federation,,10005849.0,,Not applicable,14-11-2013,28-05-2024,Langton Lane,Nackington Road,,Canterbury,Kent,CT4 7AS,http://www.thelangton.org.uk/,1227463567.0,Dr,Ken,Moffat,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,ASD - Autistic Spectrum Disorder,,,,,,,,,,,,,Resourced provision,41.0,35.0,,,South East,Canterbury,Wincheap,Canterbury,(England/Wales) Urban city and town,E10000016,615323.0,155825.0,Canterbury 019,Canterbury 019E,,,,,Outstanding,South-East England and South London,,,,Not applicable,Not applicable,,,E02006855,E01035311,39.0, +118897,886,Kent,5425,The Malling School,Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Mixed,None,Does not apply,Not applicable,Non-selective,1003.0,No Special Classes,19-01-2023,1010.0,547.0,463.0,23.0,Supported by a trust,The Malling Holmesdale Federation,Not applicable,,Not under a federation,,10006748.0,,Not applicable,29-03-2023,04-06-2024,Beech Road,East Malling,,West Malling,Kent,ME19 6DH,www.themallingschool.kent.sch.uk,1732840995.0,Mr,John,Vennart,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,"SLCN - Speech, language and Communication",ASD - Autistic Spectrum Disorder,,,,,,,,,,,,Resourced provision,124.0,121.0,,,South East,Tonbridge and Malling,"East Malling, West Malling & Offham",Tonbridge and Malling,(England/Wales) Urban city and town,E10000016,569778.0,157407.0,Tonbridge and Malling 014,Tonbridge and Malling 014A,,,,,Good,South-East England and South London,,200000960428.0,,Not applicable,Not applicable,,,E02006833,E01024740,208.0, +118898,886,Kent,5426,The Archbishop's School,Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Non-selective,900.0,No Special Classes,19-01-2023,722.0,382.0,340.0,45.6,Not supported by a trust,,Not applicable,,Not under a federation,,10006581.0,,Not applicable,23-11-2023,23-04-2024,St Stephens Hill,,,Canterbury,Kent,CT2 7AP,http://www.archbishops-school.co.uk/,1227765805.0,Mr,David,Elliott,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,SpLD - Specific Learning Difficulty,VI - Visual Impairment,OTH - Other Difficulty/Disability,HI - Hearing Impairment,"SLCN - Speech, language and Communication",ASD - Autistic Spectrum Disorder,"SEMH - Social, Emotional and Mental Health",PD - Physical Disability,MLD - Moderate Learning Difficulty,,,,,Resourced provision,7.0,7.0,,,South East,Canterbury,St Stephen's,Canterbury,(England/Wales) Urban city and town,E10000016,614417.0,159483.0,Canterbury 013,Canterbury 013B,,,,,Good,South-East England and South London,,100062619198.0,,Not applicable,Not applicable,,,E02005022,E01024100,284.0, +118919,886,Kent,5447,St George's Church of England Foundation School,Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,All-through,4.0,19,No boarders,No Nursery Classes,Has a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Non-selective,1375.0,No Special Classes,19-01-2023,1633.0,788.0,845.0,26.9,Not supported by a trust,,Not applicable,,Not under a federation,,10006163.0,,Not applicable,13-06-2019,21-05-2024,Westwood Road,,,Broadstairs,Kent,CT10 2LH,http://www.stgeorges-school.org.uk/,1843861696.0,Mr,Adam,Mirams,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Thanet,St Peters,South Thanet,(England/Wales) Urban city and town,E10000016,637425.0,167972.0,Thanet 011,Thanet 011E,,,,,Good,South-East England and South London,,200003079311.0,,Not applicable,Not applicable,,,E02005142,E01024691,404.0, +118928,886,Kent,5456,Northfleet Technology College,Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Boys,None,Does not apply,Not applicable,Non-selective,989.0,No Special Classes,19-01-2023,903.0,900.0,3.0,29.2,Supported by a trust,Northfleet Schools Co-Operative Trust,Not applicable,,Not under a federation,,10004755.0,,Not applicable,22-09-2022,21-05-2024,Colyer Road,Northfleet,,Gravesend,Kent,DA11 8BG,http://www.ntc.kent.sch.uk/,1474533802.0,Mr,Steven,Gallears,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Gravesham,Northfleet & Springhead,Gravesham,(England/Wales) Urban major conurbation,E10000016,563003.0,173050.0,Gravesham 006,Gravesham 006B,,,,,Good,South-East England and South London,,10012024936.0,,Not applicable,Not applicable,,,E02005060,E01024281,219.0, +118931,886,Kent,5459,Dover Grammar School for Boys,Foundation school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Boys,None,Does not apply,Not applicable,Selective,880.0,No Special Classes,19-01-2023,835.0,822.0,13.0,15.3,Not supported by a trust,,Not applicable,,Not under a federation,,10002017.0,,Not applicable,16-10-2019,21-05-2024,Astor Avenue,,,Dover,Kent,CT17 0DQ,http://www.dgsb.co.uk,1304206117.0,Mr,Philip,Horstrup,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,Tower Hamlets,Dover,(England/Wales) Urban city and town,E10000016,630305.0,141711.0,Dover 011,Dover 011H,,,,,Good,South-East England and South London,,10034874352.0,,Not applicable,Not applicable,,,E02005051,E01024248,103.0, +118933,886,Kent,5461,St John's Catholic Comprehensive,Voluntary aided school,Local authority maintained schools,"Open, but proposed to close",Not applicable,,Academy Converter,31-08-2024,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Mixed,Roman Catholic,Does not apply,Archdiocese of Southwark,Non-selective,1184.0,No Special Classes,19-01-2023,1294.0,663.0,631.0,22.5,Not applicable,,Not applicable,,Not under a federation,,10006200.0,,Not applicable,15-05-2018,06-06-2024,Rochester Road,,,Gravesend,Kent,DA12 2JW,http://www.stjohnscs.com,1474534718.0,Mr,Matthew,Barron,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Gravesham,Denton,Gravesham,(England/Wales) Urban major conurbation,E10000016,565876.0,173278.0,Gravesham 003,Gravesham 003C,,,,,Good,South-East England and South London,,100062311894.0,,Not applicable,Not applicable,,,E02005057,E01024293,218.0, +118937,886,Kent,6000,Ashford School,Other independent school,Independent schools,Open,Not applicable,01-01-1918,Not applicable,,Not applicable,,18,Boarding school,Has Nursery Classes,Has a sixth form,Mixed,Christian,Christian,Not applicable,Not applicable,1084.0,No Special Classes,20-01-2022,1050.0,550.0,500.0,0.0,Not applicable,,Not applicable,,Not applicable,,10008077.0,,Not applicable,,28-03-2024,East Hill,,,Ashford,Kent,TN24 8PB,https://www.ashfordschool.co.uk,1233625171.0,Mr,Michael,Hall,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Ashford,Victoria,Ashford,(England/Wales) Urban city and town,E10000016,601413.0,142875.0,Ashford 005,Ashford 005G,ISI,281.0,40.0,,,South-East England and South London,,100062560535.0,,Not applicable,Not applicable,,,E02005000,E01034986,0.0, +118938,886,Kent,6001,Wellesley Haddon Dene School,Other independent school,Independent schools,Open,Not applicable,01-01-1929,Not applicable,,Not applicable,2.0,13,Boarding school,Has Nursery Classes,Does not have a sixth form,Mixed,None,Church of England,Not applicable,Not applicable,320.0,No Special Classes,20-01-2022,210.0,126.0,84.0,0.0,Not applicable,,Not applicable,,Not applicable,,10015812.0,,Not applicable,,22-04-2024,114 Ramsgate Road,Broadstairs,Kent,,,CT10 2DG,www.wellesleyhouse.org,1843862991.0,Mrs,Joanne,Parpworth,Headmaster,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Thanet,Viking,South Thanet,(England/Wales) Urban city and town,E10000016,638726.0,167390.0,Thanet 010,Thanet 010C,ISI,3.0,20.0,Alpha Schools,,South-East England and South London,,200003079311.0,,Not applicable,Not applicable,,,E02005141,E01024706,0.0, +118939,886,Kent,6002,Benenden School,Other independent school,Independent schools,Open,Not applicable,01-01-1926,Not applicable,,Not applicable,10.0,19,Boarding school,No Nursery Classes,Has a sixth form,Girls,None,None,Not applicable,Not applicable,620.0,No Special Classes,20-01-2022,546.0,0.0,546.0,0.0,Not applicable,,Not applicable,,Not applicable,,10014830.0,,Not applicable,,07-05-2024,Cranbrook Road,Benenden,,Cranbrook,Kent,TN17 4AA,http://www.benenden.school,1580240592.0,Mrs,S,Price,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Benenden and Cranbrook,Maidstone and The Weald,(England/Wales) Rural village,E10000016,580246.0,133803.0,Tunbridge Wells 014,Tunbridge Wells 014A,ISI,,127.0,Benenden School (Kent) Ltd,,South-East England and South London,,100062552564.0,,Not applicable,Not applicable,,,E02005175,E01024789,0.0, +118940,886,Kent,6003,Dover College,Other independent school,Independent schools,Open,Not applicable,01-01-1909,Not applicable,,Not applicable,3.0,18,Boarding school,Has Nursery Classes,Has a sixth form,Mixed,Church of England,Church of England,Not applicable,Non-selective,478.0,No Special Classes,20-01-2022,313.0,172.0,141.0,0.0,Not applicable,,Not applicable,,Not applicable,,10008199.0,,Not applicable,,03-05-2024,Effingham Crescent,,,Dover,Kent,CT17 9RH,www.dovercollege.org.uk,1304205969.0,Mr,Simon,Fisher,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Dover,Town & Castle,Dover,(England/Wales) Urban city and town,E10000016,631537.0,141684.0,Dover 013,Dover 013B,ISI,,110.0,Corporation of Dover College,,South-East England and South London,,100062290526.0,,Not applicable,Not applicable,,,E02005053,E01024215,0.0, +118941,886,Kent,6004,Northbourne Park School,Other independent school,Independent schools,Open,Not applicable,01-01-1942,Not applicable,,Not applicable,2.0,13,Boarding school,Has Nursery Classes,Does not have a sixth form,Mixed,Church of England,Church of England,Not applicable,Non-selective,205.0,No Special Classes,20-01-2022,193.0,99.0,94.0,0.0,Not applicable,,Not applicable,,Not applicable,,10018503.0,,Not applicable,,30-01-2024,Betteshanger,,,DEAL,Kent,CT14 0NW,http://www.northbournepark.com,1304611215.0,Mr,Mark,Hammond,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Dover,Eastry Rural,Dover,(England/Wales) Rural village,E10000016,631045.0,152538.0,Dover 005,Dover 005A,ISI,,38.0,,,South-East England and South London,,10034873947.0,,Not applicable,Not applicable,,,E02005045,E01024201,0.0, +118942,886,Kent,6005,Marlborough House School,Other independent school,Independent schools,Open,Not applicable,01-01-1932,Not applicable,,Not applicable,2.0,13,Boarding school,Has Nursery Classes,Does not have a sixth form,Mixed,None,Christian,Not applicable,Non-selective,350.0,No Special Classes,20-01-2022,248.0,119.0,129.0,0.0,Not applicable,,Not applicable,,Not applicable,,10018722.0,,Not applicable,,04-06-2024,Hawkhurst,,,Cranbrook,Kent,TN18 4PY,www.marlboroughhouseschool.co.uk,1580753555.0,Mr,Eddy,Newton,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Hawkhurst and Sandhurst,Tunbridge Wells,(England/Wales) Rural hamlet and isolated dwellings,E10000016,575350.0,130678.0,Tunbridge Wells 014,Tunbridge Wells 014E,ISI,,63.0,Marlborough House Sch Trust Ltd,,South-East England and South London,,100062106196.0,,Not applicable,Not applicable,,,E02005175,E01024810,0.0, +118943,886,Kent,6006,St Ronan's School,Other independent school,Independent schools,Open,Not applicable,01-01-1917,Not applicable,,Not applicable,2.0,13,Boarding school,Has Nursery Classes,Does not have a sixth form,Mixed,None,Church of England,Not applicable,Non-selective,468.0,No Special Classes,20-01-2022,455.0,241.0,214.0,0.0,Not applicable,,Not applicable,,Not applicable,,10017665.0,,Not applicable,,04-06-2024,Water Lane,Hawkhurst,,Cranbrook,Kent,TN18 5DJ,www.saintronans.co.uk,1580752271.0,Mr,William,Trelawney-Vernon,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Hawkhurst and Sandhurst,Tunbridge Wells,(England/Wales) Rural hamlet and isolated dwellings,E10000016,577801.0,130807.0,Tunbridge Wells 014,Tunbridge Wells 014E,ISI,,85.0,St Ronan's (Hawkhurst),,South-East England and South London,,10024135777.0,,Not applicable,Not applicable,,,E02005175,E01024810,0.0, +118944,886,Kent,6007,Gad's Hill School,Other independent school,Independent schools,Open,Not applicable,01-01-1948,Not applicable,,Not applicable,3.0,16,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,None,None,Not applicable,Non-selective,755.0,No Special Classes,20-01-2022,384.0,194.0,190.0,0.0,Not applicable,,Not applicable,,Not applicable,,10015390.0,,Not applicable,,15-05-2024,Higham,,,Rochester,Kent,ME3 7PA,www.gadshill.org,1474822366.0,Mr,Paul,Savage,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Gravesham,Higham & Shorne,Gravesham,(England/Wales) Rural town and fringe,E10000016,570991.0,170882.0,Gravesham 010,Gravesham 010B,ISI,6.0,30.0,Gad's Hill School,,South-East England and South London,,10012012444.0,,Not applicable,Not applicable,,,E02005064,E01024266,0.0, +118946,886,Kent,6009,Kent College Pembury,Other independent school,Independent schools,Open,Not applicable,01-01-1933,Not applicable,,Not applicable,3.0,20,Boarding school,Has Nursery Classes,Has a sixth form,Girls,Methodist,Methodist,Not applicable,Selective,678.0,No Special Classes,20-01-2022,512.0,19.0,493.0,0.0,Not applicable,,Not applicable,,Not applicable,,10008307.0,,Not applicable,,08-05-2024,Old Church Road,Pembury,,Tunbridge Wells,Kent,TN2 4AX,http://www.kent-college.co.uk/,1892822006.0,Miss,Katrina,Handford,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Pembury,Tunbridge Wells,(England/Wales) Rural hamlet and isolated dwellings,E10000016,562692.0,143044.0,Tunbridge Wells 004,Tunbridge Wells 004B,ISI,7.0,155.0,Methodist Independent Schools Trust,,South-East England and South London,,10008667752.0,,Not applicable,Not applicable,,,E02005165,E01024825,0.0, +118947,886,Kent,6010,St Lawrence College,Other independent school,Independent schools,Open,Not applicable,01-01-1912,Not applicable,,Not applicable,10.0,18,Boarding school,No Nursery Classes,Has a sixth form,Mixed,Christian/Evangelical,Church of England,Not applicable,Not applicable,500.0,No Special Classes,20-01-2022,409.0,218.0,191.0,0.0,Not applicable,,Not applicable,,Not applicable,,10017219.0,,Not applicable,,18-04-2024,College Road,,,Ramsgate,Kent,CT11 7AE,www.slcuk.com,1843572900.0,Mr,Barney,Durrant,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Thanet,Eastcliff,South Thanet,(England/Wales) Urban city and town,E10000016,637926.0,165987.0,Thanet 015,Thanet 015C,ISI,1.0,,Corporation of St Lawrence College,,South-East England and South London,,100062281951.0,,Not applicable,Not applicable,,,E02005146,E01024668,0.0, +118949,886,Kent,6011,Beechwood School,Other independent school,Independent schools,Open,Not applicable,01-01-1943,Not applicable,,Not applicable,3.0,19,Boarding school,Has Nursery Classes,Has a sixth form,Mixed,None,Christian,Not applicable,Non-selective,420.0,No Special Classes,20-01-2022,309.0,161.0,148.0,0.0,Not applicable,,Not applicable,,Not applicable,,10014837.0,,Not applicable,,07-06-2024,12 Pembury Road,,,Tunbridge Wells,Kent,TN2 3QD,http://www.beechwood.org.uk,1892532747.0,Mr,Justin,Foster-Gandey,Headmaster,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Park,Tunbridge Wells,(England/Wales) Urban city and town,E10000016,560091.0,139893.0,Tunbridge Wells 009,Tunbridge Wells 009B,ISI,,64.0,Alpha Schools,,South-East England and South London,,100062554131.0,,Not applicable,Not applicable,,,E02005170,E01024822,0.0, +118950,886,Kent,6012,Holmewood House School,Other independent school,Independent schools,Open,Not applicable,01-01-1951,Not applicable,,Not applicable,2.0,13,Boarding school,Has Nursery Classes,Does not have a sixth form,Mixed,None,None,Not applicable,Non-selective,540.0,No Special Classes,20-01-2022,449.0,242.0,207.0,0.0,Not applicable,,Not applicable,,Not applicable,,10015872.0,,Not applicable,,07-06-2024,Barrow Lane,Langton Green,,Tunbridge Wells,Kent,TN3 0EB,www.holmewoodhouse.co.uk,1892860000.0,Mrs,Ruth,O'Sullivan,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Speldhurst and Bidborough,Tunbridge Wells,(England/Wales) Urban city and town,E10000016,555212.0,138621.0,Tunbridge Wells 006,Tunbridge Wells 006C,ISI,4.0,139.0,,,South-East England and South London,,100062108061.0,,Not applicable,Not applicable,,,E02005167,E01024852,0.0, +118951,886,Kent,6013,Rose Hill School,Other independent school,Independent schools,Open,Not applicable,01-01-1949,Not applicable,,Not applicable,3.0,13,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,None,None,Not applicable,Not applicable,320.0,No Special Classes,20-01-2022,265.0,154.0,111.0,0.0,Not applicable,,Not applicable,,Not applicable,,10018845.0,,Not applicable,,15-05-2024,Coniston Avenue,,,Tunbridge Wells,Kent,TN4 9SY,,1892525591.0,Ms,Emma,Neville,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Culverden,Tunbridge Wells,(England/Wales) Urban city and town,E10000016,557231.0,140251.0,Tunbridge Wells 007,Tunbridge Wells 007B,ISI,6.0,82.0,Grange Rose Hill School Ltd,,South-East England and South London,,100062585961.0,,Not applicable,Not applicable,,,E02005168,E01024800,0.0, +118952,886,Kent,6014,Sevenoaks School,Other independent school,Independent schools,Open,Not applicable,01-01-1918,Not applicable,,Not applicable,11.0,18,Boarding school,No Nursery Classes,Has a sixth form,Mixed,None,None,Not applicable,Not applicable,1250.0,No Special Classes,20-01-2022,1181.0,624.0,557.0,0.0,Not applicable,,Not applicable,,Not applicable,,10005765.0,,Not applicable,,08-05-2024,High Street,Sevenoaks,Kent,Sevenoaks,Kent,TN13 1HU,www.sevenoaksschool.org,1732455133.0,Mr,Jesse,Elzinga,Head,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Sevenoaks Town and St John's,Sevenoaks,(England/Wales) Urban city and town,E10000016,553207.0,154098.0,Sevenoaks 012,Sevenoaks 012F,ISI,,169.0,,,South-East England and South London,,100062546708.0,,Not applicable,Not applicable,,,E02005098,E01024471,0.0, +118953,886,Kent,6015,Sevenoaks Preparatory School,Other independent school,Independent schools,Open,Not applicable,26-03-1958,Not applicable,,Not applicable,3.0,14,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,None,Church of England,Not applicable,Non-selective,444.0,No Special Classes,20-01-2022,381.0,181.0,200.0,0.0,Not applicable,,Not applicable,,Not applicable,,10017399.0,,Not applicable,,09-04-2024,Fawke Cottage,Godden Green,,Sevenoaks,Kent,TN15 0JU,http://www.theprep.org.uk,1732762336.0,Mr,Luke,Harrison,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Seal and Weald,Sevenoaks,(England/Wales) Rural hamlet and isolated dwellings,E10000016,555440.0,154482.0,Sevenoaks 012,Sevenoaks 012A,ISI,,63.0,,,South-East England and South London,,10035182256.0,,Not applicable,Not applicable,,,E02005098,E01024458,0.0, +118954,886,Kent,6016,St Michael's Prep School,Other independent school,Independent schools,Open,Not applicable,01-01-1945,Not applicable,,Not applicable,2.0,13,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,None,Church of England,Not applicable,Non-selective,488.0,No Special Classes,20-01-2022,476.0,244.0,232.0,0.0,Not applicable,,Not applicable,,Not applicable,,10018594.0,,Not applicable,,02-05-2024,St Michael's Preparatory School,Otford Court,Row Dow,Otford,,TN14 5RY,www.stmichaels.kent.sch.uk,1959522137.0,Mr,Nik,Pears,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Otford and Shoreham,Sevenoaks,(England/Wales) Rural town and fringe,E10000016,554260.0,159647.0,Sevenoaks 009,Sevenoaks 009D,ISI,2.0,71.0,,,South-East England and South London,United Kingdom,10035184625.0,,Not applicable,Not applicable,,,E02005095,E01024453,0.0, +118955,886,Kent,6017,The New Beacon School,Other independent school,Independent schools,Open,Not applicable,01-01-1917,Not applicable,,Not applicable,2.0,14,Boarding school,Has Nursery Classes,Does not have a sixth form,Boys,None,None,Not applicable,Non-selective,397.0,No Special Classes,20-01-2022,348.0,347.0,1.0,0.0,Not applicable,,Not applicable,,Not applicable,,10017253.0,,Not applicable,,29-04-2024,Brittains Lane,,,Sevenoaks,Kent,TN13 2PB,www.newbeacon.org.uk,1732452131.0,Mrs,Sarah,Brownsdon,Headmaster,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Sevenoaks Kippington,Sevenoaks,(England/Wales) Urban city and town,E10000016,552009.0,153717.0,Sevenoaks 011,Sevenoaks 011E,ISI,1.0,77.0,Tonbridge School of High Street,,South-East England and South London,,100062074386.0,,Not applicable,Not applicable,,,E02005097,E01024464,0.0, +118957,886,Kent,6018,Radnor House Sevenoaks,Other independent school,Independent schools,Open,New Provision,26-02-1997,Not applicable,,Not applicable,2.0,18,No boarders,Has Nursery Classes,Has a sixth form,Mixed,None,None,Not applicable,Selective,750.0,No Special Classes,20-01-2022,533.0,308.0,225.0,0.0,Not applicable,,Not applicable,,Not applicable,,10008175.0,,Not applicable,,25-04-2024,Combe Bank Drive,Sevenoaks,,,Kent,TN14 6AE,www.radnor-sevenoaks.org,1959563720.0,Mr,David,Paton,Head,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,"Brasted, Chevening and Sundridge",Sevenoaks,(England/Wales) Rural village,E10000016,548115.0,155824.0,Sevenoaks 013,Sevenoaks 013A,ISI,,37.0,Radnor House Sevenoaks (Holdings) Ltd,,South-East England and South London,United Kingdom,10035181671.0,,Not applicable,Not applicable,,,E02005099,E01024417,0.0, +118958,886,Kent,6019,Sutton Valence School,Other independent school,Independent schools,Open,Not applicable,01-01-1908,Not applicable,,Not applicable,2.0,19,Boarding school,Has Nursery Classes,Has a sixth form,Mixed,Christian,Christian,Not applicable,Not applicable,880.0,No Special Classes,20-01-2022,868.0,516.0,352.0,0.0,Not applicable,,Not applicable,,Not applicable,,10017608.0,,Not applicable,,15-05-2024,North Street,Sutton Valence,,Maidstone,Kent,ME17 3HL,http://www.svs.org.uk/index.html,1622845203.0,Mr,James,Thomas,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Maidstone,Sutton Valence and Langley,Faversham and Mid Kent,(England/Wales) Rural village,E10000016,581234.0,149347.0,Maidstone 017,Maidstone 017D,ISI,2.0,29.0,United Westminster Grey Coat Foundation,,South-East England and South London,,200003719418.0,,Not applicable,Not applicable,,,E02005084,E01024411,0.0, +118959,886,Kent,6020,Tonbridge School,Other independent school,Independent schools,Open,Not applicable,01-01-1918,Not applicable,,Not applicable,13.0,18,Boarding school,No Nursery Classes,Has a sixth form,Boys,None,Church of England,Not applicable,Not applicable,820.0,No Special Classes,20-01-2022,794.0,794.0,0.0,0.0,Not applicable,,Not applicable,,Not applicable,,10006936.0,,Not applicable,,10-05-2024,,,,Tonbridge,Kent,TN9 1JP,www.tonbridge-school.co.uk,1732365555.0,Mr,James,Priory,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,Judd,Tonbridge and Malling,(England/Wales) Urban city and town,E10000016,559065.0,147021.0,Tonbridge and Malling 012,Tonbridge and Malling 012A,ISI,,150.0,,,South-East England and South London,,200000969928.0,,Not applicable,Not applicable,,,E02005160,E01024732,0.0, +118960,886,Kent,6021,Somerhill,Other independent school,Independent schools,Open,Not applicable,01-01-1935,Not applicable,,Not applicable,2.0,13,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,None,Christian,Not applicable,Non-selective,654.0,No Special Classes,20-01-2022,608.0,383.0,225.0,0.0,Not applicable,,Not applicable,,Not applicable,,10018591.0,,Not applicable,,21-05-2024,Tudeley Road,Tonbridge,Kent,,,TN11 0NJ,www.somerhill.org,1732352124.0,Mr,Duncan,Sinclair,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Capel,Tunbridge Wells,(England/Wales) Rural hamlet and isolated dwellings,E10000016,560772.0,145340.0,Tunbridge Wells 001,Tunbridge Wells 001A,ISI,,41.0,Somerhill Charitable Trust Limited,,South-East England and South London,,10008663663.0,,Not applicable,Not applicable,,,E02005162,E01024798,0.0, +118965,886,Kent,6024,Steephill School,Other independent school,Independent schools,Open,Not applicable,09-10-1957,Not applicable,,Not applicable,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,None,Church of England,Not applicable,Non-selective,125.0,No Special Classes,20-01-2022,132.0,59.0,73.0,0.0,Not applicable,,Not applicable,,Not applicable,,10070236.0,,Not applicable,,03-04-2024,Off Castle Hill,Fawkham,,Longfield,Kent,DA3 7BG,www.steephill.co.uk,1474702107.0,Mr,John,Abbott,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Fawkham and West Kingsdown,Sevenoaks,(England/Wales) Urban city and town,E10000016,559847.0,168076.0,Sevenoaks 007,Sevenoaks 007C,ISI,1.0,38.0,,,South-East England and South London,,10035182828.0,,Not applicable,Not applicable,,,E02005093,E01024437,0.0, +118967,886,Kent,6026,Bronte School,Other independent school,Independent schools,Open,Not applicable,17-10-1957,Not applicable,,Not applicable,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,None,Church of England,Not applicable,Not applicable,160.0,No Special Classes,20-01-2022,148.0,72.0,76.0,0.0,Not applicable,,Not applicable,,Not applicable,,10070235.0,,Not applicable,,04-06-2024,7 Pelham Road,,,Gravesend,Kent,DA11 0HN,,1474533805.0,Mrs,Emma,Wood,Headmistress,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Gravesham,Pelham,Gravesham,(England/Wales) Urban major conurbation,E10000016,564341.0,173911.0,Gravesham 002,Gravesham 002C,ISI,1.0,18.0,Nicholas Clements,,South-East England and South London,,200001873251.0,,Not applicable,Not applicable,,,E02005056,E01024290,0.0, +118971,886,Kent,6029,The Granville School,Other independent school,Independent schools,Open,Not applicable,31-03-1958,Not applicable,,Not applicable,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,None,Inter- / non- denominational,Not applicable,Non-selective,215.0,No Special Classes,20-01-2022,162.0,7.0,155.0,0.0,Not applicable,,Not applicable,,Not applicable,,10080538.0,,Not applicable,,29-05-2024,2 Bradbourne Park Road,,,Sevenoaks,Kent,TN13 3LJ,www.granvilleschool.org,1732453039.0,Mrs,Louise,Lawrance,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Sevenoaks Town and St John's,Sevenoaks,(England/Wales) Urban city and town,E10000016,552345.0,155661.0,Sevenoaks 012,Sevenoaks 012E,ISI,,13.0,,,South-East England and South London,,100062546713.0,,Not applicable,Not applicable,,,E02005098,E01024470,0.0, +118973,886,Kent,6031,Hilden Grange School,Other independent school,Independent schools,Open,Not applicable,01-01-1957,Not applicable,,Not applicable,2.0,13,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,None,Church of England,Not applicable,Selective,370.0,No Special Classes,20-01-2022,298.0,193.0,105.0,0.0,Not applicable,,Not applicable,,Not applicable,,10018656.0,,Not applicable,,11-04-2024,Dry Hill Park Road,,,Tonbridge,Kent,TN10 3BX,www.hildengrange.co.uk,1732352706.0,Mr,Malcolm,Gough,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,Cage Green & Angel,Tonbridge and Malling,(England/Wales) Urban city and town,E10000016,558953.0,147481.0,Tonbridge and Malling 012,Tonbridge and Malling 012A,ISI,1.0,84.0,Inspired Education Group,,South-East England and South London,,100062543570.0,,Not applicable,Not applicable,,,E02005160,E01024732,0.0, +118974,886,Kent,6032,Hilden Oaks Preparatory School and Nursery,Other independent school,Independent schools,Open,Not applicable,17-10-1957,Not applicable,,Not applicable,,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,None,None,Not applicable,Non-selective,222.0,No Special Classes,20-01-2022,166.0,70.0,96.0,0.0,Not applicable,,Not applicable,,Not applicable,,10080536.0,,Not applicable,,22-05-2024,38 Dry Hill Park Road,,,Tonbridge,Kent,TN10 3BU,www.hildenoaks.co.uk,1732353941.0,Mrs,Katy,Joiner,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,Cage Green & Angel,Tonbridge and Malling,(England/Wales) Urban city and town,E10000016,558953.0,147481.0,Tonbridge and Malling 012,Tonbridge and Malling 012B,ISI,,27.0,Derick Walker,,South-East England and South London,,100062543569.0,,Not applicable,Not applicable,,,E02005160,E01024733,0.0, +118975,886,Kent,6033,The Mead School,Other independent school,Independent schools,Open,Not applicable,16-10-1957,Not applicable,,Not applicable,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Christian,Christian,Not applicable,Non-selective,250.0,No Special Classes,20-01-2022,238.0,111.0,127.0,0.0,Not applicable,,Not applicable,,Not applicable,,10080535.0,,Not applicable,,10-04-2024,16 Frant Road,,,Tunbridge Wells,Kent,TN2 5SN,www.themeadschool.co.uk,1892525837.0,Mrs,Catherine,Openshaw,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Pantiles and St Mark's,Tunbridge Wells,(England/Wales) Urban city and town,E10000016,558193.0,138430.0,Tunbridge Wells 012,Tunbridge Wells 012B,ISI,2.0,19.0,The Mead School Ltd,,South-East England and South London,,10000066049.0,,Not applicable,Not applicable,,,E02005173,E01024817,0.0, +118977,886,Kent,6035,Chartfield School,Other independent school,Independent schools,Open,Not applicable,08-10-1957,Not applicable,,Not applicable,2.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,None,Christian,Not applicable,Non-selective,84.0,No Special Classes,20-01-2022,42.0,22.0,20.0,0.0,Not applicable,,Not applicable,,Not applicable,,10080534.0,,Not applicable,21-09-2023,20-02-2024,45 Minster Road,,,Westgate-on-Sea,Kent,CT8 8DA,www.chartfieldschool.org.uk,1843831716.0,Miss,Sarah,Neale,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Thanet,Westgate-on-Sea,North Thanet,(England/Wales) Urban city and town,E10000016,632551.0,169556.0,Thanet 007,Thanet 007E,Ofsted,,5.0,Chartfield School Ltd,Requires improvement,South-East England and South London,,,,Not applicable,Not applicable,,,E02005138,E01024716,0.0, +118978,886,Kent,6036,Bethany School,Other independent school,Independent schools,Open,Not applicable,06-11-1951,Not applicable,,Not applicable,11.0,18,Boarding school,No Nursery Classes,Has a sixth form,Mixed,Christian,Christian,Not applicable,Non-selective,450.0,No Special Classes,20-01-2022,348.0,234.0,114.0,0.0,Not applicable,,Not applicable,,Not applicable,,10013351.0,,Not applicable,,24-04-2024,Goudhurst,,,Cranbrook,Kent,TN17 1LB,http://www.bethanyschool.org.uk,1580211273.0,Mr,Francie,Healy,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Goudhurst and Lamberhurst,Tunbridge Wells,(England/Wales) Rural hamlet and isolated dwellings,E10000016,573928.0,140377.0,Tunbridge Wells 011,Tunbridge Wells 011E,ISI,,240.0,Bethany School Limited,,South-East England and South London,,10008665682.0,,Not applicable,Not applicable,,,E02005172,E01024806,0.0, +118981,886,Kent,6038,Solefield School,Other independent school,Independent schools,Open,Not applicable,07-10-1957,Not applicable,,Not applicable,3.0,13,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,None,Church of England,Not applicable,Non-selective,190.0,No Special Classes,20-01-2022,151.0,151.0,0.0,0.0,Not applicable,,Not applicable,,Not applicable,,10018776.0,,Not applicable,,08-05-2024,Solefields Road,,,Sevenoaks,Kent,TN13 1PH,http://www.solefieldschool.org,1732452142.0,Mrs,Helen,McClure,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Sevenoaks Kippington,Sevenoaks,(England/Wales) Urban city and town,E10000016,553072.0,153650.0,Sevenoaks 012,Sevenoaks 012C,ISI,4.0,55.0,,,South-East England and South London,,,,Not applicable,Not applicable,,,E02005098,E01024462,0.0, +118984,886,Kent,6039,Russell House School,Other independent school,Independent schools,Open,Not applicable,01-01-1952,Not applicable,,Not applicable,2.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,None,None,Not applicable,Non-selective,218.0,No Special Classes,20-01-2022,183.0,88.0,95.0,0.0,Not applicable,,Not applicable,,Not applicable,,10071116.0,,Not applicable,,23-05-2024,Station Road,Otford,,Sevenoaks,Kent,TN14 5QU,www.russellhouseschool.co.uk,1959522352.0,Mr,Craig,McCarthy,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Otford and Shoreham,Sevenoaks,(England/Wales) Rural hamlet and isolated dwellings,E10000016,552991.0,159400.0,Sevenoaks 009,Sevenoaks 009D,ISI,1.0,12.0,Dr Yvonne Lindsay RHS Ltd,,South-East England and South London,,100062621727.0,,Not applicable,Not applicable,,,E02005095,E01024453,0.0, +118986,886,Kent,6040,St Lawrence College Junior School,Other independent school,Independent schools,Open,Not applicable,01-01-1954,Not applicable,,Not applicable,2.0,11,Boarding school,Has Nursery Classes,Does not have a sixth form,Mixed,None,Church of England/Christian,Not applicable,Not applicable,220.0,No Special Classes,20-01-2022,160.0,98.0,62.0,0.0,Not applicable,,Not applicable,,Not applicable,,10080532.0,,Not applicable,,07-05-2024,College Road,,,Ramsgate,Kent,CT11 7AF,https://www.slcuk.com/,1843572912.0,Mrs,Ellen,Rowe,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Thanet,Eastcliff,South Thanet,(England/Wales) Urban city and town,E10000016,637926.0,165987.0,Thanet 015,Thanet 015C,ISI,,36.0,Corporation of St Lawrence College,,South-East England and South London,,100062099015.0,,Not applicable,Not applicable,,,E02005146,E01024668,0.0, +118990,886,Kent,6043,The Dulwich School Cranbrook,Other independent school,Independent schools,Open,Not applicable,01-01-1920,Not applicable,,Not applicable,2.0,16,Boarding school,Has Nursery Classes,Does not have a sixth form,Mixed,None,Christian,Not applicable,Non-selective,592.0,No Special Classes,20-01-2022,343.0,175.0,168.0,0.0,Not applicable,,Not applicable,,Not applicable,,10018413.0,,Not applicable,,08-05-2024,Coursehorn,,,CRANBROOK,Kent,TN17 3NP,www.dulwichcranbrook.org,1580712179.0,Mrs,Sophie,Bradshaw,Headmaster,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Benenden and Cranbrook,Maidstone and The Weald,(England/Wales) Rural hamlet and isolated dwellings,E10000016,579266.0,135858.0,Tunbridge Wells 013,Tunbridge Wells 013A,ISI,1.0,119.0,Dulwich Prep Cranbrook,,South-East England and South London,,10000064585.0,,Not applicable,Not applicable,,,E02005174,E01024787,0.0, +118991,886,Kent,6044,Cobham Hall,Other independent school,Independent schools,Open,Not applicable,18-10-1962,Not applicable,,Not applicable,11.0,19,Boarding school,No Nursery Classes,Has a sixth form,Mixed,None,None,Not applicable,Non-selective,250.0,No Special Classes,20-01-2022,137.0,1.0,136.0,0.0,Not applicable,,Not applicable,,Not applicable,,10001524.0,,Not applicable,,23-04-2024,Cobham Hall,Brewers Road,Gravesend,,Kent,DA12 3BL,www.cobhamhall.com,1474823371.0,Headteacher,Wendy,Barrett,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Gravesham,"Istead Rise, Cobham & Luddesdown",Gravesham,(England/Wales) Rural hamlet and isolated dwellings,E10000016,568367.0,168915.0,Gravesham 010,Gravesham 010E,ISI,3.0,27.0,The Mill Hill School Foundation,,South-East England and South London,United Kingdom,10012014498.0,,Not applicable,Not applicable,,,E02005064,E01024301,0.0, +118992,886,Kent,6045,Spring Grove School 2003 Ltd,Other independent school,Independent schools,Open,Not applicable,03-11-1967,Not applicable,,Not applicable,2.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,None,None,Not applicable,Non-selective,245.0,No Special Classes,20-01-2022,225.0,107.0,118.0,0.0,Not applicable,,Not applicable,,Not applicable,,10080530.0,,Not applicable,,08-05-2024,Harville Road,Wye,,Ashford,Kent,TN25 5EZ,www.springgroveschool.co.uk,1233812337.0,Mrs,Therésa,Jaggard,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Ashford,Wye with Hinxhill,Ashford,(England/Wales) Rural hamlet and isolated dwellings,E10000016,604242.0,146688.0,Ashford 001,Ashford 001E,ISI,1.0,19.0,,,South-East England and South London,,200004393352.0,,Not applicable,Not applicable,,,E02004996,E01024041,0.0, +118996,886,Kent,6048,The King's School Canterbury,Other independent school,Independent schools,Open,Not applicable,01-01-1908,Not applicable,,Not applicable,13.0,18,Boarding school,No Nursery Classes,Has a sixth form,Mixed,Church of England,Church of England,Not applicable,Selective,960.0,No Special Classes,20-01-2022,943.0,485.0,458.0,0.0,Not applicable,,Not applicable,,Not applicable,,10008320.0,,Not applicable,,08-05-2024,25 The Precincts,,,Canterbury,Kent,CT1 2ES,www.kings-school.co.uk,1227595501.0,Ms,Jude,Lowson,Headmaster,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Canterbury,Westgate,Canterbury,(England/Wales) Urban city and town,E10000016,615194.0,158056.0,Canterbury 020,Canterbury 020D,ISI,,220.0,The King’s School Governors,,South-East England and South London,,100062279503.0,,Not applicable,Not applicable,,,E02006856,E01024124,0.0, +118998,886,Kent,6050,St Edmund's School Canterbury,Other independent school,Independent schools,Open,Not applicable,01-01-1918,Not applicable,,Not applicable,2.0,19,Boarding school,Has Nursery Classes,Has a sixth form,Mixed,Church of England,Christian,Not applicable,Not applicable,670.0,No Special Classes,20-01-2022,631.0,335.0,296.0,0.0,Not applicable,,Not applicable,,Not applicable,,10013984.0,,Not applicable,,26-04-2024,St Thomas Hill,,,Canterbury,Kent,CT2 8HU,http://www.stedmunds.org.uk/,1227475600.0,Mr,Edward,O'Connor,Head,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,Not applicable,,,,,South East,Canterbury,Blean Forest,Canterbury,(England/Wales) Urban city and town,E10000016,613410.0,159177.0,Canterbury 012,Canterbury 012E,ISI,11.0,80.0,,,South-East England and South London,,100062619208.0,,Not applicable,Not applicable,,,E02005021,E01024123,0.0, +119001,886,Kent,6053,Kent College (Canterbury),Other independent school,Independent schools,Open,Not applicable,30-09-1980,Not applicable,,Not applicable,11.0,19,Boarding school,Not applicable,Has a sixth form,Mixed,Methodist,Methodist,Not applicable,Not applicable,600.0,Has Special Classes,20-01-2022,574.0,311.0,263.0,0.0,Not applicable,,Not applicable,,Not applicable,,10016349.0,,Not applicable,,23-04-2024,Whitstable Road,,,Canterbury,Kent,CT2 9DT,,1227763231.0,Mr,Mark,Turnbull,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Canterbury,Blean Forest,Canterbury,(England/Wales) Urban city and town,E10000016,613117.0,159367.0,Canterbury 012,Canterbury 012D,ISI,3.0,36.0,Methodist Independent Schools Trust,,South-East England and South London,,100062293085.0,,Not applicable,Not applicable,,,E02005021,E01024068,0.0, +119002,886,Kent,6054,Walthamstow Hall,Other independent school,Independent schools,Open,Not applicable,30-09-1980,Not applicable,,Not applicable,2.0,19,No boarders,Has Nursery Classes,Has a sixth form,Mixed,None,Christian,Not applicable,Not applicable,700.0,No Special Classes,20-01-2022,549.0,0.0,549.0,0.0,Not applicable,,Not applicable,,Not applicable,,10007324.0,,Not applicable,,30-04-2024,Holly Bush Lane,,,Sevenoaks,Kent,TN13 3UL,www.walthamstow-hall.co.uk,1732451334.0,Ms,Louise,Chamberlain,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Sevenoaks Eastern,Sevenoaks,(England/Wales) Urban city and town,E10000016,553388.0,155609.0,Sevenoaks 010,Sevenoaks 010C,ISI,84.0,,,,South-East England and South London,,100062547957.0,,Not applicable,Not applicable,,,E02005096,E01024461,0.0, +119007,886,Kent,6058,Sackville School,Other independent school,Independent schools,Open,Not applicable,17-09-1987,Not applicable,,Not applicable,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Mixed,None,None,Not applicable,Not applicable,242.0,No Special Classes,20-01-2022,206.0,158.0,48.0,0.0,Not applicable,,Not applicable,,Not applicable,,10017557.0,,Not applicable,,10-04-2024,Tonbridge Road,Hildenborough,,Tonbridge,Kent,TN11 9HN,www.sackvilleschool.co.uk,1732838888.0,Mrs,Leoni,Ellis,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,Hildenborough,Tonbridge and Malling,(England/Wales) Urban city and town,E10000016,556338.0,148693.0,Tonbridge and Malling 010,Tonbridge and Malling 010D,ISI,51.0,23.0,,,South-East England and South London,,200000963023.0,,Not applicable,Not applicable,,,E02005158,E01024754,0.0, +119008,886,Kent,6059,St Faith's At Ash School Limited,Other independent school,Independent schools,Open,Not applicable,28-10-1987,Not applicable,,Not applicable,2.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,None,None,Not applicable,Non-selective,260.0,No Special Classes,20-01-2022,228.0,116.0,112.0,0.0,Not applicable,,Not applicable,,Not applicable,,10075226.0,,Not applicable,,22-04-2024,5 The Street,Ash,,Canterbury,Kent,CT3 2HH,www.stfaithsprep.com,1304813409.0,Mrs,Helen,Coombs,Headmaster,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,SpLD - Specific Learning Difficulty,"SLCN - Speech, language and Communication",ASD - Autistic Spectrum Disorder,MSI - Multi-Sensory Impairment,,,,,,,,,,Resourced provision,28.0,30.0,,,South East,Dover,Little Stour & Ashstone,South Thanet,(England/Wales) Rural town and fringe,E10000016,628411.0,158389.0,Dover 001,Dover 001B,ISI,4.0,19.0,St Faith's At Ash School Ltd,,South-East England and South London,,100060886066.0,,Not applicable,Not applicable,,,E02005041,E01024207,0.0, +119010,886,Kent,6061,Junior King's School,Other independent school,Independent schools,Open,Not applicable,16-10-1989,Not applicable,,Not applicable,2.0,14,Boarding school,Has Nursery Classes,Does not have a sixth form,Mixed,Church of England,Church of England,Not applicable,Not applicable,386.0,No Special Classes,20-01-2022,381.0,209.0,172.0,0.0,Not applicable,,Not applicable,,Not applicable,,10018042.0,,Not applicable,,08-05-2024,Milner Court,Sturry,,Canterbury,Kent,CT2 0AY,www.junior-kings.co.uk,1227714000.0,Mrs,Emma,Karolyi,Head,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Canterbury,Sturry,Canterbury,(England/Wales) Rural town and fringe,E10000016,617596.0,160193.0,Canterbury 011,Canterbury 011E,ISI,1.0,16.0,,,South-East England and South London,,200000682998.0,,Not applicable,Not applicable,,,E02005020,E01024113,0.0, +119014,886,Kent,6064,Lorenden Preparatory School,Other independent school,Independent schools,Open,Not applicable,12-10-1993,Not applicable,,Not applicable,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,None,Christian,Not applicable,Non-selective,140.0,No Special Classes,20-01-2022,120.0,60.0,60.0,0.0,Not applicable,,Not applicable,,Not applicable,,10080527.0,,Not applicable,,12-04-2024,Painters Forstal Road,Painters Forstal,,,,ME13 0EN,www.lorenden.org,1795590030.0,Mr,Richard,McIntosh,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Swale,East Downs,Faversham and Mid Kent,(England/Wales) Rural hamlet and isolated dwellings,E10000016,599351.0,159200.0,Swale 016,Swale 016A,ISI,1.0,19.0,Methodist Independent Schools Trust,,South-East England and South London,,200002534108.0,,Not applicable,Not applicable,,,E02005130,E01024565,0.0, +119020,886,Kent,6069,"Kent College Nursery, Infant and Junior School",Other independent school,Independent schools,Open,Not applicable,23-09-1980,Not applicable,,Not applicable,3.0,11,Boarding school,Has Nursery Classes,Does not have a sixth form,Mixed,None,Church of England/Methodist,Not applicable,Non-selective,240.0,Has Special Classes,20-01-2022,222.0,122.0,100.0,0.0,Not applicable,,Not applicable,,Not applicable,,10080525.0,,Not applicable,,23-04-2024,Harbledown,Canterbury,,Canterbury,Kent,CT2 9AQ,,1227762436.0,Mr,Simon,James,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Canterbury,Chartham & Stone Street,Canterbury,(England/Wales) Rural village,E10000016,612417.0,158066.0,Canterbury 012,Canterbury 012C,ISI,,22.0,,,South-East England and South London,,200000690375.0,,Not applicable,Not applicable,,,E02005021,E01024067,0.0, +130938,886,Kent,2682,New Ash Green Primary School,Community school,Local authority maintained schools,Open,Not applicable,01-09-1997,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,Not applicable,19-01-2023,413.0,212.0,201.0,13.3,Not applicable,,Not applicable,,Not under a federation,,10075572.0,,Not applicable,25-02-2022,01-02-2024,North Square,New Ash Green,,Longfield,Kent,DA3 8JT,http://www.new-ash.kent.sch.uk,1474873858.0,Mrs,Caroline,Cain,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Ash and New Ash Green,Sevenoaks,(England/Wales) Urban city and town,E10000016,560624.0,165724.0,Sevenoaks 016,Sevenoaks 016A,,,,,Good,South-East England and South London,,100062314601.0,,Not applicable,Not applicable,,,E02006832,E01024413,55.0, +130948,886,Kent,3298,St. Edmund's Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,01-09-1996,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,210.0,Not applicable,19-01-2023,169.0,88.0,81.0,30.2,Not applicable,,Not applicable,,Supported by a federation,The Compass Federation,10075571.0,,Not applicable,14-11-2018,09-04-2024,Fawkham Road,West Kingsdown,,Sevenoaks,Kent,TN15 6JP,www.st-edmunds.kent.sch.uk,1474853484.0,Mr,Benjamin,Hulme,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Fawkham and West Kingsdown,Sevenoaks,(England/Wales) Rural town and fringe,E10000016,558036.0,162680.0,Sevenoaks 007,Sevenoaks 007A,,,,,Good,South-East England and South London,,100062550147.0,,Not applicable,Not applicable,,,E02005093,E01024435,51.0, +130952,886,Kent,2680,Kings Hill School Primary and Nursery,Community school,Local authority maintained schools,Open,Not applicable,01-09-1997,Not applicable,,Primary,2.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,Not applicable,19-01-2023,485.0,229.0,256.0,7.4,Not applicable,,Not applicable,,Not under a federation,,10075570.0,,Not applicable,21-02-2024,20-05-2024,Crispin Way,Kings Hill,,West Malling,Kent,ME19 4LS,www.kingshillschool.org.uk/,1732842739.0,Miss,Lottie,Barnden,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,Kings Hill,Tonbridge and Malling,(England/Wales) Rural town and fringe,E10000016,567411.0,155232.0,Tonbridge and Malling 007,Tonbridge and Malling 007F,,,,,Outstanding,South-East England and South London,,10002912179.0,,Not applicable,Not applicable,,,E02005155,E01032826,36.0, +131020,886,Kent,3902,Hythe Bay CofE Primary School,Voluntary controlled school,Local authority maintained schools,Open,Result of Amalgamation,01-09-2006,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,420.0,Has Special Classes,19-01-2023,297.0,170.0,127.0,38.7,Not applicable,,Not applicable,,Not under a federation,,10075218.0,,Not applicable,25-01-2023,09-04-2024,Cinque Ports Avenue,,,Hythe,Kent,CT21 6HS,www.hythebay.kent.sch.uk,1303267802.0,Mrs,Carolyn,Chivers,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,"SLCN - Speech, language and Communication",,,,,,,,,,,,,Resourced provision,21.0,22.0,,,South East,Folkestone and Hythe,Hythe,Folkestone and Hythe,(England/Wales) Urban city and town,E10000016,615731.0,134394.0,Folkestone and Hythe 010,Folkestone and Hythe 010B,,,,,Good,South-East England and South London,,50113532.0,,Not applicable,Not applicable,,,E02005111,E01024524,115.0, +131181,886,Kent,6073,Beech Grove School,Other independent school,Independent schools,Open,Not applicable,21-02-1997,Not applicable,,Not applicable,4.0,19,Boarding school,No Nursery Classes,Has a sixth form,Mixed,Christian,Christian,Not applicable,Selective,120.0,Not applicable,20-01-2022,83.0,48.0,35.0,0.0,Not applicable,,Not applicable,,Not applicable,,10043893.0,,Not applicable,06-12-2019,03-06-2024,Forest Drive,,Nonington,Dover,Kent,CT15 4FB,beechgroveschool.co.uk,1304842980.0,Mr,Jeffrey,Maendel,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Dover,"Aylesham, Eythorne & Shepherdswell",Dover,(England/Wales) Rural village,E10000016,626361.0,152647.0,Dover 006,Dover 006A,Ofsted,,5.0,Church Communities UK,Good,South-East England and South London,,100060912465.0,,Not applicable,Not applicable,,,E02005046,E01024190,0.0, +131411,886,Kent,6075,The Worthgate School,Other independent school,Independent schools,Open,Not applicable,06-11-1997,Not applicable,,Not applicable,13.0,22,Boarding school,No Nursery Classes,Has a sixth form,Mixed,None,None,Not applicable,Selective,500.0,Not applicable,20-01-2022,304.0,136.0,168.0,0.0,Not applicable,,Not applicable,,Not applicable,,10008526.0,,Not applicable,,13-05-2024,68 New Dover Road,,,Canterbury,Kent,CT1 3LQ,www.worthgateschool.com,1227866540.0,Dr,Ian,Gross,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Canterbury,Barton,Canterbury,(England/Wales) Urban city and town,E10000016,615887.0,156832.0,Canterbury 016,Canterbury 016C,ISI,,14.0,CEG Colleges Limited,,South-East England and South London,,100062280087.0,,Not applicable,Not applicable,,,E02005025,E01024046,0.0, +131567,886,Kent,6113,St Helens Montessori School,Other independent school,Independent schools,Open,New Provision,13-04-2006,Not applicable,,Not applicable,2.0,12,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,None,Christian,Not applicable,Not applicable,130.0,Not applicable,20-01-2022,45.0,19.0,26.0,0.0,Not applicable,,Not applicable,,Not applicable,,10071874.0,,Not applicable,08-07-2021,15-04-2024,Lower Road,East Farleigh,,Maidstone,Kent,ME15 0JT,www.sthelensmontessori.co.uk,1622721731.0,Miss,Jeannelle,Dening Smitherman,,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Maidstone,Coxheath and Hunton,Maidstone and The Weald,(England/Wales) Rural village,E10000016,572488.0,153442.0,Maidstone 014,Maidstone 014B,Ofsted,,1.0,Marie-Elise Jeannelle Dening-Smitherman,Good,South-East England and South London,,200003673434.0,,Not applicable,Not applicable,,,E02005081,E01024346,0.0, +132764,886,Kent,2689,The Craylands School,Community school,Local authority maintained schools,Open,New Provision,01-09-2003,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,Not applicable,19-01-2023,417.0,224.0,193.0,23.7,Not applicable,,Not applicable,,Not under a federation,,10074200.0,,Not applicable,25-09-2019,01-05-2024,Craylands Lane,,,Swanscombe,Kent,DA10 0LP,http://www.craylands.kent.sch.uk,1322388230.0,Mr,Kris,Hiscock,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dartford,Swanscombe,Dartford,(England/Wales) Urban major conurbation,E10000016,560051.0,174464.0,Dartford 004,Dartford 004D,,,,,Good,South-East England and South London,,10002021725.0,,Not applicable,Not applicable,,,E02005031,E01024178,99.0, +133177,886,Kent,3904,Castle Hill Community Primary School,Community school,Local authority maintained schools,Open,Fresh Start,01-01-2007,Not applicable,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,406.0,Has Special Classes,19-01-2023,406.0,220.0,186.0,54.8,Not applicable,,Not applicable,,Not under a federation,,10076676.0,,Not applicable,13-10-2021,21-05-2024,Sidney Street,,,Folkestone,Kent,CT19 6HG,www.castlehill.kent.sch.uk/,1303251583.0,Mr,Peter,Talbot,,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,HI - Hearing Impairment,,,,,,,,,,,,,Resourced provision,15.0,12.0,,,South East,Folkestone and Hythe,East Folkestone,Folkestone and Hythe,(England/Wales) Urban city and town,E10000016,623192.0,137077.0,Folkestone and Hythe 004,Folkestone and Hythe 004A,,,,,Requires improvement,South-East England and South London,,50049270.0,,Not applicable,Not applicable,,,E02005105,E01024499,194.0, +133627,886,Kent,3299,The John Wesley Church of England Methodist Voluntary Aided Primary School,Voluntary aided school,Local authority maintained schools,Open,New Provision,01-09-2007,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England/Methodist,Does not apply,Diocese of Canterbury,Not applicable,420.0,Not applicable,19-01-2023,462.0,231.0,231.0,20.1,Not applicable,,Not applicable,,Not under a federation,,10069422.0,,Not applicable,11-11-2021,18-03-2024,Wesley School Road,Cuckoo Lane,Singleton,Ashford,Kent,TN23 5LW,www.john-wesley.org.uk,1233614660.0,Miss,Rachael,Harrington,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,"SLCN - Speech, language and Communication",,,,,,,,,,,,,Resourced provision,10.0,14.0,,,South East,Ashford,Washford,Ashford,(England/Wales) Urban city and town,E10000016,598815.0,141017.0,Ashford 007,Ashford 007E,,,,,Good,South-East England and South London,,10012841657.0,,Not applicable,Not applicable,,,E02005002,E01024017,93.0, +133961,886,Kent,3893,Phoenix Community Primary School,Foundation school,Local authority maintained schools,Open,Result of Amalgamation,01-04-2003,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,Not applicable,19-01-2023,213.0,95.0,118.0,43.7,Supported by a trust,CARE Foundation Trust,Not applicable,,Not under a federation,,10074158.0,,Not applicable,29-06-2022,12-03-2024,Belmont Road,Kennington,,Ashford,Kent,TN24 9LS,www.phoenix-primary.kent.sch.uk/,1233622510.0,Mr,Leon,Robichaud,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Ashford,Bybrook,Ashford,(England/Wales) Urban city and town,E10000016,601583.0,144521.0,Ashford 015,Ashford 015C,,,,,Good,South-East England and South London,,100062561305.0,,Not applicable,Not applicable,,,E02007046,E01023984,93.0, +134057,886,Kent,2065,The Discovery School,Community school,Local authority maintained schools,Open,New Provision,01-09-2003,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,630.0,Not applicable,19-01-2023,625.0,317.0,308.0,7.5,Not applicable,,Not applicable,,Not under a federation,,10074152.0,,Not applicable,22-02-2023,22-05-2024,Discovery Drive,Kings Hill,,West Malling,Kent,ME19 4GJ,www.discovery.kent.sch.uk,1732847000.0,Miss,Tina,Gobell,Interim Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,Kings Hill,Tonbridge and Malling,(England/Wales) Rural town and fringe,E10000016,568757.0,155312.0,Tonbridge and Malling 007,Tonbridge and Malling 007G,,,,,Outstanding,South-East England and South London,,10002911481.0,,Not applicable,Not applicable,,,E02005155,E01032827,47.0, +134452,886,Kent,6104,OneSchool Global UK - Maidstone Campus,Other independent school,Independent schools,Open,New Provision,29-08-2003,Not applicable,,Not applicable,7.0,18,No boarders,No Nursery Classes,Has a sixth form,Mixed,Plymouth Brethren Christian Church,Christian,Not applicable,Not applicable,225.0,Not applicable,20-01-2022,163.0,81.0,82.0,0.0,Not applicable,,Not applicable,,Not applicable,,10018081.0,,Not applicable,,06-06-2024,Heath Road,Linton,,Maidstone,Kent,ME17 4HT,https://www.oneschoolglobal.com/campus/united-kingdom/maidstone/,3000700507.0,Mrs,Keryn,Van Der Westhuizen,,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Maidstone,Coxheath and Hunton,Maidstone and The Weald,(England/Wales) Urban city and town,E10000016,575491.0,154914.0,Maidstone 018,Maidstone 018A,ISI,2.0,10.0,OneSchool Global UK,,South-East England and South London,,10014308592.0,,Not applicable,Not applicable,,,E02005085,E01024345,0.0, +134515,886,Kent,3896,Downsview Community Primary School,Community school,Local authority maintained schools,Open,Result of Amalgamation,01-01-2004,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,Not applicable,19-01-2023,174.0,97.0,77.0,39.7,Not applicable,,Not applicable,,Not under a federation,,10074133.0,,Not applicable,26-04-2023,13-09-2023,Beech Avenue,,,Swanley,Kent,BR8 8AU,www.downsview-primary.kent.sch.uk/,1322662594.0,Mr,Richard,Moore,,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Swanley Christchurch and Swanley Village,Sevenoaks,(England/Wales) Urban major conurbation,E10000016,552107.0,168558.0,Sevenoaks 003,Sevenoaks 003B,,,,,Requires improvement,South-East England and South London,,100062276972.0,,Not applicable,Not applicable,,,E02005089,E01024473,69.0, +134582,886,Kent,6097,Kent College International Study Centre,Other independent school,Independent schools,Open,New Provision,20-08-2003,Not applicable,,Not applicable,11.0,18,Boarding school,No Nursery Classes,Has a sixth form,Mixed,None,Methodist,Not applicable,Not applicable,100.0,Not applicable,20-01-2022,18.0,14.0,4.0,0.0,Not applicable,,Not applicable,,Not applicable,,10016222.0,,Not applicable,,23-04-2024,Whitstable Road,,,Canterbury,Kent,CT2 9DT,,1227763231.0,Mr,Mark,Turnbull,,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Canterbury,Blean Forest,Canterbury,(England/Wales) Urban city and town,E10000016,613117.0,159367.0,Canterbury 012,Canterbury 012D,ISI,,,Methodist Secondary Trustees,,South-East England and South London,,100062293085.0,,Not applicable,Not applicable,,,E02005021,E01024068,0.0, +134857,886,Kent,3898,Greenfields Community Primary School,Community school,Local authority maintained schools,Open,Result of Amalgamation,11-04-2005,Not applicable,,Primary,2.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,367.0,Not applicable,19-01-2023,420.0,241.0,179.0,40.3,Not applicable,,Not applicable,,Not under a federation,,10071741.0,,Not applicable,15-05-2019,11-04-2024,Oxford Road,Shepway,,Maidstone,Kent,ME15 8DF,http://www.greenfieldscps.kent.sch.uk,1622758538.0,Mr,Daniel,Andrews,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Shepway North,Faversham and Mid Kent,(England/Wales) Urban city and town,E10000016,578070.0,153905.0,Maidstone 010,Maidstone 010D,,,,,Good,South-East England and South London,,200003717312.0,,Not applicable,Not applicable,,,E02005077,E01024395,143.0, +135106,886,Kent,3906,Palace Wood Primary School,Community school,Local authority maintained schools,Open,Result of Amalgamation,01-01-2007,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,Not applicable,19-01-2023,417.0,225.0,192.0,16.5,Not applicable,,Not applicable,,Not under a federation,,10072360.0,,Not applicable,15-09-2022,13-09-2023,Ash Grove,Allington,,Maidstone,Kent,ME16 0AB,www.palacewoodprimary.org.uk/,1622750084.0,Mrs,Clare,Cairns,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Maidstone,Allington,Maidstone and The Weald,(England/Wales) Urban city and town,E10000016,574102.0,156747.0,Maidstone 003,Maidstone 003D,,,,,Good,South-East England and South London,,200003659713.0,,Not applicable,Not applicable,,,E02005070,E01024323,69.0, +135118,886,Kent,3907,Hextable Primary School,Community school,Local authority maintained schools,Open,Result of Amalgamation,01-09-2007,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,630.0,Not applicable,19-01-2023,609.0,320.0,289.0,17.9,Not applicable,,Not applicable,,Not under a federation,,10072357.0,,Not applicable,27-09-2023,04-06-2024,Rowhill Road,Hextable,,Swanley,Kent,BR8 7RL,www.hextable-primary.kent.sch.uk/,1322663792.0,Mrs,Suzie,Hall,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Hextable,Sevenoaks,(England/Wales) Urban major conurbation,E10000016,551783.0,170689.0,Sevenoaks 001,Sevenoaks 001A,,,,,Good,South-East England and South London,,10013768802.0,,Not applicable,Not applicable,,,E02005087,E01024445,109.0, +135125,886,Kent,3909,Ashford Oaks Community Primary School,Community school,Local authority maintained schools,Open,Result of Amalgamation,01-09-2008,Not applicable,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,Not applicable,19-01-2023,460.0,238.0,222.0,51.0,Not applicable,,Not applicable,,Not under a federation,,10071720.0,,Not applicable,29-03-2023,15-04-2024,Oak Tree Road,,,Ashford,Kent,TN23 4QR,http://www.ashfordoaks.kent.sch.uk/,1223631259.0,Mr,Phil,Chantler,Head Teacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,"SLCN - Speech, language and Communication",ASD - Autistic Spectrum Disorder,"SEMH - Social, Emotional and Mental Health",MLD - Moderate Learning Difficulty,,,,,,,,,,Resourced provision,13.0,8.0,,,South East,Ashford,Beaver,Ashford,(England/Wales) Urban city and town,E10000016,599912.0,141837.0,Ashford 007,Ashford 007B,,,,,Good,South-East England and South London,,100062559273.0,,Not applicable,Not applicable,,,E02005002,E01023975,221.0, +135130,886,Kent,3910,Joy Lane Primary Foundation School,Foundation school,Local authority maintained schools,Open,Result of Amalgamation,01-09-2007,Not applicable,,Primary,1.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,630.0,Has Special Classes,19-01-2023,619.0,327.0,292.0,24.7,Supported by a trust,The Coastal Alliance Co-operative Trust,Not applicable,,Not under a federation,,10076634.0,,Not applicable,19-10-2018,02-04-2024,Joy Lane,,,Whitstable,Kent,CT5 4LT,www.joylane.kent.sch.uk/,1227261430.0,Ms,Debra,Hines,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,ASD - Autistic Spectrum Disorder,,,,,,,,,,,,,Resourced provision,34.0,30.0,,,South East,Canterbury,Seasalter,Canterbury,(England/Wales) Urban city and town,E10000016,610128.0,165477.0,Canterbury 008,Canterbury 008E,,,,,Good,South-East England and South London,,200002882935.0,,Not applicable,Not applicable,,,E02005017,E01024106,153.0, +135164,886,Kent,3913,Rusthall St Paul's CofE VA Primary School,Voluntary aided school,Local authority maintained schools,"Open, but proposed to close",Result of Amalgamation,01-09-2007,Academy Converter,31-08-2024,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,150.0,No Special Classes,19-01-2023,138.0,79.0,59.0,31.9,Not applicable,,Not applicable,,Not under a federation,,10072353.0,,Not applicable,20-04-2023,13-05-2024,High Street,Rusthall,,Tunbridge Wells,Kent,TN4 8RZ,www.rusthall-cep.kent.sch.uk,1892520582.0,Mrs,Lyndsay,Smurthwaite,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Rusthall,Tunbridge Wells,(England/Wales) Urban city and town,E10000016,555920.0,139686.0,Tunbridge Wells 010,Tunbridge Wells 010C,,,,,Requires improvement,South-East England and South London,,10008659425.0,,Not applicable,Not applicable,,,E02005171,E01024830,44.0, +135197,886,Kent,3916,Green Park Community Primary School,Community school,Local authority maintained schools,Open,Result of Amalgamation,01-08-2007,Not applicable,,Primary,4.0,11,Not applicable,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,No Special Classes,19-01-2023,390.0,206.0,184.0,45.6,Not applicable,,Not applicable,,Not under a federation,,10076633.0,,Not applicable,25-05-2023,17-04-2024,The Linces,Buckland,Green Park Community Primary School,Dover,Kent,CT16 2BN,www.greenparkcps.co.uk/,1304822663.0,Mr,Richard,Hawkins,Executive Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,PD - Physical Disability,,,,,,,,,,,,,Resourced provision,,,,,South East,Dover,Buckland,Dover,(England/Wales) Urban city and town,E10000016,630734.0,143609.0,Dover 011,Dover 011D,,,,,Outstanding,South-East England and South London,,100062289415.0,,Not applicable,Not applicable,,,E02005051,E01024196,178.0, +135212,886,Kent,3917,Garlinge Primary School and Nursery,Foundation school,Local authority maintained schools,Open,Result of Amalgamation,01-09-2007,Not applicable,,Primary,3.0,11,No boarders,Has Nursery Classes,Not applicable,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,840.0,No Special Classes,19-01-2023,769.0,406.0,363.0,41.6,Supported by a trust,Thanet Endeavour Learning Trust,Not applicable,,Not under a federation,,10076631.0,,Not applicable,29-11-2023,08-05-2024,Westfield Road,,,Margate,Kent,CT9 5PA,www.garlingeprimary.co.uk,1843221877.0,Mr,James,Williams,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,ASD - Autistic Spectrum Disorder,PD - Physical Disability,,,,,,,,,,,,Resourced provision,22.0,23.0,,,South East,Thanet,Garlinge,North Thanet,(England/Wales) Urban city and town,E10000016,633980.0,169704.0,Thanet 005,Thanet 005C,,,,,Good,South-East England and South London,,100062307988.0,,Not applicable,Not applicable,,,E02005136,E01024674,310.0, +135214,886,Kent,3918,Newington Community Primary School,Community school,Local authority maintained schools,"Open, but proposed to close",Result of Amalgamation,01-09-2007,Academy Converter,30-06-2024,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,694.0,No Special Classes,19-01-2023,703.0,370.0,333.0,43.3,Not applicable,,Not applicable,,Not under a federation,,10071712.0,,Not applicable,16-03-2017,16-05-2024,Princess Margaret Avenue,,,Ramsgate,Kent,CT12 6HX,www.newington-ramsgate.org.uk/,1843593412.0,Headteacher,Hannah,Tudor,Head Teacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Thanet,Newington,South Thanet,(England/Wales) Urban city and town,E10000016,636335.0,165855.0,Thanet 013,Thanet 013A,,,,,Outstanding,South-East England and South London,United Kingdom,100062284319.0,,Not applicable,Not applicable,,,E02005144,E01024682,290.0, +135290,886,Kent,6909,The Marsh Academy,Academy sponsor led,Academies,Open,New Provision,01-09-2007,Not applicable,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Mixed,Does not apply,None,Not applicable,Non-selective,1110.0,No Special Classes,19-01-2023,1064.0,533.0,531.0,30.0,Supported by a multi-academy trust,SKINNERS' ACADEMIES TRUST,Linked to a sponsor,The Skinners' Company,Not applicable,,10021032.0,,Not applicable,16-11-2022,30-05-2024,Station Road,,,New Romney,Kent,TN28 8BB,www.marshacademy.org.uk,1797364593.0,Mr,Shaun,Simmons,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,ASD - Autistic Spectrum Disorder,,,,,,,,,,,,,Resourced provision,20.0,24.0,,,South East,Folkestone and Hythe,New Romney,Folkestone and Hythe,(England/Wales) Rural town and fringe,E10000016,607023.0,124940.0,Folkestone and Hythe 012,Folkestone and Hythe 012C,,,,,Good,South-East England and South London,,50002925.0,,Not applicable,Not applicable,,,E02005113,E01024539,270.0, +135297,886,Kent,6910,The Leigh Academy,Academy sponsor led,Academies,Open,New Provision,01-09-2007,Not applicable,,Secondary,11.0,19,No boarders,Not applicable,Has a sixth form,Mixed,Does not apply,None,Not applicable,Non-selective,1500.0,No Special Classes,19-01-2023,1359.0,768.0,591.0,23.6,Supported by a multi-academy trust,LEIGH ACADEMIES TRUST,Linked to a sponsor,Leigh Academies Trust,Not applicable,,10021033.0,,Not applicable,26-04-2023,30-04-2024,Green Street Green Road,,,Dartford,Kent,DA1 1QE,http://www.leighacademy.org.uk/,1322620400.0,Mrs,Julia,Collins,Academy Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,HI - Hearing Impairment,"SLCN - Speech, language and Communication",,,,,,,,,,,,Resourced provision,16.0,16.0,,,South East,Dartford,Brent,Dartford,(England/Wales) Urban major conurbation,E10000016,555487.0,173173.0,Dartford 008,Dartford 008B,,,,,Good,South-East England and South London,,100062308614.0,,Not applicable,Not applicable,,,E02005035,E01024136,272.0, +135305,886,Kent,6911,Spires Academy,Academy sponsor led,Academies,Open,New Provision,01-09-2007,Not applicable,,Secondary,11.0,16,No boarders,Not applicable,Has a sixth form,Mixed,Does not apply,None,Not applicable,Non-selective,750.0,No Special Classes,19-01-2023,690.0,324.0,366.0,37.4,Supported by a multi-academy trust,EDUCATION FOR THE 21ST CENTURY,Linked to a sponsor,Education for the 21st Century,Not applicable,,10021093.0,,Not applicable,11-01-2023,26-09-2023,Bredlands Lane,Sturry,,Canterbury,Kent,CT2 0HD,http://www.spiresacademy.com/,1227710392.0,Mrs,Anna,Burden,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Canterbury,Sturry,Canterbury,(England/Wales) Rural hamlet and isolated dwellings,E10000016,619494.0,161797.0,Canterbury 011,Canterbury 011B,,,,,Good,South-East England and South London,,10090317463.0,,Not applicable,Not applicable,,,E02005020,E01024110,258.0, +135371,886,Kent,6913,Cornwallis Academy,Academy sponsor led,Academies,Open,New Provision,03-09-2007,Not applicable,,Secondary,11.0,19,No boarders,Not applicable,Has a sixth form,Mixed,Does not apply,None,Not applicable,Non-selective,1825.0,No Special Classes,19-01-2023,1337.0,761.0,576.0,27.8,Supported by a multi-academy trust,FUTURE SCHOOLS TRUST,Linked to a sponsor,Future Schools Trust,Not applicable,,10021031.0,,Not applicable,12-01-2023,22-04-2024,Hubbards Lane,Linton,,Maidstone,Kent,ME17 4HX,http://www.futureschoolstrust.com/,1622743152.0,Mrs,Samantha,McMahon,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Loose,Maidstone and The Weald,(England/Wales) Urban city and town,E10000016,575978.0,150975.0,Maidstone 016,Maidstone 016D,,,,,Good,South-East England and South London,,200003720219.0,,Not applicable,Not applicable,,,E02005083,E01024376,277.0, +135372,886,Kent,6912,New Line Learning Academy,Academy sponsor led,Academies,Open,New Provision,03-09-2007,Not applicable,,Secondary,11.0,16,No boarders,Not applicable,Does not have a sixth form,Mixed,Does not apply,None,Not applicable,Non-selective,1050.0,No Special Classes,19-01-2023,719.0,372.0,347.0,43.7,Supported by a multi-academy trust,FUTURE SCHOOLS TRUST,Linked to a sponsor,Future Schools Trust,Not applicable,,10021098.0,,Not applicable,13-11-2019,21-05-2024,Boughton Lane,,,Maidstone,Kent,ME15 9QL,https://www.newlinelearning.com/,1622743286.0,Ms,Sharry,Mackie,Interim Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,VI - Visual Impairment,PD - Physical Disability,,,,,,,,,,,,Resourced provision,6.0,12.0,,,South East,Maidstone,South,Maidstone and The Weald,(England/Wales) Urban city and town,E10000016,576813.0,153053.0,Maidstone 012,Maidstone 012D,,,,,Good,South-East England and South London,,200003677498.0,,Not applicable,Not applicable,,,E02005079,E01024404,313.0, +135432,886,Kent,1123,The Rosewood School,Pupil referral unit,Local authority maintained schools,Open,New Provision,01-11-2007,Not applicable,,Not applicable,11.0,18,No boarders,No Nursery Classes,Not applicable,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,120.0,Has Special Classes,19-01-2023,0.0,0.0,0.0,0.0,Not applicable,,Not applicable,,Not applicable,,10025535.0,,Not applicable,23-06-2022,17-11-2023,40 Teddington Drive,Leybourne,,West Malling,Kent,ME19 5FF,http://www.trs.kent.sch.uk/,1732875694.0,Mrs,Tina,Hamer,Executive Headteacher,Not applicable,,,,Provides places for Teen Mothers,,Does not have child care facilities,PRU Does have Provision for SEN,PRU Does not have EBD provision,120.0,PRU offers full time provision,Does not offer tuition by another provider,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,"Birling, Leybourne & Ryarsh",Tonbridge and Malling,(England/Wales) Rural hamlet and isolated dwellings,E10000016,567730.0,159105.0,Tonbridge and Malling 014,Tonbridge and Malling 014G,,,,,Good,South-East England and South London,,100062387483.0,,Not applicable,Not applicable,,,E02006833,E01035010,0.0, +135462,886,Kent,1124,Birchwood,Pupil referral unit,Local authority maintained schools,Open,,01-01-2008,Not applicable,,Not applicable,14.0,16,Not applicable,Not applicable,Not applicable,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,44.0,Has Special Classes,19-01-2023,0.0,0.0,0.0,0.0,Not applicable,,Not applicable,,Not applicable,,10025590.0,,Not applicable,06-02-2019,07-05-2024,Bowen Road,,,Folkestone,Kent,CT19 4FP,www.birchwoodpru.kent.sch.uk,3000658450.0,Ms,Jane,Waters,Headteacher,Not applicable,,,,Does not provide places for Teen Mothers,,Does not have child care facilities,PRU Does have Provision for SEN,PRU Does have EBD provision,92.0,PRU offers full time provision,Does not offer tuition by another provider,Not applicable,,,,,,,,,,,,,,,,,,,South East,Folkestone and Hythe,Cheriton,Folkestone and Hythe,(England/Wales) Urban city and town,E10000016,620521.0,137026.0,Folkestone and Hythe 006,Folkestone and Hythe 006B,,,,,Good,South-East England and South London,United Kingdom,50125207.0,,Not applicable,Not applicable,,,E02005107,E01024512,0.0, +135465,886,Kent,1127,Maidstone and Malling Alternative Provision,Pupil referral unit,Local authority maintained schools,Open,,01-01-2008,Not applicable,,Not applicable,12.0,17,Not applicable,Not applicable,Not applicable,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,52.0,Not applicable,19-01-2023,0.0,0.0,0.0,0.0,Not applicable,,Not applicable,,Not applicable,,10025522.0,,Not applicable,06-11-2019,05-06-2024,8 Bower Mount Road,,,Maidstone,Kent,ME16 8AU,www.m-map.co.uk,1622753772.0,Mrs,Stacie,Smith,Headteacher,Not applicable,,,,Does not provide places for Teen Mothers,,Does not have child care facilities,PRU Does have Provision for SEN,PRU Does have EBD provision,52.0,PRU offers full time provision,PRU does offer tuition by another provider,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Bridge,Maidstone and The Weald,(England/Wales) Urban city and town,E10000016,574902.0,155729.0,Maidstone 006,Maidstone 006B,,,,,Good,South-East England and South London,,200003728228.0,,Not applicable,Not applicable,,,E02005073,E01024340,0.0, +135466,886,Kent,1128,Enterprise Learning Alliance,Pupil referral unit,Local authority maintained schools,Open,,01-01-2008,Not applicable,,Not applicable,11.0,16,Not applicable,Not applicable,Not applicable,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,140.0,Not applicable,19-01-2023,0.0,0.0,0.0,0.0,Not applicable,,Not applicable,,Not applicable,,10025536.0,,Not applicable,06-06-2019,10-05-2024,Westwood Centre,Westwood Industrial Estate,Enterprise Road,Margate,Kent,CT9 4JA,www.ela.kent.sch.uk,1843606666.0,Mrs,Micheala,Clay,Executive Head Teacher,Not applicable,,,,Does not provide places for Teen Mothers,,Does not have child care facilities,PRU Does have Provision for SEN,PRU Does have EBD provision,168.0,PRU offers full time provision,Does not offer tuition by another provider,Not applicable,,,,,,,,,,,,,,,,,,,South East,Thanet,Salmestone,North Thanet,(England/Wales) Urban city and town,E10000016,636075.0,168581.0,Thanet 004,Thanet 004E,,,,,Good,South-East England and South London,,10013309226.0,,Not applicable,Not applicable,,,E02005135,E01024696,0.0, +135467,886,Kent,1129,Two Bridges School,Pupil referral unit,Local authority maintained schools,Open,,01-01-2008,Not applicable,,Not applicable,11.0,18,Not applicable,Not applicable,Not applicable,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,,Not applicable,19-01-2023,0.0,0.0,0.0,0.0,Not applicable,,Not applicable,,Not applicable,,10025613.0,,Not applicable,28-02-2024,22-05-2024,Charles Street,Southborough,Two Bridges School,Tunbridge Wells,Kent,TN4 0DS,www.twobridgesschool.com,1892518461.0,Mrs,Kate,Middleton,Head Teacher,Not applicable,,,,Does not provide places for Teen Mothers,,Does not have child care facilities,PRU Does have Provision for SEN,PRU Does have EBD provision,94.0,PRU offers full time provision,PRU does offer tuition by another provider,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Southborough and High Brooms,Tunbridge Wells,(England/Wales) Urban city and town,E10000016,558073.0,141848.0,Tunbridge Wells 002,Tunbridge Wells 002C,,,,,Special Measures,South-East England and South London,,100062585348.0,,Not applicable,Not applicable,,,E02005163,E01024846,0.0, +135630,886,Kent,6914,Longfield Academy,Academy sponsor led,Academies,Open,New Provision,01-09-2008,Not applicable,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Mixed,Does not apply,None,Not applicable,Non-selective,1150.0,No Special Classes,19-01-2023,1035.0,533.0,502.0,25.1,Supported by a multi-academy trust,LEIGH ACADEMIES TRUST,Linked to a sponsor,Leigh Academies Trust,Not applicable,,10024300.0,,Not applicable,27-09-2023,08-05-2024,Main Road,,,Longfield,Kent,DA3 7PH,http://www.longfieldacademy.org,1474700700.0,Dr,Felix,Donkor,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,ASD - Autistic Spectrum Disorder,,,,,,,,,,,,,Resourced provision,37.0,40.0,,,South East,Dartford,"Longfield, New Barn & Southfleet",Dartford,(England/Wales) Urban city and town,E10000016,560573.0,168906.0,Dartford 013,Dartford 013B,,,,,Good,South-East England and South London,,200000538016.0,,Not applicable,Not applicable,,,E02005040,E01024158,224.0, +135721,886,Kent,6915,Oasis Academy Isle of Sheppey,Academy sponsor led,Academies,"Open, but proposed to close",New Provision,01-09-2009,Result of Amalgamation/Merger,31-08-2024,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Mixed,Does not apply,None,Not applicable,Non-selective,2450.0,Not applicable,19-01-2023,1486.0,763.0,723.0,49.2,Supported by a multi-academy trust,OASIS COMMUNITY LEARNING,Linked to a sponsor,Oasis Community Learning,Not applicable,,10027535.0,,Not applicable,08-06-2022,28-03-2024,Minster Road,,,Minster-on-Sea,Kent,ME12 3JQ,www.oasisacademyisleofsheppey.org,1795873591.0,Mr,Andrew,Booth,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Queenborough and Halfway,Sittingbourne and Sheppey,(England/Wales) Urban city and town,E10000016,593655.0,172623.0,Swale 004,Swale 004A,,,,,Special Measures,South-East England and South London,,200002529794.0,,Not applicable,Not applicable,,,E02005118,E01024595,665.0, +135888,886,Kent,6916,Skinners' Kent Academy,Academy sponsor led,Academies,Open,New Provision,01-09-2009,Not applicable,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Mixed,Does not apply,None,Not applicable,Non-selective,1150.0,Not applicable,19-01-2023,1084.0,580.0,504.0,22.8,Supported by a multi-academy trust,SKINNERS' ACADEMIES TRUST,Linked to a sponsor,The Skinners' Company,Not applicable,,10027550.0,,Not applicable,11-05-2023,21-05-2024,Sandown Park,,,Tunbridge Wells,Kent,TN2 4PY,https://www.skinnerskentacademy.org.uk/,1892534377.0,Miss,Hannah,Knowles,Executive Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Sherwood,Tunbridge Wells,(England/Wales) Urban city and town,E10000016,560482.0,140402.0,Tunbridge Wells 005,Tunbridge Wells 005C,,,,,Good,South-East England and South London,,10008671585.0,,Not applicable,Not applicable,,,E02005166,E01024842,215.0, +136128,886,Kent,6905,Knole Academy,Academy sponsor led,Academies,Open,New Provision,01-09-2010,Not applicable,,Secondary,11.0,19,No boarders,Not applicable,Has a sixth form,Mixed,Does not apply,None,Not applicable,Non-selective,1550.0,No Special Classes,19-01-2023,1373.0,671.0,702.0,17.9,Supported by a single-academy trust,KNOLE ACADEMY TRUST,Linked to a sponsor,Gordon Phillips (Knole academy),Not applicable,,10030458.0,,Not applicable,23-11-2022,10-05-2024,Knole Academy,Bradbourne Vale Road,,Sevenoaks,Kent,TN13 3LE,www.knoleacademy.org,1732454608.0,Mr,David,Collins,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Sevenoaks Northern,Sevenoaks,(England/Wales) Urban city and town,E10000016,552379.0,156485.0,Sevenoaks 011,Sevenoaks 011F,,,,,Good,South-East England and South London,,100062548177.0,,Not applicable,Not applicable,,,E02005097,E01024467,217.0, +136177,886,Kent,6918,Duke of York's Royal Military School,Academy sponsor led,Academies,Open,New Provision,01-09-2010,Not applicable,,Secondary,11.0,18,Boarding school,Not applicable,Has a sixth form,Mixed,Does not apply,None,Not applicable,Non-selective,722.0,No Special Classes,19-01-2023,501.0,299.0,202.0,1.3,Supported by a single-academy trust,DYRMS - AN ACADEMY WITH MILITARY TRADITIONS,Linked to a sponsor,Ministry of Defence,Not applicable,,10030792.0,,Not applicable,09-02-2023,30-05-2024,Duke of York's Royal Military School,,,Dover,Kent,CT15 5EQ,www.doyrms.com,1304245023.0,Mr,Alex,Foreman,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,"Guston, Kingsdown & St Margaret's-at-Cliffe",Dover,(England/Wales) Rural village,E10000016,632730.0,143466.0,Dover 012,Dover 012B,,,,,Good,South-East England and South London,,10034881145.0,,Not applicable,Not applicable,,,E02005052,E01024238,5.0, +136197,886,Kent,6919,The John Wallis Church of England Academy,Academy sponsor led,Academies,Open,New Provision,01-09-2010,Not applicable,,All-through,3.0,19,No boarders,Has Nursery Classes,Has a sixth form,Mixed,Church of England,None,Diocese of Canterbury,Non-selective,1790.0,No Special Classes,19-01-2023,1763.0,889.0,874.0,37.8,Supported by a single-academy trust,"THE JOHN WALLIS CHURCH OF ENGLAND ACADEMY, ASHFORD",Linked to a sponsor,The Diocese of Canterbury Academies Company Limited,Not applicable,,10030997.0,,Not applicable,01-02-2024,20-05-2024,Millbank Road,Kingsnorth,,Ashford,Kent,TN23 3HG,http://www.thejohnwallisacademy.org,1233623465.0,Mr,Damian,McBeath,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Ashford,Stanhope,Ashford,(England/Wales) Urban city and town,E10000016,599919.0,140348.0,Ashford 008,Ashford 008B,,,,,Good,South-East England and South London,,100062558283.0,,Not applicable,Not applicable,,,E02005003,E01024019,619.0, +136205,886,Kent,6920,Wilmington Academy,Academy sponsor led,Academies,Open,New Provision,01-09-2010,Not applicable,,Secondary,11.0,19,No boarders,Not applicable,Has a sixth form,Mixed,Does not apply,None,Not applicable,Non-selective,1400.0,No Special Classes,19-01-2023,1388.0,867.0,521.0,17.8,Supported by a multi-academy trust,LEIGH ACADEMIES TRUST,Linked to a sponsor,Leigh Academies Trust,Not applicable,,10031094.0,,Not applicable,05-05-2023,22-04-2024,Common Lane,,,Wilmington,Kent,DA2 7DR,www.wilmingtonacademy.org.uk,1322272111.0,Mr,Michael,Gore,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,ASD - Autistic Spectrum Disorder,,,,,,,,,,,,,Resourced provision,17.0,17.0,,,South East,Dartford,Maypole & Leyton Cross,Dartford,(England/Wales) Urban major conurbation,E10000016,552526.0,172176.0,Dartford 011,Dartford 011D,,,,,Outstanding,South-East England and South London,,200000534711.0,,Not applicable,Not applicable,,,E02005038,E01024189,213.0, +136251,886,Kent,3920,Goat Lees Primary School,Foundation school,Local authority maintained schools,Open,New Provision,01-09-2013,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,None,Does not apply,,Not applicable,210.0,No Special Classes,19-01-2023,212.0,112.0,100.0,41.5,Not supported by a trust,,Not applicable,,Not under a federation,,10072306.0,,Not applicable,22-01-2020,05-06-2024,Hurst Road,Kennington,,Ashford,Kent,TN24 9RR,www.goatlees.kent.sch.uk/,1233630201.0,Ms,Teresa,Adams,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Ashford,Goat Lees,Ashford,(England/Wales) Urban city and town,E10000016,600985.0,145239.0,Ashford 001,Ashford 001F,,,,,Good,South-East England and South London,,200004392081.0,,Not applicable,Not applicable,,,E02004996,E01032810,88.0, +136270,886,Kent,3912,Westlands Primary School,Academy converter,Academies,Open,Academy Converter,01-09-2010,,,Primary,4.0,11,No boarders,No Nursery Classes,Not applicable,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,540.0,No Special Classes,19-01-2023,578.0,303.0,275.0,32.4,Supported by a multi-academy trust,SWALE ACADEMIES TRUST,Linked to a sponsor,Swale Academies Trust,Not applicable,,10031923.0,,Not applicable,26-06-2019,16-05-2024,Homewood Avenue,,,Sittingbourne,Kent,ME10 1XN,www.westlandsprimary.org.uk/,1795470862.0,Mrs,Victoria,Pettett,Head of School,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Homewood,Sittingbourne and Sheppey,(England/Wales) Urban city and town,E10000016,589625.0,163383.0,Swale 012,Swale 012E,,,,,Good,South-East England and South London,,200002527704.0,,Not applicable,Not applicable,,,E02005126,E01024632,187.0, +136286,886,Kent,5434,Westlands School,Academy converter,Academies,Open,Academy Converter,01-09-2010,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Mixed,None,Does not apply,Not applicable,Non-selective,1604.0,Has Special Classes,19-01-2023,1784.0,935.0,849.0,22.3,Supported by a multi-academy trust,SWALE ACADEMIES TRUST,Linked to a sponsor,Swale Academies Trust,Not applicable,,10031371.0,,Not applicable,27-02-2019,13-05-2024,Westlands Avenue,,,Sittingbourne,Kent,ME10 1PF,http://www.westlands.org.uk/,1795477475.0,Miss,Christina,Honess,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,SpLD - Specific Learning Difficulty,PD - Physical Disability,,,,,,,,,,,,Resourced provision and SEN unit,10.0,10.0,28.0,32.0,South East,Swale,Borden and Grove Park,Sittingbourne and Sheppey,(England/Wales) Urban city and town,E10000016,588904.0,163864.0,Swale 012,Swale 012C,,,,,Good,South-East England and South London,,100062375039.0,,Not applicable,Not applicable,,,E02005126,E01024569,356.0, +136302,886,Kent,5421,The Canterbury Academy,Academy converter,Academies,Open,Academy Converter,07-10-2010,,,Secondary,11.0,19,No boarders,Not applicable,Has a sixth form,Mixed,None,Does not apply,Not applicable,Non-selective,1300.0,Has Special Classes,19-01-2023,1844.0,949.0,895.0,27.6,Supported by a multi-academy trust,THE CANTERBURY ACADEMY TRUST,-,,Not applicable,,10031579.0,,Not applicable,22-02-2023,18-04-2024,Knight Avenue,,,Canterbury,Kent,CT2 8QA,http://www.canterbury.kent.sch.uk/,1227463971.0,Mr,Jon,Watson,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,HI - Hearing Impairment,"SLCN - Speech, language and Communication",ASD - Autistic Spectrum Disorder,,,,,,,,,,,Resourced provision,47.0,47.0,,,South East,Canterbury,Westgate,Canterbury,(England/Wales) Urban city and town,E10000016,613730.0,157724.0,Canterbury 020,Canterbury 020C,,,,,Requires improvement,South-East England and South London,,100062292855.0,,Not applicable,Not applicable,,,E02006856,E01024122,311.0, +136304,886,Kent,4031,Orchards Academy,Academy converter,Academies,Open,Academy Converter,01-11-2010,,,Secondary,11.0,18,No boarders,Not applicable,Does not have a sixth form,Mixed,None,Does not apply,Not applicable,Non-selective,828.0,No Special Classes,19-01-2023,585.0,280.0,305.0,39.8,Supported by a multi-academy trust,THE KEMNAL ACADEMIES TRUST,Linked to a sponsor,The Kemnal Academies Trust,Not applicable,,10032208.0,,Not applicable,02-07-2021,30-04-2024,St Mary's Road,,,Swanley,Kent,BR8 7TE,http://www.orchards-tkat.org,1322665231.0,Mr,Andy,Lazenby,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,ASD - Autistic Spectrum Disorder,,,,,,,,,,,,,Resourced provision,6.0,12.0,,,South East,Sevenoaks,Swanley St Mary's,Sevenoaks,(England/Wales) Urban major conurbation,E10000016,551053.0,168589.0,Sevenoaks 002,Sevenoaks 002A,,,,,Good,South-East England and South London,,200002881968.0,,Not applicable,Not applicable,,,E02005088,E01024476,233.0, +136305,886,Kent,4080,Highsted Grammar School,Academy converter,Academies,Open,Academy Converter,01-10-2010,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Girls,None,Does not apply,Not applicable,Selective,830.0,No Special Classes,19-01-2023,889.0,7.0,882.0,8.1,Supported by a single-academy trust,HIGHSTED ACADEMY TRUST,-,,Not applicable,,10031571.0,,Not applicable,18-01-2023,07-06-2024,Highsted Road,,,Sittingbourne,Kent,ME10 4PT,http://www.highsted.kent.sch.uk,1795424223.0,Ms,Anne,Kelly,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Woodstock,Sittingbourne and Sheppey,(England/Wales) Urban city and town,E10000016,590779.0,162957.0,Swale 013,Swale 013A,,,,,Good,South-East England and South London,,100062376278.0,,Not applicable,Not applicable,,,E02005127,E01024606,58.0, +136317,886,Kent,5463,Sandwich Technology School,Academy converter,Academies,Open,Academy Converter,01-11-2010,,,Secondary,11.0,19,No boarders,Not applicable,Has a sixth form,Mixed,None,Does not apply,Not applicable,Non-selective,1368.0,No Special Classes,19-01-2023,1353.0,684.0,669.0,29.2,Supported by a single-academy trust,SANDWICH TECHNOLOGY SCHOOL,-,,Not applicable,,10032210.0,,Not applicable,02-05-2019,16-04-2024,Deal Road,,,Sandwich,Kent,CT13 0FA,http://www.sandwich-tech.kent.sch.uk,1304610000.0,Mrs,Tracey,Savage,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,Sandwich,South Thanet,(England/Wales) Rural town and fringe,E10000016,632791.0,157060.0,Dover 002,Dover 002B,,,,,Good,South-East England and South London,,10034879953.0,,Not applicable,Not applicable,,,E02005042,E01024242,354.0, +136324,886,Kent,5414,Fulston Manor School,Academy converter,Academies,Open,Academy Converter,01-10-2010,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Mixed,None,Does not apply,Not applicable,Non-selective,1104.0,No Special Classes,19-01-2023,1340.0,661.0,679.0,20.9,Supported by a multi-academy trust,FULSTON MANOR ACADEMIES TRUST,Linked to a sponsor,Fulston Manor Academies Trust,Not applicable,,10031570.0,,Not applicable,15-11-2023,05-06-2024,Brenchley Road,,,Sittingbourne,Kent,ME10 4EG,http://www.fulstonmanor.kent.sch.uk,1795475228.0,Mrs,Susie,Burden,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Woodstock,Sittingbourne and Sheppey,(England/Wales) Urban city and town,E10000016,590750.0,162857.0,Swale 013,Swale 013G,,,,,Requires improvement,South-East England and South London,,100062376597.0,,Not applicable,Not applicable,,,E02005127,E01032737,222.0, +136344,886,Kent,2654,The Canterbury Primary School,Academy converter,Academies,Open,Academy Converter,07-10-2010,,,Primary,4.0,11,No boarders,No Nursery Classes,Not applicable,Mixed,None,Does not apply,Not applicable,Not applicable,435.0,Has Special Classes,19-01-2023,408.0,209.0,199.0,41.9,Supported by a multi-academy trust,THE CANTERBURY ACADEMY TRUST,-,,Not applicable,,10031917.0,,Not applicable,08-12-2022,09-04-2024,City View,Franklyn Road,,Canterbury,Kent,CT2 8PT,www.canterbury.kent.sch.uk/,1227462883.0,Mrs,Bev,Farrell,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,ASD - Autistic Spectrum Disorder,,,,,,,,,,,,,Resourced provision,17.0,15.0,,,South East,Canterbury,Westgate,Canterbury,(England/Wales) Urban city and town,E10000016,613518.0,157596.0,Canterbury 020,Canterbury 020E,,,,,Good,South-East England and South London,,100062293053.0,,Not applicable,Not applicable,,,E02006856,E01024126,171.0, +136349,886,Kent,5455,Leigh Academy Tonbridge,Academy converter,Academies,Open,Academy Converter,01-12-2010,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Boys,None,Does not apply,Not applicable,Non-selective,1020.0,No Special Classes,19-01-2023,477.0,476.0,1.0,25.7,Supported by a multi-academy trust,LEIGH ACADEMIES TRUST,Linked to a sponsor,Leigh Academies Trust,Not applicable,,10031580.0,,Not applicable,07-12-2022,29-04-2024,Brook Street,,,Tonbridge,Kent,TN9 2PH,http://leighacademytonbridge.org.uk,1732500600.0,Mr,Michael,Crow,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,Judd,Tonbridge and Malling,(England/Wales) Urban city and town,E10000016,558063.0,145659.0,Tonbridge and Malling 013,Tonbridge and Malling 013A,,,,,Good,South-East England and South London,,200000962881.0,,Not applicable,Not applicable,,,E02005161,E01024757,109.0, +136351,886,Kent,2656,Meopham Community Academy,Academy converter,Academies,Open,Academy Converter,01-12-2010,,,Primary,2.0,11,No boarders,Has Nursery Classes,Not applicable,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,No Special Classes,19-01-2023,467.0,240.0,227.0,6.9,Supported by a multi-academy trust,THE GOLDEN THREAD ALLIANCE,-,,Not applicable,,10032229.0,,Not applicable,16-10-2018,18-04-2024,Longfield Road,Meopham,,Gravesend,Kent,DA13 0JW,http://www.meophamca.com,1474812259.0,Mr,Thomas,Waterman,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Gravesham,Meopham North,Gravesham,(England/Wales) Rural town and fringe,E10000016,564320.0,166643.0,Gravesham 012,Gravesham 012D,,,,,Good,South-East England and South London,,100062313197.0,,Not applicable,Not applicable,,,E02005066,E01024271,30.0, +136359,886,Kent,5406,Dartford Grammar School,Academy converter,Academies,Open,Academy Converter,01-12-2010,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Boys,None,Does not apply,Not applicable,Selective,1550.0,No Special Classes,19-01-2023,1516.0,1291.0,225.0,5.9,Supported by a single-academy trust,DARTFORD GRAMMAR SCHOOL,-,,Not applicable,,10032228.0,,Not applicable,07-12-2022,07-05-2024,West Hill,,,Dartford,Kent,DA1 2HW,http://www.dartfordgrammarschool.org.uk,1322223039.0,Mr,Julian,Metcalf,Headmaster,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Dartford,West Hill,Dartford,(England/Wales) Urban major conurbation,E10000016,553364.0,174104.0,Dartford 003,Dartford 003F,,,,,Outstanding,South-East England and South London,,200000540995.0,,Not applicable,Not applicable,,,E02005030,E01024185,54.0, +136379,886,Kent,4092,Highworth Grammar School,Academy converter,Academies,Open,Academy Converter,01-01-2011,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Girls,Does not apply,Does not apply,Not applicable,Selective,1227.0,No Special Classes,19-01-2023,1542.0,100.0,1442.0,6.7,Supported by a single-academy trust,HIGHWORTH GRAMMAR SCHOOL TRUST,-,,Not applicable,,10032347.0,,Not applicable,14-06-2013,21-05-2024,Maidstone Road,,,Ashford,Kent,TN24 8UD,http://www.highworth.kent.sch.uk/,1233624910.0,Mr,Duncan,Beer,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Ashford,Furley,Ashford,(England/Wales) Urban city and town,E10000016,600386.0,143340.0,Ashford 015,Ashford 015B,,,,,Outstanding,South-East England and South London,,100062560536.0,,Not applicable,Not applicable,,,E02007046,E01023981,73.0, +136382,886,Kent,5462,Chatham & Clarendon Grammar School,Academy converter,Academies,Open,Academy Converter,01-01-2011,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Mixed,None,Does not apply,Not applicable,Selective,1600.0,No Special Classes,19-01-2023,1503.0,766.0,737.0,13.4,Supported by a multi-academy trust,CHATHAM & CLARENDON GRAMMAR SCHOOL,-,,Not applicable,,10032384.0,,Not applicable,16-05-2018,14-05-2024,Chatham Street,,,Ramsgate,Kent,CT11 7PS,http://www.ccgrammarschool.co.uk,1843591075.0,Mrs,Debra,Liddicoat,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Thanet,Eastcliff,South Thanet,(England/Wales) Urban city and town,E10000016,638046.0,165251.0,Thanet 015,Thanet 015D,,,,,Good,South-East England and South London,,100062281955.0,,Not applicable,Not applicable,,,E02005146,E01024670,135.0, +136393,886,Kent,2608,St Stephen's Junior School,Academy converter,Academies,Open,Academy Converter,01-01-2011,,,Primary,7.0,11,No boarders,No Nursery Classes,Not applicable,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,360.0,No Special Classes,19-01-2023,404.0,218.0,186.0,30.0,Supported by a single-academy trust,ST STEPHEN'S ACADEMY CANTERBURY,-,,Not applicable,,10032362.0,,Not applicable,01-03-2023,21-05-2024,Hales Drive,St Stephens,,Canterbury,Kent,CT2 7AD,www.ststephensjuniorschool.co.uk/,1227464119.0,Co Headteacher,Laura Cutts,Sarah Heaney,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Canterbury,St Stephen's,Canterbury,(England/Wales) Urban city and town,E10000016,614829.0,159308.0,Canterbury 013,Canterbury 013B,,,,,Good,South-East England and South London,,200000677176.0,,Not applicable,Not applicable,,,E02005022,E01024100,121.0, +136417,886,Kent,5443,Tonbridge Grammar School,Academy converter,Academies,Open,Academy Converter,01-01-2011,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Girls,None,Does not apply,Not applicable,Selective,1260.0,No Special Classes,19-01-2023,1131.0,29.0,1102.0,1.9,Supported by a single-academy trust,TONBRIDGE GRAMMAR SCHOOL,-,,Not applicable,,10032608.0,,Not applicable,17-10-2019,22-05-2024,Deakin Leas,,,Tonbridge,Kent,TN9 2JR,http://www.tgs.kent.sch.uk,1732365125.0,Mrs,Rebecca,Crean,Head Teacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,Vauxhall,Tonbridge and Malling,(England/Wales) Urban city and town,E10000016,559055.0,145279.0,Tonbridge and Malling 013,Tonbridge and Malling 013C,,,,,Outstanding,South-East England and South London,,100062594177.0,,Not applicable,Not applicable,,,E02005161,E01024778,17.0, +136455,886,Kent,4046,Weald of Kent Grammar School,Academy converter,Academies,Open,Academy Converter,01-02-2011,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Girls,None,Does not apply,Not applicable,Selective,2475.0,No Special Classes,19-01-2023,1966.0,81.0,1885.0,3.3,Supported by a single-academy trust,WEALD OF KENT GRAMMAR SCHOOL ACADEMY TRUST,-,,Not applicable,,10032960.0,,Not applicable,27-04-2022,21-05-2024,Tudeley Lane,,,Tonbridge,Kent,TN9 2JP,http://www.wealdgs.org,1732373500.0,Mr,Richard,Booth,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,Vauxhall,Tonbridge and Malling,(England/Wales) Urban city and town,E10000016,559489.0,145217.0,Tonbridge and Malling 012,Tonbridge and Malling 012E,,,,,Requires improvement,South-East England and South London,,200000962006.0,,Not applicable,Not applicable,,,E02005160,E01024767,50.0, +136465,886,Kent,5448,Herne Bay High School,Academy converter,Academies,Open,Academy Converter,01-03-2011,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Mixed,None,Does not apply,Not applicable,Non-selective,1494.0,No Special Classes,19-01-2023,1586.0,826.0,760.0,25.2,Supported by a single-academy trust,HERNE BAY HIGH SCHOOL,-,,Not applicable,,10032981.0,,Not applicable,15-06-2022,08-04-2024,Bullockstone Road,,,Herne Bay,Kent,CT6 7NS,http://www.hernebayhigh.org,1227361221.0,Mr,Jon,Boyes,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Canterbury,Greenhill,North Thanet,(England/Wales) Urban city and town,E10000016,616784.0,167105.0,Canterbury 003,Canterbury 003A,,,,,Good,South-East England and South London,,10033162926.0,,Not applicable,Not applicable,,,E02005012,E01024064,333.0, +136499,886,Kent,2141,Amherst School,Academy converter,Academies,Open,Academy Converter,01-03-2011,,,Primary,7.0,11,No boarders,No Nursery Classes,Not applicable,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,384.0,No Special Classes,19-01-2023,379.0,205.0,174.0,5.0,Supported by a multi-academy trust,AMHERST SCHOOL (ACADEMY) TRUST,-,,Not applicable,,10033038.0,,Not applicable,11-05-2022,23-05-2024,Witches Lane,Riverhead,,Sevenoaks,Kent,TN13 2AX,http://www.amherst.kent.sch.uk,1732452577.0,Mr,Andrew,Reid,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,"Brasted, Chevening and Sundridge",Sevenoaks,(England/Wales) Urban city and town,E10000016,550933.0,155835.0,Sevenoaks 011,Sevenoaks 011B,,,,,Good,South-East England and South London,,50002017544.0,,Not applicable,Not applicable,,,E02005097,E01024418,19.0, +136501,886,Kent,5428,Sir Roger Manwood's School,Academy converter,Academies,Open,Academy Converter,01-03-2011,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Mixed,None,Does not apply,Not applicable,Selective,1070.0,No Special Classes,19-01-2023,979.0,474.0,505.0,9.4,Supported by a single-academy trust,SIR ROGER MANWOOD'S SCHOOL,-,,Not applicable,,10033035.0,,Not applicable,28-09-2022,25-03-2024,Manwood Road,,,Sandwich,Kent,CT13 9JX,http://www.manwoods.co.uk,1304610200.0,Mr,Lee,Hunter,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,Sandwich,South Thanet,(England/Wales) Rural town and fringe,E10000016,633436.0,157821.0,Dover 002,Dover 002B,,,,,Good,South-East England and South London,,100062284711.0,,Not applicable,Not applicable,,,E02005042,E01024242,71.0, +136570,886,Kent,5449,Queen Elizabeth's Grammar School,Academy converter,Academies,Open,Academy Converter,01-04-2011,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Mixed,None,Does not apply,Not applicable,Selective,1000.0,No Special Classes,19-01-2023,1020.0,503.0,517.0,7.3,Supported by a multi-academy trust,QUEEN ELIZABETH'S GRAMMAR SCHOOL TRUST FAVERSHAM,-,,Not applicable,,10033266.0,,Not applicable,01-03-2023,21-05-2024,Abbey Place,,,Faversham,Kent,ME13 7BQ,http://www.queenelizabeths.kent.sch.uk,1795533132.0,Mr,David,Anderson,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Abbey,Faversham and Mid Kent,(England/Wales) Urban city and town,E10000016,601923.0,161598.0,Swale 015,Swale 015C,,,,,Good,South-East England and South London,,10034900923.0,,Not applicable,Not applicable,,,E02005129,E01024553,56.0, +136571,886,Kent,4172,Hartsdown Academy,Academy converter,Academies,Open,Academy Converter,01-04-2011,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Non-selective,1175.0,Not applicable,19-01-2023,773.0,408.0,365.0,59.9,Supported by a multi-academy trust,COASTAL ACADEMIES TRUST,Linked to a sponsor,Coastal Academies Trust,Not applicable,,10033264.0,,Not applicable,08-12-2021,07-05-2024,George V Avenue,,,Margate,Kent,CT9 5RE,http://hartsdown.org/,1843227957.0,Mr,Matthew,Tate,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Thanet,Garlinge,North Thanet,(England/Wales) Urban city and town,E10000016,634567.0,169921.0,Thanet 005,Thanet 005A,,,,,Good,South-East England and South London,,100062627471.0,,Not applicable,Not applicable,,,E02005136,E01024672,438.0, +136581,886,Kent,4249,Valley Park School,Academy converter,Academies,Open,Academy Converter,01-04-2011,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Mixed,None,Does not apply,Not applicable,Non-selective,1157.0,Not applicable,19-01-2023,1655.0,779.0,876.0,15.5,Supported by a multi-academy trust,VALLEY INVICTA ACADEMIES TRUST,Linked to a sponsor,Valley Invicta Academies Trust,Not applicable,,10033421.0,,Not applicable,05-03-2020,12-04-2024,Huntsman Lane,,,Maidstone,Kent,ME14 5DT,http://www.valleypark.viat.org.uk/,1622679421.0,Mr,D,Jones,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Boxley,Faversham and Mid Kent,(England/Wales) Urban city and town,E10000016,577242.0,155795.0,Maidstone 005,Maidstone 005B,,,,,Good,South-East England and South London,,200003716140.0,,Not applicable,Not applicable,,,E02005072,E01024336,206.0, +136582,886,Kent,4058,Invicta Grammar School,Academy converter,Academies,Open,Academy Converter,01-04-2011,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Girls,None,Does not apply,Not applicable,Selective,1319.0,No Special Classes,19-01-2023,1647.0,43.0,1604.0,5.4,Supported by a multi-academy trust,VALLEY INVICTA ACADEMIES TRUST,Linked to a sponsor,Valley Invicta Academies Trust,Not applicable,,10033423.0,,Not applicable,21-09-2012,06-06-2024,Huntsman Lane,,,Maidstone,Kent,ME14 5DS,http://www.invicta.viat.org.uk,1622755856.0,Mrs,Van,Beales (Executive Headteacher),Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,High Street,Maidstone and The Weald,(England/Wales) Urban city and town,E10000016,577046.0,155881.0,Maidstone 004,Maidstone 004G,,,,,Outstanding,South-East England and South London,,200003717570.0,,Not applicable,Not applicable,,,E02005071,E01033092,68.0, +136583,886,Kent,4196,Towers School and Sixth Form Centre,Academy converter,Academies,Open,Academy Converter,01-04-2011,,,Secondary,11.0,19,No boarders,Not applicable,Has a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Non-selective,1625.0,No Special Classes,19-01-2023,1460.0,676.0,784.0,24.5,Supported by a single-academy trust,TOWERS SCHOOL ACADEMY TRUST,-,,Not applicable,,10033255.0,,Not applicable,23-01-2019,03-06-2024,Faversham Road,Kennington,,Ashford,Kent,TN24 9AL,www.towers.kent.sch.uk,1233634171.0,Mr,Richard,Billings,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Ashford,Kennington,Ashford,(England/Wales) Urban city and town,E10000016,601709.0,145611.0,Ashford 003,Ashford 003B,,,,,Good,South-East England and South London,,200004392081.0,,Not applicable,Not applicable,,,E02004998,E01023999,312.0, +136584,886,Kent,4120,King Ethelbert School,Academy converter,Academies,Open,Academy Converter,01-04-2011,,,Secondary,11.0,16,No boarders,Not applicable,Does not have a sixth form,Mixed,None,Does not apply,Not applicable,Non-selective,750.0,No Special Classes,19-01-2023,757.0,379.0,378.0,25.2,Supported by a multi-academy trust,COASTAL ACADEMIES TRUST,Linked to a sponsor,Coastal Academies Trust,Not applicable,,10033425.0,,Not applicable,03-10-2018,28-05-2024,Canterbury Road,,,Birchington,Kent,CT7 9BL,http://www.kingethelbert.com/,1843831999.0,,Tom,Sellen,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Thanet,Birchington South,North Thanet,(England/Wales) Urban city and town,E10000016,631297.0,169465.0,Thanet 008,Thanet 008C,,,,,Good,South-East England and South London,,100062303868.0,,Not applicable,Not applicable,,,E02005139,E01024638,191.0, +136585,886,Kent,5460,Dane Court Grammar School,Academy converter,Academies,Open,Academy Converter,01-04-2011,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Mixed,None,Does not apply,Not applicable,Selective,1154.0,No Special Classes,19-01-2023,1236.0,589.0,647.0,16.2,Supported by a multi-academy trust,COASTAL ACADEMIES TRUST,Linked to a sponsor,Coastal Academies Trust,Not applicable,,10033426.0,,Not applicable,11-05-2022,08-05-2024,Broadstairs Road,,,Broadstairs,Kent,CT10 2RT,http://danecourt.kent.sch.uk/,1843864941.0,Mr,Martin,Jones,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Thanet,St Peters,South Thanet,(England/Wales) Urban city and town,E10000016,638084.0,167977.0,Thanet 011,Thanet 011C,,,,,Good,South-East England and South London,,200003079311.0,,Not applicable,Not applicable,,,E02005142,E01024689,142.0, +136603,886,Kent,5464,Bennett Memorial Diocesan School,Academy converter,Academies,Open,Academy Converter,01-04-2011,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Non-selective,1452.0,No Special Classes,19-01-2023,1865.0,954.0,911.0,6.7,Supported by a multi-academy trust,THE TENAX SCHOOLS TRUST,Linked to a sponsor,The Tenax Schools Trust,Not applicable,,10033233.0,,Not applicable,14-12-2023,14-05-2024,Culverden Down,,,Tunbridge Wells,Kent,TN4 9SH,https://www.bennettmemorial.co.uk/,1892521595.0,Dr,Karen,Brookes,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,St John's,Tunbridge Wells,(England/Wales) Urban city and town,E10000016,557344.0,140560.0,Tunbridge Wells 007,Tunbridge Wells 007D,,,,,Outstanding,South-East England and South London,,100062585960.0,,Not applicable,Not applicable,,,E02005168,E01024838,98.0, +136727,886,Kent,5422,Oakwood Park Grammar School,Academy converter,Academies,Open,Academy Converter,01-05-2011,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Boys,None,Does not apply,Not applicable,Selective,1035.0,No Special Classes,19-01-2023,1096.0,1047.0,49.0,5.6,Supported by a multi-academy trust,OAKWOOD PARK GRAMMAR SCHOOL,-,,Not applicable,,10033587.0,,Not applicable,07-02-2019,05-06-2024,Oakwood Park,,,Maidstone,Kent,ME16 8AH,http://www.opgs.org,1622726683.0,Mr,Kevin,Moody,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Heath,Maidstone and The Weald,(England/Wales) Urban city and town,E10000016,574384.0,155244.0,Maidstone 008,Maidstone 008C,,,,,Good,South-East England and South London,,200003717871.0,,Not applicable,Not applicable,,,E02005075,E01024367,44.0, +136794,886,Kent,2249,Regis Manor Primary School,Academy converter,Academies,Open,Academy Converter,01-06-2011,,,Primary,3.0,11,No boarders,Has Nursery Classes,Not applicable,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,570.0,No Special Classes,19-01-2023,580.0,293.0,287.0,24.1,Supported by a multi-academy trust,SWALE ACADEMIES TRUST,Linked to a sponsor,Swale Academies Trust,Not applicable,,10033808.0,,Not applicable,04-07-2023,30-04-2024,North Street,,,Sittingbourne,Kent,ME10 2HW,www.regismanor.org.uk,1795472971.0,Mr,Matthew,Perry,Head of School,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Milton Regis,Sittingbourne and Sheppey,(England/Wales) Urban city and town,E10000016,590298.0,165171.0,Swale 007,Swale 007F,,,,,Good,South-East England and South London,United Kingdom,100062375806.0,,Not applicable,Not applicable,,,E02005121,E01024583,130.0, +136847,886,Kent,5439,Mascalls Academy,Academy converter,Academies,Open,Academy Converter,01-07-2011,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Mixed,None,Does not apply,Not applicable,Non-selective,1450.0,Has Special Classes,19-01-2023,1356.0,731.0,625.0,20.1,Supported by a multi-academy trust,LEIGH ACADEMIES TRUST,Linked to a sponsor,Leigh Academies Trust,Not applicable,,10034109.0,,Not applicable,17-11-2021,13-03-2024,Maidstone Road,Paddock Wood,,Tonbridge,Kent,TN12 6LT,http://www.mascallsacademy.org.uk,1892835366.0,Mrs,Jo,Brooks,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Paddock Wood West,Tunbridge Wells,(England/Wales) Rural town and fringe,E10000016,567107.0,143847.0,Tunbridge Wells 001,Tunbridge Wells 001G,,,,,Good,South-East England and South London,,100062545662.0,,Not applicable,Not applicable,,,E02005162,E01024816,231.0, +136923,886,Kent,4000,St Augustine Academy,Academy sponsor led,Academies,Open,New Provision,01-09-2011,Not applicable,,Secondary,11.0,16,No boarders,Not applicable,Does not have a sixth form,Mixed,Church of England,None,Diocese of Canterbury,Non-selective,750.0,Not applicable,19-01-2023,765.0,400.0,365.0,29.9,Supported by a multi-academy trust,WOODARD ACADEMIES TRUST,Linked to a sponsor,Woodard Academies Trust,Not applicable,,10034935.0,,Not applicable,13-07-2023,07-06-2024,Oakwood Road,,,Maidstone,Kent,ME16 8AE,http://www.saa.woodard.co.uk/,1622752490.0,Mr,Steffan,Ball,Principal,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,ASD - Autistic Spectrum Disorder,,,,,,,,,,,,,Resourced provision,12.0,12.0,,,South East,Maidstone,Heath,Maidstone and The Weald,(England/Wales) Urban city and town,E10000016,574440.0,155313.0,Maidstone 008,Maidstone 008C,,,,,Requires improvement,South-East England and South London,,10014313780.0,,Not applicable,Not applicable,,,E02005075,E01024367,229.0, +137071,886,Kent,2000,St Johns Church of England Primary School,Voluntary controlled school,Local authority maintained schools,Open,Result of Amalgamation,01-09-2012,,,Primary,2.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,420.0,No Special Classes,19-01-2023,419.0,218.0,201.0,50.7,Not applicable,,Not applicable,,Not under a federation,,10079922.0,,Not applicable,24-01-2024,21-05-2024,St John's Place,Northgate,,Canterbury,Kent,CT1 1BD,www.stjohns-canterbury.kent.sch.uk/,1227462360.0,Mrs,Jo,Williamson,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Canterbury,Northgate,Canterbury,(England/Wales) Urban city and town,E10000016,615068.0,158363.0,Canterbury 014,Canterbury 014E,,,,,Good,South-East England and South London,,200000678007.0,,Not applicable,Not applicable,,,E02005023,E01024093,212.0, +137099,886,Kent,5465,Gravesend Grammar School,Academy converter,Academies,Open,Academy Converter,01-08-2011,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Boys,None,Does not apply,Not applicable,Selective,1032.0,No Special Classes,19-01-2023,1424.0,1340.0,84.0,7.4,Supported by a multi-academy trust,THE DECUS EDUCATIONAL TRUST,Linked to a sponsor,Gravesend Grammar School,Not applicable,,10034589.0,,Not applicable,26-06-2015,06-06-2024,Church Walk,,,Gravesend,Kent,DA12 2PR,http://gravesendgrammar.com/,1474331893.0,Mr,Malcolm,Moaby,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Gravesham,Denton,Gravesham,(England/Wales) Urban major conurbation,E10000016,565789.0,173594.0,Gravesham 005,Gravesham 005A,,,,,Outstanding,South-East England and South London,,10012012057.0,,Not applicable,Not applicable,,,E02005059,E01024259,76.0, +137104,886,Kent,5450,Hillview School for Girls,Academy converter,Academies,Open,Academy Converter,01-08-2011,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Girls,None,Does not apply,Not applicable,Non-selective,1340.0,No Special Classes,19-01-2023,1496.0,58.0,1438.0,12.6,Supported by a single-academy trust,HILLVIEW SCHOOL FOR GIRLS ACADEMY TRUST,-,,Not applicable,,10034679.0,,Not applicable,20-09-2023,23-05-2024,Brionne Gardens,,,Tonbridge,Kent,TN9 2HE,http://www.hillview.kent.sch.uk,1732352793.0,Mrs,Hilary,Burkett,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,Vauxhall,Tonbridge and Malling,(England/Wales) Urban city and town,E10000016,559690.0,145686.0,Tonbridge and Malling 012,Tonbridge and Malling 012E,,,,,Good,South-East England and South London,,200000962877.0,,Not applicable,Not applicable,,,E02005160,E01024767,144.0, +137136,886,Kent,2001,Horizon Primary Academy,Academy sponsor led,Academies,Open,New Provision,01-09-2011,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Not applicable,Mixed,None,None,Not applicable,Not applicable,210.0,Not applicable,19-01-2023,202.0,109.0,93.0,41.6,Supported by a multi-academy trust,THE KEMNAL ACADEMIES TRUST,Linked to a sponsor,The Kemnal Academies Trust,Not applicable,,10034965.0,,Not applicable,15-11-2018,21-05-2024,Hilda May Avenue,,,Swanley,Kent,BR8 7BT,www.horizon-tkat.org/,1322665235.0,Mr,David,Moss,Headteacher,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Swanley White Oak,Sevenoaks,(England/Wales) Urban major conurbation,E10000016,551164.0,169131.0,Sevenoaks 002,Sevenoaks 002D,,,,,Good,South-East England and South London,,100062622098.0,,Not applicable,Not applicable,,,E02005088,E01024480,84.0, +137227,886,Kent,5403,Wilmington Grammar School for Boys,Academy converter,Academies,Open,Academy Converter,01-08-2011,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Boys,None,Does not apply,Not applicable,Selective,848.0,No Special Classes,19-01-2023,1079.0,993.0,86.0,8.1,Supported by a multi-academy trust,ENDEAVOUR MAT,-,,Not applicable,,10034780.0,,Not applicable,14-03-2023,07-05-2024,Common Lane,Wilmington,,Dartford,Kent,DA2 7DA,http://www.wgsb.co.uk,1322223090.0,Mr,Stuart,Harrington,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dartford,Maypole & Leyton Cross,Dartford,(England/Wales) Urban major conurbation,E10000016,552660.0,172195.0,Dartford 011,Dartford 011D,,,,,Good,South-East England and South London,,200000534710.0,,Not applicable,Not applicable,,,E02005038,E01024189,68.0, +137250,886,Kent,5400,Wilmington Grammar School for Girls,Academy converter,Academies,Open,Academy Converter,01-08-2011,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Girls,None,Does not apply,Not applicable,Selective,1070.0,No Special Classes,19-01-2023,1068.0,92.0,976.0,4.6,Supported by a multi-academy trust,ENDEAVOUR MAT,-,,Not applicable,,10034848.0,,Not applicable,17-11-2022,05-06-2024,Wilmington Grange,Parsons Lane,Wilmington,Dartford,Kent,DA2 7BB,http://www.gsgw.org.uk/,1322226351.0,Mrs,Michelle,Lawson,Head Teacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,Not applicable,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dartford,Maypole & Leyton Cross,Dartford,(England/Wales) Urban major conurbation,E10000016,552565.0,172488.0,Dartford 011,Dartford 011C,,,,,Good,South-East England and South London,,200000534735.0,,Not applicable,Not applicable,,,E02005038,E01024188,38.0, +137397,886,Kent,2246,Sheldwich Primary School,Academy converter,Academies,Open,Academy Converter,01-09-2011,,,Primary,2.0,11,No boarders,No Nursery Classes,Not applicable,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,267.0,124.0,143.0,6.0,Supported by a single-academy trust,SHELDWICH PRIMARY SCHOOL,-,,Not applicable,,10035075.0,,Not applicable,09-11-2012,22-05-2024,Lees Court Road,Sheldwich,,Faversham,Kent,ME13 0LU,http://www.sheldwich.kent.sch.uk,1795532779.0,Mrs,Sarah,Garrett,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Boughton and Courtenay,Faversham and Mid Kent,(England/Wales) Rural village,E10000016,601215.0,156561.0,Swale 017,Swale 017A,,,,,Outstanding,South-East England and South London,,200002532965.0,,Not applicable,Not applicable,,,E02005131,E01024555,16.0, +137458,886,Kent,5466,Brockhill Park Performing Arts College,Academy converter,Academies,Open,Academy Converter,01-09-2011,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Mixed,None,Does not apply,Not applicable,Non-selective,1384.0,No Special Classes,19-01-2023,1351.0,680.0,671.0,25.7,Supported by a single-academy trust,BROCKHILL PARK PERFORMING ARTS COLLEGE,-,,Not applicable,,10035076.0,,Not applicable,13-10-2021,05-04-2024,Sandling Road,Saltwood,,Hythe,Kent,CT21 4HL,http://www.brockhill.kent.sch.uk/,1303265521.0,Mr,Charles,Joseph,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Folkestone and Hythe,Hythe,Folkestone and Hythe,(England/Wales) Urban city and town,E10000016,614826.0,135838.0,Folkestone and Hythe 008,Folkestone and Hythe 008D,,,,,Good,South-East England and South London,,50016401.0,,Not applicable,Not applicable,,,E02005109,E01024550,301.0, +137467,886,Kent,2233,Lynsted and Norton Primary School,Academy converter,Academies,Open,Academy Converter,01-09-2011,,,Primary,4.0,11,No boarders,No Nursery Classes,Not applicable,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,105.0,No Special Classes,19-01-2023,73.0,41.0,32.0,45.2,Supported by a multi-academy trust,OUR COMMUNITY MULTI ACADEMY TRUST,-,,Not applicable,,10035094.0,,Not applicable,08-03-2023,23-04-2024,Lynsted Lane,Lynsted,,Sittingbourne,Kent,ME9 0RL,www.lynsted-norton.kent.sch.uk,1795521362.0,Mrs,Catherine,McLaughlin,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Teynham and Lynsted,Sittingbourne and Sheppey,(England/Wales) Rural hamlet and isolated dwellings,E10000016,594445.0,161097.0,Swale 016,Swale 016E,,,,,Requires improvement,South-East England and South London,,200002528949.0,,Not applicable,Not applicable,,,E02005130,E01024624,33.0, +137474,886,Kent,5444,Barton Court Grammar School,Academy converter,Academies,Open,Academy Converter,01-09-2011,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Mixed,None,Does not apply,Not applicable,Selective,810.0,No Special Classes,19-01-2023,985.0,577.0,408.0,9.2,Supported by a multi-academy trust,BARTON COURT ACADEMY TRUST,Linked to a sponsor,Barton Court Academy Trust,Not applicable,,10035093.0,,Not applicable,12-02-2020,23-04-2024,Longport,,,Canterbury,Kent,CT1 1PH,http://www.bartoncourt.org,1227464600.0,Mr,Jonathan,Hopkins,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Canterbury,Barton,Canterbury,(England/Wales) Urban city and town,E10000016,615693.0,157611.0,Canterbury 016,Canterbury 016A,,,,,Good,South-East England and South London,,100062279040.0,,Not applicable,Not applicable,,,E02005025,E01024044,67.0, +137481,886,Kent,3112,Selling Church of England Primary School,Academy converter,Academies,Open,Academy Converter,01-09-2011,,,Primary,4.0,11,No boarders,No Nursery Classes,Not applicable,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,210.0,No Special Classes,19-01-2023,128.0,75.0,53.0,21.1,Supported by a multi-academy trust,OUR COMMUNITY MULTI ACADEMY TRUST,-,,Not applicable,,10035102.0,,Not applicable,11-11-2021,06-05-2024,The Street,Selling,,Faversham,Kent,ME13 9RQ,http://www.selling-faversham.kent.sch.uk/,1227752202.0,Mr,Richard,Paez,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Boughton and Courtenay,Faversham and Mid Kent,(England/Wales) Rural village,E10000016,603872.0,156507.0,Swale 017,Swale 017A,,,,,Good,South-East England and South London,,10023196074.0,,Not applicable,Not applicable,,,E02005131,E01024555,27.0, +137483,886,Kent,3110,Milstead and Frinsted Church of England Primary School,Academy converter,Academies,Open,Academy Converter,01-09-2011,,,Primary,4.0,11,No boarders,No Nursery Classes,Not applicable,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,70.0,No Special Classes,19-01-2023,85.0,48.0,37.0,23.5,Supported by a multi-academy trust,OUR COMMUNITY MULTI ACADEMY TRUST,-,,Not applicable,,10035126.0,,Not applicable,03-11-2022,31-05-2024,School Lane,Milstead,,Sittingbourne,Kent,ME9 0SJ,http://www.milstead.kent.sch.uk,1795830241.0,Mr,Scott,Guy,Head Teacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,West Downs,Sittingbourne and Sheppey,(England/Wales) Rural hamlet and isolated dwellings,E10000016,590320.0,158072.0,Swale 013,Swale 013C,,,,,Requires improvement,South-East England and South London,,100062626973.0,,Not applicable,Not applicable,,,E02005127,E01024628,20.0, +137484,886,Kent,5408,Homewood School and Sixth Form Centre,Academy converter,Academies,Open,Academy Converter,01-09-2011,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Mixed,None,Does not apply,Not applicable,Non-selective,2156.0,No Special Classes,19-01-2023,2103.0,960.0,1143.0,26.5,Supported by a multi-academy trust,TENTERDEN SCHOOLS TRUST,-,,Not applicable,,10035054.0,,Not applicable,26-04-2023,14-05-2024,Ashford Road,,,Tenterden,Kent,TN30 6LT,http://www.homewood-school.co.uk/,1580764222.0,Mr,Jeremy,Single,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Ashford,Tenterden North,Ashford,(England/Wales) Rural town and fringe,E10000016,588805.0,134276.0,Ashford 013,Ashford 013E,,,,,Good,South-East England and South London,,100062566868.0,,Not applicable,Not applicable,,,E02005008,E01024024,464.0, +137529,886,Kent,2288,Smarden Primary School,Academy converter,Academies,Open,Academy Converter,01-10-2011,,,Primary,2.0,11,No boarders,Has Nursery Classes,Not applicable,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,105.0,No Special Classes,19-01-2023,174.0,97.0,77.0,8.6,Supported by a multi-academy trust,THE KEMNAL ACADEMIES TRUST,Linked to a sponsor,The Kemnal Academies Trust,Not applicable,,10035486.0,,Not applicable,11-05-2023,27-03-2024,Pluckley Road,Smarden,,Ashford,Kent,TN27 8ND,www.smardenprimaryschool.co.uk/,1233770316.0,Mrs,Claudia,Miller,Executive Head Teacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Ashford,Weald North,Ashford,(England/Wales) Rural village,E10000016,588338.0,142472.0,Ashford 011,Ashford 011D,,,,,Good,South-East England and South London,,100062563757.0,,Not applicable,Not applicable,,,E02005006,E01024036,15.0, +137581,886,Kent,4001,Ebbsfleet Academy,Academy sponsor led,Academies,Open,New Provision,01-11-2013,Not applicable,,Secondary,11.0,18,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,None,None,Not applicable,Non-selective,750.0,No Special Classes,19-01-2023,766.0,421.0,345.0,34.1,Supported by a multi-academy trust,LEIGH ACADEMIES TRUST,Linked to a sponsor,Leigh Academies Trust,Not applicable,,10038343.0,,Not applicable,02-10-2019,14-03-2024,Southfleet Road,,,Swanscombe,Kent,DA10 0BZ,http://www.ebbsfleetacademy.org.uk,1322242252.0,Mrs,Gurjit Kaur,Shergill,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,Not applicable,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dartford,Swanscombe,Dartford,(England/Wales) Urban major conurbation,E10000016,560829.0,173926.0,Dartford 004,Dartford 004B,,,,,Good,South-East England and South London,,200000535991.0,,Not applicable,Not applicable,,,E02005031,E01024176,237.0, +137609,886,Kent,5404,Saint George's Church of England School,Academy converter,Academies,Open,Academy Converter,01-11-2011,,,All-through,4.0,18,No boarders,Not applicable,Has a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Non-selective,1410.0,No Special Classes,19-01-2023,1381.0,722.0,659.0,17.4,Supported by a multi-academy trust,ALETHEIA ACADEMIES TRUST,Linked to a sponsor,Aletheia Academies Trust,Not applicable,,10035681.0,,Not applicable,18-10-2023,25-04-2024,Meadow Road,,,Gravesend,Kent,DA11 7LS,http://www.saintgeorgescofe.kent.sch.uk,1474533082.0,Mr,Simon,Murphy,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Gravesham,Woodlands,Gravesham,(England/Wales) Urban major conurbation,E10000016,564257.0,172583.0,Gravesham 005,Gravesham 005E,,,,,Good,South-East England and South London,,100062310647.0,,Not applicable,Not applicable,,,E02005059,E01024317,202.0, +137615,886,Kent,3372,"Maidstone, St John's Church of England Primary School",Academy converter,Academies,Open,Academy Converter,01-11-2011,,,Primary,4.0,11,No boarders,No Nursery Classes,Not applicable,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,420.0,No Special Classes,19-01-2023,441.0,211.0,230.0,8.4,Supported by a single-academy trust,ST JOHN'S CHURCH OF ENGLAND PRIMARY SCHOOL MAIDSTONE,-,,Not applicable,,10035701.0,,Not applicable,16-07-2015,16-04-2024,Provender Way,Grove Green,,Maidstone,Kent,ME14 5TZ,www.st-johns-maidstone.kent.sch.uk/,1622735916.0,Mr,D J,Smith,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Boxley,Faversham and Mid Kent,(England/Wales) Urban city and town,E10000016,578084.0,155874.0,Maidstone 005,Maidstone 005C,,,,,Outstanding,South-East England and South London,,200003688398.0,,Not applicable,Not applicable,,,E02005072,E01024337,37.0, +137660,886,Kent,2500,Joydens Wood Infant School,Academy converter,Academies,Open,Academy Converter,01-11-2011,,,Primary,4.0,7,No boarders,No Nursery Classes,Not applicable,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,270.0,No Special Classes,19-01-2023,238.0,122.0,116.0,5.5,Supported by a multi-academy trust,NEXUS EDUCATION SCHOOLS TRUST,Linked to a sponsor,Nexus Education Schools Trust,Not applicable,,10035690.0,,Not applicable,05-10-2023,29-04-2024,Park Way,,,Bexley,Kent,DA5 2JD,www.joydens-wood-infant.kent.sch.uk/,1322523188.0,Headteacher,Allison Morris/,Gerard Strong,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dartford,Joyden's Wood,Dartford,(England/Wales) Urban major conurbation,E10000016,551436.0,172012.0,Dartford 010,Dartford 010D,,,,,Good,South-East England and South London,,200000534792.0,,Not applicable,Not applicable,,,E02005037,E01024153,13.0, +137661,886,Kent,2438,Joydens Wood Junior School,Academy converter,Academies,Open,Academy Converter,01-11-2011,,,Primary,7.0,11,No boarders,No Nursery Classes,Not applicable,Mixed,Does not apply,Does not apply,Not applicable,Non-selective,280.0,No Special Classes,19-01-2023,294.0,147.0,147.0,9.5,Supported by a multi-academy trust,NEXUS EDUCATION SCHOOLS TRUST,Linked to a sponsor,Nexus Education Schools Trust,Not applicable,,10035673.0,,Not applicable,08-06-2022,04-04-2024,Birchwood Drive,Wilmington,,Dartford,Kent,DA2 7NE,http://www.joydens-wood-junior.kent.sch.uk,1322522151.0,Mr,Paul,Redford,Acting Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dartford,Joyden's Wood,Dartford,(England/Wales) Urban major conurbation,E10000016,551348.0,171986.0,Dartford 010,Dartford 010A,,,,,Requires improvement,South-East England and South London,,100060870222.0,,Not applicable,Not applicable,,,E02005037,E01024150,28.0, +137663,886,Kent,5219,Wilmington Primary School,Academy converter,Academies,Open,Academy Converter,01-11-2011,,,Primary,4.0,11,No boarders,No Nursery Classes,Not applicable,Mixed,None,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,210.0,112.0,98.0,7.1,Supported by a multi-academy trust,ENDEAVOUR MAT,-,,Not applicable,,10035695.0,,Not applicable,20-06-2019,22-04-2024,Common Lane,Wilmington,,Dartford,Kent,DA2 7DF,www.wilmingtonprimaryschool.co.uk,1322274080.0,Mrs,Charlotte,Scott,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dartford,"Wilmington, Sutton-at-Hone & Hawley",Dartford,(England/Wales) Urban major conurbation,E10000016,552812.0,172220.0,Dartford 011,Dartford 011C,,,,,Good,South-East England and South London,,200000534694.0,,Not applicable,Not applicable,,,E02005038,E01024188,15.0, +137687,886,Kent,4002,The Sittingbourne School,Academy sponsor led,Academies,Open,New Provision,01-01-2012,Not applicable,,Secondary,11.0,19,No boarders,Not applicable,Has a sixth form,Mixed,None,None,Not applicable,Non-selective,1350.0,No Special Classes,19-01-2023,1589.0,777.0,812.0,36.4,Supported by a multi-academy trust,SWALE ACADEMIES TRUST,Linked to a sponsor,Swale Academies Trust,Not applicable,,10036067.0,,Not applicable,22-03-2023,21-05-2024,Swanstree Avenue,,,Sittingbourne,Kent,ME10 4NL,http://www.thesittingbourneschool.org.uk,1795472449.0,Mr,Nick,Smith,Trust Principal,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,HI - Hearing Impairment,"SLCN - Speech, language and Communication",,,,,,,,,,,,Resourced provision,82.0,60.0,,,South East,Swale,Roman,Sittingbourne and Sheppey,(England/Wales) Urban city and town,E10000016,592123.0,162907.0,Swale 011,Swale 011D,,,,,Good,South-East England and South London,,100062627032.0,,Not applicable,Not applicable,,,E02005125,E01024600,509.0, +137728,886,Kent,3025,Chiddingstone Church of England School,Academy converter,Academies,Open,Academy Converter,01-12-2011,,,Primary,5.0,11,No boarders,No Nursery Classes,Not applicable,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,210.0,No Special Classes,19-01-2023,209.0,96.0,113.0,4.3,Supported by a single-academy trust,CHIDDINGSTONE CHURCH OF ENGLAND SCHOOL,-,,Not applicable,,10035696.0,,Not applicable,27-03-2015,15-04-2024,Chiddingstone,,,Edenbridge,Kent,TN8 7AH,www.chiddingstoneschool.co.uk/,1892870339.0,,Kate,Haysom,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,"Penshurst, Fordcombe and Chiddingstone",Tonbridge and Malling,(England/Wales) Rural village,E10000016,550144.0,145154.0,Sevenoaks 015,Sevenoaks 015C,,,,,Outstanding,South-East England and South London,,10035181506.0,,Not applicable,Not applicable,,,E02005101,E01024455,9.0, +137739,886,Kent,5416,Cranbrook School,Academy converter,Academies,Open,Academy Converter,01-12-2011,,,Secondary,11.0,18,Boarding school,Not applicable,Has a sixth form,Mixed,Christian,Does not apply,Not applicable,Selective,910.0,No Special Classes,19-01-2023,884.0,515.0,369.0,2.7,Supported by a single-academy trust,CRANBROOK SCHOOL ACADEMY TRUST,-,,Not applicable,,10035657.0,,Not applicable,23-03-2022,30-04-2024,Waterloo Road,,,Cranbrook,Kent,TN17 3JD,http://www.cranbrookschool.co.uk/,1580711800.0,Mr,David,Clark,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Benenden and Cranbrook,Maidstone and The Weald,(England/Wales) Rural town and fringe,E10000016,577829.0,136133.0,Tunbridge Wells 013,Tunbridge Wells 013C,,,,,Good,South-East England and South London,,100062552225.0,,Not applicable,Not applicable,,,E02005174,E01024790,15.0, +137800,886,Kent,4527,Borden Grammar School,Academy converter,Academies,Open,Academy Converter,01-01-2012,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Boys,None,Does not apply,Not applicable,Selective,802.0,No Special Classes,19-01-2023,889.0,861.0,28.0,9.8,Supported by a single-academy trust,BORDEN GRAMMAR SCHOOL TRUST,-,,Not applicable,,10035796.0,,Not applicable,24-11-2021,15-05-2024,Avenue of Remembrance,,,Sittingbourne,Kent,ME10 4DB,http://website.bordengrammar.kent.sch.uk/,1795424192.0,Mr,Ashley,Tomlin,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Homewood,Sittingbourne and Sheppey,(England/Wales) Urban city and town,E10000016,590580.0,163359.0,Swale 013,Swale 013A,,,,,Good,South-East England and South London,,100062376270.0,,Not applicable,Not applicable,,,E02005127,E01024606,65.0, +137806,886,Kent,2002,Repton Manor Primary School,Foundation school,Local authority maintained schools,Open,New Provision,01-09-2012,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,None,Does not apply,Not applicable,Not applicable,420.0,No Special Classes,19-01-2023,471.0,244.0,227.0,19.5,Not supported by a trust,,Not applicable,,Supported by a federation,The Lightyear Federation,10072299.0,,Not applicable,29-11-2023,06-03-2024,Repton Avenue,,,Ashford,Kent,TN23 3RX,http://www.reptonmanorprimary.co.uk/,1233666307.0,Mr,Matthew,Rawling,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Ashford,Repton,Ashford,(England/Wales) Urban city and town,E10000016,599566.0,143671.0,Ashford 016,Ashford 016B,,,,,Good,South-East England and South London,,10012859115.0,,Not applicable,Not applicable,,,E02007047,E01032820,92.0, +137833,886,Kent,5401,The Maplesden Noakes School,Academy converter,Academies,Open,Academy Converter,01-02-2012,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Mixed,None,Does not apply,Not applicable,Non-selective,1500.0,No Special Classes,19-01-2023,1359.0,675.0,684.0,18.1,Supported by a single-academy trust,THE MAPLESDEN NOAKES SCHOOL,Linked to a sponsor,The Maplesden Noakes School,Not applicable,,10036261.0,,Not applicable,14-11-2018,30-04-2024,Buckland Road,,,Maidstone,Kent,ME16 0TJ,http://www.maplesden.kent.sch.uk/,1622759036.0,Mr,Richard,Owen,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Maidstone,Bridge,Maidstone and The Weald,(England/Wales) Urban city and town,E10000016,575149.0,156457.0,Maidstone 006,Maidstone 006B,,,,,Good,South-East England and South London,,200003670026.0,,Not applicable,Not applicable,,,E02005073,E01024340,197.0, +137834,886,Kent,5467,"Mayfield Grammar School, Gravesend",Academy converter,Academies,Open,Academy Converter,01-02-2012,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Girls,None,Does not apply,Not applicable,Selective,1207.0,No Special Classes,19-01-2023,1349.0,40.0,1309.0,10.5,Supported by a single-academy trust,"MAYFIELD GRAMMAR SCHOOL, GRAVESEND",-,,Not applicable,,10036417.0,,Not applicable,12-06-2013,09-05-2024,Pelham Road,,,Gravesend,Kent,DA11 0JE,http://www.mgsg.kent.sch.uk/,1474352896.0,Headteacher,Elaine,Wilson,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Gravesham,Pelham,Gravesham,(England/Wales) Urban major conurbation,E10000016,564094.0,173489.0,Gravesham 002,Gravesham 002C,,,,,Outstanding,South-East England and South London,,100062310034.0,,Not applicable,Not applicable,,,E02005056,E01024290,107.0, +137836,886,Kent,2684,Wentworth Primary School,Academy converter,Academies,Open,Academy Converter,01-02-2012,,,Primary,4.0,11,No boarders,No Nursery Classes,Not applicable,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,630.0,Not applicable,19-01-2023,651.0,321.0,330.0,14.9,Supported by a single-academy trust,WENTWORTH PRIMARY SCHOOL,-,,Not applicable,,10036263.0,,Not applicable,08-06-2023,21-05-2024,Wentworth Drive,,,Dartford,Kent,DA1 3NG,www.wentworthonline.co.uk/,1322225694.0,Mr,Lewis,Pollock,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dartford,Heath,Dartford,(England/Wales) Urban major conurbation,E10000016,552144.0,173935.0,Dartford 007,Dartford 007A,,,,,Good,South-East England and South London,,,,Not applicable,Not applicable,,,E02005034,E01024144,97.0, +137837,886,Kent,5437,The Folkestone School for Girls,Academy converter,Academies,Open,Academy Converter,01-02-2012,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Girls,None,Does not apply,Not applicable,Selective,1053.0,No Special Classes,19-01-2023,1217.0,0.0,1217.0,12.1,Supported by a multi-academy trust,THE FOLKESTONE SCHOOL FOR GIRLS ACADEMY TRUST,-,,Not applicable,,10036180.0,,Not applicable,12-10-2012,17-04-2024,Coolinge Lane,,,Folkestone,Kent,CT20 3RB,http://www.folkestonegirls.kent.sch.uk/,1303251125.0,Mr,Mark,Lester,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Folkestone and Hythe,Sandgate & West Folkestone,Folkestone and Hythe,(England/Wales) Urban city and town,E10000016,620830.0,135551.0,Folkestone and Hythe 006,Folkestone and Hythe 006H,,,,,Outstanding,South-East England and South London,,50026109.0,,Not applicable,Not applicable,,,E02005107,E01024521,112.0, +137871,886,Kent,2229,Graveney Primary School,Academy converter,Academies,Open,Academy Converter,01-02-2012,,,Primary,4.0,11,No boarders,No Nursery Classes,Not applicable,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,105.0,No Special Classes,19-01-2023,100.0,50.0,50.0,18.0,Supported by a multi-academy trust,GRAVENEY PRIMARY SCHOOL,-,,Not applicable,,10035872.0,,Not applicable,04-10-2023,17-04-2024,Seasalter Road,Graveney,,Faversham,Kent,ME13 9DU,www.graveneyprimary.com,1795532005.0,Mrs,Alison,Blackwell,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Boughton and Courtenay,Faversham and Mid Kent,(England/Wales) Rural village,E10000016,605092.0,162256.0,Swale 017,Swale 017B,,,,,Good,South-East England and South London,,200002531105.0,,Not applicable,Not applicable,,,E02005131,E01024556,18.0, +137881,886,Kent,2003,Oaks Primary Academy,Academy sponsor led,Academies,Open,New Provision,01-04-2012,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,None,None,Not applicable,Not applicable,213.0,No Special Classes,19-01-2023,216.0,103.0,113.0,40.4,Supported by a multi-academy trust,LEIGH ACADEMIES TRUST,Linked to a sponsor,Leigh Academies Trust,Not applicable,,10037058.0,,Not applicable,22-09-2021,28-05-2024,Oak Tree Avenue,,,Maidstone,Kent,ME15 9AX,http://www.oaksprimaryacademy.org.uk,1622755960.0,Principal,Tom,Moore,Principal,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Shepway North,Faversham and Mid Kent,(England/Wales) Urban city and town,E10000016,577321.0,153197.0,Maidstone 013,Maidstone 013C,,,,,Outstanding,South-East England and South London,,200003718069.0,,Not applicable,Not applicable,,,E02005080,E01024391,78.0, +137882,886,Kent,2004,Tree Tops Primary Academy,Academy sponsor led,Academies,Open,New Provision,01-04-2012,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,None,None,Not applicable,Not applicable,315.0,No Special Classes,19-01-2023,314.0,148.0,166.0,48.8,Supported by a multi-academy trust,LEIGH ACADEMIES TRUST,Linked to a sponsor,Leigh Academies Trust,Not applicable,,10037063.0,,Not applicable,12-06-2019,13-09-2023,Brishing Lane,Park Wood,,Maidstone,Kent,ME15 9EZ,http://www.treetopsprimaryacademy.org/,1622754888.0,Miss,Denise,White,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Park Wood,Faversham and Mid Kent,(England/Wales) Urban city and town,E10000016,578482.0,152246.0,Maidstone 013,Maidstone 013I,,,,,Good,South-East England and South London,,10014314389.0,,Not applicable,Not applicable,,,E02005080,E01034996,148.0, +137961,886,Kent,2264,Hampton Primary School,Academy converter,Academies,Open,Academy Converter,01-04-2012,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,710.0,No Special Classes,19-01-2023,675.0,348.0,327.0,28.1,Supported by a single-academy trust,HAMPTON PRIMARY SCHOOL ACADEMY,-,,Not applicable,,10036924.0,,Not applicable,11-03-2020,07-05-2024,Fitzgerald Avenue,,,Herne Bay,Kent,CT6 8NB,www.hampton.kent.sch.uk,1227372159.0,Ms,Yvonne,Nunn,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,PD - Physical Disability,,,,,,,,,,,,,Resourced provision,,,,,South East,Canterbury,West Bay,North Thanet,(England/Wales) Urban city and town,E10000016,616209.0,167469.0,Canterbury 004,Canterbury 004D,,,,,Good,South-East England and South London,,200000682720.0,,Not applicable,Not applicable,,,E02005013,E01024119,188.0, +138001,886,Kent,3142,Pluckley Church of England Primary School,Academy converter,Academies,Open,Academy Converter,01-04-2012,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,105.0,No Special Classes,19-01-2023,96.0,51.0,45.0,15.6,Supported by a multi-academy trust,THE KEMNAL ACADEMIES TRUST,Linked to a sponsor,The Kemnal Academies Trust,Not applicable,,10036989.0,,Not applicable,06-06-2019,15-04-2024,The Street,Pluckley,,Ashford,Kent,TN27 0QS,www.pluckleyprimaryschool.co.uk,1233840422.0,Mrs,Lorraine,Smith,Executive Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Ashford,Upper Weald,Ashford,(England/Wales) Rural village,E10000016,592582.0,145357.0,Ashford 002,Ashford 002E,,,,,Good,South-East England and South London,,100062563578.0,,Not applicable,Not applicable,,,E02004997,E01024033,15.0, +138019,886,Kent,4528,The Norton Knatchbull School,Academy converter,Academies,Open,Academy Converter,01-04-2012,,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Boys,None,Does not apply,Not applicable,Selective,1316.0,No Special Classes,19-01-2023,1252.0,1226.0,26.0,7.9,Supported by a single-academy trust,THE NORTON KNATCHBULL SCHOOL,-,,Not applicable,,10036999.0,,Not applicable,14-12-2023,07-06-2024,Hythe Road,,,Ashford,Kent,TN24 0QJ,http://www.nks.kent.sch.uk,1233620045.0,Mr,Ben,Greene,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Ashford,Furley,Ashford,(England/Wales) Urban city and town,E10000016,602275.0,142571.0,Ashford 005,Ashford 005C,,,,,Good,South-East England and South London,,100062559840.0,,Not applicable,Not applicable,,,E02005000,E01024023,79.0, +138034,886,Kent,2232,Luddenham School,Academy converter,Academies,Open,Academy Converter,01-04-2012,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,201.0,92.0,109.0,25.4,Supported by a single-academy trust,LUDDENHAM SCHOOL,-,,Not applicable,,10037009.0,,Not applicable,27-02-2019,04-06-2024,Luddenham,,,Faversham,Kent,ME13 0TE,www.luddenham.kent.sch.uk,1795532061.0,Mrs,Claire,Vincett,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Teynham and Lynsted,Sittingbourne and Sheppey,(England/Wales) Rural hamlet and isolated dwellings,E10000016,599374.0,162425.0,Swale 016,Swale 016C,,,,,Good,South-East England and South London,,200002532858.0,,Not applicable,Not applicable,,,E02005130,E01024622,51.0, +138074,886,Kent,2006,St James the Great Academy,Academy sponsor led,Academies,Open,New Provision,01-04-2012,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,None,None,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,197.0,101.0,96.0,42.6,Supported by a multi-academy trust,ACADEMIES ENTERPRISE TRUST,Linked to a sponsor,Academies Enterprise Trust (AET),Not applicable,,10037082.0,,Not applicable,13-09-2023,23-05-2024,Chapman Way,,,East Malling,Kent,ME19 6SD,http://www.stjamesthegreatacademy.org/,1732841912.0,Miss,Tamasin,Springett,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,"East Malling, West Malling & Offham",Tonbridge and Malling,(England/Wales) Urban city and town,E10000016,569675.0,157748.0,Tonbridge and Malling 014,Tonbridge and Malling 014B,,,,,Good,South-East England and South London,,100062388024.0,,Not applicable,Not applicable,,,E02006833,E01024742,81.0, +138151,886,Kent,2595,Grove Park Primary School,Academy converter,Academies,Open,Academy Converter,01-06-2012,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,No Special Classes,19-01-2023,412.0,214.0,198.0,21.1,Supported by a multi-academy trust,BOURNE ALLIANCE MULTI ACADEMY TRUST,Linked to a sponsor,TIMU Academy Trust,Not applicable,,10037293.0,,Not applicable,24-05-2023,16-04-2024,Hilton Drive,,,Sittingbourne,Kent,ME10 1PT,www.grovepark-ba-mat.org.uk,1795477417.0,Mrs,Lauren,Flain,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Borden and Grove Park,Sittingbourne and Sheppey,(England/Wales) Urban city and town,E10000016,588827.0,164604.0,Swale 009,Swale 009H,,,,,Requires improvement,South-East England and South London,,200002527488.0,,Not applicable,Not applicable,,,E02005123,E01035306,87.0, +138167,886,Kent,4113,Astor Secondary School,Academy converter,Academies,Open,Academy Converter,02-06-2012,,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Non-selective,1230.0,No Special Classes,19-01-2023,803.0,348.0,455.0,49.3,Supported by a multi-academy trust,SAMPHIRE STAR EDUCATION TRUST,-,,Not applicable,,10037500.0,,Not applicable,01-11-2023,15-04-2024,Astor Avenue,,,Dover,Kent,CT17 0AS,http://www.astorschool.com,1304201151.0,Mr,Lee,Kane,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Dover,Tower Hamlets,Dover,(England/Wales) Urban city and town,E10000016,630219.0,141531.0,Dover 011,Dover 011H,,,,,Requires improvement,South-East England and South London,,10034874352.0,,Not applicable,Not applicable,,,E02005051,E01024248,350.0, +138168,886,Kent,2315,White Cliffs Primary and Nursery School,Academy converter,Academies,Open,Academy Converter,01-06-2012,,,Primary,2.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,360.0,No Special Classes,19-01-2023,315.0,179.0,136.0,59.0,Supported by a multi-academy trust,SAMPHIRE STAR EDUCATION TRUST,-,,Not applicable,,10037463.0,,Not applicable,09-01-2019,22-05-2024,St Radigund's Road,,,Dover,Kent,CT17 0LB,http://www.whitecliffsprimary.com,1304206174.0,Mrs,Helen,Castle,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,St Radigunds,Dover,(England/Wales) Urban city and town,E10000016,630188.0,142202.0,Dover 011,Dover 011F,,,,,Good,South-East England and South London,,200002882635.0,,Not applicable,Not applicable,,,E02005051,E01024240,186.0, +138169,886,Kent,2310,Barton Junior School,Academy converter,Academies,Open,Academy Converter,01-06-2012,,,Primary,7.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,240.0,No Special Classes,19-01-2023,215.0,121.0,94.0,53.5,Supported by a multi-academy trust,SAMPHIRE STAR EDUCATION TRUST,-,,Not applicable,,10037462.0,,Not applicable,05-12-2018,22-05-2024,Barton Road,,,Dover,Kent,CT16 2ND,www.bartonjuniorschool.org/,1304201643.0,Miss,Melanie,O'Dell,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,St Radigunds,Dover,(England/Wales) Urban city and town,E10000016,631229.0,142506.0,Dover 012,Dover 012C,,,,,Good,South-East England and South London,,100062289419.0,,Not applicable,Not applicable,,,E02005052,E01024239,115.0, +138170,886,Kent,2316,Shatterlocks Infant and Nursery School,Academy converter,Academies,Open,Academy Converter,01-06-2012,,,Primary,3.0,7,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,232.0,No Special Classes,19-01-2023,202.0,90.0,112.0,40.5,Supported by a multi-academy trust,SAMPHIRE STAR EDUCATION TRUST,-,,Not applicable,,10037459.0,,Not applicable,16-05-2019,27-02-2024,Heathfield Avenue,,,Dover,Kent,CT16 2PB,http://www.shatterlocks.com,1304204264.0,Miss,Melanie,O'Dell,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,Buckland,Dover,(England/Wales) Urban city and town,E10000016,630755.0,142875.0,Dover 011,Dover 011A,,,,,Outstanding,South-East England and South London,,100062289420.0,,Not applicable,Not applicable,,,E02005051,E01024193,77.0, +138195,886,Kent,2007,Molehill Primary Academy,Academy sponsor led,Academies,Open,New Provision,01-06-2012,,,Primary,3.0,11,,Has Nursery Classes,Not applicable,Mixed,None,None,Not applicable,Not applicable,315.0,Not applicable,19-01-2023,303.0,159.0,144.0,43.2,Supported by a multi-academy trust,LEIGH ACADEMIES TRUST,Linked to a sponsor,Leigh Academies Trust,Not applicable,,10037485.0,,Not applicable,14-06-2023,03-06-2024,Hereford Road,,,Maidstone,Kent,ME15 7ND,http://www.molehillprimaryacademy.org.uk,1622751729.0,Principal,Laura,Smith,Head of Academy,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,HI - Hearing Impairment,"SLCN - Speech, language and Communication",,,,,,,,,,,,Resourced provision,5.0,10.0,,,South East,Maidstone,Shepway South,Faversham and Mid Kent,(England/Wales) Urban city and town,E10000016,577701.0,153158.0,Maidstone 013,Maidstone 013E,,,,,Good,South-East England and South London,,200003717486.0,,Not applicable,Not applicable,,,E02005080,E01024398,128.0, +138232,886,Kent,2008,Tiger Primary School,Free schools,Free Schools,Open,New Provision,03-09-2012,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,None,Not applicable,Not applicable,420.0,Not applicable,19-01-2023,427.0,217.0,210.0,33.7,Supported by a multi-academy trust,FUTURE SCHOOLS TRUST,Linked to a sponsor,Future Schools Trust,Not applicable,,10038742.0,,Not applicable,20-09-2023,22-11-2023,Boughton Lane,,,Maidstone,Kent,ME15 9QL,www.futureschoolstrust.com,1622745166.0,Mr,Daniel,Siggs,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,South,Maidstone and The Weald,(England/Wales) Urban city and town,E10000016,576813.0,153053.0,Maidstone 012,Maidstone 012D,Ofsted,,,,Good,South-East England and South London,,200003677498.0,,Not applicable,Not applicable,,,E02005079,E01024404,144.0, +138405,886,Kent,6138,Earlscliffe (Sussex Summer Schools Ltd),Other independent school,Independent schools,Open,New Provision,17-07-2012,,,Not applicable,14.0,19,Boarding school,No Nursery Classes,Has a sixth form,Mixed,None,None,Not applicable,Not applicable,160.0,Not applicable,20-01-2022,129.0,83.0,46.0,0.0,Not applicable,,Not applicable,,Not applicable,,10037987.0,,Not applicable,28-11-2019,08-04-2024,29 Shorncliffe Road,,,Folkestone,Kent,CT20 2NB,www.earlscliffe.co.uk,1303253951.0,Mr,Niall,Johnson,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not approved,,,,,,,,,,,,,,,,,,,South East,Folkestone and Hythe,Folkestone Central,Folkestone and Hythe,(England/Wales) Urban city and town,E10000016,621725.0,136091.0,Folkestone and Hythe 006,Folkestone and Hythe 006A,ISI,,12.0,,,South-East England and South London,,50033584.0,,Not applicable,Not applicable,,,E02005107,E01024511,0.0, +138434,886,Kent,2009,Northdown Primary School,Academy sponsor led,Academies,Open,New Provision,01-09-2012,,,Primary,3.0,11,No boarders,Has Nursery Classes,Not applicable,Mixed,None,None,Not applicable,Not applicable,427.0,Not applicable,19-01-2023,325.0,157.0,168.0,73.5,Supported by a multi-academy trust,THE KEMNAL ACADEMIES TRUST,Linked to a sponsor,The Kemnal Academies Trust,Not applicable,,10038398.0,,Not applicable,24-11-2021,09-05-2024,Tenterden Way,,,Margate,Kent,CT9 3RE,www.northdown-tkat.org,1843226077.0,Mr,Matthew,Harris,Headteacher,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Thanet,Dane Valley,North Thanet,(England/Wales) Urban city and town,E10000016,637269.0,170097.0,Thanet 006,Thanet 006C,,,,,Good,South-East England and South London,,100062307407.0,,Not applicable,Not applicable,,,E02005137,E01024662,228.0, +138436,886,Kent,2010,Newlands Primary School,Academy sponsor led,Academies,Open,New Provision,01-09-2012,,,Primary,4.0,11,Not applicable,Not applicable,Not applicable,Mixed,None,None,Not applicable,Not applicable,315.0,Not applicable,19-01-2023,291.0,159.0,132.0,60.8,Supported by a multi-academy trust,THE KEMNAL ACADEMIES TRUST,Linked to a sponsor,The Kemnal Academies Trust,Not applicable,,10038052.0,,Not applicable,02-11-2022,26-04-2024,Dumpton Lane,,,Ramsgate,Kent,CT11 7AJ,www.newlands-tkat.org,1843593086.0,Mr,David,Bailey,Headteacher,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Thanet,Sir Moses Montefiore,South Thanet,(England/Wales) Urban city and town,E10000016,638271.0,166231.0,Thanet 012,Thanet 012C,,,,,Good,South-East England and South London,,100062282198.0,,Not applicable,Not applicable,,,E02005143,E01024699,177.0, +138438,886,Kent,2011,Salmestone Primary School,Academy sponsor led,Academies,Open,New Provision,01-09-2012,,,Primary,3.0,11,,Has Nursery Classes,Not applicable,Mixed,None,None,Not applicable,Non-selective,210.0,Not applicable,19-01-2023,215.0,114.0,101.0,41.4,Supported by a multi-academy trust,THE KEMNAL ACADEMIES TRUST,Linked to a sponsor,The Kemnal Academies Trust,Not applicable,,10038040.0,,Not applicable,23-01-2019,22-02-2024,College Road,,,Margate,Kent,CT9 4DB,www.salmestone-tkat.org/,1843220949.0,Mr,Thomas,Platten,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Thanet,Salmestone,North Thanet,(England/Wales) Urban city and town,E10000016,635418.0,169813.0,Thanet 003,Thanet 003C,,,,,Good,South-East England and South London,,100062307602.0,,Not applicable,Not applicable,,,E02005134,E01024695,84.0, +138480,886,Kent,4101,The Harvey Grammar School,Academy converter,Academies,Open,Academy Converter,01-08-2012,,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Boys,Does not apply,Does not apply,Not applicable,Selective,980.0,No Special Classes,19-01-2023,1026.0,1026.0,0.0,10.8,Supported by a multi-academy trust,THE HARVEY ACADEMY,-,,Not applicable,,10038103.0,,Not applicable,14-12-2022,21-05-2024,Cheriton Road,,,Folkestone,Kent,CT19 5JY,http://www.harveygs.kent.sch.uk/,1303252131.0,Mr,S,Norman,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Folkestone and Hythe,Broadmead,Folkestone and Hythe,(England/Wales) Urban city and town,E10000016,621203.0,136613.0,Folkestone and Hythe 015,Folkestone and Hythe 015D,,,,,Outstanding,South-East England and South London,,50032937.0,,Not applicable,Not applicable,,,E02006880,E01024517,81.0, +138579,886,Kent,2013,Water Meadows Primary School,Academy sponsor led,Academies,Open,New Provision,01-09-2012,,,Primary,4.0,11,,Not applicable,Not applicable,Mixed,None,None,Not applicable,Not applicable,150.0,Not applicable,19-01-2023,148.0,72.0,76.0,43.5,Supported by a multi-academy trust,THE STOUR ACADEMY TRUST,Linked to a sponsor,The Stour Academy Trust,Not applicable,,10038477.0,,Not applicable,20-03-2019,28-05-2024,Shaftesbury Road,Hersden,,Canterbury,Kent,CT3 4HS,www.watermeadows.kent.sch.uk,1227710414.0,Mr,Ben,Martin,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Canterbury,Sturry,North Thanet,(England/Wales) Rural town and fringe,E10000016,620217.0,162160.0,Canterbury 010,Canterbury 010C,,,,,Good,South-East England and South London,,200000683090.0,,Not applicable,Not applicable,,,E02005019,E01024086,64.0, +138592,886,Kent,2014,St Laurence In Thanet Church of England Junior Academy,Academy sponsor led,Academies,Open,New Provision,01-12-2012,,,Primary,7.0,11,,Not applicable,Not applicable,Mixed,Church of England,None,Diocese of Canterbury,Not applicable,256.0,Not applicable,19-01-2023,177.0,95.0,82.0,60.5,Supported by a multi-academy trust,THE DIOCESE OF CANTERBURY ACADEMIES TRUST,Linked to a sponsor,"Aquila, The Diocese of Canterbury Academies Trust",Not applicable,,10038488.0,,Not applicable,04-07-2018,07-05-2024,Newington Road,,,Ramsgate,Kent,CT11 0QX,www.stlaurencejuniors.co.uk/,1843592257.0,Ms,Sarah,Graham,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Thanet,Newington,South Thanet,(England/Wales) Urban city and town,E10000016,636976.0,165548.0,Thanet 013,Thanet 013C,,,,,Good,South-East England and South London,,200002234791.0,,Not applicable,Not applicable,,,E02005144,E01024684,107.0, +138737,886,Kent,3086,West Malling Church of England Primary School and McGinty Speech and Language Srp,Academy converter,Academies,Open,Academy Converter,01-09-2012,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,210.0,Has Special Classes,19-01-2023,207.0,109.0,98.0,24.6,Supported by a multi-academy trust,THE TENAX SCHOOLS TRUST,Linked to a sponsor,The Tenax Schools Trust,Not applicable,,10037972.0,,Not applicable,25-01-2023,06-06-2024,Old Cricket Ground,Norman Road,,West Malling,Kent,ME19 6RL,http://www.west-malling.kent.sch.uk,1732842061.0,Mr,David,Rye,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,"SLCN - Speech, language and Communication",,,,,,,,,,,,,Resourced provision,14.0,21.0,,,South East,Tonbridge and Malling,"East Malling, West Malling & Offham",Tonbridge and Malling,(England/Wales) Rural town and fringe,E10000016,567936.0,157853.0,Tonbridge and Malling 014,Tonbridge and Malling 014C,,,,,Good,South-East England and South London,,100062388025.0,,Not applicable,Not applicable,,,E02006833,E01024783,51.0, +138738,886,Kent,3128,Sturry Church of England Primary School,Academy converter,Academies,Open,Academy Converter,01-09-2012,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,420.0,No Special Classes,19-01-2023,406.0,195.0,211.0,26.8,Supported by a multi-academy trust,THE STOUR ACADEMY TRUST,Linked to a sponsor,The Stour Academy Trust,Not applicable,,10038650.0,,Not applicable,28-01-2015,08-04-2024,Park View,Sturry,,Canterbury,Kent,CT2 0NR,http://www.sturry.kent.sch.uk,1227710477.0,Mrs,M,Mannings,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Canterbury,Sturry,Canterbury,(England/Wales) Rural town and fringe,E10000016,617998.0,161082.0,Canterbury 011,Canterbury 011C,,,,,Outstanding,South-East England and South London,,200000679701.0,,Not applicable,Not applicable,,,E02005020,E01024111,109.0, +138972,886,Kent,2015,Dame Janet Primary Academy,Academy sponsor led,Academies,Open,New Provision,01-12-2012,,,Primary,4.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,None,Not applicable,Not applicable,360.0,Not applicable,19-01-2023,371.0,193.0,178.0,58.1,Supported by a multi-academy trust,THE KEMNAL ACADEMIES TRUST,Linked to a sponsor,The Kemnal Academies Trust,Not applicable,,10039504.0,,Not applicable,03-10-2018,22-02-2024,Newington Road,,,Ramsgate,Kent,CT12 6QY,www.damejanet-tkat.org/,1843591807.0,Mr,Sam,Atkinson,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Thanet,Northwood,South Thanet,(England/Wales) Urban city and town,E10000016,636796.0,166666.0,Thanet 011,Thanet 011B,,,,,Good,South-East England and South London,,100062284279.0,,Not applicable,Not applicable,,,E02005142,E01024688,215.0, +139021,886,Kent,2017,Drapers Mills Primary Academy,Academy sponsor led,Academies,Open,New Provision,01-12-2012,,,Primary,2.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,None,None,Not applicable,Not applicable,420.0,Not applicable,19-01-2023,330.0,169.0,161.0,66.1,Supported by a multi-academy trust,THE KEMNAL ACADEMIES TRUST,Linked to a sponsor,The Kemnal Academies Trust,Not applicable,,10039726.0,,Not applicable,01-11-2023,18-03-2024,St Peter's Footpath,,,Margate,Kent,CT9 2SP,http://www.drapersmillsprimary.co.uk/,1843223989.0,Mrs,Kathleen,Davis,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Thanet,Dane Valley,North Thanet,(England/Wales) Urban city and town,E10000016,636260.0,169934.0,Thanet 004,Thanet 004B,,,,,Good,South-East England and South London,,200003079364.0,,Not applicable,Not applicable,,,E02005135,E01024664,218.0, +139052,886,Kent,2018,Temple Grove Academy,Academy sponsor led,Academies,Open,New Provision,01-01-2013,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,None,Not applicable,Non-selective,210.0,Not applicable,19-01-2023,208.0,96.0,112.0,47.0,Supported by a single-academy trust,TEMPLE GROVE ACADEMY TRUST,Linked to a sponsor,Temple Grove Schools Trust,Not applicable,,10039910.0,,Not applicable,18-09-2019,10-04-2024,Friars Way,,,Tunbridge Wells,Kent,TN2 3UA,http://www.templegroveacademy.com/,1892520562.0,Mrs,Rebekah,Leeves,Headteacher,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Sherwood,Tunbridge Wells,(England/Wales) Urban city and town,E10000016,559898.0,140821.0,Tunbridge Wells 005,Tunbridge Wells 005B,,,,,Good,South-East England and South London,,10000066049.0,,Not applicable,Not applicable,,,E02005166,E01024841,93.0, +139075,886,Kent,4004,Meopham School,Academy sponsor led,Academies,Open,New Provision,01-02-2013,,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Mixed,None,None,Not applicable,Non-selective,832.0,Not applicable,19-01-2023,989.0,505.0,484.0,16.0,Supported by a multi-academy trust,SWALE ACADEMIES TRUST,Linked to a sponsor,Swale Academies Trust,Not applicable,,10039851.0,,Not applicable,20-04-2023,16-04-2024,Wrotham Road,Meopham,,Gravesend,Kent,DA13 0AH,meophamschool.org.uk,1474814646.0,Mr,Glenn,Prebble,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,ASD - Autistic Spectrum Disorder,,,,,,,,,,,,,Resourced provision and SEN unit,20.0,20.0,20.0,20.0,South East,Gravesham,Meopham North,Gravesham,(England/Wales) Rural village,E10000016,564231.0,165820.0,Gravesham 012,Gravesham 012D,,,,,Good,South-East England and South London,,100062313194.0,,Not applicable,Not applicable,,,E02005066,E01024271,144.0, +139096,886,Kent,5209,Allington Primary School,Academy converter,Academies,Open,Academy Converter,01-12-2012,,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,None,Does not apply,Not applicable,Not applicable,420.0,No Special Classes,19-01-2023,465.0,223.0,242.0,4.9,Supported by a multi-academy trust,ORCHARD ACADEMY TRUST,Linked to a sponsor,Allington Primary School Academy Trust (Orchard Academy Trust),Not applicable,,10039700.0,,Not applicable,13-07-2022,16-04-2024,Hildenborough Crescent,London Road,,Maidstone,Kent,ME16 0PG,www.allington.kent.sch.uk/,1622757350.0,Mrs,C,Howson,,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Allington,Maidstone and The Weald,(England/Wales) Urban city and town,E10000016,574093.0,157190.0,Maidstone 003,Maidstone 003D,,,,,Outstanding,South-East England and South London,,200003717229.0,,Not applicable,Not applicable,,,E02005070,E01024323,23.0, +139186,886,Kent,2307,Warden House Primary School,Academy converter,Academies,Open,Academy Converter,01-01-2013,,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,No Special Classes,19-01-2023,437.0,228.0,209.0,36.2,Supported by a multi-academy trust,VERITAS MULTI ACADEMY TRUST,Linked to a sponsor,Veritas Multi Academy Trust,Not applicable,,10040005.0,,Not applicable,03-12-2014,21-05-2024,Birdwood Avenue,,,Deal,Kent,CT14 9SF,http://www.warden-house.kent.sch.uk,1304375040.0,Mr,Robert,Hackett,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,Middle Deal,Dover,(England/Wales) Urban city and town,E10000016,636229.0,152116.0,Dover 003,Dover 003A,,,,,Outstanding,South-East England and South London,,100062287038.0,,Not applicable,Not applicable,,,E02005043,E01024219,158.0, +139254,886,Kent,2019,Chantry Community Primary School,Academy sponsor led,Academies,Open,New Provision,01-06-2013,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,None,Not applicable,Not applicable,420.0,Not applicable,19-01-2023,454.0,229.0,225.0,43.7,Supported by a multi-academy trust,BEYOND SCHOOLS TRUST,Linked to a sponsor,FPTA Academies (Fort Pitt Grammar School and The Thomas Aveling School),Not applicable,,10040148.0,,Not applicable,27-01-2022,18-04-2024,Ordnance Road,,,Gravesend,Kent,DA12 2RL,www.chantryprimary.co.uk,1474350011.0,Mrs,Kathryn,Duncan,Head of School,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Gravesham,Town,Gravesham,(England/Wales) Urban major conurbation,E10000016,565390.0,174044.0,Gravesham 002,Gravesham 002E,,,,,Good,South-East England and South London,,100062311901.0,,Not applicable,Not applicable,,,E02005056,E01024295,176.0, +139255,886,Kent,2020,"Christ Church Church of England Junior School, Ramsgate",Academy sponsor led,Academies,Open,New Provision,01-12-2013,,,Primary,7.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,None,Diocese of Canterbury,Not applicable,240.0,Not applicable,19-01-2023,200.0,104.0,96.0,43.5,Supported by a single-academy trust,"CHRIST CHURCH CHURCH OF ENGLAND JUNIOR SCHOOL, RAMSGATE",Linked to a sponsor,The Diocese of Canterbury Academies Company Limited,Not applicable,,10040135.0,,Not applicable,10-11-2021,14-05-2024,London Road,,,Ramsgate,Kent,CT11 0ZZ,www.christchurchjuniors.com/,1843593350.0,Mr,Neil,Tucker,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Thanet,Cliffsend and Pegwell,South Thanet,(England/Wales) Urban city and town,E10000016,637368.0,164573.0,Thanet 017,Thanet 017B,,,,,Good,South-East England and South London,,100062628044.0,,Not applicable,Not applicable,,,E02005148,E01024651,87.0, +139309,886,Kent,3148,"Christ Church Cep Academy, Folkestone",Academy converter,Academies,Open,Academy Converter,01-03-2013,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,420.0,No Special Classes,19-01-2023,422.0,193.0,229.0,46.7,Supported by a single-academy trust,"CHRIST CHURCH CHURCH OF ENGLAND PRIMARY ACADEMY, FOLKESTONE",-,,Not applicable,,10040025.0,,Not applicable,01-12-2022,21-05-2024,Brockman Road,,,Folkestone,Kent,CT20 1DJ,www.christchurchfolkestone.com/,1303253645.0,Mr,Robin,Flack,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Folkestone and Hythe,Folkestone Central,Folkestone and Hythe,(England/Wales) Urban city and town,E10000016,622492.0,136267.0,Folkestone and Hythe 014,Folkestone and Hythe 014B,,,,,Good,South-East England and South London,,50041734.0,,Not applicable,Not applicable,,,E02006879,E01024507,197.0, +139310,886,Kent,3349,Folkestone St. Mary's Church of England Primary Academy,Academy converter,Academies,Open,Academy Converter,01-02-2013,,,Primary,2.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,420.0,No Special Classes,19-01-2023,449.0,228.0,221.0,36.3,Supported by a single-academy trust,FOLKESTONE ST MARY'S CHURCH OF ENGLAND PRIMARY ACADEMY,-,,Not applicable,,10040279.0,,Not applicable,20-10-2021,08-05-2024,Warren Road,,,Folkestone,Kent,CT19 6QH,www.stmarysfolkestone.com,1303251390.0,Mrs,Amanda,Wolfram,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Folkestone and Hythe,Folkestone Harbour,Folkestone and Hythe,(England/Wales) Urban city and town,E10000016,623841.0,136685.0,Folkestone and Hythe 003,Folkestone and Hythe 003D,,,,,Good,South-East England and South London,,50046311.0,,Not applicable,Not applicable,,,E02005104,E01024503,144.0, +139315,886,Kent,3348,St Eanswythe's Church of England Primary School,Academy converter,Academies,Open,Academy Converter,01-02-2013,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,210.0,No Special Classes,19-01-2023,212.0,94.0,118.0,25.0,Supported by a single-academy trust,ST EANSWYTHE'S CHURCH OF ENGLAND PRIMARY SCHOOL,-,,Not applicable,,10040285.0,,Not applicable,13-03-2019,31-05-2024,Church Street,,,Folkestone,Kent,CT20 1SE,http://www.st-eanswythes.kent.sch.uk/,1303255516.0,Headteacher,Claire,Jacobs,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Folkestone and Hythe,Folkestone Central,Folkestone and Hythe,(England/Wales) Urban city and town,E10000016,622986.0,135909.0,Folkestone and Hythe 014,Folkestone and Hythe 014D,,,,,Outstanding,South-East England and South London,,50036799.0,,Not applicable,Not applicable,,,E02006879,E01033215,53.0, +139396,886,Kent,2021,Kemsley Primary Academy,Academy sponsor led,Academies,Open,New Provision,01-04-2013,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,None,Not applicable,Not applicable,210.0,Not applicable,19-01-2023,232.0,112.0,120.0,31.4,Supported by a multi-academy trust,REACH2 ACADEMY TRUST,Linked to a sponsor,REAch2 Academy Trust,Not applicable,,10040770.0,,Not applicable,14-02-2019,16-01-2024,Coldharbour Lane,Kemsley,,Sittingbourne,Kent,ME10 2RP,www.kemsley.kent.sch.uk,1795428689.0,,Iris,Homer,Headteacher,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Kemsley,Sittingbourne and Sheppey,(England/Wales) Urban city and town,E10000016,590740.0,166282.0,Swale 007,Swale 007J,,,,,Good,South-East England and South London,,10035063593.0,,Not applicable,Not applicable,,,E02005121,E01035303,69.0, +139397,886,Kent,2022,Milton Court Primary Academy,Academy sponsor led,Academies,Open,New Provision,01-04-2013,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,None,Not applicable,Not applicable,238.0,Not applicable,19-01-2023,245.0,121.0,124.0,52.7,Supported by a multi-academy trust,REACH2 ACADEMY TRUST,Linked to a sponsor,REAch2 Academy Trust,Not applicable,,10040771.0,,Not applicable,18-09-2019,13-05-2024,Brewery Road,Milton Regis,,Sittingbourne,Kent,ME10 2EE,www.milton-court.kent.sch.uk,1795472972.0,Miss,Sarah,Gadsdon,Head of School,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Milton Regis,Sittingbourne and Sheppey,(England/Wales) Urban city and town,E10000016,590434.0,164874.0,Swale 010,Swale 010B,,,,,Good,South-East England and South London,,100062375804.0,,Not applicable,Not applicable,,,E02005124,E01024584,125.0, +139436,886,Kent,2023,Temple Ewell Church of England Primary School,Academy sponsor led,Academies,Open,New Provision,01-02-2014,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,None,Diocese of Canterbury,Not applicable,140.0,Not applicable,19-01-2023,145.0,74.0,71.0,18.6,Supported by a multi-academy trust,THE DIOCESE OF CANTERBURY ACADEMIES TRUST,Linked to a sponsor,"Aquila, The Diocese of Canterbury Academies Trust",Not applicable,,10041585.0,,Not applicable,04-07-2023,26-03-2024,3-4 Brookside,Temple Ewell,,Dover,Kent,CT16 3DT,www.temple-ewell.kent.sch.uk/,1304822665.0,Mrs,Angela,Matthews,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,Dover Downs & River,Dover,(England/Wales) Urban city and town,E10000016,628536.0,144298.0,Dover 010,Dover 010G,,,,,Good,South-East England and South London,,100062289542.0,,Not applicable,Not applicable,,,E02005050,E01033210,27.0, +139542,886,Kent,5409,Wrotham School,Academy converter,Academies,Open,Academy Converter,01-04-2013,,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Mixed,None,Does not apply,Not applicable,Non-selective,716.0,No Special Classes,19-01-2023,1029.0,553.0,476.0,16.3,Supported by a multi-academy trust,CHARACTER EDUCATION TRUST,Linked to a sponsor,Wrotham School,Not applicable,,10035479.0,,Not applicable,22-05-2019,06-06-2024,Borough Green Road,Wrotham,,Sevenoaks,Kent,TN15 7RD,http://www.wrothamschool.com/,1732905860.0,Mr,Michael,Cater,Executive Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,Pilgrims with Ightham,Tonbridge and Malling,(England/Wales) Rural village,E10000016,561109.0,158269.0,Tonbridge and Malling 006,Tonbridge and Malling 006F,,,,,Good,South-East England and South London,,100062550537.0,,Not applicable,Not applicable,,,E02005154,E01024786,139.0, +139554,886,Kent,4006,Trinity School,Free schools,Free Schools,Open,New Provision,01-09-2013,,,Secondary,11.0,19,Not applicable,No Nursery Classes,Has a sixth form,Mixed,Christian,Christian,,Non-selective,1140.0,Not applicable,19-01-2023,1130.0,619.0,511.0,14.8,Supported by a single-academy trust,TRINITY SCHOOL SEVENOAKS LTD,-,,Not applicable,,10041643.0,,Not applicable,02-10-2018,02-05-2024,Seal Hollow Rd,,,Sevenoaks,Kent,TN13 3SL,http://www.trinitysevenoaks.org.uk/,1732469111.0,Dr,Matthew,Pawson,Headmaster,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Seal and Weald,Sevenoaks,(England/Wales) Urban city and town,E10000016,554061.0,156627.0,Sevenoaks 012,Sevenoaks 012A,Ofsted,,,,Good,South-East England and South London,,10013774563.0,,Not applicable,Not applicable,,,E02005098,E01024458,136.0, +139615,886,Kent,2511,Hartley Primary Academy,Academy converter,Academies,Open,Academy Converter,01-05-2013,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,No Special Classes,19-01-2023,443.0,230.0,213.0,9.3,Supported by a multi-academy trust,LEIGH ACADEMIES TRUST,Linked to a sponsor,Leigh Academies Trust,Not applicable,,10041353.0,,Not applicable,11-10-2023,16-04-2024,Round Ash Way,Hartley,,Longfield,Kent,DA3 8BT,www.hartleyprimaryacademy.org.uk/,1474702742.0,Mr,Stuart,Mitchell,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Sevenoaks,Hartley and Hodsoll Street,Dartford,(England/Wales) Urban city and town,E10000016,560221.0,167409.0,Sevenoaks 004,Sevenoaks 004C,,,,,Outstanding,South-East England and South London,,100062688333.0,,Not applicable,Not applicable,,,E02005090,E01024443,40.0, +139664,886,Kent,4007,Wye School,Free schools,Free Schools,Open,New Provision,03-09-2013,,,Secondary,11.0,18,Not applicable,No Nursery Classes,Has a sixth form,Mixed,None,None,,Non-selective,600.0,Not applicable,19-01-2023,573.0,295.0,278.0,17.5,Supported by a multi-academy trust,UNITED LEARNING TRUST,Linked to a sponsor,United Learning Trust,Not applicable,,10041669.0,,Not applicable,11-12-2018,15-04-2024,Olantigh Road,,,Wye,Kent,TN25 5EJ,http://www.wyeschool.org.uk/,1233811110.0,Mr,Luke,Magee,Principal,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Ashford,Wye with Hinxhill,Ashford,(England/Wales) Rural town and fringe,E10000016,605615.0,146915.0,Ashford 001,Ashford 001E,Ofsted,,,,Good,South-East England and South London,,10012843405.0,,Not applicable,Not applicable,,,E02004996,E01024041,88.0, +139685,886,Kent,2024,Copperfield Academy,Academy sponsor led,Academies,Open,New Provision,01-11-2013,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,None,Not applicable,Not applicable,480.0,Not applicable,19-01-2023,443.0,231.0,212.0,34.1,Supported by a multi-academy trust,REACH2 ACADEMY TRUST,Linked to a sponsor,REAch2 Academy Trust,Not applicable,,10041614.0,,Not applicable,06-05-2021,13-09-2023,Dover Road East,Northfleet,,Gravesend,Kent,DA11 0RB,www.copperfieldacademy.org,1474352488.0,,Ben,Clark,Headteacher,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Gravesham,Coldharbour & Perry Street,Gravesham,(England/Wales) Urban major conurbation,E10000016,563486.0,173483.0,Gravesham 004,Gravesham 004D,,,,,Good,South-East England and South London,,100062310549.0,,Not applicable,Not applicable,,,E02005058,E01024283,145.0, +139696,886,Kent,2025,The Wells Free School,Free schools,Free Schools,Open,New Provision,01-09-2013,,,Primary,4.0,11,Not applicable,No Nursery Classes,Does not have a sixth form,Mixed,None,None,,Not applicable,210.0,Not applicable,19-01-2023,208.0,115.0,93.0,13.0,Supported by a single-academy trust,THE WELLS FREE SCHOOL,-,,Not applicable,,10041721.0,,Not applicable,18-06-2019,07-05-2024,King Charles Square,,,Tunbridge Wells,Kent,TN4 8FA,www.thewellsfreeschool.co.uk/,1892739075.0,Mrs,Katharine,Le Page,Headteacher,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Culverden,Tunbridge Wells,(England/Wales) Urban city and town,E10000016,558235.0,139866.0,Tunbridge Wells 008,Tunbridge Wells 008E,Ofsted,,,,Good,South-East England and South London,,10024139359.0,,Not applicable,Not applicable,,,E02005169,E01035012,27.0, +139697,886,Kent,4009,Hadlow Rural Community School,Free schools,Free Schools,Open,New Provision,01-09-2013,,,Secondary,11.0,16,Not applicable,No Nursery Classes,Does not have a sixth form,Mixed,None,None,,Non-selective,375.0,Not applicable,19-01-2023,371.0,224.0,147.0,24.0,Supported by a single-academy trust,HADLOW RURAL COMMUNITY SCHOOL LIMITED,-,,Not applicable,,10041646.0,,Not applicable,26-02-2019,20-05-2024,Tonbridge Road,,,Hadlow,Kent,TN11 0AU,www.hrcschool.org,1732498120.0,Mr,Paul,Boxall,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,Bourne,Tonbridge and Malling,(England/Wales) Rural hamlet and isolated dwellings,E10000016,562706.0,149711.0,Tonbridge and Malling 008,Tonbridge and Malling 008C,Ofsted,,,,Good,South-East England and South London,,10092971671.0,,Not applicable,Not applicable,,,E02005156,E01024745,89.0, +139810,886,Kent,2026,Petham Primary School,Academy sponsor led,Academies,Open,New Provision,01-09-2013,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,None,Not applicable,Not applicable,115.0,Not applicable,19-01-2023,103.0,50.0,53.0,16.5,Supported by a multi-academy trust,OUR COMMUNITY MULTI ACADEMY TRUST,-,,Not applicable,,10042015.0,,Not applicable,05-07-2019,31-05-2024,Petham,,,Canterbury,Kent,CT4 5RD,http://www.petham.kent.sch.uk/,1227700260.0,Mr,Scott,Guy,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Canterbury,Chartham & Stone Street,Canterbury,(England/Wales) Rural village,E10000016,613071.0,151303.0,Canterbury 017,Canterbury 017C,,,,,Good,South-East England and South London,,200000675436.0,,Not applicable,Not applicable,,,E02005026,E01024054,17.0, +139822,886,Kent,2027,Archbishop Courtenay Primary School,Academy sponsor led,Academies,Open,New Provision,01-09-2014,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Church of England,Diocese of Canterbury,Not applicable,315.0,Not applicable,19-01-2023,307.0,162.0,145.0,36.2,Supported by a multi-academy trust,THE DIOCESE OF CANTERBURY ACADEMIES TRUST,Linked to a sponsor,"Aquila, The Diocese of Canterbury Academies Trust",Not applicable,,10042411.0,,Not applicable,07-06-2023,15-04-2024,Eccleston Road,Tovil,,Maidstone,Kent,ME15 6QN,www.archbishopcourtenay.org.uk/,1622754666.0,Mrs,Sue,Heather,Headteacher,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Maidstone,South,Maidstone and The Weald,(England/Wales) Urban city and town,E10000016,575645.0,154791.0,Maidstone 009,Maidstone 009D,,,,,Good,South-East England and South London,,10014313238.0,,Not applicable,Not applicable,,,E02005076,E01024401,111.0, +140012,886,Kent,2028,Cliftonville Primary School,Academy sponsor led,Academies,Open,New Provision,01-12-2013,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,None,Not applicable,Not applicable,862.0,Not applicable,19-01-2023,828.0,407.0,421.0,49.1,Supported by a multi-academy trust,COASTAL ACADEMIES TRUST,Linked to a sponsor,Coastal Academies Trust,Not applicable,,10042921.0,,Not applicable,18-01-2023,22-05-2024,Northumberland Avenue,Cliftonville,,Margate,Kent,CT9 3LY,www.cliftonvilleprimary.co.uk/,1843227575.0,Ms,Claire,Whichcord,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Thanet,Cliftonville East,South Thanet,(England/Wales) Urban city and town,E10000016,637095.0,170622.0,Thanet 002,Thanet 002C,,,,,Outstanding,South-East England and South London,,100062307559.0,,Not applicable,Not applicable,,,E02005133,E01024655,390.0, +140167,886,Kent,2029,Tymberwood Academy,Academy sponsor led,Academies,Open,New Provision,01-02-2014,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,None,Not applicable,Not applicable,420.0,Not applicable,19-01-2023,384.0,186.0,198.0,48.7,Supported by a multi-academy trust,REACH2 ACADEMY TRUST,Linked to a sponsor,REAch2 Academy Trust,Not applicable,,10043284.0,,Not applicable,03-03-2022,03-04-2024,Cerne Road,,,Gravesend,Kent,DA12 4BN,www.tymberwoodacademy.org/,1474361193.0,Mr,Frazer,Westmorland,Head Teacher,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,PD - Physical Disability,,,,,,,,,,,,,Resourced provision,10.0,8.0,,,South East,Gravesham,Riverview Park,Gravesham,(England/Wales) Urban major conurbation,E10000016,566437.0,172049.0,Gravesham 007,Gravesham 007B,,,,,Good,South-East England and South London,,100062312652.0,,Not applicable,Not applicable,,,E02005061,E01024310,175.0, +140168,886,Kent,2030,Valley Invicta Primary School At Aylesford,Academy sponsor led,Academies,Open,New Provision,01-12-2013,,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,None,Not applicable,Not applicable,315.0,Not applicable,19-01-2023,381.0,189.0,192.0,18.4,Supported by a multi-academy trust,VALLEY INVICTA ACADEMIES TRUST,Linked to a sponsor,Valley Invicta Academies Trust,Not applicable,,10043311.0,,Not applicable,11-05-2023,25-04-2024,Teapot Lane,,,Aylesford,Kent,ME20 7JU,www.aylesford.viat.org.uk/,1622718192.0,Mr,Billy,Harrington,Headteacher,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,Aylesford South & Ditton,Chatham and Aylesford,(England/Wales) Urban city and town,E10000016,571993.0,158332.0,Tonbridge and Malling 005,Tonbridge and Malling 005B,,,,,Outstanding,South-East England and South London,,100062389712.0,,Not applicable,Not applicable,,,E02005153,E01024718,70.0, +140322,886,Kent,2686,Furley Park Primary Academy,Academy converter,Academies,Open,Academy Converter,01-11-2013,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,630.0,Not applicable,19-01-2023,575.0,294.0,281.0,16.7,Supported by a multi-academy trust,ACE LEARNING,-,,Not applicable,,10043951.0,,Not applicable,06-07-2022,18-04-2024,Reed Crescent,Park Farm,Kingsnorth,Ashford,Kent,TN23 3PA,www.furleypark.org.uk/,1233501732.0,Mrs,Emma,Collip,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Ashford,Park Farm South,Ashford,(England/Wales) Urban city and town,E10000016,601223.0,138948.0,Ashford 009,Ashford 009I,,,,,Requires improvement,South-East England and South London,,200002407842.0,,Not applicable,Not applicable,,,E02005004,E01032819,96.0, +140323,886,Kent,2286,Hamstreet Primary Academy,Academy converter,Academies,Open,Academy Converter,01-11-2013,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,315.0,No Special Classes,19-01-2023,269.0,132.0,137.0,15.2,Supported by a multi-academy trust,ACE LEARNING,-,,Not applicable,,10043950.0,,Not applicable,18-05-2023,29-05-2024,Hamstreet,,,Ashford,Kent,TN26 2EA,www.ham-street.org.uk/,1233732577.0,Mrs,Helen,Glancy,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Ashford,Weald South,Ashford,(England/Wales) Rural town and fringe,E10000016,599958.0,133831.0,Ashford 014,Ashford 014D,,,,,Good,South-East England and South London,,10012848068.0,,Not applicable,Not applicable,,,E02005009,E01024037,41.0, +140393,886,Kent,2034,Thistle Hill Academy,Academy sponsor led,Academies,Open,New Provision,01-09-2015,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,None,Not applicable,Not applicable,420.0,Not applicable,19-01-2023,359.0,183.0,176.0,41.2,Supported by a multi-academy trust,THE STOUR ACADEMY TRUST,Linked to a sponsor,The Stour Academy Trust,Not applicable,,10053864.0,,Not applicable,27-04-2022,16-04-2024,Aspen Drive,Minster-on-Sea,,Sheerness,Kent,ME12 3UD,http://www.thistlehill.kent.sch.uk,1795899119.0,Ms,Rebecca,Handebeaux,Headteacher,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,ASD - Autistic Spectrum Disorder,,,,,,,,,,,,,Resourced provision,10.0,10.0,,,South East,Swale,Sheppey Central,Sittingbourne and Sheppey,(England/Wales) Urban city and town,E10000016,594815.0,172145.0,Swale 004,Swale 004H,,,,,Requires improvement,South-East England and South London,,10023203143.0,,Not applicable,Not applicable,,,E02005118,E01035298,148.0, +140430,886,Kent,2036,Valley Invicta Primary School At Leybourne Chase,Academy sponsor led,Academies,Open,New Provision,01-09-2015,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,None,None,,Not applicable,220.0,Not applicable,19-01-2023,227.0,119.0,108.0,11.0,Supported by a multi-academy trust,VALLEY INVICTA ACADEMIES TRUST,Linked to a sponsor,Valley Invicta Academies Trust,Not applicable,,10053401.0,,Not applicable,22-02-2024,20-05-2024,Derby Drive,Leybourne Chase,,West Malling,Kent,ME19 5FF,www.leybournechase.viat.org.uk,1732840908.0,Mrs,Gemma,Robinson (Head of School),Executive Headteacher,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,ASD - Autistic Spectrum Disorder,,,,,,,,,,,,,Resourced provision,16.0,15.0,,,South East,Tonbridge and Malling,"Birling, Leybourne & Ryarsh",Tonbridge and Malling,(England/Wales) Rural hamlet and isolated dwellings,E10000016,567807.0,159097.0,Tonbridge and Malling 014,Tonbridge and Malling 014G,,,,,Good,South-East England and South London,,100062387483.0,,Not applicable,Not applicable,,,E02006833,E01035010,25.0, +140431,886,Kent,2037,Valley Invicta Primary School at Holborough Lakes,Academy sponsor led,Academies,Open,New Provision,01-09-2015,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,None,Not applicable,Not applicable,227.0,Has Special Classes,19-01-2023,228.0,105.0,123.0,13.2,Supported by a multi-academy trust,VALLEY INVICTA ACADEMIES TRUST,Linked to a sponsor,Valley Invicta Academies Trust,Not applicable,,10052657.0,,Not applicable,31-01-2024,20-05-2024,Holborough Lakes,Pollyfield Close,,Snodland,Kent,ME6 5GR,www.holboroughlakes.viat.org.uk,1634242839.0,Mrs,Lisa,Vickers,Headteacher,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,ASD - Autistic Spectrum Disorder,,,,,,,,,,,,,Resourced provision,17.0,15.0,,,South East,Tonbridge and Malling,Snodland West & Holborough Lakes,Chatham and Aylesford,(England/Wales) Urban city and town,E10000016,570281.0,162312.0,Tonbridge and Malling 002,Tonbridge and Malling 002I,,,,,Good,South-East England and South London,,10013924379.0,,Not applicable,Not applicable,,,E02005150,E01035006,30.0, +140432,886,Kent,2038,Valley Invicta Primary School At Kings Hill,Academy sponsor led,Academies,Open,New Provision,01-09-2015,,,Primary,4.0,11,Not applicable,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,None,Not applicable,Not applicable,210.0,Not applicable,19-01-2023,222.0,122.0,100.0,13.1,Supported by a multi-academy trust,VALLEY INVICTA ACADEMIES TRUST,Linked to a sponsor,Valley Invicta Academies Trust,Not applicable,,10053404.0,,Not applicable,14-03-2024,22-05-2024,Warwick Way (Off Tower View),Kings Hill,,West Malling,Kent,ME19 4AL,www.kingshill.viat.org.uk,1732841695.0,Mrs,Steph,Guthrie,Headteacher,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,ASD - Autistic Spectrum Disorder,,,,,,,,,,,,,Resourced provision,15.0,15.0,,,South East,Tonbridge and Malling,Kings Hill,Tonbridge and Malling,(England/Wales) Rural town and fringe,E10000016,567363.0,155590.0,Tonbridge and Malling 007,Tonbridge and Malling 007E,,,,,Good,South-East England and South London,,10092970953.0,,Not applicable,Not applicable,,,E02005155,E01032825,29.0, +140433,886,Kent,2039,Martello Primary,Academy sponsor led,Academies,Open,New Provision,01-09-2015,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,None,Not applicable,Not applicable,210.0,Not applicable,19-01-2023,172.0,97.0,75.0,64.0,Supported by a multi-academy trust,TURNER SCHOOLS,Linked to a sponsor,Turner Schools,Not applicable,,10053863.0,,Not applicable,09-03-2022,24-05-2024,Warren Way,,,Folkestone,Kent,CT19 6DT,www.turnermartello.org,1303847540.0,Miss,Natalie,Barrow,Head of School,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,ASD - Autistic Spectrum Disorder,,,,,,,,,,,,,Resourced provision,17.0,15.0,,,South East,Folkestone and Hythe,Folkestone Harbour,Folkestone and Hythe,(England/Wales) Urban city and town,E10000016,623927.0,137063.0,Folkestone and Hythe 003,Folkestone and Hythe 003D,,,,,Good,South-East England and South London,,50114714.0,,Not applicable,Not applicable,,,E02005104,E01024503,110.0, +140520,886,Kent,3719,"St Joseph's Catholic Primary School, Aylesham",Academy converter,Academies,Open,Academy Converter,01-01-2014,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Roman Catholic,Does not apply,Archdiocese of Southwark,Not applicable,133.0,No Special Classes,19-01-2023,131.0,72.0,59.0,36.6,Supported by a multi-academy trust,KENT CATHOLIC SCHOOLS' PARTNERSHIP,Linked to a sponsor,Kent Catholic Schools' Partnership,Not applicable,,10044505.0,,Not applicable,02-11-2021,25-01-2024,Ackholt Road,Aylesham,,Canterbury,Kent,CT3 3AS,www.stjosephs-aylesham.co.uk,1304840370.0,Mrs,Hester,Seager-Fleming,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,"Aylesham, Eythorne & Shepherdswell",Dover,(England/Wales) Rural town and fringe,E10000016,624091.0,152415.0,Dover 006,Dover 006F,,,,,Good,South-East England and South London,,10034883661.0,,Not applicable,Not applicable,,,E02005046,E01035315,48.0, +140521,886,Kent,2435,South Avenue Primary School,Academy converter,Academies,Open,Academy Converter,01-01-2014,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,No Special Classes,19-01-2023,407.0,205.0,202.0,32.2,Supported by a multi-academy trust,FULSTON MANOR ACADEMIES TRUST,Linked to a sponsor,Fulston Manor Academies Trust,Not applicable,,10044503.0,,Not applicable,12-10-2022,30-05-2024,South Avenue,,,Sittingbourne,Kent,ME10 4SU,www.southavenue.kent.sch.uk,1795477750.0,Miss,Tracy,Cadwallader,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Roman,Sittingbourne and Sheppey,(England/Wales) Urban city and town,E10000016,591229.0,163193.0,Swale 010,Swale 010D,,,,,Good,South-East England and South London,,200002532192.0,,Not applicable,Not applicable,,,E02005124,E01024599,131.0, +140537,886,Kent,5432,St Simon Stock Catholic School,Academy converter,Academies,Open,Academy Converter,01-01-2014,,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Mixed,Roman Catholic,Does not apply,Archdiocese of Southwark,Non-selective,1018.0,No Special Classes,19-01-2023,1106.0,584.0,522.0,14.9,Supported by a multi-academy trust,KENT CATHOLIC SCHOOLS' PARTNERSHIP,Linked to a sponsor,Kent Catholic Schools' Partnership,Not applicable,,10044507.0,,Not applicable,13-10-2021,23-04-2024,Oakwood Park,,,Maidstone,Kent,ME16 0JP,http://www.ssscs.co.uk/,1622754551.0,Mrs,Andrea,Denny,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Heath,Maidstone and The Weald,(England/Wales) Urban city and town,E10000016,574251.0,155595.0,Maidstone 008,Maidstone 008C,,,,,Good,South-East England and South London,,200003717928.0,,Not applicable,Not applicable,,,E02005075,E01024367,134.0, +140592,886,Kent,2679,The Brent Primary School,Academy converter,Academies,Open,Academy Converter,01-02-2014,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Non-selective,630.0,No Special Classes,19-01-2023,652.0,322.0,330.0,25.0,Supported by a multi-academy trust,CYGNUS ACADEMIES TRUST,Linked to a sponsor,Cygnus Academies Trust,Not applicable,,10044811.0,,Not applicable,22-02-2023,15-04-2024,London Road,Stone,,Dartford,Kent,DA2 6BA,www.brent.kent.sch.uk,1322223943.0,Mrs,Sarah,Rye,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dartford,Stone House,Dartford,(England/Wales) Urban major conurbation,E10000016,556186.0,173935.0,Dartford 006,Dartford 006A,,,,,Outstanding,South-East England and South London,,200000534113.0,,Not applicable,Not applicable,,,E02005033,E01024169,162.0, +140593,886,Kent,2685,The Gateway Primary Academy,Academy converter,Academies,Open,Academy Converter,01-02-2014,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,Not applicable,19-01-2023,210.0,110.0,100.0,12.4,Supported by a single-academy trust,THE GATEWAY PRIMARY ACADEMY,-,,Not applicable,,10044810.0,,Not applicable,29-06-2022,14-04-2024,Milestone Road,,,Dartford,Kent,DA2 6DW,www.gateway-pri.kent.sch.uk/,1322220090.0,Mr,Jamiel,Cassem,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dartford,Stone House,Dartford,(England/Wales) Urban major conurbation,E10000016,555850.0,174010.0,Dartford 005,Dartford 005D,,,,,Good,South-East England and South London,,200000544345.0,,Not applicable,Not applicable,,,E02005032,E01024163,26.0, +140595,886,Kent,5418,The Skinners' School,Academy converter,Academies,Open,Academy Converter,01-02-2014,,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Boys,None,Does not apply,Not applicable,Selective,945.0,No Special Classes,19-01-2023,1118.0,1118.0,0.0,4.2,Supported by a multi-academy trust,SKINNERS' ACADEMIES TRUST,Linked to a sponsor,The Skinners' Company,Not applicable,,10044808.0,,Not applicable,17-11-2021,25-04-2024,St John's Road,,,Tunbridge Wells,Kent,TN4 9PG,http://www.skinners-school.co.uk,1892520732.0,Mr,Edward,Wesson,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,VI - Visual Impairment,ASD - Autistic Spectrum Disorder,,,,,,,,,,,,Resourced provision,2.0,2.0,,,South East,Tunbridge Wells,St John's,Tunbridge Wells,(England/Wales) Urban city and town,E10000016,558264.0,140612.0,Tunbridge Wells 007,Tunbridge Wells 007D,,,,,Good,South-East England and South London,,10008661460.0,,Not applicable,Not applicable,,,E02005168,E01024838,34.0, +140640,886,Kent,5435,St Gregory's Catholic School,Academy converter,Academies,Open,Academy Converter,01-03-2014,,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Mixed,Roman Catholic,Does not apply,Archdiocese of Southwark,Non-selective,1082.0,No Special Classes,19-01-2023,1339.0,796.0,543.0,18.3,Supported by a multi-academy trust,KENT CATHOLIC SCHOOLS' PARTNERSHIP,Linked to a sponsor,Kent Catholic Schools' Partnership,Not applicable,,10045187.0,,Not applicable,,07-05-2024,Reynolds Lane,,,Tunbridge Wells,Kent,TN4 9XL,http://www.sgschool.org.uk,1892527444.0,Mr,Michael,Wilson,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,HI - Hearing Impairment,,,,,,,,,,,,,Resourced provision,,,,,South East,Tunbridge Wells,St John's,Tunbridge Wells,(England/Wales) Urban city and town,E10000016,558104.0,141564.0,Tunbridge Wells 002,Tunbridge Wells 002A,,,,,,South-East England and South London,,100062586238.0,,Not applicable,Not applicable,,,E02005163,E01024837,201.0, +140641,886,Kent,3890,"St Joseph's Catholic Primary School, Broadstairs",Academy converter,Academies,Open,Academy Converter,01-03-2014,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Roman Catholic,Does not apply,Archdiocese of Southwark,Not applicable,210.0,Not applicable,19-01-2023,199.0,100.0,99.0,30.7,Supported by a multi-academy trust,KENT CATHOLIC SCHOOLS' PARTNERSHIP,Linked to a sponsor,Kent Catholic Schools' Partnership,Not applicable,,10045193.0,,Not applicable,09-06-2022,21-05-2024,"St Joseph's Catholic Primary School, Broadstairs",,St Peter's Park Road,Broadstairs,Kent,CT10 2BA,www.st-josephs-broadstairs.kent.sch.uk,1843861738.0,Mrs,Vicki,O'Halloran,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,Not Applicable,,,,,,,,,,,,,Resourced provision,186.0,210.0,,,South East,Thanet,St Peters,South Thanet,(England/Wales) Urban city and town,E10000016,638835.0,168425.0,Thanet 009,Thanet 009E,,,,,Requires improvement,South-East England and South London,,200003079311.0,,Not applicable,Not applicable,,,E02005140,E01024693,61.0, +140800,886,Kent,3900,Whitehill Primary School,Academy converter,Academies,Open,Academy Converter,01-04-2014,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,630.0,No Special Classes,19-01-2023,659.0,347.0,312.0,29.7,Supported by a multi-academy trust,THE DECUS EDUCATIONAL TRUST,Linked to a sponsor,Gravesend Grammar School,Not applicable,,10045602.0,,Not applicable,28-02-2024,22-05-2024,Sun Lane,,,Gravesend,Kent,DA12 5HN,www.whitehillprimary.com,1474352973.0,Mrs,Angela,Carpenter,,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Gravesham,Whitehill & Windmill Hill,Gravesham,(England/Wales) Urban major conurbation,E10000016,565183.0,172378.0,Gravesham 005,Gravesham 005D,,,,,Requires improvement,South-East England and South London,,10012028072.0,,Not applicable,Not applicable,,,E02005059,E01024313,185.0, +140873,886,Kent,3889,"St Gregory's Catholic Primary School, Margate",Academy converter,Academies,Open,Academy Converter,01-05-2014,,,Primary,3.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Roman Catholic,Does not apply,Archdiocese of Southwark,Not applicable,315.0,No Special Classes,19-01-2023,291.0,145.0,146.0,35.1,Supported by a multi-academy trust,KENT CATHOLIC SCHOOLS' PARTNERSHIP,Linked to a sponsor,Kent Catholic Schools' Partnership,Not applicable,,10045950.0,,Not applicable,19-09-2019,14-05-2024,Nash Road,,,Margate,Kent,CT9 4BU,www.st-gregorys.kent.sch.uk,1843221896.0,Mr,David,Walker,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Thanet,Salmestone,North Thanet,(England/Wales) Rural town and fringe,E10000016,635277.0,169530.0,Thanet 004,Thanet 004E,,,,,Good,South-East England and South London,,100062307601.0,,Not applicable,Not applicable,,,E02005135,E01024696,102.0, +140874,886,Kent,5446,"St Anselm's Catholic School, Canterbury",Academy converter,Academies,Open,Academy Converter,01-05-2014,,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Mixed,Roman Catholic,Does not apply,Archdiocese of Southwark,Non-selective,1071.0,No Special Classes,19-01-2023,1099.0,555.0,544.0,18.0,Supported by a multi-academy trust,KENT CATHOLIC SCHOOLS' PARTNERSHIP,Linked to a sponsor,Kent Catholic Schools' Partnership,Not applicable,,10045938.0,,Not applicable,13-09-2023,05-06-2024,Old Dover Road,,,Canterbury,Kent,CT1 3EN,http://www.stanselmscanterbury.org.uk/,1227826200.0,Mr,J,Rowarth,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,ASD - Autistic Spectrum Disorder,PD - Physical Disability,,,,,,,,,,,,Resourced provision,16.0,15.0,,,South East,Canterbury,Barton,Canterbury,(England/Wales) Urban city and town,E10000016,616376.0,156068.0,Canterbury 016,Canterbury 016C,,,,,Good,South-East England and South London,,200000678848.0,,Not applicable,Not applicable,,,E02005025,E01024046,163.0, +140899,886,Kent,2223,Bobbing Village School,Academy converter,Academies,Open,Academy Converter,01-06-2014,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,208.0,114.0,94.0,8.2,Supported by a multi-academy trust,BOURNE ALLIANCE MULTI ACADEMY TRUST,Linked to a sponsor,TIMU Academy Trust,Not applicable,,10046193.0,,Not applicable,22-02-2023,19-03-2024,Sheppey Way,Bobbing,,Sittingbourne,Kent,ME9 8PL,www.bourne-alliance-mat.org.uk,1795423939.0,Mr,Tim,Harwood,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,"Bobbing, Iwade and Lower Halstow",Sittingbourne and Sheppey,(England/Wales) Urban city and town,E10000016,588784.0,165079.0,Swale 009,Swale 009F,,,,,Outstanding,South-East England and South London,,200002532781.0,,Not applicable,Not applicable,,,E02005123,E01035304,17.0, +140900,886,Kent,2230,Iwade School,Academy converter,Academies,Open,Academy Converter,01-06-2014,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,630.0,No Special Classes,19-01-2023,621.0,326.0,295.0,12.6,Supported by a multi-academy trust,BOURNE ALLIANCE MULTI ACADEMY TRUST,Linked to a sponsor,TIMU Academy Trust,Not applicable,,10046192.0,,Not applicable,22-09-2022,19-10-2023,School Lane,Iwade,,Sittingbourne,Kent,ME9 8RS,www.iwade-ba-mat.org.uk,1795472578.0,Mrs,Katrine,Stewart,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,"Bobbing, Iwade and Lower Halstow",Sittingbourne and Sheppey,(England/Wales) Rural town and fringe,E10000016,589970.0,167845.0,Swale 007,Swale 007G,,,,,Good,South-East England and South London,,100062397902.0,,Not applicable,Not applicable,,,E02005121,E01032655,78.0, +140980,886,Kent,2041,The Holy Family Catholic Primary School,Academy sponsor led,Academies,Open,New Provision,01-06-2014,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Roman Catholic,Roman Catholic,Archdiocese of Southwark,Not applicable,210.0,Not applicable,19-01-2023,209.0,112.0,97.0,51.7,Supported by a multi-academy trust,KENT CATHOLIC SCHOOLS' PARTNERSHIP,Linked to a sponsor,Kent Catholic Schools' Partnership,Not applicable,,10046167.0,,Not applicable,12-10-2023,23-04-2024,Bicknor Road,Park Wood,,Maidstone,Kent,ME15 9PS,www.holyfamily.kent.sch.uk,1622756778.0,Mrs,Megan,Underhill,Headteacher,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Park Wood,Faversham and Mid Kent,(England/Wales) Urban city and town,E10000016,578525.0,151872.0,Maidstone 013,Maidstone 013B,,,,,Good,South-East England and South London,,200003680167.0,,Not applicable,Not applicable,,,E02005080,E01024390,108.0, +140987,886,Kent,4012,The Leigh UTC,University technical college,Free Schools,Open,New Provision,01-09-2014,,,Secondary,11.0,18,Not applicable,No Nursery Classes,Has a sixth form,Mixed,None,Does not apply,,,960.0,Not applicable,19-01-2023,730.0,558.0,172.0,28.8,Supported by a multi-academy trust,LEIGH ACADEMIES TRUST,Linked to a sponsor,Leigh Academies Trust,Not applicable,,10047247.0,,Not applicable,26-05-2022,15-04-2024,Brunel Way,,,Dartford,Kent,DA1 5TF,http://theleighutc.org.uk/,1322626600.0,Mr,Kevin,Watson,Principal,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dartford,Bridge,Dartford,(England/Wales) Rural town and fringe,E10000016,554583.0,175781.0,Dartford 001,Dartford 001F,,,,,Good,South-East England and South London,,10023439451.0,,Not applicable,Not applicable,,,E02005028,E01035271,178.0, +141025,886,Kent,2043,Jubilee Primary School,Free schools,Free Schools,Open,New Provision,01-09-2014,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,None,Christian,,,420.0,Not applicable,19-01-2023,301.0,160.0,141.0,25.2,Supported by a single-academy trust,JUBILEE PRIMARY SCHOOL,-,,Not applicable,,10047086.0,,Not applicable,18-10-2023,23-04-2024,Gatland Lane,,,Maidstone,Kent,ME16 8PF,www.jubileeprimaryschool.org.uk,1622808873.0,Dr,Marilyn,Nadesan,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Fant,Maidstone and The Weald,(England/Wales) Urban city and town,E10000016,573703.0,154618.0,Maidstone 009,Maidstone 009A,,,,,Outstanding,South-East England and South London,,200003717426.0,,Not applicable,Not applicable,,,E02005076,E01024360,76.0, +141065,886,Kent,3720,St Mary's Catholic Primary School,Academy converter,Academies,Open,Academy Converter,01-07-2014,,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Roman Catholic,Does not apply,Archdiocese of Southwark,Not applicable,210.0,No Special Classes,19-01-2023,185.0,94.0,91.0,25.9,Supported by a multi-academy trust,KENT CATHOLIC SCHOOLS' PARTNERSHIP,Linked to a sponsor,Kent Catholic Schools' Partnership,Not applicable,,10046463.0,,Not applicable,17-11-2022,26-04-2024,St Richard's Road,,,Deal,Kent,CT14 9LF,www.stmarysdeal.co.uk/,1304375046.0,Mrs,Maria,Pullen,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,Mill Hill,Dover,(England/Wales) Urban city and town,E10000016,635925.0,151281.0,Dover 005,Dover 005C,,,,,Good,South-East England and South London,,200001851337.0,,Not applicable,Not applicable,,,E02005045,E01024223,48.0, +141067,886,Kent,3743,"St Simon of England Roman Catholic Primary School, Ashford",Academy converter,Academies,Open,Academy Converter,01-07-2014,,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Roman Catholic,Does not apply,Archdiocese of Southwark,Not applicable,210.0,No Special Classes,19-01-2023,209.0,112.0,97.0,18.7,Supported by a multi-academy trust,KENT CATHOLIC SCHOOLS' PARTNERSHIP,Linked to a sponsor,Kent Catholic Schools' Partnership,Not applicable,,10046324.0,,Not applicable,01-12-2022,21-05-2024,Noakes Meadow,,,Ashford,Kent,TN23 4RB,www.st-simon.kent.sch.uk,1233623199.0,Mr,Peter,McCabe,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Ashford,Beaver,Ashford,(England/Wales) Urban city and town,E10000016,600090.0,141538.0,Ashford 007,Ashford 007B,,,,,Requires improvement,South-East England and South London,,100062559274.0,,Not applicable,Not applicable,,,E02005002,E01023975,39.0, +141085,886,Kent,2045,Skinners' Kent Primary School,Academy sponsor led,Academies,Open,New Provision,01-09-2015,,,Primary,4.0,11,Not applicable,No Nursery Classes,Does not have a sixth form,Mixed,None,None,,,210.0,Not applicable,19-01-2023,210.0,117.0,93.0,17.1,Supported by a multi-academy trust,SKINNERS' ACADEMIES TRUST,Linked to a sponsor,The Skinners' Company,Not applicable,,10053936.0,,Not applicable,07-02-2024,21-05-2024,The Avenue,Knights Wood,,Tunbridge Wells,Kent,TN2 3GS,www.skps.org.uk,1892553060.0,,Gemma,Wyatt,Executive Principal,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Sherwood,Tunbridge Wells,(England/Wales) Urban city and town,E10000016,560430.0,141932.0,Tunbridge Wells 003,Tunbridge Wells 003B,,,,,Good,South-East England and South London,,10008671585.0,,Not applicable,Not applicable,,,E02005164,E01024839,36.0, +141156,886,Kent,3744,St Margaret Clitherow Catholic Primary School,Academy converter,Academies,Open,Academy Converter,01-08-2014,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Roman Catholic,Does not apply,Archdiocese of Southwark,Not applicable,420.0,No Special Classes,19-01-2023,397.0,191.0,206.0,7.3,Supported by a multi-academy trust,KENT CATHOLIC SCHOOLS' PARTNERSHIP,Linked to a sponsor,Kent Catholic Schools' Partnership,Not applicable,,10046759.0,,Not applicable,02-11-2022,16-04-2024,Trench Road,,,Tonbridge,Kent,TN11 9NG,www.stmargaretclitherowschool.org.uk,1732358000.0,Mrs,Fiona,Oubridge,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Tonbridge and Malling,Hildenborough,Tonbridge and Malling,(England/Wales) Rural village,E10000016,558678.0,148870.0,Tonbridge and Malling 010,Tonbridge and Malling 010D,,,,,Good,South-East England and South London,,10002908678.0,,Not applicable,Not applicable,,,E02005158,E01024754,29.0, +141157,886,Kent,3751,"St Thomas' Catholic Primary School, Sevenoaks",Academy converter,Academies,Open,Academy Converter,01-08-2014,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Roman Catholic,Does not apply,Archdiocese of Southwark,Non-selective,240.0,No Special Classes,19-01-2023,218.0,108.0,110.0,8.4,Supported by a multi-academy trust,KENT CATHOLIC SCHOOLS' PARTNERSHIP,Linked to a sponsor,Kent Catholic Schools' Partnership,Not applicable,,10046758.0,,Not applicable,,17-05-2024,South Park,,,Sevenoaks,Kent,TN13 1EH,www.saintthomas.co.uk,1732453921.0,Mrs,Geraldine,Leahy,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Sevenoaks,Sevenoaks Town and St John's,Sevenoaks,(England/Wales) Urban city and town,E10000016,552746.0,154671.0,Sevenoaks 012,Sevenoaks 012F,,,,,,South-East England and South London,,10035182527.0,,Not applicable,Not applicable,,,E02005098,E01024471,17.0, +141216,886,Kent,2048,Reculver Church of England Primary School,Academy sponsor led,Academies,Open,New Provision,01-07-2015,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Church of England,Diocese of Canterbury,Not applicable,525.0,Not applicable,19-01-2023,493.0,247.0,246.0,20.7,Supported by a multi-academy trust,THE DIOCESE OF CANTERBURY ACADEMIES TRUST,Linked to a sponsor,"Aquila, The Diocese of Canterbury Academies Trust",Not applicable,,10047006.0,,Not applicable,04-07-2018,02-05-2024,Hillborough,,,Herne Bay,Kent,CT6 6TA,www.reculver.kent.sch.uk,1227375907.0,Mrs,Stella,Collins,Headteacher,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,VI - Visual Impairment,SLD - Severe Learning Difficulty,,,,,,,,,,,,Resourced provision,17.0,15.0,,,South East,Canterbury,Reculver,North Thanet,(England/Wales) Urban city and town,E10000016,621137.0,167984.0,Canterbury 002,Canterbury 002A,,,,,Outstanding,South-East England and South London,,10033163216.0,,Not applicable,Not applicable,,,E02005011,E01024094,102.0, +141217,886,Kent,4013,St Edmund's Catholic School,Academy sponsor led,Academies,Open,,01-07-2016,,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Mixed,Roman Catholic,None,Archdiocese of Southwark,Non-selective,600.0,Not applicable,19-01-2023,567.0,296.0,271.0,36.5,Supported by a multi-academy trust,KENT CATHOLIC SCHOOLS' PARTNERSHIP,Linked to a sponsor,Kent Catholic Schools' Partnership,Not applicable,,10047005.0,,Not applicable,13-07-2022,21-05-2024,Old Charlton Road,,,Dover,Kent,CT16 2QB,www.st-edmunds.com,1304201551.0,Mrs,Grainne,Parsons,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,Buckland,Dover,(England/Wales) Urban city and town,E10000016,631515.0,142620.0,Dover 011,Dover 011C,,,,,Good,South-East England and South London,,100062289422.0,,Not applicable,Not applicable,,,E02005051,E01024195,207.0, +141220,886,Kent,2051,St Mary of Charity CofE (Aided) Primary School,Academy sponsor led,Academies,Open,New Provision,01-08-2015,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,None,Diocese of Canterbury,Not applicable,210.0,Not applicable,19-01-2023,208.0,105.0,103.0,36.5,Supported by a multi-academy trust,THE DIOCESE OF CANTERBURY ACADEMIES TRUST,Linked to a sponsor,"Aquila, The Diocese of Canterbury Academies Trust",Not applicable,,10047011.0,,Not applicable,11-07-2018,28-03-2024,Orchard Place,,,Faversham,Kent,ME13 8AP,,1795532496.0,Mrs,Louise,Rowley-Jones,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Abbey,Faversham and Mid Kent,(England/Wales) Urban city and town,E10000016,601949.0,161379.0,Swale 015,Swale 015A,,,,,Outstanding,South-East England and South London,,200002530657.0,,Not applicable,Not applicable,,,E02005129,E01024551,76.0, +141308,886,Kent,3119,Adisham Church of England Primary School,Academy converter,Academies,Open,Academy Converter,01-09-2014,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,105.0,No Special Classes,19-01-2023,97.0,49.0,48.0,19.6,Supported by a multi-academy trust,THE STOUR ACADEMY TRUST,Linked to a sponsor,The Stour Academy Trust,Not applicable,,10047192.0,,Not applicable,29-11-2023,17-05-2024,The Street,Adisham,,Canterbury,Kent,CT3 3JW,www.adisham.kent.sch.uk/,1304840246.0,Miss,Sophie,Metcalf,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Canterbury,Little Stour & Adisham,Canterbury,(England/Wales) Rural village,E10000016,622676.0,153952.0,Canterbury 018,Canterbury 018A,,,,,Outstanding,South-East England and South London,,100062619270.0,,Not applicable,Not applicable,,,E02005027,E01024042,19.0, +141329,886,Kent,2052,Kennington Church of England Academy,Academy sponsor led,Academies,Open,New Provision,01-11-2014,,,Primary,7.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,None,Diocese of Canterbury,Not applicable,360.0,Not applicable,19-01-2023,356.0,179.0,177.0,29.5,Supported by a multi-academy trust,THE DIOCESE OF CANTERBURY ACADEMIES TRUST,Linked to a sponsor,"Aquila, The Diocese of Canterbury Academies Trust",Not applicable,,10047449.0,,Not applicable,08-03-2023,29-01-2024,Upper Vicarage Road,Kennington,,Ashford,Kent,TN24 9AG,http://www.kenningtonacademy.co.uk,1233623744.0,Mrs,Karen,Godsell,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Ashford,Kennington,Ashford,(England/Wales) Urban city and town,E10000016,602027.0,145151.0,Ashford 003,Ashford 003B,,,,,Good,South-East England and South London,,100062561303.0,,Not applicable,Not applicable,,,E02004998,E01023999,105.0, +141386,886,Kent,2054,St Edward's Catholic Primary School,Academy sponsor led,Academies,Open,,01-07-2016,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Roman Catholic,None,Archdiocese of Southwark,Not applicable,210.0,Not applicable,19-01-2023,197.0,97.0,100.0,50.3,Supported by a multi-academy trust,KENT CATHOLIC SCHOOLS' PARTNERSHIP,Linked to a sponsor,Kent Catholic Schools' Partnership,Not applicable,,10047523.0,,Not applicable,22-05-2019,05-06-2024,New Road,,,Sheerness,Kent,ME12 1BW,www.st-edwards-sheerness.co.uk,1795662708.0,Mrs,Sara,Wakefield,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Sheerness,Sittingbourne and Sheppey,(England/Wales) Urban city and town,E10000016,591704.0,174591.0,Swale 002,Swale 002B,,,,,Good,South-East England and South London,,200002533178.0,,Not applicable,Not applicable,,,E02005116,E01024614,99.0, +141471,886,Kent,3714,St Peter's Catholic Primary School,Academy converter,Academies,Open,Academy Converter,01-10-2014,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Roman Catholic,Does not apply,Archdiocese of Southwark,Not applicable,210.0,No Special Classes,19-01-2023,212.0,107.0,105.0,11.8,Supported by a multi-academy trust,KENT CATHOLIC SCHOOLS' PARTNERSHIP,Linked to a sponsor,Kent Catholic Schools' Partnership,Not applicable,,10047621.0,,Not applicable,07-02-2024,20-05-2024,West Ridge,,,Sittingbourne,Kent,ME10 1UJ,www.st-peters-sittingbourne.co.uk,1795423479.0,Ms,Catherine,Vedamuttu,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Homewood,Sittingbourne and Sheppey,(England/Wales) Urban city and town,E10000016,589880.0,162952.0,Swale 012,Swale 012D,,,,,Good,South-East England and South London,,200002527647.0,,Not applicable,Not applicable,,,E02005126,E01024630,25.0, +141472,886,Kent,3745,More Park Catholic Primary School,Academy converter,Academies,Open,Academy Converter,01-10-2014,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Roman Catholic,Does not apply,Archdiocese of Southwark,Not applicable,210.0,No Special Classes,19-01-2023,207.0,95.0,112.0,8.7,Supported by a multi-academy trust,KENT CATHOLIC SCHOOLS' PARTNERSHIP,Linked to a sponsor,Kent Catholic Schools' Partnership,Not applicable,,10047622.0,,Not applicable,23-02-2023,16-04-2024,Lucks Hill,,,West Malling,Kent,ME19 6HN,www.moreparkprimary.co.uk/,1732843047.0,Mrs,Deborah,Seal,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,"East Malling, West Malling & Offham",Tonbridge and Malling,(England/Wales) Rural hamlet and isolated dwellings,E10000016,568701.0,157897.0,Tonbridge and Malling 014,Tonbridge and Malling 014C,,,,,Good,South-East England and South London,,200000960428.0,,Not applicable,Not applicable,,,E02006833,E01024783,18.0, +141497,886,Kent,3740,St Richard's Catholic Primary School,Academy converter,Academies,Open,Academy Converter,01-10-2014,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Roman Catholic,Does not apply,Archdiocese of Southwark,Not applicable,210.0,No Special Classes,19-01-2023,191.0,80.0,111.0,30.9,Supported by a multi-academy trust,KENT CATHOLIC SCHOOLS' PARTNERSHIP,Linked to a sponsor,Kent Catholic Schools' Partnership,Not applicable,,10047638.0,,Not applicable,06-10-2022,29-05-2024,Castle Avenue,,,Dover,Kent,CT16 1EZ,http://www.st-richards.kent.sch.uk,1304201118.0,Mr,Colin,Taylor,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,Town & Castle,Dover,(England/Wales) Urban city and town,E10000016,631763.0,142271.0,Dover 012,Dover 012E,,,,,Good,South-East England and South London,,100062288989.0,,Not applicable,Not applicable,,,E02005052,E01033209,59.0, +141532,886,Kent,5217,"Our Lady of Hartley Catholic Primary School, Hartley, Longfield",Academy converter,Academies,Open,Academy Converter,01-11-2014,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Roman Catholic,Does not apply,Archdiocese of Southwark,Not applicable,218.0,No Special Classes,19-01-2023,212.0,95.0,117.0,4.2,Supported by a multi-academy trust,KENT CATHOLIC SCHOOLS' PARTNERSHIP,Linked to a sponsor,Kent Catholic Schools' Partnership,Not applicable,,10047893.0,,Not applicable,,14-11-2023,Stack Lane,Hartley,,Longfield,Kent,DA3 8BL,http://www.ourladyhartley.kent.sch.uk/,1474706385.0,Mr,James,Baker,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Hartley and Hodsoll Street,Dartford,(England/Wales) Urban city and town,E10000016,560720.0,167649.0,Sevenoaks 004,Sevenoaks 004A,,,,,,South-East England and South London,,10035182405.0,,Not applicable,Not applicable,,,E02005090,E01024441,9.0, +141534,886,Kent,2069,Dartford Primary Academy,Academy converter,Academies,Open,Academy Converter,01-11-2014,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,654.0,No Special Classes,19-01-2023,673.0,333.0,340.0,17.2,Supported by a multi-academy trust,LEIGH ACADEMIES TRUST,Linked to a sponsor,Leigh Academies Trust,Not applicable,,10047892.0,,Not applicable,13-09-2023,09-04-2024,York Road,,,Dartford,Kent,DA1 1SQ,www.dartfordprimary.org.uk/,1322224453.0,Miss,Rebecca,Roberts,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dartford,Brent,Dartford,(England/Wales) Urban major conurbation,E10000016,554979.0,173734.0,Dartford 008,Dartford 008C,,,,,Good,South-East England and South London,,200000533723.0,,Not applicable,Not applicable,,,E02005035,E01024137,115.0, +141548,886,Kent,2055,Lansdowne Primary School,Academy sponsor led,Academies,Open,New Provision,01-11-2014,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,None,Not applicable,Not applicable,420.0,Not applicable,19-01-2023,397.0,201.0,196.0,33.5,Supported by a multi-academy trust,THE STOUR ACADEMY TRUST,Linked to a sponsor,The Stour Academy Trust,Not applicable,,10047877.0,,Not applicable,14-12-2022,29-05-2024,Gladstone Drive,,,Sittingbourne,Kent,ME10 3BH,www.lansdowne.kent.sch.uk/,1795423752.0,Mrs,Claire,Jobe,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Murston,Sittingbourne and Sheppey,(England/Wales) Urban city and town,E10000016,592376.0,163394.0,Swale 011,Swale 011B,,,,,Good,South-East England and South London,,200002528849.0,,Not applicable,Not applicable,,,E02005125,E01024592,133.0, +141578,886,Kent,3019,Shorne Church of England Primary School,Academy converter,Academies,Open,Academy Converter,01-12-2014,,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,210.0,No Special Classes,19-01-2023,209.0,114.0,95.0,4.8,Supported by a multi-academy trust,ALETHEIA ACADEMIES TRUST,Linked to a sponsor,Aletheia Academies Trust,Not applicable,,10048077.0,,Not applicable,08-03-2023,23-04-2024,Cob Drive,Shorne,,Gravesend,Kent,DA12 3DU,www.shorne.kent.sch.uk,1474822312.0,Miss,Tara,Hewett,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Gravesham,Higham & Shorne,Gravesham,(England/Wales) Rural village,E10000016,569273.0,171239.0,Gravesham 010,Gravesham 010E,,,,,Good,South-East England and South London,,100062312571.0,,Not applicable,Not applicable,,,E02005064,E01024301,10.0, +141579,886,Kent,5210,St Botolph's Church of England Primary School,Academy converter,Academies,Open,Academy Converter,01-12-2014,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,210.0,No Special Classes,19-01-2023,422.0,197.0,225.0,25.6,Supported by a multi-academy trust,ALETHEIA ACADEMIES TRUST,Linked to a sponsor,Aletheia Academies Trust,Not applicable,,10048078.0,,Not applicable,29-03-2023,10-05-2024,Dover Road,Northfleet,,Gravesend,Kent,DA11 9PL,www.st-botolphs.kent.sch.uk,1474365737.0,Mrs,Alice,Martin,,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Gravesham,Rosherville,Gravesham,(England/Wales) Urban major conurbation,E10000016,562966.0,173733.0,Gravesham 001,Gravesham 001A,,,,,Good,South-East England and South London,,100062311179.0,,Not applicable,Not applicable,,,E02005055,E01024276,108.0, +141580,886,Kent,5222,"St Joseph's Catholic Primary School, Northfleet",Academy converter,Academies,Open,Academy Converter,01-12-2014,,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Roman Catholic,Does not apply,Archdiocese of Southwark,Not applicable,210.0,No Special Classes,19-01-2023,208.0,106.0,102.0,15.4,Supported by a multi-academy trust,KENT CATHOLIC SCHOOLS' PARTNERSHIP,Linked to a sponsor,Kent Catholic Schools' Partnership,Not applicable,,10047684.0,,Not applicable,11-01-2023,13-09-2023,Springhead Road,Northfleet,,Gravesend,Kent,DA11 9QZ,www.st-josephs-northfleet.kent.sch.uk/,1474533515.0,Mr,Andrew,Baldock,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Gravesham,Northfleet & Springhead,Gravesham,(England/Wales) Urban major conurbation,E10000016,562589.0,173691.0,Gravesham 001,Gravesham 001B,,,,,Outstanding,South-East England and South London,,100062311131.0,,Not applicable,Not applicable,,,E02005055,E01024277,32.0, +141628,886,Kent,4633,Ursuline College,Academy converter,Academies,Open,Academy Converter,01-01-2015,,,Secondary,11.0,18,Not applicable,Not applicable,Has a sixth form,Mixed,Roman Catholic,Does not apply,Archdiocese of Southwark,Non-selective,763.0,Not applicable,19-01-2023,978.0,473.0,505.0,26.4,Supported by a multi-academy trust,KENT CATHOLIC SCHOOLS' PARTNERSHIP,Linked to a sponsor,Kent Catholic Schools' Partnership,Not applicable,,10048333.0,,Not applicable,09-11-2022,03-06-2024,225 Canterbury Road,,,Westgate-on-Sea,Kent,CT8 8LX,http://www.ursuline.kent.sch.uk/,1843834431.0,Miss,Danielle,Lancefield,Executive Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Thanet,Westgate-on-Sea,North Thanet,(England/Wales) Urban city and town,E10000016,631675.0,169531.0,Thanet 007,Thanet 007B,,,,,Good,South-East England and South London,,200003078464.0,,Not applicable,Not applicable,,,E02005138,E01024713,218.0, +141629,886,Kent,5216,Stella Maris Catholic Primary School,Academy converter,Academies,Open,Academy Converter,01-01-2015,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Roman Catholic,Does not apply,Archdiocese of Southwark,Not applicable,210.0,No Special Classes,19-01-2023,211.0,106.0,105.0,19.0,Supported by a multi-academy trust,KENT CATHOLIC SCHOOLS' PARTNERSHIP,Linked to a sponsor,Kent Catholic Schools' Partnership,Not applicable,,10048334.0,,Not applicable,21-06-2023,01-05-2024,Parkfield Road,,,Folkestone,Kent,CT19 5BY,www.stellamaris.kent.sch.uk/,1303252127.0,Mr,Andrew,Langley,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Folkestone and Hythe,Broadmead,Folkestone and Hythe,(England/Wales) Urban city and town,E10000016,622234.0,136791.0,Folkestone and Hythe 006,Folkestone and Hythe 006E,,,,,Good,South-East England and South London,,50040637.0,,Not applicable,Not applicable,,,E02005107,E01024515,40.0, +141650,886,Kent,2180,South Borough Primary School,Academy converter,Academies,Open,Academy Converter,01-02-2015,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,480.0,No Special Classes,19-01-2023,509.0,240.0,269.0,23.2,Supported by a multi-academy trust,SWALE ACADEMIES TRUST,Linked to a sponsor,Swale Academies Trust,Not applicable,,10048683.0,,Not applicable,26-04-2023,18-04-2024,Stagshaw Close,Postley Road,,Maidstone,Kent,ME15 6TL,http://www.southboroughprimary.org.uk,1622752161.0,Mr,Mathew,Currie,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,High Street,Maidstone and The Weald,(England/Wales) Urban city and town,E10000016,576421.0,154655.0,Maidstone 009,Maidstone 009C,,,,,Good,South-East England and South London,,200003683342.0,,Not applicable,Not applicable,,,E02005076,E01024374,116.0, +141659,886,Kent,2058,Charlton Church of England Primary School,Academy sponsor led,Academies,Open,New Provision,01-03-2015,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,None,Diocese of Canterbury,Not applicable,210.0,Not applicable,19-01-2023,199.0,88.0,111.0,35.7,Supported by a multi-academy trust,THE DIOCESE OF CANTERBURY ACADEMIES TRUST,Linked to a sponsor,"Aquila, The Diocese of Canterbury Academies Trust",Not applicable,,10048211.0,,Not applicable,22-11-2023,23-04-2024,Barton Road,,,Dover,Kent,CT16 2LX,www.charlton.kent.sch.uk/,1304201275.0,Mrs,Sally-Anne,Pettersen,Headteacher,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,Buckland,Dover,(England/Wales) Urban city and town,E10000016,631452.0,142470.0,Dover 011,Dover 011B,,,,,Good,South-East England and South London,,100062289316.0,,Not applicable,Not applicable,,,E02005051,E01024194,71.0, +141660,886,Kent,2059,Lydd Primary School,Academy sponsor led,Academies,Open,New Provision,01-03-2015,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,None,Not applicable,Not applicable,280.0,Not applicable,19-01-2023,274.0,150.0,124.0,50.6,Supported by a multi-academy trust,OUR COMMUNITY MULTI ACADEMY TRUST,-,,Not applicable,,10048212.0,,Not applicable,13-09-2023,07-05-2024,20 Skinner Road,Lydd,,Romney Marsh,Kent,TN29 9HW,www.lyddprimary.org.uk,1797320362.0,Mrs,Nicki,Man,Head Teacher,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Folkestone and Hythe,Walland & Denge Marsh,Folkestone and Hythe,(England/Wales) Rural town and fringe,E10000016,604171.0,120623.0,Folkestone and Hythe 013,Folkestone and Hythe 013C,,,,,Good,South-East England and South London,,50114553.0,,Not applicable,Not applicable,,,E02005114,E01024534,129.0, +141754,886,Kent,2625,Godinton Primary School,Academy converter,Academies,Open,Academy Converter,01-03-2015,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,No Special Classes,19-01-2023,419.0,229.0,190.0,13.6,Supported by a single-academy trust,GODINTON ACADEMY TRUST,-,,Not applicable,,10048785.0,,Not applicable,07-02-2024,03-06-2024,Lockholt Close,,,Ashford,Kent,TN23 3JR,http://www.godinton.kent.sch.uk,1233621616.0,,Jillian,Talbot,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Ashford,Godinton,Ashford,(England/Wales) Urban city and town,E10000016,599006.0,143191.0,Ashford 016,Ashford 016D,,,,,Good,South-East England and South London,,100062558565.0,,Not applicable,Not applicable,,,E02007047,E01023993,57.0, +141766,886,Kent,2596,Chilton Primary School,Academy converter,Academies,Open,Academy Converter,01-03-2015,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,No Special Classes,19-01-2023,418.0,211.0,207.0,18.9,Supported by a multi-academy trust,VIKING ACADEMY TRUST,-,,Not applicable,,10048967.0,,Not applicable,10-01-2019,17-09-2023,Chilton Lane,,,Ramsgate,Kent,CT11 0LQ,http://www.chiltonprimary.co.uk/,1843597695.0,Mr,Alex,McAuley,Executive Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Thanet,Cliffsend and Pegwell,South Thanet,(England/Wales) Urban city and town,E10000016,636338.0,164593.0,Thanet 017,Thanet 017A,,,,,Outstanding,South-East England and South London,,100062281920.0,,Not applicable,Not applicable,,,E02005148,E01024650,79.0, +141871,886,Kent,2060,Beaver Green Primary School,Academy sponsor led,Academies,Open,New Provision,01-04-2015,,,Primary,2.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,None,Not applicable,Not applicable,420.0,Not applicable,19-01-2023,480.0,248.0,232.0,44.6,Supported by a multi-academy trust,SWALE ACADEMIES TRUST,Linked to a sponsor,Swale Academies Trust,Not applicable,,10049033.0,,Not applicable,14-03-2023,15-05-2024,Cuckoo Lane,,,Ashford,Kent,TN23 5DA,www.beaver-green.kent.sch.uk,1233621989.0,Ms,Tina,Oakley,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Ashford,Beaver,Ashford,(England/Wales) Urban city and town,E10000016,599449.0,141135.0,Ashford 007,Ashford 007C,,,,,Good,South-East England and South London,,200004396685.0,,Not applicable,Not applicable,,,E02005002,E01023977,193.0, +141881,886,Kent,2061,Finberry Primary School,Academy sponsor led,Academies,Open,New Provision,01-09-2015,,,Primary,2.0,11,,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,None,Not applicable,Not applicable,350.0,Has Special Classes,19-01-2023,334.0,175.0,159.0,22.3,Supported by a multi-academy trust,THE STOUR ACADEMY TRUST,Linked to a sponsor,The Stour Academy Trust,Not applicable,,10053381.0,,Not applicable,24-01-2024,20-05-2024,Avocet Way,Finberry,,Ashford,Kent,TN25 7GS,http://www.finberryprimaryschool.org.uk/,1233622686.0,Headteacher,Siobhan,Risley,Headteacher,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,"SEMH - Social, Emotional and Mental Health",,,,,,,,,,,,,Resourced provision,5.0,8.0,,,South East,Ashford,"Mersham, Sevington South with Finberry",Ashford,(England/Wales) Urban city and town,E10000016,602230.0,139442.0,Ashford 010,Ashford 010E,,,,,Good,South-East England and South London,United Kingdom,10012868578.0,,Not applicable,Not applicable,,,E02005005,E01034987,71.0, +142052,886,Kent,2063,Istead Rise Primary School,Academy sponsor led,Academies,Open,New Provision,01-09-2015,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,None,Not applicable,Not applicable,210.0,Not applicable,19-01-2023,243.0,125.0,118.0,16.5,Supported by a multi-academy trust,SWALE ACADEMIES TRUST,Linked to a sponsor,Swale Academies Trust,Not applicable,,10049666.0,,Not applicable,28-02-2024,22-05-2024,Downs Road,Northfleet,,Gravesend,Kent,DA13 9HG,,1474833177.0,Mr,Steven,Payne,Executive Headteacher,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Gravesham,"Istead Rise, Cobham & Luddesdown",Gravesham,(England/Wales) Rural town and fringe,E10000016,563354.0,169714.0,Gravesham 012,Gravesham 012A,,,,,Good,South-East England and South London,,10012011594.0,,Not applicable,Not applicable,,,E02005066,E01024268,40.0, +142117,886,Kent,2064,Ramsgate Arts Primary School,Free schools,Free Schools,Open,New Provision,01-09-2015,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,None,None,,,420.0,Not applicable,19-01-2023,355.0,161.0,194.0,29.9,Supported by a multi-academy trust,VIKING ACADEMY TRUST,-,,Not applicable,,10053814.0,,Not applicable,28-09-2023,13-12-2023,140-144 Newington Road,,,Ramsgate,Kent,CT12 6PP,http://www.ramsgateartsprimaryschool.co.uk/,1843582847.0,Mr,Nicholas,Budge,Executive Head Teacher,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Thanet,Northwood,South Thanet,(England/Wales) Urban city and town,E10000016,636761.0,166126.0,Thanet 013,Thanet 013D,,,,,Good,South-East England and South London,,100061133646.0,,Not applicable,Not applicable,,,E02005144,E01024685,106.0, +142156,886,Kent,3708,"St John's Catholic Primary School, Gravesend",Academy converter,Academies,Open,Academy Converter,01-07-2015,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Roman Catholic,Does not apply,Archdiocese of Southwark,Not applicable,840.0,No Special Classes,19-01-2023,886.0,441.0,445.0,16.5,Supported by a multi-academy trust,KENT CATHOLIC SCHOOLS' PARTNERSHIP,Linked to a sponsor,Kent Catholic Schools' Partnership,Not applicable,,10053098.0,,Not applicable,18-10-2023,23-04-2024,Rochester Road,,,Gravesend,Kent,DA12 2SY,http://www.stjohnsprimary.kent.sch.uk,1474534546.0,Co Headteacher,Caroline Barron,Paula Cooneyhan,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Gravesham,Denton,Gravesham,(England/Wales) Urban major conurbation,E10000016,565990.0,173541.0,Gravesham 003,Gravesham 003C,,,,,Good,South-East England and South London,,100062311904.0,,Not applicable,Not applicable,,,E02005057,E01024293,142.0, +142162,886,Kent,3715,"St Mary's Catholic Primary School, Whitstable",Academy converter,Academies,Open,Academy Converter,01-07-2015,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Roman Catholic,Does not apply,Archdiocese of Southwark,Not applicable,420.0,No Special Classes,19-01-2023,374.0,186.0,188.0,12.3,Supported by a multi-academy trust,KENT CATHOLIC SCHOOLS' PARTNERSHIP,Linked to a sponsor,Kent Catholic Schools' Partnership,Not applicable,,10053095.0,,Not applicable,08-11-2023,21-05-2024,Northwood Road,,,Whitstable,Kent,CT5 2EY,http://www.st-marys-whitstable.kent.sch.uk,1227272692.0,Mrs,Michele,Blunt,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Canterbury,Tankerton,Canterbury,(England/Wales) Urban city and town,E10000016,611618.0,166842.0,Canterbury 007,Canterbury 007E,,,,,Good,South-East England and South London,,100062300983.0,,Not applicable,Not applicable,,,E02005016,E01024116,46.0, +142188,886,Kent,2073,Langley Park Primary Academy,Academy sponsor led,Academies,Open,New Provision,01-09-2016,,,Primary,3.0,11,,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,None,Not applicable,Not applicable,420.0,Not applicable,19-01-2023,451.0,232.0,219.0,15.5,Supported by a multi-academy trust,LEIGH ACADEMIES TRUST,Linked to a sponsor,Leigh Academies Trust,Not applicable,,10053393.0,,Not applicable,19-06-2019,15-04-2024,Edmett Way,,,Maidstone,Kent,ME17 3FX,www.langleyparkprimaryacademy.org.uk,1622250880.0,Miss,Sally,Brading,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,ASD - Autistic Spectrum Disorder,,,,,,,,,,,,,Resourced provision,10.0,10.0,,,South East,Maidstone,Park Wood,Faversham and Mid Kent,(England/Wales) Urban city and town,E10000016,579116.0,151664.0,Maidstone 015,Maidstone 015H,,,,,Good,South-East England and South London,,10093304704.0,,Not applicable,Not applicable,,,E02005082,E01034999,70.0, +142346,886,Kent,2110,Culverstone Green Primary School,Academy converter,Academies,Open,Academy Converter,01-10-2015,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,212.0,121.0,91.0,10.8,Supported by a multi-academy trust,THE GOLDEN THREAD ALLIANCE,-,,Not applicable,,10054199.0,,Not applicable,18-10-2018,18-04-2024,Wrotham Road,Meopham,,Gravesend,Kent,DA13 0RF,http://www.cgps.kent.sch.uk,1732822568.0,,James,Bernard,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Gravesham,Meopham South & Vigo,Gravesham,(England/Wales) Rural hamlet and isolated dwellings,E10000016,563542.0,163114.0,Gravesham 013,Gravesham 013A,,,,,Good,South-East England and South London,,100062312941.0,,Not applicable,Not applicable,,,E02005067,E01024273,23.0, +142347,886,Kent,2650,Dymchurch Primary School,Academy converter,Academies,Open,Academy Converter,01-10-2015,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,311.0,No Special Classes,19-01-2023,159.0,73.0,86.0,36.5,Supported by a multi-academy trust,OUR COMMUNITY MULTI ACADEMY TRUST,-,,Not applicable,,10054200.0,,Not applicable,27-04-2022,15-05-2024,New Hall Close,Dymchurch,,Romney Marsh,Kent,TN29 0LE,http://www.dymchurch.kent.sch.uk,1303872377.0,Mr,Iain,Rudgyard,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Folkestone and Hythe,Romney Marsh,Folkestone and Hythe,(England/Wales) Rural town and fringe,E10000016,610150.0,129670.0,Folkestone and Hythe 011,Folkestone and Hythe 011A,,,,,Requires improvement,South-East England and South London,,50009728.0,,Not applicable,Not applicable,,,E02005112,E01024486,58.0, +142363,886,Kent,2462,Riverview Infant School,Academy converter,Academies,Open,Academy Converter,01-10-2015,,,Primary,4.0,7,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,360.0,No Special Classes,19-01-2023,330.0,167.0,163.0,19.1,Supported by a multi-academy trust,THE GOLDEN THREAD ALLIANCE,-,,Not applicable,,10054175.0,,Not applicable,08-12-2021,09-04-2024,Cimba Wood,,,Gravesend,Kent,DA12 4SD,www.riverview-infant.com,1474566484.0,Mrs,Kerrie,Ward,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Gravesham,Riverview Park,Gravesham,(England/Wales) Urban major conurbation,E10000016,566337.0,171561.0,Gravesham 008,Gravesham 008B,,,,,Good,South-East England and South London,,10012012176.0,,Not applicable,Not applicable,,,E02005062,E01024298,63.0, +142372,886,Kent,5228,St Georges CofE (Aided) Primary School,Academy converter,Academies,Open,Academy Converter,01-10-2015,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,420.0,No Special Classes,19-01-2023,393.0,189.0,204.0,20.6,Supported by a multi-academy trust,THE DIOCESE OF CANTERBURY ACADEMIES TRUST,Linked to a sponsor,"Aquila, The Diocese of Canterbury Academies Trust",Not applicable,,10054170.0,,Not applicable,07-02-2024,20-05-2024,Chequers Road,,,Sheerness,Kent,ME12 3QU,http://www.st-georges-sheppey.kent.sch.uk/,1795877667.0,Mr,Howard,Fisher,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Sheppey Central,Sittingbourne and Sheppey,(England/Wales) Urban city and town,E10000016,596107.0,172691.0,Swale 005,Swale 005D,,,,,Good,South-East England and South London,,200002530151.0,,Not applicable,Not applicable,,,E02005119,E01024620,81.0, +142429,886,Kent,3140,Kingsnorth Church of England Primary School,Academy converter,Academies,Open,Academy Converter,01-11-2015,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,420.0,No Special Classes,19-01-2023,420.0,202.0,218.0,11.2,Supported by a multi-academy trust,THE DIOCESE OF CANTERBURY ACADEMIES TRUST,Linked to a sponsor,"Aquila, The Diocese of Canterbury Academies Trust",Not applicable,,10054668.0,,Not applicable,09-10-2018,22-04-2024,Church Hill,Kingsnorth,,Ashford,Kent,TN23 3EF,www.kingsnorth.kent.sch.uk,1233622673.0,Mr,Iain,Witts,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Ashford,Kingsnorth Village & Bridgefield,Ashford,(England/Wales) Urban city and town,E10000016,600571.0,139333.0,Ashford 010,Ashford 010G,,,,,Good,South-East England and South London,,100062558563.0,,Not applicable,Not applicable,,,E02005005,E01034989,47.0, +142517,886,Kent,2076,Cherry Orchard Primary Academy,Academy sponsor led,Academies,Open,New Provision,01-09-2017,,,Primary,2.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,,,,Not applicable,450.0,Not applicable,19-01-2023,446.0,223.0,223.0,13.6,Supported by a multi-academy trust,LEIGH ACADEMIES TRUST,Linked to a sponsor,Leigh Academies Trust,Not applicable,,10064709.0,,,10-11-2021,11-01-2024,Cherry Orchard,Cherry Orchard Road,Ebbsfleet Valley,Ebbsfleet,Kent,DA10 1AD,www.cherryorchardprimaryacademy.org.uk,1322242011.0,Mrs,Julie,Forsythe,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,"SLCN - Speech, language and Communication",,,,,,,,,,,,,Resourced provision,14.0,15.0,,,South East,Dartford,Ebbsfleet,Dartford,(England/Wales) Urban major conurbation,E10000016,560297.0,173251.0,Dartford 002,Dartford 002H,,,,,Outstanding,South-East England and South London,United Kingdom,10023446223.0,,Not applicable,Not applicable,,,E02005029,E01035280,60.0, +142591,886,Kent,3915,Manor Community Primary School,Academy converter,Academies,Open,Academy Converter,01-02-2016,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,674.0,No Special Classes,19-01-2023,670.0,334.0,336.0,31.2,Supported by a multi-academy trust,CYGNUS ACADEMIES TRUST,Linked to a sponsor,Cygnus Academies Trust,Not applicable,,10055399.0,,Not applicable,31-10-2018,29-05-2024,Keary Road,,,Swanscombe,Kent,DA10 0BU,www.manor.kent.sch.uk/,1322383314.0,Mrs,Natalie,Hill,,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dartford,Swanscombe,Dartford,(England/Wales) Urban major conurbation,E10000016,560606.0,173953.0,Dartford 004,Dartford 004B,,,,,Good,South-East England and South London,,10023438316.0,,Not applicable,Not applicable,,,E02005031,E01024176,199.0, +142613,886,Kent,2077,Westgate Primary School,Academy sponsor led,Academies,Open,New Provision,01-04-2016,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,,Not applicable,Not applicable,210.0,Not applicable,19-01-2023,210.0,101.0,109.0,21.0,Supported by a multi-academy trust,CYGNUS ACADEMIES TRUST,Linked to a sponsor,Cygnus Academies Trust,Not applicable,,10055488.0,,,06-03-2019,02-06-2024,Summerhill Road,,,Dartford,Kent,DA1 2LP,https://www.westgateprimary.org/,1322223382.0,Mrs,Laura,Crosley,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dartford,Town,Dartford,(England/Wales) Urban major conurbation,E10000016,553773.0,173889.0,Dartford 003,Dartford 003C,,,,,Good,South-East England and South London,,100062616136.0,,Not applicable,Not applicable,,,E02005030,E01024182,44.0, +142689,886,Kent,3306,Brenchley and Matfield Church of England Primary School,Academy converter,Academies,Open,Academy Converter,01-05-2016,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,210.0,No Special Classes,19-01-2023,196.0,93.0,103.0,9.7,Supported by a multi-academy trust,THE TENAX SCHOOLS TRUST,Linked to a sponsor,The Tenax Schools Trust,Not applicable,,10056161.0,,Not applicable,15-11-2018,13-09-2023,Market Heath,Brenchley,,Tonbridge,Kent,TN12 7NY,www.bmprimary.org.uk,1892722929.0,Miss,Jane,Mallon,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Brenchley and Horsmonden,Tunbridge Wells,(England/Wales) Rural village,E10000016,567404.0,141906.0,Tunbridge Wells 004,Tunbridge Wells 004A,,,,,Good,South-East England and South London,,100062546036.0,,Not applicable,Not applicable,,,E02005165,E01024793,19.0, +142814,886,Kent,2078,St Nicholas Church of England Primary Academy,Academy sponsor led,Academies,Open,New Provision,01-06-2016,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,,Diocese of Canterbury,Not applicable,378.0,Not applicable,19-01-2023,396.0,212.0,184.0,34.8,Supported by a multi-academy trust,THE DIOCESE OF CANTERBURY ACADEMIES TRUST,Linked to a sponsor,"Aquila, The Diocese of Canterbury Academies Trust",Not applicable,,10056538.0,,,23-05-2019,08-05-2024,Fairfield Road,,,New Romney,Kent,TN28 8BP,www.st-nicholas-newromney.kent.sch.uk,1797361906.0,Mr,Christopher,Dale,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,ASD - Autistic Spectrum Disorder,,,,,,,,,,,,,Resourced provision,2.0,14.0,,,South East,Folkestone and Hythe,New Romney,Folkestone and Hythe,(England/Wales) Rural town and fringe,E10000016,606585.0,125146.0,Folkestone and Hythe 012,Folkestone and Hythe 012C,,,,,Good,South-East England and South London,,50002925.0,,Not applicable,Not applicable,,,E02005113,E01024539,138.0, +142834,886,Kent,2079,Woodlands Primary School,Community school,Local authority maintained schools,Open,Result of Amalgamation,01-09-2016,,,Primary,4.0,11,Not applicable,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,,Not applicable,630.0,Not applicable,19-01-2023,643.0,355.0,288.0,20.7,Not applicable,,Not applicable,,Not under a federation,,10058897.0,,,12-06-2019,11-04-2024,Higham School Lane,Hunt Road,,Tonbridge,Kent,TN10 4BB,www.woodlands.kent.sch.uk,1732355577.0,Mrs,Vicki,Lonie,Headteacher,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Tonbridge and Malling,Higham,Tonbridge and Malling,(England/Wales) Urban city and town,E10000016,560317.0,148629.0,Tonbridge and Malling 011,Tonbridge and Malling 011C,,,,,Good,South-East England and South London,,10013922163.0,,Not applicable,Not applicable,,,E02005159,E01024749,133.0, +142924,886,Kent,2080,Barming Primary School,Academy sponsor led,Academies,Open,New Provision,01-07-2016,,,Primary,2.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,,Not applicable,Not applicable,420.0,Not applicable,19-01-2023,467.0,244.0,223.0,25.1,Supported by a multi-academy trust,ORCHARD ACADEMY TRUST,Linked to a sponsor,Allington Primary School Academy Trust (Orchard Academy Trust),Not applicable,,10056809.0,,,09-05-2019,30-04-2024,Belmont Close,Barming,,Maidstone,Kent,ME16 9DY,https://www.barming.kent.sch.uk/,1622726472.0,Mr,Christopher,Laker,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Barming and Teston,Maidstone and The Weald,(England/Wales) Urban city and town,E10000016,572627.0,154790.0,Maidstone 014,Maidstone 014A,,,,,Good,South-East England and South London,,200003720125.0,,Not applicable,Not applicable,,,E02005081,E01024325,107.0, +143073,886,Kent,2309,Priory Fields School,Academy converter,Academies,Open,Academy Converter,01-08-2016,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,No Special Classes,19-01-2023,365.0,178.0,187.0,57.3,Supported by a multi-academy trust,WHINLESS DOWN ACADEMY TRUST,-,,Not applicable,,10057450.0,,Not applicable,20-11-2018,08-05-2024,Astor Avenue,,,Dover,Kent,CT17 0FS,http://www.prioryfields.kent.sch.uk,1304211543.0,Miss,Casey,Hall,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,Tower Hamlets,Dover,(England/Wales) Urban city and town,E10000016,630848.0,141634.0,Dover 011,Dover 011H,,,,,Good,South-East England and South London,,10034874352.0,,Not applicable,Not applicable,,,E02005051,E01024248,209.0, +143075,886,Kent,2313,St Martin's School,Academy converter,Academies,Open,Academy Converter,01-08-2016,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,194.0,102.0,92.0,17.0,Supported by a multi-academy trust,WHINLESS DOWN ACADEMY TRUST,-,,Not applicable,,10057448.0,,Not applicable,08-02-2024,20-05-2024,Markland Road,,,Dover,Kent,CT17 9LY,www.stmartins.kent.sch.uk/,1304206620.0,Mrs,Helen,Thompson,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,Maxton & Elms Vale,Dover,(England/Wales) Urban city and town,E10000016,630181.0,141199.0,Dover 014,Dover 014C,,,,,Good,South-East England and South London,,100062290538.0,,Not applicable,Not applicable,,,E02005054,E01024213,33.0, +143218,886,Kent,3914,Oakfield Primary Academy,Academy converter,Academies,Open,Academy Converter,01-09-2016,,,Primary,2.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,630.0,Has Special Classes,19-01-2023,719.0,383.0,336.0,27.5,Supported by a multi-academy trust,THE GOLDEN THREAD ALLIANCE,-,,Not applicable,,10057852.0,,Not applicable,06-10-2021,03-06-2024,Oakfield Lane,,,Dartford,Kent,DA1 2SW,http://www.oakfield-dartford.co.uk,1322220831.0,Mrs,Rajinder,Kaur-Gill,Head Teacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,ASD - Autistic Spectrum Disorder,,,,,,,,,,,,,Resourced provision,14.0,12.0,,,South East,Dartford,"Wilmington, Sutton-at-Hone & Hawley",Dartford,(England/Wales) Urban major conurbation,E10000016,553836.0,172851.0,Dartford 009,Dartford 009D,,,,,Good,South-East England and South London,,200000534405.0,,Not applicable,Not applicable,,,E02005036,E01024168,192.0, +143219,886,Kent,2657,Temple Hill Primary Academy,Academy converter,Academies,Open,Academy Converter,01-09-2016,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,914.0,Has Special Classes,19-01-2023,891.0,458.0,433.0,38.5,Supported by a multi-academy trust,THE GOLDEN THREAD ALLIANCE,-,,Not applicable,,10057853.0,,Not applicable,26-06-2019,03-06-2024,St Edmund's Road,Temple Hill,,Dartford,Kent,DA1 5ND,http://www.temple-hill.kent.sch.uk,1322224600.0,Mr,Leon,Dawson,Executive Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,"SLCN - Speech, language and Communication",,,,,,,,,,,,,Resourced provision,5.0,8.0,3.0,12.0,South East,Dartford,Temple Hill,Dartford,(England/Wales) Urban major conurbation,E10000016,555040.0,175006.0,Dartford 001,Dartford 001I,,,,,Good,South-East England and South London,,200000530828.0,,Not applicable,Not applicable,,,E02005028,E01035274,329.0, +143220,886,Kent,2523,Upton Junior School,Academy converter,Academies,Open,Academy Converter,01-09-2016,,,Primary,7.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,512.0,No Special Classes,19-01-2023,513.0,263.0,250.0,22.2,Supported by a multi-academy trust,VIKING ACADEMY TRUST,-,,Not applicable,,10057856.0,,Not applicable,,05-06-2024,"Upton Junior School, Edge End Road",,,Broadstairs,Kent,CT10 2AH,http://www.uptonjunior.com/,1843861393.0,Miss,Darci,Arthur,Executive Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Thanet,Viking,South Thanet,(England/Wales) Urban city and town,E10000016,638779.0,167831.0,Thanet 010,Thanet 010C,,,,,,South-East England and South London,,100062627193.0,,Not applicable,Not applicable,,,E02005141,E01024706,114.0, +143517,886,Kent,2081,Brenzett Church of England Primary School,Academy sponsor led,Academies,Open,New Provision,01-10-2016,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,,Diocese of Canterbury,Not applicable,140.0,Not applicable,19-01-2023,83.0,40.0,43.0,38.6,Supported by a multi-academy trust,THE DIOCESE OF CANTERBURY ACADEMIES TRUST,Linked to a sponsor,"Aquila, The Diocese of Canterbury Academies Trust",Not applicable,,10061368.0,,,03-07-2019,18-04-2024,Straight Lane,,Brenzett,Romney Marsh,Kent,TN29 9UA,www.brenzett.kent.sch.uk,1797344335.0,Mrs,Rowan,Wright,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Folkestone and Hythe,Walland & Denge Marsh,Folkestone and Hythe,(England/Wales) Rural hamlet and isolated dwellings,E10000016,600427.0,127014.0,Folkestone and Hythe 011,Folkestone and Hythe 011D,,,,,Good,South-East England and South London,,50100964.0,,Not applicable,Not applicable,,,E02005112,E01024548,32.0, +143605,886,Kent,5220,Halfway Houses Primary School,Academy converter,Academies,Open,Academy Converter,01-11-2016,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,None,Does not apply,Not applicable,Not applicable,630.0,No Special Classes,19-01-2023,591.0,302.0,289.0,28.4,Supported by a multi-academy trust,THE ISLAND LEARNING TRUST,Linked to a sponsor,The Island Learning Trust,Not applicable,,10061768.0,,Not applicable,13-11-2018,18-04-2024,Danley Road,Minster-on-Sea,,Sheerness,Kent,ME12 3AP,www.halfwayhouses.kent.sch.uk,1795662875.0,Mrs,Lindsay,Fordyce,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Queenborough and Halfway,Sittingbourne and Sheppey,(England/Wales) Urban city and town,E10000016,593286.0,173082.0,Swale 004,Swale 004B,,,,,Good,South-East England and South London,,10093084941.0,,Not applicable,Not applicable,,,E02005118,E01024598,168.0, +143606,886,Kent,2235,Minster in Sheppey Primary School,Academy converter,Academies,Open,Academy Converter,01-11-2016,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,600.0,No Special Classes,19-01-2023,579.0,285.0,294.0,25.9,Supported by a multi-academy trust,THE ISLAND LEARNING TRUST,Linked to a sponsor,The Island Learning Trust,Not applicable,,10061767.0,,Not applicable,10-03-2022,25-04-2024,Brecon Chase,Minster,,Sheerness,Kent,ME12 2HX,http://www.minster-sheppey.kent.sch.uk,1795872138.0,Mrs,Michelle Jeffery co-head,Lynne Lewis co-head,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Minster Cliffs,Sittingbourne and Sheppey,(England/Wales) Urban city and town,E10000016,595361.0,173030.0,Swale 003,Swale 003D,,,,,Good,South-East England and South London,,200002530145.0,,Not applicable,Not applicable,,,E02005117,E01024589,150.0, +143787,886,Kent,2290,Tenterden Infant School,Academy converter,Academies,Open,Academy Converter,01-12-2016,,,Primary,5.0,7,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,211.0,No Special Classes,19-01-2023,151.0,78.0,73.0,21.2,Supported by a multi-academy trust,TENTERDEN SCHOOLS TRUST,-,,Not applicable,,10061964.0,,Not applicable,05-02-2019,13-05-2024,Recreation Ground Road,,,Tenterden,Kent,TN30 6RA,www.tenterdenprimaryfederation.kent.sch.uk/,1580762086.0,Mrs,Tina,McIntosh,Executive Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Ashford,Tenterden South,Ashford,(England/Wales) Rural town and fringe,E10000016,588615.0,133196.0,Ashford 013,Ashford 013F,,,,,Good,South-East England and South London,,100062567470.0,,Not applicable,Not applicable,,,E02005008,E01024025,32.0, +143788,886,Kent,3143,St Michael's Church of England Primary School,Academy converter,Academies,Open,Academy Converter,01-12-2016,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,210.0,No Special Classes,19-01-2023,160.0,93.0,67.0,25.6,Supported by a multi-academy trust,TENTERDEN SCHOOLS TRUST,-,,Not applicable,,10061960.0,,Not applicable,12-12-2018,13-05-2024,Ashford Road,St Michael's,,Tenterden,Kent,TN30 6PU,www.stmcep.school,1580763210.0,Mrs,"Sara Williamson,",Mrs Jo Paskhin,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Ashford,Tenterden St Michael's,Ashford,(England/Wales) Rural town and fringe,E10000016,588469.0,135486.0,Ashford 013,Ashford 013C,,,,,Good,South-East England and South London,,100062567391.0,,Not applicable,Not applicable,,,E02005008,E01024011,41.0, +143789,886,Kent,3144,Tenterden Church of England Junior School,Academy converter,Academies,Open,Academy Converter,01-12-2016,,,Primary,7.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Diocese of Canterbury,Not applicable,240.0,No Special Classes,19-01-2023,194.0,91.0,103.0,28.9,Supported by a multi-academy trust,TENTERDEN SCHOOLS TRUST,-,,Not applicable,,10061969.0,,Not applicable,11-12-2018,13-05-2024,Recreation Ground Road,,,Tenterden,Kent,TN30 6RA,www.tenterdenprimaryfederation.kent.sch.uk/,1580763717.0,Mrs,Tina,McIntosh,Executive Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Ashford,Tenterden South,Ashford,(England/Wales) Rural town and fringe,E10000016,588577.0,133233.0,Ashford 013,Ashford 013F,,,,,Good,South-East England and South London,,200004397348.0,,Not applicable,Not applicable,,,E02005008,E01024025,56.0, +143954,886,Kent,4015,The Lenham School,Academy sponsor led,Academies,Open,New Provision,01-03-2017,,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Mixed,Does not apply,,Not applicable,Non-selective,1012.0,Not applicable,19-01-2023,779.0,392.0,387.0,23.0,Supported by a multi-academy trust,VALLEY INVICTA ACADEMIES TRUST,Linked to a sponsor,Valley Invicta Academies Trust,Not applicable,,10062504.0,,,06-11-2019,07-05-2024,Ham Lane,Lenham,,Maidstone,Kent,ME17 2LL,www.thelenham.viat.org.uk,1622858267.0,Mr,Robbie,Ferguson,Head of School,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Harrietsham and Lenham,Faversham and Mid Kent,(England/Wales) Rural town and fringe,E10000016,589367.0,152380.0,Maidstone 011,Maidstone 011B,,,,,Good,South-East England and South London,,200003719333.0,,Not applicable,Not applicable,,,E02005078,E01024362,172.0, +143987,886,Kent,3324,"Leybourne, St Peter and St Paul Church of England Primary Academy",Academy converter,Academies,Open,Academy Converter,01-03-2017,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,216.0,No Special Classes,19-01-2023,216.0,103.0,113.0,6.5,Supported by a multi-academy trust,THE TENAX SCHOOLS TRUST,Linked to a sponsor,The Tenax Schools Trust,Not applicable,,10062539.0,,Not applicable,03-11-2021,09-05-2024,Rectory Lane North,Leybourne,,West Malling,Kent,ME19 5HD,http://www.leybourne.school,1732842008.0,,Tina,Holditch,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Tonbridge and Malling,"Birling, Leybourne & Ryarsh",Tonbridge and Malling,(England/Wales) Urban city and town,E10000016,569081.0,158746.0,Tonbridge and Malling 003,Tonbridge and Malling 003G,,,,,Good,South-East England and South London,,10002908134.0,,Not applicable,Not applicable,,,E02005151,E01024782,14.0, +144005,886,Kent,2658,Westcourt Primary School,Academy converter,Academies,Open,Academy Converter,01-02-2017,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,240.0,No Special Classes,19-01-2023,358.0,177.0,181.0,43.2,Supported by a multi-academy trust,THE PRIMARY FIRST TRUST,Linked to a sponsor,The Primary First Trust,Not applicable,,10062555.0,,Not applicable,27-11-2019,07-03-2024,Silver Road,,,Gravesend,Kent,DA12 4JG,www.westcourt.kent.sch.uk/,1474566411.0,Miss,Mags,Sexton,Acting Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Gravesham,Westcourt,Gravesham,(England/Wales) Urban major conurbation,E10000016,566426.0,172839.0,Gravesham 007,Gravesham 007C,,,,,Good,South-East England and South London,,100062312611.0,,Not applicable,Not applicable,,,E02005061,E01024311,145.0, +144015,886,Kent,4016,The Charles Dickens School,Academy sponsor led,Academies,Open,New Provision,01-03-2017,,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Mixed,None,,Not applicable,Not applicable,1104.0,Not applicable,19-01-2023,1111.0,540.0,571.0,36.0,Supported by a multi-academy trust,BARTON COURT ACADEMY TRUST,Linked to a sponsor,Barton Court Academy Trust,Not applicable,,10062895.0,,,29-03-2023,23-04-2024,Broadstairs Road,,,Broadstairs,Kent,CT10 2RL,www.cds.kent.sch.uk,1843862988.0,Mr,Warren,Smith,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,VI - Visual Impairment,,,,,,,,,,,,,Resourced provision,3.0,5.0,,,South East,Thanet,St Peters,South Thanet,(England/Wales) Urban city and town,E10000016,638334.0,167981.0,Thanet 011,Thanet 011D,,,,,Good,South-East England and South London,,200003079311.0,,Not applicable,Not applicable,,,E02005142,E01024690,400.0, +144098,886,Kent,3021,Stone St Mary's CofE Primary School,Academy converter,Academies,Open,Academy Converter,01-04-2017,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,630.0,No Special Classes,19-01-2023,645.0,327.0,318.0,18.8,Supported by a multi-academy trust,ALETHEIA ACADEMIES TRUST,Linked to a sponsor,Aletheia Academies Trust,Not applicable,,10063054.0,,Not applicable,05-02-2020,14-09-2023,Hayes Road,Horns Cross,,Greenhithe,Kent,DA9 9EF,http://www.stone.kent.sch.uk,1322382292.0,Mrs,Jane,Rolfe,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dartford,Stone Castle,Dartford,(England/Wales) Urban major conurbation,E10000016,557252.0,173910.0,Dartford 006,Dartford 006C,,,,,Good,South-East England and South London,,200000536262.0,,Not applicable,Not applicable,,,E02005033,E01024171,121.0, +144099,886,Kent,5215,Horton Kirby Church of England Primary School,Academy converter,Academies,Open,Academy Converter,01-04-2017,,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,240.0,No Special Classes,19-01-2023,236.0,114.0,122.0,20.8,Supported by a multi-academy trust,ALETHEIA ACADEMIES TRUST,Linked to a sponsor,Aletheia Academies Trust,Not applicable,,10063053.0,,Not applicable,17-05-2023,23-04-2024,Horton Road,Horton Kirby,,Dartford,Kent,DA4 9BN,www.hortonkirby.kent.sch.uk,1322863278.0,Mr,Glenn,Pollard,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,"Farningham, Horton Kirby and South Darenth",Sevenoaks,(England/Wales) Rural town and fringe,E10000016,556340.0,168608.0,Sevenoaks 005,Sevenoaks 005B,,,,,Good,South-East England and South London,,100062317327.0,,Not applicable,Not applicable,,,E02005091,E01024432,49.0, +144100,886,Kent,5411,Dartford Grammar School for Girls,Academy converter,Academies,Open,Academy Converter,01-06-2017,,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Girls,None,Does not apply,Not applicable,Selective,1119.0,No Special Classes,19-01-2023,1248.0,41.0,1207.0,18.0,Supported by a multi-academy trust,THE ARETÉ TRUST,-,,Not applicable,,10063935.0,,Not applicable,20-10-2021,04-06-2024,Shepherds Lane,,,Dartford,Kent,DA1 2NT,http://www.dartfordgrammargirls.org.uk,1322223123.0,Mrs,Sharon,Pritchard,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dartford,West Hill,Dartford,(England/Wales) Urban major conurbation,E10000016,553265.0,173905.0,Dartford 003,Dartford 003F,,,,,Outstanding,South-East England and South London,,200000532843.0,,Not applicable,Not applicable,,,E02005030,E01024185,160.0, +144354,886,Kent,4091,The Whitstable School,Academy converter,Academies,Open,Academy Converter,01-09-2018,,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Mixed,Does not apply,,Not applicable,Non-selective,1220.0,Not applicable,19-01-2023,1080.0,514.0,566.0,19.9,Supported by a multi-academy trust,SWALE ACADEMIES TRUST,Linked to a sponsor,Swale Academies Trust,Not applicable,,10068468.0,,,13-03-2024,22-05-2024,Bellevue Road,,,Whitstable,Kent,CT5 1PX,www.thewhitstableschool.org.uk,1227931300.0,Mr,Alex,Holmes,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Canterbury,Gorrell,Canterbury,(England/Wales) Urban city and town,E10000016,611643.0,165739.0,Canterbury 009,Canterbury 009A,,,,,Good,South-East England and South London,,100062300161.0,,Not applicable,Not applicable,,,E02005018,E01024062,197.0, +144420,886,Kent,3716,St Teresa's Catholic Primary School,Academy converter,Academies,Open,Academy Converter,01-05-2017,,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Roman Catholic,Does not apply,Archdiocese of Southwark,Not applicable,218.0,No Special Classes,19-01-2023,213.0,100.0,113.0,14.6,Supported by a multi-academy trust,KENT CATHOLIC SCHOOLS' PARTNERSHIP,Linked to a sponsor,Kent Catholic Schools' Partnership,Not applicable,,10063828.0,,Not applicable,16-01-2020,20-05-2024,Quantock Drive,,,Ashford,Kent,TN24 8QN,www.st-teresas.kent.sch.uk/,1233622797.0,Mrs,H,Bennett,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Ashford,Furley,Ashford,(England/Wales) Urban city and town,E10000016,600520.0,143538.0,Ashford 015,Ashford 015D,,,,,Good,South-East England and South London,,100062560866.0,,Not applicable,Not applicable,,,E02007046,E01024022,31.0, +144531,886,Kent,2172,Valley Invicta Primary School At East Borough,Academy converter,Academies,Open,Academy Converter,01-11-2017,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,455.0,No Special Classes,19-01-2023,471.0,250.0,221.0,20.4,Supported by a multi-academy trust,VALLEY INVICTA ACADEMIES TRUST,Linked to a sponsor,Valley Invicta Academies Trust,Not applicable,,10065310.0,,Not applicable,14-10-2021,04-06-2024,Vinters Road,,,Maidstone,Kent,ME14 5DX,www.eastborough.viat.org.uk,1622754633.0,Mrs,C,Bacon,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,ASD - Autistic Spectrum Disorder,,,,,,,,,,,,,Resourced provision,9.0,10.0,,,South East,Maidstone,East,Maidstone and The Weald,(England/Wales) Urban city and town,E10000016,576832.0,155960.0,Maidstone 005,Maidstone 005E,,,,,Good,South-East England and South London,,200003689415.0,,Not applicable,Not applicable,,,E02005072,E01024351,96.0, +144615,886,Kent,2085,Royal Rise Primary School,Academy sponsor led,Academies,Open,New Provision,01-07-2017,,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,,Not applicable,Not applicable,210.0,Not applicable,19-01-2023,203.0,94.0,109.0,34.5,Supported by a multi-academy trust,CYGNUS ACADEMIES TRUST,Linked to a sponsor,Cygnus Academies Trust,Not applicable,,10064021.0,,,15-09-2021,29-04-2024,Royal Rise,,,Tonbridge,Kent,TN9 2DQ,,1732354143.0,Mrs,Sarah,Griggs,Head of School,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,Vauxhall,Tonbridge and Malling,(England/Wales) Urban city and town,E10000016,559446.0,145748.0,Tonbridge and Malling 012,Tonbridge and Malling 012H,,,,,Good,South-East England and South London,,200000966929.0,,Not applicable,Not applicable,,,E02005160,E01035009,70.0, +144634,886,Kent,2086,Bishop Chavasse Primary School,Free schools,Free Schools,Open,,01-09-2017,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Church of England,,Non-selective,420.0,Not applicable,19-01-2023,311.0,162.0,149.0,22.8,Supported by a multi-academy trust,THE TENAX SCHOOLS TRUST,Linked to a sponsor,The Tenax Schools Trust,Not applicable,,10064781.0,,,06-07-2022,03-04-2024,2a Baker Lane,,,Tonbridge,Kent,TN11 0FB,www.bishopchavasseschool.org.uk,1732676040.0,Mrs,Becks,Hood,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Tonbridge and Malling,Vauxhall,Tonbridge and Malling,(England/Wales) Urban city and town,E10000016,560184.0,145430.0,Tonbridge and Malling 012,Tonbridge and Malling 012E,,,,,Good,South-East England and South London,United Kingdom,10092972630.0,,Not applicable,Not applicable,,,E02005160,E01024767,71.0, +144668,886,Kent,2676,West Hill Primary Academy,Academy converter,Academies,Open,Academy Converter,01-09-2017,,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,507.0,No Special Classes,19-01-2023,534.0,271.0,263.0,12.5,Supported by a multi-academy trust,THE GOLDEN THREAD ALLIANCE,-,,Not applicable,,10064807.0,,Not applicable,01-10-2021,03-06-2024,Dartford Road,,,Dartford,Kent,DA1 3DZ,www.west-hill.kent.sch.uk/,1322226019.0,Ms,Katy,Ward,Executive Head Teacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dartford,West Hill,Dartford,(England/Wales) Urban major conurbation,E10000016,553136.0,174316.0,Dartford 003,Dartford 003D,,,,,Good,South-East England and South London,,100062309268.0,,Not applicable,Not applicable,,,E02005030,E01024183,67.0, +144716,886,Kent,4019,School of Science and Technology Maidstone,Free schools,Free Schools,Open,New Provision,01-09-2020,,,Secondary,11.0,19,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,None,,,1200.0,Not applicable,19-01-2023,576.0,385.0,191.0,9.9,Supported by a multi-academy trust,VALLEY INVICTA ACADEMIES TRUST,Linked to a sponsor,Valley Invicta Academies Trust,Not applicable,,10086463.0,,,25-01-2023,20-12-2023,New Cut Road,,,Maidstone,Kent,ME14 5GQ,,1622938444.0,Mr,Ryan,Royston (Head of School),,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Boxley,Faversham and Mid Kent,(England/Wales) Urban city and town,E10000016,577636.0,155754.0,Maidstone 005,Maidstone 005B,,,,,Outstanding,South-East England and South London,United Kingdom,10094441687.0,,Not applicable,Not applicable,,,E02005072,E01024336,57.0, +144835,886,Kent,3343,Charing Church of England Primary School,Academy converter,Academies,Open,Academy Converter,01-07-2017,,,Primary,2.0,11,Not applicable,Has Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,140.0,No Special Classes,19-01-2023,165.0,87.0,78.0,35.1,Supported by a multi-academy trust,THE DIOCESE OF CANTERBURY ACADEMIES TRUST,Linked to a sponsor,"Aquila, The Diocese of Canterbury Academies Trust",Not applicable,,10064466.0,,Not applicable,20-10-2021,19-02-2024,School Road,Charing,,Ashford,Kent,TN27 0JN,www.charingschool.org.uk/,1233712277.0,Mr,Thomas,Bird,Head Teacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Ashford,Charing,Ashford,(England/Wales) Rural town and fringe,E10000016,595188.0,149495.0,Ashford 002,Ashford 002B,,,,,Good,South-East England and South London,,100062563576.0,,Not applicable,Not applicable,,,E02004997,E01023986,52.0, +144836,886,Kent,3754,St Augustine's Catholic Primary School,Academy converter,Academies,Open,Academy Converter,01-07-2017,,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Roman Catholic,Does not apply,Archdiocese of Southwark,Not applicable,285.0,No Special Classes,19-01-2023,287.0,154.0,133.0,17.1,Supported by a multi-academy trust,KENT CATHOLIC SCHOOLS' PARTNERSHIP,Linked to a sponsor,Kent Catholic Schools' Partnership,Not applicable,,10064464.0,,Not applicable,15-09-2021,03-06-2024,Wilman Road,,,Tunbridge Wells,Kent,TN4 9AL,https://www.st-augustines.kent.sch.uk/,1892529796.0,Mr,Jon,Crozier,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,St John's,Tunbridge Wells,(England/Wales) Urban city and town,E10000016,558501.0,141283.0,Tunbridge Wells 002,Tunbridge Wells 002A,,,,,Good,South-East England and South London,,100062586226.0,,Not applicable,Not applicable,,,E02005163,E01024837,49.0, +144867,886,Kent,3329,Borden Church of England Primary School,Academy converter,Academies,Open,Academy Converter,01-08-2017,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,126.0,No Special Classes,19-01-2023,123.0,64.0,59.0,14.6,Supported by a multi-academy trust,OUR COMMUNITY MULTI ACADEMY TRUST,-,,Not applicable,,10064657.0,,Not applicable,29-06-2022,28-05-2024,School Lane,Borden,,Sittingbourne,Kent,ME9 8JS,www.borden.kent.sch.uk,1795472593.0,Miss,Georgina,Ingram,Head of School,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Borden and Grove Park,Sittingbourne and Sheppey,(England/Wales) Rural village,E10000016,587791.0,163390.0,Swale 009,Swale 009A,,,,,Requires improvement,South-East England and South London,,100062626970.0,,Not applicable,Not applicable,,,E02005123,E01024554,18.0, +144868,886,Kent,3330,Bredgar Church of England Primary School,Academy converter,Academies,Open,Academy Converter,01-08-2017,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,106.0,No Special Classes,19-01-2023,108.0,52.0,56.0,10.2,Supported by a multi-academy trust,OUR COMMUNITY MULTI ACADEMY TRUST,-,,Not applicable,,10064679.0,,Not applicable,12-01-2022,28-05-2024,Bexon Lane,Bredgar,,Sittingbourne,Kent,ME9 8HB,www.bredgar.kent.sch.uk/,1622884359.0,Miss,Joanna,Heath,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,West Downs,Sittingbourne and Sheppey,(England/Wales) Rural village,E10000016,588053.0,160269.0,Swale 013,Swale 013C,,,,,Good,South-East England and South London,,100062626605.0,,Not applicable,Not applicable,,,E02005127,E01024628,11.0, +144869,886,Kent,2463,Minterne Junior School,Academy converter,Academies,Open,Academy Converter,01-08-2017,,,Primary,7.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,360.0,Has Special Classes,19-01-2023,374.0,182.0,192.0,16.0,Supported by a multi-academy trust,OUR COMMUNITY MULTI ACADEMY TRUST,-,,Not applicable,,10064678.0,,Not applicable,06-10-2021,23-04-2024,Minterne Avenue,,,Sittingbourne,Kent,ME10 1SB,http://www.minterne.org,1795472323.0,Ms,Kirsty,Warner,Head of School,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,"SLCN - Speech, language and Communication",,,,,,,,,,,,,Resourced provision,,,,,South East,Swale,Homewood,Sittingbourne and Sheppey,(England/Wales) Urban city and town,E10000016,589818.0,162822.0,Swale 012,Swale 012D,,,,,Good,South-East England and South London,,200002527646.0,,Not applicable,Not applicable,,,E02005126,E01024630,60.0, +144870,886,Kent,2513,The Oaks Infant School,Academy converter,Academies,Open,Academy Converter,01-08-2017,,,Primary,3.0,7,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,270.0,Has Special Classes,19-01-2023,324.0,165.0,159.0,16.8,Supported by a multi-academy trust,OUR COMMUNITY MULTI ACADEMY TRUST,-,,Not applicable,,10064677.0,,Not applicable,24-11-2021,23-04-2024,Gore Court Road,,,Sittingbourne,Kent,ME10 1GL,http://www.theoaksinfantschool.co.uk,1795423619.0,Mrs,Jenny,Wynn,Head of School,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,"SLCN - Speech, language and Communication",,,,,,,,,,,,,Resourced provision,4.0,12.0,,,South East,Swale,Woodstock,Sittingbourne and Sheppey,(England/Wales) Urban city and town,E10000016,589925.0,162789.0,Swale 012,Swale 012D,,,,,Good,South-East England and South London,,200002532277.0,,Not applicable,Not applicable,,,E02005126,E01024630,47.0, +144910,886,Kent,5204,Sutton-At-Hone Church of England Primary School,Academy converter,Academies,Open,Academy Converter,01-10-2017,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,420.0,No Special Classes,19-01-2023,400.0,198.0,202.0,18.0,Supported by a multi-academy trust,ALETHEIA ACADEMIES TRUST,Linked to a sponsor,Aletheia Academies Trust,Not applicable,,10065030.0,,Not applicable,04-03-2020,26-03-2024,Church Road,Sutton-At-Hone,,Dartford,Kent,DA4 9EX,www.sutton-at-hone.kent.sch.uk/,1322862147.0,Mrs,Karen,Trowell,Acting Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dartford,"Wilmington, Sutton-at-Hone & Hawley",Dartford,(England/Wales) Rural town and fringe,E10000016,555501.0,170379.0,Dartford 012,Dartford 012D,,,,,Good,South-East England and South London,,200000535148.0,,Not applicable,Not applicable,,,E02005039,E01024174,72.0, +145012,886,Kent,2087,Morehall Primary School and Nursery,Academy sponsor led,Academies,Open,Fresh Start,01-01-2017,,,Primary,2.0,11,,Has Nursery Classes,Not applicable,Mixed,None,None,,,210.0,Not applicable,19-01-2023,228.0,113.0,115.0,26.0,Supported by a multi-academy trust,TURNER SCHOOLS,Linked to a sponsor,Turner Schools,Not applicable,,10064517.0,,,02-10-2019,15-04-2024,Morehall Primary School and Nursery,Chart Road,,Folkestone,Kent,CT19 4PN,www.turnermorehall.org,1303275128.0,Mrs,Am'e,Moris,Head of School,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,VI - Visual Impairment,,,,,,,,,,,,,Resourced provision,2.0,3.0,,,South East,Folkestone and Hythe,Cheriton,Folkestone and Hythe,(England/Wales) Urban city and town,E10000016,620753.0,136837.0,Folkestone and Hythe 006,Folkestone and Hythe 006C,,,,,Good,South-East England and South London,,50027301.0,,Not applicable,Not applicable,,,E02005107,E01024513,57.0, +145013,886,Kent,2090,Richmond Primary School,Academy sponsor led,Academies,Open,Fresh Start,01-01-2017,,,Primary,2.0,11,,Has Nursery Classes,Not applicable,Mixed,None,None,,,420.0,Not applicable,19-01-2023,325.0,156.0,169.0,64.2,Supported by a multi-academy trust,THE STOUR ACADEMY TRUST,Linked to a sponsor,The Stour Academy Trust,Not applicable,,10064518.0,,,09-11-2022,07-06-2024,Unity Street,,,Sheerness,Kent,ME12 2ET,,1795662891.0,,Lesley,Conway,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Sheerness,Sittingbourne and Sheppey,(England/Wales) Urban city and town,E10000016,592928.0,174502.0,Swale 001,Swale 001D,,,,,Good,South-East England and South London,,100062378139.0,,Not applicable,Not applicable,,,E02005115,E01024612,188.0, +145014,886,Kent,2092,Knockhall Primary School,Academy sponsor led,Academies,Open,Fresh Start,01-01-2017,,,Primary,3.0,11,Not applicable,Has Nursery Classes,Not applicable,Mixed,None,None,,Not applicable,682.0,Not applicable,19-01-2023,385.0,215.0,170.0,33.7,Supported by a multi-academy trust,THE WOODLAND ACADEMY TRUST,Linked to a sponsor,The Woodland Academy Trust,Not applicable,,10064519.0,,,21-06-2023,10-05-2024,Eynsford Road,,,Greenhithe,Kent,DA9 9RF,www.knockhallprimaryschool.co.uk,1322382053.0,Miss,Kathryn,Yiannadji,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dartford,Greenhithe & Knockhall,Dartford,(England/Wales) Urban major conurbation,E10000016,559140.0,174692.0,Dartford 004,Dartford 004F,,,,,Requires improvement,South-East England and South London,,200000537409.0,,Not applicable,Not applicable,,,E02005031,E01035283,126.0, +145081,886,Kent,3059,"St Mark's Church of England Primary School, Eccles",Academy converter,Academies,Open,Academy Converter,01-11-2017,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,140.0,No Special Classes,19-01-2023,128.0,61.0,67.0,15.6,Supported by a multi-academy trust,THE PILGRIM MULTI ACADEMY TRUST,-,,Not applicable,,10065389.0,,Not applicable,22-03-2022,17-04-2024,Eccles Row,Eccles,,Aylesford,Kent,ME20 7HS,www.st-marks-aylesford.kent.sch.uk,1622717337.0,Mr,Jonathan,Bassett,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,Aylesford North & North Downs,Chatham and Aylesford,(England/Wales) Rural town and fringe,E10000016,572898.0,160831.0,Tonbridge and Malling 001,Tonbridge and Malling 001F,,,,,Good,South-East England and South London,,200000961684.0,,Not applicable,Not applicable,,,E02005149,E01024728,20.0, +145115,886,Kent,2093,Chilmington Green Primary School,Free schools,Free Schools,Open,,03-09-2018,,,Primary,2.0,11,,Has Nursery Classes,Not applicable,Mixed,None,None,,,460.0,Not applicable,19-01-2023,205.0,110.0,95.0,21.5,Supported by a multi-academy trust,THE STOUR ACADEMY TRUST,Linked to a sponsor,The Stour Academy Trust,Not applicable,,10068096.0,,,07-12-2022,29-05-2024,Mock Lane,,,Ashford,Kent,TN23 3DS,www.chilmingtongreen.kent.sch.uk,1233228241.0,Miss,Tamsin,Mobbs,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,Not Applicable,,,,,,,,,,,,,Resourced provision,,15.0,,,South East,Ashford,Weald Central,Ashford,(England/Wales) Rural hamlet and isolated dwellings,E10000016,600157.0,141878.0,Ashford 012,Ashford 012F,,,,,Good,South-East England and South London,United Kingdom,10012877144.0,,Not applicable,Not applicable,,,E02005007,E01032814,42.0, +145117,886,Kent,2096,Riverview Junior School,Academy sponsor led,Academies,Open,New Provision,01-10-2017,,,Primary,7.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,,Not applicable,Not applicable,480.0,Not applicable,19-01-2023,504.0,257.0,247.0,24.6,Supported by a multi-academy trust,THE GOLDEN THREAD ALLIANCE,-,,Not applicable,,10065188.0,,,09-02-2022,22-05-2024,Cimba Wood,,,Gravesend,Kent,DA12 4SD,https://www.riverview-junior.co.uk/,1474352620.0,Mr,Aaron,Jones,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,SpLD - Specific Learning Difficulty,"SLCN - Speech, language and Communication",ASD - Autistic Spectrum Disorder,"SEMH - Social, Emotional and Mental Health",MLD - Moderate Learning Difficulty,,,,,,,,,Resourced provision,,,,,South East,Gravesham,Riverview Park,Gravesham,(England/Wales) Urban major conurbation,E10000016,566276.0,171553.0,Gravesham 008,Gravesham 008B,,,,,Good,South-East England and South London,,10012012179.0,,Not applicable,Not applicable,,,E02005062,E01024298,124.0, +145355,886,Kent,2531,Vale View Community School,Academy converter,Academies,Open,Academy Converter,01-01-2018,,,Primary,2.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,229.0,112.0,117.0,50.7,Supported by a multi-academy trust,WHINLESS DOWN ACADEMY TRUST,-,,Not applicable,,10066413.0,,Not applicable,27-04-2022,27-03-2024,Vale View Road,Elms Vale,,Dover,Kent,CT17 9NP,www.vale-view.kent.sch.uk,1304202821.0,Mrs,Lisa,Sprigmore,Acting Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,Town & Castle,Dover,(England/Wales) Urban city and town,E10000016,630652.0,141278.0,Dover 013,Dover 013C,,,,,Good,South-East England and South London,,100062290539.0,,Not applicable,Not applicable,,,E02005053,E01024216,116.0, +145420,886,Kent,4020,Folkestone Academy,Academy sponsor led,Academies,Open,Fresh Start,01-12-2017,,,Secondary,11.0,19,No boarders,Not applicable,Has a sixth form,Mixed,None,None,,Non-selective,2170.0,Not applicable,19-01-2023,1080.0,538.0,542.0,45.8,Supported by a multi-academy trust,TURNER SCHOOLS,Linked to a sponsor,Turner Schools,Not applicable,,10066337.0,,,21-04-2022,14-05-2024,Academy Lane,,,Folkestone,Kent,CT19 5FP,www.folkestoneacademy.com,1303842400.0,Mr,Steven,Shaw,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Folkestone and Hythe,Broadmead,Folkestone and Hythe,(England/Wales) Urban city and town,E10000016,621910.0,137354.0,Folkestone and Hythe 006,Folkestone and Hythe 006F,,,,,Good,South-East England and South London,United Kingdom,50120541.0,,Not applicable,Not applicable,,,E02005107,E01024516,426.0, +145815,886,Kent,2666,Wrotham Road Primary School,Academy converter,Academies,Open,Academy Converter,01-06-2018,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,No Special Classes,19-01-2023,446.0,235.0,211.0,29.5,Supported by a multi-academy trust,THE GOLDEN THREAD ALLIANCE,-,,Not applicable,,10067738.0,,Not applicable,06-10-2022,18-04-2024,Wrotham Road,,,Gravesend,Kent,DA11 0QF,http://www.wrotham-road.kent.sch.uk,1474534540.0,Ms,Nicole,Galinis,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Gravesham,Pelham,Gravesham,(England/Wales) Urban major conurbation,E10000016,564628.0,173560.0,Gravesham 002,Gravesham 002D,,,,,Good,South-East England and South London,,100062310321.0,,Not applicable,Not applicable,,,E02005056,E01024291,121.0, +145923,886,Kent,4021,Turner Free School,Free schools,Free Schools,Open,,01-09-2018,,,Secondary,11.0,18,,Not applicable,Has a sixth form,Mixed,None,None,,Non-selective,1260.0,No Special Classes,19-01-2023,826.0,430.0,396.0,35.6,Supported by a multi-academy trust,TURNER SCHOOLS,Linked to a sponsor,Turner Schools,Not applicable,,10068105.0,,,07-12-2022,21-05-2024,Tile Kiln Lane,Cheriton,,Folkestone,,CT19 4PB,www.turnerfreeschool.org,1303842400.0,Ms,Jennifer,van Deelen,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Folkestone and Hythe,Cheriton,Folkestone and Hythe,(England/Wales) Urban city and town,X999999,620593.0,137066.0,Folkestone and Hythe 006,Folkestone and Hythe 006C,,,,,Good,South-East England and South London,,50114755.0,,Not applicable,Not applicable,,,E02005107,E01024513,294.0, +145951,886,Kent,2098,Pilgrims' Way Primary School,Academy sponsor led,Academies,Open,Fresh Start,01-05-2018,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,None,None,,,420.0,Not applicable,19-01-2023,348.0,184.0,164.0,52.9,Supported by a multi-academy trust,VERITAS MULTI ACADEMY TRUST,Linked to a sponsor,Veritas Multi Academy Trust,Not applicable,,10067579.0,,,22-09-2022,14-05-2024,Pilgrims Way,,,Canterbury,,CT1 1XU,https://www.pilgrims-way.kent.sch.uk,1227760084.0,Mrs,Emma,Campbell,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Canterbury,Barton,Canterbury,(England/Wales) Urban city and town,E10000016,616215.0,157035.0,Canterbury 016,Canterbury 016B,,,,,Good,South-East England and South London,United Kingdom,200000683218.0,,Not applicable,Not applicable,,,E02005025,E01024045,171.0, +146081,886,Kent,2099,Edenbridge Primary School,Academy sponsor led,Academies,Open,New Provision,01-07-2018,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,450.0,No Special Classes,19-01-2023,407.0,206.0,201.0,38.2,Supported by a multi-academy trust,THE PIONEER ACADEMY,Linked to a sponsor,The Pioneer Academy,Not applicable,,10068058.0,,,12-10-2022,23-04-2024,High Street,,,Edenbridge,Kent,TN8 5AB,https://edenbridge.kent.sch.uk/kent/primary/edenbridge,1732863787.0,,Mary,Gates,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Edenbridge North and East,Tonbridge and Malling,(England/Wales) Rural town and fringe,E10000016,544347.0,146395.0,Sevenoaks 014,Sevenoaks 014A,,,,,Good,South-East England and South London,United Kingdom,100061001421.0,,Not applicable,Not applicable,,,E02005100,E01024425,153.0, +146114,886,Kent,2677,Coxheath Primary School,Academy converter,Academies,Open,Academy Converter,01-09-2018,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,No Special Classes,19-01-2023,434.0,212.0,222.0,21.7,Supported by a multi-academy trust,COPPICE PRIMARY PARTNERSHIP,Linked to a sponsor,The Coppice Primary Partnership,Not applicable,,10068466.0,,Not applicable,08-02-2023,14-09-2023,Stockett Lane,Coxheath,,Maidstone,Kent,ME17 4PS,www.coxheath.kent.sch.uk/,1622745553.0,Mr,Giacomo,Mazza,Head of School,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Coxheath and Hunton,Maidstone and The Weald,(England/Wales) Rural town and fringe,E10000016,574377.0,151268.0,Maidstone 016,Maidstone 016A,,,,,Good,South-East England and South London,,200003715377.0,,Not applicable,Not applicable,,,E02005083,E01024342,94.0, +146143,886,Kent,2044,Loose Primary School,Academy converter,Academies,Open,Academy Converter,01-09-2018,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,,Not applicable,630.0,Not applicable,19-01-2023,656.0,343.0,313.0,8.1,Supported by a multi-academy trust,COPPICE PRIMARY PARTNERSHIP,Linked to a sponsor,The Coppice Primary Partnership,Not applicable,,10068467.0,,Not applicable,28-06-2023,07-05-2024,Loose Road,,,Maidstone,Kent,ME15 9UW,www.loose-primary.kent.sch.uk/,1622743549.0,Mr,Trevor,North,Headteacher,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Loose,Maidstone and The Weald,(England/Wales) Urban city and town,E10000016,576115.0,152490.0,Maidstone 016,Maidstone 016D,,,,,Good,South-East England and South London,,200003676025.0,,Not applicable,Not applicable,,,E02005083,E01024376,53.0, +146376,886,Kent,2107,Rosherville Church of England Academy,Academy sponsor led,Academies,Open,Fresh Start,01-09-2018,,,Primary,4.0,11,,No Nursery Classes,Not applicable,Mixed,Church of England,None,,,140.0,Not applicable,19-01-2023,141.0,76.0,65.0,41.8,Supported by a multi-academy trust,ALETHEIA ACADEMIES TRUST,Linked to a sponsor,Aletheia Academies Trust,Not applicable,,10081064.0,,,28-09-2022,26-04-2024,London Road,,,Northfleet,Kent,DA11 9JQ,www.rosherville.co.uk,1474365266.0,Mr,Marc,Dockrell,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Gravesham,Northfleet & Springhead,Gravesham,(England/Wales) Urban major conurbation,E10000016,562934.0,174025.0,Gravesham 001,Gravesham 001B,,,,,Good,South-East England and South London,United Kingdom,100062064703.0,,Not applicable,Not applicable,,,E02005055,E01024277,59.0, +146400,886,Kent,3313,Fordcombe Church of England Primary School,Academy converter,Academies,Open,Academy Converter,01-10-2018,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,105.0,No Special Classes,19-01-2023,70.0,38.0,32.0,27.1,Supported by a multi-academy trust,THE TENAX SCHOOLS TRUST,Linked to a sponsor,The Tenax Schools Trust,Not applicable,,10081146.0,,Not applicable,18-10-2022,21-05-2024,The Green,Fordcombe,,Tunbridge Wells,Kent,TN3 0RY,http://www.fordcombe.kent.sch.uk,1892740224.0,Mr,Chris,Blackburn,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,"Penshurst, Fordcombe and Chiddingstone",Tonbridge and Malling,(England/Wales) Rural village,E10000016,552622.0,140271.0,Sevenoaks 015,Sevenoaks 015D,,,,,Good,South-East England and South London,,10035185120.0,,Not applicable,Not applicable,,,E02005101,E01024456,19.0, +146574,886,Kent,2062,Greenlands Primary School,Academy converter,Academies,Open,Academy Converter,01-02-2019,,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,187.0,94.0,93.0,42.8,Supported by a multi-academy trust,CYGNUS ACADEMIES TRUST,Linked to a sponsor,Cygnus Academies Trust,Not applicable,,10082225.0,,Not applicable,18-05-2023,06-06-2024,Green Street Green Road,Darenth,,Dartford,Kent,DA2 8DH,www.greenlandsprimary.org.uk,1474703178.0,Mrs,Alison,Cook,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dartford,Darenth,Dartford,(England/Wales) Rural village,E10000016,557498.0,170938.0,Dartford 012,Dartford 012C,,,,,Requires improvement,South-East England and South London,,200000533883.0,,Not applicable,Not applicable,,,E02005039,E01024135,80.0, +146624,886,Kent,4023,Goodwin Academy,Academy sponsor led,Academies,Open,Fresh Start,01-09-2018,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Mixed,None,None,,Non-selective,1150.0,Not applicable,19-01-2023,900.0,435.0,465.0,32.5,Supported by a multi-academy trust,THE THINKING SCHOOLS ACADEMY TRUST,Linked to a sponsor,The Thinking Schools Academy Trust,Not applicable,,10081522.0,,,19-10-2022,03-06-2024,Hamilton Road,,,Deal,,CT14 9BD,https://www.goodwinacademy.org.uk/,3333602210.0,Mr,Phil,Jones,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,"SLCN - Speech, language and Communication",,,,,,,,,,,,,Resourced provision,14.0,13.0,,,South East,Dover,Middle Deal,Dover,(England/Wales) Urban city and town,E10000016,637076.0,151679.0,Dover 007,Dover 007A,,,,,Requires improvement,South-East England and South London,United Kingdom,100062286680.0,,Not applicable,Not applicable,,,E02005047,E01024218,276.0, +146950,886,Kent,5224,All Soul's Church of England Primary School,Academy converter,Academies,Open,Academy Converter,01-04-2019,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,315.0,No Special Classes,19-01-2023,250.0,124.0,126.0,40.0,Supported by a multi-academy trust,THE DIOCESE OF CANTERBURY ACADEMIES TRUST,Linked to a sponsor,"Aquila, The Diocese of Canterbury Academies Trust",Not applicable,,10083010.0,,Not applicable,13-09-2023,23-04-2024,Stanley Road,,,Folkestone,Kent,CT19 4LG,www.allsouls.kent.sch.uk/,1303275967.0,Mrs,Lisa,Ransley,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Folkestone and Hythe,Cheriton,Folkestone and Hythe,(England/Wales) Urban city and town,E10000016,620109.0,136784.0,Folkestone and Hythe 005,Folkestone and Hythe 005A,,,,,Good,South-East England and South London,,50028932.0,,Not applicable,Not applicable,,,E02005106,E01024491,100.0, +147053,886,Kent,3353,Deal Parochial Church of England Primary School,Academy converter,Academies,Open,Academy Converter,01-04-2019,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,210.0,No Special Classes,19-01-2023,199.0,95.0,104.0,36.7,Supported by a multi-academy trust,DEAL EDUCATION ALLIANCE FOR LEARNING TRUST,-,,Not applicable,,10083015.0,,Not applicable,28-06-2023,28-03-2024,Gladstone Road,Walmer,,Deal,Kent,CT14 7ER,http://www.deal-parochial.kent.sch.uk,1304374464.0,Ms,Justine,Brown,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,Walmer,Dover,(England/Wales) Urban city and town,E10000016,637295.0,151463.0,Dover 004,Dover 004D,,,,,Good,South-East England and South London,,200002882433.0,,Not applicable,Not applicable,,,E02005044,E01024252,73.0, +147054,886,Kent,3911,Hornbeam Primary School,Academy converter,Academies,Open,Academy Converter,01-04-2019,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,240.0,Not applicable,19-01-2023,238.0,118.0,120.0,29.8,Supported by a multi-academy trust,DEAL EDUCATION ALLIANCE FOR LEARNING TRUST,-,,Not applicable,,10083013.0,,Not applicable,11-10-2023,01-05-2024,Mongeham Road,,,Deal,Kent,CT14 9PQ,www.hornbeam.kent.sch.uk,1304374033.0,Mrs,Rose,Cope,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,Mill Hill,Dover,(England/Wales) Urban city and town,E10000016,635697.0,152063.0,Dover 005,Dover 005E,,,,,Good,South-East England and South London,,100062287063.0,,Not applicable,Not applicable,,,E02005045,E01024226,71.0, +147055,886,Kent,3172,Northbourne Church of England Primary School,Academy converter,Academies,Open,Academy Converter,01-04-2019,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,140.0,No Special Classes,19-01-2023,132.0,69.0,63.0,6.8,Supported by a multi-academy trust,DEAL EDUCATION ALLIANCE FOR LEARNING TRUST,-,,Not applicable,,10083011.0,,Not applicable,18-07-2023,07-05-2024,Coldharbour Lane,Northbourne,,Deal,Kent,CT14 0LP,www.northbourne-cep.kent.sch.uk,1304611376.0,Mr,Matthew,Reynolds,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,Eastry Rural,Dover,(England/Wales) Rural village,E10000016,632267.0,151903.0,Dover 005,Dover 005A,,,,,Good,South-East England and South London,,10034875643.0,,Not applicable,Not applicable,,,E02005045,E01024201,9.0, +147056,886,Kent,2659,Sandown School,Academy converter,Academies,Open,Academy Converter,01-04-2019,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,No Special Classes,19-01-2023,380.0,191.0,189.0,32.1,Supported by a multi-academy trust,DEAL EDUCATION ALLIANCE FOR LEARNING TRUST,-,,Not applicable,,10083016.0,,Not applicable,20-09-2023,20-05-2024,Golf Road,,,Deal,Kent,CT14 6PY,http://www.sandown.kent.sch.uk/,1304374951.0,Ms,Kate,Luxford,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,North Deal,Dover,(England/Wales) Urban city and town,E10000016,637419.0,153252.0,Dover 004,Dover 004B,,,,,Good,South-East England and South London,,100062285576.0,,Not applicable,Not applicable,,,E02005044,E01024230,122.0, +147057,886,Kent,3358,Sholden Church of England Primary School,Academy converter,Academies,Open,Academy Converter,01-04-2019,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,105.0,No Special Classes,19-01-2023,97.0,46.0,51.0,21.6,Supported by a multi-academy trust,DEAL EDUCATION ALLIANCE FOR LEARNING TRUST,-,,Not applicable,,10083012.0,,Not applicable,14-06-2023,20-05-2024,London Road,Sholden,,Deal,Kent,CT14 0AB,www.sholdenprimary.org.uk,1304374852.0,Mrs,Dawn,Theaker,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,Eastry Rural,Dover,(England/Wales) Urban city and town,E10000016,635694.0,152316.0,Dover 003,Dover 003A,,,,,Good,South-East England and South London,,100062285027.0,,Not applicable,Not applicable,,,E02005043,E01024219,21.0, +147058,886,Kent,3163,The Downs Church of England Primary School,Academy converter,Academies,Open,Academy Converter,01-04-2019,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,420.0,No Special Classes,19-01-2023,317.0,156.0,161.0,36.9,Supported by a multi-academy trust,DEAL EDUCATION ALLIANCE FOR LEARNING TRUST,-,,Not applicable,,10083014.0,,Not applicable,13-09-2023,07-05-2024,Owen Square,Walmer,,Deal,Kent,CT14 7TL,http://www.downs.kent.sch.uk/,1304372486.0,Ms,Natalie,Luxford,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,Walmer,Dover,(England/Wales) Urban city and town,E10000016,636946.0,150846.0,Dover 007,Dover 007D,,,,,Good,South-East England and South London,,100062286224.0,,Not applicable,Not applicable,,,E02005047,E01024250,117.0, +147059,886,Kent,4024,Stone Lodge School,Free schools,Free Schools,Open,New Provision,02-09-2019,,,Secondary,11.0,19,,No Nursery Classes,Has a sixth form,Mixed,None,None,,Non-selective,930.0,Not applicable,19-01-2023,677.0,392.0,285.0,26.9,Supported by a multi-academy trust,ENDEAVOUR MAT,-,,Not applicable,,10083768.0,,,18-10-2023,23-04-2024,Stone Lodge Road,,,Dartford,Kent,DA2 6FY,https://www.stonelodgeschool.co.uk/,1322250340.0,Mr,Gavin,Barnett,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Dartford,Stone Castle,Dartford,(England/Wales) Urban major conurbation,E10000016,556289.0,174355.0,Dartford 006,Dartford 006B,,,,,Good,South-East England and South London,United Kingdom,10094155641.0,,Not applicable,Not applicable,,,E02005033,E01024170,177.0, +147083,886,Kent,2112,River Mill Primary School,Free schools,Free Schools,Open,New Provision,02-09-2019,,,Primary,3.0,11,,Has Nursery Classes,Does not have a sixth form,Mixed,,,,Non-selective,420.0,Not applicable,19-01-2023,240.0,128.0,112.0,9.2,Supported by a multi-academy trust,CONNECT SCHOOLS ACADEMY TRUST,Linked to a sponsor,Connect Schools Academy Trust,Not applicable,,10083765.0,,,06-12-2023,20-05-2024,Central Road,,,Dartford,,DA1 5XR,www.rivermillprimaryschool.co.uk,1322466975.0,Ms,Suzanne,Leader,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dartford,Town,Dartford,(England/Wales) Urban major conurbation,E10000016,554517.0,175013.0,Dartford 001,Dartford 001J,,,,,Good,South-East England and South London,United Kingdom,10023444394.0,,Not applicable,Not applicable,,,E02005028,E01035275,22.0, +147104,886,Kent,2114,Cage Green Primary School,Academy sponsor led,Academies,Open,New Provision,01-07-2019,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,,421.0,Has Special Classes,19-01-2023,225.0,126.0,99.0,44.9,Supported by a multi-academy trust,CONNECT SCHOOLS ACADEMY TRUST,Linked to a sponsor,Connect Schools Academy Trust,Not applicable,,10083593.0,,Not applicable,09-11-2023,08-05-2024,Cage Green Road,,,Tonbridge,Kent,TN10 4PT,www.cage-green.kent.sch.uk,1732354325.0,,Joanna,Styles,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,ASD - Autistic Spectrum Disorder,,,,,,,,,,,,,Resourced provision,19.0,22.0,,,South East,Tonbridge and Malling,Trench,Tonbridge and Malling,(England/Wales) Urban city and town,E10000016,559644.0,148493.0,Tonbridge and Malling 011,Tonbridge and Malling 011A,,,,,Good,South-East England and South London,,100062543771.0,,Not applicable,Not applicable,,,E02005159,E01024729,101.0, +147205,886,Kent,6156,VTC Independent School,Other independent school,Independent schools,Open,New Provision,04-05-2020,,,Not applicable,13.0,18,No boarders,No Nursery Classes,Has a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Selective,32.0,Has Special Classes,20-01-2022,19.0,18.0,1.0,0.0,Not applicable,,Not applicable,,Not applicable,,,,,30-11-2023,04-06-2024,"Unit 2,",Centre 2000,St Michaels Road,Sittingbourne,Kent,ME10 3DZ,https://vtcindependentschool.co.uk/,1795899240.0,Mrs,Anna,Daly,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not approved,,,,,,,,,,,,,,,,,,,South East,Swale,Roman,Sittingbourne and Sheppey,(England/Wales) Urban city and town,E10000016,591338.0,163638.0,Swale 010,Swale 010D,Ofsted,18.0,1.0,Vocational Training Centre Ltd,Good,South-East England and South London,United Kingdom,200002540944.0,,Not applicable,Not applicable,,,E02005124,E01024599,0.0, +147280,886,Kent,2135,Horsmonden Primary Academy,Academy converter,Academies,Open,Academy Converter,01-09-2019,,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,180.0,94.0,86.0,10.0,Supported by a multi-academy trust,LEIGH ACADEMIES TRUST,Linked to a sponsor,Leigh Academies Trust,Not applicable,,10084109.0,,Not applicable,19-10-2023,09-05-2024,Back Lane,Horsmonden,,Tonbridge,Kent,TN12 8NJ,https://horsmondenprimaryacademy.org.uk/,1892722529.0,Mrs,Hayley,Sharp,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Brenchley and Horsmonden,Tunbridge Wells,(England/Wales) Rural town and fringe,E10000016,570239.0,140737.0,Tunbridge Wells 011,Tunbridge Wells 011A,,,,,Good,South-East England and South London,,10008667663.0,,Not applicable,Not applicable,,,E02005172,E01024792,18.0, +147409,886,Kent,2127,Paddock Wood Primary Academy,Academy converter,Academies,Open,Academy Converter,01-09-2019,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,630.0,No Special Classes,19-01-2023,611.0,325.0,286.0,18.0,Supported by a multi-academy trust,LEIGH ACADEMIES TRUST,Linked to a sponsor,Leigh Academies Trust,Not applicable,,10084108.0,,Not applicable,09-11-2023,30-04-2024,Old Kent Road,Paddock Wood,,Tonbridge,Kent,TN12 6JE,www.paddockwoodprimaryacademy.org.uk,1892833654.0,Mr,Simon,Page (Interim),Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tunbridge Wells,Paddock Wood East,Tunbridge Wells,(England/Wales) Rural town and fringe,E10000016,566923.0,144859.0,Tunbridge Wells 001,Tunbridge Wells 001D,,,,,Good,South-East England and South London,,100062545661.0,,Not applicable,Not applicable,,,E02005162,E01024813,110.0, +147454,886,Kent,2117,Dartford Bridge Community Primary School,Academy sponsor led,Academies,Open,New Provision,01-10-2019,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,,446.0,No Special Classes,19-01-2023,471.0,242.0,229.0,8.6,Supported by a multi-academy trust,CYGNUS ACADEMIES TRUST,Linked to a sponsor,Cygnus Academies Trust,Not applicable,,10084107.0,,,28-02-2024,22-05-2024,Community Campus,Birdwood Avenue,,Dartford,Kent,DA1 5GB,dartfordbridgecps.com,1322470678.0,Mrs,Sarah,Smith,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dartford,Bridge,Dartford,(England/Wales) Rural town and fringe,E10000016,554858.0,176047.0,Dartford 001,Dartford 001F,,,,,Good,South-East England and South London,United Kingdom,10023437975.0,,Not applicable,Not applicable,,,E02005028,E01035271,36.0, +147563,886,Kent,2287,Rolvenden Primary School,Academy converter,Academies,Open,Academy Converter,01-11-2019,,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,98.0,No Special Classes,19-01-2023,83.0,44.0,39.0,20.5,Supported by a multi-academy trust,TENTERDEN SCHOOLS TRUST,-,,Not applicable,,10084732.0,,Not applicable,,22-05-2024,Hastings Road,Rolvenden,,Cranbrook,Kent,TN17 4LS,http://www.rolvenden.kent.sch.uk,1580241444.0,,Ben,Vincer,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Ashford,Rolvenden & Tenterden West,Ashford,(England/Wales) Rural village,E10000016,584417.0,131221.0,Ashford 013,Ashford 013B,,,,,,South-East England and South London,,100062552639.0,,Not applicable,Not applicable,,,E02005008,E01024010,17.0, +147591,886,Kent,2118,St Katherine's School & Nursery,Academy sponsor led,Academies,Open,New Provision,01-11-2019,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,630.0,No Special Classes,19-01-2023,511.0,257.0,254.0,28.0,Supported by a multi-academy trust,COPPICE PRIMARY PARTNERSHIP,Linked to a sponsor,The Coppice Primary Partnership,Not applicable,,10084731.0,,,31-01-2024,20-05-2024,St. Katherines Lane,,,Snodland,Kent,ME6 5EJ,www.stkatherineskent.co.uk,1634240061.0,Mr,Ray,Lang,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,Snodland East & Ham Hill,Chatham and Aylesford,(England/Wales) Urban city and town,E10000016,569847.0,161292.0,Tonbridge and Malling 002,Tonbridge and Malling 002D,,,,,Good,South-East England and South London,United Kingdom,100062628713.0,,Not applicable,Not applicable,,,E02005150,E01024772,143.0, +147729,886,Kent,2126,Sunny Bank Primary School,Academy sponsor led,Academies,Open,New Provision,01-02-2020,,,Primary,2.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,315.0,Not applicable,19-01-2023,194.0,104.0,90.0,56.0,Supported by a multi-academy trust,THE ISLAND LEARNING TRUST,Linked to a sponsor,The Island Learning Trust,Not applicable,,10085416.0,,,,16-05-2024,Sunny Bank,Murston,,Sittingbourne,Kent,ME10 3QN,www.sunnybank.kent.sch.uk,1795473891.0,Mr,Jack,Allen,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Murston,Sittingbourne and Sheppey,(England/Wales) Urban city and town,E10000016,591932.0,164074.0,Swale 011,Swale 011C,,,,,,South-East England and South London,United Kingdom,200002528712.0,,Not applicable,Not applicable,,,E02005125,E01024593,94.0, +147749,886,Kent,2237,Queenborough School and Nursery,Academy converter,Academies,Open,Academy Converter,01-03-2020,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,No Special Classes,19-01-2023,470.0,233.0,237.0,37.2,Supported by a multi-academy trust,EKC SCHOOLS TRUST LIMITED,-,,Not applicable,,10085584.0,,Not applicable,04-07-2023,03-05-2024,Edward Road,,,Queenborough,Kent,ME11 5DF,http://www.queenborough.kent.sch.uk,1795662574.0,Mr,Jason,Howard,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Queenborough and Halfway,Sittingbourne and Sheppey,(England/Wales) Urban city and town,E10000016,591694.0,172082.0,Swale 005,Swale 005A,,,,,Outstanding,South-East England and South London,,100062626308.0,,Not applicable,Not applicable,,,E02005119,E01024594,162.0, +147750,886,Kent,2534,Bysing Wood Primary School,Academy converter,Academies,Open,Academy Converter,01-03-2020,,,Primary,2.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,270.0,No Special Classes,19-01-2023,236.0,128.0,108.0,46.5,Supported by a multi-academy trust,EKC SCHOOLS TRUST LIMITED,-,,Not applicable,,10085585.0,,Not applicable,,19-03-2024,Lower Road,,,Faversham,Kent,ME13 7NU,http://www.bysing-wood.kent.sch.uk,1795534644.0,Mr,Andrew,Harrison,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,St Ann's,Faversham and Mid Kent,(England/Wales) Urban city and town,E10000016,600233.0,161634.0,Swale 014,Swale 014C,,,,,,South-East England and South London,,200002530516.0,,Not applicable,Not applicable,,,E02005128,E01024604,100.0, +147751,886,Kent,2569,Briary Primary School,Academy converter,Academies,Open,Academy Converter,01-03-2020,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,No Special Classes,19-01-2023,295.0,148.0,147.0,35.9,Supported by a multi-academy trust,EKC SCHOOLS TRUST LIMITED,-,,Not applicable,,10085586.0,,Not applicable,21-02-2024,20-05-2024,Greenhill Road,,,Herne Bay,Kent,CT6 7RS,www.briary.kent.sch.uk/,1227373095.0,Mrs,Kate,Espley,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Canterbury,Greenhill,North Thanet,(England/Wales) Urban city and town,E10000016,616083.0,166658.0,Canterbury 004,Canterbury 004B,,,,,Good,South-East England and South London,,200000682218.0,,Not applicable,Not applicable,,,E02005013,E01024065,106.0, +147752,886,Kent,2629,Holywell Primary School,Academy converter,Academies,Open,Academy Converter,01-03-2020,,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,196.0,104.0,92.0,14.4,Supported by a multi-academy trust,EKC SCHOOLS TRUST LIMITED,-,,Not applicable,,10085587.0,,Not applicable,,03-06-2024,Forge Lane,Upchurch,,Sittingbourne,Kent,ME9 7AE,http://www.holywell.kent.sch.uk/,1634388416.0,Mrs,Nicky,Murrell,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,"Hartlip, Newington and Upchurch",Sittingbourne and Sheppey,(England/Wales) Rural village,E10000016,584508.0,167486.0,Swale 008,Swale 008D,,,,,,South-East England and South London,,200002533102.0,,Not applicable,Not applicable,,,E02005122,E01024573,25.0, +147850,886,Kent,2129,Springhead Park Primary School,Free schools,Free Schools,Open,New Provision,01-09-2020,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,None,None,,Non-selective,472.0,Not applicable,19-01-2023,368.0,176.0,192.0,20.1,Supported by a multi-academy trust,THE PRIMARY FIRST TRUST,Linked to a sponsor,The Primary First Trust,Not applicable,,10086458.0,,,25-05-2023,07-05-2024,Springhead Parkway,Springhead Park,,Northfleet,Kent,DA11 8BY,www.springheadparkprimary.com,1474555155.0,Mr,Wayne,Clayton,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Gravesham,Northfleet & Springhead,Gravesham,(England/Wales) Urban major conurbation,E10000016,562032.0,173001.0,Gravesham 006,Gravesham 006F,,,,,Good,South-East England and South London,United Kingdom,10012022831.0,,Not applicable,Not applicable,,,E02005060,E01035284,67.0, +147866,886,Kent,2131,Bearsted Primary Academy,Free schools,Free Schools,Open,New Provision,01-09-2020,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,None,None,,Non-selective,446.0,,19-01-2023,263.0,122.0,141.0,6.5,Supported by a multi-academy trust,LEIGH ACADEMIES TRUST,Linked to a sponsor,Leigh Academies Trust,Not applicable,,10086483.0,,,25-01-2023,20-05-2024,Popesfield Way,Weavering,,Maidstone,Kent,ME14 5GA,https://bearstedprimaryacademy.org.uk/,1622250040.0,Mrs,Jane,Tipple,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Maidstone,Boxley,Faversham and Mid Kent,(England/Wales) Urban city and town,E10000016,578618.0,156729.0,Maidstone 005,Maidstone 005B,,,,,Outstanding,South-East England and South London,United Kingdom,10095448157.0,,Not applicable,Not applicable,,,E02005072,E01024336,17.0, +147867,886,Kent,2140,Ebbsfleet Green Primary School,Free schools,Free Schools,Open,New Provision,01-09-2020,,,Primary,3.0,11,,Has Nursery Classes,Does not have a sixth form,Mixed,None,None,,Non-selective,461.0,Not applicable,19-01-2023,262.0,148.0,114.0,8.4,Supported by a multi-academy trust,MARITIME ACADEMY TRUST,Linked to a sponsor,Maritime Academy Trust,Not applicable,,10086480.0,,,08-03-2023,14-09-2023,Ackers Drive Weldon,,Ebbsfleet Valley,Swanscombe,Kent,DA10 1AL,http://www.ebbsfleetgreenprimary.org.uk,1987591627.0,Mrs,Joanne,Wilkinson-Tabi,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,ASD - Autistic Spectrum Disorder,,,,,,,,,,,,,Resourced provision,9.0,15.0,,,South East,Dartford,Ebbsfleet,Dartford,(England/Wales) Urban major conurbation,E10000016,560812.0,173242.0,Dartford 002,Dartford 002I,,,,,Good,South-East England and South London,United Kingdom,10094156607.0,,Not applicable,Not applicable,,,E02005029,E01035281,22.0, +147897,886,Kent,4027,The Holmesdale School,Academy sponsor led,Academies,Open,New Provision,01-09-2022,,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Mixed,None,None,Not applicable,Non-selective,959.0,No Special Classes,19-01-2023,509.0,252.0,257.0,36.3,Supported by a multi-academy trust,SWALE ACADEMIES TRUST,Linked to a sponsor,Swale Academies Trust,Not applicable,,10086757.0,,,,14-05-2024,Malling Road,,,Snodland,Kent,ME6 5HS,https://www.holmesdale.kent.sch.uk,1634240416.0,Mr,Lee,Downey,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,ASD - Autistic Spectrum Disorder,,,,,,,,,,,,,Resourced provision,5.0,5.0,,,South East,Tonbridge and Malling,Snodland East & Ham Hill,Chatham and Aylesford,(England/Wales) Urban city and town,E10000016,569974.0,161137.0,Tonbridge and Malling 002,Tonbridge and Malling 002D,,,,,,South-East England and South London,United Kingdom,10002905073.0,,Not applicable,Not applicable,,,E02005150,E01024772,168.0, +148068,886,Kent,2143,Folkestone Primary,Academy sponsor led,Academies,Open,Split school,01-09-2020,,,Primary,2.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,,None,,,450.0,Not applicable,19-01-2023,424.0,211.0,213.0,24.1,Supported by a multi-academy trust,TURNER SCHOOLS,Linked to a sponsor,Turner Schools,Not applicable,,10086281.0,,,28-06-2023,14-05-2024,Academy Lane,,,Folkestone,,CT19 5FP,https://www.turnerfolkestoneprimary.com/home,1303842400.0,,Louise,Feaver,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Folkestone and Hythe,Broadmead,Folkestone and Hythe,(England/Wales) Urban city and town,E10000016,621910.0,137354.0,Folkestone and Hythe 006,Folkestone and Hythe 006F,,,,,Good,South-East England and South London,United Kingdom,50120541.0,,Not applicable,Not applicable,,,E02005107,E01024516,102.0, +148116,886,Kent,2183,Marden Primary Academy,Academy converter,Academies,Open,Academy Converter,01-09-2020,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,275.0,No Special Classes,19-01-2023,281.0,154.0,127.0,29.9,Supported by a multi-academy trust,LEIGH ACADEMIES TRUST,Linked to a sponsor,Leigh Academies Trust,Not applicable,,10086832.0,,,01-03-2023,14-04-2024,Goudhurst Road,Marden,,Tonbridge,Kent,TN12 9JX,www.mardenprimaryacademy.org.uk,1622831393.0,Mrs,Hannah,Penning,Acting Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,Not applicable,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Maidstone,Marden and Yalding,Maidstone and The Weald,(England/Wales) Rural town and fringe,E10000016,574009.0,144505.0,Maidstone 018,Maidstone 018C,Not applicable,,,,Good,South-East England and South London,,200003718702.0,,Not applicable,Not applicable,,,E02005085,E01024380,84.0, +148118,886,Kent,3106,Eastchurch Church of England Primary School,Academy converter,Academies,Open,Academy Converter,01-09-2020,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,210.0,No Special Classes,19-01-2023,368.0,187.0,181.0,47.0,Supported by a multi-academy trust,THE DIOCESE OF CANTERBURY ACADEMIES TRUST,Linked to a sponsor,"Aquila, The Diocese of Canterbury Academies Trust",Not applicable,,10086841.0,,,12-07-2023,03-05-2024,Warden Road,Eastchurch,,Sheerness,Kent,ME12 4EJ,http://www.eastchurch.kent.sch.uk,1795880279.0,Mrs,Teresa,Oliver (Acting Head),Head of School,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,Not applicable,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Sheppey East,Sittingbourne and Sheppey,(England/Wales) Rural village,E10000016,598963.0,171467.0,Swale 006,Swale 006F,Not applicable,,,,Requires improvement,South-East England and South London,,100062626436.0,,Not applicable,Not applicable,,,E02005120,E01035301,162.0, +148144,886,Kent,1132,North West Kent Alternative Provision Service,Academy alternative provision sponsor led,Academies,Open,New Provision,01-09-2020,,,Not applicable,11.0,16,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,,Not applicable,19-01-2023,7.0,6.0,1.0,14.3,Supported by a multi-academy trust,ALTERNATIVE LEARNING TRUST,Linked to a sponsor,Alternative Learning Trust,Not applicable,,10086859.0,,,14-06-2023,05-06-2024,Richmond Drive,,,Gravesend,,DA12 4DJ,,1474332897.0,Ms,Abigail,Woodhouse,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Gravesham,Westcourt,Gravesham,(England/Wales) Urban major conurbation,E10000016,566417.0,172683.0,Gravesham 007,Gravesham 007C,,,,,Good,South-East England and South London,United Kingdom,10012024036.0,,Not applicable,Not applicable,,,E02005061,E01024311,1.0, +148217,886,Kent,5202,Holy Trinity Church of England Primary School,Academy converter,Academies,Open,Academy Converter,01-11-2020,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,470.0,No Special Classes,19-01-2023,457.0,239.0,218.0,27.3,Supported by a multi-academy trust,ALETHEIA ACADEMIES TRUST,Linked to a sponsor,Aletheia Academies Trust,Not applicable,,10087078.0,,,04-10-2023,30-04-2024,Trinity Road,,,Gravesend,Kent,DA12 1LU,www.holytrinity-gravesend.kent.sch.uk/,1474534746.0,Mrs,Pamela,Gough,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,Not applicable,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Gravesham,Town,Gravesham,(England/Wales) Urban major conurbation,E10000016,565155.0,173712.0,Gravesham 003,Gravesham 003A,Not applicable,,,,Good,South-East England and South London,,100062311696.0,,Not applicable,Not applicable,,,E02005057,E01024258,118.0, +148308,886,Kent,3173,Kingsdown and Ringwould Church of England Primary School,Academy converter,Academies,Open,Academy Converter,01-01-2021,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,210.0,No Special Classes,19-01-2023,213.0,114.0,99.0,14.1,Supported by a multi-academy trust,DEAL EDUCATION ALLIANCE FOR LEARNING TRUST,-,,Not applicable,,10087305.0,,,25-05-2023,20-02-2024,Glen Road,Kingsdown,,Deal,Kent,CT14 8DD,http://www.kingsdown-ringwould.kent.sch.uk,1304373734.0,Mrs,Joanne,Hygate,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,Not applicable,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Dover,"Guston, Kingsdown & St Margaret's-at-Cliffe",Dover,(England/Wales) Rural town and fringe,E10000016,637415.0,148426.0,Dover 009,Dover 009A,Not applicable,,,,Outstanding,South-East England and South London,,100062286573.0,,Not applicable,Not applicable,,,E02005049,E01024232,30.0, +148370,886,Kent,2327,Worth Primary School,Academy converter,Academies,Open,Academy Converter,01-03-2021,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,70.0,No Special Classes,19-01-2023,63.0,37.0,26.0,20.6,Supported by a multi-academy trust,DEAL EDUCATION ALLIANCE FOR LEARNING TRUST,-,,Not applicable,,10087569.0,,,07-02-2024,20-05-2024,The Street,,,Deal,Kent,CT14 0DF,http://www.worthprimary.co.uk,1304612148.0,Mrs,Katy,Chance,Executive Head Teacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,Not applicable,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,Eastry Rural,South Thanet,(England/Wales) Rural village,E10000016,633761.0,156191.0,Dover 002,Dover 002B,Not applicable,,,,Good,South-East England and South London,,100062620829.0,,Not applicable,Not applicable,,,E02005042,E01024242,13.0, +148500,886,Kent,2259,Chartham Primary School,Academy converter,Academies,Open,Academy Converter,01-04-2021,,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,No Special Classes,19-01-2023,382.0,199.0,183.0,26.4,Supported by a multi-academy trust,INSPIRA ACADEMY TRUST,-,,Not applicable,,10088095.0,,,07-02-2024,20-05-2024,Shalmsford Street,Chartham,,Canterbury,Kent,CT4 7QN,http://www.charthamprimary.org.uk,1227738225.0,Mr,Jamie,Noble,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,Not applicable,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Canterbury,Chartham & Stone Street,Canterbury,(England/Wales) Rural hamlet and isolated dwellings,E10000016,610126.0,154535.0,Canterbury 017,Canterbury 017A,Not applicable,,,,Good,South-East England and South London,,200000682327.0,,Not applicable,Not applicable,,,E02005026,E01024052,101.0, +148501,886,Kent,2611,St Stephen's Infant School,Academy converter,Academies,Open,Academy Converter,01-04-2021,,,Primary,5.0,7,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,270.0,No Special Classes,19-01-2023,269.0,146.0,123.0,28.3,Supported by a multi-academy trust,INSPIRA ACADEMY TRUST,-,,Not applicable,,10088094.0,,,24-01-2024,06-06-2024,Hales Drive,St Stephen's,,Canterbury,Kent,CT2 7AB,www.st-stephens-infant.kent.sch.uk,1227769204.0,Mrs,Alice,Edgington,Executive Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,Not applicable,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Canterbury,St Stephen's,Canterbury,(England/Wales) Urban city and town,E10000016,614817.0,159227.0,Canterbury 013,Canterbury 013B,Not applicable,,,,Good,South-East England and South London,,200002882763.0,,Not applicable,Not applicable,,,E02005022,E01024100,76.0, +148502,886,Kent,2626,Sandwich Infant School,Academy converter,Academies,Open,Academy Converter,01-04-2021,,,Primary,5.0,7,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,168.0,No Special Classes,19-01-2023,148.0,73.0,75.0,23.1,Supported by a multi-academy trust,THE DIOCESE OF CANTERBURY ACADEMIES TRUST,Linked to a sponsor,"Aquila, The Diocese of Canterbury Academies Trust",Not applicable,,10088093.0,,,30-01-2024,20-05-2024,School Road,,,Sandwich,Kent,CT13 9HT,www.sandwich-infant.kent.sch.uk/,1304612228.0,Miss,Leanne,Bennett,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,Not applicable,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dover,Sandwich,South Thanet,(England/Wales) Rural town and fringe,E10000016,632813.0,158407.0,Dover 002,Dover 002D,Not applicable,,,,Good,South-East England and South London,,100062284920.0,,Not applicable,Not applicable,,,E02005042,E01024244,34.0, +148519,886,Kent,5229,Fleetdown Primary Academy,Academy converter,Academies,Open,Academy Converter,01-04-2021,,,Primary,4.0,11,,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,654.0,No Special Classes,19-01-2023,648.0,345.0,303.0,13.3,Supported by a multi-academy trust,THE GOLDEN THREAD ALLIANCE,-,,Not applicable,,10088076.0,,,,03-06-2024,Lunedale Road,Darenth,,Dartford,Kent,DA2 6JX,http://www.fleetdown.kent.sch.uk,1322226891.0,Mrs,Alice,Harrington,,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,Not applicable,Not applicable,Not applicable,HI - Hearing Impairment,,,,,,,,,,,,,Resourced provision,6.0,12.0,,,South East,Dartford,Brent,Dartford,(England/Wales) Urban major conurbation,E10000016,556256.0,173026.0,Dartford 008,Dartford 008E,Not applicable,,,,,South-East England and South London,,200000545083.0,,Not applicable,Not applicable,,,E02005035,E01024139,86.0, +148632,886,Kent,6164,MEPA ACADEMY,Other independent school,Independent schools,Open,New Provision,09-09-2021,,,Not applicable,11.0,16,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,None,None,Not applicable,,50.0,Not applicable,20-01-2022,17.0,3.0,14.0,0.0,Not applicable,,Not applicable,,Not applicable,,,,,29-09-2022,07-05-2024,27 & 29 EARL STREET,MAIDSTONE,KENT,,,ME14 1PF,https://www.mepaacademy.com/,1622756644.0,Mrs,Mandy,Ellen,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not approved,,,,,,,,,,,,,,,,,,,South East,Maidstone,High Street,Maidstone and The Weald,(England/Wales) Urban city and town,E10000016,575951.0,155842.0,Maidstone 004,Maidstone 004H,Ofsted,,6.0,Mandy Ellen Cook,Good,South-East England and South London,United Kingdom,10091815091.0,,Not applicable,Not applicable,,,E02005071,E01034991,0.0, +148711,886,Kent,2296,Mundella Primary School,Academy converter,Academies,Open,Academy Converter,01-09-2021,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,173.0,87.0,86.0,56.1,Supported by a multi-academy trust,VERITAS MULTI ACADEMY TRUST,Linked to a sponsor,Veritas Multi Academy Trust,Not applicable,,10088877.0,,,,08-04-2024,Black Bull Road,,,Folkestone,Kent,CT19 5QX,http://www.mundella.kent.sch.uk,1303252265.0,Mrs,Lisa Paez and Lauren Wharmby,.,,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,Not applicable,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Folkestone and Hythe,East Folkestone,Folkestone and Hythe,(England/Wales) Urban city and town,E10000016,622754.0,136911.0,Folkestone and Hythe 004,Folkestone and Hythe 004C,Not applicable,,,,,South-East England and South London,,50040639.0,,Not applicable,Not applicable,,,E02005105,E01024501,97.0, +148712,886,Kent,4246,The North School,Academy converter,Academies,Open,Academy Converter,01-01-2022,,,Secondary,11.0,19,No boarders,No Nursery Classes,Has a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Non-selective,1265.0,Not applicable,19-01-2023,1267.0,700.0,567.0,31.1,Supported by a multi-academy trust,SWALE ACADEMIES TRUST,Linked to a sponsor,Swale Academies Trust,Not applicable,,10088876.0,,,,28-05-2024,Essella Road,,,Ashford,Kent,TN24 8AL,https://www.thenorthschool.org.uk/,1233614600.0,Mrs,Clair,Ellerby,Head of School,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,Not applicable,Not applicable,Not applicable,ASD - Autistic Spectrum Disorder,,,,,,,,,,,,,Resourced provision,25.0,25.0,,,South East,Ashford,Furley,Ashford,(England/Wales) Urban city and town,E10000016,601952.0,142258.0,Ashford 005,Ashford 005C,Not applicable,,,,,South-East England and South London,,100062560863.0,,Not applicable,Not applicable,,,E02005000,E01024023,350.0, +148876,886,Kent,2133,Halstead Community Primary School,Academy converter,Academies,Open,Academy Converter,01-03-2022,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,175.0,No Special Classes,19-01-2023,54.0,33.0,21.0,25.9,Supported by a multi-academy trust,THE PIONEER ACADEMY,Linked to a sponsor,The Pioneer Academy,Not applicable,,10089754.0,,,,03-06-2024,Otford Lane,Halstead,,Sevenoaks,Kent,TN14 7EA,www.halstead.kent.sch.uk,1959532224.0,Mrs,Sue,Saheed,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,Not applicable,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,"Halstead, Knockholt and Badgers Mount",Sevenoaks,(England/Wales) Rural village,E10000016,548908.0,161035.0,Sevenoaks 008,Sevenoaks 008D,Not applicable,,,,,South-East England and South London,,50002001021.0,,Not applicable,Not applicable,,,E02005094,E01024440,14.0, +148918,886,Kent,2119,Shears Green Infant School,Academy converter,Academies,Open,Academy Converter,01-07-2022,,,Primary,4.0,7,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,360.0,No Special Classes,19-01-2023,342.0,163.0,179.0,21.3,Supported by a multi-academy trust,HORNCHURCH ACADEMY TRUST,-,,Not applicable,,10089902.0,,,,04-05-2024,Packham Road,Northfleet,,Gravesend,Kent,DA11 7JF,http://www.shearsgreeninfantschool.co.uk,1474566700.0,Ms,Hayley,Kotze,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,Not applicable,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Gravesham,Coldharbour & Perry Street,Gravesham,(England/Wales) Urban major conurbation,E10000016,563816.0,172261.0,Gravesham 009,Gravesham 009A,Not applicable,,,,,South-East England and South London,,100062310733.0,,Not applicable,Not applicable,,,E02005063,E01024264,73.0, +148991,886,Kent,2272,East Stour Primary School,Academy converter,Academies,Open,Academy Converter,01-04-2022,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,472.0,No Special Classes,19-01-2023,438.0,233.0,205.0,36.2,Supported by a multi-academy trust,EKC SCHOOLS TRUST LIMITED,-,,Not applicable,,10090164.0,,,,07-06-2024,Earlsworth Road,South Willesborough,,Ashford,Kent,TN24 0DW,www.east-stour.kent.sch.uk/,1233630820.0,Mrs,E,Law,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,Not applicable,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Ashford,Aylesford & East Stour,Ashford,(England/Wales) Urban city and town,E10000016,601863.0,140767.0,Ashford 009,Ashford 009G,Not applicable,,,,,South-East England and South London,,100062560510.0,,Not applicable,Not applicable,,,E02005004,E01032817,147.0, +148992,886,Kent,2672,Palm Bay Primary School,Academy converter,Academies,Open,Academy Converter,01-04-2022,,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,428.0,No Special Classes,19-01-2023,424.0,218.0,206.0,26.9,Supported by a multi-academy trust,EKC SCHOOLS TRUST LIMITED,-,,Not applicable,,10090163.0,,,,07-06-2024,Palm Bay Avenue,Cliftonville,,Margate,Kent,CT9 3PP,http://www.palmbay.uk,1843290050.0,Miss,Lizzie,Williams,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,Not applicable,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Thanet,Cliftonville East,South Thanet,(England/Wales) Urban city and town,E10000016,637983.0,171167.0,Thanet 002,Thanet 002D,Not applicable,,,,,South-East England and South London,,100062307578.0,,Not applicable,Not applicable,,,E02005133,E01024656,114.0, +149039,886,Kent,4028,Barton Manor School,Free schools,Free Schools,Open,New Provision,01-09-2022,,,Secondary,11.0,19,No boarders,No Nursery Classes,Has a sixth form,Mixed,None,None,Not applicable,Non-selective,1050.0,Not applicable,19-01-2023,149.0,71.0,78.0,36.9,Supported by a multi-academy trust,BARTON COURT ACADEMY TRUST,Linked to a sponsor,Barton Court Academy Trust,Not applicable,,10090861.0,,,,17-05-2024,Spring Lane,,,Canterbury,Kent,CT1 1SU,https://www.bartonmanor.org/,1227532140.0,Mr,Richard,Morgan,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Canterbury,Barton,Canterbury,(England/Wales) Urban city and town,E10000016,616290.0,157296.0,Canterbury 016,Canterbury 016B,,,,,,South-East England and South London,United Kingdom,10094587078.0,,Not applicable,Not applicable,,,E02005025,E01024045,55.0, +149123,886,Kent,3020,Sedley's Church of England Primary School,Academy converter,Academies,Open,Academy Converter,01-06-2022,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,105.0,No Special Classes,19-01-2023,99.0,57.0,42.0,9.1,Supported by a multi-academy trust,ALETHEIA ACADEMIES TRUST,Linked to a sponsor,Aletheia Academies Trust,Not applicable,,10090460.0,,,12-07-2023,07-06-2024,Church Street,Southfleet,,Gravesend,Kent,DA13 9NR,www.sedleys.kent.sch.uk/,1474833221.0,Mrs,T,Handley,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,Not applicable,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dartford,"Longfield, New Barn & Southfleet",Dartford,(England/Wales) Rural village,E10000016,561345.0,171128.0,Dartford 013,Dartford 013A,Not applicable,,,,Good,South-East England and South London,,200000535394.0,,Not applicable,Not applicable,,,E02005040,E01024157,9.0, +149261,886,Kent,3718,St Augustine's Catholic Primary School,Academy converter,Academies,Open,Academy Converter,01-09-2022,,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Roman Catholic,Does not apply,Archdiocese of Southwark,Not applicable,210.0,No Special Classes,19-01-2023,203.0,111.0,92.0,13.8,Supported by a multi-academy trust,KENT CATHOLIC SCHOOLS' PARTNERSHIP,Linked to a sponsor,Kent Catholic Schools' Partnership,Not applicable,,10090965.0,,,,23-04-2024,St John's Road,,,Hythe,Kent,CT21 4BE,www.st-augustines-hythe.kent.sch.uk,1303266578.0,Mrs,Nicola,Clarke,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,Not applicable,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Folkestone and Hythe,Hythe,Folkestone and Hythe,(England/Wales) Urban city and town,E10000016,615271.0,135480.0,Folkestone and Hythe 008,Folkestone and Hythe 008A,Not applicable,,,,,South-East England and South London,,50017101.0,,Not applicable,Not applicable,,,E02005109,E01024523,28.0, +149319,886,Kent,4029,Aylesford School,Academy sponsor led,Academies,Open,New Provision,01-09-2022,,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Mixed,None,None,Not applicable,Non-selective,1044.0,No Special Classes,19-01-2023,873.0,453.0,420.0,20.7,Supported by a multi-academy trust,CHARACTER EDUCATION TRUST,Linked to a sponsor,Wrotham School,Not applicable,,10091142.0,,,,06-06-2024,Teapot Lane,,,Aylesford,Kent,ME20 7JU,www.aylesford.kent.sch.uk,1622717341.0,Miss,Tanya,Kelvie,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,Aylesford South & Ditton,Chatham and Aylesford,(England/Wales) Urban city and town,E10000016,571899.0,158410.0,Tonbridge and Malling 005,Tonbridge and Malling 005B,,,,,,South-East England and South London,United Kingdom,200000966311.0,,Not applicable,Not applicable,,,E02005153,E01024718,163.0, +149554,886,Kent,4030,The Royal Harbour Academy,Academy sponsor led,Academies,Open,New Provision,01-04-2023,,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Mixed,None,None,Not applicable,Non-selective,916.0,No Special Classes,,,,,,Supported by a multi-academy trust,COASTAL ACADEMIES TRUST,Linked to a sponsor,Coastal Academies Trust,Not applicable,,10091882.0,,,,13-05-2024,Newlands Lane,,,Ramsgate,Kent,CT12 6RH,www.rha.kent.sch.uk,1843572500.0,Mr,Simon,Pullen,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Thanet,Northwood,South Thanet,(England/Wales) Urban city and town,E10000016,637611.0,166588.0,Thanet 011,Thanet 011A,,,,,,South-East England and South London,United Kingdom,10022962106.0,,Not applicable,Not applicable,,,E02005142,E01024686,, +149623,886,Kent,3134,John Mayne Church of England Primary School,Academy converter,Academies,Open,Academy Converter,01-04-2023,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Not applicable,140.0,No Special Classes,,,,,,Supported by a multi-academy trust,TENTERDEN SCHOOLS TRUST,-,,Not applicable,,10092108.0,,,,18-04-2024,High Street,Biddenden,,Ashford,Kent,TN27 8AL,www.john-mayne.kent.sch.uk/,1580291424.0,Mrs,Helen,Tester,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,Not applicable,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Ashford,Biddenden,Ashford,(England/Wales) Rural town and fringe,E10000016,584986.0,138375.0,Ashford 011,Ashford 011B,Not applicable,,,,,South-East England and South London,,100062563751.0,,Not applicable,Not applicable,,,E02005006,E01023979,, +149666,886,Kent,2144,St. Clement's CofE Primary School,Academy converter,Academies,Open,Split school,01-04-2023,,,Primary,4.0,11,Not applicable,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Canterbury,Non-selective,210.0,Not applicable,,,,,,Supported by a multi-academy trust,THE DIOCESE OF CANTERBURY ACADEMIES TRUST,Linked to a sponsor,"Aquila, The Diocese of Canterbury Academies Trust",Not applicable,,10092363.0,,,,30-04-2024,Leysdown Road,,,Sheerness,Kent,ME12 4AB,www.stclementscep.co.uk,1795506910.0,Mrs,Kelly,Lockwood,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Sheppey East,Sittingbourne and Sheppey,(England/Wales) Rural village,E10000016,,,Swale 006,Swale 006A,,,,,,South-East England and South London,United Kingdom,100061077964.0,,Not applicable,Not applicable,,,E02005120,E01024580,, +149840,886,Kent,4032,Chilmington Green School,Free schools,Free Schools,Open,Academy Free School,01-09-2023,,,Secondary,11.0,19,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,None,None,Not applicable,Non-selective,1140.0,Not applicable,,,,,,Supported by a multi-academy trust,UNITED LEARNING TRUST,Linked to a sponsor,United Learning Trust,Not applicable,,10093045.0,,,,01-05-2024,Jemmett Road,,,Ashford,Kent,TN23 4QE,https://chilmingtongreenschool.org.uk/,1233438800.0,Mr,Jonathan,Rutland,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Ashford,Beaver,Ashford,(England/Wales) Urban city and town,E10000016,,,Ashford 007,Ashford 007B,,,,,,South-East England and South London,United Kingdom,10012841381.0,,Not applicable,Not applicable,,,E02005002,E01023975,, +149893,886,Kent,4033,The Abbey School,Academy converter,Academies,Open,Fresh Start,01-04-2023,,,Secondary,11.0,19,,No Nursery Classes,Has a sixth form,Mixed,None,None,,,1226.0,Not applicable,,,,,,Supported by a multi-academy trust,THE HOWARD ACADEMY TRUST,Linked to a sponsor,The Howard Academy Trust,Not applicable,,10092583.0,,,,22-05-2024,London Road,,,Faversham,Kent,ME13 8RZ,www.abbeyschoolfaversham.co.uk,1795532633.0,Dr,Rowland,Speller,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,ASD - Autistic Spectrum Disorder,,,,,,,,,,,,,Resourced provision and SEN unit,44.0,44.0,44.0,44.0,South East,Swale,Watling,Faversham and Mid Kent,(England/Wales) Urban city and town,E10000016,,,Swale 014,Swale 014E,,,,,,South-East England and South London,United Kingdom,100062379926.0,,Not applicable,Not applicable,,,E02005128,E01024626,, +149975,886,Kent,2066,Maypole Primary School,Academy converter,Academies,Open,Academy Converter,01-09-2023,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,No Special Classes,,,,,,Supported by a multi-academy trust,INSPIRE ACADEMY MOVEMENT TRUST,-,,Not applicable,,10092968.0,,,,08-05-2024,Franklin Road,,,Dartford,Kent,DA2 7UZ,www.maypole.kent.sch.uk/,1322523830.0,Miss,Katie,McCann,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,Not applicable,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Dartford,Maypole & Leyton Cross,Dartford,(England/Wales) Urban major conurbation,E10000016,551223.0,172486.0,Dartford 010,Dartford 010C,Not applicable,,,,,South-East England and South London,,10002021970.0,,Not applicable,Not applicable,,,E02005037,E01024152,, +149976,886,Kent,2134,Four Elms Primary School,Academy converter,Academies,Open,Academy Converter,01-09-2023,,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,108.0,No Special Classes,,,,,,Supported by a multi-academy trust,INSPIRE ACADEMY MOVEMENT TRUST,-,,Not applicable,,10092967.0,,,,15-05-2024,Bough Beech Road,Four Elms,,Edenbridge,Kent,TN8 6NE,www.four-elms.kent.sch.uk,1732700274.0,Mrs,Liz,Mitchell,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,Not applicable,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Cowden and Hever,Tonbridge and Malling,(England/Wales) Rural village,E10000016,546847.0,148273.0,Sevenoaks 015,Sevenoaks 015A,Not applicable,,,,,South-East England and South London,,10035181444.0,,Not applicable,Not applicable,,,E02005101,E01024420,, +149978,886,Kent,3035,Seal Church of England Voluntary Controlled Primary School,Academy converter,Academies,Open,Academy Converter,01-09-2023,,,Primary,2.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,444.0,No Special Classes,,,,,,Supported by a multi-academy trust,INSPIRE ACADEMY MOVEMENT TRUST,-,,Not applicable,,10092966.0,,,,09-05-2024,Zambra Way,Seal,,Sevenoaks,Kent,TN15 0DJ,www.sealprimary.com,1732762388.0,Mrs,Tamsin,Jones,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,Not applicable,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Sevenoaks,Seal and Weald,Sevenoaks,(England/Wales) Urban city and town,E10000016,554704.0,157107.0,Sevenoaks 010,Sevenoaks 010A,Not applicable,,,,,South-East England and South London,,10035185574.0,,Not applicable,Not applicable,,,E02005096,E01024457,, +150156,886,Kent,5208,Ditton Church of England Junior School,Academy converter,Academies,Open,Academy Converter,01-11-2023,,,Primary,7.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,256.0,No Special Classes,,,,,,Supported by a multi-academy trust,ALETHEIA ACADEMIES TRUST,Linked to a sponsor,Aletheia Academies Trust,Not applicable,,10093280.0,,,,21-05-2024,New Road,Ditton,,Aylesford,Kent,ME20 6AE,http://www.ditton-jun.kent.sch.uk,1732843446.0,Mr,Graham,Ward,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,Not applicable,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,Aylesford South & Ditton,Chatham and Aylesford,(England/Wales) Urban city and town,E10000016,571105.0,158080.0,Tonbridge and Malling 005,Tonbridge and Malling 005D,Not applicable,,,,,South-East England and South London,,10002907508.0,,Not applicable,Not applicable,,,E02005153,E01024736,, +150255,886,Kent,2692,The Churchill School,Academy converter,Academies,Open,Academy Converter,01-12-2023,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,Not applicable,,,,,,Supported by a multi-academy trust,EKC SCHOOLS TRUST LIMITED,-,,Not applicable,,10093663.0,,,,23-05-2024,Haven Drive,Hawkinge,,Folkestone,Kent,CT18 7RH,http://www.thechurchillschool.co.uk,1303893892.0,Mrs,Zoe,Stone,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,Not applicable,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Folkestone and Hythe,North Downs East,Folkestone and Hythe,(England/Wales) Rural town and fringe,E10000016,621237.0,139587.0,Folkestone and Hythe 002,Folkestone and Hythe 002F,Not applicable,,,,,South-East England and South London,,50102503.0,,Not applicable,Not applicable,,,E02005103,E01033214,, +150278,886,Kent,4034,Dover Christ Church Academy,Academy sponsor led,Academies,Open,Fresh Start,01-09-2023,,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Mixed,None,None,,,990.0,Not applicable,,,,,,Supported by a multi-academy trust,TURNER SCHOOLS,Linked to a sponsor,Turner Schools,Not applicable,,10093628.0,,,,14-05-2024,Melbourne Avenue,,,Dover,,CT16 2EG,,,Mr,Jamie,MacLean,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,PMLD - Profound and Multiple Learning Difficulty,,,,,,,,,,,,,SEN unit,,,69.0,72.0,South East,Dover,Whitfield,Dover,(England/Wales) Urban city and town,E10000016,630895.0,144193.0,Dover 010,Dover 010E,,,,,,South-East England and South London,United Kingdom,100062289416.0,,Not applicable,Not applicable,,,E02005050,E01024254,, +150743,886,Kent,4036,Leigh Academy Hugh Christie,Academy sponsor led,Academies,Open,New Provision,01-04-2024,,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Mixed,None,None,Not applicable,Non-selective,1226.0,Has Special Classes,,,,,,Supported by a multi-academy trust,LEIGH ACADEMIES TRUST,Linked to a sponsor,Leigh Academies Trust,Not applicable,,10094758.0,,,,01-04-2024,White Cottage Road,,,Tonbridge,Kent,TN10 4PU,,1732353544.0,Mr,Palak,Shah,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Tonbridge and Malling,Trench,Tonbridge and Malling,(England/Wales) Urban city and town,E10000016,559444.0,148580.0,Tonbridge and Malling 009,Tonbridge and Malling 009A,,,,,,South-East England and South London,United Kingdom,10002906320.0,,Not applicable,Not applicable,,,E02005157,E01024730,, +150934,886,Kent,4037,EKC Sheppey Secondary,Academy sponsor led,Academies,Proposed to open,Split school,01-09-2024,,,Secondary,11.0,16,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,,None,,,750.0,Not applicable,,,,,,Not supported by a trust,,-,,Not applicable,,10095470.0,,,,27-04-2024,Marine Parade,,,Sheerness,,ME12 2BE,,,,January,Lorman,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Sheerness,Sittingbourne and Sheppey,(England/Wales) Urban city and town,E10000016,593060.0,174642.0,Swale 001,Swale 001B,,,,,,South-East England and South London,United Kingdom,100062378138.0,,Not applicable,Not applicable,,,E02005115,E01024610,, +150935,886,Kent,4038,Leigh Academy Minster,Academy sponsor led,Academies,Proposed to open,Split school,01-09-2024,,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Mixed,,None,,,1150.0,Not applicable,,,,,,Not supported by a trust,,-,,Not applicable,,10095469.0,,,,27-04-2024,Minster Road,,,Sheerness,,ME12 3JQ,,,,Mathieu,Stevens,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Swale,Queenborough and Halfway,Sittingbourne and Sheppey,(England/Wales) Urban city and town,E10000016,593740.0,172606.0,Swale 004,Swale 004A,,,,,,South-East England and South London,United Kingdom,200002529794.0,,Not applicable,Not applicable,,,E02005118,E01024595,, diff --git a/data/init/kevlarai_data/kevlarai_curriculum.xlsx b/data/init/kevlarai_data/kevlarai_curriculum.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..ad428f8e1f23f3e4f59f462abfd710b75fe5ae84 GIT binary patch literal 752436 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�=ft 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

Bd>kvn;uDz_8Vbl^_P9h;@pJpvw7|6 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 G#8yUma+uSlm-e!05*|eW@ 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

PLn{=kdvbFAJ2aKYF<;F>z?_ zHA38UC+gL&crk8!qNiK`)FkBk^cA%3!BD9_2@$p%Z)1!;WZJn^BZKx<|CoL+xLMjqY(36Wk-w%4<|eRvV2d_ZKcs zad(I*@53pU9W*_v64x$A{Fvtim(sckEsbz*8z z_7GCinwYuTDIyaYg40AeeU9TS~anQ?@7=oSLJ?#MSd4EieZXLt<<9aqf&L6d&7qwbva(PGd_ra8-0 z-Ec(nV*?Nv8qdKWCugmoc2Uor*d7Bxa*akzo!O-0z7q?6{qR6@XbTYV9Z`#&MqdGe zDp=#N+04Vq#Z5-;tC%!k{bqHyxvr{?;A(dBklL7F%j2iAR&W@kW6qBi_}|pBN65WE z;E&Y2-fbz`h$DL>jLN}j&$BysvMadoqz-oCNf22XFIc#>`!xRaD0#AL8q7gt9RPLm ztpfzxAn?ZN=mm7?)qfABdv-E^0Zn=JUx4WzosOPC)n5GvV7hxJ^Jh?uSN{f>?vK;a z6Uff1e-TV~<7EB>lK1ML1k+tP9X)~=y!wa0bQezMk02DU{w^@xnbXk&=+d*l2~2n5 zWc~n}^6aky(;Yb--Giz<`-{MI2Ttbqpcv2oY%txP)6pHs&a*!mOt<4?ewP-z1d{OV zj|5k4I*t4RQF!(Tf-BdZB>#Xuc=rDQSAv~JZb640{m$Upm7gD-z65eCWN{2;aqJIp zEM#+d52UefNn_fQa<-v>z+#}4LEIHF+?7F`6)_x`f>fCn-92|@Q~~SE0zz*exK>zH zvWDLjLf$?|t?8(b1y}D#Npce_booQx(U9~c((3Vt+2#cB^MMaET~oLE#e7or2gHI? zw+6(bQ}qYMlCLVhwjeo$OR|Z@#i+B1#cMhQx9^Qb(X^_gSw=M_&~pif1f964*hMpw zy4Xdtwu+%WCqHPOq!P&>-Re^1CGe2GvybL$B}5xO>=)0Dp=1}!iQ!}y%S{*XXDJ?y zl4$*ih7zaAp0+h5#-FA?Ehc_#s_eWfPE+ivj}2t#rs>a$nWk;cirHSjR}_3FPSftX zPeJmv6_sPKGKPp_uquX;W3U>JP9##`Xy=n%X5?zK+9y06JHy7=C0)9x`q>mCZ~j{b zwgFxpIVqk0i4(X)p-YSKsH@|E72iV}W&6#chg4Pxcvb+SdR%%QY zF@`DIQVdkR>`9zC)dN(Nh1(GI!<7!vgd(?1RV%_i!JAeV9H`#0N@$92;u-p0F;`a6 zFQdpEK;OcoZvBWMvW|w4p6uwWjrSMAR$T$={}vhqwEtRMU(y~7Ty}*%vNHF7t>bMx z9ewW>Mn}?gx~)nh-6!Z2u70R6DtcP%);N36lvsEING#ST=m1De!!QP#21K6G0(jue zxxQl{xu3Dg4sZH#wRs7f|7R=G#Fl&}UH<3m-r}`ZeWreM;b{4DeQv{Ii7-dGq z6qcGwUpEcyP>g$-_5gWQXs|x-PbyRixRimFf0B$vGB^aRLOEPR&FIl;3nD% zAXRh2CZo)+w}#5Q8q6}YJxIoFHry>cN!{9FVsn)m(~Rj>0;UdS8ewLoj$u$bPT@AC zFcm=a^$-`5=K<-%%vzUlNoP)QH&uuA^|D{Z8(K HlF}zOcc~dI02iU11|>vI{k9 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

`#@lFG ze#Uhi`sz?;@vyv6FSC9z>M`#R;QtKgAN@Qj*J#Z-EU)(oVugdfsdYf#*dh)Bou|3O zqX~#W^`&Y7=Oq-&)ckUF#a27yn@qLv;Y{T{XXH*T-czVhdx8{K+O?Vp;2O7<3-7}5 zWJg~k!rpkV<_rx#s9{JAlaVqL195+?I;~S%sYQ{DsFG?2-x8K;I{z>R|8tCCbP&kM zOb8(3JcIn6S&)xJDM!MRg;o{<_i)aB!T!V~PnS z_UkBs2y$ef->7yx*G;?A%xo!v&eVZ1>0|?^sEM*9im7T~OuPG`rUyd%Iku~i=TC%r zW7$cBa39!3rqzy(Jnrz$yP@{;oIzce+6qK#K%QxpgsA}v%fS==aOU5gZ{Z2FBYmH> zL5peC&V(>xLgSq^0rr%sZ&7&MX`i)xV9GoI9~{aDwhoMhM5iYao%AHg&(QJ1n=D3C z1c`vK(>%cTfj3u)35L5UJ&AM%I(~%qr2Y(vf4OE-&2$-&V1-HUXnq0+-$6)CAWRQ0 zwy1X8fH%U9YVn3YZUFw1Es(f@{{*y0&{%}=gj?N68Krh`@2*b?2u-K7MuMD{t41v) z$Ivv|NfUTJRa>cQ$e3Ym0D~Yw`cCdbTX-f@H5o#(N+R>8b(A5ersMB_u(s|<;)wm7 z%me?F35kzUBEJYg>RyOJ(4Q7IpTsNj%5iJ&cih?Dnj7@&fA?-D>w)u*N`v|QnU~+Z z-%*_Ddq;giZ*%(?!uqKn-*IHYa=IpM)vN&>SBDyP5G%U+*!n9Abx-8A!U4wEl znR!I{;bgQvRGhPGOe+(+zmSX@R;F!;zQ|?A2hFp~#Ece_F~iEk_0gwaiqgi|O~~{C z(I@R8R%3i2xp7!I3}kui_ze46i^|e$v5tp^l&i<0U7AHxWcphDD$;1&9cKoW!^Wa7 zve@xm?{D>~5SyM)zPzMtF&6E}Y?pqmztyWk?8kgE^OCa2Sad#S(?%q9RdtDu!jW*K0X%$0c6P-1F?oq1=6^>lqGEdFm_#^cCIk)xGYP{Oh_=YV3Os$ibUk$qOp^K9Znatq&q{q{rHtK*M#=Rd!h z`vWk@2e%%cRXvC^mgW&d2sdo4XPzhgXz=xtj6UVvB3JU~mAB6h1nBRzcOth4xV9H- z=|El`z=vcxUr-^5_lxyC*eJ(ib!V#g4vd{17`qC8qNBFVnNb0MMZU2(G=7#Nux5R5 z>@<}$e!MA!;2FPAvmbt_)=lnZ%G%%jbbdL3^xmp`HAN2^& zD7IuHKbX75p?UpBk;036BZHQEYFSTwu4(2Cl^qnBbqjPDGdPabl;(|Bv%D~@w`v}| zN$=7krL7XjxPJM|e5k8*!=7{B80^rabwRSs4?JBfq#_v0*Kj`Fpeb^}Id5zF$C9DL z$$_enarh1xs4^S3zeKL=AsMp0a>GSP%tdSny979o*w7s$u^+g zt4OZJl=B|`(HB`$F*tVi3I`p3%B|zr0SO87H=8L_nM8uf{x{ZHVZFq>axNdqv6#5i zdmP4UdM}*7-aGTPxio2%clwI>kxQ+4DPyNEuq^zEVZ@$Z50b?<;u7|r^^uH<`J%G_ zy|QSN1<6g!^*DCVc;-4BZPOl^5m|gqqcK6lQh)IA#1(PxWD$IFV^)^Nn9yrf8q8jO z9LpkWpxP+>ZP41wd#U;Rr^mkdNdCdJYx#Rg$r$)5ux-FPh?for^yN3@4yZbn>AdEd z_%M2f%A47>@lg5G2PTado9vekhOWIlj32B$y-@53>k`z(EP6cN5mptisc$Y79z8z_ z4&6J#FnVQSc9LwgjN%8&`-}Ct4kw4D0<*0pV_!cKJoE<^tzq0PVJl|7

pfO(^yjqg z*ff`V>7H)oM9khoik#l-R`j=jXG`OXC~`pN?ynNDf`&K{h>$JyZM9`1f+lFa&ssF7 z>)>~x_s||n_F0qKAN+1R{6Xmbin{Arq@p3NTvM#UdQ$w~75$j$ zy|dsLx%s~o`mGAXm^b*6$!F?{c@3+?@sQY$L!;-`es}eE9f}_e(<1pf9h2^6(R>L@ zFVVh?>T(OMEKwKZ{*P?>-Q6$CqaXOxHGz>)o39-~W@Mtw8C2_fhI~=4ZV3 z@h8ozlv+upI&7L4J#r^E!h1nA2pjIVuC8ukHKFX$xDz*N8*JDSH?+qtDM9qMR#<90 zTMz!FlC#8IEBmbHU*;wQ(tnt^MD11F-1~qEyM5{QyVE%)$G&In?H0LRddRxt&*{@S zM*9oV?=k;#A#>t?AoM@0Bg&RyEIW=*cf}b=6rg=D(_gcgy8fv!qi-7eI-y=FF*1WI zDK(pk3NdobbKTc1!d*IIE?jbhlOfHVJ@jQXT2?R)x;1FDo9PX|;9 zP3_F|_H4~`&(5^X?qmx}k>0hPM%({0#s=i0vbUbre^!Yr8z_#C!Jdy3t3I{=x5!cA zHbBc*WCBPmrHzZXsg9LbzZigkv<86I^rir``HBP~&MAI!pN4QwlJyCW$u07x`mNjn z5sq?`ya7?=of&8-SVqnhI$R5u`RWN>hG+7g&?9)J0QbSeGeyrI3G)7%7s8OpMRDRd zYuTVI3A)X}+vq_P-FtFC-?38cGWldOmle;@zS6}qIY)}FbD4M2F#>Yc#Eg0UI;AX;VEtJXnRkNlV%c_aJ^0>ygBFu&20h?q#@!A!=5w;)aRUQw|Ux6v$s&kgYNPvF~V z_U*;$QCWr+*w*C2{R;${yqo8@Y>e`?2ve6Qdvr2>$l}>2Z*Z%%?t~_q zoF_1^R=4Xcx(z+DxYn8aG)&vK%oz+EZKo5oSlvDxYVQWE99B4-kTAO~pIkT9&(9=? z*!>5evl^nbr{7}!-3o|lV7jQaW7vK(xD0fiIk|R^G}6#vX@a-2UUAYEfES!>t4dre zI{wCozV9txYJYulnc*WUh2LtfA3itI=m>?Q9|G*#oU;_%BOPb!5TCh6-PNjBW#MhKJHRqt ztYmu?*3aaCTjBgtC_BAtU2aF>$14prJa|aQ&;Q-jqX2vm$yX=&hVt;FU(%;+Q~h6) zAt$_4-Riyno^v~R3p8Jel`#+)-@P5wYM`BhKVhzJTR&8f+5J2(>`84r|G&;0Q^SX~ z^8-$n+?I0Y%e*v0*?RANrpz_Q`g+=BbKRnUDmJzQO=ES7yn;gpx618G{M|l@P8Kp* ztSjr66uq+vqz{v1a2n}YyWLr*J>{AFGuMR^ZZ?7TNmpmpvZ@Y%DSFj(1b{TE>FLI`S}o zcqH2OqNj&n;q&@A+=-Rm@{yl|-vF}V^EaMDSCW;b=`runb5)jqZt?n=SR(_LW-WW* z8|mZd7yFdyaB>TH7TttMRvC%QBK_3W$$-sBSW8X}HqDlwx@(lNX#cO-|JWlgEAP9% zoUz8pb5$^}DA-^ym%y)YV^Q=W8ctq#H|f!$H+_;fw{5g>o}6s&+k1E7NnfQ=O*05q z>T~aR7pv{@R_aY2cD0Y?2Cl~%FXY48Y9Ale^ebAY;Nu{AZK{VC+L>ft^ZY$d^7iTh zryb6U9p%i{9ciqxC%)y(V@jimfam{!q1Xv-+DAGATVwz6&6{!HDW*8B!1ap)QkSC? zQ~Vo_Q8#U?w@{Y7Io~_dJW??Tht=BAFL>8)%AoK1`Q~)!QKKDB4D*=8{>JYDZ^~4W zrELcsS$n16J=Q&3WYu~h+FfLIe~FQZ z9jS9m5gqI??cTW4^PB6ox-)x&)g`yv+13tkC;RkHd+$zrgQca0n*_X8Z*zNtg(cpb zo4~ehM0>qI_6vV>IL>Zb&t{+6O;PLzI(2kjW+k5zm|Fp8_G7d5QM2~R2Rc=|%nIHu zNUbYxSIKMFE@m5ax^!kAf=Wq!qncmO;pR2bju-VS(YvtCDLb+>%8y4=qP{$n$7^e* zoDK+h%Q=CDpnF5Arcnm4D}8Gn>>M*T<*mvy9lzsk^Ia!i2g3s)BvN zf)DCdsYmW~^cg#u8D{S(cD`p42=}Xx4b?-W395A3%(}Iu3ucOqIz@RCH;cU0qX(#6 zH@Bg&%<&o)Wjm#syPx_}cd($$`u!u<6Aa^nym*Nb zayCZ(DH+}14ti(8w`%tU{I~%KW-{>{NXfii18!q@M6$yS0?%t)zX|b^| zs&;o5`)i3W7sm@;lId9j`S@k4t*(zU*7)Kt$V?O88*9N2IUp*F|D)}?Y8o|p;5;xG zp#k+|nx|z|==dc=W3WR7#GSi8%03$Bn9FRBL6Us+_@Bc)Vd>+cUg|dY7QVvi+hM7q zwGC+qwvI8p`v=U~j_X)V``?QB_|+dsLmHlhf&sDZW)vV;Uzia&W!r6Of_cFHMb)~LN|Ac`HNfY0zpHUnroE2t5@Toe#V&(}^NA|ou9k3M4n>sry zHE8fHO5aX*D$zDBs(dTDkm)`a)U|_HbtMPsU%Av7#YT*w7JEdF#|U2>u|01d&J5n^ zHTN_W`ofy9pi!&@XFGi5bEBk4^LFi!Y%t^ z|5sRmBYF1|@1BSp6IAS@qr&h#g-egm6 zKdtW6B-=S0_t+F=8;gK@g|hoDyU2;%=$%`QbL|7f35KucVY$OWBpU`JeBR}NZQ;#I z#(Uvq2+`-8*?F#D!g!?8=kqt_w9;4FbWlaoY%k>OMvxl)7Ds}#K!E(AHW?_!zsWPZ z5eC0ZdH8)${BxtT#ZCefaiSi@40HLbGO~h}PB0chs9lDx?$(MrA@0k^1NeXzLIFCr zbG!u=03J6Hw@;31u&Vsr?480tk;Vsl4kaCJyhlwvo^0bEhW(_L`KA~+ifthHoS?|} zlzGb?g%Ii(SWSt?ak;xa%!LG0{@})n=lWtkqz@eX46Q+e*A50((6*O*SI~OvU-@lW zo}~5&-Vpe7yPv7QGxI?Nv|;*Bt%ZD-owyQBnhKUqemR`QOF*Gt^q0?|(ak3f4W|OG zH?5PuCnW4pA}LBjHJ4*Yc|1$a;pIjzP&vu_=8?lPS3(?hQY70XZvP?ioC%O%9cDMn zrV`Tl_69FG2lJ&lw+*l=Pf9@F~c+TJa8}fdS74c2x1kNUi^jr2S8@o_;Bw=VUO*pmaJjHR&dC z0`k3{>6SMWypriwrA*2No*M0ic%KwhDQ7mMNP|v%w$7Q=Lt7|>BX*S<9t2Ob8}0<* zM2mlTh4|I@{UP1@HoAi8@_n_w?mbNE@6#o(U@B`X{e}=Ka4J!Sum3Ai!5T9Evu{i) z$*BF^6tEAWo6|UEE2By|<5Mq7n5umD#h7N1BQeVfNnE{=T2|g1{jy4~=HE_!R>r&+ z^Bh~IU^y;=fnBVyK+f=*Z*w6_yI4a5gqUllc~4RVLIZXEvx)JOE_4YFp$kYYOtGPm zULnQ5kb6>s!j@9#K|mmCg$mzVKSO-T?+dT89;1L4%TTEVeuXo22)2N0Py8pA_V9QI z%4Z|BcON6zH4jX85AfMC1)5Je-oBW&o!`TmC9d z@%LxjYX9yyo@B1LP1>?iG?%Q%IQy#e}mGJZzs zA29_ARYS(>^x8)o5D6xNqYHWH-p5MDJ1yVr`QCW1k5yre_}qUQN6)A;#g8sD??{aZ zH7@vjSjttWf8y{xn+klP7jjMC6PDBnR}2jk#lJ0Ez4{Kw95KpT=K;j6udj3I4%nOc zt-&7?__JpxjPab5;Qph=MQJ&g@h{^>oQ5UJycAx=Mw~7!e^ufmZmjZL0Yypxaf?R) zV-;z@M%6z_w7^g7dc-DgTA0h_Q=;zZ|e3bR{{#F_<(WW+LGv_iP}u1e%t70JfHMM_};nh?8YH8KL~Mn;^?8+SwjMpXYlYD&K-GpcXrzmGL3+S`nr`nM3x6#kQNDHo*a~_~j^+4yY{?5?ZO% zjqj2*`HeKKOpvIO}+l;a-*4u3H~_QD`V^EHd6Bu6p}J zlKefcRFa#%ppK0p(6j3#a1t#Y&>|^2*6S*BJpQ=FaGZH56pIQKL=zNe`?0FC)HMoW zd)IfX^vRk)@}$hpOjXR#oPjgQF?@VAFrD5Ft0CqWBH+`nme+R4!Tl3({Cu(-(I7kZ zZ$ek~UsPBzQeNj>qglc*(z~lm7{ZemRVlkGmV%z2UB2jLodSp~9giDH;8SGR~CY{dib?&%OT+9LpP>N3 z?{p%dDk=J5`C>zJASXykB}oE)Q8hyic$YAVu-q20);*de%v$`xG|u#-b+`ZrRdDkp zP}wH{eyDtQbRISLUmJeESNd0^Crf=@e`s?i5(mYe7Nx1(5H;O)NHPtyl`q`X|Ag7f zP_WNPAw(H!P9yxB9nI zk)W2%m67US<)=>@8Mhj>z{@&W!+%4fYDUhG(wN?+?k!0Dty>5;PD_q#*omr9L_3C? z!duEZAc>hSv1ZuP`O1>qHUnO+51s42p2+WcHO0a`bNJ`W86J|A9s9K7?bS{M;{&pdroh0|0CGPQ_-X1S#q9sWh zWT@Kuf=sXfLLi-dp}~Er5u?246_1mI#PN4ejS?|bf5)axZVcx^ht8oI8RocwzJg|6 z^$fs5qB5S=NQ<~^izZl#`o>nw#!~;Paw5%KsGu>hrX4XQ8mS#oqsAM)vy?=XJ?~?h zgb@FRD0{-%y1qwyfpw&G93Sk5jnwR_V65^zcAa?G@Wb&tEh&v`kv}=7dvEco2B-0t zhVIMoC^~FJKQ}5%zbLElAw@L*8(RGLH5~PH$kFd1Li_pBt6d>$2sGa9nJKo5pUde{ z+nWSl`8 z?NwkVV9|b>HX>wYd0E*gsL$7e4sEp91&$J%ZFZJ42Cc!=WJ;2RSah{~tW*}BDvnrM z8_$k@2{U!1>;Dn?{k4NNuj=0GnVct}<44slQq`FeIqZu^GgDwDN0y_Fu%5lJ9*CZR zL6$i>qr6Rw+{INvpaq32`^-qcLlL6xc#FZ2zR@5?{@rJ!;)i>?Wwhm81;To!e6qW1 zQQ`+&5Isj9d(D@G<~3(6`$0U6Nzt|<9iez2ajwPrw5gtQHnD2j!~s5l8v^wCrf%!6 zTL)k)rj_LGzbc5uR>R4Gh^Wf^W>`=J5EXxcU^5FAzsE*mm<;G`(e6^2Vi+XAR2{Ue zgqs&bW{3xH(7Jb+_)rg7(RKQSXHZ`g)-tuuZBqy)^+<0sOzdNf4Cm9Dr08EQr*CbG z@_lWh*^yx`drvwX3lsF;Ufj{XgzvoNbmPhTc7?0?iRbsp#EB=}VE+Z-z-8e8z0p>n zLPs7$g>wa+L9GAv=bzAj2$vRR8^k-hj{UYVF6=hmMfHL$@^GE949&CZ#4&~01>g%Q z{X);6vnZ#J-eN)yO@XTCwpB}ee;k_DM_<~l9Jy4B)L*MVZf6ZDvv0v~$8Uk|ZonEO zjOLxsClc@cm7bj=#qiOl>dL+PAiA9}!+eT>qeq)4WyYLu_Cp{p>A76yqOQthWl)jJ zpApnR!%HG!6R}Qx$~XsC5`v@rjrW0uhk3kz|IL9;KAZ?>n0;&;YgRk|mrpspB>8{esAZFo0MPcdwK7FMzB+mHx4c zpYei5hAkC~__ZlDYzJ}~L!3dD#a+eBTF!uw@~!cByyn<18aR8}^69eE;muPLP1B03 z35`fY-qUXFtzijX$P7q&x_{*!lt&Zh^c}Zbk8=WPhN2SWadk+U(+Tn;hYX$FQ;M!^ z(FpTD`aLz3tqKj!$4{_Z86F@PV~xiC#4@qSb|zqVDi)huvzNKpQ>u%0`{f|DR2QhA{7HCtqiHspV6s2&6sj|rb%%eZ(ot`Pmgoqg) zNXDtZgH)Zw3g+$L=C5vinYOiM%7DcwEB3aJ$i4Tx{jh@+D@$1)Ul4!dpfnC!x zGqNhm>BJp7n{8K?@6%aJc2Vx$ z@H%SZa+{(6rsFLjwVrk=L3c40qQhbNH6=nn#2aW?3ka*Hoj}byU^s0z8Bch(7%QqX zX)b$XBa^}0R0D8P2P);*rSwv0O`3)AR@3$;KsHA3Kcs%2NcnOY%e^>^q{Cqz*7hJI z7v9>I?7voTZ+I|X8Pm`(?udV~biypR@~3nOXB1`!<6W7vuxVv;0g*~oY+6q5ISOCy zEWICvg>#X#RqiVNkADqU8hiEz$NTM4CCAC%W&Oan$AJkXC8ma<4k>A`F~H2JP~4zr zP5T_xEH9@skOD<%n4M~pY=Na(;hI7W$= zKML1KTkLSM*<4Qa;h;Iz|AF9)9@Ei#oRg5twm5+EBS`?RM&_4Snj`OonG8uYhOW}- z*r|`LmX6Z?4?k~)_dkTu7D7}Nb549zmED!ZVXL^pDV$L6+FV66NtN9bS^2vCDa#MN zAGL9c;Si;W&_zQ+b3ZfHGFKcU!P({$`Yp} zt#@i=XG<*!ZHAK6Zxf4P-=j!J1B+WHPndnD$+c`va08T3M)9`}@MbajkYI+zAY^Yu6W%BI(Y z_aUEMEe|A@Ske#3^W;Gz90!@3rZtnlH#ruXz0ctD6@s zoNL((ADJmutp|XN0nlY^W>>EcK-95ylp5+=d-Sw1&lFum&&=7u{niq0`ZE?97T}W9 zt)~9l&=TOjyL@ReDR3^BEeE#H^0&inP`vG$L62=b{^yJf!#)J9$VxY7Uo^C(`dD)r zrWXmmykP;bnt2JJXSBZD9Bvw;W2mw(q!c#_Lxtdbb>vTww&b_OoE==OhO~{xRrsBy)Y$5NqM)|x2+nMm9!q+OV zJya;kQXr)*ixFkc3TAN>-m0YdX(98MPQ7$miWn|fe(e+LnJ>$^{1G17u4=?CEZr+b zBr5PgG2-daEv1qR_g&mgOdwj;DT(x1gx5al7y0o#P?l-OjGaQs}~^sEvQsZ>q!TGtY4AM5dxB-7(9 zsgF8g)QEgPN;ij1C|lIIWpGNNWY4U|@8#hHa%*ES^OQ&!Mwp2Y`9guE6LuElyaFG} zZptNCp-OyXnLn@Fr) z_vtbQ)}8*wDjo9-j0n(1uy$I6{~|oo9mbAK#;)Ugh5Zi*#-~!UsC7^N`d({a=5bCK z5&Fr~zYKND&)y_+lmJrm)~Nm~|Ev2GqG9{vCz!xh>y%pQw6-sSjcRa)ufkFBx|LVd z{I)p*L4{$EWe-syK4~vZqeQK?Dd%(K!^BXXqynjA9$|@^<8+5?Z>QNm7An9(JXQ6}HVT5BruF$lzcM06$M$Nx;firSv}Zf|Bve+V6N8 z>b^{dH#h_fHkHY2E0%Nq`=01>G#Cu((>IaO>aSon42(3u)gqx?xMNm~!4A~tz{tMZ zG`)Bau=giqc5X-Kvx&|QWTnC4g(I2R9h&`@O2(Vqe*(v+;Olwv>H|~sekmZbF#wye z@EtmDKO!iElBKf?)E8Bvz6b2=1{LLx&Mr`LPRcS>8Fm-tpDbi^IkG77(?UZRwu8qH zOcOb1?Q-UqHYor2nm{Yj)O$3)5whK)vw?64gY1T9Y_H5vF`(tA54b-!Tz&?8=so-w zg9yBgqxr4adL$A4fs97mfo_pcdc$QrQ!#7f0k}0keK{dx@jyz$<*;*Jy&hvC5CsYf z3(F4p?GVHH@`aMlVC^EbrpHZAQ%7v>uNz1%j>M%4un-J4K52JfA zjJIng*D*)ZA42oaAniw#eaD&)A?3q@DGwR1o zj2Ian_cC&%?6Yh_cH=63376U>?Xk5{M{VF^w|w$AC&jDihy9T38ErUM2N~|kQD$G- zV&y1u(ZYI5H(OGt7@SXbYI&sl`t&Kiso+~~o=0HUxYi#G4&3JkF@pVPd=H}UK)j&; zgdg!fcRIWv`9ec~bOx{Fo#x~}is!#zQ+bLdV2c#i7a|*P|oZllxbih$#6XyLX=HLehH^9OO@<|+5m0~ zo}RY`eoc-(-pYn7)63XI3>>NVvw#OjX=piiB#g1Uc<+G}#@andsMZWN4~l0^2-j_q z%wMxV2M}ahpso{U!p3fZWL-Thl5@LQEq6I%R0$4}b67*DTkHW{gx7S%F0B~v2~Z7G z=M{_AMoRHe4YuHxs4-c3%@vbiW1d z4*fC6K9ig=r13K#h`<-%HTDS{9r3crcH*p228!4YhbnsYAs4@a|L0_FSn6a(NF~a1 zeH8W+)WsG8D*Dk4_layc+=2#RGi(Te<_}9i=g3*_nwhzrsK4HqK-&k4rG{X&epebT z>vbY5JiTMOn|~If&TXj`h>irGTd++PV-%PVt*65bTsxx#o>b%5; z{dCYoo+dJAoyba8Y`1(Fh?mj1f);3g_90+&<;*(!3>_}p3;8Fq{{Qgrw{X;AiNCrX z(}aOtoN&$U44s>WrqUpx6)$w=Gl3jXeeDlxmZmpNrr+pYw8c#oxdF(Lnk4`CQ2)PNI zh{YcLTTo`2>4ewiTQPnR6umWm!ISJZb%1ji3AR0P$*;lhwz{3=;v#Tu*@ zF66bgdDF)*Gegy-CC-}hdpg=Ptk7eP3O3apTQP4xSMgmE6W!r*yIMw)54|@f8t*%;x(WoJ&7$ zLC@`!=lQBbDh#BB^-bpt6rL`7t_dBiP7=7PgZx#c(QSw$a`V^V)>xG_`e-FNSjDvS zEi4d@`TZ8=H{CUQM+)I!#k&EDS0Xbs4Y=R{v#Gg=Q!R`l{0EFD&dj=_0lFNFi;+rx)>r6ZfFu zGGc#)p`KrO0&*;;sq}p+B={pBJ&b~v{8H}!Aw|5j>FtK#O&LZ!2CCax;et>=?3 zAxB2$lKb>Z@=>w7%mk)V={-O48?p^RhUUdWR(AG?l&H0g<=p*A!FqMJ8aBA_p>4Cr z?rUU!1rDOeNdpJN85I2F)?e^FiYmGLrSmoX&~-etgpWZbTS33CS7trG^_x_P<^C; zT^<=gUxvv)lzw`wC2%expu;1i>m$#evN8zSqwCC`e!vNRQ?#mr>J+crsO&>3(_O9Y zG4a*@5~iJYw|da<`b6=1==*Z|de`xKo!KWVey!^J>Du`-9VhC?(dgAiy4v``R2)Nv z%;};9bR+nGYkU4J^4M?Xb9&Yw#VdNfE)qW~2p=;7pfz0eO{z2xRaw!B2yE_umHGRB ziD}`q?kYckfo*(3!}COC@4{*d_6F&%ozas>qB8Zt6R`O17Dffs2*R(#U_aD{8CRrt6_b=66wAH@3 z6ni|>@QELmHQwf7_42@@?^{yJ@k}8n2oTcl#c4V%Oy_w{$d(2ScPa)pm_2D&JzQ~V ze0)$h4FO*}E&6zh;0!Wd^y^S+89orzH~LS;D&$|62t6=7Hgt5{U&0z6pX$n7Y`AOX z-q4#d`aTuC$8$2FdefV{hC}svVd?72bN@oSaOy$g4*{jXoQ>)*s1Z{S zyKOr;R>3dXv8`(}VOS!QcVYTL)4wEJPWDgH7-;5C1k6_0}AMjR+20$+VaL=;FqQPEXliKM_EuI8sA`AgWcXKrk{su2ds z^UCws{T(3s{6UDZ5RL8~-s(9AR!a|SVr^xtuo;d97r#vny{@IT37(Ejt`!+Q^C$IC zvCaV@eBxc|rK)h1B1~2%FSO_8K2f!i4AVp|9*12v&7h$>obUpP_bb(Wgc$2r;mta z&dsOr;ry!tOmCkth3MI=j>P{8s5K>J?>9rd9~sP{`DUB3+PlJlTdmcjPPp1g5&y5sq#V9kwf5*!q4<0ze#z zZ)*c84jjn#k&Tz;pH^Q?B`{CdeWG6?{R%E{v(j5q<%_vE7_cdNFLjvcI+8o~lz_?= z_~wA=g?)afKrUvZyq-%kY?rZjM;I`7*Nrovv_Vec)2E>%iTYc~y@+ls^ zZL{$7?jl5lLZ;@hQJpq6d8LId@T5}Q^NkLGDqIRN)lPe^ZebSNSUOt53VW$)${FR7 zEiB|TXomOGgE0){d8*%v0!Key8K38}(yZ|&+xkgmhizZt`m$LW3@0c7%%u7Tk!%kO!zu%M->=}IK1Orkr;;XjBG%gYQa4*yOF3P2MJR!=*59VY z4Y`MU)RoG?nUi`TRHXU67+jPzu2E!Y_>^e+y~nJv0KTvHSw@eZ$LtF$SOliVR0`Yc z+h)Cn}4>nG6|?09O0kuEHMOv z&O@;}Sn#m_(tgR}D-^|DKZ1#io^Z)LH!^(9`oW5{m`96ov2=>lqsIe;;+rnY7JbU; zcmUMmZyxzn;!7&wK2GD(K&h#l_l4iR0!6v{#kZoy8(#FXX(Mua-kXY^am~P^Wd+KP zO$Q`6vriJ}%{(v9O4{lUJCG+{o2L!(ex$JsD(%=Ty1O~O(^oG5(#PcK=iMv{eCxqH-3+l6j2mr^wk39=AupjxhA33i_C(v1#bPkV?T$$}9 z5S#D4RKkrKdsY0R8#kk)~<0E#uVs6Uva>}H1&_yp2D1aZ^;qp=RKlIXU5$w+vS;NB+$X^#FG7&0~BwpZX~jYzufd7uavrG zj5ToZf9XEu7jK9ZRcI9CvL#2lnllxRY94q(U%^>km35XHJ#w32F@%w9QcxS zLOEbc5uoI~CeT-nX_U~uy$wpH<S*3FL^U4G>F~g;(j37K{Uuv=1?JDNbzvy*W-_Jg+$$CCd@^wIG^!u&)Tpu42?4S8t zF3OU>rzW(234|hS>&U+RtWGcDN9f(D5(=zNZ{kMvULzmfkNc3fTk`n{L58;@FLljP zHrvLW{2?#ZVDc-xWD^0>U>1|_oE%XtGln`(Eif)P3;1uz`o0iJ^Jv;j(_ls{m=vaZ zec78=Jw&~N_Mw_CCAQJaLZy{_+&Fj#zZpD2)HZAgY}Goe<9PF|_?zG$q(k-X~{y7}$ZPf%a~MKZXkDB?%E zJ6_7-z3La-K`)gJ)xTu!G(%p-h@?usLtb(388#!G`%T-MmSl{RdNuT-1P4HE!uWaI($_c|&1M1upv#Jm{ zcZ~!5uTzvE1LUhyGdzWiePwT*;0|?mZM;dO-_vUPu94MIrnPe{9wew;1Mh7OEM-jy zBJc=E$48a9EM-cMA1O{3aQl*@{e^^GPTvfB>EBv5aO9Fu)U{L;s=_6(ZGvXq zm>2+EC{HSo5I}gJxKQp17IxkeVV;`cte*HtbMZY{je}jr_#yP{WN0;l|I**`0&2?> zk)e3dx_75oPc&gPgc3(z^f|H`Z%TrAKYR$qiMr%-{+_&M}}ydGuiiFIj>Waps0+>I(E8& zaWe1Dny1VP+~}c{*mZ!ccbqjd_!cTdIDt1VtXRW z6haZ>OQDEQ2_q_?S0fb3+3OI;K05831elu1q3cH*Y*3tIAf2^OUBIF7K8H)$2Z$g@ zI^swO^8a!ZuBZRdr}o-t;PX=MS^BYm0?~tm8a8_NE+S{QW zB#z3RM$fI@%_FNrXvy7KsQrrhP@APW9VcPdj&bMXK24K>0M0bO)b@$#%ePG_?tk#D zX1UEvV*a@hq1tN>lpkt4y8!flObGPe?;_)F+C63X92;SydDBtWyR)l=bU$0d3y~g+ zQ&w08h6!DA&@3oFCdR*4pjeSK)7}{6dI%aWnZn)M+o&ov90?)+Iq}O#E7Zq&WB`aM zP0J~h=JuJq`pFUI_Bi49%SR;{Q5;I%uK zr+B@+U)%bghDeHj?EaEufUVeb6bAhXrXMq9sG^K|xhpuX8 z;gBo-@;qJ6bN`4CxLw$f_*@pn|C$gPtVH2No=3AG3l31Ew%Z0FZ-mDtPr;YsfU2Ip z=Y=d1UYj-=^54Q3B>@t*s~&#Q3NNOiiXyW*>r$QS9M(xBk}KfI^kF26Udn3C?Sh#PcG!JhgP zG73a$-L5e7T*-E#f9WfuxS&5;wbu%0GivPv=R{W?_V8<3kvErwOudNig+oQuAR^29L||r=#tcJ9`4Kl^l3gw zU0@7v8xx5^Msa*|%V&bkLglob%Y9w0^TD%^Qn!V@wfhOiC?k(1U3Z6o;`#t`%H6xN zkMTg`Q*=_2I_sT+scK>mwRfKiq7F0}zCZqwH6^g>P*IoVU__m$+Ea<`hl3F~M_b`=C{| zgxP}dFk3H=Bzn7)9q>dlr`5FlV{&=UPPx%iV#?0f&RSuus15GR$l^XD)#BvU^n$to zVdH%tlOHhc*Qd7*=+CxTykmW_etTn=FE5>xgk)Z|8)*iJei*;Qn~n~oUNv>8l?FY$ zXI`ahdKVB<-s{rpM1B82=YY%Fi5aOJ@yO0{(nra6|FTx^a;cL*kuNB8MV@)k`8PG# zjAb)Mc>3Aak$;41hM)V4?_|bDRZhq)Ue&kGLwxKBT{%?TUg-+QjcxZFm&U6QND7Nt z6`~k2qf&Z}ZHlZOxzzpkRW-4ZYSUvGj8WnqM?Y$}&=SY0Zs0T`+%M?`o2)3oT;I)| zdAk<7Dq5kOMU;M)Pbjn~%DOgI!{uN=?=eElK;1^Q{a04o^Rtey>)=3)M3=(H;s%c^ z|Fm7znCDi-R~MO!o&Jg%iNraok^zSJlTId>74f`5p?g)+$mOA5L(gGCp}z4O*`(CZ zeH&b{G5gw(U15qvzAr_(1URRvYfb~svsJd?Q68&ip-}mDo3^_Hyu<1-h7L^xBdAh( zV!5ir6`wZ24|fUXJT4L2Bku0+^Z2ma}Uc{YU&HA??&eSr)EGqG?Ma7_&FfD6}Z zid01TJnog_K-=<*0l6e^RF1;Hvr0#&3fh%QwZ(OCo3n2llSxf{Zt4a_?DCW5fOLoZ z1AVm%Z%5OFfWq~n(zwq{WRP=2J;o(4xfz^UO99oztIm~wnI0CBeb-)f4SU@Z>ImJ- z-L!R1(9KYq3#DR&Wo~c`VAtvQ3TBxf0MvfC+bqJr^=@}CroJ`w6EJg_NJY+SnxA-O zuVUs={6$DOO+;3Svh2FBL)i8&YfZAg$EX3oq9tuvtsjhdvQGi_drC$kh^p$Og54Yo zv11@Fr%k}D7lqhm%KIV4<&il}myZngYEJyx)nkMn-$=`nb`m$&ovyUC^s|wh`4GZC zy6>!6tc0CT!%41*xQss-X2R&vVIL#yHUq8lVCu)Nj1E@9|0TdR`b zLC>-*uSKhFo?B{SJo{WYqSbJcD=ipWK-T*wQnIP=C5x;CC+A&9rSZ&~Yw5#dA))zL zLC5j^)m)S22jTo0fSb8+e%y>R*pr2nc~*$vN3laxO|mKRh_5x5d7D^CB(Yr|wJ}8c z%qD0IE@{^Ae>7jhsC^80W?(_7o$*&b_!>Ag zQ(8}lOyMOpcZs7L1_EKeWOb9y1WqlH>qde>^KUEMwKuAjvJK*%sDQS2<~XeDVE=Gskc2gYa+pU@vu1_;kO z+euatke8f@i|8n5&8vl zPcClvjEPjG?F)5D3tJtPq%kkcHdaE=a@MXN34F$=UP47WTwQ#oOaVPCjp1B` z9osdoM)Ew%`#!QhANPL<{Pjif`Iz*RF+4_5OW1|r+OlEkDnF+%iq5xjd|H;7@#_oM z?As}kFv@*<^AF6cEZWmnT6LZio+M&J5MRNNc+^j_Fs^&2Xl9St0q*f9P(R<1ua zQIbkILFLS&{}pFzh|I<-BGSg2cs@UC1_+JFh-wDp*O3Klm#F`dv=)3arA`Y9p1m2$ zx(Ivr)tY*$iG8_#eYrec>3CiG@4Ii02CuiGuP^2||4hvk`P|d4hei)rTi{XD)b5?A zL|o*RbL0vfxk~vRN4q#UO-_PWPqJf=0JeK&qE@bO1J}y2zu~_(OxtdTi1QM8J6qB3 zI@k_4RD8y}@lHMky0|)QZ4N`-7Mw*m$+q3h1Tr2=N0P|Q4T6^S-Z(8_GI9pW4C8wy z|BXo==9HO}7YGZvUj%ByN53r0GD({jyW!H>bmG+_&>v?1_gg}w^ zX`77jo}7p@ZoBRlT}LJ9G-mBbOPi|!H7E8QQx-3k$wgW?V!{`?G1}p6ckDUux6K{S zM%9G>2fjc-zaCDHigtSTLTL?Xl{vs7mSDVg{v$rj3zzSuGZ#(cA@B?BCik-bHgks^ z_5>+2ch&*0`{lps0%Y#;jEcrqQ<=M#fWp8|mzg`8uRRWYoOS2-M9p6!%25~SEU%Kw zx+4qrNI=^1IqZS`gkRn*nEmwRsmS))VCLDs3XeivDwmm- z^|EVN=C0OP#amPUvJL;sROA;4j1l0RhqIQ4Aao|LHK%+tuRp&i9}$Milpj5t%( zqC(u9*31-1ckmzg-d|^ru*}r6ub)#eCE>rgp-k(jd0;JNTy%X$dET<-mze|6dBwql zE6-#hWcKo|TxrU|>)%CFgD;+5EE@KSyt{vg~7lFwlqkwk1I4jg+sm<9>jweRw1$-=-iQ;MPLM`#%3Ex5 zwzTB+7rl%o$4z8F;YBPcVyQ_1#8Ukr;01ESl!ch`N-7Vnx3avzOk}Qvp{&=9krc(OJ5deCxoHLp^sxTsFxi{ zV?(<;dR2BLebLk)I*QFvMcL;wv(knl92_4TxhiDoHk$2GVfKkd)a0u+w3$~cCw9Jqo^+8wMx5_ z0^+FHIu`6us7S@uPJ@4^#jmZc*?txxHy1Gn#heShICGZcm>3B2bIe9g#9MW)1#H1) zVxB@9TIMHFXA@iV*`xCLSxJLAJ$n%NMKG}dH$K_;ZrgXqY6 z+j%4gQa^~QcCS?;rcA{}X~qaHO8p=(q1<7-$-=GtRO1eQs(uh)Kv!4W^Mo1pvy#SS zr_b0C4?-XPoIa%SC6fowz`wr}&i8DRtYY%P%`0hm{p>*?gTZe6`B26KQM1Xj^&w+^ z#{wAzQq2Ku`@sRMA0&liG@X7{(zvXjvD*jFG|c%GfyJ_p$LVM7N5-;FfCymKpATjH z%=R(E?plxXvy#SleB{sY5(_Khn~(hevy#U5e#VZI1LDX&Hfg~=)(^6e2)~uYK2E@m z11|l~N*Z1=d+@w0?sdTnqn->eG!nc}KM2y}IsK5vmrNcc-wAUHkmct?8Mk1vcvgw# z^iMu-_8<&3D(EoOL@Li7gcn9#lQTVGsM&+}nf}!;?Bf9h_h%)IT=E$^h>YvIy60BBF@!1SpzH>+F&Cg02-adN}xKNGrAtBc$ zriq0hKPze6&j}yJ5knx>w37#UiAwrI;w3ZH=&4;hEx=9_Y;9L0n41P!r10Uqeo*p} zC1$3Mf@|$YH>!%y*g^W)F)u=6W~fXaBvlQ+a3zhqF)9UQwT#M77)3JQQP(qQVnTl|*-?C>P0b=mCK0~bg9s8a;%QiN@*uHw9CVvL{j4NT^voYs ziyb~B1k^-}okTZR(kS+4hwrEsTS=q5ov634yoSn$1k2BqG6{)4>upe@X8(*Gn9^SU zKPzc`$pjLKETQ0tYQS*hB*-;;ki=w9%nT=8$0BYu^Jn=BhZ#%^=Is;J;=5SR$ou~pV@FG z(s-yRA|pBCnx?b(*gAIm_UCmmqS!_+2m4t`<7uBkpWde$PMbx=ClA7Dzw%X1qc-Gc z{~?WhJbCaUq5bDW8D24=KX;3@!u$-g%{Zw?};p! zJqUaMN~MCmO)r|6nERQD+1hAnVv-v9v-^-nnLK&$BJ=&{Lm3axEJe%nx86nsr`3*G zqLvH%AtUSjoMz6?>_K=??`Ia9SjP@}V^4aL@P98kZi_r5_X`k(9_Sx*gv-LCaRGBlkUbr`& zs#(t5PCI2KaWrQrsn+^>i^K4e*@L83n2^0biNcyaNRf)T z!YpTX9Xr?_tS*@I}S#gtN835%{* zqK?Y&Gj>?nq=EnLs7J-*vE3|rZ1&(Klh1g3LQfQbE{uvs00o$eF7nXvKfLDCBi z^v`l;*0H1DpkO@=G0TdYJV@(@Huu&RHK|pT&zU`VXa7%p1(V<>sqX(w=*dfF$0px6 z^O|k6oRF1p(gg7NXB|7N|Iu{al{CuS87|<(9AT%4%$+?*`U#>~KRqL6 z(B9-h7M6dB^lc01B^BTCziiC-MT|0jr4R4_-Dltbp${#oe^-t1OC~AvS*$R|uk`Kv z7mwHZPri3iN{nCW+xIW2l8j&J+wlvR`2Np24DBIW}$_?lLp%3f-`Q2gtXX`ULzl)d8`Yh29=RaG| z$@>@E$M;X<&*B5SzmxN|c(sgQ3=ihN(zolm1k4$~(g*o4*{?-cIRD9cTzo|5|5@kl z{w|QF{5(0oOLnsJnefjNR&YL({aOGO=QElAk`?3oC+oSy@qGVeJr^fcew*;m5*uRt z0_eyO6M49#v&(N2{WY6@EzK8O(zj2f`I1)c_)scsF=3v`w=OU*Z(r%d*_!aqQY$Gh zO!jK2;dHMiyt70g8NVdhG5?i5%zvV*mue*EKRH`V60Gx?oR!7h@_RqKxRnh{t2XB| zk+C11vm`t*ex(n3v|js()w2ZB zoXzJ%3|9HjQ@Pp;4;=Sd~u{%o0UHB*+c~`fDp4; zkQLs)(g&$ouVrmtKfV{o?fkg~>G{3b${W%z+igg{d)bo~!Lu3F;NONOKED@nuo>0R z!gbWA+^8e{e#7P;e;0El-JN|%VWK^-L;}Yie;~QoQ zsaX4Qp>O_UNaH`=>=N`mlZ5be)V=yg(r@#w5xcrex=DK4CHrRQro3wm7vx28Om zylYJ3$S;n7dj9cuht_+Z@{f{ewR`vKyPKrEe*DF!-B|CEp1vz27aG#7c$Zffa zvdO*}QriAi`P?$dYW7vVyudh-`U8h`QWFW$>ZaA5q!r@t7|_=}I$Q1P<{y6N!%o5)cCH98cF%ZaS|EjycXDGl1L{+t-lSM zjK3I3J~DYmDYj_?6CpZ^q39t#z7fIa zFNOhBb0l=fW@6K1xonzR6fTTFMxEGIGVdCX)opE}&@GPNNT-$Tqa024M^=@CT>YX) z)Juh9=M-iER@z#v-+hqVL0U%6kc`PM=7Tuf)i07&k$)^yrUHgr-(s8ii_{Lr>@4gY zbuD%3`A0=9ESKHZUX=@#g^?4=LNW&;(p(&R0>?O2osg56eRNf6M3GfxlMzQ;qj-*TiH&9Zfuci;Ati<@PSnh@3Ls59P z^NYpejQ<$tM+QJV<|wF|5RW-SG5{hi79Y0BddJDf#&lj;30$}Jp2O9DM8M=1T`#5@ zoY+Csp%s*H*> zaV2OxAH6N-;KO896&?66VPB6ZPDZ#8$)w32E>tTpiJOj8xUiUn+8s+F^HSksJY+ix zNsidI!A8_c;RO^7z!~xvBizLv(H+?|7aHUAu9q331|}~Y&tjCGPK*ZyAO3daYQbMl zLY<~RbpKv(%oWnV6(lcDyB)Q2j)m(+Bj)@g_Jp^dM#I1+M{K5Wv}c)$aK&JY#dhRF3`|lx+;4;;GF=p_mrd>a$HU?M|*k;UTUny|MPOvr z^os~|B9(>!y}|U(JlE!J zpWjm;cyn47&l%{C6o`~uyrUbz)0@>p;s?D#E*t2ysNo8KfSq^?XF6&!>WmToJPFvJ z6do$X=gGjaw>v&ho;a_h$t08wN}1HLIdev zyMSIi9*)3%EEZm6?XfQ=4(X=k@u+&&*WJ*C6;|e|2lmDx zy#_j4YBb5{+p)-D(Re-Rw;hULm0sG~^MAGFbPK&GIkpZ*XJkWvX zsh*UJCvyze4h-EtvfC#j8u>*9n(XV%BAnK9$dI;W zYY5g)Rh{JRtxqpb4Pz=z#Gr-72ixtYT~v6Ara9Vz{=VZt-S$F_L=lp{h7%x8Zn!qr zC5_*r-ElKo>${QOH|`Zp9`yKQ#f*w?GckH+;@1u^Cq4%-`VJA9Gz3tpB?8-Zm@y@Bf1GU~! zyEn%a@hC8OuaeFx6=7I*93wBurNH@Go;U2PgxrUh-%;oHo%>|7>qKS8Y4WC=dm?^2 z+^e{RN(cNTT`5e=y8#-`W-2GfX&VQ1ZK2$8qwhqY?nQbQUkcijtsS?>>P1M!p)!`-KM5DAYQ^DE!2GHc26k9OHCr6wxXI>Pgrfa~5nc!pcxfx}<0s}QC zYlqvJf&p1ijBD>N>cMJAL^xwauU8a&407KdWRw*y9CzJZ1ZEbUCAI~5Kz=7$fPabr zLCaKEU@EEF3h-H1RY{RJgZqV6z6SBHnTS__t@lpl03{Z`xOm{wQVe z^1>VF97ze6jc>xUx#{a@a%s;!*NffPFn^)Zv<)#;!kvZ1jMcNltPSd{qhw~IqAP|x zxatnzGjJjno20uAmJ|aal{|G)q9F!li--y$HU?W^qQKRAYh8o@72vnZFDkqz5iOD< zEAeS{-^{xGh!w8!P*>!$=zCWi%sRZ?TUCbv9Y_82+FC(D@ek3Riw5swu%5<5vfvhtd~iD>MSaf zr7G)9F00HT^mgAD4v)c@wVCy25<79kouyF4c9;hg_9Y9p04esxH?pd?^){!^R7t$Q zD{-{uv=xOiN%jojTG%KG4Wkx?#bp|7ET;l57c4PN+U<()FKj%Ioz;1Jkh;flkv3h8 zd#i5gisM_sUe^GiWpDPRMYL>4ze~6w{myv341$NnD|?Z06Y=Otq<;Ag)<3xwFc>bM|m{isDm_sg|-i5vEEQ5UV(k78Qk zIGAwH>+dZ?q?<&$`miVQLHE70Z=Oo`kGmz=peHSmVNY5dj()v337=Y{?z3CDN52w$ zt{=6anf<86qUk1aSn`y5 z(t;{&NSv1g^Gc+L)4pFIhi($h?d>;h$*Ao~i)qr67MranIs2CT+K(zu$AXV;76-Z4 zigfx>OWt|EI7`Y)zxFl{YK5fzD1^zarAhX`Xs4jVlCa*rtCc2oq@9L>YAE9V*Ny8w zsAV8^lV~NP8`5a4B+RS<0|VR}qS5_g%ku0=i=Es5B2#@FD?3D;v&1+0Rb7y&o>cIJ zTzG&BAKEloiP6Noxj6S$o6<9rrb)G4ixb+f*J6@yR&}(0aMJ$9@zi?a}br?jM)PWk+F|Ta2Oqn(=t%WBv=_?8flD?gHC)JNTZ%;+S`zwr9z2 z%?s*BEojP0dNib=U%3T_=}C(h-Y=%C(0t2o6pMM2XEiGpkiMG$Lab$4bf3}+pL@~* zes`qSWu_CwWT{Sq%AQ@@_rl#d0}*vwQ@cgYUed?IYs5`MeM z%Q6pbq*$3+QaBKg{Zhivf6vn3rz3H0AF@ARlMEK!w93wP6wXPYZ{2O?d24aMe(Hh+ zt&q0=<^}KTNg7B?c4;?giG1{&h4JkKz89U{_o7{-Wk(9?`Kw+wv_*4teR*3UazCxY zD_CL&{ir2jrDrXdxm|_ZjdB4K?L@b?0BC=Du%ZJpfmbMc9*R=;fDvmhJMUbyad+PR7=L-W+nod2Ki<9&4Ypo%#i&tY&fw7Q`Nv10E8L1i7qGJn zsfB%$fBW6&o+(>7WVd3i*+j=RrMEAd1ac5db(9cs0P!#PNan;@^b(f*uU z%5->Ib$-99iq94x>_&NlwTH?z6|e`&h-_wmTA@+5u_Ed>xjs1qIz>26#k|L7+iMQAsN#kLaR*!0-)4V!z3`1V!xE|QUZgiV3i&oh_W}ZKjMHD)vsusOTQ+-9?GNkz?qvP@N&Wj8+}*$L@VOa#t<*Ry zGIcX$cI`1^8mY`ijtwsz_I_ zadfwVdtu4e$)X?S_Oy(Uo|1iTL}t@E)qnIZXFpucmV6w&Rws= zh>ynszzk?<#{Fjlo}~Xix~=+b&DsOLO0r8h)Y{g82GwG!?$+_EpM5ckNJ}p78I;XK zh!40Xdx2LC0l}N=64X$wrA@bAtwC(ZT8Bl;^t);td}s7mVHZST^exkB61S?rPUM** z)4Cr>R0v#eoVo}}XeYMTzul&`D@XdZDPSuDJvtMQ)*-ro{Zc2^UIx5Iuc9ns|$ET8EF{k_AXjs&S#)Vq% zx{F`Qvl+MS>V}54&i|sW-^Ix);;$tv+Q08>k!Bm(qIWm6!j1Y`jQ7pBMa*`z?*$I& zNlR3{CoNUM9qGE{0IsBjCGkbd*og^jMR*DXFmXdeuVkwQjzd63mXBEI`|ca}w1t5C zH9N9qZ@l$ay|3d!t9aO}<&skD@9r0bp#R;5b@#s^52s*--wn-6;R+tkICwZTc=%28 z+{weK_=bnyG_mO~csSzrvL(CV2GU9*l2*_MD%}!KlueGAByxR|IU& znGQ=s+c)RT%M(*ASe!@BSr&g;{muJu&E6ddd|wM|Zq8^S2RzH~xRM~leyJziobN)m zw@SLL94Pb=f;^jD#D$tW(SJvanDxKWaLg@DFsqdaZpL9dM-PJjy=ldF6!P{9IT|_O z?VIUSH_G|wTGlzVC1a;wgRcU-`@%=h|6+sOzYUI7aWzxg_Dd~6Z)2(o_XwNB)c|Uh zKgq$s^)Y4kX85Yg;u%GY5y5ZKFy%(tloYrG;vl|jp*B3`83*2$;|q565G7CX1)$Wf zaH2&%$X~lJ_2-=gC%fTpqLP7?Y6)4d_uYY`N`1SlqsaQx(f+l$b~r0kpn%n?nS9)O z4foz{6$%FZ--86*svSVrW{cS;`Py`J);n3OBYaS#Lo6n2CmFsKAm7O8M;WOfrCU%r zjUf@ZPmx*2P^|!_TX&+CkHX#{QYStiL~-PuhnE+;uX7x=*qf#%KP(lV>l$X^Wo9GfbC8LDIvS@ExAk*VO7F89 zl{uI;a1coJH!z;YR&%ED!9l}i2LY9RjRz%Aj>jrpr6%fgO_ zFkJhgZMpW{01so?;*dwH!QHq=93tc5;?CbX8Q%*;*?rh|A#jY(zF~kOhe!sj>LkQ@ zTc_e)au^LWSe`I3is2nP9;f#9Bt(u{!E4Xodl0&}H!z;7cYm@mWc^6r3V-*D;~WdT z@bxxjmy9W+$3`yev|tO*ekDl&JnL*}3z4E?n`clt$D85C9U^C zI&f?fG=K>zNwd`FGEZGE#L6UGmv4}xoNmKr0wytYicmmHX5W}E3sl?D4(1l@0qtVa z6B^QsdVDX7)Bj|<_F=0q3(Uvd-YB@r-;kxgC~}EHA~Nv!#_~-_58LevrZOw+q zb*Xgkwe7gCIaGY@_oCtYMNy!=v1!8*ha%6T>DA4`vl(yGca%Ht^EgiLPe&V#>@w&i zTAq+(VHBGwkVdE)-k$t-FIxjWUki%cuf74~KV49HwEDh^w2ZG}&A$qe>8o(KzlyNc zmzkSY2?qM4njHy=tCeCGib7H^fyyu>Cpyj5UG^5xsYDBP;b3N9?J z*3z;6-I`nQKY~Aq$$S;*6<@`-x&N`2!MESwMUm1_go3|tHxuq-W4|f3OBoeMsBqK^ z_p9KWt6=KYy3MO8+gCHnFB%CK^MWsIefqaj-Ec7(?QF`|*=#3UIovEB{4NBO89Gs) z6^j#tcxQ@<7nhkgO9o#rm_&P`RIRWKt%#6UXitS4U_nF=Vj4tiaq=(b`&^8lUW}s4 z47n5o<4|U}$qYA{Avck5xMhaaRFc=#u2SnE2zy+$^rddpw`CvSpxN)Zj1Z?Gs&~I$ zO_Wtv zwus6xAjiVOL2Y}h~{>+gGwrO%|6=$gbV|x0Rb3e$5-%mLa@l`~)#157YApK8RZ}z@bNk*-v z{Dq&8>Jtke?bcLevs)itbsq!YX+itVCoR3zH~hwmzkALXaW6jo?fR%|_XSv5l&!_V z(H5w)d;GwPhTiP z%%(T9kD}@A=Qr8_Y!t-~`Mg5Pv=;aMG1Ve?hlGu##0~zhW8WX=FTj#`S|SnpAV&QpMnad#25xH#bpKJ}wA z!%2L2Ts-~fqIr*fOm?I_y_IBv6c>dmha!2uwR7tEV^4Zcup#}K*t%7saUm*DDY273 zwDD9JAxkA}U<6u@N;3ZC<~;8&4F{7u5n{oC-j=Ojl5^X#gZ?9sVj zh03l#0S{q?+^&ewzE~l2L5k%HEyT#hSjvUNn#&9k>lZRo?iUj}i`KQx_1IW%g)u0f zzl#M#c`LQnYLz$cP0Zup~+s}@qc ziy;ije4!iO#S3^4--f*1yoYdO8ZNp>!X;<4U6PZ=G{3z1YFsPiVqCDlE6MSCDsC%T}~kBAPkJ+AF#Al~LLtw+m3{{X%f@ zuBDP|S2^lhDmi6Bl;&Ap3}Kjw{;rrSA|0jMD2~?ZWHyk5XCRipX~R4C<&D8L9s+~& zlVde2Wm|WY%_%RWd+Ro~nK@M(Z^)u>WQz=>B4g-KG#Ik~muv4M*)d%Kr- zz=A>7vMpW%_(MP*z5MNmC$Hk_h7u^2) zMI+#X&Pgj+oSw7I6V9~edYsYHe^%1qww}%5Jd4twJ%4ADI?tBOoUOt-Tb6rfJsxLu z@X3hi$&Wu7%0Jm%?Zjt4PND)Q>mg2>C?^xFOwM~-mljui5$u0w)ryLEDBhSs;TLf} z_0?~cuP!)wF(FD$jxVDvre`bL-elWb!FLT@-Nay3Qtf7djVdVObLDb-q>|E6I6NlA zev2)AYx-UVW3Hw#TrD)Y@&)&+dww<5q|mb>90B~yxKL+bESWqLalM~4iq4voXOrE| z<~5!*x=tRQlYZ}s*}p43HShOAPVst2SsPed&0O|0`ND0y$r(v7#59pJf<`#XLMZqA zapfR}gutl~GFROBNpO3e1fzLQfQ#;zd5tJKC-_(C!=R zx85y%TL?v(vk{$d`#xRuk6qh%7Gwfnisa9BPf&09AIdt&BC$a0BHm|_A5l2@_K*tv zR-_Mqfvdf_lF-jpRJ9PMV!}7Uuy}5xy7{w`2Fv@xX^8hQ^3$J{L`kC&#-Le6bq`Uj z*rG+kgKfCpf$Sz%;AC@60%kLsRyT~K}61iOkm##(t zFF3S8(}~Gm^t}x|1uVb@Ict`b_8+FI-v0fB5{jb@Aa^n?STpW%WL|$((jZ-rCOs4h zbJk0xmlGndECAGUvzOXCEyhw8y~`X88%lf|GWjk7KC;49)Z%JSC*iUvGH5T6`BZsv#A%M-@<2XkHUJ(_9bfQdHZV?GJgj zW~unB!uyR!Xv(!EmiMceNEJ>tsC6-~pvsr1K1n#jn6|nn*aLfV(icABVEkE01JkRg zZbysQjA`cTBhV^Ckm=e*x}*uw>0-uuv>O&Xfugp{l|P(MlaSK)9z)1#r&Lmp#W(L( z#zkYTqLx`sd;2W{+&aS-Pmi`xD$aOUQA>7KCl(fU8Ph1Rogy93ZZPi@LBoWWmt7Gi zH+|W3?PDHS&)8Kn{35ViELmBk2Lri^551RMgk(m8e#tw(NqFAq?YsR{5lJaH$U5(< z=*&fL@giU->m`f_zn^ve&*=X@D+$-X?D7qqpA>H0_m-@`0hxsFFE%r(@*mB zN*V;^Srhk+b8t7w>rn+CZAEd?_&%CmY`@cRP65^zt+C8hxL7GBmjsL`YDJ6wmsR41 z-JX(u&bbj>N^%w0&_(mR%6m0g;%u+Kvz_A4MPZb;U%g8s6qO}Lbt`tg z=zm)@vMaimn(3HZK{0{McYU;S>CTda*&20jqD2KDyz_7uw|Bf#>G+9n(un@&N*WmEYOd0?00~5B z-S=2{quPkcQ>XGK??vO-@Z;G6argD+zJ`R7uQm~5GriErCMxdWu$NSB>QldHR_IjT zZJ3b;+5~AdVbj=M*VCMly*YNGOt+T)cKUa_cr%<;-HTNCN7h?j)U}#=w_h68WW6HmE^d807-`ko$wgi8WKqOX)Ib%*(1nc~wvfTUid2dsB&iy|6f9r_Lf`38 zfVL-3P_>f=?@q-H$=;=<_DmuOKueL}e0J1XjK7>cD}C~QypxWxL7Z611*+(sTyfJB zLz-=cV{G*5aW;d}V|qVp3!MuV5RE*Uq+urWpOrLNI0nCB9jHKLm*N7Lqi3SJn`2L! z_~TlHsx2SB=rURh_PAJ9aJHs?C5;PGT%=?#gfe($84%a>q#vhg1xMWdcji}7Wupqa z+T+56;Kx;S{A$h0)x=2?4U#KCKu{DgX~Uzjn<{8b@iIr4u!ZN~Zr*=la4hTzWt(%* zW7|x=H$xSpDPtT`9O>LfeQs|$Io}2`{ zPWFzg!i7b9Ycq*$j2*pSw6ZaaH_3bECy1wAyx8Jm6582}6O~qEH=z2-Ncu_sFZ{47 zRoM)#;(8kIDa?H*#_ow7{#kLp5q|-9&uwmISg9;DtF@Kd-RheFLt#RjcW(a4<6QU% zMTEfGtZJLAr#K1EoW%8xw&Xn8;?MN)xGHQ@(PFYRXps#?`A|`tZUgO9zw1*-5=(GnA;>f~h+KC@BmIV~WGzSnWCZssZ42Nahp7fnElKI2M0Geq@S6xwo3 zkrwerQI(RmsT8Uq`$RS>GaKBL2AC-t>DP2M_y5^UgWM8RbfR*W6?gUun@(Lc17p^ zB6Y1uF|^;Wa7yZ9X*5zH8JbyEJ0~Ft*GMjVoV-3l*ZO`cvOq0Gsjg_SflHdTAb0II z6)a+uf@w`zEBdt5Lt=`0KF(&5R^O#>a`ZL=5u6-5>-gl)tMJ3603TH+XUnipdVEy~ z!|3~7aj-A)_e_|!)GCQ-_;RgSXLU1fb_9R7AqOA-ws!iey1K~!MX!>RR>{dOBr9q3 z!VH`q?U5kHe>=*I!q@ksnzP8hj^SNIeuM*J-(ZxP8<}Fxaj#O$S!0xeIj|2+p1T)t zso3cKgw#xmJJQMJO?eeC?$H|mVl5A1M+b4mqBmLVxz#DL;$B6sj!(~fEX=(g^4{1( zaYd1x5o5J!(-awOHXqy-SAdcXkr2A>u#NUpYp6T$RkV`(GNInGt#r*p0NCEfW2C>pE^OdYxO#gT$N`?t+=9CxXfFg zl0VEjF+HQmox|jrC1z^16`3OdIi?of?JJPZISAcT;lv1CAH~#;HZrRcf(yJwKVPAn z5Six&H{s8UQxEJ}aeADux!y2@QS$}b88z&FO-N6gMs!k_G z2PXM>S6u<%2_i&Y+|efz@4~tx$r$`y#cuiCk$2yDK{?YRPw0w2D`~Wm@zEYf<9LRg zZmxfd0tyQR307Qku7*to02QHjN%&L(_IQOrx0f#^zC;{iSKK>Yv?kXgk)I6awuobw z5$ctEahS=BIu{u{;%q1VFir84me%0V<6x~?Rn=*?^5TB+>IT(fu`Pgf{oi+)iTDX! zvz2Bf6d!1v2*6FTYc`S+35b{(J*Z^3Wt{;z4@cqh=c7d?JRLC zE_!iqQlM_grpR8X)Dqlg==i=jGQHEEsP@@zBi4+H859LINGVgEi|ZF)&#T6gt?rW0 z#~C?`44No*EBNCi@P2gXi(B5So}9&P3`J{PrKyW9A||&B)41s8MVfck_|@}XEW0_G zX|}_DopCg8#p;=uach?u_Ba|#6`P$hTMKSt&S?i4+-TRp_vV}+<6h{f5~|tmvFDS|$clOvx>z8b*gDQ$-i2F*<%N`p%fmx|WFzX%@o52~-+y6c+cg zii83+t&1dPgh6giZ)#w$M2fa&q^}Cy+G;v=(jc%WPufYhS`a%~cp#rgO&SsFTXma8 z5vKY7blppm>pH9@(5Y0s5gh;JMm6ld)ybjM{3B}XrRapXaJxuZNs%D_*sy8Is9=gh ztclP@bN|p{frvvrn45avnvzKKofpgNglBqR%y)?MnZ7f8N>g7cwBaz$232hFi(zHN zkmLU}z5g(v!7dRbmCXV>+}%&B*FRm+wIzmjW_+&tVvcxB{R%N*EI)Dp9j1gUH<5}$Ba=W*iB7DQo%Q1b?uE+la$jB1bqBS=2Q^`m zU$!_ztAC#=q^8fpn-M1xk$lB(`1vEv^-+5M-Nn)i&=IjPNywlys(K=dq%LpWpldXP ziyPb@&B#F0V8vok5IRe-@BXVfVnpdo>r)aJs{ROhaf@ag`)aC@b?pFXGGP=K}Od*{cz$|g2{?gGCn{-gCvm{V` zxU`HD$LYS>La$Tz`aAKFM@R{ktly2i(5Z9eWK&X%Fft>w|F@bsS1pO35`Euecyh1~M~3Wabd7XB(RvlS9*}*}VqcYX5Kb zaQ0hXNxL0XZm>YNNr|deUAof(1~5wfhx_6yX%~6LWx4Hl;y}U{zU`W+KD8^2`ug3x zsYmbh<}OfY6L{04JsL`n9w_!H+Ujx14urmm<24eDWGRQZ@ILhbi&g|BDdA*Kd zVp_19vExi_oi&*wPV&>&*Z%d!Zmn|aL&?j16mW>=H6 zHEd$vk+p6?T4S#StP2jkrGT#CY(jQ)YL`v!f?6im8m-fGTPcskGYlw)<^y?LUw+j& zX{7X}8KNvOZ_~{fsOt`z~kx9tw{7?~VQ&Wfqd0WewZAF?;Nq`1vE@(afSGxuijw>)rNb zNLjZNVBa@*YQz1;5f(DgbfSVN8t3;0R*v0Gx_VTwXV78i)62Vl4Zr$B-t`{PzXz2w z8y8`!S@(uCzy3WY8yuE8S1+dbpU~bIt6M(%(!j{=;=OLpesAi3Z0aSOr}mUc{UPW7 zYMKmArfx^a=V4v5ANFeOvy&PnSp4K8#_Zto{!#IAxKK?7ZkNJ`?LooccH_LhU;F5~ z`^ojGJw8%De9s?N((VgZ(q2t+_>Z&L3L=C|#}D%q@^0)-ef=(NDx2@2#lz~Aox2@y z_#uYqbr%8kKki+Am89%wemF4p>Y?G7yauSo-&3ii_|LAZ!#B#BUaVnumPMQZUqGP0 z#2@W0{C+>`eyN7XD97^DNHHAPglNXdP1McV<8KFMLX3`{&iWsBudV!Wlsr}ve$_Yc zQ=i&(Y+e0+lj~04+koGe>p-#y9R7;9;;GRmT;4SdzXJ&eY#5Ps5sl1jmbzO6 z^*Hw6LfMHik)kd_edSV9vZwag-I&S~dy_<6{a&(H*M<9?&P9~wXw|Pj+zW5(>l?n` zUAF@RpbiJx*5No%z+(nadFqa+&F1jKz5cK6&E7**mt};(wA+Pp9Fp^;mv5 z5S8l(?KQo1U1;BQUJw=+3R@@KST@-&#*EkHqGnanM_>wQMq*3LRk)t{Jz?tI1q{I zuBsm|dwY9by&<)MD06t1hNyY9(JWK9a1Rk4NbtlM<5kzS*K*WF>_w{OsZm8*o*G@k zbyxR{NPSAlblwAd<%h7u`zmQ5Fx9uK0Zw~%_V9LY)d|7$8U>W)^&@OoNP8}zQoKMa zv@!p^ZmIXcwZBGW@9;UC>*&(0PiZ-fKyQ7jv0uGEdz88^-q3`fnA~V{ui38An_M?u zd)!aVi4pS~5&ZhD9b2S+^&ZQvPbs^!I4^9(>ujKCOz5iHwWmAk8dMttMyN74@zB`u z1h58lM*SXLyOUACi_xml5_ULje3ee$=m3sxm-<0G6}L*Iw`ax5565uE`Y!HSJR0wY z7UvjpQQy@p0>=4v!qp$DBhG4)QE^gt)xAGAAv3RwCp$XA>$1GqCu0?R6?ggF9;Gkq zbmNnhKzp93CWtd8+xSD>(li7jHcqT7w_oSg)sI%)y759hoQc`wnz8evW3=94)zsdC zULI0J?B%TG8I^qF%3>QBt_%Dse&qn9uIyous=GSc*UEjq<<%4daa4N0&5GP6BNjmf zg3V6WeT*XXdUlQQ+lvJc_gl+aC%{Fd%T771G#}WtWnH74q%LBwc&J=V@HXn!3#W=a zD+Wg2Rr!x6Z|Yv7S{}k1PHWs8`WWrs^=k-Wro2dgX$J>pK7V~)n8LCQmGcSG7Z2_4Kdz&m z{lHC4cmSC^V7e=3nm}!woB8Ey!3IJab8-zW1OKRQkFB zBN13%k8pgC0Uw8_)ZiGIYv*fwu?F~XIruStD>r=aLRTr_#`%2p5+Vwx~_FR2xPg&Hb_B2x^?b@rZYfpdFb?tHO!w-Mu zNB!X*-l?Q!CwB9tE_HWx>g)IPMsXyE`$zf}L6>xoOj~-Xj9v`c_wL2__AN~rKO4`eO4nO3xPrKn*o^k`n48!^= zpBlZ=^)PlFTS>d!Q%QShs*?Qb)O!A}zA8`cj_Bcc^D|G{3!*`2z>6gLHOJ~F?gn8! zvR|23ACkFF&9Zi_S$?>OW9xzKA;C)8D@qO<&l*mOgOT~FYu|GY_4T_yP)U1?v;Id9 z@v4{_J;n81yC|;j+C#gQwA&$vQ-qrpNdx7k{BAe0>zhPbT2oN_dky{oLP7(NW*z9S z^>w?|T1m~t=3aMS4Wm-$yN&?Ufk_$`QS7<&BSG*ko4=dkzDGPk?K2~ z;qQMu+(e4Ma}!}zU%$Hr_3d<>tO<_IT~A?Mnh3(WbU=g#u+p-}v z3?NU$1Dwn9){C-Z6q6tL(1S`4Q#t3*;&rsc)z|HQ=ixsnW%h3`Pwjs0;nK`ZwwG5P zZ;`ubqjpY!9@F)#{2ilS>woZ{Hax2#Kcb!GRoX94iYeD;!%|m}+ry5O@P-{_z0ury z*jJ?32v^nb-W|nyE9h2PpWq{|PntZl*iJprbF`UP+_6EbVr!3U9xm+MRI**pMp=Vv zoNI!J7}Ma(Kaj08cM@NiJ2SSJ1A=NazSZ5{vl*47GT5Wu^(-3$c=(G|G%EY|LdC=J z&TaIY&};UU&YxVbMqr59vYiQHD#Fn#97AF1cG$u`tmR1qWR~2R4o*GG>pU!X{0UOk z_77Z}L*DZoE|ZkeabJ&A#(Fjuk|-;iOu(cVGyM*CMMXBO{>n3A!EP56ZhnGN8L2Qg z^=zEf+(v-9Hp>rgIIA1>miL1upt*R}<$ltPxY?u)k2m~hv&iNUxR*k0M%mNe7zPAy zB{U_yFz7L)8q)zU)aXwbq!CbBO;4aDH?D6CuI3Az0+g@UYtGCc`QaZuWb0LT{`V8= z(K`Vzr`o8Y5eTSU?gY2>smM+f4Ldh>q+TsBTcXb!1EmpBj_TfAOMffkVfI(UIy9x! z9@(zKW>2jicC#^79W%P|w6|Pb^UV)z3}-hgTkMJjgjtP{J%R7p7ALzpXDS!Yb6x1K z-1M8@APhocyuT{6vIO0kfB2uHsehBv3e11>6R(Sk_n~S3 z(D+c{Rd~sU|?{nhOX5=*&QUPhDyK zT^*a3h#ppfXyWSw#P}GsjX41jTDDff8d{^CRkBa5^+ktZF|u-}D>Y#QqA0mojRn)( zgi*D0utS-r5Kidqd~NfmX85A?8iP@a5;1sy6Y*?h#TDFv$P_i;6I`-&(G(PBbX@== z-CSEP)YAZx^WDN}oQbnu*GJ>={A(n~Kh4TVr(_y2>0p{o{IR%2%lNK`Hjs-BF&>bJ zv)`!LMeF|2*^4UO1Zucti=NEGAmqdUdDmONsfDkuVsx!l!K6$Ur*a*=fc1w8OsC%_ zCy%-msWurmw%P$WoAfe(0@PR75$*o)QV7+(-n8FuTG!15zId6ODU**hR3fVRrZ|1h z`JkJs<5oY^xpyz!t%*xIz-hh7**7iv(Svv}8?@mT4`qzIE5E!qPbpmPZCtgnne^hH z%A3Vwc>ph%`a>1$KQHT|wdqXp?dTL;I!19G<#$ct#g{pKJEd#d!T%a1qn39l^p=xo z0#Kg%Q|s=bnjerlg%O&3+31|EPpMx=%}jkt?K+Ci%2Pssr8vdxgBPrGI>2;Z9ip|4 z4zGH1x(vUJ*F?0N0HdCOw^#kHpV2uybAADdbywovye>DD;?)~^^%^umpo>?}Nm1*_ zEY_1Z4Hr$L3-V8U`U=w8DpqK$UHIsx#u(^BRmCd%E{)IUoUqkVLhIe@*(75`s7XYk zi3T>2vwux+O169`ZXHs)Ufk==utYlAB|nYl~`n! zhgsH}5=JQT)sd{L$b;cU*VTAg4Hw_d@7?t}Z#qg%+{0P1Ym;+mEc~aAdxCO}aik4+ zmlsDXel<7ri*5$#niSVV%Y8I@AFLUK$lWmSfU7%rBW7#woy7Rhw8}wATHK;2P^H{- zoGx8(#dwQm*Ii$HAR$$8$J~R&NZ7(r1X(}PsPDzd>S!J)KU8JNH;K^UxeZ8-df28a z2I^dS%JEc*`LKgc^`s!8$(J-K1MNz+?m*i;uqr>i>4prfgoAN~dD5hNIya{Y{5AY_ zZ**sqo%*MYUktPin7+z$I(Rq3k4;%bS16**voz5qo%e?sgonQ9UGwdx3wX7nHhx5t z^6s_=bgS-pFy)xer|Vi@P`q$LrntU46~-I00wN3&ZMn{k@xh z)=kT0Ky%g$(L`APnTmeMcTN3P7YX-#4YAxCTUcLj;F=v)uf@YTI$Lrp5u9CuvnIr7 z^R23`31#Vm+!|)p(7QIyS(C$SN|%~Yaq~m1ox9ffwJ9UiS#B~*O}#=BM*L@<|Dn@( z(|x&05+*+}Do576Qpd`&=jDm^Bp&sWx>x)L~kyYb!gS< z=)D-R`bEZ{Wt!&m^sokyN8L~Thc*|2_`EgcHyW5%T`or}tOM-nph6L-1GKBIUgIuR z+%r4eP55**Q5ttmu1htdk zG)h%Bw#g36>(==dmVUi82Bv{bLmQ)ezaEs*`HV7q&&|~@x~+e|zqT>|o>6TLo++;m zDM^Iuldy<(Kd05XX)piXl+yj&AX3r}O}qJ4*E@Cer*?LJ_j`Dehi2>fhrt#Hc|cO& z>{HWfsEdx?6>@I)B}`tiPoAKf-`i& zcRp=h1W=F(`u+;W`azsy*2U{ZLy_Vx15UTqegXObi^QS-6*z}|w;x{wlTqVcwolUQ zBJz}^OaOPU#4#FuoAtl|%?sEuJ36NG)N3HB!UzT)c7k<{y72nhz}S9s%LhK4PeZ_E z(T|f9n0^)*hxr2&El2u^dK24m{$Vb4BSt)Zu!z6d2z47k(oVbC%v=GeK!fsK z#C-vCK$*%H{;Ifxj6x9zjTF2P_ms5y=I+fblU6;H(J({H{TlPY3ke*Rtkf@@;f(Ty^Z)zy zVb-;GaI-)ojdqZFdD-Ud7K>;wq(=XFd6%0dH;Cev^fzZH;N05a1Bs`)it4Ab*!p4- zJ*%9Wiix8Ggz6=v`vS;D>M}KkEK-{X=U3_z2 z1>kYqug2Tc)Q~qqHK-RFjXLjEz(rYv=$|Q0@*6R3693eA0|NUC zc2Ez)SqWD)&P^~ohfpPU>dj*jZ?T0VsgMZbgMVQ#idY&w|AjQ5$Ldo`<54MHp1KR! zdeu4`1HtPSI?iTP?;P$dHvR<<_ATk#+*$skfLN0iVZxQda zRD6%CMz*BPpg~l*)U3;IY~XT%BMsj-nh>S!_@6`~loQ^^(c@b6B_EXO3`&3|CL>Iz z^9`~S8UVPq-^4{_a{Xq<3$2bEi#=wzz@?6Q)T&H$og2GnsaLYkz_d-WC)?rP*R`rKaQS?D$pDp zHaa4!d4yAtfm7ZMgYq|Gl(~)k@P=`h2)z8P_hqu+TVZ`L+lWHA$5^XP zn8R=t#$99yn=@*R>+LY$J-WH7ymWT+t%|dXK5ue^vY8 z0DXmyL_V+kp?R~>l~b>WQMoaCqxKh&9C+WHK{NnuD*rkNNfi@l89&It!05_4yk7C^ zm^N=r8vK=3%>2u7C^DVXH=1S+>*9wt*WEC`67==_2|L7;Bj|f0EFW2@k>sL$_E6$Sbj{q`nNv{TG=I#=1*7wk;^0vwD-E_Xvh?OwzybCdT=8KoPn%u=^c1829 zJ5iz!YybIDCZ@ayo;JGpD&rU+yBQ$A;UCBBF^^)ze-w$2sl7F4^^8(NXzO(#?661F51~+ItgA(QyMDpgbihYHyMUqxkZmIcAwbgg?t)JRo@WlBjH1-CeJ7e~Q{#``IMH^Qxvg_w$w$(=BcW%LJf64o z)3kBiu_Hey(2wopDJY!pah8Qlmy}OLOeicf4O9yU(pz2slJsew8uk2zxg>pu{S+PH zB#4)!B$Ln)>gP8bNORCTIJvM}14%$$cUU6MrrfZs7xuRuWEcXE$KFbX@53b<5-QKKhja3 zMP$!%A_1WJ#9wy+yCPK4R1HaO*1GM0b*pK?}fhm&r{1@(yMuDU{_bA zq%|&j@5f*qoyBjO!CwNYej04mGrhi)} z7viUx*+wKZeLiYh`{zfvtlaL=?pqEGnHDvHHQDrrj`H3j?MKG6h`EMz^YxgoasFq^ zMM?uLb~i*kz(=d4q}2sL&u0`&SJ}vgjY^m;km&W9^lC_>M7!+O*qCbhaigN1O$ary z1uN5yQpP)pE7$WfvhbALb^#xmn&XO1{qEplahK|XGsYdv7-)~ zOZ~~LOW#7fz8}i@CW1f=n`d5F2X81JpJ`C;yV%q$YomBD6ix~rNhv;`ZKT9B5apw* zq)47->g13EMgGQsG#5=({6{yE6M8U&`q=jaC!B}X2~7tH}5EW z9A=oF`T0_&2%0LT*?S<5-Y4QZiG<8ceK+|2PD#mPXOWTB4$|Zx`Rq$l+$iiH0bO$4 z5mna)!j`V^WC5r=)fGulo=TcKb;ciKtMln%XurU|{D778hLXE!h^v{-4Or+$T%v3p zzJ2$U9`h&)FY@PMSSJ9QPcnz^r@vJ3%%Qnm5-kPS*`F=F>Htbw=I4(ziCb$h z0%`@*HOR~tR+nfNfsWC0QJwiFk0F5QgNvP@MssJe=Bf228?Vld@y5Khud z(&sK*<3i9Xv0VgPg8e3r8rn8O+X&lSKjDOUq3XL?)MOGe7MetL6RXChN|a(|#h*XY z6ocq^RNs7zey_$Tw(e^{q|~RZp%nA@+uwgMR=G~iZ03fOouitfXG#YoeHzke_^Wo7 zgQ-TdQjuc~AhZk{EUG4Y&)wW2l?1gK+KMTUPS-p@ZAAbY@b1#mKGnqk;PddNr7B4H zk7_0@bof^CTe2-gsbz?dLMyE#C^qMjzI1y&9SPO{GaBD#KP|~89BxS;Nk4z2Noz-N zkuqs$IcT1H=_nblwJOR{_2F5WPeo)FDk!ul$bm0gRI-taz%rU#(YtLkm-By&@6Ed` zW=X-D0Yn+zl9#u$Z&NP76_@k{-YAkLaJ2;48d@@iJQoDTMiol?DbGzI;pPpgMxAYA ztwDv%I}A7Y|g9pVfT*)nBU#2y-wL#RHBVUoo>jHI7G(sY{5&z~xBNpDF312)Hs ztVjvv%(YFy7M$J0Ad!2`Kuv-kD)=TjjpdO{G;+%1bO1tqssmP63>vL9c9}qk#UR?Z za%Ge}qF&NxpfyyZvI#6VylW}r09`4XWFg-4GW(!s*Z6v~^lFA>BI6CHpn((Yo8x#o zA&u|JjFq21H9cDljk0cv6JfR(a~iO852daicjS*W=NOwVEE1}TxEg1NokwTTI# z5Y|p>*zC4;27qQ>Q=`F5id0xxKhX5@Y1%fWsP@N3CK=gN5nmleb8W^oHVrbG=8h|~mh^6(it(kbDJ^!Tl{<(&i&N+UO*JB!q2ByU%xUI1 zxbV{zS8&l!c*My^!}P|BQme0)m3^(sh@po$FwlFd$77gB`Id444(MW#!C`A3OT%B1 zGJ3MVVA64q8M-$-{jH zAXGgMqy3&o0LR$Fhn8sK6`Ipf#B{LQwGo}fSd+uFD%{D=r)IOvtB>hH)k(up`x)a4 znqn0+Y*SP&DfwZ-y#qI*%3Ok&uYmwokJ6f{fqPU%ry1LUXjI>2lgrJXxdF*qUf+>8 zfyA7t+WaF;lFVn{i`B20X>U2S9;|hYDVrfn)po^LNke)oy|j9YU(%#on+|KM1=g-w zKo7#WKsv&3P$Z=nOuN%~q7#nOdPDxCAvpv7?WFjZq@+TL$vnDN5tCU>Qs88i%NE4% ztg~vfQqh}&VG0v327XNuz9q%mCeLvt>hY44G`4{}dwT~EV%5=lhXa`S@RSa)Qu|>Y z%VGzrq?l#A{;55kxy#rlT{Vpk!_`EAq(JDQS510;nmp*un9%@|D(0J{kEHiqk$rb} z#$cernGZ$VL(BQm^olj}FD>a<41uJF!mOM{x(FRYo$p3a!%C@KY@A9&&Y5g!s{aSu z%ocGoR$pH6Ip0?dr}ver z>?D-EfA*j`*f!mdrVu0zpwokIFx%T-{Kfi|RYTsav{}Hd*3xWEvQ4TPT2jrr2Nz3s zuiC%Yrdyci)1T{?G&|tpZj7M{g+nEM;RmZ&x9fVqoz?BN%J9*QqxY$$$x@BMI%O4B zY$tDL?H0L@;QBU|#nc{*xdipQ?Kd$t9Y7Gg(9v;R&0B6}f}OCCq?Ar786`a&v%NTL zeraka|20*Y|1e*+LNQ%5XEyo}555 zHxohww5f8xfpK{yAq9?HclgzK$PW|El7g!??|nv05|m7k0pBq+OYX*;$->5wdwNTa z%59!|D}KB7>?V3;OY_;#uA~%B851VJl2JCe;1?rwW1wOcNR5Q%8>0=`*oHgr8kKjm zf09y{W%-PjTE`fyE2T?VC&3JAditboNQP#HrR6zp{@b8wYMSPZTqD=%c@q`O&i)34 z%MODv&8*0erg2u5OU*I5W=yU+7=}%7iv;SW0UWS(drTnvd;QNJX-aorJLTB0Cnwn` zM^)8&_v6RNp>k~`r3Q?OpT#DOWbrLUI%zriK}f|0ze0`+itt>2&{=(E%&ymB8=l7X|A>6+1FD6e(LJ;q{Z@Su++vt%Cb$TCN5)-G={Amz6o^9 zN#Z}!TS`UR*2sQ)GT9@^0FcmxeNh}$8HDxFG|B@0e z^C>%I2XuY8d?U3}l!c_VV_$p1pG^bqKWMSWHSQw`HR1je4_`>#0ToqKl!CTXk}9`+ zDMw~`!7Cp>KyS#9W@nQ6ZiQ`-HcVksdGvGsk|t(9H;s|{0P<`GDKw>&<_Kh}i@{q- z-?^n#?yI6i%n5L=Rb5RqT7ZYf0gkzjX)ehDLwoN7$V_7UX zaCFP-6N|)~9s?1|wvL%4^^5d-^g9#5qGWNv$5(;T;NhZ*5?4Th54?{eX$H7QS*oPq zSRf}K{>O(hSJL`yjHiE%+H7c|O{8t5DGkN$y4tNH={q&F9-9eaTbq*dnvX3Yh=Vjs zH!k_d>cmKUT+hYg$ENr!F0l@~y^|?GwT#eosoiT4QUqB=Gz`$9uCr$_TJNh7r~Ll4e#wR$-94 zwV?w`sR~l>wNE9&M)I#AC6I#4+4eG?nrOrsCp{fPra>B7%1@OFmgl}CeVV7n^suV9 z#4GEn1?;W5*=0NicU9$2)o8|!s8B_C9?r&w`=)k`#Cl(uB4Tr6^G(@P@W^JT`F|eVf$K`kdHjac+KvRhiu( zDS^cKslW_31$$h??lkS%@le)9*rP?{wr;zzPQgkAFFr9l7L-k!Eo!Q>sRq<%+UT&~n&4lffl?(0BS>l^wQ1jA2C8I?=}&Fv;bq zyAZK=o6{u)^TtS{9W@WagC9wOh{bq#7>Zv+C6Sc--b6B;xzZ$EPh<>(xHzl8pj}#E z(Y1P_J1+u^jA@re*j|MHy*7<-`b%TLS9#Z%D_*slz%YOC_p|kHHR(-L-~3(aL5W3nb% zrne+*1C^eiOYh*9HieIyr#HZ9|Ij6Ha>$Y%m`SG;myhr zRP?GW80|~i$da_5Khkuwy7D!1!HVX!;U^o!)`u7j4>mI3*_vWhwf;Q5q=_T`{xG7g zFG*<{pEoMA$qW}5344mvAt|PXjY0pK4(fkRAEX=@JInDi$&6u^H?&Xp+|%Y{Nok6r zip2Y3VYP8i3~&thq|oOEcr~2j)utq~-EqixcZ=~#a`1#t@M_)R>! zbo8*n7fORa7q4X3AZ%joqDO2UTu@jH{n;FQZD1!wrnd|+!!@h~Gp2Gg^wL=k3U$#< z(yw6kmZA4C&Z#<>2B&-~I7-y9J!HA2D0k7XUYdb8wvRj;Ur*_h+3-k>^iX<~XI__1 zPR&Gb!=))8Q}te{NXVoNwyYV8bG3@?+O(zHfHtPQSJ$MGWdz?c-h^8!DW%}rW?aed z_|9S=KFqp4WW>cBsHB&qbupmZaGlKaJ~f@fP4n}Af!~~)RvNR73bM81vS!S>?V?vm ztNgRdKPgj0%3u9>rPj|MX)fon*JTV3uRgEEoMR|-bs&sO+pmz5*G}<=izOZ%Ntaqs z@pNoicKT0WKM~i)>VdYExOLAp-a&)uHm2K_yB#^lg=}ffJk6#}^wYJDJ_M6r%pi6o zha*}Jn)o0Irv-mL8^^7TyClv-LRK{Cv_+#r*aZQtIoS5OW^kHl9J`<|;jUdLl@ahz zQkDI`)?k@n+*GF-c}l71%7Z1Z= z!-md_`njZs&62{hKL?ukKSS8u23DOJi?o#V$=zn2G%c+AU(FsnY9c&JT>I zP95#$yb{hHeacmYnsT~B`bf%YdVjr{4+|e3mXI$-BNrpkl2V#RY^zVin6@`LlWO^9 z+>KTBx%&-Jfx&_xNpS5_8h}%iR&*VmhV~`{6#M&EMjvz{8pX=)lyGnj?gY}~iI8c0 z2y|vsYGBQ+ShB3o0}W6M_D5@v&g%*!;~-5@y{G+*(bxvSq(wV76RTR9Wl(XKHMW1h ztr{m*06uh7n*e*4OtOVz5#wNS3gJ`FTT+<5NhX~dT<^2iZIqyP`$dF~faq$=H?)h* ztzNa))mkj!Gd?$KoNt24OIkY!JF>R9XjF%f=`z*)vY~m53YkGiJ`Yxxz_*%J*SdWQ zgXKZu>HW}2l=NwyS_B=jk}Hkjgn1=JI5*?9q@~)X!+Mg%_bfmuQ-Jc3GUiMbfh#GX ztiRTOF~hHxzh4dNT+KIkq^^;h_>;)sDR4!e%l?_=W7Q6d@g<&aNXF~UZJF3liponO zoO`FU436LJf|Hb7zmZ*K)WhJMT%PMeDnnAP2ceL~`L-QNHd$cjm+{}vA~v0*wYz<` zxIf!eZBr)4CC%^&FXW!&st%9_y+Pst;G4@7< zR-z2LWifD3VwM@0k(OYV;0Mp9kVW|WW+1~=PLs6CwJAHHGDjJk#!YIC?v`Xo3Rng) zZPAtz;n9|F`ujk)SUXF?TDpfm(!<1+q*PtavLH8Lkf!Rlj*+z?7fX61tsQSSBgp?X zCE&Ke#_hLXDW*;nTWXN-d~P$-o5-WcckzLmQWvFUM#?MY?LtU;P*9yc4pmL8-*;7a z70MpzEMC&+2&<)!nzt8>hyeGEn=$8J5Y7QZ?Rh6zZJNMD(g{onx$m2khHh3e-Hd%m zN~t}szndzSlsk?w_YgDeVgJ>`>4{#|RKrjr(UGjTUaZ?#oPncNvo1|BhdoWUIpt

u3#n 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 literal 0 HcmV?d00001 diff --git a/data/init/kevlarai_data/users/kcar_planning.xlsx b/data/init/kevlarai_data/users/kcar_planning.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..40448680a0c469e153417ed587ca6fd8e0482b72 GIT binary patch literal 14751 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 literal 0 HcmV?d00001 diff --git a/data/init/sample_schools.csv b/data/init/sample_schools.csv new file mode 100644 index 0000000..9c69a73 --- /dev/null +++ b/data/init/sample_schools.csv @@ -0,0 +1,105 @@ +URN,LA (code),LA (name),EstablishmentNumber,EstablishmentName,TypeOfEstablishment (name),EstablishmentTypeGroup (name),EstablishmentStatus (name),ReasonEstablishmentOpened (name),OpenDate,ReasonEstablishmentClosed (name),CloseDate,PhaseOfEducation (name),StatutoryLowAge,StatutoryHighAge,Boarders (name),NurseryProvision (name),OfficialSixthForm (name),Gender (name),ReligiousCharacter (name),ReligiousEthos (name),Diocese (name),AdmissionsPolicy (name),SchoolCapacity,SpecialClasses (name),CensusDate,NumberOfPupils,NumberOfBoys,NumberOfGirls,PercentageFSM,TrustSchoolFlag (name),Trusts (name),SchoolSponsorFlag (name),SchoolSponsors (name),FederationFlag (name),Federations (name),UKPRN,FEHEIdentifier,FurtherEducationType (name),OfstedLastInsp,LastChangedDate,Street,Locality,Address3,Town,County (name),Postcode,SchoolWebsite,TelephoneNum,HeadTitle (name),HeadFirstName,HeadLastName,HeadPreferredJobTitle,BSOInspectorateName (name),InspectorateReport,DateOfLastInspectionVisit,NextInspectionVisit,TeenMoth (name),TeenMothPlaces,CCF (name),SENPRU (name),EBD (name),PlacesPRU,FTProv (name),EdByOther (name),Section41Approved (name),SEN1 (name),SEN2 (name),SEN3 (name),SEN4 (name),SEN5 (name),SEN6 (name),SEN7 (name),SEN8 (name),SEN9 (name),SEN10 (name),SEN11 (name),SEN12 (name),SEN13 (name),TypeOfResourcedProvision (name),ResourcedProvisionOnRoll,ResourcedProvisionCapacity,SenUnitOnRoll,SenUnitCapacity,GOR (name),DistrictAdministrative (name),AdministrativeWard (name),ParliamentaryConstituency (name),UrbanRural (name),GSSLACode (name),Easting,Northing,MSOA (name),LSOA (name),InspectorateName (name),SENStat,SENNoStat,PropsName,OfstedRating (name),RSCRegion (name),Country (name),UPRN,SiteName,QABName (name),EstablishmentAccredited (name),QABReport,CHNumber,MSOA (code),LSOA (code),FSM,AccreditationExpiryDate +118317,887,Medway,2198,Greenvale Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,120.0,No Special Classes,19-01-2023,110.0,58.0,52.0,39.1,Not applicable,,Not applicable,,Not under a federation,,10074076.0,,Not applicable,22-11-2023,22-04-2024,Symons Avenue,,,Chatham,Kent,ME4 5UP,www.greenvale.medway.sch.uk,1634409521.0,Mrs,Amanda,Allnutt,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Chatham Central & Brompton,Chatham and Aylesford,(England/Wales) Urban city and town,E06000035,576183.0,166676.0,Medway 022,Medway 022B,,,,,Good,South-East England and South London,,100062391942.0,,Not applicable,Not applicable,,,E02003335,E01016023,43.0, +118320,887,Medway,2202,New Road Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,360.0,No Special Classes,19-01-2023,360.0,187.0,173.0,38.6,Not applicable,,Not applicable,,Not under a federation,,10076230.0,,Not applicable,19-04-2023,04-06-2024,Bryant Street,,,Chatham,Kent,ME4 5QN,http://www.newroad.medway.sch.uk,1634843084.0,Mrs,Samantha,Cooper,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Chatham Central & Brompton,Chatham and Aylesford,(England/Wales) Urban city and town,E06000035,576251.0,167414.0,Medway 015,Medway 015C,,,,,Good,South-East England and South London,,44054185.0,,Not applicable,Not applicable,,,E02003328,E01016019,139.0, +118329,887,Medway,2215,Balfour Infant School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,5.0,7,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,270.0,No Special Classes,19-01-2023,266.0,140.0,126.0,23.8,Not applicable,,Not applicable,,Not under a federation,,10074074.0,,Not applicable,04-06-2019,12-04-2024,Pattens Lane,,,Rochester,Kent,ME1 2QT,http://www.balfourinf.medway.sch.uk,1634338280.0,Ms,Donna,Atkinson,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Fort Pitt,Rochester and Strood,(England/Wales) Urban city and town,E06000035,575083.0,166460.0,Medway 026,Medway 026C,,,,,Good,South-East England and South London,,44035930.0,,Not applicable,Not applicable,,,E02003339,E01016124,63.0, +118330,887,Medway,2216,Crest Infant School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,7,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,270.0,No Special Classes,19-01-2023,177.0,83.0,94.0,34.5,Not applicable,,Not applicable,,Not under a federation,,10074073.0,,Not applicable,12-02-2020,29-04-2024,Fleet Road,,,Rochester,Kent,ME1 2QA,www.crestinfants.co.uk,1634844127.0,Mrs,Kerry,Seales,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Rochester East & Warren Wood,Rochester and Strood,(England/Wales) Urban city and town,E06000035,574568.0,166523.0,Medway 024,Medway 024A,,,,,Good,South-East England and South London,,200000909496.0,,Not applicable,Not applicable,,,E02003337,E01016116,60.0, +118423,887,Medway,2403,Hempstead Junior School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,7.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,360.0,No Special Classes,19-01-2023,353.0,193.0,160.0,7.9,Not applicable,,Not applicable,,Not under a federation,,10079033.0,,Not applicable,20-06-2018,06-06-2024,Birch Grove,Hempstead,,Gillingham,Kent,ME7 3HJ,www.hempsteadjnr.medway.sch.uk/,1634336963.0,Mr,Paul,Cross,Head Teacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Hempstead & Wigmore,Gillingham and Rainham,(England/Wales) Urban city and town,E06000035,579226.0,164022.0,Medway 035,Medway 035A,,,,,Good,South-East England and South London,,100062394567.0,,Not applicable,Not applicable,,,E02003348,E01016050,28.0, +118442,887,Medway,2439,Horsted Infant School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,7,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,180.0,No Special Classes,19-01-2023,177.0,93.0,84.0,10.2,Not applicable,,Not applicable,,Supported by a federation,The Bluebell Federation,10074065.0,,Not applicable,11-10-2023,03-06-2024,Barberry Avenue,,,Chatham,Kent,ME5 9TF,www.horstedschool.co.uk/,1634335400.0,Mrs,Sarah,Steer,Executive Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Fort Horsted,Rochester and Strood,(England/Wales) Urban city and town,E06000035,574928.0,164210.0,Medway 033,Medway 033C,,,,,Good,South-East England and South London,,200000909501.0,,Not applicable,Not applicable,,,E02003346,E01016123,18.0, +118472,887,Medway,2494,Parkwood Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,540.0,No Special Classes,19-01-2023,546.0,270.0,276.0,16.8,Not applicable,,Not applicable,,Not under a federation,,10074063.0,,Not applicable,08-06-2023,07-05-2024,Deanwood Drive,Rainham,,Gillingham,Kent,ME8 9LP,www.parkwoodprimary.org.uk,1634234699.0,Headteacher,Lee,McCormack,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Rainham South East,Gillingham and Rainham,(England/Wales) Urban city and town,E06000035,581085.0,164262.0,Medway 036,Medway 036D,,,,,Requires improvement,South-East England and South London,,100062396933.0,,Not applicable,Not applicable,,,E02003349,E01016105,92.0, +118477,887,Medway,2506,Horsted Junior School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,7.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,248.0,No Special Classes,19-01-2023,249.0,130.0,119.0,16.5,Not applicable,,Not applicable,,Supported by a federation,The Bluebell Federation,10079031.0,,Not applicable,13-09-2023,03-06-2024,Barberry Avenue,,,Chatham,Kent,ME5 9TF,www.horstedschool.co.uk,1634335400.0,Mrs,Sarah,Steer,Executive Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Fort Horsted,Rochester and Strood,(England/Wales) Urban city and town,E06000035,575006.0,164184.0,Medway 033,Medway 033C,,,,,Good,South-East England and South London,,44018867.0,,Not applicable,Not applicable,,,E02003346,E01016123,41.0, +118509,887,Medway,2549,Swingate Primary School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,630.0,No Special Classes,19-01-2023,659.0,335.0,324.0,12.0,Not applicable,,Not applicable,,Not under a federation,,10076224.0,,Not applicable,08-11-2018,21-05-2024,Sultan Road,Lordswood,,Chatham,Kent,ME5 8TJ,www.swingate.medway.sch.uk/,1634863778.0,Mr,Steven,Geary,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Lordswood & Walderslade,Chatham and Aylesford,(England/Wales) Urban city and town,E06000035,577377.0,162361.0,Medway 038,Medway 038B,,,,,Good,South-East England and South London,,44058696.0,,Not applicable,Not applicable,,,E02003351,E01016056,76.0, +118555,887,Medway,2638,Hempstead Infant School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,7,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,270.0,No Special Classes,19-01-2023,270.0,149.0,121.0,5.2,Not applicable,,Not applicable,,Not under a federation,,10074059.0,,Not applicable,13-03-2024,22-05-2024,Hempstead Road,Hempstead,,Gillingham,Kent,ME7 3QG,www.hempsteadschoolsfederation.org.uk,1634336963.0,Mr,Paul,Cross,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Hempstead & Wigmore,Gillingham and Rainham,(England/Wales) Urban city and town,E06000035,579161.0,164155.0,Medway 035,Medway 035B,,,,,Good,South-East England and South London,,200000901137.0,,Not applicable,Not applicable,,,E02003348,E01016051,14.0, +118576,887,Medway,2665,St Peter's Infant School,Community school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,7,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,100.0,No Special Classes,19-01-2023,94.0,53.0,41.0,32.3,Not applicable,,Not applicable,,Not under a federation,,10074058.0,,Not applicable,13-12-2018,02-06-2024,Holcombe Road,,,Rochester,Kent,ME1 2HU,http://www.stpetersinfants.co.uk/,1634843590.0,Mrs,Joanna,Worrall (Interim),Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Rochester East & Warren Wood,Rochester and Strood,(England/Wales) Urban city and town,E06000035,574398.0,167163.0,Medway 017,Medway 017D,,,,,Good,South-East England and South London,,44025555.0,,Not applicable,Not applicable,,,E02003330,E01016118,30.0, +118641,887,Medway,3096,"St Helen's Church of England Primary School, Cliffe",Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,210.0,No Special Classes,19-01-2023,211.0,107.0,104.0,18.5,Not applicable,,Not applicable,,Not under a federation,,10069109.0,,Not applicable,04-06-2019,23-04-2024,Church Street,Cliffe,,Rochester,Kent,ME3 7PU,www.sthelens.medway.sch.uk/,1634220246.0,Mrs,Stephanie,Jarvis,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Strood Rural,Rochester and Strood,(England/Wales) Rural town and fringe,E06000035,573629.0,176192.0,Medway 002,Medway 002A,,,,,Good,South-East England and South London,,44018290.0,,Not applicable,Not applicable,,,E02003315,E01016142,39.0, +118643,887,Medway,3102,St Nicholas CEVC Primary School,Voluntary controlled school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,120.0,No Special Classes,19-01-2023,93.0,46.0,47.0,28.0,Not applicable,,Not applicable,,Not under a federation,,10079669.0,,Not applicable,23-01-2013,26-04-2024,St Nicholas CEVC primary School,London Road,Strood,Rochester,Kent,ME2 3HU,http://www.st-nicholas.medway.sch.uk,1634717120.0,Mrs,Ruth,Gooch,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Strood North & Frindsbury,Rochester and Strood,(England/Wales) Urban city and town,E06000035,573257.0,169332.0,Medway 006,Medway 006E,,,,,Outstanding,South-East England and South London,,200000896704.0,,Not applicable,Not applicable,,,E02003319,E01016141,26.0, +118756,887,Medway,3712,St Michael's RC Primary School,Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Roman Catholic,Does not apply,Archdiocese of Southwark,Not applicable,460.0,No Special Classes,19-01-2023,469.0,236.0,233.0,25.6,Not applicable,,Not applicable,,Not under a federation,,10076805.0,,Not applicable,06-11-2019,08-05-2024,Hills Terrace,,,Chatham,Kent,ME4 6PX,www.stmichaelsrcp.org,1634832578.0,Mrs,Nicola,Collins,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Fort Pitt,Chatham and Aylesford,(England/Wales) Urban city and town,E06000035,575579.0,167357.0,Medway 015,Medway 015B,,,,,Good,South-East England and South London,,44040971.0,,Not applicable,Not applicable,,,E02003328,E01016017,107.0, +118766,887,Medway,3729,English Martyrs' Catholic Primary School,Voluntary aided school,Local authority maintained schools,"Open, but proposed to close",Not applicable,,Academy Converter,30-06-2024,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Roman Catholic,Does not apply,Archdiocese of Southwark,Not applicable,210.0,No Special Classes,19-01-2023,202.0,101.0,101.0,15.8,Not applicable,,Not applicable,,Not under a federation,,10072742.0,,Not applicable,13-07-2023,28-05-2024,Frindsbury Road,Strood,,Rochester,Kent,ME2 4JA,http://www.englishmartyrs.medway.sch.uk,1634718964.0,Ms,Catherine,Thacker,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Strood North & Frindsbury,Rochester and Strood,(England/Wales) Urban city and town,E06000035,573987.0,169894.0,Medway 006,Medway 006A,,,,,Good,South-East England and South London,,100062388690.0,,Not applicable,Not applicable,,,E02003319,E01016135,32.0, +118767,887,Medway,3732,St Thomas of Canterbury RC Primary School,Voluntary aided school,Local authority maintained schools,"Open, but proposed to close",Not applicable,,Academy Converter,30-06-2024,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Roman Catholic,Does not apply,Archdiocese of Southwark,Not applicable,236.0,No Special Classes,19-01-2023,258.0,125.0,133.0,12.1,Not applicable,,Not applicable,,Not under a federation,,10072741.0,,Not applicable,08-06-2023,28-05-2024,Romany Road,Rainham,,Gillingham,Kent,ME8 6JH,www.stthomascanterbury.org.uk/,1634234677.0,Mrs,Vicki-Louise,Gallagher,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Twydall,Gillingham and Rainham,(England/Wales) Urban city and town,E06000035,579863.0,166652.0,Medway 018,Medway 018F,,,,,Good,South-East England and South London,,44087220.0,,Not applicable,Not applicable,,,E02003331,E01016165,29.0, +118769,887,Medway,3736,St Thomas More Roman Catholic Primary School,Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Roman Catholic,Does not apply,Archdiocese of Southwark,Not applicable,420.0,No Special Classes,19-01-2023,417.0,188.0,229.0,11.3,Not applicable,,Not applicable,,Not under a federation,,10072739.0,,Not applicable,08-02-2013,09-02-2024,Bleakwood Road,,,Chatham,Kent,ME5 0NF,www.st-thomasmore.medway.sch.uk/,1634864701.0,Mrs,Victoria,Ebdon,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Wayfield & Weeds Wood,Chatham and Aylesford,(England/Wales) Urban city and town,E06000035,576043.0,164020.0,Medway 033,Medway 033D,,,,,Outstanding,South-East England and South London,,44045642.0,,Not applicable,Not applicable,,,E02003346,E01016173,47.0, +118775,887,Medway,3746,St William of Perth Roman Catholic Primary School,Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Roman Catholic,Does not apply,Archdiocese of Southwark,Not applicable,210.0,No Special Classes,19-01-2023,208.0,106.0,102.0,7.7,Not applicable,,Not applicable,,Not under a federation,,10072738.0,,Not applicable,18-10-2023,10-05-2024,Canon Close,Maidstone Road,,Rochester,Kent,ME1 3EN,www.stwilliamofperth.org.uk/,1634404267.0,Mr,James,Willis,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Rochester West & Borstal,Rochester and Strood,(England/Wales) Urban city and town,E06000035,573973.0,166819.0,Medway 024,Medway 024D,,,,,Good,South-East England and South London,,44010893.0,,Not applicable,Not applicable,,,E02003337,E01016132,16.0, +118779,887,Medway,3752,St Augustine of Canterbury Catholic Primary School,Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Roman Catholic,Does not apply,Archdiocese of Southwark,Not applicable,210.0,No Special Classes,19-01-2023,199.0,101.0,98.0,13.6,Not applicable,,Not applicable,,Not under a federation,,10072736.0,,Not applicable,07-02-2024,20-05-2024,Deanwood Drive,Rainham,,Gillingham,Kent,ME8 9NP,www.staccp.org.uk/,1634371892.0,Mrs,Louise,Prestidge,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Rainham South East,Gillingham and Rainham,(England/Wales) Urban city and town,E06000035,580898.0,163428.0,Medway 036,Medway 036C,,,,,Good,South-East England and South London,,200000901485.0,,Not applicable,Not applicable,,,E02003349,E01016100,27.0, +118782,887,Medway,3755,St Mary's Catholic Primary School,Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Roman Catholic,Does not apply,Archdiocese of Southwark,Not applicable,480.0,No Special Classes,19-01-2023,433.0,235.0,198.0,15.6,Not applicable,,Not applicable,,Not under a federation,,10072734.0,,Not applicable,26-04-2023,11-03-2024,Greenfield Road,,Https://Stmarysrcp.Medway.Sch.Uk/,Gillingham,Kent,ME7 1YH,www.stmarysrcp.medway.sch.uk/,1634855783.0,Mr,Joseph,Pomeroy,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Gillingham North,Gillingham and Rainham,(England/Wales) Urban city and town,E06000035,577917.0,168572.0,Medway 010,Medway 010B,,,,,Good,South-East England and South London,,44069382.0,,Not applicable,Not applicable,,,E02003323,E01016032,61.0, +118908,887,Medway,5436,St John Fisher Catholic Comprehensive School,Voluntary aided school,Local authority maintained schools,Open,Not applicable,,Not applicable,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Mixed,Roman Catholic,Does not apply,Archdiocese of Southwark,Non-selective,1185.0,No Special Classes,19-01-2023,1024.0,550.0,474.0,30.1,Not applicable,,Not applicable,,Not under a federation,,10006189.0,,Not applicable,22-05-2019,23-05-2024,City Way,,,Rochester,,ME1 2FA,http://www.stjohnfisher.school,1634543123.0,Mrs,Dympna,Lennon,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Fort Pitt,Chatham and Aylesford,(England/Wales) Urban city and town,E06000035,575287.0,167305.0,Medway 021,Medway 021A,,,,,Good,South-East England and South London,United Kingdom,44082945.0,,Not applicable,Not applicable,,,E02003334,E01016020,262.0, +118948,887,Medway,6000,"King's School, Rochester",Other independent school,Independent schools,Open,Not applicable,01-01-1909,Not applicable,,Not applicable,3.0,18,Boarding school,Has Nursery Classes,Has a sixth form,Mixed,Church of England,Church of England,Not applicable,Non-selective,800.0,No Special Classes,20-01-2022,660.0,384.0,276.0,0.0,Not applicable,,Not applicable,,Not applicable,,10003660.0,,Not applicable,,06-06-2024,Satis House,Boley Hill,,Rochester,Kent,ME1 1TE,www.kings-rochester.co.uk,1634888555.0,Mr,Benjamin,Charles,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Medway,Rochester West & Borstal,Rochester and Strood,(England/Wales) Urban city and town,E06000035,574095.0,168504.0,Medway 014,Medway 014C,ISI,4.0,89.0,The Governors of King's School,,South-East England and South London,,44026826.0,,Not applicable,Not applicable,,,E02003327,E01016130,0.0, +118979,887,Medway,6001,Bryony School,Other independent school,Independent schools,Open,Not applicable,02-04-1958,Not applicable,,Not applicable,2.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,None,None,Not applicable,Non-selective,232.0,No Special Classes,20-01-2022,128.0,60.0,68.0,0.0,Not applicable,,Not applicable,,Not applicable,,10071117.0,,Not applicable,24-11-2022,28-05-2024,157 Marshall Road,Rainham,Marshall Road,Rainham,,ME8 0AJ,www.bryonyschool.org.uk,1634231511.0,Mrs,Natalie,Gee,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Medway,Rainham South West,Gillingham and Rainham,(England/Wales) Urban city and town,E06000035,580169.0,165278.0,Medway 030,Medway 030C,Ofsted,,1.0,Mr & Mrs Edmunds,Good,South-East England and South London,,100061264465.0,,Not applicable,Not applicable,,,E02003343,E01016091,0.0, +118985,887,Medway,6002,St Andrew's School (Rochester),Other independent school,Independent schools,Open,Not applicable,18-03-1958,Not applicable,,Not applicable,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,None,None,Not applicable,Not applicable,360.0,No Special Classes,20-01-2022,362.0,172.0,190.0,0.0,Not applicable,,Not applicable,,Not applicable,,10080533.0,,Not applicable,,24-05-2024,24 - 26 Watts Avenue,,,Rochester,Kent,ME1 1SA,www.st-andrews.rochester.sch.uk,1634843479.0,Mrs,Emma,Steinmann-Gilbert,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Medway,Rochester West & Borstal,Rochester and Strood,(England/Wales) Urban city and town,E06000035,574044.0,167996.0,Medway 014,Medway 014C,ISI,,8.0,Education Development Trust,,South-East England and South London,,44022882.0,,Not applicable,Not applicable,,,E02003327,E01016130,0.0, +119006,887,Medway,6004,Rochester Independent College,Other independent school,Independent schools,Open,Not applicable,26-09-1986,Not applicable,,Not applicable,11.0,21,Boarding school,No Nursery Classes,Has a sixth form,Mixed,None,None,Not applicable,Non-selective,380.0,No Special Classes,20-01-2022,358.0,197.0,161.0,0.0,Not applicable,,Not applicable,,Not applicable,,10005511.0,,Not applicable,,21-03-2024,254 St Margaret's Banks,,,Rochester,Kent,ME1 1HY,www.rochester-college.org.uk,1634828115.0,Mr,Alistair,Brownlow,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not approved,,,,,,,,,,,,,,,,,,,South East,Medway,Rochester West & Borstal,Rochester and Strood,(England/Wales) Urban city and town,E06000035,574653.0,167978.0,Medway 015,Medway 015F,ISI,43.0,102.0,Dukes Education,,South-East England and South London,United Kingdom,100062373676.0,,Not applicable,Not applicable,,,E02003328,E01035296,0.0, +131527,887,Medway,3760,Burnt Oak Primary School,Community school,Local authority maintained schools,Open,Result of Amalgamation,01-09-2006,Not applicable,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,Not applicable,19-01-2023,453.0,238.0,215.0,40.6,Not applicable,,Not applicable,,Not under a federation,,10075241.0,,Not applicable,18-05-2022,20-05-2024,Richmond Road,,,Gillingham,Kent,ME7 1LS,www.burntoak.medway.sch.uk/,1634334344.0,Mrs,Maureen,Grabski,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Gillingham North,Gillingham and Rainham,(England/Wales) Urban city and town,E06000035,577499.0,169057.0,Medway 009,Medway 009C,,,,,Good,South-East England and South London,,44027271.0,,Not applicable,Not applicable,,,E02003322,E01016037,183.0, +132056,887,Medway,3756,St Mary's Island Church of England (Aided) Primary School,Voluntary aided school,Local authority maintained schools,Open,Not applicable,01-09-1999,Not applicable,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,630.0,Not applicable,19-01-2023,671.0,329.0,342.0,10.3,Not applicable,,Not applicable,,Not under a federation,,10075517.0,,Not applicable,15-11-2023,23-04-2024,Island Way West,St Mary's Island,,Chatham,Kent,ME4 3ST,http://www.st-marys-island-cofe-primary-school.co.uk,1634891050.0,Mrs,Christine,Easton,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Medway,St Mary's Island,Rochester and Strood,(England/Wales) Urban city and town,E06000035,576620.0,170684.0,Medway 007,Medway 007F,,,,,Good,South-East England and South London,,200003623259.0,,Not applicable,Not applicable,,,E02003320,E01035290,69.0, +134904,887,Medway,3759,Fairview Community Primary School,Community school,Local authority maintained schools,Open,Result of Amalgamation,12-09-2005,Not applicable,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,690.0,Not applicable,19-01-2023,668.0,340.0,328.0,7.0,Not applicable,,Not applicable,,Not under a federation,,10071739.0,,Not applicable,02-04-2019,21-05-2024,Drewery Drive,Wigmore,,Gillingham,Kent,ME8 0NU,www.fairviewprimary.co.uk,1634338710.0,Mrs,Karin,Tillett,Head Teacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Hempstead & Wigmore,Gillingham and Rainham,(England/Wales) Urban city and town,E06000035,580272.0,164185.0,Medway 030,Medway 030A,,,,,Good,South-East England and South London,,44013431.0,,Not applicable,Not applicable,,,E02003343,E01016085,44.0, +135964,887,Medway,6905,Strood Academy,Academy sponsor led,Academies,Open,New Provision,01-09-2009,Not applicable,,Secondary,11.0,19,No boarders,Not applicable,Has a sixth form,Mixed,Does not apply,None,Not applicable,Non-selective,1500.0,No Special Classes,19-01-2023,1273.0,626.0,647.0,26.8,Supported by a multi-academy trust,LEIGH ACADEMIES TRUST,Linked to a sponsor,Leigh Academies Trust,Not applicable,,10027834.0,,Not applicable,02-12-2021,17-05-2024,Carnation Road,Strood,,Rochester,Kent,ME2 2SX,http://www.stroodacademy.org.uk,1634717121.0,Mr,Jon,Richardson,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,ASD - Autistic Spectrum Disorder,,,,,,,,,,,,,Resourced provision and SEN unit,5.0,25.0,5.0,25.0,South East,Medway,Strood West,Rochester and Strood,(England/Wales) Urban city and town,E06000035,571638.0,169261.0,Medway 008,Medway 008D,,,,,Good,South-East England and South London,,100062388557.0,,Not applicable,Not applicable,,,E02003321,E01016155,310.0, +136107,887,Medway,6906,Brompton Academy,Academy sponsor led,Academies,Open,New Provision,01-09-2010,Not applicable,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Mixed,Does not apply,None,Not applicable,Non-selective,1400.0,Has Special Classes,19-01-2023,1403.0,736.0,667.0,30.4,Supported by a multi-academy trust,THE UNIVERSITY OF KENT ACADEMIES TRUST,Linked to a sponsor,University of Kent (Brompton Academy),Not applicable,,10030223.0,,Not applicable,22-09-2022,21-05-2024,Marlborough Road,,,Gillingham,Kent,ME7 5HT,http://www.bromptonacademy.org.uk,1634852341.0,Mr,Dan,Walters,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,SpLD - Specific Learning Difficulty,OTH - Other Difficulty/Disability,"SLCN - Speech, language and Communication",,,,,,,,,,,SEN unit,,,94.0,100.0,South East,Medway,Gillingham South,Gillingham and Rainham,(England/Wales) Urban city and town,E06000035,576827.0,167905.0,Medway 012,Medway 012C,,,,,Requires improvement,South-East England and South London,,44054862.0,,Not applicable,Not applicable,,,E02003325,E01016045,366.0, +136108,887,Medway,6907,The Victory Academy,Academy sponsor led,Academies,Open,New Provision,01-09-2010,Not applicable,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Mixed,None,None,,Non-selective,1500.0,No Special Classes,19-01-2023,1188.0,598.0,590.0,40.1,Supported by a multi-academy trust,THE THINKING SCHOOLS ACADEMY TRUST,Linked to a sponsor,The Thinking Schools Academy Trust,Not applicable,,10030225.0,,Not applicable,03-02-2023,07-06-2024,Magpie Hall Road,,,Chatham,Kent,ME4 5JB,http://www.thevictoryacademy.org.uk/,3333602140.0,Mr,Oliver,Owen,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Luton,Chatham and Aylesford,(England/Wales) Urban city and town,E06000035,576368.0,166387.0,Medway 022,Medway 022D,,,,,Good,South-East England and South London,,44051900.0,,Not applicable,Not applicable,,,E02003335,E01016062,428.0, +136313,887,Medway,5445,The Rochester Grammar School,Academy converter,Academies,Open,Academy Converter,01-11-2010,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Girls,None,Does not apply,Not applicable,Selective,1110.0,No Special Classes,19-01-2023,1182.0,9.0,1173.0,7.0,Supported by a multi-academy trust,THE THINKING SCHOOLS ACADEMY TRUST,Linked to a sponsor,The Thinking Schools Academy Trust,Not applicable,,10032200.0,,Not applicable,18-01-2023,21-05-2024,Maidstone Road,,,Rochester,Kent,ME1 3BY,http://www.rochestergrammar.org.uk,3333602120.0,Mrs,Clare,Brinklow,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Rochester East & Warren Wood,Rochester and Strood,(England/Wales) Urban city and town,E06000035,574171.0,166566.0,Medway 017,Medway 017C,,,,,Good,South-East England and South London,,44022498.0,,Not applicable,Not applicable,,,E02003330,E01016115,70.0, +136337,887,Medway,4069,Fort Pitt Grammar School,Academy converter,Academies,Open,Academy Converter,01-11-2010,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Girls,None,Does not apply,Not applicable,Selective,800.0,No Special Classes,19-01-2023,895.0,20.0,875.0,11.6,Supported by a multi-academy trust,BEYOND SCHOOLS TRUST,Linked to a sponsor,FPTA Academies (Fort Pitt Grammar School and The Thomas Aveling School),Not applicable,,10032192.0,,Not applicable,05-10-2022,05-03-2024,Fort Pitt Hill,,,Chatham,Kent,ME4 6TJ,http://www.fortpitt.medway.sch.uk,1634842359.0,Ms,Salena,Hirons,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Fort Pitt,Rochester and Strood,(England/Wales) Urban city and town,E06000035,575049.0,167596.0,Medway 015,Medway 015G,,,,,Outstanding,South-East England and South London,,100062392022.0,,Not applicable,Not applicable,,,E02003328,E01035297,83.0, +136456,887,Medway,4199,Rainham School for Girls,Academy converter,Academies,Open,Academy Converter,01-02-2011,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Girls,Does not apply,Does not apply,Not applicable,Non-selective,1558.0,No Special Classes,19-01-2023,1668.0,36.0,1632.0,17.6,Supported by a multi-academy trust,THE KEMNAL ACADEMIES TRUST,Linked to a sponsor,The Kemnal Academies Trust,Not applicable,,10032961.0,,Not applicable,21-04-2022,20-05-2024,Derwent Way,Rainham,,Gillingham,Kent,ME8 0BX,http://www.rainhamgirls-tkat.org/,1634362746.0,Mrs,Vicki,Shaw,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Rainham South West,Gillingham and Rainham,(England/Wales) Urban city and town,E06000035,580560.0,165785.0,Medway 029,Medway 029B,,,,,Good,South-East England and South London,,100062395978.0,,Not applicable,Not applicable,,,E02003342,E01016088,243.0, +136594,887,Medway,4068,Holcombe Grammar School,Academy converter,Academies,Open,Academy Converter,01-04-2011,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Boys,Does not apply,Does not apply,Not applicable,Selective,1000.0,No Special Classes,19-01-2023,1067.0,955.0,112.0,9.9,Supported by a multi-academy trust,THE THINKING SCHOOLS ACADEMY TRUST,Linked to a sponsor,The Thinking Schools Academy Trust,Not applicable,,10033242.0,,Not applicable,24-04-2018,07-06-2024,Holcombe,Maidstone Road,,Chatham,Kent,ME4 6JB,http://www.holcombegrammar.org.uk,3333602130.0,Mr,Lee,Preston,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Fort Pitt,Chatham and Aylesford,(England/Wales) Urban city and town,E06000035,575486.0,166035.0,Medway 027,Medway 027A,,,,,Good,South-East England and South London,,100062392018.0,,Not applicable,Not applicable,,,E02003340,E01016025,72.0, +136662,887,Medway,4530,Sir Joseph Williamson's Mathematical School,Academy converter,Academies,Open,Academy Converter,01-04-2011,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Boys,None,Does not apply,Not applicable,Selective,1280.0,No Special Classes,19-01-2023,1479.0,1386.0,93.0,8.7,Supported by a multi-academy trust,LEIGH ACADEMIES TRUST,Linked to a sponsor,Leigh Academies Trust,Not applicable,,10033431.0,,Not applicable,22-03-2023,07-06-2024,Maidstone Road,,,Rochester,Kent,ME1 3EL,http://www.sjwms.org.uk,1634844008.0,Mr,Eliot,Hodges,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Rochester West & Borstal,Rochester and Strood,(England/Wales) Urban city and town,E06000035,574020.0,166430.0,Medway 024,Medway 024C,,,,,Outstanding,South-East England and South London,,44022499.0,,Not applicable,Not applicable,,,E02003337,E01016128,92.0, +136859,887,Medway,2588,Cliffe Woods Primary School,Academy converter,Academies,Open,Academy Converter,01-07-2011,,,Primary,4.0,11,No boarders,No Nursery Classes,Not applicable,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,No Special Classes,19-01-2023,415.0,197.0,218.0,5.1,Supported by a multi-academy trust,ALETHEIA ACADEMIES TRUST,Linked to a sponsor,Aletheia Academies Trust,Not applicable,,10034067.0,,Not applicable,18-03-2015,07-05-2024,View Road,Cliffe Woods,,Rochester,Kent,ME3 8UJ,www.cliffewoods.medway.sch.uk,1634220822.0,Mrs,Karen,Connolly,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Strood Rural,Rochester and Strood,(England/Wales) Rural town and fringe,E06000035,574188.0,173690.0,Medway 002,Medway 002C,,,,,Outstanding,South-East England and South London,,44030622.0,,Not applicable,Not applicable,,,E02003315,E01016145,21.0, +136864,887,Medway,5420,Rainham Mark Grammar School,Academy converter,Academies,Open,Academy Converter,01-07-2011,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Mixed,None,Does not apply,Not applicable,Selective,1242.0,No Special Classes,19-01-2023,1567.0,839.0,728.0,7.3,Supported by a multi-academy trust,RMET,Linked to a sponsor,RMET (Rainham Mark Education Trust),Not applicable,,10034121.0,,Not applicable,25-05-2022,29-05-2024,Pump Lane,Rainham,,Gillingham,Kent,ME8 7AJ,http://rainhammark.com/,1634364151.0,Mrs,Agnes,Hart,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Rainham North,Gillingham and Rainham,(England/Wales) Urban city and town,E06000035,580729.0,166755.0,Medway 023,Medway 023C,,,,,Good,South-East England and South London,,44096394.0,,Not applicable,Not applicable,,,E02003336,E01016166,88.0, +137119,887,Medway,4000,The Hundred of Hoo Academy,Academy sponsor led,Academies,Open,New Provision,01-09-2011,Not applicable,,All-through,4.0,19,No boarders,Not applicable,Has a sixth form,Mixed,None,None,Not applicable,Non-selective,1900.0,Not applicable,19-01-2023,1702.0,844.0,858.0,22.3,Supported by a multi-academy trust,LEIGH ACADEMIES TRUST,Linked to a sponsor,Leigh Academies Trust,Not applicable,,10034985.0,,Not applicable,05-07-2018,08-05-2024,Main Road,Hoo,,Rochester,Kent,ME3 9HH,https://www.hundredofhooacademy.org.uk/,1634251443.0,Mr,Carl,Guerin-Hassett,Headteacher,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,ASD - Autistic Spectrum Disorder,,,,,,,,,,,,,SEN unit,,,43.0,48.0,South East,Medway,Hoo St Werburgh & High Halstow,Rochester and Strood,(England/Wales) Rural town and fringe,E06000035,577407.0,172277.0,Medway 003,Medway 003D,,,,,Good,South-East England and South London,,200000900015.0,,Not applicable,Not applicable,,,E02003316,E01016077,353.0, +137376,887,Medway,5451,The Thomas Aveling School,Academy converter,Academies,Open,Academy Converter,01-09-2011,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Mixed,None,Does not apply,Not applicable,Non-selective,1204.0,No Special Classes,19-01-2023,1205.0,599.0,606.0,25.1,Supported by a multi-academy trust,BEYOND SCHOOLS TRUST,Linked to a sponsor,FPTA Academies (Fort Pitt Grammar School and The Thomas Aveling School),Not applicable,,10035084.0,,Not applicable,14-09-2022,14-05-2024,Arethusa Road,,,Rochester,Kent,ME1 2UW,http://www.thomasaveling.co.uk,1634844809.0,Mr,Paul,Jackson,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,HI - Hearing Impairment,,,,,,,,,,,,,Resourced provision,20.0,20.0,,,South East,Medway,Rochester East & Warren Wood,Rochester and Strood,(England/Wales) Urban city and town,E06000035,574327.0,165761.0,Medway 026,Medway 026B,,,,,Good,South-East England and South London,,44018933.0,,Not applicable,Not applicable,,,E02003339,E01016120,259.0, +137389,887,Medway,5429,Chatham Grammar,Academy converter,Academies,Open,Academy Converter,01-09-2011,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Girls,None,Does not apply,Not applicable,Selective,976.0,No Special Classes,19-01-2023,945.0,18.0,927.0,10.9,Supported by a multi-academy trust,THE UNIVERSITY OF KENT ACADEMIES TRUST,Linked to a sponsor,University of Kent (Brompton Academy),Not applicable,,10035160.0,,Not applicable,18-10-2023,22-05-2024,Rainham Road,,,Chatham,Kent,ME5 7EH,http://www.chathamgirlsgrammar.medway.sch.uk/,1634851262.0,Ms,Wendy,Walters,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Luton,Chatham and Aylesford,(England/Wales) Urban city and town,E06000035,577460.0,166933.0,Medway 020,Medway 020A,,,,,Good,South-East England and South London,,200000899518.0,,Not applicable,Not applicable,,,E02003333,E01016061,80.0, +137990,887,Medway,2421,High Halstow Primary Academy,Academy converter,Academies,Open,Academy Converter,01-04-2012,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,None,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,211.0,111.0,100.0,9.5,Supported by a multi-academy trust,LEIGH ACADEMIES TRUST,Linked to a sponsor,Leigh Academies Trust,Not applicable,,10036980.0,,Not applicable,21-06-2023,14-03-2024,Harrison Drive,High Halstow,,Rochester,Kent,ME3 8TF,http://www.highhalstowprimaryacademy.org.uk,1634251098.0,Mrs,Gemma,Stangroom,Head of School,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Hoo St Werburgh & High Halstow,Rochester and Strood,(England/Wales) Rural town and fringe,E06000035,578093.0,175447.0,Medway 003,Medway 003A,,,,,Outstanding,South-East England and South London,,44083531.0,,Not applicable,Not applicable,,,E02003316,E01016073,20.0, +138182,887,Medway,2600,All Faiths Children's Academy,Academy converter,Academies,Open,Academy Converter,01-06-2012,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,Has Special Classes,19-01-2023,226.0,101.0,125.0,28.4,Supported by a multi-academy trust,THE THINKING SCHOOLS ACADEMY TRUST,Linked to a sponsor,The Thinking Schools Academy Trust,Not applicable,,10037460.0,,Not applicable,29-01-2020,23-04-2024,Gun Lane,Strood,,Rochester,Kent,ME2 4UF,www.allfaithschildrensacademy.org.uk,3333602100.0,Mrs,Kirstie,Jones,Acting Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,HI - Hearing Impairment,,,,,,,,,,,,,Resourced provision and SEN unit,15.0,15.0,15.0,15.0,South East,Medway,Strood North & Frindsbury,Rochester and Strood,(England/Wales) Urban city and town,E06000035,573564.0,169506.0,Medway 006,Medway 006E,,,,,Good,South-East England and South London,,200000896787.0,,Not applicable,Not applicable,,,E02003319,E01016141,64.0, +138328,887,Medway,2209,Chattenden Primary School,Academy converter,Academies,Open,Academy Converter,01-07-2012,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,No Special Classes,19-01-2023,209.0,101.0,108.0,34.8,Supported by a multi-academy trust,PENINSULA GATEWAY ACADEMY TRUST,-,,Not applicable,,10037769.0,,Not applicable,06-11-2018,03-05-2024,Chattenden Lane,Chattenden,,Rochester,Kent,ME3 8LF,http://www.chattenden.medway.sch.uk/,1634250861.0,Miss,Julie,North,Principal,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Hoo St Werburgh & High Halstow,Rochester and Strood,(England/Wales) Rural village,E06000035,575792.0,171843.0,Medway 003,Medway 003E,,,,,Good,South-East England and South London,,200000909509.0,,Not applicable,Not applicable,,,E02003316,E01016143,72.0, +138510,887,Medway,2001,Phoenix Primary School,Academy sponsor led,Academies,Open,New Provision,01-09-2012,,,Primary,5.0,11,,Not applicable,Not applicable,Mixed,None,None,Not applicable,Not applicable,360.0,Not applicable,19-01-2023,359.0,179.0,180.0,49.3,Supported by a multi-academy trust,BEYOND SCHOOLS TRUST,Linked to a sponsor,FPTA Academies (Fort Pitt Grammar School and The Thomas Aveling School),Not applicable,,10038455.0,,Not applicable,21-06-2023,25-04-2024,Glencoe Road,,,Chatham,Kent,ME4 5QD,www.phoenixprimary.com,1634829009.0,Mrs,Melissa,Ireland-Hubbert,Head of School,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Chatham Central & Brompton,Chatham and Aylesford,(England/Wales) Urban city and town,E06000035,576075.0,166910.0,Medway 022,Medway 022A,,,,,Good,South-East England and South London,,44051781.0,,Not applicable,Not applicable,,,E02003335,E01016018,176.0, +138511,887,Medway,4001,The Robert Napier School,Academy sponsor led,Academies,Open,New Provision,01-09-2012,,,Secondary,11.0,18,No boarders,Not applicable,Has a sixth form,Mixed,None,None,Not applicable,Non-selective,1080.0,Not applicable,19-01-2023,1037.0,561.0,476.0,43.0,Supported by a multi-academy trust,BEYOND SCHOOLS TRUST,Linked to a sponsor,FPTA Academies (Fort Pitt Grammar School and The Thomas Aveling School),Not applicable,,10038456.0,,Not applicable,31-01-2019,21-05-2024,Third Avenue,,,Gillingham,Kent,ME7 2LX,http://www.robertnapier.org.uk/,1634851157.0,Mrs,Jenny,Tomkins,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Medway,Watling,Gillingham and Rainham,(England/Wales) Urban city and town,E06000035,578331.0,167405.0,Medway 019,Medway 019D,,,,,Good,South-East England and South London,,44076749.0,,Not applicable,Not applicable,,,E02003332,E01016179,407.0, +138974,887,Medway,2002,St James Church of England Primary Academy,Academy sponsor led,Academies,Open,New Provision,01-12-2012,,,Primary,3.0,11,,Has Nursery Classes,Does not have a sixth form,Mixed,Church of England,None,Diocese of Rochester,Not applicable,210.0,Not applicable,19-01-2023,199.0,104.0,95.0,31.7,Supported by a multi-academy trust,MEDWAY ANGLICAN SCHOOLS TRUST,-,,Not applicable,,10039506.0,,Not applicable,24-05-2023,23-02-2024,High Street,Isle of Grain,,Rochester,Kent,ME3 0BS,http://www.stjamesisleofgrain.org.uk,1634270341.0,Miss,Fay,Cordingley,Head of School,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,All Saints,Rochester and Strood,(England/Wales) Rural town and fringe,E06000035,588751.0,176727.0,Medway 001,Medway 001B,,,,,Good,South-East England and South London,,44004798.0,,Not applicable,Not applicable,,,E02003314,E01016071,58.0, +139493,887,Medway,2412,The Academy of Woodlands,Academy converter,Academies,Open,Academy Converter,01-04-2013,,,Primary,2.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,630.0,Not applicable,19-01-2023,758.0,386.0,372.0,32.1,Supported by a multi-academy trust,RIVERMEAD INCLUSIVE TRUST,Linked to a sponsor,Rivermead Inclusive Trust,Not applicable,,10041035.0,,Not applicable,11-12-2019,01-05-2024,Woodlands Road,,,Gillingham,Kent,ME7 2DU,www.theacademyofwoodlands.co.uk,3000658200.0,Mrs,Chloe,Brown,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Watling,Gillingham and Rainham,(England/Wales) Urban city and town,E06000035,578807.0,167818.0,Medway 013,Medway 013C,,,,,Good,South-East England and South London,,100062394529.0,,Not applicable,Not applicable,,,E02003326,E01016043,243.0, +139927,887,Medway,2003,Kingfisher Community Primary School,Academy sponsor led,Academies,Open,New Provision,01-09-2013,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,None,Not applicable,Not applicable,210.0,Not applicable,19-01-2023,219.0,103.0,116.0,40.6,Supported by a multi-academy trust,THE GRIFFIN SCHOOLS TRUST,Linked to a sponsor,The Griffin Schools Trust,Not applicable,,10042689.0,,Not applicable,12-09-2019,28-05-2024,Kingfisher Drive,Princes Park,Walderslade,Chatham,Kent,ME5 7NX,www.kingfisher-gst.org,1634661540.0,Ms,Fiona,Armstrong,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Princes Park,Chatham and Aylesford,(England/Wales) Urban city and town,E06000035,577072.0,165267.0,Medway 031,Medway 031E,,,,,Good,South-East England and South London,,100062392674.0,,Not applicable,Not applicable,,,E02003344,E01016084,89.0, +139928,887,Medway,2004,Saxon Way Primary School,Academy sponsor led,Academies,Open,New Provision,01-09-2013,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,None,Not applicable,Not applicable,420.0,Not applicable,19-01-2023,425.0,229.0,196.0,47.2,Supported by a multi-academy trust,THE GRIFFIN SCHOOLS TRUST,Linked to a sponsor,The Griffin Schools Trust,Not applicable,,10042702.0,,Not applicable,22-01-2020,04-06-2024,,Ingram Road,,Gillingham,Kent,ME7 1SJ,http://www.saxonway-gst.org/,1634336720.0,Mrs,Jennifer,Vidler-Ironmonger,Head of School,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Gillingham North,Gillingham and Rainham,(England/Wales) Urban city and town,E06000035,578169.0,168848.0,Medway 010,Medway 010B,,,,,Good,South-East England and South London,,200000900397.0,,Not applicable,Not applicable,,,E02003323,E01016032,200.0, +140040,887,Medway,2006,Oasis Academy Skinner Street,Academy sponsor led,Academies,Open,New Provision,01-09-2013,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,None,Not applicable,Not applicable,420.0,Not applicable,19-01-2023,410.0,198.0,212.0,51.7,Supported by a multi-academy trust,OASIS COMMUNITY LEARNING,Linked to a sponsor,Oasis Community Learning,Not applicable,,10042952.0,,Not applicable,22-09-2021,19-04-2024,Skinner Street,,,Gillingham,Kent,ME7 1LG,www.oasisacademyskinnerstreet.org/,1634850213.0,Mrs,Victoria,Richmond,Interim Principal,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Gillingham South,Gillingham and Rainham,(England/Wales) Urban city and town,E06000035,577257.0,168594.0,Medway 012,Medway 012A,,,,,Good,South-East England and South London,,100062394010.0,,Not applicable,Not applicable,,,E02003325,E01016031,212.0, +140186,887,Medway,2007,Lordswood School,Academy sponsor led,Academies,Open,New Provision,01-11-2013,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,None,Not applicable,Not applicable,420.0,Not applicable,19-01-2023,410.0,220.0,190.0,26.6,Supported by a multi-academy trust,THE GRIFFIN SCHOOLS TRUST,Linked to a sponsor,The Griffin Schools Trust,Not applicable,,10043317.0,,Not applicable,16-01-2019,28-05-2024,Lordswood Lane,,,Chatham,Kent,ME5 8NN,www.lordswood-gst.org,1634336767.0,Mrs,Jayne,Lusinski,Head of School,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Lordswood & Walderslade,Chatham and Aylesford,(England/Wales) Urban city and town,E06000035,576856.0,163264.0,Medway 038,Medway 038D,,,,,Good,South-East England and South London,,200000909500.0,,Not applicable,Not applicable,,,E02003351,E01016060,109.0, +140215,887,Medway,2008,New Horizons Children's Academy,Academy sponsor led,Academies,Open,New Provision,01-09-2014,,,Primary,4.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,None,None,,Not applicable,630.0,Not applicable,19-01-2023,639.0,318.0,321.0,19.4,Supported by a multi-academy trust,THE THINKING SCHOOLS ACADEMY TRUST,Linked to a sponsor,The Thinking Schools Academy Trust,Not applicable,,10047226.0,,Not applicable,25-05-2022,03-05-2024,Park Crescent,,,Chatham,Kent,ME4 6NR,http://www.newhorizonschildrensacademy.org.uk,3333602115.0,Mr,Cormac,Murphy,Head Teacher,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Chatham Central & Brompton,Chatham and Aylesford,(England/Wales) Urban city and town,E06000035,575624.0,165866.0,Medway 027,Medway 027A,,,,,Good,South-East England and South London,,44036212.0,,Not applicable,Not applicable,,,E02003340,E01016025,124.0, +140606,887,Medway,2009,"Gordons Children's Academy, Junior",Academy sponsor led,Academies,Open,New Provision,01-03-2014,,,Primary,7.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,None,Not applicable,Not applicable,400.0,Not applicable,19-01-2023,336.0,180.0,156.0,22.9,Supported by a multi-academy trust,THE THINKING SCHOOLS ACADEMY TRUST,Linked to a sponsor,The Thinking Schools Academy Trust,Not applicable,,10044931.0,,Not applicable,28-09-2022,16-01-2024,Gordon Road,Strood,,Rochester,Kent,ME2 3HQ,https://www.gordonchildrensacademy.org.uk/,3333602110.0,Mrs,Kirstie,Jones,Headteacher,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Strood North & Frindsbury,Rochester and Strood,(England/Wales) Urban city and town,E06000035,573169.0,169601.0,Medway 006,Medway 006E,,,,,Good,South-East England and South London,United Kingdom,100062388599.0,,Not applicable,Not applicable,,,E02003319,E01016141,77.0, +140607,887,Medway,2010,"Gordons Children's Academy, Infant",Academy sponsor led,Academies,Open,New Provision,01-03-2014,,,Primary,5.0,7,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,None,Not applicable,Not applicable,189.0,Not applicable,19-01-2023,164.0,83.0,81.0,25.0,Supported by a multi-academy trust,THE THINKING SCHOOLS ACADEMY TRUST,Linked to a sponsor,The Thinking Schools Academy Trust,Not applicable,,10044932.0,,Not applicable,28-09-2022,16-01-2024,Gordon Road,Strood,,Rochester,Kent,ME2 3HQ,www.gordonchildrensacademy.org.uk,3333602110.0,Mrs,Kirstie,Jones,Headteacher,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Strood North & Frindsbury,Rochester and Strood,(England/Wales) Urban city and town,E06000035,573169.0,169601.0,Medway 006,Medway 006E,,,,,Good,South-East England and South London,,100062388599.0,,Not applicable,Not applicable,,,E02003319,E01016141,41.0, +140989,887,Medway,2011,Warren Wood Primary School,Academy sponsor led,Academies,Open,New Provision,01-07-2014,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,None,None,Not applicable,Not applicable,411.0,Has Special Classes,19-01-2023,486.0,258.0,228.0,37.8,Supported by a multi-academy trust,BEYOND SCHOOLS TRUST,Linked to a sponsor,FPTA Academies (Fort Pitt Grammar School and The Thomas Aveling School),Not applicable,,10046284.0,,Not applicable,16-10-2019,16-04-2024,Arethusa Road,,,Rochester,Kent,ME1 2UR,www.warrenwoodprimary.co.uk,1634401401.0,Mrs,Lucinda,Woodroof,Acting Head of School,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,"SLCN - Speech, language and Communication",,,,,,,,,,,,,SEN unit,,,30.0,34.0,South East,Medway,Rochester East & Warren Wood,Rochester and Strood,(England/Wales) Urban city and town,E06000035,574546.0,165725.0,Medway 026,Medway 026B,,,,,Good,South-East England and South London,,44020102.0,,Not applicable,Not applicable,,,E02003339,E01016120,178.0, +141199,887,Medway,2012,Napier Community Primary and Nursery Academy,Academy sponsor led,Academies,Open,New Provision,01-09-2014,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,None,Not applicable,Not applicable,630.0,Not applicable,19-01-2023,585.0,282.0,303.0,34.9,Supported by a multi-academy trust,THE KEMNAL ACADEMIES TRUST,Linked to a sponsor,The Kemnal Academies Trust,Not applicable,,10046908.0,,Not applicable,04-12-2019,11-04-2024,Napier Community Primary and Nursery Academy,Napier Road,,Gillingham,Kent,ME7 4HG,www.napierprimary.org.uk,1634574920.0,Mr,Ciaran,Mc Cann,Executive Head Teacher,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Gillingham South,Gillingham and Rainham,(England/Wales) Urban city and town,E06000035,577675.0,167833.0,Medway 016,Medway 016B,,,,,Good,South-East England and South London,,200000909503.0,,Not applicable,Not applicable,,,E02003329,E01016046,204.0, +141224,887,Medway,2013,Cuxton Community Junior School,Academy sponsor led,Academies,Open,New Provision,01-09-2014,,,Primary,7.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,None,Not applicable,Not applicable,240.0,Not applicable,19-01-2023,228.0,112.0,116.0,14.9,Supported by a multi-academy trust,THE PRIMARY FIRST TRUST,Linked to a sponsor,The Primary First Trust,Not applicable,,10047013.0,,Not applicable,07-07-2022,21-05-2024,Bush Road,Cuxton,,Rochester,Kent,ME2 1EY,www.cuxtonschools.co.uk,1634337720.0,Mrs,Charlotte,Aldham Breary,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,"Cuxton, Halling & Riverside",Rochester and Strood,(England/Wales) Rural town and fringe,E06000035,570725.0,166676.0,Medway 028,Medway 028C,,,,,Good,South-East England and South London,,44027917.0,,Not applicable,Not applicable,,,E02003341,E01016028,34.0, +141276,887,Medway,2208,Cuxton Community Infant School,Academy converter,Academies,Open,Academy Converter,01-09-2014,,,Primary,5.0,7,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,180.0,No Special Classes,19-01-2023,180.0,97.0,83.0,8.3,Supported by a multi-academy trust,THE PRIMARY FIRST TRUST,Linked to a sponsor,The Primary First Trust,Not applicable,,10047167.0,,Not applicable,30-03-2022,21-05-2024,Bush Road,Cuxton,,Rochester,Kent,ME2 1EY,www.cuxtonschools.co.uk,1634337720.0,Mrs,Charlotte,Aldham Breary,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,"Cuxton, Halling & Riverside",Rochester and Strood,(England/Wales) Rural town and fringe,E06000035,570781.0,166686.0,Medway 028,Medway 028C,,,,,Good,South-East England and South London,,44027917.0,,Not applicable,Not applicable,,,E02003341,E01016028,15.0, +141466,887,Medway,5457,The Howard School,Academy converter,Academies,Open,Academy Converter,01-10-2014,,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Boys,None,Does not apply,Not applicable,Non-selective,1725.0,No Special Classes,19-01-2023,1508.0,1486.0,22.0,15.3,Supported by a multi-academy trust,THE HOWARD ACADEMY TRUST,Linked to a sponsor,The Howard Academy Trust,Not applicable,,10047641.0,,Not applicable,24-11-2021,30-04-2024,Derwent Way,Rainham,,Gillingham,Kent,ME8 0BX,https://www.thehoward-that.org.uk/,1634388765.0,Mr,Jasbinder,Johal,Head of School,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Rainham South West,Gillingham and Rainham,(England/Wales) Urban city and town,E06000035,580562.0,165928.0,Medway 029,Medway 029B,,,,,Good,South-East England and South London,,100062395978.0,,Not applicable,Not applicable,,,E02003342,E01016088,193.0, +141467,887,Medway,2646,Brompton-Westbrook Primary School,Academy converter,Academies,Open,Academy Converter,01-10-2014,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,No Special Classes,19-01-2023,450.0,227.0,223.0,33.5,Supported by a multi-academy trust,THE WESTBROOK TRUST,Linked to a sponsor,The Westbrook Trust,Not applicable,,10047618.0,,Not applicable,22-01-2019,21-05-2024,Kings Bastion,Brompton,,Gillingham,Kent,ME7 5DQ,http://www.bromptonwestbrook.medway.sch.uk,1634844152.0,Mrs,Sue,Mason,Head Teacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Medway,Chatham Central & Brompton,Rochester and Strood,(England/Wales) Urban city and town,E06000035,576422.0,168177.0,Medway 015,Medway 015E,,,,,Good,South-East England and South London,,44056069.0,,Not applicable,Not applicable,,,E02003328,E01016111,146.0, +141553,887,Medway,2194,Peninsula East Primary Academy,Academy converter,Academies,Open,Academy Converter,01-11-2014,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,250.0,No Special Classes,19-01-2023,248.0,127.0,121.0,26.9,Supported by a multi-academy trust,LEIGH ACADEMIES TRUST,Linked to a sponsor,Leigh Academies Trust,Not applicable,,10047879.0,,Not applicable,15-01-2020,23-05-2024,Avery Way,Allhallows,,Rochester,,ME3 9HR,www.pepa.org.uk,1634270428.0,Mrs,Lorna,Rimmer,Head of School,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Medway,All Saints,Rochester and Strood,(England/Wales) Rural town and fringe,E06000035,583168.0,176220.0,Medway 001,Medway 001A,,,,,Good,South-East England and South London,United Kingdom,44108207.0,,Not applicable,Not applicable,,,E02003314,E01016070,66.0, +142137,887,Medway,3093,All Saints Church of England Primary School,Academy converter,Academies,Open,Academy Converter,01-09-2015,,,Primary,2.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,379.0,No Special Classes,19-01-2023,353.0,176.0,177.0,33.2,Supported by a multi-academy trust,MEDWAY ANGLICAN SCHOOLS TRUST,-,,Not applicable,,10053760.0,,Not applicable,21-02-2024,20-05-2024,Magpie Hall Road,,,Chatham,Kent,ME4 5JY,http://www.allsaints.medway.sch.uk,1634338922.0,,Joanne,Strachan,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Chatham Central & Brompton,Chatham and Aylesford,(England/Wales) Urban city and town,E06000035,576479.0,167253.0,Medway 015,Medway 015C,,,,,Good,South-East England and South London,,44054186.0,,Not applicable,Not applicable,,,E02003328,E01016019,111.0, +142157,887,Medway,3095,St John's Church of England Infant School,Academy converter,Academies,Open,Academy Converter,01-09-2015,,,Primary,5.0,7,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,90.0,No Special Classes,19-01-2023,46.0,21.0,25.0,34.8,Supported by a multi-academy trust,MEDWAY ANGLICAN SCHOOLS TRUST,-,,Not applicable,,10053759.0,,Not applicable,13-06-2018,12-04-2024,4 New Street,,,Chatham,Kent,ME4 6RH,https://www.stjohns.medway.sch.uk/,1634844135.0,Miss,J,Strachan,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Fort Pitt,Chatham and Aylesford,(England/Wales) Urban city and town,E06000035,575450.0,167393.0,Medway 015,Medway 015B,,,,,Good,South-East England and South London,,44029362.0,,Not applicable,Not applicable,,,E02003328,E01016017,16.0, +142160,887,Medway,3195,St Margaret's Church of England Junior School,Academy converter,Academies,Open,Academy Converter,01-09-2015,,,Primary,7.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,363.0,No Special Classes,19-01-2023,364.0,189.0,175.0,19.0,Supported by a multi-academy trust,MEDWAY ANGLICAN SCHOOLS TRUST,-,,Not applicable,,10053758.0,,Not applicable,21-09-2023,26-03-2024,Orchard Street,Rainham,,Gillingham,Kent,ME8 9AE,http://www.stmargaretsonline.net,1634230998.0,Mr,Lenny,Williams,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Rainham South West,Gillingham and Rainham,(England/Wales) Urban city and town,E06000035,581405.0,165749.0,Medway 029,Medway 029C,,,,,Good,South-East England and South London,,200000901856.0,,Not applicable,Not applicable,,,E02003342,E01016089,69.0, +142393,887,Medway,2014,Twydall Primary School and Nursery,Academy sponsor led,Academies,Open,New Provision,01-02-2016,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,None,Not applicable,Not applicable,255.0,Not applicable,19-01-2023,304.0,169.0,135.0,42.7,Supported by a multi-academy trust,RMET,Linked to a sponsor,RMET (Rainham Mark Education Trust),Not applicable,,10054150.0,,,17-05-2023,29-05-2024,Twydall Lane,,,Gillingham,Kent,ME8 6JS,www.twydallprimary.org.uk,1634231761.0,Mrs,Louise,Hardie,Headteacher,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,PD - Physical Disability,,,,,,,,,,,,,Resourced provision,7.0,8.0,,,South East,Medway,Twydall,Gillingham and Rainham,(England/Wales) Urban city and town,E06000035,579908.0,166888.0,Medway 018,Medway 018B,,,,,Good,South-East England and South London,,44087223.0,,Not applicable,Not applicable,,,E02003331,E01016161,120.0, +142394,887,Medway,2015,Temple Mill Primary School,Academy sponsor led,Academies,Open,New Provision,01-12-2015,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,None,Not applicable,Not applicable,210.0,Not applicable,19-01-2023,247.0,126.0,121.0,21.7,Supported by a multi-academy trust,THE HOWARD ACADEMY TRUST,Linked to a sponsor,The Howard Academy Trust,Not applicable,,10054151.0,,,17-10-2018,11-04-2024,Cliffe Road,Strood,,Rochester,Kent,ME2 3NL,https://www.templemill-that.org.uk/,1634629079.0,Mrs,Lisa,Lewis,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Strood Rural,Rochester and Strood,(England/Wales) Urban city and town,E06000035,573642.0,170455.0,Medway 004,Medway 004C,,,,,Good,South-East England and South London,,100062388732.0,,Not applicable,Not applicable,,,E02003317,E01016148,51.0, +142399,887,Medway,2016,Byron Primary School,Academy sponsor led,Academies,Open,New Provision,01-01-2016,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,None,Not applicable,Not applicable,525.0,Not applicable,19-01-2023,520.0,251.0,269.0,27.5,Supported by a multi-academy trust,THE WESTBROOK TRUST,Linked to a sponsor,The Westbrook Trust,Not applicable,,10054156.0,,,15-06-2022,21-05-2024,Byron Road,,,Gillingham,Kent,ME7 5XX,,1634852981.0,Mr,Jon,Carthy,Head Teacher,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Gillingham South,Gillingham and Rainham,(England/Wales) Urban city and town,E06000035,577482.0,167330.0,Medway 016,Medway 016C,,,,,Requires improvement,South-East England and South London,,44067058.0,,Not applicable,Not applicable,,,E02003329,E01016047,143.0, +142568,887,Medway,6010,The GFC School,Other independent school,Independent schools,Open,New Provision,07-12-2015,,,Not applicable,11.0,16,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,None,None,Not applicable,Selective,50.0,Not applicable,20-01-2022,28.0,20.0,8.0,0.0,Not applicable,,Not applicable,,Not applicable,,10066496.0,,,02-05-2019,15-04-2024,Priestfield Stadium,Redfern Avenue,,Gillingham,Kent,ME7 4DD,www.thegfcschool.co.uk,1634623420.0,Mrs,Sue,Wade,Head of School,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not approved,SpLD - Specific Learning Difficulty,"SEMH - Social, Emotional and Mental Health",MLD - Moderate Learning Difficulty,,,,,,,,,,,SEN unit,,,15.0,15.0,South East,Medway,Watling,Gillingham and Rainham,(England/Wales) Urban city and town,E06000035,578373.0,168139.0,Medway 013,Medway 013B,Ofsted,16.0,12.0,Paul Scally,Good,South-East England and South London,,44007001.0,,Not applicable,Not applicable,,,E02003326,E01016042,0.0, +142817,887,Medway,2017,Cedar Children's Academy,Academy sponsor led,Academies,Open,New Provision,01-06-2016,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,,Not applicable,Not applicable,630.0,Not applicable,19-01-2023,668.0,352.0,316.0,26.9,Supported by a multi-academy trust,THE THINKING SCHOOLS ACADEMY TRUST,Linked to a sponsor,The Thinking Schools Academy Trust,Not applicable,,10056531.0,,,09-05-2019,08-01-2024,Cedar Road,Strood,,Rochester,Kent,ME2 2JP,www.cedarchildrensacademy.org.uk,3333602105.0,Ms,Tracey,Baillie,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Strood West,Rochester and Strood,(England/Wales) Urban city and town,E06000035,572439.0,168467.0,Medway 011,Medway 011D,,,,,Good,South-East England and South London,,200000895826.0,,Not applicable,Not applicable,,,E02003324,E01016157,180.0, +143261,887,Medway,2203,Walderslade Primary School,Academy converter,Academies,Open,Academy Converter,01-09-2016,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,240.0,No Special Classes,19-01-2023,235.0,110.0,125.0,16.6,Supported by a multi-academy trust,RIVERMEAD INCLUSIVE TRUST,Linked to a sponsor,Rivermead Inclusive Trust,Not applicable,,10057635.0,,Not applicable,21-11-2018,30-04-2024,Dargets Road,Walderslade,,Chatham,Kent,ME5 8BJ,www.walderslade-pri.medway.sch.uk/,1634337766.0,Mrs,Amy,Rowley-Jones,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Lordswood & Walderslade,Chatham and Aylesford,(England/Wales) Urban city and town,E06000035,576195.0,163447.0,Medway 037,Medway 037B,,,,,Good,South-East England and South London,,44045350.0,,Not applicable,Not applicable,,,E02003350,E01016169,39.0, +143262,887,Medway,2213,Hoo St Werburgh Primary School and the Marlborough,Academy converter,Academies,Open,Academy Converter,01-09-2016,,,Primary,2.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,525.0,Has Special Classes,19-01-2023,573.0,308.0,265.0,19.9,Supported by a multi-academy trust,RIVERMEAD INCLUSIVE TRUST,Linked to a sponsor,Rivermead Inclusive Trust,Not applicable,,10057859.0,,Not applicable,06-03-2024,22-05-2024,Pottery Road,Hoo St Werburgh,,Rochester,Kent,ME3 9BS,www.hoo-st-werburgh.medway.sch.uk,1634338040.0,Mr,Simon,McLean,Head of School,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,ASD - Autistic Spectrum Disorder,,,,,,,,,,,,,Resourced provision and SEN unit,80.0,80.0,80.0,80.0,South East,Medway,Hoo St Werburgh & High Halstow,Rochester and Strood,(England/Wales) Rural town and fringe,E06000035,577642.0,172283.0,Medway 003,Medway 003D,,,,,Good,South-East England and South London,,200000900025.0,,Not applicable,Not applicable,,,E02003316,E01016077,114.0, +143458,887,Medway,2684,Deanwood Primary School,Academy converter,Academies,Open,Academy Converter,01-10-2016,,,Primary,2.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,210.0,Not applicable,19-01-2023,207.0,102.0,105.0,18.4,Supported by a multi-academy trust,THE HOWARD ACADEMY TRUST,Linked to a sponsor,The Howard Academy Trust,Not applicable,,10061378.0,,Not applicable,02-11-2018,23-05-2024,"Deanwood Primary School, Long Catlis Road",Parkwood,,Gillingham,Kent,ME8 9TX,https://www.deanwood-that.org.uk/,1634231901.0,Mrs,Jane,Wright,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Rainham South East,Gillingham and Rainham,(England/Wales) Urban city and town,E06000035,580615.0,163584.0,Medway 036,Medway 036B,,,,,Good,South-East England and South London,,200000909507.0,,Not applicable,Not applicable,,,E02003349,E01016099,38.0, +143832,887,Medway,3758,The Pilgrim School (A Church of England Primary With Nursery),Academy converter,Academies,Open,Academy Converter,01-12-2016,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,210.0,Not applicable,19-01-2023,229.0,102.0,127.0,18.6,Supported by a multi-academy trust,THE PILGRIM MULTI ACADEMY TRUST,-,,Not applicable,,10062013.0,,Not applicable,,01-06-2024,Warwick Crescent,Borstal,,Rochester,Kent,ME1 3LF,www.thepilgrimschool.co.uk,16343975555.0,Mrs,Alison,Mepsted,,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Rochester West & Borstal,Rochester and Strood,(England/Wales) Urban city and town,E06000035,572771.0,166724.0,Medway 024,Medway 024B,,,,,,South-East England and South London,,44010044.0,,Not applicable,Not applicable,,,E02003337,E01016127,39.0, +143880,887,Medway,2214,Balfour Junior School,Academy converter,Academies,Open,Academy Converter,01-01-2017,,,Primary,7.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,480.0,No Special Classes,19-01-2023,480.0,257.0,223.0,29.0,Supported by a multi-academy trust,BEYOND SCHOOLS TRUST,Linked to a sponsor,FPTA Academies (Fort Pitt Grammar School and The Thomas Aveling School),Not applicable,,10062374.0,,Not applicable,05-12-2018,23-04-2024,Balfour Road,,,Chatham,Kent,ME4 6QX,www.balfourjuniorschool.org.uk,1634843833.0,Mrs,Zoe,Mayston,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Fort Pitt,Chatham and Aylesford,(England/Wales) Urban city and town,E06000035,575169.0,166802.0,Medway 021,Medway 021D,,,,,Good,South-East England and South London,,44038129.0,,Not applicable,Not applicable,,,E02003334,E01016125,139.0, +143909,887,Medway,2018,Wayfield Primary School,Academy converter,Academies,Open,Fresh Start,01-09-2016,,,Primary,2.0,11,,Has Nursery Classes,Not applicable,Mixed,None,Does not apply,,,360.0,Not applicable,19-01-2023,392.0,212.0,180.0,39.0,Supported by a multi-academy trust,THE PRIMARY FIRST TRUST,Linked to a sponsor,The Primary First Trust,Not applicable,,10062232.0,,,22-05-2019,25-04-2024,Wayfield Road,,,Chatham,Kent,ME5 0HH,www.wayfield.medway.sch.uk,3000658230.0,Miss,Ria,Henry,Head Teacher,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Wayfield & Weeds Wood,Chatham and Aylesford,(England/Wales) Urban city and town,E06000035,576192.0,165414.0,Medway 027,Medway 027E,,,,,Good,South-East England and South London,,,,Not applicable,Not applicable,,,E02003340,E01016068,135.0, +144132,887,Medway,2592,Thames View Primary School,Academy converter,Academies,Open,Academy Converter,01-04-2017,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,450.0,No Special Classes,19-01-2023,449.0,224.0,225.0,18.0,Supported by a multi-academy trust,THE HOWARD ACADEMY TRUST,Linked to a sponsor,The Howard Academy Trust,Not applicable,,10063038.0,,Not applicable,17-05-2023,23-05-2024,Bloors Lane,Rainham,,Gillingham,Kent,ME8 7DX,https://www.thamesview-that.org.uk/,1634629080.0,Mrs,Leanna,Rogers,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Rainham North,Gillingham and Rainham,(England/Wales) Urban city and town,E06000035,581008.0,166754.0,Medway 023,Medway 023C,,,,,Good,South-East England and South London,,44103856.0,,Not applicable,Not applicable,,,E02003336,E01016166,74.0, +144133,887,Medway,2479,St Margaret's Infant School,Academy converter,Academies,Open,Academy Converter,01-04-2017,,,Primary,3.0,7,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,None,Does not apply,Not applicable,Not applicable,270.0,No Special Classes,19-01-2023,300.0,155.0,145.0,10.6,Supported by a multi-academy trust,THE WESTBROOK TRUST,Linked to a sponsor,The Westbrook Trust,Not applicable,,10063037.0,,Not applicable,13-02-2020,21-05-2024,"St Margaret's Infant School, Orchard Street",Orchard Street,Rainham,Gillingham,Kent,ME8 9AE,http://www.stmargaretsinf.medway.sch.uk,1634231327.0,Mrs,Paula,Fewtrell,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Rainham South West,Gillingham and Rainham,(England/Wales) Urban city and town,E06000035,581405.0,165749.0,Medway 029,Medway 029C,,,,,Good,South-East England and South London,,100062396976.0,,Not applicable,Not applicable,,,E02003342,E01016089,30.0, +144134,887,Medway,1107,The Rowans,Academy alternative provision converter,Academies,Open,Academy Converter,01-06-2017,,,Not applicable,5.0,16,No boarders,Not applicable,Not applicable,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,65.0,Not applicable,19-01-2023,26.0,18.0,8.0,65.4,Supported by a multi-academy trust,THE INSPIRING CHANGE MULTI-ACADEMY TRUST,-,,Not applicable,,10063925.0,,Not applicable,10-11-2021,19-03-2024,Silverbank,Churchill Avenue,,Chatham,Kent,ME5 0LB,www.therowans.org,1634338803.0,Mrs,Fiona,May,Headteacher,Not applicable,,,,Not applicable,,Does not have child care facilities,PRU Does have Provision for SEN,PRU Does have EBD provision,66.0,PRU offers full time provision,Does not offer tuition by another provider,Not applicable,"SEMH - Social, Emotional and Mental Health",,,,,,,,,,,,,Resourced provision,65.0,65.0,,,South East,Medway,Wayfield & Weeds Wood,Chatham and Aylesford,(England/Wales) Urban city and town,E06000035,576044.0,164885.0,Medway 027,Medway 027E,,,,,Outstanding,South-East England and South London,,44112005.0,,Not applicable,Not applicable,,,E02003340,E01016068,17.0, +144135,887,Medway,3757,Riverside Primary School,Academy converter,Academies,Open,Academy Converter,01-04-2017,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,390.0,Not applicable,19-01-2023,406.0,220.0,186.0,32.5,Supported by a multi-academy trust,RMET,Linked to a sponsor,RMET (Rainham Mark Education Trust),Not applicable,,10063036.0,,Not applicable,13-11-2019,29-05-2024,St Edmunds Way,Rainham,,Gillingham,Kent,ME8 8ET,www.riverside.medway.sch.uk/,1634623500.0,Mrs,Helen,Robson,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,VI - Visual Impairment,ASD - Autistic Spectrum Disorder,,,,,,,,,,,,Resourced provision,17.0,15.0,,,South East,Medway,Rainham North,Gillingham and Rainham,(England/Wales) Urban city and town,E06000035,582416.0,166196.0,Medway 025,Medway 025C,,,,,Good,South-East England and South London,,44110167.0,,Not applicable,Not applicable,,,E02003338,E01016097,117.0, +144423,887,Medway,2396,Barnsole Primary School,Academy converter,Academies,Open,Academy Converter,01-05-2017,,,Primary,2.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,630.0,No Special Classes,19-01-2023,671.0,336.0,335.0,25.9,Supported by a multi-academy trust,MARITIME ACADEMY TRUST,Linked to a sponsor,Maritime Academy Trust,Not applicable,,10063725.0,,Not applicable,29-02-2024,22-05-2024,Barnsole Road,,,Gillingham,Kent,ME7 2JG,www.barnsoleprimary.medway.sch.uk,1634333400.0,Mr,Jonathan,Smales,Head of School,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Watling,Gillingham and Rainham,(England/Wales) Urban city and town,E06000035,578041.0,167976.0,Medway 013,Medway 013D,,,,,Good,South-East England and South London,,44076748.0,,Not applicable,Not applicable,,,E02003326,E01016177,168.0, +144566,887,Medway,2492,Bligh Primary School (Juniors),Academy converter,Academies,Open,Academy Converter,01-10-2017,,,Primary,7.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,330.0,No Special Classes,19-01-2023,328.0,159.0,169.0,35.7,Supported by a multi-academy trust,MARITIME ACADEMY TRUST,Linked to a sponsor,Maritime Academy Trust,Not applicable,,10064767.0,,Not applicable,22-06-2023,04-06-2024,Bligh Way,Strood,,Rochester,Kent,ME2 2XJ,www.blighprimaryschool.co.uk,1634336220.0,Mr,Christian,Markham,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Strood West,Rochester and Strood,(England/Wales) Urban city and town,E06000035,571407.0,169082.0,Medway 008,Medway 008D,,,,,Good,South-East England and South London,,100062388554.0,,Not applicable,Not applicable,,,E02003321,E01016155,117.0, +144639,887,Medway,2623,Miers Court Primary School,Academy converter,Academies,Open,Academy Converter,01-08-2017,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,No Special Classes,19-01-2023,394.0,200.0,194.0,14.2,Supported by a multi-academy trust,THE HOWARD ACADEMY TRUST,Linked to a sponsor,The Howard Academy Trust,Not applicable,,10064690.0,,Not applicable,03-11-2021,17-04-2024,Silverspot Close,,,Rainham,Kent,ME8 8JR,https://www.mierscourt-that.org.uk/,1634388943.0,Mrs,Susan,Chapman,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Rainham South East,Gillingham and Rainham,(England/Wales) Urban city and town,E06000035,581647.0,165162.0,Medway 032,Medway 032C,,,,,Good,South-East England and South London,,44101008.0,,Not applicable,Not applicable,,,E02003345,E01016104,56.0, +144914,887,Medway,3293,St Margaret's at Troy Town CofE Voluntary Controlled Primary School,Academy converter,Academies,Open,Academy Converter,01-09-2017,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Church of England,Does not apply,Diocese of Rochester,Not applicable,210.0,No Special Classes,19-01-2023,225.0,119.0,106.0,37.3,Supported by a multi-academy trust,THE PILGRIM MULTI ACADEMY TRUST,-,,Not applicable,,10065034.0,,Not applicable,02-12-2021,05-02-2024,King Street,,,Rochester,Kent,ME1 1YF,http://www.stmargaretsattroytown.co.uk,1634843843.0,Miss,Katie,Willis,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,Not applicable,,,,,South East,Medway,Rochester East & Warren Wood,Rochester and Strood,(England/Wales) Urban city and town,E06000035,574390.0,167980.0,Medway 014,Medway 014A,,,,,Good,South-East England and South London,,44023621.0,,Not applicable,Not applicable,,,E02003327,E01016117,76.0, +144915,887,Medway,2537,Bligh Primary School (Infants),Academy converter,Academies,Open,Academy Converter,01-10-2017,,,Primary,2.0,7,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,270.0,No Special Classes,19-01-2023,325.0,157.0,168.0,27.9,Supported by a multi-academy trust,MARITIME ACADEMY TRUST,Linked to a sponsor,Maritime Academy Trust,Not applicable,,10065035.0,,Not applicable,,04-06-2024,Bligh Way,Strood,,Rochester,Kent,ME2 2XJ,www.blighprimaryschool.co.uk,1634336220.0,Mr,Christian,Markham,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Strood West,Rochester and Strood,(England/Wales) Urban city and town,E06000035,571407.0,169082.0,Medway 008,Medway 008D,,,,,,South-East England and South London,,100062388554.0,,Not applicable,Not applicable,,,E02003321,E01016155,80.0, +144969,887,Medway,2019,Featherby Junior School,Academy sponsor led,Academies,Open,New Provision,01-09-2017,,,Primary,7.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,,Not applicable,Not applicable,360.0,Not applicable,19-01-2023,339.0,165.0,174.0,34.2,Supported by a multi-academy trust,MARITIME ACADEMY TRUST,Linked to a sponsor,Maritime Academy Trust,Not applicable,,10065102.0,,,29-06-2022,07-05-2024,Chilham Road,,Featherby Junior School,Gillingham,Kent,ME8 6BT,www.featherby-jun.medway.sch.uk,1634231984.0,Mrs,Emma,Pape,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Twydall,Gillingham and Rainham,(England/Wales) Urban city and town,E06000035,579316.0,167170.0,Medway 018,Medway 018D,,,,,Good,South-East England and South London,,44088972.0,,Not applicable,Not applicable,,,E02003331,E01016163,116.0, +145042,887,Medway,2401,Featherby Infant and Nursery School,Academy converter,Academies,Open,Academy Converter,01-09-2017,,,Primary,3.0,7,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,270.0,No Special Classes,19-01-2023,297.0,155.0,142.0,32.1,Supported by a multi-academy trust,MARITIME ACADEMY TRUST,Linked to a sponsor,Maritime Academy Trust,Not applicable,,10065161.0,,Not applicable,17-11-2021,07-05-2024,Allington Road,,,Gillingham,Kent,ME8 6PD,http://www.featherby-inf.medway.sch.uk,1634231072.0,Mrs,Emma,Pape,Head of School,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Twydall,Gillingham and Rainham,(England/Wales) Urban city and town,E06000035,579330.0,167352.0,Medway 018,Medway 018D,,,,,Good,South-East England and South London,,44088976.0,,Not applicable,Not applicable,,,E02003331,E01016163,93.0, +145112,887,Medway,2020,Maundene School,Academy sponsor led,Academies,Open,New Provision,01-01-2018,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,,Not applicable,Not applicable,420.0,Not applicable,19-01-2023,395.0,187.0,208.0,22.0,Supported by a multi-academy trust,INSPIRE PARTNERSHIP ACADEMY TRUST,Linked to a sponsor,Inspire Partnership Academy Trust,Not applicable,,10065460.0,,,15-06-2022,02-05-2024,Swallow Rise,Walderslade,,Chatham,Kent,ME5 7QB,https://www.maundene.medway.sch.uk/,1634864721.0,Miss,Joanne,Capes,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Princes Park,Chatham and Aylesford,(England/Wales) Urban city and town,E06000035,576557.0,164396.0,Medway 034,Medway 034A,,,,,Good,South-East England and South London,,44047176.0,,Not applicable,Not applicable,,,E02003347,E01016078,87.0, +145440,887,Medway,2499,Hilltop Primary School,Academy converter,Academies,Open,Academy Converter,01-02-2018,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,448.0,No Special Classes,19-01-2023,436.0,242.0,194.0,14.3,Supported by a multi-academy trust,BEYOND SCHOOLS TRUST,Linked to a sponsor,FPTA Academies (Fort Pitt Grammar School and The Thomas Aveling School),Not applicable,,10066627.0,,Not applicable,29-06-2022,23-04-2024,Hilltop Road,Frindsbury,,Rochester,Kent,ME2 4QN,www.hilltopprimary.co.uk,1634710312.0,Mrs,Ewa,Eddy,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Strood Rural,Rochester and Strood,(England/Wales) Urban city and town,E06000035,574043.0,170333.0,Medway 004,Medway 004C,,,,,Good,South-East England and South London,,100062389240.0,,Not applicable,Not applicable,,,E02003317,E01016148,61.0, +145926,887,Medway,2021,Elaine Primary School,Academy sponsor led,Academies,Open,Fresh Start,01-05-2018,,,Primary,3.0,11,No boarders,Has Nursery Classes,Not applicable,Mixed,None,None,,,350.0,Has Special Classes,19-01-2023,301.0,148.0,153.0,56.1,Supported by a multi-academy trust,INSPIRE PARTNERSHIP ACADEMY TRUST,Linked to a sponsor,Inspire Partnership Academy Trust,Not applicable,,10067319.0,,,22-09-2022,16-04-2024,Elaine Avenue,,,Rochester,,ME2 2YN,http://www.elaine.medway.sch.uk/,1634294817.0,Mrs,Sarah,Martin,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,"SEMH - Social, Emotional and Mental Health",,,,,,,,,,,,,SEN unit,,,20.0,11.0,South East,Medway,Strood West,Rochester and Strood,(England/Wales) Urban city and town,E06000035,572443.0,168984.0,Medway 011,Medway 011A,,,,,Good,South-East England and South London,United Kingdom,200000895803.0,,Not applicable,Not applicable,,,E02003324,E01016150,169.0, +146648,887,Medway,4003,Waterfront UTC,University technical college,Free Schools,Open,,01-04-2019,,,Secondary,14.0,19,,No Nursery Classes,Has a sixth form,Mixed,Does not apply,Does not apply,,Non-selective,250.0,Not applicable,19-01-2023,267.0,190.0,77.0,31.3,Supported by a multi-academy trust,THE HOWARD ACADEMY TRUST,Linked to a sponsor,The Howard Academy Trust,Not applicable,,10082095.0,,,11-01-2023,14-09-2023,South Side Three Road,,,Chatham,Kent,ME4 4FQ,www.waterfront-that.org.uk,1634505800.0,Mrs,Fiona,McLean,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,St Mary's Island,Rochester and Strood,(England/Wales) Urban city and town,E06000035,577382.0,169573.0,Medway 007,Medway 007H,,,,,Good,South-East England and South London,United Kingdom,44039551.0,,Not applicable,Not applicable,,,E02003320,E01035292,66.0, +146872,887,Medway,2211,Halling Primary School,Academy converter,Academies,Open,Academy Converter,01-04-2019,,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,420.0,No Special Classes,19-01-2023,376.0,188.0,188.0,17.3,Supported by a multi-academy trust,ALETHEIA ACADEMIES TRUST,Linked to a sponsor,Aletheia Academies Trust,Not applicable,,10082988.0,,Not applicable,07-06-2023,14-05-2024,Howlsmere Close,Halling,,Rochester,Kent,ME2 1ER,http://www.halling.medway.sch.uk/,1634240258.0,Ms,Lisa,Taylor,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,"Cuxton, Halling & Riverside",Rochester and Strood,(England/Wales) Rural town and fringe,E06000035,570607.0,163387.0,Medway 028,Medway 028A,,,,,Good,South-East England and South London,,44000585.0,,Not applicable,Not applicable,,,E02003341,E01016026,65.0, +147446,887,Medway,2022,Wainscott Primary School,Academy sponsor led,Academies,Open,New Provision,01-09-2019,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,446.0,No Special Classes,19-01-2023,455.0,235.0,220.0,17.6,Supported by a multi-academy trust,THE PRIMARY FIRST TRUST,Linked to a sponsor,The Primary First Trust,Not applicable,,10084146.0,,,,21-05-2024,Wainscott Road,Wainscott,,Rochester,Kent,ME2 4JX,www.wainscott.medway.sch.uk,1634332550.0,Mrs,Monique,Clark,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Strood Rural,Rochester and Strood,(England/Wales) Urban city and town,E06000035,574754.0,170678.0,Medway 004,Medway 004E,,,,,,South-East England and South London,United Kingdom,44028647.0,,Not applicable,Not applicable,,,E02003317,E01035289,80.0, +147769,887,Medway,2023,Delce Academy,Academy converter,Academies,Open,Fresh Start,01-03-2020,,,Primary,5.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,None,Does not apply,,,360.0,Has Special Classes,19-01-2023,359.0,193.0,166.0,44.0,Supported by a multi-academy trust,INSPIRE PARTNERSHIP ACADEMY TRUST,Linked to a sponsor,Inspire Partnership Academy Trust,Not applicable,,10085699.0,,,,28-05-2024,The Tideway,,,Rochester,Kent,ME1 2NJ,www.delceacademy.co.uk,1634845242.0,Miss,Loni,Stevens,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,"SEMH - Social, Emotional and Mental Health",,,,,,,,,,,,,SEN unit,,,15.0,15.0,South East,Medway,Rochester East & Warren Wood,Rochester and Strood,(England/Wales) Urban city and town,E06000035,574455.0,166524.0,Medway 017,Medway 017C,,,,,,South-East England and South London,United Kingdom,44022435.0,,Not applicable,Not applicable,,,E02003330,E01016115,158.0, +148117,887,Medway,2433,Oaklands School,Academy converter,Academies,Open,Academy Converter,01-09-2020,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,450.0,No Special Classes,19-01-2023,430.0,208.0,222.0,42.2,Supported by a multi-academy trust,THE WESTBROOK TRUST,Linked to a sponsor,The Westbrook Trust,Not applicable,,10086851.0,,,04-07-2023,21-05-2024,Weedswood Road,Walderslade,,Chatham,Kent,ME5 0QS,http://www.oaklands.medway.sch.uk,1634333820.0,Mrs,Louisa,Jones,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,Not applicable,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Wayfield & Weeds Wood,Chatham and Aylesford,(England/Wales) Urban city and town,E06000035,575761.0,163898.0,Medway 033,Medway 033D,Not applicable,,,,Good,South-East England and South London,,44033912.0,,Not applicable,Not applicable,,,E02003346,E01016173,175.0, +148577,887,Medway,4004,Leigh Academy Rainham,Free schools,Free Schools,Open,New Provision,01-09-2021,,,Secondary,11.0,19,,No Nursery Classes,Has a sixth form,Mixed,None,None,Not applicable,Non-selective,1150.0,Not applicable,19-01-2023,405.0,223.0,182.0,16.8,Supported by a multi-academy trust,LEIGH ACADEMIES TRUST,Linked to a sponsor,Leigh Academies Trust,Not applicable,,10088768.0,,,28-02-2024,22-05-2024,Otterham Quay Lane,Rainham,,Gillingham,Kent,ME8 8GS,https://leighacademyrainham.org.uk/,1634412440.0,Miss,Alexandra,Millward,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Rainham North,Gillingham and Rainham,(England/Wales) Urban city and town,E06000035,582774.0,165824.0,Medway 025,Medway 025E,,,,,Good,South-East England and South London,United Kingdom,44073878.0,,Not applicable,Not applicable,,,E02003338,E01016102,68.0, +149009,887,Medway,1108,Will Adams Academy,Academy alternative provision converter,Academies,Open,Academy Converter,01-04-2022,,,Not applicable,14.0,17,No boarders,Not applicable,Not applicable,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,,Not applicable,19-01-2023,39.0,21.0,18.0,39.5,Supported by a multi-academy trust,ALTERNATIVE LEARNING TRUST,Linked to a sponsor,Alternative Learning Trust,Not applicable,,10090191.0,,,,16-04-2024,Woodlands Road,,,Gillingham,Kent,ME7 2BX,www.willadamsacademy.org.uk,1634337111.0,Ms,Marie,Woolston,HeadTeacher,Not applicable,,,,Not applicable,,Not applicable,PRU Does not have Provision for SEN,Not applicable,,Not applicable,Not applicable,Not applicable,"SEMH - Social, Emotional and Mental Health",,,,,,,,,,,,,Resourced provision,45.0,45.0,,,South East,Medway,Watling,Gillingham and Rainham,(England/Wales) Urban city and town,E06000035,578774.0,167623.0,Medway 019,Medway 019A,Not applicable,,,,,South-East England and South London,,200003623419.0,,Not applicable,Not applicable,,,E02003332,E01016159,15.0, +149069,887,Medway,2025,Rochester Riverside Church of England Primary School,Free schools,Free Schools,Open,Academy Free School,01-09-2022,,,Primary,3.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Church of England,Christian,,Non-selective,446.0,Not applicable,19-01-2023,26.0,16.0,10.0,0.0,Supported by a multi-academy trust,THE PILGRIM MULTI ACADEMY TRUST,-,,Not applicable,,10090885.0,,,,29-05-2024,Gas House Road,,,Rochester,Kent,ME1 1US,rrcoe.medway.sch.uk,1634471697.0,Mrs,Alison,Mepsted,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Rochester West & Borstal,Rochester and Strood,(England/Wales) Urban city and town,E06000035,574334.0,168802.0,Medway 015,Medway 015F,,,,,,South-East England and South London,United Kingdom,44076556.0,,Not applicable,Not applicable,,,E02003328,E01035296,0.0, +149075,887,Medway,4005,Maritime Academy,Free schools,Free Schools,Open,Academy Free School,01-09-2022,,,Secondary,11.0,19,No boarders,No Nursery Classes,Has a sixth form,Mixed,None,None,Not applicable,Non-selective,1150.0,Not applicable,19-01-2023,142.0,77.0,65.0,27.5,Supported by a multi-academy trust,THE THINKING SCHOOLS ACADEMY TRUST,Linked to a sponsor,The Thinking Schools Academy Trust,Not applicable,,10090894.0,,,,24-05-2024,Frindsbury Hill,Rochester,Kent,Medway,,,https://www.maritimeacademy.org.uk/,3333602150.0,,Jody,Murphy,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Twydall,Gillingham and Rainham,(England/Wales) Urban city and town,E06000035,579947.0,166841.0,Medway 018,Medway 018B,,,,,,South-East England and South London,,,,Not applicable,Not applicable,,,E02003331,E01016161,39.0, +149979,887,Medway,3753,St Benedict's Catholic Primary School,Academy converter,Academies,Open,Academy Converter,01-09-2023,,,Primary,4.0,11,No boarders,No Nursery Classes,Does not have a sixth form,Mixed,Roman Catholic,Does not apply,Archdiocese of Southwark,Not applicable,210.0,No Special Classes,,,,,,Supported by a multi-academy trust,KENT CATHOLIC SCHOOLS' PARTNERSHIP,Linked to a sponsor,Kent Catholic Schools' Partnership,Not applicable,,10092965.0,,,,06-03-2024,Lambourn Way,Lordswood,,Chatham,Kent,ME5 8PU,www.st-benedicts.medway.sch.uk/,1634669700.0,Mrs,Sarah,McAlpine,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,Not applicable,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Lordswood & Walderslade,Chatham and Aylesford,(England/Wales) Urban city and town,E06000035,577291.0,162859.0,Medway 038,Medway 038D,Not applicable,,,,,South-East England and South London,,44058733.0,,Not applicable,Not applicable,,,E02003351,E01016060,, +150154,887,Medway,4007,Oasis Restore,Academy secure 16 to 19,Academies,Open,New Provision,15-04-2024,,,16 plus,12.0,17,,Not applicable,Not applicable,Mixed,,,,,49.0,Not applicable,,,,,,Not applicable,OASIS RESTORE TRUST,Not applicable,,Not applicable,,10094342.0,,,,15-04-2024,1 Kennington Road,,,London,,SE1 7QP,https://www.oasisrestore.org/,2079214200.0,Mr,Andrew,Willetts,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Lambeth,Waterloo & South Bank,Vauxhall,(England/Wales) Urban major conurbation,E06000035,531156.0,179383.0,Lambeth 036,Lambeth 036B,,,,,,,United Kingdom,100023225318.0,,Not applicable,Not applicable,,,E02006801,E01003014,, +150218,887,Medway,2199,Luton Primary School,Academy converter,Academies,Open,Academy Converter,01-11-2023,,,Primary,4.0,11,No boarders,Has Nursery Classes,Does not have a sixth form,Mixed,Does not apply,Does not apply,Not applicable,Not applicable,630.0,No Special Classes,,,,,,Supported by a multi-academy trust,RIVERMEAD INCLUSIVE TRUST,Linked to a sponsor,Rivermead Inclusive Trust,Not applicable,,10093456.0,,,,03-06-2024,Luton Road,,,Chatham,Kent,ME4 5AW,www.lutonprimaryschool.co.uk,1634336900.0,Mrs,Karen,Major,Headteacher,Not applicable,,,,Not applicable,,Not applicable,Not applicable,Not applicable,,Not applicable,Not applicable,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Luton,Chatham and Aylesford,(England/Wales) Urban city and town,E06000035,577119.0,166655.0,Medway 020,Medway 020A,Not applicable,,,,,South-East England and South London,,100062391815.0,,Not applicable,Not applicable,,,E02003333,E01016061,, +150869,887,Medway,4008,Walderslade School,Academy converter,Academies,Open,Fresh Start,01-04-2024,,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Girls,None,Does not apply,,,949.0,Not applicable,,,,,,Supported by a multi-academy trust,BEYOND SCHOOLS TRUST,Linked to a sponsor,FPTA Academies (Fort Pitt Grammar School and The Thomas Aveling School),Not applicable,,10095249.0,,,,04-04-2024,Bradfields Avenue,Walderslade,,Chatham,Kent,ME5 0LE,,,Mrs,Louise,Campbell,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Wayfield & Weeds Wood,Chatham and Aylesford,(England/Wales) Urban city and town,E06000035,575885.0,164367.0,Medway 027,Medway 027D,,,,,,South-East England and South London,United Kingdom,44033058.0,,Not applicable,Not applicable,,,E02003340,E01016067,, +150870,887,Medway,4009,Greenacre School,Academy converter,Academies,Open,Fresh Start,01-04-2024,,,Secondary,11.0,18,No boarders,No Nursery Classes,Has a sixth form,Boys,None,Does not apply,,,969.0,Not applicable,,,,,,Supported by a multi-academy trust,BEYOND SCHOOLS TRUST,Linked to a sponsor,FPTA Academies (Fort Pitt Grammar School and The Thomas Aveling School),Not applicable,,10095250.0,,,,04-04-2024,157 Walderslade Road,Walderslade,,Chatham,Kent,ME5 0LP,,,Mrs,Louise,Campbell,,Not applicable,,,,Not applicable,,,Not applicable,Not applicable,,,,Not applicable,,,,,,,,,,,,,,,,,,,South East,Medway,Wayfield & Weeds Wood,Chatham and Aylesford,(England/Wales) Urban city and town,E06000035,576000.0,164283.0,Medway 034,Medway 034C,,,,,,South-East England and South London,United Kingdom,44026624.0,,Not applicable,Not applicable,,,E02003347,E01016081,, diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..47929cc --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,16 @@ +services: + backend: + container_name: ccapi + build: + context: . + dockerfile: Dockerfile + env_file: .env + ports: + - "${PORT_BACKEND}:${PORT_BACKEND}" + networks: + - kevlarai-network + +networks: + kevlarai-network: + name: kevlarai-network + driver: bridge diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh new file mode 100644 index 0000000..3599552 --- /dev/null +++ b/docker-entrypoint.sh @@ -0,0 +1,43 @@ +#!/bin/bash +set -e + +# Add backend to Python path +export PYTHONPATH="/app:${PYTHONPATH}" + +# Create init directories +mkdir -p /init + +# Function to check if initialization is needed +check_init_needed() { + if [ ! -f "/init/status.json" ]; then + return 0 + fi + + # Check if any status is incomplete + incomplete=$(python -c " +import json +try: + with open('/init/status.json', 'r') as f: + status = json.load(f) + print(not all(v for k, v in status.items() if k != 'timestamp')) +except (FileNotFoundError, json.JSONDecodeError): + print('True') +") + + if [ "$incomplete" = "True" ]; then + return 0 + else + return 1 + fi +} + +# Run initialization if needed +if check_init_needed; then + echo "Running initialization..." + python -c "from run.initialization import initialize_system; initialize_system()" +else + echo "System already initialized, skipping..." +fi + +# Execute the main command +exec "$@" \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..7f4d46f --- /dev/null +++ b/main.py @@ -0,0 +1,133 @@ +import os +from modules.logger_tool import initialise_logger +logger = initialise_logger(__name__, os.getenv("LOG_LEVEL"), os.getenv("LOG_PATH"), 'default', True) +from fastapi import FastAPI, HTTPException +import uvicorn +import requests +from typing import Dict, Any +from modules.database.tools.neo4j_driver_tools import get_driver +from run.initialization.initialization import InitializationSystem +import time +import ssl + +from run.setup import setup_cors +from run.routers import register_routes +from run.initialization import initialize_system + +# FastAPI App Setup +app = FastAPI() +setup_cors(app) + +# Health check endpoint +@app.get("/health") +async def health_check() -> Dict[str, Any]: + """Health check endpoint that verifies all service dependencies""" + health_status = { + "status": "healthy", + "services": { + "neo4j": {"status": "healthy", "message": "Connected"}, + "supabase": {"status": "healthy", "message": "Connected"} + } + } + + try: + # Check Neo4j + driver = get_driver() + if not driver: + health_status["services"]["neo4j"] = { + "status": "unhealthy", + "message": "Failed to connect to Neo4j" + } + health_status["status"] = "unhealthy" + except Exception as e: + health_status["services"]["neo4j"] = { + "status": "unhealthy", + "message": f"Error checking Neo4j: {str(e)}" + } + health_status["status"] = "unhealthy" + + try: + # Minimal check to confirm Supabase is responsive (e.g., pinging auth or storage endpoint) + supabase_url = os.getenv("SUPABASE_URL") + service_role_key = os.getenv("SERVICE_ROLE_KEY") + response = requests.get( + f"{supabase_url}/auth/v1/health", + headers={"apikey": service_role_key}, + timeout=5 + ) + if response.status_code != 200: + health_status["services"]["supabase"] = { + "status": "unhealthy", + "message": f"Supabase Auth API returned status {response.status_code}" + } + health_status["status"] = "unhealthy" + except Exception as e: + health_status["services"]["supabase"] = { + "status": "unhealthy", + "message": f"Error checking Supabase Auth API: {str(e)}" + } + health_status["status"] = "unhealthy" + + if health_status["status"] == "unhealthy": + raise HTTPException(status_code=503, detail=health_status) + + return health_status + +# Register routes +register_routes(app) + +# Initialize system with retry logic +def initialize_with_retry(max_attempts: int = 3, initial_delay: int = 5) -> bool: + """Initialize the system with retry logic""" + attempt = 0 + delay = initial_delay + + while attempt < max_attempts: + try: + logger.info(f"Attempting system initialization (attempt {attempt + 1}/{max_attempts})") + initialize_system() + logger.info("System initialization completed successfully") + return True + except Exception as e: + attempt += 1 + if attempt == max_attempts: + logger.error(f"System initialization failed after {max_attempts} attempts: {str(e)}") + return False + + logger.warning(f"Initialization attempt {attempt} failed: {str(e)}. Retrying in {delay} seconds...") + time.sleep(delay) + delay *= 2 # Exponential backoff + + return False + +if __name__ == "__main__": + import uvicorn + import os + + # Run initialization with retry logic + if not initialize_with_retry(): + logger.error("Failed to initialize system after multiple attempts") + # Continue anyway to allow the API to start and handle health checks + + if os.getenv('BACKEND_DEV_MODE') == 'true': + logger.info("Running with Reload") + uvicorn.run( + "main:app", + host="0.0.0.0", + port=int(os.getenv('PORT_BACKEND', 8000)), + log_level="info", + proxy_headers=True, + timeout_keep_alive=10, + reload=True + ) + else: + logger.info("Running without Reload and without SSL (behind reverse proxy)") + uvicorn.run( + "main:app", + host="0.0.0.0", + port=int(os.getenv('PORT_BACKEND', 8000)), # <-- not 443 + log_level="info", + proxy_headers=True, + timeout_keep_alive=10, + workers=int(os.getenv('UVICORN_WORKERS', '1')) + ) diff --git a/modules/__init__.py b/modules/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/modules/__pycache__/__init__.cpython-311.pyc b/modules/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3ead5b3aa0935e32855522471ce513eecb9b16bd GIT binary patch literal 133 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 literal 0 HcmV?d00001 diff --git a/modules/__pycache__/logger_tool.cpython-311.pyc b/modules/__pycache__/logger_tool.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b2bb540cf0a4599e61301015d8d41eef56336b14 GIT binary patch literal 11589 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 RyIlp^jVx-+pMq4A{ttzrFwX!0 literal 0 HcmV?d00001 diff --git a/modules/__pycache__/pdf_utils.cpython-311.pyc b/modules/__pycache__/pdf_utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7573fad31174ac16c4bf3134dc23ce45e058a930 GIT binary patch literal 2469 zcmb_e&2Jk;6rb6hU4Jwti4z(-rKy{QsCHF{w$SoXQ5vNV0x3k49%>a?ThFF-vDapH zOp|D>R;Y&vRl+^B0wIEgN>DG{fFu12Vq^(xq)3$z2X2m1q^RP+n~m*sQ&$3s+1=l~ znfK=Hn>X{D-S0x7AcFFDV&;mXA@sX!v>GVJBnd8dH>3OqF7jP{q{d2~}^Bd!W6)Z3&pxJ9;1J$y0hi)np99KR2B^&vSWO_)By? zGoQh0 zDizGzvjkfQa_G(2E2yGyU)v8tSKBLroL$~3s-s@*_?ku^zEB|!cF2m1|Ec1QmXal~ zSPCIj!MFAYVBO^9jRYfW&loz2Y;sLmP%ofsu=W=ahReY+pGzl#u~s>|z?qTdF>WsK zShi?!)8estRxHGf7$iL=Q{6FsJlO7vSw%1_mM!{vOdz4KO9BUH<36FA3ptzHqCW)# zXNx=~ZO$@QWP%h+rX}>bMR0OV1m@`c`=&unCbW`q*|bFugdk(d$XMbUlc^L$HUx23 zJSf+mZI2=D7@0$NB9Eh!MyWJeDAID?v?rxuS?-r)X;D1?q~DC3TL$z?Bketv?5dYb zVLt@8fto?o7y119XV+`Jv3hT;iEv;BuZPFh#?SurDgfNIaH<|ot@WfH_VzE6^-zEH z(B0`;=wLl`u!+>b@s$tOqX+8I`098qI$4iSF2B==jMgKEz*p$F3sutS8@x+?i^PA8 z#A}hm^~m8>T8kX3^&P8{Dru_HPy<)4KNmKn=SLED`npM5TU*__<+KKu_t^a~$)8_4 zb6Wl7G?`L;4|ELJomSTWPODv%QoI`(D21OvDeNU^MRAlJN|kU9RaAJ0qy8IG0R^KM z;pnSq72VNUnD;_XTE)@5Z*qvEodVshVJu z7@7Fm`ogM>Bf+hyW5U4nW>?y|DwI{kQNVk)6N zNRX+d@4-u)L{ZE%%9oZ8?I18%hg8!FPnH!r$2 z%@L5B%Ahv9@^TYFwL0xqJJ7KPKM)_d$fwVjPOSrVG^OKwvDI7l&Wpvao{ZlKT&_iCVhYu>v_CNKo{G;GMeM_m+d G6#oE$3oo_+ literal 0 HcmV?d00001 diff --git a/modules/__pycache__/redis_config.cpython-311.pyc b/modules/__pycache__/redis_config.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..49aec9d3873dd6a544f3d97d75b53c56b5eaa77b GIT binary patch literal 2266 zcmbVN%WE4)7@ytMYIn7(M=V=*Y^PNd$FbVR#z`9!QygT+Bx#hS#7;wW5vq1=Z@SWo z*>zqxL6jcUV46Y?F_eNXbyJc<3oZ2O|6mmaSq21wo(esvO%EaT&~H``+e!kZpJsmZ z`W~}0zxniiFc?4}|Ga%_iYNJT1Rpgfai@@$%A5Q{VhD!U14 z58F0q6LcR!Z3;uJSc6M*UhB*AX+O+yX#p&`tL+F#^{M6;j=`h3&UX8RpXdzX6 z6zxJKk9z0e+sdpCbIp`PoaS7Kxy0OW9S!PWXwh zkj-mE0?mw}UDFIA(rz(puQYp0x}gyPuNG__^a6Bo$;A1ronQ!mkp?E=)P=cZDsyrE zgcD6A(X_HC9Z^o<4ST>bM>W!DlffqG~x))nMCJ(JWY+mFwIyd^Zo3 zgZk_bfcr>7HneT2?9^;eqO~rz+-BAo{H_f=Y)gfDd`VQ$`v!f>c5}^^wpG`d-Kz`0 z#07K!*&Rk9G=lKH+pHbjwo=(O_Eny*fc0(m4oiJBd)Jxk=mvKMU1t*9`CGxcY;HwU z<7(ENEgg}(mg&Vq7unD)U*+hVgS=I~7#HSaQOybk7Wep`YFJir5CpaQ`&N82BH;L?Zfm0BSFq%crC?1c$7@o)$ixVw!O|)Wp|pom>G*0#uKE ze?jNJvTrBTZ0eyU-Q3v(&ks9HWRTs-TL@Js?_ZMFF|@@&W!s>|!SMFX|K(t0uF1jH z(Ai?2bXdrpCSn>vp z+9bno(xo17*3G3+Sa^$SehEOipHSvhkE=>k8e4>Hc@EQgIiMonMBM!{AX(T7ZXe%5@9^69N29p(HdSh#7ED|IYGM=_}8!pK)S`oJ6v!%+{3Ik_7f8>1lXhd3F8H jhW_h_6FyN5pQwdTl$3@~Vj!7xAjUJmjF$nw2Z!=68!#!? literal 0 HcmV?d00001 diff --git a/modules/__pycache__/test_analyzer.cpython-311.pyc b/modules/__pycache__/test_analyzer.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ec4a7bd8eb03ec74e8fac4393ddf7e3cfc7c964d GIT binary patch literal 7541 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 bOKknB+0~`8EXGp1XJ49qU;Tw4^nCvpZck17 literal 0 HcmV?d00001 diff --git a/modules/auth/__init__.py b/modules/auth/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/modules/auth/supabase_bearer.py b/modules/auth/supabase_bearer.py new file mode 100644 index 0000000..8cab779 --- /dev/null +++ b/modules/auth/supabase_bearer.py @@ -0,0 +1,81 @@ +import os +from modules.logger_tool import initialise_logger +logger = initialise_logger(__name__, os.getenv("LOG_LEVEL"), os.getenv("LOG_PATH"), 'default', True) + +from fastapi import Request, HTTPException, Depends +from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials +import jwt +from jwt.exceptions import InvalidTokenError +import os + +class SupabaseBearer(HTTPBearer): + def __init__(self, auto_error: bool = True): + super().__init__(auto_error=auto_error) + + async def __call__(self, credentials: HTTPAuthorizationCredentials = Depends(HTTPBearer())): + if not credentials: + raise HTTPException(status_code=403, detail="Invalid authorization code.") + + try: + token = credentials.credentials + payload = verify_supabase_token(token) + return payload + except Exception as e: + logger.error(f"Token verification failed: {str(e)}") + raise HTTPException(status_code=403, detail="Invalid token or expired token.") + +def verify_supabase_token(token: str) -> dict: + """Verify a Supabase JWT token and return its payload.""" + try: + jwt_secret = os.getenv("JWT_SECRET") + if not jwt_secret: + raise ValueError("JWT_SECRET not configured") + + # Decode the token with proper audience check + payload = jwt.decode( + token, + jwt_secret, + algorithms=["HS256"], + audience="authenticated" + ) + + logger.debug(f"Token payload: {payload}") + + return payload + except jwt.ExpiredSignatureError: + logger.error("Token has expired") + raise HTTPException(status_code=401, detail="Token has expired") + except jwt.InvalidTokenError as e: + logger.error(f"Invalid token: {str(e)}") + raise HTTPException(status_code=401, detail="Invalid token") + except Exception as e: + logger.error(f"Token verification failed: {str(e)}") + raise HTTPException(status_code=401, detail="Token verification failed") + +def decodeSupabaseJWT(token: str) -> dict: + try: + jwt_secret = os.getenv('SUPABASE_JWT_SECRET') + payload = jwt.decode(token, jwt_secret, algorithms=["HS256"], audience="authenticated") + return payload + except Exception: + return None + +# Initialize the security instance +security = HTTPBearer() + +async def verify_supabase_token(credentials: HTTPAuthorizationCredentials = Depends(security)): + try: + token = credentials.credentials + # Verify token using your Supabase JWT secret + decoded_token = jwt.decode( + token, + os.getenv('SUPABASE_JWT_SECRET'), + algorithms=["HS256"], + audience="authenticated" + ) + return decoded_token + except InvalidTokenError as e: + raise HTTPException( + status_code=401, + detail=f"Invalid authentication token: {str(e)}" + ) \ No newline at end of file diff --git a/modules/database/__init__.py b/modules/database/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/modules/database/__pycache__/__init__.cpython-311.pyc b/modules/database/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7587478cc841070821b5ca68319f7c8a63d5341c GIT binary patch literal 142 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 kd)e`ZMVbUp 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 0: + neon.create_or_merge_neontology_relationship( + cal_rels.TimeChunkFollowsTimeChunk(source=calendar_nodes['calendar_time_chunk_nodes'][i-1], target=time_chunk_node), + database=db_name, + operation='merge' + ) + logger.info(f"Relationship created from {calendar_nodes['calendar_time_chunk_nodes'][i-1].unique_id} to {time_chunk_node.unique_id}") + + logger.info(f'Created calendar: {calendar_nodes["calendar_node"].unique_id}') + return calendar_nodes \ No newline at end of file diff --git a/modules/database/admin/graph_provider.py b/modules/database/admin/graph_provider.py new file mode 100644 index 0000000..2b2e036 --- /dev/null +++ b/modules/database/admin/graph_provider.py @@ -0,0 +1,401 @@ +from enum import Enum +from typing import Optional, List, Dict, Any +import logging + +from modules.database.admin.neontology_provider import NeontologyProvider + +class NodeLabels(Enum): + SCHOOL = "School" + DEPARTMENT_STRUCTURE = "DepartmentStructure" + CURRICULUM_STRUCTURE = "CurriculumStructure" + PASTORAL_STRUCTURE = "PastoralStructure" + DEPARTMENT = "Department" + KEY_STAGE = "KeyStage" + YEAR_GROUP = "YearGroup" + +class RelationshipTypes(Enum): + HAS_DEPARTMENT_STRUCTURE = "HAS_DEPARTMENT_STRUCTURE" + HAS_CURRICULUM_STRUCTURE = "HAS_CURRICULUM_STRUCTURE" + HAS_PASTORAL_STRUCTURE = "HAS_PASTORAL_STRUCTURE" + HAS_DEPARTMENT = "HAS_DEPARTMENT" + INCLUDES_KEY_STAGE = "INCLUDES_KEY_STAGE" + INCLUDES_YEAR_GROUP = "INCLUDES_YEAR_GROUP" + +class PropertyKeys(Enum): + UNIQUE_ID = "unique_id" + PATH = "path" + URN = "urn" + ESTABLISHMENT_NUMBER = "establishment_number" + ESTABLISHMENT_NAME = "establishment_name" + ESTABLISHMENT_TYPE = "establishment_type" + ESTABLISHMENT_STATUS = "establishment_status" + PHASE_OF_EDUCATION = "phase_of_education" + STATUTORY_LOW_AGE = "statutory_low_age" + STATUTORY_HIGH_AGE = "statutory_high_age" + RELIGIOUS_CHARACTER = "religious_character" + SCHOOL_CAPACITY = "school_capacity" + SCHOOL_WEBSITE = "school_website" + OFSTED_RATING = "ofsted_rating" + DEPARTMENT_NAME = "department_name" + KEY_STAGE = "key_stage" + KEY_STAGE_NAME = "key_stage_name" + YEAR_GROUP = "year_group" + YEAR_GROUP_NAME = "year_group_name" + CREATED = "created" + MERGED = "merged" + +class SchemaDefinition: + """Class to hold schema definition queries and information""" + + @staticmethod + def get_schema_info() -> Dict[str, List[Dict]]: + """Returns a dictionary containing the schema definition for nodes and relationships.""" + return { + "nodes": [ + { + "label": "School", + "description": "Represents a school entity", + "required_properties": ["unique_id", "urn", "name"], + "optional_properties": ["address", "postcode", "phone", "email", "website"] + }, + { + "label": "DepartmentStructure", + "description": "Represents the department structure of a school", + "required_properties": ["unique_id", "name"], + "optional_properties": ["description", "head_of_department"] + }, + { + "label": "CurriculumStructure", + "description": "Represents the curriculum structure of a school", + "required_properties": ["unique_id", "name"], + "optional_properties": ["description", "key_stage", "subject"] + }, + { + "label": "PastoralStructure", + "description": "Represents the pastoral structure of a school", + "required_properties": ["unique_id", "name"], + "optional_properties": ["description", "year_group", "form_group"] + } + ], + "relationships": [ + { + "type": "HAS_DEPARTMENT_STRUCTURE", + "description": "Links a school to its department structure", + "source": "School", + "target": "DepartmentStructure", + "properties": ["created_at"] + }, + { + "type": "HAS_CURRICULUM_STRUCTURE", + "description": "Links a school to its curriculum structure", + "source": "School", + "target": "CurriculumStructure", + "properties": ["created_at"] + }, + { + "type": "HAS_PASTORAL_STRUCTURE", + "description": "Links a school to its pastoral structure", + "source": "School", + "target": "PastoralStructure", + "properties": ["created_at"] + } + ] + } + + @staticmethod + def get_schema_creation_queries() -> List[str]: + """Returns a list of Cypher queries to create the schema.""" + return [ + # Node Uniqueness Constraints + f"CREATE CONSTRAINT school_unique_id IF NOT EXISTS FOR (n:{NodeLabels.SCHOOL.value}) REQUIRE n.{PropertyKeys.UNIQUE_ID.value} IS UNIQUE", + f"CREATE CONSTRAINT department_unique_id IF NOT EXISTS FOR (n:{NodeLabels.DEPARTMENT_STRUCTURE.value}) REQUIRE n.{PropertyKeys.UNIQUE_ID.value} IS UNIQUE", + f"CREATE CONSTRAINT curriculum_unique_id IF NOT EXISTS FOR (n:{NodeLabels.CURRICULUM_STRUCTURE.value}) REQUIRE n.{PropertyKeys.UNIQUE_ID.value} IS UNIQUE", + f"CREATE CONSTRAINT pastoral_unique_id IF NOT EXISTS FOR (n:{NodeLabels.PASTORAL_STRUCTURE.value}) REQUIRE n.{PropertyKeys.UNIQUE_ID.value} IS UNIQUE", + + # Indexes for Performance + f"CREATE INDEX school_urn IF NOT EXISTS FOR (n:{NodeLabels.SCHOOL.value}) ON (n.{PropertyKeys.URN.value})", + f"CREATE INDEX school_name IF NOT EXISTS FOR (n:{NodeLabels.SCHOOL.value}) ON (n.{PropertyKeys.ESTABLISHMENT_NAME.value})", + f"CREATE INDEX department_name IF NOT EXISTS FOR (n:{NodeLabels.DEPARTMENT_STRUCTURE.value}) ON (n.{PropertyKeys.DEPARTMENT_NAME.value})", + f"CREATE INDEX curriculum_name IF NOT EXISTS FOR (n:{NodeLabels.CURRICULUM_STRUCTURE.value}) ON (n.name)", + f"CREATE INDEX pastoral_name IF NOT EXISTS FOR (n:{NodeLabels.PASTORAL_STRUCTURE.value}) ON (n.name)", + ] + + @staticmethod + def get_schema_verification_queries() -> Dict[str, str]: + """Returns a dictionary of queries to verify the schema state.""" + return { + "constraints": "SHOW CONSTRAINTS", + "indexes": "SHOW INDEXES", + "labels": "CALL db.labels()" + } + +class GraphNamingProvider: + @staticmethod + def get_school_unique_id(urn: str) -> str: + """Generate unique ID for a school node.""" + return f"School_{urn}" + + @staticmethod + def get_department_structure_unique_id(school_unique_id: str) -> str: + """Generate unique ID for a department structure node.""" + return f"DepartmentStructure_{school_unique_id}" + + @staticmethod + def get_curriculum_structure_unique_id(school_unique_id: str) -> str: + """Generate unique ID for a curriculum structure node.""" + return f"CurriculumStructure_{school_unique_id}" + + @staticmethod + def get_pastoral_structure_unique_id(school_unique_id: str) -> str: + """Generate unique ID for a pastoral structure node.""" + return f"PastoralStructure_{school_unique_id}" + + @staticmethod + def get_department_unique_id(school_unique_id: str, department_name: str) -> str: + """Generate unique ID for a department node.""" + return f"Department_{school_unique_id}_{department_name.replace(' ', '_')}" + + @staticmethod + def get_key_stage_unique_id(curriculum_structure_unique_id: str, key_stage: str) -> str: + """Generate unique ID for a key stage node.""" + return f"KeyStage_{curriculum_structure_unique_id}_KStg{key_stage}" + + @staticmethod + def get_year_group_unique_id(school_unique_id: str, year_group: int) -> str: + """Generate unique ID for a year group node.""" + return f"YearGroup_{school_unique_id}_YGrp{year_group}" + + @staticmethod + def get_school_path(database_name: str, urn: str) -> str: + """Generate path for a school node.""" + return f"/schools/{database_name}/{urn}" + + @staticmethod + def get_department_path(school_path: str, department_name: str) -> str: + """Generate path for a department node.""" + return f"{school_path}/departments/{department_name}" + + @staticmethod + def get_department_structure_path(school_path: str) -> str: + """Generate path for a department structure node.""" + return f"{school_path}/departments" + + @staticmethod + def get_curriculum_path(school_path: str) -> str: + """Generate path for a curriculum structure node.""" + return f"{school_path}/curriculum" + + @staticmethod + def get_pastoral_path(school_path: str) -> str: + """Generate path for a pastoral structure node.""" + return f"{school_path}/pastoral" + + @staticmethod + def get_key_stage_path(curriculum_path: str, key_stage: str) -> str: + """Generate path for a key stage node.""" + return f"{curriculum_path}/key_stage_{key_stage}" + + @staticmethod + def get_year_group_path(pastoral_path: str, year_group: int) -> str: + """Generate path for a year group node.""" + return f"{pastoral_path}/year_{year_group}" + + @staticmethod + def get_cypher_match_school(unique_id: str) -> str: + """Generate Cypher MATCH clause for finding a school node.""" + return f"MATCH (s:{NodeLabels.SCHOOL.value} {{{PropertyKeys.UNIQUE_ID.value}: $school_id}})" + + @staticmethod + def get_cypher_check_basic_structure() -> str: + """Generate Cypher query for checking basic structure existence and validity.""" + return """ + // Find the school node + MATCH (s:{school}) + + // Check for department structure with any relationship + OPTIONAL MATCH (s)-[r1]-(dept_struct:{dept_struct}) + + // Check for curriculum structure with any relationship + OPTIONAL MATCH (s)-[r2]-(curr_struct:{curr_struct}) + + // Check for pastoral structure with any relationship + OPTIONAL MATCH (s)-[r3]-(past_struct:{past_struct}) + + // Return structure information + RETURN {{ + has_basic: + dept_struct IS NOT NULL AND r1 IS NOT NULL AND + curr_struct IS NOT NULL AND r2 IS NOT NULL AND + past_struct IS NOT NULL AND r3 IS NOT NULL, + department_structure: {{ + exists: dept_struct IS NOT NULL AND r1 IS NOT NULL + }}, + curriculum_structure: {{ + exists: curr_struct IS NOT NULL AND r2 IS NOT NULL + }}, + pastoral_structure: {{ + exists: past_struct IS NOT NULL AND r3 IS NOT NULL + }} + }} as status + """.format( + school=NodeLabels.SCHOOL.value, + dept_struct=NodeLabels.DEPARTMENT_STRUCTURE.value, + curr_struct=NodeLabels.CURRICULUM_STRUCTURE.value, + past_struct=NodeLabels.PASTORAL_STRUCTURE.value + ) + + @staticmethod + def get_cypher_check_detailed_structure() -> str: + """Generate Cypher query for checking detailed structure existence and validity.""" + return """ + // Find the school node + MATCH (s:{school} {{unique_id: $school_id}}) + + // Check for department structure and departments + OPTIONAL MATCH (s)-[r1]-(dept_struct:{dept_struct}) + WHERE dept_struct.unique_id = 'DepartmentStructure_' + s.unique_id + WITH s, dept_struct, r1, + CASE WHEN dept_struct IS NOT NULL + THEN [(dept_struct)-[r]-(d:{dept}) | d] + ELSE [] + END as departments + + // Check for curriculum structure and key stages + OPTIONAL MATCH (s)-[r2]-(curr_struct:{curr_struct}) + WHERE curr_struct.unique_id = 'CurriculumStructure_' + s.unique_id + WITH s, dept_struct, r1, departments, curr_struct, r2, + CASE WHEN curr_struct IS NOT NULL + THEN [(curr_struct)-[r]-(k:{key_stage}) | k] + ELSE [] + END as key_stages + + // Check for pastoral structure and year groups + OPTIONAL MATCH (s)-[r3]-(past_struct:{past_struct}) + WHERE past_struct.unique_id = 'PastoralStructure_' + s.unique_id + WITH dept_struct, r1, departments, curr_struct, r2, key_stages, past_struct, r3, + CASE WHEN past_struct IS NOT NULL + THEN [(past_struct)-[r]-(y:{year_group}) | y] + ELSE [] + END as year_groups + + // Return structure information + RETURN {{ + has_detailed: + dept_struct IS NOT NULL AND r1 IS NOT NULL AND size(departments) > 0 AND + curr_struct IS NOT NULL AND r2 IS NOT NULL AND size(key_stages) > 0 AND + past_struct IS NOT NULL AND r3 IS NOT NULL AND size(year_groups) > 0, + department_structure: {{ + exists: dept_struct IS NOT NULL AND r1 IS NOT NULL, + has_departments: size(departments) > 0, + department_count: size(departments), + node_id: dept_struct.unique_id + }}, + curriculum_structure: {{ + exists: curr_struct IS NOT NULL AND r2 IS NOT NULL, + has_key_stages: size(key_stages) > 0, + key_stage_count: size(key_stages), + node_id: curr_struct.unique_id + }}, + pastoral_structure: {{ + exists: past_struct IS NOT NULL AND r3 IS NOT NULL, + has_year_groups: size(year_groups) > 0, + year_group_count: size(year_groups), + node_id: past_struct.unique_id + }} + }} as status + """.format( + school=NodeLabels.SCHOOL.value, + dept_struct=NodeLabels.DEPARTMENT_STRUCTURE.value, + curr_struct=NodeLabels.CURRICULUM_STRUCTURE.value, + past_struct=NodeLabels.PASTORAL_STRUCTURE.value, + dept=NodeLabels.DEPARTMENT.value, + key_stage=NodeLabels.KEY_STAGE.value, + year_group=NodeLabels.YEAR_GROUP.value + ) + + @staticmethod + def get_schema_definition() -> SchemaDefinition: + """Get the schema definition instance""" + return SchemaDefinition() + + @staticmethod + def get_schema_creation_queries() -> List[str]: + """Get queries to create the schema""" + return SchemaDefinition.get_schema_creation_queries() + + @staticmethod + def get_schema_verification_queries() -> Dict[str, str]: + """Get queries to verify schema state""" + return SchemaDefinition.get_schema_verification_queries() + + @staticmethod + def get_schema_info() -> Dict[str, List[Dict]]: + """Get human-readable schema information""" + return SchemaDefinition.get_schema_info() + +class GraphProvider: + def __init__(self): + """Initialize the graph provider with Neo4j connection.""" + self.neontology = NeontologyProvider() + self.graph_naming = GraphNamingProvider() + self.logger = logging.getLogger(__name__) + + def check_schema_status(self, database_name: str) -> Dict[str, Any]: + """ + Checks the current state of the schema in the specified database. + Returns a dictionary containing information about constraints, indexes, and labels. + """ + try: + verification_queries = SchemaDefinition.get_schema_verification_queries() + expected_schema = SchemaDefinition.get_schema_info() + + # Get current schema state + constraints = self.neontology.run_query(verification_queries["constraints"], {}, database_name) + indexes = self.neontology.run_query(verification_queries["indexes"], {}, database_name) + labels = self.neontology.run_query(verification_queries["labels"], {}, database_name) + + # Process results + current_constraints = [c["name"] for c in constraints] + current_indexes = [i["name"] for i in indexes] + current_labels = [l["label"] for l in labels] + + # Expected values + expected_labels = [node["label"] for node in expected_schema["nodes"]] + + return { + "constraints": current_constraints, + "constraints_valid": len(current_constraints) >= 4, # We expect at least 4 unique constraints + "indexes": current_indexes, + "indexes_valid": len(current_indexes) >= 5, # We expect at least 5 indexes + "labels": current_labels, + "labels_valid": all(label in current_labels for label in expected_labels) + } + except Exception as e: + self.logger.error(f"Error checking schema status: {str(e)}") + return { + "constraints": [], "constraints_valid": False, + "indexes": [], "indexes_valid": False, + "labels": [], "labels_valid": False + } + + def initialize_schema(self, database_name: str) -> None: + """ + Initializes the schema for the specified database by creating all necessary + constraints and indexes. + """ + try: + creation_queries = SchemaDefinition.get_schema_creation_queries() + + for query in creation_queries: + self.neontology.cypher_write(query, {}, database_name) + + self.logger.info(f"Schema initialized successfully for database {database_name}") + except Exception as e: + self.logger.error(f"Error initializing schema: {str(e)}") + raise + + def get_schema_info(self) -> Dict[str, Any]: + """ + Returns the schema definition information. + """ + return SchemaDefinition.get_schema_info() diff --git a/modules/database/admin/neontology_provider.py b/modules/database/admin/neontology_provider.py new file mode 100644 index 0000000..9782993 --- /dev/null +++ b/modules/database/admin/neontology_provider.py @@ -0,0 +1,212 @@ +from dotenv import load_dotenv, find_dotenv +load_dotenv(find_dotenv()) +import os +import modules.logger_tool as logger +from modules.database.tools.neontology.graphconnection import GraphConnection, init_neontology +from modules.database.tools.neontology.basenode import BaseNode +from modules.database.tools.neontology.baserelationship import BaseRelationship +from typing import Optional, Dict, Any, List +from neo4j import Record as Neo4jRecord +import re + +log_name = 'api_modules_database_admin_neontology_provider' +log_dir = os.getenv("LOG_PATH", "/logs") # Default path as fallback +logging = logger.get_logger( + name=log_name, + log_level=os.getenv("LOG_LEVEL", "DEBUG"), + log_path=log_dir, + log_file=log_name, + runtime=True, + log_format='default' +) + +class NeontologyProvider: + """Provider class for managing Neontology connections and operations.""" + + def __init__(self): + """Initialize the provider with Neo4j connection details from environment.""" + self.bolt_url = os.getenv("APP_BOLT_URL") + self.user = os.getenv("USER_NEO4J") + self.password = os.getenv("PASSWORD_NEO4J") + self.connection = None + self.current_database = None + + def _validate_database_name(self, database: str) -> str: + """ + Validate and format database name to handle special characters. + + Args: + database: The database name to validate + + Returns: + str: The validated database name + + Raises: + ValueError: If database name is invalid + """ + if not database: + raise ValueError("Database name cannot be empty") + + # Check for valid database name pattern + # Allow letters, numbers, underscores, and dots + if not re.match(r'^[a-zA-Z0-9_\.]+$', database): + raise ValueError("Database name contains invalid characters") + + # For database names with multiple dots, we need to handle them specially + # Neo4j treats dots as special characters in some contexts + if database.count('.') > 1: + # Replace dots with underscores except for the first one + parts = database.split('.') + if len(parts) > 2: + # Keep the first dot, replace others with underscore + formatted_name = f"{parts[0]}.{'.'.join(parts[1:])}" + logging.info(f"Reformatted database name from {database} to {formatted_name}") + return formatted_name + + return database + + def connect(self, database: str = 'neo4j') -> None: + """Establish connection to Neo4j using Neontology.""" + try: + # Validate and format database name + formatted_database = self._validate_database_name(database) + + # If we're switching databases, ensure we close the old connection + if self.current_database != formatted_database and self.connection is not None: + self.close() + + # Initialize Neontology connection if needed + if self.connection is None: + init_neontology( + neo4j_uri=self.bolt_url, + neo4j_username=self.user, + neo4j_password=self.password + ) + # Get the GraphConnection instance + self.connection = GraphConnection() + self.current_database = formatted_database + logging.info(f"Neontology connection initialized with host: {self.host}, port: {self.port}, database: {formatted_database}") + + except Exception as e: + logging.error(f"Failed to initialize Neontology connection: {str(e)}") + raise + + def reset_connection(self) -> None: + """Reset the connection, forcing a new one to be created on next use.""" + if self.connection: + self.close() + + def create_or_merge_node(self, node: BaseNode, database: str = 'neo4j', operation: str = "merge") -> None: + """Create or merge a node in the Neo4j database.""" + try: + if not self.connection or self.current_database != database: + self.connect(database) + + if operation == "create": + node.create(database=database) + elif operation == "merge": + node.merge(database=database) + else: + logging.error(f"Invalid operation: {operation}") + raise ValueError(f"Invalid operation: {operation}") + except Exception as e: + logging.error(f"Error in processing node: {e}") + raise + + def create_or_merge_relationship(self, relationship: BaseRelationship, database: str = 'neo4j', operation: str = "merge") -> None: + """Create or merge a relationship in the Neo4j database.""" + try: + if not self.connection or self.current_database != database: + self.connect(database) + + if operation == "create": + relationship.create(database=database) + elif operation == "merge": + relationship.merge(database=database) + else: + logging.error(f"Invalid operation: {operation}") + raise ValueError(f"Invalid operation: {operation}") + except Exception as e: + logging.error(f"Error in processing relationship: {e}") + raise + + def cypher_write(self, cypher: str, params: Dict[str, Any] = {}, database: str = 'neo4j') -> None: + """Execute a write transaction.""" + try: + if not self.connection or self.current_database != database: + self.connect(database) + self.connection.cypher_write(cypher, params) + except Exception as e: + logging.error(f"Error in cypher write: {e}") + raise + + def cypher_read(self, cypher: str, params: Dict[str, Any] = {}, database: str = 'neo4j') -> Optional[Neo4jRecord]: + """Execute a read transaction returning a single record.""" + try: + if not self.connection or self.current_database != database: + self.connect(database) + return self.connection.cypher_read(cypher, params) + except Exception as e: + logging.error(f"Error in cypher read: {e}") + raise + + def cypher_read_many(self, cypher: str, params: Dict[str, Any] = {}, database: str = 'neo4j') -> List[Neo4jRecord]: + """Execute a read transaction returning multiple records.""" + try: + if not self.connection or self.current_database != database: + self.connect(database) + return self.connection.cypher_read_many(cypher, params) + except Exception as e: + logging.error(f"Error in cypher read many: {e}") + raise + + def run_query(self, cypher: str, params: Dict[str, Any] = {}, database: str = 'neo4j') -> List[Dict[str, Any]]: + """ + Execute a Cypher query and return results as a list of dictionaries. + This is a convenience method that handles both single and multiple record results. + + Args: + cypher: The Cypher query to execute + params: Query parameters + database: Target database name + + Returns: + List[Dict[str, Any]]: Query results as a list of dictionaries + """ + try: + if not self.connection or self.current_database != database: + self.connect(database) + + # Use cypher_read_many for consistent return type + records = self.connection.cypher_read_many(cypher, params) + + # Convert Neo4j records to dictionaries + results = [] + for record in records: + # Handle both Record and dict types + if isinstance(record, Neo4jRecord): + results.append(dict(record)) + else: + results.append(record) + + return results + + except Exception as e: + logging.error(f"Error in run_query: {e}") + raise + + def close(self) -> None: + """Close the Neontology connection.""" + if self.connection: + # The connection will be closed when the GraphConnection instance is deleted + self.connection = None + self.current_database = None + logging.info("Neontology connection closed") + + def __enter__(self): + """Context manager entry.""" + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + """Context manager exit.""" + self.close() diff --git a/modules/database/admin/school_curriculum_provider.py b/modules/database/admin/school_curriculum_provider.py new file mode 100644 index 0000000..1da3748 --- /dev/null +++ b/modules/database/admin/school_curriculum_provider.py @@ -0,0 +1,797 @@ +import os +from modules.logger_tool import initialise_logger +logger = initialise_logger(__name__, os.getenv("LOG_LEVEL"), os.getenv("LOG_PATH"), 'default', True) + +import backend.modules.database.schemas.entities as neo_entity +import modules.database.schemas.curriculum_neo as neo_curriculum +import modules.database.schemas.relationships.curriculum_relationships as curriculum_relationships +import modules.database.schemas.relationships.entity_relationships as ent_rels +import modules.database.schemas.relationships.entity_curriculum_rels as ent_cur_rels +from modules.database.tools.filesystem_tools import ClassroomCopilotFilesystem +import modules.database.tools.neontology_tools as neon +import pandas as pd + +# Default values for nodes +default_topic_values = { + 'topic_assessment_type': 'Null', + 'topic_type': 'Null', + 'total_number_of_lessons_for_topic': '1', + 'topic_title': 'Null' +} + +default_topic_lesson_values = { + 'topic_lesson_title': 'Null', + 'topic_lesson_type': 'Null', + 'topic_lesson_length': '1', + 'topic_lesson_suggested_activities': 'Null', + 'topic_lesson_skills_learned': 'Null', + 'topic_lesson_weblinks': 'Null', +} + +default_learning_statement_values = { + 'lesson_learning_statement': 'Null', + 'lesson_learning_statement_type': 'Student learning outcome' +} + +# Helper function to sort year groups numerically where possible +def sort_year_groups(df): + df = df.copy() + df['YearGroupNumeric'] = pd.to_numeric(df['YearGroup'], errors='coerce') + return df.sort_values(by='YearGroupNumeric') + +def create_curriculum(dataframes, school_db_name, curriculum_db_name, school_node): + + fs_handler = ClassroomCopilotFilesystem(school_db_name, init_run_type="school") + + logger.info(f"Initialising neo4j connection...") + neon.init_neontology_connection() + + keystagesyllabus_df = dataframes['keystagesyllabuses'] + yeargroupsyllabus_df = dataframes['yeargroupsyllabuses'] + topic_df = dataframes['topics'] + lesson_df = dataframes['lessons'] + statement_df = dataframes['statements'] + # resource_df = dataframes['resources'] # TODO + + node_library = {} + node_library['key_stage_nodes'] = {} + node_library['year_group_nodes'] = {} + node_library['key_stage_syllabus_nodes'] = {} + node_library['year_group_syllabus_nodes'] = {} + node_library['topic_nodes'] = {} + node_library['topic_lesson_nodes'] = {} + node_library['statement_nodes'] = {} + node_library['department_nodes'] = {} + node_library['subject_nodes'] = {} + curriculum_node = None + pastoral_node = None + key_stage_nodes_created = {} + year_group_nodes_created = {} + last_year_group_node = None + last_key_stage_node = None + + # Create Curriculum and Pastoral nodes and relationships with School in both databases + _, curriculum_path = fs_handler.create_school_curriculum_directory(school_node.path) + _, pastoral_path = fs_handler.create_school_pastoral_directory(school_node.path) + + # Create Department Structure node + department_structure_node_unique_id = f"DepartmentStructure_{school_node.unique_id}" + department_structure_node = neo_entity.DepartmentStructureNode( + unique_id=department_structure_node_unique_id, + path=os.path.join(school_node.path, "departments") + ) + # Create in school database only + neon.create_or_merge_neontology_node(department_structure_node, database=school_db_name, operation='merge') + fs_handler.create_default_tldraw_file(department_structure_node.path, department_structure_node.to_dict()) + node_library['department_structure_node'] = department_structure_node + + # Link Department Structure to School + neon.create_or_merge_neontology_relationship( + ent_rels.SchoolHasDepartmentStructure(source=school_node, target=department_structure_node), + database=school_db_name, operation='merge' + ) + logger.info(f"Created department structure node and linked to school") + + # Create Curriculum Structure node + curriculum_structure_node_unique_id = f"CurriculumStructure_{school_node.unique_id}" + curriculum_node = neo_curriculum.CurriculumStructureNode( + unique_id=curriculum_structure_node_unique_id, + path=curriculum_path + ) + # Create in school database only + neon.create_or_merge_neontology_node(curriculum_node, database=school_db_name, operation='merge') + fs_handler.create_default_tldraw_file(curriculum_node.path, curriculum_node.to_dict()) + node_library['curriculum_node'] = curriculum_node + + # Create relationship in school database only + neon.create_or_merge_neontology_relationship( + ent_cur_rels.SchoolHasCurriculumStructure(source=school_node, target=curriculum_node), + database=school_db_name, operation='merge' + ) + logger.info(f"Created curriculum node and relationship with school") + + # Create Pastoral Structure node + pastoral_structure_node_unique_id = f"PastoralStructure_{school_node.unique_id}" + pastoral_node = neo_curriculum.PastoralStructureNode( + unique_id=pastoral_structure_node_unique_id, + path=pastoral_path + ) + neon.create_or_merge_neontology_node(pastoral_node, database=school_db_name, operation='merge') + fs_handler.create_default_tldraw_file(pastoral_node.path, pastoral_node.to_dict()) + node_library['pastoral_node'] = pastoral_node + neon.create_or_merge_neontology_relationship( + ent_cur_rels.SchoolHasPastoralStructure(source=school_node, target=pastoral_node), + database=school_db_name, operation='merge' + ) + logger.info(f"Created pastoral node and relationship with school") + + # Create departments and subjects + # First get unique departments + unique_departments = keystagesyllabus_df['Department'].dropna().unique() + + for department_name in unique_departments: + department_unique_id = f"Department_{school_node.unique_id}_{department_name.replace(' ', '_')}" + _, department_path = fs_handler.create_school_department_directory(school_node.path, department_name) + + department_node = neo_entity.DepartmentNode( + unique_id=department_unique_id, + department_name=department_name, + path=department_path + ) + # Create department in school database only + neon.create_or_merge_neontology_node(department_node, database=school_db_name, operation='merge') + fs_handler.create_default_tldraw_file(department_node.path, department_node.to_dict()) + node_library['department_nodes'][department_name] = department_node + + # Link department to department structure in school database + neon.create_or_merge_neontology_relationship( + ent_rels.DepartmentStructureHasDepartment(source=department_structure_node, target=department_node), + database=school_db_name, operation='merge' + ) + logger.info(f"Created department node for {department_name} and linked to department structure") + + # Create subjects and link to departments + # First get unique subjects from key stage syllabuses (which have department info) + unique_subjects = keystagesyllabus_df[['Subject', 'SubjectCode', 'Department']].drop_duplicates() + + # Then add any additional subjects from year group syllabuses (without department info) + additional_subjects = yeargroupsyllabus_df[['Subject', 'SubjectCode']].drop_duplicates() + additional_subjects = additional_subjects[~additional_subjects['SubjectCode'].isin(unique_subjects['SubjectCode'])] + + # Process subjects from key stage syllabuses first (these have department info) + for _, subject_row in unique_subjects.iterrows(): + subject_unique_id = f"Subject_{school_node.unique_id}_{subject_row['SubjectCode']}" + department_node = node_library['department_nodes'].get(subject_row['Department']) + if not department_node: + logger.warning(f"No department found for subject {subject_row['Subject']} with code {subject_row['SubjectCode']}") + continue + + _, subject_path = fs_handler.create_department_subject_directory( + department_node.path, + subject_row['Subject'] # Use full subject name instead of SubjectCode + ) + logger.info(f"Created subject directory for {subject_path}") + + subject_node = neo_curriculum.SubjectNode( + unique_id=subject_unique_id, + subject_code=subject_row['SubjectCode'], + subject_name=subject_row['Subject'], + path=subject_path + ) + # Create subject in both databases + neon.create_or_merge_neontology_node(subject_node, database=school_db_name, operation='merge') + neon.create_or_merge_neontology_node(subject_node, database=curriculum_db_name, operation='merge') + fs_handler.create_default_tldraw_file(subject_node.path, subject_node.to_dict()) + node_library['subject_nodes'][subject_row['Subject']] = subject_node + + # Link subject to department in school database only + neon.create_or_merge_neontology_relationship( + ent_rels.DepartmentManagesSubject(source=department_node, target=subject_node), + database=school_db_name, operation='merge' + ) + logger.info(f"Created subject node for {subject_row['Subject']} and linked to department {subject_row['Department']}") + + # Process any additional subjects from year group syllabuses (these won't have department info) + for _, subject_row in additional_subjects.iterrows(): + subject_unique_id = f"Subject_{school_node.unique_id}_{subject_row['SubjectCode']}" + # Create in a special "Unassigned" department + unassigned_dept_name = "Unassigned Department" + if unassigned_dept_name not in node_library['department_nodes']: + _, dept_path = fs_handler.create_school_department_directory(school_node.path, unassigned_dept_name) + department_node = neo_entity.DepartmentNode( + unique_id=f"Department_{school_node.unique_id}_Unassigned", + department_name=unassigned_dept_name, + path=dept_path + ) + neon.create_or_merge_neontology_node(department_node, database=school_db_name, operation='merge') + fs_handler.create_default_tldraw_file(department_node.path, department_node.to_dict()) + node_library['department_nodes'][unassigned_dept_name] = department_node + + # Link unassigned department to department structure + neon.create_or_merge_neontology_relationship( + ent_rels.DepartmentStructureHasDepartment(source=department_structure_node, target=department_node), + database=school_db_name, operation='merge' + ) + logger.info(f"Created unassigned department node and linked to department structure") + + _, subject_path = fs_handler.create_department_subject_directory( + node_library['department_nodes'][unassigned_dept_name].path, + subject_row['Subject'] + ) + + subject_node = neo_curriculum.SubjectNode( + unique_id=subject_unique_id, + subject_code=subject_row['SubjectCode'], + subject_name=subject_row['Subject'], + path=subject_path + ) + # Create subject in both databases + neon.create_or_merge_neontology_node(subject_node, database=school_db_name, operation='merge') + neon.create_or_merge_neontology_node(subject_node, database=curriculum_db_name, operation='merge') + fs_handler.create_default_tldraw_file(subject_node.path, subject_node.to_dict()) + node_library['subject_nodes'][subject_row['Subject']] = subject_node + + # Link subject to unassigned department in school database only + neon.create_or_merge_neontology_relationship( + ent_rels.DepartmentManagesSubject( + source=node_library['department_nodes'][unassigned_dept_name], + target=subject_node + ), + database=school_db_name, operation='merge' + ) + logger.warning(f"Created subject node for {subject_row['Subject']} in unassigned department") + + # Process key stages and syllabuses + logger.info(f"Processing key stages") + last_key_stage_node = None + # Track last syllabus nodes per subject + last_key_stage_syllabus_nodes = {} # Dictionary to track last key stage syllabus node per subject + last_year_group_syllabus_nodes = {} # Dictionary to track last year group syllabus node per subject + topics_processed = set() # Track which topics have been processed + lessons_processed = set() # Track which lessons have been processed + statements_processed = set() # Track which statements have been processed + + # First create all key stage nodes and key stage syllabus nodes + for index, ks_row in keystagesyllabus_df.sort_values('KeyStage').iterrows(): + key_stage = str(ks_row['KeyStage']) + logger.debug(f"Processing key stage syllabus row - Subject: {ks_row['Subject']}, Key Stage: {key_stage}") + + subject_node = node_library['subject_nodes'].get(ks_row['Subject']) + if not subject_node: + logger.warning(f"No subject node found for subject {ks_row['Subject']}") + continue + + if key_stage not in key_stage_nodes_created: + key_stage_node_unique_id = f"KeyStage_{curriculum_node.unique_id}_KStg{key_stage}" + key_stage_node = neo_curriculum.KeyStageNode( + unique_id=key_stage_node_unique_id, + key_stage_name=f"Key Stage {key_stage}", + key_stage=str(key_stage), + path=os.path.join(curriculum_node.path, "key_stages", f"KS{key_stage}") + ) + # Create key stage node in both databases + neon.create_or_merge_neontology_node(key_stage_node, database=school_db_name, operation='merge') + neon.create_or_merge_neontology_node(key_stage_node, database=curriculum_db_name, operation='merge') + fs_handler.create_default_tldraw_file(key_stage_node.path, key_stage_node.to_dict()) + key_stage_nodes_created[key_stage] = key_stage_node + node_library['key_stage_nodes'][key_stage] = key_stage_node + + # Create relationship with curriculum structure in school database only + neon.create_or_merge_neontology_relationship( + curriculum_relationships.CurriculumStructureIncludesKeyStage(source=curriculum_node, target=key_stage_node), + database=school_db_name, operation='merge' + ) + logger.info(f"Created key stage node {key_stage_node_unique_id} and relationship with curriculum structure") + + # Create sequential relationship between key stages in both databases + if last_key_stage_node: + neon.create_or_merge_neontology_relationship( + curriculum_relationships.KeyStageFollowsKeyStage(source=last_key_stage_node, target=key_stage_node), + database=school_db_name, operation='merge' + ) + neon.create_or_merge_neontology_relationship( + curriculum_relationships.KeyStageFollowsKeyStage(source=last_key_stage_node, target=key_stage_node), + database=curriculum_db_name, operation='merge' + ) + logger.info(f"Created sequential relationship between key stages {last_key_stage_node.unique_id} and {key_stage_node.unique_id}") + last_key_stage_node = key_stage_node + + # Create key stage syllabus under the subject's curriculum directory + _, key_stage_syllabus_path = fs_handler.create_curriculum_key_stage_syllabus_directory( + curriculum_node.path, + key_stage, + ks_row['Subject'], + ks_row['ID'] + ) + logger.debug(f"Creating key stage syllabus node for {ks_row['Subject']} KS{key_stage} with ID {ks_row['ID']}") + + key_stage_syllabus_node_unique_id = f"KeyStageSyllabus_{curriculum_node.unique_id}_{ks_row['Title'].replace(' ', '')}" + key_stage_syllabus_node = neo_curriculum.KeyStageSyllabusNode( + unique_id=key_stage_syllabus_node_unique_id, + ks_syllabus_id=ks_row['ID'], + ks_syllabus_name=ks_row['Title'], + ks_syllabus_key_stage=str(ks_row['KeyStage']), + ks_syllabus_subject=ks_row['Subject'], + ks_syllabus_subject_code=ks_row['Subject'], + path=key_stage_syllabus_path + ) + # Create key stage syllabus node in both databases + neon.create_or_merge_neontology_node(key_stage_syllabus_node, database=school_db_name, operation='merge') + neon.create_or_merge_neontology_node(key_stage_syllabus_node, database=curriculum_db_name, operation='merge') + fs_handler.create_default_tldraw_file(key_stage_syllabus_node.path, key_stage_syllabus_node.to_dict()) + node_library['key_stage_syllabus_nodes'][ks_row['ID']] = key_stage_syllabus_node + logger.debug(f"Created key stage syllabus node {key_stage_syllabus_node_unique_id} for {ks_row['Subject']} KS{key_stage}") + + # Link key stage syllabus to its subject in both databases + if subject_node: + neon.create_or_merge_neontology_relationship( + curriculum_relationships.SubjectHasKeyStageSyllabus(source=subject_node, target=key_stage_syllabus_node), + database=school_db_name, operation='merge' + ) + neon.create_or_merge_neontology_relationship( + curriculum_relationships.SubjectHasKeyStageSyllabus(source=subject_node, target=key_stage_syllabus_node), + database=curriculum_db_name, operation='merge' + ) + logger.info(f"Created relationship between subject {subject_node.unique_id} and key stage syllabus {key_stage_syllabus_node.unique_id}") + + # Link key stage syllabus to its key stage in both databases + key_stage_node = key_stage_nodes_created.get(key_stage) + if key_stage_node: + neon.create_or_merge_neontology_relationship( + curriculum_relationships.KeyStageIncludesKeyStageSyllabus(source=key_stage_node, target=key_stage_syllabus_node), + database=school_db_name, operation='merge' + ) + neon.create_or_merge_neontology_relationship( + curriculum_relationships.KeyStageIncludesKeyStageSyllabus(source=key_stage_node, target=key_stage_syllabus_node), + database=curriculum_db_name, operation='merge' + ) + logger.info(f"Created relationship between key stage {key_stage_node.unique_id} and key stage syllabus {key_stage_syllabus_node.unique_id}") + + # Create sequential relationship between key stage syllabuses in both databases + last_key_stage_syllabus_node = last_key_stage_syllabus_nodes.get(ks_row['Subject']) + if last_key_stage_syllabus_node: + neon.create_or_merge_neontology_relationship( + curriculum_relationships.KeyStageSyllabusFollowsKeyStageSyllabus(source=last_key_stage_syllabus_node, target=key_stage_syllabus_node), + database=school_db_name, operation='merge' + ) + neon.create_or_merge_neontology_relationship( + curriculum_relationships.KeyStageSyllabusFollowsKeyStageSyllabus(source=last_key_stage_syllabus_node, target=key_stage_syllabus_node), + database=curriculum_db_name, operation='merge' + ) + logger.info(f"Created sequential relationship between key stage syllabuses {last_key_stage_syllabus_node.unique_id} and {key_stage_syllabus_node.unique_id}") + last_key_stage_syllabus_nodes[ks_row['Subject']] = key_stage_syllabus_node + + # Now process year groups and their syllabuses + for index, ks_row in keystagesyllabus_df.sort_values('KeyStage').iterrows(): + key_stage = str(ks_row['KeyStage']) + related_yeargroups = sort_year_groups(yeargroupsyllabus_df[yeargroupsyllabus_df['KeyStage'] == ks_row['KeyStage']]) + + logger.info(f"Processing year groups for key stage {key_stage}") + for yg_index, yg_row in related_yeargroups.iterrows(): + year_group = yg_row['YearGroup'] + subject_code = yg_row['SubjectCode'] + numeric_year_group = pd.to_numeric(year_group, errors='coerce') + + if pd.notna(numeric_year_group): + numeric_year_group = int(numeric_year_group) + if numeric_year_group not in year_group_nodes_created: + # Create year group directory under pastoral structure + _, year_group_path = fs_handler.create_pastoral_year_group_directory(pastoral_node.path, year_group) + logger.info(f"Created year group directory for {year_group_path}") + + year_group_node_unique_id = f"YearGroup_{school_node.unique_id}_YGrp{numeric_year_group}" + year_group_node = neo_curriculum.YearGroupNode( + unique_id=year_group_node_unique_id, + year_group=str(numeric_year_group), + year_group_name=f"Year {numeric_year_group}", + path=year_group_path + ) + # Create year group node in both databases but use same directory + neon.create_or_merge_neontology_node(year_group_node, database=school_db_name, operation='merge') + neon.create_or_merge_neontology_node(year_group_node, database=curriculum_db_name, operation='merge') + fs_handler.create_default_tldraw_file(year_group_node.path, year_group_node.to_dict()) + + # Create sequential relationship between year groups in both databases + if last_year_group_node: + neon.create_or_merge_neontology_relationship( + curriculum_relationships.YearGroupFollowsYearGroup(source=last_year_group_node, target=year_group_node), + database=school_db_name, operation='merge' + ) + neon.create_or_merge_neontology_relationship( + curriculum_relationships.YearGroupFollowsYearGroup(source=last_year_group_node, target=year_group_node), + database=curriculum_db_name, operation='merge' + ) + logger.info(f"Created sequential relationship between year groups {last_year_group_node.unique_id} and {year_group_node.unique_id} across key stages") + last_year_group_node = year_group_node + + # Create relationship with Pastoral Structure in school database only + neon.create_or_merge_neontology_relationship( + curriculum_relationships.PastoralStructureIncludesYearGroup(source=pastoral_node, target=year_group_node), + database=school_db_name, operation='merge' + ) + logger.info(f"Created year group node {year_group_node_unique_id} and relationship with pastoral structure") + + year_group_nodes_created[numeric_year_group] = year_group_node + node_library['year_group_nodes'][str(numeric_year_group)] = year_group_node + + # Curriculum specific database initialisation begins here + # Create year group syllabus nodes in both databases + year_group_node = year_group_nodes_created.get(numeric_year_group) + if year_group_node: + # Create syllabus directory under curriculum structure + _, year_group_syllabus_path = fs_handler.create_curriculum_year_group_syllabus_directory( + curriculum_node.path, + yg_row['Subject'], + year_group, + yg_row['ID'] + ) + logger.info(f"Created year group syllabus directory for {year_group_syllabus_path}") + + year_group_syllabus_node_unique_id = f"YearGroupSyllabus_{school_node.unique_id}_{yg_row['ID']}" + year_group_syllabus_node = neo_curriculum.YearGroupSyllabusNode( + unique_id=year_group_syllabus_node_unique_id, + yr_syllabus_id=yg_row['ID'], + yr_syllabus_name=yg_row['Title'], + yr_syllabus_year_group=str(yg_row['YearGroup']), + yr_syllabus_subject=yg_row['Subject'], + yr_syllabus_subject_code=yg_row['Subject'], + path=year_group_syllabus_path + ) + + # Create year group syllabus node in both databases but use same directory + neon.create_or_merge_neontology_node(year_group_syllabus_node, database=school_db_name, operation='merge') + neon.create_or_merge_neontology_node(year_group_syllabus_node, database=curriculum_db_name, operation='merge') + fs_handler.create_default_tldraw_file(year_group_syllabus_node.path, year_group_syllabus_node.to_dict()) + node_library['year_group_syllabus_nodes'][yg_row['ID']] = year_group_syllabus_node + + # Create sequential relationship between year group syllabuses in both databases + last_year_group_syllabus_node = last_year_group_syllabus_nodes.get(yg_row['Subject']) + # Only create sequential relationship if this year group is higher than the last one + if last_year_group_syllabus_node: + last_year = pd.to_numeric(last_year_group_syllabus_node.yr_syllabus_year_group, errors='coerce') + current_year = pd.to_numeric(year_group_syllabus_node.yr_syllabus_year_group, errors='coerce') + if pd.notna(last_year) and pd.notna(current_year) and current_year > last_year: + neon.create_or_merge_neontology_relationship( + curriculum_relationships.YearGroupSyllabusFollowsYearGroupSyllabus(source=last_year_group_syllabus_node, target=year_group_syllabus_node), + database=school_db_name, operation='merge' + ) + neon.create_or_merge_neontology_relationship( + curriculum_relationships.YearGroupSyllabusFollowsYearGroupSyllabus(source=last_year_group_syllabus_node, target=year_group_syllabus_node), + database=curriculum_db_name, operation='merge' + ) + logger.info(f"Created sequential relationship between year group syllabuses {last_year_group_syllabus_node.unique_id} and {year_group_syllabus_node.unique_id}") + last_year_group_syllabus_nodes[yg_row['Subject']] = year_group_syllabus_node + + # Create relationships in both databases using MATCH to avoid cartesian products + subject_node = node_library['subject_nodes'].get(yg_row['Subject']) + if subject_node: + # Link to subject + neon.create_or_merge_neontology_relationship( + curriculum_relationships.SubjectHasYearGroupSyllabus(source=subject_node, target=year_group_syllabus_node), + database=school_db_name, operation='merge' + ) + neon.create_or_merge_neontology_relationship( + curriculum_relationships.SubjectHasYearGroupSyllabus(source=subject_node, target=year_group_syllabus_node), + database=curriculum_db_name, operation='merge' + ) + logger.info(f"Created relationship between subject {subject_node.unique_id} and year group syllabus {year_group_syllabus_node_unique_id}") + + # Link to year group + neon.create_or_merge_neontology_relationship( + curriculum_relationships.YearGroupHasYearGroupSyllabus(source=year_group_node, target=year_group_syllabus_node), + database=school_db_name, operation='merge' + ) + neon.create_or_merge_neontology_relationship( + curriculum_relationships.YearGroupHasYearGroupSyllabus(source=year_group_node, target=year_group_syllabus_node), + database=curriculum_db_name, operation='merge' + ) + logger.info(f"Created relationship between year group {year_group_node.unique_id} and year group syllabus {year_group_syllabus_node_unique_id}") + + # Link to key stage syllabus if it exists for the same subject + key_stage_syllabus_node = node_library['key_stage_syllabus_nodes'].get(ks_row['ID']) + if key_stage_syllabus_node and yg_row['Subject'] == ks_row['Subject']: + neon.create_or_merge_neontology_relationship( + curriculum_relationships.KeyStageSyllabusIncludesYearGroupSyllabus(source=key_stage_syllabus_node, target=year_group_syllabus_node), + database=school_db_name, operation='merge' + ) + neon.create_or_merge_neontology_relationship( + curriculum_relationships.KeyStageSyllabusIncludesYearGroupSyllabus(source=key_stage_syllabus_node, target=year_group_syllabus_node), + database=curriculum_db_name, operation='merge' + ) + logger.info(f"Created relationship between key stage syllabus {key_stage_syllabus_node.unique_id} and year group syllabus {year_group_syllabus_node_unique_id}") + + # Processing of curriculum topic begins here + # Process topics for this year group syllabus only if not already processed + topics_for_syllabus = topic_df[topic_df['SyllabusYearID'] == yg_row['ID']] + for _, topic_row in topics_for_syllabus.iterrows(): + if topic_row['TopicID'] in topics_processed: + continue + topics_processed.add(topic_row['TopicID']) + + # Get the correct subject from the topic row + topic_subject = topic_row['SyllabusSubject'] + topic_key_stage = topic_row['SyllabusKeyStage'] + + logger.debug(f"Processing topic {topic_row['TopicID']} for subject {topic_subject} and key stage {topic_key_stage}") + logger.debug(f"Available key stage syllabus nodes: {[node.ks_syllabus_subject + '_KS' + node.ks_syllabus_key_stage for node in node_library['key_stage_syllabus_nodes'].values()]}") + + # Find the key stage syllabus node by iterating through all nodes + matching_syllabus_node = None + for syllabus_node in node_library['key_stage_syllabus_nodes'].values(): + logger.debug(f"Checking syllabus node - Subject: {syllabus_node.ks_syllabus_subject}, Key Stage: {syllabus_node.ks_syllabus_key_stage}") + logger.debug(f"Comparing with - Subject: {topic_subject}, Key Stage: {str(topic_key_stage)}") + logger.debug(f"Types - Node Subject: {type(syllabus_node.ks_syllabus_subject)}, Topic Subject: {type(topic_subject)}") + logger.debug(f"Types - Node Key Stage: {type(syllabus_node.ks_syllabus_key_stage)}, Topic Key Stage: {type(str(topic_key_stage))}") + + if (syllabus_node.ks_syllabus_subject == topic_subject and + syllabus_node.ks_syllabus_key_stage == str(topic_key_stage)): + matching_syllabus_node = syllabus_node + logger.debug(f"Found matching syllabus node: {syllabus_node.unique_id}") + break + + if not matching_syllabus_node: + logger.warning(f"No key stage syllabus node found for subject {topic_subject} and key stage {topic_key_stage}, skipping topic creation") + continue + + + _, topic_path = fs_handler.create_curriculum_topic_directory(matching_syllabus_node.path, topic_row['TopicID']) + logger.info(f"Created topic directory for {topic_path}") + + topic_node_unique_id = f"Topic_{matching_syllabus_node.unique_id}_{topic_row['TopicID']}" + topic_node = neo_curriculum.TopicNode( + unique_id=topic_node_unique_id, + topic_id=topic_row['TopicID'], + topic_title=topic_row.get('TopicTitle', default_topic_values['topic_title']), + total_number_of_lessons_for_topic=str(topic_row.get('TotalNumberOfLessonsForTopic', default_topic_values['total_number_of_lessons_for_topic'])), + topic_type=topic_row.get('TopicType', default_topic_values['topic_type']), + topic_assessment_type=topic_row.get('TopicAssessmentType', default_topic_values['topic_assessment_type']), + path=topic_path + ) + # Create topic node in curriculum database only + neon.create_or_merge_neontology_node(topic_node, database=curriculum_db_name, operation='merge') + fs_handler.create_default_tldraw_file(topic_node.path, topic_node.to_dict()) + node_library['topic_nodes'][topic_row['TopicID']] = topic_node + + # Link topic to key stage syllabus as well as year group syllabus + neon.create_or_merge_neontology_relationship( + curriculum_relationships.KeyStageSyllabusIncludesTopic(source=matching_syllabus_node, target=topic_node), + database=curriculum_db_name, operation='merge' + ) + neon.create_or_merge_neontology_relationship( + curriculum_relationships.YearGroupSyllabusIncludesTopic(source=year_group_syllabus_node, target=topic_node), + database=curriculum_db_name, operation='merge' + ) + logger.info(f"Created relationships between topic {topic_node_unique_id} and key stage syllabus {matching_syllabus_node.unique_id} and year group syllabus {year_group_syllabus_node_unique_id}") + + # Process lessons for this topic only if not already processed + lessons_for_topic = lesson_df[ + (lesson_df['TopicID'] == topic_row['TopicID']) & + (lesson_df['SyllabusSubject'] == topic_subject) + ].copy() + lessons_for_topic.loc[:, 'Lesson'] = lessons_for_topic['Lesson'].astype(str) + lessons_for_topic = lessons_for_topic.sort_values('Lesson') + + previous_lesson_node = None + for _, lesson_row in lessons_for_topic.iterrows(): + if lesson_row['LessonID'] in lessons_processed: + continue + lessons_processed.add(lesson_row['LessonID']) + + _, lesson_path = fs_handler.create_curriculum_lesson_directory(topic_path, lesson_row['LessonID']) + logger.info(f"Created lesson directory for {lesson_path}") + + lesson_data = { + 'unique_id': f"TopicLesson_{topic_node_unique_id}_{lesson_row['LessonID']}", + 'topic_lesson_id': lesson_row['LessonID'], + 'topic_lesson_title': lesson_row.get('LessonTitle', default_topic_lesson_values['topic_lesson_title']), + 'topic_lesson_type': lesson_row.get('LessonType', default_topic_lesson_values['topic_lesson_type']), + 'topic_lesson_length': str(lesson_row.get('SuggestedNumberOfPeriodsForLesson', default_topic_lesson_values['topic_lesson_length'])), + 'topic_lesson_suggested_activities': lesson_row.get('SuggestedActivities', default_topic_lesson_values['topic_lesson_suggested_activities']), + 'topic_lesson_skills_learned': lesson_row.get('SkillsLearned', default_topic_lesson_values['topic_lesson_skills_learned']), + 'topic_lesson_weblinks': lesson_row.get('WebLinks', default_topic_lesson_values['topic_lesson_weblinks']), + 'path': lesson_path + } + for key, value in lesson_data.items(): + if pd.isna(value): + lesson_data[key] = default_topic_lesson_values.get(key, 'Null') + + lesson_node = neo_curriculum.TopicLessonNode(**lesson_data) + # Create lesson node in curriculum database only + neon.create_or_merge_neontology_node(lesson_node, database=curriculum_db_name, operation='merge') + fs_handler.create_default_tldraw_file(lesson_node.path, lesson_node.to_dict()) + node_library['topic_lesson_nodes'][lesson_row['LessonID']] = lesson_node + + # Link lesson to topic + neon.create_or_merge_neontology_relationship( + curriculum_relationships.TopicIncludesTopicLesson(source=topic_node, target=lesson_node), + database=curriculum_db_name, operation='merge' + ) + logger.info(f"Created lesson node {lesson_node.unique_id} and relationship with topic {topic_node.unique_id}") + + # Create sequential relationships between lessons + if lesson_row['Lesson'].isdigit() and previous_lesson_node: + neon.create_or_merge_neontology_relationship( + curriculum_relationships.TopicLessonFollowsTopicLesson(source=previous_lesson_node, target=lesson_node), + database=curriculum_db_name, operation='merge' + ) + logger.info(f"Created sequential relationship between lessons {previous_lesson_node.unique_id} and {lesson_node.unique_id}") + previous_lesson_node = lesson_node + + # Process learning statements for this lesson only if not already processed + statements_for_lesson = statement_df[ + (statement_df['LessonID'] == lesson_row['LessonID']) & + (statement_df['SyllabusSubject'] == topic_subject) + ] + for _, statement_row in statements_for_lesson.iterrows(): + if statement_row['StatementID'] in statements_processed: + continue + statements_processed.add(statement_row['StatementID']) + + _, statement_path = fs_handler.create_curriculum_learning_statement_directory(lesson_path, statement_row['StatementID']) + + statement_data = { + 'unique_id': f"LearningStatement_{lesson_node.unique_id}_{statement_row['StatementID']}", + 'lesson_learning_statement_id': statement_row['StatementID'], + 'lesson_learning_statement': statement_row.get('LearningStatement', default_learning_statement_values['lesson_learning_statement']), + 'lesson_learning_statement_type': statement_row.get('StatementType', default_learning_statement_values['lesson_learning_statement_type']), + 'path': statement_path + } + for key in statement_data: + if pd.isna(statement_data[key]): + statement_data[key] = default_learning_statement_values.get(key, 'Null') + + statement_node = neo_curriculum.LearningStatementNode(**statement_data) + # Create statement node in curriculum database only + neon.create_or_merge_neontology_node(statement_node, database=curriculum_db_name, operation='merge') + fs_handler.create_default_tldraw_file(statement_node.path, statement_node.to_dict()) + node_library['statement_nodes'][statement_row['StatementID']] = statement_node + + # Link learning statement to lesson + neon.create_or_merge_neontology_relationship( + curriculum_relationships.LessonIncludesLearningStatement(source=lesson_node, target=statement_node), + database=curriculum_db_name, operation='merge' + ) + logger.info(f"Created learning statement node {statement_node.unique_id} and relationship with lesson {lesson_node.unique_id}") + else: + logger.warning(f"No year group node found for year group {year_group}, skipping syllabus creation") + + # After processing all year groups and their syllabuses, process any remaining topics + logger.info("Processing topics without year groups") + for _, topic_row in topic_df.iterrows(): + if topic_row['TopicID'] in topics_processed: + continue + + topic_subject = topic_row['SyllabusSubject'] + topic_key_stage = topic_row['SyllabusKeyStage'] + + logger.debug(f"Processing topic {topic_row['TopicID']} for subject {topic_subject} and key stage {topic_key_stage} without year group") + + # Find the key stage syllabus node + matching_syllabus_node = None + for syllabus_node in node_library['key_stage_syllabus_nodes'].values(): + if (syllabus_node.ks_syllabus_subject == topic_subject and + syllabus_node.ks_syllabus_key_stage == str(topic_key_stage)): + matching_syllabus_node = syllabus_node + break + + if not matching_syllabus_node: + logger.warning(f"No key stage syllabus node found for subject {topic_subject} and key stage {topic_key_stage}, skipping topic creation") + continue + + _, topic_path = fs_handler.create_curriculum_topic_directory(matching_syllabus_node.path, topic_row['TopicID']) + logger.info(f"Created topic directory for {topic_path}") + + topic_node_unique_id = f"Topic_{matching_syllabus_node.unique_id}_{topic_row['TopicID']}" + topic_node = neo_curriculum.TopicNode( + unique_id=topic_node_unique_id, + topic_id=topic_row['TopicID'], + topic_title=topic_row.get('TopicTitle', default_topic_values['topic_title']), + total_number_of_lessons_for_topic=str(topic_row.get('TotalNumberOfLessonsForTopic', default_topic_values['total_number_of_lessons_for_topic'])), + topic_type=topic_row.get('TopicType', default_topic_values['topic_type']), + topic_assessment_type=topic_row.get('TopicAssessmentType', default_topic_values['topic_assessment_type']), + path=topic_path + ) + # Create topic node in curriculum database only + neon.create_or_merge_neontology_node(topic_node, database=curriculum_db_name, operation='merge') + fs_handler.create_default_tldraw_file(topic_node.path, topic_node.to_dict()) + node_library['topic_nodes'][topic_row['TopicID']] = topic_node + topics_processed.add(topic_row['TopicID']) + + # Link topic to key stage syllabus + neon.create_or_merge_neontology_relationship( + curriculum_relationships.KeyStageSyllabusIncludesTopic(source=matching_syllabus_node, target=topic_node), + database=curriculum_db_name, operation='merge' + ) + logger.info(f"Created relationship between topic {topic_node_unique_id} and key stage syllabus {matching_syllabus_node.unique_id}") + + # Process lessons for this topic + lessons_for_topic = lesson_df[ + (lesson_df['TopicID'] == topic_row['TopicID']) & + (lesson_df['SyllabusSubject'] == topic_subject) + ].copy() + lessons_for_topic.loc[:, 'Lesson'] = lessons_for_topic['Lesson'].astype(str) + lessons_for_topic = lessons_for_topic.sort_values('Lesson') + + previous_lesson_node = None + for _, lesson_row in lessons_for_topic.iterrows(): + if lesson_row['LessonID'] in lessons_processed: + continue + lessons_processed.add(lesson_row['LessonID']) + + _, lesson_path = fs_handler.create_curriculum_lesson_directory(topic_path, lesson_row['LessonID']) + logger.info(f"Created lesson directory for {lesson_path}") + + lesson_data = { + 'unique_id': f"TopicLesson_{topic_node_unique_id}_{lesson_row['LessonID']}", + 'topic_lesson_id': lesson_row['LessonID'], + 'topic_lesson_title': lesson_row.get('LessonTitle', default_topic_lesson_values['topic_lesson_title']), + 'topic_lesson_type': lesson_row.get('LessonType', default_topic_lesson_values['topic_lesson_type']), + 'topic_lesson_length': str(lesson_row.get('SuggestedNumberOfPeriodsForLesson', default_topic_lesson_values['topic_lesson_length'])), + 'topic_lesson_suggested_activities': lesson_row.get('SuggestedActivities', default_topic_lesson_values['topic_lesson_suggested_activities']), + 'topic_lesson_skills_learned': lesson_row.get('SkillsLearned', default_topic_lesson_values['topic_lesson_skills_learned']), + 'topic_lesson_weblinks': lesson_row.get('WebLinks', default_topic_lesson_values['topic_lesson_weblinks']), + 'path': lesson_path + } + for key, value in lesson_data.items(): + if pd.isna(value): + lesson_data[key] = default_topic_lesson_values.get(key, 'Null') + + lesson_node = neo_curriculum.TopicLessonNode(**lesson_data) + # Create lesson node in curriculum database only + neon.create_or_merge_neontology_node(lesson_node, database=curriculum_db_name, operation='merge') + fs_handler.create_default_tldraw_file(lesson_node.path, lesson_node.to_dict()) + node_library['topic_lesson_nodes'][lesson_row['LessonID']] = lesson_node + + # Link lesson to topic + neon.create_or_merge_neontology_relationship( + curriculum_relationships.TopicIncludesTopicLesson(source=topic_node, target=lesson_node), + database=curriculum_db_name, operation='merge' + ) + logger.info(f"Created lesson node {lesson_node.unique_id} and relationship with topic {topic_node.unique_id}") + + # Create sequential relationships between lessons + if lesson_row['Lesson'].isdigit() and previous_lesson_node: + neon.create_or_merge_neontology_relationship( + curriculum_relationships.TopicLessonFollowsTopicLesson(source=previous_lesson_node, target=lesson_node), + database=curriculum_db_name, operation='merge' + ) + logger.info(f"Created sequential relationship between lessons {previous_lesson_node.unique_id} and {lesson_node.unique_id}") + previous_lesson_node = lesson_node + + # Process learning statements for this lesson + statements_for_lesson = statement_df[ + (statement_df['LessonID'] == lesson_row['LessonID']) & + (statement_df['SyllabusSubject'] == topic_subject) + ] + for _, statement_row in statements_for_lesson.iterrows(): + if statement_row['StatementID'] in statements_processed: + continue + statements_processed.add(statement_row['StatementID']) + + _, statement_path = fs_handler.create_curriculum_learning_statement_directory(lesson_path, statement_row['StatementID']) + + statement_data = { + 'unique_id': f"LearningStatement_{lesson_node.unique_id}_{statement_row['StatementID']}", + 'lesson_learning_statement_id': statement_row['StatementID'], + 'lesson_learning_statement': statement_row.get('LearningStatement', default_learning_statement_values['lesson_learning_statement']), + 'lesson_learning_statement_type': statement_row.get('StatementType', default_learning_statement_values['lesson_learning_statement_type']), + 'path': statement_path + } + for key in statement_data: + if pd.isna(statement_data[key]): + statement_data[key] = default_learning_statement_values.get(key, 'Null') + + statement_node = neo_curriculum.LearningStatementNode(**statement_data) + # Create statement node in curriculum database only + neon.create_or_merge_neontology_node(statement_node, database=curriculum_db_name, operation='merge') + fs_handler.create_default_tldraw_file(statement_node.path, statement_node.to_dict()) + node_library['statement_nodes'][statement_row['StatementID']] = statement_node + + # Link learning statement to lesson + neon.create_or_merge_neontology_relationship( + curriculum_relationships.LessonIncludesLearningStatement(source=lesson_node, target=statement_node), + database=curriculum_db_name, operation='merge' + ) + logger.info(f"Created learning statement node {statement_node.unique_id} and relationship with lesson {lesson_node.unique_id}") + + return node_library \ No newline at end of file diff --git a/modules/database/admin/school_manager.py b/modules/database/admin/school_manager.py new file mode 100644 index 0000000..d7eb990 --- /dev/null +++ b/modules/database/admin/school_manager.py @@ -0,0 +1,512 @@ +import os +from modules.logger_tool import initialise_logger +from supabase import create_client +import json +import pandas as pd + +import modules.database.init.xl_tools as xl +from modules.database.tools.filesystem_tools import ClassroomCopilotFilesystem +import modules.database.tools.neo4j_driver_tools as driver_tools +import modules.database.tools.neo4j_session_tools as session_tools +import modules.database.schemas.nodes.schools.schools as school_schemas +import modules.database.schemas.nodes.schools.curriculum as curriculum_schemas +import modules.database.schemas.nodes.schools.pastoral as pastoral_schemas +import modules.database.schemas.nodes.structures.schools as school_structures +import modules.database.schemas.entities as entities +from modules.database.admin.neontology_provider import NeontologyProvider +from modules.database.admin.graph_provider import GraphNamingProvider +from modules.database.schemas.relationships import curriculum_relationships, entity_relationships, entity_curriculum_rels + +class SchoolManager: + def __init__(self): + self.driver = driver_tools.get_driver() + self.logger = initialise_logger(__name__, os.getenv("LOG_LEVEL"), os.getenv("LOG_PATH"), 'default', True) + self.neontology = NeontologyProvider() + self.graph_naming = GraphNamingProvider() + + # Initialize Supabase client with correct URL and service role key + supabase_url = os.getenv("SUPABASE_URL") + service_role_key = os.getenv("SERVICE_ROLE_KEY") + + self.logger.info(f"Initializing Supabase client with URL: {supabase_url}") + self.supabase = create_client(supabase_url, service_role_key) + + # Set headers for admin operations + self.supabase.headers = { + "apiKey": service_role_key, + "Authorization": f"Bearer {service_role_key}", + "Content-Type": "application/json" + } + + # Set storage client headers explicitly + self.supabase.storage._client.headers.update({ + "apiKey": service_role_key, + "Authorization": f"Bearer {service_role_key}", + "Content-Type": "application/json" + }) + + def create_schools_database(self): + """Creates the main cc.institutes database in Neo4j""" + try: + db_name = "cc.institutes" + with self.driver.session() as session: + return self._extracted_from_create_private_database( + session, db_name, f'Created database {db_name}' + ) + except Exception as e: + self.logger.error(f"Error creating schools database: {str(e)}") + return {"status": "error", "message": str(e)} + + def create_school_node(self, school_data): + """Creates a school node in cc.institutes database and stores TLDraw file in Supabase""" + try: + # Convert Supabase school data to SchoolNode using GraphNamingProvider + school_unique_id = self.graph_naming.get_school_unique_id(school_data['urn']) + school_path = self.graph_naming.get_school_path("cc.institutes", school_data['urn']) + + school_node = entities.school_schemas.SchoolNode( + unique_id=school_unique_id, + path=school_path, + urn=school_data['urn'], + establishment_number=school_data['establishment_number'], + establishment_name=school_data['establishment_name'], + establishment_type=school_data['establishment_type'], + establishment_status=school_data['establishment_status'], + phase_of_education=school_data['phase_of_education'] if school_data['phase_of_education'] not in [None, ''] else None, + statutory_low_age=int(school_data['statutory_low_age']) if school_data.get('statutory_low_age') is not None else 0, + statutory_high_age=int(school_data['statutory_high_age']) if school_data.get('statutory_high_age') is not None else 0, + religious_character=school_data.get('religious_character') if school_data.get('religious_character') not in [None, ''] else None, + school_capacity=int(school_data['school_capacity']) if school_data.get('school_capacity') is not None else 0, + school_website=school_data.get('school_website', ''), + ofsted_rating=school_data.get('ofsted_rating') if school_data.get('ofsted_rating') not in [None, ''] else None + ) + + # Create default tldraw file data + tldraw_data = { + "document": { + "version": 1, + "id": school_data['urn'], + "name": school_data['establishment_name'], + "meta": { + "created_at": "", + "updated_at": "", + "creator_id": "", + "is_template": False, + "is_snapshot": False, + "is_draft": False, + "template_id": None, + "snapshot_id": None, + "draft_id": None + } + }, + "schema": { + "schemaVersion": 1, + "storeVersion": 4, + "recordVersions": { + "asset": { + "version": 1, + "subTypeKey": "type", + "subTypeVersions": {} + }, + "camera": { + "version": 1 + }, + "document": { + "version": 2 + }, + "instance": { + "version": 22 + }, + "instance_page_state": { + "version": 5 + }, + "page": { + "version": 1 + }, + "shape": { + "version": 3, + "subTypeKey": "type", + "subTypeVersions": { + "cc-school-node": 1 + } + }, + "instance_presence": { + "version": 5 + }, + "pointer": { + "version": 1 + } + } + }, + "store": { + "document:document": { + "gridSize": 10, + "name": school_data['establishment_name'], + "meta": {}, + "id": school_data['urn'], + "typeName": "document" + }, + "page:page": { + "meta": {}, + "id": "page", + "name": "Page 1", + "index": "a1", + "typeName": "page" + }, + "shape:school-node": { + "x": 0, + "y": 0, + "rotation": 0, + "type": "cc-school-node", + "id": school_unique_id, + "parentId": "page", + "index": "a1", + "props": school_node.to_dict(), + "typeName": "shape" + }, + "instance:instance": { + "id": "instance", + "currentPageId": "page", + "typeName": "instance" + }, + "camera:camera": { + "x": 0, + "y": 0, + "z": 1, + "id": "camera", + "typeName": "camera" + } + } + } + + # Store tldraw file in Supabase storage + file_path = f"{school_data['urn']}/tldraw.json" + file_options = { + "content-type": "application/json", + "x-upsert": "true", # Update if exists + "metadata": { + "establishment_urn": school_data['urn'], + "establishment_name": school_data['establishment_name'] + } + } + + try: + # Create a fresh service role client for storage operations + self.logger.info("Creating fresh service role client for storage operations") + service_client = create_client( + os.getenv("SUPABASE_URL"), + os.getenv("SERVICE_ROLE_KEY") + ) + + self.logger.debug(f"Service client created with URL: {os.getenv('SUPABASE_URL')}") + + service_client.headers = { + "apiKey": os.getenv("SERVICE_ROLE_KEY"), + "Authorization": f"Bearer {os.getenv('SERVICE_ROLE_KEY')}", + "Content-Type": "application/json" + } + service_client.storage._client.headers.update({ + "apiKey": os.getenv("SERVICE_ROLE_KEY"), + "Authorization": f"Bearer {os.getenv('SERVICE_ROLE_KEY')}", + "Content-Type": "application/json" + }) + + self.logger.debug("Headers set for service client and storage client") + + # Upload to Supabase storage using service role client + self.logger.info(f"Uploading tldraw file for school {school_data['urn']}") + self.logger.debug(f"File path: {file_path}") + self.logger.debug(f"File options: {file_options}") + + # First, ensure the bucket exists + self.logger.info("Checking if bucket cc.institutes exists") + try: + bucket = service_client.storage.get_bucket("cc.institutes") + self.logger.info("Bucket cc.institutes exists") + except Exception as bucket_error: + self.logger.error(f"Error checking bucket: {str(bucket_error)}") + if hasattr(bucket_error, 'response'): + self.logger.error(f"Bucket error response: {bucket_error.response.text if hasattr(bucket_error.response, 'text') else bucket_error.response}") + raise bucket_error + + # Attempt the upload + self.logger.info("Attempting file upload") + result = service_client.storage.from_("cc.institutes").upload( + path=file_path, + file=json.dumps(tldraw_data).encode(), + file_options=file_options + ) + self.logger.info(f"Upload successful. Result: {result}") + + except Exception as upload_error: + self.logger.error(f"Error uploading tldraw file: {str(upload_error)}") + if hasattr(upload_error, 'response'): + self.logger.error(f"Upload error response: {upload_error.response.text if hasattr(upload_error.response, 'text') else upload_error.response}") + raise upload_error + + # Create node in Neo4j using Neontology + with self.neontology as neo: + self.logger.info(f"Creating school node in Neo4j: {school_node.to_dict()}") + neo.create_or_merge_node(school_node, database="cc.institutes", operation="merge") + return {"status": "success", "node": school_node} + + except Exception as e: + self.logger.error(f"Error creating school node: {str(e)}") + return {"status": "error", "message": str(e)} + + def create_private_database(self, school_data): + """Creates a private database for a specific school""" + try: + private_db_name = f"cc.institutes.{school_data['urn']}" + with self.driver.session() as session: + return self._extracted_from_create_private_database( + session, private_db_name, 'Created private database ' + ) + except Exception as e: + self.logger.error(f"Error creating private database: {str(e)}") + return {"status": "error", "message": str(e)} + + # TODO Rename this here and in `create_schools_database` and `create_private_database` + def _extracted_from_create_private_database(self, session, arg1, arg2): + session_tools.create_database(session, arg1) + self.logger.info(f"{arg2}{arg1}") + return { + "status": "success", + "message": f"Database {arg1} created successfully", + } + + def create_basic_structure(self, school_node, database_name): + """Creates basic structural nodes in the specified database""" + try: + # Create filesystem paths + fs_handler = ClassroomCopilotFilesystem(database_name, init_run_type="school") + + # Create Department Structure node + department_structure_node_unique_id = f"DepartmentStructure_{school_node.unique_id}" + _, department_path = fs_handler.create_school_department_directory(school_node.path, "departments") + department_structure_node = entities.school_schemas.DepartmentNode( + unique_id=department_structure_node_unique_id, + path=department_path + ) + + # Create Curriculum Structure node + _, curriculum_path = fs_handler.create_school_curriculum_directory(school_node.path) + curriculum_node = school_structures.CurriculumStructureNode( + unique_id=f"CurriculumStructure_{school_node.unique_id}", + path=curriculum_path + ) + + # Create Pastoral Structure node + _, pastoral_path = fs_handler.create_school_pastoral_directory(school_node.path) + pastoral_node = school_structures.PastoralStructureNode( + unique_id=f"PastoralStructure_{school_node.unique_id}", + path=pastoral_path + ) + + with self.neontology as neo: + # Create nodes + neo.create_or_merge_node(department_structure_node, database=str(database_name), operation='merge') + fs_handler.create_default_tldraw_file(department_structure_node.path, department_structure_node.to_dict()) + + neo.create_or_merge_node(curriculum_node, database=str(database_name), operation='merge') + fs_handler.create_default_tldraw_file(curriculum_node.path, curriculum_node.to_dict()) + + neo.create_or_merge_node(pastoral_node, database=database_name, operation='merge') + fs_handler.create_default_tldraw_file(pastoral_node.path, pastoral_node.to_dict()) + + # Create relationships + neo.create_or_merge_relationship( + entity_relationships.SchoolHasDepartmentStructure(source=school_node, target=department_structure_node), + database=database_name, operation='merge' + ) + + neo.create_or_merge_relationship( + entity_curriculum_rels.SchoolHasCurriculumStructure(source=school_node, target=curriculum_node), + database=database_name, operation='merge' + ) + + neo.create_or_merge_relationship( + entity_curriculum_rels.SchoolHasPastoralStructure(source=school_node, target=pastoral_node), + database=database_name, operation='merge' + ) + + return { + "status": "success", + "message": "Basic structure created successfully", + "nodes": { + "department_structure": department_structure_node, + "curriculum_structure": curriculum_node, + "pastoral_structure": pastoral_node + } + } + + except Exception as e: + self.logger.error(f"Error creating basic structure: {str(e)}") + return {"status": "error", "message": str(e)} + + def create_detailed_structure(self, school_node, database_name, excel_file): + """Creates detailed structural nodes from Excel file""" + try: + # First, store the Excel file in Supabase + file_path = f"{school_node.urn}/structure.xlsx" + file_options = { + "content-type": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "x-upsert": "true" + } + + # Upload Excel file to storage + self.supabase.storage.from_("cc.institutes").upload( + path=file_path, + file=excel_file, + file_options=file_options + ) + + # Process Excel file + dataframes = xl.create_dataframes(excel_file) + + # Get existing basic structure nodes + with self.neontology as neo: + result = neo.cypher_read(""" + MATCH (s:School {unique_id: $school_id}) + OPTIONAL MATCH (s)-[:HAS_DEPARTMENT_STRUCTURE]->(ds:DepartmentStructure) + OPTIONAL MATCH (s)-[:HAS_CURRICULUM_STRUCTURE]->(cs:CurriculumStructure) + OPTIONAL MATCH (s)-[:HAS_PASTORAL_STRUCTURE]->(ps:PastoralStructure) + RETURN ds, cs, ps + """, {"school_id": school_node.unique_id}, database=database_name) + + if not result: + raise Exception("Basic structure not found") + + department_structure = result['ds'] + curriculum_structure = result['cs'] + pastoral_structure = result['ps'] + + # Create departments and subjects + unique_departments = dataframes['keystagesyllabuses']['Department'].dropna().unique() + + fs_handler = ClassroomCopilotFilesystem(database_name, init_run_type="school") + node_library = {} + + with self.neontology as neo: + for department_name in unique_departments: + _, department_path = fs_handler.create_school_department_directory(school_node.path, department_name) + + department_node = school_schemas.DepartmentNode( + unique_id=f"Department_{school_node.unique_id}_{department_name.replace(' ', '_')}", + department_name=department_name, + path=department_path + ) + neo.create_or_merge_node(department_node, database=database_name, operation='merge') + fs_handler.create_default_tldraw_file(department_node.path, department_node.to_dict()) + node_library[f'department_{department_name}'] = department_node + + # Link to department structure + neo.create_or_merge_relationship( + entity_relationships.DepartmentStructureHasDepartment( + source=department_structure, + target=department_node + ), + database=database_name, + operation='merge' + ) + + # Create year groups + year_groups = self.sort_year_groups(dataframes['yeargroupsyllabuses'])['YearGroup'].unique() + last_year_group_node = None + + for year_group in year_groups: + numeric_year_group = pd.to_numeric(year_group, errors='coerce') + if pd.notna(numeric_year_group): + _, year_group_path = fs_handler.create_pastoral_year_group_directory( + pastoral_structure.path, + str(int(numeric_year_group)) + ) + + year_group_node = pastoral_schemas.YearGroupNode( + unique_id=f"YearGroup_{school_node.unique_id}_YGrp{int(numeric_year_group)}", + year_group=str(int(numeric_year_group)), + year_group_name=f"Year {int(numeric_year_group)}", + path=year_group_path + ) + neo.create_or_merge_node(year_group_node, database=database_name, operation='merge') + fs_handler.create_default_tldraw_file(year_group_node.path, year_group_node.to_dict()) + node_library[f'year_group_{int(numeric_year_group)}'] = year_group_node + + # Create sequential relationship + if last_year_group_node: + neo.create_or_merge_relationship( + curriculum_relationships.YearGroupFollowsYearGroup( + source=last_year_group_node, + target=year_group_node + ), + database=database_name, + operation='merge' + ) + last_year_group_node = year_group_node + + # Link to pastoral structure + neo.create_or_merge_relationship( + curriculum_relationships.PastoralStructureIncludesYearGroup( + source=pastoral_structure, + target=year_group_node + ), + database=database_name, + operation='merge' + ) + + # Create key stages + key_stages = dataframes['keystagesyllabuses']['KeyStage'].unique() + last_key_stage_node = None + + for key_stage in sorted(key_stages): + _, key_stage_path = fs_handler.create_curriculum_key_stage_directory( + curriculum_structure.path, + str(key_stage) + ) + + key_stage_node = curriculum_schemas.KeyStageNode( + unique_id=f"KeyStage_{curriculum_structure.unique_id}_KStg{key_stage}", + key_stage_name=f"Key Stage {key_stage}", + key_stage=str(key_stage), + path=key_stage_path + ) + neo.create_or_merge_node(key_stage_node, database=database_name, operation='merge') + fs_handler.create_default_tldraw_file(key_stage_node.path, key_stage_node.to_dict()) + node_library[f'key_stage_{key_stage}'] = key_stage_node + + # Create sequential relationship + if last_key_stage_node: + neo.create_or_merge_relationship( + curriculum_relationships.KeyStageFollowsKeyStage( + source=last_key_stage_node, + target=key_stage_node + ), + database=database_name, + operation='merge' + ) + last_key_stage_node = key_stage_node + + # Link to curriculum structure + neo.create_or_merge_relationship( + curriculum_relationships.CurriculumStructureIncludesKeyStage( + source=curriculum_structure, + target=key_stage_node + ), + database=database_name, + operation='merge' + ) + + return { + "status": "success", + "message": "Detailed structure created successfully", + "node_library": node_library + } + + except Exception as e: + self.logger.error(f"Error creating detailed structure: {str(e)}") + return {"status": "error", "message": str(e)} + + def sort_year_groups(self, df): + df = df.copy() + df['YearGroupNumeric'] = pd.to_numeric(df['YearGroup'], errors='coerce') + return df.sort_values(by='YearGroupNumeric') diff --git a/modules/database/admin/school_syllabus_provider.py b/modules/database/admin/school_syllabus_provider.py new file mode 100644 index 0000000..890a6a2 --- /dev/null +++ b/modules/database/admin/school_syllabus_provider.py @@ -0,0 +1,54 @@ +import os +from modules.logger_tool import initialise_logger +import modules.database.tools.neo4j_driver_tools as driver_tools +import modules.database.tools.neo4j_session_tools as session_tools +import modules.database.tools.neontology_tools as neon +import modules.database.schemas.entities as neo_entity +import modules.database.schemas.nodes.schools.curriculum as curriculum_schemas +import modules.database.schemas.relationships.curriculum_relationships as curriculum_relationships +import modules.database.schemas.relationships.entity_relationships as ent_rels +import modules.database.schemas.relationships.entity_curriculum_rels as ent_cur_rels +import pandas as pd + +class SchoolSyllabusProvider: + def __init__(self): + self.driver = driver_tools.get_driver() + self.logger = initialise_logger(__name__, os.getenv("LOG_LEVEL"), os.getenv("LOG_PATH"), 'default', True) + + def process_syllabus_data(self, school_node, database_name, dataframes): + """Process syllabus data from Excel file and create nodes in the database""" + try: + # This method will contain the syllabus-specific processing code from the + # original SchoolCurriculumProvider, starting from where the comment + # "# Curriculum specific database initialisation begins here" was placed + + # We'll implement this in the next iteration after confirming the basic + # structure changes work correctly + + return { + "status": "success", + "message": "Syllabus data processed successfully" + } + + except Exception as e: + self.logger.error(f"Error processing syllabus data: {str(e)}") + return {"status": "error", "message": str(e)} + + def check_syllabus_status(self, school_node, database_name): + """Check if syllabus data exists in the database""" + try: + with self.driver.session(database=database_name) as session: + result = session.run(""" + MATCH (s:School {unique_id: $school_id}) + OPTIONAL MATCH (s)-[:HAS_CURRICULUM_STRUCTURE]->(:CurriculumStructure)-[:INCLUDES_KEY_STAGE]->(:KeyStage)-[:INCLUDES_KEY_STAGE_SYLLABUS]->(ks:KeyStageSyllabus) + OPTIONAL MATCH (s)-[:HAS_CURRICULUM_STRUCTURE]->(:CurriculumStructure)-[:INCLUDES_KEY_STAGE]->(:KeyStage)-[:INCLUDES_YEAR_GROUP_SYLLABUS]->(ys:YearGroupSyllabus) + RETURN count(ks) > 0 OR count(ys) > 0 as has_syllabus + """, school_id=school_node.unique_id) + + has_syllabus = result.single()["has_syllabus"] + + return {"has_syllabus": has_syllabus} + + except Exception as e: + self.logger.error(f"Error checking syllabus status: {str(e)}") + raise diff --git a/modules/database/admin/school_timetable_provider.py b/modules/database/admin/school_timetable_provider.py new file mode 100644 index 0000000..0fe68f0 --- /dev/null +++ b/modules/database/admin/school_timetable_provider.py @@ -0,0 +1,526 @@ +import os +from modules.logger_tool import initialise_logger +logger = initialise_logger(__name__, os.getenv("LOG_LEVEL"), os.getenv("LOG_PATH"), 'default', True) + +import modules.database.init.init_calendar as init_calendar +import modules.database.schemas.nodes.schools.timetable as timetable +import modules.database.schemas.relationships.timetables as tt_rels +import modules.database.schemas.relationships.entity_timetable_rels as entity_tt_rels +import modules.database.schemas.relationships.calendar_timetable_rels as cal_tt_rels +import modules.database.tools.neontology_tools as neon +from modules.database.tools.filesystem_tools import ClassroomCopilotFilesystem +from datetime import timedelta, datetime +import pandas as pd + +def create_school_timetable_from_dataframes(dataframes, db_name, school_node=None): + logger.info(f"Creating school timetable for {db_name}") + if dataframes is None: + raise ValueError("Data is required to create the calendar and timetable.") + + logger.info("Initialising neo4j connection...") + neon.init_neontology_connection() + + # Initialize the filesystem handler + fs_handler = ClassroomCopilotFilesystem(db_name, init_run_type="school") + + school_df = dataframes['school'] + if school_node is None: + logger.info("School node is None, using school data from dataframe") + school_unique_id = school_df[school_df['Identifier'] == 'SchoolID']['Data'].iloc[0] + else: + logger.info(f"School node is not None, using school data from school node: {school_node}") + school_unique_id = school_node.unique_id + + terms_df = dataframes['terms'] + weeks_df = dataframes['weeks'] + days_df = dataframes['days'] + periods_df = dataframes['periods'] + + school_df_year_start = school_df[school_df['Identifier'] == 'AcademicYearStart']['Data'].iloc[0] + school_df_year_end = school_df[school_df['Identifier'] == 'AcademicYearEnd']['Data'].iloc[0] + if isinstance(school_df_year_start, str): + school_year_start_date = datetime.strptime(school_df_year_start, '%Y-%m-%d') + else: + school_year_start_date = school_df_year_start + if isinstance(school_df_year_end, str): + school_year_end_date = datetime.strptime(school_df_year_end, '%Y-%m-%d') + else: + school_year_end_date = school_df_year_end + + # Create a dictionary to store the timetable nodes + timetable_nodes = { + 'timetable_node': None, + 'academic_year_nodes': [], + 'academic_term_nodes': [], + 'academic_week_nodes': [], + 'academic_day_nodes': [], + 'academic_period_nodes': [] + } + + if school_node: + # Create the root timetable directory + _, timetable_path = fs_handler.create_school_timetable_directory(school_node.path) + else: + # Create the root timetable directory + _, timetable_path = fs_handler.create_school_timetable_directory() + + # Create AcademicTimetable Node + school_timetable_unique_id = f"SchoolTimetable_{school_unique_id}_{school_year_start_date.year}_{school_year_end_date.year}" + school_timetable_node = timetable.SchoolTimetableNode( + unique_id=school_timetable_unique_id, + start_date=school_year_start_date, + end_date=school_year_end_date, + path=timetable_path + ) + neon.create_or_merge_neontology_node(school_timetable_node, database=db_name, operation='merge') + # Create the tldraw file for the node + fs_handler.create_default_tldraw_file(school_timetable_node.path, school_timetable_node.to_dict()) + timetable_nodes['timetable_node'] = school_timetable_node + + if school_node: + logger.info(f"Creating calendar for {school_unique_id} from Neo4j SchoolNode: {school_node.unique_id}") + calendar_nodes = init_calendar.create_calendar(db_name, school_year_start_date, school_year_end_date, attach_to_calendar_node=True, entity_node=school_node) + # Link the school node to the timetable node + neon.create_or_merge_neontology_relationship( + entity_tt_rels.SchoolHasTimetable(source=school_node, target=school_timetable_node), + database=db_name, operation='merge' + ) + timetable_nodes['calendar_nodes'] = calendar_nodes + else: + logger.info(f"Creating calendar for {school_unique_id} from dataframe SchoolID: {school_unique_id}") + calendar_nodes = init_calendar.create_calendar(db_name, school_year_start_date, school_year_end_date, attach_to_calendar_node=False, entity_node=None) + + # Create AcademicYear nodes for each year within the range + for year in range(school_year_start_date.year, school_year_end_date.year + 1): + _, timetable_year_path = fs_handler.create_school_timetable_year_directory(timetable_path, year) + year_str = str(year) + academic_year_unique_id = f"AcademicYear_{school_timetable_unique_id}_{year}" + academic_year_node = timetable.AcademicYearNode( + unique_id=academic_year_unique_id, + year=year_str, + path=timetable_year_path + ) + neon.create_or_merge_neontology_node(academic_year_node, database=db_name, operation='merge') + # Create the tldraw file for the node + fs_handler.create_default_tldraw_file(academic_year_node.path, academic_year_node.to_dict()) + timetable_nodes['academic_year_nodes'].append(academic_year_node) + logger.info(f'Created academic year node: {academic_year_node.unique_id}') + neon.create_or_merge_neontology_relationship( + tt_rels.AcademicTimetableHasAcademicYear(source=school_timetable_node, target=academic_year_node), + database=db_name, operation='merge' + ) + logger.info(f"Created school timetable relationship from {school_timetable_node.unique_id} to {academic_year_node.unique_id}") + + # Link the academic year with the corresponding calendar year node + for year_node in calendar_nodes['calendar_year_nodes']: + if year_node.year == year: + neon.create_or_merge_neontology_relationship( + cal_tt_rels.AcademicYearIsCalendarYear(source=academic_year_node, target=year_node), + database=db_name, operation='merge' + ) + logger.info(f"Created school timetable relationship from {academic_year_node.unique_id} to {year_node.unique_id}") + break + + # Create Term and TermBreak nodes linked to AcademicYear + term_number = 1 + academic_term_number = 1 + for _, term_row in terms_df.iterrows(): + term_node_class = timetable.AcademicTermNode if term_row['TermType'] == 'Term' else timetable.AcademicTermBreakNode + term_name = term_row['TermName'] + term_name_no_spaces = term_name.replace(' ', '') + term_start_date = term_row['StartDate'] + if isinstance(term_start_date, pd.Timestamp): + term_start_date = term_start_date.strftime('%Y-%m-%d') + + term_end_date = term_row['EndDate'] + if isinstance(term_end_date, pd.Timestamp): + term_end_date = term_end_date.strftime('%Y-%m-%d') + + if term_row['TermType'] == 'Term': + _, timetable_term_path = fs_handler.create_school_timetable_academic_term_directory( + timetable_path=timetable_path, + term_name=term_name, + term_number=academic_term_number + ) + term_node_unique_id = f"AcademicTerm_{school_timetable_unique_id}_{academic_term_number}_{term_name_no_spaces}" + academic_term_number_str = str(academic_term_number) + term_node = term_node_class( + unique_id=term_node_unique_id, + term_name=term_name, + term_number=academic_term_number_str, + start_date=datetime.strptime(term_start_date, '%Y-%m-%d'), + end_date=datetime.strptime(term_end_date, '%Y-%m-%d'), + path=timetable_term_path + ) + academic_term_number += 1 + else: + term_break_node_unique_id = f"AcademicTermBreak_{school_timetable_unique_id}_{term_name_no_spaces}" + term_node = term_node_class( + unique_id=term_break_node_unique_id, + term_break_name=term_name, + start_date=datetime.strptime(term_start_date, '%Y-%m-%d'), + end_date=datetime.strptime(term_end_date, '%Y-%m-%d') + ) + neon.create_or_merge_neontology_node(term_node, database=db_name, operation='merge') + if isinstance(term_node, timetable.AcademicTermNode): + # Create the tldraw file for the node + fs_handler.create_default_tldraw_file(term_node.path, term_node.to_dict()) + logger.info(f'Created academic term break node: {term_node.unique_id}') + timetable_nodes['academic_term_nodes'].append(term_node) + term_number += 1 # We don't use this but we could + + # Link term node to the correct academic year + term_years = set() + term_years.update([term_node.start_date.year, term_node.end_date.year]) + + for academic_year_node in timetable_nodes['academic_year_nodes']: + if int(academic_year_node.year) in term_years: + relationship_class = tt_rels.AcademicYearHasAcademicTerm if term_row['TermType'] == 'Term' else tt_rels.AcademicYearHasAcademicTermBreak + neon.create_or_merge_neontology_relationship( + relationship_class(source=academic_year_node, target=term_node), + database=db_name, operation='merge' + ) + logger.info(f"Created school timetable relationship from {academic_year_node.unique_id} to {term_node.unique_id}") + + # Create Week nodes + academic_week_number = 1 + for _, week_row in weeks_df.iterrows(): + week_node_class = timetable.HolidayWeekNode if week_row['WeekType'] == 'Holiday' else timetable.AcademicWeekNode + week_start_date = week_row['WeekStart'] + if isinstance(week_start_date, pd.Timestamp): + week_start_date = week_start_date.strftime('%Y-%m-%d') + + if week_row['WeekType'] == 'Holiday': + week_node_unique_id = f"{week_row['WeekType']}Week_{school_timetable_unique_id}_Week_{week_row['WeekNumber']}" + week_node = week_node_class( + unique_id=week_node_unique_id, + start_date=datetime.strptime(week_start_date, '%Y-%m-%d') + ) + else: + _, timetable_week_path = fs_handler.create_school_timetable_academic_week_directory( + timetable_path=timetable_path, + week_number=academic_week_number + ) + week_node_unique_id = f"AcademicWeek_{school_timetable_unique_id}_Week_{week_row['WeekNumber']}" + academic_week_number_str = str(academic_week_number) + week_type = week_row['WeekType'] + week_node = week_node_class( + unique_id=week_node_unique_id, + academic_week_number=academic_week_number_str, + start_date=datetime.strptime(week_start_date, '%Y-%m-%d'), + week_type=week_type, + path=timetable_week_path + ) + academic_week_number += 1 + neon.create_or_merge_neontology_node(week_node, database=db_name, operation='merge') + timetable_nodes['academic_week_nodes'].append(week_node) + logger.info(f"Created week node: {week_node.unique_id}") + if isinstance(week_node, timetable.AcademicWeekNode): + # Create the tldraw file for the node + fs_handler.create_default_tldraw_file(week_node.path, week_node.to_dict()) + for calendar_node in calendar_nodes['calendar_week_nodes']: + if calendar_node.start_date == week_node.start_date: + if isinstance(week_node, timetable.AcademicWeekNode): + neon.create_or_merge_neontology_relationship( + cal_tt_rels.AcademicWeekIsCalendarWeek(source=week_node, target=calendar_node), + database=db_name, operation='merge' + ) + logger.info(f"Created school timetable relationship from {calendar_node.unique_id} to {week_node.unique_id}") + elif isinstance(week_node, timetable.HolidayWeekNode): + neon.create_or_merge_neontology_relationship( + cal_tt_rels.HolidayWeekIsCalendarWeek(source=week_node, target=calendar_node), + database=db_name, operation='merge' + ) + logger.info(f"Created school timetable relationship from {calendar_node.unique_id} to {week_node.unique_id}") + break + + # Link week node to the correct academic term + for term_node in timetable_nodes['academic_term_nodes']: + if term_node.start_date <= week_node.start_date <= term_node.end_date: + relationship_class = tt_rels.AcademicTermHasAcademicWeek if week_row['WeekType'] != 'Holiday' else tt_rels.AcademicTermBreakHasHolidayWeek + neon.create_or_merge_neontology_relationship( + relationship_class(source=term_node, target=week_node), + database=db_name, operation='merge' + ) + logger.info(f"Created school timetable relationship from {term_node.unique_id} to {week_node.unique_id}") + break + + # Link week node to the correct academic year + for academic_year_node in timetable_nodes['academic_year_nodes']: + if int(academic_year_node.year) == week_node.start_date.year: + relationship_class = tt_rels.AcademicYearHasAcademicWeek if week_row['WeekType'] != 'Holiday' else tt_rels.AcademicYearHasHolidayWeek + neon.create_or_merge_neontology_relationship( + relationship_class(source=academic_year_node, target=week_node), + database=db_name, operation='merge' + ) + logger.info(f"Created school timetable relationship from {academic_year_node.unique_id} to {week_node.unique_id}") + break + + # Create Day nodes + day_number = 1 + academic_day_number = 1 + for _, day_row in days_df.iterrows(): + date_str = day_row['Date'] + if isinstance(date_str, pd.Timestamp): + date_str = date_str.strftime('%Y-%m-%d') + + day_node_class = { + 'Academic': timetable.AcademicDayNode, + 'Holiday': timetable.HolidayDayNode, + 'OffTimetable': timetable.OffTimetableDayNode, + 'StaffDay': timetable.StaffDayNode + }[day_row['DayType']] + + # Format the unique ID as {day_node_class.__name__}Day + day_node_data = { + 'unique_id': f"{day_node_class.__name__}Day_{school_timetable_unique_id}_{day_number}", + 'date': datetime.strptime(date_str, '%Y-%m-%d'), + 'day_of_week': datetime.strptime(date_str, '%Y-%m-%d').strftime('%A') + } + + if day_row['DayType'] == 'Academic': + day_node_data['academic_day'] = str(academic_day_number) + day_node_data['day_type'] = day_row['WeekType'] + _, timetable_day_path = fs_handler.create_school_timetable_academic_day_directory( + timetable_path=timetable_path, + academic_day=academic_day_number + ) + day_node_data['path'] = timetable_day_path + + day_node = day_node_class(**day_node_data) + + for calendar_node in calendar_nodes['calendar_day_nodes']: + if calendar_node.date == day_node.date: + neon.create_or_merge_neontology_node(day_node, database=db_name, operation='merge') + timetable_nodes['academic_day_nodes'].append(day_node) + logger.info(f"Created day node: {day_node.unique_id}") + + if isinstance(day_node, timetable.AcademicDayNode): + fs_handler.create_default_tldraw_file(day_node.path, day_node.to_dict()) + relationship_class = cal_tt_rels.AcademicDayIsCalendarDay + elif isinstance(day_node, timetable.HolidayDayNode): + relationship_class = cal_tt_rels.HolidayDayIsCalendarDay + elif isinstance(day_node, timetable.OffTimetableDayNode): + relationship_class = cal_tt_rels.OffTimetableDayIsCalendarDay + elif isinstance(day_node, timetable.StaffDayNode): + relationship_class = cal_tt_rels.StaffDayIsCalendarDay + + neon.create_or_merge_neontology_relationship( + relationship_class(source=day_node, target=calendar_node), + database=db_name, operation='merge' + ) + logger.info(f'Created relationship from {calendar_node.unique_id} to {day_node.unique_id}') + break + + # Link day node to the correct academic week + for academic_week_node in timetable_nodes['academic_week_nodes']: + if academic_week_node.start_date <= day_node.date <= (academic_week_node.start_date + timedelta(days=6)): + if day_row['DayType'] == 'Academic': + relationship_class = tt_rels.AcademicWeekHasAcademicDay + elif day_row['DayType'] == 'Holiday': + if hasattr(academic_week_node, 'week_type') and academic_week_node.week_type in ['A', 'B']: + relationship_class = tt_rels.AcademicWeekHasHolidayDay + else: + relationship_class = tt_rels.HolidayWeekHasHolidayDay + elif day_row['DayType'] == 'OffTimetable': + relationship_class = tt_rels.AcademicWeekHasOffTimetableDay + elif day_row['DayType'] == 'Staff': + relationship_class = tt_rels.AcademicWeekHasStaffDay + else: + continue # Skip linking for other day types + neon.create_or_merge_neontology_relationship( + relationship_class(source=academic_week_node, target=day_node), + database=db_name, operation='merge' + ) + logger.info(f"Created relationship from {academic_week_node.unique_id} to {day_node.unique_id}") + break + + # Link day node to the correct academic term + for term_node in timetable_nodes['academic_term_nodes']: + if term_node.start_date <= day_node.date <= term_node.end_date: + if day_row['DayType'] == 'Academic': + relationship_class = tt_rels.AcademicTermHasAcademicDay + elif day_row['DayType'] == 'Holiday': + if isinstance(term_node, timetable.AcademicTermNode): + relationship_class = tt_rels.AcademicTermHasHolidayDay + else: + relationship_class = tt_rels.AcademicTermBreakHasHolidayDay + elif day_row['DayType'] == 'OffTimetable': + relationship_class = tt_rels.AcademicTermHasOffTimetableDay + elif day_row['DayType'] == 'Staff': + relationship_class = tt_rels.AcademicTermHasStaffDay + else: + continue # Skip linking for other day types + neon.create_or_merge_neontology_relationship( + relationship_class(source=term_node, target=day_node), + database=db_name, operation='merge' + ) + logger.info(f"Created relationship from {term_node.unique_id} to {day_node.unique_id}") + break + + # Create Period nodes for each academic day + if day_row['DayType'] == 'Academic': + logger.info(f"Creating periods for {day_node.unique_id}") + period_of_day = 1 + academic_or_registration_period_of_day = 1 + for _, period_row in periods_df.iterrows(): + period_node_class = { + 'Academic': timetable.AcademicPeriodNode, + 'Registration': timetable.RegistrationPeriodNode, + 'Break': timetable.BreakPeriodNode, + 'OffTimetable': timetable.OffTimetablePeriodNode + }[period_row['PeriodType']] + + logger.info(f"Creating period node for {period_node_class.__name__} Period: {period_of_day}") + period_node_unique_id = f"{period_node_class.__name__}_{school_timetable_unique_id}_Day_{academic_day_number}_Period_{period_of_day}" + logger.debug(f"Period node unique id: {period_node_unique_id}") + period_node_data = { + 'unique_id': period_node_unique_id, + 'name': period_row['PeriodName'], + 'date': day_node.date, + 'start_time': datetime.combine(day_node.date, period_row['StartTime']), + 'end_time': datetime.combine(day_node.date, period_row['EndTime']) + } + logger.debug(f"Period node data: {period_node_data}") + if period_row['PeriodType'] in ['Academic', 'Registration']: + _, timetable_period_path = fs_handler.create_school_timetable_period_directory( + timetable_path=timetable_path, + academic_day=academic_day_number, + period_dir=f"{academic_or_registration_period_of_day}_{period_row['PeriodName'].replace(' ', '_')}" + ) + week_type = day_row['WeekType'] + day_name_short = day_node.day_of_week[:3] + period_code = period_row['PeriodCode'] + period_code_formatted = f"{week_type}{day_name_short}{period_code}" + period_node_data['period_code'] = period_code_formatted + period_node_data['path'] = timetable_period_path + + academic_or_registration_period_of_day += 1 + + period_node = period_node_class(**period_node_data) + neon.create_or_merge_neontology_node(period_node, database=db_name, operation='merge') + if isinstance(period_node, timetable.AcademicPeriodNode) or isinstance(period_node, timetable.RegistrationPeriodNode): + # Create the tldraw file for the node + fs_handler.create_default_tldraw_file(period_node.path, period_node.to_dict()) + timetable_nodes['academic_period_nodes'].append(period_node) + logger.info(f'Created period node: {period_node.unique_id}') + + relationship_class = { + 'Academic': tt_rels.AcademicDayHasAcademicPeriod, + 'Registration': tt_rels.AcademicDayHasRegistrationPeriod, + 'Break': tt_rels.AcademicDayHasBreakPeriod, + 'OffTimetable': tt_rels.AcademicDayHasOffTimetablePeriod + }[period_row['PeriodType']] + + neon.create_or_merge_neontology_relationship( + relationship_class(source=day_node, target=period_node), + database=db_name, operation='merge' + ) + logger.info(f"Created relationship from {day_node.unique_id} to {period_node.unique_id}") + period_of_day += 1 # We don't use this but we could + academic_day_number += 1 # This is a bit of a hack but it works to keep the directories aligned (reorganise) + day_number += 1 # We don't use this but we could + + def create_school_timetable_node_sequence_rels(timetable_nodes): + def sort_and_create_relationships(nodes, relationship_map, sort_key): + sorted_nodes = sorted(nodes, key=sort_key) + for i in range(len(sorted_nodes) - 1): + source_node = sorted_nodes[i] + target_node = sorted_nodes[i + 1] + node_type_pair = (type(source_node), type(target_node)) + relationship_class = relationship_map.get(node_type_pair) + if relationship_class: + # Avoid self-referential relationships + if source_node.unique_id != target_node.unique_id: + neon.create_or_merge_neontology_relationship( + relationship_class( + source=source_node, + target=target_node + ), + database=db_name, operation='merge' + ) + logger.info(f"Created relationship from {source_node.unique_id} to {target_node.unique_id}") + else: + logger.warning(f"Skipped self-referential relationship for node {source_node.unique_id}") + + # Relationship maps for different node types + academic_year_relationship_map = { + (timetable.AcademicYearNode, timetable.AcademicYearNode): tt_rels.AcademicYearFollowsAcademicYear + } + + academic_term_relationship_map = { + (timetable.AcademicTermNode, timetable.AcademicTermBreakNode): tt_rels.AcademicTermBreakFollowsAcademicTerm, + (timetable.AcademicTermBreakNode, timetable.AcademicTermNode): tt_rels.AcademicTermFollowsAcademicTermBreak + } + + academic_week_relationship_map = { + (timetable.AcademicWeekNode, timetable.AcademicWeekNode): tt_rels.AcademicWeekFollowsAcademicWeek, + (timetable.HolidayWeekNode, timetable.HolidayWeekNode): tt_rels.HolidayWeekFollowsHolidayWeek, + (timetable.AcademicWeekNode, timetable.HolidayWeekNode): tt_rels.HolidayWeekFollowsAcademicWeek, + (timetable.HolidayWeekNode, timetable.AcademicWeekNode): tt_rels.AcademicWeekFollowsHolidayWeek + } + + academic_day_relationship_map = { + (timetable.AcademicDayNode, timetable.AcademicDayNode): tt_rels.AcademicDayFollowsAcademicDay, + (timetable.HolidayDayNode, timetable.HolidayDayNode): tt_rels.HolidayDayFollowsHolidayDay, + (timetable.OffTimetableDayNode, timetable.OffTimetableDayNode): tt_rels.OffTimetableDayFollowsOffTimetableDay, + (timetable.StaffDayNode, timetable.StaffDayNode): tt_rels.StaffDayFollowsStaffDay, + + (timetable.AcademicDayNode, timetable.HolidayDayNode): tt_rels.HolidayDayFollowsAcademicDay, + (timetable.AcademicDayNode, timetable.OffTimetableDayNode): tt_rels.OffTimetableDayFollowsAcademicDay, + (timetable.AcademicDayNode, timetable.StaffDayNode): tt_rels.StaffDayFollowsAcademicDay, + + (timetable.HolidayDayNode, timetable.AcademicDayNode): tt_rels.AcademicDayFollowsHolidayDay, + (timetable.HolidayDayNode, timetable.OffTimetableDayNode): tt_rels.OffTimetableDayFollowsHolidayDay, + (timetable.HolidayDayNode, timetable.StaffDayNode): tt_rels.StaffDayFollowsHolidayDay, + + (timetable.OffTimetableDayNode, timetable.AcademicDayNode): tt_rels.AcademicDayFollowsOffTimetableDay, + (timetable.OffTimetableDayNode, timetable.HolidayDayNode): tt_rels.HolidayDayFollowsOffTimetableDay, + (timetable.OffTimetableDayNode, timetable.StaffDayNode): tt_rels.StaffDayFollowsOffTimetableDay, + + (timetable.StaffDayNode, timetable.AcademicDayNode): tt_rels.AcademicDayFollowsStaffDay, + (timetable.StaffDayNode, timetable.HolidayDayNode): tt_rels.HolidayDayFollowsStaffDay, + (timetable.StaffDayNode, timetable.OffTimetableDayNode): tt_rels.OffTimetableDayFollowsStaffDay, + } + + academic_period_relationship_map = { + (timetable.AcademicPeriodNode, timetable.AcademicPeriodNode): tt_rels.AcademicPeriodFollowsAcademicPeriod, + (timetable.AcademicPeriodNode, timetable.BreakPeriodNode): tt_rels.BreakPeriodFollowsAcademicPeriod, + (timetable.AcademicPeriodNode, timetable.RegistrationPeriodNode): tt_rels.RegistrationPeriodFollowsAcademicPeriod, + (timetable.AcademicPeriodNode, timetable.OffTimetablePeriodNode): tt_rels.OffTimetablePeriodFollowsAcademicPeriod, + (timetable.BreakPeriodNode, timetable.AcademicPeriodNode): tt_rels.AcademicPeriodFollowsBreakPeriod, + (timetable.BreakPeriodNode, timetable.BreakPeriodNode): tt_rels.BreakPeriodFollowsBreakPeriod, + (timetable.BreakPeriodNode, timetable.RegistrationPeriodNode): tt_rels.RegistrationPeriodFollowsBreakPeriod, + (timetable.BreakPeriodNode, timetable.OffTimetablePeriodNode): tt_rels.OffTimetablePeriodFollowsBreakPeriod, + (timetable.RegistrationPeriodNode, timetable.AcademicPeriodNode): tt_rels.AcademicPeriodFollowsRegistrationPeriod, + (timetable.RegistrationPeriodNode, timetable.RegistrationPeriodNode): tt_rels.RegistrationPeriodFollowsRegistrationPeriod, + (timetable.RegistrationPeriodNode, timetable.BreakPeriodNode): tt_rels.BreakPeriodFollowsRegistrationPeriod, + (timetable.RegistrationPeriodNode, timetable.OffTimetablePeriodNode): tt_rels.OffTimetablePeriodFollowsRegistrationPeriod, + (timetable.OffTimetablePeriodNode, timetable.OffTimetablePeriodNode): tt_rels.OffTimetablePeriodFollowsOffTimetablePeriod, + (timetable.OffTimetablePeriodNode, timetable.AcademicPeriodNode): tt_rels.AcademicPeriodFollowsOffTimetablePeriod, + (timetable.OffTimetablePeriodNode, timetable.BreakPeriodNode): tt_rels.BreakPeriodFollowsOffTimetablePeriod, + (timetable.OffTimetablePeriodNode, timetable.RegistrationPeriodNode): tt_rels.RegistrationPeriodFollowsOffTimetablePeriod, + } + + + # Sort and create relationships + sort_and_create_relationships(timetable_nodes['academic_year_nodes'], academic_year_relationship_map, lambda x: int(x.year)) + sort_and_create_relationships(timetable_nodes['academic_term_nodes'], academic_term_relationship_map, lambda x: x.start_date) + sort_and_create_relationships(timetable_nodes['academic_week_nodes'], academic_week_relationship_map, lambda x: x.start_date) + sort_and_create_relationships(timetable_nodes['academic_day_nodes'], academic_day_relationship_map, lambda x: x.date) + sort_and_create_relationships(timetable_nodes['academic_period_nodes'], academic_period_relationship_map, lambda x: (x.start_time, x.end_time)) + + # Call the function with the created timetable nodes + create_school_timetable_node_sequence_rels(timetable_nodes) + + logger.info(f'Created timetable: {timetable_nodes["timetable_node"].unique_id}') + + # Log the directory structure after creation + # root_timetable_directory = fs_handler.root_path # Access the root directory of the filesystem handler + # fs_handler.log_directory_structure(root_timetable_directory) + + return { + 'school_node': school_node, + 'school_calendar_nodes': calendar_nodes, + 'school_timetable_nodes': timetable_nodes + } \ No newline at end of file diff --git a/modules/database/init/__init__.py b/modules/database/init/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/modules/database/init/__pycache__/__init__.cpython-311.pyc b/modules/database/init/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bb9941b0b326442e7731b8dce007663b3136481b GIT binary patch literal 147 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 literal 0 HcmV?d00001 diff --git a/modules/database/init/__pycache__/init_school.cpython-311.pyc b/modules/database/init/__pycache__/init_school.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0634cac9b77f71c38ed520a8aa10e8c4b24010f9 GIT binary patch literal 6575 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 literal 0 HcmV?d00001 diff --git a/modules/database/init/__pycache__/init_school_curriculum.cpython-311.pyc b/modules/database/init/__pycache__/init_school_curriculum.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..869430965cc1f55e7026c258e0ff3d7c5688cea6 GIT binary patch literal 35844 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 O`4vt1dWm#8+5Rv5o4Wk~ literal 0 HcmV?d00001 diff --git a/modules/database/init/__pycache__/init_worker_timetable.cpython-311.pyc b/modules/database/init/__pycache__/init_worker_timetable.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f89e323b3ccbe2431184b050417d61dd9361af37 GIT binary patch literal 15504 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 0: + neon.create_or_merge_neontology_relationship( + calendar_sequence_relationships.TimeChunkFollowsTimeChunk(source=calendar_nodes['calendar_time_chunk_nodes'][i-1], target=time_chunk_node), + database=db_name, + operation='merge' + ) + logger.info(f"Relationship created from {calendar_nodes['calendar_time_chunk_nodes'][i-1].unique_id} to {time_chunk_node.unique_id}") + + logger.info(f'Created calendar: {calendar_nodes["calendar_node"].unique_id}') + return calendar_nodes \ No newline at end of file diff --git a/modules/database/init/init_school.py b/modules/database/init/init_school.py new file mode 100644 index 0000000..ca6b2e6 --- /dev/null +++ b/modules/database/init/init_school.py @@ -0,0 +1,158 @@ +import os +from modules.logger_tool import initialise_logger +logger = initialise_logger(__name__, os.getenv("LOG_LEVEL"), os.getenv("LOG_PATH"), 'default', True) +from modules.database.schemas.nodes.schools.schools import SchoolNode +from modules.database.supabase.utils.client import SupabaseServiceRoleClient, CreateBucketOptions +import modules.database.init.init_school_timetable as init_school_timetable +import modules.database.tools.neontology_tools as neon + +def create_school_buckets(school_id: str, school_type: str, school_name: str, admin_access_token: str) -> dict: + """Create storage buckets for a school + Args: + school_id: The unique identifier for the school + school_type: The type of school (e.g., 'development') + school_name: The display name of the school + admin_access_token: The admin access token for Supabase operations + Returns: + Dictionary containing results of bucket creation operations + """ + logger.info(f"Creating storage buckets for school {school_name} ({school_type}/{school_id})") + + storage_client = SupabaseServiceRoleClient.for_admin(admin_access_token) + base_path = f"cc.institutes.{school_type}.{school_id}" + + buckets = [ + # Main school buckets + { + "id": f"{base_path}.public", + "options": CreateBucketOptions( + name=f"{school_type.title()} School Files - {school_name} - Public Files", + public=True, + file_size_limit=50 * 1024 * 1024, + allowed_mime_types=[ + 'image/*', 'video/*', 'application/pdf', + 'application/msword', 'application/vnd.openxmlformats-officedocument.*', + 'text/plain', 'text/csv', 'application/json' + ] + ) + }, + { + "id": f"{base_path}.private", + "options": CreateBucketOptions( + name=f"{school_type.title()} School Files - {school_name} - Private Files", + public=False, + file_size_limit=50 * 1024 * 1024, + allowed_mime_types=[ + 'image/*', 'video/*', 'application/pdf', + 'application/msword', 'application/vnd.openxmlformats-officedocument.*', + 'text/plain', 'text/csv', 'application/json' + ] + ) + }, + # Curriculum buckets + { + "id": f"{base_path}.curriculum.public", + "options": CreateBucketOptions( + name=f"{school_type.title()} School Files - {school_name} - Curriculum Public Files", + public=True, + file_size_limit=50 * 1024 * 1024, + allowed_mime_types=[ + 'image/*', 'video/*', 'application/pdf', + 'application/msword', 'application/vnd.openxmlformats-officedocument.*', + 'text/plain', 'text/csv', 'application/json' + ] + ) + }, + { + "id": f"{base_path}.curriculum.private", + "options": CreateBucketOptions( + name=f"{school_type.title()} School Files - {school_name} - Curriculum Private Files", + public=False, + file_size_limit=50 * 1024 * 1024, + allowed_mime_types=[ + 'image/*', 'video/*', 'application/pdf', + 'application/msword', 'application/vnd.openxmlformats-officedocument.*', + 'text/plain', 'text/csv', 'application/json' + ] + ) + } + ] + + results = {} + for bucket in buckets: + try: + result = storage_client.create_bucket(bucket["id"], bucket["options"]) + results[bucket["id"]] = { + "status": "success", + "result": result + } + logger.info(f"Successfully created bucket {bucket['id']}") + except Exception as e: + logger.error(f"Error creating school bucket {bucket['id']}: {str(e)}") + results[bucket["id"]] = { + "status": "error", + "error": str(e) + } + + return results + +def create_school(db_name: str, id: str, name: str, website: str, school_type: str, is_public: bool = True, school_node: SchoolNode | None = None, dataframes=None): + if not name or not id or not website or not school_type: + logger.error("School name, id, website and school_type are required to create a school.") + raise ValueError("School name, id, website and school_type are required to create a school.") + + logger.info(f"Initialising neo4j connection...") + neon.init_neontology_connection() + + # Create School Node if not provided + if not school_node: + if is_public: + school_node = SchoolNode( + unique_id=f'School_{id}', + tldraw_snapshot="", + id=id, + name=name, + website=website, + school_type=school_type + ) + else: + # Create private school node with default values + school_node = SchoolNode( + unique_id=f'School_{id}', + tldraw_snapshot="", + id=id, + name=name, + website=website, + school_type=school_type, + establishment_number="0000", + establishment_name=name, + establishment_type="Default", + establishment_status="Open", + phase_of_education="All", + statutory_low_age=11, + statutory_high_age=18, + school_capacity=1000 + ) + + # First create/merge the school node in the main cc.institutes database + logger.info(f"Creating school node in main cc.institutes database...") + neon.create_or_merge_neontology_node(school_node, database="cc.institutes", operation='merge') + + # Then create/merge the school node in the specific school database + logger.info(f"Creating school node in specific database {db_name}...") + neon.create_or_merge_neontology_node(school_node, database=db_name, operation='merge') + + school_nodes = { + 'school_node': school_node, + 'db_name': db_name + } + + if dataframes is not None: + logger.info(f"Creating school timetable for {name} with {len(dataframes)} dataframes...") + school_timetable_nodes = init_school_timetable.create_school_timetable(dataframes, db_name, school_node) + school_nodes['school_timetable_nodes'] = school_timetable_nodes + else: + logger.warning(f"No dataframes provided for {name}, skipping school timetable...") + + logger.info(f"School {name} created successfully...") + return school_nodes diff --git a/modules/database/init/init_school_curriculum.py b/modules/database/init/init_school_curriculum.py new file mode 100644 index 0000000..77ce8a3 --- /dev/null +++ b/modules/database/init/init_school_curriculum.py @@ -0,0 +1,697 @@ +import os +from modules.logger_tool import initialise_logger +logger = initialise_logger(__name__, os.getenv("LOG_LEVEL"), os.getenv("LOG_PATH"), 'default', True) +import pandas as pd + +import modules.database.tools.neontology_tools as neon +import modules.database.schemas.nodes.schools.schools as school_nodes +import modules.database.schemas.nodes.schools.curriculum as curriculum_nodes +import modules.database.schemas.nodes.schools.pastoral as pastoral_nodes +import modules.database.schemas.nodes.structures.schools as school_structures +import modules.database.schemas.relationships.curriculum_relationships as curriculum_relationships +import modules.database.schemas.relationships.entity_relationships as ent_rels +import modules.database.schemas.relationships.entity_curriculum_rels as ent_cur_rels + +# Default values for nodes +default_topic_values = { + 'topic_assessment_type': 'Null', + 'topic_type': 'Null', + 'total_number_of_lessons_for_topic': '1', + 'topic_title': 'Null' +} + +default_topic_lesson_values = { + 'topic_lesson_title': 'Null', + 'topic_lesson_type': 'Null', + 'topic_lesson_length': '1', + 'topic_lesson_suggested_activities': 'Null', + 'topic_lesson_skills_learned': 'Null', + 'topic_lesson_weblinks': 'Null', +} + +default_learning_statement_values = { + 'lesson_learning_statement': 'Null', + 'lesson_learning_statement_type': 'Student learning outcome' +} + +# Helper function to sort year groups numerically where possible +def sort_year_groups(df): + df = df.copy() + df['YearGroupNumeric'] = pd.to_numeric(df['YearGroup'], errors='coerce') + return df.sort_values(by='YearGroupNumeric') + +def create_curriculum(dataframes, db_name: str, curriculum_db_name: str, school_node: school_nodes.SchoolNode): + + logger.info(f"Initialising neo4j connection...") + neon.init_neontology_connection() + + keystagesyllabus_df = dataframes['keystagesyllabuses'] + yeargroupsyllabus_df = dataframes['yeargroupsyllabuses'] + topic_df = dataframes['topics'] + lesson_df = dataframes['lessons'] + statement_df = dataframes['statements'] + # resource_df = dataframes['resources'] # TODO + + node_library = {} + node_library['key_stage_nodes'] = {} + node_library['year_group_nodes'] = {} + node_library['key_stage_syllabus_nodes'] = {} + node_library['year_group_syllabus_nodes'] = {} + node_library['topic_nodes'] = {} + node_library['topic_lesson_nodes'] = {} + node_library['statement_nodes'] = {} + node_library['department_nodes'] = {} + node_library['subject_nodes'] = {} + curriculum_node = None + pastoral_node = None + key_stage_nodes_created = {} + year_group_nodes_created = {} + last_year_group_node = None + last_key_stage_node = None + + # Create Department Structure node + department_structure_node_unique_id = f"DepartmentStructure_{school_node.unique_id}" + department_structure_node = school_structures.DepartmentStructureNode( + unique_id=department_structure_node_unique_id, + tldraw_snapshot="" + ) + # Create in school database only + neon.create_or_merge_neontology_node(department_structure_node, database=db_name, operation='merge') + node_library['department_structure_node'] = department_structure_node + + # Link Department Structure to School + neon.create_or_merge_neontology_relationship( + ent_rels.SchoolHasDepartmentStructure(source=school_node, target=department_structure_node), + database=db_name, operation='merge' + ) + logger.info(f"Created department structure node and linked to school") + + curriculum_structure_node_unique_id = f"CurriculumStructure_{school_node.unique_id}" + curriculum_node = school_structures.CurriculumStructureNode( + unique_id=curriculum_structure_node_unique_id, + tldraw_snapshot="" + ) + # Create in school database only + neon.create_or_merge_neontology_node(curriculum_node, database=db_name, operation='merge') + node_library['curriculum_node'] = curriculum_node + + # Create relationship in school database only + neon.create_or_merge_neontology_relationship( + ent_cur_rels.SchoolHasCurriculumStructure(source=school_node, target=curriculum_node), + database=db_name, operation='merge' + ) + logger.info(f"Created curriculum node and relationship with school") + + pastoral_structure_node_unique_id = f"PastoralStructure_{school_node.unique_id}" + pastoral_node = school_structures.PastoralStructureNode( + unique_id=pastoral_structure_node_unique_id, + tldraw_snapshot="" + ) + neon.create_or_merge_neontology_node(pastoral_node, database=db_name, operation='merge') + node_library['pastoral_node'] = pastoral_node + neon.create_or_merge_neontology_relationship( + ent_cur_rels.SchoolHasPastoralStructure(source=school_node, target=pastoral_node), + database=db_name, operation='merge' + ) + logger.info(f"Created pastoral node and relationship with school") + + # Create departments and subjects + # First get unique departments + unique_departments = keystagesyllabus_df['Department'].dropna().unique() + + for department_name in unique_departments: + department_unique_id = f"Department_{school_node.unique_id}_{department_name.replace(' ', '_')}" + department_node = school_nodes.DepartmentNode( + unique_id=department_unique_id, + name=department_name, + tldraw_snapshot="" + ) + # Create department in school database only + neon.create_or_merge_neontology_node(department_node, database=db_name, operation='merge') + node_library['department_nodes'][department_name] = department_node + + # Link department to department structure in school database + neon.create_or_merge_neontology_relationship( + ent_rels.DepartmentStructureHasDepartment(source=department_structure_node, target=department_node), + database=db_name, operation='merge' + ) + logger.info(f"Created department node for {department_name} and linked to department structure") + + # Create subjects and link to departments + # First get unique subjects from key stage syllabuses (which have department info) + unique_subjects = keystagesyllabus_df[['Subject', 'SubjectCode', 'Department']].drop_duplicates() + + # Then add any additional subjects from year group syllabuses (without department info) + additional_subjects = yeargroupsyllabus_df[['Subject', 'SubjectCode']].drop_duplicates() + additional_subjects = additional_subjects[~additional_subjects['SubjectCode'].isin(unique_subjects['SubjectCode'])] + + # Process subjects from key stage syllabuses first (these have department info) + for _, subject_row in unique_subjects.iterrows(): + subject_unique_id = f"Subject_{school_node.unique_id}_{subject_row['SubjectCode']}" + department_node = node_library['department_nodes'].get(subject_row['Department']) + if not department_node: + logger.warning(f"No department found for subject {subject_row['Subject']} with code {subject_row['SubjectCode']}") + continue + + subject_node = curriculum_nodes.SubjectNode( + unique_id=subject_unique_id, + id=subject_row['SubjectCode'], + name=subject_row['Subject'], + tldraw_snapshot="" + ) + # Create subject in both databases + neon.create_or_merge_neontology_node(subject_node, database=db_name, operation='merge') + neon.create_or_merge_neontology_node(subject_node, database=curriculum_db_name, operation='merge') + node_library['subject_nodes'][subject_row['Subject']] = subject_node + + # Link subject to department in school database only + neon.create_or_merge_neontology_relationship( + ent_rels.DepartmentManagesSubject(source=department_node, target=subject_node), + database=db_name, operation='merge' + ) + logger.info(f"Created subject node for {subject_row['Subject']} and linked to department {subject_row['Department']}") + + # Process any additional subjects from year group syllabuses (these won't have department info) + for _, subject_row in additional_subjects.iterrows(): + subject_unique_id = f"Subject_{school_node.unique_id}_{subject_row['SubjectCode']}" + # Create in a special "Unassigned" department + unassigned_dept_name = "Unassigned Department" + if unassigned_dept_name not in node_library['department_nodes']: + department_node = school_nodes.DepartmentNode( + unique_id=f"Department_{school_node.unique_id}_Unassigned", + name=unassigned_dept_name, + tldraw_snapshot="" + ) + neon.create_or_merge_neontology_node(department_node, database=db_name, operation='merge') + node_library['department_nodes'][unassigned_dept_name] = department_node + + # Link unassigned department to department structure + neon.create_or_merge_neontology_relationship( + ent_rels.DepartmentStructureHasDepartment(source=department_structure_node, target=department_node), + database=db_name, operation='merge' + ) + logger.info(f"Created unassigned department node and linked to department structure") + + subject_node = curriculum_nodes.SubjectNode( + unique_id=subject_unique_id, + id=subject_row['SubjectCode'], + name=subject_row['Subject'], + tldraw_snapshot="" + ) + # Create subject in both databases + neon.create_or_merge_neontology_node(subject_node, database=db_name, operation='merge') + neon.create_or_merge_neontology_node(subject_node, database=curriculum_db_name, operation='merge') + node_library['subject_nodes'][subject_row['Subject']] = subject_node + + # Link subject to unassigned department in school database only + neon.create_or_merge_neontology_relationship( + ent_rels.DepartmentManagesSubject( + source=node_library['department_nodes'][unassigned_dept_name], + target=subject_node + ), + database=db_name, operation='merge' + ) + logger.warning(f"Created subject node for {subject_row['Subject']} in unassigned department") + + # Process key stages and syllabuses + logger.info(f"Processing key stages") + last_key_stage_node = None + # Track last syllabus nodes per subject + last_key_stage_syllabus_nodes = {} # Dictionary to track last key stage syllabus node per subject + last_year_group_syllabus_nodes = {} # Dictionary to track last year group syllabus node per subject + topics_processed = set() # Track which topics have been processed + lessons_processed = set() # Track which lessons have been processed + statements_processed = set() # Track which statements have been processed + + # First create all key stage nodes and key stage syllabus nodes + for index, ks_row in keystagesyllabus_df.sort_values('KeyStage').iterrows(): + key_stage = str(ks_row['KeyStage']) + logger.debug(f"Processing key stage syllabus row - Subject: {ks_row['Subject']}, Key Stage: {key_stage}") + + subject_node = node_library['subject_nodes'].get(ks_row['Subject']) + if not subject_node: + logger.warning(f"No subject node found for subject {ks_row['Subject']}") + continue + + if key_stage not in key_stage_nodes_created: + key_stage_node_unique_id = f"KeyStage_{curriculum_node.unique_id}_KStg{key_stage}" + key_stage_node = curriculum_nodes.KeyStageNode( + unique_id=key_stage_node_unique_id, + name=f"Key Stage {key_stage}", + key_stage=str(key_stage), + tldraw_snapshot="" + ) + # Create key stage node in both databases + neon.create_or_merge_neontology_node(key_stage_node, database=db_name, operation='merge') + neon.create_or_merge_neontology_node(key_stage_node, database=curriculum_db_name, operation='merge') + key_stage_nodes_created[key_stage] = key_stage_node + node_library['key_stage_nodes'][key_stage] = key_stage_node + + # Create relationship with curriculum structure in school database only + neon.create_or_merge_neontology_relationship( + curriculum_relationships.CurriculumStructureIncludesKeyStage(source=curriculum_node, target=key_stage_node), + database=db_name, operation='merge' + ) + logger.info(f"Created key stage node {key_stage_node_unique_id} and relationship with curriculum structure") + + # Create sequential relationship between key stages in both databases + if last_key_stage_node: + neon.create_or_merge_neontology_relationship( + curriculum_relationships.KeyStageFollowsKeyStage(source=last_key_stage_node, target=key_stage_node), + database=db_name, operation='merge' + ) + neon.create_or_merge_neontology_relationship( + curriculum_relationships.KeyStageFollowsKeyStage(source=last_key_stage_node, target=key_stage_node), + database=curriculum_db_name, operation='merge' + ) + logger.info(f"Created sequential relationship between key stages {last_key_stage_node.unique_id} and {key_stage_node.unique_id}") + last_key_stage_node = key_stage_node + + # Create key stage syllabus under the subject's curriculum directory + key_stage_syllabus_node_unique_id = f"KeyStageSyllabus_{curriculum_node.unique_id}_{ks_row['Title'].replace(' ', '')}" + logger.debug(f"Creating key stage syllabus node for {ks_row['Subject']} KS{key_stage} with ID {ks_row['ID']}") + + key_stage_syllabus_node_unique_id = f"KeyStageSyllabus_{curriculum_node.unique_id}_{ks_row['Title'].replace(' ', '')}" + key_stage_syllabus_node = curriculum_nodes.KeyStageSyllabusNode( + unique_id=key_stage_syllabus_node_unique_id, + id=ks_row['ID'], + name=ks_row['Title'], + key_stage=str(ks_row['KeyStage']), + subject_name=ks_row['Subject'], + tldraw_snapshot="" + ) + # Create key stage syllabus node in both databases + neon.create_or_merge_neontology_node(key_stage_syllabus_node, database=db_name, operation='merge') + neon.create_or_merge_neontology_node(key_stage_syllabus_node, database=curriculum_db_name, operation='merge') + node_library['key_stage_syllabus_nodes'][ks_row['ID']] = key_stage_syllabus_node + logger.debug(f"Created key stage syllabus node {key_stage_syllabus_node_unique_id} for {ks_row['Subject']} KS{key_stage}") + + # Link key stage syllabus to its subject in both databases + if subject_node: + neon.create_or_merge_neontology_relationship( + curriculum_relationships.SubjectHasKeyStageSyllabus(source=subject_node, target=key_stage_syllabus_node), + database=db_name, operation='merge' + ) + neon.create_or_merge_neontology_relationship( + curriculum_relationships.SubjectHasKeyStageSyllabus(source=subject_node, target=key_stage_syllabus_node), + database=curriculum_db_name, operation='merge' + ) + logger.info(f"Created relationship between subject {subject_node.unique_id} and key stage syllabus {key_stage_syllabus_node.unique_id}") + + # Link key stage syllabus to its key stage in both databases + key_stage_node = key_stage_nodes_created.get(key_stage) + if key_stage_node: + neon.create_or_merge_neontology_relationship( + curriculum_relationships.KeyStageIncludesKeyStageSyllabus(source=key_stage_node, target=key_stage_syllabus_node), + database=db_name, operation='merge' + ) + neon.create_or_merge_neontology_relationship( + curriculum_relationships.KeyStageIncludesKeyStageSyllabus(source=key_stage_node, target=key_stage_syllabus_node), + database=curriculum_db_name, operation='merge' + ) + logger.info(f"Created relationship between key stage {key_stage_node.unique_id} and key stage syllabus {key_stage_syllabus_node.unique_id}") + + # Create sequential relationship between key stage syllabuses in both databases + last_key_stage_syllabus_node = last_key_stage_syllabus_nodes.get(ks_row['Subject']) + if last_key_stage_syllabus_node: + neon.create_or_merge_neontology_relationship( + curriculum_relationships.KeyStageSyllabusFollowsKeyStageSyllabus(source=last_key_stage_syllabus_node, target=key_stage_syllabus_node), + database=db_name, operation='merge' + ) + neon.create_or_merge_neontology_relationship( + curriculum_relationships.KeyStageSyllabusFollowsKeyStageSyllabus(source=last_key_stage_syllabus_node, target=key_stage_syllabus_node), + database=curriculum_db_name, operation='merge' + ) + logger.info(f"Created sequential relationship between key stage syllabuses {last_key_stage_syllabus_node.unique_id} and {key_stage_syllabus_node.unique_id}") + last_key_stage_syllabus_nodes[ks_row['Subject']] = key_stage_syllabus_node + + # Now process year groups and their syllabuses + for index, ks_row in keystagesyllabus_df.sort_values('KeyStage').iterrows(): + key_stage = str(ks_row['KeyStage']) + related_yeargroups = sort_year_groups(yeargroupsyllabus_df[yeargroupsyllabus_df['KeyStage'] == ks_row['KeyStage']]) + + logger.info(f"Processing year groups for key stage {key_stage}") + for yg_index, yg_row in related_yeargroups.iterrows(): + year_group = yg_row['YearGroup'] + subject_code = yg_row['SubjectCode'] + numeric_year_group = pd.to_numeric(year_group, errors='coerce') + + if pd.notna(numeric_year_group): + numeric_year_group = int(numeric_year_group) + if numeric_year_group not in year_group_nodes_created: + year_group_node_unique_id = f"YearGroup_{school_node.unique_id}_YGrp{numeric_year_group}" + year_group_node = pastoral_nodes.YearGroupNode( + unique_id=year_group_node_unique_id, + year_group=str(numeric_year_group), + name=f"Year {numeric_year_group}, {year_group}", + tldraw_snapshot="" + ) + # Create year group node in both databases but use same directory + neon.create_or_merge_neontology_node(year_group_node, database=db_name, operation='merge') + neon.create_or_merge_neontology_node(year_group_node, database=curriculum_db_name, operation='merge') + + # Create sequential relationship between year groups in both databases + if last_year_group_node: + neon.create_or_merge_neontology_relationship( + curriculum_relationships.YearGroupFollowsYearGroup(source=last_year_group_node, target=year_group_node), + database=db_name, operation='merge' + ) + neon.create_or_merge_neontology_relationship( + curriculum_relationships.YearGroupFollowsYearGroup(source=last_year_group_node, target=year_group_node), + database=curriculum_db_name, operation='merge' + ) + logger.info(f"Created sequential relationship between year groups {last_year_group_node.unique_id} and {year_group_node.unique_id} across key stages") + last_year_group_node = year_group_node + + # Create relationship with Pastoral Structure in school database only + neon.create_or_merge_neontology_relationship( + curriculum_relationships.PastoralStructureIncludesYearGroup(source=pastoral_node, target=year_group_node), + database=db_name, operation='merge' + ) + logger.info(f"Created year group node {year_group_node_unique_id} and relationship with pastoral structure") + + year_group_nodes_created[numeric_year_group] = year_group_node + node_library['year_group_nodes'][str(numeric_year_group)] = year_group_node + + # Create year group syllabus nodes in both databases + year_group_node = year_group_nodes_created.get(numeric_year_group) + if year_group_node: + year_group_syllabus_node_unique_id = f"YearGroupSyllabus_{school_node.unique_id}_{yg_row['ID']}" + year_group_syllabus_node = pastoral_nodes.YearGroupSyllabusNode( + unique_id=year_group_syllabus_node_unique_id, + id=yg_row['ID'], + name=yg_row['Title'], + year_group=str(yg_row['YearGroup']), + subject_name=yg_row['Subject'], + tldraw_snapshot="" + ) + + # Create year group syllabus node in both databases but use same directory + neon.create_or_merge_neontology_node(year_group_syllabus_node, database=db_name, operation='merge') + neon.create_or_merge_neontology_node(year_group_syllabus_node, database=curriculum_db_name, operation='merge') + node_library['year_group_syllabus_nodes'][yg_row['ID']] = year_group_syllabus_node + + # Create sequential relationship between year group syllabuses in both databases + last_year_group_syllabus_node = last_year_group_syllabus_nodes.get(yg_row['Subject']) + # Only create sequential relationship if this year group is higher than the last one + if last_year_group_syllabus_node: + last_year = pd.to_numeric(last_year_group_syllabus_node.year_group, errors='coerce') + current_year = pd.to_numeric(year_group_syllabus_node.year_group, errors='coerce') + if pd.notna(last_year) and pd.notna(current_year) and current_year > last_year: + neon.create_or_merge_neontology_relationship( + curriculum_relationships.YearGroupSyllabusFollowsYearGroupSyllabus(source=last_year_group_syllabus_node, target=year_group_syllabus_node), + database=db_name, operation='merge' + ) + neon.create_or_merge_neontology_relationship( + curriculum_relationships.YearGroupSyllabusFollowsYearGroupSyllabus(source=last_year_group_syllabus_node, target=year_group_syllabus_node), + database=curriculum_db_name, operation='merge' + ) + logger.info(f"Created sequential relationship between year group syllabuses {last_year_group_syllabus_node.unique_id} and {year_group_syllabus_node.unique_id}") + last_year_group_syllabus_nodes[yg_row['Subject']] = year_group_syllabus_node + + # Create relationships in both databases using MATCH to avoid cartesian products + subject_node = node_library['subject_nodes'].get(yg_row['Subject']) + if subject_node: + # Link to subject + neon.create_or_merge_neontology_relationship( + curriculum_relationships.SubjectHasYearGroupSyllabus(source=subject_node, target=year_group_syllabus_node), + database=db_name, operation='merge' + ) + neon.create_or_merge_neontology_relationship( + curriculum_relationships.SubjectHasYearGroupSyllabus(source=subject_node, target=year_group_syllabus_node), + database=curriculum_db_name, operation='merge' + ) + logger.info(f"Created relationship between subject {subject_node.unique_id} and year group syllabus {year_group_syllabus_node_unique_id}") + + # Link to year group + neon.create_or_merge_neontology_relationship( + curriculum_relationships.YearGroupHasYearGroupSyllabus(source=year_group_node, target=year_group_syllabus_node), + database=db_name, operation='merge' + ) + neon.create_or_merge_neontology_relationship( + curriculum_relationships.YearGroupHasYearGroupSyllabus(source=year_group_node, target=year_group_syllabus_node), + database=curriculum_db_name, operation='merge' + ) + logger.info(f"Created relationship between year group {year_group_node.unique_id} and year group syllabus {year_group_syllabus_node_unique_id}") + + # Link to key stage syllabus if it exists for the same subject + key_stage_syllabus_node = node_library['key_stage_syllabus_nodes'].get(ks_row['ID']) + if key_stage_syllabus_node and yg_row['Subject'] == ks_row['Subject']: + neon.create_or_merge_neontology_relationship( + curriculum_relationships.KeyStageSyllabusIncludesYearGroupSyllabus(source=key_stage_syllabus_node, target=year_group_syllabus_node), + database=db_name, operation='merge' + ) + neon.create_or_merge_neontology_relationship( + curriculum_relationships.KeyStageSyllabusIncludesYearGroupSyllabus(source=key_stage_syllabus_node, target=year_group_syllabus_node), + database=curriculum_db_name, operation='merge' + ) + logger.info(f"Created relationship between key stage syllabus {key_stage_syllabus_node.unique_id} and year group syllabus {year_group_syllabus_node_unique_id}") + + # Process topics for this year group syllabus only if not already processed + topics_for_syllabus = topic_df[topic_df['SyllabusYearID'] == yg_row['ID']] + for _, topic_row in topics_for_syllabus.iterrows(): + if topic_row['TopicID'] in topics_processed: + continue + topics_processed.add(topic_row['TopicID']) + + # Get the correct subject from the topic row + topic_subject = topic_row['SyllabusSubject'] + topic_key_stage = topic_row['SyllabusKeyStage'] + + logger.debug(f"Processing topic {topic_row['TopicID']} for subject {topic_subject} and key stage {topic_key_stage}") + logger.debug(f"Available key stage syllabus nodes: {[node.subject_name + '_KS' + node.key_stage for node in node_library['key_stage_syllabus_nodes'].values()]}") + + # Find the key stage syllabus node by iterating through all nodes + matching_syllabus_node = None + for syllabus_node in node_library['key_stage_syllabus_nodes'].values(): + logger.debug(f"Checking syllabus node - Subject: {syllabus_node.subject_name}, Key Stage: {syllabus_node.key_stage}") + logger.debug(f"Comparing with - Subject: {topic_subject}, Key Stage: {str(topic_key_stage)}") + logger.debug(f"Types - Node Subject: {type(syllabus_node.subject_name)}, Topic Subject: {type(topic_subject)}") + logger.debug(f"Types - Node Key Stage: {type(syllabus_node.key_stage)}, Topic Key Stage: {type(str(topic_key_stage))}") + + if (syllabus_node.subject_name == topic_subject and + syllabus_node.key_stage == str(topic_key_stage)): + matching_syllabus_node = syllabus_node + logger.debug(f"Found matching syllabus node: {syllabus_node.unique_id}") + break + + if not matching_syllabus_node: + logger.warning(f"No key stage syllabus node found for subject {topic_subject} and key stage {topic_key_stage}, skipping topic creation") + continue + + topic_node_unique_id = f"Topic_{matching_syllabus_node.unique_id}_{topic_row['TopicID']}" + topic_node = curriculum_nodes.TopicNode( + unique_id=topic_node_unique_id, + id=topic_row['TopicID'], + name=topic_row.get('TopicTitle', default_topic_values['topic_title']), + total_number_of_lessons_for_topic=str(topic_row.get('TotalNumberOfLessonsForTopic', default_topic_values['total_number_of_lessons_for_topic'])), + type=topic_row.get('TopicType', default_topic_values['topic_type']), + assessment_type=topic_row.get('TopicAssessmentType', default_topic_values['topic_assessment_type']), + tldraw_snapshot="" + ) + # Create topic node in curriculum database only + neon.create_or_merge_neontology_node(topic_node, database=curriculum_db_name, operation='merge') + node_library['topic_nodes'][topic_row['TopicID']] = topic_node + + # Link topic to key stage syllabus as well as year group syllabus + neon.create_or_merge_neontology_relationship( + curriculum_relationships.KeyStageSyllabusIncludesTopic(source=matching_syllabus_node, target=topic_node), + database=curriculum_db_name, operation='merge' + ) + neon.create_or_merge_neontology_relationship( + curriculum_relationships.YearGroupSyllabusIncludesTopic(source=year_group_syllabus_node, target=topic_node), + database=curriculum_db_name, operation='merge' + ) + logger.info(f"Created relationships between topic {topic_node_unique_id} and key stage syllabus {matching_syllabus_node.unique_id} and year group syllabus {year_group_syllabus_node_unique_id}") + + # Process lessons for this topic only if not already processed + lessons_for_topic = lesson_df[ + (lesson_df['TopicID'] == topic_row['TopicID']) & + (lesson_df['SyllabusSubject'] == topic_subject) + ].copy() + lessons_for_topic.loc[:, 'Lesson'] = lessons_for_topic['Lesson'].astype(str) + lessons_for_topic = lessons_for_topic.sort_values('Lesson') + + previous_lesson_node = None + for _, lesson_row in lessons_for_topic.iterrows(): + if lesson_row['LessonID'] in lessons_processed: + continue + lessons_processed.add(lesson_row['LessonID']) + + lesson_node = curriculum_nodes.TopicLessonNode( + unique_id=f"TopicLesson_{topic_node_unique_id}_{lesson_row['LessonID']}", + id=lesson_row['LessonID'], + name=lesson_row.get('LessonTitle', default_topic_lesson_values['topic_lesson_title']), + type=lesson_row.get('LessonType', default_topic_lesson_values['topic_lesson_type']), + length=str(lesson_row.get('SuggestedNumberOfPeriodsForLesson', default_topic_lesson_values['topic_lesson_length'])), + suggested_activities=str(lesson_row.get('SuggestedActivities', default_topic_lesson_values['topic_lesson_suggested_activities'])), + skills_learned=str(lesson_row.get('SkillsLearned', default_topic_lesson_values['topic_lesson_skills_learned'])), + weblinks=str(lesson_row.get('WebLinks', default_topic_lesson_values['topic_lesson_weblinks'])), + tldraw_snapshot="" + ) + # Create lesson node in curriculum database only + neon.create_or_merge_neontology_node(lesson_node, database=curriculum_db_name, operation='merge') + node_library['topic_lesson_nodes'][lesson_row['LessonID']] = lesson_node + + # Link lesson to topic + neon.create_or_merge_neontology_relationship( + curriculum_relationships.TopicIncludesTopicLesson(source=topic_node, target=lesson_node), + database=curriculum_db_name, operation='merge' + ) + logger.info(f"Created lesson node {lesson_node.unique_id} and relationship with topic {topic_node.unique_id}") + + # Create sequential relationships between lessons + if lesson_row['Lesson'].isdigit() and previous_lesson_node: + neon.create_or_merge_neontology_relationship( + curriculum_relationships.TopicLessonFollowsTopicLesson(source=previous_lesson_node, target=lesson_node), + database=curriculum_db_name, operation='merge' + ) + logger.info(f"Created sequential relationship between lessons {previous_lesson_node.unique_id} and {lesson_node.unique_id}") + previous_lesson_node = lesson_node + + # Process learning statements for this lesson only if not already processed + statements_for_lesson = statement_df[ + (statement_df['LessonID'] == lesson_row['LessonID']) & + (statement_df['SyllabusSubject'] == topic_subject) + ] + for _, statement_row in statements_for_lesson.iterrows(): + if statement_row['StatementID'] in statements_processed: + continue + statements_processed.add(statement_row['StatementID']) + statement_node = curriculum_nodes.LearningStatementNode( + unique_id=f"LearningStatement_{lesson_node.unique_id}_{statement_row['StatementID']}", + id=statement_row['StatementID'], + name=statement_row.get('LearningStatement', default_learning_statement_values['lesson_learning_statement']), + type=statement_row.get('StatementType', default_learning_statement_values['lesson_learning_statement_type']), + tldraw_snapshot="" + ) + # Create statement node in curriculum database only + neon.create_or_merge_neontology_node(statement_node, database=curriculum_db_name, operation='merge') + node_library['statement_nodes'][statement_row['StatementID']] = statement_node + + # Link learning statement to lesson + neon.create_or_merge_neontology_relationship( + curriculum_relationships.LessonIncludesLearningStatement(source=lesson_node, target=statement_node), + database=curriculum_db_name, operation='merge' + ) + logger.info(f"Created learning statement node {statement_node.unique_id} and relationship with lesson {lesson_node.unique_id}") + else: + logger.warning(f"No year group node found for year group {year_group}, skipping syllabus creation") + + # After processing all year groups and their syllabuses, process any remaining topics + logger.info("Processing topics without year groups") + for _, topic_row in topic_df.iterrows(): + if topic_row['TopicID'] in topics_processed: + continue + + topic_subject = topic_row['SyllabusSubject'] + topic_key_stage = topic_row['SyllabusKeyStage'] + + logger.debug(f"Processing topic {topic_row['TopicID']} for subject {topic_subject} and key stage {topic_key_stage} without year group") + + # Find the key stage syllabus node + matching_syllabus_node = None + for syllabus_node in node_library['key_stage_syllabus_nodes'].values(): + if (syllabus_node.subject_name == topic_subject and + syllabus_node.key_stage == str(topic_key_stage)): + matching_syllabus_node = syllabus_node + break + + if not matching_syllabus_node: + logger.warning(f"No key stage syllabus node found for subject {topic_subject} and key stage {topic_key_stage}, skipping topic creation") + continue + + topic_node_unique_id = f"Topic_{matching_syllabus_node.unique_id}_{topic_row['TopicID']}" + topic_node = curriculum_nodes.TopicNode( + unique_id=topic_node_unique_id, + id=topic_row['TopicID'], + name=topic_row.get('TopicTitle', default_topic_values['topic_title']), + total_number_of_lessons_for_topic=str(topic_row.get('TotalNumberOfLessonsForTopic', default_topic_values['total_number_of_lessons_for_topic'])), + type=topic_row.get('TopicType', default_topic_values['topic_type']), + assessment_type=topic_row.get('TopicAssessmentType', default_topic_values['topic_assessment_type']), + tldraw_snapshot="" + ) + # Create topic node in curriculum database only + neon.create_or_merge_neontology_node(topic_node, database=curriculum_db_name, operation='merge') + node_library['topic_nodes'][topic_row['TopicID']] = topic_node + topics_processed.add(topic_row['TopicID']) + + # Link topic to key stage syllabus + neon.create_or_merge_neontology_relationship( + curriculum_relationships.KeyStageSyllabusIncludesTopic(source=matching_syllabus_node, target=topic_node), + database=curriculum_db_name, operation='merge' + ) + logger.info(f"Created relationship between topic {topic_node_unique_id} and key stage syllabus {matching_syllabus_node.unique_id}") + + # Process lessons for this topic + lessons_for_topic = lesson_df[ + (lesson_df['TopicID'] == topic_row['TopicID']) & + (lesson_df['SyllabusSubject'] == topic_subject) + ].copy() + lessons_for_topic.loc[:, 'Lesson'] = lessons_for_topic['Lesson'].astype(str) + lessons_for_topic = lessons_for_topic.sort_values('Lesson') + + previous_lesson_node = None + for _, lesson_row in lessons_for_topic.iterrows(): + if lesson_row['LessonID'] in lessons_processed: + continue + lessons_processed.add(lesson_row['LessonID']) + lesson_node = curriculum_nodes.TopicLessonNode( + unique_id=f"TopicLesson_{topic_node_unique_id}_{lesson_row['LessonID']}", + id=lesson_row['LessonID'], + name=lesson_row.get('LessonTitle', default_topic_lesson_values['topic_lesson_title']), + type=lesson_row.get('LessonType', default_topic_lesson_values['topic_lesson_type']), + length=str(lesson_row.get('SuggestedNumberOfPeriodsForLesson', default_topic_lesson_values['topic_lesson_length'])), + suggested_activities=str(lesson_row.get('SuggestedActivities', default_topic_lesson_values['topic_lesson_suggested_activities'])), + skills_learned=str(lesson_row.get('SkillsLearned', default_topic_lesson_values['topic_lesson_skills_learned'])), + weblinks=str(lesson_row.get('WebLinks', default_topic_lesson_values['topic_lesson_weblinks'])), + tldraw_snapshot="" + ) + # Create lesson node in curriculum database only + neon.create_or_merge_neontology_node(lesson_node, database=curriculum_db_name, operation='merge') + node_library['topic_lesson_nodes'][lesson_row['LessonID']] = lesson_node + + # Link lesson to topic + neon.create_or_merge_neontology_relationship( + curriculum_relationships.TopicIncludesTopicLesson(source=topic_node, target=lesson_node), + database=curriculum_db_name, operation='merge' + ) + logger.info(f"Created lesson node {lesson_node.unique_id} and relationship with topic {topic_node.unique_id}") + + # Create sequential relationships between lessons + if lesson_row['Lesson'].isdigit() and previous_lesson_node: + neon.create_or_merge_neontology_relationship( + curriculum_relationships.TopicLessonFollowsTopicLesson(source=previous_lesson_node, target=lesson_node), + database=curriculum_db_name, operation='merge' + ) + logger.info(f"Created sequential relationship between lessons {previous_lesson_node.unique_id} and {lesson_node.unique_id}") + previous_lesson_node = lesson_node + + # Process learning statements for this lesson + statements_for_lesson = statement_df[ + (statement_df['LessonID'] == lesson_row['LessonID']) & + (statement_df['SyllabusSubject'] == topic_subject) + ] + for _, statement_row in statements_for_lesson.iterrows(): + if statement_row['StatementID'] in statements_processed: + continue + statements_processed.add(statement_row['StatementID']) + statement_node = curriculum_nodes.LearningStatementNode( + unique_id=f"LearningStatement_{lesson_node.unique_id}_{statement_row['StatementID']}", + id=statement_row['StatementID'], + name=statement_row.get('LearningStatement', default_learning_statement_values['lesson_learning_statement']), + type=statement_row.get('StatementType', default_learning_statement_values['lesson_learning_statement_type']), + tldraw_snapshot="" + ) + # Create statement node in curriculum database only + neon.create_or_merge_neontology_node(statement_node, database=curriculum_db_name, operation='merge') + node_library['statement_nodes'][statement_row['StatementID']] = statement_node + + # Link learning statement to lesson + neon.create_or_merge_neontology_relationship( + curriculum_relationships.LessonIncludesLearningStatement(source=lesson_node, target=statement_node), + database=curriculum_db_name, operation='merge' + ) + logger.info(f"Created learning statement node {statement_node.unique_id} and relationship with lesson {lesson_node.unique_id}") + + return node_library \ No newline at end of file diff --git a/modules/database/init/init_school_timetable.py b/modules/database/init/init_school_timetable.py new file mode 100644 index 0000000..4d91121 --- /dev/null +++ b/modules/database/init/init_school_timetable.py @@ -0,0 +1,487 @@ +import os +from modules.logger_tool import initialise_logger +logger = initialise_logger(__name__, os.getenv("LOG_LEVEL"), os.getenv("LOG_PATH"), 'default', True) +from datetime import timedelta, datetime +import pandas as pd +from modules.database.schemas.structures import structures +import modules.database.schemas.nodes.schools.timetable as timetable +import modules.database.schemas.relationships.timetables as tt_rels +import modules.database.schemas.relationships.entity_timetable_rels as entity_tt_rels +import modules.database.schemas.relationships.calendar_timetable_rels as cal_tt_rels +import modules.database.init.init_calendar as init_calendar +import modules.database.tools.neontology_tools as neon + +def create_school_timetable(dataframes, db_name, school_node=None): + logger.info(f"Creating school timetable for {db_name}") + if dataframes is None: + raise ValueError("Data is required to create the calendar and timetable.") + + logger.info(f"Initialising neo4j connection...") + neon.init_neontology_connection() + + school_df = dataframes['school'] + if school_node is None: + logger.info(f"School node is None, using school data from dataframe") + school_unique_id = school_df[school_df['Identifier'] == 'SchoolID']['Data'].iloc[0] + else: + logger.info(f"School node is not None, using school data from school node: {school_node}") + school_unique_id = school_node.unique_id + + terms_df = dataframes['terms'] + weeks_df = dataframes['weeks'] + days_df = dataframes['days'] + periods_df = dataframes['periods'] + + school_df_year_start = school_df[school_df['Identifier'] == 'AcademicYearStart']['Data'].iloc[0] + school_df_year_end = school_df[school_df['Identifier'] == 'AcademicYearEnd']['Data'].iloc[0] + if isinstance(school_df_year_start, str): + school_year_start_date = datetime.strptime(school_df_year_start, '%Y-%m-%d') + else: + school_year_start_date = school_df_year_start + if isinstance(school_df_year_end, str): + school_year_end_date = datetime.strptime(school_df_year_end, '%Y-%m-%d') + else: + school_year_end_date = school_df_year_end + + # Create a dictionary to store the timetable nodes + timetable_nodes = { + 'timetable_node': None, + 'academic_year_nodes': [], + 'academic_term_nodes': [], + 'academic_week_nodes': [], + 'academic_day_nodes': [], + 'academic_period_nodes': [] + } + + # Create AcademicTimetable Node + school_timetable_unique_id = f"{school_unique_id}_{school_year_start_date.year}_{school_year_end_date.year}" + school_timetable_node = timetable.SchoolTimetableNode( + school_timetable_id=school_timetable_unique_id, + unique_id=school_timetable_unique_id, + start_date=school_year_start_date, + end_date=school_year_end_date, + tldraw_snapshot="" + ) + neon.create_or_merge_neontology_node(school_timetable_node, database=db_name, operation='merge') + timetable_nodes['timetable_node'] = school_timetable_node + + if school_node: + logger.info(f"Creating calendar for {school_unique_id} from Neo4j SchoolNode: {school_node.unique_id}") + calendar_nodes = init_calendar.create_calendar(db_name, school_year_start_date, school_year_end_date, attach_to_calendar_node=True, owner_node=school_node) + # Link the school node to the timetable node + neon.create_or_merge_neontology_relationship( + entity_tt_rels.SchoolHasTimetable(source=school_node, target=school_timetable_node), + database=db_name, operation='merge' + ) + timetable_nodes['calendar_nodes'] = calendar_nodes + else: + logger.info(f"Creating calendar for {school_unique_id} from dataframe SchoolID: {school_unique_id}") + calendar_nodes = init_calendar.create_calendar(db_name, school_year_start_date, school_year_end_date, attach_to_calendar_node=False, owner_node=None) + + # Create AcademicYear nodes for each year within the range + for year in range(school_year_start_date.year, school_year_end_date.year + 1): + year_str = str(year) + academic_year_unique_id = f"{school_timetable_unique_id}_{year}" + academic_year_node = timetable.AcademicYearNode( + unique_id=academic_year_unique_id, + year=year_str, + tldraw_snapshot="" + ) + neon.create_or_merge_neontology_node(academic_year_node, database=db_name, operation='merge') + timetable_nodes['academic_year_nodes'].append(academic_year_node) + logger.info(f'Created academic year node: {academic_year_node.unique_id}') + neon.create_or_merge_neontology_relationship( + tt_rels.AcademicTimetableHasAcademicYear(source=school_timetable_node, target=academic_year_node), + database=db_name, operation='merge' + ) + logger.info(f"Created school timetable relationship from {school_timetable_node.unique_id} to {academic_year_node.unique_id}") + + # Link the academic year with the corresponding calendar year node + for year_node in calendar_nodes['calendar_year_nodes']: + if year_node.year == year: + neon.create_or_merge_neontology_relationship( + cal_tt_rels.AcademicYearIsCalendarYear(source=academic_year_node, target=year_node), + database=db_name, operation='merge' + ) + logger.info(f"Created school timetable relationship from {academic_year_node.unique_id} to {year_node.unique_id}") + break + + # Create Term and TermBreak nodes linked to AcademicYear + term_number = 1 + academic_term_number = 1 + for _, term_row in terms_df.iterrows(): + term_node_class = timetable.AcademicTermNode if term_row['TermType'] == 'Term' else timetable.AcademicTermBreakNode + term_name = term_row['TermName'] + term_name_no_spaces = term_name.replace(' ', '') + term_start_date = term_row['StartDate'] + if isinstance(term_start_date, pd.Timestamp): + term_start_date = term_start_date.strftime('%Y-%m-%d') + + term_end_date = term_row['EndDate'] + if isinstance(term_end_date, pd.Timestamp): + term_end_date = term_end_date.strftime('%Y-%m-%d') + + if term_row['TermType'] == 'Term': + term_node_unique_id = f"{school_timetable_unique_id}_{academic_term_number}_{term_name_no_spaces}" + academic_term_number_str = str(academic_term_number) + term_node = term_node_class( + unique_id=term_node_unique_id, + term_name=term_name, + term_number=academic_term_number_str, + start_date=datetime.strptime(term_start_date, '%Y-%m-%d'), + end_date=datetime.strptime(term_end_date, '%Y-%m-%d'), + tldraw_snapshot="" + ) + academic_term_number += 1 + else: + term_break_node_unique_id = f"{school_timetable_unique_id}_{term_name_no_spaces}" + term_node = term_node_class( + unique_id=term_break_node_unique_id, + term_break_name=term_name, + start_date=datetime.strptime(term_start_date, '%Y-%m-%d'), + end_date=datetime.strptime(term_end_date, '%Y-%m-%d'), + tldraw_snapshot="" + ) + neon.create_or_merge_neontology_node(term_node, database=db_name, operation='merge') + logger.info(f'Created academic term break node: {term_node.unique_id}') + timetable_nodes['academic_term_nodes'].append(term_node) + term_number += 1 # We don't use this but we could + + # Link term node to the correct academic year + term_years = set() + term_years.update([term_node.start_date.year, term_node.end_date.year]) + + for academic_year_node in timetable_nodes['academic_year_nodes']: + if int(academic_year_node.year) in term_years: + relationship_class = tt_rels.AcademicYearHasAcademicTerm if term_row['TermType'] == 'Term' else tt_rels.AcademicYearHasAcademicTermBreak + neon.create_or_merge_neontology_relationship( + relationship_class(source=academic_year_node, target=term_node), + database=db_name, operation='merge' + ) + logger.info(f"Created school timetable relationship from {academic_year_node.unique_id} to {term_node.unique_id}") + + # Create Week nodes + academic_week_number = 1 + for _, week_row in weeks_df.iterrows(): + week_node_class = timetable.HolidayWeekNode if week_row['WeekType'] == 'Holiday' else timetable.AcademicWeekNode + week_start_date = week_row['WeekStart'] + if isinstance(week_start_date, pd.Timestamp): + week_start_date = week_start_date.strftime('%Y-%m-%d') + + week_node_unique_id = f"{school_timetable_unique_id}_{week_row['WeekNumber']}_{week_row['WeekType']}Week" + + if week_row['WeekType'] == 'Holiday': + week_node = week_node_class( + unique_id=week_node_unique_id, + start_date=datetime.strptime(week_start_date, '%Y-%m-%d'), + tldraw_snapshot="" + ) + else: + academic_week_number_str = str(academic_week_number) + week_type = week_row['WeekType'] + week_node = week_node_class( + unique_id=week_node_unique_id, + academic_week_number=academic_week_number_str, + start_date=datetime.strptime(week_start_date, '%Y-%m-%d'), + week_type=week_type, + tldraw_snapshot="" + ) + academic_week_number += 1 + neon.create_or_merge_neontology_node(week_node, database=db_name, operation='merge') + timetable_nodes['academic_week_nodes'].append(week_node) + logger.info(f"Created week node: {week_node.unique_id}") + for calendar_node in calendar_nodes['calendar_week_nodes']: + if calendar_node.start_date == week_node.start_date: + if isinstance(week_node, timetable.AcademicWeekNode): + neon.create_or_merge_neontology_relationship( + cal_tt_rels.AcademicWeekIsCalendarWeek(source=week_node, target=calendar_node), + database=db_name, operation='merge' + ) + logger.info(f"Created school timetable relationship from {calendar_node.unique_id} to {week_node.unique_id}") + elif isinstance(week_node, timetable.HolidayWeekNode): + neon.create_or_merge_neontology_relationship( + cal_tt_rels.HolidayWeekIsCalendarWeek(source=week_node, target=calendar_node), + database=db_name, operation='merge' + ) + logger.info(f"Created school timetable relationship from {calendar_node.unique_id} to {week_node.unique_id}") + break + + # Link week node to the correct academic term + for term_node in timetable_nodes['academic_term_nodes']: + if term_node.start_date <= week_node.start_date <= term_node.end_date: + relationship_class = tt_rels.AcademicTermHasAcademicWeek if week_row['WeekType'] != 'Holiday' else tt_rels.AcademicTermBreakHasHolidayWeek + neon.create_or_merge_neontology_relationship( + relationship_class(source=term_node, target=week_node), + database=db_name, operation='merge' + ) + logger.info(f"Created school timetable relationship from {term_node.unique_id} to {week_node.unique_id}") + break + + # Link week node to the correct academic year + for academic_year_node in timetable_nodes['academic_year_nodes']: + if int(academic_year_node.year) == week_node.start_date.year: + relationship_class = tt_rels.AcademicYearHasAcademicWeek if week_row['WeekType'] != 'Holiday' else tt_rels.AcademicYearHasHolidayWeek + neon.create_or_merge_neontology_relationship( + relationship_class(source=academic_year_node, target=week_node), + database=db_name, operation='merge' + ) + logger.info(f"Created school timetable relationship from {academic_year_node.unique_id} to {week_node.unique_id}") + break + + # Create Day nodes + day_number = 1 + academic_day_number = 1 + for _, day_row in days_df.iterrows(): + date_str = day_row['Date'] + if isinstance(date_str, pd.Timestamp): + date_str = date_str.strftime('%Y-%m-%d') + + day_node_class = { + 'Academic': timetable.AcademicDayNode, + 'Holiday': timetable.HolidayDayNode, + 'OffTimetable': timetable.OffTimetableDayNode, + 'StaffDay': timetable.StaffDayNode + }[day_row['DayType']] + + # Format the unique ID as {day_node_class.__name__}Day + day_node_data = { + 'unique_id': f"{school_timetable_unique_id}_{day_number}_{day_node_class.__name__}Day", + 'date': datetime.strptime(date_str, '%Y-%m-%d'), + 'day_of_week': datetime.strptime(date_str, '%Y-%m-%d').strftime('%A'), + 'tldraw_snapshot': "" + } + + if day_row['DayType'] == 'Academic': + day_node_data['academic_day'] = str(academic_day_number) + day_node_data['day_type'] = day_row['WeekType'] + day_node_data['tldraw_snapshot'] = "" + + day_node = day_node_class(**day_node_data) + + for calendar_node in calendar_nodes['calendar_day_nodes']: + if calendar_node.date == day_node.date: + neon.create_or_merge_neontology_node(day_node, database=db_name, operation='merge') + timetable_nodes['academic_day_nodes'].append(day_node) + logger.info(f"Created day node: {day_node.unique_id}") + + if isinstance(day_node, timetable.AcademicDayNode): + relationship_class = cal_tt_rels.AcademicDayIsCalendarDay + elif isinstance(day_node, timetable.HolidayDayNode): + relationship_class = cal_tt_rels.HolidayDayIsCalendarDay + elif isinstance(day_node, timetable.OffTimetableDayNode): + relationship_class = cal_tt_rels.OffTimetableDayIsCalendarDay + elif isinstance(day_node, timetable.StaffDayNode): + relationship_class = cal_tt_rels.StaffDayIsCalendarDay + + neon.create_or_merge_neontology_relationship( + relationship_class(source=day_node, target=calendar_node), + database=db_name, operation='merge' + ) + logger.info(f'Created relationship from {calendar_node.unique_id} to {day_node.unique_id}') + break + + # Link day node to the correct academic week + for academic_week_node in timetable_nodes['academic_week_nodes']: + if academic_week_node.start_date <= day_node.date <= (academic_week_node.start_date + timedelta(days=6)): + if day_row['DayType'] == 'Academic': + relationship_class = tt_rels.AcademicWeekHasAcademicDay + elif day_row['DayType'] == 'Holiday': + if hasattr(academic_week_node, 'week_type') and academic_week_node.week_type in ['A', 'B']: + relationship_class = tt_rels.AcademicWeekHasHolidayDay + else: + relationship_class = tt_rels.HolidayWeekHasHolidayDay + elif day_row['DayType'] == 'OffTimetable': + relationship_class = tt_rels.AcademicWeekHasOffTimetableDay + elif day_row['DayType'] == 'Staff': + relationship_class = tt_rels.AcademicWeekHasStaffDay + else: + continue # Skip linking for other day types + neon.create_or_merge_neontology_relationship( + relationship_class(source=academic_week_node, target=day_node), + database=db_name, operation='merge' + ) + logger.info(f"Created relationship from {academic_week_node.unique_id} to {day_node.unique_id}") + break + + # Link day node to the correct academic term + for term_node in timetable_nodes['academic_term_nodes']: + if term_node.start_date <= day_node.date <= term_node.end_date: + if day_row['DayType'] == 'Academic': + relationship_class = tt_rels.AcademicTermHasAcademicDay + elif day_row['DayType'] == 'Holiday': + if isinstance(term_node, timetable.AcademicTermNode): + relationship_class = tt_rels.AcademicTermHasHolidayDay + else: + relationship_class = tt_rels.AcademicTermBreakHasHolidayDay + elif day_row['DayType'] == 'OffTimetable': + relationship_class = tt_rels.AcademicTermHasOffTimetableDay + elif day_row['DayType'] == 'Staff': + relationship_class = tt_rels.AcademicTermHasStaffDay + else: + continue # Skip linking for other day types + neon.create_or_merge_neontology_relationship( + relationship_class(source=term_node, target=day_node), + database=db_name, operation='merge' + ) + logger.info(f"Created relationship from {term_node.unique_id} to {day_node.unique_id}") + break + + # Create Period nodes for each academic day + if day_row['DayType'] == 'Academic': + logger.info(f"Creating periods for {day_node.unique_id}") + period_of_day = 1 + academic_or_registration_period_of_day = 1 + for _, period_row in periods_df.iterrows(): + period_node_class = { + 'Academic': timetable.AcademicPeriodNode, + 'Registration': timetable.RegistrationPeriodNode, + 'Break': timetable.BreakPeriodNode, + 'OffTimetable': timetable.OffTimetablePeriodNode + }[period_row['PeriodType']] + + logger.info(f"Creating period node for {period_node_class.__name__} Period: {period_of_day}") + period_node_unique_id = f"{school_timetable_unique_id}_{academic_day_number}_{period_of_day}_{period_node_class.__name__}Period" + logger.debug(f"Period node unique id: {period_node_unique_id}") + period_node_data = { + 'unique_id': period_node_unique_id, + 'name': period_row['PeriodName'], + 'date': day_node.date, + 'start_time': datetime.combine(day_node.date, period_row['StartTime']), + 'end_time': datetime.combine(day_node.date, period_row['EndTime']), + 'tldraw_snapshot': "" + } + logger.debug(f"Period node data: {period_node_data}") + if period_row['PeriodType'] in ['Academic', 'Registration']: + week_type = day_row['WeekType'] + day_name_short = day_node.day_of_week[:3] + period_code = period_row['PeriodCode'] + period_code_formatted = f"{week_type}{day_name_short}{period_code}" + period_node_data['period_code'] = period_code_formatted + period_node_data['tldraw_snapshot'] = "" + + academic_or_registration_period_of_day += 1 + + period_node = period_node_class(**period_node_data) + neon.create_or_merge_neontology_node(period_node, database=db_name, operation='merge') + timetable_nodes['academic_period_nodes'].append(period_node) + logger.info(f'Created period node: {period_node.unique_id}') + + relationship_class = { + 'Academic': tt_rels.AcademicDayHasAcademicPeriod, + 'Registration': tt_rels.AcademicDayHasRegistrationPeriod, + 'Break': tt_rels.AcademicDayHasBreakPeriod, + 'OffTimetable': tt_rels.AcademicDayHasOffTimetablePeriod + }[period_row['PeriodType']] + + neon.create_or_merge_neontology_relationship( + relationship_class(source=day_node, target=period_node), + database=db_name, operation='merge' + ) + logger.info(f"Created relationship from {day_node.unique_id} to {period_node.unique_id}") + period_of_day += 1 # We don't use this but we could + academic_day_number += 1 # This is a bit of a hack but it works to keep the directories aligned (reorganise) + day_number += 1 # We don't use this but we could + + def create_school_timetable_node_sequence_rels(timetable_nodes): + def sort_and_create_relationships(nodes, relationship_map, sort_key): + sorted_nodes = sorted(nodes, key=sort_key) + for i in range(len(sorted_nodes) - 1): + source_node = sorted_nodes[i] + target_node = sorted_nodes[i + 1] + node_type_pair = (type(source_node), type(target_node)) + relationship_class = relationship_map.get(node_type_pair) + if relationship_class: + # Avoid self-referential relationships + if source_node.unique_id != target_node.unique_id: + neon.create_or_merge_neontology_relationship( + relationship_class( + source=source_node, + target=target_node + ), + database=db_name, operation='merge' + ) + logger.info(f"Created relationship from {source_node.unique_id} to {target_node.unique_id}") + else: + logger.warning(f"Skipped self-referential relationship for node {source_node.unique_id}") + + # Relationship maps for different node types + academic_year_relationship_map = { + (timetable.AcademicYearNode, timetable.AcademicYearNode): tt_rels.AcademicYearFollowsAcademicYear + } + + academic_term_relationship_map = { + (timetable.AcademicTermNode, timetable.AcademicTermBreakNode): tt_rels.AcademicTermBreakFollowsAcademicTerm, + (timetable.AcademicTermBreakNode, timetable.AcademicTermNode): tt_rels.AcademicTermFollowsAcademicTermBreak + } + + academic_week_relationship_map = { + (timetable.AcademicWeekNode, timetable.AcademicWeekNode): tt_rels.AcademicWeekFollowsAcademicWeek, + (timetable.HolidayWeekNode, timetable.HolidayWeekNode): tt_rels.HolidayWeekFollowsHolidayWeek, + (timetable.AcademicWeekNode, timetable.HolidayWeekNode): tt_rels.HolidayWeekFollowsAcademicWeek, + (timetable.HolidayWeekNode, timetable.AcademicWeekNode): tt_rels.AcademicWeekFollowsHolidayWeek + } + + academic_day_relationship_map = { + (timetable.AcademicDayNode, timetable.AcademicDayNode): tt_rels.AcademicDayFollowsAcademicDay, + (timetable.HolidayDayNode, timetable.HolidayDayNode): tt_rels.HolidayDayFollowsHolidayDay, + (timetable.OffTimetableDayNode, timetable.OffTimetableDayNode): tt_rels.OffTimetableDayFollowsOffTimetableDay, + (timetable.StaffDayNode, timetable.StaffDayNode): tt_rels.StaffDayFollowsStaffDay, + + (timetable.AcademicDayNode, timetable.HolidayDayNode): tt_rels.HolidayDayFollowsAcademicDay, + (timetable.AcademicDayNode, timetable.OffTimetableDayNode): tt_rels.OffTimetableDayFollowsAcademicDay, + (timetable.AcademicDayNode, timetable.StaffDayNode): tt_rels.StaffDayFollowsAcademicDay, + + (timetable.HolidayDayNode, timetable.AcademicDayNode): tt_rels.AcademicDayFollowsHolidayDay, + (timetable.HolidayDayNode, timetable.OffTimetableDayNode): tt_rels.OffTimetableDayFollowsHolidayDay, + (timetable.HolidayDayNode, timetable.StaffDayNode): tt_rels.StaffDayFollowsHolidayDay, + + (timetable.OffTimetableDayNode, timetable.AcademicDayNode): tt_rels.AcademicDayFollowsOffTimetableDay, + (timetable.OffTimetableDayNode, timetable.HolidayDayNode): tt_rels.HolidayDayFollowsOffTimetableDay, + (timetable.OffTimetableDayNode, timetable.StaffDayNode): tt_rels.StaffDayFollowsOffTimetableDay, + + (timetable.StaffDayNode, timetable.AcademicDayNode): tt_rels.AcademicDayFollowsStaffDay, + (timetable.StaffDayNode, timetable.HolidayDayNode): tt_rels.HolidayDayFollowsStaffDay, + (timetable.StaffDayNode, timetable.OffTimetableDayNode): tt_rels.OffTimetableDayFollowsStaffDay, + } + + academic_period_relationship_map = { + (timetable.AcademicPeriodNode, timetable.AcademicPeriodNode): tt_rels.AcademicPeriodFollowsAcademicPeriod, + (timetable.AcademicPeriodNode, timetable.BreakPeriodNode): tt_rels.BreakPeriodFollowsAcademicPeriod, + (timetable.AcademicPeriodNode, timetable.RegistrationPeriodNode): tt_rels.RegistrationPeriodFollowsAcademicPeriod, + (timetable.AcademicPeriodNode, timetable.OffTimetablePeriodNode): tt_rels.OffTimetablePeriodFollowsAcademicPeriod, + (timetable.BreakPeriodNode, timetable.AcademicPeriodNode): tt_rels.AcademicPeriodFollowsBreakPeriod, + (timetable.BreakPeriodNode, timetable.BreakPeriodNode): tt_rels.BreakPeriodFollowsBreakPeriod, + (timetable.BreakPeriodNode, timetable.RegistrationPeriodNode): tt_rels.RegistrationPeriodFollowsBreakPeriod, + (timetable.BreakPeriodNode, timetable.OffTimetablePeriodNode): tt_rels.OffTimetablePeriodFollowsBreakPeriod, + (timetable.RegistrationPeriodNode, timetable.AcademicPeriodNode): tt_rels.AcademicPeriodFollowsRegistrationPeriod, + (timetable.RegistrationPeriodNode, timetable.RegistrationPeriodNode): tt_rels.RegistrationPeriodFollowsRegistrationPeriod, + (timetable.RegistrationPeriodNode, timetable.BreakPeriodNode): tt_rels.BreakPeriodFollowsRegistrationPeriod, + (timetable.RegistrationPeriodNode, timetable.OffTimetablePeriodNode): tt_rels.OffTimetablePeriodFollowsRegistrationPeriod, + (timetable.OffTimetablePeriodNode, timetable.OffTimetablePeriodNode): tt_rels.OffTimetablePeriodFollowsOffTimetablePeriod, + (timetable.OffTimetablePeriodNode, timetable.AcademicPeriodNode): tt_rels.AcademicPeriodFollowsOffTimetablePeriod, + (timetable.OffTimetablePeriodNode, timetable.BreakPeriodNode): tt_rels.BreakPeriodFollowsOffTimetablePeriod, + (timetable.OffTimetablePeriodNode, timetable.RegistrationPeriodNode): tt_rels.RegistrationPeriodFollowsOffTimetablePeriod, + } + + + # Sort and create relationships + sort_and_create_relationships(timetable_nodes['academic_year_nodes'], academic_year_relationship_map, lambda x: int(x.year)) + sort_and_create_relationships(timetable_nodes['academic_term_nodes'], academic_term_relationship_map, lambda x: x.start_date) + sort_and_create_relationships(timetable_nodes['academic_week_nodes'], academic_week_relationship_map, lambda x: x.start_date) + sort_and_create_relationships(timetable_nodes['academic_day_nodes'], academic_day_relationship_map, lambda x: x.date) + sort_and_create_relationships(timetable_nodes['academic_period_nodes'], academic_period_relationship_map, lambda x: (x.start_time, x.end_time)) + + # Call the function with the created timetable nodes + create_school_timetable_node_sequence_rels(timetable_nodes) + + logger.info(f'Created timetable: {timetable_nodes["timetable_node"].unique_id}') + + # Log the directory structure after creation + # root_timetable_directory = fs_handler.root_path # Access the root directory of the filesystem handler + # fs_handler.log_directory_structure(root_timetable_directory) + + return { + 'school_node': school_node, + 'school_calendar_nodes': calendar_nodes, + 'school_timetable_nodes': timetable_nodes + } \ No newline at end of file diff --git a/modules/database/init/init_user.py b/modules/database/init/init_user.py new file mode 100644 index 0000000..c541010 --- /dev/null +++ b/modules/database/init/init_user.py @@ -0,0 +1,379 @@ +import os +from datetime import timedelta, datetime +from abc import ABC, abstractmethod +from typing import Dict, Optional, Any, Union + +from modules.database.services.neo4j_service import Neo4jService +import modules.database.schemas.nodes.users as user_nodes +import modules.database.schemas.nodes.workers.workers as worker_nodes +import modules.database.init.init_calendar as init_calendar +import modules.database.schemas.relationships.entity_relationships as entity_relationships +import modules.database.tools.neontology_tools as neon +from modules.logger_tool import initialise_logger +logger = initialise_logger(__name__, os.getenv("LOG_LEVEL"), os.getenv("LOG_PATH"), 'default', True) + +def create_and_check_db(db_name): + neo4j_service = Neo4jService() + neo4j_service.create_database(db_name) + database_status = neo4j_service.check_database_exists(db_name) + if not database_status['exists']: + raise ValueError(f"Database {db_name} not found") + return database_status + +class UserCreator(ABC): + def __init__(self, user_id, cc_users_db_name, user_type, worker_type, user_email, worker_email, cc_username, user_name, worker_name, calendar_start_date, calendar_end_date): + cc_schools_db_name = "cc.institutes" # Fix the TODO + self.cc_users_db_name = cc_users_db_name + self.user_db_name = f"{cc_users_db_name}.{user_type}.{cc_username}" + self.worker_db_name = f"{cc_schools_db_name}.{user_type}.{cc_username}" + self.user_type = user_type + self.worker_type = worker_type + self.cc_username = cc_username + self.user_email = user_email + self.worker_email = worker_email + self.user_name = user_name + self.worker_name = worker_name + self.user_id = user_id + self.user_nodes: Dict[str, Optional[Any]] = { + 'default_user_node': None, + 'private_user_node': None, + 'worker_node': None, + 'calendar_node': None + } + if calendar_start_date and calendar_end_date: + self.calendar_start_date = calendar_start_date + self.calendar_end_date = calendar_end_date + else: + logger.warning("No calendar start and end date provided, using default values") + self.calendar_start_date = datetime.now().date() + self.calendar_end_date = (datetime.now() + timedelta(days=5)).date() + + @abstractmethod + def create_user(self): + pass + + def create_user_node(self, db_name: str): + logger.info(f"Module is creating {self.cc_users_db_name} user node for {self.user_type} user {self.cc_username}") + try: + user_node = self._create_user_node(db_name) + logger.debug(f"User node creation completed for {self.cc_users_db_name} user node for {self.user_type} user {self.cc_username}: {user_node.to_dict()}") + return user_node + except Exception as e: + logger.error(f"Error creating user node: {e}") + raise + + def _create_user_node(self, db_name: str): + # Ensure Neontology is initialized + neon.init_neontology_connection() + + user_node = user_nodes.UserNode( + unique_id=f"{self.user_id}", + tldraw_snapshot="", + cc_username=f"{self.cc_username}", + user_email=f"{self.user_email}", + user_name=f"{self.user_name}", + user_db_name=f"{self.user_db_name}", + user_type=f"{self.user_type}", + ) + logger.debug(f"User node template created: {user_node.to_dict()}. Writing to database {db_name}") + neon.create_or_merge_neontology_node(node=user_node, database=db_name, operation='merge') + logger.info(f"User node created: {user_node.to_dict()}") + return user_node + + def create_storage_bucket(self, bucket_id: str, bucket_name: str, access_token: Optional[str] = None) -> bool: + """Create public and private storage buckets for the user using their access token or service role during initialization""" + logger.info(f"Creating storage buckets for user {self.cc_username}") + + try: + from modules.database.supabase.utils.client import SupabaseServiceRoleClient, SupabaseAnonClient, CreateBucketOptions + + # During initialization (no access token provided), use service role + if not access_token: + logger.info("Using service role client for bucket creation during initialization") + supabase = SupabaseServiceRoleClient() + else: + # For regular operations, use the user's access token + logger.info("Using user token for bucket creation") + supabase = SupabaseAnonClient.for_user(access_token) + + # Create both public and private buckets + buckets = [ + { + "id": f"{bucket_id}.public", + "options": CreateBucketOptions( + name=f"{bucket_name} - Public Files", + public=True, + file_size_limit=50 * 1024 * 1024, # 50MB + allowed_mime_types=[ + 'image/*', 'video/*', 'application/pdf', + 'application/msword', 'application/vnd.openxmlformats-officedocument.*', + 'text/plain', 'text/csv', 'application/json' + ] + ) + }, + { + "id": f"{bucket_id}.private", + "options": CreateBucketOptions( + name=f"{bucket_name} - Private Files", + public=False, + file_size_limit=50 * 1024 * 1024, # 50MB + allowed_mime_types=[ + 'image/*', 'video/*', 'application/pdf', + 'application/msword', 'application/vnd.openxmlformats-officedocument.*', + 'text/plain', 'text/csv', 'application/json' + ] + ) + } + ] + + success = True + for bucket in buckets: + try: + result = supabase.create_bucket(bucket["id"], bucket["options"]) + if not result: + logger.error(f"Failed to create bucket {bucket['id']}") + success = False + else: + logger.info(f"Successfully created bucket {bucket['id']}") + except Exception as e: + logger.error(f"Error creating bucket {bucket['id']}: {str(e)}") + success = False + + return success + + except Exception as e: + logger.error(f"Error creating storage buckets: {str(e)}") + return False + +class SchoolUserCreator(UserCreator): + def __init__(self, user_id, cc_users_db_name, user_type, worker_type, user_email, worker_email, cc_username, user_name, worker_name, calendar_start_date, calendar_end_date, school_node, worker_node=None): + super().__init__(user_id, cc_users_db_name, user_type, worker_type, user_email, worker_email, cc_username, user_name, worker_name, calendar_start_date, calendar_end_date) + self.school_node = school_node + self.worker_node = worker_node + + def create_user(self): + # Ensure Neontology is initialized + logger.debug(f"Initializing Neontology connection. Closing any existing connection") + neon.close_neontology_connection() + logger.debug(f"Neontology connection closed. Initializing new connection") + neon.init_neontology_connection() + + if self.user_type in ['email_teacher', 'ms_teacher']: + worker_node = self.create_teacher_node() + elif self.user_type in ['email_student', 'ms_student']: + worker_node = self.create_student_node() + else: + raise ValueError(f"User type {self.user_type} not supported") + + self.user_nodes[f'worker_node'] = worker_node + + user_node = self.create_user_node(self.cc_users_db_name) + + logger.info(f"User node created: {user_node}") + + self.user_nodes['default_user_node'] = user_node + + self.create_user_worker_relationship(user_node, worker_node) + + self.create_worker_school_relationship(worker_node, self.school_node) + + logger.info(f"Worker school relationship created between {worker_node} and {self.school_node}") + return self.user_nodes + + def create_teacher_node(self): + logger.debug(f"Teacher node will be created for school: {self.school_node}") + try: + return self._create_teacher_node() + except KeyError as ke: + raise ValueError(f"Missing required key in worker_data: {ke}") from ke + except Exception as e: + raise ValueError(f"Error creating teacher node: {e}") from e + + def _create_teacher_node(self): + teacher_node = worker_nodes.TeacherNode( + unique_id=f"{self.user_id}", + tldraw_snapshot="", + worker_name=self.worker_name, + worker_email=self.worker_email, + worker_db_name=self.worker_db_name, + worker_type=self.worker_type + ) + # Use the school's private database name if available + school_db = self.school_node.private_database_name if hasattr(self.school_node, 'private_database_name') else f"cc.institutes.{self.school_node.school_type}.{self.school_node.id}" + logger.info(f"Teacher node template created: {teacher_node}... setting school db to {school_db}") + + neon.create_or_merge_neontology_node(node=teacher_node, database=school_db, operation='merge') + + logger.info(f"Teacher node merged into database {school_db}: {teacher_node}") + return teacher_node + + def create_student_node(self): + student_node = worker_nodes.StudentNode( + unique_id=f"Student_{self.user_id}", + worker_name=self.worker_name, + worker_email=self.worker_email, + worker_db_name=self.worker_db_name, + worker_type=self.worker_type, + tldraw_snapshot="" + ) + # Use the school's private database name if available + school_db = self.school_node.private_database_name if hasattr(self.school_node, 'private_database_name') else f"cc.institutes.{self.school_node.school_type}.{self.school_node.id}" + logger.info(f"Student node template created: {student_node}... setting school db to {school_db}") + + neon.create_or_merge_neontology_node(node=student_node, database=school_db, operation='merge') + + logger.info(f"Student node merged into database {school_db}: {student_node}") + return student_node + + def create_user_worker_relationship(self, user_node, worker_node): + user_role_rel = entity_relationships.UserIsSchoolWorker(source=user_node, target=worker_node) + # Use the school's private database name if available + school_db = self.school_node.private_database_name if hasattr(self.school_node, 'private_database_name') else f"cc.institutes.{self.school_node.school_type}.{self.school_node.id}" + neon.create_or_merge_neontology_relationship(user_role_rel, database=school_db, operation='merge') + logger.info(f"Relationship created between user and worker in database {school_db}") + + def create_worker_school_relationship(self, worker_node, school_node): + worker_school_rel = entity_relationships.EntityBelongsToSchool(source=worker_node, target=school_node) + # Use the school's private database name if available + school_db = school_node.private_database_name if hasattr(school_node, 'private_database_name') else f"cc.institutes.{school_node.school_type}.{school_node.id}" + neon.create_or_merge_neontology_relationship(worker_school_rel, database=school_db, operation='merge') + logger.info(f"Relationship created between worker and school in database {school_db}") + +class NonSchoolUserCreator(UserCreator): + def __init__(self, user_id, cc_users_db_name, user_type, worker_type, user_email, worker_email, cc_username, user_name, worker_name, calendar_start_date, calendar_end_date, developer_role: str = "developer"): + super().__init__(user_id, cc_users_db_name, user_type, worker_type, user_email, worker_email, cc_username, user_name, worker_name, calendar_start_date, calendar_end_date) + self.developer_role = developer_role + + def create_user(self, access_token: Optional[str] = None): + logger.debug(f"Creating user node for {self.user_type} user {self.cc_username} in database {self.cc_users_db_name}") + + # Create storage buckets for the user + user_bucket_id = self.user_db_name + user_bucket_name = f"{self.user_type.title()} User Files - {self.user_name}" + if not self.create_storage_bucket(user_bucket_id, user_bucket_name, access_token=access_token): + logger.error(f"Failed to create storage bucket for user {self.cc_username}") + raise ValueError(f"Failed to create storage bucket for user {self.cc_username}") + + # Create default user node first + default_user_node = self.create_user_node(self.cc_users_db_name) + logger.debug(f"Default user node created: {default_user_node}") + + # Verify the return value of create_user_node + if default_user_node is None: + logger.error("Failed to create default user node. It is None.") + raise ValueError("Failed to create default user node. It is None.") + + self.user_nodes[f'default_user_node'] = default_user_node + + # Create the appropriate user db based on user_type + if self.user_type == 'admin': + logger.debug(f"Creating super admin db for {self.user_type} user {self.cc_username} in database {self.user_db_name}") + self.create_super_admin_db() + elif self.user_type == 'developer': + logger.debug(f"Creating developer db for {self.user_type} user {self.cc_username} in database {self.user_db_name}") + self.create_developer_db() + else: + raise ValueError(f"User type {self.user_type} not supported") + + logger.debug(f"User nodes after creation: {self.user_nodes}") + return self.user_nodes + + def create_super_admin_db(self): + logger.debug(f"Creating super admin db for {self.user_type} user {self.cc_username} in database {self.user_db_name}") + neon.init_neontology_connection() + + # Create the user db self.user_db_name + create_and_check_db(self.user_db_name) + + try: + # Create the user node again for the user db + logger.debug(f"Creating super admin user node for {self.user_type} user {self.cc_username} in database {self.user_db_name}") + private_user_node = self.create_user_node(self.user_db_name) + + super_admin_node = worker_nodes.SuperAdminNode( + unique_id=f"SuperAdmin_{self.user_id}", + worker_email=self.worker_email, + tldraw_snapshot="", + worker_name=self.worker_name, + worker_db_name=self.worker_db_name, + worker_type=self.worker_type + ) + logger.debug(f"Super admin node template created: {super_admin_node}. Writing to database {self.user_db_name}") + neon.create_or_merge_neontology_node(node=super_admin_node, database=self.user_db_name, operation='merge') + logger.info(f"Super admin node created: {super_admin_node}") + + logger.debug(f"Creating relationship between user node: {private_user_node} and worker node: {super_admin_node}") + self.create_user_specific_relationship(user_node=private_user_node, worker_node=super_admin_node) + + logger.debug(f"Creating calendar for {self.user_type} user {self.cc_username} in database {self.user_db_name}") + calendar_nodes = self.create_calendar(user_node=private_user_node) + logger.info(f"Super admin calendar created.") + + self.user_nodes['private_user_node'] = private_user_node + self.user_nodes['worker_node'] = super_admin_node + + logger.info(f"Returning user nodes: {self.user_nodes}") + + return self.user_nodes + except Exception as e: + logger.error(f"Error creating super admin node: {e}") + raise ValueError(f"Error creating super admin node: {e}") from e + + def create_developer_db(self): + neon.init_neontology_connection() + + # Create the user db self.user_db_name + create_and_check_db(self.user_db_name) + + try: + # Create the user node again for the user db + private_user_node = self.create_user_node(self.user_db_name) + + developer_node = worker_nodes.DeveloperNode( + unique_id=f"Developer_{self.user_id}", + worker_name=self.worker_name, + worker_email=self.worker_email, + tldraw_snapshot="", + worker_db_name=self.worker_db_name, + worker_type=self.worker_type, + developer_role=self.developer_role + ) + + neon.create_or_merge_neontology_node(developer_node, database=self.user_db_name, operation='merge') + logger.info(f"Developer node created: {developer_node}") + + self.user_nodes['private_user_node'] = private_user_node + self.user_nodes['worker_node'] = developer_node + + self.create_user_specific_relationship(user_node=private_user_node, worker_node=developer_node) + + return self.user_nodes + except Exception as e: + raise ValueError(f"Error creating developer node: {e}") from e + + def create_user_specific_relationship(self, user_node: user_nodes.UserNode, worker_node: Union[worker_nodes.SuperAdminNode, worker_nodes.DeveloperNode]): + if user_node is None or worker_node is None: + logger.error("User node or worker node is None. Cannot create relationship.") + raise ValueError("User node or worker node is None. Cannot create relationship.") + + logger.info(f"Creating relationship between user node: {user_node} and worker node: {worker_node}") + + # Log the state of user_node and worker_node + logger.debug(f"user_node: {user_node}") + logger.debug(f"worker_node: {worker_node}") + + if worker_node.worker_type == 'developer': + specific_user_rel = entity_relationships.UserIsSystemWorker(source=user_node, target=worker_node) + elif worker_node.worker_type == 'superadmin': + specific_user_rel = entity_relationships.UserIsSystemWorker(source=user_node, target=worker_node) + else: + raise ValueError(f"User type {worker_node.worker_type} not supported") + + neon.create_or_merge_neontology_relationship(specific_user_rel, database=self.user_db_name, operation='merge') + logger.info("Relationship created between user and specific node") + + def create_calendar(self, user_node: user_nodes.UserNode): + calendar_nodes = init_calendar.create_calendar(self.user_db_name, self.calendar_start_date, self.calendar_end_date, attach_to_calendar_node=True, owner_node=user_node) + + logger.info(f"Calendar nodes created.") + return calendar_nodes diff --git a/modules/database/init/init_user_timetable.py b/modules/database/init/init_user_timetable.py new file mode 100644 index 0000000..8fdbb08 --- /dev/null +++ b/modules/database/init/init_user_timetable.py @@ -0,0 +1,326 @@ +import os +from modules.logger_tool import initialise_logger +logger = initialise_logger(__name__, os.getenv("LOG_LEVEL"), os.getenv("LOG_PATH"), 'default', True) + +import modules.database.tools.neo4j_driver_tools as driver +import modules.database.tools.neontology_tools as neon +from modules.database.tools.filesystem_tools import ClassroomCopilotFilesystem +from modules.database.schemas.nodes.users import UserNode +from modules.database.schemas.nodes.schools.schools import SubjectClassNode +from modules.database.schemas.nodes.workers.workers import TeacherNode +from modules.database.schemas.nodes.calendars import CalendarDayNode +from modules.database.schemas.nodes.workers.timetable import ( + UserTeacherTimetableNode +) +from modules.database.schemas.relationships.entity_timetable_rels import ( + EntityHasTimetable +) +from modules.database.schemas.relationships.planning_relationships import ( + TeacherHasTimetable, TimetableHasClass, ClassHasLesson,TimetableLessonFollowsTimetableLesson +) +from modules.database.schemas.relationships.calendar_timetable_rels import ( + CalendarDayHasTimetableLesson, TimetableLessonBelongsToCalendarDay, + CalendarDayHasPlannedLesson, PlannedLessonBelongsToCalendarDay +) + +def get_school_worker_classes(school_db_name: str, user_unique_id: str, worker_unique_id: str) -> list: + """ + Retrieve all classes for a worker from the school database. + """ + query = """ + MATCH (w:Teacher {unique_id: $worker_id})-[:TEACHER_HAS_TIMETABLE]->(tt:TeacherTimetable) + -[:TIMETABLE_HAS_CLASS]->(c:SubjectClass) + RETURN c + """ + with driver.get_driver(db_name=school_db_name).session(database=school_db_name) as session: + result = session.run(query, worker_id=worker_unique_id) + classes = [record['c'] for record in result] + if not classes: + logger.warning(f"No classes found for teacher {worker_unique_id} in school database") + return classes + +def get_school_class_periods(school_db_name: str, class_unique_id: str) -> list: + """ + Retrieve all periods for a class from the school database. + """ + query = """ + MATCH (c:SubjectClass {unique_id: $class_id})-[:CLASS_HAS_LESSON]->(l:TimetableLesson) + RETURN l + """ + with driver.get_driver(db_name=school_db_name).session(database=school_db_name) as session: + result = session.run(query, class_id=class_unique_id) + periods = [record['l'] for record in result] + if not periods: + logger.warning(f"No periods found for class {class_unique_id} in school database") + return periods + +def get_user_calendar_nodes(user_db_name: str, user_node: UserNode) -> list: + """ + Retrieve all calendar day nodes for a user. + """ + # First try to find any calendar days to verify the structure + verify_query = """ + MATCH (w:User {unique_id: $user_id}) + OPTIONAL MATCH (w)-[:HAS_CALENDAR]->(c:Calendar) + OPTIONAL MATCH (c)-[:CALENDAR_INCLUDES_YEAR]->(y:CalendarYear) + OPTIONAL MATCH (y)-[:YEAR_INCLUDES_MONTH]->(m:CalendarMonth) + OPTIONAL MATCH (m)-[:MONTH_INCLUDES_DAY]->(d:CalendarDay) + RETURN w.unique_id as user_id, + count(c) as calendar_count, + count(y) as year_count, + count(m) as month_count, + count(d) as day_count, + collect(DISTINCT y.year) as years + LIMIT 1 + """ + + with driver.get_driver(db_name=user_db_name).session(database=user_db_name) as session: + # First check the calendar structure + result = session.run(verify_query, user_id=user_node.unique_id) + if stats := result.single(): + logger.info(f"Calendar structure for user {stats['user_id']}: " + f"calendars={stats['calendar_count']}, " + f"years={stats['year_count']}, " + f"months={stats['month_count']}, " + f"days={stats['day_count']}, " + f"available years={stats['years']}") + + if stats['calendar_count'] == 0: + logger.error(f"No calendar found for user {user_node.unique_id}") + return [] + if stats['year_count'] == 0: + logger.error(f"No calendar years found for user {user_node.unique_id}") + return [] + if stats['month_count'] == 0: + logger.error(f"No calendar months found for user {user_node.unique_id}") + return [] + if stats['day_count'] == 0: + logger.error(f"No calendar days found for user {user_node.unique_id}") + return [] + + # Get all calendar days without year filter + query = """ + MATCH (w:User {unique_id: $user_id})-[:HAS_CALENDAR]->(c:Calendar) + -[:CALENDAR_INCLUDES_YEAR]->(y:CalendarYear) + -[:YEAR_INCLUDES_MONTH]->(m:CalendarMonth) + -[:MONTH_INCLUDES_DAY]->(d:CalendarDay) + RETURN d.unique_id as unique_id, + d.date as date, + d.day_of_week as day_of_week, + d.iso_day as iso_day, + d.path as path + ORDER BY d.date + """ + + result = session.run(query, user_id=user_node.unique_id) + calendar_days = [] + for record in result: + calendar_day = CalendarDayNode( + unique_id=record['unique_id'], + date=record['date'], + day_of_week=record['day_of_week'], + iso_day=record['iso_day'], + path=record['path'] + ) + calendar_days.append(calendar_day) + + if not calendar_days: + logger.error(f"No calendar days found for user {user_node.unique_id}") + else: + # Log the date range we have + dates = sorted([day.date for day in calendar_days]) + logger.info(f"Found {len(calendar_days)} calendar days for user {user_node.unique_id}") + logger.info(f"Calendar days range from {dates[0]} to {dates[-1]}") + + return calendar_days + +def create_user_worker_timetable( + user_node: UserNode, + user_worker_node: TeacherNode, + school_db_name: str +): + """ + Create a worker timetable structure in the user's database that mirrors + the school timetable, with lessons linked to the user's calendar structure. + """ + user_db_name = user_worker_node.user_db_name + + # Initialize filesystem and Neo4j + fs_handler = ClassroomCopilotFilesystem(db_name=user_db_name, init_run_type="user") + + # Create teacher timetable directory under the worker's directory + _, worker_timetable_path = fs_handler.create_teacher_timetable_directory(user_worker_node.path) + + # Initialize neontology connection + neon.init_neontology_connection() + + # Get user's calendar nodes + calendar_nodes = get_user_calendar_nodes(user_db_name, user_node) + if not calendar_nodes: + logger.warning(f"No calendar nodes found for user {user_node.unique_id}") + return { + "status": "error", + "message": "No calendar nodes found for user" + } + + try: + # Create UserTeacherTimetableNode + timetable_unique_id = f"UserTeacherTimetable_{user_worker_node.teacher_code}" + worker_timetable = UserTeacherTimetableNode( + unique_id=timetable_unique_id, + school_db_name=school_db_name, + school_timetable_id=f"TeacherTimetable_{user_worker_node.teacher_code}", + path=worker_timetable_path + ) + + # Create the timetable node and its tldraw file + neon.create_or_merge_neontology_node(worker_timetable, database=user_db_name, operation='merge') + fs_handler.create_default_tldraw_file(worker_timetable.path, worker_timetable.to_dict()) + + # Link timetable to teacher using the correct relationship structure + neon.create_or_merge_neontology_relationship( + TeacherHasTimetable(source=user_worker_node, target=worker_timetable), + database=user_db_name, + operation='merge' + ) + + # Get classes from school database + school_classes = get_school_worker_classes(school_db_name, user_node.unique_id, user_worker_node.unique_id) + if not school_classes: + logger.warning(f"No classes found for teacher {user_worker_node.unique_id} in school database") + return { + "status": "warning", + "message": "No classes found in school database" + } + + # Dictionary to store lessons by class + class_lessons = {} + + for class_data in school_classes: + class_name_safe = class_data['subject_class_code'].replace(' ', '_') + _, class_path = fs_handler.create_teacher_class_directory(worker_timetable_path, class_name_safe) + + # Create SubjectClassNode + subject_class_node = SubjectClassNode( + unique_id=class_data['unique_id'], + subject_class_code=class_data['subject_class_code'], + year_group=class_data['year_group'], + subject=class_data['subject'], + subject_code=class_data['subject_code'], + path=class_path + ) + neon.create_or_merge_neontology_node(subject_class_node, database=user_db_name, operation='merge') + fs_handler.create_default_tldraw_file(subject_class_node.path, subject_class_node.to_dict()) + + # Link class to timetable + neon.create_or_merge_neontology_relationship( + TimetableHasClass(source=worker_timetable, target=subject_class_node), + database=user_db_name, + operation='merge' + ) + + # Initialize empty list for this class's lessons + class_lessons[class_data['unique_id']] = [] + + # Get periods from school database + periods = get_school_class_periods(school_db_name, class_data['unique_id']) + if not periods: + logger.warning(f"No periods found for class {class_data['unique_id']} in school database") + continue + + for period_data in periods: + # Create UserTimetableLessonNode + lesson_unique_id = f"UserTimetableLesson_{timetable_unique_id}_{class_name_safe}_{period_data['date']}_{period_data['period_code']}" + timetable_lesson_node = UserTimetableLessonNode( + unique_id=lesson_unique_id, + subject_class=class_data['subject_class_code'], + date=period_data['date'], + start_time=period_data['start_time'], + end_time=period_data['end_time'], + period_code=period_data['period_code'], + school_db_name=school_db_name, + school_period_id=period_data['unique_id'], + path="Not set" # Will be set after creating directories + ) + + if calendar_day := next( + ( + day + for day in calendar_nodes + if day.date == period_data['date'] + ), + None, + ): + # Create lesson directory using calendar info + _, lesson_path = fs_handler.create_teacher_timetable_lesson_directory( + class_path, + f"{calendar_day.date}_{period_data['period_code']}" + ) + timetable_lesson_node.path = lesson_path + + # Create and link nodes + neon.create_or_merge_neontology_node(timetable_lesson_node, database=user_db_name, operation='merge') + fs_handler.create_default_tldraw_file(timetable_lesson_node.path, timetable_lesson_node.to_dict()) + + # Link lesson to class + neon.create_or_merge_neontology_relationship( + ClassHasLesson(source=subject_class_node, target=timetable_lesson_node), + database=user_db_name, + operation='merge' + ) + + # Link lesson to calendar day (keeping only one direction) + neon.create_or_merge_neontology_relationship( + CalendarDayHasTimetableLesson( + source=calendar_day, + target=timetable_lesson_node + ), + database=user_db_name, + operation='merge' + ) + + # Store the lesson node + class_lessons[class_data['unique_id']].append({ + 'node': timetable_lesson_node, + 'date': period_data['date'], + 'start_time': period_data['start_time'] + }) + else: + logger.warning(f"No calendar day found for date {period_data['date']} - this is expected if the date is not in the current calendar year") + + # Create sequential relationships for each class + for class_id, lessons in class_lessons.items(): + # Sort lessons by date and start time + sorted_lessons = sorted(lessons, key=lambda x: (x['date'], x['start_time'])) + + # Create relationships between consecutive lessons + for i in range(len(sorted_lessons) - 1): + current_lesson = sorted_lessons[i]['node'] + next_lesson = sorted_lessons[i + 1]['node'] + + # Skip if current and next lesson are the same node + if current_lesson.unique_id != next_lesson.unique_id: + neon.create_or_merge_neontology_relationship( + TimetableLessonFollowsTimetableLesson( + source=current_lesson, + target=next_lesson + ), + database=user_db_name, + operation='merge' + ) + + logger.info(f"Created sequential relationships for class {class_id}") + + logger.info(f"Successfully created user timetable structure for {user_worker_node.teacher_code}") + return { + "status": "success", + "message": "User timetable structure created successfully", + "timetable_node": worker_timetable.to_dict() + } + + except Exception as e: + logger.error(f"Error creating user timetable structure: {str(e)}") + return { + "status": "error", + "message": f"Error creating user timetable structure: {str(e)}" + } \ No newline at end of file diff --git a/modules/database/init/init_worker_timetable.py b/modules/database/init/init_worker_timetable.py new file mode 100644 index 0000000..37facfa --- /dev/null +++ b/modules/database/init/init_worker_timetable.py @@ -0,0 +1,241 @@ +from dotenv import load_dotenv, find_dotenv +load_dotenv(find_dotenv()) +import os +import modules.logger_tool as logger +log_name = 'api_modules_database_init_init_worker_timetable' +log_dir = os.getenv("LOG_PATH", "/logs") # Default path as fallback +logging = logger.get_logger( + name=log_name, + log_level=os.getenv("LOG_LEVEL", "DEBUG"), + log_path=log_dir, + log_file=log_name, + runtime=True, + log_format='default' +) +import pandas as pd +import re +import modules.database.tools.neo4j_driver_tools as driver +import modules.database.tools.neontology_tools as neon +import modules.database.tools.neo4j_session_tools as session +from modules.database.tools.filesystem_tools import ClassroomCopilotFilesystem +from modules.database.schemas.nodes.schools.schools import SubjectClassNode +from modules.database.schemas.nodes.workers.workers import TeacherNode +from modules.database.schemas.nodes.schools.timetable import AcademicPeriodNode, RegistrationPeriodNode +from modules.database.schemas.nodes.workers.timetable import TeacherTimetableNode, TimetableLessonNode, PlannedLessonNode +from modules.database.schemas.nodes.schools.pastoral import YearGroupSyllabusNode +from modules.database.schemas.relationships.planning_relationships import TimetableLessonBelongsToPeriod, TimetableLessonHasPlannedLesson, TeacherHasTimetable, TimetableHasClass, ClassHasLesson, TimetableLessonFollowsTimetableLesson, PlannedLessonFollowsPlannedLesson, SubjectClassBelongsToYearGroupSyllabus + +def init_worker_timetable(timetable_df: pd.DataFrame, school_worker_node: TeacherNode): + logging.info(f"School worker node: {school_worker_node}") + worker_node = TeacherNode(**school_worker_node) + logging.info(f"Worker node: {worker_node}") + worker_db_name = worker_node.worker_db_name + + logging.info(f"Initialising filesystem handler...") + fs_handler = ClassroomCopilotFilesystem(db_name=worker_db_name, init_run_type="user") + _, worker_timetable_path = fs_handler.create_teacher_timetable_directory(worker_node.path) + + logging.info(f"Initialising neo4j connection...") + neon.init_neontology_connection() + + try: + timetable_unique_id = f"TeacherTimetable_{worker_node.teacher_code}" + worker_timetable = TeacherTimetableNode( + unique_id=timetable_unique_id, + path=worker_timetable_path + ) + neon.create_or_merge_neontology_node(worker_timetable, database=worker_db_name, operation='merge') + fs_handler.create_default_tldraw_file(worker_timetable.path, worker_timetable.to_dict()) + neon.create_or_merge_neontology_relationship( + TeacherHasTimetable(source=worker_node, target=worker_timetable), + database=worker_db_name, operation='merge' + ) + logging.info(f"Teacher timetable node created: {worker_timetable}") + + # Group the timetable by class + class_groups = timetable_df.groupby('Class') + for class_name, class_df in class_groups: + if pd.notna(class_name): + class_name_safe = re.sub(r'[^A-Za-z0-9_ ]+', '', class_name) + _, class_path = fs_handler.create_teacher_class_directory(worker_timetable.path, class_name_safe) + + subject_class_node_unique_id = f"SubjectClass_{class_name}" + subject_class_node = SubjectClassNode( + unique_id=subject_class_node_unique_id, + subject_class_code=class_name, + year_group=str(int(class_df['YearGroup'].iloc[0])), # TODO: Hacky fix for the year group being a float + subject=str(class_df['Subject'].iloc[0]), + subject_code=str(class_df['SubjectCode'].iloc[0]), + path=class_path + ) + neon.create_or_merge_neontology_node(subject_class_node, database=worker_db_name, operation='merge') + logging.info(f"Class node created: {subject_class_node}") + # Create the tldraw file for the node + fs_handler.create_default_tldraw_file(subject_class_node.path, subject_class_node.to_dict()) + + # Link ClassNode to TeacherTimetableNode + neon.create_or_merge_neontology_relationship( + TimetableHasClass(source=worker_timetable, target=subject_class_node), + database=worker_db_name, operation='merge' + ) + logging.info(f"Relationship created from {worker_timetable.unique_id} to {subject_class_node.unique_id}") + + # Link class to corresponding YearGoupSyllabus + + year_group_syllabus_search_driver = driver.get_driver(worker_db_name) + year_group_syllabus_search_session = year_group_syllabus_search_driver.session(database=worker_db_name) + year_group_syllabus = session.find_nodes_by_label_and_properties(year_group_syllabus_search_session, "YearGroupSyllabus", {"yr_syllabus_year_group": subject_class_node.year_group, "yr_syllabus_subject_code": subject_class_node.subject_code}) + if year_group_syllabus: + year_group_syllabus_node_data = year_group_syllabus[0] + year_group_syllabus_node = YearGroupSyllabusNode(**year_group_syllabus_node_data) + neon.create_or_merge_neontology_relationship( + SubjectClassBelongsToYearGroupSyllabus(source=subject_class_node, target=year_group_syllabus_node), + database=worker_db_name, operation='merge' + ) + logging.info(f"Relationship created from {subject_class_node.unique_id} to {year_group_syllabus_node.unique_id}") + else: + logging.warning(f"No YearGroupSyllabus found for class {class_name} with year group {subject_class_node.year_group} and subject code {subject_class_node.subject_code}") + + class_lesson_nodes = [] + planned_lesson_nodes = [] + lesson_number = 0 + for _, row in class_df.iterrows(): + properties = { + "period_code": row['PeriodCode'] + } + class_lessons_search_driver = driver.get_driver(worker_db_name) + class_lessons_search_session = class_lessons_search_driver.session(database=worker_db_name) + # If the period code contains "Rg" then we want to find the corresponding registration period and use its unique id + if "Rg" in row['PeriodCode']: # TODO: This is hacky and not very flexible. We are assuming that any period code containing "Rg" is a registration period. We should probably find a more robust way to identify registration periods + logging.info(f"Registration period found for class {class_name} with period code {row['PeriodCode']}") + class_lessons = session.find_nodes_by_label_and_properties(class_lessons_search_session, "RegistrationPeriod", properties) + else: + logging.info(f"Academic period found for class {class_name} with period code {row['PeriodCode']}") + class_lessons = session.find_nodes_by_label_and_properties(class_lessons_search_session, "AcademicPeriod", properties) + if class_lessons: + lesson_of_same_period = 0 + number_of_lessons = len(class_lessons) + while lesson_of_same_period < number_of_lessons: + class_lesson = class_lessons[lesson_of_same_period] + if "Rg" in row['PeriodCode']: + period_node = RegistrationPeriodNode(**class_lesson) + else: + period_node = AcademicPeriodNode(**class_lesson) + lesson_period_code = row['PeriodCode'] + date = class_lesson['date'] + date_safe = date.strftime("%Y-%m-%d") + # Clean the class_name to make it directory-safe (catch all for invalid characters) + timetable_lesson_unique_id = f"TimetableLesson_{timetable_unique_id}_Class_{class_name}_Lesson_{lesson_number}_{date_safe}_{lesson_period_code}" + + timetable_lesson_node = TimetableLessonNode( + unique_id=timetable_lesson_unique_id, + subject_class=class_name, + date=date, + start_time=class_lesson['start_time'].time(), # TODO: This is probably how we should format the start and end time properties for all such nodes + end_time=class_lesson['end_time'].time(), + period_code=lesson_period_code, + path="Not set" + ) + neon.create_or_merge_neontology_node(timetable_lesson_node, database=worker_db_name, operation='merge') + logging.info(f"TimetableLessonNode created: {timetable_lesson_node}") + class_lesson_nodes.append(timetable_lesson_node) + + neon.create_or_merge_neontology_relationship( + TimetableLessonBelongsToPeriod(source=timetable_lesson_node, target=period_node), + database=worker_db_name, operation='merge' + ) + logging.info(f"Relationship created from {timetable_lesson_node.unique_id} to {period_node.unique_id}") + + # Link TimetableLessonNode to ClassNode + neon.create_or_merge_neontology_relationship( + ClassHasLesson(source=subject_class_node, target=timetable_lesson_node), + database=worker_db_name, operation='merge' + ) + logging.info(f"Relationship created from {subject_class_node.unique_id} to {timetable_lesson_node.unique_id}") + + # Create PlannedLessonNode + planned_lesson_unique_id = f"PlannedLesson_{timetable_unique_id}_Class_{class_name}_Lesson_{lesson_number}_{date_safe}_{lesson_period_code}" + planned_lesson_node = PlannedLessonNode( + unique_id=planned_lesson_unique_id, + date=date, + start_time=class_lesson['start_time'].time(), + end_time=class_lesson['end_time'].time(), + period_code=lesson_period_code, + subject_class=class_name, + year_group=subject_class_node.year_group, + subject=subject_class_node.subject, + teacher_code=worker_node.teacher_code, + planning_status="Unplanned", + topic_code=None, + topic_name=None, + lesson_code=None, + lesson_name=None, + learning_statement_codes=None, + learning_statements=None, + learning_resource_codes=None, + learning_resources=None, + path="Not set" + ) + # Create the PlannedLessonNode + neon.create_or_merge_neontology_node(planned_lesson_node, database=worker_db_name, operation='merge') + logging.info(f"PlannedLessonNode created: {planned_lesson_node}") + planned_lesson_nodes.append(planned_lesson_node) + + # Link PlannedLessonNode to TimetableLessonNode + neon.create_or_merge_neontology_relationship( + TimetableLessonHasPlannedLesson(source=timetable_lesson_node, target=planned_lesson_node), + database=worker_db_name, operation='merge' + ) + logging.info(f"Relationship created from {timetable_lesson_node.unique_id} to {planned_lesson_node.unique_id}") + lesson_of_same_period += 1 + lesson_number += 1 + else: + logging.warning(f"No class periods found for class {class_name} on day {row['DayOfWeek']}") + # Sort the nodes by date and start time + class_lesson_nodes.sort(key=lambda x: (x.date, x.start_time)) + planned_lesson_nodes.sort(key=lambda x: (x.date, x.start_time)) + + # Create sequential relationships and directories for TimetableLessonNodes + for i in range(1, len(class_lesson_nodes)): + previous_node = class_lesson_nodes[i - 1] + current_node = class_lesson_nodes[i] + i_safe = f"{i:02d}" + _, class_lesson_path = fs_handler.create_teacher_timetable_lesson_directory(class_path, f"{i_safe}_{current_node.date}_{current_node.period_code}") + current_node.path = class_lesson_path + neon.create_or_merge_neontology_node(current_node, database=worker_db_name, operation='merge') + logging.info(f"TimetableLessonNode directory created and node merged into database: {current_node}") + # Create the tldraw file for the node + fs_handler.create_default_tldraw_file(current_node.path, current_node.to_dict()) + if previous_node: + neon.create_or_merge_neontology_relationship( + TimetableLessonFollowsTimetableLesson(source=previous_node, target=current_node), + database=worker_db_name, operation='merge' + ) + logging.info(f"Sequential relationship created between {previous_node.unique_id} and {current_node.unique_id}") + + # Create sequential relationships for PlannedLessonNodes + for i in range(1, len(planned_lesson_nodes)): + previous_node = planned_lesson_nodes[i - 1] + current_node = planned_lesson_nodes[i] + i_safe = f"{i:02d}" + _, planned_lesson_path = fs_handler.create_teacher_planned_lesson_directory(class_path, f"{i_safe}_{current_node.date}_{current_node.period_code}") + current_node.path = planned_lesson_path + neon.create_or_merge_neontology_node(current_node, database=worker_db_name, operation='merge') + logging.info(f"PlannedLessonNode directory created and node merged into database: {current_node}") + # Create the tldraw file for the node + fs_handler.create_default_tldraw_file(current_node.path, current_node.to_dict()) + if previous_node: + neon.create_or_merge_neontology_relationship( + PlannedLessonFollowsPlannedLesson(source=previous_node, target=current_node), + database=worker_db_name, operation='merge' + ) + logging.info(f"Sequential relationship created between {previous_node.unique_id} and {current_node.unique_id}") + logging.info(f"Successfully initialized worker timetable for worker {worker_node.teacher_code}") + return {"status": "success", "message": "Worker timetable initialized successfully"} + + except Exception as e: + logging.error(f"Error initializing worker timetable: {str(e)}") + return {"status": "error", "message": f"Error initializing worker timetable: {str(e)}"} + + + diff --git a/modules/database/init/xl_tools.py b/modules/database/init/xl_tools.py new file mode 100644 index 0000000..53d1087 --- /dev/null +++ b/modules/database/init/xl_tools.py @@ -0,0 +1,35 @@ +from dotenv import load_dotenv, find_dotenv +load_dotenv(find_dotenv()) +import os +import modules.logger_tool as logger +log_name = 'api_modules_database_tools_xl_tools' +log_dir = os.getenv("LOG_PATH", "/logs") # Default path as fallback +logging = logger.get_logger( + name=log_name, + log_level=os.getenv("LOG_LEVEL", "DEBUG"), + log_path=log_dir, + log_file=log_name, + runtime=True, + log_format='default' +) +import pandas as pd +from fastapi import UploadFile + +def create_dataframes(excel_file, return_clean=False): + excel_sheets = pd.read_excel(excel_file, sheet_name=None) + # Log the sheet names + logging.info(f"Sheet names: {excel_sheets.keys()}") + return {sheet.lower(): data for sheet, data in excel_sheets.items()} + +def create_dataframes_from_fastapiuploadfile(upload_file: UploadFile): + from io import BytesIO + file_content = upload_file.file.read() + file_content_io = BytesIO(file_content) + return pd.read_excel(file_content_io, sheet_name=None, engine='openpyxl') + +def replace_nan_with_default(data, default_values): + for key in default_values: + if pd.isna(data.get(key, None)): + # logging.debug(f"Replacing NaN in {key} with default value '{default_values[key]}'") + data[key] = default_values[key] + return data diff --git a/modules/database/neo4j/__init__.py b/modules/database/neo4j/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/modules/database/neo4j/utils/__init__.py b/modules/database/neo4j/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/modules/database/neo4j/utils/neontology.py b/modules/database/neo4j/utils/neontology.py new file mode 100644 index 0000000..f79f3ae --- /dev/null +++ b/modules/database/neo4j/utils/neontology.py @@ -0,0 +1,221 @@ +from dotenv import load_dotenv, find_dotenv +load_dotenv(find_dotenv()) +import os +import modules.logger_tool as logger +from modules.database.tools.neontology.graphconnection import GraphConnection, init_neontology +from modules.database.tools.neontology.basenode import BaseNode +from modules.database.tools.neontology.baserelationship import BaseRelationship +from typing import Optional, Dict, Any, List +from neo4j import Record as Neo4jRecord +import re + +log_name = 'api_modules_database_neo4j_utils_neontology' +log_dir = os.getenv("LOG_PATH", "/logs") # Default path as fallback +logging = logger.get_logger( + name=log_name, + log_level=os.getenv("LOG_LEVEL", "DEBUG"), + log_path=log_dir, + log_file=log_name, + runtime=True, + log_format='default' +) + +class NeontologyProvider: + """Provider class for managing Neontology connections and operations.""" + + def __init__(self): + """Initialize the provider with Neo4j connection details from environment.""" + self.bolt_url = os.getenv("APP_BOLT_URL") + self.user = os.getenv("USER_NEO4J") + self.password = os.getenv("PASSWORD_NEO4J") + self.connection = None + self.current_database = None + + def _validate_database_name(self, database: str) -> str: + """Validate and format database name to handle special characters.""" + if not database: + raise ValueError("Database name cannot be empty") + + if not re.match(r'^[a-zA-Z0-9_\.]+$', database): + raise ValueError("Database name contains invalid characters") + + if database.count('.') > 1: + parts = database.split('.') + if len(parts) > 2: + formatted_name = f"{parts[0]}.{'.'.join(parts[1:])}" + logging.info(f"Reformatted database name from {database} to {formatted_name}") + return formatted_name + + return database + + def connect(self, database: str = 'neo4j') -> None: + """Establish connection to Neo4j using Neontology.""" + try: + formatted_database = self._validate_database_name(database) + + if self.current_database != formatted_database and self.connection is not None: + self.close() + + if self.connection is None: + init_neontology( + neo4j_uri=self.bolt_url, + neo4j_username=self.user, + neo4j_password=self.password + ) + self.connection = GraphConnection() + self.current_database = formatted_database + logging.info(f"Neontology connection initialized with host: {self.host}, port: {self.port}, database: {formatted_database}") + + except Exception as e: + logging.error(f"Failed to initialize Neontology connection: {str(e)}") + raise + + def list_databases(self) -> List[str]: + """List all available Neo4j databases.""" + try: + with self.connection.driver.session() as session: + result = session.run("SHOW DATABASES") + return [record["name"] for record in result] + except Exception as e: + logging.error(f"Error listing databases: {str(e)}") + raise + + def check_database_exists(self, database_name: str) -> bool: + """Check if a specific database exists.""" + try: + databases = self.list_databases() + return database_name in databases + except Exception as e: + logging.error(f"Error checking database existence: {str(e)}") + return False + + def create_database(self, database_name: str) -> None: + """Create a new Neo4j database.""" + try: + formatted_name = self._validate_database_name(database_name) + with self.connection.driver.session() as session: + session.run(f"CREATE DATABASE {formatted_name} IF NOT EXISTS") + logging.info(f"Created database: {formatted_name}") + except Exception as e: + logging.error(f"Error creating database: {str(e)}") + raise + + def reset_connection(self) -> None: + """Reset the connection, forcing a new one to be created on next use.""" + if self.connection: + self.close() + + def create_or_merge_node(self, node: BaseNode, database: str = 'neo4j', operation: str = "merge") -> None: + """Create or merge a node in the Neo4j database.""" + try: + if not self.connection or self.current_database != database: + self.connect(database) + + if operation == "create": + node.create(database=database) + elif operation == "merge": + node.merge(database=database) + else: + logging.error(f"Invalid operation: {operation}") + raise ValueError(f"Invalid operation: {operation}") + except Exception as e: + logging.error(f"Error in processing node: {e}") + raise + + def create_or_merge_relationship(self, relationship: BaseRelationship, database: str = 'neo4j', operation: str = "merge") -> None: + """Create or merge a relationship in the Neo4j database.""" + try: + if not self.connection or self.current_database != database: + self.connect(database) + + if operation == "create": + relationship.create(database=database) + elif operation == "merge": + relationship.merge(database=database) + else: + logging.error(f"Invalid operation: {operation}") + raise ValueError(f"Invalid operation: {operation}") + except Exception as e: + logging.error(f"Error in processing relationship: {e}") + raise + + def cypher_write(self, cypher: str, params: Dict[str, Any] = {}, database: str = 'neo4j') -> None: + """Execute a write transaction.""" + try: + if not self.connection or self.current_database != database: + self.connect(database) + self.connection.cypher_write(cypher, params) + except Exception as e: + logging.error(f"Error in cypher write: {e}") + raise + + def cypher_read(self, cypher: str, params: Dict[str, Any] = {}, database: str = 'neo4j') -> Optional[Neo4jRecord]: + """Execute a read transaction returning a single record.""" + try: + if not self.connection or self.current_database != database: + self.connect(database) + return self.connection.cypher_read(cypher, params) + except Exception as e: + logging.error(f"Error in cypher read: {e}") + raise + + def cypher_read_many(self, cypher: str, params: Dict[str, Any] = {}, database: str = 'neo4j') -> List[Neo4jRecord]: + """Execute a read transaction returning multiple records.""" + try: + if not self.connection or self.current_database != database: + self.connect(database) + return self.connection.cypher_read_many(cypher, params) + except Exception as e: + logging.error(f"Error in cypher read many: {e}") + raise + + def run_query(self, cypher: str, params: Dict[str, Any] = {}, database: str = 'neo4j') -> List[Dict[str, Any]]: + """ + Execute a Cypher query and return results as a list of dictionaries. + This is a convenience method that handles both single and multiple record results. + + Args: + cypher: The Cypher query to execute + params: Query parameters + database: Target database name + + Returns: + List[Dict[str, Any]]: Query results as a list of dictionaries + """ + try: + if not self.connection or self.current_database != database: + self.connect(database) + + # Use cypher_read_many for consistent return type + records = self.connection.cypher_read_many(cypher, params) + + # Convert Neo4j records to dictionaries + results = [] + for record in records: + # Handle both Record and dict types + if isinstance(record, Neo4jRecord): + results.append(dict(record)) + else: + results.append(record) + + return results + + except Exception as e: + logging.error(f"Error in run_query: {e}") + raise + + def close(self) -> None: + """Close the Neontology connection.""" + if self.connection: + # The connection will be closed when the GraphConnection instance is deleted + self.connection = None + self.current_database = None + logging.info("Neontology connection closed") + + def __enter__(self): + """Context manager entry.""" + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + """Context manager exit.""" + self.close() diff --git a/modules/database/schemas/__init__.py b/modules/database/schemas/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/modules/database/schemas/__pycache__/__init__.cpython-311.pyc b/modules/database/schemas/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a254fd4e262e3ccd89bd76a4c454c493a93ff9b0 GIT binary patch literal 150 zcmZ3^%ge<81b?*LGeGoX5CH>>P{wCAAY(d13PUi1CZpd1e0*kJW=VX!UP0wA4jYIvyCPPgPLSEf{6OLZ QGb1D82L>2X#0(Sz02kFENdN!< literal 0 HcmV?d00001 diff --git a/modules/database/schemas/__pycache__/entities.cpython-311.pyc b/modules/database/schemas/__pycache__/entities.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa3a53795412dec4ea275d5ced601ed9e63c8711 GIT binary patch literal 1190 zcmbVLzi-n(6uz^4iSxrw(hx{nib~6p4$i~`LPAvP)`8H)3v%O2>)>DV*`RLuFZdG> z{|Zxv4v|+THcQP^G4Oo$1tV3WU_ZV4{J!sfe!i2xXj&7&_4DZD@|%Rv_xwRzwG!MM zVT3*-8`;=J9yT$~vE)jgJe4r=6rKssHM3r_>K$x@YZ_*=)U@um{8M&ZndhwDaY?;EcbRehQ)wU~80XS{Fbsz`c#&g+bu5eCB-R({Z2| zm5q^l2J@Z57o{4Xl=`s~JCvoZchrIpF1XetPHdpKuruMNuWirqi_T;Ek-9-xiuFkX z@HgElXWv*i3j^M(AJfo^Vo#WNC&~GoPUAPO#TZwpZ-c-qUR=(;F;WHkif;1Lyd90L zFdUbgJQim&hQ9pd#zJm{SGVfRLiQ>;fKK>#5PJ?elQG6CG+h1}EA(P{?^vOe<-f=O zb!9a~de_Q!CQChOp=B!S4_C_8weqBr4>;cE`DxZr$l+S9^`%88>k9c^LGpaa^KMp` g$=+HfT&SaVZ>2!=Au=M7!CF?@(n8JeXdkxk7jsftJ^%m! literal 0 HcmV?d00001 diff --git a/modules/database/schemas/__pycache__/owners.cpython-311.pyc b/modules/database/schemas/__pycache__/owners.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bc0d0c505683a5268b3485976358a65b1e66d589 GIT binary patch literal 1191 zcmbVL%Wl&^6rJ%ajuYESLrWhNl@_TA3ulAafRGTCy6b|_jW@`RCp5t?*-oqO@)vvp z;xqVzEV{6~LSn_vQnRX9a6O)hj8ut&eRb#fo^y}yc;qj-t|7R7Jv%=CCLr{qeBhVD zz|C`v&}ZZ#7kkLZHpV3uJi!-70!F?>vrMyMHyEql!8WO;X=_Z=x%ZV9 zApVUHJw!esapD%KIaM53J6Y9^REc)I8h@Veo7veJ`A56m1it?6yglBM0e%-BVreUI z@dN>U2L~MFLx9Ez6^3TA8bv*%MGRN2cpHvn!$AI1 zgbYxw9)(^M9uE3>BRP$|@GIrbg?to5PU;gjbZ~;dU`B>)a!dluhGFDzH%n+bNm9yT z$_Qn-E`+(ZQs!zY&6`)+TwRJg#p`p$|Lp&dJBjGG;y_IRa|v#lju#t6K2Ilrxdhd8 zn@7Cd1MHK~!PFKvKje+bAAc&#`RE0N_sJ)9*7|^15>f2e-Ti}n6{U!x<8j88B1SIddK zrdvFg|5dUK0lg>JG9ju2l z#X47>XUYriw4@BoEAMW}?N{t}iJz8sXWmlPy@jkTqq<=9_yL^ad#*}qe<3S|bk-~$ I`iS@MA23U7wg3PC literal 0 HcmV?d00001 diff --git a/modules/database/schemas/entities.py b/modules/database/schemas/entities.py new file mode 100644 index 0000000..11ae864 --- /dev/null +++ b/modules/database/schemas/entities.py @@ -0,0 +1,29 @@ +from typing import Union +import modules.database.schemas.nodes.users as user_schemas +import modules.database.schemas.nodes.workers.workers as worker_schemas +import modules.database.schemas.nodes.schools.schools as school_schemas + +user_entities = [ + user_schemas.UserNode +] + +worker_entities = Union[ + worker_schemas.TeacherNode, + worker_schemas.StudentNode, + worker_schemas.SchoolAdminNode, + worker_schemas.DeveloperNode, + worker_schemas.SuperAdminNode, +] + +school_entities = Union[ + school_schemas.SchoolNode, + school_schemas.DepartmentNode, + school_schemas.SubjectClassNode, + school_schemas.RoomNode, +] + +entities = Union[ + user_entities, + worker_entities, + school_entities, +] \ No newline at end of file diff --git a/modules/database/schemas/graph/__init__.py b/modules/database/schemas/graph/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/modules/database/schemas/graph/nodes/__init__.py b/modules/database/schemas/graph/nodes/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/modules/database/schemas/graph/nodes/schools/__init__.py b/modules/database/schemas/graph/nodes/schools/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/modules/database/schemas/graph/nodes/structures/__init__.py b/modules/database/schemas/graph/nodes/structures/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/modules/database/schemas/graph/nodes/workers/__init__.py b/modules/database/schemas/graph/nodes/workers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/modules/database/schemas/graph/relationships/__init__.py b/modules/database/schemas/graph/relationships/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/modules/database/schemas/nodes/__init__.py b/modules/database/schemas/nodes/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/modules/database/schemas/nodes/__pycache__/__init__.cpython-311.pyc b/modules/database/schemas/nodes/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf7098b8e072ed82a2cb63ef7116838a83f7378a GIT binary patch literal 156 zcmZ3^%ge<81b?*LGeGoX5CH>>P{wCAAY(d13PUi1CZpd1UVaKtI6gizFS8^*Uaz3?7l#c*v0V`>P(R3q VVtyd;ftit!@dE>lC}IYR0RS9TBbNXG literal 0 HcmV?d00001 diff --git a/modules/database/schemas/nodes/__pycache__/base_nodes.cpython-311.pyc b/modules/database/schemas/nodes/__pycache__/base_nodes.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2a31523e87d6f87003180b919ad1c20ea7e13586 GIT binary patch literal 2489 zcmcJQO>Y`U7{_PX0T%p%jd4u;g54xd!D&EI-Ak0VQhkWj13px4DpYl~X19TM*(EcJ zBBCCMln>xTCFkHnPpzz;`b|LMu-a3lo_fQwPf-tjo*5QwKuRjL>*eof=0CeL^UQB& zeqC5d61e`}eO&t@M#!I72(RccxL^>R5R;gSO&Ur?Q813!k%n4P6%rwjiK)IKCbiUG zR6>4(pS&tmcv0|T7M<{-!i$5aO?fdh@g*rF|H9W4ltA0J4bHzZ7{;F)+$y`KRULLB z{)Js$d<(@BVv&ksl1k(dhFnoCYDI63T3azQ@(4<%T8U3N6dfxHZPZZ|6|G~hNJTT_ zFf1)d?(c`A2uQG`>rGZ~7_4m@N0zPYL89f5keux>0EpWazcJ2-;Yd)M=c?agode{sxYuf`AlURRI&uh9LfU7nG#TL z+23(|c<0T7lF@9I8m`&0EnYGW&p3jVmUy*hH4I*IAh*1PRk{d^&2|v?T-~f!y%*{6 z%!|W15xBm?(}y)_HS;T=KSs3{q2tiak`Wo5Gje|1+*gNLL$&~-7y*#q#~*7 zawHJX>-w{nVM|9&1QQXc++#sX*A2&UJ;STJ4%c;t{jz0{Gs4msFQEX#QZS9&1nFG) z^Y7-nG;>^g&3|fiDa836&HIJDE?s+_{rUFkR+mD&*Q0xWD%~k}$}h|QYPL)9?$PXk zMx!vDX^{iKzGqW;1kSrrIlI&{-2xdKWsO4L%_*h;d=UINV{7 za?D;>j{_GMkgZ9wwMnu!paI)L*+j{qY@@t~vIru1ms}tyFEWQ$vJ>))I|Kg&WCp+f z#&&<>p1--%-@Nay=T1wKZ3KL`2Z!4vWqek(Hl>$Wg>+19z4Jwg1imV+^v4@fy8!@(vVOoA)yR+ z>Ph(SU>ypMmE(Ey@8G-2TxJb6Q@DF{&A$TZAd*1xrbUv6otF#oAO?$9cb+m_u3&d~ zMis*|3bNtayy#f2JjdG0v6W9@%V{~ToMY|f3`=C} EA9#)($N&HU literal 0 HcmV?d00001 diff --git a/modules/database/schemas/nodes/__pycache__/calendars.cpython-311.pyc b/modules/database/schemas/nodes/__pycache__/calendars.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a3193957ad2853742ad225e958764b47fc9c4a66 GIT binary patch literal 2607 zcmcgt&u`;I6dotz#BqLivs+MikpKx%q}^0%D^avUh#)Pk+EjuCM1*9ywINw-C(O7) z;p9jh_t3*i+rI!*@xP$>f-GM-?X6XNT5;gLaqNu~AG!xf>@RQL_wxMao9CI|t5uc2 z=bsNA_5aEf@;46Rk32K3{siMWF^C~qq=&ybOR{sloJ5SgL9M(^dsHGh@`xDnuf!;r z^f$=$2i(!8Ckw6!oU+6f1Xlu1UE+#@D+5{Kn=i1m z?z$8z9ZTo@Yn{E2zyl7o)A>~AW_M_q$5H(e#?!g_4#v-kNqUk&dbzJamR{bZru=3S zZ5E8&Ll~JdSb1R;pC~a6KAPc^(PtE(xMEo8=$7diI>RcU#MvlpXxfMkY@LlQ{m8U5 zEu@Zao1w~Gow=H!yATb36jt}V6e^mA0T8Hanmsg5EVL_{_S1=OMGPy!a~aMq%yXB8 zbxqS9XXxtgVCZm&RxqtQfX7g@&dC+d{J3x0I&V8rId31& zD(4SIV^+imAz)|meE@In8@#tMrLEKc8GmL^DcBo6-3ZjGx9jarc7w(n&#F^;4=$hH z3uk6)o%>0c9}w1Aw$JTXVvIz2(!bL>QDON`+anr~WxGuRC?oyHTHF z7teQRGnV6E=(v5+qScfun)4bwHI!|P303hUda=vy0w4ECUAQPkx-cWe-^49H_d1ISm;!qb3`(=psKKJ=wog8y$~lXqDWyrAk6vErF zD34(a?(|QbsHc*bFmVgT;-f(9*WxHZtGiyh$+mP0W*1WY!(#W{2ZkZM4L9!qq`Plt zPFJvZe7bYf9UHT*mzj8W!5xnV&JWRPq~dv^iF1VEi4mP2Vy_gt1$L}hYf;!j#V?hI z(b4oV!;K%$cK#vYMP8DmfYd$l4anLweFfy5Y5KaLRJwaXmf`fHOY~m9qAEG5c0rcm z^p{KYUcaIgDzz}@BAlt1vxPZlRE0__7`X_T6TBEXqad=0k&AHp1S6XmIio6hoY69z N?OmexI)f7J|1X@vLmB`8 literal 0 HcmV?d00001 diff --git a/modules/database/schemas/nodes/__pycache__/users.cpython-311.pyc b/modules/database/schemas/nodes/__pycache__/users.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..893d1cb131185777451265d49a7374faead6c102 GIT binary patch literal 611 zcmZuuzfT)66n;KCKN^7miKSw#ih@#ZN2mh~Y*`QtCsj`dTO`um;dAR`;f42@gSF}I+WD%ABWV%D- z78EF!LdFutKt+nDQN|O_Ac6x>;s>aT=D#?=1FaB=P}M_d*2X?j9EBX zIMK?bS_8Pt+&Knv3&q9+G&*nvI#Afx~VDYP2 qr__Ic`;B128Dk^Z7`~n(_%wVyCxWpr6L<@k=TH9h&pTK1_WuCr29|RG literal 0 HcmV?d00001 diff --git a/modules/database/schemas/nodes/base_nodes.py b/modules/database/schemas/nodes/base_nodes.py new file mode 100644 index 0000000..fe2242a --- /dev/null +++ b/modules/database/schemas/nodes/base_nodes.py @@ -0,0 +1,52 @@ +from typing import ClassVar +from modules.database.tools.neontology.basenode import BaseNode + +class CCBaseNode(BaseNode): + __primarylabel__: ClassVar[str] = '' + __primaryproperty__: ClassVar[str] = 'unique_id' + unique_id: str + tldraw_snapshot: str + + def to_dict(self): + return { + "__primarylabel__": self.__primarylabel__, + "unique_id": self.unique_id, + "tldraw_snapshot": self.tldraw_snapshot, + } + +class UserBaseNode(CCBaseNode): + __primarylabel__: ClassVar[str] = '' + cc_username: str + user_email: str + user_db_name: str + user_name: str + user_type: str + + def to_dict(self): + return { + "__primarylabel__": self.__primarylabel__, + "unique_id": self.unique_id, + "tldraw_snapshot": self.tldraw_snapshot, + "cc_username": self.cc_username, + "user_db_name": self.user_db_name, + "user_email": self.user_email, + "user_name": self.user_name, + "user_type": self.user_type, + } + +class WorkerBaseNode(CCBaseNode): + __primarylabel__: ClassVar[str] = '' + worker_name: str + worker_email: str + worker_db_name: str + worker_type: str + def to_dict(self): + return { + "__primarylabel__": self.__primarylabel__, + "unique_id": self.unique_id, + "tldraw_snapshot": self.tldraw_snapshot, + "worker_name": self.worker_name, + "worker_email": self.worker_email, + "worker_db_name": self.worker_db_name, + "worker_type": self.worker_type, + } diff --git a/modules/database/schemas/nodes/calendars.py b/modules/database/schemas/nodes/calendars.py new file mode 100644 index 0000000..3744c9d --- /dev/null +++ b/modules/database/schemas/nodes/calendars.py @@ -0,0 +1,36 @@ +import datetime +from typing import ClassVar +from .base_nodes import CCBaseNode + +class CalendarNode(CCBaseNode): + __primarylabel__: ClassVar[str] = 'Calendar' + name: str + start_date: datetime.date + end_date: datetime.date + +class CalendarYearNode(CCBaseNode): + __primarylabel__: ClassVar[str] = 'CalendarYear' + year: str + +class CalendarMonthNode(CCBaseNode): + __primarylabel__: ClassVar[str] = 'CalendarMonth' + year: str + month: str + month_name: str + +class CalendarWeekNode(CCBaseNode): + __primarylabel__: ClassVar[str] = 'CalendarWeek' + start_date: datetime.date + week_number: str + iso_week: str # ISO 8601 week + +class CalendarDayNode(CCBaseNode): + __primarylabel__: ClassVar[str] = 'CalendarDay' + date: datetime.date + day_of_week: str + iso_day: str # ISO 8601 day + +class CalendarTimeChunkNode(CCBaseNode): + __primarylabel__: ClassVar[str] = 'CalendarTimeChunk' + start_time: datetime.time + end_time: datetime.time diff --git a/modules/database/schemas/nodes/schools/__init__.py b/modules/database/schemas/nodes/schools/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/modules/database/schemas/nodes/schools/__pycache__/__init__.cpython-311.pyc b/modules/database/schemas/nodes/schools/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7e76dcba6927031c0c7e70ea1a5aae1e072b15ce GIT binary patch literal 164 zcmZ3^%ge<81b?*LGeGoX5CH>>P{wCAAY(d13PUi1CZpd1UVaKt7|6@d&necAkI&4@EQycTE2#X%VFS@* bSHuc52V_$*Kalvq%*e?2fdNJoF$2W_l%FQa literal 0 HcmV?d00001 diff --git a/modules/database/schemas/nodes/schools/__pycache__/curriculum.cpython-311.pyc b/modules/database/schemas/nodes/schools/__pycache__/curriculum.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce8c0b6a9e169daaeed4c505681aff7384941a21 GIT binary patch literal 3739 zcmb_f&2Jk;6yLRH?e$lZrb#KK(0sJ1lae?}_-Ig7AtI4P1S4TU$O5f4-f3dG{^-ma z@Bzt{IOLE+Bq}urkT`)57ybnPgx#ApH^iwoN6o3?zD!C2YvZ_98neJp<*ePYAY4Bs8%9H7_uT()Q(n2k*G>U z*-$LpL~Qa%}0d3ZkwEcW-_6FRCmg?s%bxpAf<}r`uck& zr}>&iOTGX;cJ+9?0R4vwRf?*m6eFL4ro|{FRD1dKZ5p#8x1eW5;hRK^uQwPgml}4X z(w$i-V$3k=tXwf!(>8agZ5a9A;zBo!s#&3iA(DnssaXvh?X+RsYnZmrFbp@t)rcr} zm>4w-vs$e=Cc425<2U6oF67Bt&aBsS{v14KnU1*wZsmAsk5){ctAc+Vd$pR)bEVT2 zF4db%$1fldc=&aIR^Pw&T-GHMhkHl-LB%CtXFZ8vu<`Ey443XU(9b6w)j-53iYP52 z<n+3<*l_3&(wGN(?!(jC^5?|q!X5q?m=||gx~`py5R)RrK?Ge)blomA zZOESn$9xrI!=t_^k+Q`u!b;dn03yvBJ73X~BQq^rpG){MLK+^P2N=}nW}iM_-}K1M zww`Kjv^MTkBTy=1By@Pb2(TxV(P=a~ASiv0|L+Lp!`La;%sLFuIgK zR!jz%#8V~}V3IxqAxnu-8K-Tjw+vjWZ(t~V>?-(}7crYwcbz>k!5h1~lsnWi%#u_7 zy6luG7bE;`*|s@^&}3C=3H=+oW0$LU`FxsTg|iI82*T;%!bY(>hJXhiBM3JTUPo9& z7}`~{IEF9<5B~vRF!ZZ^p$B`_BdgB}{pG3F`}>=Rg@X@WG6l^eQ|*N%$c3Zq&#ON| z?ts1Ik)`(4Y%71bc~p1+FFrkv+ON&DHuv`q`9Z}cGtfMVVE8$Ms|?SXO<>L@XCRhw zF}aPJm#e#QVmTDcOGfluU^q0cp%s>c6*2^j3x5}2Q0BEhnZaK3$l5bx?rl>zWw<7P z0`uaUSXxN+_-C0GQayfMX(83)*OgWbR*zp-S~2|}b%hs)lo%-^yivisnMgBwuTf?)bX+9rtX85{gHaLV<{j!ZWhKmKo~Mr902%!{dK0a;5b*91 zT1+cQAS}bfe*zec@=9Nn!CvvmN=TGnoo;RHe|}gx_|hfQ&^$8To|$WHA7+nMA3zDs zLG#F5`^s!+g{{ZCopdh_!c5rZQHa$eq2rN<(PmrtXLmrfRg zxBNS%yobrlhCFiR*&%lknd4G|!9C`Qe#^hn-e&K>Ebv#2!VdvEQB_sj$~8BvwUt?S zuyu&4&Ucg`99=rb(UTq(i>f0XB?#{MYsWZz(&LhvdZD8P!F^@%7>7@K+(>Xj`4M;g zYGBrwdZVKR!5y19#^IA5H>Rtz9VH0vh3qj7pY*s1f^G%Dy}Wdc!zVp19h^{p#GSl8 LJnQNFa+m!V!LU8e literal 0 HcmV?d00001 diff --git a/modules/database/schemas/nodes/schools/__pycache__/pastoral.cpython-311.pyc b/modules/database/schemas/nodes/schools/__pycache__/pastoral.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..77955ff2f7be60352eeb1fc33b59879885c05bc8 GIT binary patch literal 1097 zcmbVLF>ezw6t?etmrL3}p$&+E34v6GMxClkRR=OeWk@6{khsNiYpV&m%N_P*$aaxf zkvbr?zW`M6XOivYm8n}$I#moj-;rypbi%Peeb3*M{rtVlk9xg^VElRA?)5N2zf7c8g%P*79oQl92}TxbBTl{`?g;YTM(8K3V)#z3xu8{+G?#ma zXtR20Qa3H_wF0Kp2PU=Gjgx*fV8NwjB&=(#)*GfoC*tC`IJm&YJ@b8t&yYYq=E%3+ zL#@6oh;W{j*}~=49z?@wW4JVRYg;8!Kctim22sMygB7J0 zXbu{>-f6NpZWd>#CT9sd0t1@rxF$cJ8IN`dqG>Qda=olqVckIfnucLd z7f=PFIskVa+P&ov@ZBld&AgSgowmpA(xDsA9ycb$%xR85imS{moz04NlTq9soa8N+ zrYE{)I!W^mN*6YYmgQC5t@PU4D?WgI`5f}#4~o=RfSHXk&d|%reKSKZCU@tI*!aN= dEyL;C-)8sfMyfgZ$qX&SIb_1_)jd-F+P{3$3!(r3 literal 0 HcmV?d00001 diff --git a/modules/database/schemas/nodes/schools/__pycache__/schools.cpython-311.pyc b/modules/database/schemas/nodes/schools/__pycache__/schools.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..70a5019b873c63115218fd292521de4236cccd4e GIT binary patch literal 3881 zcmbtW&2Jk;6yLSS_Qr|xW#^-%Rb1SUI3G?)B1B8+fg(i}B9RD`$`Y(LyOVg!+G}Rl zltdt0sfQjoSSV5>wUu%}g{prEoYqng)}9cYdP|g^Dh|9i>#RT4sI6GfJinRWo7wk! z^JaE_O(fz1JpatB6b2fmPk8mssSS)}=IVJ(t7r zmUTm6uC!LRb+e=x&qD}_Zv5J{4;729ni^F-hdg=g-_ai;a-%|C)P#KKbKsZ{Q$iyr zd}|ujLRX+gBcO$SjrdvwH7%Ntaf=vlNqLF((Rjx!eNCi4fW(`~03e-j?r$QAz?gw1 zG8h<>Xd*)aWUz@02ausAG7>1M@})q=tl)uzl%n46YOHJQPn(w3W|F#Cp~ zTZJMm*>b5;+yJA|u3mJutB=#@8qFQG+$f`Vg_Tsub^pN~fc5Asi2K6#!Yv>CK8^q%{Q`1=49<15fo$owD?%$-qFj(jN7fVlEqE128k| z2k}I7iA9Y~3#U%Me0M=9mlukrRxzlxa6H`t45dZIS}4I1TG)c+^#60^ZMXl}RMxef z@pXT_b8Y=^!5gg8AgaPaR7g%d8-3du%0b!x?3XV*&5?3PU?6ma1wG?oiGl)$p2&&M z9TP8CU}@AAb(mM%N&FLk})*)}G^+aIkhsT*sf$FBbX=LADoMvaLjY%(qG|tio zf>Rovy7wbH1Fa7C@z~?;kAs5lcdqNB5T`Tm(_#9zicMd^XRw1$E-SJ$%pPDh273%= z>!Ouzr`5~i986}7f$(@O?UQHei_Xv@7HRR796K3mVw0nvt7?TYU9A|E;wxzO=US$~ z@q90ilP!}jnwd75|7A3TOmSuWq?~hxE;WmEiBrvYQz)O>(%Rbt~ZjWsw?-_9dZgvoty&u={bjt)xO&g z@BZMBStxZf+rZB8J!wDrFyRo;=jvpxcjvimb**-DPu=~}Az3JOl5J$?9Wt>uxu1D> z+99CN*U5Y%bD{c4?Y+HgyB|2@0+c$r0B@gNaLDA|^#0OAuxpa&{i2>O&A^cE;eSRF z2cb}8VQ>9FfWMYF3=7f0yEi#_Ac2nB)V_)qQ!UYEHszZw?OSNE)DmrGOTO9V-!f=% zxh2}n+IqcJ#syZP`VXcaK1a(S-t+>c5jch-?%+qXtS}qDbNq81Z?(PrPQcu&*%-^h zKf}$#W>NUL&*rc>kD@Cf-@!f<3s9{bh|YvuY)eSc7wcrv&pgaOk2OxvoApgVUXQgF zhKr%pb*<~VJo1ZUlwYS}5E;oGUaxH2qN>d=wmdci?LA%u2Ehl0A#xMjRAKTKGb?5I zB)W0S8x8tuw(oVKhqLg5qC1Ybx(vkAh6Z;t9?$rj#q)h2&>hrE*oOkEwFaUysBnt;r{(d9)+?xIW~v|8CigPC zaCXf=sdEX67gd}c*58f7%@DljUkmSR5XWnq%XN2&G!snaPDB|j(RCw@xDY? z*;N>U*CgvN5C>sV6dS@hr&nnR8K<)xkgN!YOHkBK9%Ao{7IZ@liGy%D1w<`>h`ldb jkVM4Pfe;k6okQ$>(SioT;_QJC6!*XqdSCQ_crgD3YLTYf literal 0 HcmV?d00001 diff --git a/modules/database/schemas/nodes/schools/__pycache__/timetable.cpython-311.pyc b/modules/database/schemas/nodes/schools/__pycache__/timetable.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2e879e3d842c68b91dc0de9c17d367a4a8fa0741 GIT binary patch literal 5810 zcmd5=&2JM&6rZ)n-;V9raS|XQ&`L<5g3yqX5>Z+{BtBG3Md+7>wAy4h#MB?@tWgzC zM(Uvl4mlu^YcH)(rT#5miG#J*p11{(6Y8Pwz46++-i_i^5yIYme*1ponR&l?^Y-oj zIWm%D@cH-jjrHFXjQxWb&L`4U-u|sH_JZk5SE{UxzoDv93zb6()5AKihHJdc6&7MQ zm>&6+=~09K5oYW!IOV4tAuI-1+=oR8O8}PiVKKr|fTev{oUjqVGCnLpSQfCH4@(j@ z3RvEUr3fnkHs-_9gcSiB_hBQ1O#n9O!!m>&0qm#`%Mx}BuqhvwBWxP5<34PZuo=Kk z_^`aLEVJ2@uaWxFtYXKnRW;N6P7|*~U;#t&+O?~iX_Okeu`1U`N@uy=K7i{N%wT0j zXXVhhu)_Dm6`PR<#wQs;YLur2nZ+=Z|Vdx07a56HQgunuZ-W>N;tqmkB$r zs&%bq!2gn}T5IT!tEi_{_2)ScC*ydwf>)Yn@TAPEuXz|6)k*PMv!{Sq&+~o6-HlK#W;?teX_%mpC3=WGVC}P|h zA$WNg06ysQ>Kv9WV&|@`YPwOYto~?d0t3iSyDdbf%{LL8jfo7-Ba0%3qQ|rt#mhX3 zA_|)C1Zo&zBvPQ5XF+(mS#WU!`hvw5I?0jNt=6rlaJFvAuCSM2*Vh0!sOuEtd&aZj zjr%CYcnrvj_sP0%h?*H#Q6kN}YeQ4%Al4iGhsHWWy&`2&dk ziOS|%rB>-_sWUnTG{Rx=v09TB@9mmh%#0tLolz=pi&3Odj)TKrMvkZ>;3q%6J%*_ZWzH)cnT&iP)xyT-UP9K6duLQ)lFXB zROZAdMycG$*mW>vmjM})GHBdNq;f~my#{Qoi2zYXXSNbga*aCdF3SHC#aWe1EhijXkzDTv@u!W*(caRyHF z3J5PfK^4KCl*rUBxxhZ(3m56-rna``kPvsShVp(9CMi(N!x`ZHIoC!4{hYOozF zax{2iMCT@75!7yVScgo zJS$!y>Djn0(Wg(I2;#hHhE*wT$BEezAS@4O(~mP|n|o m{oAzIUNaPwU%I!#?51)v||E3i=OD*4IV= literal 0 HcmV?d00001 diff --git a/modules/database/schemas/nodes/schools/curriculum.py b/modules/database/schemas/nodes/schools/curriculum.py new file mode 100644 index 0000000..06b92e5 --- /dev/null +++ b/modules/database/schemas/nodes/schools/curriculum.py @@ -0,0 +1,56 @@ +from typing import ClassVar, Optional +from ..base_nodes import CCBaseNode + +class CurriculumBaseNode(CCBaseNode): + __primarylabel__: ClassVar[str] = '' + +class KeyStageNode(CurriculumBaseNode): + __primarylabel__: ClassVar[str] = 'KeyStage' + key_stage: str + name: str + +class KeyStageSyllabusNode(CurriculumBaseNode): + __primarylabel__: ClassVar[str] = 'KeyStageSyllabus' + id: str + name: str + key_stage: str + subject_name: str + +class SubjectNode(CurriculumBaseNode): + __primarylabel__: ClassVar[str] = 'Subject' + id: str + name: str + +class TopicNode(CurriculumBaseNode): + __primarylabel__: ClassVar[str] = 'Topic' + id: str + name: str + type: str + assessment_type: str + total_number_of_lessons_for_topic: str + +class TopicLessonNode(CurriculumBaseNode): + __primarylabel__: ClassVar[str] = 'TopicLesson' + id: str + name: str + type: str + length: Optional[str] = None + suggested_activities: Optional[str] = None + skills_learned: Optional[str] = None + weblinks: Optional[str] = None + +class LearningStatementNode(CurriculumBaseNode): + __primarylabel__: ClassVar[str] = 'LearningStatement' + id: str + name: str + type: str + +class ScienceLabNode(CurriculumBaseNode): + __primarylabel__: ClassVar[str] = 'ScienceLab' + id: str + name: str + summary: Optional[str] = None + requirements: Optional[str] = None + procedure: Optional[str] = None + safety: Optional[str] = None + weblinks: Optional[str] = None diff --git a/modules/database/schemas/nodes/schools/pastoral.py b/modules/database/schemas/nodes/schools/pastoral.py new file mode 100644 index 0000000..73eba63 --- /dev/null +++ b/modules/database/schemas/nodes/schools/pastoral.py @@ -0,0 +1,14 @@ +from typing import ClassVar, Optional +from ..base_nodes import CCBaseNode + +class YearGroupNode(CCBaseNode): + __primarylabel__: ClassVar[str] = 'YearGroup' + year_group: str + name: str + +class YearGroupSyllabusNode(CCBaseNode): + __primarylabel__: ClassVar[str] = 'YearGroupSyllabus' + id: str + name: str + year_group: str + subject_name: str diff --git a/modules/database/schemas/nodes/schools/schools.py b/modules/database/schemas/nodes/schools/schools.py new file mode 100644 index 0000000..0b94721 --- /dev/null +++ b/modules/database/schemas/nodes/schools/schools.py @@ -0,0 +1,60 @@ +from typing import ClassVar, Optional +from ..base_nodes import CCBaseNode + +class SchoolNode(CCBaseNode): + __primarylabel__: ClassVar[str] = 'School' + + # Core identification fields (required for all databases) + id: str # School's unique identifier within its type + school_type: str # e.g., 'development', 'state', 'private', etc. + name: str + website: str = 'unknown' + + # Public school fields (required for public database) + statutory_low_age: Optional[int] = None + statutory_high_age: Optional[int] = None + phase_of_education: Optional[str] = None + school_capacity: Optional[int] = None + religious_character: Optional[str] = None + ofsted_rating: Optional[str] = None + + # Private school fields (required for private database) + establishment_number: Optional[str] = None + establishment_name: Optional[str] = None + establishment_type: Optional[str] = None + establishment_status: Optional[str] = None + + @property + def database_id(self) -> str: + """Get the full database identifier for this school""" + return f"{self.school_type}.{self.id}" + + @property + def public_database_name(self) -> str: + """Get the public database name for this school""" + return "cc.institutes" + + @property + def private_database_name(self) -> str: + """Get the private database name for this school""" + return f"cc.institutes.{self.database_id}" + + @property + def curriculum_database_name(self) -> str: + """Get the curriculum database name for this school""" + return f"{self.private_database_name}.curriculum" + +class DepartmentNode(CCBaseNode): + __primarylabel__: ClassVar[str] = 'Department' + name: str + +class SubjectClassNode(CCBaseNode): + __primarylabel__: ClassVar[str] = 'SubjectClass' + name: Optional[str] = 'unknown' + year_group_id: str + subject_id: str + +class RoomNode(CCBaseNode): + __primarylabel__: ClassVar[str] = 'Room' + name: Optional[str] = 'unknown' + building_id: Optional[str] = 'unknown' diff --git a/modules/database/schemas/nodes/schools/timetable.py b/modules/database/schemas/nodes/schools/timetable.py new file mode 100644 index 0000000..165551f --- /dev/null +++ b/modules/database/schemas/nodes/schools/timetable.py @@ -0,0 +1,88 @@ +import datetime +from typing import ClassVar +from ..base_nodes import CCBaseNode + +class SchoolTimetableNode(CCBaseNode): + __primarylabel__: ClassVar[str] = 'SchoolTimetable' + school_timetable_id: str + start_date: datetime.date + end_date: datetime.date + +class AcademicYearNode(CCBaseNode): + __primarylabel__: ClassVar[str] = 'AcademicYear' + year: str + +class AcademicTermNode(CCBaseNode): + __primarylabel__: ClassVar[str] = 'AcademicTerm' + term_name: str + term_number: str + start_date: datetime.date + end_date: datetime.date + +class AcademicTermBreakNode(CCBaseNode): + __primarylabel__: ClassVar[str] = 'AcademicTermBreak' + term_break_name: str + start_date: datetime.date + end_date: datetime.date + +class AcademicWeekNode(CCBaseNode): + __primarylabel__: ClassVar[str] = 'AcademicWeek' + academic_week_number: str + start_date: datetime.date + week_type: str + +class HolidayWeekNode(CCBaseNode): + __primarylabel__: ClassVar[str] = 'HolidayWeek' + start_date: datetime.date + +class AcademicDayNode(CCBaseNode): + __primarylabel__: ClassVar[str] = 'AcademicDay' + academic_day: str + date: datetime.date + day_of_week: str + day_type: str + +class OffTimetableDayNode(CCBaseNode): + __primarylabel__: ClassVar[str] = 'OffTimetableDay' + date: datetime.date + day_of_week: str + +class StaffDayNode(CCBaseNode): + __primarylabel__: ClassVar[str] = 'StaffDay' + date: datetime.date + day_of_week: str + +class HolidayDayNode(CCBaseNode): + __primarylabel__: ClassVar[str] = 'HolidayDay' + date: datetime.date + day_of_week: str + +class AcademicPeriodNode(CCBaseNode): + __primarylabel__: ClassVar[str] = 'AcademicPeriod' + name: str + date: datetime.date + start_time: datetime.datetime + end_time: datetime.datetime + period_code: str + +class RegistrationPeriodNode(CCBaseNode): + __primarylabel__: ClassVar[str] = 'RegistrationPeriod' + name: str + date: datetime.date + start_time: datetime.datetime + end_time: datetime.datetime + period_code: str + +class BreakPeriodNode(CCBaseNode): + __primarylabel__: ClassVar[str] = 'BreakPeriod' + name: str + date: datetime.date + start_time: datetime.datetime + end_time: datetime.datetime + +class OffTimetablePeriodNode(CCBaseNode): + __primarylabel__: ClassVar[str] = 'OffTimetablePeriod' + name: str + date: datetime.date + start_time: datetime.datetime + end_time: datetime.datetime diff --git a/modules/database/schemas/nodes/structures/__init__.py b/modules/database/schemas/nodes/structures/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/modules/database/schemas/nodes/structures/__pycache__/__init__.cpython-311.pyc b/modules/database/schemas/nodes/structures/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2548b296eb18c86fc30b96f86f0b54840166f2eb GIT binary patch literal 167 zcmZ3^%ge<81b?*LGeGoX5CH>>P{wCAAY(d13PUi1CZpd1UVaKtxVWUKG`Xa-2*`|&&&fgc5Z#TPkETtVG%W=xAt3}PJ&;q=rmc`5NEI9^qyQ4RthQN~1ldkl+lSsb z@B=s?HNOB<@n@1-AwOXTS4~%30=Q&^ ziz_Y#++2i9C@u}$e1uCXZUMMVgi9%I5xAuYH>bEPaJdMV7Ryyq$e&}`1?s0NCU=~7 zT%JQq(2=fGo^!`IXbGbpNDFYNw7&uOC&VB%Do8E%7CKea4Bd#|xsEmxBDM#2LW3vi z{@M$p&82G@wp(?jS9d+B();-dgr8-sEt?jX$0k2COvVmQlYWXZn_C8Bews0>B|H=D z1;##k+zc2w2Tzn(rLQ@z^p_apw%u~M+ickmW2dB#1zwelyxlGaIh>;4E&|&r;1AHF&ojuy^>MLIx9p{_X)xqBFDFj32 zhAU^(($&}8aa)p`;fCfSZq=0oi5p*L5mY71Xsr$b6**Bg?qK9NbY5ZP4n__rh`f2u x66PF-P8xHTFz0}RoLd+<4xPIgxrLDf3L?uGIS!p2j4Wg1fVz3)^&0gy{{dgt>Bay6 literal 0 HcmV?d00001 diff --git a/modules/database/schemas/nodes/structures/__pycache__/users.cpython-311.pyc b/modules/database/schemas/nodes/structures/__pycache__/users.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c58ac1746b800932d7cee5a949cf26fc2cd2cf27 GIT binary patch literal 931 zcmb_bzi-n(6n`xeOdQ0O`F4*--8m7vLK%J0h>P`Dkn2ur*}s5ZW7;_O1)zZ6CdGO31E&f-#i(ZT&GD2SMZ$T`C7B3F5;vHRCs`O?|Lopdph zS3P)@={HIr7P=f3rLLu`t+m5yoAX?c6QL)uI8ia@gY#z9;ye|J;=BqtPcm7?#P4$c zwiL0o=nagdDZ9!wg|4e5X#164O!9I1 z+V(%7j`F&bnl7+m@s&mMWMo9YsO10Jd2wEzGB literal 0 HcmV?d00001 diff --git a/modules/database/schemas/nodes/structures/__pycache__/workers.cpython-311.pyc b/modules/database/schemas/nodes/structures/__pycache__/workers.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..584d03079994778e07e08ccf6a7a02bb5bc59691 GIT binary patch literal 697 zcmZ`#J#Q015S_hSUrrVg0f7V(9RlPOTn&n%1Q+R?B78{Kj5gjCw%ENpcF#iYQsf7u zKnf)l2=N#A5l&}qOO?*ZR1pQUcNl?`%C zrLaETuj+AG2z?%f6!YDF|Cw-VP)apyi(6dvT5eK&3JP*2A&*{=o;+4ub?*MXtr8h+ zQ6yuU$^E@orG2C9^RZF2IMnK(wv%B!vCRyB=c=sVK&MMKs|~GuH%P!{v`to5?M7ft>P{wCAAY(d13PUi1CZpd1UVaKtxIDioJGH1-KR!M)FS8^*Uaz3?7l#c* dlU)%j&>WCW#r#0x12ZEd;|B&9QN#=s0|1!=Cffi2 literal 0 HcmV?d00001 diff --git a/modules/database/schemas/nodes/workers/__pycache__/timetable.cpython-311.pyc b/modules/database/schemas/nodes/workers/__pycache__/timetable.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca4a8ef7b7adf9b8ebe081827466d6334b5bfdf2 GIT binary patch literal 4779 zcmcIn%}*Ow5Z|?*@nSGGwgD49@&QD3n#2i&1_6!Q(l$*(AreVj`LbHPPr=k*eYdB3bb0w1%3aVHXa`-<`6ib0zpcKpnOC(21pVV{3-&W!+<_Hl!%xFKXlUt%cMGQ^fv zii)OvqcB@quj++LSt;6NwV>&C=wTUdUk1Q1BifObmCqE7u2oc;cf#mkGpdIRaQ|GO zLQYhLT;QQVgWIHONJFZ)3^yKK0Cj2*#zX9pFUopB-+53dQC-vMUqSlHi_sjARHKph>5V3>Y8sOgL)@HUCSJsLu3qzSzsXmbD^!MS+TAgQNY4ec331>~D1xoM4#8w8ul z5d^0{?CR7blzKoFNHOaSQQWKLuG%TxG46~D8$%yGeovwf0Yi4^_j{quZ;%&EvS6LT zN#e{CM{xYcUQXTb^g|7t?&f={8{_ytT7!q=lLui6gMcvDJqXKfK>&H#B+J&>3kJbv zaspEU?JlOqUDKCzcm_kLuf2A+3GXR-_7_@CDBkrO8q z4-|%gGqXzsmf9i!@{&oGtjY5R!DeyI@@r!D;&25_35wp^+B8q6;;l|LAsWSy!Ak2N5R4X24~lJ|^Ze13o71GBIG{?QiNRzXn~a z!DFowu2te#tE6j{Jk~1ZSiw{uvIp-Mp{Av3+eD9csQ5JJlaMVz*cd*`K1Nssup>KE zVe%tZsa5T;yB6&J<~fgZ-Hui96@~I68H#bermfi#y;3dY`ATTYSaREaMZVk|qItua zbP-VuZx z&9i$5s|a5sc#6DFP={~@e%d`)E}d(4zHK7~dEO-R|82cm?JGW>tgqMCAFo@{czw0L z`gqk!3>gHQNrtSUv_Y_$ByF9WuHStsHIn!NG7Zfn(_MAvXX^K!rW;ewp!%GFW|A4J zo9+fws^g8VUH!$%-p>Byb*Nk2(lt8=8&D&?JH4yzW%fre8w3<{CYiJ5psF8he7CE< znAT*(#ICLQRp>gRIYF{5w@q{>cAo!sXd4<~7T_`>u{{@1?N-O{X literal 0 HcmV?d00001 diff --git a/modules/database/schemas/nodes/workers/__pycache__/workers.cpython-311.pyc b/modules/database/schemas/nodes/workers/__pycache__/workers.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a04be64a06f5d69711bbc0b5e877ffbba0455eca GIT binary patch literal 1717 zcmb_bJ8u&~5Z=8z+h;qr1BxIh1q~ufid+&$R1p#nDV+<>#*HWc(FI*=K-#YRXVkFQ}eiz7( zLOypwQ46>@NOUGRmOWet|Ck73Q%-E{4TNv&!VsAUm!n0NYrEia9kw&#O8uY_1nx8L zHGNz*E>3mCi;T5o({tpZ>+B1cvD!&4HW~9BPcRl281n+&cF|s7>{Huu6GrA?2Z^d; zJ&a^rVa)OUAabH+;D?NzkRb}Xcw#xNmX)j#THJ}8eF)DA4;sRALdyq1q4h<@efi&L z9m*UokAU|bt^yoQz5U14uCdfKTa8k~MJpZ7HuuZ7%#MQ9g36QNE1I5sGNsLr`I1 z*L+Dk!2Dk_iVUQsuF}$gw9Le%m*TTl5m%WXcbr-C(3fmj@&bo!S}po=+%~(kkwL6*}*6_bTpwl~OnG567Hy9RL6T literal 0 HcmV?d00001 diff --git a/modules/database/schemas/nodes/workers/timetable.py b/modules/database/schemas/nodes/workers/timetable.py new file mode 100644 index 0000000..819d66a --- /dev/null +++ b/modules/database/schemas/nodes/workers/timetable.py @@ -0,0 +1,63 @@ +import datetime +from typing import ClassVar, Optional, List, Union +from ..base_nodes import CCBaseNode + +class EntityTimetableBaseNode(CCBaseNode): + start_date: datetime.date + end_date: datetime.date + +class WorkerTimetableNode(EntityTimetableBaseNode): + __primarylabel__: ClassVar[str] = 'WorkerTimetable' + worker_timetable_id: str + +class TeacherTimetableNode(EntityTimetableBaseNode): + __primarylabel__: ClassVar[str] = 'TeacherTimetable' + teacher_timetable_id: str + +class UserTeacherTimetableNode(EntityTimetableBaseNode): + __primarylabel__: ClassVar[str] = 'UserTeacherTimetable' + user_teacher_timetable_id: str + +class StudentTimetableNode(EntityTimetableBaseNode): + __primarylabel__: ClassVar[str] = 'StudentTimetable' + student_timetable_id: str + +class SchoolAdminTimetableNode(EntityTimetableBaseNode): + __primarylabel__: ClassVar[str] = 'SchoolAdminTimetable' + school_admin_timetable_id: str + +class DeveloperTimetableNode(EntityTimetableBaseNode): + __primarylabel__: ClassVar[str] = 'DeveloperTimetable' + developer_timetable_id: str + +class SuperAdminTimetableNode(EntityTimetableBaseNode): + __primarylabel__: ClassVar[str] = 'SuperAdminTimetable' + super_admin_timetable_id: str + +class TimetableLessonNode(CCBaseNode): + __primarylabel__: ClassVar[str] = 'TimetableLesson' + subject_class: str + date: datetime.date + start_time: datetime.time + end_time: datetime.time + period_code: str + +class PlannedLessonNode(CCBaseNode): + __primarylabel__: ClassVar[str] = 'PlannedLesson' + date: datetime.date + start_time: datetime.time + end_time: datetime.time + period_code: str + subject_class: str + year_group: str + subject: str + teacher_code: str + planning_status: str + topic_code: Optional[str] = None + topic_name: Optional[str] = None + lesson_code: Optional[str] = None + lesson_name: Optional[str] = None + learning_statement_codes: Optional[List[str]] = None + learning_statements: Optional[List[str]] = None + learning_resource_codes: Optional[List[str]] = None + learning_resources: Optional[List[str]] = None \ No newline at end of file diff --git a/modules/database/schemas/nodes/workers/workers.py b/modules/database/schemas/nodes/workers/workers.py new file mode 100644 index 0000000..9b87d5e --- /dev/null +++ b/modules/database/schemas/nodes/workers/workers.py @@ -0,0 +1,19 @@ +import datetime +from typing import ClassVar +from ..base_nodes import WorkerBaseNode + +class SchoolAdminNode(WorkerBaseNode): + __primarylabel__: ClassVar[str] = 'SchoolAdmin' + +class TeacherNode(WorkerBaseNode): + __primarylabel__: ClassVar[str] = 'Teacher' + +class StudentNode(WorkerBaseNode): + __primarylabel__: ClassVar[str] = 'Student' + +class DeveloperNode(WorkerBaseNode): + __primarylabel__: ClassVar[str] = 'Developer' + developer_role: str # To distinguish between admin/developer roles + +class SuperAdminNode(WorkerBaseNode): + __primarylabel__: ClassVar[str] = 'SuperAdmin' diff --git a/modules/database/schemas/owners.py b/modules/database/schemas/owners.py new file mode 100644 index 0000000..48b4ab6 --- /dev/null +++ b/modules/database/schemas/owners.py @@ -0,0 +1,29 @@ +from typing import Union +import modules.database.schemas.nodes.users as user_schemas +import modules.database.schemas.nodes.workers.workers as worker_schemas +import modules.database.schemas.nodes.schools.schools as school_schemas + +user_owners = Union[ + user_schemas.UserNode +] + +worker_owners = Union[ + worker_schemas.TeacherNode, + worker_schemas.StudentNode, + worker_schemas.SchoolAdminNode, + worker_schemas.DeveloperNode, + worker_schemas.SuperAdminNode, +] + +school_owners = Union[ + school_schemas.SchoolNode, + school_schemas.DepartmentNode, + school_schemas.SubjectClassNode, + school_schemas.RoomNode, +] + +owners = Union[ + user_owners, + worker_owners, + school_owners, +] \ No newline at end of file diff --git a/modules/database/schemas/relationships/__init__.py b/modules/database/schemas/relationships/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/modules/database/schemas/relationships/__pycache__/__init__.cpython-311.pyc b/modules/database/schemas/relationships/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9e6c53f3204748f71576bbc1bf28af3cab87a438 GIT binary patch literal 164 zcmZ3^%ge<81b?*LGeGoX5CH>>P{wCAAY(d13PUi1CZpd1QEE(=^=-lT1EXwD)q9Kda&NLr{0L@3H8vKw;veWheSxMpNEZ+A#W$Rgm zB*-=~>CePWvh=SiA-}^ncUmv%*)gmD;aD7p zjuWA}9v4MjH*DMS0xlqWs$p2nHVv-3jV5auu9&KX9;~nCnCvaN#5cTpRyNx0a|5qNY*)3nEWiLC-ZZNIgMdGgzTE{2Q z$fGErh`Yom(JZ2v0wJcOX2|T=4gL{=@{MOu`#2Jq(jDb=eSlNY*L!qblBoFhqXTG;YCXJlvRi9G!DWCkmvW-$x<2M%NuPQP?!P zArYX7;^xL_Oath*V4)aI733X9!ee}G6!`vQW@>d{ra)iq(N#G_OFqTbqf0|(;18I@ zym!px?D2VvRhk_;8m!nBpC0e-SM|!yi`w;!UAu0<@%@P7c&~9xe~wI}_+&iOy8}#v zzT2a_lG`KqL>elY%MynweZN+Y&cI`Ejp@Qk%=NiI=T&#GDc+M zpx|6u9?9uBj^%1LgA>uQoU^Wmm&4$lz*Q&*uCH$U+&+_6Qg9#015EzxaU-J^=P>`x8ATLx!QTn9fzxV2s1OMjglR5w9x=5*tc0opk|KQ7a=>GQ_%c)8k xLx+X`a2`X;7#d;_`Tm~~kAGhblV5@roC$hv}|!@~dUD-2!1&|ypt$N$HnMLqxk literal 0 HcmV?d00001 diff --git a/modules/database/schemas/relationships/__pycache__/calendar_timetable_rels.cpython-311.pyc b/modules/database/schemas/relationships/__pycache__/calendar_timetable_rels.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b157b6bb41e288b485740bb0c0970d61102cb88 GIT binary patch literal 8399 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 literal 0 HcmV?d00001 diff --git a/modules/database/schemas/relationships/__pycache__/curriculum_relationships.cpython-311.pyc b/modules/database/schemas/relationships/__pycache__/curriculum_relationships.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ef1b58d393846796db445326b80538f4139b46f8 GIT binary patch literal 10548 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 K$4;dW%l`mVBH~N{ literal 0 HcmV?d00001 diff --git a/modules/database/schemas/relationships/__pycache__/entity_curriculum_rels.cpython-311.pyc b/modules/database/schemas/relationships/__pycache__/entity_curriculum_rels.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5d9b188885109c844ddbc840b5a93619e5119a9c GIT binary patch literal 1654 zcmcgry>HV%6hFt#N7JMqs4d}ZKxH76a8z2DDx@ZjTBLp{X&ADcOnhonId-_ShinY| z4`o1z2?YEzj?^K#35kiVsIXKF+&kMz+C)NKu%CZ^Uw-%Q-Or!0*)$T@pQX*CFENC^ zgArZvP&t1uloMnkQ?XD>sVfTTF)P+m>#EdMOKZg&F$J{}5|a{B0oEtNob;HS$uK9Q zpcvXjruGJzaiV@y5&9~g;Hqb3EFogak=T@}R#86n15)z}Pn9f#u@?pv`b^Paq(Usi zZ8|nPYPNS9VMY0h>YrDHd4dS4D<-PPYGR*tm1rb>tDj90W^7GZBzc^QoWiF{-^8(; zA^3$)1D_ceJtg?vYU9XptSy6;JW87l&+=MTmwFA?qlD+S)~mQwt5lwsYTLCPTs^4N zN(Z${na^QNhuU^KZGtgRFvp_}!V|7R4~e^*pX4cwZKDOjG{!B*^eoUb7{BriD~M2N zn8IGU%3R8)F*a=5af6{iHj_7eCZVer{7B0dXRX8h)ujX>^abS_pv7v+M{ zZWn@1Siv-0uLr6qwThGXS#yHw5tck>%j9 z=o}=-SuB8-ivVhmnRan#+CndOwc@yGulO2BSE5jY6`**2T9CHWZrX1cT2TENeIWLrz>I$jI8zlx>7hIRW$B?k|FV2TW&irp qLp%QUQe7mctLJ}Q57CAamh zhyDS*rH3ARYSZ@8KO@tVG~K*&>)CwW091tBXG0@;9o{eT`Uh&kX3Ax?X;J??mK z$9R~dec6bM_WPg`myxmquFRm1Oq9z+vqP@T@GE6v*)y)ph>y%!*UmXE6V%Ta;@P-B z0%V2c#cxPHq{V*>67nm2oF_ZVu^zyByRZu!3j@~IgZB1)R0huI5{=_XM0xZ0&tA_EZN?B;PcvvcKB?LCKq#D|e zrmH3l7zc;toa+GoPjoxSUjg%!Xe2A-Nj9(xiIELzq81u$N^3p&zykEN-XlmW=Yg>x zAM4X1NBzyw$dS~>4>b5E!47L8YUV?*fgTpyH8i?r$hm`3Nql&|Q>ON#P& zMb#aI_QC8F(}4vIld`CysKsK*bo_*x6iXXz*2M=lfL9Dbit^z>cxEF zu!u6OKclI+14n`N%Vs676-`8bCdZ&oUM|n6 zY53dOS}ggSRJ*bIe75#*&x-BUq?{#UvpEHZ#v3zrq)wxfj&*?lkJNb*I5AzShN%_W z)8(<8NpHI8;zSs|LoqeC5(5;|l43s6K_tx-pi%4&AsI#zLxQ2EXMnJQl=g+Dm&$HP z2jvQ|&3M!ED9D|J3#Jzv1dSRyKu#H$*=Kq!xn{-IYSKeX#Ab5}j58h1^!72)!bj)` z{s7P49@z2t-zoGq9E!iagwLjVqAr1>iu*>UtmF=WTHw3uC$#n|Zccn@w4}*_;C7gaaq>4+kc}+muKvC?2PedYqop$|^Mr;0rnlbDqxQmr-*H z2$NjjI;Y@Z%Q`;`J$e5=sv*HDFw#Ie^WN9d9nP#v@tSna60zBw0^|4=?Y?8*jyV~; zsv50*%OS?ySRyu?Q(&Axpxt*I zhzXy4cSMB^b_U~gA-IliOCrHw&}k%|6u*IENU%D5JbSOrv%uf8#d{uC{zrI+qRQ zDwH1PDte{hUZqC7)BC0OZ43eujF3+d9<&7k_y@N5z~lA0G***tS|T=^Q(&C*M!WAg z2=T5U$d$b#EoZW5!}s#;(!=y}<}Dpg@4)8ZLh4xebM0Laph&P5d|Z3K&9%Vax5fK@ zuAR0-Y&NIBIIcyziAlJoSIdXReSYk)W{7 zRs5){vM!)XQvg)1;v`;Tjm_c&S5er-Ky(^Ky~LWhfuhqW>S7=|kD^{;P2EP(c@%ZA pS6aRHp^w#DXw^%s>ANU;3$3~sSWTd)mssO-D4IY~FUHTge*uu(sHgw{ literal 0 HcmV?d00001 diff --git a/modules/database/schemas/relationships/__pycache__/entity_timetable_rels.cpython-311.pyc b/modules/database/schemas/relationships/__pycache__/entity_timetable_rels.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b6a5f35cfd4a45d7e907b24af275b39152d20f2d GIT binary patch literal 2207 zcmbVNPj4GV6rc63?Tx*z9jBBOB7|BHI1=knPLV253Ra7NAk|4LwyIWJ?~vH+A9rRg zYKa4fegF6<3ovzwsauT{v$_D2#A#Y#Aj z`x&zS4Zg{+E=gMnY~?eymtD0>TKb;|Z54$6q33XZ$6=zlAN0eZrHIB2htu2Cb0S#t z!~Sr$mj;%Pyr7R^`GinnDK4=J`%qX*r5Y_>&e62w7OumJmZ?5i$+l@_P@U0@T(1o- zWcrudTohGCsSg^N9U^PE=N2KEl4y29eJo5w*7GAc!`B!E)44} zR30%=w{0f~!YHX29HgPCGUAlkLFiI0^nK8GK^4Z=A^R%dukKN&cbJ;0-Du>}AWCq& zcNm6V>fh*&9t>zNlHHQ_Mj9u|6JEP3Bj*)B*stUSUWGjSsO=1g?IauCb{!}YG`S6D zP~YM0*~;)XyaE){&Ld;txH%lNGK7)>^XKZP>#>Ci)HJnFMg2Gm!Jsxo9RtD!*do)UxA zafy6omq3V05;AFB+SsJ)g6jLbVAmMH%E#JC!3IFGce|5IcP z-dcxiFdp`U14-?K#Me^Jm>Flx2w2I@fQCU7df~y?L?+D=h~Y1Uc;k#CWQ}Aq1H2I? zUJkeySy)j{&7vsnq9_4u6=RvtiIrRhZl+IBP8GJcjCaxvZl+K9CYWQ=xUD76K5gbo zuCjGJ|9KIz^H1Gg2e;(1$)?W};hBCtd8PN+7U1AtjqvY59;=F?Ov#ma(VUXciR=ZkuM5|eY!>G@sYlw(a*-aRH~MSQvS7jFN3YBSEFq~`)??j*18zv)71 Ak^lez literal 0 HcmV?d00001 diff --git a/modules/database/schemas/relationships/__pycache__/owner_relationships.cpython-311.pyc b/modules/database/schemas/relationships/__pycache__/owner_relationships.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3139b32b9504724f29610ad5062a14452004c023 GIT binary patch literal 1118 zcma)5&1(}u6rcS}(r#@0tOdc~#iq~==)oL{(8kgpB!!fE*vl|xhoogc;>-rg&4d3# zJt%lm#Iyg$7J69b>d9Lqo{9(G>_y!U%AZ+`Cw`?*?OLU4X>>gAJ zT>UL_4O;!AA@mjA>^Rq4^$<18A2MyIqTKcf=Pw8o#!+w_2Azf?YCD9}F7-$R03RF= zd-n ziQ2*IfUbSAuf z7u=h8K*3PYZtV=u7>xp&m+-k(Sw6oMh!0r@t8!I5% zcz7K2Qz4iR1+ku!whPjBPTCG&KW-QMb5SljM5$28NP9$O*2HegnfL!XGgFn_kd&^= z)<>6GqcHTi9ndg{LNDx(ZK>qESWJFanOe7Hlxx>s)*tC|KEwb3 literal 0 HcmV?d00001 diff --git a/modules/database/schemas/relationships/__pycache__/planning_relationships.cpython-311.pyc b/modules/database/schemas/relationships/__pycache__/planning_relationships.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e2414626f415d111922f7ec7a4a3622fcf6e37df GIT binary patch literal 4325 zcmcIn&2Jk;6d&6Y$8nqw=evcpNlHRowGIM-(#mb*ByRd)>?F2ny9ZX=?2sCEy=K=@ zl^X{x`~~H}ffESv&&*0aSbOEft*D$Tka%x)ZSSrfwTh@S`}3Rmy&cc|-h90LIyROh z@cHNJ-qRlvg#3Y(&S%IoUfqun@|>tdjc7!VND)0MMI%^`YB8NkRM;_XNRLZ#eOMY6 zb*d%w5ottEN=bcG8Wn9rT1p?2#)KW$#`OtlLfFIFq@I@25fUYPL`{58)DcF1i4pQU zJnl!D5?m6v(LQcka4F!%`nVavjRQB)$IS|E61a39Hz&9$;HLYydBM#9H`~W82yPCz z`9AJ~x=DJs+J zNBhjI8*0f=nKO6Dj_X#-6n?$-Ow5_7GUezgGplu-wUj3s6aLfPYLQu%(GZR4eNAaJ znA&TC5sZ58qX!PCa`NPBcGMC>_1b11GsWC9jgw~ORMV6vCl(S%UZliVCvLAwP<>7q zks>OQqBU4UQjAeHbfN3b;%YPpH8u=ZOjrpv!jfM_13nZPbqMr}JC{PU*=Cy2IJT;W ztAw*qEL1AxlDu6gmP>mTxmuR@3y1g0yUvU(n?7}0r%fiyPTVq1%p>N+TZ(ziTBXdW zlaS?xq9d7zsnUYt!9!>N2NTYLdhhc>HNRaf$X-q(bX@F8@ z#GJv(EW#W@H&o_4Ru>RNc<}f$aiO`heGje04vd3gZ2<&TE&EgjyKK{PP}N0FvDgB^ zaQnt?-=UJz-o^z5yP7())k1#fZsAZy(Yi{WPp?sw1uls`y_T>I0mUDnSKg-=*m;}g z+o^d@vDkFJom%1)i!BfgS1;`G9qN_tssxIOa}mpw*U7E3mh0y5-lWoqC^BEVe)}T&=Ljcc|64&3I zel?%;VApI~6W7Qp|8SE}ZN5m|;1r8ZZ=BWcI=CUhUm6^eb6qc(L--|M4qPUl;DI)0 zHF%fE9kGMWeG5GCHc}6|U9Q25O@wuL2CVG^pTJ-r*z};C>fI=Q+r4I7A+g8*QOHC{ z$Tfc+*v+^45<%x$rM7*)uv3-Y6T+8)Juc)A<-NmlZC|cDE*A6KwR4`W;?x*J6+@@S z2DTwwhi8DYk9^94{m7<|f~UqZr&w%(V7SU+kEP5-$PQ1NkcEkiPo#Cu$6f-L?Idv7 zmSJdCw!w@>%g~JD(=4WS{%p>~|Eipi`d;)hzib0CX)6mg(NU|D#P>4DH@^GKFu!4@ zmF>MNE~D;-cd~Ez@lFTcw~6=u8(->-*!wmyNKPlg?ddaknoY%O8K$C{BC43rx;fYq zT2~Ong&>Y5T<0Rlq3FL(x-O%u$ARl2x`u%-tfT89x_TVAE}?4}`0OgWE}^T(f$L3l4FkWHL)V+=>T#*= fsG-d_H@?1!uAynIV6S1|*KeWg3icZ2#0LHk6b1QF literal 0 HcmV?d00001 diff --git a/modules/database/schemas/relationships/__pycache__/timetables.cpython-311.pyc b/modules/database/schemas/relationships/__pycache__/timetables.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..28b54d19fbd0b3df9218781db144fbd7f40c2179 GIT binary patch literal 26231 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 literal 0 HcmV?d00001 diff --git a/modules/database/schemas/relationships/structures/__pycache__/schools.cpython-311.pyc b/modules/database/schemas/relationships/structures/__pycache__/schools.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ebe388c686a86d8dc966109f1f998ff5e4a115c7 GIT binary patch literal 4702 zcmc&&OK;mo5GJM7!?OH#90zGqwn>`Ub*Vhi25Iw>9K|-;D1asBpbJ5ZYg?&As!Ixi zd`f}-hxAaOJ*6o6XDA>Cf!CgTQ;?j39y+t6C`zIeJ8fWjIa=<_&OW|*$-hrbqy+f< zv%I#q4ZXkcrT2+>omZQpAUqQ^p)6>k7O9E#NI4>6KU#~{Nty6Ism1E?3XInioF+LP zb7?u{$&81{q&=AlPi8ViW{S&9m8V4^BCH8o>?c8sQ}R422!F!ke#$ePmjGUJgg481 zW57#|@a8yg9C+yw-aO|`0B>@HcY^b#fHytDTj0DI;LVQkPHLnmEY0mdPp#He(`1HG zUo{%lnqf&ri#01&lTm4t)>Nx%=;mIvVWvuZRa2@PTC+wajqX%+YD(4~l~_={PQlvG`lOkbmJXw+OusiyRV)@l-b_vEQ=Rjn$h44ELO{>JNF5}hR9?IV>z ze>$g{G`Ph=#Y2IA^)Pw$2wtBFR49vJKanl4nsQW&lnIT|_$hw|O=!`Z@J5r5$9jV> zM)+9j@pxb?hGSYB?l0k-Eb?=%t7g$scXs@{+y5rGGyjyTcQ5>uRm+5{fmuTrBs+8K z*`iV`W$)hyy1BJl+S<%J^NJF@YOB?tisHmgqsc1NiCZe$rB-1n?IaaNSL?`3DT)gi z^wWy+LsPAJoP?riMg=q`;VcaA%83F@&Xl64x^7r5?l{c_QsKxsDfhSqfYF)pI6k_j zGdp+*DE5c&3a{=>HlsEg8Fx2kMpG?y8{o@;4q8{uOz>o8rmqqO(2nFri^XxPNT%R1 zzXkF%@Yf-Eo8&vocWkow^QGUe{qluPpns=L?sU?NFVg31f~`%?b<$^Eq%Ye9Tbonp zu!WxXW3ZxA?zM6&YHHvLeLK2!SUckLMl9)sYe`%8@`Y00mR!`)&KU+@FdBvi&eBLG zkW3=+ZG+*BvuPwVNM@1D0deMw*5HN_b9Msx{6bG+550^N90~z$%_eJ|liICkFeTvK7FH8~chxt%|(FgE&O=f$S!8g*;b6x>TiIs#8|2 z3}i`2o2n&MR2}ky)HJCk?HCNSwR#I;Yz$jYMO~u7D&de4Z5paNo7b-8Q+~NzXnlJT3fK@H_bG`X;Ik z2l#`g=5xhngEH=wKJddPzki^Y;#|)&u_D1jXVg_?_9>k0{iCUqb}h@xu9N*8b6>;= z%RWXj6i_eV7?KP;2YMwy<7Yx2Cdh;rZGx>$F7iwm9#B#HF@ScqL{%sWn2*?CMX`T9 z+*KvZoyJ`fu^OtY{wq-IGq?_C+}m6qoOu`?24@M!kbDJC2soJAI?D%vbKWM{+T{FO z$`sUo4B)^|10MeZ;0z}J{Tm0s;|0zDJbYq5cK%NQc^m8lbQ-}J@}3nOLvjnA5P()~ zvU+HM!o3HzFD>#a3M%tfqpI(^MfO#%0+xFfux#=2R;Pw;88u_KC1YL80>7yk0cDOn zGSMrYWgUN0$-O$+`*xDO1)PK@=)|}rf5$a>Dd${ym)>4>^OtZ^e#SH1BJf>%bAy~I zd*4pN>u|4f%X(fSVkN+n5RYx#hd53{0KQ4ybT@sQ-GCYJuK~fFj0i$EDvDy45Rr5R zBxynX$QDiqTSs_k54Mhww~yXB!UOy0?fus3#))_ZPc%&Iv+_$Ee%}4ij6t zjH1_2)Z-mRG$GD)g;8REoOy}Eulu|OUw?lk?Agm-hiqW@MEsQYg)a|%tc%x&wff8Q G+T&mBY@^u# literal 0 HcmV?d00001 diff --git a/modules/database/schemas/relationships/structures/schools.py b/modules/database/schemas/relationships/structures/schools.py new file mode 100644 index 0000000..2e90f15 --- /dev/null +++ b/modules/database/schemas/relationships/structures/schools.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python3 +""" +ClassroomCopilot Structure Relationships +This module defines the relationships between schools and structure nodes, +as well as between entities and structure nodes. +""" + +from typing import ClassVar +from modules.database.tools.neontology.baserelationship import BaseRelationship +import modules.database.schemas.nodes.schools.schools as school_nodes +import modules.database.schemas.nodes.structures.schools as school_structures +import modules.database.schemas.nodes.workers.workers as worker_nodes + + +class SchoolHasStaffStructure(BaseRelationship): + """Relationship between a school and its staff structure node.""" + __relationshiptype__: ClassVar[str] = 'HAS_STAFF_STRUCTURE' + source: school_nodes.SchoolNode + target: school_structures.StaffStructureNode + + +class SchoolHasStudentStructure(BaseRelationship): + """Relationship between a school and its student structure node.""" + __relationshiptype__: ClassVar[str] = 'HAS_STUDENT_STRUCTURE' + source: school_nodes.SchoolNode + target: school_structures.StudentStructureNode + + +class SchoolHasITAdminStructure(BaseRelationship): + """Relationship between a school and its IT admin structure node.""" + __relationshiptype__: ClassVar[str] = 'HAS_IT_ADMIN_STRUCTURE' + source: school_nodes.SchoolNode + target: school_structures.ITAdminStructureNode + + +class EntityBelongsToStructure(BaseRelationship): + """ + Relationship between an entity (worker, student, etc.) and a structure node. + This is a generic relationship that can be used for any entity type. + """ + __relationshiptype__: ClassVar[str] = 'BELONGS_TO_STRUCTURE' + source: object # Generic source type to allow any entity + target: object # Generic target type to allow any structure + + +# Specific entity-to-structure relationships +class SuperAdminBelongsToITAdminStructure(BaseRelationship): + """Relationship between a super admin and the IT admin structure.""" + __relationshiptype__: ClassVar[str] = 'BELONGS_TO_STRUCTURE' + source: worker_nodes.SuperAdminNode + target: school_structures.ITAdminStructureNode + + +class TeacherBelongsToStaffStructure(BaseRelationship): + """Relationship between a teacher and the staff structure.""" + __relationshiptype__: ClassVar[str] = 'BELONGS_TO_STRUCTURE' + source: worker_nodes.TeacherNode + target: school_structures.StaffStructureNode + + +class StudentBelongsToStudentStructure(BaseRelationship): + """Relationship between a student and the student structure.""" + __relationshiptype__: ClassVar[str] = 'BELONGS_TO_STRUCTURE' + source: worker_nodes.StudentNode + target: school_structures.StudentStructureNode diff --git a/modules/database/schemas/relationships/timetables.py b/modules/database/schemas/relationships/timetables.py new file mode 100644 index 0000000..d6b5208 --- /dev/null +++ b/modules/database/schemas/relationships/timetables.py @@ -0,0 +1,305 @@ +import modules.database.schemas.nodes.schools.timetable as neo_timetable +from modules.database.tools.neontology.baserelationship import BaseRelationship +from typing import ClassVar + +# Timetable hierarchy structure relationships +class AcademicTimetableHasAcademicYear(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'ACADEMIC_TIMETABLE_HAS_ACADEMIC_YEAR' + source: neo_timetable.SchoolTimetableNode + target: neo_timetable.AcademicYearNode + +class AcademicYearHasAcademicTerm(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'ACADEMIC_YEAR_HAS_ACADEMIC_TERM' + source: neo_timetable.AcademicYearNode + target: neo_timetable.AcademicTermNode + +class AcademicYearHasAcademicTermBreak(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'ACADEMIC_YEAR_HAS_ACADEMIC_TERM_BREAK' + source: neo_timetable.AcademicYearNode + target: neo_timetable.AcademicTermBreakNode + +class AcademicYearHasAcademicWeek(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'ACADEMIC_YEAR_HAS_ACADEMIC_WEEK' + source: neo_timetable.AcademicYearNode + target: neo_timetable.AcademicWeekNode + +class AcademicYearHasHolidayWeek(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'ACADEMIC_YEAR_HAS_HOLIDAY_WEEK' + source: neo_timetable.AcademicYearNode + target: neo_timetable.HolidayWeekNode + +class AcademicTermHasAcademicWeek(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'ACADEMIC_TERM_HAS_ACADEMIC_WEEK' + source: neo_timetable.AcademicTermNode + target: neo_timetable.AcademicWeekNode + +class AcademicTermBreakHasHolidayWeek(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'ACADEMIC_TERM_BREAK_HAS_HOLIDAY_WEEK' + source: neo_timetable.AcademicTermBreakNode + target: neo_timetable.HolidayWeekNode + +class AcademicTermBreakHasHolidayDay(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'ACADEMIC_TERM_BREAK_HAS_HOLIDAY_DAY' + source: neo_timetable.AcademicTermBreakNode + target: neo_timetable.HolidayDayNode + +class AcademicTermHasAcademicDay(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'ACADEMIC_TERM_HAS_ACADEMIC_DAY' + source: neo_timetable.AcademicTermNode + target: neo_timetable.AcademicDayNode + +class AcademicTermHasHolidayDay(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'ACADEMIC_TERM_HAS_HOLIDAY_DAY' + source: neo_timetable.AcademicTermNode + target: neo_timetable.HolidayDayNode + +class AcademicTermHasOffTimetableDay(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'ACADEMIC_TERM_HAS_OFF_TIMETABLE_DAY' + source: neo_timetable.AcademicTermNode + target: neo_timetable.OffTimetableDayNode + +class AcademicTermHasStaffDay(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'ACADEMIC_TERM_HAS_STAFF_DAY' + source: neo_timetable.AcademicTermNode + target: neo_timetable.StaffDayNode + +class AcademicWeekHasAcademicDay(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'ACADEMIC_WEEK_HAS_ACADEMIC_DAY' + source: neo_timetable.AcademicWeekNode + target: neo_timetable.AcademicDayNode + +class AcademicWeekHasHolidayDay(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'ACADEMIC_WEEK_HAS_HOLIDAY_DAY' + source: neo_timetable.AcademicWeekNode + target: neo_timetable.HolidayDayNode + +class AcademicWeekHasOffTimetableDay(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'ACADEMIC_WEEK_HAS_OFF_TIMETABLE_DAY' + source: neo_timetable.AcademicWeekNode + target: neo_timetable.OffTimetableDayNode + +class AcademicWeekHasStaffDay(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'ACADEMIC_WEEK_HAS_STAFF_DAY' + source: neo_timetable.AcademicWeekNode + target: neo_timetable.StaffDayNode + +class HolidayWeekHasHolidayDay(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'HOLIDAY_WEEK_HAS_HOLIDAY_DAY' + source: neo_timetable.HolidayWeekNode + target: neo_timetable.HolidayDayNode + +class AcademicDayHasAcademicPeriod(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'ACADEMIC_DAY_HAS_ACADEMIC_PERIOD' + source: neo_timetable.AcademicDayNode + target: neo_timetable.AcademicPeriodNode + +class AcademicDayHasRegistrationPeriod(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'ACADEMIC_DAY_HAS_REGISTRATION_PERIOD' + source: neo_timetable.AcademicDayNode + target: neo_timetable.RegistrationPeriodNode + +class AcademicDayHasBreakPeriod(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'ACADEMIC_DAY_HAS_BREAK_PERIOD' + source: neo_timetable.AcademicDayNode + target: neo_timetable.BreakPeriodNode + +class AcademicDayHasOffTimetablePeriod(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'ACADEMIC_DAY_HAS_OFF_TIMETABLE_PERIOD' + source: neo_timetable.AcademicDayNode + target: neo_timetable.OffTimetablePeriodNode + +# Timetable sequence relationships +class AcademicYearFollowsAcademicYear(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'ACADEMIC_YEAR_FOLLOWS_ACADEMIC_YEAR' + source: neo_timetable.AcademicYearNode + target: neo_timetable.AcademicYearNode + +class AcademicTermFollowsAcademicTermBreak(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'ACADEMIC_TERM_FOLLOWS_ACADEMIC_TERM_BREAK' + source: neo_timetable.AcademicTermBreakNode # Term break ends + target: neo_timetable.AcademicTermNode # New term starts + +class AcademicTermBreakFollowsAcademicTerm(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'ACADEMIC_TERM_BREAK_FOLLOWS_ACADEMIC_TERM' + source: neo_timetable.AcademicTermNode # Term ends + target: neo_timetable.AcademicTermBreakNode # Term break starts + +class AcademicWeekFollowsAcademicWeek(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'ACADEMIC_WEEK_FOLLOWS_ACADEMIC_WEEK' + source: neo_timetable.AcademicWeekNode + target: neo_timetable.AcademicWeekNode + +class HolidayWeekFollowsHolidayWeek(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'HOLIDAY_WEEK_FOLLOWS_HOLIDAY_WEEK' + source: neo_timetable.HolidayWeekNode + target: neo_timetable.HolidayWeekNode + +class AcademicWeekFollowsHolidayWeek(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'ACADEMIC_WEEK_FOLLOWS_HOLIDAY_WEEK' + source: neo_timetable.HolidayWeekNode + target: neo_timetable.AcademicWeekNode + +class HolidayWeekFollowsAcademicWeek(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'HOLIDAY_WEEK_FOLLOWS_ACADEMIC_WEEK' + source: neo_timetable.AcademicWeekNode + target: neo_timetable.HolidayWeekNode + +class AcademicDayFollowsAcademicDay(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'ACADEMIC_DAY_FOLLOWS_ACADEMIC_DAY' + source: neo_timetable.AcademicDayNode + target: neo_timetable.AcademicDayNode + +class AcademicDayFollowsHolidayDay(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'ACADEMIC_DAY_FOLLOWS_HOLIDAY_DAY' + source: neo_timetable.HolidayDayNode + target: neo_timetable.AcademicDayNode + +class AcademicDayFollowsOffTimetableDay(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'ACADEMIC_DAY_FOLLOWS_OFF_TIMETABLE_DAY' + source: neo_timetable.OffTimetableDayNode + target: neo_timetable.AcademicDayNode + +class AcademicDayFollowsStaffDay(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'ACADEMIC_DAY_FOLLOWS_STAFF_DAY' + source: neo_timetable.StaffDayNode + target: neo_timetable.AcademicDayNode + +class HolidayDayFollowsHolidayDay(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'HOLIDAY_DAY_FOLLOWS_HOLIDAY_DAY' + source: neo_timetable.HolidayDayNode + target: neo_timetable.HolidayDayNode + +class HolidayDayFollowsAcademicDay(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'HOLIDAY_DAY_FOLLOWS_ACADEMIC_DAY' + source: neo_timetable.AcademicDayNode + target: neo_timetable.HolidayDayNode + +class HolidayDayFollowsOffTimetableDay(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'HOLIDAY_DAY_FOLLOWS_OFF_TIMETABLE_DAY' + source: neo_timetable.OffTimetableDayNode + target: neo_timetable.HolidayDayNode + +class HolidayDayFollowsStaffDay(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'HOLIDAY_DAY_FOLLOWS_STAFF_DAY' + source: neo_timetable.StaffDayNode + target: neo_timetable.HolidayDayNode + +class OffTimetableDayFollowsOffTimetableDay(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'OFF_TIMETABLE_DAY_FOLLOWS_OFF_TIMETABLE_DAY' + source: neo_timetable.OffTimetableDayNode + target: neo_timetable.OffTimetableDayNode + +class OffTimetableDayFollowsAcademicDay(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'OFF_TIMETABLE_DAY_FOLLOWS_ACADEMIC_DAY' + source: neo_timetable.AcademicDayNode + target: neo_timetable.OffTimetableDayNode + +class OffTimetableDayFollowsHolidayDay(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'OFF_TIMETABLE_DAY_FOLLOWS_HOLIDAY_DAY' + source: neo_timetable.HolidayDayNode + target: neo_timetable.OffTimetableDayNode + +class OffTimetableDayFollowsStaffDay(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'OFF_TIMETABLE_DAY_FOLLOWS_STAFF_DAY' + source: neo_timetable.StaffDayNode + target: neo_timetable.OffTimetableDayNode + +class StaffDayFollowsStaffDay(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'STAFF_DAY_FOLLOWS_STAFF_DAY' + source: neo_timetable.StaffDayNode + target: neo_timetable.StaffDayNode + +class StaffDayFollowsAcademicDay(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'STAFF_DAY_FOLLOWS_ACADEMIC_DAY' + source: neo_timetable.AcademicDayNode + target: neo_timetable.StaffDayNode + +class StaffDayFollowsHolidayDay(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'STAFF_DAY_FOLLOWS_HOLIDAY_DAY' + source: neo_timetable.HolidayDayNode + target: neo_timetable.StaffDayNode + +class StaffDayFollowsOffTimetableDay(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'STAFF_DAY_FOLLOWS_OFF_TIMETABLE_DAY' + source: neo_timetable.OffTimetableDayNode + target: neo_timetable.StaffDayNode + +class AcademicPeriodFollowsAcademicPeriod(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'ACADEMIC_PERIOD_FOLLOWS_ACADEMIC_PERIOD' + source: neo_timetable.AcademicPeriodNode + target: neo_timetable.AcademicPeriodNode + +class AcademicPeriodFollowsBreakPeriod(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'ACADEMIC_PERIOD_FOLLOWS_BREAK_PERIOD' + source: neo_timetable.BreakPeriodNode + target: neo_timetable.AcademicPeriodNode + +class AcademicPeriodFollowsRegistrationPeriod(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'ACADEMIC_PERIOD_FOLLOWS_REGISTRATION_PERIOD' + source: neo_timetable.RegistrationPeriodNode + target: neo_timetable.AcademicPeriodNode + +class AcademicPeriodFollowsOffTimetablePeriod(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'ACADEMIC_PERIOD_FOLLOWS_OFF_TIMETABLE_PERIOD' + source: neo_timetable.OffTimetablePeriodNode + target: neo_timetable.AcademicPeriodNode + +class BreakPeriodFollowsAcademicPeriod(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'BREAK_PERIOD_FOLLOWS_ACADEMIC_PERIOD' + source: neo_timetable.AcademicPeriodNode + target: neo_timetable.BreakPeriodNode + +class RegistrationPeriodFollowsAcademicPeriod(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'REGISTRATION_PERIOD_FOLLOWS_ACADEMIC_PERIOD' + source: neo_timetable.AcademicPeriodNode + target: neo_timetable.RegistrationPeriodNode + +class RegistrationPeriodFollowsOffTimetablePeriod(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'REGISTRATION_PERIOD_FOLLOWS_OFF_TIMETABLE_PERIOD' + source: neo_timetable.OffTimetablePeriodNode + target: neo_timetable.RegistrationPeriodNode + +class OffTimetablePeriodFollowsAcademicPeriod(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'OFF_TIMETABLE_PERIOD_FOLLOWS_ACADEMIC_PERIOD' + source: neo_timetable.AcademicPeriodNode + target: neo_timetable.OffTimetablePeriodNode + +class OffTimetablePeriodFollowsRegistrationPeriod(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'OFF_TIMETABLE_PERIOD_FOLLOWS_REGISTRATION_PERIOD' + source: neo_timetable.RegistrationPeriodNode + target: neo_timetable.OffTimetablePeriodNode + +class OffTimetablePeriodFollowsOffTimetablePeriod(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'OFF_TIMETABLE_PERIOD_FOLLOWS_OFF_TIMETABLE_PERIOD' + source: neo_timetable.OffTimetablePeriodNode + target: neo_timetable.OffTimetablePeriodNode + +class BreakPeriodFollowsBreakPeriod(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'BREAK_PERIOD_FOLLOWS_BREAK_PERIOD' + source: neo_timetable.BreakPeriodNode + target: neo_timetable.BreakPeriodNode + +class BreakPeriodFollowsRegistrationPeriod(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'BREAK_PERIOD_FOLLOWS_REGISTRATION_PERIOD' + source: neo_timetable.RegistrationPeriodNode + target: neo_timetable.BreakPeriodNode + +class BreakPeriodFollowsOffTimetablePeriod(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'BREAK_PERIOD_FOLLOWS_OFF_TIMETABLE_PERIOD' + source: neo_timetable.OffTimetablePeriodNode + target: neo_timetable.BreakPeriodNode + +class RegistrationPeriodFollowsBreakPeriod(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'REGISTRATION_PERIOD_FOLLOWS_BREAK_PERIOD' + source: neo_timetable.BreakPeriodNode + target: neo_timetable.RegistrationPeriodNode + +class OffTimetablePeriodFollowsBreakPeriod(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'OFF_TIMETABLE_PERIOD_FOLLOWS_BREAK_PERIOD' + source: neo_timetable.BreakPeriodNode + target: neo_timetable.OffTimetablePeriodNode + +class RegistrationPeriodFollowsRegistrationPeriod(BaseRelationship): + __relationshiptype__: ClassVar[str] = 'REGISTRATION_PERIOD_FOLLOWS_REGISTRATION_PERIOD' + source: neo_timetable.RegistrationPeriodNode + target: neo_timetable.RegistrationPeriodNode \ No newline at end of file diff --git a/modules/database/schemas/relationships/worker_structures.py b/modules/database/schemas/relationships/worker_structures.py new file mode 100644 index 0000000..e69de29 diff --git a/modules/database/schemas/structures.py b/modules/database/schemas/structures.py new file mode 100644 index 0000000..f9250dd --- /dev/null +++ b/modules/database/schemas/structures.py @@ -0,0 +1,27 @@ +from typing import Union +import modules.database.schemas.nodes.structures.users as user_structures +import modules.database.schemas.nodes.structures.workers as worker_structures +import modules.database.schemas.nodes.structures.schools as school_structures + +user_structures = Union[ + user_structures.UserCalendarStructureNode, +] + +worker_structures = Union[ + worker_structures.WorkerTimetableStructureNode, +] + +school_structures = Union[ + school_structures.PastoralStructureNode, + school_structures.CurriculumStructureNode, + school_structures.DepartmentStructureNode, + school_structures.SiteStructureNode, + school_structures.StaffStructureNode, + school_structures.StudentStructureNode, +] + +structures = Union[ + user_structures, + worker_structures, + school_structures, +] \ No newline at end of file diff --git a/modules/database/services/__init__.py b/modules/database/services/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/modules/database/services/__pycache__/__init__.cpython-311.pyc b/modules/database/services/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..84b2c414167a462106ea02c7f37c0ccdccf971ca GIT binary patch literal 151 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 wPZs#PKSQV~Lb(`9UY9+{D_(%!o6R>F^=X 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 EKLQpyV*mgE literal 0 HcmV?d00001 diff --git a/modules/database/services/admin_service.py b/modules/database/services/admin_service.py new file mode 100644 index 0000000..1d08d2b --- /dev/null +++ b/modules/database/services/admin_service.py @@ -0,0 +1,193 @@ +import os +from typing import Dict, List, Optional +from supabase import create_client +from modules.logger_tool import initialise_logger +from pydantic import BaseModel + + +class AdminProfileBase(BaseModel): + email: str + display_name: Optional[str] = None + admin_role: Optional[str] = "admin" + is_super_admin: Optional[bool] = False + metadata: Optional[dict] = {} + + +class AdminService: + def __init__(self): + self.logger = initialise_logger( + __name__, os.getenv("LOG_LEVEL"), os.getenv("LOG_PATH"), "default", True + ) + + # Initialize Supabase client with service role key + supabase_url = os.getenv("SUPABASE_URL") + service_role_key = os.getenv("SERVICE_ROLE_KEY") + + self.supabase = create_client(supabase_url, service_role_key) + + # Set headers for admin operations + self.supabase.headers = { + "apiKey": service_role_key, + "Authorization": f"Bearer {service_role_key}", + "Content-Type": "application/json", + } + + def get_admin_profile(self, admin_id: str) -> Optional[Dict]: + """Get admin profile by ID""" + try: + self.logger.info(f"Getting admin profile for ID: {admin_id}") + result = ( + self.supabase.table("admin_profiles") + .select("*") + .eq("id", admin_id) + .single() + .execute() + ) + return result.data if result else None + except Exception as e: + self.logger.error(f"Error getting admin profile: {str(e)}") + raise + + def list_admins(self) -> List[Dict]: + """List all admin profiles""" + try: + self.logger.info("Listing all admin profiles") + result = self.supabase.table("admin_profiles").select("*").execute() + return result.data if result else [] + except Exception as e: + self.logger.error(f"Error listing admins: {str(e)}") + raise + + def create_admin(self, admin_data: AdminProfileBase, current_admin: Dict) -> Dict: + """Create a new admin profile""" + try: + # Verify super admin status + if not current_admin.get("is_super_admin"): + raise Exception("Only super admins can create new admins") + + self.logger.info( + f"Creating new admin profile for email: {admin_data.email}" + ) + + # Create auth user first + auth_user = self.supabase.auth.admin.create_user( + { + "email": admin_data.email, + "email_confirm": True, + "user_metadata": {"is_admin": True}, + } + ) + + if not auth_user: + raise Exception("Failed to create auth user") + + # Create admin profile + profile_data = admin_data.dict() + profile_data["id"] = auth_user.id + + result = ( + self.supabase.table("admin_profiles").insert(profile_data).execute() + ) + return result.data[0] if result else None + + except Exception as e: + self.logger.error(f"Error creating admin: {str(e)}") + raise + + def update_admin( + self, admin_id: str, admin_data: AdminProfileBase, current_admin: Dict + ) -> Dict: + """Update an admin profile""" + try: + # Verify super admin status for certain operations + if admin_data.is_super_admin and not current_admin.get("is_super_admin"): + raise Exception("Only super admins can modify super admin status") + + self.logger.info(f"Updating admin profile for ID: {admin_id}") + result = ( + self.supabase.table("admin_profiles") + .update(admin_data.dict()) + .eq("id", admin_id) + .execute() + ) + return result.data[0] if result else None + + except Exception as e: + self.logger.error(f"Error updating admin: {str(e)}") + raise + + def delete_admin(self, admin_id: str, current_admin: Dict) -> None: + """Delete an admin profile""" + try: + # Verify super admin status + if not current_admin.get("is_super_admin"): + raise Exception("Only super admins can delete admins") + + # Get admin profile to check if it's a super admin + admin_profile = self.get_admin_profile(admin_id) + if admin_profile and admin_profile.get("is_super_admin"): + raise Exception("Cannot delete super admin accounts") + + self.logger.info(f"Deleting admin profile for ID: {admin_id}") + + # Delete auth user + self.supabase.auth.admin.delete_user(admin_id) + + # Delete admin profile + self.supabase.table("admin_profiles").delete().eq("id", admin_id).execute() + + except Exception as e: + self.logger.error(f"Error deleting admin: {str(e)}") + raise + + def setup_super_admin(self, admin_data: dict) -> Dict: + """Set up the initial super admin account""" + try: + self.logger.info(f"Setting up super admin for email: {admin_data['email']}") + + # Check if any super admin exists + existing_super_admin = ( + self.supabase.table("admin_profiles") + .select("*") + .eq("is_super_admin", True) + .execute() + ) + if existing_super_admin.data: + raise Exception("Super admin already exists") + + # Create the auth user first + auth_user = self.supabase.auth.admin.create_user( + { + "email": admin_data["email"], + "password": admin_data["password"], + "email_confirm": True, + "user_metadata": {"is_admin": True, "is_super_admin": True}, + } + ) + + if not auth_user: + raise Exception("Failed to create auth user") + + # Update user metadata + self.supabase.auth.admin.update_user_by_id( + auth_user.user.id, + {"user_metadata": {"is_admin": True, "is_super_admin": True}}, + ) + + # Create super admin profile + profile_data = { + "id": auth_user.user.id, + "email": admin_data["email"], + "display_name": admin_data.get("display_name", "Super Admin"), + "admin_role": "super_admin", + "is_super_admin": True, + } + + result = ( + self.supabase.table("admin_profiles").insert(profile_data).execute() + ) + return result.data[0] if result else None + + except Exception as e: + self.logger.error(f"Error setting up super admin: {str(e)}") + raise diff --git a/modules/database/services/auth_service.py b/modules/database/services/auth_service.py new file mode 100644 index 0000000..1c91284 --- /dev/null +++ b/modules/database/services/auth_service.py @@ -0,0 +1,100 @@ +import os +from typing import Dict, Optional +from fastapi import HTTPException +from supabase import create_client, Client +from modules.logger_tool import initialise_logger + +logger = initialise_logger( + __name__, os.getenv("LOG_LEVEL"), os.getenv("LOG_PATH"), "default", True +) + + +class AuthService: + def __init__(self): + """Initialize the AuthService with Supabase clients""" + self.supabase_url = os.getenv("SUPABASE_URL") + self.anon_key = os.getenv("ANON_KEY") + self.service_role_key = os.getenv("SERVICE_ROLE_KEY") + + # Create clients with different access levels + self.supabase: Client = create_client(self.supabase_url, self.anon_key) + self.admin_supabase: Client = create_client( + self.supabase_url, self.service_role_key + ) + + async def verify_admin(self, session_token: str) -> Dict: + """Verify that the user is an admin and has necessary permissions""" + try: + if not session_token: + raise HTTPException(status_code=401, detail="Not authenticated") + + # Verify session with Supabase + user = self.admin_supabase.auth.get_user(session_token) + if not user: + raise HTTPException(status_code=401, detail="Invalid session") + + # Get admin profile + admin = ( + self.admin_supabase.table("admin_profiles") + .select("*") + .eq("id", user.user.id) + .single() + .execute() + ) + if not admin.data: + raise HTTPException(status_code=403, detail="Not an admin") + + return admin.data + + except Exception as e: + logger.error(f"Error verifying admin: {str(e)}") + raise HTTPException(status_code=401, detail="Authentication failed") + + async def check_super_admin_exists(self) -> bool: + """Check if any super admin exists in the system""" + try: + result = ( + self.admin_supabase.table("admin_profiles") + .select("*") + .eq("is_super_admin", True) + .execute() + ) + return bool(result.data) + except Exception as e: + logger.error(f"Error checking super admin: {str(e)}") + return False + + async def login_admin(self, email: str, password: str) -> Dict: + """Handle admin login and return session data""" + try: + # Attempt login with Supabase + auth_response = self.supabase.auth.sign_in_with_password( + {"email": email, "password": password} + ) + + if not auth_response.user: + raise HTTPException(status_code=401, detail="Invalid credentials") + + # Verify admin status + admin = ( + self.admin_supabase.table("admin_profiles") + .select("*") + .eq("id", auth_response.user.id) + .single() + .execute() + ) + if not admin.data: + raise HTTPException(status_code=403, detail="Not authorized as admin") + + return { + "access_token": auth_response.session.access_token, + "admin": admin.data, + } + + except Exception as e: + logger.error(f"Login error: {str(e)}") + raise HTTPException(status_code=401, detail=str(e)) + + +# Create a singleton instance +auth_service = AuthService() diff --git a/modules/database/services/graph_service.py b/modules/database/services/graph_service.py new file mode 100644 index 0000000..d201e84 --- /dev/null +++ b/modules/database/services/graph_service.py @@ -0,0 +1,67 @@ +import os +from typing import Dict, Any +from modules.logger_tool import initialise_logger +import modules.database.tools.neo4j_driver_tools as driver_tools +from modules.database.admin.neontology_provider import NeontologyProvider +from modules.database.admin.graph_provider import GraphNamingProvider + +class GraphService: + def __init__(self): + self.logger = initialise_logger(__name__, os.getenv("LOG_LEVEL"), os.getenv("LOG_PATH"), 'default', True) + self.driver = driver_tools.get_driver() + self.neontology = NeontologyProvider() + self.graph_naming = GraphNamingProvider() + + def check_schema_status(self, database_name: str = "neo4j") -> Dict[str, Any]: + """Check the status of Neo4j schema including constraints, indexes, and labels""" + try: + with self.driver.session(database=database_name) as session: + # Check constraints + constraints_result = session.run("SHOW CONSTRAINTS") + constraints = list(constraints_result) + + # Check indexes + indexes_result = session.run("SHOW INDEXES") + indexes = list(indexes_result) + + # Check labels + labels_result = session.run("CALL db.labels()") + labels = list(labels_result) + + return { + "constraints_count": len(constraints), + "indexes_count": len(indexes), + "labels_count": len(labels), + "constraints": [dict(record) for record in constraints], + "indexes": [dict(record) for record in indexes], + "labels": [dict(record) for record in labels] + } + except Exception as e: + self.logger.error(f"Error checking schema status: {str(e)}") + return { + "constraints_count": 0, + "indexes_count": 0, + "labels_count": 0, + "error": str(e) + } + + def initialize_schema(self, database_name: str = "neo4j") -> Dict[str, Any]: + """Initialize Neo4j schema with required constraints and indexes""" + try: + schema_queries = self.graph_naming.get_schema_creation_queries() + + with self.driver.session(database=database_name) as session: + for query in schema_queries: + session.run(query) + + return { + "status": "success", + "message": "Schema initialized successfully", + "details": self.check_schema_status(database_name) + } + except Exception as e: + self.logger.error(f"Error initializing schema: {str(e)}") + return { + "status": "error", + "message": str(e) + } diff --git a/modules/database/services/graph_storage_service.py b/modules/database/services/graph_storage_service.py new file mode 100644 index 0000000..e69de29 diff --git a/modules/database/services/jwt_service.py b/modules/database/services/jwt_service.py new file mode 100644 index 0000000..c2f8475 --- /dev/null +++ b/modules/database/services/jwt_service.py @@ -0,0 +1,45 @@ +from datetime import datetime, timedelta +import jwt +from typing import Dict, List + +class JWTService: + """JWT Service for Neo4j authentication + + TODO: Security Enhancements Needed + - Implement token refresh mechanism + - Add token revocation capability + - Add token validation checks + - Implement rate limiting + - Add audit logging for token generation/usage + - Consider reducing token expiry time and implementing refresh tokens + """ + + def __init__(self, secret_key: str, algorithm: str = "HS256"): + self.secret_key = secret_key + self.algorithm = algorithm + + def generate_neo4j_token(self, user_data: Dict) -> str: + """Generate JWT token for Neo4j database access""" + payload = { + "sub": user_data["email"], + "roles": self._get_neo4j_roles(user_data["user_type"]), + "iss": "supabase", + "aud": "neo4j", + "iat": datetime.utcnow(), + "exp": datetime.utcnow() + timedelta(hours=24) + } + + if "school_uuid" in user_data: + payload["worker_db_name"] = f"cc.institutes.{user_data['school_uuid']}" + + return jwt.encode(payload, self.secret_key, algorithm=self.algorithm) + + def _get_neo4j_roles(self, user_type: str) -> List[str]: + """Map user types to Neo4j roles""" + role_mapping = { + "cc_admin": ["admin", "reader", "writer"], + "developer": ["developer", "reader", "writer"], + "email_teacher": ["teacher", "reader", "writer"], + "email_student": ["student", "reader"] + } + return role_mapping.get(user_type, ["reader"]) diff --git a/modules/database/services/neo4j_service.py b/modules/database/services/neo4j_service.py new file mode 100644 index 0000000..f1e1f0c --- /dev/null +++ b/modules/database/services/neo4j_service.py @@ -0,0 +1,198 @@ +import os +from typing import Dict, Any +from modules.logger_tool import initialise_logger +import modules.database.tools.neo4j_driver_tools as driver_tools +import modules.database.tools.neo4j_session_tools as session_tools + +class Neo4jService: + """Service for managing Neo4j database operations""" + + def __init__(self): + self.logger = initialise_logger(__name__, os.getenv("LOG_LEVEL"), os.getenv("LOG_PATH"), 'default', True) + self.driver = driver_tools.get_driver() + + def check_database_exists(self, database_name: str) -> Dict[str, Any]: + """Check if a Neo4j database exists + + Args: + database_name (str): Name of the database to check + + Returns: + Dict[str, Any]: Result containing existence status and operation status + """ + try: + with self.driver.session() as session: + result = session.run( + "SHOW DATABASES YIELD name WHERE name = $name", + name=database_name + ) + exists = bool(result.single()) + return { + "exists": exists, + "status": "success" + } + except Exception as e: + self.logger.error(f"Error checking database {database_name}: {str(e)}") + return { + "exists": False, + "status": "error", + "message": str(e) + } + + def create_database(self, db_name: str) -> Dict[str, Any]: + """Creates a Neo4j database with the given name + + Args: + db_name (str): Name of the database to create + + Returns: + Dict[str, Any]: Result containing operation status and message + """ + try: + # First check if database exists + exists_result = self.check_database_exists(db_name) + if exists_result["status"] == "error": + return exists_result + + if not exists_result["exists"]: + with self.driver.session() as session: + session_tools.create_database(session, db_name) + self.logger.info(f"Created database {db_name}") + return { + "status": "success", + "message": f"Database {db_name} created successfully" + } + else: + self.logger.info(f"Database {db_name} already exists") + return { + "status": "success", + "message": f"Database {db_name} already exists" + } + + except Exception as e: + self.logger.error(f"Error creating database {db_name}: {str(e)}") + return {"status": "error", "message": str(e)} + + def initialize_schema(self, database_name: str) -> Dict[str, Any]: + """Initialize Neo4j schema (constraints and indexes) for a database + + Args: + database_name (str): Name of the database to initialize schema for + + Returns: + Dict[str, Any]: Result containing operation status and message + """ + try: + with self.driver.session(database=database_name) as session: + # Create constraints + constraints = [ + "CREATE CONSTRAINT IF NOT EXISTS FOR (n:School) REQUIRE n.unique_id IS UNIQUE", + "CREATE CONSTRAINT IF NOT EXISTS FOR (n:Department) REQUIRE n.unique_id IS UNIQUE", + "CREATE CONSTRAINT IF NOT EXISTS FOR (n:Subject) REQUIRE n.unique_id IS UNIQUE", + "CREATE CONSTRAINT IF NOT EXISTS FOR (n:YearGroup) REQUIRE n.unique_id IS UNIQUE", + "CREATE CONSTRAINT IF NOT EXISTS FOR (n:Class) REQUIRE n.unique_id IS UNIQUE", + "CREATE CONSTRAINT IF NOT EXISTS FOR (n:Teacher) REQUIRE n.unique_id IS UNIQUE", + "CREATE CONSTRAINT IF NOT EXISTS FOR (n:Student) REQUIRE n.unique_id IS UNIQUE", + "CREATE CONSTRAINT IF NOT EXISTS FOR (n:Calendar) REQUIRE n.unique_id IS UNIQUE", + "CREATE CONSTRAINT IF NOT EXISTS FOR (n:Term) REQUIRE n.unique_id IS UNIQUE", + "CREATE CONSTRAINT IF NOT EXISTS FOR (n:Week) REQUIRE n.unique_id IS UNIQUE", + "CREATE CONSTRAINT IF NOT EXISTS FOR (n:Day) REQUIRE n.unique_id IS UNIQUE", + "CREATE CONSTRAINT IF NOT EXISTS FOR (n:Period) REQUIRE n.unique_id IS UNIQUE" + ] + + # Create indexes + indexes = [ + "CREATE INDEX IF NOT EXISTS FOR (n:School) ON (n.urn)", + "CREATE INDEX IF NOT EXISTS FOR (n:Department) ON (n.department_name)", + "CREATE INDEX IF NOT EXISTS FOR (n:Subject) ON (n.subject_name)", + "CREATE INDEX IF NOT EXISTS FOR (n:YearGroup) ON (n.year_group)", + "CREATE INDEX IF NOT EXISTS FOR (n:Class) ON (n.class_name)", + "CREATE INDEX IF NOT EXISTS FOR (n:Teacher) ON (n.email)", + "CREATE INDEX IF NOT EXISTS FOR (n:Student) ON (n.email)", + "CREATE INDEX IF NOT EXISTS FOR (n:Calendar) ON (n.calendar_name)", + "CREATE INDEX IF NOT EXISTS FOR (n:Term) ON (n.term_name)", + "CREATE INDEX IF NOT EXISTS FOR (n:Week) ON (n.week_number)", + "CREATE INDEX IF NOT EXISTS FOR (n:Day) ON (n.date)", + "CREATE INDEX IF NOT EXISTS FOR (n:Period) ON (n.period_name)" + ] + + # Execute all constraints + for constraint in constraints: + session.run(constraint) + + # Execute all indexes + for index in indexes: + session.run(index) + + self.logger.info(f"Successfully initialized schema for database {database_name}") + return { + "status": "success", + "message": f"Schema initialized successfully for database {database_name}" + } + + except Exception as e: + self.logger.error(f"Error initializing schema for database {database_name}: {str(e)}") + return { + "status": "error", + "message": str(e) + } + + def delete_database(self, db_name: str) -> Dict[str, Any]: + """Deletes a Neo4j database + + Args: + db_name (str): Name of the database to delete + + Returns: + Dict[str, Any]: Result containing operation status and message + """ + try: + exists_result = self.check_database_exists(db_name) + if exists_result["status"] == "error": + return exists_result + + if exists_result["exists"]: + with self.driver.session() as session: + session_tools.reset_database_in_session(session) + self.logger.info(f"Deleted database {db_name}") + return { + "status": "success", + "message": f"Database {db_name} deleted successfully" + } + else: + return { + "status": "success", + "message": f"Database {db_name} does not exist" + } + + except Exception as e: + self.logger.error(f"Error deleting database {db_name}: {str(e)}") + return {"status": "error", "message": str(e)} + + def check_node_exists(self, database_name: str, node_label: str) -> Dict[str, Any]: + """Check if any nodes with the given label exist in the specified database + + Args: + database_name (str): Name of the database to check + node_label (str): Label of the node type to check for + + Returns: + Dict[str, Any]: Result containing count and operation status + """ + try: + with self.driver.session(database=database_name) as session: + nodes = session_tools.find_nodes_by_label(session, node_label) + count = len(nodes) + return { + "exists": count > 0, + "count": count, + "status": "success" + } + except Exception as e: + self.logger.error(f"Error checking for {node_label} nodes in database {database_name}: {str(e)}") + return { + "exists": False, + "count": 0, + "status": "error", + "message": str(e) + } diff --git a/modules/database/services/school_admin_service.py b/modules/database/services/school_admin_service.py new file mode 100644 index 0000000..ef0e767 --- /dev/null +++ b/modules/database/services/school_admin_service.py @@ -0,0 +1,412 @@ +import os +from typing import Dict, Any, BinaryIO +import json +import pandas as pd + +import modules.database.tools.neo4j_driver_tools as driver_tools +import modules.database.tools.neo4j_session_tools as session_tools +import modules.database.schemas.nodes.schools.schools as school_nodes +import modules.database.schemas.nodes.schools.curriculum as curriculum_nodes +import modules.database.schemas.nodes.schools.pastoral as pastoral_nodes +import modules.database.schemas.nodes.structures.schools as school_structures +from modules.database.schemas.entities import entities +from modules.database.schemas.relationships import curriculum_relationships, entity_relationships, entity_curriculum_rels +from modules.database.admin.neontology_provider import NeontologyProvider +from modules.database.admin.graph_provider import GraphNamingProvider +from modules.database.supabase.utils.client import SupabaseAnonClient +from modules.database.supabase.utils.storage import StorageManager +from modules.database.services.neo4j_service import Neo4jService +from modules.logger_tool import initialise_logger + +class SchoolAdminService: + def __init__(self): + self.logger = initialise_logger(__name__, os.getenv("LOG_LEVEL"), os.getenv("LOG_PATH"), 'default', True) + self.driver = driver_tools.get_driver() + self.neontology = NeontologyProvider() + self.graph_naming = GraphNamingProvider() + self.storage = StorageManager(SupabaseAnonClient) + self.neo4j_service = Neo4jService() + + def check_database_exists(self, database_name: str) -> Dict[str, Any]: + """Check if a Neo4j database exists""" + return self.neo4j_service.check_database_exists(database_name) + + def create_database(self, db_name: str) -> Dict: + """Creates a Neo4j database with the given name""" + return self.neo4j_service.create_database(db_name) + + def create_school_node(self, school_data: Dict) -> Dict: + """Creates a school node in cc.institutes database and stores TLDraw file in Supabase""" + try: + # Convert school data to SchoolNode + school_unique_id = self.graph_naming.get_school_unique_id(school_data['urn']) + school_path = self.graph_naming.get_school_path("cc.institutes", school_data['urn']) + + school_node = entities.SchoolNode( + unique_id=school_unique_id, + path=school_path, + urn=school_data['urn'], + establishment_number=school_data['establishment_number'], + establishment_name=school_data['establishment_name'], + establishment_type=school_data['establishment_type'], + establishment_status=school_data['establishment_status'], + phase_of_education=school_data['phase_of_education'] if school_data['phase_of_education'] not in [None, ''] else None, + statutory_low_age=int(school_data['statutory_low_age']) if school_data.get('statutory_low_age') is not None else 0, + statutory_high_age=int(school_data['statutory_high_age']) if school_data.get('statutory_high_age') is not None else 0, + religious_character=school_data.get('religious_character') if school_data.get('religious_character') not in [None, ''] else None, + school_capacity=int(school_data['school_capacity']) if school_data.get('school_capacity') is not None else 0, + school_website=school_data.get('school_website', ''), + ofsted_rating=school_data.get('ofsted_rating') if school_data.get('ofsted_rating') not in [None, ''] else None + ) + + # Create default tldraw file data + tldraw_data = { + "document": { + "version": 1, + "id": school_data['urn'], + "name": school_data['establishment_name'], + "meta": { + "created_at": "", + "updated_at": "", + "creator_id": "", + "is_template": False, + "is_snapshot": False, + "is_draft": False, + "template_id": None, + "snapshot_id": None, + "draft_id": None + } + }, + "schema": { + "schemaVersion": 1, + "storeVersion": 4, + "recordVersions": { + "asset": { + "version": 1, + "subTypeKey": "type", + "subTypeVersions": {} + }, + "camera": { + "version": 1 + }, + "document": { + "version": 2 + }, + "instance": { + "version": 22 + }, + "instance_page_state": { + "version": 5 + }, + "page": { + "version": 1 + }, + "shape": { + "version": 3, + "subTypeKey": "type", + "subTypeVersions": { + "cc-school-node": 1 + } + }, + "instance_presence": { + "version": 5 + }, + "pointer": { + "version": 1 + } + } + }, + "store": { + "document:document": { + "gridSize": 10, + "name": school_data['establishment_name'], + "meta": {}, + "id": school_data['urn'], + "typeName": "document" + }, + "page:page": { + "meta": {}, + "id": "page", + "name": "Page 1", + "index": "a1", + "typeName": "page" + }, + "shape:school-node": { + "x": 0, + "y": 0, + "rotation": 0, + "type": "cc-school-node", + "id": school_unique_id, + "parentId": "page", + "index": "a1", + "props": school_node.to_dict(), + "typeName": "shape" + }, + "instance:instance": { + "id": "instance", + "currentPageId": "page", + "typeName": "instance" + }, + "camera:camera": { + "x": 0, + "y": 0, + "z": 1, + "id": "camera", + "typeName": "camera" + } + } + } + + # Store tldraw file in Supabase storage + file_path = f"{school_data['urn']}/tldraw.json" + file_options = { + "content-type": "application/json", + "x-upsert": "true", + "metadata": { + "establishment_urn": school_data['urn'], + "establishment_name": school_data['establishment_name'] + } + } + + # Upload file + self.storage.upload_file( + bucket_id="cc.institutes", + file_path=file_path, + file_data=json.dumps(tldraw_data).encode(), + content_type="application/json", + upsert=True + ) + + # Create node in Neo4j + with self.neontology as neo: + self.logger.info(f"Creating school node in Neo4j: {school_node.to_dict()}") + neo.create_or_merge_node(school_node, database="cc.institutes", operation="merge") + return {"status": "success", "node": school_node} + + except Exception as e: + self.logger.error(f"Error creating school node: {str(e)}") + return {"status": "error", "message": str(e)} + + def create_private_database(self, school_data: Dict) -> Dict: + """Creates a private database for a specific school""" + try: + private_db_name = f"cc.institutes.{school_data['urn']}" + with self.driver.session() as session: + session_tools.create_database(session, private_db_name) + self.logger.info(f"Created private database {private_db_name}") + return { + "status": "success", + "message": f"Database {private_db_name} created successfully" + } + except Exception as e: + self.logger.error(f"Error creating private database: {str(e)}") + return {"status": "error", "message": str(e)} + + def create_basic_structure(self, school_node: school_nodes.SchoolNode, database_name: str) -> Dict: + """Creates basic structural nodes in the specified database""" + try: + # Create Department Structure node + department_structure_node_unique_id = f"DepartmentStructure_{school_node.unique_id}" + department_structure_node = entities.DepartmentStructureNode( + unique_id=department_structure_node_unique_id, + tldraw_snapshot="" + ) + + # Create Curriculum Structure node + curriculum_node = curriculum_nodes.CurriculumStructureNode( + unique_id=f"CurriculumStructure_{school_node.unique_id}", + tldraw_snapshot="" + ) + + # Create Pastoral Structure node + pastoral_node = school_structures.PastoralStructureNode( + unique_id=f"PastoralStructure_{school_node.unique_id}", + tldraw_snapshot="" + ) + + with self.neontology as neo: + # Create nodes + neo.create_or_merge_node(department_structure_node, database=str(database_name), operation='merge') + neo.create_or_merge_node(curriculum_node, database=str(database_name), operation='merge') + neo.create_or_merge_node(pastoral_node, database=str(database_name), operation='merge') + + # Create relationships + neo.create_or_merge_relationship( + entity_relationships.SchoolHasDepartmentStructure(source=school_node, target=department_structure_node), + database=database_name, operation='merge' + ) + neo.create_or_merge_relationship( + entity_curriculum_rels.SchoolHasCurriculumStructure(source=school_node, target=curriculum_node), + database=database_name, operation='merge' + ) + neo.create_or_merge_relationship( + entity_curriculum_rels.SchoolHasPastoralStructure(source=school_node, target=pastoral_node), + database=database_name, operation='merge' + ) + + return { + "status": "success", + "message": "Basic structure created successfully", + "nodes": { + "department_structure": department_structure_node, + "curriculum_structure": curriculum_node, + "pastoral_structure": pastoral_node + } + } + + except Exception as e: + self.logger.error(f"Error creating basic structure: {str(e)}") + return {"status": "error", "message": str(e)} + + def create_detailed_structure(self, school_node: school_nodes.SchoolNode, database_name: str, excel_file: BinaryIO) -> Dict: + """Creates detailed structural nodes from Excel file""" + try: + # Store Excel file in Supabase + file_path = f"{school_node.urn}/structure.xlsx" + + # Upload Excel file + self.storage.upload_file( + bucket_id="cc.institutes", + file_path=file_path, + file_data=excel_file.read(), + content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + upsert=True + ) + + # Process Excel file + dataframes = pd.read_excel(excel_file, sheet_name=None) + + # Get existing basic structure nodes + with self.neontology as neo: + result = neo.cypher_read(""" + MATCH (s:School {unique_id: $school_id}) + OPTIONAL MATCH (s)-[:HAS_DEPARTMENT_STRUCTURE]->(ds:DepartmentStructure) + OPTIONAL MATCH (s)-[:HAS_CURRICULUM_STRUCTURE]->(cs:CurriculumStructure) + OPTIONAL MATCH (s)-[:HAS_PASTORAL_STRUCTURE]->(ps:PastoralStructure) + RETURN ds, cs, ps + """, {"school_id": school_node.unique_id}, database=database_name) + + if not result: + raise Exception("Basic structure not found") + + department_structure = result['ds'] + curriculum_structure = result['cs'] + pastoral_structure = result['ps'] + + # Create departments and subjects + unique_departments = dataframes['keystagesyllabuses']['Department'].dropna().unique() + + node_library = {} + + with self.neontology as neo: + for department_name in unique_departments: + + department_node = entities.DepartmentNode( + unique_id=f"Department_{school_node.unique_id}_{department_name.replace(' ', '_')}", + department_name=department_name, + tldraw_snapshot="" + ) + neo.create_or_merge_node(department_node, database=database_name, operation='merge') + node_library[f'department_{department_name}'] = department_node + + # Link to department structure + neo.create_or_merge_relationship( + entity_relationships.DepartmentStructureHasDepartment( + source=department_structure, + target=department_node + ), + database=database_name, + operation='merge' + ) + + # Create year groups + year_groups = self.sort_year_groups(dataframes['yeargroupsyllabuses'])['YearGroup'].unique() + last_year_group_node = None + + for year_group in year_groups: + numeric_year_group = pd.to_numeric(year_group, errors='coerce') + if pd.notna(numeric_year_group): + year_group_node = pastoral_nodes.YearGroupNode( + unique_id=f"YearGroup_{school_node.unique_id}_YGrp{int(numeric_year_group)}", + year_group=str(int(numeric_year_group)), + year_group_name=f"Year {int(numeric_year_group)}", + tldraw_snapshot="" + ) + neo.create_or_merge_node(year_group_node, database=database_name, operation='merge') + node_library[f'year_group_{int(numeric_year_group)}'] = year_group_node + + # Create sequential relationship + if last_year_group_node: + neo.create_or_merge_relationship( + curriculum_relationships.YearGroupFollowsYearGroup( + source=last_year_group_node, + target=year_group_node + ), + database=database_name, + operation='merge' + ) + last_year_group_node = year_group_node + + # Link to pastoral structure + neo.create_or_merge_relationship( + curriculum_relationships.PastoralStructureIncludesYearGroup( + source=pastoral_structure, + target=year_group_node + ), + database=database_name, + operation='merge' + ) + + # Create key stages + key_stages = dataframes['keystagesyllabuses']['KeyStage'].unique() + last_key_stage_node = None + + for key_stage in sorted(key_stages): + key_stage_node = curriculum_nodes.KeyStageNode( + unique_id=f"KeyStage_{curriculum_structure.unique_id}_KStg{key_stage}", + key_stage_name=f"Key Stage {key_stage}", + key_stage=str(key_stage), + tldraw_snapshot="" + ) + neo.create_or_merge_node(key_stage_node, database=database_name, operation='merge') + node_library[f'key_stage_{key_stage}'] = key_stage_node + + # Create sequential relationship + if last_key_stage_node: + neo.create_or_merge_relationship( + curriculum_relationships.KeyStageFollowsKeyStage( + source=last_key_stage_node, + target=key_stage_node + ), + database=database_name, + operation='merge' + ) + last_key_stage_node = key_stage_node + + # Link to curriculum structure + neo.create_or_merge_relationship( + curriculum_relationships.CurriculumStructureIncludesKeyStage( + source=curriculum_structure, + target=key_stage_node + ), + database=database_name, + operation='merge' + ) + + return { + "status": "success", + "message": "Detailed structure created successfully", + "node_library": node_library + } + + except Exception as e: + self.logger.error(f"Error creating detailed structure: {str(e)}") + return {"status": "error", "message": str(e)} + + def sort_year_groups(self, df: pd.DataFrame) -> pd.DataFrame: + """Helper function to sort year groups numerically""" + df = df.copy() + df['YearGroupNumeric'] = pd.to_numeric(df['YearGroup'], errors='coerce') + return df.sort_values(by='YearGroupNumeric') + + diff --git a/modules/database/services/school_service.py b/modules/database/services/school_service.py new file mode 100644 index 0000000..44d1fdf --- /dev/null +++ b/modules/database/services/school_service.py @@ -0,0 +1,472 @@ +import os +from typing import Dict, List, Optional, BinaryIO +import json +import pandas as pd +from backend.modules.database.schemas import entities +from modules.logger_tool import initialise_logger +from modules.database.tools.filesystem_tools import ClassroomCopilotFilesystem +import modules.database.tools.neo4j_driver_tools as driver_tools +import modules.database.tools.neo4j_session_tools as session_tools +from modules.database.admin.neontology_provider import NeontologyProvider +from modules.database.admin.graph_provider import GraphNamingProvider +from modules.database.schemas import curriculum_neo +from modules.database.schemas.relationships import curriculum_relationships, entity_relationships, entity_curriculum_rels +from modules.database.supabase.utils.storage import StorageManager + +class SchoolService: + def __init__(self): + self.logger = initialise_logger(__name__, os.getenv("LOG_LEVEL"), os.getenv("LOG_PATH"), 'default', True) + self.driver = driver_tools.get_driver() + self.neontology = NeontologyProvider() + self.graph_naming = GraphNamingProvider() + self.storage = StorageManager() + + def create_schools_database(self) -> Dict: + """Creates the main cc.institutes database in Neo4j""" + try: + db_name = "cc.institutes" + with self.driver.session() as session: + session_tools.create_database(session, db_name) + self.logger.info(f"Created database {db_name}") + return { + "status": "success", + "message": f"Database {db_name} created successfully" + } + except Exception as e: + self.logger.error(f"Error creating schools database: {str(e)}") + return {"status": "error", "message": str(e)} + + def create_school_node(self, school_data: Dict) -> Dict: + """Creates a school node in cc.institutes database and stores TLDraw file in Supabase""" + try: + # Convert school data to SchoolNode + school_unique_id = self.graph_naming.get_school_unique_id(school_data['urn']) + school_path = self.graph_naming.get_school_path("cc.institutes", school_data['urn']) + + school_node = entities.SchoolNode( + unique_id=school_unique_id, + path=school_path, + urn=school_data['urn'], + establishment_number=school_data['establishment_number'], + establishment_name=school_data['establishment_name'], + establishment_type=school_data['establishment_type'], + establishment_status=school_data['establishment_status'], + phase_of_education=school_data['phase_of_education'] if school_data['phase_of_education'] not in [None, ''] else None, + statutory_low_age=int(school_data['statutory_low_age']) if school_data.get('statutory_low_age') is not None else 0, + statutory_high_age=int(school_data['statutory_high_age']) if school_data.get('statutory_high_age') is not None else 0, + religious_character=school_data.get('religious_character') if school_data.get('religious_character') not in [None, ''] else None, + school_capacity=int(school_data['school_capacity']) if school_data.get('school_capacity') is not None else 0, + school_website=school_data.get('school_website', ''), + ofsted_rating=school_data.get('ofsted_rating') if school_data.get('ofsted_rating') not in [None, ''] else None + ) + + # Create default tldraw file data + tldraw_data = { + "document": { + "version": 1, + "id": school_data['urn'], + "name": school_data['establishment_name'], + "meta": { + "created_at": "", + "updated_at": "", + "creator_id": "", + "is_template": False, + "is_snapshot": False, + "is_draft": False, + "template_id": None, + "snapshot_id": None, + "draft_id": None + } + }, + "schema": { + "schemaVersion": 1, + "storeVersion": 4, + "recordVersions": { + "asset": { + "version": 1, + "subTypeKey": "type", + "subTypeVersions": {} + }, + "camera": { + "version": 1 + }, + "document": { + "version": 2 + }, + "instance": { + "version": 22 + }, + "instance_page_state": { + "version": 5 + }, + "page": { + "version": 1 + }, + "shape": { + "version": 3, + "subTypeKey": "type", + "subTypeVersions": { + "cc-school-node": 1 + } + }, + "instance_presence": { + "version": 5 + }, + "pointer": { + "version": 1 + } + } + }, + "store": { + "document:document": { + "gridSize": 10, + "name": school_data['establishment_name'], + "meta": {}, + "id": school_data['urn'], + "typeName": "document" + }, + "page:page": { + "meta": {}, + "id": "page", + "name": "Page 1", + "index": "a1", + "typeName": "page" + }, + "shape:school-node": { + "x": 0, + "y": 0, + "rotation": 0, + "type": "cc-school-node", + "id": school_unique_id, + "parentId": "page", + "index": "a1", + "props": school_node.to_dict(), + "typeName": "shape" + }, + "instance:instance": { + "id": "instance", + "currentPageId": "page", + "typeName": "instance" + }, + "camera:camera": { + "x": 0, + "y": 0, + "z": 1, + "id": "camera", + "typeName": "camera" + } + } + } + + # Store tldraw file in Supabase storage + file_path = f"{school_data['urn']}/tldraw.json" + file_options = { + "content-type": "application/json", + "x-upsert": "true", + "metadata": { + "establishment_urn": school_data['urn'], + "establishment_name": school_data['establishment_name'] + } + } + + # Upload file + self.storage.upload_file( + bucket_id="cc.institutes", + file_path=file_path, + file_data=json.dumps(tldraw_data).encode(), + content_type="application/json", + upsert=True + ) + + # Create node in Neo4j + with self.neontology as neo: + self.logger.info(f"Creating school node in Neo4j: {school_node.to_dict()}") + neo.create_or_merge_node(school_node, database="cc.institutes", operation="merge") + return {"status": "success", "node": school_node} + + except Exception as e: + self.logger.error(f"Error creating school node: {str(e)}") + return {"status": "error", "message": str(e)} + + def create_private_database(self, school_data: Dict) -> Dict: + """Creates a private database for a specific school""" + try: + private_db_name = f"cc.institutes.{school_data['urn']}" + with self.driver.session() as session: + session_tools.create_database(session, private_db_name) + self.logger.info(f"Created private database {private_db_name}") + return { + "status": "success", + "message": f"Database {private_db_name} created successfully" + } + except Exception as e: + self.logger.error(f"Error creating private database: {str(e)}") + return {"status": "error", "message": str(e)} + + def create_basic_structure(self, school_node: entities.SchoolNode, database_name: str) -> Dict: + """Creates basic structural nodes in the specified database""" + try: + # Create filesystem paths + fs_handler = ClassroomCopilotFilesystem(database_name, init_run_type="school") + + # Create Department Structure node + department_structure_node_unique_id = f"DepartmentStructure_{school_node.unique_id}" + _, department_path = fs_handler.create_school_department_directory(school_node.path, "departments") + department_structure_node = entities.DepartmentStructureNode( + unique_id=department_structure_node_unique_id, + path=department_path + ) + + # Create Curriculum Structure node + _, curriculum_path = fs_handler.create_school_curriculum_directory(school_node.path) + curriculum_node = curriculum_neo.CurriculumStructureNode( + unique_id=f"CurriculumStructure_{school_node.unique_id}", + path=curriculum_path + ) + + # Create Pastoral Structure node + _, pastoral_path = fs_handler.create_school_pastoral_directory(school_node.path) + pastoral_node = curriculum_neo.PastoralStructureNode( + unique_id=f"PastoralStructure_{school_node.unique_id}", + path=pastoral_path + ) + + with self.neontology as neo: + # Create nodes + neo.create_or_merge_node(department_structure_node, database=str(database_name), operation='merge') + fs_handler.create_default_tldraw_file(department_structure_node.path, department_structure_node.to_dict()) + + neo.create_or_merge_node(curriculum_node, database=str(database_name), operation='merge') + fs_handler.create_default_tldraw_file(curriculum_node.path, curriculum_node.to_dict()) + + neo.create_or_merge_node(pastoral_node, database=database_name, operation='merge') + fs_handler.create_default_tldraw_file(pastoral_node.path, pastoral_node.to_dict()) + + # Create relationships + neo.create_or_merge_relationship( + entity_relationships.SchoolHasDepartmentStructure(source=school_node, target=department_structure_node), + database=database_name, operation='merge' + ) + + neo.create_or_merge_relationship( + entity_curriculum_rels.SchoolHasCurriculumStructure(source=school_node, target=curriculum_node), + database=database_name, operation='merge' + ) + + neo.create_or_merge_relationship( + entity_curriculum_rels.SchoolHasPastoralStructure(source=school_node, target=pastoral_node), + database=database_name, operation='merge' + ) + + return { + "status": "success", + "message": "Basic structure created successfully", + "nodes": { + "department_structure": department_structure_node, + "curriculum_structure": curriculum_node, + "pastoral_structure": pastoral_node + } + } + + except Exception as e: + self.logger.error(f"Error creating basic structure: {str(e)}") + return {"status": "error", "message": str(e)} + + def create_detailed_structure(self, school_node: entities.SchoolNode, database_name: str, excel_file: BinaryIO) -> Dict: + """Creates detailed structural nodes from Excel file""" + try: + # Store Excel file in Supabase + file_path = f"{school_node.urn}/structure.xlsx" + + # Upload Excel file + self.storage.upload_file( + bucket_id="cc.institutes", + file_path=file_path, + file_data=excel_file.read(), + content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + upsert=True + ) + + # Process Excel file + dataframes = pd.read_excel(excel_file, sheet_name=None) + + # Get existing basic structure nodes + with self.neontology as neo: + result = neo.cypher_read(""" + MATCH (s:School {unique_id: $school_id}) + OPTIONAL MATCH (s)-[:HAS_DEPARTMENT_STRUCTURE]->(ds:DepartmentStructure) + OPTIONAL MATCH (s)-[:HAS_CURRICULUM_STRUCTURE]->(cs:CurriculumStructure) + OPTIONAL MATCH (s)-[:HAS_PASTORAL_STRUCTURE]->(ps:PastoralStructure) + RETURN ds, cs, ps + """, {"school_id": school_node.unique_id}, database=database_name) + + if not result: + raise Exception("Basic structure not found") + + department_structure = result['ds'] + curriculum_structure = result['cs'] + pastoral_structure = result['ps'] + + # Create departments and subjects + unique_departments = dataframes['keystagesyllabuses']['Department'].dropna().unique() + + fs_handler = ClassroomCopilotFilesystem(database_name, init_run_type="school") + node_library = {} + + with self.neontology as neo: + for department_name in unique_departments: + _, department_path = fs_handler.create_school_department_directory(school_node.path, department_name) + + department_node = entities.DepartmentNode( + unique_id=f"Department_{school_node.unique_id}_{department_name.replace(' ', '_')}", + department_name=department_name, + path=department_path + ) + neo.create_or_merge_node(department_node, database=database_name, operation='merge') + fs_handler.create_default_tldraw_file(department_node.path, department_node.to_dict()) + node_library[f'department_{department_name}'] = department_node + + # Link to department structure + neo.create_or_merge_relationship( + entity_relationships.DepartmentStructureHasDepartment( + source=department_structure, + target=department_node + ), + database=database_name, + operation='merge' + ) + + # Create year groups + year_groups = self.sort_year_groups(dataframes['yeargroupsyllabuses'])['YearGroup'].unique() + last_year_group_node = None + + for year_group in year_groups: + numeric_year_group = pd.to_numeric(year_group, errors='coerce') + if pd.notna(numeric_year_group): + _, year_group_path = fs_handler.create_pastoral_year_group_directory( + pastoral_structure.path, + str(int(numeric_year_group)) + ) + + year_group_node = curriculum_neo.YearGroupNode( + unique_id=f"YearGroup_{school_node.unique_id}_YGrp{int(numeric_year_group)}", + year_group=str(int(numeric_year_group)), + year_group_name=f"Year {int(numeric_year_group)}", + path=year_group_path + ) + neo.create_or_merge_node(year_group_node, database=database_name, operation='merge') + fs_handler.create_default_tldraw_file(year_group_node.path, year_group_node.to_dict()) + node_library[f'year_group_{int(numeric_year_group)}'] = year_group_node + + # Create sequential relationship + if last_year_group_node: + neo.create_or_merge_relationship( + curriculum_relationships.YearGroupFollowsYearGroup( + source=last_year_group_node, + target=year_group_node + ), + database=database_name, + operation='merge' + ) + last_year_group_node = year_group_node + + # Link to pastoral structure + neo.create_or_merge_relationship( + curriculum_relationships.PastoralStructureIncludesYearGroup( + source=pastoral_structure, + target=year_group_node + ), + database=database_name, + operation='merge' + ) + + # Create key stages + key_stages = dataframes['keystagesyllabuses']['KeyStage'].unique() + last_key_stage_node = None + + for key_stage in sorted(key_stages): + _, key_stage_path = fs_handler.create_curriculum_key_stage_directory( + curriculum_structure.path, + str(key_stage) + ) + + key_stage_node = curriculum_neo.KeyStageNode( + unique_id=f"KeyStage_{curriculum_structure.unique_id}_KStg{key_stage}", + key_stage_name=f"Key Stage {key_stage}", + key_stage=str(key_stage), + path=key_stage_path + ) + neo.create_or_merge_node(key_stage_node, database=database_name, operation='merge') + fs_handler.create_default_tldraw_file(key_stage_node.path, key_stage_node.to_dict()) + node_library[f'key_stage_{key_stage}'] = key_stage_node + + # Create sequential relationship + if last_key_stage_node: + neo.create_or_merge_relationship( + curriculum_relationships.KeyStageFollowsKeyStage( + source=last_key_stage_node, + target=key_stage_node + ), + database=database_name, + operation='merge' + ) + last_key_stage_node = key_stage_node + + # Link to curriculum structure + neo.create_or_merge_relationship( + curriculum_relationships.CurriculumStructureIncludesKeyStage( + source=curriculum_structure, + target=key_stage_node + ), + database=database_name, + operation='merge' + ) + + return { + "status": "success", + "message": "Detailed structure created successfully", + "node_library": node_library + } + + except Exception as e: + self.logger.error(f"Error creating detailed structure: {str(e)}") + return {"status": "error", "message": str(e)} + + def sort_year_groups(self, df: pd.DataFrame) -> pd.DataFrame: + """Helper function to sort year groups numerically""" + df = df.copy() + df['YearGroupNumeric'] = pd.to_numeric(df['YearGroup'], errors='coerce') + return df.sort_values(by='YearGroupNumeric') + + def check_schools_database(self) -> Dict: + """Check if the schools database exists and has been initialized""" + try: + db_name = "cc.institutes" + with self.driver.session() as session: + # Check if database exists + databases = session_tools.list_databases(session) + if db_name not in databases: + return { + "status": "error", + "message": f"Database {db_name} does not exist" + } + + # Check if database has any nodes (indicating it's been initialized) + session.run("USE " + db_name) + result = session.run("MATCH (n) RETURN count(n) as count").single() + node_count = result["count"] if result else 0 + + if node_count == 0: + return { + "status": "error", + "message": f"Database {db_name} exists but has no nodes" + } + + return { + "status": "success", + "message": f"Database {db_name} exists and has {node_count} nodes" + } + + except Exception as e: + self.logger.error(f"Error checking schools database: {str(e)}") + return {"status": "error", "message": str(e)} diff --git a/modules/database/supabase/__init__.py b/modules/database/supabase/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/modules/database/supabase/__pycache__/__init__.cpython-311.pyc b/modules/database/supabase/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..85ba1c520723bf54ad8f94bc1dc5bfebfb700230 GIT binary patch literal 151 zcmZ3^%ge<81b?*LGeGoX5CH>>P{wCAAY(d13PUi1CZpd>P{wCAAY(d13PUi1CZpd-5!pP83g5+AQuQ2C3)2BO-oh!to6$ckcq TAn}2jk&*EO1B@tQ28sayQpF@7 literal 0 HcmV?d00001 diff --git a/modules/database/supabase/utils/__pycache__/client.cpython-311.pyc b/modules/database/supabase/utils/__pycache__/client.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..deb3c8d1758f8c81a7bb80a5708331143d18f877 GIT binary patch literal 6033 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 Z%Fma18w)33IhgMF5>vk_l0}yNzX2Y{?g;<@ literal 0 HcmV?d00001 diff --git a/modules/database/supabase/utils/client.py b/modules/database/supabase/utils/client.py new file mode 100644 index 0000000..02c78bf --- /dev/null +++ b/modules/database/supabase/utils/client.py @@ -0,0 +1,77 @@ +import os +from typing import Dict, Optional, Any, TypedDict, List +from supabase import create_client, Client +from supabase.lib.client_options import SyncClientOptions +from gotrue import SyncMemoryStorage +from modules.logger_tool import initialise_logger + +logger = initialise_logger(__name__, os.getenv("LOG_LEVEL"), os.getenv("LOG_PATH"), 'default', True) + +class CreateBucketOptions(TypedDict, total=False): + """Options for bucket creation, matching Supabase API requirements""" + public: bool + file_size_limit: int + allowed_mime_types: List[str] + name: str + +def _create_base_client(url: str, key: str, options: Optional[Dict[str, Any]] = None, access_token: Optional[str] = None) -> Client: + """Create a base Supabase client with given configuration.""" + client_options = SyncClientOptions( + schema="public", + storage=SyncMemoryStorage(), + headers={ + "apikey": key, + "Authorization": f"Bearer {access_token if access_token else key}" + } + ) + return create_client(url, key, options=client_options) + +class SupabaseServiceRoleClient: + """Supabase client for making authenticated requests using the service role key""" + + def __init__(self, url: Optional[str] = None, service_role_key: Optional[str] = None, access_token: Optional[str] = None): + """Initialize the Supabase client with URL and service role key""" + self.url = url or os.environ.get("SUPABASE_URL", "http://kong:8000") + self.service_role_key = service_role_key or os.environ.get("SERVICE_ROLE_KEY") + + if not self.url or not self.service_role_key: + raise ValueError("SUPABASE_URL and SERVICE_ROLE_KEY must be provided") + + # Initialize Supabase client with service role key and optional access token + self.supabase = _create_base_client(self.url, self.service_role_key, access_token=access_token) + + def create_bucket(self, id: str, options: Optional[CreateBucketOptions] = None) -> Dict[str, Any]: + """Create a storage bucket with the given ID and options""" + if options is None: + options = CreateBucketOptions() + if 'name' not in options: + options['name'] = id # Use ID as default name if not provided + return self.supabase.storage.create_bucket(id, options=options) + + @classmethod + def for_admin(cls, access_token: str) -> 'SupabaseServiceRoleClient': + """Create a client instance for the super admin using their access token""" + return cls(access_token=access_token) + +class SupabaseAnonClient: + """Supabase client for making authenticated requests using the anon key""" + + def __init__(self, url: Optional[str] = None, anon_key: Optional[str] = None, access_token: Optional[str] = None): + """Initialize the Supabase client with URL and anon key""" + self.url = url or os.environ.get("SUPABASE_URL", "http://kong:8000") + self.anon_key = anon_key or os.environ.get("ANON_KEY") + + if not self.url or not self.anon_key: + raise ValueError("SUPABASE_URL and ANON_KEY must be provided") + + # Initialize Supabase client with anon key and optional access token + self.supabase = _create_base_client(self.url, self.anon_key, access_token=access_token) + + def create_bucket(self, id: str, options: Optional[CreateBucketOptions] = None) -> Dict[str, Any]: + """Create a storage bucket with the given ID and options""" + return self.supabase.storage.create_bucket(id, options=options) + + @classmethod + def for_user(cls, access_token: str) -> 'SupabaseAnonClient': + """Create a client instance for a specific user using their access token""" + return cls(access_token=access_token) diff --git a/modules/database/supabase/utils/storage.py b/modules/database/supabase/utils/storage.py new file mode 100644 index 0000000..9d7ab19 --- /dev/null +++ b/modules/database/supabase/utils/storage.py @@ -0,0 +1,289 @@ +import os +from typing import Dict, List, Optional, Any, TypedDict +from .client import SupabaseServiceRoleClient, SupabaseAnonClient +from modules.logger_tool import initialise_logger + +class CreateBucketOptions(TypedDict, total=False): + """Options for bucket creation, matching Supabase API requirements""" + public: bool + file_size_limit: int + allowed_mime_types: List[str] + +class StorageError(Exception): + """Custom exception for storage-related errors""" + pass + +class StorageManager: + """Base storage manager class with common functionality""" + + def __init__(self, client: SupabaseServiceRoleClient | SupabaseAnonClient): + self.client = client + self.logger = initialise_logger(__name__) + + def check_bucket_exists(self, bucket_id: str) -> bool: + """Check if a storage bucket exists""" + try: + self.logger.info(f"Checking if bucket {bucket_id} exists") + buckets = self.client.supabase.storage.list_buckets() + return any(bucket.name == bucket_id for bucket in buckets) + except Exception as e: + self.logger.error(f"Error checking bucket {bucket_id}: {str(e)}") + return False + + def list_bucket_contents(self, bucket_id: str, path: str = "") -> Dict: + """List contents of a bucket at specified path""" + try: + self.logger.info(f"Listing contents of bucket {bucket_id} at path {path}") + contents = self.client.supabase.storage.from_(bucket_id).list(path) + return { + "folders": [item for item in contents if item.get("id", "").endswith("/")], + "files": [item for item in contents if not item.get("id", "").endswith("/")] + } + except Exception as e: + self.logger.error(f"Error listing bucket contents: {str(e)}") + raise StorageError(str(e)) + + def upload_file(self, bucket_id: str, file_path: str, file_data: bytes, content_type: str, upsert: bool = True) -> Any: + """Upload a file to a storage bucket""" + try: + self.logger.info(f"Uploading file to {bucket_id} at path {file_path}") + return self.client.supabase.storage.from_(bucket_id).upload( + path=file_path, + file=file_data, + file_options={ + "content-type": content_type, + "x-upsert": "true" if upsert else "false" + } + ) + except Exception as e: + self.logger.error(f"Error uploading file: {str(e)}") + raise StorageError(str(e)) + + def download_file(self, bucket_id: str, file_path: str) -> bytes: + """Download a file from a storage bucket""" + try: + self.logger.info(f"Downloading file from {bucket_id} at path {file_path}") + return self.client.supabase.storage.from_(bucket_id).download(file_path) + except Exception as e: + self.logger.error(f"Error downloading file: {str(e)}") + raise StorageError(str(e)) + + def delete_file(self, bucket_id: str, file_path: str) -> None: + """Delete a file from a storage bucket""" + try: + self.logger.info(f"Deleting file from {bucket_id} at path {file_path}") + self.client.supabase.storage.from_(bucket_id).remove([file_path]) + except Exception as e: + self.logger.error(f"Error deleting file: {str(e)}") + raise StorageError(str(e)) + + def get_public_url(self, bucket_id: str, file_path: str) -> str: + """Get public URL for a file""" + try: + self.logger.info(f"Getting public URL for file in {bucket_id} at path {file_path}") + return self.client.supabase.storage.from_(bucket_id).get_public_url(file_path) + except Exception as e: + self.logger.error(f"Error getting public URL: {str(e)}") + raise StorageError(str(e)) + + def create_signed_url(self, bucket_id: str, file_path: str, expires_in: int = 3600) -> Any: + """Create a signed URL for temporary file access""" + try: + self.logger.info(f"Creating signed URL for file in {bucket_id} at path {file_path}") + return self.client.supabase.storage.from_(bucket_id).create_signed_url(file_path, expires_in) + except Exception as e: + self.logger.error(f"Error creating signed URL: {str(e)}") + raise StorageError(str(e)) + +class StorageAdmin(StorageManager): + """Storage admin class for managing storage buckets with service role access.""" + + def __init__(self, admin_user_id: Optional[str] = None): + """Initialize StorageAdmin with service role client.""" + super().__init__(SupabaseServiceRoleClient()) + self.admin_user_id = admin_user_id + + def create_bucket( + self, + id: str, + name: Optional[str] = None, + public: bool = False, + file_size_limit: Optional[int] = None, + allowed_mime_types: Optional[List[str]] = None, + owner: Optional[str] = None, # Kept for backwards compatibility but not used + owner_id: Optional[str] = None # Kept for backwards compatibility but not used + ) -> Dict[str, Any]: + """Create a new storage bucket with supported parameters.""" + try: + self.logger.info(f"Creating bucket {id} with name {name}") + + # Prepare bucket options with only supported parameters + options: Optional[CreateBucketOptions] = {} + if public: + options["public"] = public + if file_size_limit is not None: + options["file_size_limit"] = file_size_limit + if allowed_mime_types is not None: + options["allowed_mime_types"] = allowed_mime_types + + # Create bucket with supported parameters only + bucket = self.client.supabase.storage.create_bucket( + str(id), + options=options if options else None + ) + + return bucket + + except Exception as e: + self.logger.error(f"Error creating bucket {id}: {str(e)}") + raise StorageError(str(e)) + + def initialize_core_buckets(self, admin_user_id: Optional[str] = None) -> List[Dict[str, Any]]: + """Initialize core storage buckets for the application.""" + try: + owner_id = admin_user_id or self.admin_user_id + if not owner_id: + raise ValueError("Admin user ID is required for bucket initialization") + + core_buckets = [ + { + "id": "cc.users", + "name": "CC Users", + "public": False, + "owner": owner_id, + "owner_id": "superadmin", + "file_size_limit": 50 * 1024 * 1024, # 50MB + "allowed_mime_types": [ + 'image/*', 'video/*', 'application/pdf', + 'application/msword', 'application/vnd.openxmlformats-officedocument.*', + 'text/plain', 'text/csv', 'application/json' + ] + }, + { + "id": "cc.institutes", + "name": "CC Institutes", + "public": False, + "owner": owner_id, + "owner_id": "superadmin", + "file_size_limit": 50 * 1024 * 1024, # 50MB + "allowed_mime_types": [ + 'image/*', 'video/*', 'application/pdf', + 'application/msword', 'application/vnd.openxmlformats-officedocument.*', + 'text/plain', 'text/csv', 'application/json' + ] + } + ] + + results = [] + for bucket in core_buckets: + try: + bucket_name = bucket.pop("name") # Remove name from options + result = self.create_bucket(name=bucket_name, **bucket) + results.append({ + "bucket": bucket["id"], + "status": "success", + "result": result + }) + except Exception as e: + self.logger.error(f"Error creating bucket {bucket['id']}: {str(e)}") + results.append({ + "bucket": bucket["id"], + "status": "error", + "error": str(e) + }) + + return results + + except Exception as e: + self.logger.error(f"Error initializing core buckets: {str(e)}") + raise StorageError(str(e)) + + def create_user_bucket(self, user_id: str, username: str) -> Dict[str, Any]: + """Create a storage bucket for a specific user.""" + try: + bucket_id = f"cc.users.admin.{username}" + bucket_name = f"User Files - {username}" + + return self.create_bucket( + id=bucket_id, + name=bucket_name, + public=False, + owner=user_id, + owner_id=username, + file_size_limit=50 * 1024 * 1024, # 50MB + allowed_mime_types=[ + 'image/*', 'video/*', 'application/pdf', + 'application/msword', 'application/vnd.openxmlformats-officedocument.*', + 'text/plain', 'text/csv', 'application/json' + ] + ) + + except Exception as e: + self.logger.error(f"Error creating user bucket for {username}: {str(e)}") + raise StorageError(str(e)) + + def create_school_buckets(self, school_id: str, school_name: str, admin_user_id: Optional[str] = None) -> Dict[str, Any]: + """Create storage buckets for a school.""" + try: + owner_id = admin_user_id or self.admin_user_id + if not owner_id: + raise ValueError("Admin user ID is required for school bucket creation") + + school_buckets = [ + { + "id": f"cc.institutes.{school_id}.public", + "name": f"{school_name} - Public Files", + "public": True, + "owner": owner_id, + "owner_id": school_id, + "file_size_limit": 50 * 1024 * 1024, # 50MB + "allowed_mime_types": [ + 'image/*', 'video/*', 'application/pdf', + 'application/msword', 'application/vnd.openxmlformats-officedocument.*', + 'text/plain', 'text/csv', 'application/json' + ] + }, + { + "id": f"cc.institutes.{school_id}.private", + "name": f"{school_name} - Private Files", + "public": False, + "owner": owner_id, + "owner_id": school_id, + "file_size_limit": 50 * 1024 * 1024, # 50MB + "allowed_mime_types": [ + 'image/*', 'video/*', 'application/pdf', + 'application/msword', 'application/vnd.openxmlformats-officedocument.*', + 'text/plain', 'text/csv', 'application/json' + ] + } + ] + + results = {} + for bucket in school_buckets: + try: + bucket_name = bucket.pop("name") # Remove name from options + result = self.create_bucket(name=bucket_name, **bucket) + results[bucket["id"]] = { + "status": "success", + "result": result + } + except Exception as e: + self.logger.error(f"Error creating school bucket {bucket['id']}: {str(e)}") + results[bucket["id"]] = { + "status": "error", + "error": str(e) + } + + return results + + except Exception as e: + self.logger.error(f"Error creating school buckets: {str(e)}") + raise StorageError(str(e)) + +class StorageUser(StorageManager): + """Storage user class for managing storage buckets with user role access.""" + + def __init__(self, user_id: Optional[str] = None): + """Initialize StorageUser with user role client.""" + super().__init__(SupabaseAnonClient()) + self.user_id = user_id \ No newline at end of file diff --git a/modules/database/tools/__init__.py b/modules/database/tools/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/modules/database/tools/__pycache__/__init__.cpython-311.pyc b/modules/database/tools/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e160e7078595ddfa1867724bb1ba7bd5d6a365ac GIT binary patch literal 148 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 literal 0 HcmV?d00001 diff --git a/modules/database/tools/__pycache__/neo4j_db_formatter.cpython-311.pyc b/modules/database/tools/__pycache__/neo4j_db_formatter.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..835b90be823d9f34a6e3c2aab92176fee0a1011e GIT binary patch literal 1065 zcma)4PiqrF6rV{_+Xkys6r@_@wH_qWO%QS_66!&vmmc&WcnOo8v02%ji8Hg+N`xLf z_zimSl2b+cWlRZF_Ehu>1bPb|e7oB=Em7%%dHeqU=J($0*SWbeLHYgQS^H;!kYA~D zD)huSzKX^!5#$qjMFf38Dh2;EmzI?96!9D%q1q)~(!=kh>|tpCEc}snY41GBSw>J% z*h4P+cyjqqZBdjiT{|VNT)K8z%uLpPAvpUiw@CY`HW7CaTWLT>JP6^nHn1Ue{S652 zc#B&Jibt|q29!+wC2PUw3bYEh!Pm<1KtU*-lg6%qilbI$2<_12N+7arOPfQ!l=s6h z?b?#YfosbX9!>*?Egl9UrGz9`v&-ds9(6*wCN#2DRbNNoHNf}N3A~e}$DNnwJ4wSZUWS7xneb3d0ZHtHNgzC0%dSZ4yY2{sOJWug4n z5;MFJT}ukwjc7F~;z|a*&ARd?2puHE|F_+DB##!JaYg=RFq5i^gjxsGZy^C%y(VQ!$CF}#b$ Rut+H#7H-npLo%td{yzv;5t9G_ literal 0 HcmV?d00001 diff --git a/modules/database/tools/__pycache__/neo4j_driver_tools.cpython-311.pyc b/modules/database/tools/__pycache__/neo4j_driver_tools.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3e162bdec7d5cb45eaed146bb726396016345046 GIT binary patch literal 7924 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 literal 0 HcmV?d00001 diff --git a/modules/database/tools/__pycache__/neo4j_session_tools.cpython-311.pyc b/modules/database/tools/__pycache__/neo4j_session_tools.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..067f4afcea180bbece7d639c006f6f05d0031a10 GIT binary patch literal 24567 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 T76fOoKxL&!?6o*#qR{^b%^kIr literal 0 HcmV?d00001 diff --git a/modules/database/tools/__pycache__/neontology_tools.cpython-311.pyc b/modules/database/tools/__pycache__/neontology_tools.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..05f7b82cace96cdbcc249d106015278184a97462 GIT binary patch literal 7320 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 literal 0 HcmV?d00001 diff --git a/modules/database/tools/__pycache__/queries.cpython-311.pyc b/modules/database/tools/__pycache__/queries.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2710a9557f661ad479677628cd73170985e422ff GIT binary patch literal 1203 zcmb7@&ubGw6vt;aX|kq?n_^Kf!ce6&O*P&;v?yz{+J$x_*_DP|l1*kIk#slCY*B-U z9{dBmDM+C=>3@@>>`Cw+2;^2g_-3;CQHw}7vtMT3zIpk~dvCtyav22A@6DH;nu5?T zv6wzMo{S&E;%Y7&X&&>~nOEqcm+beD}!X zA~v~LFS-4G=_sJbJ&%{D8@er*d!;Z4dc5@Z*kfIfKk9#ov^MkH&}&RRSQ@sA5d0R% z3HqUJpFJ6B+woAh$6!X+Ie=z6l~)V+7r4p9nOPEKLd#MxjdDB;`g4$FunCv(6r^}| zXQ&n9p%$46AFl;cu3iFRqQ3t?p==RFR7T{5Wrc|U9pvr3$|2dUShiEuP0O(dS!pq? zvQabaOI*-BvdZH;OrTq2g-;a>eFHUCtiiG*lUs=dD&Q#7^{MxMp`?=}Wh9yW##SJl zK;ySTpj7JG=Ql%jZE;*p(tly{5@vp~8Ijfwd>%5l>xWmcG>J8LV5@*6_-1TdU!M)t zt;I1(WG_SF=RkLM_sE7{m{|@@XOH+~-#joK@}T90?M{Pt2j0w~Y&bgXDI5C+ToHd} zuNuzlszuttu^(=1&I4KnRW>*i&Ba9SqCD>e?;3M*9%ZFPrr6^$$?`N&mU=x8u8QQC z^o?i*S(giSXL8q`vb$iD7pMc1Q37K;QZU{bp_!yG-V)1L{$8Th^&!gt)b5>RM@fwD V3)fh{^`ThCl3L1VPvlSL@(*;#3~B%X literal 0 HcmV?d00001 diff --git a/modules/database/tools/db_operations.py b/modules/database/tools/db_operations.py new file mode 100644 index 0000000..71865e0 --- /dev/null +++ b/modules/database/tools/db_operations.py @@ -0,0 +1,74 @@ +from dotenv import load_dotenv, find_dotenv +load_dotenv(find_dotenv()) +import os +import modules.logger_tool as logger +log_name = 'api_modules_database_tools_db_operations' +log_dir = os.getenv("LOG_PATH", "/logs") # Default path as fallback +logging = logger.get_logger( + name=log_name, + log_level=os.getenv("LOG_LEVEL", "DEBUG"), + log_path=log_dir, + log_file=log_name, + runtime=True, + log_format='default' +) +from fastapi.testclient import TestClient +from fastapi import HTTPException +import time +from neo4j import GraphDatabase + +class DatabaseNotFoundError(Exception): + """Exception raised when the specified database cannot be found.""" + def __init__(self, db_name): + super().__init__(f"Database '{db_name}' not found.") + +# Dev ?? +def get_client(): + from main import app # Delayed import to avoid circular dependency + return TestClient(app) + +# Ops ?? +def stop_database(db_name): + client = get_client() + try: + logging.debug(f"Stopping database {db_name}") + response = client.post("/database/admin/stop-database", json={"db_name": db_name}) + except DatabaseNotFoundError: + logging.info(f"Database {db_name} not found when attempting to stop. Skipping.") + else: + logging.info(response.text) + return response + +def drop_database(db_name): + client = get_client() + try: + response = client.post("/database/admin/drop-database", json={"db_name": db_name}) + except DatabaseNotFoundError: + logging.info(f"Database {db_name} not found when attempting to drop. Skipping.") + else: + logging.info(response.text) + return response + +def create_database(db_name): + client = get_client() + response = client.post("/database/admin/create-database", params={"db_name": db_name}) + logging.info(response.text) + return response + +def check_database_availability(db_name, retries=5, delay=5): # Increased delay + client = get_client() + attempt = 0 + while attempt < retries: + try: + logging.info(f"Attempt {attempt + 1}: Checking availability for database {db_name}") + response = client.get(f"/check-database-availability?db_name={db_name}") + if response.status_code == 200 and response.json().get('status') == "ready": + logging.info(f"Database {db_name} is ready.") + return response.json() + else: + logging.error(f"Database {db_name} is not available: {response.text}") + except Exception as e: + logging.error(f"Error checking database availability for {db_name} on attempt {attempt + 1}: {e}") + time.sleep(delay) # Increased delay before the next retry + attempt += 1 + raise HTTPException(status_code=503, detail="Database availability check failed after retries") \ No newline at end of file diff --git a/modules/database/tools/filesystem_tools.py b/modules/database/tools/filesystem_tools.py new file mode 100644 index 0000000..87c0a16 --- /dev/null +++ b/modules/database/tools/filesystem_tools.py @@ -0,0 +1,560 @@ +from dotenv import load_dotenv, find_dotenv +load_dotenv(find_dotenv()) +import os +import modules.logger_tool as logger +log_name = 'api_modules_database_tools_filesystem_tools' +log_dir = os.getenv("LOG_PATH", "/logs") # Default path as fallback +logging = logger.get_logger( + name=log_name, + log_level=os.getenv("LOG_LEVEL", "DEBUG"), + log_path=log_dir, + log_file=log_name, + runtime=True, + log_format='default' +) +from datetime import timedelta +import json +import re + +class ClassroomCopilotFilesystem: + def __init__(self, db_name: str, init_run_type: str = None): + logging.info(f"Initializing ClassroomCopilotFilesystem with db_name: {db_name} and init_run_type: {init_run_type}") + + self.db_name = db_name + + # Get base path from environment + self.base_path = os.getenv("NODE_FILESYSTEM_PATH") + if not self.base_path: + raise ValueError("NODE_FILESYSTEM_PATH environment variable not set") + + # Set root path based on init type + if init_run_type == "school": + self.root_path = os.path.join(self.base_path, "schools", self.db_name) + logging.debug(f"School root path: {self.root_path}") + elif init_run_type == "user": + self.root_path = os.path.join(self.base_path, "users", self.db_name) + logging.debug(f"User root path: {self.root_path}") + elif init_run_type == "multiplayer": + self.root_path = os.path.join(self.base_path, "multiplayer") + logging.debug(f"Multiplayer root path: {self.root_path}") + else: + self.root_path = os.path.join(self.base_path, self.db_name) + logging.debug(f"Default root path: {self.root_path}") + + # Ensure root directory exists + os.makedirs(self.root_path, exist_ok=True) + + logging.debug(f"Filesystem initialized with run type: {init_run_type} and root path: {self.root_path}") + + def log_directory_structure(self, start_path): + for root, dirs, files in os.walk(start_path): + level = root.replace(start_path, '').count(os.sep) + indent = ' ' * 4 * (level) + logging.info(f"{indent}{os.path.basename(root)}/") + subindent = ' ' * 4 * (level + 1) + for f in files: + logging.info(f"{subindent}{f}") + + def create_directory(self, path): + """Utility method to create a directory if it doesn't exist.""" + if not os.path.exists(path): + os.makedirs(path) + logging.info(f"Directory {path} created.") + return True + return False + + def sanitize_username(self, username): + return re.sub(r'[^\w\-_\.]', '_', username) + + def create_user_directory(self, username, user_type=None, school_path=None): + """Create a directory for a specific user.""" + sanitized_username = self.sanitize_username(username) + + if school_path: + # For school database: /schools/[school_db]/users/[user_type]/[username] + user_path = os.path.join(self.root_path, "users", user_type, sanitized_username) + else: + # For user database: /users/[user_db]/[username] + user_path = os.path.join(self.root_path, sanitized_username) + + logging.info(f"Creating user directory at {user_path}") + return self.create_directory(user_path), user_path + + def create_user_worker_directory(self, user_path, worker_code): + """Create a worker directory under the user directory.""" + # Create worker directory: [user_path]/[worker_code] + worker_path = os.path.join(user_path, worker_code) + logging.info(f"Creating worker directory at {worker_path}") + return self.create_directory(worker_path), worker_path + + def create_school_worker_directory(self, school_path, worker_type): + """Create a worker directory under the school directory.""" + worker_path = os.path.join(school_path, "workers", worker_type) + logging.info(f"Creating school worker directory at {worker_path}") + return self.create_directory(worker_path), worker_path + + def create_school_directory(self, school_uuid=None): + """Create a directory for a specific school.""" + logging.info(f"Creating school directory with school_uuid: {school_uuid}") + if school_uuid is None: + logging.debug(f"School UUID is None, creating school directory at {self.root_path}") + school_path = self.root_path + else: + logging.debug(f"School UUID is not None, creating school directory at {os.path.join(self.root_path, school_uuid)}") + school_path = os.path.join(self.root_path, school_uuid) + return self.create_directory(school_path), school_path + + def create_year_directory(self, year, calendar_path=None): + """Create a directory for a specific year.""" + if calendar_path is None: + year_path = os.path.join(self.root_path, "calendar", str(year)) + else: + year_path = os.path.join(calendar_path, "years", str(year)) + + return self.create_directory(year_path), year_path + + def create_month_directory(self, year, month, calendar_path=None): + """Create a directory for a specific month.""" + if calendar_path is None: + month_path = os.path.join(self.root_path, "calendar", str(year), "months", f"{month:02}") + else: + month_path = os.path.join(calendar_path, "years", str(year), "months", f"{month:02}") + + return self.create_directory(month_path), month_path + + def create_week_directory(self, year, week, calendar_path=None): + """Create a directory for a specific week.""" + if calendar_path is None: + week_path = os.path.join(self.root_path, "calendar", str(year), "weeks", f"{week}") + else: + week_path = os.path.join(calendar_path, "years", str(year), "weeks", f"{week}") + + return self.create_directory(week_path), week_path + + def create_day_directory(self, year, month, day, calendar_path=None): + """Create a directory for a specific day.""" + if calendar_path is None: + day_path = os.path.join(self.root_path, "calendar", str(year), "months", f"{month:02}", f"{day:02}") + else: + day_path = os.path.join(calendar_path, "years", str(year), "months", f"{month:02}", f"{day:02}") + + return self.create_directory(day_path), day_path + + def setup_calendar_directories(self, start_date, end_date, calendar_path=None): + """Setup directories for the range from start_date to end_date.""" + current_date = start_date + while current_date <= end_date: + year, month, day = current_date.year, current_date.month, current_date.day + if calendar_path is None: + _, year_path = self.create_year_directory(year) + _, month_path = self.create_month_directory(year, month) + _, week_path = self.create_week_directory(year, current_date.isocalendar()[1]) + _, day_path = self.create_day_directory(year, month, day) + else: + _, year_path = self.create_year_directory(year, calendar_path) + _, month_path = self.create_month_directory(year, month, calendar_path) + _, week_path = self.create_week_directory(year, current_date.isocalendar()[1], calendar_path) + _, day_path = self.create_day_directory(year, month, day, calendar_path) + current_date += timedelta(days=1) + return year_path, month_path, week_path, day_path + + def create_school_timetable_directory(self, school_path=None): + """Create a directory for the timetable.""" + if school_path is None: + timetable_path = os.path.join(self.root_path, "timetable") + else: + timetable_path = os.path.join(school_path, "timetable") + + return self.create_directory(timetable_path), timetable_path + + def create_school_timetable_year_directory(self, timetable_path, year): + """Create a directory for a specific academic year within the timetable.""" + year_path = os.path.join(timetable_path, "years", str(year)) + return self.create_directory(year_path), year_path + + def create_school_timetable_academic_term_directory(self, timetable_path, term_name, term_number): + """Create a directory for a specific term within an academic year.""" + term_path = os.path.join(timetable_path, "terms", f"{term_number}_{term_name.replace(' ', '_')}") + return self.create_directory(term_path), term_path + + def create_school_timetable_academic_term_break_directory(self, timetable_path, term_name): + """Create a directory for a specific term within an academic year.""" + term_path = os.path.join(timetable_path, "terms", "term_breaks", f"{term_name.replace(' ', '_')}") + return self.create_directory(term_path), term_path + + def create_school_timetable_academic_week_directory(self, timetable_path, week_number): + """Create a directory for a specific week within a term of a specific year.""" + week_path = os.path.join(timetable_path, "weeks", f"{week_number}") + return self.create_directory(week_path), week_path + + def create_school_timetable_academic_day_directory(self, timetable_path, academic_day): + """Create a directory for a specific day within a week of a term.""" + day_path = os.path.join(timetable_path, "days",f"{academic_day:02}") + return self.create_directory(day_path), day_path + + def create_school_timetable_period_directory(self, timetable_path, academic_day, period_dir): + """Create a directory for a specific period within a day.""" + period_path = os.path.join(timetable_path, "days",f"{academic_day:02}", f"{period_dir}") + return self.create_directory(period_path), period_path + + def create_school_curriculum_directory(self, school_path=None): + """Create a directory for the curriculum.""" + if school_path is None: + curriculum_path = os.path.join(self.root_path, "curriculum") + else: + curriculum_path = os.path.join(school_path, "curriculum") + + return self.create_directory(curriculum_path), curriculum_path + + def create_school_pastoral_directory(self, school_path=None): + """Create a directory for the pastoral.""" + if school_path is None: + pastoral_path = os.path.join(self.root_path, "pastoral") + else: + pastoral_path = os.path.join(school_path, "pastoral") + + return self.create_directory(pastoral_path), pastoral_path + + def create_school_department_directory(self, school_path, department): + """Create a directory for a specific department within the school.""" + department_path = os.path.join(school_path, "departments", f"{department}") + return self.create_directory(department_path), department_path + + def create_department_subject_directory(self, department_path, subject_name): + """Create a directory for a specific subject within a department.""" + subject_path = os.path.join(department_path, "subjects", f"{subject_name}") + return self.create_directory(subject_path), subject_path + + def create_curriculum_key_stage_syllabus_directory(self, curriculum_path, key_stage, subject_name, syllabus_id): + """Create a directory for a specific key stage syllabus under the curriculum structure.""" + # Replace spaces with underscores and remove any special characters from subject name + safe_subject_name = re.sub(r'[^\w\-_\.]', '_', subject_name) + syllabus_path = os.path.join(curriculum_path, "subjects", safe_subject_name, "key_stage_syllabuses", f"KS{key_stage}", f"KS{key_stage}.{safe_subject_name}") + return self.create_directory(syllabus_path), syllabus_path + + def create_pastoral_year_group_directory(self, pastoral_path, year_group): + """Create a directory for a specific year group under the pastoral structure.""" + year_group_path = os.path.join(pastoral_path, "year_groups", f"Y{year_group}") + return self.create_directory(year_group_path), year_group_path + + def create_curriculum_year_group_syllabus_directory(self, curriculum_path, subject_name, year_group, syllabus_id): + """Create a directory for a specific year group syllabus under the curriculum structure.""" + # Replace spaces with underscores and remove any special characters from subject name + safe_subject_name = re.sub(r'[^\w\-_\.]', '_', subject_name) + syllabus_path = os.path.join(curriculum_path, "subjects", safe_subject_name, "year_group_syllabuses", f"Y{year_group}", f"Y{year_group}.{safe_subject_name}") + return self.create_directory(syllabus_path), syllabus_path + + def create_curriculum_topic_directory(self, year_group_syllabus_path, topic_id): + """Create a directory for a specific topic under a year group syllabus.""" + topic_path = os.path.join(year_group_syllabus_path, "topics", f"{topic_id}") + return self.create_directory(topic_path), topic_path + + def create_curriculum_lesson_directory(self, topic_path, lesson_id): + """Create a directory for a specific lesson under a topic.""" + lesson_path = os.path.join(topic_path, "lessons", f"{lesson_id}") + return self.create_directory(lesson_path), lesson_path + + def create_curriculum_learning_statement_directory(self, lesson_path, statement_id): + """Create a directory for a specific learning statement under a lesson.""" + statement_path = os.path.join(lesson_path, "learning_statements", f"{statement_id}") + return self.create_directory(statement_path), statement_path + + # Remove or mark as deprecated the old methods + + + def create_teacher_timetable_directory(self, teacher_path): + teacher_timetable_path = os.path.join(teacher_path, "timetable") + return self.create_directory(teacher_timetable_path), teacher_timetable_path + + def create_teacher_class_directory(self, teacher_timetable_path, class_name): + class_path = os.path.join(teacher_timetable_path, "classes", class_name) + return self.create_directory(class_path), class_path + + def create_teacher_timetable_lesson_directory(self, class_path, lesson_id): + lesson_path = os.path.join(class_path, "timetabled_lessons", lesson_id) + return self.create_directory(lesson_path), lesson_path + + def create_teacher_planned_lesson_directory(self, class_path, lesson_id): + planned_lesson_path = os.path.join(class_path, "planned_lessons", lesson_id) + return self.create_directory(planned_lesson_path), planned_lesson_path + + # TLDraw File Creation + def create_default_tldraw_file(self, node_path, node_data): + """Create a tldraw file for a node.""" + logging.info(f"Creating tldraw file for node at {node_path}") + + # Ensure the directory exists + os.makedirs(node_path, exist_ok=True) + + tldraw_path = os.path.join(node_path, 'tldraw_file.json') + + # Create default tldraw content + tldraw_content = { + "document": { + "store": { + "document:document": { + "gridSize": 10, + "name": "", + "meta": {}, + "id": "document:document", + "typeName": "document" + }, + "page:page": { + "meta": {}, + "id": "page:page", + "name": "Page 1", + "index": "a1", + "typeName": "page" + } + }, + "schema": + {"schemaVersion":2, + "sequences": { + "com.tldraw.store":4, + "com.tldraw.asset":1, + "com.tldraw.camera":1, + "com.tldraw.document":2, + "com.tldraw.instance":25, + "com.tldraw.instance_page_state":5, + "com.tldraw.page":1, + "com.tldraw.instance_presence":5, + "com.tldraw.pointer":1, + "com.tldraw.shape":4, + "com.tldraw.asset.bookmark":2, + "com.tldraw.asset.image":5, + "com.tldraw.asset.video":5, + "com.tldraw.shape.arrow":5, + "com.tldraw.shape.bookmark":2, + "com.tldraw.shape.draw":2, + "com.tldraw.shape.embed":4, + "com.tldraw.shape.frame":0, + "com.tldraw.shape.geo":9, + "com.tldraw.shape.group":0, + "com.tldraw.shape.highlight":1, + "com.tldraw.shape.image":4, + "com.tldraw.shape.line":5, + "com.tldraw.shape.note":8, + "com.tldraw.shape.text":2, + "com.tldraw.shape.video":2, + "com.tldraw.shape.youtube-embed":0, + "com.tldraw.shape.calendar":0, + "com.tldraw.shape.microphone":1, + "com.tldraw.shape.transcriptionText":0, + "com.tldraw.shape.slide":0,"com.tldraw.shape.slideshow":0, + "com.tldraw.shape.user_node":1, + "com.tldraw.shape.developer_node":1, + "com.tldraw.shape.student_node":1, + "com.tldraw.shape.teacher_node":1, + "com.tldraw.shape.calendar_node":1, + "com.tldraw.shape.calendar_year_node":1, + "com.tldraw.shape.calendar_month_node":1, + "com.tldraw.shape.calendar_week_node":1, + "com.tldraw.shape.calendar_day_node":1, + "com.tldraw.shape.calendar_time_chunk_node":1, + "com.tldraw.shape.teacher_timetable_node":1, + "com.tldraw.shape.timetable_lesson_node":1, + "com.tldraw.shape.planned_lesson_node":1, + "com.tldraw.shape.pastoral_structure_node":1, + "com.tldraw.shape.year_group_node":1, + "com.tldraw.shape.curriculum_structure_node":1, + "com.tldraw.shape.key_stage_node":1, + "com.tldraw.shape.key_stage_syllabus_node":1, + "com.tldraw.shape.year_group_syllabus_node":1, + "com.tldraw.shape.subject_node":1, + "com.tldraw.shape.topic_node":1, + "com.tldraw.shape.topic_lesson_node":1, + "com.tldraw.shape.learning_statement_node":1, + "com.tldraw.shape.science_lab_node":1, + "com.tldraw.shape.school_timetable_node":1, + "com.tldraw.shape.academic_year_node":1, + "com.tldraw.shape.academic_term_node":1, + "com.tldraw.shape.academic_week_node":1, + "com.tldraw.shape.academic_day_node":1, + "com.tldraw.shape.academic_period_node":1, + "com.tldraw.shape.registration_period_node":1, + "com.tldraw.shape.school_node":1, + "com.tldraw.shape.department_node":1, + "com.tldraw.shape.room_node":1, + "com.tldraw.shape.subject_class_node":1, + "com.tldraw.shape.general_relationship":1, + "com.tldraw.binding.arrow":0, + "com.tldraw.binding.slide-layout":0 + } + }, + "recordVersions": { + "asset": { "version": 1, "subTypeKey": "type", "subTypeVersions": {} }, + "camera": { "version": 1 }, + "document": { "version": 2 }, + "instance": { "version": 21 }, + "instance_page_state": { "version": 5 }, + "page": { "version": 1 }, + "shape": { "version": 3, "subTypeKey": "type", "subTypeVersions": {} }, + "instance_presence": { "version": 5 }, + "pointer": { "version": 1 } + }, + "rootShapeIds":[], + "bindings":[], + "assets":[] + }, + "session": { + "version": 0, + "currentPageId": "page:page", + "pageStates": [{ + "pageId": "page:page", + "camera": {"x": 0, "y": 0, "z": 1}, + "selectedShapeIds": [] + }] + }, + "node_data": node_data + } + + with open(tldraw_path, 'w') as f: + json.dump(tldraw_content, f, indent=4) + + logging.info(f"tldraw file created at {tldraw_path}") + return tldraw_path + + def create_default_tldraw_file_in_storage(self, admin_supabase, bucket_id, file_path, node_data): + """Create a tldraw file in Supabase storage.""" + logging.info(f"Creating tldraw file in storage at {file_path}") + + # Create default tldraw content + tldraw_content = { + "document": { + "store": { + "document:document": { + "gridSize": 10, + "name": "", + "meta": {}, + "id": "document:document", + "typeName": "document" + }, + "page:page": { + "meta": {}, + "id": "page:page", + "name": "Page 1", + "index": "a1", + "typeName": "page" + } + }, + "schema": + {"schemaVersion":2, + "sequences": { + "com.tldraw.store":4, + "com.tldraw.asset":1, + "com.tldraw.camera":1, + "com.tldraw.document":2, + "com.tldraw.instance":25, + "com.tldraw.instance_page_state":5, + "com.tldraw.page":1, + "com.tldraw.instance_presence":5, + "com.tldraw.pointer":1, + "com.tldraw.shape":4, + "com.tldraw.asset.bookmark":2, + "com.tldraw.asset.image":5, + "com.tldraw.asset.video":5, + "com.tldraw.shape.arrow":5, + "com.tldraw.shape.bookmark":2, + "com.tldraw.shape.draw":2, + "com.tldraw.shape.embed":4, + "com.tldraw.shape.frame":0, + "com.tldraw.shape.geo":9, + "com.tldraw.shape.group":0, + "com.tldraw.shape.highlight":1, + "com.tldraw.shape.image":4, + "com.tldraw.shape.line":5, + "com.tldraw.shape.note":8, + "com.tldraw.shape.text":2, + "com.tldraw.shape.video":2, + "com.tldraw.shape.youtube-embed":0, + "com.tldraw.shape.calendar":0, + "com.tldraw.shape.microphone":1, + "com.tldraw.shape.transcriptionText":0, + "com.tldraw.shape.slide":0,"com.tldraw.shape.slideshow":0, + "com.tldraw.shape.user_node":1, + "com.tldraw.shape.developer_node":1, + "com.tldraw.shape.student_node":1, + "com.tldraw.shape.teacher_node":1, + "com.tldraw.shape.calendar_node":1, + "com.tldraw.shape.calendar_year_node":1, + "com.tldraw.shape.calendar_month_node":1, + "com.tldraw.shape.calendar_week_node":1, + "com.tldraw.shape.calendar_day_node":1, + "com.tldraw.shape.calendar_time_chunk_node":1, + "com.tldraw.shape.teacher_timetable_node":1, + "com.tldraw.shape.timetable_lesson_node":1, + "com.tldraw.shape.planned_lesson_node":1, + "com.tldraw.shape.pastoral_structure_node":1, + "com.tldraw.shape.year_group_node":1, + "com.tldraw.shape.curriculum_structure_node":1, + "com.tldraw.shape.key_stage_node":1, + "com.tldraw.shape.key_stage_syllabus_node":1, + "com.tldraw.shape.year_group_syllabus_node":1, + "com.tldraw.shape.subject_node":1, + "com.tldraw.shape.topic_node":1, + "com.tldraw.shape.topic_lesson_node":1, + "com.tldraw.shape.learning_statement_node":1, + "com.tldraw.shape.science_lab_node":1, + "com.tldraw.shape.school_timetable_node":1, + "com.tldraw.shape.academic_year_node":1, + "com.tldraw.shape.academic_term_node":1, + "com.tldraw.shape.academic_week_node":1, + "com.tldraw.shape.academic_day_node":1, + "com.tldraw.shape.academic_period_node":1, + "com.tldraw.shape.registration_period_node":1, + "com.tldraw.shape.school_node":1, + "com.tldraw.shape.department_node":1, + "com.tldraw.shape.room_node":1, + "com.tldraw.shape.subject_class_node":1, + "com.tldraw.shape.general_relationship":1, + "com.tldraw.binding.arrow":0, + "com.tldraw.binding.slide-layout":0 + } + }, + "recordVersions": { + "asset": { "version": 1, "subTypeKey": "type", "subTypeVersions": {} }, + "camera": { "version": 1 }, + "document": { "version": 2 }, + "instance": { "version": 21 }, + "instance_page_state": { "version": 5 }, + "page": { "version": 1 }, + "shape": { "version": 3, "subTypeKey": "type", "subTypeVersions": {} }, + "instance_presence": { "version": 5 }, + "pointer": { "version": 1 } + }, + "rootShapeIds":[], + "bindings":[], + "assets":[] + }, + "session": { + "version": 0, + "currentPageId": "page:page", + "pageStates": [{ + "pageId": "page:page", + "camera": {"x": 0, "y": 0, "z": 1}, + "selectedShapeIds": [] + }] + }, + "node_data": node_data + } + + # Convert the content to JSON string + tldraw_json = json.dumps(tldraw_content, indent=4) + + try: + # Upload the file to Supabase storage + result = admin_supabase.storage.from_(bucket_id).upload( + path=file_path, + file=tldraw_json, + file_options={"content-type": "application/json"} + ) + + if result.get('error'): + logging.error(f"Error creating tldraw file in storage: {result['error']}") + raise Exception(f"Failed to create tldraw file: {result['error']}") + + logging.info(f"tldraw file created in storage at {file_path}") + return True + except Exception as e: + logging.error(f"Error creating tldraw file in storage: {str(e)}") + raise e \ No newline at end of file diff --git a/modules/database/tools/navigation/__init__.py b/modules/database/tools/navigation/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/modules/database/tools/navigation/user_navigation.py b/modules/database/tools/navigation/user_navigation.py new file mode 100644 index 0000000..d0930bb --- /dev/null +++ b/modules/database/tools/navigation/user_navigation.py @@ -0,0 +1,491 @@ +import os +from modules.logger_tool import initialise_logger +logger = initialise_logger(__name__, os.getenv("LOG_LEVEL"), os.getenv("LOG_PATH"), 'default', True) +import modules.database.tools.neo4j_driver_tools as driver_tools +import modules.database.tools.neo4j_session_tools as session_tools +from datetime import datetime, timedelta +from typing import List, Optional, Dict, Any + +def get_static_nodes(context: str, db_name: str) -> List[Dict[str, Any]]: + """Get static nodes for a specific context.""" + if context == 'workers': + # For workers context, show teacher node first, then timetables and classes + query = """ + MATCH (t:Teacher) + RETURN DISTINCT { + id: t.unique_id, + path: t.path, + label: t.teacher_name_formal, + type: 'Teacher', + isStatic: true, + order: 0, + section: 'Root' + } as node + UNION ALL + MATCH (t:UserTeacherTimetable) + RETURN DISTINCT { + id: t.unique_id, + path: t.path, + label: t.name, + type: 'UserTeacherTimetable', + isStatic: true, + order: 1, + section: 'Timetables' + } as node + UNION ALL + MATCH (t:UserTeacherTimetable)-[:HAS_CLASS]->(c:Class) + RETURN DISTINCT { + id: c.unique_id, + path: c.path, + label: c.name, + type: 'Class', + isStatic: true, + order: 2, + section: 'Classes' + } as node + """ + elif context == 'user': + # For user context, show the user node + query = """ + MATCH (u:User) + RETURN DISTINCT { + id: u.unique_id, + path: u.path, + label: u.user_name, + type: 'User', + isStatic: true, + order: 0, + section: 'Root' + } as node + """ + else: + # For calendar context, show today's calendar node first, then other calendar nodes + today = datetime.now().strftime("%Y-%m-%d") + query = """ + MATCH (n:Calendar) + WITH n, + CASE + WHEN date($today) >= date(n.start_date) AND date($today) <= date(n.end_date) + THEN 0 + ELSE 1 + END as nodeOrder + RETURN DISTINCT { + id: n.unique_id, + path: n.path, + label: n.name, + type: 'Calendar', + isStatic: true, + order: nodeOrder, + section: CASE nodeOrder + WHEN 0 THEN 'Today' + ELSE 'Calendar' + END + } as node + ORDER BY node.order, node.label + """ + + try: + with driver_tools.get_session(database=db_name) as session: + result = session.run(query, today=datetime.now().strftime("%Y-%m-%d")) + return [record["node"] for record in result] + except Exception as e: + logger.error(f"Error getting static nodes: {str(e)}") + return [] + +def get_today_calendar_node(db_name: str) -> Optional[Dict[str, Any]]: + """Get today's calendar node.""" + today = datetime.now().strftime("%Y-%m-%d") + query = """ + MATCH (n:Calendar) + WHERE date($today) >= date(n.start_date) AND date($today) <= date(n.end_date) + RETURN n.unique_id as id, n.path as path, n.name as label, + 'Calendar' as type + LIMIT 1 + """ + try: + with driver_tools.get_session(database=db_name) as session: + result = session.run(query, today=today) + record = result.single() + return dict(record) if record else None + except Exception as e: + logger.error(f"Error getting today's calendar node: {str(e)}") + return None + +def get_relative_calendar_node(day_offset: int, db_name: str) -> Optional[Dict[str, Any]]: + """Get calendar node relative to today.""" + target_date = (datetime.now() + timedelta(days=day_offset)).strftime("%Y-%m-%d") + query = """ + MATCH (n:Calendar) + WHERE date($target_date) >= date(n.start_date) AND date($target_date) <= date(n.end_date) + RETURN n.unique_id as id, n.path as path, n.name as label, + 'Calendar' as type + LIMIT 1 + """ + try: + with driver_tools.get_session(database=db_name) as session: + result = session.run(query, target_date=target_date) + record = result.single() + return dict(record) if record else None + except Exception as e: + logger.error(f"Error getting relative calendar node: {str(e)}") + return None + +def get_next_month_node(db_name: str) -> Optional[Dict[str, Any]]: + """Get next month's calendar node.""" + next_month_start = (datetime.now().replace(day=1) + timedelta(days=32)).replace(day=1).strftime("%Y-%m-%d") + query = """ + MATCH (n:Calendar) + WHERE date($next_month_start) >= date(n.start_date) AND date($next_month_start) <= date(n.end_date) + RETURN n.unique_id as id, n.path as path, n.name as label, + 'Calendar' as type + LIMIT 1 + """ + try: + with driver_tools.get_session(database=db_name) as session: + result = session.run(query, next_month_start=next_month_start) + record = result.single() + return dict(record) if record else None + except Exception as e: + logger.error(f"Error getting next month node: {str(e)}") + return None + +def get_previous_month_node(db_name: str) -> Optional[Dict[str, Any]]: + """Get previous month's calendar node.""" + prev_month_start = (datetime.now().replace(day=1) - timedelta(days=1)).replace(day=1).strftime("%Y-%m-%d") + query = """ + MATCH (n:Calendar) + WHERE date($prev_month_start) >= date(n.start_date) AND date($prev_month_start) <= date(n.end_date) + RETURN n.unique_id as id, n.path as path, n.name as label, + 'Calendar' as type + LIMIT 1 + """ + try: + with driver_tools.get_session(database=db_name) as session: + result = session.run(query, prev_month_start=prev_month_start) + record = result.single() + return dict(record) if record else None + except Exception as e: + logger.error(f"Error getting previous month node: {str(e)}") + return None + +def get_user_timetables(db_name: str) -> List[Dict[str, Any]]: + """Get user's timetables.""" + query = """ + MATCH (t:UserTeacherTimetable) + RETURN t.unique_id as id, t.path as path, t.name as label, + 'UserTeacherTimetable' as type + """ + try: + with driver_tools.get_session(database=db_name) as session: + result = session.run(query) + return [dict(record) for record in result] + except Exception as e: + logger.error(f"Error getting user timetables: {str(e)}") + return [] + +def get_timetable_classes(timetable_id: str, db_name: str) -> List[Dict[str, Any]]: + """Get classes for a timetable.""" + query = """ + MATCH (t:UserTeacherTimetable {unique_id: $timetable_id})-[:HAS_CLASS]->(c:Class) + RETURN c.unique_id as id, c.path as path, c.name as label, + 'Class' as type + """ + try: + with driver_tools.get_session(database=db_name) as session: + result = session.run(query, timetable_id=timetable_id) + return [dict(record) for record in result] + except Exception as e: + logger.error(f"Error getting timetable classes: {str(e)}") + return [] + +def get_next_lesson(class_id: str, db_name: str) -> Optional[Dict[str, Any]]: + """Get next lesson for a class.""" + now = datetime.now().strftime("%Y-%m-%d %H:%M") + query = """ + MATCH (c:Class {unique_id: $class_id})-[:HAS_LESSON]->(l:Lesson) + WHERE l.start_time > $now + RETURN l.unique_id as id, l.path as path, l.name as label, + 'Lesson' as type + ORDER BY l.start_time ASC + LIMIT 1 + """ + try: + with driver_tools.get_session(database=db_name) as session: + result = session.run(query, class_id=class_id, now=now) + record = result.single() + return dict(record) if record else None + except Exception as e: + logger.error(f"Error getting next lesson: {str(e)}") + return None + +def get_previous_lesson(class_id: str, db_name: str) -> Optional[Dict[str, Any]]: + """Get previous lesson for a class.""" + now = datetime.now().strftime("%Y-%m-%d %H:%M") + query = """ + MATCH (c:Class {unique_id: $class_id})-[:HAS_LESSON]->(l:Lesson) + WHERE l.start_time < $now + RETURN l.unique_id as id, l.path as path, l.name as label, + 'Lesson' as type + ORDER BY l.start_time DESC + LIMIT 1 + """ + try: + with driver_tools.get_session(database=db_name) as session: + result = session.run(query, class_id=class_id, now=now) + record = result.single() + return dict(record) if record else None + except Exception as e: + logger.error(f"Error getting previous lesson: {str(e)}") + return None + +def save_shared_snapshot(path: str, room_id: str, snapshot: Dict[str, Any]) -> bool: + """Save snapshot to a shared room.""" + try: + # Save the snapshot to the shared room's storage + session_tools.save_tldraw_node_file(path, room_id, snapshot) + return True + except Exception as e: + logger.error(f"Error saving shared snapshot: {str(e)}") + return False + +def get_connected_nodes_for_workers(node_id: str, db_name: str) -> List[Dict[str, Any]]: + """Get connected nodes specific to the workers context.""" + query = """ + MATCH (n {unique_id: $node_id}) + WITH n + CALL { + WITH n + MATCH (n:UserTeacherTimetable)-[:HAS_CLASS]->(c:Class) + RETURN c.unique_id as id, c.path as path, c.name as label, + 'Class' as type + UNION + MATCH (n:Class)<-[:HAS_CLASS]-(t:UserTeacherTimetable) + RETURN t.unique_id as id, t.path as path, t.name as label, + 'UserTeacherTimetable' as type + UNION + MATCH (n:Class)-[:HAS_LESSON]->(l:Lesson) + RETURN l.unique_id as id, l.path as path, l.name as label, + 'Lesson' as type + } + RETURN DISTINCT id, path, label, type + """ + try: + with driver_tools.get_session(database=db_name) as session: + result = session.run(query, node_id=node_id) + return [dict(record) for record in result] + except Exception as e: + logger.error(f"Error getting connected nodes for workers: {str(e)}") + return [] + +def get_connected_nodes(node_id: str, db_name: str, context: str = None) -> List[Dict[str, Any]]: + """Get connected nodes based on context.""" + if context == 'workers': + return get_connected_nodes_for_workers(node_id, db_name) + + # Default query for other contexts + query = """ + MATCH (n {unique_id: $node_id})-[r]-(connected) + RETURN DISTINCT connected.unique_id as id, connected.path as path, + connected.name as label, labels(connected)[0] as type + """ + try: + with driver_tools.get_session(database=db_name) as session: + result = session.run(query, node_id=node_id) + return [dict(record) for record in result] + except Exception as e: + logger.error(f"Error getting connected nodes: {str(e)}") + return [] + +## Worker Navigation + +def get_worker_structure(db_name: str) -> Dict[str, Any]: + """Get the complete worker structure including schools, departments, timetables, classes, and lessons.""" + try: + query = """ + // Match all worker-related nodes + MATCH (s:School) + OPTIONAL MATCH (s)-[:HAS_DEPARTMENT]->(d:Department) + OPTIONAL MATCH (d)-[:HAS_TIMETABLE]->(t:UserTeacherTimetable) + OPTIONAL MATCH (t)-[:HAS_CLASS]->(c:Class) + OPTIONAL MATCH (c)-[:HAS_LESSON]->(l:TimetableLesson) + WITH s, d, t, c, l + ORDER BY s.school_name, d.department_code, t.name, c.class_code, l.start_time + + // Collect all nodes + RETURN { + schools: collect(DISTINCT { + id: s.unique_id, + path: s.path, + name: s.school_name, + __primarylabel__: 'School' + }), + departments: collect(DISTINCT { + id: d.unique_id, + path: d.path, + code: d.department_code, + school_id: s.unique_id, + __primarylabel__: 'Department' + }), + timetables: collect(DISTINCT { + id: t.unique_id, + path: t.path, + name: t.name, + department_id: d.unique_id, + __primarylabel__: 'UserTeacherTimetable' + }), + classes: collect(DISTINCT { + id: c.unique_id, + path: c.path, + code: c.class_code, + timetable_id: t.unique_id, + __primarylabel__: 'Class' + }), + lessons: collect(DISTINCT { + id: l.unique_id, + path: l.path, + start_time: l.start_time, + class_id: c.unique_id, + __primarylabel__: 'TimetableLesson' + }) + } as structure + """ + + with driver_tools.get_session(database=db_name) as session: + result = session.run(query) + record = result.single() + if not record: + logger.error('No worker structure found') + return None + + return { + "status": "success", + "structure": record["structure"] + } + + except Exception as e: + logger.error(f"Error getting worker structure: {str(e)}") + return None + +def get_school_node(school_id: str, db_name: str) -> Optional[Dict[str, Any]]: + """Get a specific school node.""" + query = """ + MATCH (s:School {unique_id: $school_id}) + RETURN { + id: s.unique_id, + path: s.path, + name: s.school_name, + __primarylabel__: 'School' + } as node + """ + try: + with driver_tools.get_session(database=db_name) as session: + result = session.run(query, school_id=school_id) + record = result.single() + return record["node"] if record else None + except Exception as e: + logger.error(f"Error getting school node: {str(e)}") + return None + +def get_department_node(dept_id: str, db_name: str) -> Optional[Dict[str, Any]]: + """Get a specific department node.""" + query = """ + MATCH (d:Department {unique_id: $dept_id}) + RETURN { + id: d.unique_id, + path: d.path, + code: d.department_code, + __primarylabel__: 'Department' + } as node + """ + try: + with driver_tools.get_session(database=db_name) as session: + result = session.run(query, dept_id=dept_id) + record = result.single() + return record["node"] if record else None + except Exception as e: + logger.error(f"Error getting department node: {str(e)}") + return None + +def get_timetable_node(timetable_id: str, db_name: str) -> Optional[Dict[str, Any]]: + """Get a specific timetable node.""" + query = """ + MATCH (t:UserTeacherTimetable {unique_id: $timetable_id}) + RETURN { + id: t.unique_id, + path: t.path, + name: t.name, + __primarylabel__: 'UserTeacherTimetable' + } as node + """ + try: + with driver_tools.get_session(database=db_name) as session: + result = session.run(query, timetable_id=timetable_id) + record = result.single() + return record["node"] if record else None + except Exception as e: + logger.error(f"Error getting timetable node: {str(e)}") + return None + +def get_class_node(class_id: str, db_name: str) -> Optional[Dict[str, Any]]: + """Get a specific class node.""" + query = """ + MATCH (c:Class {unique_id: $class_id}) + RETURN { + id: c.unique_id, + path: c.path, + code: c.class_code, + __primarylabel__: 'Class' + } as node + """ + try: + with driver_tools.get_session(database=db_name) as session: + result = session.run(query, class_id=class_id) + record = result.single() + return record["node"] if record else None + except Exception as e: + logger.error(f"Error getting class node: {str(e)}") + return None + +def get_lesson_node(lesson_id: str, db_name: str) -> Optional[Dict[str, Any]]: + """Get a specific lesson node.""" + query = """ + MATCH (l:TimetableLesson {unique_id: $lesson_id}) + RETURN { + id: l.unique_id, + path: l.path, + start_time: l.start_time, + __primarylabel__: 'TimetableLesson' + } as node + """ + try: + with driver_tools.get_session(database=db_name) as session: + result = session.run(query, lesson_id=lesson_id) + record = result.single() + return record["node"] if record else None + except Exception as e: + logger.error(f"Error getting lesson node: {str(e)}") + return None + +def get_current_lesson(db_name: str) -> Optional[Dict[str, Any]]: + """Get the current or next upcoming lesson.""" + now = datetime.now().strftime("%Y-%m-%d %H:%M") + query = """ + MATCH (l:TimetableLesson) + WHERE l.start_time >= $now + RETURN { + id: l.unique_id, + path: l.path, + start_time: l.start_time, + __primarylabel__: 'TimetableLesson' + } as node + ORDER BY l.start_time ASC + LIMIT 1 + """ + try: + with driver_tools.get_session(database=db_name) as session: + result = session.run(query, now=now) + record = result.single() + return record["node"] if record else None + except Exception as e: + logger.error(f"Error getting current lesson: {str(e)}") + return None \ No newline at end of file diff --git a/modules/database/tools/neo4j_db_formatter.py b/modules/database/tools/neo4j_db_formatter.py new file mode 100644 index 0000000..75c420a --- /dev/null +++ b/modules/database/tools/neo4j_db_formatter.py @@ -0,0 +1,21 @@ +def format_user_email_for_neo_db(user_email): + """Format user email for Neo4j database name. + + Neo4j database names can only contain letters, numbers, dots, and dashes. + We'll convert the email to a valid format: + example@domain.com -> ccuser-example-at-domain-com + + Args: + user_email: Email address to format + + Returns: + Formatted string suitable for Neo4j database name + """ + # Convert to lowercase and replace special characters + sanitized = user_email.lower() + sanitized = sanitized.replace('@', 'at') + sanitized = sanitized.replace('.', 'dot') + sanitized = sanitized.replace('_', 'underscore') + sanitized = sanitized.replace('-', 'dash') + + return f"{sanitized}" \ No newline at end of file diff --git a/modules/database/tools/neo4j_driver_tools.py b/modules/database/tools/neo4j_driver_tools.py new file mode 100644 index 0000000..61d48f6 --- /dev/null +++ b/modules/database/tools/neo4j_driver_tools.py @@ -0,0 +1,153 @@ +from dotenv import load_dotenv, find_dotenv +load_dotenv(find_dotenv()) +import os +import time +from typing import Optional, Tuple, Generator +from modules.logger_tool import initialise_logger +from neo4j import GraphDatabase as gd, Driver, Session +from contextlib import contextmanager + +logger = initialise_logger(__name__, os.getenv("LOG_LEVEL"), os.getenv("LOG_PATH"), 'default', True) + +def _retry_with_backoff( + func, + max_attempts: int = 10, # Increased from 3 to 10 + initial_delay: float = 2.0, # Increased from 1 to 2 seconds + max_total_wait: float = 60.0, # Maximum total time to wait (60 seconds) + max_delay: float = 10.0 # Maximum delay between retries +) -> any: + """ + Helper function to retry operations with exponential backoff. + + Args: + func: Function to retry + max_attempts: Maximum number of retry attempts + initial_delay: Initial delay between retries in seconds + max_total_wait: Maximum total time to wait before giving up + max_delay: Maximum delay between retries + """ + attempt = 0 + delay = initial_delay + start_time = time.time() + + while attempt < max_attempts: + try: + return func() + except Exception as e: + attempt += 1 + elapsed_time = time.time() - start_time + + # Check if we've exceeded the maximum total wait time + if elapsed_time >= max_total_wait: + logger.error(f"Exceeded maximum total wait time of {max_total_wait} seconds") + raise + + if attempt == max_attempts: + logger.error(f"Final attempt {attempt} failed: {e}") + raise + + # Calculate next delay with exponential backoff, but cap it + delay = min(delay * 2, max_delay) + + # If we're in a container initialization scenario, provide more context + if "Connection refused" in str(e): + logger.warning( + f"Attempt {attempt} failed: Connection refused. " + f"This might indicate that Neo4j is still starting up. " + f"Retrying in {delay:.1f} seconds... " + f"(Total elapsed: {elapsed_time:.1f}s)" + ) + else: + logger.warning(f"Attempt {attempt} failed: {e}. Retrying in {delay:.1f} seconds...") + + time.sleep(delay) + +def get_driver(db_name: Optional[str] = None, url: Optional[str] = None, auth: Optional[Tuple[str, str]] = None) -> Optional[Driver]: + if url is None: + url = os.getenv("APP_BOLT_URL") + username = os.getenv("USER_NEO4J") + password = os.getenv("PASSWORD_NEO4J") + if not username or not password: + logger.error("Neo4j credentials not found in environment") + return None + auth = (username, password) + + if auth is None: + logger.error("No authentication credentials provided") + return None + + def create_driver(): + logger.info(f"Attempting to connect to Neo4j at {url}") + driver = gd.driver(url, auth=auth) + driver.verify_connectivity() + logger.info(f"Connected to Neo4j at {url}") + return driver + + try: + # Use more lenient retry parameters for initial connection + driver = _retry_with_backoff( + create_driver, + max_attempts=10, + initial_delay=2.0, + max_total_wait=60.0, + max_delay=10.0 + ) + except Exception as e: + logger.error(f"Failed to establish Neo4j connection after all retries: {e}") + return None + + # Test the connection with the specific database + if db_name and driver: + def verify_database(): + with driver.session(database=db_name) as session: + result = session.run("RETURN 'Connection successful' AS message") + record = result.single() + if not record or not record.get("message"): + raise Exception(f"Failed to verify database {db_name} connection") + logger.info(f"Connection to Neo4j at {url} with database {db_name} successful") + + try: + # Use more lenient retry parameters for database verification + _retry_with_backoff( + verify_database, + max_attempts=10, + initial_delay=2.0, + max_total_wait=60.0, + max_delay=10.0 + ) + except Exception as e: + logger.error(f"Failed to connect to database {db_name} after all retries: {e}") + driver.close() + return None + + return driver + +def close_driver(driver: Optional[Driver]) -> None: + if driver: + logger.info("Closing driver") + driver.close() + +# Global driver instance +_driver: Optional[Driver] = None + +def get_global_driver() -> Optional[Driver]: + """Get or create the global Neo4j driver instance.""" + global _driver + if _driver is None: + _driver = get_driver() + return _driver + +@contextmanager +def get_session(database: Optional[str] = None) -> Generator[Session, None, None]: + """Get a Neo4j session using the global driver.""" + driver = get_global_driver() + if driver is None: + raise Exception("Failed to get Neo4j driver") + + session = None + try: + session = driver.session(database=database) + yield session + finally: + if session: + session.close() \ No newline at end of file diff --git a/modules/database/tools/neo4j_http_tools.py b/modules/database/tools/neo4j_http_tools.py new file mode 100644 index 0000000..c81a27d --- /dev/null +++ b/modules/database/tools/neo4j_http_tools.py @@ -0,0 +1,64 @@ +from dotenv import load_dotenv, find_dotenv +load_dotenv(find_dotenv()) +import os +import modules.logger_tool as logger +log_name = 'api_modules_database_tools_neo4j_http_tools' +log_dir = os.getenv("LOG_PATH", "/logs") # Default path as fallback +logging = logger.get_logger( + name=log_name, + log_level=os.getenv("LOG_LEVEL", "DEBUG"), + log_path=log_dir, + log_file=log_name, + runtime=True, + log_format='default' +) +import requests +import base64 + +dev_mode = os.getenv('DEV_MODE', 'false') + +def send_query(query, encoded_credentials=None, params=None, method='POST', database="system", endpoint="/tx/commit"): + if encoded_credentials is None: + logging.debug(f"Sending query to Neo4j: {query}") + credentials = f"{os.getenv('USER_NEO4J')}:{os.getenv('PASSWORD_NEO4J')}" + encoded_credentials = base64.b64encode(credentials.encode()).decode('utf-8') + logging.debug(f"Encoded credentials: {encoded_credentials}") + + # Use HTTPS for production, HTTP for development + neo4j_url = f"{os.getenv('APP_GRAPH_URL')}/db/{database}{endpoint}" + logging.debug(f"URL: {neo4j_url}") + headers = {'Content-Type': 'application/json', 'Authorization': f'Basic {encoded_credentials}'} + logging.debug(f"Headers: {headers}") + data = { + "statements": [{ + "statement": query, + "parameters": params or {} + }] + } + logging.debug(f"Data: {data}") + + try: + logging.debug(f"Sending request to Neo4j...") + response = requests.request(method, neo4j_url, json=data, headers=headers) + response.raise_for_status() # Raise an HTTPError for bad responses + logging.debug(f"Response status code: {response.status_code}") + logging.debug(f"Response content: {response.content}") + return response.json() + except requests.exceptions.RequestException as e: + logging.error(f"Request to Neo4j failed: {e}") + raise + +def create_node(node_type: str, node_data: dict, db=None): + query = f"CREATE (n:{node_type} $props) RETURN id(n)" + params = {"props": node_data} + response = send_query(query, database=db, params=params) + return response['results'][0]['data'][0]['meta'][0]['id'] + +def create_relationship(relationship_data: dict, db=None): + query = """ + MATCH (a), (b) WHERE id(a) = $start_id AND id(b) = $end_id + CREATE (a)-[r:{rel_type}]->(b) + RETURN r + """ + params = {"start_id": relationship_data['start_node']['id'], "end_id": relationship_data['end_node']['id'], "rel_type": relationship_data['relationship_type'], "props": relationship_data.get('properties', {})} + return send_query("/db/neo4j/tx/commit", query, params, db=db) \ No newline at end of file diff --git a/modules/database/tools/neo4j_session_tools.py b/modules/database/tools/neo4j_session_tools.py new file mode 100644 index 0000000..8bbce5f --- /dev/null +++ b/modules/database/tools/neo4j_session_tools.py @@ -0,0 +1,504 @@ +from dotenv import load_dotenv, find_dotenv +load_dotenv(find_dotenv()) +import os +import modules.logger_tool as logger +log_name = 'api_modules_database_tools_neo4j_session_tools' +log_dir = os.getenv("LOG_PATH", "/logs") # Default path as fallback +logging = logger.get_logger( + name=log_name, + log_level=os.getenv("LOG_LEVEL", "DEBUG"), + log_path=log_dir, + log_file=log_name, + runtime=True, + log_format='default' +) +import modules.database.tools.queries as query +from contextlib import suppress + +def get_node_by_unique_id_and_adjacent_nodes(session, unique_id): + return session.read_transaction(_get_node_by_unique_id_and_adjacent_nodes, unique_id) + +def _get_node_by_unique_id_and_adjacent_nodes(tx, unique_id): + query = """ + MATCH (n {unique_id: $unique_id}) + OPTIONAL MATCH (n)-[r]-(adjacent) + RETURN n AS node, COLLECT(DISTINCT {node: adjacent, relationship: r}) AS connected_nodes + """ + result = tx.run(query, unique_id=unique_id) + record = result.single() + if record: + node = record["node"] + connected_nodes = record["connected_nodes"] + return {"node": node, "connected_nodes": connected_nodes} + return None + +def delete_all_nodes_and_relationships(session): + total_deleted = 0 + while True: + deleted_count = session.write_transaction(_delete_batch) + total_deleted += deleted_count + if deleted_count == 0: + break + +def _delete_batch(tx): + result_data = tx.run(query.delete_batch, batch_size=10000).single() + return 0 if result_data is None else result_data[0] + +def delete_all_constraints(session): + if show_constraints_result := session.run(query.show_constraints).data(): + for constraint in show_constraints_result: + constraint_name = constraint['name'] + session.run(query.drop_constraint(constraint_name)) + +def reset_all_indexes(session): + indexes = session.run(query.show_indexes).data() + for index in indexes: + index_name = index['name'] + session.run(query.drop_index(index_name)) + +def reset_databases(session): + delete_all_nodes_and_relationships(session) + delete_all_constraints(session) + reset_all_indexes(session) + +def close_session(session): + if session: + with suppress(Exception): + session.close() + +def create_node(session, label, properties, returns=False): + """ + Function to create a node in Neo4j database. + + Args: + driver (neo4j.Driver): The Neo4j driver. + session (str): The Neo4j session. + label (str): The label of the node. + properties (dict): A dictionary of properties for the node. + + Example usage: + create_node(neo4j_driver, "Topic", {"TopicID": "AP.PAG10", "Title": "Topic 10"}) + + Returns: + None + """ + transaction = session.write_transaction(_create_node, label, properties) + if returns: + transaction_id = transaction.id + # logging.database(f"Created {label} node with transaction ID {transaction_id} and properties {properties}") + print(f"Created {label} node with transaction ID {transaction_id} and properties {properties}") + return find_node_by_transaction_id(session, transaction_id) + else: + # logging.warning(f"Failed to create {label} node with properties {properties}") + print(f"Failed to create {label} node with properties {properties}") + return None + +def _create_node(tx, label, properties): + query = f""" + CREATE (n:{label} $properties) + RETURN n + """ + # logging.query(f"Running query: {query}") + print(f"Running query: {query}") + result = tx.run(query, properties=properties) + return result.single()[0] if result.single() is not None else None # Handle no record found + +# Function to find a node by its element ID +def find_node_by_transaction_id(session, transaction_id): + """ + Function to find a node in Neo4j database by its element ID. + + Args: + driver (neo4j.Driver): The Neo4j driver. + element_id (str): The element ID of the node to find. + + Returns: + The matched node. + """ + return session.read_transaction(_find_node_by_element_id, transaction_id) + +def _find_node_by_element_id(tx, transaction_id): + query = """ + MATCH (n) + WHERE id(n) = $transaction_id + RETURN n + """ + # logging.query(f"Running query: {query}") + result = tx.run(query, transaction_id=transaction_id) + record = result.single() # Get the single result record, if any + return record[0] if record is not None else None # Handle no record found + +# Function to create a relationship between two nodes in Neo4j +def create_relationship(session, start_node, end_node, label, properties=None, returns=False): + """ + Function to create a relationship between two nodes in Neo4j database. + + Args: + driver (neo4j.Driver): The Neo4j driver. + session (str): The Neo4j session. + start_node (str): The ID of the start node. + end_node (str): The ID of the end node. + rel_type (str): The type of the relationship. + properties (dict): A dictionary of properties for the relationship. + + Example usage: + create_relationship(neo4j_driver, "AP.PAG10", "AP.PAG11", "HAS_NEXT") + + Returns: + None + """ + relationship = session.write_transaction(_create_relationship, start_node, end_node, label, properties) + if returns: + relationship_id = relationship.id + return find_relationship_by_relationship_id(session, relationship_id) + else: + return None + +def _create_relationship(tx, start_node, end_node, label, properties): + query = f""" + MATCH (a), (b) + WHERE ID(a) = $start_node_id AND ID(b) = $end_node_id + CREATE (a)-[r:{label}]->(b) + RETURN r + """ + # logging.query(f"Running query: {query}") + result = tx.run(query, start_node_id=start_node.id, end_node_id=end_node.id, properties=properties) + single_result = result.single() + return single_result[0] if single_result is not None else None + +def order_list_of_nodes_by_property(session, label, property_name, order="ASC"): + """ + Function to order a list of nodes in Neo4j database by a property. + + Args: + driver (neo4j.Driver): The Neo4j driver. + label (str): The label of the nodes to find. + property_name (str): The name of the property to order by. + order (str): The order of the sorting (ASC or DESC). + + Returns: + List of matched nodes. + """ + return session.read_transaction(_order_list_of_nodes_by_property, label, property_name, order) + +def _order_list_of_nodes_by_property(tx, label, property_name, order): + query = f""" + MATCH (n:{label}) + RETURN n + ORDER BY n.{property_name} {order} + """ + # logging.query(f"Running query: {query}") + result = tx.run(query) + return [record["n"] for record in result] + +def find_relationship_by_relationship_id(session, relationship_id): + """ + Function to find a relationship in Neo4j database by its relationship ID. + + Args: + driver (neo4j.Driver): The Neo4j driver. + relationship_id (str): The relationship ID of the relationship to find. + + Returns: + The matched relationship. + """ + return session.read_transaction(_find_relationship_by_relationship_id, relationship_id) + +def _find_relationship_by_relationship_id(tx, relationship_id): + query = """ + MATCH ()-[r]->() + WHERE id(r) = $relationship_id + """ + # logging.query(f"Running query: {query}") + print(f"Running query: {query}") + result = tx.run(query, relationship_id=relationship_id) + record = result.single() # Get the single result record, if any + return record[0] if record is not None else None # Handle no record found + +# Function to find nodes in Neo4j database by label +def find_nodes_by_label(session, label): + """ + Function to find nodes in Neo4j database by label. + + Args: + driver (neo4j.Driver): The Neo4j driver. + label (str): The label of the nodes to find. + + Example usage: + find_nodes_by_label(neo4j_driver, "Topic") + + Returns: + List of matched nodes. + """ + return session.read_transaction(_find_nodes_by_label, label) + +def _find_nodes_by_label(tx, label): + query = f""" + MATCH (n:{label}) + RETURN n + """ + # logging.query(f"Running query: {query}") + print(f"Running query: {query}") + result = tx.run(query) + return [record["n"] for record in result] + +def get_node_by_unique_id(session, unique_id): + return session.read_transaction(_get_node_by_unique_id, unique_id) + +def _get_node_by_unique_id(tx, unique_id): + query = f""" + MATCH (n) + WHERE n.unique_id = $unique_id + RETURN n + """ + logging.debug(f"Executing query with unique_id: {unique_id}") + result = tx.run(query, unique_id=unique_id) + record = result.single() + if record is None: + logging.warning(f"No node found with unique_id: {unique_id}") + return None + return record[0] + +# Function to find nodes in Neo4j database by label and properties +def find_nodes_by_label_and_properties(session, label, properties): + """ + Function to find nodes in Neo4j database by label and properties. + + Args: + session (neo4j.Session): The Neo4j session. + label (str): The label of the nodes to find. + properties (dict): A dictionary of properties to match. + + Returns: + List of matched nodes. + """ + logging.debug(f"Finding nodes with label: {label} and properties: {properties}") + with session: + response = session.read_transaction(_find_nodes_by_label_and_properties, label, properties) + logging.debug(f"Response: {response}") + return response + +def _find_nodes_by_label_and_properties(tx, label, properties): + query = f""" + MATCH (n:{label}) + WHERE {' AND '.join([f'n.{key} = ${key}' for key in properties.keys()])} + RETURN n + """ + logging.debug(f"Running query: {query}") + result = tx.run(query, **properties) + logging.debug(f"Result: {result}") + return [record["n"] for record in result] + +# Function to find relationships in Neo4j database by type +def find_relationships_by_type(session, rel_type): + """ + Function to find relationships in Neo4j database by type. + + Args: + driver (neo4j.Driver): The Neo4j driver. + rel_type (str): The type of the relationships to find. + + Returns: + List of matched relationships. + """ + return session.read_transaction(_find_relationships_by_type, rel_type) + +def _find_relationships_by_type(tx, rel_type): + query = f""" + MATCH ()-[r:{rel_type}]->() + RETURN r + """ + # logging.query(f"Running query: {query}") + print(f"Running query: {query}") + result = tx.run(query) + return [record["r"] for record in result] + +# Function to find relationships in Neo4j database by type and properties +def find_relationships_by_type_and_properties(session, label, properties): + """ + Function to find relationships in Neo4j database by type and properties. + + Args: + driver (neo4j.Driver): The Neo4j driver. + rel_type (str): The type of the relationships to find. + properties (dict): A dictionary of properties to match. + + Returns: + List of matched relationships. + """ + return session.read_transaction(_find_relationships_by_type_and_properties, label, properties) + + +def _find_relationships_by_type_and_properties(tx, label, properties): + query = f""" + MATCH (a)-[r:{label}]->(b) + WHERE {' AND '.join([f'r.{key} = ${key}' for key in properties.keys()])} + RETURN r + """ + # logging.query(f"Running query: {query}") + print(f"Running query: {query}") + result = tx.run(query, **properties) + return [record["r"] for record in result] + +# Function to find nodes and relationships in Neo4j database by label and properties +def find_nodes_and_relationships_by_label_and_properties(session, label, properties): + """ + Function to find nodes and relationships in Neo4j database by label and properties. + + Args: + driver (neo4j.Driver): The Neo4j driver. + label (str): The label of the nodes to find. + properties (dict): A dictionary of properties to match. + + Returns: + List of matched nodes and relationships. + """ + return session.read_transaction(_find_nodes_and_relationships_by_label_and_properties, label, properties) + +def _find_nodes_and_relationships_by_label_and_properties(tx, label, properties): + query = f""" + MATCH (n:{label}) + WHERE {' AND '.join([f'n.{key} = ${key}' for key in properties.keys()])} + RETURN n + """ + # logging.query(f"Running query: {query}") + result = tx.run(query, **properties) + return [record["n"] for record in result] + +# Function to delete nodes in Neo4j based on given criteria +def delete_nodes(session, criteria, delete_related=False): + """ + Function to delete nodes in Neo4j based on given criteria. + + Args: + driver (neo4j.Driver): The Neo4j driver. + criteria (dict): A dictionary containing the properties to match for deletion. + delete_related (bool): If True, deletes related nodes and relationships; otherwise, deletes only the matched nodes. + + Example usage: + # Delete only the nodes matching the criteria + delete_nodes(neo4j_driver, {'TopicID': 'AP.PAG10'}) + + # Delete the nodes and their related relationships + delete_nodes(neo4j_driver, {'TopicID': 'AP.PAG10'}, delete_related=True) + """ + session.write_transaction(_delete_nodes, criteria, delete_related) + +def _delete_nodes(tx, criteria, delete_related=False): + """ + Internal function to execute a Cypher query to delete nodes based on criteria. + + Args: + tx (neo4j.Transaction): The Neo4j transaction. + criteria (dict): A dictionary containing the properties to match for deletion. + delete_related (bool): Specifies whether to delete related nodes and relationships. + """ + condition_str = " AND ".join([f"n.{key} = ${key}" for key in criteria]) + if delete_related: + query = f""" + MATCH (n)-[r]-() + WHERE {condition_str} + DELETE n, r + """ + else: + query = f""" + MATCH (n) + WHERE {condition_str} + DELETE n + """ + # logging.query(f"Running query: {query}") + tx.run(query, **criteria) + +# Function to delete all nodes and relationships in the Neo4j database in batches +def delete_lots_of_nodes_and_relationships(session): + """ + Function to delete all nodes and relationships in the Neo4j database in batches. + + Args: + driver (neo4j.Driver): The Neo4j driver. + session (str): The Neo4j session. + """ + total_deleted = 0 + while True: + deleted_count = session.write_transaction(_delete_batch) + total_deleted += deleted_count + if deleted_count == 0: + break # Exit the loop if no more nodes are deleted + # logging.prod(f"All nodes and relationships have been deleted. Total deleted: {total_deleted}") + print(f"Neo4j: All nodes and relationships have been deleted. Total deleted: {total_deleted}") + +def _delete_batch(tx): + """ + Function to execute a Cypher query to delete a batch of nodes and relationships. + + Args: + tx (neo4j.Transaction): The Neo4j transaction. + """ + batch_size = 10000 # Adjust the batch size according to your needs + query = """ + MATCH (n) + WITH n LIMIT $batch_size + DETACH DELETE n + RETURN count(*) + """ + # logging.query(f"Running query: {query}") + result = tx.run(query, batch_size=batch_size) + result_data = result.single() + + if result_data is None: + return 0 + deleted_count = result_data[0] + if deleted_count is None: # This check might be redundant, but kept for clarity + return 0 + if deleted_count > 0: + # logging.database(f"Deleted {deleted_count} nodes.") + print(f"Neo4j: Deleted {deleted_count} nodes.") + return deleted_count + +def delete_all_constraints(session): + # Correct command to fetch all constraints for Neo4j 4.x and later + constraints_query = "SHOW CONSTRAINTS" + # logging.query(f"Running query: {constraints_query}") + if constraints_query_result := session.run(constraints_query).data(): + for constraint in constraints_query_result: + # Ensure correct key is used to extract constraint name + constraint_name = constraint['name'] # Adjust this if necessary + drop_query = f"DROP CONSTRAINT {constraint_name}" + # logging.query(f"Running query: {drop_query}") + session.run(drop_query) + # logging.database(f"Dropped constraint: {constraint_name}") + print(f"Neo4j: Dropped constraint: {constraint_name}") + else: + # logging.warning("No constraints found to delete.") + print("Neo4j: No constraints found to delete.") + +def reset_all_indexes(session): + indexes = session.run("SHOW INDEXES").data() + for index in indexes: + index_name = index['name'] + session.run(f"DROP INDEX {index_name}") + # logging.info(f"Deleted index: {index_name}") + print(f"Neo4j: Deleted index: {index_name}") + +def reset_database_in_session(session): + logging.debug("Neo4j: Resetting database") + delete_lots_of_nodes_and_relationships(session) + delete_all_constraints(session) + reset_all_indexes(session) + logging.info("Neo4j: Database reset") + +def create_database(session, db_name): + """ + Creates a new database in Neo4j if it does not already exist. + + Args: + session (neo4j.Session): The Neo4j session. + db_name (str): The name of the database to create. + """ + logging.debug(f"Neo4j: Creating database {db_name}") + query = f"CREATE DATABASE `{db_name}` IF NOT EXISTS" + try: + session.run(query) + logging.info(f"Neo4j: Database {db_name} created successfully.") + except Exception as e: + logging.error(f"Neo4j: Failed to create database {db_name}: {str(e)}") diff --git a/modules/database/tools/neontology/__init__.py b/modules/database/tools/neontology/__init__.py new file mode 100644 index 0000000..dcefa25 --- /dev/null +++ b/modules/database/tools/neontology/__init__.py @@ -0,0 +1,18 @@ +# flake8: noqa + +from .basenode import BaseNode +from .baserelationship import BaseRelationship +from .graphconnection import GraphConnection, init_neontology +from .utils import auto_constrain + +__all__ = [ + # BaseNode + "BaseNode", + # BaseRelationship + "BaseRelationship", + # GraphConnection + "init_neontology", + "GraphConnection", + # utils + "auto_constrain", +] diff --git a/modules/database/tools/neontology/__pycache__/__init__.cpython-311.pyc b/modules/database/tools/neontology/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f45e8b1b5e9ed450938d5141a43de90ced4af4ec GIT binary patch literal 511 zcmZutJx{|h5IyIcqJI1W5Mvk`i5VEm(5(Y(SuE2;ZIEL}i92+IU%}3T_%|6VubtQ; zb*mUSr>$ru&Znn$_T787KfB!yVEkN<=WhgHZHhx!d$JiJd4~iN!XYOyA%Co)Nq4-9`yIa8Sw)jTUg zOZUemE9MVUh;(YUbw3lCq9T<-NiJtgoa?cLl5~nQs$`i6-O@(!(lOu}a1Hnfldz+M zXLJ$h*mmiGDa#|%c24(a#uqjBzB>)0rrm|gc-87@pHjv-rC+eYBiPG#-%48ZM4=1;hF@S8!MV Xmn*ocPqT44=T-v;c=gRHduaCyq^XU$ literal 0 HcmV?d00001 diff --git a/modules/database/tools/neontology/__pycache__/basenode.cpython-311.pyc b/modules/database/tools/neontology/__pycache__/basenode.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..93a6eac3044e37f0695dded7458ecacad0f0b2de GIT binary patch literal 15157 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 literal 0 HcmV?d00001 diff --git a/modules/database/tools/neontology/__pycache__/baserelationship.cpython-311.pyc b/modules/database/tools/neontology/__pycache__/baserelationship.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d89a4d5a8171aed5d8e8d3b90f003856ee08d5fe GIT binary patch literal 13482 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 literal 0 HcmV?d00001 diff --git a/modules/database/tools/neontology/__pycache__/result.cpython-311.pyc b/modules/database/tools/neontology/__pycache__/result.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ff0a140fe884b547c3db0f72afea2da524a6b302 GIT binary patch literal 6415 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 V`Y;8y92K^SBr?R$zm8JR_%Aw!de8s> literal 0 HcmV?d00001 diff --git a/modules/database/tools/neontology/basenode.py b/modules/database/tools/neontology/basenode.py new file mode 100644 index 0000000..3e3076a --- /dev/null +++ b/modules/database/tools/neontology/basenode.py @@ -0,0 +1,315 @@ +from typing import Any, ClassVar, Dict, List, Optional, Type, TypeVar, Union + +import numpy as np +import pandas as pd + +from .commonmodel import CommonModel +from .graphconnection import GraphConnection + +B = TypeVar("B", bound="BaseNode") + +class BaseNode(CommonModel): # pyre-ignore[13] + __primaryproperty__: ClassVar[str] + __primarylabel__: ClassVar[Optional[str]] + __secondarylabels__: ClassVar[Optional[list]] = [] + + def __init__(self, **data: dict): + super().__init__(**data) + + # we can define 'abstract' nodes which don't have a label + # these are to provide common properties to be used by subclassed nodes + # but shouldn't be put in the graph or even instantiated + if self.__primarylabel__ is None: + raise NotImplementedError( + "Nodes to be used in the graph must define a primary label." + ) + + def _get_merge_parameters(self) -> Dict[str, Any]: + """ + + Returns: + Dict[str, Any]: a dictionary of key/value pairs. + """ + + params = { + "pp": self.neo4j_dict()[self.__primaryproperty__], + "always_set": self._get_prop_values(self._always_set), + "set_on_match": self._get_prop_values(self._set_on_match), + "set_on_create": self._get_prop_values(self._set_on_create), + } + + return params + + def get_primary_property_value(self) -> Union[str, int]: + return self._get_merge_parameters()["pp"] + + def create(self, database: str = 'neo4j') -> None: + """Create this node in the graph.""" + + params = self.neo4j_dict() + + all_props = self.neo4j_dict() + + pp_value = all_props.pop(self.__primaryproperty__) + + params = {"pp": pp_value, "all_props": all_props} + + all_labels = [self.__primarylabel__] + self.__secondarylabels__ + + cypher = f""" + CREATE (n:{":".join(all_labels)} {{ {self.__primaryproperty__}: $pp }}) + SET n += $all_props + RETURN n + """ + graph = GraphConnection() + with graph.driver.session(database=database) as session: + result = session.run(cypher, params).single() + if result: + return self.__class__(**dict(result["n"])) + return None + + def merge(self, database: str = 'neo4j') -> None: + """Merge this node into the graph.""" + + params = self._get_merge_parameters() + + all_labels = [self.__primarylabel__] + self.__secondarylabels__ + + cypher = f""" + MERGE (n:{":".join(all_labels)} {{ {self.__primaryproperty__}: $pp }}) + ON MATCH SET n += $set_on_match + ON CREATE SET n += $set_on_create + SET n += $always_set + RETURN n + """ + + graph = GraphConnection() + with graph.driver.session(database=database) as session: + result = session.run(cypher, params).single() + if result: + return self.__class__(**dict(result["n"])) + return None + + @classmethod + def create_nodes(cls: Type[B], nodes: List[B]) -> List[Union[str, int]]: + """Create the given nodes in the database. + + Args: + nodes (List[B]): A list of nodes to create. + + Returns: + list: A list of the primary property values + + Raises: + TypeError: Raised if one of the nodes isn't of this type. + """ + + for node in nodes: + if isinstance(node, cls) is False: + raise TypeError("Node was incorrect type.") + + node_list = [ + {"props": x.neo4j_dict(), "pp": x.neo4j_dict()[cls.__primaryproperty__]} + for x in nodes + ] + + all_labels = [cls.__primarylabel__] + cls.__secondarylabels__ + + cypher = f""" + UNWIND $node_list AS node + create (n:{":".join(all_labels)} {{{cls.__primaryproperty__}: node.pp}}) + SET n = node.props + RETURN n + """ + + graph = GraphConnection() + results = graph.cypher_write_many( + cypher=cypher, params={"node_list": node_list} + ) + + matched_nodes = [cls(**dict(x["n"])) for x in results] + + return matched_nodes + + @classmethod + def merge_nodes(cls: Type[B], nodes: List[B]) -> List[B]: + """Merge multiple nodes into the database. + + Args: + nodes (List[B]): A list of nodes to merge. + + Returns: + list: A list of the primary property values + + Raises: + TypeError: Raised if any of the nodes provided don't match this class. + """ + + for node in nodes: + if isinstance(node, cls) is False: + raise TypeError("Node was incorrect type.") + + node_list = [x._get_merge_parameters() for x in nodes] + + all_labels = [cls.__primarylabel__] + cls.__secondarylabels__ + + cypher = f""" + UNWIND $node_list AS node + MERGE (n:{":".join(all_labels)} {{{cls.__primaryproperty__}: node.pp}}) + ON MATCH SET n += node.set_on_match + ON CREATE SET n += node.set_on_create + SET n += node.always_set + RETURN n + """ + + graph = GraphConnection() + results = graph.cypher_write_many( + cypher=cypher, params={"node_list": node_list} + ) + + matched_nodes = [cls(**dict(x["n"])) for x in results] + + return matched_nodes + + @classmethod + def merge_records(cls: Type[B], records: dict) -> List[B]: + """Take a list of dictionaries and use them to merge in nodes in the graph. + + Each dictionary will be used to merge a node where dictionary key/value pairs + represent properties to be applied. + + Returns: + list: A list of the primary property values + + Args: + records (List[Dict[str, Any]]): a list of dictionaries of node properties + """ + + nodes = [cls(**x) for x in records] + + return cls.merge_nodes(nodes) + + @classmethod + def merge_df(cls: Type[B], df: pd.DataFrame, deduplicate: bool = True) -> pd.Series: + """Merge in new nodes based on data in a dataframe. + + The dataframe columns must correspond to the Node properties. + + Returns: + pd.Series: A list of the primary property values + + Args: + df (pd.DataFrame): A pandas dataframe of node properties + + """ + + if df.empty is True: + return pd.Series(dtype=object) + + input_df = df.replace([np.nan], None).copy() + + if deduplicate is True: + # we don't wan't to waste time attempting to merge identical records + unique_df = input_df.drop_duplicates(ignore_index=True).copy() + else: + unique_df = input_df + + records = unique_df.to_dict(orient="records") + + unique_df["generated_nodes"] = pd.Series(cls.merge_records(records)) + + # now we need to get the mapping from unique id to primary property + # so that we can return the data in the same shape it was received + input_df.insert(0, "ontolocy_merging_order", range(0, len(input_df))) + merge_cols = list(input_df.columns) + merge_cols.remove("ontolocy_merging_order") + output_df = input_df.merge( + unique_df, + how="inner", + on=merge_cols, + ).sort_values("ontolocy_merging_order", ignore_index=True) + + return output_df.generated_nodes + + @classmethod + def match(cls: Type[B], pp: str) -> Optional[B]: + """MATCH a single node of this type with the given primary property. + + Args: + pp (str): The value of the primary property (pp) to match on. + + Returns: + Optional[B]: If the node exists, return it as an instance. + """ + + cypher = f""" + MATCH (n:{cls.__primarylabel__}) + WHERE n.{cls.__primaryproperty__} = $pp + RETURN n + """ + + params = {"pp": pp} + + graph = GraphConnection() + + result = graph.cypher_read(cypher, params) + + if result: + return cls(**dict(result["n"])) + + else: + return None + + @classmethod + def delete(cls, pp: str) -> None: + """Delete a node from the graph. + + Match on label and the pp value provided. + If the node exists, delete it and any relationships it has. + + Args: + pp (str): Primary property value to match on. + """ + + cypher = f""" + MATCH (n:{cls.__primarylabel__}) + WHERE n.{cls.__primaryproperty__} = $pp + DETACH DELETE n + """ + + params = {"pp": pp} + + graph = GraphConnection() + + graph.cypher_write(cypher, params) + + @classmethod + def match_nodes(cls: Type[B], limit: int = 100, skip: int = 0) -> List[B]: + """Get nodes of this type from the database. + + Run a MATCH cypher query to retrieve any Nodes with the label of this class. + + Args: + limit (int, optional): Maximum number of results to return. Defaults to 100. + skip (int, optional): Skip through this many results (for pagination). Defaults to 0. + + Returns: + Optional[List[B]]: A list of node instances. + """ + + cypher = f""" + MATCH(n:{cls.__primarylabel__}) + RETURN n{{.*}} + ORDER BY n.created DESC + SKIP $skip + LIMIT $limit + """ + + params = {"skip": skip, "limit": limit} + + graph = GraphConnection() + records = graph.cypher_read_many(cypher, params) + + nodes = [cls(**dict(x["n"])) for x in records] + + return nodes diff --git a/modules/database/tools/neontology/baserelationship.py b/modules/database/tools/neontology/baserelationship.py new file mode 100644 index 0000000..321c528 --- /dev/null +++ b/modules/database/tools/neontology/baserelationship.py @@ -0,0 +1,305 @@ +"""Defines the BaseRelationship class. + +The BaseRelationship class is used for creating and matching on relationships in the graph. + + Typical usage example: + + class MyRel(BaseRelationship): + + __relationshiptype__: ClassVar[Optional[str]] = "MY_REL" + + source: SourceNode + target: TargetNode + + my_rel = MyRel(source=source_node, target=target_node) + my_rel.merge() + +""" + +from typing import Any, ClassVar, Dict, List, Optional, Type, TypeVar + +import numpy as np +import pandas as pd +from pydantic import PrivateAttr + +from modules.database.tools.neontology.graphconnection import GraphConnection + +from .basenode import BaseNode +from .commonmodel import CommonModel + +R = TypeVar("R", bound="BaseRelationship") + + +class BaseRelationship(CommonModel): # pyre-ignore[13] + source: BaseNode + target: BaseNode + + __relationshiptype__: ClassVar[Optional[str]] = None + + _merge_on: List[ + str + ] = PrivateAttr() # what relationship properties should we merge on + + def __init__(self, **data: dict): + super().__init__(**data) + + self._merge_on = self._get_prop_usage("merge_on") + + # we can define 'abstract' relationships which don't have a label + # these are to provide common properties to be used by subclassed relationships + # but shouldn't be put in the graph or even instantiated + if self.__relationshiptype__ is None: + raise NotImplementedError( + "Nodes to be used in the graph must define a primary label." + ) + + @classmethod + def get_relationship_type(cls) -> str: + """Get the relationship type to use for creating and matching this relationship. + + If __relationship__ has been specified, use that. + + Otherwise use the class name in uppercase + + Returns: + str: the string to use for creating and matching this relationship + """ + return cls.__relationshiptype__ # pyre-ignore[7] + + def _get_merge_parameters( + self, source_prop: str, target_prop: str + ) -> Dict[str, Any]: + """ + + Returns: + Dict[str, Any]: a dictionary of key/value pairs. + """ + + exclusions = {"source", "target"} + + # these properties will be referenced individually + merge_props = self._get_prop_values(self._merge_on, exclude=exclusions) + + params = { + "source_prop": self.source.neo4j_dict()[source_prop], + "target_prop": self.target.neo4j_dict()[target_prop], + "always_set": self._get_prop_values(self._always_set, exclude=exclusions), + "set_on_match": self._get_prop_values( + self._set_on_match, exclude=exclusions + ), + "set_on_create": self._get_prop_values( + self._set_on_create, exclude=exclusions + ), + **merge_props, + } + + return params + + def merge( + self, + database: Optional[str] = 'neo4j' # default to 'neo4j' if not specified + ) -> None: + """Merge this relationship into the database.""" + source_label = self.source.__primarylabel__ + target_label = self.target.__primarylabel__ + + source_pp = self.source.__primaryproperty__ + target_pp = self.target.__primaryproperty__ + + params = self._get_merge_parameters( + source_prop=source_pp, target_prop=target_pp + ) + + rel_type = self.get_relationship_type() + + # build a string of properties to merge on "prop_name: $prop_name" + merge_props = ", ".join([f"{x}: ${x}" for x in self._merge_on]) + + cypher = f""" + MATCH (source:{source_label} {{ {source_pp}: $source_prop }}), + (target:{target_label} {{ {target_pp}: $target_prop }}) + MERGE (source)-[r:{rel_type} {{ {merge_props} }}]->(target) + ON MATCH SET r += $set_on_match + ON CREATE SET r += $set_on_create + SET r += $always_set + """ + + graph = GraphConnection() + # Use session with database instead of USE statement + with graph.driver.session(database=database) as session: + session.run(cypher, params) + + @classmethod + def merge_relationships( + cls: Type[R], + rels: List[R], + source_type: Optional[Type[BaseNode]] = None, + target_type: Optional[Type[BaseNode]] = None, + source_prop: Optional[str] = None, + target_prop: Optional[str] = None, + database: Optional[str] = 'neo4j' # Add database parameter + ) -> None: + """Merge multiple relationships (of this type) into the database. + + Sometimes the source and target label may be ambiguous (e.g. where we have subclassed nodes) + In this case you can explicitly pass in the relevant types + + Sometimes we want to match nodes on a property which isn't the primary property, + so we can specify what property to use. + + Args: + cls (Type[R]): this class + rels (List[R]): a list of relationships which are instances of this class + database (Optional[str]): database to use for the operation + + Raises: + TypeError: If relationships are provided which aren't of this class + """ + + if source_type is None: + source_type = cls.model_fields["source"].annotation + + if target_type is None: + target_type = cls.model_fields["target"].annotation + + for rel in rels: + if isinstance(rel, cls) is False: + raise TypeError("Relationship was incorrect type.") + if type(rel.source) is not source_type: + raise TypeError("Received an inappropriate kind of source node.") + if type(rel.target) is not target_type: + raise TypeError("Received an inappropriate kind of target node.") + + if source_prop is None: + source_prop = source_type.__primaryproperty__ + + if target_prop is None: + target_prop = target_type.__primaryproperty__ + + source_label = source_type.__primarylabel__ + target_label = target_type.__primarylabel__ + + # build a string of properties to merge on "prop_name: $prop_name" + # we need to instantiate the class so that _merge_on is generated as part of __init__ + merge_props = ", ".join([f"{x}: ${x}" for x in cls._get_prop_usage("merge_on")]) + + rel_list: List[Dict[str, Any]] = [ + x._get_merge_parameters(source_prop, target_prop) for x in rels + ] + + rel_type = cls.get_relationship_type() + + cypher = f""" + UNWIND $rel_list AS rel + MATCH (source:{source_label}) + WHERE source.{source_prop} = rel.source_prop + MATCH (target:{target_label}) + WHERE target.{target_prop} = rel.target_prop + MERGE (source)-[r:{rel_type} {{ {merge_props} }}]->(target) + ON MATCH SET r += rel.set_on_match + ON CREATE SET r += rel.set_on_create + SET r += rel.always_set + """ + + graph = GraphConnection() + # Use session with database instead of USE statement + with graph.driver.session(database=database) as session: + session.run(cypher=cypher, parameters={"rel_list": rel_list}) + + @classmethod + def merge_records( + cls: Type[R], + records: List[Dict[str, Any]], + source_type: Optional[Type[BaseNode]] = None, + target_type: Optional[Type[BaseNode]] = None, + source_prop: Optional[str] = None, + target_prop: Optional[str] = None, + ) -> None: + """Take a list of dictionaries and use them to merge in relationships in the graph. + + Sometimes, a relationship can accept nodes which subclass a particular node type. + In these instances, it may be necessary to explicitly state what type of node should be used. + + Each record should have a source and target key where the value is the primary property + value of the respective nodes. + + Args: + records (List[Dict[str, Any]]): a list of dictionaries used to populate relationships + source_type: explicitly state the class to use for source node + target_type: explicitly state the class to use for target node + """ + + hydrated_list = [] + + if source_type is None: + source_type = cls.model_fields["source"].annotation + + if target_type is None: + target_type = cls.model_fields["target"].annotation + + if source_prop is None: + source_prop = source_type.__primaryproperty__ + + if target_prop is None: + target_prop = target_type.__primaryproperty__ + + for record in records: + hydrated = dict(record) + + hydrated["source"] = source_type.model_construct( + **{source_prop: record["source"]} + ) + hydrated["target"] = target_type.model_construct( + **{target_prop: record["target"]} + ) + + hydrated_list.append(hydrated) + + rels = [cls(**x) for x in hydrated_list] + + cls.merge_relationships( + rels, + source_type=source_type, + source_prop=source_prop, + target_type=target_type, + target_prop=target_prop, + ) + + @classmethod + def merge_df( + cls: Type[R], + df: pd.DataFrame, + source_type: Optional[Type[BaseNode]] = None, + target_type: Optional[Type[BaseNode]] = None, + source_prop: Optional[str] = None, + target_prop: Optional[str] = None, + ) -> None: + """Merge in relationships based on data in a pandas data frame + + Expects columns named 'source' and 'target' with the primary property value + for the source and target nodes. + + Then additional fields should have a corresponding column. + + Args: + df (pd.DataFrame): pandas dataframe where each row represents a relationship to merge + """ + + if df.empty is False: + records = df.replace([np.nan], None).to_dict(orient="records") + cls.merge_records( + records, + source_type=source_type, + source_prop=source_prop, + target_type=target_type, + target_prop=target_prop, + ) + + @classmethod + def to_dict(cls): + return { + "source": cls.source.to_dict(), + "target": cls.target.to_dict(), + "relationship_type": cls.__relationshiptype__ + } + diff --git a/modules/database/tools/neontology/commonmodel.py b/modules/database/tools/neontology/commonmodel.py new file mode 100644 index 0000000..7173f10 --- /dev/null +++ b/modules/database/tools/neontology/commonmodel.py @@ -0,0 +1,196 @@ +from abc import ABC, abstractmethod +from datetime import date, datetime, time, timedelta +from typing import Any, ClassVar, Dict, List, Optional, Set + +from neo4j.time import Date as Neo4jDate +from neo4j.time import DateTime as Neo4jDateTime +from neo4j.time import Time as Neo4jTime +from pydantic import ( + BaseModel, + ConfigDict, + Field, + PrivateAttr, + field_validator, + model_validator, +) + + +class CommonModel(BaseModel, ABC): + model_config = ConfigDict( + validate_assignment=True, + extra="forbid", + arbitrary_types_allowed=True, + ) + + created: datetime = Field( + default_factory=datetime.now, json_schema_extra={"set_on_create": True} + ) + merged: Optional[datetime] = Field(default=None, validate_default=True) + + _set_on_match: List[str] = PrivateAttr() + _set_on_create: List[str] = PrivateAttr() + _always_set: List[str] = PrivateAttr() + + _neo4j_supported_types: ClassVar[Any] = ( + list, + bool, + int, + bytearray, + float, + str, + bytes, + date, + time, + datetime, + timedelta, + ) + + def __init__(self, **data: dict): + super().__init__(**data) + + self._set_on_match = self._get_prop_usage("set_on_match") + self._set_on_create = self._get_prop_usage("set_on_create") + self._always_set = [ + x + for x in self.model_dump().keys() + if x not in self._set_on_match + self._set_on_create + ["source", "target"] + ] + + @classmethod + def _get_prop_usage(cls, usage_type: str) -> List[str]: + all_props = cls.model_json_schema()["properties"] + + selected_props = [] + + for prop, entry in all_props.items(): + if entry.get(usage_type) is True: + selected_props.append(prop) + + return selected_props + + def _get_prop_values( + self, props: List[str], exclude: Set[str] = set() + ) -> Dict[str, Any]: + """ + + Returns: + Dict[str, Any]: a dictionary of key/value pairs. + """ + + prop_values = { + k: v for k, v in self.neo4j_dict(exclude=exclude).items() if k in props + } + + return prop_values + + @abstractmethod + def _get_merge_parameters(self) -> Dict[str, Any]: + raise NotImplementedError + + @classmethod + def export_type_converter(cls, value: Any) -> Any: + if isinstance(value, dict): + raise TypeError("Neo4j doesn't support dict types for properties.") + + elif isinstance(value, (tuple, set)): + new_value = list(value) + return cls.export_type_converter(new_value) + + elif isinstance(value, list): + # items in a list must all be the same type + item_type = type(value[0]) + for item in value: + if isinstance(item, item_type) is False: + raise TypeError( + "For neo4j, all items in a list must be of the same type." + ) + + return [cls.export_type_converter(x) for x in value] + + elif isinstance(value, cls._neo4j_supported_types) is False: + return str(value) + + else: + return value + + @classmethod + def _export_dict_converter(cls, original_dict: Dict[str, Any]) -> Dict[str, Any]: + """_summary_ + + Args: + export_dict (Dict[str, Any]): _description_ + + Returns: + Dict[str, Any]: _description_ + """ + + export_dict = original_dict.copy() + + for k, v in export_dict.items(): + export_dict[k] = cls.export_type_converter(v) + + return export_dict + + def neo4j_dict(self, **kwargs: Dict[str, Any]) -> Dict[str, Any]: + """Return a dict made up of only types compatible with neo4j + + Returns: + dict: a dictionary export of this model instance + """ + + export_dict = self.model_dump(exclude_none=True, **kwargs) + + export_dict = self._export_dict_converter(export_dict) + + return export_dict + + # + # validators + # + + @field_validator("merged") + def set_merged_to_created( + cls, value: Optional[datetime], values: Dict[str, Any] + ) -> datetime: + """By default, set the 'merged' time equal to the 'created' time. + + If the 'merged' value has been explicitly set, this is preserved. + + Args: + value (Optional[datetime]): the value of the field. + values (Dict[str, Any]): a dictionary of field/value pairs set so far. + + Returns: + datetime: The merged datetime value. + """ + + if value is None: + return values.data["created"] + else: + return value + + @model_validator(mode="before") + @classmethod + def neo4j_datetime_to_native(cls, values: Dict[str, Any]) -> Dict[str, Any]: + """Datetimes come back from Neo4j as a non standard DateTime type. + + We check for any values where that is the case and convert them to + native Python datetimes. + + See https://neo4j.com/docs/api/python-driver/4.4/temporal_types.html for further info. + + Args: + values (Dict[str, Any]): Dictionary of field/value pairs from pydantic. + + Returns: + Dict[str, Any]: Returns the dictionary, with any Neo4jDateTimes updated. + """ + + if not isinstance(values, dict): + raise ValueError + + for key in values: + if isinstance(values[key], (Neo4jDateTime, Neo4jDate, Neo4jTime)): + values[key] = values[key].to_native() + + return values diff --git a/modules/database/tools/neontology/graphconnection.py b/modules/database/tools/neontology/graphconnection.py new file mode 100644 index 0000000..9cc81c9 --- /dev/null +++ b/modules/database/tools/neontology/graphconnection.py @@ -0,0 +1,253 @@ +from dotenv import load_dotenv, find_dotenv +load_dotenv(find_dotenv()) +import os +import modules.logger_tool as logger +log_name = 'api_modules_database_tools_neontology_graphconnection' +log_dir = os.getenv("LOG_PATH", "/logs") # Default path as fallback +logging = logger.get_logger( + name=log_name, + log_level=os.getenv("LOG_LEVEL", "DEBUG"), + log_path=log_dir, + log_file=log_name, + runtime=True, + log_format='default' +) +from typing import Any, Dict, List, Optional + +from neo4j import GraphDatabase, Neo4jDriver +from neo4j import Record as Neo4jRecord +from neo4j import Result as Neo4jResult +from neo4j import Transaction as Neo4jTransaction + +from .result import NeontologyResult, neo4j_records_to_neontology_records + + +class GraphConnection(object): + """Class for managing connections to Neo4j.""" + + _instance = None + + def __new__( + cls, + neo4j_uri: Optional[str] = None, + neo4j_username: Optional[str] = None, + neo4j_password: Optional[str] = None, + ) -> "GraphConnection": + """Make sure we only have a single connection to the GraphDatabase. + + This connection then gets used by all instances. + + Args: + neo4j_uri (Optional[str], optional): Neo4j URI to connect to. Defaults to None. + neo4j_username (Optional[str], optional): Neo4j username. Defaults to None. + neo4j_password (Optional[str], optional): Neo4j password. Defaults to None. + + Returns: + GraphConnection: Instance of the connection + """ + + if cls._instance is None: + cls._instance = object.__new__(cls) + + if GraphConnection._instance: + try: + driver = GraphConnection._instance.driver = GraphDatabase.driver( # type: ignore + neo4j_uri, auth=(neo4j_username, neo4j_password) + ) + driver.verify_connectivity() + + from .utils import get_node_types, get_rels_by_type + + # capture all possible types of node and relationship + cls.global_nodes = get_node_types() + cls.global_rels = get_rels_by_type() + + except Exception as error: + logging.error( + "Error: connection not established. Have you run init_neontology? {}".format( + error + ) + ) + GraphConnection._instance = None + + else: + GraphConnection._instance = None + + return cls._instance + + def __del__(self) -> None: + """Close the driver gracefully when the class gets deleted.""" + + self.driver.close() + + def __init__( + self, + neo4j_uri: Optional[str] = None, + neo4j_username: Optional[str] = None, + neo4j_password: Optional[str] = None, + ) -> None: + if self._instance: + self.driver: Neo4jDriver = self._instance.driver + + def run_transaction_single( + self, tx: Neo4jTransaction, query: str, params: Dict[str, Any] + ) -> Optional[Neo4jRecord]: + """Run a transaction which is expected to return a single result. + + Args: + tx (Neo4jTransaction): Neo4j Transaction object + query (str): cypher query to run + params (Dict[str, Any]): Parameters to pass to the query + + Returns: + Optional[Neo4jRecord]: The result + """ + + return tx.run(query, **params).single() + + def run_transaction_many( + self, tx: Neo4jTransaction, query: str, params: Dict[str, Any] + ) -> List[Neo4jRecord]: + """Run a transation which is expected to return multiple nodes. + + Args: + tx (Neo4jTransaction): Neo4j Transaction object + query (str): cypher query to run + params (Dict[str, Any]): parameters to pass the query + + Returns: + List[Neo4jRecord]: a list of the results + """ + + return [record for record in tx.run(query, **params)] + + def cypher_write(self, cypher: str, params: Dict[str, Any] = {}) -> None: + """Execute a write transaction. + + Args: + cypher (str): cypher query + params (Dict[str, Any]): parameters to pass to the query + """ + + with self.driver.session() as session: + session.execute_write(self.run_transaction_single, cypher, params) + + def cypher_write_single(self, cypher: str, params: Dict[str, Any] = {}) -> None: + """Execute a write transaction. + + Args: + cypher (str): cypher query + params (Dict[str, Any]): parameters to pass to the query + """ + + with self.driver.session() as session: + return session.execute_write(self.run_transaction_single, cypher, params) + + def cypher_write_many(self, cypher: str, params: Dict[str, Any] = {}) -> None: + """Execute a write transaction. + + Args: + cypher (str): cypher query + params (Dict[str, Any]): parameters to pass to the query + """ + + with self.driver.session() as session: + return session.execute_write(self.run_transaction_many, cypher, params) + + def cypher_read( + self, cypher: str, params: Dict[str, Any] = {} + ) -> Optional[Neo4jRecord]: + """Run a cypher read only query which is expected to return a single result. + + Args: + cypher (str): cypher query string + params (Dict[str, Any]): parameters to pass to the query + + Returns: + Neo4jRecord: the resulting Neo4j 'Record', or None + """ + + with self.driver.session() as session: + return session.execute_read(self.run_transaction_single, cypher, params) + + def cypher_read_many( + self, cypher: str, params: Dict[str, Any] = {} + ) -> List[Neo4jRecord]: + """Run a cypher read query which will return multiple records. + + Args: + cypher (str): cypher string to run + params (Dict[str, Any]): parameters to pass to the query + + Returns: + List[Neo4jRecord]: A list of Neo4j 'Records' returned by the query. + """ + + with self.driver.session() as session: + return session.execute_read(self.run_transaction_many, cypher, params) + + def apply_constraint(self, label: str, property: str) -> None: + cypher = f""" + CREATE CONSTRAINT IF NOT EXISTS + FOR (n:{label}) + REQUIRE n.{property} IS UNIQUE + """ + + self.cypher_write(cypher) + + def evaluate_query_single(self, cypher, params={}): + result = self.driver.execute_query( + cypher, parameters_=params, result_transformer_=Neo4jResult.single + ) + + if result: + return result.value() + + else: + return None + + def evaluate_query(self, cypher, params={}): + result = self.driver.execute_query(cypher, parameters_=params) + + neo4j_records = result.records + neontology_records = neo4j_records_to_neontology_records( + neo4j_records, self.global_nodes, self.global_rels + ) + + return NeontologyResult( + records=neo4j_records, neontology_records=neontology_records + ) + + +def init_neontology( + neo4j_uri: Optional[str] = None, + neo4j_username: Optional[str] = None, + neo4j_password: Optional[str] = None, +) -> None: + """Initialise neontology. + + If connection properties are explicitly passed in, use these. + If not, attempt to load from enviornment variables (optionally in a .env file.) + + Args: + neo4j_uri (Optional[str], optional): Neo4j URI to connect to. Defaults to None. + neo4j_username (Optional[str], optional): Neo4j username. Defaults to None. + neo4j_password (Optional[str], optional): Neo4j password. Defaults to None. + """ + + # try to load environment variables from .env file + load_dotenv() + + if neo4j_uri is None: + neo4j_uri = os.getenv("NEO4J_URI") + + if neo4j_password is None: + neo4j_password = os.getenv("PASSWORD_NEO4J") + + if neo4j_username is None: + neo4j_username = os.getenv("USER_NEO4J") + + GraphConnection(neo4j_uri, neo4j_username, neo4j_password) + +def close_neontology(): + GraphConnection().__del__() \ No newline at end of file diff --git a/modules/database/tools/neontology/result.py b/modules/database/tools/neontology/result.py new file mode 100644 index 0000000..3caaaad --- /dev/null +++ b/modules/database/tools/neontology/result.py @@ -0,0 +1,114 @@ +import itertools +import warnings +from typing import List + +from neo4j import Record as Neo4jRecord +from neo4j.graph import Node as Neo4jNode +from neo4j.graph import Relationship as Neo4jRelationship +from pydantic import BaseModel, computed_field + + +def neo4j_records_to_neontology_records( + records: List[Neo4jRecord], node_classes: list, rel_classes: list +) -> list: + new_records = [] + + for record in records: + new_record = {"nodes": {}, "relationships": {}} + for key, entry in record.items(): + if isinstance(entry, Neo4jNode): + node_label = list(entry.labels)[0] + + # gracefully handle cases where we don't have a class defined + # for the identified label + try: + node = node_classes[node_label](**dict(entry)) + new_record["nodes"][key] = node + except KeyError: + warnings.warn( + ( + f"Could not find a class for {node_label} label." + " Did you define the class before initializing Neontology?" + ) + ) + pass + + elif isinstance(entry, Neo4jRelationship): + rel_type = entry.type + + rel_dict = rel_classes[rel_type] + + if not rel_dict: + warnings.warn( + ( + f"Could not find a class for {rel_type} relationship type." + " Did you define the class before initializing Neontology?" + ) + ) + continue + + src_label = list(entry.nodes[0].labels)[0] + tgt_label = list(entry.nodes[1].labels)[0] + + src_node = node_classes[src_label](**dict(entry.nodes[0])) + tgt_node = node_classes[tgt_label](**dict(entry.nodes[1])) + + rel_props = dict(entry) + rel_props["source"] = src_node + rel_props["target"] = tgt_node + + rel = rel_dict["rel_class"](**rel_props) + + new_record["relationships"][key] = rel + + new_records.append(new_record) + + return new_records + + +class NeontologyResult(BaseModel): + records: list + neontology_records: list + + @computed_field + @property + def nodes(self) -> list: + nodes_list_of_lists = [x["nodes"].values() for x in self.neontology_records] + return list(itertools.chain.from_iterable(nodes_list_of_lists)) + + @computed_field + @property + def relationships(self) -> list: + nodes_list_of_lists = [ + x["relationships"].values() for x in self.neontology_records + ] + return list(itertools.chain.from_iterable(nodes_list_of_lists)) + + @computed_field + @property + def node_link_data(self) -> dict: + nodes = [ + { + "id": x.get_primary_property_value(), + "label": x.__primarylabel__, + "name": str(x), + } + for x in self.nodes + ] + + links = [ + { + "source": x.source.get_primary_property_value(), + "target": x.target.get_primary_property_value(), + } + for x in self.relationships + ] + + unique_nodes = list({frozenset(item.items()): item for item in nodes}.values()) + unique_links = list({frozenset(item.items()): item for item in links}.values()) + data = { + "nodes": unique_nodes, + "links": unique_links, + } + + return data diff --git a/modules/database/tools/neontology/utils.py b/modules/database/tools/neontology/utils.py new file mode 100644 index 0000000..893c62e --- /dev/null +++ b/modules/database/tools/neontology/utils.py @@ -0,0 +1,116 @@ +from collections import defaultdict +from typing import Dict, Set, Type + +from .basenode import BaseNode +from .baserelationship import BaseRelationship +from .graphconnection import GraphConnection + + +def get_node_types(base_type: Type[BaseNode] = BaseNode) -> Dict[str, Type[BaseNode]]: + node_types = {} + + for subclass in base_type.__subclasses__(): + # we can define 'abstract' nodes which don't have a label + # these are to provide common properties to be used by subclassed nodes + # but shouldn't be put in the graph + if ( + hasattr(subclass, "__primarylabel__") + and subclass.__primarylabel__ is not None + ): + node_types[subclass.__primarylabel__] = subclass + + if subclass.__subclasses__(): + subclass_node_types = get_node_types(subclass) + + node_types.update(subclass_node_types) + + return node_types + + +def get_rels_by_type( + base_type: Type[BaseRelationship] = BaseRelationship, +) -> Dict[str, dict]: + rel_types: dict = defaultdict(dict) + + for rel_subclass in base_type.__subclasses__(): + # we can define 'abstract' relationships which don't have a label + # these are to provide common properties to be used by subclassed relationships + # but shouldn't be put in the graph + if ( + hasattr(rel_subclass, "__relationshiptype__") + and rel_subclass.__relationshiptype__ is not None + ): + rel_types[rel_subclass.__relationshiptype__] = { + "rel_class": rel_subclass, + "source_class": rel_subclass.model_fields["source"].annotation, + "target_class": rel_subclass.model_fields["target"].annotation, + } + + if rel_subclass.__subclasses__(): + subclass_rel_types = get_rels_by_type(rel_subclass) + + rel_types.update(subclass_rel_types) + + return rel_types + + +def all_subclasses(cls: type) -> set: + return set(cls.__subclasses__()).union( + [s for c in cls.__subclasses__() for s in all_subclasses(c)] + ) + + +def get_rels_by_node( + base_type: Type[BaseRelationship] = BaseRelationship, by_source: bool = True +) -> Dict[str, Set[str]]: + if by_source is True: + node_dir = "source_class" + + else: + node_dir = "target_class" + + all_rels = get_rels_by_type(base_type) + + by_node: Dict[str, Set[str]] = defaultdict(set) + + for rel_type, entry in all_rels.items(): + try: + node_label = entry[node_dir].__primarylabel__ + except AttributeError: + node_label = None + + if node_label is not None: + by_node[node_label].add(rel_type) + + for node_subclass in all_subclasses(entry[node_dir]): + subclass_label = node_subclass.__primarylabel__ + if subclass_label is not None: + by_node[subclass_label].add(rel_type) + + return by_node + + +def get_rels_by_source( + base_type: Type[BaseRelationship] = BaseRelationship, +) -> Dict[str, Set[str]]: + return get_rels_by_node(by_source=True) + + +def get_rels_by_target( + base_type: Type[BaseRelationship] = BaseRelationship, +) -> Dict[str, Set[str]]: + return get_rels_by_node(by_source=False) + + +def auto_constrain() -> None: + """Automatically apply constraints + + Get information about all the defined nodes in the current environment. + + Apply constraints based on the primary label and primary property for each node. + """ + + graph = GraphConnection() + + for node_label, node_type in get_node_types().items(): + graph.apply_constraint(node_label, node_type.__primaryproperty__) diff --git a/modules/database/tools/neontology_tools.py b/modules/database/tools/neontology_tools.py new file mode 100644 index 0000000..87695e8 --- /dev/null +++ b/modules/database/tools/neontology_tools.py @@ -0,0 +1,121 @@ +from dotenv import load_dotenv, find_dotenv +load_dotenv(find_dotenv()) +import os +import modules.logger_tool as logger +log_name = 'api_modules_database_tools_neontology_tools' +log_dir = os.getenv("LOG_PATH", "/logs") # Default path as fallback +logging = logger.get_logger( + name=log_name, + log_level=os.getenv("LOG_LEVEL", "DEBUG"), + log_path=log_dir, + log_file=log_name, + runtime=True, + log_format='default' +) +from modules.database.tools.neontology.graphconnection import init_neontology, close_neontology +from modules.database.tools.neontology.basenode import BaseNode +from modules.database.tools.neontology.baserelationship import BaseRelationship +from pydantic import ValidationError +import os +import neo4j + +# Initialize Neontology with the Neo4j database details +def init_neontology_connection(uri=None, user=None, password=None): + uri = uri or os.getenv("APP_BOLT_URL") + user = user or os.getenv("USER_NEO4J") # Add default value + password = password or os.getenv("PASSWORD_NEO4J") + + if not all([uri, user, password]): + raise ValueError("Missing required Neo4j connection parameters") + + try: + logging.info(f"Initializing Neontology with URI: {uri}") + init_neontology( + neo4j_uri=uri, + neo4j_username=user, + neo4j_password=password + ) + logging.info(f"Neontology connection initialized with URI: {uri}, user: {user}") + except Exception as e: + raise ValueError(f"Failed to initialize Neontology connection: {str(e)}") + +def close_neontology_connection(): + logging.debug(f"Attempting to terminate Neontology connection") + close_neontology() + logging.info(f"Neontology connection terminated") + +# Terminates the Neo4j connection +def close_neo4j_connection(): + logging.debug(f"Attempting to terminate Neo4j connection") + neo4j.close() + logging.info(f"Neo4j connection terminated") + +# Create a Neontology node in the Neo4j database +def create_or_merge_neontology_node(node: BaseNode, database: str = 'neo4j', operation: str = "merge"): + """ + Create or merge a Neontology node in the Neo4j database. + + Args: + node (BaseNode): A Neontology node object. + operation (str): The operation to perform ('create' or 'merge'). Defaults to 'merge'. + """ + try: + if operation == "create": + node.create(database=database) + elif operation == "merge": + node.merge(database=database) + else: + logging.error(f"Invalid operation: {operation}") + except Exception as e: + logging.error(f"Error in processing node: {e}") + +# Create or merge a Neontology node in the Neo4j database. If a ValidationError occurs +# due to a NaN value, replace it with a default value and retry. +def create_or_merge_neontology_node_with_default(driver, node: BaseNode, database: str = 'neo4j', operation: str = "merge", default_values: dict = {}): + """ + Create or merge a Neontology node in the Neo4j database. If a ValidationError occurs + due to a NaN value, replace it with a default value and retry. + + Args: + node (BaseNode): A Neontology node object. + operation (str): The operation to perform ('create' or 'merge'). Defaults to 'merge'. + default_values (dict): A dictionary of default values for fields that might contain NaN. + """ + try: + # Attempt to create or merge the node + if operation == "create": + node.create(database=database) + else: # "merge" by default + node.merge(database=database) + except ValidationError as e: + # Handle ValidationError due to NaN value + for field, error in e.errors(): + if field in default_values and 'type' in error and error['type'] == 'value_error.nan': + setattr(node, field, default_values[field]) + logging.warning(f"Warning: Replacing NaN in {field} with default value '{default_values[field]}' and retrying.") + create_or_merge_neontology_node_with_default(driver, node, database, operation, default_values) + break + else: + # If the error is not due to a NaN value or field not in default_values, re-raise the error + logging.error(f"Error in processing node: {e}") + raise + except Exception as e: + logging.error(f"Error in processing node: {e}") + +def create_or_merge_neontology_relationship(relationship: BaseRelationship, database: str = 'neo4j', operation: str = "merge"): + """ + Create or merge a Neontology relationship in the Neo4j database. + + Args: + relationship (BaseRelationship): A Neontology relationship object. + operation (str): The operation to perform ('create' or 'merge'). Defaults to 'merge'. + """ + try: + if operation == "create": + relationship.create(database=database) + elif operation == "merge": + relationship.merge(database=database) + else: + logging.error(f"Invalid operation: {operation}") + except Exception as e: + logging.error(f"Error in processing relationship: {e}") \ No newline at end of file diff --git a/modules/database/tools/queries.py b/modules/database/tools/queries.py new file mode 100644 index 0000000..c01d111 --- /dev/null +++ b/modules/database/tools/queries.py @@ -0,0 +1,25 @@ +def create_database(db_name): + return f"CREATE DATABASE `{db_name}` IF NOT EXISTS" + +def stop_database(db_name): + return f"STOP DATABASE `{db_name}`" + +def drop_database(db_name): + return f"DROP DATABASE `{db_name}`" + +show_constraints = "SHOW CONSTRAINTS" + +show_indexes = "SHOW INDEXES" + +def drop_index(index_name): + f"DROP INDEX {index_name}" + +def drop_constraint(constraint_name): + f"DROP CONSTRAINT {constraint_name}" + +delete_batch = """ + MATCH (n) + WITH n LIMIT $batch_size + DETACH DELETE n + RETURN count(*) + """ \ No newline at end of file diff --git a/modules/document_processor.py b/modules/document_processor.py new file mode 100644 index 0000000..dbe1ae6 --- /dev/null +++ b/modules/document_processor.py @@ -0,0 +1,94 @@ +from pathlib import Path +import subprocess +import tempfile +import os +from typing import Dict, List, Optional + +class DocumentProcessor: + def __init__(self): + self.supported_extensions = { + 'doc': 'libreoffice', + 'docx': 'libreoffice', + 'odt': 'libreoffice', + 'rtf': 'libreoffice', + 'txt': 'libreoffice', + 'html': 'libreoffice', + 'htm': 'libreoffice', + 'xls': 'libreoffice', + 'xlsx': 'libreoffice', + 'ppt': 'libreoffice', + 'pptx': 'libreoffice', + 'pdf': 'pdf' + } + + def convert_to_pdf(self, input_file: Path) -> bytes: + """ + Convert a document to PDF format + """ + if not input_file.exists(): + raise FileNotFoundError(f"Input file not found: {input_file}") + + input_extension = input_file.suffix.lower()[1:] # Remove the dot + if input_extension not in self.supported_extensions: + raise ValueError(f"Unsupported file extension: {input_extension}") + + if input_extension == 'pdf': + # If it's already a PDF, just read and return it + with open(input_file, 'rb') as f: + return f.read() + + # Use LibreOffice for conversion + with tempfile.TemporaryDirectory() as temp_dir: + output_file = Path(temp_dir) / f"{input_file.stem}.pdf" + + # Convert using LibreOffice + cmd = [ + 'libreoffice', + '--headless', + '--convert-to', 'pdf', + '--outdir', str(temp_dir), + str(input_file) + ] + + try: + subprocess.run(cmd, check=True, capture_output=True) + except subprocess.CalledProcessError as e: + raise RuntimeError(f"Conversion failed: {e.stderr.decode()}") + + if not output_file.exists(): + raise RuntimeError("Conversion failed: Output file not created") + + # Read and return the PDF content + with open(output_file, 'rb') as f: + return f.read() + + def batch_convert_directory(self, directory: str) -> List[Dict]: + """ + Convert all documents in a directory to PDF format + """ + directory_path = Path(directory) + if not directory_path.exists(): + raise FileNotFoundError(f"Directory not found: {directory}") + + results = [] + for file_path in directory_path.glob('*'): + if file_path.is_file() and file_path.suffix.lower()[1:] in self.supported_extensions: + try: + pdf_content = self.convert_to_pdf(file_path) + output_file = file_path.with_suffix('.pdf') + with open(output_file, 'wb') as f: + f.write(pdf_content) + + results.append({ + "source_file": str(file_path), + "output_file": str(output_file), + "status": "success" + }) + except Exception as e: + results.append({ + "source_file": str(file_path), + "status": "error", + "error": str(e) + }) + + return results \ No newline at end of file diff --git a/modules/langchain/__init__.py b/modules/langchain/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/modules/langchain/__pycache__/__init__.cpython-311.pyc b/modules/langchain/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..18e7ef6835dcd8252c343a9275b00c322d1cb4d3 GIT binary patch literal 143 zcmZ3^%ge<81b?*LGeGoX5CH>>P{wCAAY(d13PUi1CZpd&ryk0@&FAf`syj>A1Pz%V=Vtyd;ftit!@dE>l JC}IYR0Ra159-jaJ literal 0 HcmV?d00001 diff --git a/modules/langchain/__pycache__/interactive_langgraph_query.cpython-311.pyc b/modules/langchain/__pycache__/interactive_langgraph_query.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7d07dd6d389fe25204a2be3cf0721f29d2272c7f GIT binary patch literal 34901 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 S;&(0IlJXBf$fG|7$^TzEZ(6AU literal 0 HcmV?d00001 diff --git a/modules/langchain/interactive_langgraph_query.py b/modules/langchain/interactive_langgraph_query.py new file mode 100644 index 0000000..d1a3fe1 --- /dev/null +++ b/modules/langchain/interactive_langgraph_query.py @@ -0,0 +1,510 @@ +from dotenv import load_dotenv, find_dotenv +load_dotenv(find_dotenv()) +import os +import modules.logger_tool as logger +log_name = 'api_modules_interactive_langgraph_query' +log_dir = os.getenv("LOG_PATH", "/logs") # Default path as fallback +logging = logger.get_logger( + name=log_name, + log_level=os.getenv("LOG_LEVEL", "DEBUG"), + log_path=log_dir, + log_file=log_name, + runtime=True, + log_format='default' +) +from langchain_core.messages import BaseMessage, HumanMessage +from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder +from typing import Annotated, Sequence, List, TypedDict +from langchain_core.pydantic_v1 import BaseModel, Field +import operator +from langchain_openai import ChatOpenAI +import openai +import aiohttp +from urllib.parse import urlencode +from bs4 import BeautifulSoup +import asyncio +import re +from datetime import datetime +from extruct import extract +from w3lib.html import get_base_url +from sklearn.feature_extraction.text import TfidfVectorizer +from sklearn.metrics.pairwise import cosine_similarity +from modules.redis_config import get_cached_results, set_cached_results + +# Explicitly set the OpenAI API key +openai_api_key = os.getenv("OPENAI_API_KEY") +if not openai_api_key or openai_api_key.lower() == "null": + raise ValueError("OPENAI_API_KEY is not set or is set to NULL in the environment variables") + +openai.api_key = openai_api_key +logging.info(f"OpenAI API Key: {openai_api_key[:5]}...{openai_api_key[-5:]}") + +from langgraph.constants import END, Send +from langgraph.graph import StateGraph +from langgraph.checkpoint.memory import MemorySaver + +simple_model = ChatOpenAI(model="gpt-3.5-turbo", temperature=0, streaming=True) +advanced_model = ChatOpenAI(model="gpt-4o", temperature=0, streaming=True) + +class Queries(BaseModel): + """List of search queries""" + queries: List[str] = Field( + description="List of the generated search queries" + ) + +class SummaryState(TypedDict): + content: str + query: str + +class PerplexityClone: + ADDITIONAL_QUESTION_PROMPT = """You are tasked with analyzing a message to determine if it requires additional input from the user. + Your goal is to be conservative in asking for additional input, only indicating that more information is needed if it is relevant to answering the question or fulfilling the request in the message. + Use the following criteria to guide your decision: + - Is the core question or request clearly stated? + - Are all necessary details provided to understand the context? + - Would additional information significantly change or improve the response? + - Is the missing information essential or helpful? + + Before giving your final answer, think through your analysis in a scratchpad: + + + Analyze the message here, considering the criteria above. Think step-by-step about whether additional input is truly necessary or if the message can be responded to with the given information. + + + After your analysis, provide your final answer in the following format: + + + [YES/NO]: (Choose YES if additional input is required, NO if it is not) + Justification: (Briefly explain your reasoning) + + Remember to be conservative in asking for additional input. Only say YES if the additional information is highly relevant and necessary to properly address the message.""" + + SEARCH_QUERY_PROMPT = """You are a helpful AI assistant, create a list of 2-3 search queries based on the message""" + + FINAL_NODE_SYSTEM_PROMPT = """You are a helpful AI assistant, answer the given question based on the context. Clearly cite the sources for your answer including the links for the sources next to each point""" + + FINAL_NODE_PROMPT = """Question: {question} + Context: {context} + Answer:""" + + @staticmethod + def prioritize_content(extracted_text, query): + """Prioritize content based on relevance to the query.""" + documents = [extracted_text, query] + tfidf_vectorizer = TfidfVectorizer().fit_transform(documents) + cosine_matrix = cosine_similarity(tfidf_vectorizer[0:1], tfidf_vectorizer) + score = cosine_matrix[0][1] # Similarity score with the query + logging.debug(f"Content prioritization score: {score}") + return score + + # Define OverallState with class methods for graph nodes + class OverallState(TypedDict): + messages: Annotated[Sequence[BaseMessage], operator.add] + next: str + search_queries: list[str] + search_results: list[str] + page_content: list[str] + page_summaries: Annotated[list, operator.add] + needs_more_info: bool = False + + @classmethod + def additional_questions_node(cls, state): + logging.debug("Entering additional_questions_node") + messages = state['messages'] + last_message = messages[-1] + + prompt = ChatPromptTemplate.from_messages( + [ + ("system", PerplexityClone.ADDITIONAL_QUESTION_PROMPT), + MessagesPlaceholder(variable_name="messages"), + MessagesPlaceholder(variable_name="agent_scratchpad") + ] + ) + chain = prompt | simple_model + input_data = { + "messages": messages, + "agent_scratchpad": [] + } + logging.chat(f"additional_questions_node is sending data to model: {input_data}") + result = chain.invoke(input_data) + logging.chat(f"additional_questions_node received data from model: {result.content}") + needs_more_info = "YES" in result.content.upper() + return {"next": result.content, "needs_more_info": needs_more_info} + + @classmethod + def where_to_go(cls, state): + next = state['next'] + if "NO" in next: + return "proceed" + else: + return "ask" + + @classmethod + def ask_node(cls, state): + messages = state['messages'] + user_question = messages[0] + + prompt = f"Ask any additional questions that are required to answer the question: {user_question.content}" + logging.chat(f"ask_node is sending data to model: {prompt}") + question = simple_model.invoke(prompt) + logging.chat(f"ask_node received data from model: {question.content}") + return {"messages": [question]} + + @classmethod + def new_question_node(cls, state): + messages = state['messages'] + initial_question = messages[0] + + prompt = f"Reframe the initial question: {initial_question.content} based on the messages: {messages}" + logging.chat(f"new_question_node is sending data to model: {prompt}") + response = simple_model.invoke(prompt) + logging.chat(f"new_question_node received data from model: {response.content}") + new_question = HumanMessage(content=response.content) + return {"messages": [new_question]} + + @classmethod + def search_query_node(cls, state): + messages = state['messages'] + last_message = messages[-1] + + prompt = ChatPromptTemplate.from_messages( + [ + ("system", PerplexityClone.SEARCH_QUERY_PROMPT), + MessagesPlaceholder(variable_name="messages"), + ] + ) + chain = prompt | simple_model + logging.chat(f"search_query_node is sending data to model: {messages}") + result = chain.invoke(messages) + logging.chat(f"search_query_node received data from model: {result.content}") + + queries = [q.strip() for q in result.content.split('\n') if q.strip()] + return {"search_queries": queries} + + @classmethod + async def search_results_node(cls, state): + logging.debug("Entering search_results_node") + queries = state['search_queries'] + logging.debug(f"Queries: {queries}") + try: + results = await cls.search(queries) + logging.debug(f"Search results: {results}") + except Exception as e: + logging.error(f"Error in search_results_node: {str(e)}") + raise + return {"search_results": results} + + @classmethod + async def web_scrape_node(cls, state): + logging.debug("Entering web_scrape_node") + search_results = state['search_results'] + crawled_results = [] + + logging.debug(f"Search results: {search_results}") + for result_list in search_results: + for result in result_list: + logging.debug(f"Result: {result}") + url = result.get('url', 'No URL') + content = result.get('content', result.get('title', 'No content')) + logging.debug(f"Using crawler on: {url} with content: {content}") + + try: + crawled_content = await cls.crawl_page(result, state['messages'][-1].content, retries=3, timeout=20) + if crawled_content: + logging.debug(f"Crawled content: {crawled_content}") + crawled_results.append(crawled_content) + else: + logging.error(f"No content found for {url}") + except Exception as e: + logging.error(f"Error crawling {url}: {str(e)}") + + if not crawled_results: + logging.error("No crawled results found") + return {"page_content": [{"page_content": "No relevant content found.", "metadata": {}}]} # Adjusted to ensure it returns a dictionary + else: + logging.debug(f"Crawled results: {crawled_results}") + return {"page_content": [{"page_content": cr['content'], "metadata": {"source": cr['url']}} for cr in crawled_results]} + + @classmethod + async def crawl_page(cls, result, query, retries=3, timeout=20): + """Crawl a page with retries and timeouts.""" + for attempt in range(retries): + try: + async with aiohttp.ClientSession() as session: + async with session.get(result['url'], timeout=timeout) as response: + if response.status != 200: + raise Exception(f"HTTP status {response.status}") + html = await response.text() + + # Extract structured data + structured_data = await cls.extract_structured_data(html, result['url']) + if structured_data: + logging.debug(f"Structured data extracted: {structured_data}") + else: + logging.debug("No structured data found") + + soup = BeautifulSoup(html, 'html.parser') + + # Remove unnecessary elements + for element in soup(['script', 'style', 'nav', 'header', 'footer']): + element.decompose() + + main_content = ( + soup.find('main') or + soup.find('article') or + soup.find('.content') or + soup.find(id='content') or + soup.body + ) + + if main_content: + # Prioritize specific content elements + priority_elements = main_content.find_all(['h1', 'h2', 'h3', 'p']) + extracted_text = '\n\n'.join(el.get_text().strip() for el in priority_elements if el.get_text().strip()) + + # If not enough content, fall back to other elements + if len(extracted_text) < 500: + content_elements = main_content.find_all(['h4', 'h5', 'h6', 'li', 'td', 'th', 'blockquote', 'pre', 'code']) + extracted_text += '\n\n' + '\n\n'.join(el.get_text().strip() for el in content_elements if el.get_text().strip()) + + # Prioritize the extracted content based on relevance to the query + relevance_score = PerplexityClone.prioritize_content(extracted_text, query) + logging.debug(f"Content relevance score: {relevance_score}") + + # Extract metadata + meta_description = soup.find('meta', attrs={'name': 'description'}) + meta_keywords = soup.find('meta', attrs={'name': 'keywords'}) + og_title = soup.find('meta', property='og:title') + og_description = soup.find('meta', property='og:description') + + # Combine metadata with extracted text + metadata = [ + result['title'], + og_title['content'] if og_title else '', + meta_description['content'] if meta_description else '', + og_description['content'] if og_description else '', + meta_keywords['content'] if meta_keywords else '', + ] + extracted_text = '\n\n'.join(filter(None, metadata + [extracted_text])) + + # Limit the extracted text to 10000 characters + extracted_text = extracted_text[:10000] + + # Highlight query terms in the content + highlighted_content = cls.highlight_query_terms(extracted_text, query) + + # Extract publication date + published_date = cls.extract_publication_date(soup) + + return { + 'title': result['title'], + 'url': result['url'], + 'content': highlighted_content, + 'structured_data': structured_data, + 'relevance_score': relevance_score, + 'publishedDate': published_date.isoformat() if published_date else None + } + else: + logging.debug("No main content found") + + except asyncio.TimeoutError: + logging.warning(f"Timeout occurred while crawling {result['url']}. Attempt {attempt + 1} of {retries}") + except Exception as error: + logging.error(f"Error crawling {result['url']}: {str(error)}. Attempt {attempt + 1} of {retries}") + + # If all retries fail, return a default response + logging.debug("All retries failed. Returning default response.") + return { + 'title': result['title'], + 'url': result['url'], + 'content': result.get('content', 'Content unavailable due to crawling error.'), + 'structured_data': None, + 'relevance_score': None, + 'publishedDate': None + } + + @staticmethod + async def extract_structured_data(html, url): + """Extract structured data (e.g., JSON-LD) from a webpage.""" + logging.debug(f"Extracting structured data from: {url}") + base_url = get_base_url(html, url) + data = extract(html, base_url=base_url) + logging.debug(f"Structured data extracted: {data}") + return data + + @staticmethod + def highlight_query_terms(text, query): + words = query.lower().split() + for word in words: + pattern = re.compile(r'\b' + re.escape(word) + r'\b', re.IGNORECASE) + text = pattern.sub(f'**{word.upper()}**', text) + logging.debug(f"Highlighted text: {text}") + return text + + @staticmethod + def extract_publication_date(soup): + date_meta = soup.find('meta', property='article:published_time') + if date_meta: + logging.debug(f"Extracted publication date: {date_meta['content']}") + return datetime.fromisoformat(date_meta['content'].split('+')[0]) + + date_meta = soup.find('meta', attrs={'name': 'pubdate'}) + if date_meta: + logging.debug(f"Extracted publication date: {date_meta['content']}") + return datetime.fromisoformat(date_meta['content'].split('+')[0]) + + date_tag = soup.find(['time', 'span'], attrs={'datetime': True}) + if date_tag: + logging.debug(f"Extracted publication date: {date_tag['datetime']}") + return datetime.fromisoformat(date_tag['datetime'].split('+')[0]) + + return None + + @classmethod + def generate_summary(cls, state: SummaryState): + content_item = state['content'] + logging.debug(f"Content item received in generate_summary: {content_item} (type: {type(content_item)})") + + if isinstance(content_item, dict): + logging.debug(f"Content item is a dictionary: {content_item}") + content = content_item.get('page_content', '') + source = content_item.get('metadata', {}).get('source', 'Unknown Source') + else: + logging.error(f"Expected a dictionary for content_item but got {type(content_item)}: {content_item}") + raise TypeError("Expected a dictionary for content_item in generate_summary.") + + query = state['query'] + logging.debug(f"Generating summary for source: {source}") + prompt = f"Summarize the following content to answer the question: {query}, mention the source: {source} \n\n {content[:500]}... " + logging.chat(f"generate_summary is sending data to model: {prompt}") + page_summary = simple_model.invoke(prompt) # May need advanced model + logging.chat(f"generate_summary received data from model: {page_summary.content}") + logging.debug(f"Summary generated (first 1000 characters): {page_summary.content[:1000]}...") + return {"page_summaries": [page_summary.content]} + + @classmethod + def continue_to_summarise_node(cls, state): + logging.debug("Entering continue_to_summarise_node") + if 'page_content' not in state or not state['page_content']: + logging.error("page_content is missing or empty in state") + return [] + logging.debug(f"Page content before summarization: {state['page_content']}") + + return [Send("Generate Summary", { + "content": { + "page_content": p['page_content'], + "metadata": p.get("metadata", {}) + }, + "query": state['messages'][0].content + }) for p in state['page_content'] if isinstance(p, dict)] + + @classmethod + def final_result_node(cls, state): + logging.debug("Entering final_result_node") + messages = state['messages'] + question = messages[-1] + context = state['page_summaries'] + logging.debug(f"Question: {question}") + logging.debug(f"Number of context summaries: {len(context)}") + prompt = ChatPromptTemplate.from_messages( + [ + ("system", PerplexityClone.FINAL_NODE_SYSTEM_PROMPT), + ("human", PerplexityClone.FINAL_NODE_PROMPT), + ] + ) + input = {"question": question, "context": context} + formatted_prompt = prompt.format_messages(**input) + logging.debug(f"Formatted prompt for final response: {formatted_prompt}") + response = advanced_model.invoke(formatted_prompt) + logging.debug(f"Final response generated (first 500 characters): {response.content[:500]}...") + return {"messages": [response]} + + @staticmethod + async def search(queries): + logging.debug("Entering search method") + apiUrl = os.getenv("SEARXNG_API_URL_DEV") + if not apiUrl: + raise ValueError("SEARXNG_API_URL_DEV is not set in the environment variables") + + use_cache = os.getenv("DEV_MODE", "true").lower() == "false" + + async with aiohttp.ClientSession() as session: + results = [] + for query in queries: + logging.debug(f"Searching for query: {query}") + + # Check cache for existing results only if DEV_MODE is false + if use_cache: + cache_key = f"searxng_search:{query}" + cached_result = get_cached_results(cache_key) + if cached_result: + logging.info(f"Found cached search result for query: {query}") + results.append(cached_result) + continue + + try: + params = { + 'q': query, + 'format': 'json', + 'categories': 'general', + 'engines': os.getenv('SEARXNG_ENGINES', 'google,bing,duckduckgo'), + 'time_range': os.getenv('SEARXNG_TIME_RANGE', ''), + 'safesearch': os.getenv('SEARXNG_SAFESEARCH', '0'), + } + url = f"{apiUrl}/search?{urlencode(params)}" + async with session.get(url) as response: + if response.status != 200: + raise Exception(f"SearXNG API error: {response.status}") + data = await response.json() + if 'results' not in data: + logging.warning(f"No results found for query: {query}") + search_results = [] + else: + search_results = data['results'][:3] # Limit to top 3 results + + results.append(search_results) + + # Cache the result only if DEV_MODE is false + if use_cache: + set_cached_results(cache_key, search_results) + + logging.debug(f"Raw API response for query '{query}': {data}") + except Exception as e: + logging.error(f"Error in search for query {query}: {str(e)}") + results.append([]) # Add an empty list for failed queries + + return results + +# Create an instance of PerplexityClone +perplexity_clone_instance = PerplexityClone() + +# Construct the graph using the class methods +perplexity_clone = StateGraph(PerplexityClone.OverallState) +perplexity_clone.add_node('Additional Questions', PerplexityClone.OverallState.additional_questions_node) +perplexity_clone.add_node('Ask', PerplexityClone.OverallState.ask_node) +perplexity_clone.add_node('New Question', PerplexityClone.OverallState.new_question_node) +perplexity_clone.add_node('Query Generator', PerplexityClone.OverallState.search_query_node) +perplexity_clone.add_node('Search Results', PerplexityClone.OverallState.search_results_node) +perplexity_clone.add_node('Web Scraper', PerplexityClone.OverallState.web_scrape_node) +perplexity_clone.add_node('Generate Summary', PerplexityClone.OverallState.generate_summary) +perplexity_clone.add_node('Final Result', PerplexityClone.OverallState.final_result_node) + +perplexity_clone.set_entry_point('Additional Questions') +perplexity_clone.set_finish_point('Final Result') + +perplexity_clone.add_conditional_edges('Additional Questions', PerplexityClone.OverallState.where_to_go, {'proceed': 'Query Generator', 'ask': 'Ask'}) +perplexity_clone.add_edge('Ask', 'New Question') +perplexity_clone.add_edge('New Question', 'Query Generator') +perplexity_clone.add_edge('Query Generator', 'Search Results') +perplexity_clone.add_edge('Search Results', 'Web Scraper') +perplexity_clone.add_conditional_edges('Web Scraper', PerplexityClone.OverallState.continue_to_summarise_node, ['Generate Summary']) +perplexity_clone.add_edge('Generate Summary', 'Final Result') + +# Compile the graph +perplexity_clone_graph = perplexity_clone.compile(checkpointer=MemorySaver(), interrupt_after=["Ask"]) + +# Export the graph and OverallState +OverallState = PerplexityClone.OverallState + +# Export the graph and OverallState +__all__ = ["perplexity_clone_graph", "OverallState"] diff --git a/modules/langchain/neo4j_graph_qa.py b/modules/langchain/neo4j_graph_qa.py new file mode 100644 index 0000000..2a31130 --- /dev/null +++ b/modules/langchain/neo4j_graph_qa.py @@ -0,0 +1,61 @@ +from dotenv import load_dotenv, find_dotenv +load_dotenv(find_dotenv()) +import os +import modules.logger_tool as logger +log_name = 'api_modules_langchain_graph_qa' +log_dir = os.getenv("LOG_PATH", "/logs") # Default path as fallback +logging = logger.get_logger( + name=log_name, + log_level=os.getenv("LOG_LEVEL", "DEBUG"), + log_path=log_dir, + log_file=log_name, + runtime=True, + log_format='default' +) + +def test_query_graph(database, prompt, top_k=20, model="gpt-4o", temperature=0, verbose=False, return_intermediate_steps=True, exclude_types=None, include_types=None, return_direct=False, validate_cypher=False, model_type="openai"): + url = f"{os.environ['APP_API_URL']}/langchain/graph_qa/prompt" + params = { + "database": database, + "prompt": prompt, + "top_k": top_k, + "model": model, + "temperature": temperature, + "verbose": verbose, + "return_intermediate_steps": return_intermediate_steps, + "exclude_types": exclude_types or [], + "include_types": include_types or [], + "return_direct": return_direct, + "validate_cypher": validate_cypher, + "model_type": model_type + } + + try: + response = requests.get(url, params=params) + response.raise_for_status() # Raise an error for bad status codes + data = response.json() + logging.info("==================================================") + logging.info("= =") + logging.info("= Test Execution =") + logging.info("= =") + logging.info("==================================================") + logging.info(f"= Prompt: {data.get('query', 'N/A')}") + logging.info("= =") + logging.info(f"= Query: \n{data.get('intermediate_steps', [{'query': 'N/A'}])[0].get('query', 'N/A')}") + logging.info("= =") + logging.info("==================================================") + + # Determine if the test passed or failed + response_text = data.get('result', 'N/A') + context = data.get('intermediate_steps', [{'context': 'N/A'}])[1].get('context', 'N/A') + if "I don't know" in response_text or not context: + return False, context, response_text + else: + return True, context, response_text + except requests.exceptions.RequestException as e: + logging.error("==================================================") + logging.error("= ERROR =") + logging.error("==================================================") + logging.error(f"Error: {e}") + logging.error("==================================================") + return False, None, None \ No newline at end of file diff --git a/modules/logger_tool.py b/modules/logger_tool.py new file mode 100644 index 0000000..7aa7907 --- /dev/null +++ b/modules/logger_tool.py @@ -0,0 +1,174 @@ +import os +import sys +import logging +import datetime +import pytest +from dotenv import load_dotenv, find_dotenv + +# Load environment variables +load_dotenv(find_dotenv()) + +# Define a global format string for log alignment +LOG_FORMAT = "%(asctime)s %(levelname)-8s: %(filename)-20s:%(funcName)-20s:%(lineno)-4d >>> %(message)s" + +# Define custom logging levels +SUCCESS_LOG_LEVEL = 21 +APP_LOG_LEVEL = 15 +PROD_LOG_LEVEL = 14 +DATABASE_LOG_LEVEL = 13 +CHAT_LOG_LEVEL = 12 +QUERY_LOG_LEVEL = 11 +TESTING_LOG_LEVEL = 9 +VARIABLES_LOG_LEVEL = 2 +PEDANTIC_LOG_LEVEL = 1 + +# Register custom log levels +CUSTOM_LEVELS = { + SUCCESS_LOG_LEVEL: "SUCCESS", + APP_LOG_LEVEL: "APP", + PROD_LOG_LEVEL: "PROD", + DATABASE_LOG_LEVEL: "DATABASE", + CHAT_LOG_LEVEL: "CHAT", + QUERY_LOG_LEVEL: "QUERY", + TESTING_LOG_LEVEL: "TESTING", + VARIABLES_LOG_LEVEL: "VARIABLES", + PEDANTIC_LOG_LEVEL: "PEDANTIC" +} +for level, name in CUSTOM_LEVELS.items(): + logging.addLevelName(level, name) + +# ANSI escape sequences for colors +class LogColors: + """ANSI escape sequences for various log levels to colorize log output.""" + DARK_RED, BRIGHT_RED = '\033[31m', '\033[91m' + ORANGE, GOLD, YELLOW = '\033[33m', '\033[93m', '\033[93m' + GREEN, DARKGREEN, LIGHTGREEN = '\033[92m', '\033[32m', '\033[92m' + LIGHTBLUE, BLUE, INDIGO, VIOLET = '\033[94m', '\033[94m', '\033[34m', '\033[35m' + RESET, WHITE, BLACK = '\033[0m', '\033[37m', '\033[30m' + +# Custom Formatter +class ColoredFormatter(logging.Formatter): + """Custom formatter to add color and emojis to log messages for console output.""" + COLORS = { + logging.CRITICAL: f"{LogColors.DARK_RED}🚨 ", + logging.ERROR: f"{LogColors.BRIGHT_RED}❌ ", + logging.WARNING: f"{LogColors.ORANGE}⚠️ ", + logging.INFO: f"{LogColors.GREEN}ℹ️ ", + logging.DEBUG: f"{LogColors.BLUE}🐛 ", + SUCCESS_LOG_LEVEL: f"{LogColors.LIGHTGREEN}✅ ", + APP_LOG_LEVEL: f"{LogColors.INDIGO}🚀 ", + PROD_LOG_LEVEL: f"{LogColors.VIOLET}🏭 ", + DATABASE_LOG_LEVEL: f"{LogColors.DARKGREEN}🗄️ ", + CHAT_LOG_LEVEL: f"{LogColors.LIGHTBLUE}💬 ", + QUERY_LOG_LEVEL: f"{LogColors.GOLD}🔍 ", + TESTING_LOG_LEVEL: f"{LogColors.YELLOW}🧪 ", + VARIABLES_LOG_LEVEL: f"{LogColors.WHITE}🔢 ", + PEDANTIC_LOG_LEVEL: f"{LogColors.BLACK}🔬 ", + } + + def format(self, record): + log_fmt = self.COLORS.get(record.levelno, self.COLORS[logging.INFO]) + self._fmt + formatter = logging.Formatter(log_fmt) + message = formatter.format(record) + LogColors.RESET + try: + return message + except UnicodeEncodeError: + return message.encode('ascii', 'replace').decode('ascii') + + def formatException(self, ei): + try: + return super().formatException(ei) + except UnicodeEncodeError: + return super().formatException(ei).encode('ascii', 'replace').decode('ascii') + +class FileFormatter(logging.Formatter): + def format(self, record): + return logging.Formatter(LOG_FORMAT).format(record) + +class PytestFormatter: + @pytest.hookimpl(hookwrapper=True) + def pytest_runtest_makereport(self, item, call): + outcome = yield + report = outcome.get_result() + if report.when == "call": + if report.passed: + logging.success(f"✅ Test passed: {item.name}") + elif report.failed: + logging.error(f"❌ Test failed: {item.name}") + elif report.skipped: + logging.warning(f"⏭️ Test skipped: {item.name}") + +# Custom logger methods +def _add_custom_log_methods(): + def create_log_method(level): + def log_method(self, message, *args, **kws): + if self.isEnabledFor(level): + self._log(level, message, args, **kws) + return log_method + + custom_methods = { + "chat": CHAT_LOG_LEVEL, "variables": VARIABLES_LOG_LEVEL, + "pedantic": PEDANTIC_LOG_LEVEL, "prod": PROD_LOG_LEVEL, + "query": QUERY_LOG_LEVEL, "database": DATABASE_LOG_LEVEL, + "testing": TESTING_LOG_LEVEL, "app": APP_LOG_LEVEL, "success": SUCCESS_LOG_LEVEL + } + for method_name, level in custom_methods.items(): + setattr(logging.Logger, method_name, create_log_method(level)) + +_add_custom_log_methods() + +# Set an environment directory +def set_log_path(env_var): + env_path = os.getenv(env_var.upper()) + if env_path and not os.path.exists(env_path): + os.makedirs(env_path) + return env_path + +# Get a logger with specified settings +def get_logger(name=None, log_level=None, log_path=None, log_file=None, delimiter='_', runtime=False, log_format=None): + logger = logging.getLogger(name or __name__) + log_levels = { + 'CRITICAL': logging.CRITICAL, 'ERROR': logging.ERROR, 'WARNING': logging.WARNING, + 'SUCCESS': SUCCESS_LOG_LEVEL, 'APP': APP_LOG_LEVEL, 'PROD': PROD_LOG_LEVEL, + 'DATABASE': DATABASE_LOG_LEVEL, 'INFO': logging.INFO, 'DEBUG': logging.DEBUG, + 'TESTING': TESTING_LOG_LEVEL, 'CHAT': CHAT_LOG_LEVEL, 'QUERY': QUERY_LOG_LEVEL, + 'VARIABLES': VARIABLES_LOG_LEVEL, 'PEDANTIC': PEDANTIC_LOG_LEVEL, + } + desired_level = log_levels.get(log_level, logging.INFO) if log_level else logger.level or logging.INFO + logger.setLevel(desired_level) + logger.propagate = False + + console_formatter = ColoredFormatter(LOG_FORMAT if log_format in (None, "default") else log_format) + file_formatter = FileFormatter(LOG_FORMAT if log_format in (None, "default") else log_format) + + if not logger.handlers: + if runtime: + ch = logging.StreamHandler(sys.stdout) + ch.setLevel(logging.DEBUG) + ch.setFormatter(console_formatter) + logger.addHandler(ch) + + if log_path and log_file: + os.makedirs(log_path, exist_ok=True) + log_file_path = os.path.join(log_path, f"{log_file}{'_' if runtime else delimiter}{datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S') if not runtime else ''}.log") + fh = logging.FileHandler(log_file_path) + fh.setLevel(desired_level) + fh.setFormatter(file_formatter) + logger.addHandler(fh) + else: + for handler in logger.handlers: + handler.setLevel(desired_level) + handler.setFormatter(file_formatter if isinstance(handler, logging.FileHandler) else console_formatter) + + return logger + +# Retrieve all loggers +def get_loggers(): + """Return a list of all logger instances.""" + return [logging.getLogger(name) for name in logging.Logger.manager.loggerDict] + +# Initialize logger using provided settings +def initialise_logger(log_name='backend', log_level=None, log_dir=None, log_format='default', runtime=True): + log_level = log_level or os.getenv("LOG_LEVEL", "DEBUG") + log_dir = log_dir or os.getenv("LOG_PATH", "/logs") + return get_logger(name=log_name, log_level=log_level, log_path=log_dir, log_file=log_name, runtime=runtime, log_format=log_format) diff --git a/modules/msgraph/__init__.py b/modules/msgraph/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/modules/msgraph/msapi_config.py b/modules/msgraph/msapi_config.py new file mode 100644 index 0000000..6a44e10 --- /dev/null +++ b/modules/msgraph/msapi_config.py @@ -0,0 +1,41 @@ +from dotenv import load_dotenv, find_dotenv +load_dotenv(find_dotenv()) +import os +import modules.logger_tool as logger +log_name = 'api_modules_msgraph_config' +log_dir = os.getenv("LOG_PATH", "/logs") # Default path as fallback +logging = logger.get_logger( + name=log_name, + log_level=os.getenv("LOG_LEVEL", "DEBUG"), + log_path=log_dir, + log_file=log_name, + runtime=True, + log_format='default' +) +from msal import ConfidentialClientApplication + +CLIENT_ID = os.getenv("VITE_MICROSOFT_CLIENT_ID") +CLIENT_SECRET = os.getenv("VITE_MICROSOFT_CLIENT_SECRET") +TENANT_ID = os.getenv("VITE_MICROSOFT_TENANT_ID") +AUTHORITY = f"https://login.microsoftonline.com/{TENANT_ID}" +SCOPE = ["https://graph.microsoft.com/.default"] + +# Create an MSAL confidential client application +def get_ms_access_token(): + app = ConfidentialClientApplication( + client_id=CLIENT_ID, + client_credential=CLIENT_SECRET, + authority=AUTHORITY, + ) + + # For a confidential client application, we don't use user-specific accounts + # Instead, we directly acquire a token for the application + result = app.acquire_token_for_client(scopes=SCOPE) + + if 'access_token' in result: + logging.info("Token acquired successfully") + return result['access_token'] + else: + error_message = f"Failed to acquire token: {result.get('error')}, {result.get('error_description')}" + logging.error(error_message) + raise Exception(error_message) diff --git a/modules/msgraph/msgraph_client.py b/modules/msgraph/msgraph_client.py new file mode 100644 index 0000000..90cb4c2 --- /dev/null +++ b/modules/msgraph/msgraph_client.py @@ -0,0 +1,40 @@ +from dotenv import load_dotenv, find_dotenv +load_dotenv(find_dotenv()) +import os +import modules.logger_tool as logger +log_name = 'api_modules_msgraph_client' +log_dir = os.getenv("LOG_PATH", "/logs") # Default path as fallback +logging = logger.get_logger( + name=log_name, + log_level=os.getenv("LOG_LEVEL", "DEBUG"), + log_path=log_dir, + log_file=log_name, + runtime=True, + log_format='default' +) +import requests + +GRAPH_API_ENDPOINT = "https://graph.microsoft.com/v1.0" + +class MSGraphClient: + def __init__(self, access_token: str): + self.access_token = access_token + + def get_headers(self): + return { + "Authorization": f"Bearer {self.access_token}", + "Content-Type": "application/json", + } + + def get_onenote_notebooks(self): + url = f"{GRAPH_API_ENDPOINT}/me/onenote/notebooks" + response = requests.get(url, headers=self.get_headers()) + + if response.status_code == 200: + return response.json().get('value', []) + else: + raise Exception(f"Error fetching notebooks: {response.status_code}, {response.text}") + +# Function to initialize the MSGraph client +def get_msgraph_client(access_token: str): + return MSGraphClient(access_token) diff --git a/modules/pdf_utils.py b/modules/pdf_utils.py new file mode 100644 index 0000000..5c49839 --- /dev/null +++ b/modules/pdf_utils.py @@ -0,0 +1,43 @@ +from pathlib import Path +import PyPDF2 +from typing import Optional + +class PDFUtils: + @staticmethod + def extract_text_from_pdf(pdf_file: Path) -> str: + """ + Extract text content from a PDF file + """ + if not pdf_file.exists(): + raise FileNotFoundError(f"PDF file not found: {pdf_file}") + + text = "" + with open(pdf_file, 'rb') as file: + pdf_reader = PyPDF2.PdfReader(file) + for page in pdf_reader.pages: + text += page.extract_text() + "\n" + + return text + + @staticmethod + def get_pdf_metadata(pdf_file: Path) -> dict: + """ + Get metadata from a PDF file + """ + if not pdf_file.exists(): + raise FileNotFoundError(f"PDF file not found: {pdf_file}") + + with open(pdf_file, 'rb') as file: + pdf_reader = PyPDF2.PdfReader(file) + metadata = pdf_reader.metadata or {} + + # Convert metadata to a dictionary + result = {} + for key, value in metadata.items(): + if value: + result[key] = str(value) + + # Add additional information + result['num_pages'] = len(pdf_reader.pages) + + return result \ No newline at end of file diff --git a/modules/redis_config.py b/modules/redis_config.py new file mode 100644 index 0000000..a1c7d5d --- /dev/null +++ b/modules/redis_config.py @@ -0,0 +1,38 @@ +from dotenv import load_dotenv, find_dotenv +load_dotenv(find_dotenv()) +import os +import modules.logger_tool as logger +log_name = 'api_modules_redis_config' +log_dir = os.getenv("LOG_PATH", "/logs") # Default path as fallback +logging = logger.get_logger( + name=log_name, + log_level=os.getenv("LOG_LEVEL", "DEBUG"), + log_path=log_dir, + log_file=log_name, + runtime=True, + log_format='default' +) +from redis import Redis + +REDIS_URL = os.getenv("LOCAL_REDIS_URL", "redis://localhost:6379") +CACHE_TTL = 3600 # Cache time-to-live in seconds (1 hour) + +redis_client = Redis.from_url(REDIS_URL, decode_responses=True) + +def get_cached_results(cache_key): + try: + cached_data = redis_client.get(cache_key) + if cached_data: + logging.info(f"Cached data: {cached_data}") + return eval(cached_data) + return None + except Exception as e: + print(f"Redis cache error: {e}") + return None + +def set_cached_results(cache_key, results): + try: + redis_client.setex(cache_key, CACHE_TTL, str(results)) + logging.info(f"Cached results: {results}") + except Exception as e: + print(f"Redis cache error: {e}") \ No newline at end of file diff --git a/modules/services/__init__.py b/modules/services/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/modules/services/textgen/__init__.py b/modules/services/textgen/__init__.py new file mode 100644 index 0000000..3810b91 --- /dev/null +++ b/modules/services/textgen/__init__.py @@ -0,0 +1,23 @@ +""" +TextGen service module for interacting with the Text Generation WebUI API. +""" + +from .client import TextGenClient +from .models import ( + ChatMessage, + ChatCompletionRequest, + ChatCompletionResponse, + CompletionRequest, + CompletionResponse, + ModelInfo, +) + +__all__ = [ + "TextGenClient", + "ChatMessage", + "ChatCompletionRequest", + "ChatCompletionResponse", + "CompletionRequest", + "CompletionResponse", + "ModelInfo", +] diff --git a/modules/services/textgen/client.py b/modules/services/textgen/client.py new file mode 100644 index 0000000..524b955 --- /dev/null +++ b/modules/services/textgen/client.py @@ -0,0 +1,366 @@ +""" +Client for interacting with the Text Generation WebUI API. +""" + +import json +import time +import uuid +import logging +import asyncio +import aiohttp +from typing import Dict, List, Optional, Union, Any, AsyncGenerator, cast +from urllib.parse import urljoin + +from .models import ( + ChatMessage, + ChatCompletionRequest, + ChatCompletionResponse, + CompletionRequest, + CompletionResponse, + ModelInfo, + ModelListResponse, + ModelLoadRequest, + LogitsRequest, +) + +logger = logging.getLogger(__name__) + + +class TextGenClient: + """Client for interacting with the Text Generation WebUI API.""" + + def __init__( + self, + base_url: str = "http://textgen.localhost/v1", + api_key: Optional[str] = None, + timeout: int = 120, + ): + """ + Initialize the TextGen client. + + Args: + base_url: Base URL for the TextGen API + api_key: API key for authentication (optional) + timeout: Request timeout in seconds + """ + self.base_url = base_url + self.api_key = api_key + self.timeout = timeout + self._session = None + + async def _ensure_session(self) -> aiohttp.ClientSession: + """Ensure that an aiohttp session exists.""" + if self._session is None or self._session.closed: + self._session = aiohttp.ClientSession( + timeout=aiohttp.ClientTimeout(total=self.timeout) + ) + return self._session + + async def close(self): + """Close the client session.""" + if self._session and not self._session.closed: + await self._session.close() + self._session = None + + def _get_headers(self) -> Dict[str, str]: + """Get headers for API requests.""" + headers = { + "Content-Type": "application/json", + } + if self.api_key: + headers["Authorization"] = f"Bearer {self.api_key}" + return headers + + async def _make_request( + self, method: str, endpoint: str, data: Optional[Dict[str, Any]] = None + ) -> Dict[str, Any]: + """ + Make a request to the TextGen API. + + Args: + method: HTTP method (GET, POST, etc.) + endpoint: API endpoint + data: Request data + + Returns: + API response as a dictionary + """ + session = await self._ensure_session() + url = urljoin(self.base_url, endpoint) + + try: + async with session.request( + method=method, + url=url, + headers=self._get_headers(), + json=data, + raise_for_status=True, + ) as response: + return await response.json() + except aiohttp.ClientResponseError as e: + logger.error(f"API request failed: {e.status} {e.message}") + raise + except aiohttp.ClientError as e: + logger.error(f"Request error: {str(e)}") + raise + except asyncio.TimeoutError: + logger.error(f"Request timed out after {self.timeout} seconds") + raise + + async def _stream_request( + self, endpoint: str, data: Dict[str, Any] + ) -> AsyncGenerator[Dict[str, Any], None]: + """ + Make a streaming request to the TextGen API. + + Args: + endpoint: API endpoint + data: Request data + + Yields: + Chunks of the API response + """ + session = await self._ensure_session() + url = urljoin(self.base_url, endpoint) + + try: + async with session.post( + url=url, + headers=self._get_headers(), + json=data, + raise_for_status=True, + ) as response: + async for line in response.content: + line = line.strip() + if not line or line == b"data: [DONE]": + continue + if line.startswith(b"data: "): + line = line[6:] # Remove "data: " prefix + try: + yield json.loads(line) + except json.JSONDecodeError: + logger.error(f"Failed to parse SSE data: {line}") + except aiohttp.ClientResponseError as e: + logger.error(f"API request failed: {e.status} {e.message}") + raise + except aiohttp.ClientError as e: + logger.error(f"Request error: {str(e)}") + raise + except asyncio.TimeoutError: + logger.error(f"Request timed out after {self.timeout} seconds") + raise + + async def list_models(self) -> List[ModelInfo]: + """ + List available models. + + Returns: + List of available models + """ + response = await self._make_request("GET", "internal/model/list") + model_list = ModelListResponse(**response) + return model_list.data + + async def load_model(self, model_name: str, **kwargs) -> Dict[str, Any]: + """ + Load a model. + + Args: + model_name: Name of the model to load + **kwargs: Additional arguments for loading the model + + Returns: + Response from the API + """ + request = ModelLoadRequest(model_name=model_name, args=kwargs) + return await self._make_request("POST", "internal/model/load", request.dict()) + + async def chat_completion( + self, request: ChatCompletionRequest + ) -> Union[ChatCompletionResponse, AsyncGenerator[Dict[str, Any], None]]: + """ + Create a chat completion. + + Args: + request: Chat completion request + + Returns: + Chat completion response or a stream of responses + """ + request_data = request.dict(exclude_none=True) + + if request.stream: + return self._stream_request("chat/completions", request_data) + + response = await self._make_request("POST", "chat/completions", request_data) + return ChatCompletionResponse(**response) + + async def completion( + self, request: CompletionRequest + ) -> Union[CompletionResponse, AsyncGenerator[Dict[str, Any], None]]: + """ + Create a text completion. + + Args: + request: Completion request + + Returns: + Completion response or a stream of responses + """ + request_data = request.dict(exclude_none=True) + + if request.stream: + return self._stream_request("completions", request_data) + + response = await self._make_request("POST", "completions", request_data) + return CompletionResponse(**response) + + async def get_logits(self, request: LogitsRequest) -> Dict[str, Any]: + """ + Get logits for a prompt. + + Args: + request: Logits request + + Returns: + Logits response + """ + request_data = request.dict(exclude_none=True) + return await self._make_request("POST", "internal/logits", request_data) + + async def simple_chat( + self, + messages: List[Dict[str, str]], + model: Optional[str] = None, + temperature: float = 0.7, + top_p: float = 0.9, + max_tokens: Optional[int] = None, + stop: Optional[Union[str, List[str]]] = None, + presence_penalty: float = 0.0, + frequency_penalty: float = 0.0, + stream: bool = False, + mode: str = "instruct", + character: Optional[str] = None, + instruction_template: Optional[str] = None, + seed: Optional[int] = None, + ) -> Union[str, AsyncGenerator[str, None]]: + """ + Simple interface for chat completions. + + Args: + messages: List of message dictionaries with 'role' and 'content' + model: Model to use + temperature: Sampling temperature + top_p: Nucleus sampling parameter + max_tokens: Maximum tokens to generate + stop: Stop sequences + presence_penalty: Presence penalty + frequency_penalty: Frequency penalty + stream: Whether to stream the response + mode: Mode (chat or instruct) + character: Character to use (for chat mode) + instruction_template: Instruction template (for instruct mode) + seed: Random seed for reproducibility + + Returns: + Generated text or a stream of text chunks + """ + chat_messages = [ChatMessage(**msg) for msg in messages] + request = ChatCompletionRequest( + messages=chat_messages, + model=model, + temperature=temperature, + top_p=top_p, + max_tokens=max_tokens, + stop=stop, + presence_penalty=presence_penalty, + frequency_penalty=frequency_penalty, + stream=stream, + mode=mode, + character=character, + instruction_template=instruction_template, + seed=seed, + ) + + if stream: + + async def text_stream() -> AsyncGenerator[str, None]: + stream_response = await self.chat_completion(request) + if isinstance(stream_response, AsyncGenerator): + async for chunk in stream_response: + if "choices" in chunk and chunk["choices"]: + if ( + "delta" in chunk["choices"][0] + and "content" in chunk["choices"][0]["delta"] + ): + yield chunk["choices"][0]["delta"]["content"] + + return text_stream() + else: + response = await self.chat_completion(request) + if isinstance(response, ChatCompletionResponse): + return response.choices[0].message.content + # This should never happen due to the if/else structure, but satisfies the type checker + raise TypeError("Expected ChatCompletionResponse but got stream response") + + async def simple_completion( + self, + prompt: str, + model: Optional[str] = None, + temperature: float = 0.7, + top_p: float = 0.9, + max_tokens: Optional[int] = None, + stop: Optional[Union[str, List[str]]] = None, + presence_penalty: float = 0.0, + frequency_penalty: float = 0.0, + stream: bool = False, + seed: Optional[int] = None, + ) -> Union[str, AsyncGenerator[str, None]]: + """ + Simple interface for text completions. + + Args: + prompt: Text prompt + model: Model to use + temperature: Sampling temperature + top_p: Nucleus sampling parameter + max_tokens: Maximum tokens to generate + stop: Stop sequences + presence_penalty: Presence penalty + frequency_penalty: Frequency penalty + stream: Whether to stream the response + seed: Random seed for reproducibility + + Returns: + Generated text or a stream of text chunks + """ + request = CompletionRequest( + prompt=prompt, + model=model, + temperature=temperature, + top_p=top_p, + max_tokens=max_tokens, + stop=stop, + presence_penalty=presence_penalty, + frequency_penalty=frequency_penalty, + stream=stream, + seed=seed, + ) + + if stream: + + async def text_stream() -> AsyncGenerator[str, None]: + stream_response = await self.completion(request) + if isinstance(stream_response, AsyncGenerator): + async for chunk in stream_response: + if "choices" in chunk and chunk["choices"]: + if "text" in chunk["choices"][0]: + yield chunk["choices"][0]["text"] + + return text_stream() + else: + response = await self.completion(request) + if isinstance(response, CompletionResponse): + return response.choices[0].text + # This should never happen due to the if/else structure, but satisfies the type checker + raise TypeError("Expected CompletionResponse but got stream response") diff --git a/modules/services/textgen/example.py b/modules/services/textgen/example.py new file mode 100644 index 0000000..fade2b4 --- /dev/null +++ b/modules/services/textgen/example.py @@ -0,0 +1,119 @@ +""" +Example usage of the TextGen client. +""" + +import asyncio +import logging +from typing import AsyncGenerator + +from .client import TextGenClient + +# Configure logging +logging.basicConfig( + level=logging.INFO, + format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", +) +logger = logging.getLogger(__name__) + + +async def chat_example(): + """Example of using the chat completion API.""" + client = TextGenClient() + + try: + # Simple chat example + messages = [{"role": "user", "content": "Hello! Who are you?"}] + + # Non-streaming response + logger.info("Sending chat request (non-streaming)...") + response = await client.simple_chat( + messages=messages, temperature=0.7, max_tokens=500, mode="instruct" + ) + logger.info(f"Response: {response}") + + # Streaming response + logger.info("Sending chat request (streaming)...") + stream_response = await client.simple_chat( + messages=messages, + temperature=0.7, + max_tokens=500, + stream=True, + mode="instruct", + ) + + # Check if the response is a stream + if isinstance(stream_response, AsyncGenerator): + logger.info("Streaming response:") + async for chunk in stream_response: + print(chunk, end="", flush=True) + print() + else: + logger.info(f"Expected stream but got: {stream_response}") + + except Exception as e: + logger.error(f"Error: {str(e)}") + finally: + await client.close() + + +async def completion_example(): + """Example of using the text completion API.""" + client = TextGenClient() + + try: + prompt = "This is a cake recipe:\n\n1." + + # Non-streaming response + logger.info("Sending completion request (non-streaming)...") + response = await client.simple_completion( + prompt=prompt, temperature=0.7, max_tokens=200 + ) + logger.info(f"Response: {response}") + + # Streaming response + logger.info("Sending completion request (streaming)...") + stream_response = await client.simple_completion( + prompt=prompt, temperature=0.7, max_tokens=200, stream=True + ) + + # Check if the response is a stream + if isinstance(stream_response, AsyncGenerator): + logger.info("Streaming response:") + async for chunk in stream_response: + print(chunk, end="", flush=True) + print() + else: + logger.info(f"Expected stream but got: {stream_response}") + + except Exception as e: + logger.error(f"Error: {str(e)}") + finally: + await client.close() + + +async def list_models_example(): + """Example of listing available models.""" + client = TextGenClient() + + try: + logger.info("Listing available models...") + models = await client.list_models() + for model in models: + logger.info(f"Model: {model.id}") + except Exception as e: + logger.error(f"Error: {str(e)}") + finally: + await client.close() + + +async def main(): + """Run all examples.""" + logger.info("Running TextGen client examples") + + await list_models_example() + await chat_example() + await completion_example() + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/modules/services/textgen/models.py b/modules/services/textgen/models.py new file mode 100644 index 0000000..1c07e47 --- /dev/null +++ b/modules/services/textgen/models.py @@ -0,0 +1,140 @@ +""" +Data models for the TextGen API. +""" + +from typing import Dict, List, Optional, Union, Any +from pydantic import BaseModel, Field + + +class ChatMessage(BaseModel): + """A chat message in a conversation.""" + + role: str = Field( + ..., description="The role of the message sender (user, assistant, system)" + ) + content: str = Field(..., description="The content of the message") + name: Optional[str] = Field(None, description="The name of the sender (optional)") + + +class ChatCompletionRequest(BaseModel): + """Request model for chat completions.""" + + messages: List[ChatMessage] = Field( + ..., description="The messages in the conversation" + ) + model: Optional[str] = Field(None, description="The model to use for completion") + temperature: Optional[float] = Field(0.7, description="Sampling temperature") + top_p: Optional[float] = Field(0.9, description="Nucleus sampling parameter") + max_tokens: Optional[int] = Field( + None, description="Maximum number of tokens to generate" + ) + stream: Optional[bool] = Field(False, description="Whether to stream the response") + stop: Optional[Union[str, List[str]]] = Field(None, description="Stop sequences") + presence_penalty: Optional[float] = Field(0.0, description="Presence penalty") + frequency_penalty: Optional[float] = Field(0.0, description="Frequency penalty") + mode: Optional[str] = Field("chat", description="Mode (chat or instruct)") + character: Optional[str] = Field( + None, description="Character to use (for chat mode)" + ) + instruction_template: Optional[str] = Field( + None, description="Instruction template (for instruct mode)" + ) + seed: Optional[int] = Field(None, description="Random seed for reproducibility") + + +class ChatCompletionResponseChoice(BaseModel): + """A choice in a chat completion response.""" + + index: int = Field(..., description="Index of the choice") + message: ChatMessage = Field(..., description="The message") + finish_reason: Optional[str] = Field(None, description="Reason for finishing") + + +class ChatCompletionResponse(BaseModel): + """Response model for chat completions.""" + + id: str = Field(..., description="Unique identifier for the completion") + object: str = Field("chat.completion", description="Object type") + created: int = Field(..., description="Unix timestamp of creation") + model: str = Field(..., description="Model used for completion") + choices: List[ChatCompletionResponseChoice] = Field( + ..., description="Completion choices" + ) + usage: Dict[str, int] = Field(..., description="Token usage information") + + +class CompletionRequest(BaseModel): + """Request model for text completions.""" + + prompt: str = Field(..., description="The prompt to complete") + model: Optional[str] = Field(None, description="The model to use for completion") + temperature: Optional[float] = Field(0.7, description="Sampling temperature") + top_p: Optional[float] = Field(0.9, description="Nucleus sampling parameter") + max_tokens: Optional[int] = Field( + None, description="Maximum number of tokens to generate" + ) + stream: Optional[bool] = Field(False, description="Whether to stream the response") + stop: Optional[Union[str, List[str]]] = Field(None, description="Stop sequences") + presence_penalty: Optional[float] = Field(0.0, description="Presence penalty") + frequency_penalty: Optional[float] = Field(0.0, description="Frequency penalty") + seed: Optional[int] = Field(None, description="Random seed for reproducibility") + + +class CompletionResponseChoice(BaseModel): + """A choice in a completion response.""" + + text: str = Field(..., description="The generated text") + index: int = Field(..., description="Index of the choice") + logprobs: Optional[Any] = Field(None, description="Log probabilities") + finish_reason: Optional[str] = Field(None, description="Reason for finishing") + + +class CompletionResponse(BaseModel): + """Response model for text completions.""" + + id: str = Field(..., description="Unique identifier for the completion") + object: str = Field("text_completion", description="Object type") + created: int = Field(..., description="Unix timestamp of creation") + model: str = Field(..., description="Model used for completion") + choices: List[CompletionResponseChoice] = Field( + ..., description="Completion choices" + ) + usage: Dict[str, int] = Field(..., description="Token usage information") + + +class ModelInfo(BaseModel): + """Information about a model.""" + + id: str = Field(..., description="Model identifier") + object: str = Field("model", description="Object type") + created: int = Field(..., description="Unix timestamp of creation") + owned_by: str = Field("user", description="Owner of the model") + permission: List[Dict[str, Any]] = Field([], description="Permissions") + root: str = Field(..., description="Root model") + parent: Optional[str] = Field(None, description="Parent model") + + +class LogitsRequest(BaseModel): + """Request model for logits.""" + + prompt: str = Field(..., description="The prompt to get logits for") + use_samplers: bool = Field( + False, description="Whether to apply sampling parameters" + ) + top_k: Optional[int] = Field(None, description="Top-k sampling parameter") + top_p: Optional[float] = Field(None, description="Top-p sampling parameter") + temperature: Optional[float] = Field(None, description="Sampling temperature") + + +class ModelListResponse(BaseModel): + """Response model for model list.""" + + object: str = Field("list", description="Object type") + data: List[ModelInfo] = Field(..., description="List of models") + + +class ModelLoadRequest(BaseModel): + """Request model for loading a model.""" + + model_name: str = Field(..., description="Name of the model to load") + args: Dict[str, Any] = Field({}, description="Arguments for loading the model") diff --git a/modules/test_analyzer.py b/modules/test_analyzer.py new file mode 100644 index 0000000..64c1dc5 --- /dev/null +++ b/modules/test_analyzer.py @@ -0,0 +1,130 @@ +from pathlib import Path +import PyPDF2 +from typing import Dict, List, Optional +from pydantic import BaseModel +from modules.pdf_utils import PDFUtils + +class TestAnalysis(BaseModel): + overall_score: float + section_scores: Dict[str, float] + feedback: str + recommendations: List[str] + detailed_analysis: Optional[Dict] = None + +class TestAnalyzer: + def __init__(self, api_key: str): + self.api_key = api_key + + def extract_text_from_pdf(self, pdf_file: Path) -> str: + """ + Extract text content from a PDF file + """ + if not pdf_file.exists(): + raise FileNotFoundError(f"PDF file not found: {pdf_file}") + + text = "" + with open(pdf_file, 'rb') as file: + pdf_reader = PyPDF2.PdfReader(file) + for page in pdf_reader.pages: + text += page.extract_text() + "\n" + + return text + + def analyze_test(self, pdf_content: str, marks_data: Dict, mode: str = 'detailed') -> TestAnalysis: + """ + Analyze a test and generate feedback based on marks data + """ + # Calculate overall score + total_marks = sum(marks_data.values()) + max_marks = len(marks_data) * 100 # Assuming each question is out of 100 + overall_score = (total_marks / max_marks) * 100 + + # Calculate section scores (group by first part of question number) + section_scores = {} + for question, marks in marks_data.items(): + section = question.split('.')[0] + if section not in section_scores: + section_scores[section] = [] + section_scores[section].append(marks) + + # Calculate average for each section + for section, marks in section_scores.items(): + section_scores[section] = sum(marks) / len(marks) + + # Generate feedback + feedback = self._generate_feedback(overall_score, section_scores) + + # Generate recommendations + recommendations = self._generate_recommendations(section_scores) + + # Create detailed analysis if requested + detailed_analysis = None + if mode == 'detailed': + detailed_analysis = { + 'question_analysis': self._analyze_questions(pdf_content, marks_data), + 'strengths': self._identify_strengths(section_scores), + 'weaknesses': self._identify_weaknesses(section_scores) + } + + return TestAnalysis( + overall_score=overall_score, + section_scores=section_scores, + feedback=feedback, + recommendations=recommendations, + detailed_analysis=detailed_analysis + ) + + def _generate_feedback(self, overall_score: float, section_scores: Dict[str, float]) -> str: + """ + Generate feedback based on overall score and section scores + """ + if overall_score >= 90: + return "Excellent performance! You have demonstrated a strong understanding of the material." + elif overall_score >= 80: + return "Very good performance. You have a solid grasp of most concepts." + elif overall_score >= 70: + return "Good performance. You understand the main concepts but could improve in some areas." + elif overall_score >= 60: + return "Satisfactory performance. You have a basic understanding but need to work on several areas." + else: + return "Needs improvement. Focus on understanding the fundamental concepts better." + + def _generate_recommendations(self, section_scores: Dict[str, float]) -> List[str]: + """ + Generate recommendations based on section scores + """ + recommendations = [] + for section, score in section_scores.items(): + if score < 70: + recommendations.append(f"Focus on improving your understanding of Section {section}") + elif score < 80: + recommendations.append(f"Review Section {section} to strengthen your knowledge") + + if not recommendations: + recommendations.append("Continue practicing to maintain your strong performance") + + return recommendations + + def _analyze_questions(self, pdf_content: str, marks_data: Dict) -> Dict: + """ + Analyze individual questions + """ + question_analysis = {} + for question, marks in marks_data.items(): + question_analysis[question] = { + 'score': marks, + 'performance': 'excellent' if marks >= 90 else 'good' if marks >= 70 else 'needs_improvement' + } + return question_analysis + + def _identify_strengths(self, section_scores: Dict[str, float]) -> List[str]: + """ + Identify strong sections + """ + return [f"Section {section}" for section, score in section_scores.items() if score >= 80] + + def _identify_weaknesses(self, section_scores: Dict[str, float]) -> List[str]: + """ + Identify weak sections + """ + return [f"Section {section}" for section, score in section_scores.items() if score < 70] \ No newline at end of file diff --git a/pyrightconfig.json b/pyrightconfig.json new file mode 100644 index 0000000..f2f9393 --- /dev/null +++ b/pyrightconfig.json @@ -0,0 +1,9 @@ +{ + "venv": "classroomcopilot-backend", + "venvPath": "/opt/anaconda3/envs", + "pythonVersion": "3.11", + "typeCheckingMode": "basic", + "extraPaths": [ + "/opt/anaconda3/envs/classroomcopilot-backend/lib/python3.11/site-packages" + ] +} \ No newline at end of file diff --git a/requirements.conda.yml b/requirements.conda.yml new file mode 100644 index 0000000..d60f290 --- /dev/null +++ b/requirements.conda.yml @@ -0,0 +1,74 @@ +name: classroomcopilot-backend +channels: + - conda-forge + - nodefaults +dependencies: + - python=3.11 + # Core dependencies + - pip + - setuptools + - wheel + # Server dependencies + - fastapi + - uvicorn + - python-dotenv + - python-multipart + - python-jose + - pyjwt + - jinja2 + # Database and Auth + - sqlalchemy + - sqlalchemy-utils + - asyncpg + - redis-py + # Neo4j + - neo4j-python-driver + # HTTP and Async + - aiohttp + # Data Processing + - pandas + - scipy + - requests + - openpyxl + - scikit-learn + # Testing + - pytest + - pytest-html + # Database clients + - postgresql + - libpq + # LibreOffice for document conversion + - libreoffice + # Additional dependencies via pip + - pip: + # Supabase + - supabase + # Neo4j specific + - neontology + # HTTP and Async + - sseclient-py + # Document Processing + - python-pptx + - python-docx + - pdfminer.six + - Pillow + - psutil + - PyPDF2>=3.0.0 + # Web Scraping and Processing + - emoji + - extruct + - w3lib + # Google APIs + - youtube-transcript-api + - google-api-python-client + - google-auth-oauthlib + # LangChain Ecosystem + - "langchain[llms]" + - langchain-community + - langchain-openai + - langgraph + # OpenAI + - openai + - ollama + # Microsoft Authentication + - msal diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..39e023c --- /dev/null +++ b/requirements.txt @@ -0,0 +1,79 @@ +# This file is kept for compatibility with pip-only environments +# For the primary dependency management, please use requirements.conda.yml +# This file may not be updated as frequently as requirements.conda.yml + +# FastAPI and Server +fastapi +uvicorn +python-dotenv +python-multipart +python-jose +pyjwt +jinja2 + +# Database and Auth +supabase +sqlalchemy +sqlalchemy-utils +asyncpg + +# Neo4j and Databases +neo4j +neontology + +# Redis +redis + +# Data Processing and Analysis +pandas +scipy +requests +openpyxl + +# HTTP and Async +aiohttp +sseclient-py + +# OpenAI and related tools +openai +ollama + +# Providers +msal + +# Testing +pytest +pytest-html + +# Miscellaneous +emoji +extruct +w3lib +scikit-learn + +# Google APIs +youtube-transcript-api +google-api-python-client +google-auth-oauthlib + +# LangChain Ecosystem +#langchain[all] +langchain[llms] +langchain-community +#langchain-cli +#langchain-core +langchain-openai +#langchain-text-splitters +#langchainhub +#langchainplus-sdk +langgraph +#langgraph-checkpoint +#langgraph-checkpoint-postgres + +# Document Processing +python-pptx +python-docx +pdfminer.six +Pillow +psutil +PyPDF2 \ No newline at end of file diff --git a/routers/__init__.py b/routers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/routers/__pycache__/__init__.cpython-311.pyc b/routers/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..64b5c5500b5761daa320d5a98390a727c6af464c GIT binary patch literal 133 zcmZ3^%ge<81b?;MGeGoX5CH>>P{wCAAY(d13PUi1CZpd4BO~Jn1{hJq3={(Z Dh{77( literal 0 HcmV?d00001 diff --git a/routers/__pycache__/admin_routes.cpython-311.pyc b/routers/__pycache__/admin_routes.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3cf302f79d964e2bfd072aa9fd5c78a353295b9c GIT binary patch literal 28800 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 literal 0 HcmV?d00001 diff --git a/routers/__pycache__/auth.cpython-311.pyc b/routers/__pycache__/auth.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..313a94e3215244653ae8fd6569b976880e3cbc71 GIT binary patch literal 6938 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 literal 0 HcmV?d00001 diff --git a/routers/__pycache__/health.cpython-311.pyc b/routers/__pycache__/health.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..64b43ae97ba71deaff8bbb72f823f12551877fb6 GIT binary patch literal 1305 zcmZuw&1(}u6rb5_c9S>BX`lWDo`8p_QIhQ1OeRma3P%4C~IMSoR1y6v{0ky@Smq>n(OXLOA_%^n-PlHbJM(7Vyf^R7`@Oes8jTtP`gQVhXJ8=o zB@@O}DK^{hVe(*oLG%pZG%lcHvfuRW%Zk=)%cc~ zwG34~w{mqg>Lpw#OD1m8lP#>O=UvIKMT~d7!ku2m&)Yr<;tRx)gBfy++mNHM=w0*(rY_zx!cf2jgIv&Lmq79G`l}iNx>yv2BoT@K zB$8vM%eFvnOU}rhKJlV3as7}B5(!X21vKzP_GQ8YsojAW#-ZB+up@q(Bpps97Y}?7 zL|I_bCvM1y;4bTDVFmZN|9}(l*KYgXf_BuxdAasN0y+BoV5jQ&%cy>uXu?tU`^p($ zU*Q{|A5Bz0`1H)PGeh%`zIVMn^e=nf+R9G9@2D!ss61&tY^G)-t<7vS)B3S=ZZVyn{WN_v-G5}%Kt_EF c*@p2wW25OZo_o1GLa^+xt$h>v9fgMNH|B*?1^@s6 literal 0 HcmV?d00001 diff --git a/routers/admin/admin_panel.py b/routers/admin/admin_panel.py new file mode 100644 index 0000000..8b20e09 --- /dev/null +++ b/routers/admin/admin_panel.py @@ -0,0 +1,2769 @@ +import os +from modules.logger_tool import initialise_logger + +from supabase import create_client, Client +from modules.auth.supabase_bearer import SupabaseBearer +from fastapi import ( + APIRouter, + Depends, + HTTPException, + Request, + Form, + Response, + File, + UploadFile, +) +from fastapi.responses import HTMLResponse, RedirectResponse, JSONResponse +from fastapi.staticfiles import StaticFiles +from fastapi.templating import Jinja2Templates +from pydantic import BaseModel +from typing import Optional +import json +import csv +import io + +from modules.database.tools import neontology_tools as neon +import modules.database.schemas.entities as entities +from modules.database.admin.school_manager import SchoolManager +from modules.database.admin.graph_provider import GraphProvider + +# Initialize graph provider +graph_provider = GraphProvider() + +logger = initialise_logger( + __name__, os.getenv("LOG_LEVEL"), os.getenv("LOG_PATH"), "default", True +) + +# Initialize Supabase client with service role key for admin operations +supabase_url = os.getenv("SUPABASE_URL") +service_role_key = os.getenv("SERVICE_ROLE_KEY") +anon_key = os.getenv("ANON_KEY") + +logger.info(f"Initializing admin Supabase client with URL: {supabase_url}") +logger.debug(f"Service role key present: {bool(service_role_key)}") + +# Create admin client +admin_supabase: Client = create_client( + supabase_url=supabase_url, supabase_key=service_role_key +) + +# Set headers for admin operations +admin_supabase.headers = { + "apiKey": service_role_key, + "Authorization": f"Bearer {service_role_key}", + "Content-Type": "application/json", + "X-Client-Info": "supabase-py/0.0.1", +} + +# Set storage client headers explicitly +admin_supabase.storage._client.headers.update( + { + "apiKey": service_role_key, + "Authorization": f"Bearer {service_role_key}", + "Content-Type": "application/json", + } +) + +# Regular client for non-admin operations +logger.info(f"Initializing regular Supabase client with URL: {supabase_url}") +supabase: Client = create_client(supabase_url=supabase_url, supabase_key=anon_key) + +# Set headers for regular operations +supabase.headers = {"apiKey": anon_key, "Authorization": f"Bearer {anon_key}"} + +# Use the existing SupabaseBearer for authentication +supabase_auth = SupabaseBearer() + + +# Admin authentication dependency +async def verify_admin(request: Request): + """Verify admin status and return admin data""" + try: + # Get access token from cookie + access_token = request.cookies.get("access_token") + if not access_token: + raise HTTPException(status_code=401, detail="No access token") + + logger.debug("Verifying admin access token") + + # Create a fresh service role client for this request + service_client = create_client(supabase_url, service_role_key) + service_client.headers = { + "apiKey": service_role_key, + "Authorization": f"Bearer {service_role_key}", + "Content-Type": "application/json", + } + + try: + # Get user from token using service role client + user_response = service_client.auth.get_user(access_token) + user_id = user_response.user.id + + logger.debug(f"Verifying admin for user_id: {user_id}") + + # Use service role client to check admin profile + admin_result = ( + service_client.table("admin_profiles") + .select("*") + .eq("id", user_id) + .single() + .execute() + ) + + if not admin_result.data: + logger.error(f"No admin profile found for user {user_id}") + raise HTTPException(status_code=403, detail="Not an admin user") + + # Log admin data for debugging + logger.debug(f"Admin data: {admin_result.data}") + + # Create a new client with the user's access token for subsequent operations + user_client = create_client(supabase_url, service_role_key) + user_client.headers = { + "apiKey": service_role_key, + "Authorization": f"Bearer {access_token}", + "Content-Type": "application/json", + } + + # Update storage client headers explicitly + user_client.storage._client.headers.update( + { + "apiKey": service_role_key, + "Authorization": f"Bearer {access_token}", + "Content-Type": "application/json", + } + ) + + # Store the client in the request state for use in other endpoints + request.state.supabase = user_client + + return admin_result.data + + except Exception as e: + logger.error(f"Error verifying admin token: {str(e)}") + if hasattr(e, "response"): + logger.error( + f"Response details: {e.response.text if hasattr(e.response, 'text') else e.response}" + ) + raise HTTPException( + status_code=401, detail="Invalid authentication credentials" + ) + + except HTTPException: + raise + except Exception as e: + logger.error(f"Admin verification failed: {str(e)}") + raise HTTPException( + status_code=401, detail="Invalid authentication credentials" + ) + + +# Models for request/response +class UserProfileBase(BaseModel): + email: str + display_name: Optional[str] = None + user_role: Optional[str] = "user" + is_active: Optional[bool] = True + metadata: Optional[dict] = {} + + +class AdminProfileBase(BaseModel): + email: str + display_name: Optional[str] = None + admin_role: Optional[str] = "admin" + is_super_admin: Optional[bool] = False + metadata: Optional[dict] = {} + + +# Setup templates +templates = Jinja2Templates(directory="templates") + +# Admin router +router = APIRouter(prefix="/api/admin", tags=["Admin Panel"]) + +# Serve static files +router.mount("/static", StaticFiles(directory="static"), name="static") + + +# Admin dashboard +@router.get("/", response_class=HTMLResponse) +async def admin_dashboard(request: Request): + access_token = request.cookies.get("access_token") + if not access_token: + return RedirectResponse(url="/api/admin/login", status_code=302) + + try: + # Verify token and get user claims using admin client + user_response = admin_supabase.auth.get_user(access_token) + user_id = user_response.user.id + + # Get admin profile using admin client + admin = ( + admin_supabase.table("admin_profiles") + .select("*") + .eq("id", user_id) + .single() + .execute() + ) + if not admin.data: + logger.error(f"No admin profile found for user {user_id}") + response = RedirectResponse(url="/api/admin/login", status_code=302) + response.delete_cookie("access_token") + return response + + # Process admin data + admin_data = admin.data + # Ensure updated_at is a string + if admin_data.get("updated_at") and not isinstance( + admin_data["updated_at"], str + ): + admin_data["updated_at"] = admin_data["updated_at"].isoformat() + + logger.debug(f"Admin dashboard data: {admin_data}") + + return templates.TemplateResponse( + "/dashboard/index.html", {"request": request, "admin": admin_data, "os": os} + ) + except Exception as e: + logger.error(f"Dashboard error: {str(e)}") + response = RedirectResponse(url="/api/admin/login", status_code=302) + response.delete_cookie("access_token") + return response + + +@router.get("/login", response_class=HTMLResponse) +async def login_page(request: Request, error: str = None, success: str = None): + """Render the login page""" + # Check if super admin initialization is needed + init_super_admin = os.getenv("INIT_SUPER_ADMIN", "false").lower() == "true" + + if init_super_admin: + # Check if any admin exists + try: + logger.info(f"Checking admin count using Supabase at URL: {supabase_url}") + admin_count = len( + admin_supabase.table("admin_profiles").select("id").execute().data + ) + logger.debug(f"Found {admin_count} admins in database") + if admin_count > 0: + init_super_admin = False + except Exception as e: + logger.error( + f"Error checking admin count using Supabase at {supabase_url}: {str(e)}" + ) + # Continue with the page load even if check fails + + return templates.TemplateResponse( + "admin/login.html", + { + "request": request, + "error": error, + "success": success, + "init_super_admin": init_super_admin, + "expected_super_admin_email": os.getenv("VITE_SUPER_ADMIN_EMAIL"), + }, + ) + + +@router.post("/login") +async def login( + request: Request, + response: Response, + email: str = Form(...), + password: str = Form(...), +): + """Handle login form submission""" + try: + logger.info( + f"Attempting login for email: {email} using Supabase at URL: {supabase_url}" + ) + + # Attempt to sign in with Supabase using service role client + try: + auth_response = admin_supabase.auth.sign_in_with_password( + {"email": email, "password": password} + ) + logger.debug("Successfully authenticated with Supabase auth") + except Exception as auth_error: + logger.error( + f"Authentication failed with Supabase at {supabase_url}: {str(auth_error)}" + ) + raise HTTPException(status_code=401, detail="Authentication failed") + + # Get the user's session + session = auth_response.session + user_id = session.user.id + + logger.debug(f"Successfully authenticated user: {user_id}") + + # Update admin_supabase client headers with the new session token + admin_supabase.headers.update( + { + "Authorization": f"Bearer {session.access_token}", + "apiKey": anon_key, # Use anon key for authenticated requests + } + ) + + # Update storage client headers explicitly + admin_supabase.storage._client.headers.update( + {"Authorization": f"Bearer {session.access_token}", "apiKey": anon_key} + ) + + logger.debug("Updated Supabase client headers with new session token") + + # Verify the user is an admin using service role client + try: + logger.info( + f"Checking admin profile for user {user_id} using Supabase at {supabase_url}" + ) + admin_result = ( + admin_supabase.table("admin_profiles") + .select("*") + .eq("id", user_id) + .single() + .execute() + ) + logger.debug(f"Admin profile query result: {admin_result}") + except Exception as profile_error: + logger.error( + f"Error checking admin profile at {supabase_url}: {str(profile_error)}" + ) + raise HTTPException(status_code=500, detail="Failed to verify admin status") + + if not admin_result.data: + logger.error(f"User {user_id} attempted to log in but is not an admin") + raise HTTPException(status_code=403, detail="Not an admin user") + + admin_data = admin_result.data + logger.debug(f"Admin profile found: {admin_data}") + + # Set the session cookie and redirect + response = RedirectResponse(url="/api/admin/", status_code=302) + response.set_cookie( + key="access_token", + value=session.access_token, + httponly=True, + secure=True, + samesite="lax", + max_age=3600, # 1 hour + ) + + # Update last login time + try: + logger.info( + f"Updating last login time for admin {user_id} at {supabase_url}" + ) + admin_supabase.table("admin_profiles").update({"updated_at": "now()"}).eq( + "id", user_id + ).execute() + except Exception as update_error: + logger.warning( + f"Failed to update last login time at {supabase_url}: {str(update_error)}" + ) + + return response + + except HTTPException: + raise + except Exception as e: + logger.error(f"Login error with Supabase at {supabase_url}: {str(e)}") + return templates.TemplateResponse( + "admin/login.html", + {"request": request, "error": "Invalid email or password"}, + status_code=401, + ) + + +@router.post("/logout") +async def logout(response: Response): + """Handle logout""" + response = RedirectResponse(url="/api/admin/login", status_code=303) + response.delete_cookie(key="access_token") + return response + + +# User management endpoints +@router.get("/users") +async def list_users(request: Request, admin: dict = Depends(verify_admin)): + """List all users with pagination""" + try: + # All admins can view users, no need for super admin check + users = admin_supabase.table("user_profiles").select("*").execute() + return templates.TemplateResponse( + "admin/users.html", + {"request": request, "users": users.data, "admin": admin}, + ) + except Exception as e: + logger.error(f"Error listing users: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.get("/users/{user_id}") +async def get_user(request: Request, user_id: str, admin: dict = Depends(verify_admin)): + """Get user details""" + try: + user = ( + admin_supabase.table("user_profiles") + .select("*") + .eq("id", user_id) + .single() + .execute() + ) + return templates.TemplateResponse( + "admin/user_detail.html", + {"request": request, "user": user.data, "admin": admin}, + ) + except Exception as e: + logger.error(f"Error getting user {user_id}: {str(e)}") + raise HTTPException(status_code=404, detail="User not found") + + +@router.post("/users/{user_id}") +async def update_user( + user_id: str, user: UserProfileBase, admin: dict = Depends(verify_admin) +): + """Update user details""" + try: + # All admins can update basic user details + # But only super admins can modify user roles + if not admin.get("is_super_admin") and user.user_role != "user": + raise HTTPException( + status_code=403, detail="Only super admins can modify user roles" + ) + + updated_user = ( + admin_supabase.table("user_profiles") + .update(user.dict(exclude_unset=True)) + .eq("id", user_id) + .execute() + ) + return {"status": "success", "data": updated_user.data} + except Exception as e: + logger.error(f"Error updating user {user_id}: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +# Admin management endpoints (only accessible by super admins) +@router.get("/admins") +async def list_admins(request: Request, admin: dict = Depends(verify_admin)): + """List all admins""" + try: + logger.debug(f"Checking admin permissions for admin list. Admin data: {admin}") + + # Check if the admin is a super admin + if not admin.get("is_super_admin"): + logger.error( + f"Non-super admin attempted to access admin list. Admin data: {admin}" + ) + raise HTTPException( + status_code=403, detail="Only super admins can view admin list" + ) + + admins = admin_supabase.table("admin_profiles").select("*").execute() + return templates.TemplateResponse( + "admin/admins.html", + {"request": request, "admins": admins.data, "admin": admin}, + ) + except Exception as e: + logger.error(f"Error listing admins: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.post("/admins") +async def create_admin( + admin_data: AdminProfileBase, current_admin: dict = Depends(verify_admin) +): + """Create a new admin""" + try: + # Special case for first super admin (only if no admins exist) + admin_count = len( + admin_supabase.table("admin_profiles").select("id").execute().data + ) + is_first_admin = admin_count == 0 + + # Only allow super admin creation by existing super admins (except for first admin) + if ( + admin_data.is_super_admin + and not is_first_admin + and not current_admin.get("is_super_admin") + ): + raise HTTPException( + status_code=403, detail="Only super admins can create super admins" + ) + + # For security, ensure email matches the expected super admin email for first admin + if is_first_admin: + expected_super_admin_email = os.getenv("VITE_SUPER_ADMIN_EMAIL") + if ( + not expected_super_admin_email + or admin_data.email != expected_super_admin_email + ): + raise HTTPException(status_code=403, detail="Invalid super admin email") + admin_data.is_super_admin = True # Force first admin to be super admin + elif not current_admin.get("is_super_admin"): + raise HTTPException( + status_code=403, detail="Only super admins can create new admins" + ) + + # Create auth user with admin metadata + user_data = { + "email": admin_data.email, + "password": os.urandom(16).hex(), # Generate random password + "email_confirm": True, + "user_metadata": { + "is_admin": True, + "is_super_admin": admin_data.is_super_admin, + }, + } + + # Use supabase auth admin API with service role key for admin creation + service_role_client = create_client(supabase_url, os.getenv("SERVICE_ROLE_KEY")) + auth_user = service_role_client.auth.admin.create_user(user_data) + + # Create admin profile + admin_profile = admin_data.dict() + admin_profile["id"] = auth_user.user.id + + new_admin = ( + admin_supabase.table("admin_profiles").insert(admin_profile).execute() + ) + + # Send password reset email to new admin + service_role_client.auth.admin.generate_link( + {"type": "recovery", "email": admin_data.email} + ) + + return {"status": "success", "data": new_admin.data} + except Exception as e: + logger.error(f"Error creating admin: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.post("/setup-super-admin/{user_id}") +async def setup_super_admin(user_id: str): + """Set up the initial super admin user""" + try: + # Get the expected super admin email from environment + expected_email = os.getenv("VITE_SUPER_ADMIN_EMAIL") + + # Get user details + user_response = admin_supabase.auth.admin.get_user_by_id(user_id) + user = user_response.user + + if not user or user.email != expected_email: + raise HTTPException( + status_code=403, detail="Unauthorized to become super admin" + ) + + # Update user metadata using auth admin API + updated_user = admin_supabase.auth.admin.update_user_by_id( + user_id, + user_attributes={ + "user_metadata": {"is_admin": True, "is_super_admin": True}, + "app_metadata": {"roles": ["admin", "super_admin"]}, + }, + ) + + # Create or update admin profile + admin_profile = { + "id": user_id, + "email": user.email, + "display_name": "Super Admin", + "admin_role": "admin", + "is_super_admin": True, + "metadata": {}, + } + + profile_result = ( + admin_supabase.table("admin_profiles").upsert(admin_profile).execute() + ) + + return { + "status": "success", + "message": "Super admin setup completed", + "data": profile_result.data, + } + + except Exception as e: + logger.error(f"Error setting up super admin: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.post("/initialize-super-admin") +async def initialize_super_admin(admin_data: dict): + """Initialize the first super admin user with form data""" + try: + # Get the expected super admin email from environment + expected_email = os.getenv("VITE_SUPER_ADMIN_EMAIL") + is_dev_mode = os.getenv("DEV_MODE", "false").lower() == "true" + + logger.debug(f"Initializing super admin with data: {admin_data}") + logger.info(f"Using Supabase URL: {supabase_url}") + + if not expected_email: + raise HTTPException( + status_code=400, detail="Super admin email not configured" + ) + + # Check if any admin exists + try: + logger.info(f"Checking existing admins at {supabase_url}") + admin_count = len( + admin_supabase.table("admin_profiles").select("id").execute().data + ) + logger.debug(f"Found {admin_count} existing admins") + if admin_count > 0: + raise HTTPException( + status_code=400, detail="Super admin already exists" + ) + except Exception as count_error: + logger.error( + f"Error checking admin count at {supabase_url}: {str(count_error)}" + ) + raise HTTPException( + status_code=500, + detail=f"Failed to check existing admins: {str(count_error)}", + ) + + # Create the user with admin metadata + try: + logger.info(f"Creating auth user at {supabase_url}") + auth_user = admin_supabase.auth.admin.create_user( + { + "email": admin_data["email"], + "password": admin_data["password"], + "email_confirm": True, + "user_metadata": { + "is_admin": True, + "is_super_admin": True, + "display_name": admin_data["display_name"], + }, + "app_metadata": {"roles": ["admin", "super_admin"]}, + } + ) + user_id = auth_user.user.id + logger.debug(f"Created auth user with ID: {user_id}") + except Exception as auth_error: + logger.error( + f"Error creating auth user at {supabase_url}: {str(auth_error)}" + ) + raise HTTPException( + status_code=500, detail=f"Failed to create auth user: {str(auth_error)}" + ) + + # Create admin profile + try: + logger.info(f"Creating admin profile at {supabase_url}") + profile_result = ( + admin_supabase.table("admin_profiles") + .insert( + { + "id": user_id, + "email": admin_data["email"], + "display_name": admin_data["display_name"], + "admin_role": "admin", + "is_super_admin": True, + "metadata": {}, + } + ) + .execute() + ) + logger.debug(f"Admin profile creation result: {profile_result.data}") + except Exception as profile_error: + logger.error( + f"Error creating admin profile at {supabase_url}: {str(profile_error)}" + ) + raise HTTPException( + status_code=500, + detail=f"Failed to create admin profile: {str(profile_error)}", + ) + + return { + "status": "success", + "message": "Super admin initialized successfully. Please log in.", + "data": { + "email": admin_data["email"], + "display_name": admin_data["display_name"], + }, + } + + except HTTPException: + raise + except Exception as e: + logger.error(f"Error initializing super admin at {supabase_url}: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +# School management endpoints (only accessible by super admins) +@router.get("/schools/manage", response_class=HTMLResponse) +async def manage_schools(request: Request, admin: dict = Depends(verify_admin)): + """School management interface""" + try: + # Verify super admin status + if not admin.get("is_super_admin"): + raise HTTPException( + status_code=403, detail="Only super admins can manage schools" + ) + + # Get list of schools + schools = ( + admin_supabase.table("schools") + .select("*") + .order("establishment_name") + .execute() + ) + + return templates.TemplateResponse( + "admin/schools_manage.html", + {"request": request, "admin": admin, "schools": schools.data}, + ) + except Exception as e: + logger.error(f"Error in school management: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.post("/schools/import") +async def import_schools( + file: UploadFile = File(...), admin: dict = Depends(verify_admin) +): + """Import schools from CSV file""" + try: + # Verify super admin status + if not admin.get("is_super_admin"): + raise HTTPException( + status_code=403, detail="Only super admins can import schools" + ) + + # Create a fresh service role client for database operations + service_client = create_client(supabase_url, service_role_key) + service_client.headers = { + "apiKey": service_role_key, + "Authorization": f"Bearer {service_role_key}", + "Content-Type": "application/json", + } + + # Read and validate CSV file + content = await file.read() + csv_text = content.decode("utf-8-sig") # Handle BOM if present + csv_reader = csv.DictReader(io.StringIO(csv_text)) + + # Prepare data for batch insert + schools_data = [] + for row in csv_reader: + school_data = { + "urn": row.get("URN"), + "la_code": row.get("LA (code)"), + "la_name": row.get("LA (name)"), + "establishment_number": row.get("EstablishmentNumber"), + "establishment_name": row.get("EstablishmentName"), + "establishment_type": row.get("TypeOfEstablishment (name)"), + "establishment_type_group": row.get("EstablishmentTypeGroup (name)"), + "establishment_status": row.get("EstablishmentStatus (name)"), + "reason_establishment_opened": row.get( + "ReasonEstablishmentOpened (name)" + ), + "open_date": row.get("OpenDate"), + "reason_establishment_closed": row.get( + "ReasonEstablishmentClosed (name)" + ), + "close_date": row.get("CloseDate"), + "phase_of_education": row.get("PhaseOfEducation (name)"), + "statutory_low_age": row.get("StatutoryLowAge"), + "statutory_high_age": row.get("StatutoryHighAge"), + "boarders": row.get("Boarders (name)"), + "nursery_provision": row.get("NurseryProvision (name)"), + "official_sixth_form": row.get("OfficialSixthForm (name)"), + "gender": row.get("Gender (name)"), + "religious_character": row.get("ReligiousCharacter (name)"), + "religious_ethos": row.get("ReligiousEthos (name)"), + "diocese": row.get("Diocese (name)"), + "admissions_policy": row.get("AdmissionsPolicy (name)"), + "school_capacity": row.get("SchoolCapacity"), + "special_classes": row.get("SpecialClasses (name)"), + "census_date": row.get("CensusDate"), + "number_of_pupils": row.get("NumberOfPupils"), + "number_of_boys": row.get("NumberOfBoys"), + "number_of_girls": row.get("NumberOfGirls"), + "percentage_fsm": row.get("PercentageFSM"), + "trust_school_flag": row.get("TrustSchoolFlag (name)"), + "trusts_name": row.get("Trusts (name)"), + "school_sponsor_flag": row.get("SchoolSponsorFlag (name)"), + "school_sponsors_name": row.get("SchoolSponsors (name)"), + "federation_flag": row.get("FederationFlag (name)"), + "federations_name": row.get("Federations (name)"), + "ukprn": row.get("UKPRN"), + "fehe_identifier": row.get("FEHEIdentifier"), + "further_education_type": row.get("FurtherEducationType (name)"), + "ofsted_last_inspection": row.get("OfstedLastInsp"), + "last_changed_date": row.get("LastChangedDate"), + "street": row.get("Street"), + "locality": row.get("Locality"), + "address3": row.get("Address3"), + "town": row.get("Town"), + "county": row.get("County (name)"), + "postcode": row.get("Postcode"), + "school_website": row.get("SchoolWebsite"), + "telephone_num": row.get("TelephoneNum"), + "head_title": row.get("HeadTitle (name)"), + "head_first_name": row.get("HeadFirstName"), + "head_last_name": row.get("HeadLastName"), + "head_preferred_job_title": row.get("HeadPreferredJobTitle"), + "gssla_code": row.get("GSSLACode (name)"), + "parliamentary_constituency": row.get( + "ParliamentaryConstituency (name)" + ), + "urban_rural": row.get("UrbanRural (name)"), + "rsc_region": row.get("RSCRegion (name)"), + "country": row.get("Country (name)"), + "uprn": row.get("UPRN"), + "sen_stat": row.get("SENStat") == "true", + "sen_no_stat": row.get("SENNoStat") == "true", + "sen_unit_on_roll": row.get("SenUnitOnRoll"), + "sen_unit_capacity": row.get("SenUnitCapacity"), + "resourced_provision_on_roll": row.get("ResourcedProvisionOnRoll"), + "resourced_provision_capacity": row.get("ResourcedProvisionCapacity"), + } + + # Clean up empty strings and convert types + for key, value in school_data.items(): + if value == "": + school_data[key] = None + elif key in [ + "statutory_low_age", + "statutory_high_age", + "school_capacity", + "number_of_pupils", + "number_of_boys", + "number_of_girls", + "sen_unit_on_roll", + "sen_unit_capacity", + "resourced_provision_on_roll", + "resourced_provision_capacity", + ]: + if value: + try: + float_val = float(value) + int_val = int(float_val) + school_data[key] = int_val + except (ValueError, TypeError): + school_data[key] = None + elif key == "percentage_fsm": + if value: + try: + school_data[key] = float(value) + except (ValueError, TypeError): + school_data[key] = None + elif key in [ + "open_date", + "close_date", + "census_date", + "ofsted_last_inspection", + "last_changed_date", + ]: + if value: + try: + # Convert date from DD-MM-YYYY to YYYY-MM-DD + parts = value.split("-") + if len(parts) == 3: + school_data[key] = f"{parts[2]}-{parts[1]}-{parts[0]}" + else: + school_data[key] = None + except: + school_data[key] = None + + schools_data.append(school_data) + + # Batch insert schools using service role client + if schools_data: + result = ( + service_client.table("schools") + .upsert(schools_data, on_conflict="urn") # Update if URN already exists + .execute() + ) + + logger.info(f"Imported {len(schools_data)} schools") + return {"status": "success", "imported_count": len(schools_data)} + else: + raise HTTPException( + status_code=400, detail="No valid school data found in CSV" + ) + + except Exception as e: + logger.error(f"Error importing schools: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.get("/schools/{school_id}") +async def view_school( + request: Request, school_id: str, admin: dict = Depends(verify_admin) +): + """View school details""" + try: + # Verify super admin status + if not admin.get("is_super_admin"): + raise HTTPException( + status_code=403, detail="Only super admins can view school details" + ) + + # Get school details + school = ( + admin_supabase.table("schools") + .select("*") + .eq("id", school_id) + .single() + .execute() + ) + if not school.data: + raise HTTPException(status_code=404, detail="School not found") + + # Get latest statistics + stats = ( + admin_supabase.table("school_statistics") + .select("*") + .eq("school_id", school_id) + .order("census_date", desc=True) + .limit(1) + .execute() + ) + + return templates.TemplateResponse( + "admin/school_detail.html", + { + "request": request, + "admin": admin, + "school": school.data, + "statistics": stats.data[0] if stats.data else None, + }, + ) + except Exception as e: + logger.error(f"Error viewing school: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.delete("/schools/{school_id}") +async def delete_school(school_id: str, admin: dict = Depends(verify_admin)): + """Delete a school""" + try: + # Verify super admin status + if not admin.get("is_super_admin"): + raise HTTPException( + status_code=403, detail="Only super admins can delete schools" + ) + + # Delete school statistics first (due to foreign key constraint) + await admin_supabase.table("school_statistics").delete().eq( + "school_id", school_id + ).execute() + + # Delete school + result = ( + await admin_supabase.table("schools").delete().eq("id", school_id).execute() + ) + + return {"status": "success"} + except Exception as e: + logger.error(f"Error deleting school: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.post("/initialize-schools-database") +async def initialize_schools_database(admin: dict = Depends(verify_admin)): + """Initialize the cc.institutes database (super admin only)""" + try: + if not admin.get("is_super_admin"): + raise HTTPException( + status_code=403, + detail="Only super admins can initialize the schools database", + ) + + school_manager = SchoolManager() + result = school_manager.create_schools_database() + + if result["status"] == "error": + raise HTTPException(status_code=500, detail=result["message"]) + + return result + except Exception as e: + logger.error(f"Error initializing schools database: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.post("/schools/{school_id}/initialize-node") +async def initialize_school_node(school_id: str, admin: dict = Depends(verify_admin)): + """Initialize a school node in the cc.institutes database""" + try: + if not admin.get("is_super_admin"): + raise HTTPException( + status_code=403, detail="Only super admins can initialize school nodes" + ) + + # Create a fresh service role client for database operations + service_client = create_client(supabase_url, service_role_key) + service_client.headers = { + "apiKey": service_role_key, + "Authorization": f"Bearer {service_role_key}", + "Content-Type": "application/json", + } + + # Get school data from Supabase using service role client + school = ( + service_client.table("schools") + .select("*") + .eq("id", school_id) + .single() + .execute() + ) + if not school.data: + raise HTTPException(status_code=404, detail="School not found") + + # Create school manager and verify database exists + school_manager = SchoolManager() + + # Verify cc.institutes database exists + try: + with school_manager.driver.session() as session: + result = session.run("SHOW DATABASES") + databases = [record["name"] for record in result] + if "cc.institutes" not in databases: + logger.error("cc.institutes database does not exist") + raise HTTPException( + status_code=500, + detail="Schools database not initialized. Please initialize database first.", + ) + except Exception as db_error: + logger.error(f"Error checking database existence: {str(db_error)}") + raise HTTPException( + status_code=500, + detail=f"Failed to verify database existence: {str(db_error)}", + ) + + # Create school node using SchoolManager + try: + result = school_manager.create_school_node(school.data) + + if result["status"] == "error": + raise Exception(result["message"]) + + return { + "status": "success", + "message": "School node created successfully", + "node_id": f"School_{school.data['urn']}", + } + + except Exception as node_error: + logger.error(f"Error creating school node: {str(node_error)}") + raise HTTPException( + status_code=500, + detail=f"Failed to create school node: {str(node_error)}", + ) + + except HTTPException: + raise + except Exception as e: + logger.error(f"Error initializing school node: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.get("/schools/{school_id}/graph-status") +async def check_school_graph_status( + school_id: str, admin: dict = Depends(verify_admin) +): + """Check if a school node exists in the graph database""" + try: + if not admin.get("is_super_admin"): + raise HTTPException( + status_code=403, + detail="Only super admins can check school graph status", + ) + + # Get school data from Supabase + school = ( + admin_supabase.table("schools") + .select("*") + .eq("id", school_id) + .single() + .execute() + ) + if not school.data: + raise HTTPException(status_code=404, detail="School not found") + + # Check if node exists in Neo4j and get its properties + school_manager = SchoolManager() + with school_manager.driver.session(database="cc.institutes") as session: + result = session.run( + """ + MATCH (s:School {unique_id: $unique_id}) + RETURN s + """, + {"unique_id": f"School_{school.data['urn']}"}, + ) + record = result.single() + exists = record is not None + + # If node exists, get its properties + node_data = None + if exists: + node = record["s"] + node_data = dict(node.items()) # Convert node properties to dict + + return {"exists": exists, "node_data": node_data} + except Exception as e: + logger.error(f"Error checking school graph status: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.get("/check-schools-database") +async def check_schools_database(admin: dict = Depends(verify_admin)): + """Check if the cc.institutes database exists (super admin only)""" + try: + if not admin.get("is_super_admin"): + raise HTTPException( + status_code=403, detail="Only super admins can check database status" + ) + + school_manager = SchoolManager() + with school_manager.driver.session() as session: + # Try to list databases + result = session.run("SHOW DATABASES") + databases = [record["name"] for record in result] + exists = "cc.institutes" in databases + + return {"exists": exists} + except Exception as e: + logger.error(f"Error checking schools database: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.get("/check-storage") +async def check_storage(admin: dict = Depends(verify_admin)): + """Check status of storage buckets""" + try: + if not admin.get("is_super_admin"): + raise HTTPException( + status_code=403, detail="Only super admins can check storage status" + ) + + try: + logger.info( + f"Checking storage buckets using Supabase at URL: {supabase_url}" + ) + + # Create a fresh service role client for storage operations + service_client = create_client(supabase_url, service_role_key) + service_client.headers = { + "apiKey": service_role_key, + "Authorization": f"Bearer {service_role_key}", + "Content-Type": "application/json", + } + service_client.storage._client.headers.update( + { + "apiKey": service_role_key, + "Authorization": f"Bearer {service_role_key}", + "Content-Type": "application/json", + } + ) + + # Define the buckets we want to check + required_buckets = [ + {"name": "User Files", "id": "cc.users", "exists": False}, + {"name": "School Files", "id": "cc.institutes", "exists": False}, + ] + + # List buckets and check existence + all_buckets = service_client.storage.list_buckets() + existing_bucket_ids = [bucket.id for bucket in all_buckets] + logger.debug(f"Found buckets via list_buckets: {existing_bucket_ids}") + + # Update bucket existence status + for bucket in required_buckets: + bucket["exists"] = bucket["id"] in existing_bucket_ids + logger.debug(f"Bucket {bucket['id']} exists: {bucket['exists']}") + + logger.debug(f"Storage check result: required_buckets={required_buckets}") + + return {"buckets": required_buckets, "schema_ready": True} + + except Exception as e: + logger.error(f"Error checking storage: {str(e)}") + if hasattr(e, "response"): + logger.error( + f"Response details: {e.response.text if hasattr(e.response, 'text') else e.response}" + ) + raise HTTPException( + status_code=500, detail=f"Error checking storage: {str(e)}" + ) + + except HTTPException: + raise + except Exception as e: + logger.error(f"Error in check_storage: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.post("/initialize-storage") +async def initialize_storage(admin: dict = Depends(verify_admin)): + """Initialize storage buckets and policies for schools""" + try: + # Verify super admin status + if not admin.get("is_super_admin"): + raise HTTPException( + status_code=403, detail="Only super admins can initialize storage" + ) + + # Create a fresh service role client for storage operations + service_client = create_client(supabase_url, service_role_key) + service_client.headers = { + "apiKey": service_role_key, + "Authorization": f"Bearer {service_role_key}", + "Content-Type": "application/json", + "X-Client-Info": "supabase-py/0.0.1", + } + service_client.storage._client.headers.update( + { + "apiKey": service_role_key, + "Authorization": f"Bearer {service_role_key}", + "Content-Type": "application/json", + } + ) + + # First, ensure the bucket RLS policy exists + bucket_policy = """ + -- First, enable RLS on the buckets table if not already enabled + alter table storage.buckets enable row level security; + + -- Drop existing policies to ensure clean slate + drop policy if exists "Service role has full access to buckets" on storage.buckets; + drop policy if exists "Authenticated users can create buckets" on storage.buckets; + drop policy if exists "Bucket creation requires service role" on storage.buckets; + + -- Create service role policy for full access + create policy "Service role has full access to buckets" + on storage.buckets + as permissive + for all + to authenticated + using (auth.role() = 'service_role') + with check (auth.role() = 'service_role'); + """ + + try: + # Execute bucket policy using service role client + service_client.postgrest.rpc("exec_sql", {"query": bucket_policy}).execute() + logger.info("Successfully created bucket RLS policy") + except Exception as e: + logger.warning( + f"Bucket policy creation warning (may already exist): {str(e)}" + ) + + # Define buckets to create + buckets_to_create = [ + { + "id": "cc.users", + "name": "User Files", + "public": False, + "file_size_limit": 52428800, + "allowed_mime_types": [ + "image/*", + "video/*", + "application/pdf", + "application/msword", + "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + "application/vnd.ms-excel", + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "application/vnd.ms-powerpoint", + "application/vnd.openxmlformats-officedocument.presentationml.presentation", + "text/plain", + "text/csv", + "application/json", + ], + }, + { + "id": "cc.institutes", + "name": "School Files", + "public": False, + "file_size_limit": 52428800, + "allowed_mime_types": [ + "image/*", + "video/*", + "application/pdf", + "application/msword", + "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + "application/vnd.ms-excel", + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "application/vnd.ms-powerpoint", + "application/vnd.openxmlformats-officedocument.presentationml.presentation", + "text/plain", + "text/csv", + "application/json", + ], + }, + ] + + # Get list of existing buckets using service role client + try: + all_buckets = service_client.storage.list_buckets() + existing_bucket_ids = [bucket.id for bucket in all_buckets] + logger.debug(f"Found existing buckets: {existing_bucket_ids}") + except Exception as e: + logger.error(f"Error listing buckets: {str(e)}") + existing_bucket_ids = [] + + created_buckets = [] + for bucket in buckets_to_create: + try: + if bucket["id"] in existing_bucket_ids: + logger.info(f"Bucket {bucket['id']} already exists") + created_buckets.append(bucket["id"]) + else: + # Create bucket if it doesn't exist using service role client + logger.debug( + f"Creating bucket {bucket['id']} with options: {bucket}" + ) + try: + response = service_client.storage.create_bucket( + bucket["id"], + options={ + "public": bucket["public"], + "file_size_limit": bucket["file_size_limit"], + "allowed_mime_types": bucket["allowed_mime_types"], + }, + ) + logger.info(f"Created bucket {bucket['id']}") + logger.debug(f"Bucket creation response: {response}") + created_buckets.append(bucket["id"]) + except Exception as bucket_error: + logger.error( + f"Detailed bucket creation error for {bucket['id']}: {str(bucket_error)}" + ) + if hasattr(bucket_error, "response"): + logger.error( + f"Error response: {bucket_error.response.text if hasattr(bucket_error.response, 'text') else bucket_error.response}" + ) + raise bucket_error + except Exception as e: + logger.warning(f"Error with bucket {bucket['id']}: {str(e)}") + + # Create object-level RLS policies + object_policies = [ + """ + -- Enable RLS on objects table if not already enabled + alter table storage.objects enable row level security; + + -- Drop existing policies + drop policy if exists "Users can read own files" on storage.objects; + drop policy if exists "Users can upload own files" on storage.objects; + drop policy if exists "Users can update own files" on storage.objects; + drop policy if exists "Users can delete own files" on storage.objects; + drop policy if exists "Anyone can read school files" on storage.objects; + drop policy if exists "Only admins can manage school files" on storage.objects; + drop policy if exists "Service role has full access to objects" on storage.objects; + drop policy if exists "Admins can create signed URLs" on storage.objects; + + -- Create user files policies + create policy "Users can read own files" + on storage.objects for select + using ( + bucket_id = 'cc.users' + and ( + path_tokens[1] = auth.uid()::text + or exists ( + select 1 from auth.users + where auth.uid() = auth.users.id + and raw_user_meta_data->>'is_admin' = 'true' + ) + ) + ); + + create policy "Users can upload own files" + on storage.objects for insert + with check ( + bucket_id = 'cc.users' + and path_tokens[1] = auth.uid()::text + ); + + create policy "Users can update own files" + on storage.objects for update + using ( + bucket_id = 'cc.users' + and path_tokens[1] = auth.uid()::text + ); + + create policy "Users can delete own files" + on storage.objects for delete + using ( + bucket_id = 'cc.users' + and path_tokens[1] = auth.uid()::text + ); + + -- Create school files policies + create policy "Anyone can read school files" + on storage.objects for select + using (bucket_id = 'cc.institutes'); + + create policy "Only admins can manage school files" + on storage.objects for all + using ( + bucket_id = 'cc.institutes' + and ( + auth.role() = 'service_role' + or exists ( + select 1 from auth.users + where auth.uid() = auth.users.id + and raw_user_meta_data->>'is_admin' = 'true' + ) + ) + ) + with check ( + bucket_id = 'cc.institutes' + and ( + auth.role() = 'service_role' + or exists ( + select 1 from auth.users + where auth.uid() = auth.users.id + and raw_user_meta_data->>'is_admin' = 'true' + ) + ) + ); + + -- Create service role policy + create policy "Service role has full access to objects" + on storage.objects for all + using (auth.role() = 'service_role') + with check (auth.role() = 'service_role'); + + -- Create signed URL policy + create policy "Admins can create signed URLs" + on storage.objects for select + using ( + exists ( + select 1 from auth.users + where auth.uid() = auth.users.id + and raw_user_meta_data->>'is_admin' = 'true' + ) + ); + """ + ] + + # Apply object-level policies using service role client + for policy in object_policies: + try: + service_client.postgrest.rpc("exec_sql", {"query": policy}).execute() + logger.info("Successfully created object RLS policies") + except Exception as e: + logger.warning( + f"Object policy creation warning (may already exist): {str(e)}" + ) + + return { + "status": "success", + "message": "Storage buckets and policies initialized", + "created_buckets": created_buckets, + } + except Exception as e: + logger.error(f"Error initializing storage: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.get("/storage", response_class=HTMLResponse) +async def storage_management(request: Request, admin: dict = Depends(verify_admin)): + """Storage management interface""" + try: + if not admin.get("is_super_admin"): + raise HTTPException( + status_code=403, + detail="Only super admins can access storage management", + ) + + # Create a fresh service role client for storage operations + service_client = create_client(supabase_url, service_role_key) + service_client.headers = { + "apiKey": service_role_key, + "Authorization": f"Bearer {service_role_key}", + "Content-Type": "application/json", + } + service_client.storage._client.headers.update( + { + "apiKey": service_role_key, + "Authorization": f"Bearer {service_role_key}", + "Content-Type": "application/json", + } + ) + + # Get bucket information using storage API + try: + logger.info(f"Listing buckets from Supabase storage at URL {supabase_url}") + buckets = service_client.storage.list_buckets() + # Convert bucket objects to dictionaries for template + buckets_data = [ + { + "id": bucket.id, + "name": bucket.name, + "public": bucket.public, + "created_at": bucket.created_at, + "updated_at": bucket.updated_at, + "file_size_limit": bucket.file_size_limit, + "allowed_mime_types": bucket.allowed_mime_types, + } + for bucket in buckets + if bucket.id in ["cc.users", "cc.institutes"] + ] + + logger.debug(f"Found buckets: {buckets_data}") + + except Exception as e: + logger.error(f"Error getting bucket information: {str(e)}") + if hasattr(e, "response"): + logger.error( + f"Response details: {e.response.text if hasattr(e.response, 'text') else e.response}" + ) + buckets_data = [] + + return templates.TemplateResponse( + "admin/storage_management.html", + {"request": request, "admin": admin, "buckets": buckets_data}, + ) + except Exception as e: + logger.error(f"Error in storage management: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.get("/storage/{bucket_id}/contents") +async def list_bucket_contents( + request: Request, + bucket_id: str, + path: str = "", + admin: dict = Depends(verify_admin), +): + """List contents of a storage bucket""" + try: + if not admin.get("is_super_admin"): + raise HTTPException( + status_code=403, detail="Only super admins can list bucket contents" + ) + + # Create a fresh service role client for storage operations + service_client = create_client(supabase_url, service_role_key) + service_client.headers = { + "apiKey": service_role_key, + "Authorization": f"Bearer {service_role_key}", + "Content-Type": "application/json", + } + service_client.storage._client.headers.update( + { + "apiKey": service_role_key, + "Authorization": f"Bearer {service_role_key}", + "Content-Type": "application/json", + } + ) + + # Verify bucket exists using storage API + try: + logger.info( + f"Getting bucket {bucket_id} from Supabase storage at URL {supabase_url}" + ) + bucket = service_client.storage.get_bucket(bucket_id) + bucket_data = { + "id": bucket.id, + "name": bucket.name, + "public": bucket.public, + "created_at": bucket.created_at, + "updated_at": bucket.updated_at, + "file_size_limit": bucket.file_size_limit, + "allowed_mime_types": bucket.allowed_mime_types, + } + logger.debug(f"Found bucket: {bucket_data}") + except Exception as e: + logger.error(f"Error getting bucket {bucket_id}: {str(e)}") + if hasattr(e, "response"): + logger.error( + f"Response details: {e.response.text if hasattr(e.response, 'text') else e.response}" + ) + raise HTTPException(status_code=404, detail="Bucket not found") + + # List objects in the bucket + try: + logger.info(f"Listing files in bucket {bucket_id} at path '{path}'") + # Use storage API to list files with service role client + files = service_client.storage.from_(bucket_id).list(path) + logger.debug(f"Files in bucket {bucket_id}: {files}") + + # Organize objects into folders and files + contents = {"folders": set(), "files": []} + + for file in files: + file_path = file["name"] + if path: + # Remove the prefix path if we're in a subfolder + if file_path.startswith(path): + file_path = file_path[len(path) :].lstrip("/") + + # Split path into parts + parts = file_path.split("/") + + if len(parts) > 1: + # This is in a subfolder + contents["folders"].add(parts[0]) + else: + # This is a file in the current directory + # Add full path back if we're in a subfolder + if path: + file["name"] = f"{path}/{file_path}" + contents["files"].append(file) + + contents["folders"] = sorted(list(contents["folders"])) + contents["files"] = sorted(contents["files"], key=lambda x: x["name"]) + + logger.debug(f"Processed contents: {contents}") + + except Exception as e: + logger.error(f"Error listing bucket contents: {str(e)}") + if hasattr(e, "response"): + logger.error( + f"Response details: {e.response.text if hasattr(e.response, 'text') else e.response}" + ) + contents = {"folders": [], "files": []} + + if request.headers.get("X-Requested-With") == "XMLHttpRequest": + return contents + else: + return templates.TemplateResponse( + "admin/storage_contents.html", + { + "request": request, + "admin": admin, + "bucket": bucket_data, + "contents": contents, + "current_path": path, + }, + ) + + except Exception as e: + logger.error(f"Error listing bucket contents: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.delete("/storage/{bucket_id}/objects/{object_path:path}") +async def delete_object( + bucket_id: str, object_path: str, admin: dict = Depends(verify_admin) +): + """Delete an object from a storage bucket""" + try: + if not admin.get("is_super_admin"): + raise HTTPException( + status_code=403, detail="Only super admins can delete objects" + ) + + # Delete the object using storage API + try: + admin_supabase.storage.from_(bucket_id).remove([object_path]) + return {"status": "success", "message": "Object deleted"} + except Exception as e: + logger.error( + f"Error deleting object {object_path} from bucket {bucket_id}: {str(e)}" + ) + raise HTTPException( + status_code=500, detail=f"Failed to delete object: {str(e)}" + ) + + except Exception as e: + logger.error(f"Error in delete object handler: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.get("/storage/manage", response_class=HTMLResponse) +async def manage_school_storage(request: Request, admin: dict = Depends(verify_admin)): + """School files storage management interface""" + try: + if not admin.get("is_super_admin"): + raise HTTPException( + status_code=403, detail="Only super admins can manage storage" + ) + + # Create a fresh service role client for storage operations + service_client = create_client(supabase_url, service_role_key) + service_client.headers = { + "apiKey": service_role_key, + "Authorization": f"Bearer {service_role_key}", + "Content-Type": "application/json", + } + service_client.storage._client.headers.update( + { + "apiKey": service_role_key, + "Authorization": f"Bearer {service_role_key}", + "Content-Type": "application/json", + } + ) + + # Get list of files from the schools bucket + try: + logger.info( + f"Listing files from Supabase storage at URL {supabase_url}, bucket: cc.institutes" + ) + + # First, list all root level items + files = service_client.storage.from_("cc.institutes").list() + logger.debug(f"Root level files from Supabase: {files}") + + # Process files to ensure we have complete path information + processed_files = [] + for file in files: + # Convert file object to dict if it's not already + if not isinstance(file, dict): + file = { + "name": file.name, + "id": getattr(file, "id", None), + "updated_at": getattr(file, "updated_at", None), + "created_at": getattr(file, "created_at", None), + "last_accessed_at": getattr(file, "last_accessed_at", None), + "metadata": getattr(file, "metadata", {}), + } + + # Get the school URN from the file path + school_urn = ( + file["name"].split("/")[0] if "/" in file["name"] else file["name"] + ) + + # If this is a school URN directory, check for tldraw.json + if not file["name"].endswith("tldraw.json"): + try: + # List contents of this folder + subfiles = service_client.storage.from_("cc.institutes").list( + school_urn + ) + logger.debug(f"Subfiles for {school_urn}: {subfiles}") + + for subfile in subfiles: + if isinstance(subfile, dict): + subfile_name = subfile["name"] + else: + subfile_name = subfile.name + + if subfile_name.endswith("tldraw.json"): + # Get school info for metadata + try: + school = ( + service_client.table("schools") + .select("*") + .eq("urn", school_urn) + .single() + .execute() + ) + metadata = ( + { + "establishment_name": school.data.get( + "establishment_name" + ), + "establishment_type": school.data.get( + "establishment_type" + ), + } + if school.data + else {} + ) + except Exception as school_error: + logger.warning( + f"Could not get school info for {school_urn}: {str(school_error)}" + ) + metadata = {} + + # Add to processed files with full path + full_path = f"{school_urn}/{subfile_name}" + processed_files.append( + { + "name": full_path, + "id": ( + getattr(subfile, "id", None) + if not isinstance(subfile, dict) + else subfile.get("id") + ), + "updated_at": ( + getattr(subfile, "updated_at", None) + if not isinstance(subfile, dict) + else subfile.get("updated_at") + ), + "created_at": ( + getattr(subfile, "created_at", None) + if not isinstance(subfile, dict) + else subfile.get("created_at") + ), + "metadata": metadata, + } + ) + except Exception as e: + logger.warning( + f"Error listing contents of {school_urn}: {str(e)}" + ) + else: + # This is already a tldraw.json file, get its school info + school_urn = file["name"].split("/")[0] + try: + school = ( + service_client.table("schools") + .select("*") + .eq("urn", school_urn) + .single() + .execute() + ) + file["metadata"] = ( + { + "establishment_name": school.data.get( + "establishment_name" + ), + "establishment_type": school.data.get( + "establishment_type" + ), + } + if school.data + else {} + ) + except Exception as school_error: + logger.warning( + f"Could not get school info for {school_urn}: {str(school_error)}" + ) + processed_files.append(file) + + logger.debug(f"Processed files: {processed_files}") + files = processed_files + + except Exception as e: + logger.error(f"Error listing school files: {str(e)}") + if hasattr(e, "response"): + logger.error( + f"Response details: {e.response.text if hasattr(e.response, 'text') else e.response}" + ) + files = [] + + return templates.TemplateResponse( + "admin/storage_manage.html", + {"request": request, "admin": admin, "files": files}, + ) + except Exception as e: + logger.error(f"Error in storage management: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.get("/storage/{bucket_id}/view/{file_path:path}") +async def view_file( + request: Request, + bucket_id: str, + file_path: str, + admin: dict = Depends(verify_admin), +): + """View a file from storage""" + try: + if not admin.get("is_super_admin"): + raise HTTPException( + status_code=403, detail="Only super admins can view files" + ) + + # Clean up file path and ensure it includes the school URN + file_path = file_path.strip("/") + if not "/" in file_path: + raise HTTPException( + status_code=400, detail="Invalid file path. Must include school URN." + ) + + logger.info( + f"Attempting to view file from Supabase storage at URL {supabase_url}, bucket: {bucket_id}, path: {file_path}" + ) + + # Create a fresh service role client for storage operations + service_client = create_client(supabase_url, service_role_key) + service_client.headers = { + "apiKey": service_role_key, + "Authorization": f"Bearer {service_role_key}", + "Content-Type": "application/json", + } + service_client.storage._client.headers.update( + { + "apiKey": service_role_key, + "Authorization": f"Bearer {service_role_key}", + "Content-Type": "application/json", + } + ) + + # Get signed URL for the file + try: + # Create signed URL that expires in 1 hour (3600 seconds) + file_url = service_client.storage.from_(bucket_id).create_signed_url( + path=file_path, expires_in=3600 + ) + + if not file_url or "signedURL" not in file_url: + logger.error( + f"Failed to generate signed URL from Supabase at {supabase_url}" + ) + raise HTTPException( + status_code=404, detail="Failed to generate signed URL" + ) + + # Replace internal Kong URL with public Supabase URL + public_url = file_url["signedURL"].replace( + "http://kong:8000", + os.getenv("VITE_SUPABASE_URL"), + ) + + logger.info( + f"Successfully generated signed URL from Supabase at {supabase_url}" + ) + logger.debug(f"Original URL: {file_url['signedURL']}") + logger.debug(f"Public URL: {public_url}") + + return {"url": public_url} + + except Exception as e: + logger.error( + f"Error getting signed URL from Supabase at {supabase_url} for {file_path} from bucket {bucket_id}: {str(e)}" + ) + raise HTTPException(status_code=404, detail=str(e)) + + except HTTPException: + raise + except Exception as e: + logger.error(f"Error viewing file: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.get("/storage/{bucket_id}/download/{file_path:path}") +async def download_file( + request: Request, + bucket_id: str, + file_path: str, + admin: dict = Depends(verify_admin), +): + """Download a file from storage""" + try: + if not admin.get("is_super_admin"): + raise HTTPException( + status_code=403, detail="Only super admins can download files" + ) + + # Clean up file path and ensure it includes the school URN + file_path = file_path.strip("/") + if not "/" in file_path: + raise HTTPException( + status_code=400, detail="Invalid file path. Must include school URN." + ) + + logger.info( + f"Attempting to download file from Supabase storage at URL {supabase_url}, bucket: {bucket_id}, path: {file_path}" + ) + + # Create a fresh service role client for storage operations + service_client = create_client(supabase_url, service_role_key) + service_client.headers = { + "apiKey": service_role_key, + "Authorization": f"Bearer {service_role_key}", + "Content-Type": "application/json", + } + service_client.storage._client.headers.update( + { + "apiKey": service_role_key, + "Authorization": f"Bearer {service_role_key}", + "Content-Type": "application/json", + } + ) + + # Get signed URL for the file + try: + # Create signed URL that expires in 1 hour (3600 seconds) + file_url = service_client.storage.from_(bucket_id).create_signed_url( + path=file_path, expires_in=3600 + ) + + if not file_url or "signedURL" not in file_url: + logger.error( + f"Failed to generate download URL from Supabase at {supabase_url}" + ) + raise HTTPException( + status_code=404, detail="Failed to generate signed URL" + ) + + # Replace internal Kong URL with public Supabase URL + public_url = file_url["signedURL"].replace( + "http://kong:8000", + os.getenv("VITE_SUPABASE_URL"), + ) + + logger.info( + f"Successfully generated download URL from Supabase at {supabase_url}" + ) + logger.debug(f"Original URL: {file_url['signedURL']}") + logger.debug(f"Public URL: {public_url}") + + return {"url": public_url} + + except Exception as e: + logger.error( + f"Error getting download URL from Supabase at {supabase_url} for {file_path} from bucket {bucket_id}: {str(e)}" + ) + raise HTTPException(status_code=404, detail=str(e)) + + except HTTPException: + raise + except Exception as e: + logger.error(f"Error downloading file: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.post("/storage/{bucket_id}/upload/{school_urn}") +async def upload_file( + bucket_id: str, + school_urn: str, + file: UploadFile = File(...), + admin: dict = Depends(verify_admin), +): + """Upload a file to a storage bucket""" + try: + if not admin.get("is_super_admin"): + raise HTTPException( + status_code=403, detail="Only super admins can upload files" + ) + + # Create a fresh service role client for storage operations + service_client = create_client(supabase_url, service_role_key) + service_client.headers = { + "apiKey": service_role_key, + "Authorization": f"Bearer {service_role_key}", + "Content-Type": "application/json", + } + service_client.storage._client.headers.update( + { + "apiKey": service_role_key, + "Authorization": f"Bearer {service_role_key}", + "Content-Type": "application/json", + } + ) + + # Verify bucket exists + try: + bucket = service_client.storage.get_bucket(bucket_id) + except Exception as e: + logger.error(f"Error getting bucket {bucket_id}: {str(e)}") + raise HTTPException(status_code=404, detail="Bucket not found") + + # Get school data to verify URN and get metadata + try: + school = ( + service_client.table("schools") + .select("*") + .eq("urn", school_urn) + .single() + .execute() + ) + if not school.data: + raise HTTPException(status_code=404, detail="School not found") + except Exception as e: + logger.error(f"Error getting school data: {str(e)}") + raise HTTPException(status_code=404, detail="School not found") + + # Construct file path + file_path = f"{school_urn}/tldraw.json" + + # Read file content + content = await file.read() + + try: + # Upload file with metadata + result = service_client.storage.from_(bucket_id).upload( + path=file_path, + file=content, + file_options={ + "content-type": "application/json", + "x-upsert": "true", # Update if exists + }, + ) + + # Update file metadata + metadata = { + "establishment_name": school.data.get("establishment_name"), + "establishment_type": school.data.get("establishment_type"), + "size": len(content), + "mimetype": "application/json", + } + + # Try to update metadata (this might not be supported by all storage providers) + try: + service_client.storage.from_(bucket_id).update_file_metadata( + path=file_path, metadata=metadata + ) + except Exception as metadata_error: + logger.warning(f"Could not update file metadata: {str(metadata_error)}") + + return { + "status": "success", + "message": "File uploaded successfully", + "path": file_path, + } + + except Exception as upload_error: + logger.error(f"Error uploading file: {str(upload_error)}") + raise HTTPException( + status_code=500, detail=f"Failed to upload file: {str(upload_error)}" + ) + + except HTTPException: + raise + except Exception as e: + logger.error(f"Error in upload handler: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.post("/schools/{school_id}/create-private-database") +async def create_private_database(school_id: str, admin: dict = Depends(verify_admin)): + """Create private database for school""" + try: + if not admin.get("is_super_admin"): + raise HTTPException( + status_code=403, detail="Only super admins can create private databases" + ) + + # Get school data + school = ( + admin_supabase.table("schools") + .select("*") + .eq("id", school_id) + .single() + .execute() + ) + if not school.data: + raise HTTPException(status_code=404, detail="School not found") + + # Create school manager and create private database + school_manager = SchoolManager() + result = school_manager.create_private_database(school.data) + + if result["status"] == "error": + raise HTTPException(status_code=500, detail=result["message"]) + + return result + + except HTTPException: + raise + except Exception as e: + logger.error(f"Error creating private database: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.post("/schools/{school_id}/create-basic-structure") +async def create_basic_structure(school_id: str, admin: dict = Depends(verify_admin)): + """Create basic school structure in both public and private databases""" + try: + if not admin.get("is_super_admin"): + raise HTTPException( + status_code=403, detail="Only super admins can create school structure" + ) + + # Get school data + school = ( + admin_supabase.table("schools") + .select("*") + .eq("id", school_id) + .single() + .execute() + ) + if not school.data: + raise HTTPException(status_code=404, detail="School not found") + + # Create school node + school_node = entities.SchoolNode( + unique_id=f"School_{school.data['urn']}", + path=f"/schools/cc.institutes/{school.data['urn']}", + urn=school.data["urn"], + establishment_number=school.data["establishment_number"], + establishment_name=school.data["establishment_name"], + establishment_type=school.data["establishment_type"], + establishment_status=school.data["establishment_status"], + phase_of_education=( + school.data["phase_of_education"] + if school.data["phase_of_education"] not in [None, ""] + else None + ), + statutory_low_age=( + int(school.data["statutory_low_age"]) + if school.data.get("statutory_low_age") is not None + else 0 + ), + statutory_high_age=( + int(school.data["statutory_high_age"]) + if school.data.get("statutory_high_age") is not None + else 0 + ), + religious_character=( + school.data.get("religious_character") + if school.data.get("religious_character") not in [None, ""] + else None + ), + school_capacity=( + int(school.data["school_capacity"]) + if school.data.get("school_capacity") is not None + else 0 + ), + school_website=school.data.get("school_website", ""), + ofsted_rating=( + school.data.get("ofsted_rating") + if school.data.get("ofsted_rating") not in [None, ""] + else None + ), + ) + + # Create school manager + school_manager = SchoolManager() + + # Ensure school node exists in the private database + with school_manager.neontology as neo: + # Create/merge in private database + private_db_name = f"cc.institutes.{school.data['urn']}" + neo.create_or_merge_node( + school_node, database=private_db_name, operation="merge" + ) + + # Create structure in public database + public_result = school_manager.create_basic_structure( + school_node, "cc.institutes" + ) + if public_result["status"] == "error": + raise HTTPException( + status_code=500, + detail=f"Error creating public structure: {public_result['message']}", + ) + + # Create structure in private database + private_result = school_manager.create_basic_structure( + school_node, private_db_name + ) + if private_result["status"] == "error": + raise HTTPException( + status_code=500, + detail=f"Error creating private structure: {private_result['message']}", + ) + + return { + "status": "success", + "message": "School structure created in both databases", + "public_result": public_result, + "private_result": private_result, + } + + except HTTPException: + raise + except Exception as e: + logger.error(f"Error creating school structure: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.post("/schools/{school_id}/create-detailed-structure") +async def create_detailed_structure( + school_id: str, file: UploadFile = File(...), admin: dict = Depends(verify_admin) +): + """Create detailed school structure from Excel file""" + try: + if not admin.get("is_super_admin"): + raise HTTPException( + status_code=403, + detail="Only super admins can create detailed structure", + ) + + # Get school data + school = ( + admin_supabase.table("schools") + .select("*") + .eq("id", school_id) + .single() + .execute() + ) + if not school.data: + raise HTTPException(status_code=404, detail="School not found") + + # Create school node + school_node = entities.SchoolNode( + unique_id=f"School_{school.data['urn']}", + urn=school.data["urn"], + establishment_number=school.data["establishment_number"], + establishment_name=school.data["establishment_name"], + establishment_type=school.data["establishment_type"], + establishment_status=school.data["establishment_status"], + phase_of_education=school.data["phase_of_education"], + statutory_low_age=( + int(school.data["statutory_low_age"]) + if school.data.get("statutory_low_age") is not None + else 0 + ), + statutory_high_age=( + int(school.data["statutory_high_age"]) + if school.data.get("statutory_high_age") is not None + else 0 + ), + religious_character=( + school.data.get("religious_character") + if school.data.get("religious_character") not in [None, ""] + else None + ), + school_capacity=( + int(school.data["school_capacity"]) + if school.data.get("school_capacity") is not None + else 0 + ), + school_website=school.data.get("school_website", ""), + ofsted_rating=( + school.data.get("ofsted_rating") + if school.data.get("ofsted_rating") not in [None, ""] + else None + ), + path=f"/schools/cc.institutes/{school.data['urn']}", + ) + + # Read file content + content = await file.read() + + # Create school manager + school_manager = SchoolManager() + + # Create detailed structure in public database + public_result = school_manager.create_detailed_structure( + school_node, "cc.institutes", content + ) + if public_result["status"] == "error": + raise HTTPException( + status_code=500, + detail=f"Error creating public detailed structure: {public_result['message']}", + ) + + # Create detailed structure in private database + private_db_name = f"cc.institutes.{school.data['urn']}" + private_result = school_manager.create_detailed_structure( + school_node, private_db_name, content + ) + if private_result["status"] == "error": + raise HTTPException( + status_code=500, + detail=f"Error creating private detailed structure: {private_result['message']}", + ) + + return { + "status": "success", + "message": "Detailed structure created in both databases", + "public_result": public_result, + "private_result": private_result, + } + + except HTTPException: + raise + except Exception as e: + logger.error(f"Error creating detailed structure: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +def check_private_school_database(school_urn): + """Checks if private database exists for school""" + try: + private_db_name = f"cc.institutes.{school_urn}" + with graph_provider.neontology as neo: + result = neo.run_query("SHOW DATABASES", {}) + databases = [record["name"] for record in result] + exists = private_db_name in databases + return {"exists": exists} + except Exception as e: + logger.error(f"Error checking private database: {str(e)}") + raise + + +@router.get("/schools/{school_id}/check-private-school-database") +async def check_private_school_database_endpoint( + school_id: str, admin: dict = Depends(verify_admin) +): + """Check if private database exists for school""" + try: + if not admin.get("is_super_admin"): + raise HTTPException( + status_code=403, detail="Only super admins can check private database" + ) + + # Get school data + school = ( + admin_supabase.table("schools") + .select("*") + .eq("id", school_id) + .single() + .execute() + ) + if not school.data: + raise HTTPException(status_code=404, detail="School not found") + + return check_private_school_database(school.data["urn"]) + except HTTPException: + raise + except Exception as e: + logger.error(f"Error checking private database: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.get("/schools/{school_id}/check-structure-status") +async def check_structure_status(school_id: str, admin: dict = Depends(verify_admin)): + """Check the structure status for a school in both public and private databases""" + try: + if not admin.get("is_super_admin"): + raise HTTPException( + status_code=403, detail="Only super admins can check structure status" + ) + + # Get basic structure status + basic_status = await check_basic_structure(school_id, admin) + + # Get detailed structure status + detailed_status = await check_detailed_structure(school_id, admin) + + # Combine results + return { + "public_database": { + "basic": basic_status["public_database"], + "detailed": detailed_status["public_database"], + }, + "private_database": { + "exists": basic_status["private_database"]["exists"], + "basic": basic_status["private_database"]["status"], + "detailed": detailed_status["private_database"]["status"], + }, + } + + except Exception as e: + logger.error(f"Error checking structure status: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.get("/schema") +async def schema_page(request: Request, admin: dict = Depends(verify_admin)): + """Schema management interface""" + try: + if not admin.get("is_super_admin"): + raise HTTPException( + status_code=403, detail="Only super admins can manage schema" + ) + + return templates.TemplateResponse( + "admin/schema_details.html", {"request": request, "admin": admin} + ) + except Exception as e: + logger.error(f"Error in schema management: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.get("/check-schema") +async def check_schema(admin: dict = Depends(verify_admin)): + """Check schema status""" + try: + if not admin.get("is_super_admin"): + raise HTTPException( + status_code=403, detail="Only super admins can check schema" + ) + + # Get schema status from both databases + public_schema = graph_provider.check_schema_status("cc.institutes") + + # Combine results + combined_schema = { + "constraints": list(set(public_schema["constraints"])), + "constraints_count": len(set(public_schema["constraints"])), + "constraints_valid": public_schema["constraints_valid"], + "indexes": list(set(public_schema["indexes"])), + "indexes_count": len(set(public_schema["indexes"])), + "indexes_valid": public_schema["indexes_valid"], + "labels": list(set(public_schema["labels"])), + "labels_count": len(set(public_schema["labels"])), + "labels_valid": public_schema["labels_valid"], + } + + return JSONResponse(content=combined_schema) + except Exception as e: + logger.error(f"Error checking schema: {str(e)}") + return JSONResponse(content={"error": str(e)}, status_code=500) + + +@router.get("/schema-definition") +async def get_schema_definition(admin: dict = Depends(verify_admin)): + """Get schema definition""" + try: + if not admin.get("is_super_admin"): + raise HTTPException( + status_code=403, detail="Only super admins can view schema definition" + ) + + schema_info = graph_provider.get_schema_info() + return JSONResponse(content=schema_info) + except Exception as e: + logger.error(f"Error getting schema definition: {str(e)}") + return JSONResponse(content={"error": str(e)}, status_code=500) + + +@router.post("/initialize-schema") +async def initialize_schema(admin: dict = Depends(verify_admin)): + """Initialize schema for both databases""" + try: + if not admin.get("is_super_admin"): + raise HTTPException( + status_code=403, detail="Only super admins can initialize schema" + ) + + # Initialize schema for both databases + graph_provider.initialize_schema("cc.institutes") + return JSONResponse(content={"message": "Schema initialized successfully"}) + except Exception as e: + logger.error(f"Error initializing schema: {str(e)}") + return JSONResponse(content={"error": str(e)}, status_code=500) + + +@router.get("/schools/{school_id}/check-basic-structure") +async def check_basic_structure(school_id: str, admin: dict = Depends(verify_admin)): + """Check if basic structure exists for a school""" + try: + if not admin.get("is_super_admin"): + raise HTTPException( + status_code=403, detail="Only super admins can check structure status" + ) + + # Get school data + school = ( + admin_supabase.table("schools") + .select("*") + .eq("id", school_id) + .single() + .execute() + ) + if not school.data: + raise HTTPException(status_code=404, detail="School not found") + + # Create graph provider for Neo4j operations + provider = GraphProvider() + + # Generate the unique ID for the school + school_unique_id = f"School_{school.data['urn']}" + + # Check basic structure in public database + with provider.neontology as neo: + basic_query = """ + MATCH (s:School {unique_id: $school_id}) + + // Get all nodes connected to school for debugging + CALL { + WITH s + MATCH (n) + WHERE n.unique_id CONTAINS s.unique_id + RETURN COLLECT({label: labels(n)[0], id: n.unique_id}) as debug_nodes + } + + // Check Department Structure + OPTIONAL MATCH (dept_struct:DepartmentStructure) + WHERE dept_struct.unique_id = $dept_struct_id + WITH s, debug_nodes, { + exists: dept_struct IS NOT NULL, + node_id: dept_struct.unique_id + } as dept_structure + + // Check Curriculum Structure + OPTIONAL MATCH (curr_struct:CurriculumStructure) + WHERE curr_struct.unique_id = $curr_struct_id + WITH s, debug_nodes, dept_structure, { + exists: curr_struct IS NOT NULL, + node_id: curr_struct.unique_id + } as curr_structure + + // Check Pastoral Structure + OPTIONAL MATCH (past_struct:PastoralStructure) + WHERE past_struct.unique_id = $past_struct_id + WITH debug_nodes, dept_structure, curr_structure, { + exists: past_struct IS NOT NULL, + node_id: past_struct.unique_id + } as past_structure + + // Return structure information + RETURN { + has_basic: dept_structure.exists AND curr_structure.exists AND past_structure.exists, + department_structure: dept_structure, + curriculum_structure: curr_structure, + pastoral_structure: past_structure, + debug_nodes: debug_nodes + } as status + """ + + # Use GraphNamingProvider to generate correct IDs + params = { + "school_id": school_unique_id, + "dept_struct_id": f"DepartmentStructure_{school_unique_id}", + "curr_struct_id": f"CurriculumStructure_{school_unique_id}", + "past_struct_id": f"PastoralStructure_{school_unique_id}", + } + + # Run query in public database + public_result = neo.run_query(basic_query, params, "cc.institutes") + public_status = ( + public_result[0]["status"] if public_result else {"has_basic": False} + ) + + # Check private database if it exists + private_db_name = f"cc.institutes.{school.data['urn']}" + private_exists = False + private_status = None + + # Check if private database exists using Neontology + db_result = neo.run_query("SHOW DATABASES", {}) + databases = [record["name"] for record in db_result] + private_exists = private_db_name in databases + + if private_exists: + private_result = neo.run_query(basic_query, params, private_db_name) + private_status = ( + private_result[0]["status"] + if private_result + else {"has_basic": False} + ) + + return { + "public_database": public_status, + "private_database": { + "exists": private_exists, + "status": private_status if private_exists else None, + }, + } + + except Exception as e: + logger.error(f"Error checking basic structure: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.get("/schools/{school_id}/check-detailed-structure") +async def check_detailed_structure(school_id: str, admin: dict = Depends(verify_admin)): + """Check if detailed structure exists for a school""" + try: + if not admin.get("is_super_admin"): + raise HTTPException( + status_code=403, detail="Only super admins can check structure status" + ) + + # Get school data + school = ( + admin_supabase.table("schools") + .select("*") + .eq("id", school_id) + .single() + .execute() + ) + if not school.data: + raise HTTPException(status_code=404, detail="School not found") + + # Create graph provider for Neo4j operations + provider = GraphProvider() + + # Generate the unique ID for the school + school_unique_id = f"School_{school.data['urn']}" + + # Check detailed structure in public database + with provider.neontology as neo: + detailed_query = """ + MATCH (s:School {unique_id: $school_id}) + + // Get all nodes connected to school for debugging + CALL { + WITH s + MATCH (n) + WHERE n.unique_id CONTAINS s.unique_id + RETURN COLLECT({label: labels(n)[0], id: n.unique_id}) as debug_nodes + } + + // Check Department Structure and Departments + OPTIONAL MATCH (dept_struct:DepartmentStructure) + WHERE dept_struct.unique_id = $dept_struct_id + OPTIONAL MATCH (dept:Department) + WHERE dept.unique_id STARTS WITH 'Department_' + s.unique_id + WITH s, debug_nodes, { + exists: dept_struct IS NOT NULL, + has_departments: COUNT(dept) > 0, + department_count: COUNT(dept) + } as dept_structure + + // Check Curriculum Structure and Key Stages + OPTIONAL MATCH (curr_struct:CurriculumStructure) + WHERE curr_struct.unique_id = $curr_struct_id + OPTIONAL MATCH (ks:KeyStage) + WHERE ks.unique_id STARTS WITH 'KeyStage_' + s.unique_id + WITH s, debug_nodes, dept_structure, { + exists: curr_struct IS NOT NULL, + has_key_stages: COUNT(ks) > 0, + key_stage_count: COUNT(ks) + } as curr_structure + + // Check Pastoral Structure and Year Groups + OPTIONAL MATCH (past_struct:PastoralStructure) + WHERE past_struct.unique_id = $past_struct_id + OPTIONAL MATCH (yg:YearGroup) + WHERE yg.unique_id STARTS WITH 'YearGroup_' + s.unique_id + WITH debug_nodes, dept_structure, curr_structure, { + exists: past_struct IS NOT NULL, + has_year_groups: COUNT(yg) > 0, + year_group_count: COUNT(yg) + } as past_structure + + // Return structure information + RETURN { + has_detailed: + dept_structure.exists AND dept_structure.has_departments AND + curr_structure.exists AND curr_structure.has_key_stages AND + past_structure.exists AND past_structure.has_year_groups, + department_structure: dept_structure, + curriculum_structure: curr_structure, + pastoral_structure: past_structure, + debug_nodes: debug_nodes + } as status + """ + + # Use GraphNamingProvider to generate correct IDs + params = { + "school_id": school_unique_id, + "dept_struct_id": f"DepartmentStructure_{school_unique_id}", + "curr_struct_id": f"CurriculumStructure_{school_unique_id}", + "past_struct_id": f"PastoralStructure_{school_unique_id}", + } + + # Run query in public database + public_result = neo.run_query(detailed_query, params, "cc.institutes") + public_status = ( + public_result[0]["status"] if public_result else {"has_detailed": False} + ) + + # Check private database if it exists + private_db_name = f"cc.institutes.{school.data['urn']}" + private_exists = False + private_status = None + + try: + with provider.neontology.driver.session() as session: + result = session.run("SHOW DATABASES") + databases = [record["name"] for record in result] + private_exists = private_db_name in databases + + if private_exists: + private_result = neo.run_query( + detailed_query, params, private_db_name + ) + private_status = ( + private_result[0]["status"] + if private_result + else {"has_detailed": False} + ) + except Exception as e: + logger.warning(f"Error checking private database: {str(e)}") + + return { + "public_database": public_status, + "private_database": { + "exists": private_exists, + "status": private_status if private_exists else None, + }, + } + + except Exception as e: + logger.error(f"Error checking detailed structure: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +# Export the router +__all__ = ["router"] diff --git a/routers/admin_panel_routes.py b/routers/admin_panel_routes.py new file mode 100644 index 0000000..c3e997d --- /dev/null +++ b/routers/admin_panel_routes.py @@ -0,0 +1,113 @@ +from fastapi import APIRouter, Request, Depends, HTTPException +from fastapi.responses import HTMLResponse +from fastapi.templating import Jinja2Templates +import os +from modules.logger_tool import initialise_logger +from modules.database.services.school_admin_service import SchoolAdminService +from modules.database.supabase.utils.storage import StorageManager +from .auth import verify_admin +from typing import Dict + +router = APIRouter() +templates = Jinja2Templates(directory="templates") +logger = initialise_logger(__name__, os.getenv("LOG_LEVEL"), os.getenv("LOG_PATH"), 'default', True) + +# Initialize services +school_service = SchoolAdminService() +storage_manager = StorageManager() + +@router.get("/schools/manage", response_class=HTMLResponse) +async def manage_schools(request: Request, admin: Dict = Depends(verify_admin)): + """Manage schools page""" + return templates.TemplateResponse( + "admin/schools/manage.html", + {"request": request, "admin": admin} + ) + +@router.get("/storage/manage", response_class=HTMLResponse) +async def manage_storage(request: Request, admin: Dict = Depends(verify_admin)): + """Storage management page""" + try: + # Get list of storage buckets with correct IDs + buckets = [ + { + "id": "cc.institutes", + "name": "School Files", + "public": False, + "file_size_limit": 50 * 1024 * 1024, # 50MB + "allowed_mime_types": [ + "image/*", + "video/*", + "application/pdf", + "application/msword", + "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + "application/vnd.ms-excel", + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "application/vnd.ms-powerpoint", + "application/vnd.openxmlformats-officedocument.presentationml.presentation", + "text/plain", + "text/csv", + "application/json" + ] + }, + { + "id": "cc.users", + "name": "User Files", + "public": False, + "file_size_limit": 50 * 1024 * 1024, # 50MB + "allowed_mime_types": [ + "image/*", + "video/*", + "application/pdf", + "application/msword", + "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + "application/vnd.ms-excel", + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "application/vnd.ms-powerpoint", + "application/vnd.openxmlformats-officedocument.presentationml.presentation", + "text/plain", + "text/csv", + "application/json" + ] + } + ] + + return templates.TemplateResponse( + "admin/storage/manage.html", + {"request": request, "admin": admin, "buckets": buckets} + ) + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + +@router.get("/schema", response_class=HTMLResponse) +async def manage_schema(request: Request, admin: Dict = Depends(verify_admin)): + """Schema management page""" + return templates.TemplateResponse( + "admin/schema/manage.html", + {"request": request, "admin": admin} + ) + +@router.get("/storage/{bucket_id}/contents") +async def list_bucket_contents( + request: Request, + bucket_id: str, + path: str = "", + admin: Dict = Depends(verify_admin) +): + """List contents of a storage bucket""" + try: + contents = storage_manager.list_bucket_contents(bucket_id, path) + bucket = {"id": bucket_id, "name": bucket_id.replace("_", " ").title()} + + return templates.TemplateResponse( + "admin/storage/contents.html", + { + "request": request, + "admin": admin, + "bucket": bucket, + "contents": contents, + "current_path": path + } + ) + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) diff --git a/routers/admin_routes.py b/routers/admin_routes.py new file mode 100644 index 0000000..dfa4ceb --- /dev/null +++ b/routers/admin_routes.py @@ -0,0 +1,498 @@ +from fastapi import APIRouter, Request, Depends, HTTPException, File, UploadFile, Form +from fastapi.responses import HTMLResponse, JSONResponse +from fastapi.templating import Jinja2Templates +from typing import Dict +import os +from modules.logger_tool import initialise_logger +from modules.database.services.admin_service import AdminService, AdminProfileBase +from modules.database.services.school_admin_service import SchoolAdminService +from modules.database.supabase.utils.client import SupabaseAnonClient +from modules.database.supabase.utils.storage import StorageManager +from .auth import verify_admin +import csv +import io + +router = APIRouter() +templates = Jinja2Templates(directory="templates") +logger = initialise_logger(__name__, os.getenv("LOG_LEVEL"), os.getenv("LOG_PATH"), 'default', True) + +# Initialize services +admin_service = AdminService() +school_service = SchoolAdminService() +storage_manager = StorageManager(SupabaseAnonClient) + +@router.get("/", response_class=HTMLResponse) +async def admin_dashboard(request: Request, admin: Dict = Depends(verify_admin)): + """Render admin dashboard""" + return templates.TemplateResponse( + "admin/dashboard/index.html", + { + "request": request, + "admin": admin, + "app_version": os.getenv("APP_VERSION", "Unknown") + } + ) + +@router.get("/users") +async def list_users(request: Request, admin: Dict = Depends(verify_admin)): + """List all users""" + return templates.TemplateResponse( + "admin/users/list.html", + {"request": request, "admin": admin} + ) + +@router.get("/users/{user_id}") +async def get_user(request: Request, user_id: str, admin: Dict = Depends(verify_admin)): + """Get user details""" + return templates.TemplateResponse( + "admin/users/detail.html", + {"request": request, "admin": admin, "user_id": user_id} + ) + +@router.get("/admins") +async def list_admins(request: Request, admin: Dict = Depends(verify_admin)): + """List all admins""" + if not admin.get("is_super_admin"): + raise HTTPException(status_code=403, detail="Only super admins can view admin list") + + admins = admin_service.list_admins() + return templates.TemplateResponse( + "admin/users/admins.html", + {"request": request, "admin": admin, "admins": admins} + ) + +@router.post("/admins") +async def create_admin(admin_data: AdminProfileBase, current_admin: Dict = Depends(verify_admin)): + """Create a new admin""" + try: + result = admin_service.create_admin(admin_data, current_admin) + return JSONResponse(content={"status": "success", "admin": result}) + except Exception as e: + raise HTTPException(status_code=400, detail=str(e)) + +@router.get("/schools/manage", response_class=HTMLResponse) +async def manage_schools(request: Request, admin: Dict = Depends(verify_admin)): + """Manage schools page""" + try: + # Fetch schools from Supabase + result = admin_service.supabase.table("schools").select("*").execute() + schools = result.data if result else [] + + # Sort schools by establishment_name + schools.sort(key=lambda x: x.get("establishment_name", "")) + + return templates.TemplateResponse( + "admin/schools/manage.html", + { + "request": request, + "admin": admin, + "schools": schools, + "schools_count": len(schools) + } + ) + except Exception as e: + logger.error(f"Error fetching schools: {str(e)}") + return templates.TemplateResponse( + "admin/schools/manage.html", + { + "request": request, + "admin": admin, + "schools": [], + "schools_count": 0, + "error": str(e) + } + ) + +@router.post("/schools/import") +async def import_schools( + file: UploadFile = File(...), + admin: Dict = Depends(verify_admin) +): + """Import schools from CSV file""" + if not file.filename.endswith('.csv'): + raise HTTPException(status_code=400, detail="Please upload a CSV file") + + try: + # Process the CSV file + content = await file.read() + csv_text = content.decode('utf-8-sig') # Handle BOM if present + csv_reader = csv.DictReader(io.StringIO(csv_text)) + + # Prepare data for batch insert + schools_data = [] + for row in csv_reader: + school_data = { + "urn": row.get("URN"), + "la_code": row.get("LA (code)"), + "la_name": row.get("LA (name)"), + "establishment_number": row.get("EstablishmentNumber"), + "establishment_name": row.get("EstablishmentName"), + "establishment_type": row.get("TypeOfEstablishment (name)"), + "establishment_type_group": row.get("EstablishmentTypeGroup (name)"), + "establishment_status": row.get("EstablishmentStatus (name)"), + "reason_establishment_opened": row.get("ReasonEstablishmentOpened (name)"), + "open_date": row.get("OpenDate"), + "reason_establishment_closed": row.get("ReasonEstablishmentClosed (name)"), + "close_date": row.get("CloseDate"), + "phase_of_education": row.get("PhaseOfEducation (name)"), + "statutory_low_age": row.get("StatutoryLowAge"), + "statutory_high_age": row.get("StatutoryHighAge"), + "boarders": row.get("Boarders (name)"), + "nursery_provision": row.get("NurseryProvision (name)"), + "official_sixth_form": row.get("OfficialSixthForm (name)"), + "gender": row.get("Gender (name)"), + "religious_character": row.get("ReligiousCharacter (name)"), + "religious_ethos": row.get("ReligiousEthos (name)"), + "diocese": row.get("Diocese (name)"), + "admissions_policy": row.get("AdmissionsPolicy (name)"), + "school_capacity": row.get("SchoolCapacity"), + "special_classes": row.get("SpecialClasses (name)"), + "census_date": row.get("CensusDate"), + "number_of_pupils": row.get("NumberOfPupils"), + "number_of_boys": row.get("NumberOfBoys"), + "number_of_girls": row.get("NumberOfGirls"), + "percentage_fsm": row.get("PercentageFSM"), + "trust_school_flag": row.get("TrustSchoolFlag (name)"), + "trusts_name": row.get("Trusts (name)"), + "school_sponsor_flag": row.get("SchoolSponsorFlag (name)"), + "school_sponsors_name": row.get("SchoolSponsors (name)"), + "federation_flag": row.get("FederationFlag (name)"), + "federations_name": row.get("Federations (name)"), + "ukprn": row.get("UKPRN"), + "fehe_identifier": row.get("FEHEIdentifier"), + "further_education_type": row.get("FurtherEducationType (name)"), + "ofsted_last_inspection": row.get("OfstedLastInsp"), + "last_changed_date": row.get("LastChangedDate"), + "street": row.get("Street"), + "locality": row.get("Locality"), + "address3": row.get("Address3"), + "town": row.get("Town"), + "county": row.get("County (name)"), + "postcode": row.get("Postcode"), + "school_website": row.get("SchoolWebsite"), + "telephone_num": row.get("TelephoneNum"), + "head_title": row.get("HeadTitle (name)"), + "head_first_name": row.get("HeadFirstName"), + "head_last_name": row.get("HeadLastName"), + "head_preferred_job_title": row.get("HeadPreferredJobTitle"), + "gssla_code": row.get("GSSLACode (name)"), + "parliamentary_constituency": row.get("ParliamentaryConstituency (name)"), + "urban_rural": row.get("UrbanRural (name)"), + "rsc_region": row.get("RSCRegion (name)"), + "country": row.get("Country (name)"), + "uprn": row.get("UPRN"), + "sen_stat": row.get("SENStat") == "true", + "sen_no_stat": row.get("SENNoStat") == "true", + "sen_unit_on_roll": row.get("SenUnitOnRoll"), + "sen_unit_capacity": row.get("SenUnitCapacity"), + "resourced_provision_on_roll": row.get("ResourcedProvisionOnRoll"), + "resourced_provision_capacity": row.get("ResourcedProvisionCapacity"), + } + + # Clean up empty strings and convert types + for key, value in school_data.items(): + if value == "": + school_data[key] = None + elif key in ["statutory_low_age", "statutory_high_age", "school_capacity", + "number_of_pupils", "number_of_boys", "number_of_girls", + "sen_unit_on_roll", "sen_unit_capacity", + "resourced_provision_on_roll", "resourced_provision_capacity"]: + if value: + try: + float_val = float(value) + int_val = int(float_val) + school_data[key] = int_val + except (ValueError, TypeError): + school_data[key] = None + elif key == "percentage_fsm": + if value: + try: + school_data[key] = float(value) + except (ValueError, TypeError): + school_data[key] = None + elif key in ["open_date", "close_date", "census_date", + "ofsted_last_inspection", "last_changed_date"]: + if value: + try: + # Convert date from DD-MM-YYYY to YYYY-MM-DD + parts = value.split("-") + if len(parts) == 3: + school_data[key] = f"{parts[2]}-{parts[1]}-{parts[0]}" + else: + school_data[key] = None + except: + school_data[key] = None + + schools_data.append(school_data) + + # Batch insert schools using admin service's Supabase client + if schools_data: + result = admin_service.supabase.table("schools").upsert( + schools_data, + on_conflict="urn" # Update if URN already exists + ).execute() + + logger.info(f"Imported {len(schools_data)} schools") + return {"status": "success", "imported_count": len(schools_data)} + else: + raise HTTPException(status_code=400, detail="No valid school data found in CSV") + + except Exception as e: + logger.error(f"Error importing schools: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + +@router.post("/initialize-schools-database") +async def initialize_schools_database(admin: Dict = Depends(verify_admin)): + """Initialize schools database""" + if not admin.get("is_super_admin"): + raise HTTPException(status_code=403, detail="Only super admins can initialize database") + + result = school_service.create_schools_database() + if result["status"] == "error": + raise HTTPException(status_code=500, detail=result["message"]) + return result + +@router.get("/check-schools-database") +async def check_schools_database(admin: Dict = Depends(verify_admin)): + """Check schools database status""" + try: + # Use SchoolService to check if database exists and has required nodes/relationships + result = school_service.check_schools_database() + return {"exists": result["status"] == "success"} + except Exception as e: + logger.error(f"Error checking schools database: {str(e)}") + return {"exists": False, "error": str(e)} + +@router.get("/storage", response_class=HTMLResponse) +async def storage_management(request: Request, admin: Dict = Depends(verify_admin)): + """Storage management page""" + try: + # Get list of storage buckets with correct IDs + buckets = [ + { + "id": "cc.institutes", + "name": "School Files", + "public": False, + "file_size_limit": 50 * 1024 * 1024, # 50MB + "allowed_mime_types": [ + "image/*", + "video/*", + "application/pdf", + "application/msword", + "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + "application/vnd.ms-excel", + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "application/vnd.ms-powerpoint", + "application/vnd.openxmlformats-officedocument.presentationml.presentation", + "text/plain", + "text/csv", + "application/json" + ] + }, + { + "id": "cc.users", + "name": "User Files", + "public": False, + "file_size_limit": 50 * 1024 * 1024, # 50MB + "allowed_mime_types": [ + "image/*", + "video/*", + "application/pdf", + "application/msword", + "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + "application/vnd.ms-excel", + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "application/vnd.ms-powerpoint", + "application/vnd.openxmlformats-officedocument.presentationml.presentation", + "text/plain", + "text/csv", + "application/json" + ] + } + ] + + return templates.TemplateResponse( + "admin/storage/manage.html", + {"request": request, "admin": admin, "buckets": buckets} + ) + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + +@router.get("/storage/{bucket_id}/contents") +async def list_bucket_contents( + request: Request, + bucket_id: str, + path: str = "", + admin: Dict = Depends(verify_admin) +): + """List contents of a storage bucket""" + try: + contents = storage_manager.list_bucket_contents(bucket_id, path) + bucket = {"id": bucket_id, "name": bucket_id.replace("_", " ").title()} + + return templates.TemplateResponse( + "admin/storage/contents.html", + { + "request": request, + "admin": admin, + "bucket": bucket, + "contents": contents, + "current_path": path + } + ) + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + +@router.get("/storage/{bucket_id}/download/{file_path:path}") +async def download_file( + bucket_id: str, + file_path: str, + admin: Dict = Depends(verify_admin) +): + """Get download URL for a file""" + try: + url = storage_manager.create_signed_url(bucket_id, file_path) + return {"url": url} + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + +@router.delete("/storage/{bucket_id}/objects/{object_path:path}") +async def delete_object( + bucket_id: str, + object_path: str, + admin: Dict = Depends(verify_admin) +): + """Delete an object from storage""" + try: + storage_manager.delete_file(bucket_id, object_path) + return {"status": "success"} + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + +@router.get("/check-storage") +async def check_storage(admin: Dict = Depends(verify_admin)): + """Check storage buckets status""" + try: + # Use the same bucket IDs as defined in initialize_storage + buckets = [ + {"id": "cc.users", "name": "User Files"}, + {"id": "cc.institutes", "name": "School Files"} + ] + + results = [] + for bucket in buckets: + exists = storage_manager.check_bucket_exists(bucket["id"]) + results.append({ + "id": bucket["id"], + "name": bucket["name"], + "exists": exists + }) + + return {"buckets": results} + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + +@router.post("/initialize-storage") +async def initialize_storage(admin: Dict = Depends(verify_admin)): + """Initialize storage buckets and policies for schools""" + try: + # Verify super admin status + if not admin.get('is_super_admin'): + raise HTTPException(status_code=403, detail="Only super admins can initialize storage") + + # Use the storage manager to initialize storage + storage_manager = StorageManager(SupabaseAnonClient) + return storage_manager.initialize_storage() + except Exception as e: + logger.error(f"Error initializing storage: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + +@router.get("/check-schema") +async def check_schema(admin: Dict = Depends(verify_admin)): + """Check Neo4j schema status""" + try: + from modules.database.services.graph_service import GraphService + graph_service = GraphService() + + # Get actual schema status + schema_status = graph_service.check_schema_status() + + # Return status with proper validation + return { + "constraints_valid": schema_status["constraints_count"] > 0, + "constraints_count": schema_status["constraints_count"], + "indexes_valid": schema_status["indexes_count"] > 0, + "indexes_count": schema_status["indexes_count"], + "labels_valid": schema_status["labels_count"] > 0, + "labels_count": schema_status["labels_count"] + } + except Exception as e: + logger.error(f"Error checking schema: {str(e)}") + return { + "constraints_valid": False, + "constraints_count": 0, + "indexes_valid": False, + "indexes_count": 0, + "labels_valid": False, + "labels_count": 0, + "error": str(e) + } + +@router.post("/initialize-schema") +async def initialize_schema(admin: Dict = Depends(verify_admin)): + """Initialize Neo4j schema (constraints and indexes)""" + if not admin.get("is_super_admin"): + raise HTTPException(status_code=403, detail="Only super admins can initialize schema") + + try: + from modules.database.services.graph_service import GraphService + graph_service = GraphService() + + # Initialize schema + result = graph_service.initialize_schema() + + if result["status"] == "error": + raise HTTPException(status_code=500, detail=result["message"]) + + return result + except Exception as e: + logger.error(f"Error initializing schema: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + +@router.get("/schools/{school_id}") +async def view_school(request: Request, school_id: str, admin: Dict = Depends(verify_admin)): + """View school details""" + try: + # Fetch school details from Supabase + result = admin_service.supabase.table("schools").select("*").eq("id", school_id).single().execute() + school = result.data if result else None + + if not school: + raise HTTPException(status_code=404, detail="School not found") + + return templates.TemplateResponse( + "admin/schools/detail.html", + {"request": request, "admin": admin, "school": school} + ) + except Exception as e: + logger.error(f"Error fetching school details: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + +@router.delete("/schools/{school_id}") +async def delete_school(school_id: str, admin: Dict = Depends(verify_admin)): + """Delete a school""" + try: + # Verify super admin status + if not admin.get("is_super_admin"): + raise HTTPException(status_code=403, detail="Only super admins can delete schools") + + # Delete the school from Supabase + result = admin_service.supabase.table("schools").delete().eq("id", school_id).execute() + + if not result.data: + raise HTTPException(status_code=404, detail="School not found") + + return {"status": "success", "message": "School deleted successfully"} + except Exception as e: + logger.error(f"Error deleting school: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) diff --git a/routers/assets/__init___.py b/routers/assets/__init___.py new file mode 100644 index 0000000..e69de29 diff --git a/routers/assets/__pycache__/pdf.cpython-311.pyc b/routers/assets/__pycache__/pdf.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..507643a158051ebe87cd8da0c530fb2b2f0ad8c6 GIT binary patch literal 23033 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�`*tWrPJPT)zGN1-GhAdS)utX_~3c|dExwv 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 WW$I3HKU7kR0*JDs$b3TZp8o@1*Fr%6 literal 0 HcmV?d00001 diff --git a/routers/assets/__pycache__/powerpoint.cpython-311.pyc b/routers/assets/__pycache__/powerpoint.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..614817303467e9be1dfb890bda3c89f0983e6f3c GIT binary patch literal 22453 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 lP#y{H*JaEPFt& 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 C*=%C~ literal 0 HcmV?d00001 diff --git a/routers/assets/pdf.py b/routers/assets/pdf.py new file mode 100644 index 0000000..c3d9cec --- /dev/null +++ b/routers/assets/pdf.py @@ -0,0 +1,423 @@ +import os +from modules.logger_tool import initialise_logger +logger = initialise_logger(log_name="pdf", log_level=os.getenv("LOG_LEVEL"), log_dir=os.getenv("LOG_PATH"), log_format="default", runtime=True) + +from fastapi import APIRouter, UploadFile, File, HTTPException +from fastapi.responses import JSONResponse +from pathlib import Path +import tempfile +from PIL import Image +import io +import base64 +import traceback +import sys +import subprocess +from concurrent.futures import ThreadPoolExecutor, as_completed, TimeoutError +import asyncio +import psutil +import math +import time +from pdfminer.high_level import extract_pages +from pdfminer.layout import LTTextContainer, LTChar, LTLine, LTRect, LTFigure, LTTextBox, LTTextBoxHorizontal, LTTextLine +import re + +router = APIRouter() + +# Global semaphore to control total concurrent PDF processing +MAX_CONCURRENT_PROCESSING = 4 # Adjust based on server capacity +processing_semaphore = asyncio.Semaphore(MAX_CONCURRENT_PROCESSING) + +def calculate_optimal_workers(): + """Calculate optimal number of worker threads based on system resources.""" + cpu_count = os.cpu_count() or 4 + available_memory = psutil.virtual_memory().available + memory_per_worker = 500 * 1024 * 1024 # 500MB per worker estimate + + # Calculate workers based on CPU and memory constraints + cpu_based_workers = max(1, cpu_count - 1) # Leave one core free + memory_based_workers = max(1, int(available_memory / memory_per_worker)) + + # Take the minimum of CPU and memory-based calculations + optimal_workers = min(cpu_based_workers, memory_based_workers) + + # Cap at a reasonable maximum + final_workers = min(optimal_workers, 8) # Maximum 8 workers per process + + logger.info("Resource utilization:", { + "total_cpus": cpu_count, + "available_memory_gb": available_memory / (1024**3), + "cpu_based_workers": cpu_based_workers, + "memory_based_workers": memory_based_workers, + "final_workers": final_workers + }) + + return final_workers + +def is_heading(textbox, page_height): + """Determine if a textbox is likely a heading based on font size and position.""" + if not isinstance(textbox, LTTextContainer): + return False, 0 + + # Get the most common font size in the textbox + font_sizes = [] + for text_line in textbox._objs: + if isinstance(text_line, LTTextLine): + font_sizes.extend( + char.size + for char in text_line._objs + if isinstance(char, LTChar) + ) + if not font_sizes: + return False, 0 + + most_common_size = max(set(font_sizes), key=font_sizes.count) + + # Position near top of page suggests a heading + is_near_top = textbox.y1 > (page_height - 100) + + # Determine heading level based on font size and position + if most_common_size > 20 or is_near_top: + return True, 1 + elif most_common_size > 16: + return True, 2 + elif most_common_size > 14: + return True, 3 + + return False, 0 + +def clean_text(text): + """Clean and normalize text content.""" + # Remove multiple spaces and newlines + text = re.sub(r'\s+', ' ', text) + # Remove special characters often found in PDFs + text = re.sub(r'[^\x00-\x7F]+', '', text) + return text.strip() + +def extract_page_text(page): + """Extract text from a PDF page and format as markdown.""" + page_height = page.height + text_elements = [] + current_list_items = [] + + # First pass: collect all text elements and identify their roles + for element in page: + if isinstance(element, LTTextContainer): + text = clean_text(element.get_text()) + if not text: + continue + + is_head, level = is_heading(element, page_height) + + # Check if this looks like a list item + is_list_item = bool(re.match(r'^[\u2022\u2023\u25E6\u2043\u2219•\-*]\s', text)) + + if is_head: + # If we have pending list items, add them first + if current_list_items: + text_elements.extend(current_list_items) + current_list_items = [] + text_elements.append((f"{'#' * level} {text.lstrip('1234567890.-* ')}", element.y1)) + elif is_list_item: + current_list_items.append((f"* {text.lstrip('1234567890.-* ')}", element.y1)) + else: + # If this is regular text and we have pending list items + if current_list_items: + # Check if this text is part of the same list (similar y-position) + if any(abs(item[1] - element.y1) < 20 for item in current_list_items): + current_list_items.append((f"* {text}", element.y1)) + continue + else: + # Add pending list items before adding this text + text_elements.extend(current_list_items) + current_list_items = [] + text_elements.append((text, element.y1)) + + # Add any remaining list items + if current_list_items: + text_elements.extend(current_list_items) + + # Sort elements by vertical position (top to bottom) + text_elements.sort(key=lambda x: -x[1]) + + # Return just the text parts, properly formatted + return '\n\n'.join(element[0] for element in text_elements) + +def process_page(temp_dir: str, pdf_path: str, page_info: tuple, timeout: int = 30) -> dict: + """ + Worker function to process a single page and maintain A4 proportions. + Args: + temp_dir: Path to temporary directory + pdf_path: Path to PDF file + page_info: Tuple of (index, page_number) + timeout: Maximum time in seconds to process a single page + Returns: + dict: Processed page information + """ + i, page_idx = page_info + page_num = page_idx + 1 # PDF pages are 1-indexed + output_prefix = str(Path(temp_dir) / f"page_{page_num}") + + try: + # Extract text from PDF page + pages = list(extract_pages(pdf_path, page_numbers=[page_idx])) + page_text = extract_page_text(pages[0]) if pages else "" + # Convert PDF page to PNG with timeout + process = subprocess.Popen( + [ + 'pdftoppm', + '-png', + '-singlefile', + '-f', + str(page_num), + '-l', + str(page_num), + '-r', + '600', # High resolution for better quality + pdf_path, + output_prefix, + ], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE + ) + + try: + stdout, stderr = process.communicate(timeout=timeout) + except subprocess.TimeoutExpired: + process.kill() + raise TimeoutError(f"Page {page_num} processing timed out after {timeout} seconds") + + if process.returncode != 0: + raise Exception(f"pdftoppm failed for page {page_num}: {stderr.decode()}") + + output_file = f"{output_prefix}.png" + if not Path(output_file).exists(): + raise Exception(f"Could not find output file for page {page_num}") + + # Open and process the image + with Image.open(output_file) as img: + result = _process_image(img, i) + if result['success']: + result['meta'] = { + 'text': page_text, + 'format': 'markdown' + } + return result + except Exception as e: + logger.error(f"Error processing page {page_num}: {str(e)}") + return { + "index": i, + "error": str(e), + "success": False, + } + +def _process_image(img: Image.Image, index: int) -> dict: + """Process a single image, maintaining A4 proportions.""" + try: + # Determine orientation and target dimensions + is_portrait = img.height > img.width + target_height = 720 # Fixed height to match frontend slide height + + if is_portrait: + # A4 portrait ratio is 210:297 + target_width = int(target_height * (210/297)) + else: + # A4 landscape ratio is 297:210 + target_width = int(target_height * (297/210)) + + # Resize image maintaining aspect ratio + img = img.resize((target_width, target_height), Image.Resampling.LANCZOS) + + # Convert to base64 + buffered = io.BytesIO() + img.save(buffered, format="PNG", optimize=True) + img_str = base64.b64encode(buffered.getvalue()).decode() + + return { + "index": index, + "data": f"data:image/png;base64,{img_str}", + "success": True, + "dimensions": { + "width": target_width, + "height": target_height, + "orientation": "portrait" if is_portrait else "landscape" + } + } + except Exception as e: + logger.error(f"Error processing image for page {index}: {str(e)}") + return { + "index": index, + "error": str(e), + "success": False, + } + +async def process_pages_in_chunks(temp_dir: str, pdf_path: str, visible_pages: list, chunk_size: int = 5): + """Process pages in chunks to manage memory better.""" + all_processed_pages = [] + num_workers = calculate_optimal_workers() + total_chunks = math.ceil(len(visible_pages) / chunk_size) + + logger.info("Starting page processing:", { + "total_pages": len(visible_pages), + "chunk_size": chunk_size, + "total_chunks": total_chunks, + "workers_per_chunk": num_workers + }) + + # Process pages in chunks + for chunk_index in range(0, len(visible_pages), chunk_size): + chunk = visible_pages[chunk_index:chunk_index + chunk_size] + processed_chunk = [] + current_chunk_num = (chunk_index // chunk_size) + 1 + + logger.info(f"Processing chunk {current_chunk_num}/{total_chunks}", { + "chunk_size": len(chunk), + "chunk_start_index": chunk_index, + "memory_usage_gb": psutil.Process().memory_info().rss / (1024**3) + }) + + start_time = time.time() + with ThreadPoolExecutor(max_workers=num_workers) as executor: + # Submit chunk of tasks + future_to_page = { + executor.submit( + process_page, temp_dir, pdf_path, page_info + ): page_info + for page_info in chunk + } + + # Process completed tasks as they finish + for future in as_completed(future_to_page): + try: + result = future.result(timeout=60) # Increased timeout to 60 seconds per page + if result.get('success', False): + processed_chunk.append(result) + page_info = future_to_page[future] + logger.debug(f"Processed page {page_info[1] + 1}", { + "success": result.get('success', False), + "processing_time": time.time() - start_time + }) + except TimeoutError: + page_info = future_to_page[future] + logger.error(f"Timeout processing page {page_info[1] + 1}") + except Exception as e: + page_info = future_to_page[future] + logger.error(f"Error processing page {page_info[1] + 1}: {str(e)}") + + chunk_time = time.time() - start_time + logger.info(f"Completed chunk {current_chunk_num}/{total_chunks}", { + "processed_pages": len(processed_chunk), + "chunk_processing_time": chunk_time, + "avg_time_per_page": chunk_time / len(chunk) if chunk else 0 + }) + + all_processed_pages.extend(processed_chunk) + + # Small delay between chunks to allow other tasks to process + await asyncio.sleep(0.1) + + return all_processed_pages + +@router.post("/convert") +async def convert_pdf_to_images(file: UploadFile = File(...)): + try: + async with processing_semaphore: # Control concurrent processing + start_time = time.time() + # Log request details + logger.info( + "Received file upload request", + { + "filename": file.filename, + "content_type": file.content_type, + "current_memory_usage_gb": psutil.Process() + .memory_info() + .rss + / (1024**3), + "cpu_percent": psutil.cpu_percent(interval=1), + }, + ) + + # Validate file + if not file.filename.endswith('.pdf'): + logger.error("Invalid file type") + return JSONResponse({ + "status": "error", + "message": "Invalid file type. Please upload a .pdf file" + }, status_code=400) + + # Create a temporary directory to store the PDF file + with tempfile.TemporaryDirectory() as temp_dir: + pdf_path = Path(temp_dir) / "document.pdf" + logger.debug(f"Saving file to temporary path: {pdf_path}") + + try: + # Save uploaded file + content = await file.read() + logger.debug(f"Read file content, size: {len(content)} bytes") + + with open(pdf_path, "wb") as buffer: + buffer.write(content) + logger.debug("File saved successfully") + + if not pdf_path.exists() or pdf_path.stat().st_size == 0: + raise Exception("Failed to save file or file is empty") + + # Get number of pages using pdfinfo + result = subprocess.run(['pdfinfo', str(pdf_path)], capture_output=True, text=True) + pages_line = [line for line in result.stdout.split('\n') if line.startswith('Pages:')][0] + num_pages = int(pages_line.split(':')[1].strip()) + + visible_pages = [(i, i) for i in range(num_pages)] + + if num_pages == 0: + logger.warning("No pages found in document") + return JSONResponse({ + "status": "error", + "message": "No pages found in document" + }, status_code=400) + + logger.info(f"Processing {num_pages} pages") + + # Calculate chunk size based on number of pages + chunk_size = min(5, max(2, math.ceil(num_pages / 4))) + processed_pages = await process_pages_in_chunks(str(temp_dir), str(pdf_path), visible_pages, chunk_size) + + if not processed_pages: + raise Exception("Failed to process any pages successfully") + + # Sort pages by index + processed_pages.sort(key=lambda x: x['index']) + + logger.info(f"Successfully processed {len(processed_pages)} pages") + + # After processing all pages + total_time = time.time() - start_time + logger.info("PDF processing completed", { + "total_processing_time": total_time, + "pages_processed": len(processed_pages), + "avg_time_per_page": total_time / len(processed_pages) if processed_pages else 0, + "final_memory_usage_gb": psutil.Process().memory_info().rss / (1024**3) + }) + + return JSONResponse({ + "status": "success", + "slides": processed_pages, # Using same format as PowerPoint for consistency + "processing_stats": { + "total_time": total_time, + "pages_processed": len(processed_pages), + "avg_time_per_page": total_time / len(processed_pages) if processed_pages else 0 + } + }) + + except Exception as inner_error: + logger.error(f"Inner error: {str(inner_error)}") + logger.error(traceback.format_exc()) + raise + + except Exception as e: + logger.error(f"Error processing PDF: {str(e)}") + logger.error(f"Python version: {sys.version}") + logger.error(f"Traceback: {traceback.format_exc()}") + return JSONResponse({ + "status": "error", + "message": f"Failed to process PDF: {str(e)}" + }, status_code=500) diff --git a/routers/assets/powerpoint.py b/routers/assets/powerpoint.py new file mode 100644 index 0000000..4bd8cf0 --- /dev/null +++ b/routers/assets/powerpoint.py @@ -0,0 +1,398 @@ +import os +from modules.logger_tool import initialise_logger +logger = initialise_logger(log_name="powerpoint", log_level=os.getenv("LOG_LEVEL"), log_dir=os.getenv("LOG_PATH"), log_format="default", runtime=True) + +from fastapi import APIRouter, UploadFile, File, HTTPException +from fastapi.responses import JSONResponse +from pathlib import Path +import tempfile +from pptx import Presentation +from PIL import Image +import io +import base64 +import traceback +import sys +import subprocess +from concurrent.futures import ThreadPoolExecutor, as_completed, TimeoutError +import asyncio +import psutil +import math +import time + +router = APIRouter() + +# Global semaphore to control total concurrent PowerPoint processing +MAX_CONCURRENT_PROCESSING = 4 # Adjust based on server capacity +processing_semaphore = asyncio.Semaphore(MAX_CONCURRENT_PROCESSING) + +def calculate_optimal_workers(): + """Calculate optimal number of worker threads based on system resources.""" + cpu_count = os.cpu_count() or 4 + available_memory = psutil.virtual_memory().available + memory_per_worker = 500 * 1024 * 1024 # 500MB per worker estimate + + # Calculate workers based on CPU and memory constraints + cpu_based_workers = max(1, cpu_count - 1) # Leave one core free + memory_based_workers = max(1, int(available_memory / memory_per_worker)) + + # Take the minimum of CPU and memory-based calculations + optimal_workers = min(cpu_based_workers, memory_based_workers) + + # Cap at a reasonable maximum + final_workers = min(optimal_workers, 8) # Maximum 8 workers per process + + # Log resource information + logger.info("Resource utilization:", { + "total_cpus": cpu_count, + "available_memory_gb": available_memory / (1024**3), + "cpu_based_workers": cpu_based_workers, + "memory_based_workers": memory_based_workers, + "final_workers": final_workers + }) + + return final_workers + +def extract_text_from_shape(shape): + """Extract text from a PowerPoint shape.""" + if hasattr(shape, 'text') and shape.text.strip(): + return shape.text.strip() + + # Handle tables + if shape.has_table: + table_text = [] + for row in shape.table.rows: + row_text = [] + row_text.extend(cell.text.strip() for cell in row.cells if cell.text.strip()) + if row_text: + table_text.append('| ' + ' | '.join(row_text) + ' |') + if table_text: + # Add markdown table header separator + table_text.insert(1, '|' + '---|' * (len(table_text[0].split('|')) - 2)) + return '\n'.join(table_text) + + # Handle grouped shapes + if hasattr(shape, 'shapes'): + group_text = [] + for subshape in shape.shapes: + if text := extract_text_from_shape(subshape): + group_text.append(text) + return '\n'.join(group_text) if group_text else '' + + return '' + +def extract_slide_text(slide): + """Extract text from a PowerPoint slide and format as markdown.""" + slide_text = [] + + # Extract title if present + if slide.shapes.title and slide.shapes.title.text.strip(): + slide_text.append(f"# {slide.shapes.title.text.strip()}") + + # Process all shapes + for shape in slide.shapes: + if shape != slide.shapes.title: # Skip title as we've already processed it + if text := extract_text_from_shape(shape): + slide_text.append(text) + + return '\n\n'.join(slide_text) + +def process_slide(temp_dir: str, pdf_path: str, pptx_path: str, slide_info: tuple, timeout: int = 30) -> dict: + """ + Worker function to process a single slide and enforce 16:9 aspect ratio. + Args: + temp_dir: Path to temporary directory + pdf_path: Path to PDF file + pptx_path: Path to PowerPoint file + slide_info: Tuple of (index, slide_number) + timeout: Maximum time in seconds to process a single slide + Returns: + dict: Processed slide information + """ + i, slide_idx = slide_info + slide_num = slide_idx + 1 # PDF pages are 1-indexed + output_prefix = str(Path(temp_dir) / f"slide_{slide_num}") + + try: + # Extract text from PowerPoint slide + prs = Presentation(pptx_path) + slide_text = extract_slide_text(prs.slides[slide_idx]) + + # Convert PDF page to PNG with timeout + process = subprocess.Popen( + [ + 'pdftoppm', + '-png', + '-singlefile', + '-f', + str(slide_num), + '-l', + str(slide_num), + '-r', + '600', # High resolution for better quality + pdf_path, + output_prefix, + ], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE + ) + + try: + stdout, stderr = process.communicate(timeout=timeout) + except subprocess.TimeoutExpired: + process.kill() + raise TimeoutError(f"Slide {slide_num} processing timed out after {timeout} seconds") + + if process.returncode != 0: + raise Exception(f"pdftoppm failed for slide {slide_num}: {stderr.decode()}") + + output_file = f"{output_prefix}.png" + if not Path(output_file).exists(): + raise Exception(f"Could not find output file for slide {slide_num}") + + # Open and process the image + with Image.open(output_file) as img: + result = _process_image(img, i) + if result['success']: + result['meta'] = { + 'text': slide_text, + 'format': 'markdown' + } + return result + except Exception as e: + logger.error(f"Error processing slide {slide_num}: {str(e)}") + return { + "index": i, + "error": str(e), + "success": False, + } + +def _process_image(img: Image.Image, index: int) -> dict: + """Process a single image, enforcing aspect ratio and size constraints.""" + try: + # Enforce 16:9 aspect ratio + target_aspect_ratio = 16 / 9 + img_aspect_ratio = img.width / img.height + + if img_aspect_ratio > target_aspect_ratio: # Wider than 16:9 + new_width = int(img.height * target_aspect_ratio) + offset = (img.width - new_width) // 2 + img = img.crop((offset, 0, offset + new_width, img.height)) + elif img_aspect_ratio < target_aspect_ratio: # Taller than 16:9 + new_height = int(img.width / target_aspect_ratio) + offset = (img.height - new_height) // 2 + img = img.crop((0, offset, img.width, offset + new_height)) + + # Resize to target resolution (2560x1440) + img = img.resize((2560, 1440), Image.Resampling.LANCZOS) + + # Convert to base64 + buffered = io.BytesIO() + img.save(buffered, format="PNG", optimize=True) + img_str = base64.b64encode(buffered.getvalue()).decode() + + return { + "index": index, + "data": f"data:image/png;base64,{img_str}", + "success": True, + } + except Exception as e: + logger.error(f"Error processing image for slide {index}: {str(e)}") + return { + "index": index, + "error": str(e), + "success": False, + } + +async def process_slides_in_chunks(temp_dir: str, pdf_path: str, pptx_path: str, visible_slides: list, chunk_size: int = 5): + """Process slides in chunks to manage memory better.""" + all_processed_slides = [] + num_workers = calculate_optimal_workers() + total_chunks = math.ceil(len(visible_slides) / chunk_size) + + logger.info("Starting slide processing:", { + "total_slides": len(visible_slides), + "chunk_size": chunk_size, + "total_chunks": total_chunks, + "workers_per_chunk": num_workers + }) + + # Process slides in chunks + for chunk_index in range(0, len(visible_slides), chunk_size): + chunk = visible_slides[chunk_index:chunk_index + chunk_size] + processed_chunk = [] + current_chunk_num = (chunk_index // chunk_size) + 1 + + logger.info(f"Processing chunk {current_chunk_num}/{total_chunks}", { + "chunk_size": len(chunk), + "chunk_start_index": chunk_index, + "memory_usage_gb": psutil.Process().memory_info().rss / (1024**3) + }) + + start_time = time.time() + with ThreadPoolExecutor(max_workers=num_workers) as executor: + # Submit chunk of tasks + future_to_slide = { + executor.submit( + process_slide, temp_dir, pdf_path, pptx_path, slide_info + ): slide_info + for slide_info in chunk + } + + # Process completed tasks as they finish + for future in as_completed(future_to_slide): + try: + result = future.result(timeout=60) # Increased timeout to 60 seconds per slide + if result.get('success', False): + processed_chunk.append(result) + slide_info = future_to_slide[future] + logger.debug(f"Processed slide {slide_info[1] + 1}", { + "success": result.get('success', False), + "processing_time": time.time() - start_time + }) + except TimeoutError: + slide_info = future_to_slide[future] + logger.error(f"Timeout processing slide {slide_info[1] + 1}") + except Exception as e: + slide_info = future_to_slide[future] + logger.error(f"Error processing slide {slide_info[1] + 1}: {str(e)}") + + chunk_time = time.time() - start_time + logger.info(f"Completed chunk {current_chunk_num}/{total_chunks}", { + "processed_slides": len(processed_chunk), + "chunk_processing_time": chunk_time, + "avg_time_per_slide": chunk_time / len(chunk) if chunk else 0 + }) + + all_processed_slides.extend(processed_chunk) + + # Small delay between chunks to allow other tasks to process + await asyncio.sleep(0.1) + + return all_processed_slides + +@router.post("/convert") +async def convert_pptx_to_images(file: UploadFile = File(...)): + try: + async with processing_semaphore: # Control concurrent processing + start_time = time.time() + # Log request details + logger.info( + "Received file upload request", + { + "filename": file.filename, + "content_type": file.content_type, + "current_memory_usage_gb": psutil.Process() + .memory_info() + .rss + / (1024**3), + "cpu_percent": psutil.cpu_percent(interval=1), + }, + ) + + # Validate file + if not file.filename.endswith('.pptx'): + logger.error("Invalid file type") + return JSONResponse({ + "status": "error", + "message": "Invalid file type. Please upload a .pptx file" + }, status_code=400) + + # Create a temporary directory to store the PowerPoint file + with tempfile.TemporaryDirectory() as temp_dir: + pptx_path = Path(temp_dir) / "presentation.pptx" + logger.debug(f"Saving file to temporary path: {pptx_path}") + + try: + # Save uploaded file + content = await file.read() + logger.debug(f"Read file content, size: {len(content)} bytes") + + with open(pptx_path, "wb") as buffer: + buffer.write(content) + logger.debug("File saved successfully") + + if not pptx_path.exists() or pptx_path.stat().st_size == 0: + raise Exception("Failed to save file or file is empty") + + # Open the presentation and get visible slides + prs = Presentation(str(pptx_path)) + visible_slides = [ + (i, slide_idx) + for i, (slide_idx, _) in enumerate( + (i, slide) + for i, slide in enumerate(prs.slides) + if not hasattr(slide, 'show') or slide.show + ) + ] + num_slides = len(visible_slides) + + if num_slides == 0: + logger.warning("No visible slides found in presentation") + return JSONResponse({ + "status": "error", + "message": "No visible slides found in presentation" + }, status_code=400) + + logger.info(f"Processing {num_slides} visible slides") + + # Convert PowerPoint to PDF + pdf_path = Path(temp_dir) / "presentation.pdf" + logger.debug("Converting PowerPoint to PDF") + + result = subprocess.run([ + 'soffice', + '--headless', + '--convert-to', 'pdf', + '--outdir', str(temp_dir), + str(pptx_path) + ], check=True, capture_output=True, text=True) + + if not pdf_path.exists(): + raise Exception("PDF file was not created") + + logger.debug(f"PDF created successfully at {pdf_path}, size: {pdf_path.stat().st_size} bytes") + + # Calculate chunk size based on number of slides + chunk_size = min(5, max(2, math.ceil(num_slides / 4))) + processed_slides = await process_slides_in_chunks(str(temp_dir), str(pdf_path), str(pptx_path), visible_slides, chunk_size) + + if not processed_slides: + raise Exception("Failed to process any slides successfully") + + # Sort slides by index + processed_slides.sort(key=lambda x: x['index']) + + logger.info(f"Successfully processed {len(processed_slides)} slides") + + # After processing all slides + total_time = time.time() - start_time + logger.info("PowerPoint processing completed", { + "total_processing_time": total_time, + "slides_processed": len(processed_slides), + "avg_time_per_slide": total_time / len(processed_slides) if processed_slides else 0, + "final_memory_usage_gb": psutil.Process().memory_info().rss / (1024**3) + }) + + return JSONResponse({ + "status": "success", + "slides": processed_slides, + "processing_stats": { + "total_time": total_time, + "slides_processed": len(processed_slides), + "avg_time_per_slide": total_time / len(processed_slides) if processed_slides else 0 + } + }) + + except Exception as inner_error: + logger.error(f"Inner error: {str(inner_error)}") + logger.error(traceback.format_exc()) + raise + + except Exception as e: + logger.error(f"Error processing PowerPoint: {str(e)}") + logger.error(f"Python version: {sys.version}") + logger.error(f"Traceback: {traceback.format_exc()}") + return JSONResponse({ + "status": "error", + "message": f"Failed to process PowerPoint: {str(e)}" + }, status_code=500) \ No newline at end of file diff --git a/routers/assets/shared.py b/routers/assets/shared.py new file mode 100644 index 0000000..e69de29 diff --git a/routers/assets/word.py b/routers/assets/word.py new file mode 100644 index 0000000..7bc386d --- /dev/null +++ b/routers/assets/word.py @@ -0,0 +1,418 @@ +import os +from modules.logger_tool import initialise_logger +logger = initialise_logger(log_name="word", log_level=os.getenv("LOG_LEVEL"), log_dir=os.getenv("LOG_PATH"), log_format="default", runtime=True) + +from fastapi import APIRouter, UploadFile, File, HTTPException +from fastapi.responses import JSONResponse +from pathlib import Path +import tempfile +from PIL import Image +import io +import base64 +import traceback +import sys +import subprocess +from concurrent.futures import ThreadPoolExecutor, as_completed, TimeoutError +import asyncio +import psutil +import math +import time +from docx import Document + +router = APIRouter() + +# Global semaphore to control total concurrent Word processing +MAX_CONCURRENT_PROCESSING = 4 # Adjust based on server capacity +processing_semaphore = asyncio.Semaphore(MAX_CONCURRENT_PROCESSING) + +def calculate_optimal_workers(): + """Calculate optimal number of worker threads based on system resources.""" + cpu_count = os.cpu_count() or 4 + available_memory = psutil.virtual_memory().available + memory_per_worker = 500 * 1024 * 1024 # 500MB per worker estimate + + # Calculate workers based on CPU and memory constraints + cpu_based_workers = max(1, cpu_count - 1) # Leave one core free + memory_based_workers = max(1, int(available_memory / memory_per_worker)) + + # Take the minimum of CPU and memory-based calculations + optimal_workers = min(cpu_based_workers, memory_based_workers) + + # Cap at a reasonable maximum + final_workers = min(optimal_workers, 8) # Maximum 8 workers per process + + logger.info("Resource utilization:", { + "total_cpus": cpu_count, + "available_memory_gb": available_memory / (1024**3), + "cpu_based_workers": cpu_based_workers, + "memory_based_workers": memory_based_workers, + "final_workers": final_workers + }) + + return final_workers + +def extract_text_from_paragraph(paragraph): + """Extract text from a Word paragraph and format as markdown.""" + text = paragraph.text.strip() + if not text: + return '' + + # Handle different heading levels + if paragraph.style.name.startswith('Heading'): + level = int(paragraph.style.name[-1]) + return f"{'#' * level} {text}" + + # Handle lists + if paragraph._element.pPr is not None and paragraph._element.pPr.numPr is not None: + return f"* {text}" + + return text + +def extract_text_from_table(table): + """Extract text from a Word table and format as markdown.""" + # Process header row + header_row = [] + header_row.extend((cell.text.strip() or ' ') for cell in table.rows[0].cells) + table_text = [ + '| ' + ' | '.join(header_row) + ' |', + '|' + '---|' * (len(header_row) - 1) + '---|', + ] + # Process remaining rows + for row in table.rows[1:]: + row_text = [] + row_text.extend((cell.text.strip() or ' ') for cell in row.cells) + table_text.append('| ' + ' | '.join(row_text) + ' |') + + return '\n'.join(table_text) + +def extract_page_text(doc, page_index): + """Extract text from a Word document page and format as markdown.""" + # Note: python-docx doesn't provide direct page access, so we'll use a heuristic + # to group paragraphs into pages based on content length + CHARS_PER_PAGE = 3000 # Approximate characters per page + + all_blocks = [] + current_chars = 0 + current_page = 0 + + for element in doc.element.body: + if current_page > page_index: + break + + if element.tag.endswith('p'): + paragraph = doc.paragraphs[len(all_blocks)] + if text := extract_text_from_paragraph(paragraph): + current_chars += len(text) + if current_page == page_index: + all_blocks.append(text) + elif element.tag.endswith('tbl'): + table = doc.tables[sum(isinstance(b, str) for b in all_blocks)] + if text := extract_text_from_table(table): + current_chars += len(text) + if current_page == page_index: + all_blocks.append(text) + + if current_chars >= CHARS_PER_PAGE: + current_page += 1 + current_chars = 0 + + return '\n\n'.join(all_blocks) + +def process_page(temp_dir: str, pdf_path: str, docx_path: str, page_info: tuple, timeout: int = 30) -> dict: + """ + Worker function to process a single page and maintain A4 proportions. + Args: + temp_dir: Path to temporary directory + pdf_path: Path to PDF file + docx_path: Path to Word file + page_info: Tuple of (index, page_number) + timeout: Maximum time in seconds to process a single page + Returns: + dict: Processed page information + """ + i, page_idx = page_info + page_num = page_idx + 1 # PDF pages are 1-indexed + output_prefix = str(Path(temp_dir) / f"page_{page_num}") + + try: + # Extract text from Word document + doc = Document(docx_path) + page_text = extract_page_text(doc, page_idx) + + # Convert PDF page to PNG with timeout + process = subprocess.Popen( + [ + 'pdftoppm', + '-png', + '-singlefile', + '-f', + str(page_num), + '-l', + str(page_num), + '-r', + '600', # High resolution for better quality + pdf_path, + output_prefix, + ], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE + ) + + try: + stdout, stderr = process.communicate(timeout=timeout) + except subprocess.TimeoutExpired: + process.kill() + raise TimeoutError(f"Page {page_num} processing timed out after {timeout} seconds") + + if process.returncode != 0: + raise Exception(f"pdftoppm failed for page {page_num}: {stderr.decode()}") + + output_file = f"{output_prefix}.png" + if not Path(output_file).exists(): + raise Exception(f"Could not find output file for page {page_num}") + + # Open and process the image + with Image.open(output_file) as img: + result = _process_image(img, i) + if result['success']: + result['meta'] = { + 'text': page_text, + 'format': 'markdown' + } + return result + except Exception as e: + logger.error(f"Error processing page {page_num}: {str(e)}") + return { + "index": i, + "error": str(e), + "success": False, + } + +def _process_image(img: Image.Image, index: int) -> dict: + """Process a single image, maintaining A4 proportions.""" + try: + # Determine orientation and target dimensions + is_portrait = img.height > img.width + target_height = 720 # Fixed height to match frontend slide height + + if is_portrait: + # A4 portrait ratio is 210:297 + target_width = int(target_height * (210/297)) + else: + # A4 landscape ratio is 297:210 + target_width = int(target_height * (297/210)) + + # Resize image maintaining aspect ratio + img = img.resize((target_width, target_height), Image.Resampling.LANCZOS) + + # Convert to base64 + buffered = io.BytesIO() + img.save(buffered, format="PNG", optimize=True) + img_str = base64.b64encode(buffered.getvalue()).decode() + + return { + "index": index, + "data": f"data:image/png;base64,{img_str}", + "success": True, + "dimensions": { + "width": target_width, + "height": target_height, + "orientation": "portrait" if is_portrait else "landscape" + } + } + except Exception as e: + logger.error(f"Error processing image for page {index}: {str(e)}") + return { + "index": index, + "error": str(e), + "success": False, + } + +async def process_pages_in_chunks(temp_dir: str, pdf_path: str, docx_path: str, visible_pages: list, chunk_size: int = 5): + """Process pages in chunks to manage memory better.""" + all_processed_pages = [] + num_workers = calculate_optimal_workers() + total_chunks = math.ceil(len(visible_pages) / chunk_size) + + logger.info("Starting page processing:", { + "total_pages": len(visible_pages), + "chunk_size": chunk_size, + "total_chunks": total_chunks, + "workers_per_chunk": num_workers + }) + + # Process pages in chunks + for chunk_index in range(0, len(visible_pages), chunk_size): + chunk = visible_pages[chunk_index:chunk_index + chunk_size] + processed_chunk = [] + current_chunk_num = (chunk_index // chunk_size) + 1 + + logger.info(f"Processing chunk {current_chunk_num}/{total_chunks}", { + "chunk_size": len(chunk), + "chunk_start_index": chunk_index, + "memory_usage_gb": psutil.Process().memory_info().rss / (1024**3) + }) + + start_time = time.time() + with ThreadPoolExecutor(max_workers=num_workers) as executor: + # Submit chunk of tasks + future_to_page = { + executor.submit( + process_page, temp_dir, pdf_path, docx_path, page_info + ): page_info + for page_info in chunk + } + + # Process completed tasks as they finish + for future in as_completed(future_to_page): + try: + result = future.result(timeout=60) # Increased timeout to 60 seconds per page + if result.get('success', False): + processed_chunk.append(result) + page_info = future_to_page[future] + logger.debug(f"Processed page {page_info[1] + 1}", { + "success": result.get('success', False), + "processing_time": time.time() - start_time + }) + except TimeoutError: + page_info = future_to_page[future] + logger.error(f"Timeout processing page {page_info[1] + 1}") + except Exception as e: + page_info = future_to_page[future] + logger.error(f"Error processing page {page_info[1] + 1}: {str(e)}") + + chunk_time = time.time() - start_time + logger.info(f"Completed chunk {current_chunk_num}/{total_chunks}", { + "processed_pages": len(processed_chunk), + "chunk_processing_time": chunk_time, + "avg_time_per_page": chunk_time / len(chunk) if chunk else 0 + }) + + all_processed_pages.extend(processed_chunk) + + # Small delay between chunks to allow other tasks to process + await asyncio.sleep(0.1) + + return all_processed_pages + +@router.post("/convert") +async def convert_docx_to_images(file: UploadFile = File(...)): + try: + async with processing_semaphore: # Control concurrent processing + start_time = time.time() + # Log request details + logger.info( + "Received file upload request", + { + "filename": file.filename, + "content_type": file.content_type, + "current_memory_usage_gb": psutil.Process() + .memory_info() + .rss + / (1024**3), + "cpu_percent": psutil.cpu_percent(interval=1), + }, + ) + + # Validate file + if not file.filename.endswith('.docx'): + logger.error("Invalid file type") + return JSONResponse({ + "status": "error", + "message": "Invalid file type. Please upload a .docx file" + }, status_code=400) + + # Create a temporary directory to store the Word file + with tempfile.TemporaryDirectory() as temp_dir: + docx_path = Path(temp_dir) / "document.docx" + pdf_path = Path(temp_dir) / "document.pdf" + + logger.debug(f"Saving file to temporary path: {docx_path}") + + try: + # Save uploaded file + content = await file.read() + logger.debug(f"Read file content, size: {len(content)} bytes") + + with open(docx_path, "wb") as buffer: + buffer.write(content) + logger.debug("File saved successfully") + + if not docx_path.exists() or docx_path.stat().st_size == 0: + raise Exception("Failed to save file or file is empty") + + # Convert Word to PDF using LibreOffice + logger.debug("Converting Word to PDF") + result = subprocess.run([ + 'soffice', + '--headless', + '--convert-to', 'pdf', + '--outdir', str(temp_dir), + str(docx_path) + ], check=True, capture_output=True, text=True) + + if not pdf_path.exists(): + raise Exception("PDF file was not created") + + logger.debug(f"PDF created successfully at {pdf_path}, size: {pdf_path.stat().st_size} bytes") + + # Get number of pages using pdfinfo + result = subprocess.run(['pdfinfo', str(pdf_path)], capture_output=True, text=True) + pages_line = [line for line in result.stdout.split('\n') if line.startswith('Pages:')][0] + num_pages = int(pages_line.split(':')[1].strip()) + + visible_pages = [(i, i) for i in range(num_pages)] + + if num_pages == 0: + logger.warning("No pages found in document") + return JSONResponse({ + "status": "error", + "message": "No pages found in document" + }, status_code=400) + + logger.info(f"Processing {num_pages} pages") + + # Calculate chunk size based on number of pages + chunk_size = min(5, max(2, math.ceil(num_pages / 4))) + processed_pages = await process_pages_in_chunks(str(temp_dir), str(pdf_path), str(docx_path), visible_pages, chunk_size) + + if not processed_pages: + raise Exception("Failed to process any pages successfully") + + # Sort pages by index + processed_pages.sort(key=lambda x: x['index']) + + logger.info(f"Successfully processed {len(processed_pages)} pages") + + # After processing all pages + total_time = time.time() - start_time + logger.info("Word document processing completed", { + "total_processing_time": total_time, + "pages_processed": len(processed_pages), + "avg_time_per_page": total_time / len(processed_pages) if processed_pages else 0, + "final_memory_usage_gb": psutil.Process().memory_info().rss / (1024**3) + }) + + return JSONResponse({ + "status": "success", + "slides": processed_pages, # Using same format as PowerPoint for consistency + "processing_stats": { + "total_time": total_time, + "pages_processed": len(processed_pages), + "avg_time_per_page": total_time / len(processed_pages) if processed_pages else 0 + } + }) + + except Exception as inner_error: + logger.error(f"Inner error: {str(inner_error)}") + logger.error(traceback.format_exc()) + raise + + except Exception as e: + logger.error(f"Error processing Word document: {str(e)}") + logger.error(f"Python version: {sys.version}") + logger.error(f"Traceback: {traceback.format_exc()}") + return JSONResponse({ + "status": "error", + "message": f"Failed to process Word document: {str(e)}" + }, status_code=500) diff --git a/routers/auth.py b/routers/auth.py new file mode 100644 index 0000000..3c4290a --- /dev/null +++ b/routers/auth.py @@ -0,0 +1,139 @@ +from fastapi import APIRouter, Request, Response, HTTPException, Form, Body +from fastapi.responses import HTMLResponse, RedirectResponse +from fastapi.templating import Jinja2Templates +from typing import Dict +import os +from modules.logger_tool import initialise_logger +from modules.database.services.admin_service import AdminService +from modules.database.services.auth_service import auth_service + +router = APIRouter() +templates = Jinja2Templates(directory="templates") +logger = initialise_logger(__name__, os.getenv("LOG_LEVEL"), os.getenv("LOG_PATH"), 'default', True) + +# Initialize services +admin_service = AdminService() + +async def verify_admin(request: Request) -> Dict: + """Verify that the user is an admin and has necessary permissions""" + session = request.cookies.get("sb-access-token") + return await auth_service.verify_admin(session) + +@router.get("/admin", response_class=HTMLResponse) +async def admin_root(request: Request): + """Root admin route - redirects to login or dashboard""" + try: + admin = await verify_admin(request) + return RedirectResponse(url="/api/admin/", status_code=303) + except HTTPException: + # Check if super admin exists + has_super_admin = await auth_service.check_super_admin_exists() + if not has_super_admin: + return RedirectResponse(url="/api/admin/login?init=true", status_code=303) + return RedirectResponse(url="/api/admin/login", status_code=303) + +@router.get("/admin/login", response_class=HTMLResponse) +async def login_page( + request: Request, + error: str = None, + success: str = None, + init: bool = False +): + """Render admin login page""" + # Check if super admin exists + has_super_admin = await auth_service.check_super_admin_exists() + + # If no super admin and init flag is true, show initialization form + if not has_super_admin: + expected_email = os.getenv("VITE_SUPER_ADMIN_EMAIL") + return templates.TemplateResponse( + "admin/login.html", + { + "request": request, + "error": error, + "success": success, + "init_super_admin": True, + "expected_super_admin_email": expected_email + } + ) + + return templates.TemplateResponse( + "admin/login.html", + { + "request": request, + "error": error, + "success": success, + "init_super_admin": False + } + ) + +@router.post("/admin/login") +async def login( + request: Request, + response: Response, + email: str = Form(...), + password: str = Form(...) +): + """Handle admin login""" + try: + # Login with auth service + auth_result = await auth_service.login_admin(email, password) + + # Set session cookie and redirect + response = RedirectResponse(url="/api/admin/", status_code=303) + response.set_cookie( + "sb-access-token", + auth_result["access_token"], + httponly=True, + secure=True + ) + return response + + except HTTPException as e: + return RedirectResponse( + url=f"/api/admin/login?error={str(e.detail)}", + status_code=303 + ) + except Exception as e: + logger.error(f"Login error: {str(e)}") + return RedirectResponse( + url=f"/api/admin/login?error={str(e)}", + status_code=303 + ) + +@router.post("/admin/logout") +async def logout(response: Response): + """Handle admin logout""" + try: + response = RedirectResponse(url="/api/admin/login", status_code=303) + response.delete_cookie("sb-access-token") + return response + except Exception as e: + logger.error(f"Logout error: {str(e)}") + raise HTTPException(status_code=500, detail="Logout failed") + +@router.post("/admin/initialize-super-admin") +async def initialize_super_admin( + admin_data: Dict = Body(...), + request: Request = None +): + """Initialize the super admin account""" + try: + # Validate required fields + required_fields = ["email", "password", "display_name"] + for field in required_fields: + if field not in admin_data: + raise HTTPException(status_code=400, detail=f"Missing required field: {field}") + + # Set up super admin + admin_service = AdminService() + result = admin_service.setup_super_admin(admin_data) + + return { + "status": "success", + "message": "Super admin account created successfully! Please log in with your credentials.", + "admin": result + } + except Exception as e: + logger.error(f"Error initializing super admin: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) diff --git a/routers/connections/__init__.py b/routers/connections/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/routers/connections/__pycache__/__init__.cpython-311.pyc b/routers/connections/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..97fe55b181cbf9e61db136418a3b3c73396a16e3 GIT binary patch literal 145 zcmZ3^%ge<81b?;MGeGoX5CH>>P{wCAAY(d13PUi1CZpdUa@|Bd}dx|NqoFsLFF$Fo80`A(wtPgB37U#kg>)5K;i>4 PBO~Jn1{hJq3={(ZVTK>O literal 0 HcmV?d00001 diff --git a/routers/connections/__pycache__/arbor_router.cpython-311.pyc b/routers/connections/__pycache__/arbor_router.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f5ecf9c5afd73c520e8ebf0598eff25957f008a1 GIT binary patch literal 2039 zcmah}-D?|15a0XIw{>b8CBarqu1P3S(pYKYCLxWR%J$V3mOqf>mgwcUXxH{RwoctU zg;te8q=6>I&^{CrXaaspU6O}F|AjvE@e~9V2Z2HfRBtM#FM&d5PqHkhE!mIR*`3+n z&dl!Y_u+65LHYaC)XFsxq2JkLw|KhD&I4fXA&fA$hSs?}x6bEzj?MWsAuqV2m=|Fb z);#Opyq7~fBHSa`^>`Nx<$YKre(WKEB@ugXi}@h&ZH0Q`J_h?9aj+A5r(i!BV0&R- z;I{Y@Y8dlb6c4tTYMgfh$%RzLC|iU&;ptp%LHV>mN|tUE=i;0bxPD<2lY)VX9LbvbafVqdPK3Ns*w`{9V2Fl%nx&2xj9Oki5Mc<)^yv~8OV&(Fr zYldvC5c#@hk_)4e4o^#CmPWczeZ0#jh^0~sz*l~ z(b3v$b0B69pV=ZnSPPBV;>ZqcLX}_wYnGPyT*n&@uj2xD1hm zI+dAUT<8;L)pKXhoo8g!)f~=FOe>R%X=PH)rDl~}ay+f5+4Oua>xz$$E7Qr3QgBo< zt)}KCQj^LYh%(B;d?v^6*=dKbT~yObHakDphXI1Pr^TL5i$%Z1Lehe-54BiW^>0B^ zIXDS#Qcg|EMZ=QKa;aoci(vR)LZ+ozWm9!O5lAvi)7Ri<@pTfyZ2bZdm7^cRD#4J_ z@)EHMD>8fG@)9-H5DXcvHRvz-!a>FjKTODC$HGbk}WOQrR9dSZ2Om+p#xu!eKmIX>gH8j z9HJ695|0(jYob8StxXiExwVOo*!$aWfj909 z-i>X>YTmXeaEYx0Z3M%1)E! dict: + """Decode the base64 token and return the appropriate header.""" + decoded_token = b64decode(token).decode('utf-8') + return {"Authorization": f"Basic {token}"} + +@router.get("/data/{id}") +async def fetch_arbor_data(id: int, token: str): + url_mapping = { + 1: os.environ["KS3_COURSE_CLASS_MEMBERSHIP_URL"], + 2: os.environ["TEACHING_GROUP_MEMBERSHIPS_2023_2024_URL"], + 3: os.environ["SCHEDULED_TIMETABLE_SLOTS_URL"], + 4: os.environ["BEHAVIOURAL_INCIDENTS_REPORTING_URL"], + 5: os.environ["Y7_LESSON_TIMETABLE_URL"] + } + if id not in url_mapping: + raise HTTPException(status_code=404, detail="Data ID not supported") + + headers = get_basic_auth_header(token) + response = requests.get(url_mapping[id], headers=headers) + if response.status_code != 200: + raise HTTPException(status_code=response.status_code, detail="Failed to fetch data from Arbor") + return response.json() diff --git a/routers/connections/handleID_3.py b/routers/connections/handleID_3.py new file mode 100644 index 0000000..d372987 --- /dev/null +++ b/routers/connections/handleID_3.py @@ -0,0 +1,19 @@ +import sys +import json + +def filter_by_staff(data, staff_name="Kevin Carter"): + return [entry for entry in data if entry.get("Staff") == staff_name] + +if __name__ == "__main__": + if len(sys.argv) > 1: + staff_name = sys.argv[1] + else: + staff_name = "Kevin Carter" + + input_data = sys.stdin.read() + try: + data = json.loads(input_data) + filtered_data = filter_by_staff(data, staff_name) + print(json.dumps(filtered_data, indent=4)) + except json.JSONDecodeError: + print("Invalid JSON input", file=sys.stderr) \ No newline at end of file diff --git a/routers/connections/ollama_format_timetable.py b/routers/connections/ollama_format_timetable.py new file mode 100644 index 0000000..64a0e32 --- /dev/null +++ b/routers/connections/ollama_format_timetable.py @@ -0,0 +1,34 @@ +import os +import sys +import json +import requests + +def format_timetable_with_ollama(timetable_data): + url = f"{os.environ.get('APP_API_URL')}/llm/private/ollama/ollama_generate" + headers = {"Content-Type": "application/json"} + prompt = ( + "Create a markdown formatted table of the following timetable data. " + "The table should have columns for 'Day', 'Time Slot', 'Effective Dates', 'Event', 'Room', and 'Staff':\n\n" + f"{json.dumps(timetable_data, indent=4)}" + ) + payload = { + "model": "llama3", # Adjust the model name if necessary + "prompt": prompt + } + + response = requests.post(url, headers=headers, json=payload) + if response.status_code == 200: + return response.json().get("response") + else: + raise Exception(f"Failed to get response from Ollama: {response.status_code} {response.text}") + +if __name__ == "__main__": + input_data = sys.stdin.read() + try: + timetable_data = json.loads(input_data) + markdown_table = format_timetable_with_ollama(timetable_data) + print(markdown_table) + except json.JSONDecodeError: + print("Invalid JSON input", file=sys.stderr) + except Exception as e: + print(f"Error: {e}", file=sys.stderr) \ No newline at end of file diff --git a/routers/connections/openai_format_timetable.py b/routers/connections/openai_format_timetable.py new file mode 100644 index 0000000..c7283dc --- /dev/null +++ b/routers/connections/openai_format_timetable.py @@ -0,0 +1,45 @@ +import sys +import os +import json +import requests + +def format_timetable_with_openai(timetable_data): + url = f"{os.environ.get('APP_API_URL')}/llm/public/openai/openai_general_prompt" + headers = {"Content-Type": "application/json"} + prompt = ( + "Create a markdown formatted table of the following timetable data. " + "The table should have columns for 'Day', 'Time Slot', 'Effective Dates', 'Event', 'Room', and 'Staff':\n\n" + f"{json.dumps(timetable_data, indent=4)}" + ) + payload = { + "model": "gpt-4-turbo", # Adjust the model name if necessary + "prompt": prompt, + "max_tokens": 1500, + "temperature": 0.7, + "top_p": 1.0, + "n": 1, + "stop": None + } + + response = requests.post(url, headers=headers, json=payload) + if response.status_code == 200: + return response.json().get("response") + else: + raise Exception(f"Failed to get response from OpenAI: {response.status_code} {response.text}") + +if __name__ == "__main__": + input_data = sys.stdin.read() + try: + timetable_data = json.loads(input_data) + markdown_table = format_timetable_with_openai(timetable_data) + + # Save the markdown table to a .md file + output_file = "timetable.md" + with open(output_file, "w") as file: + file.write(markdown_table) + + print(f"Markdown table saved to {output_file}") + except json.JSONDecodeError: + print("Invalid JSON input", file=sys.stderr) + except Exception as e: + print(f"Error: {e}", file=sys.stderr) \ No newline at end of file diff --git a/routers/database/__init__.py b/routers/database/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/routers/database/__pycache__/__init__.cpython-311.pyc b/routers/database/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..91e8fda36975ac58a98f96fdb55654082ff526b8 GIT binary patch literal 142 zcmZ3^%ge<81b?;MGeGoX5CH>>P{wCAAY(d13PUi1CZpd2X#0(Sz0N7d{N&o-= literal 0 HcmV?d00001 diff --git a/routers/database/department.py b/routers/database/department.py new file mode 100644 index 0000000..2c5f3a7 --- /dev/null +++ b/routers/database/department.py @@ -0,0 +1,4 @@ +from fastapi import APIRouter, Depends, File, UploadFile +from backend.app.run.dependencies import admin_dependency + +router = APIRouter() diff --git a/routers/database/handle_connection.py b/routers/database/handle_connection.py new file mode 100644 index 0000000..fde870a --- /dev/null +++ b/routers/database/handle_connection.py @@ -0,0 +1,14 @@ +from fastapi import APIRouter, Depends +from backend.app.run.dependencies import admin_dependency + +import modules.database.tools.neo4j_driver_tools as driver +import modules.database.tools.neo4j_session_tools as session +import modules.database.tools.neo4j_http_tools as http +import modules.database.tools.queries as query + +router = APIRouter() + +# Handle neo4j driver +@router.post("/create-driver") +async def create_driver(driver: driver.Neo4jDriver = Depends(driver.get_neo4j_driver)): + return driver \ No newline at end of file diff --git a/routers/database/init/__init__.py b/routers/database/init/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/routers/database/init/__pycache__/__init__.cpython-311.pyc b/routers/database/init/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f0daf5ac6d681f8403bec7408edab084e98607c6 GIT binary patch literal 147 zcmZ3^%ge<81b?;MGeGoX5CH>>P{wCAAY(d13PUi1CZpd}>C#17J>vY~=rnEfnhw4@km&K5@?{G^5n@S)+U4?lJ?1Hliu zu|?_p^z_u|wLGa9s#ad<$mA)3KPSCp#~_p0oRdLVHxz2HO%Yp!ow!`DVi-z(K4)mH z4d%)a(2fvD$hhtZc>r>&F^GK$0CyKkkPs*2pvZB%nhL} zZcEqm#bzv21<0CzExNR=g#$)>TdE4}x(|0VvxwJUBl03_5 zsFvqsuZl7NLS6~T1*(|tX!x2nLQ)Sk^T#iKj5pOravg0-W20^qj#ca&z1Xg zK%hU)y7O-{?pzmV8sdy8&RCJ88QHfPP28QhGhz0TdbH4p7R+d2GrqSGKXL!cqlG5} z=0x5km3n-!5nnXL#h06r?k3`e)7ykalnc~n(XiWj!z^t>QxHX&{PNAo%@W>J0(<4J8vhP<}06xu+O{Vuk zVVp;evO7TiKx|&q?L#8M{rvRxPtp2Ij==vjyTUFD{v00)DFW! z&Q+s(ndf7kSFZwt%&$IJCR*9hK=b+_dpsE~X$Lbn^qK)H*^-gvyhHc{~yo`SU~hJkXPbqH;wn{yCAZs zO1}ZL>Ek%gLdVU2>lTXCBC8iyFW$bicBzi~8>rtz{T2$b9gFE81bj_cWzo zgny2J{KZHu*z7>u8O}r>?CcgAGXJYv=nb>ITd2=$?-n{>w)bbDuGPNVskKxs@Qe$7 zmAaWSrTukIZg6sw7db#RkoC8m>Cri7dg4xIe$Ek_2z|kg^IN=U^4y2`18q(m1^Nz@ F;UB*6d&vL* literal 0 HcmV?d00001 diff --git a/routers/database/init/__pycache__/curriculum.cpython-311.pyc b/routers/database/init/__pycache__/curriculum.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a619b2cdedc563cd7c40ba8291eca8f90313d30d GIT binary patch literal 3319 zcmb_eO>Emn79LU*DT$V1N&b{W-LxANC<^4qby7P{v58wi7lPJMHoc^% zC8=y|sDRKdP#4G{1q!Se=>k4^8zhHdPd)b71@=HKbRY%@U|=uZn}W2L00sJHDA}@| zqQ&lxW*#5k%)Iyb-uGtow`4Mbp#5-WZgn(<(7)-+pr!iEvsE6UKO>AVXCjNMa28+T zIm9EKgTe2>vWJ5`XorJ07-8e+F5Zk(BJ3$x(TWJNNJWC3ku|UwHZ0)i4p?~zBW#s8 ztPt0jcT}Pu-XUV?;0`^mOE`w(j}ki~Xo3;8ip*?}Sjj4QZKW7JRvGR4mOdcQR5DC1 zn^|kDGRF83bKIJ!OjwhZNh?>$S@}wyef`A2FRx7LQ`?1s)!`>j9*hcn*(6RKk>wA| zYCJxs=kTb0ye8oE$I(Ofe)W^~GDmd(B75N15g+~+Sxp@HkF)x5JO*PN#sqxN2%bFh zJtr`K6Dhg>(9kJ7kxg5}Dz-hnew)ZOqds_9B&W58p*nWc(;ZjEnx`#muC5w&!&9qG z$1$o+vuTmo!i_ogy^FW5ZbZwbz2cHM6)eoYKf6GpS7t9Q&D|mr)@xeR^c0Z@b-y=%W? z-Vxy)x+}5NpdZ6{;T_ntktsKs=-j@)B_f0-@Ulu>sqWPR#6y7bCm7HE4rCs2P>(IN z27K5s_xlLtoG9jT1Pfn4B)y^i+e3VR3p{YN#ob4LuFxoC6cAPuC}6Yc1I_ciPrS0c_h#LSrhLJ}0Yp=Ot6uUITTpD9C>%6({;2hc84 z1Lb`+rN%l*hYk$cb6y1{RI|GbN8BuXg3D zzHs#!SV0^40g}V-9|AOy`ypvI4ZQclsw~x?`J=w<8lJv4Nvo~8ha^x>k;riWEinH_ z+(+&sEHd;9|0VjxVf16E#nVb^@vTTpXhk2zcA{_x!3f)jl9wFtP%C@&1+^l!q#elq zLsq|Z4OB~f(a8bliIVY&(Bqc>kPEj&V$tWc+QF0mxtlUHHAyv*=)u@Y+9zKQlDVENX2qun$aj>q=f6*(k?B6-zbSO&rLMf>3ro%n_@|sC zVt6k(G;0n$A_;H1Bx~8YY3go?o+i4ZdT=Mudu;zj3}3<N%n zwiM>i9XuISh}1tAoivR}hLS8LV>CKqc%%X9Y}X?Z*K^ou#q$0Dv8XbLJdeE<+J4)a zgMIXmq@XxB$K8zo-XDZp)kVoAaMuzk9udrn+d#M^gccx7ja1r~QLHkbm8d z1&QqD^j+oNyW3JHG1E=Vw51?X*nFj%C_5i)%|6JdVXEyVn7VZ|>;w~qB zQuwIgCr@>_=`J@Nl+S+p=I3t)L((C3>crORE%z_V z7s}9rUNXzQ51vpOB*uCX%Iqdbdr>AAQD(d+F*ZioIAarN94eNvBUC!1Bh*CwJ_G*s Nc(#aX4`&$EegpxHY~la_ literal 0 HcmV?d00001 diff --git a/routers/database/init/__pycache__/entity_init.cpython-311.pyc b/routers/database/init/__pycache__/entity_init.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ed0d9493c8114e50a7843a5b26bd8c30350f01e7 GIT binary patch literal 14434 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 literal 0 HcmV?d00001 diff --git a/routers/database/init/__pycache__/get_data.cpython-311.pyc b/routers/database/init/__pycache__/get_data.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..20d6685c91f11dbbe928ad463ea3bf65c9267758 GIT binary patch literal 2040 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 aJr@?bQM^^ncp6fW;Z#4!Bijkv5&r`zW@IS< literal 0 HcmV?d00001 diff --git a/routers/database/init/__pycache__/timetables.cpython-311.pyc b/routers/database/init/__pycache__/timetables.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1598fbd353e3b07cbae8ed7ef3d29360af9b9d18 GIT binary patch literal 9502 zcmc&ZTWB0tmbdy@-Cf=4*88oNCE02}q}b!ck>q5@k|oD_*xs>hM{OsawyGqx+z+|B zWXDP?h-BE&gg~5-C7zuOtDp5c8-L8gE_fgVvxJ2qvmduZ!4w4o!w}eo{b&;#LSSLf zxz%0W)sn|yVA<+hr|;w3bI-Yt^SJeoe!rK%^FRAfE%`eL`4bjOPq3KzcCVd~Pl!lF zE=f{cluOy7Hjdbc#KCL33uvF0`jEREl;AZU4tv>>_NblxJ5tW53+n7qH}teG^Cdjd zAv*8cpeMY>6ZHUwYngF}HBxmCm*}?kkUWxG<w?7&w*6)w*XM7#7@O3bH zh^>I%I{VQ9X<%!xBzfh(7__bo%x*vo?Wha>f7C6w#agLGtdpJ->)~yHw-MeZc$=l? z76M|+Pn}hA9)7Bvtvh7;i{)Ifi)~UZT4Mv2zD6N5rn5lIV{_+j$ZR{})br z#HRa_nYb7eGm4bHq5BpR=~Cg0-Wy*@#N^DXBFWj97+2y~<5?+|NGFt-l1NEVPD)vw zpFVpkcJ9RND{IcdWM(m|d$3}9{Nnhu?mRg@dg0Wp?iQtm_-ay#xO7K4o|1GAV8)Wt z4JoPfm|cl0OGa)Xk(6||yqd-#bT2k8WaLyF`+82CJN*;JkM5X2Jnw}SWS`|76M&}s zUzwdfH~!|lw4x+3X}xANK7VZyWJrs%@$9v1gwq=qB_)>5h*Iq8t=MWhaeWnJ5}|>= zkd@>!&;WVw`T3blQB zj;*dHM6ze_($#E2k#q-6#k{-XNMQb5c)$H`08@km6{nbri;$cxXU{ou&YbH$ zch?CD1zzJ>cjw5mi7DEyfqEoFc8YdXW1qq{P#i^6_}gNw<+70zT{-TTL_|s^?k~x& z9M;Xt5ye;TxooPmT$P$#=arfYJX5Xa_#BsW-vtgnH@SdK%AbiiWzhCS?nKaqAdH|J z!1pKOD=W#wd>j{g@J3o3$gD`|H&aPtyJQb#78Vlol9-uaO-X5GAiE+KtcS_1;BX?Q>WCix z-W6VuGpTUIBR2zUx-g$f!-0Zxa%%;4Gi>5T=%hOm>4l8W<0x$HZEq&^{&`?ak=XfK zkl}1(V@N8t5QouM62@L*`>KJRyyA8-$Jd*R1gaZ=mo}WMb_7qG#PVK*ovwTFkQ+>7 zJVmWflG^jlzzl+X9gjC@U!%ja7UUNx0TOhIj;dsabZFlD0q40KkQH;)Ps#EEQwCi5h(nnN3{NG-uUyt~Ks{8BQ>olcx}rDd0L4

) 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 WOB>Ak(Yw$!$Qs1xnyHv*%>MyH2df$Y literal 0 HcmV?d00001 diff --git a/routers/database/tools/__pycache__/default_nodes_router.cpython-311.pyc b/routers/database/tools/__pycache__/default_nodes_router.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..57b05150b55dfcc26a44178adc95709cfd6b55c2 GIT binary patch literal 9702 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 G`2PV(CD5|~ literal 0 HcmV?d00001 diff --git a/routers/database/tools/__pycache__/get_events.cpython-311.pyc b/routers/database/tools/__pycache__/get_events.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bbb31c92b9d4875b4fb6bc2d7f302a061b766dae GIT binary patch literal 5998 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 literal 0 HcmV?d00001 diff --git a/routers/database/tools/__pycache__/get_nodes_and_edges.cpython-311.pyc b/routers/database/tools/__pycache__/get_nodes_and_edges.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2b30e79200063980eb09b0cf5de102cfece46197 GIT binary patch literal 11714 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 literal 0 HcmV?d00001 diff --git a/routers/database/tools/__pycache__/tldraw_filesystem.cpython-311.pyc b/routers/database/tools/__pycache__/tldraw_filesystem.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e7cc29ffc593d210fd1af6a30bdde9dabd502a38 GIT binary patch literal 12291 zcmeHNYi!$AmL?@iB(0Y%%a6!;D1M|?9(GbY*(Pn1*oos;Y^RCaPQ2aGC?=iC)x)6Z zxC!Lc$P{R%2+-^xiw0N>AS`A(E+#*W#r(+6`LUBa-9KbOU=3mo1XvW<{!`Ho5EvL> z&mql+WNJoP%obQ|sjI`o`#9&^%S)c`9^T&s0(Ar&e>yn)ZfYMv{3l)*2eZw5_lk=k zJ|#GUBhy5NoFOx=85c>o2%dz$>ochKTcZu}83|YL*AEg~xzg?#w|1s7o*6IXxo2o- z>7F+<5FEvMJ_9Ykg};8xuu#K0uUUsVd}RwSN0+zYS)S$?j(t@3nHMC%Uq5Dipxc-B zX96>UOmHTc3C)BwyZq_;Ov6mWwvFMLFw_gA8#9rah?W;jH)WbYYx zRMxndR1YT?QVAiqDDpx+!6n7ywPc=8h`C%kpAgfWkX%a4rP6%Um?47jDK$ zl{%lA72zB`mrmyMLN1p%ms?1sbK(WlVkl+a%=5xzj^lyft&2}ALRNy$BvWZrn8@l&HxFc*k< z^Ktt};#aQn+e;E6ZB{1ib<685lbowSV*6#6$l6-CIQJu}{1IJt*I<{Y;GXvwavbdn z7^MU;Z`#Ot%kARm_q5'#LK(c~M%MyvJq>!R$%bBC1A2zRs*t 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 QMNtRL7WNY12F#rQ1~{r0SpWb4 literal 0 HcmV?d00001 diff --git a/routers/database/tools/__pycache__/worker_structure_router.cpython-311.pyc b/routers/database/tools/__pycache__/worker_structure_router.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de5d4f130de49718eb60f1f00ec9c4eb0eaa5eb1 GIT binary patch literal 8687 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 literal 0 HcmV?d00001 diff --git a/routers/database/tools/calendar_structure_router.py b/routers/database/tools/calendar_structure_router.py new file mode 100644 index 0000000..d5e6d73 --- /dev/null +++ b/routers/database/tools/calendar_structure_router.py @@ -0,0 +1,220 @@ +import os +from fastapi import APIRouter, HTTPException +from typing import List, Dict, Any, Optional +from datetime import datetime, timedelta +from modules.logger_tool import initialise_logger +from modules.database.tools import neo4j_driver_tools as driver_tools + +logger = initialise_logger(__name__, os.getenv("LOG_LEVEL"), os.getenv("LOG_PATH"), 'default', True) +router = APIRouter() + +@router.get("/get-calendar-structure") +async def get_calendar_structure(db_name: str) -> Dict[str, Any]: + """ + Get the complete calendar structure including years, months, weeks, and days. + """ + try: + # Get all calendar nodes in a single query + query = """ + // Match all calendar-related nodes + MATCH (y:CalendarYear) + OPTIONAL MATCH (y)-[:YEAR_INCLUDES_MONTH]->(m:CalendarMonth) + OPTIONAL MATCH (m)-[:MONTH_INCLUDES_DAY]->(d:CalendarDay) + OPTIONAL MATCH (w:CalendarWeek)-[:WEEK_INCLUDES_DAY]->(d) + WITH y, m, w, d + ORDER BY y.date, m.date, w.date, d.date + + // Collect all nodes with dates converted to strings + RETURN { + years: collect(DISTINCT { + id: y.unique_id, + path: y.path, + date: toString(y.date), + __primarylabel__: 'CalendarYear' + }), + months: collect(DISTINCT { + id: m.unique_id, + path: m.path, + date: toString(m.date), + __primarylabel__: 'CalendarMonth' + }), + weeks: collect(DISTINCT { + id: w.unique_id, + path: w.path, + date: toString(w.date), + __primarylabel__: 'CalendarWeek' + }), + days: collect(DISTINCT { + id: d.unique_id, + path: d.path, + date: toString(d.date), + week_id: w.unique_id, + month_id: m.unique_id, + __primarylabel__: 'CalendarDay' + }) + } as structure + """ + + with driver_tools.get_session(database=db_name) as session: + result = session.run(query) + record = result.single() + if not record: + raise HTTPException(status_code=404, detail="Calendar structure not found") + + structure = record["structure"] + + # Find current day using string comparison + today = datetime.now().strftime("%Y-%m-%d") + current_day = next( + (day["id"] for day in structure["days"] + if day["date"] == today), + structure["days"][0]["id"] if structure["days"] else None + ) + + return { + "status": "success", + "structure": { + "years": structure["years"], + "months": structure["months"], + "weeks": structure["weeks"], + "days": structure["days"], + "currentDay": current_day + } + } + + except Exception as e: + logger.error(f"Error getting calendar structure: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + +@router.get("/get-calendar-days") +async def get_calendar_days(db_name: str, start_date: str, end_date: str) -> Dict[str, Any]: + """ + Get all calendar days in a date range. + """ + try: + query = """ + MATCH (d:CalendarDay) + WHERE date(d.date) >= date($start_date) AND date(d.date) <= date($end_date) + OPTIONAL MATCH (w:CalendarWeek)-[:WEEK_INCLUDES_DAY]->(d) + OPTIONAL MATCH (m:CalendarMonth)-[:MONTH_INCLUDES_DAY]->(d) + RETURN { + id: d.unique_id, + path: d.path, + date: d.date, + week_id: w.unique_id, + month_id: m.unique_id, + __primarylabel__: 'CalendarDay' + } as day + ORDER BY d.date + """ + + with driver_tools.get_session(database=db_name) as session: + result = session.run(query, start_date=start_date, end_date=end_date) + days = [record["day"] for record in result] + + return { + "status": "success", + "days": days + } + + except Exception as e: + logger.error(f"Error getting calendar days: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + +@router.get("/get-calendar-weeks") +async def get_calendar_weeks(db_name: str, start_date: str, end_date: str) -> Dict[str, Any]: + """ + Get all calendar weeks in a date range. + """ + try: + query = """ + MATCH (w:CalendarWeek)-[:WEEK_INCLUDES_DAY]->(d:CalendarDay) + WHERE date(w.date) >= date($start_date) AND date(w.date) <= date($end_date) + WITH w, collect(d) as days + RETURN { + id: w.unique_id, + path: w.path, + date: w.date, + day_ids: [day in days | day.unique_id], + __primarylabel__: 'CalendarWeek' + } as week + ORDER BY w.date + """ + + with driver_tools.get_session(database=db_name) as session: + result = session.run(query, start_date=start_date, end_date=end_date) + weeks = [record["week"] for record in result] + + return { + "status": "success", + "weeks": weeks + } + + except Exception as e: + logger.error(f"Error getting calendar weeks: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + +@router.get("/get-calendar-months") +async def get_calendar_months(db_name: str, start_date: str, end_date: str) -> Dict[str, Any]: + """ + Get all calendar months in a date range. + """ + try: + query = """ + MATCH (m:CalendarMonth)-[:MONTH_INCLUDES_DAY]->(d:CalendarDay) + WHERE date(m.date) >= date($start_date) AND date(m.date) <= date($end_date) + WITH m, collect(d) as days + RETURN { + id: m.unique_id, + path: m.path, + date: m.date, + day_ids: [day in days | day.unique_id], + __primarylabel__: 'CalendarMonth' + } as month + ORDER BY m.date + """ + + with driver_tools.get_session(database=db_name) as session: + result = session.run(query, start_date=start_date, end_date=end_date) + months = [record["month"] for record in result] + + return { + "status": "success", + "months": months + } + + except Exception as e: + logger.error(f"Error getting calendar months: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + +@router.get("/get-calendar-years") +async def get_calendar_years(db_name: str) -> Dict[str, Any]: + """ + Get all calendar years. + """ + try: + query = """ + MATCH (y:CalendarYear)-[:YEAR_INCLUDES_MONTH]->(m:CalendarMonth) + WITH y, collect(m) as months + RETURN { + id: y.unique_id, + path: y.path, + date: y.date, + month_ids: [month in months | month.unique_id], + __primarylabel__: 'CalendarYear' + } as year + ORDER BY y.date + """ + + with driver_tools.get_session(database=db_name) as session: + result = session.run(query) + years = [record["year"] for record in result] + + return { + "status": "success", + "years": years + } + + except Exception as e: + logger.error(f"Error getting calendar years: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) \ No newline at end of file diff --git a/routers/database/tools/default_nodes_router.py b/routers/database/tools/default_nodes_router.py new file mode 100644 index 0000000..f835e46 --- /dev/null +++ b/routers/database/tools/default_nodes_router.py @@ -0,0 +1,257 @@ +from fastapi import APIRouter, HTTPException +from typing import Dict, Any +from modules.database.tools import neo4j_driver_tools as driver_tools +from modules.logger_tool import initialise_logger +from neo4j.time import DateTime, Date +import os +from datetime import datetime + +logger = initialise_logger(__name__, os.getenv("LOG_LEVEL"), os.getenv("LOG_PATH"), 'default', True) +router = APIRouter() + +def convert_neo4j_values(value: Any) -> Any: + """Convert Neo4j types to JSON-serializable types.""" + if isinstance(value, DateTime): + return value.isoformat() # Convert to ISO format string + elif isinstance(value, Date): + return value.isoformat() # Convert Date to ISO format string + elif isinstance(value, dict): + return {k: convert_neo4j_values(v) for k, v in value.items()} + elif isinstance(value, list): + return [convert_neo4j_values(v) for v in value] + return value + +def get_default_node_week(db_name: str) -> Dict[str, Any]: + """Get the current week node.""" + # Get today's date + today = datetime.now() + + # Find the calendar week node that contains today's date + query = """ + MATCH (w:CalendarWeek) + WHERE date(w.start_date) <= date($today) AND date($today) <= date(w.start_date) + duration('P7D') + RETURN w + """ + + with driver_tools.get_session(database=db_name) as session: + result = session.run(query, today=today.strftime('%Y-%m-%d')) + week_node = result.single() + + if not week_node: + raise HTTPException(status_code=404, detail="No default node found for context: week") + + node = week_node["w"] + node_data = dict(node) + converted_data = convert_neo4j_values(node_data) + + return { + "status": "success", + "node": { + "id": node["unique_id"], + "path": node["path"], + "type": "CalendarWeek", + "label": node.get("title", "Calendar Week"), + "data": converted_data + } + } + +def get_default_node_month(db_name: str) -> Dict[str, Any]: + """Get the current month node.""" + # Get today's date + today = datetime.now() + + # Find the calendar month node for the current month + query = """ + MATCH (m:CalendarMonth) + WHERE m.year = $year AND m.month = $month + RETURN m + """ + + with driver_tools.get_session(database=db_name) as session: + result = session.run(query, year=str(today.year), month=str(today.month)) + month_node = result.single() + + if not month_node: + raise HTTPException(status_code=404, detail="No default node found for context: month") + + node = month_node["m"] + node_data = dict(node) + converted_data = convert_neo4j_values(node_data) + + return { + "status": "success", + "node": { + "id": node["unique_id"], + "path": node["path"], + "type": "CalendarMonth", + "label": node.get("title", "Calendar Month"), + "data": converted_data + } + } + +@router.get("/get-default-node/{context}") +async def get_default_node(context: str, db_name: str, base_context: str | None = None) -> Dict[str, Any]: + """Get the default node for a given context.""" + try: + # Handle special cases for week and month + if context == 'week': + return get_default_node_week(db_name) + elif context == 'month': + return get_default_node_month(db_name) + + # Map contexts to their default node queries + context_queries = { + # Base Contexts + 'profile': """ + MATCH (n:User) + RETURN n LIMIT 1 + """, + 'worker': """ + MATCH (n) + WHERE n:SchoolAdmin OR n:Teacher OR n:Student OR n:Developer OR n:SuperAdmin + RETURN n LIMIT 1 + """, + 'calendar': """ + MATCH (n:Calendar) + RETURN n LIMIT 1 + """, + 'teaching': """ + MATCH (n:Teacher) + RETURN n LIMIT 1 + """, + 'school': """ + MATCH (n:School) + RETURN n LIMIT 1 + """, + 'department': """ + MATCH (n:Department) + RETURN n LIMIT 1 + """, + 'class': """ + MATCH (n:Class) + RETURN n LIMIT 1 + """, + + # Extended Contexts - Overview queries for each base context + 'overview': """ + MATCH (n) + WHERE CASE $base_context + WHEN 'profile' THEN n:User + WHEN 'calendar' THEN n:Calendar + WHEN 'teaching' THEN n:Teacher + WHEN 'school' THEN n:School + WHEN 'department' THEN n:Department + WHEN 'class' THEN n:Class + ELSE false + END + RETURN n LIMIT 1 + """, + + # Extended Contexts - User + 'settings': """ + MATCH (n:User) + RETURN n LIMIT 1 + """, + 'history': """ + MATCH (n:User) + RETURN n LIMIT 1 + """, + 'journal': """ + MATCH (n:Journal) + RETURN n LIMIT 1 + """, + 'planner': """ + MATCH (n:Planner) + RETURN n LIMIT 1 + """, + + # Extended Contexts - Calendar + 'day': """ + MATCH (n:CalendarDay) + WHERE date(n.date) = date() + RETURN n LIMIT 1 + """, + 'year': """ + MATCH (n:CalendarYear) + WHERE n.year = toString(date().year) + RETURN n LIMIT 1 + """, + + # Extended Contexts - Teaching + 'timetable': """ + MATCH (n:UserTeacherTimetable) + RETURN n LIMIT 1 + """, + 'classes': """ + MATCH (n:Class) + RETURN n LIMIT 1 + """, + 'lessons': """ + MATCH (n:TimetableLesson) + RETURN n LIMIT 1 + """, + + # Extended Contexts - School + 'departments': """ + MATCH (n:Department) + RETURN n LIMIT 1 + """, + 'staff': """ + MATCH (n:Teacher) + RETURN n LIMIT 1 + """, + + # Extended Contexts - Department + 'teachers': """ + MATCH (n:Teacher) + RETURN n LIMIT 1 + """, + 'subjects': """ + MATCH (n:Subject) + RETURN n LIMIT 1 + """, + + # Extended Contexts - Class + 'students': """ + MATCH (n:Student) + RETURN n LIMIT 1 + """ + } + + if context not in context_queries: + raise HTTPException(status_code=400, detail=f"Invalid context: {context}") + + query = context_queries[context] + + with driver_tools.get_session(database=db_name) as session: + # For overview context, we need to pass the database name as a parameter + params = {'db_name': db_name, 'base_context': base_context} if context == 'overview' else {} + result = session.run(query, params) + record = result.single() + + if not record: + raise HTTPException( + status_code=404, + detail=f"No default node found for context: {context}" + ) + + node = record["n"] + node_data = dict(node) + + # Convert Neo4j types to JSON-serializable types + converted_data = convert_neo4j_values(node_data) + + return { + "status": "success", + "node": { + "id": node["unique_id"], + "path": node["path"], + "type": list(node.labels)[0], + "label": node.get("title", ""), + "data": converted_data + } + } + + except Exception as e: + logger.error(f"Error getting default node: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) \ No newline at end of file diff --git a/routers/database/tools/default_school_contexts_router.py b/routers/database/tools/default_school_contexts_router.py new file mode 100644 index 0000000..e69de29 diff --git a/routers/database/tools/get_events.py b/routers/database/tools/get_events.py new file mode 100644 index 0000000..647defd --- /dev/null +++ b/routers/database/tools/get_events.py @@ -0,0 +1,101 @@ +from dotenv import load_dotenv, find_dotenv +load_dotenv(find_dotenv()) +import os +import modules.logger_tool as logger +log_name = 'api_routers_calendar_get_events' +log_dir = os.getenv("LOG_PATH", "/logs") # Default path as fallback +logging = logger.get_logger( + name=log_name, + log_level=os.getenv("LOG_LEVEL", "DEBUG"), + log_path=log_dir, + log_file=log_name, + runtime=True, + log_format='default' +) +import modules.database.tools.neo4j_driver_tools as driver +from fastapi import APIRouter, HTTPException +import colorsys +import random + +# Predefined vibrant color palette +BASE_COLORS = [ + "#FF4136", "#FF851B", "#FFDC00", "#2ECC40", "#0074D9", "#B10DC9", + "#F012BE", "#FF6F61", "#7FDBFF", "#01FF70", "#001f3f", "#85144b", + "#39CCCC", "#3D9970", "#e74c3c", "#e67e22", "#f1c40f", "#2ecc71", + "#1abc9c", "#3498db", "#9b59b6", "#34495e", "#16a085", "#27ae60", + "#2980b9", "#8e44ad", "#2c3e50", "#d35400", "#c0392b", "#bdc3c7", + "#7f8c8d", "#00a86b", "#8B4513", "#4B0082", "#800000", "#1E90FF" +] + +def generate_vibrant_color(): + h = random.random() + s = 0.5 + random.random() * 0.5 # 0.5 to 1.0 + v = 0.5 + random.random() * 0.5 # 0.5 to 1.0 + r, g, b = [int(x * 255) for x in colorsys.hsv_to_rgb(h, s, v)] + return f"#{r:02x}{g:02x}{b:02x}" + +# Extend the color palette +EXTENDED_COLOR_PALETTE = BASE_COLORS + [generate_vibrant_color() for _ in range(100)] + +def get_subject_class_color(subject_class): + # Use a hash function to generate a unique number for each subject class + hash_value = hash(subject_class) + + # Use the hash to select a color from the extended palette + color_index = hash_value % len(EXTENDED_COLOR_PALETTE) + color = EXTENDED_COLOR_PALETTE[color_index] + + return color + +router = APIRouter() + +@router.get("/get_teacher_timetable_events") +async def get_teacher_timetable_events( + unique_id: str, + worker_db_name: str +): + logging.info(f"Getting timetable events for teacher {unique_id} from database {worker_db_name}") + neo_driver = driver.get_driver(db_name=worker_db_name) + if neo_driver is None: + return {"status": "error", "message": "Failed to connect to the database"} + + try: + with neo_driver.session(database=worker_db_name) as neo_session: + query = """ + MATCH (t:Teacher {unique_id: $unique_id})-[:TEACHER_HAS_TIMETABLE]->(tt:TeacherTimetable) + -[:TIMETABLE_HAS_CLASS]->(sc:SubjectClass)-[:CLASS_HAS_LESSON]->(tl:TimetableLesson) + RETURN tl.unique_id as id, + tl.period_code as period_code, + COALESCE(sc.subject_class_code, 'Untitled Class') as subject_class, + tl.date as date, + tl.start_time as start_time, + tl.end_time as end_time, + tl.path as path + """ + result = neo_session.run(query, unique_id=unique_id) + + events = [] + for record in result: + start = f"{record['date']}T{record['start_time']}" + end = f"{record['date']}T{record['end_time']}" + title = f"{record['subject_class']}" + events.append({ + "id": record["id"], + "title": title, + "start": start, + "end": end, + "groupId": f"subject-class-{record['subject_class']}", + "extendedProps": { + "subjectClass": record['subject_class'], + "color": get_subject_class_color(record['subject_class']), + "periodCode": record['period_code'], + "path": record['path'] + } + }) + logging.info(f"Found {len(events)} events for teacher {unique_id}") + return {"status": "success", "events": events} + except Exception as e: + logging.error(f"Error fetching events: {str(e)}") + raise HTTPException(status_code=500, detail="Internal server error") + finally: + driver.close_driver(neo_driver) diff --git a/routers/database/tools/get_nodes.py b/routers/database/tools/get_nodes.py new file mode 100644 index 0000000..706ed5a --- /dev/null +++ b/routers/database/tools/get_nodes.py @@ -0,0 +1,563 @@ +from dotenv import load_dotenv, find_dotenv +load_dotenv(find_dotenv()) +import os +import modules.logger_tool as logger +log_name = 'api_routers_database_tools_get_nodes' +log_dir = os.getenv("LOG_PATH", "/logs") # Default path as fallback +logging = logger.get_logger( + name=log_name, + log_level=os.getenv("LOG_LEVEL", "DEBUG"), + log_path=log_dir, + log_file=log_name, + runtime=True, + log_format='default' +) +import modules.database.tools.neo4j_driver_tools as driver +import modules.database.tools.neo4j_session_tools as session +from modules.database.schemas.nodes.calendars import CalendarNode +from modules.database.schemas.nodes.schools.timetable import SchoolTimetableNode, AcademicYearNode, AcademicTermNode, AcademicWeekNode, AcademicDayNode, AcademicPeriodNode, RegistrationPeriodNode +from modules.database.schemas.nodes.users import UserNode +from modules.database.schemas.nodes.workers.workers import TeacherNode, StudentNode, DeveloperNode, SchoolAdminNode +from modules.database.schemas.nodes.schools.schools import SchoolNode, DepartmentNode, SubjectClassNode, RoomNode +from modules.database.schemas.nodes.workers.timetable import TeacherTimetableNode, TimetableLessonNode, PlannedLessonNode, UserTeacherTimetableNode +from fastapi import APIRouter, HTTPException, Query + +router = APIRouter() + +@router.get("/get-node") +async def get_node(unique_id: str = Query(...), db_name: str = Query(...)): + logging.info(f"Getting node for {unique_id} from database {db_name}") + neo_driver = driver.get_driver(db_name=db_name) + if neo_driver is None: + return {"status": "error", "message": "Failed to connect to the database"} + try: + with neo_driver.session(database=db_name) as neo_session: + query = """ + MATCH (n {unique_id: $unique_id}) + RETURN n + """ + result = neo_session.run(query, unique_id=unique_id) + record = result.single() + + if record: + node = record['n'] + node_labels = list(node.labels) + node_data = dict(node) + + try: + # Convert node based on its type + node_type = node_labels[0] if node_labels else "Unknown" + if node_type in globals(): + node_class = globals()[f"{node_type}Node"] + node_object = node_class(**node_data) + node_dict = node_object.to_dict() + else: + node_dict = node_data + + return { + "status": "success", + "node": { + "node_type": node_type, + "node_data": node_dict + } + } + except Exception as e: + logging.error(f"Error converting node to dict: {str(e)}") + return { + "status": "error", + "message": "Error processing node data", + "details": str(e) + } + else: + return {"status": "not_found", "message": "Node not found"} + except Exception as e: + logging.error(f"Error retrieving node: {str(e)}") + return {"status": "error", "message": "Internal server error"} + finally: + driver.close_driver(neo_driver) + +@router.get("/get-user-node") +async def get_user_node(user_id: str = Query(...)): + db_name = f"cc.users.{user_id}" + logging.info(f"Getting user node for user {user_id} from database {db_name}") + neo_driver = driver.get_driver(db_name=db_name) + if neo_driver is None: + return {"status": "error", "message": "Failed to connect to the database"} + + try: + with neo_driver.session(database=db_name) as neo_session: + nodes = session.find_nodes_by_label_and_properties(neo_session, "User", {"user_id": user_id}) + if nodes: + user_node = nodes[0] + data = UserNode(**user_node) + user_node_data = data.to_dict() + return {"status": "success", "user_node": user_node_data, "user_node_raw": nodes} + else: + return {"status": "not_found", "message": "User node not found"} + except Exception as e: + logging.error(f"Error retrieving user node: {str(e)}") + return {"status": "error", "message": "Internal server error"} + finally: + driver.close_driver(neo_driver) + +@router.get("/get-connected-nodes") +async def get_connected_nodes(unique_id: str = Query(...), db_name: str = Query(...)): + logging.info(f"Getting connected nodes for {unique_id} from database {db_name}") + neo_driver = driver.get_driver(db_name=db_name) + if neo_driver is None: + return {"status": "error", "message": "Failed to connect to the database"} + + try: + with neo_driver.session(database=db_name) as neo_session: + query = """ + MATCH (n {unique_id: $unique_id}) + OPTIONAL MATCH (n)-[]-(connected) + RETURN n, collect(connected) as connected_nodes + """ + result = neo_session.run(query, unique_id=unique_id) + record = result.single() + if record: + main_node = record['n'] + connected_nodes = record['connected_nodes'] + + main_node_labels = list(main_node.labels) + main_node_type = main_node_labels[0] if main_node_labels else "Unknown" + main_node_data = dict(main_node) + + try: + main_node_class = globals()[f"{main_node_type}Node"] + main_node_object = main_node_class(**main_node_data) + main_node_dict = main_node_object.to_dict() + except Exception as e: + logging.error(f"Error converting main node to dict: {str(e)}") + main_node_dict = main_node_data + + connected_nodes_list = [] + + for node in connected_nodes: + node_labels = list(node.labels) + node_type = node_labels[0] if node_labels else "Unknown" + node_data = dict(node) + try: + node_class = globals()[f"{node_type}Node"] + node_object = node_class(**node_data) + connected_node_dict = node_object.to_dict() + except Exception as e: + logging.error(f"Error converting connected node to dict: {str(e)}") + connected_node_dict = node_data + + connected_node_info = { + "node_type": node_type, + "node_data": connected_node_dict + } + connected_nodes_list.append(connected_node_info) + + logging.debug(f"connected_nodes_list: {connected_nodes_list}") + + return { + "status": "success", + "main_node": { + "node_type": main_node_type, + "node_data": main_node_dict + }, + "connected_nodes": connected_nodes_list + } + else: + return {"status": "not_found", "message": "Node not found"} + except Exception as e: + logging.error(f"Error retrieving connected nodes: {str(e)}") + raise HTTPException(status_code=500, detail="Internal server error") + finally: + driver.close_driver(neo_driver) + +@router.get("/get-user-connected-nodes") +async def get_user_connected_nodes(unique_id: str = Query(...)): + logging.info(f"Getting user adjacent nodes for node {unique_id}") + db_name = os.getenv("NEO4J_DB_NAME", "cc.institutes.kevlarai") # TODO: This function needs to be able to take a db_name as a parameter + neo_driver = driver.get_driver(db_name=db_name) + if neo_driver is None: + raise HTTPException(status_code=500, detail="Failed to connect to the database") + try: + with neo_driver.session(database=db_name) as neo_session: + user_node_and_connected_nodes = session.get_node_by_unique_id_and_adjacent_nodes(neo_session, unique_id) + user_node = user_node_and_connected_nodes['node'] + connected_nodes = user_node_and_connected_nodes['connected_nodes'] + try: + data = UserNode(**user_node) + user_node_dict = data.to_dict() + except Exception as e: + logging.error(f"Error converting user node to dict: {str(e)}") + connected_nodes_list = [] + for connected_node in connected_nodes: + node_data = connected_node['node'] + node_labels = list(node_data.labels) + logging.debug(f"node_labels: {node_labels}") + for label in node_labels: + logging.debug(f"label: {label}") + try: + if 'Developer' == label: + logging.debug(f"Developer node found") + node_object = DeveloperNode(**node_data) + elif 'SchoolAdmin' == label: + logging.debug(f"SchoolAdmin node found") + node_object = SchoolAdminNode(**node_data) + elif 'Teacher' == label: + logging.debug(f"Teacher node found") + node_object = TeacherNode(**node_data) + elif 'Student' == label: + logging.debug(f"Student node found") + node_object = StudentNode(**node_data) + elif 'Calendar' == label: + logging.debug(f"Calendar node found") + node_object = CalendarNode(**node_data) + elif 'TeacherTimetable' == label: + logging.debug(f"TeacherTimetable node found") + node_object = TeacherTimetableNode(**node_data) + elif 'UserTeacherTimetable' == label: + logging.debug(f"UserTeacherTimetable node found") + node_object = UserTeacherTimetableNode(**node_data) + elif 'School' == label: + logging.debug(f"School node found") + node_object = SchoolNode(**node_data) + elif 'Department' == label: + logging.debug(f"Department node found") + node_object = DepartmentNode(**node_data) + elif 'Student' == label: + logging.debug(f"Student node found") + node_object = StudentNode(**node_data) + elif 'Class' == label: + logging.debug(f"Class node found") + node_object = SubjectClassNode(**node_data) + elif 'Room' == label: + logging.debug(f"Room node found") + node_object = RoomNode(**node_data) + else: + logging.error(f"Unknown node label: {node_labels}") + continue + connected_node_dict = node_object.to_dict() + logging.debug(f"connected_node_dict: {connected_node_dict}") + connected_node_info = { + "node_type": label, + "node_data": connected_node_dict + } + connected_nodes_list.append(connected_node_info) + except Exception as e: + logging.error(f"Error converting node to dict: {str(e)}") + return {"status": "success", "user_node": user_node_dict, "user_connected_nodes": connected_nodes_list} + except Exception as e: + logging.error(f"Error retrieving adjacent nodes: {str(e)}") + raise HTTPException(status_code=500, detail="Internal server error") + finally: + driver.close_driver(neo_driver) + +@router.get("/get-worker-connected-nodes") +async def get_worker_connected_nodes(unique_id: str = Query(...)): + logging.info(f"Getting worker adjacent nodes for node {unique_id}") + db_name = os.getenv("NEO4J_DB_NAME", "cc.institutes.kevlarai") # TODO: This function needs to be able to take a db_name as a parameter + neo_driver = driver.get_driver(db_name=db_name) + if neo_driver is None: + raise HTTPException(status_code=500, detail="Failed to connect to the database") + try: + with neo_driver.session(database=db_name) as neo_session: + node_and_connected_nodes = session.get_node_by_unique_id_and_adjacent_nodes(neo_session, unique_id) + worker_node = node_and_connected_nodes['node'] + connected_nodes = node_and_connected_nodes['connected_nodes'] + try: + data = TeacherNode(**worker_node) + worker_node_dict = data.to_dict() + except Exception as e: + logging.error(f"Error converting user node to dict: {str(e)}") + connected_nodes_list = [] + for connected_node in connected_nodes: + node_data = connected_node['node'] + node_labels = list(node_data.labels) + logging.debug(f"node_labels: {node_labels}") + for label in node_labels: + logging.debug(f"label: {label}") + try: + if 'Calendar' == label: + logging.debug(f"Calendar node found") + node_object = CalendarNode(**node_data) + elif 'TeacherTimetable' == label: + logging.debug(f"TeacherTimetable node found") + node_object = TeacherTimetableNode(**node_data) + elif 'UserTeacherTimetable' == label: + logging.debug(f"UserTeacherTimetable node found") + node_object = UserTeacherTimetableNode(**node_data) + elif 'School' == label: + logging.debug(f"School node found") + node_object = SchoolNode(**node_data) + elif 'Department' == label: + logging.debug(f"Department node found") + node_object = DepartmentNode(**node_data) + elif 'Student' == label: + logging.debug(f"Student node found") + node_object = StudentNode(**node_data) + elif 'Class' == label: + logging.debug(f"Class node found") + node_object = SubjectClassNode(**node_data) + elif 'Room' == label: + logging.debug(f"Room node found") + node_object = RoomNode(**node_data) + else: + logging.error(f"Unknown node label: {node_labels}") + continue + connected_node_dict = node_object.to_dict() + logging.debug(f"connected_node_dict: {connected_node_dict}") + connected_node_info = { + "node_type": label, + "node_data": connected_node_dict + } + connected_nodes_list.append(connected_node_info) + except Exception as e: + logging.error(f"Error converting node to dict: {str(e)}") + return {"status": "success", "user_node": worker_node_dict, "worker_connected_nodes": connected_nodes_list} + except Exception as e: + logging.error(f"Error retrieving worker adjacent nodes: {str(e)}") + raise HTTPException(status_code=500, detail="Internal server error") + finally: + driver.close_driver(neo_driver) + +@router.get("/get-calendar-connected-nodes") +async def get_calendar_connected_nodes(unique_id: str = Query(...)): + db_name = os.getenv("NEO4J_DB_NAME", "cc.institutes.kevlarai") + logging.info(f"Getting connected nodes for calendar {unique_id} from database {db_name}") + neo_driver = driver.get_driver(db_name=db_name) + if neo_driver is None: + return {"status": "error", "message": "Failed to connect to the database"} + + try: + with neo_driver.session(database=db_name) as neo_session: + query = """ + MATCH (n) + WHERE n.unique_id = $unique_id AND (n:Calendar OR n:CalendarYear OR n:CalendarMonth OR n:CalendarWeek OR n:CalendarDay OR n:CalendarTimeChunk) + OPTIONAL MATCH (n)-[]-(connected) + RETURN n, collect(connected) as connected_nodes + """ + result = neo_session.run(query, unique_id=unique_id) + record = result.single() + if record: + calendar_node = record['n'] + connected_nodes = record['connected_nodes'] + + node_type = list(calendar_node.labels)[0] + calendar_dict = globals()[f"{node_type}Node"](**calendar_node).to_dict() + connected_nodes_list = [] + + for node in connected_nodes: + node_labels = list(node.labels) + node_data = dict(node) + try: + node_class = globals()[f"{node_labels[0]}Node"] + node_object = node_class(**node_data) + connected_node_dict = node_object.to_dict() + connected_node_info = { + "node_type": node_labels[0], + "node_data": connected_node_dict + } + connected_nodes_list.append(connected_node_info) + except Exception as e: + logging.error(f"Error converting node to dict: {str(e)}") + + return {"status": "success", "calendar_node": calendar_dict, "connected_nodes": connected_nodes_list} + else: + return {"status": "not_found", "message": "Calendar node not found"} + except Exception as e: + logging.error(f"Error retrieving connected nodes: {str(e)}") + raise HTTPException(status_code=500, detail="Internal server error") + finally: + driver.close_driver(neo_driver) + +@router.get("/get-teacher-timetable-connected-nodes") +async def get_teacher_timetable_connected_nodes(unique_id: str = Query(...)): + db_name = os.getenv("NEO4J_DB_NAME", "cc.institutes.kevlarai") + logging.info(f"Getting connected nodes for teacher timetable {unique_id} from database {db_name}") + neo_driver = driver.get_driver(db_name=db_name) + if neo_driver is None: + return {"status": "error", "message": "Failed to connect to the database"} + + try: + with neo_driver.session(database=db_name) as neo_session: + query = """ + MATCH (n:TeacherTimetable {unique_id: $unique_id}) + OPTIONAL MATCH (n)-[]-(connected) + RETURN n, collect(connected) as connected_nodes + """ + result = neo_session.run(query, unique_id=unique_id) + record = result.single() + if record: + teacher_timetable_node = record['n'] + connected_nodes = record['connected_nodes'] + + teacher_timetable_dict = TeacherTimetableNode(**teacher_timetable_node).to_dict() + connected_nodes_list = [] + + for node in connected_nodes: + node_labels = list(node.labels) + node_data = dict(node) + try: + if 'TimetableLesson' in node_labels: + node_object = TimetableLessonNode(**node_data) + elif 'PlannedLesson' in node_labels: + node_object = PlannedLessonNode(**node_data) + else: + logging.error(f"Unknown node label: {node_labels}") + continue + connected_node_dict = node_object.to_dict() + connected_node_info = { + "node_type": node_labels[0], + "node_data": connected_node_dict + } + connected_nodes_list.append(connected_node_info) + except Exception as e: + logging.error(f"Error converting node to dict: {str(e)}") + + return {"status": "success", "teacher_timetable_node": teacher_timetable_dict, "connected_nodes": connected_nodes_list} + else: + return {"status": "not_found", "message": "Teacher timetable node not found"} + except Exception as e: + logging.error(f"Error retrieving connected nodes: {str(e)}") + raise HTTPException(status_code=500, detail="Internal server error") + finally: + driver.close_driver(neo_driver) + +@router.get("/get-school-timetable-connected-nodes") +async def get_school_timetable_connected_nodes(unique_id: str = Query(...)): + db_name = os.getenv("NEO4J_DB_NAME", "cc.institutes.kevlarai") + logging.info(f"Getting connected nodes for school timetable {unique_id} from database {db_name}") + neo_driver = driver.get_driver(db_name=db_name) + if neo_driver is None: + return {"status": "error", "message": "Failed to connect to the database"} + + try: + with neo_driver.session(database=db_name) as neo_session: + query = """ + MATCH (n:SchoolTimetable {unique_id: $unique_id}) + OPTIONAL MATCH (n)-[]-(connected) + RETURN n, collect(connected) as connected_nodes + """ + result = neo_session.run(query, unique_id=unique_id) + record = result.single() + if record: + school_timetable_node = record['n'] + connected_nodes = record['connected_nodes'] + + school_timetable_dict = SchoolTimetableNode(**school_timetable_node).to_dict() + connected_nodes_list = [] + + for node in connected_nodes: + node_labels = list(node.labels) + node_data = dict(node) + try: + if 'AcademicYear' in node_labels: + node_object = AcademicYearNode(**node_data) + elif 'AcademicTerm' in node_labels: + node_object = AcademicTermNode(**node_data) + elif 'AcademicWeek' in node_labels: + node_object = AcademicWeekNode(**node_data) + elif 'AcademicDay' in node_labels: + node_object = AcademicDayNode(**node_data) + elif 'AcademicPeriod' in node_labels: + node_object = AcademicPeriodNode(**node_data) + elif 'RegistrationPeriod' in node_labels: + node_object = RegistrationPeriodNode(**node_data) + else: + logging.error(f"Unknown node label: {node_labels}") + continue + connected_node_dict = node_object.to_dict() + connected_node_info = { + "node_type": node_labels[0], + "node_data": connected_node_dict + } + connected_nodes_list.append(connected_node_info) + except Exception as e: + logging.error(f"Error converting node to dict: {str(e)}") + + return {"status": "success", "school_timetable_node": school_timetable_dict, "connected_nodes": connected_nodes_list} + else: + return {"status": "not_found", "message": "School timetable node not found"} + except Exception as e: + logging.error(f"Error retrieving connected nodes: {str(e)}") + raise HTTPException(status_code=500, detail="Internal server error") + finally: + driver.close_driver(neo_driver) + +@router.get("/get-curriculum-connected-nodes") +async def get_curriculum_connected_nodes(unique_id: str = Query(...)): + db_name = os.getenv("NEO4J_DB_NAME", "cc.institutes.kevlarai") + logging.info(f"Getting connected nodes for curriculum {unique_id} from database {db_name}") + neo_driver = driver.get_driver(db_name=db_name) + if neo_driver is None: + return {"status": "error", "message": "Failed to connect to the database"} + + try: + with neo_driver.session(database=db_name) as neo_session: + query = """ + MATCH (n) + WHERE n.unique_id = $unique_id AND (n:PastoralStructure OR n:YearGroup OR n:CurriculumStructure OR n:KeyStage OR n:KeyStageSyllabus OR n:YearGroupSyllabus OR n:Subject OR n:Topic OR n:TopicLesson OR n:LearningStatement OR n:ScienceLab) + OPTIONAL MATCH (n)-[]-(connected) + RETURN n, collect(connected) as connected_nodes + """ + result = neo_session.run(query, unique_id=unique_id) + record = result.single() + if record: + curriculum_node = record['n'] + connected_nodes = record['connected_nodes'] + + node_type = list(curriculum_node.labels)[0] + curriculum_dict = globals()[f"{node_type}Node"](**curriculum_node).to_dict() + connected_nodes_list = [] + + for node in connected_nodes: + node_labels = list(node.labels) + node_data = dict(node) + try: + node_class = globals()[f"{node_labels[0]}Node"] + node_object = node_class(**node_data) + connected_node_dict = node_object.to_dict() + connected_node_info = { + "node_type": node_labels[0], + "node_data": connected_node_dict + } + connected_nodes_list.append(connected_node_info) + except Exception as e: + logging.error(f"Error converting node to dict: {str(e)}") + + return {"status": "success", "curriculum_node": curriculum_dict, "connected_nodes": connected_nodes_list} + else: + return {"status": "not_found", "message": "Curriculum node not found"} + except Exception as e: + logging.error(f"Error retrieving connected nodes: {str(e)}") + raise HTTPException(status_code=500, detail="Internal server error") + finally: + driver.close_driver(neo_driver) + +@router.get("/get-school-node") +async def get_school_node(school_uuid: str = Query(...)): + logging.info(f"Getting school node for school {school_uuid}...") + db_name = f"cc.institutes.{school_uuid}" + neo_driver = driver.get_driver(db_name=db_name) + if neo_driver is None: + return {"status": "error", "message": "Failed to connect to the database"} + + try: + with neo_driver.session(database=db_name) as neo_session: + nodes = session.find_nodes_by_label_and_properties(neo_session, "School", {"school_uuid": school_uuid}) + if nodes: + school_node = nodes[0] + data = SchoolNode( + unique_id=school_node["unique_id"], + school_uuid=school_node["school_uuid"], + school_name=school_node["school_name"], + school_website=school_node["school_website"], + path=school_node["path"] + ) + school_node_data = data.to_dict() + return {"status": "success", "school_node": school_node_data, "school_node_raw": nodes} + else: + return {"status": "not_found", "message": "School node not found"} + except Exception as e: + logging.error(f"Error retrieving school node: {str(e)}") + return {"status": "error", "message": "Internal server error"} + finally: + driver.close_driver(neo_driver) \ No newline at end of file diff --git a/routers/database/tools/get_nodes_and_edges.py b/routers/database/tools/get_nodes_and_edges.py new file mode 100644 index 0000000..e157ff2 --- /dev/null +++ b/routers/database/tools/get_nodes_and_edges.py @@ -0,0 +1,174 @@ +from dotenv import load_dotenv, find_dotenv +load_dotenv(find_dotenv()) +import os +import modules.logger_tool as logger +log_name = 'api_routers_database_tools_get_nodes' +log_dir = os.getenv("LOG_PATH", "/logs") # Default path as fallback +logging = logger.get_logger( + name=log_name, + log_level=os.getenv("LOG_LEVEL", "DEBUG"), + log_path=log_dir, + log_file=log_name, + runtime=True, + log_format='default' +) +import modules.database.tools.neo4j_driver_tools as driver +import modules.database.tools.neo4j_session_tools as session +from modules.database.schemas.nodes.calendars import CalendarNode, CalendarYearNode, CalendarMonthNode, CalendarWeekNode, CalendarDayNode, CalendarTimeChunkNode +from modules.database.schemas.nodes.users import UserNode +from modules.database.schemas.nodes.workers.workers import TeacherNode, StudentNode, DeveloperNode, SchoolAdminNode +from modules.database.schemas.nodes.structures.schools import PastoralStructureNode, CurriculumStructureNode +from modules.database.schemas.nodes.schools.pastoral import YearGroupNode, YearGroupSyllabusNode +from modules.database.schemas.nodes.schools.curriculum import SubjectNode, TopicNode, TopicLessonNode, LearningStatementNode, ScienceLabNode +from modules.database.schemas.nodes.schools.timetable import SchoolTimetableNode, AcademicYearNode, AcademicTermNode, AcademicWeekNode, AcademicDayNode, OffTimetableDayNode, StaffDayNode, AcademicPeriodNode, RegistrationPeriodNode, OffTimetablePeriodNode, AcademicTermBreakNode, BreakPeriodNode, HolidayDayNode, HolidayWeekNode +from modules.database.schemas.nodes.workers.timetable import TeacherTimetableNode, TimetableLessonNode, PlannedLessonNode, UserTeacherTimetableNode, StudentTimetableNode, SchoolAdminTimetableNode, DeveloperTimetableNode, SuperAdminTimetableNode +from modules.database.schemas.nodes.schools.schools import SchoolNode, DepartmentNode, SubjectClassNode, RoomNode +from fastapi import APIRouter, HTTPException, Query + +router = APIRouter() + +@router.get("/get-all-nodes-and-edges") +async def get_all_nodes_and_edges(): + db_name = os.getenv("NEO4J_DB_NAME", "cc.institutes.kevlarai") + logging.info(f"Getting all nodes and edges from database {db_name}") + neo_driver = driver.get_driver(db_name=db_name) + if neo_driver is None: + return {"status": "error", "message": "Failed to connect to the database"} + + try: + with neo_driver.session(database=db_name) as neo_session: + query = """ + MATCH (n)-[r]->(m) + RETURN n, r, m + """ + result = neo_session.run(query) + nodes = {} + relationships = [] + + for record in result: + source = record['n'] + target = record['m'] + relationship = record['r'] + + for node in [source, target]: + if node.id not in nodes: + node_labels = list(node.labels) + node_type = node_labels[0] if node_labels else "Unknown" + node_data = dict(node) + try: + node_class = globals()[f"{node_type}Node"] + node_object = node_class(**node_data) + node_dict = node_object.to_dict() + except Exception as e: + logging.error(f"Error converting node to dict: {str(e)}") + node_dict = node_data + + nodes[node.id] = { + "node_type": node_type, + "node_data": node_dict + } + + relationship_info = { + "start_node": source.id, + "end_node": target.id, + "relationship_type": relationship.type, + "relationship_properties": dict(relationship) + } + relationships.append(relationship_info) + + return { + "status": "success", + "nodes": list(nodes.values()), + "relationships": relationships + } + except Exception as e: + logging.error(f"Error retrieving all nodes and edges: {str(e)}") + return {"status": "error", "message": "Internal server error"} + finally: + driver.close_driver(neo_driver) + + +@router.get("/get-connected-nodes-and-edges") +async def get_connected_nodes_and_edges(unique_id: str = Query(...), db_name: str = Query(...)): + logging.info(f"Getting connected nodes and edges for {unique_id} from database {db_name}") + neo_driver = driver.get_driver(db_name=db_name) + if neo_driver is None: + return {"status": "error", "message": "Failed to connect to the database"} + + try: + with neo_driver.session(database=db_name) as neo_session: + query = """ + MATCH (n {unique_id: $unique_id}) + OPTIONAL MATCH (n)-[r]-(connected) + RETURN n, collect(connected) as connected_nodes, collect(r) as relationships + """ + result = neo_session.run(query, unique_id=unique_id) + record = result.single() + if record: + main_node = record['n'] + connected_nodes = record['connected_nodes'] + relationships = record['relationships'] + + main_node_labels = list(main_node.labels) + main_node_type = main_node_labels[0] if main_node_labels else "Unknown" + main_node_data = dict(main_node) + + try: + main_node_class = globals()[f"{main_node_type}Node"] + main_node_object = main_node_class(**main_node_data) + main_node_dict = main_node_object.to_dict() + except Exception as e: + logging.error(f"Error converting main node to dict: {str(e)}") + main_node_dict = main_node_data + + connected_nodes_list = [] + relationship_list = [] + + for node, relationship in zip(connected_nodes, relationships): + node_labels = list(node.labels) + node_type = node_labels[0] if node_labels else "Unknown" + node_data = dict(node) + try: + node_class = globals()[f"{node_type}Node"] + node_object = node_class(**node_data) + connected_node_dict = node_object.to_dict() + except Exception as e: + logging.error(f"Error converting connected node to dict: {str(e)}") + connected_node_dict = node_data + + connected_node_info = { + "node_type": node_type, + "node_data": connected_node_dict, + "relationship_type": relationship.type, # Get relationship type + "relationship_properties": dict(relationship) # Relationship properties, if any + } + connected_nodes_list.append(connected_node_info) + + relationship_info = { + "start_node": dict(relationship.start_node), + "end_node": dict(relationship.end_node), + "relationship_type": relationship.type, + "relationship_properties": dict(relationship) + } + relationship_list.append(relationship_info) + + logging.info(f"Main node: {main_node_dict}") + logging.info(f"Connected nodes: {connected_nodes_list}") + logging.info(f"Relationships: {relationship_list}") + + return { + "status": "success", + "main_node": { + "node_type": main_node_type, + "node_data": main_node_dict + }, + "connected_nodes": connected_nodes_list, + "relationships": relationship_list + } + else: + return {"status": "not_found", "message": "Node not found"} + except Exception as e: + logging.error(f"Error retrieving connected nodes: {str(e)}") + raise HTTPException(status_code=500, detail="Internal server error") + finally: + driver.close_driver(neo_driver) \ No newline at end of file diff --git a/routers/database/tools/get_school_curriculum_context.py b/routers/database/tools/get_school_curriculum_context.py new file mode 100644 index 0000000..24f11d4 --- /dev/null +++ b/routers/database/tools/get_school_curriculum_context.py @@ -0,0 +1,3 @@ +import os +from modules.logger_tool import initialise_logger +logger = initialise_logger(__name__, os.getenv("LOG_LEVEL"), os.getenv("LOG_PATH"), 'default', True) diff --git a/routers/database/tools/navigation/__init__.py b/routers/database/tools/navigation/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/routers/database/tools/tldraw_filesystem.py b/routers/database/tools/tldraw_filesystem.py new file mode 100644 index 0000000..20cac21 --- /dev/null +++ b/routers/database/tools/tldraw_filesystem.py @@ -0,0 +1,196 @@ +from dotenv import load_dotenv, find_dotenv +load_dotenv(find_dotenv()) +import os +import modules.logger_tool as logger +log_name = 'api_routers_database_tools_tldraw_filesystem' +log_dir = os.getenv("LOG_PATH", "/logs") # Default path as fallback +logging = logger.get_logger( + name=log_name, + log_level=os.getenv("LOG_LEVEL", "DEBUG"), + log_path=log_dir, + log_file=log_name, + runtime=True, + log_format='default' +) +from fastapi import APIRouter, HTTPException, Query +from typing import Dict +import json + +from modules.database.tools.filesystem_tools import ClassroomCopilotFilesystem +from modules.database.schemas.nodes.users import UserNode +from modules.database.tools.neo4j_db_formatter import format_user_email_for_neo_db + +router = APIRouter() + +@router.post("/get_tldraw_user_node_file") +async def read_tldraw_user_node_file(user_node: UserNode): + logging.debug(f"Reading tldraw file for user node: {user_node.user_email}") + + # Format the database name using the email + formatted_email = format_user_email_for_neo_db(user_node.user_email) + db_name = f"cc.users.{formatted_email}" + + fs = ClassroomCopilotFilesystem(db_name=db_name, init_run_type="user") + + logging.debug(f"Filesystem root path: {fs.root_path}") + + # Handle path based on environment + if os.getenv("DEV_MODE") == "true": + # In dev mode, use the full system path from the node + if not user_node.path: + raise HTTPException(status_code=400, detail="Node path not found") + logging.debug(f"Using DEV_MODE path: {user_node.path}") + base_path = os.path.normpath(user_node.path) + else: + # In prod mode, construct path using formatted email + logging.warning(f"Using db_name as base path not ready in prod: {db_name}") + base_path = formatted_email + + # Construct final path including tldraw file + logging.debug(f"Base path: {base_path}") + file_path = os.path.join(base_path, "tldraw_file.json") + logging.debug(f"File path: {file_path}") + file_location = os.path.normpath(os.path.join(fs.root_path, file_path)) + logging.debug(f"File location: {file_location}") + + logging.debug(f"Attempting to read file at: {file_location}") + + if os.path.exists(file_location): + logging.debug(f"File exists: {file_location}") + try: + with open(file_location, "r") as file: + data = json.load(file) + return data + except json.JSONDecodeError as e: + logging.error(f"Failed to parse JSON from file: {e}") + raise HTTPException(status_code=500, detail="Invalid JSON in file") + except Exception as e: + logging.error(f"Error reading file: {e}") + raise HTTPException(status_code=500, detail="Error reading file") + else: + logging.debug(f"File does not exist: {file_location}") + raise HTTPException(status_code=404, detail="File not found") + +@router.post("/set_tldraw_user_node_file") +async def set_tldraw_user_node_file(user_node: UserNode, data: Dict): + logging.debug(f"Setting tldraw file for user node: {user_node.user_email}") + + # Format the database name using the email + formatted_email = format_user_email_for_neo_db(user_node.user_email) + db_name = f"cc.users.{formatted_email}" + + fs = ClassroomCopilotFilesystem(db_name=db_name, init_run_type="user") + + # Handle path based on environment + if os.getenv("ENVIRONMENT") == "dev": + # In dev mode, use the full system path from the node + if not user_node.path: + raise HTTPException(status_code=400, detail="Node path not found") + base_path = os.path.normpath(user_node.path) + else: + # In prod mode, construct path using formatted email + base_path = formatted_email + + # Construct final path including tldraw file + file_path = os.path.join(base_path, "tldraw_file.json") + file_location = os.path.normpath(os.path.join(fs.root_path, file_path)) + + logging.debug(f"Attempting to write file at: {file_location}") + + try: + # Ensure directory exists + os.makedirs(os.path.dirname(file_location), exist_ok=True) + + # Write the file + with open(file_location, "w") as file: + json.dump(data, file) + return {"status": "success"} + except Exception as e: + logging.error(f"Error writing file: {e}") + raise HTTPException(status_code=500, detail="Error writing file") + +@router.get("/get_tldraw_node_file") +async def read_tldraw_node_file(path: str, db_name: str): + logging.debug(f"Reading tldraw file for path: {path}") + + fs = ClassroomCopilotFilesystem(db_name=db_name, init_run_type="user") + + logging.debug(f"Filesystem root path: {fs.root_path}") + + # Handle path based on environment + if os.getenv("DEV_MODE") == "true": + # In dev mode, use the full system path from the node + if not path: + raise HTTPException(status_code=400, detail="Path not provided") + logging.debug(f"Using DEV_MODEpath: {path}") + base_path = os.path.normpath(path) + else: + # In prod mode, construct path + logging.warning(f"Using db_name as base path not ready in prod: {db_name}") + base_path = db_name + + # Construct final path including tldraw file + logging.debug(f"Base path: {base_path}") + file_path = os.path.join(base_path, "tldraw_file.json") + logging.debug(f"File path: {file_path}") + file_location = os.path.normpath(os.path.join(fs.root_path, file_path)) + logging.debug(f"File location: {file_location}") + + logging.debug(f"Attempting to read file at: {file_location}") + + if os.path.exists(file_location): + logging.debug(f"File exists: {file_location}") + try: + with open(file_location, "r") as file: + data = json.load(file) + return data + except json.JSONDecodeError as e: + logging.error(f"Failed to parse JSON from file: {e}") + raise HTTPException(status_code=500, detail="Invalid JSON in file") + except Exception as e: + logging.error(f"Error reading file: {e}") + raise HTTPException(status_code=500, detail="Error reading file") + else: + logging.debug(f"File does not exist: {file_location}") + raise HTTPException(status_code=404, detail="File not found") + +@router.post("/set_tldraw_node_file") +async def set_tldraw_node_file(path: str, db_name: str, data: Dict): + logging.debug(f"Setting tldraw file for path: {path}") + + fs = ClassroomCopilotFilesystem(db_name=db_name, init_run_type="user") + + logging.debug(f"Filesystem root path: {fs.root_path}") + + # Handle path based on environment + if os.getenv("DEV_MODE") == "true": + # In dev mode, use the full system path from the node + if not path: + raise HTTPException(status_code=400, detail="Path not provided") + logging.debug(f"Using DEV_MODEpath: {path}") + base_path = os.path.normpath(path) + else: + # In prod mode, construct path + logging.warning(f"Using db_name as base path not ready in prod: {db_name}") + base_path = db_name + + # Construct final path including tldraw file + logging.debug(f"Base path: {base_path}") + file_path = os.path.join(base_path, "tldraw_file.json") + logging.debug(f"File path: {file_path}") + file_location = os.path.normpath(os.path.join(fs.root_path, file_path)) + logging.debug(f"File location: {file_location}") + + logging.debug(f"Attempting to set file at: {file_location}") + + try: + # Ensure directory exists + os.makedirs(os.path.dirname(file_location), exist_ok=True) + + # Write the file + with open(file_location, "w") as file: + json.dump(data, file) + return {"status": "success"} + except Exception as e: + logging.error(f"Error writing file: {e}") + raise HTTPException(status_code=500, detail="Error writing file") diff --git a/routers/database/tools/worker_structure_router.py b/routers/database/tools/worker_structure_router.py new file mode 100644 index 0000000..31667e5 --- /dev/null +++ b/routers/database/tools/worker_structure_router.py @@ -0,0 +1,190 @@ +import os +from fastapi import APIRouter, HTTPException +from typing import List, Dict, Any, Optional +from datetime import datetime, timedelta +from modules.logger_tool import initialise_logger +from modules.database.tools import neo4j_driver_tools as driver_tools + +logger = initialise_logger(__name__, os.getenv("LOG_LEVEL"), os.getenv("LOG_PATH"), 'default', True) +router = APIRouter() + +@router.get("/get-worker-structure") +async def get_worker_structure(db_name: str) -> Dict[str, Any]: + """ + Get the complete worker structure including timetables, classes, lessons, journals, and planners. + """ + try: + # Get all worker-related nodes in a single query + query = """ + // Match all worker-related nodes + MATCH (t:Teacher) + OPTIONAL MATCH (t)-[:TEACHER_HAS_TIMETABLE]->(tt:UserTeacherTimetable) + OPTIONAL MATCH (t)-[:TEACHER_HAS_CLASS]->(c:Class) + OPTIONAL MATCH (t)-[:TEACHER_HAS_LESSON]->(l:TimetableLesson) + OPTIONAL MATCH (t)-[:TEACHER_HAS_JOURNAL]->(j:Journal) + OPTIONAL MATCH (t)-[:TEACHER_HAS_PLANNER]->(p:Planner) + WITH t, tt, c, l, j, p + ORDER BY tt.start_date, c.created, l.created, j.created, p.created + + // Collect all nodes + RETURN { + timetables: collect(DISTINCT { + id: tt.unique_id, + path: tt.path, + title: tt.title, + type: tt.__primarylabel__, + startTime: toString(tt.start_date), + endTime: toString(tt.end_date) + }), + classes: collect(DISTINCT { + id: c.unique_id, + path: c.path, + title: c.title, + type: c.__primarylabel__ + }), + lessons: collect(DISTINCT { + id: l.unique_id, + path: l.path, + title: l.title, + type: l.__primarylabel__ + }), + journals: collect(DISTINCT { + id: j.unique_id, + path: j.path, + title: j.title, + type: j.__primarylabel__ + }), + planners: collect(DISTINCT { + id: p.unique_id, + path: p.path, + title: p.title, + type: p.__primarylabel__ + }) + } as structure + """ + + with driver_tools.get_session(database=db_name) as session: + result = session.run(query) + record = result.single() + if not record: + raise HTTPException(status_code=404, detail="Worker structure not found") + + structure = record["structure"] + + return { + "status": "success", + "data": { + "timetables": { + "default": structure["timetables"] + }, + "classes": { + "default": structure["classes"] + }, + "lessons": { + "default": structure["lessons"] + }, + "journals": { + "default": structure["journals"] + }, + "planners": { + "default": structure["planners"] + } + } + } + + except Exception as e: + logger.error(f"Error getting worker structure: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + +@router.get("/get-timetables") +async def get_timetables(db_name: str, start_date: str, end_date: str) -> Dict[str, Any]: + """ + Get all timetables in a date range. + """ + try: + query = """ + MATCH (tt:UserTeacherTimetable) + WHERE date(tt.start_date) >= date($start_date) AND date(tt.end_date) <= date($end_date) + RETURN { + id: tt.unique_id, + path: tt.path, + title: tt.title, + type: tt.__primarylabel__, + startTime: toString(tt.start_date), + endTime: toString(tt.end_date) + } as timetable + ORDER BY tt.start_date + """ + + with driver_tools.get_session(database=db_name) as session: + result = session.run(query, start_date=start_date, end_date=end_date) + timetables = [record["timetable"] for record in result] + + return { + "status": "success", + "timetables": timetables + } + + except Exception as e: + logger.error(f"Error getting timetables: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + +@router.get("/get-journals") +async def get_journals(db_name: str) -> Dict[str, Any]: + """ + Get all journals. + """ + try: + query = """ + MATCH (j:Journal) + RETURN { + id: j.unique_id, + path: j.path, + title: j.title, + type: j.__primarylabel__ + } as journal + ORDER BY j.created + """ + + with driver_tools.get_session(database=db_name) as session: + result = session.run(query) + journals = [record["journal"] for record in result] + + return { + "status": "success", + "journals": journals + } + + except Exception as e: + logger.error(f"Error getting journals: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + +@router.get("/get-planners") +async def get_planners(db_name: str) -> Dict[str, Any]: + """ + Get all planners. + """ + try: + query = """ + MATCH (p:Planner) + RETURN { + id: p.unique_id, + path: p.path, + title: p.title, + type: p.__primarylabel__ + } as planner + ORDER BY p.created + """ + + with driver_tools.get_session(database=db_name) as session: + result = session.run(query) + planners = [record["planner"] for record in result] + + return { + "status": "success", + "planners": planners + } + + except Exception as e: + logger.error(f"Error getting planners: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) diff --git a/routers/dev/__init__.py b/routers/dev/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/routers/dev/__pycache__/__init__.cpython-311.pyc b/routers/dev/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0a32b430b7040a26549d3f2a6a598d9c604dfcda GIT binary patch literal 137 zcmZ3^%ge<81b?;MGeGoX5CH>>P{wCAAY(d13PUi1CZpd4BO~Jn1{hJq H3={(Z6_p%M literal 0 HcmV?d00001 diff --git a/routers/dev/__pycache__/document_conversion.cpython-311.pyc b/routers/dev/__pycache__/document_conversion.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..21c9e8ea977eb4e396a424562fa12d710817e755 GIT binary patch literal 8017 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 literal 0 HcmV?d00001 diff --git a/routers/dev/__pycache__/test_analysis.cpython-311.pyc b/routers/dev/__pycache__/test_analysis.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..47d0cf8f8a3bbab005d5799bc31bac64dae91e2e GIT binary patch literal 3452 zcma)8Z*1Gf6+eoUL`l>?|C22RDN{Q}W!SQVI$dNZ1(GUGy<(Zsq{zyyP-u}#=!lYb zq~lnS2BRx557>uvD9{AW01xOg70G}N*noW4J}k((eIyGG6^I!KFcjFnDM$(!1qSRL zWl5InwLKmm-@SYH?(yBb-`#J5K|g}>--&Zq|LH;KU!>74P7gGmj#CJIfFvYQ1*B2} zrMd){N(;2g2#o3$+!X0^6+Eg}@H#wQUq@Bz!V*@Kl+9$6oPM4#OQL=?>9VZ0ux%S!f|ylyjOM2^{w8TqjA{si8qf1(k34N;H=KBRZTiXbJb^oQt|uHKMQ zNC*9PS?MfImFm^2F}k;{h0sc8=HAdAM>V$|=;~G7y;iDd1yZ+FDxg>MR6SdJ?6&*B z+kJk5Wv?FX_OJNbJlJffKdO3r6AaRoCeMCpF))gbA&psc-Jst@YZQgvgor^b_Qs3p z^&NU+?Ku&uy6*4$w;J0s+VhpsBi+%xQLFi?zO7)lx64)cS*iJZ=J4*HqsnfDx}&>X z)n8?*^j%o#d!5y;1$u0;U$GU)xekur1$1!q$hI0qdMAe+2>jCn=JSG3YoFjv(VR# z{{KF$p;j&?!<7X;4`mlkc#$VyzypNvVo~C+$VC~8y3FTgSy~oz*Z5^olO?`X~EMAAnrPe<r8dpW^{z1DY=Ct6G+fwmmJZti;X| zGvIyO=PZd9n0*Fjll`{4jFqBpGbXD5`J{l*)3^_GnjE0l@7*u2fzpeWm3Un;{G)=z}>jXi#p22wb=U=#5Kiwk+js zZa12aXLgwUR>lc|rPRZC~f0Nd__5IygcI2|w;53gPZqkd@#BYW)eYn4B1D zxpiWAmRIw6IEC2uD%w79BTM|(>;PeRS7}!RmdK`LjUW)oyH5G?$h254Ph;n7)TSl* z`m}Q_Ic8x{s=SV$C%zFv0-#-iz5j1`Hc)dQ;Xb*|293~6eGCXxlRaj!#|-w^cKq<2 zi7mm5&sg!9&G6^JK`Z!z8Jw_!6HOHH9jag59zJyI2e(6aLiG_VId2ZnZ!R{X@edCF z;_wz@Mvq$2qfJBw=j%h;ks&Mc{8sv-mw)$?8JV*pb4FyYNkgBb;E*Ro^%)^u*+JaS z&dx#NFFYvNXY`#gxwOTl4KBSM8?B!+VzXv!){4z;zWO;AHTtGZE@g2kgG+4>^SAwX z{NQnX^s{*S(|Gzp(u`-UcxLl8NA(4hOIlpg;F68lbDzZ~KaEY+-+D0pcQCkQ#g=vr z9yPgfiyJq%@kW25c?81Z#HLH0kWf7%q$@j!bAIdVw06E2LtMlPJl8}nw@B@!&H_&U z`jtBMtA&pijL;-hlby2IDTAHb4khZeF`NCzCBb;>hvucXtxIo1lhn{?nN#S`Q<)k1FB6F~QTIbP2mHe*b7s)@aF8baFh%&0Gk$118s$L$(F~KB^*)-V z3I836@FyJpRQOzi{wsGHEpYTFTo4+cjGQ_*ME`Bb4SaIQ_U1)^pt6F=A&SWz2)hX( zn-`O7jP23a%K(Fz+{W-Qk$B5+K`bcC4y@qAL>?#dLAb%K7Gy2e-BNIKY=H^6LD|u^ zLTB%`K*rPBk2X^-0dSCm%-Me*qo=?kJPqVa_GD}D%Qy{9a;ec?1PU92q8cb;e7o8} zF{8IOP+-G(8fe()tqm01aGnMVZ#Yi_oiq-r4K!}_*2liS&5@raexBIyJf^%qO}vxX z6zbeY!laH{)bYoM_* {out_path}") + + except Exception as e: + print(f"Error converting {file_path}: {str(e)}") + results.append({ + "source_file": str(file_path), + "status": "error", + "error": str(e) + }) + + response_data = { + "total_files": len(results), + "successful": sum(1 for r in results if r["status"] == "success"), + "failed": sum(1 for r in results if r["status"] == "error"), + "results": results + } + print(f"Conversion complete: {response_data['successful']} successful, {response_data['failed']} failed") + return response_data + + except Exception as e: + print(f"Error in batch conversion: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) \ No newline at end of file diff --git a/routers/dev/pdf_utils.py b/routers/dev/pdf_utils.py new file mode 100644 index 0000000..f2272be --- /dev/null +++ b/routers/dev/pdf_utils.py @@ -0,0 +1,46 @@ +from fastapi import APIRouter, UploadFile, File, HTTPException +from typing import Dict +from pathlib import Path +import shutil +import tempfile +from modules.pdf_utils import PDFUtils + +router = APIRouter() + +@router.post("/extract-text") +async def extract_text( + pdf_file: UploadFile = File(...) +): + """ + Extract text content from a PDF file + """ + try: + with tempfile.TemporaryDirectory() as temp_dir: + temp_file = Path(temp_dir) / pdf_file.filename + with temp_file.open("wb") as buffer: + shutil.copyfileobj(pdf_file.file, buffer) + + text = PDFUtils.extract_text_from_pdf(temp_file) + return {"text": text} + + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + +@router.post("/metadata") +async def get_metadata( + pdf_file: UploadFile = File(...) +): + """ + Get metadata from a PDF file + """ + try: + with tempfile.TemporaryDirectory() as temp_dir: + temp_file = Path(temp_dir) / pdf_file.filename + with temp_file.open("wb") as buffer: + shutil.copyfileobj(pdf_file.file, buffer) + + metadata = PDFUtils.get_pdf_metadata(temp_file) + return metadata + + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) \ No newline at end of file diff --git a/routers/dev/test_analysis.py b/routers/dev/test_analysis.py new file mode 100644 index 0000000..e08e164 --- /dev/null +++ b/routers/dev/test_analysis.py @@ -0,0 +1,49 @@ +from fastapi import APIRouter, UploadFile, File, HTTPException, Form +from typing import Dict +import json +from pathlib import Path +import shutil +import tempfile +from modules.test_analyzer import TestAnalyzer, TestAnalysis +from modules.pdf_utils import PDFUtils + +router = APIRouter() + +@router.post("/analyze", response_model=TestAnalysis) +async def analyze_test( + test_file: UploadFile = File(...), + marks_data: str = Form(...), + api_key: str = Form(...), + mode: str = Form('detailed') +): + """ + Analyze a test PDF and generate feedback based on marks data + """ + try: + print(f"Received request - Mode: {mode}") + marks_data_dict = json.loads(marks_data) + + with tempfile.TemporaryDirectory() as temp_dir: + temp_file = Path(temp_dir) / test_file.filename + with temp_file.open("wb") as buffer: + shutil.copyfileobj(test_file.file, buffer) + + print("File saved, initializing analyzer...") + analyzer = TestAnalyzer(api_key=api_key) + + print("Extracting PDF content...") + pdf_utils = PDFUtils() + pdf_content = pdf_utils.extract_text_from_pdf(temp_file) + + print("Analyzing content...") + analysis = analyzer.analyze_test(pdf_content, marks_data_dict, mode) + + print("Analysis complete") + return analysis + + except json.JSONDecodeError as e: + print(f"JSON decode error: {str(e)}") + raise HTTPException(status_code=422, detail=f"Invalid marks_data JSON format: {str(e)}") + except Exception as e: + print(f"Error in analyze_test: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) \ No newline at end of file diff --git a/routers/dev/tests/__init__.py b/routers/dev/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/routers/dev/tests/__pycache__/__init__.cpython-311.pyc b/routers/dev/tests/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa613197993b9fc7dcf0364f86878213c20e63e8 GIT binary patch literal 143 zcmZ3^%ge<81b?;MGeGoX5CH>>P{wCAAY(d13PUi1CZpd-ietdjpUS>&ryk0@&FAkgB{FKt1RJ$Tppcas!#r#0x12ZEd N;|B&9QN#=s0{{Ws9=8Ah literal 0 HcmV?d00001 diff --git a/routers/dev/tests/__pycache__/timetable_test.cpython-311.pyc b/routers/dev/tests/__pycache__/timetable_test.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f22a6e26acb01d7282b6172a728191cd7c6177ce GIT binary patch literal 2602 zcmbVOO-vg{6rNp=*MBi)fy9a3HiqB?Q;bE_N`=I!pb$tQ2_a4@P#bIUEMT(!>Fhco zu92*?Qb-l4mq@jgMzY$JP?1B9IrNZYPt`1132UWPNL8iwMiupfRH?IeY%n1b>g?Ou znK$q4d+(b!Z}+j&X$Q3Z+c`Y=6#{uS7z>qP8j5ODlus0CQvA*BQq zMJYv0-q0O0@nm&!A;9Q-JQ-Kwf)tmw;*vw z$Vf_r>e%|n&rPHDK6m}4G*hipA|4A_UJImhm$nPU;N z?E~Vj)93)eX2j*#EFCSfIi^_K?`=;2Ko-O;(`Z*~5ic@1cHgr5iPrkRqqXfFZQU-^ z&@R@_!_N5LAZz5oYb|F)ZhMVQ85E6yen}%7%RX>Y^!U+BbqG`xf<>EJ_k{QaXoP@(_CDw<>R7xAGR8E<~?nh=N(l$IrDt2G9dmt z=B zYs_gOc3q^U!8pm4#VsbZ#eAA=NQyUisvI)ruS;i}D^(y`s{-BWTUkqm>C3kHg29Ba zFeAjJa1R}$xNKC4;7tK11uyn5Cv}_z8U%72{goJcDgv-@b4k7VI$k+fmR70`6Arwlzg*p-4jWPDq zR~cC-|3FX6pY+Ou4S0}L=?@owFI(u;T>kvX3-^)xS6?CGR_=wMX^#5bNPh z4m2KKcO6}G9WBCQOm$Jao%xZH`^36CwB`;yg->IuyH9iX?X=%j>>zv>B^3rW7$h)Q zvwxa&_7VOxB^8D>7$z|M4+olB?z`9d)-}HM$F@f&9(R4;wX#5Z&#m{4ul0_TOA)pA ziq?CDd?KlB39T)m@=1+P=07g+-gW-i8h@-fxN=P8yEVR>GF`(34{;4wh+9iNl626_13jG@N6X@SK z^w#~v%8e(B#1S?KhF{XX0)Ymdt9*~KQO~eZBJe@l>CK50%1ENzUCGm^l1fR~_=@P( zXf!F%a~svUS<(2EW4FP!%m}g~q~q8qqBOzEiA2*mMKjmPjh_HMP9M0Pc3aldmDiua zAv!gFd*okfw`pP+rUc$4dr=8E@{Xm^rO~_R@10kHM*|)LJSAYum#-4&A@x+Ud5FzZ z_@FphoOm?3@`dU@rTI@in|wC$^W^ia8lKR?6D0B(iN;hL(rhTtmB8Dio;GYvOGoZ{ o?|Jjw24lJ7z3nB=c9rpKjDM5$FlROa?fy0a_IMqq%r3|KA5m&!m;e9( literal 0 HcmV?d00001 diff --git a/routers/dev/tests/timetable_test.py b/routers/dev/tests/timetable_test.py new file mode 100644 index 0000000..0b63847 --- /dev/null +++ b/routers/dev/tests/timetable_test.py @@ -0,0 +1,37 @@ +from dotenv import load_dotenv, find_dotenv +load_dotenv(find_dotenv()) +import os +from modules.logger_tool import initialise_logger +logger = initialise_logger(__name__, os.getenv("LOG_LEVEL"), os.getenv("LOG_PATH"), 'default', True) +from fastapi import APIRouter + +router = APIRouter() + +@router.post("/run-pytest-timetable") +async def run_pytest_timetable(): + import subprocess + + home_dir = os.environ['HOME_DIR'] + backend_test_dir = os.environ['BACKEND_TEST_DIR'] + logger.debug(f"original home_dir: {home_dir}") + logger.debug(f"original backend_test_dir: {backend_test_dir}") + + if backend_test_dir[0] != '/': + backend_test_dir = '/' + backend_test_dir + + # Convert backslashes to forward slashes for Windows compatibility + home_dir = home_dir.replace('\\', '/') + backend_test_dir = backend_test_dir.replace('\\', '/') + logger.debug(f"new home_dir: {home_dir}") + logger.debug(f"new backend_test_dir: {backend_test_dir}") + + # Join and normalize the path + pytest_dir = os.path.normpath(os.path.join(home_dir, backend_test_dir.lstrip('/'), "pytest_timetable.py")) + pytest_dir = pytest_dir.replace('\\', '/') # Ensure forward slashes + f_string = f"pytest {pytest_dir} --maxfail=1 --disable-warnings -q" + logger.debug(f"f_string: {f_string}") + + result = subprocess.run(f_string, capture_output=True, text=True, shell=True) + logger.debug(f"result: {result}") + + return {"stdout": result.stdout, "stderr": result.stderr} \ No newline at end of file diff --git a/routers/external/__init__.py b/routers/external/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/routers/external/__pycache__/__init__.cpython-311.pyc b/routers/external/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7df57b9701bf21cd271ca590624e65456c0544c0 GIT binary patch literal 142 zcmZ3^%ge<81b?;MGeGoX5CH>>P{wCAAY(d13PUi1CZpd1%+ZgJ&&5#>iHAy0qKA@m8t2y+rjb8#-s$9WF% zh;Z=o_kr#6@*H#@ct3}?_;73%FFE24>+4Lr;%?}3#62+6aigpOVJCLo=V2zi#V76s z4)+bqI@Uw>&v0W;^$g-A9xPz*j_R87O;%q}YEFmZAq%gSTGFlYR?Fi+wYTvwSQ)}~xPG5M4b|(g(|F$j zHo;r6DMG?qZDp$Ri<_!v;%3r5$K%i~=RVCHn7@Q#E&pPZW4!5?lq61IMI-Wp>7Ntj zGI7CdPiDjfRk9kPYJx1mM@~wKW$4Jx5>uFde=KovcxHUX)h8+Qs_A7N)1x1ZPMfZg z(KDCFW=szzbIGiv#oVS-PNs?J1qTr%l!)n}Sy>Z-&&LMm6q-(I zV54{V;>33?JIuiN%*@5nr4-3%q9VsQv+0VGodJ7hXi`>FRLp3@88PNC8|@BtL{yWr z62WHu1;y?@r(|Vp)_oviqFk1f3rSI8Tp-gmn-wJth<9AmGNY6#)by17<`??S+AHs0 zp1FKxGy#Ssrbe#-YYk>zDH%ei$nr|Cuf%>lLzSgv)3d;|OyJbs35V5Zr})S4J{@o( zG=(^b6)(~%IBx9Ws}Mu;+zwxTa@RQQxP?}^5mdd$YrF;$%g@%{=_&WHZ}p6=3Vxdl zJ6F-pzWCa5+2b}=Ep5$#-K&lTMANH)h4|N*e8J=i%Yt4hDbHt<^F*!6FmAA$ov^2;0ephy(JHzcS>smW zl-MU4D6Wd)Z3;W?IeyA-wn4>knl4pKQq2@_mL^&DHJut%g_wgL0_pTH14jUS#>xuc zd%|=PS)!^TG`zT)t^-Ok)Y>)j~{?pNiKI6gO6#y3WyLf~Sbd8s zsZ^Fyf=@=pXHa%l>PvMs3MH<{0)$$xZ8o@<}PexaoC*T~gYfn@qbb-*)O4QN@SX?tWPqc(>CuK>{bXy*) zrjwmi(?ga>irt`E*q8^dHS?l8520aQDjcdtX+4Zk7NxX_0hZxSuYJYwP?mk@AnUHP zl_exmCaM{Z+B!ub^o5B&*1K()zp*^fGP!(Ks4EmT3bqh}NKj8-v z~G=TzlMAB^#l3ZP{D;FeNT`h;(Nxxzum~+@KMk0*k-KYLEe^v57ji@ zk#&DJw0yW{+hc@J?A9CM{*B4U;UilUM!0u-(FhObBi&n9j7Z;Z(1^U7?}}~5jIM#* zt47z^YNDfOyT<7F*6vNC<4nGaXn#ZR88q659z=}xkwUEy2^J85jmeG4LKBL#!^e%< z-U3Ahm!r;CKtm_Z zE({&y(j$Kpn|j`IrwsSR^#8Vh`v;%Bz4Nvn>W7vS1`J_97Y0g_ru5)+E;wxjr*&bP zEl$D3L;<26g_C;gY~*Yg`l8D>-s1Qo_RdJRqMD6q1!pCq_OfUsG@&Vq#Qq1_gu6%-|Cv~ST-*@q>>m<~-~<+_>0_~9 zWTWpg$)33+WXFt1>zFbY)Mlt0XBA<~IIQH+dGKIw!b%P5{)`ZwSCn~)!1R HealthCheck: + """ + Endpoint to perform a healthcheck. Used by container orchestration systems + to determine if the service is healthy and ready to receive traffic. + """ + return HealthCheck() \ No newline at end of file diff --git a/routers/langchain/__init__.py b/routers/langchain/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/routers/langchain/__pycache__/__init__.cpython-311.pyc b/routers/langchain/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e7400a424d5d6471f2b949b66786f0f9164ae84d GIT binary patch literal 143 zcmZ3^%ge<81b?;MGeGoX5CH>>P{wCAAY(d13PUi1CZpd&ryk0@&FAkgB{FKt1RJ$Tppcas!#r#0x12ZEd N;|B&9QN#=s0{{bJ9=iYl literal 0 HcmV?d00001 diff --git a/routers/langchain/__pycache__/interactive_langgraph_query.cpython-311.pyc b/routers/langchain/__pycache__/interactive_langgraph_query.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..83bee401f5ada2c3bad162783472d1dfa002ea8b GIT binary patch literal 5284 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 Nju{7pr$PJd{|AJ8Ew=yw literal 0 HcmV?d00001 diff --git a/routers/langchain/__pycache__/neo4j_graph_qa.cpython-311.pyc b/routers/langchain/__pycache__/neo4j_graph_qa.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..28f06ab57bc8b7029c70771e6958bf8b49bef442 GIT binary patch literal 9043 zcmcgRTWlLwc0+3Ten>-!6!ow?eoC}0Y7=L@u572FY)X+$Jyw$Cm}p9jG$U!G;UhCc z+0u>{Lb_<=g@L-oE@B|NsIVWdw{cN_`m>+?92zV#xPSozMS$Hu26ljj(E>g9&hTZ) ziDIA`U7opf?m6e4d(OG9qkjnmyc9hDdunXuU%M&lzwt-)fp7A>_#YcZeNOQdZwWrvw}P><@tGON*4E9suo^@G~D9=CVsI=@#;)vyQYAa4l&UaJHfpADn~*rJt(zjJJKDb-YSK&k#vOA+oaBHG#w?Q4m6KA-L*{d%pYt3 zLj<-H*g;^JzzBhzf3We<-?`G=d>7xnZ2tkU=XdUOkI=Q-TOCv5o9}J5xrf4ke4IZb z9O93{@0ifXABXn|;V^$vVEKOd4G2g082nB_{WSc}2#1!U{NS$~uZ`^}Z=a=NLx08{ z#_Y%^F`nZCak@H1Wkd=(Y<(3y$I5C%5mbt=8<`WLNQ&VG^ z>BQWJn~otVzpNk+Mx>JS$rN&2Nse3}n?o*MSmKJ38gn8#$7KcN0m_UdtP2uy<7$CZ zSIpXyC<(|V7jvozbY9%Jl$W!d3R-#+)8jKl6BPJxZf-hxdr>H;Vm=qMq0kss=<-Hk zMUa1YR`*NSrDFCNL#QT$Z~5k_v(x zqmeT!$jbtcf@{J?Mp3zCA!Djv%!!{Ag^b7}*P<){HxEN=TT?R128dWFDuhn%0_)0n zy2+gYP`HtxCK9zbqLt#ps<5cW=sF(}gIYHPP6o5*iv=P)=B!howhg(tYZPh3)LBum z5fA#eH-1+;cO$QwFNlj7b)z7luvzC6MNpKikW&e|-n*%v+oS@KN7TH^Nts+RyCBG! z{1P}?QSvzjJ2FG4kk1k?s*(`%pjPwKq{CKanh;ovdUq()+=ykM_9mPp}dZSb~NOkX#dJxZeH1~c|)z$`Ew$5jyYlqdUe)!#Naoa)WS?gZe ztG=qtt-t}aYtsVzS(j(Ff@*!}aA4)zm+e~cQAhJpdaG6Q@!>Uc7?(d%nQGq@wTjmc z^6-&nEw|drr>J7N6SG!wnQYTH6;C->We&GWyY> z*QAED&{jMAI&w$VBXur~)>u!6Mr}3=?G}|NgHEkjX@aK`{(HMP+Y^>I!R~8$o<(!qK2)Q0(+S-2eE++RE%-wY6P7N7liB_yWkN%`VG8;Fl)rzwPMB*iA4C@~h*OZ@`EA5$^H( z#xQ~@Z(@+f1cjW@IWgm$^QZLf-4M$(hV#a_YUSkX1;`&fb`sxnh1p z5}~CiLzbhc2r|hXxC?NRzLl4G`3ml&V@6n#1!V-FRk8iq7 z)G*6Mz>{;FvNp_)2|0Z05Lk{iGaqd2`pK$!mbeVsNUnyh-eFj{hO;=k0#_PIfY>zi zE09Ksds%p9@{%x2YB%#mmXkqxjs=~;(_BskdXNa3=JS#%N#HgFYy zX2s8{gJ($`9`MB;kj= zke*0PB*@-VGL zY16f$s)ga9p;xwHNG#HrHD;GT#B0kKfS3hCvF02@ECyfanEWUj(pe_j)(qz4U`0;K8%M`Vj3PzYF_76}9JmY12JT z6oXCl-N7IHYJPjk+)2oc<6tp0VU)awai1J~f$vEZ1}ja$P98w{3c6YGQg0`OKKl;E=3+ z;E+bnMM;FjrJTb(GL0YE9y7s~VnoxWhWI&@d>Gk5Dh_~Riu9Kw{iV=AIW+K9DE>4Q z|2O5o&L+P)d-dtrtEIE4^4U~rXreqcQ3_3#LzCOrp3y#2%lK}O&cvaV=%F$_q|-x2 z^{@j+p4|X|QpZTSV`O`x#&hxE$2xNnN{PNyrZ4IArMKbv+8=r558l0c@0Vr&$!ARa zZ@TZN%1n&Z^xiXNX3$`|Djr9``3(i&B?jBcZ-X^E^q1&?GCiQv0|xE+ijF>|qb0h# zOn2*acTLyhCHh2}KB3bmj6mq_-)xW8TkenQ%yB3+iV7V%8q(>$ZwDwgZgd^l9oD09 zgE?Jsw6LHAfR`BPbZ^B=xkL9pdg?l)yAC~zM1Ldh`b&|)a%6DFXMP4sk$5>0-|-o( z-4)8_xnbKqZN8s{4nMrCpTDk$=1ZaZa%f)n&p%`O^yA|X*8o6ya?O0}%+(Tewai@I zaT?*C9k0Q3?l^axUxyDry!NE1hm)mnvK&tCc%Lyn4}DL5sxyfalPEI@pz-&W{ryI; z-Dp2#w1#n|t<#9ajiVQg$T6!#`zxJ(Y+e8_G1yL4da3A7zUn;pwDa7PrT<*lJI|Fm z=gXb*I^FTL88Y`GB|2KBqdFb6FglYg(W7O0RHy6KJs9fv9v{@)vyXs*`%5}AV3rac zE7LKZj(r!yMSbAB8L5rI`du6e{lq0Oqgm?ntU6ovQ7WnT19{Rc2eQN9E>I7er9{We zbX=$7`zZC?*S7Q1dyzYr?!pv{k|TV~D<@#Zk;%c{4z69rNU7c|A(~x;WR(Y|5)Nvy{utIyys*fX^*_HA7o4# zStcz@9GnsgqKp%pWSc;3wVPL*tg?!^U3AybaG=O$VSiFL;$$;c%q{8gegq&v&5-{J zC}itF(Hd3UT(TAGEt3r^W?lc{aNK|faUD)WadTs^UYT3we?iH1hMXq7T*T_%#v^Kh zA;PYz%BThYzkwV}@E>Fq(F@pCG`*&N>q25>ei`lgYs;XKZ821Hy6WqdfRPy+joxMjorJt z>neE%%HDx(m*MT%Ia&7h7#_w5cJ3_P74Q3YZCMHU-qD+jL7mf^i$R^$n~OnR)|<<7PiUv>PS4$*ZD++z zF-e==b_I$N{iRNd!N78iOT|ugkJ>9#1GH1Y8yHiEcB*y01u%68T$6;W23y@hKmgeG zRwC5U`6p3*aKt#D_>c4Y&r-(8p~q4E#ISLE@ZoL!*m>hb{IOd<{#Qm{|HG($=w0LV zdyiN2Q-59kt}vbmNCTi#ArNPGf7bnJ_s)397Ae~z&p-ZKV|~+@NmpE}Hd|MP!q5mZ zl@?Oz>9Z>Rr>x5P3s&WN+N?YeFck+TetvG)s?6T7DtX1MRGd^t)at=Wo&8y@I$@i( YHTG=w|4j>J?*!#4_PS1H3t3D44+qmWM*si- literal 0 HcmV?d00001 diff --git a/routers/langchain/interactive_langgraph_query.py b/routers/langchain/interactive_langgraph_query.py new file mode 100644 index 0000000..4cc5cec --- /dev/null +++ b/routers/langchain/interactive_langgraph_query.py @@ -0,0 +1,80 @@ +from dotenv import load_dotenv, find_dotenv +load_dotenv(find_dotenv()) +import os +import modules.logger_tool as logger +log_name = 'api_routers_interactive_langgraph_query' +log_dir = os.getenv("LOG_PATH", "/logs") # Default path as fallback +logging = logger.get_logger( + name=log_name, + log_level=os.getenv("LOG_LEVEL", "DEBUG"), + log_path=log_dir, + log_file=log_name, + runtime=True, + log_format='default' +) + +from fastapi import APIRouter, HTTPException +from pydantic import BaseModel +from typing import List +from modules.langchain.interactive_langgraph_query import perplexity_clone_graph +from modules.redis_config import get_cached_results, set_cached_results +from langchain_core.messages import HumanMessage + +router = APIRouter() + +class QueryRequest(BaseModel): + query: str + use_cache: bool = False + +class QueryResponse(BaseModel): + response: str + needs_more_info: bool + +@router.post("/query", response_model=QueryResponse) +async def interactive_query(request: QueryRequest): + logging.info(f"Received query: {request.query}") + try: + query_id = generate_random_alphanumeric() + config = {"configurable": {"thread_id": f'{query_id}'}, "recursion_limit": 20} + + inputs = { + "messages": [HumanMessage(content=request.query)], + } + + # Check cache for existing results only if DEV_MODE is false + use_cache = os.getenv("DEV_MODE", "true").lower() == "false" + if use_cache: + cache_key = f"langgraph_query:{request.query}" + cached_result = get_cached_results(cache_key) + if cached_result: + logging.info(f"Found cached result for query: {request.query}") + return cached_result + + logging.debug("Updating state with initial message") + perplexity_clone_graph.update_state(config, inputs) + + logging.debug("Invoking perplexity_clone_graph") + outputs = await perplexity_clone_graph.ainvoke(inputs, config) + + final_response = outputs['messages'][-1].content + needs_more_info = outputs.get('needs_more_info', False) + + logging.info(f"Final response: {final_response}") + logging.info(f"Needs more info: {needs_more_info}") + + response = QueryResponse(response=final_response, needs_more_info=needs_more_info) + + # Cache the result only if DEV_MODE is false + if use_cache: + set_cached_results(cache_key, response.dict()) + + return response + except Exception as e: + logging.error(f"Error in interactive query: {str(e)}", exc_info=True) + raise HTTPException(status_code=500, detail=f"An error occurred during the query process: {str(e)}") + +def generate_random_alphanumeric(length=4): + import random + import string + characters = string.ascii_letters + string.digits + return ''.join(random.choice(characters) for i in range(length)) diff --git a/routers/langchain/neo4j_graph_qa.py b/routers/langchain/neo4j_graph_qa.py new file mode 100644 index 0000000..bf2c65a --- /dev/null +++ b/routers/langchain/neo4j_graph_qa.py @@ -0,0 +1,153 @@ +from dotenv import load_dotenv, find_dotenv +load_dotenv(find_dotenv()) +import os +import modules.logger_tool as logger +log_name = 'api_routers_langchain_graph_qa' +log_dir = os.getenv("LOG_PATH", "/logs") # Default path as fallback +logging = logger.get_logger( + name=log_name, + log_level=os.getenv("LOG_LEVEL", "DEBUG"), + log_path=log_dir, + log_file=log_name, + runtime=True, + log_format='default' +) +from fastapi import APIRouter, HTTPException +from langchain.chains import GraphCypherQAChain +from langchain_community.graphs import Neo4jGraph +from langchain_community.chat_models import ChatOpenAI +from langchain.prompts.prompt import PromptTemplate +from routers.llm.private.ollama.ollama_wrapper import OllamaWrapper + +router = APIRouter() + +# Define the schema for nodes and relationships +node_types = { + "KeyStage": ["merged", "key_stage_name", "unique_id", "created"], + "KeyStageSyllabus": ["ks_syllabus_name", "unique_id", "created", "merged", "ks_syllabus_key_stage", "ks_syllabus_subject"], + "YearGroup": ["created", "merged", "unique_id", "year_group_name"], + "YearGroupSyllabus": ["created", "merged", "yr_syllabus_name", "yr_syllabus_year_group", "yr_syllabus_id", "yr_syllabus_subject"], + "Topic": ["topic_type", "topic_assessment_type", "created", "merged", "unique_id", "topic_id", "total_number_of_lessons_for_topic", "topic_title"], + "Lesson": ["topic_lesson_id", "topic_lesson_type", "created", "merged", "topic_lesson_title", "topic_lesson_length", "topic_lesson_suggested_activities", "topic_lesson_weblinks", "topic_lesson_skills_learned"], + "LearningStatement": ["created", "merged", "lesson_learning_statement", "lesson_learning_statement_id", "lesson_learning_statement_type"] +} + +relationship_types = { + "KEY_STAGE_INCLUDES_KEY_STAGE_SYLLABUS": ["created", "merged"], + "KEY_STAGE_SYLLABUS_INCLUDES_YEAR_GROUP_SYLLABUS": ["created", "merged"], + "YEAR_GROUP_FOLLOWS_YEAR_GROUP": ["created", "merged"], + "KEY_STAGE_FOLLOWS_KEY_STAGE": ["created", "merged"], + "YEAR_SYLLABUS_INCLUDES_TOPIC": ["created", "merged"], + "TOPIC_INCLUDES_LESSON": ["created", "merged"], + "LESSON_INCLUDES_LEARNING_STATEMENT": ["created", "merged"], + "LESSON_FOLLOWS_LESSON": ["created", "merged"] +} + +@router.get("/prompt") +async def query_graph( + database: str, prompt: str, top_k: int = 30, model: str = "gpt-4o", temperature: float = 0, + verbose: bool = False, return_intermediate_steps: bool = False, exclude_types: list = None, include_types: list = None, + return_direct: bool = False, validate_cypher: bool = False, model_type: str = "openai" +): + logging.info(f"Received request with prompt: {prompt}") + if exclude_types is None: + logging.info("No exclude_types provided, using default.") + exclude_types = [] + if include_types is None: + logging.info("No include_types provided, using default.") + include_types = [] + + # Validate include_types and exclude_types + logging.info(f"Validating include_types and exclude_types...") + valid_types = set(node_types.keys()).union(set(relationship_types.keys())) + logging.info(f"Valid types: {valid_types}") + exclude_types = [t for t in exclude_types if t in valid_types] + logging.info(f"Validated exclude_types: {exclude_types}") + include_types = [t for t in include_types if t in valid_types] + logging.info(f"Validated include_types: {include_types}") + + graph = Neo4jGraph( + url=os.environ['APP_BOLT_URL'], + username=os.environ['USER_NEO4J'], + password=os.environ['PASSWORD_NEO4J'], + database=database + ) + + logging.info("Refreshing schema...") + graph.refresh_schema() + logging.info("Schema refreshed.") + schema = graph.schema + logging.info(f"Schema: {schema}") + + CYPHER_GENERATION_TEMPLATE = """Task: Generate a Cypher statement to query a graph database for timetable information. + Role: + You are an assistant in a school for teachers, specializing in querying graph databases to find answers to questions. + The teacher will ask you questions about their timetable. + + Instructions: + 1. Use only the provided relationship types and properties in the schema. + 2. Do not use any other relationship types or properties that are not provided. + + Schema: + {schema} + + Note: + 1. Do not include any explanations or apologies in your responses. + 2. Do not respond to any questions that might ask anything else than for you to construct a Cypher statement. + 3. Do not include any text except the generated Cypher statement. + + The question is: + {question}""" + + CYPHER_GENERATION_PROMPT = PromptTemplate( + input_variables=["schema", "question"], + template=CYPHER_GENERATION_TEMPLATE + ) + + if model_type == "ollama": + ollama_host = os.getenv("OLLAMA_URL") + ollama_port = os.getenv("OLLAMA_PORT") + if not ollama_host or not ollama_port: + raise HTTPException(status_code=500, detail="Ollama host or port not set") + client = OllamaWrapper(host=f'http://{ollama_host}:{ollama_port}') + cypher_llm = client + qa_llm = client + else: + cypher_llm = ChatOpenAI(temperature=temperature, model=model) + qa_llm = ChatOpenAI(temperature=temperature, model=model) + + chain = GraphCypherQAChain.from_llm( + graph=graph, + cypher_llm=cypher_llm, + qa_llm=qa_llm, + top_k=top_k, + verbose=verbose, + cypher_prompt=CYPHER_GENERATION_PROMPT, + return_intermediate_steps=return_intermediate_steps, + exclude_types=exclude_types, + include_types=include_types, + return_direct=return_direct, + validate_cypher=validate_cypher + ) + + formatted_prompt = CYPHER_GENERATION_PROMPT.format(schema=schema, question=prompt) + + logging.info("\n\n") + + logging.info("==================================================") + logging.info("= graph_qa.py =") + logging.info("==================================================") + logging.info(f"Prompt: {prompt}") + logging.info("--------------------------------------------------") + logging.info(f"Schema: \n{schema}\n") + logging.info("--------------------------------------------------") + logging.info(f"Formatted Prompt: \n{formatted_prompt}\n") + logging.info("--------------------------------------------------") + logging.info(f"Cypher prompt: \n{CYPHER_GENERATION_PROMPT}\n") + logging.info("--------------------------------------------------") + logging.info(f"Cypher template: \n{CYPHER_GENERATION_TEMPLATE}\n") + logging.info("--------------------------------------------------") + logging.info(f"Cypher chain: \n{chain}\n") + logging.info("==================================================") + + return chain(prompt) \ No newline at end of file diff --git a/routers/langchain/test.ipynb b/routers/langchain/test.ipynb new file mode 100644 index 0000000..40bbba0 --- /dev/null +++ b/routers/langchain/test.ipynb @@ -0,0 +1,151 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Running simple query tests with OpenAI:\n", + "\n", + "Testing simple queries using openai model:\n", + "\n", + "Query: What is the history of Maidstone, England?\n", + "Sending query to http://localhost:8000/api/langchain/interactive_langgraph_query/query with payload: {'query': 'What is the history of Maidstone, England?', 'model': 'openai'}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "ERROR:root:Error sending query to http://localhost:8000/api/langchain/interactive_langgraph_query/query: 500 Server Error: Internal Server Error for url: http://localhost:8000/api/langchain/interactive_langgraph_query/query\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Response:\n", + "{\n", + " \"error\": \"500 Server Error: Internal Server Error for url: http://localhost:8000/api/langchain/interactive_langgraph_query/query\"\n", + "}\n", + "==================================================\n" + ] + } + ], + "source": [ + "from dotenv import load_dotenv, find_dotenv\n", + "load_dotenv(find_dotenv())\n", + "import os\n", + "import logging\n", + "# Function to send a query and get the response\n", + "import requests\n", + "import json\n", + "\n", + "# Define the URL of your FastAPI server\n", + "BASE_URL = \"http://localhost:8000\" # Adjust this if your server is running on a different port or host\n", + "\n", + "# Define the endpoint\n", + "ENDPOINT = f\"{BASE_URL}/api/langchain/interactive_langgraph_query/query\"\n", + "\n", + "def send_query(query, model=\"ollama\"):\n", + " payload = {\"query\": query, \"model\": model}\n", + " headers = {\"Content-Type\": \"application/json\"}\n", + " print(f\"Sending query to {ENDPOINT} with payload: {payload}\")\n", + " \n", + " try:\n", + " response = requests.post(ENDPOINT, json=payload, headers=headers)\n", + " response.raise_for_status()\n", + " print(f\"Received response from {ENDPOINT}: {response.json()}\")\n", + " return response.json()\n", + " except requests.exceptions.RequestException as e:\n", + " logging.error(f\"Error sending query to {ENDPOINT}: {str(e)}\")\n", + " return {\"error\": str(e)}\n", + "\n", + "def test_simple_queries(model=\"openai\"):\n", + " queries = [\n", + " \"What is the history of Maidstone, England?\"\n", + " ]\n", + " \n", + " print(f\"Testing simple queries using {model} model:\")\n", + " for query in queries:\n", + " print(f\"\\nQuery: {query}\")\n", + " result = send_query(query, model)\n", + " print(\"Response:\")\n", + " print(json.dumps(result, indent=2))\n", + " print(\"=\" * 50)\n", + "\n", + "def test_followup_queries(model=\"openai\"):\n", + " queries = [\n", + " \"What is the latest local news from a particular town?\"\n", + " ]\n", + " \n", + " print(f\"Testing queries requiring follow-up using {model} model:\")\n", + " for query in queries:\n", + " print(f\"\\nInitial Query: {query}\")\n", + " result = send_query(query, model)\n", + " print(\"Initial Response:\")\n", + " print(json.dumps(result, indent=2))\n", + " \n", + " follow_up_count = 0\n", + " max_follow_ups = 3\n", + " \n", + " while result.get(\"needs_more_info\", False) and follow_up_count < max_follow_ups:\n", + " follow_up = input(\"Please provide more information: \")\n", + " follow_up_query = f\"{query} {follow_up}\"\n", + " follow_up_result = send_query(follow_up_query, model)\n", + " print(f\"\\nFollow-up Response {follow_up_count + 1}:\")\n", + " print(json.dumps(follow_up_result, indent=2))\n", + " \n", + " result = follow_up_result\n", + " follow_up_count += 1\n", + " \n", + " if follow_up_count == max_follow_ups:\n", + " print(\"\\nMaximum number of follow-ups reached. Moving to next query.\")\n", + " elif not result.get(\"needs_more_info\", False):\n", + " print(\"\\nFinal Response:\")\n", + " print(json.dumps(result, indent=2))\n", + " \n", + " print(\"=\" * 50)\n", + "\n", + "# Run the tests\n", + "#print(\"Running simple query tests with Ollama:\\n\")\n", + "#test_simple_queries(\"ollama\")\n", + "\n", + "print(\"\\nRunning simple query tests with OpenAI:\\n\")\n", + "test_simple_queries(\"openai\")\n", + "\n", + "#print(\"\\nRunning follow-up query tests with Ollama:\\n\")\n", + "#test_followup_queries(\"ollama\")\n", + "\n", + "#print(\"\\nRunning follow-up query tests with OpenAI:\\n\")\n", + "#test_followup_queries(\"openai\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/routers/llm/private/__init__.py b/routers/llm/private/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/routers/llm/private/__pycache__/__init__.cpython-311.pyc b/routers/llm/private/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6858fa055d6dae18ad17f0a4794a09ae05027687 GIT binary patch literal 145 zcmZ3^%ge<81b?;MGeGoX5CH>>P{wCAAY(d13PUi1CZpd)5K;i>4 PBO~Jn1{hJq3={(ZRN^0p literal 0 HcmV?d00001 diff --git a/routers/llm/private/ollama/__init__.py b/routers/llm/private/ollama/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/routers/llm/private/ollama/__pycache__/__init__.cpython-311.pyc b/routers/llm/private/ollama/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..96648574dcb97b0033b242ac089c885d5baf5b1f GIT binary patch literal 152 zcmZ3^%ge<81b?;MGeGoX5CH>>P{wCAAY(d13PUi1CZpdBam&;sY}yBjX1K7*WIw6axTw+9ERm literal 0 HcmV?d00001 diff --git a/routers/llm/private/ollama/__pycache__/ollama.cpython-311.pyc b/routers/llm/private/ollama/__pycache__/ollama.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..228eec24d479b662c4a2980ed7b02b9f8a1e260d GIT binary patch literal 6861 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 Y?+qc2ryA% str: + if isinstance(prompt, StringPromptValue): + prompt = prompt.to_string() + + model_name = kwargs.get("model", "llama3") + options = { + "temperature": kwargs.get("temperature"), + "top_p": kwargs.get("top_p"), + "max_tokens": kwargs.get("max_tokens"), + } + messages = [{"role": "user", "content": prompt}] + response = self.client.chat(model=model_name, messages=messages, options=options) + if response and "message" in response and "content" in response["message"]: + return response["message"]["content"] + else: + raise ValueError("Invalid response structure from model") + + async def ainvoke(self, prompt: Any, config: Dict[str, Any] = None, **kwargs: Any) -> str: + return self.invoke(prompt, config, **kwargs) diff --git a/routers/llm/public/__init__.py b/routers/llm/public/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/routers/llm/public/__pycache__/__init__.cpython-311.pyc b/routers/llm/public/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb23a303e489029bede53bbc112050fbb1483d10 GIT binary patch literal 144 zcmZ3^%ge<81b?;MGeGoX5CH>>P{wCAAY(d13PUi1CZpd>P{wCAAY(d13PUi1CZpd&ryk0@&FAkgB{FKt1RJ$TppjMFK V#r#0x12ZEd;|B&9QN#=s0{}>8A-n(p literal 0 HcmV?d00001 diff --git a/routers/llm/public/openai/__pycache__/openai.cpython-311.pyc b/routers/llm/public/openai/__pycache__/openai.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..36ca56be7f4888e1de1155a6dedd1a6c4fe34884 GIT binary patch literal 5075 zcmcInU2GKB6~6PcKeM}D|9jUMJC1E^7J-d}2@pF3V}ot%7!pzywxHE!XT0oY_9ruA z0gjA{L+}U3n zD{Z9Sx%17Ld(PaSbMHOhoj=soc?hI`@0+^vJCOd4FQw!t3Y&jr2>F>G%B$AG%q)5c_L?Wq-xG1CSi$vaEjLJm~r)r8-ABjZM z>5LY|QL2&1Cu9@5^?dJ8G@Bh#s4vtZSxyaQ7vGf=v7rnMFq$Yn2D8@{T$~gdK~Q@D za#fe+}usLb8`x=3Hniu6L=`av>682!3hq@*-niRz%@mOgk6$b z62L{C1-7EENMOmAUFWd;6Pav6&S-B-?=MO)lMe6^OqM%kdsLmbTp2p6YRIeLz!cm+ zN;5(WLMwt3fsVfuB{zZ#z;Z0enW(0;VF4X#5T#uuz>n1#fErJE{kb!_GdIte{-)I< zw^KUb0XffinEM8EQ!5u%#q~pX9P6(cZT&{wfX)v>&Qk=zZUq}yYAeo7BxVmWl2tOP ztY*0sd#tf?^Z;w@?a$%fT!qqE!hqMcDt)pni_9{)!-D0uRJ&jAg3bN19YX}7VH?Gi zEX^=Umf|N#q8Dirg=LZ~TZ`;10`KTlnkGqYOCqsfDDkB#F)q_B`n&8hX5#`iRndgVk^)6qD%EUMk6iEVH#S z3F2;zuRekee}nyy{eby^T;nd1515c=eyQbcDJCVZN@90$`d;haqt;9zIuh6A=6-;W zNgSMZx$y=A!zs57a%CdP2K!s~b`wMp<`Y&y>QEXGdH^5Ck2qn{Q_*Cr!$PvBuvYo#;zpidvdoc0YtloA4 zb4fv0aEMhpz+Tx6u+&;LbTtdnNy4!!*e~cf+F5QzvNcbh!2myDEw2iZY*B^IiIU|M zB`une={5{CSS~pek0;V`i%+B%GFCm^@)2<{m5n6TOxkkBPv=Hn_mlZvg%YSB`wkdvDF@jRW@rk3uINhEC)|Cymg_JU?OZ6FNUpUnIsZy6&~#>iP?zDfLy~8=sHZBe*)NnC6F{r%m9obxhng)%mj|G8#F?V#z{HC74~e?xT!`6 zd$-l*p&D=42bwyGtJGJKpiQ4`1>3I9YMGMKk`k5e!$OgR>=o^_qxBOJ#%6g^(Q6Sc z^PZGe;|nzX;|RxYNtJC>j z$a%ik?CsCZt_Iilti7c3{gCr~zuDQHJGF9j_0;V*biNyMp6@mT!Q6Q6+A4SJhRz2e z=lP)7-ItqO*}FQj&aE9YJe@k<2RTm>1e*-8e-$!}+a52HVNC!<2B94I3kWU$9}X0e zsY>gXTqUX?aSt@^2zm?XhI}k0goQLX+r5&a4?vxz_(;6ji=~ z{*_rDTRRfsrK_J`N2Yw)jO=Qfv-)RnZjP<#cav+1ALSN}ZY~ zUBMxRS`|EJC`i@O9J2ZH0KClW!3oTP$(8BHfzGv`8iBz_fx{02 zht0OmwUpWZvf0sNbQ~~u_Zqv0>@r~AklDI>?NXth1Ydnh+(G{{gq7(+6Y1Ksartw% zadi6YM&szLarC@#^e1}rCCt7{-v&C3K{EkxlkmQ5%a_voZr?(B6j zn${9A1rM#3Q@fsp^O#LB7z=DZa@waM1^2kcW>mW1EbqHfH4&T0q!$u!f}5E?eby4< zk~RltI#~F)KP@L7@Zi_o3FT7ys)Fm$a@zl}_HP=VrYt_2fj?h7Tu~0AOJ&Qi+H?1q z{nLD0IS+Qos_I_=;jqFmCfTpQD4V29ugxYI(09%zY1eDBNrW7|OybYc3l3&XOU`AG z=JkOMXm%h^1`JxIDePJa7{adgqj{mv5c+aXu=O;ow5<#4?1rHCypj(dGJ=P6VI(h% z7{W--`Hj%D(*CQC+Z|xbvrJ=wY=@P^Q!IT}QMoy0s6e*E>cyv6`mCbz5Z3+6j*mL@ zx;=TO-(dO+td|+P*Hs|!sK8T>umdG+VV8^9Qy|-6{n%41eO6I5ZLhwA8Ph|r7YIBn MP^rJBn4Sv$1GC6cP5=M^ literal 0 HcmV?d00001 diff --git a/routers/llm/public/openai/openai.py b/routers/llm/public/openai/openai.py new file mode 100644 index 0000000..3c8dc4c --- /dev/null +++ b/routers/llm/public/openai/openai.py @@ -0,0 +1,77 @@ +from fastapi import APIRouter, HTTPException +from pydantic import BaseModel +from typing import List, Dict, Optional +from openai import OpenAI +import os +import logging + +# Set up logging configuration +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + +# Instantiate the OpenAI client +client = OpenAI(api_key=os.getenv("OPENAI_API_KEY")) + +router = APIRouter() + +class Message(BaseModel): + role: str + content: str + +class CopilotRequest(BaseModel): + model: str + messages: List[Message] + options: Optional[Dict[str, float]] = None + +@router.post("/openai_copilot_prompt") +async def openai_copilot_prompt(request: CopilotRequest): + logging.info("Received request: %s", request.model_dump_json()) + try: + response = client.chat.completions.create( + model=request.model, + messages=[{"role": msg.role, "content": msg.content} for msg in request.messages], + **(request.options or {}) + ) + logging.info("Received response: %s", response) + return {"model": request.model, "response": response.choices[0].message.content} + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + +class GeneralOpenAIRequest(BaseModel): + model: str + prompt: str + max_tokens: Optional[int] = 100 + temperature: Optional[float] = 0.7 + top_p: Optional[float] = 1.0 + n: Optional[int] = 1 + stop: Optional[List[str]] = None + +@router.post("/openai_general_prompt") +async def openai_general_prompt(request: GeneralOpenAIRequest): + logging.info("Received general request: %s", request.model_dump_json()) + try: + if "gpt-4" in request.model or "gpt-3.5" in request.model: + messages = [{"role": "user", "content": request.prompt}] + response = client.chat.completions.create( + model=request.model, + messages=messages, + max_tokens=request.max_tokens, + temperature=request.temperature, + top_p=request.top_p, + n=request.n, + stop=request.stop + ) + return {"model": request.model, "response": response.choices[0].message.content} + else: + response = client.completions.create( + model=request.model, + prompt=request.prompt, + max_tokens=request.max_tokens, + temperature=request.temperature, + top_p=request.top_p, + n=request.n, + stop=request.stop + ) + return {"model": request.model, "response": response.choices[0].text} + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) diff --git a/routers/msgraph/__init__.py b/routers/msgraph/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/routers/msgraph/__pycache__/__init__.cpython-311.pyc b/routers/msgraph/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b82ade5a9f37221781ea2d8449551becdbe3a318 GIT binary patch literal 141 zcmZ3^%ge<81b?;MGeGoX5CH>>P{wCAAY(d13PUi1CZpd4BO~Jn L1{hJq3={(ZxSSpa literal 0 HcmV?d00001 diff --git a/routers/msgraph/__pycache__/router_onenote.cpython-311.pyc b/routers/msgraph/__pycache__/router_onenote.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b926f816a6276b9a57a43dd1a00c41ae01afbbda GIT binary patch literal 9037 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 literal 0 HcmV?d00001 diff --git a/routers/rpi/rpi_whisperlive_client.py b/routers/rpi/rpi_whisperlive_client.py new file mode 100644 index 0000000..5efabb7 --- /dev/null +++ b/routers/rpi/rpi_whisperlive_client.py @@ -0,0 +1,18 @@ +from fastapi import APIRouter, HTTPException +from pydantic import BaseModel +import jwt +import os + +router = APIRouter() + +class LoginRequest(BaseModel): + device_id: str + +@router.post("/login") +async def rpi_login(request: LoginRequest): + if request.device_id == "rpi_zero": + token = jwt.encode({"device_id": request.device_id}, os.getenv("FASTAPI_SECRET_KEY"), algorithm="HS256") + return {"token": token} + else: + raise HTTPException(status_code=401, detail="Unauthorized") + diff --git a/routers/solid/__init__.py b/routers/solid/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/routers/solid/__pycache__/__init__.cpython-311.pyc b/routers/solid/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ac6a8144fc24d98f722c2eb85e818632886d37c9 GIT binary patch literal 139 zcmZ3^%ge<81b?;MGeGoX5CH>>P{wCAAY(d13PUi1CZpd&ryk0@&FAkgB{FKt1RJ$TppmLCb#r#0x12ZEd;|B&9 JQN#=s0{~|39W4L= literal 0 HcmV?d00001 diff --git a/routers/solid/__pycache__/pod_provisioner.cpython-311.pyc b/routers/solid/__pycache__/pod_provisioner.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f0845c2d403f744821242fcd998413f970cecd31 GIT binary patch literal 6672 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 literal 0 HcmV?d00001 diff --git a/routers/solid/pod_provisioner.py b/routers/solid/pod_provisioner.py new file mode 100644 index 0000000..cc68dbb --- /dev/null +++ b/routers/solid/pod_provisioner.py @@ -0,0 +1,142 @@ +from fastapi import APIRouter, HTTPException +from pydantic import BaseModel +from pathlib import Path +import os +from typing import Optional +from modules.logger_tool import initialise_logger + +# Initialize logger +logger = initialise_logger(__name__, os.getenv("LOG_LEVEL", "info"), os.getenv("LOG_PATH", "/logs")) + +# Create router +router = APIRouter() + +# === CONFIG === +SOLID_BASE_URL = os.getenv("SOLID_BASE_URL", "http://solid.classroomcopilot.test") +SOLID_STORAGE_PATH = os.getenv("SOLID_STORAGE_PATH", "/data/users") # Path relative to Solid server data directory +KEYCLOAK_ISSUER = os.getenv("KEYCLOAK_ISSUER", "http://keycloak.classroomcopilot.test/realms/ClassroomCopilot") + +# === DATA MODEL === +class UserCreateRequest(BaseModel): + username: str + full_name: str + email: Optional[str] = None + +# === UTILITIES === +def create_profile_card(username: str, full_name: str, email: Optional[str] = None) -> str: + webid = f"{SOLID_BASE_URL}/users/{username}/profile/card#me" + profile_content = f"""@prefix foaf: . +@prefix solid: . +@prefix vcard: . + +<#me> a foaf:Person ; + foaf:name "{full_name}" ; + solid:oidcIssuer <{KEYCLOAK_ISSUER}> .""" + + if email: + profile_content += f""" + vcard:hasEmail .""" + + return profile_content + +def create_acl_file(username: str) -> str: + return f"""@prefix acl: . +@prefix foaf: . + +<#authorization> + a acl:Authorization ; + acl:agent <{SOLID_BASE_URL}/users/{username}/profile/card#me> ; + acl:accessTo <./> ; + acl:default <./> ; + acl:mode acl:Read, acl:Write, acl:Control ; + acl:agentClass foaf:Agent .""" + +def create_public_acl() -> str: + return """@prefix acl: . +@prefix foaf: . + +<#authorization> + a acl:Authorization ; + acl:agentClass foaf:Agent ; + acl:accessTo <./> ; + acl:default <./> ; + acl:mode acl:Read .""" + +# === ENDPOINTS === +@router.post("/provision") +async def provision_user(data: UserCreateRequest): + """ + Create a new Solid pod for a user with their profile card and ACL files. + """ + try: + # Create user directory structure + user_base = Path(SOLID_STORAGE_PATH) / data.username + profile_dir = user_base / "profile" + public_dir = user_base / "public" + private_dir = user_base / "private" + + # Create directories + for dir_path in [profile_dir, public_dir, private_dir]: + dir_path.mkdir(parents=True, exist_ok=True) + + # Create profile card + profile_path = profile_dir / "card.ttl" + profile_content = create_profile_card(data.username, data.full_name, data.email) + profile_path.write_text(profile_content) + + # Create ACL files + profile_acl_path = profile_dir / ".acl" + profile_acl_content = create_acl_file(data.username) + profile_acl_path.write_text(profile_acl_content) + + public_acl_path = public_dir / ".acl" + public_acl_content = create_public_acl() + public_acl_path.write_text(public_acl_content) + + private_acl_path = private_dir / ".acl" + private_acl_content = create_acl_file(data.username) + private_acl_path.write_text(private_acl_content) + + webid = f"{SOLID_BASE_URL}/users/{data.username}/profile/card#me" + + logger.info(f"Successfully provisioned Solid pod for user {data.username}") + + return { + "message": "User pod created successfully", + "webid": webid, + "profile_path": str(profile_path), + "pod_structure": { + "profile": str(profile_dir), + "public": str(public_dir), + "private": str(private_dir) + } + } + + except Exception as e: + logger.error(f"Error provisioning Solid pod for user {data.username}: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + +@router.get("/status/{username}") +async def check_pod_status(username: str): + """ + Check if a user's Solid pod exists and return its status. + """ + try: + user_base = Path(SOLID_STORAGE_PATH) / username + profile_path = user_base / "profile" / "card.ttl" + + if not profile_path.exists(): + return { + "exists": False, + "message": "Pod not found" + } + + return { + "exists": True, + "webid": f"{SOLID_BASE_URL}/users/{username}/profile/card#me", + "profile_path": str(profile_path) + } + + except Exception as e: + logger.error(f"Error checking pod status for user {username}: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) diff --git a/routers/transcribe/__init__.py b/routers/transcribe/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/routers/transcribe/utterance.py b/routers/transcribe/utterance.py new file mode 100644 index 0000000..dd3678e --- /dev/null +++ b/routers/transcribe/utterance.py @@ -0,0 +1,42 @@ +from fastapi import APIRouter, Request +import os +import queue +from dotenv import load_dotenv +import json + +load_dotenv() + +router = APIRouter() + +@router.post("/handle_whisper_live_eos_utterance/{user_id}") +async def handle_whisper_live_eos_utterance(user_id: str, request: Request): + data = await request.json() + utterance = data.get("utterance") + print(f"Utterance: {utterance}") + start = data.get("start") + end = data.get("end") + print(f"Start: {start}") + print(f"End: {end}") + eos = data.get("eos") + print(f"Eos: {eos}") + user_dir = f"../../data/users/{user_id}/transcripts" + if not os.path.exists(user_dir): + os.makedirs(user_dir) + + log_file = os.path.join(user_dir, "utterances.log") + with open(log_file, "a") as f: + f.write(json.dumps(data) + "\n") + + return {"message": "Utterance logged successfully"} + +@router.get("/get_utterances/{user_id}") +async def get_utterances(user_id: str): + user_dir = f"../../data/users/{user_id}/transcripts" + log_file = os.path.join(user_dir, "utterances.log") + if not os.path.exists(log_file): + return {"utterances": []} + + with open(log_file, "r") as f: + utterances = [json.loads(line) for line in f] + + return {"utterances": utterances} diff --git a/run/__init__.py b/run/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/run/__pycache__/__init__.cpython-311.pyc b/run/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d82920ba0b69cbc6e3f2b12eac205021ec1ef1f3 GIT binary patch literal 129 zcmZ3^%ge<81b?;MGeGoX5CH>>P{wCAAY(d13PUi1CZpd4BO~Jn1{hJq3={(Z@Fp1= literal 0 HcmV?d00001 diff --git a/run/__pycache__/routers.cpython-311.pyc b/run/__pycache__/routers.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9af8705214c182dac368b14f5c3ab5198611cccc GIT binary patch literal 6428 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 literal 0 HcmV?d00001 diff --git a/run/dependencies.py b/run/dependencies.py new file mode 100644 index 0000000..7190015 --- /dev/null +++ b/run/dependencies.py @@ -0,0 +1,45 @@ +from fastapi import HTTPException, Security +from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm +from jose import JWTError, jwt +from datetime import datetime, timedelta +from typing import Optional +from dotenv import load_dotenv +import os + +load_dotenv() +SECRET_KEY = os.getenv("FASTAPI_SECRET_KEY") +ALGORITHM = "HS256" +ACCESS_TOKEN_EXPIRE_MINUTES = 30 + +oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token") + +class TokenData: + username: Optional[str] = None + +def create_access_token(data: dict, expires_delta: Optional[timedelta] = None): + to_encode = data.copy() + if expires_delta: + expire = datetime.utcnow() + expires_delta + else: + expire = datetime.utcnow() + timedelta(minutes=15) + to_encode.update({"exp": expire}) + encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM) + return encoded_jwt + +def verify_token(token: str, credentials_exception): + try: + payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM]) + username: str = payload.get("sub") + if username is None: + raise credentials_exception + token_data = TokenData(username=username) + except JWTError: + raise credentials_exception + +def admin_dependency(token: str = Security(oauth2_scheme)): + credentials_exception = HTTPException( + status_code=HTTPException, + detail="Could not validate credentials", + headers={"WWW-Authenticate": "Bearer"}, + ) + return verify_token(token, credentials_exception) \ No newline at end of file diff --git a/run/initialization/__init__.py b/run/initialization/__init__.py new file mode 100644 index 0000000..122594d --- /dev/null +++ b/run/initialization/__init__.py @@ -0,0 +1,26 @@ +from .manager import InitializationManager +from .initialization import InitializationSystem +from modules.logger_tool import initialise_logger +import os + +logger = initialise_logger(__name__, os.getenv("LOG_LEVEL"), os.getenv("LOG_PATH"), 'default', True) + +def initialize_system() -> None: + """Initialize the system if needed""" + init_manager = InitializationManager() + + if not init_manager.check_initialization_needed(): + logger.info("No initialization needed") + return + + logger.info("Starting system initialization...") + + init_system = InitializationSystem(init_manager) + success = init_system.run() + + if success: + logger.info("System initialization completed successfully") + else: + logger.error("System initialization failed") + +__all__ = ['initialize_system', 'InitializationManager', 'InitializationSystem'] \ No newline at end of file diff --git a/run/initialization/__pycache__/__init__.cpython-311.pyc b/run/initialization/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..677b3ae12bec5a080ac5f485c77e3c990b7e1476 GIT binary patch literal 1555 zcma)6&1>976d!#{)_RlrqaSI&3Q0=Wl-(Aup^&D~hTs;vu49{m7s?=ZX4guzk{M|W z-fmzig%)3OOb$IPp|~yi2Xg2ke}WVQT?Pt<;6rW(-vWWmNW1IE@gbu(k2mw1_c8Ci z(O;936M&7E^Gn-A0^k{6jD|K8jvp}LK0p8oE@%lgLEy6JiY=)oFIK-1#66}xAl=Zr0xpVe)^l!@f$um&tpG#UZ!(QlYOH*} z1XphUaC3#~TwMEV^Bbxm+_2kjxJgxl!#45iSy&loxdVJ2yDXafARONkfPJ?8C_BaY zUC;&n*U&L=>RfO!luxiexBbRILOy3K|KbLC3q9$yUTB;c?}9vfSLh1;aTQL^y>TYO zHbR?(j@KM(<(jBmE_Xi38s@Zxy5HJyafp!>wCi;o1dX=q?shJoeY#;gE=DDdKQcf+ ztZ(D`9hi>^X3u+kNtL)BH8^#iFH zYA(d)Vqz{H0Z}>kzh1m&?wQd{Io2zQUWxR|KrjBT9?BEHE&s9{onMIMY9d!7xq3MD zQNJ5cRgXOY(HfM{O4eGh}{_ob4PJDem nxxOB4{use}Y@ozIJ@rUFFR)VO*%e^k5~7JUMm>#xY4ooE-y?yZ literal 0 HcmV?d00001 diff --git a/run/initialization/__pycache__/initialization.cpython-311.pyc b/run/initialization/__pycache__/initialization.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a12c7262032d6c7db8778014aec8a4268fdb5af GIT binary patch literal 80720 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 G0skMRCAxC} literal 0 HcmV?d00001 diff --git a/run/initialization/__pycache__/manager.cpython-311.pyc b/run/initialization/__pycache__/manager.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..937c2799b27c6d4569a42df6d8dc4205bde9711c GIT binary patch literal 8100 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 literal 0 HcmV?d00001 diff --git a/run/initialization/initialization.py b/run/initialization/initialization.py new file mode 100644 index 0000000..a8b20da --- /dev/null +++ b/run/initialization/initialization.py @@ -0,0 +1,1704 @@ +#!/usr/bin/env python3 +""" +ClassroomCopilot Initialization System +This script orchestrates the initialization of all system components. +""" +import os +import sys +import json +import time +import requests +import csv +from typing import Dict, Any, Optional +from datetime import datetime, timedelta +from modules.database.services.neo4j_service import Neo4jService +from modules.database.supabase.utils.client import SupabaseServiceRoleClient, CreateBucketOptions +from modules.database.init.init_user import NonSchoolUserCreator +from modules.database.init.init_calendar import create_calendar +import modules.database.init.init_school as init_school +import modules.database.init.init_school_timetable as init_school_timetable +import modules.database.init.init_school_curriculum as init_school_curriculum +import modules.database.init.xl_tools as xl +from modules.database.schemas.nodes.schools.schools import SchoolNode +from modules.logger_tool import initialise_logger +from modules.database.tools.neo4j_driver_tools import get_session +import modules.database.schemas.nodes.structures.schools as school_structures +import modules.database.tools.neontology_tools as neon +import modules.database.schemas.relationships.entity_relationships as entity_relationships +import modules.database.schemas.relationships.structures.schools as structure_relationships + +logger = initialise_logger(__name__, os.getenv("LOG_LEVEL"), os.getenv("LOG_PATH"), 'default', True) + +# Configuration +SUPABASE_URL = os.environ.get("SUPABASE_URL") +SERVICE_ROLE_KEY = os.environ.get("SERVICE_ROLE_KEY") +ADMIN_EMAIL = os.environ.get("ADMIN_EMAIL") +ADMIN_PASSWORD = os.environ.get("ADMIN_PASSWORD") +ADMIN_NAME = os.environ.get("ADMIN_NAME", "Super Admin") +ADMIN_FULL_NAME = os.environ.get("ADMIN_FULL_NAME", "Super Admin Full Name") +POSTGRES_PASSWORD = os.environ.get("POSTGRES_PASSWORD") +POSTGRES_DB = os.environ.get("POSTGRES_DB") +ADMIN_USERNAME = os.environ.get("ADMIN_USERNAME", "superadmin") +ADMIN_DISPLAY_NAME = os.environ.get("ADMIN_DISPLAY_NAME", "Super Admin") + +class InitializationSystem: + """Main initialization system that orchestrates all components""" + + def __init__(self, manager=None): + if manager: + self.manager = manager + self.supabase_headers = manager.supabase_headers + self.status = manager.status + else: + # Fallback to original standalone behavior + self.supabase_headers = { + "apikey": SERVICE_ROLE_KEY, + "Authorization": f"Bearer {SERVICE_ROLE_KEY}", + "Content-Type": "application/json" + } + self.manager = None + self.status = self._load_status() + + self.admin_token = None + self.init_dir = "/app/data/init" + + # Ensure data directory exists + os.makedirs(self.init_dir, exist_ok=True) + + # Copy template files if they don't exist + self._ensure_data_files() + + self.neo4j_service = Neo4jService() + + def _ensure_data_files(self): + """Ensure required data files exist""" + # Check for schools data file + csv_path = os.path.join(self.init_dir, "sample_schools.csv") + if not os.path.exists(csv_path): + logger.warning(f"Schools data file not found at {csv_path}") + + def _load_status(self) -> Dict: + """Load initialization status from file or create default""" + try: + with open("/init/status.json", "r") as f: + status = json.load(f) + + # Verify all required keys exist + default_status = { + "super_admin_created": False, + "admin_token_obtained": False, + "storage": { + "initialized": False, + "buckets": { + "cc.users": False, + "cc.institutes": False + } + }, + "neo4j": { + "initialized": False, + "database_created": False, + "schema_initialized": False, + "schools_imported": False + }, + "cc_database": { + "initialized": False, + "database_created": False, + "schema_initialized": False, + "calendar_created": False + }, + "completed": False, + "timestamp": None, + "steps": [] + } + + # Recursively update status with any missing keys + def update_dict(current: Dict, default: Dict) -> Dict: + for key, value in default.items(): + if key not in current: + current[key] = value + elif isinstance(value, dict) and isinstance(current[key], dict): + current[key] = update_dict(current[key], value) + return current + + status = update_dict(status, default_status) + self._save_status(status) + return status + + except (FileNotFoundError, json.JSONDecodeError): + default_status = { + "super_admin_created": False, + "admin_token_obtained": False, + "storage": { + "initialized": False, + "buckets": { + "cc.users": False, + "cc.institutes": False + } + }, + "neo4j": { + "initialized": False, + "database_created": False, + "schema_initialized": False, + "schools_imported": False + }, + "cc_database": { + "initialized": False, + "database_created": False, + "schema_initialized": False, + "calendar_created": False + }, + "completed": False, + "timestamp": None, + "steps": [] + } + self._save_status(default_status) + return default_status + + def _save_status(self, status: Dict) -> None: + """Save initialization status to file""" + if self.manager: + self.manager._save_status(status) + else: + # Fallback to direct file save + os.makedirs(os.path.dirname("/init/status.json"), exist_ok=True) + with open("/init/status.json", "w") as f: + json.dump(status, f, indent=2) + + def update_status(self, key: str, value: Any) -> None: + """Update a specific status key and save""" + if isinstance(value, dict): + if key not in self.status: + self.status[key] = {} + self.status[key].update(value) + else: + self.status[key] = value + + self.status["timestamp"] = time.time() + self._save_status(self.status) + + def wait_for_services(self) -> bool: + """Wait for required services to be available""" + logger.info("Waiting for services to be available...") + + def check_supabase_endpoint(endpoint: str, description: str) -> bool: + """Check a specific Supabase endpoint with retry logic""" + max_retries = 30 + retry_count = 0 + initial_delay = 5 + max_delay = 30 + + while retry_count < max_retries: + try: + url = f"{SUPABASE_URL}/{endpoint}" + logger.info(f"Checking Supabase {description} at {url}") + + response = requests.get( + url, + headers={"apikey": SERVICE_ROLE_KEY}, + timeout=10 # Add timeout to prevent hanging + ) + + if response.status_code < 500: + logger.info(f"Supabase {description} is available") + return True + + logger.warning( + f"Supabase {description} returned status {response.status_code}: {response.text}" + ) + + except requests.RequestException as e: + logger.warning(f"Error checking Supabase {description}: {str(e)}") + + retry_count += 1 + if retry_count < max_retries: + # Calculate delay with exponential backoff + delay = min(initial_delay * (2 ** (retry_count - 1)), max_delay) + logger.info( + f"Waiting for Supabase {description}... " + f"({retry_count}/{max_retries}, next retry in {delay}s)" + ) + time.sleep(delay) + + logger.error(f"Supabase {description} is not available after {max_retries} attempts") + return False + + # Check multiple Supabase endpoints + endpoints = [ + ("rest/v1/", "REST API"), + ("auth/v1/", "Auth API"), + ("storage/v1/", "Storage API") + ] + + for endpoint, description in endpoints: + if not check_supabase_endpoint(endpoint, description): + logger.error(f"Failed to connect to Supabase {description}") + return False + + logger.info("All Supabase services are available") + return True + + def check_super_admin_exists(self) -> bool: + """Check if super admin exists in both auth and profiles""" + try: + # Ensure Supabase headers are properly set + self._ensure_supabase_headers() + + # 1. Check auth.users table + response = self._supabase_request_with_retry( + 'get', + f"{SUPABASE_URL}/auth/v1/admin/users", + headers=self.supabase_headers + ) + + if response.status_code != 200: + logger.error(f"Failed to check auth users: {response.text}") + return False + + try: + # Parse the response + auth_data = response.json() + + # Check if we have the expected structure + if not isinstance(auth_data, dict) or 'users' not in auth_data: + logger.error(f"Unexpected auth users response structure: {auth_data}") + return False + + # Find our admin in the list of users + auth_user = next( + (user for user in auth_data['users'] + if isinstance(user, dict) and user.get("email") == ADMIN_EMAIL), + None + ) + + if not auth_user: + logger.info("Super admin not found in auth.users") + return False + + user_id = auth_user.get("id") + logger.info(f"Found auth user with ID: {user_id}") + + # Verify the user has the correct metadata + app_metadata = auth_user.get("app_metadata", {}) + if app_metadata.get("role") != "supabase_admin": + logger.info("User exists but is not a supabase_admin") + return False + + # 2. Check public.profiles table + response = self._supabase_request_with_retry( + 'get', + f"{SUPABASE_URL}/rest/v1/profiles", + headers=self.supabase_headers, + params={ + "select": "*", + "email": f"eq.{ADMIN_EMAIL}" + } + ) + + if response.status_code != 200: + logger.error(f"Failed to check profiles: {response.text}") + return False + + try: + profiles = response.json() + if not isinstance(profiles, list): + logger.error(f"Unexpected profiles response format: {profiles}") + return False + + if not profiles: + logger.info("Super admin not found in public.profiles") + return False + + profile = profiles[0] + if not isinstance(profile, dict): + logger.error(f"Unexpected profile format: {profile}") + return False + + # Verify admin status and username + user_type = profile.get("user_type") + username = profile.get("username") + if user_type != "admin" or not username: + logger.info(f"User exists but is not properly configured (type: {user_type}, username: {username})") + return False + + logger.info("Super admin exists and is properly configured") + return True + + except json.JSONDecodeError as e: + logger.error(f"Failed to parse profiles response: {str(e)}") + return False + + except json.JSONDecodeError as e: + logger.error(f"Failed to parse auth users response: {str(e)}") + return False + + except Exception as e: + logger.error(f"Error checking super admin existence: {str(e)}") + return False + + def create_super_admin(self) -> bool: + """Create the super admin user""" + if self.status.get("super_admin_created"): + if self.check_super_admin_exists(): + logger.info("Super admin already exists and is properly configured") + return True + else: + logger.warning("Status indicates super admin created but verification failed") + + logger.info(f"Creating super admin user with email: {os.getenv('ADMIN_EMAIL')}") + + try: + # Create the main users database first + try: + with get_session() as session: + logger.info("Creating main users database cc.users") + session.run("CREATE DATABASE cc.users IF NOT EXISTS") + # Wait for database to be available + time.sleep(2) # Give Neo4j time to create the database + + # Verify database exists + result = session.run("SHOW DATABASES") + databases = [record["name"] for record in result] + if "cc.users" not in databases: + logger.error("Failed to create cc.users database") + return False + logger.info("Successfully created cc.users database") + except Exception as e: + logger.error(f"Failed to create cc.users database: {str(e)}") + return False + + # Create user data structure directly + user_data = { + "email": os.getenv('ADMIN_EMAIL'), + "password": os.getenv('ADMIN_PASSWORD'), + "email_confirm": True, + "user_metadata": { + "name": os.getenv('ADMIN_NAME'), + "username": ADMIN_USERNAME, + "full_name": os.getenv('ADMIN_FULL_NAME'), + "display_name": ADMIN_DISPLAY_NAME, + "user_type": "admin" # Set this explicitly for admin + }, + "app_metadata": { + "provider": "email", + "providers": ["email"], + "role": "supabase_admin" + } + } + + # Create user via Auth API + response = self._supabase_request_with_retry( + 'post', + f"{SUPABASE_URL}/auth/v1/admin/users", + headers=self.supabase_headers, + json=user_data + ) + + if response.status_code not in (200, 201): + logger.error(f"Failed to create admin user: {response.text}") + return False + + user_id = response.json().get("id") + logger.info(f"Created auth user with ID: {user_id}") + + # Add a small delay to ensure user is created + time.sleep(2) + + # Call setup_initial_admin function to set admin profile + response = self._supabase_request_with_retry( + 'post', + f"{SUPABASE_URL}/rest/v1/rpc/setup_initial_admin", + headers=self.supabase_headers, + json={ + "admin_email": os.getenv('ADMIN_EMAIL') + } + ) + + if response.status_code not in (200, 201, 204): + logger.error(f"Failed to set up admin profile: {response.text}") + return False + + admin_profile = response.json() + logger.info(f"Updated user profile to admin type: {admin_profile}") + + # Get admin access token + login_data = { + "email": os.getenv('ADMIN_EMAIL'), + "password": os.getenv('ADMIN_PASSWORD') + } + + response = self._supabase_request_with_retry( + 'post', + f"{SUPABASE_URL}/auth/v1/token?grant_type=password", + headers={ + "apikey": os.getenv('SERVICE_ROLE_KEY'), + "Content-Type": "application/json" + }, + json=login_data + ) + + if response.status_code not in (200, 201): + logger.error(f"Failed to get admin access token: {response.text}") + return False + + admin_access_token = response.json().get("access_token") + if not admin_access_token: + logger.error("No access token in response") + return False + + # Store admin user ID and access token in status for later use + self.status["admin_user_id"] = user_id + self.status["admin_access_token"] = admin_access_token + self._save_status(self.status) + + # Create Neo4j database and graph for super admin + try: + # Create the admin's private database and graph + def safe_parse_date(date_str): + """Parse date string in YYYY-MM-DD format, return None if invalid""" + if not date_str: + return None + try: + return datetime.strptime(date_str, '%Y-%m-%d').date() + except ValueError: + logger.warning(f"Invalid date format: {date_str}. Expected YYYY-MM-DD") + return None + + cc_users_db_name = "cc.users" + user_type = "admin" + worker_type = "superadmin" + user_email = os.getenv('SUPER_ADMIN_EMAIL') + worker_email = os.getenv('SUPER_ADMIN_WORKER_EMAIL') + cc_username = os.getenv('SUPER_ADMIN_USERNAME') + user_name = os.getenv('SUPER_ADMIN_NAME') + worker_name = os.getenv('SUPER_ADMIN_DISPLAY_NAME') + calendar_start_date = os.getenv('SUPER_ADMIN_CALENDAR_START_DATE') # Expected format: 2025-01-01 + calendar_end_date = os.getenv('SUPER_ADMIN_CALENDAR_END_DATE') # Expected format: 2025-01-01 + admin_creator = NonSchoolUserCreator( + user_id=user_id, + cc_users_db_name=cc_users_db_name, # Main users database + user_type=user_type, + worker_type=worker_type, + user_email=user_email, + worker_email=worker_email, + cc_username=cc_username, + user_name=user_name, + worker_name=worker_name, + calendar_start_date=safe_parse_date(calendar_start_date), + calendar_end_date=safe_parse_date(calendar_end_date) + ) + + # Create the user nodes and relationships + user_nodes = admin_creator.create_user(access_token=admin_access_token) + logger.info(f"Initialised super admin user nodes: {user_nodes}") + + if not user_nodes.get(f'default_user_node'): + logger.error("Failed to create admin user node in the default database") + return False + if not user_nodes.get(f'private_user_node'): + logger.error(f"Failed to create admin user node in the {admin_creator.user_type} database") + return False + if not user_nodes.get('worker_node'): + logger.error("Failed to create admin super admin node") + return False + + logger.info(f"Created Neo4j nodes for admin user: {user_nodes}") + + except Exception as e: + logger.error(f"Failed to create admin Neo4j database and graph: {str(e)}") + return False + + # Wait for changes to propagate + logger.info("Waiting for changes to propagate...") + time.sleep(2) + + # Verify the setup + if self.check_super_admin_exists(): + logger.info("Super admin exists and is properly configured") + self.status["super_admin_created"] = True + self._save_status(self.status) + logger.info("Super admin created and verified successfully") + return True + else: + logger.error("Failed to verify super admin setup") + return False + + except Exception as e: + logger.error(f"Error creating super admin: {str(e)}") + return False + + def get_admin_token(self) -> bool: + """Get an access token for the admin user""" + if self.status.get("admin_token_obtained"): + logger.info("Admin token already obtained, skipping...") + return True + + logger.info("Getting admin access token...") + + # Add a small delay to ensure auth system is ready + time.sleep(2) + + # Try multiple times with increasing delays + max_retries = 5 + for retry in range(max_retries): + try: + # Sign in with admin credentials + login_data = { + "email": ADMIN_EMAIL, + "password": ADMIN_PASSWORD + } + + logger.info(f"Attempting to login as {ADMIN_EMAIL} (attempt {retry+1}/{max_retries})") + + # Use the retry mechanism but with custom headers + response = self._supabase_request_with_retry( + 'post', + f"{SUPABASE_URL}/auth/v1/token?grant_type=password", + headers={ + "apikey": SERVICE_ROLE_KEY, + "Content-Type": "application/json" + }, + json=login_data + ) + + if response.status_code in (200, 201): + # Extract the access token + self.admin_token = response.json().get("access_token") + + if self.admin_token: + logger.info("Admin token obtained successfully") + self.update_status("admin_token_obtained", True) + return True + else: + logger.error("No access token in response") + else: + logger.error(f"Failed to get admin token (attempt {retry+1}): {response.text}") + + # Increase delay with each retry + wait_time = (retry + 1) * 2 + logger.info(f"Waiting {wait_time} seconds before next attempt...") + time.sleep(wait_time) + + except Exception as e: + logger.error(f"Error getting admin token: {str(e)}") + time.sleep((retry + 1) * 2) + + # If we get here, all retries failed + logger.error("Failed to get admin token after multiple attempts") + + # As a fallback, try to use the service role key directly + logger.info("Falling back to using service role key for API calls") + self.admin_token = SERVICE_ROLE_KEY + self.update_status("admin_token_obtained", True) + return True + + def log_step(self, step: str, success: bool, message: Optional[str] = None) -> None: + """Log a step in the initialization process""" + step_log = { + "step": step, + "success": success, + "timestamp": time.time(), + "message": message + } + if "steps" not in self.status: + self.status["steps"] = [] + self.status["steps"].append(step_log) + self._save_status(self.status) + + if success: + logger.info(f"Step '{step}' completed successfully") + else: + logger.error(f"Step '{step}' failed: {message}") + + def initialize_storage(self) -> bool: + """Initialize storage buckets and policies""" + if self.status["storage"]["initialized"]: + logger.info("Storage already initialized, skipping...") + return True + + logger.info("Initializing storage buckets and policies...") + + try: + # Initialize storage client with admin user ID and access token + admin_user_id = self.status.get("admin_user_id") + admin_access_token = self.status.get("admin_access_token") + if not admin_user_id or not admin_access_token: + raise ValueError("Admin user ID and access token are required for bucket initialization") + + # Create Supabase client with service role access and admin token + supabase = SupabaseServiceRoleClient.for_admin(admin_access_token) + + # Define core buckets + core_buckets = [ + { + "id": "cc.users", + "name": "CC Users", + "public": False, + "file_size_limit": 50 * 1024 * 1024, # 50MB + "allowed_mime_types": [ + 'image/*', 'video/*', 'application/pdf', + 'application/msword', 'application/vnd.openxmlformats-officedocument.*', + 'text/plain', 'text/csv', 'application/json' + ] + }, + { + "id": "cc.institutes", + "name": "CC Institutes", + "public": False, + "file_size_limit": 50 * 1024 * 1024, # 50MB + "allowed_mime_types": [ + 'image/*', 'video/*', 'application/pdf', + 'application/msword', 'application/vnd.openxmlformats-officedocument.*', + 'text/plain', 'text/csv', 'application/json' + ] + } + ] + + # Create each core bucket + results = [] + for bucket in core_buckets: + try: + # Create bucket with properly typed options + options = CreateBucketOptions( + public=bucket["public"], + file_size_limit=bucket["file_size_limit"], + allowed_mime_types=bucket["allowed_mime_types"], + name=bucket["name"] + ) + result = supabase.create_bucket(bucket["id"], options=options) + results.append({ + "bucket": bucket["id"], + "status": "success", + "result": result + }) + except Exception as e: + logger.error(f"Error creating bucket {bucket['id']}: {str(e)}") + results.append({ + "bucket": bucket["id"], + "status": "error", + "error": str(e) + }) + + # Update status based on results + for result in results: + bucket_id = result["bucket"] + success = result["status"] == "success" + self.status["storage"]["buckets"][bucket_id] = success + if success: + self.log_step(f"storage_bucket_{bucket_id}", True, "Bucket created successfully") + else: + self.log_step(f"storage_bucket_{bucket_id}", False, f"Failed to create bucket {bucket_id}: {result.get('error', 'Unknown error')}") + return False + + # Check if all buckets were created successfully + if all(self.status["storage"]["buckets"].values()): + logger.info("Storage initialization completed successfully") + self.status["storage"]["initialized"] = True + self._save_status(self.status) + return True + else: + logger.error("Some buckets failed to initialize") + return False + + except Exception as e: + self.log_step("storage_initialization", False, str(e)) + return False + + def create_schools_database(self) -> bool: + """Create the schools Neo4j database""" + if self.status.get("schools_db_created"): + logger.info("Schools database already created, skipping...") + return True + + logger.info("Creating schools Neo4j database...") + + # For now, we'll just mark this as done since we can't easily create the Neo4j database directly + # In a production environment, you would need to use the Neo4j Admin API or a direct connection + logger.info("Schools database creation marked as completed") + self.update_status("schools_db_created", True) + return True + + def initialize_schema(self) -> bool: + """Initialize Neo4j schema (constraints and indexes)""" + if self.status.get("schema_initialized"): + logger.info("Schema already initialized, skipping...") + return True + + logger.info("Initializing Neo4j schema...") + + # For now, we'll just mark this as done since we can't easily initialize the schema directly + # In a production environment, you would need to use the Neo4j Cypher API or a direct connection + logger.info("Schema initialization marked as completed") + self.update_status("schema_initialized", True) + return True + + def import_sample_schools(self) -> bool: + """Import sample schools data""" + if self.status.get("neo4j", {}).get("schools_imported"): + logger.info("Sample schools already imported, skipping...") + return True + + logger.info("Importing sample schools data...") + + try: + # Ensure Supabase headers are properly set + self._ensure_supabase_headers() + + # Check if schools CSV exists + csv_path = os.path.join(self.init_dir, "sample_schools.csv") + if not os.path.exists(csv_path): + logger.warning("No schools CSV file found, skipping import") + self.status["neo4j"]["schools_imported"] = True + self._save_status(self.status) + return True + + # Read and parse the CSV file + with open(csv_path, "r") as f: + csv_reader = csv.DictReader(f) + schools = list(csv_reader) + + logger.info(f"Found {len(schools)} schools in CSV file") + + # Add a date format conversion function + def convert_date_format(date_str: str) -> Optional[str]: + """Convert date from DD-MM-YYYY to YYYY-MM-DD format""" + if not date_str or date_str == "": + return None + try: + if "-" in date_str: + day, month, year = date_str.split("-") + return f"{year}-{month}-{day}" + return None + except: + return None + + # Import each school + success_count = 0 + for school in schools: + try: + # Format the school data + school_data = { + "urn": school.get("URN"), + "establishment_name": school.get("EstablishmentName"), + "la_code": school.get("LA (code)"), + "la_name": school.get("LA (name)"), + "establishment_number": school.get("EstablishmentNumber"), + "establishment_type": school.get("TypeOfEstablishment (name)"), + "establishment_type_group": school.get("EstablishmentTypeGroup (name)"), + "establishment_status": school.get("EstablishmentStatus (name)"), + "reason_establishment_opened": school.get("ReasonEstablishmentOpened (name)"), + "open_date": school.get("OpenDate"), + "reason_establishment_closed": school.get("ReasonEstablishmentClosed (name)"), + "close_date": school.get("CloseDate"), + "phase_of_education": school.get("PhaseOfEducation (name)"), + "statutory_low_age": school.get("StatutoryLowAge"), + "statutory_high_age": school.get("StatutoryHighAge"), + "boarders": school.get("Boarders (name)"), + "nursery_provision": school.get("NurseryProvision (name)"), + "official_sixth_form": school.get("OfficialSixthForm (name)"), + "gender": school.get("Gender (name)"), + "religious_character": school.get("ReligiousCharacter (name)"), + "religious_ethos": school.get("ReligiousEthos (name)"), + "diocese": school.get("Diocese (name)"), + "admissions_policy": school.get("AdmissionsPolicy (name)"), + "school_capacity": school.get("SchoolCapacity"), + "special_classes": school.get("SpecialClasses (name)"), + "census_date": school.get("CensusDate"), + "number_of_pupils": school.get("NumberOfPupils"), + "number_of_boys": school.get("NumberOfBoys"), + "number_of_girls": school.get("NumberOfGirls"), + "percentage_fsm": school.get("PercentageFSM"), + "trust_school_flag": school.get("TrustSchoolFlag (name)"), + "trusts_name": school.get("Trusts (name)"), + "school_sponsor_flag": school.get("SchoolSponsorFlag (name)"), + "school_sponsors_name": school.get("SchoolSponsors (name)"), + "federation_flag": school.get("FederationFlag (name)"), + "federations_name": school.get("Federations (name)"), + "ukprn": school.get("UKPRN"), + "fehe_identifier": school.get("FEHEIdentifier"), + "further_education_type": school.get("FurtherEducationType (name)"), + "ofsted_last_inspection": school.get("OfstedLastInsp"), + "last_changed_date": school.get("LastChangedDate"), + "street": school.get("Street"), + "locality": school.get("Locality"), + "address3": school.get("Address3"), + "town": school.get("Town"), + "county": school.get("County (name)"), + "postcode": school.get("Postcode"), + "school_website": school.get("SchoolWebsite"), + "telephone_num": school.get("TelephoneNum"), + "head_title": school.get("HeadTitle (name)"), + "head_first_name": school.get("HeadFirstName"), + "head_last_name": school.get("HeadLastName"), + "head_preferred_job_title": school.get("HeadPreferredJobTitle"), + "gssla_code": school.get("GSSLACode (name)"), + "parliamentary_constituency": school.get("ParliamentaryConstituency (name)"), + "urban_rural": school.get("UrbanRural (name)"), + "rsc_region": school.get("RSCRegion (name)"), + "country": school.get("Country (name)"), + "uprn": school.get("UPRN"), + "sen_stat": school.get("SENStat") == "true", + "sen_no_stat": school.get("SENNoStat") == "true", + "sen_unit_on_roll": school.get("SenUnitOnRoll"), + "sen_unit_capacity": school.get("SenUnitCapacity"), + "resourced_provision_on_roll": school.get("ResourcedProvisionOnRoll"), + "resourced_provision_capacity": school.get("ResourcedProvisionCapacity") + } + + # Update the data type conversion section + for key, value in school_data.items(): + if value == "": + school_data[key] = None + elif key in ["statutory_low_age", "statutory_high_age", "school_capacity", + "number_of_pupils", "number_of_boys", "number_of_girls", + "sen_unit_on_roll", "sen_unit_capacity", + "resourced_provision_on_roll", "resourced_provision_capacity"]: + try: + if value is not None and value != "": + school_data[key] = int(float(value)) # Handle both integer and decimal strings + except (ValueError, TypeError): + school_data[key] = None + elif key in ["percentage_fsm"]: + try: + if value is not None and value != "": + school_data[key] = float(value) + except (ValueError, TypeError): + school_data[key] = None + elif key in ["open_date", "close_date", "census_date", "ofsted_last_inspection", "last_changed_date"]: + if value and value != "": + # Convert date format + converted_date = convert_date_format(value) + if converted_date: + school_data[key] = converted_date + else: + school_data[key] = None + else: + school_data[key] = None + + # Insert the school into the institute_imports table + response = self._supabase_request_with_retry( + 'post', + f"{SUPABASE_URL}/rest/v1/institute_imports", + headers=self.supabase_headers, + json=school_data + ) + + if response.status_code in (200, 201): + try: + response_data = response.json() + success_count += 1 + logger.info(f"Successfully imported school {school.get('URN')}: {school.get('EstablishmentName')}") + except json.JSONDecodeError as e: + # If we can't parse the response but the status code was successful, consider it a success + if response.status_code in (200, 201): + success_count += 1 + logger.info(f"Successfully imported school {school.get('URN')}: {school.get('EstablishmentName')} (response not JSON)") + else: + logger.error(f"Failed to parse response for school {school.get('URN')}: {e}, Response: {response.text}") + else: + logger.error(f"Failed to import school {school.get('URN')}: {response.text}") + + except Exception as e: + logger.error(f"Error importing school {school.get('URN')}: {str(e)}") + + logger.info(f"Successfully imported {success_count} out of {len(schools)} schools") + + # Mark as completed even if some schools failed + self.status["neo4j"]["schools_imported"] = True + self._save_status(self.status) + return True + + except Exception as e: + logger.error(f"Error importing sample schools: {str(e)}") + return False + + def initialize_calendar_database(self) -> bool: + """Initialize the main calendar database""" + if self.status.get("calendar_database", {}).get("initialized"): + logger.info("Calendar database already initialized, skipping...") + return True + + try: + # Initialize the status dictionaries if they don't exist + self.status.setdefault("calendar_database", {}) + self.status.setdefault("cc_database", {}) + + # 1. Create main calendar database + logger.info("Creating main calendar database...") + result = self.neo4j_service.create_database("cc.calendar") + if result["status"] != "success": + self.log_step("calendar_database_creation", False, result["message"]) + return False + + self.status["calendar_database"]["database_created"] = True + self.log_step("calendar_database_creation", True) + + # 2. Create the cc.calendar storage bucket + logger.info("Creating cc.calendar storage bucket...") + admin_access_token = self.status.get("admin_access_token") + if not admin_access_token: + self.log_step("calendar_storage_creation", False, "Admin access token not found") + return False + + storage_client = SupabaseServiceRoleClient.for_admin(admin_access_token) + try: + bucket_options = CreateBucketOptions( + name="CC Calendar Files", + public=True, + file_size_limit=50 * 1024 * 1024, # 50MB + allowed_mime_types=[ + 'image/*', 'video/*', 'application/pdf', + 'application/msword', 'application/vnd.openxmlformats-officedocument.*', + 'text/plain', 'text/csv', 'application/json' + ] + ) + storage_client.create_bucket("cc.calendar", bucket_options) + self.status["calendar_database"]["storage_created"] = True + self.log_step("calendar_storage_creation", True) + except Exception as e: + self.log_step("calendar_storage_creation", False, str(e)) + return False + + # 3. Initialize schema on calendar database + logger.info("Initializing Neo4j schema on calendar database...") + result = self.neo4j_service.initialize_schema("cc.calendar") + if result["status"] != "success": + self.log_step("calendar_schema_initialization", False, result["message"]) + return False + + self.status["calendar_database"]["schema_initialized"] = True + self.log_step("calendar_schema_initialization", True) + + # 4. Create test calendar + logger.info("Creating test calendar...") + start_date = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0) + end_date = start_date + timedelta(days=90) # 3 months + + calendar_nodes = create_calendar( + db_name="cc.calendar", + start_date=start_date, + end_date=end_date, + attach_to_calendar_node=True, + owner_node=None, + time_chunk_node_length=0 + ) + + if calendar_nodes: + self.status["cc_database"]["calendar_created"] = True + self.log_step("cc_calendar_creation", True) + else: + self.log_step("cc_calendar_creation", False, "Failed to create calendar") + return False + + self.status["calendar_database"]["initialized"] = True + self.status["cc_database"]["initialized"] = True + self._save_status(self.status) + return True + + except Exception as e: + self.log_step("cc_database_initialization", False, str(e)) + return False + + def initialize_neo4j(self) -> bool: + """Initialize Neo4j databases and schema""" + if self.status["neo4j"]["initialized"]: + logger.info("Neo4j already initialized, skipping...") + return True + + try: + # 1. Create main schools database + logger.info("Creating main schools database...") + result = self.neo4j_service.create_database("cc.institutes") + if result["status"] != "success": + self.log_step("neo4j_database_creation", False, result["message"]) + return False + + self.status["neo4j"]["database_created"] = True + self.log_step("neo4j_database_creation", True) + + # 2. Initialize schema on the custom database + logger.info("Initializing Neo4j schema on cc.institutes database...") + result = self.neo4j_service.initialize_schema("cc.institutes") + if result["status"] != "success": + self.log_step("neo4j_schema_initialization", False, result["message"]) + return False + + self.status["neo4j"]["schema_initialized"] = True + self.log_step("neo4j_schema_initialization", True) + + self.status["neo4j"]["initialized"] = True + self._save_status(self.status) + return True + + except Exception as e: + self.log_step("neo4j_initialization", False, str(e)) + return False + + def initialize_default_school(self) -> bool: + """Initialize the default school structure with public and private databases""" + if self.status.get("default_school", {}).get("initialized"): + logger.info("Default school already initialized, skipping...") + return True + + try: + # Default school configuration + school_config = { + "id": "default", + "type": "development", + "name": "Default School", + "website": "https://example.com", + "timetable_file": "default_institute/default_timetable.xlsx", + "curriculum_file": "default_institute/default_curriculum.xlsx" + } + + # Ensure Supabase headers are properly set + self._ensure_supabase_headers() + + # Define database names following the convention + base_path = f"cc.institutes.{school_config['type']}.{school_config['id']}" + public_db_name = base_path + private_db_name = base_path # Removed .private suffix + curriculum_db_name = f"{base_path}.curriculum" + + # Create public school node first + logger.info("Creating public school node...") + public_school_node = SchoolNode( + unique_id=f'School_{school_config["id"]}', + tldraw_snapshot="", + id=school_config["id"], + school_type=school_config["type"], + name=school_config["name"], + website=school_config["website"] + ) + + # 1. Create storage buckets for school + logger.info("Creating storage buckets for default school...") + admin_access_token = self.status.get("admin_access_token") + if not admin_access_token: + self.log_step("default_school_storage", False, "Admin access token not found") + return False + + bucket_results = init_school.create_school_buckets( + school_id=school_config["id"], + school_type=school_config["type"], + school_name=school_config["name"], + admin_access_token=admin_access_token + ) + + # Check if all buckets were created successfully + expected_buckets = [ + f"{base_path}.public", # Public bucket + f"{base_path}.private", # Private bucket + f"{base_path}.curriculum.public", # Public curriculum bucket + f"{base_path}.curriculum.private" # Private curriculum bucket + ] + + for bucket_id in expected_buckets: + if bucket_id not in bucket_results or bucket_results[bucket_id]["status"] != "success": + self.log_step("default_school_storage", False, f"Failed to create bucket {bucket_id}") + return False + + self.status.setdefault("default_school", {})["storage_created"] = True + self.log_step("default_school_storage", True) + + # 2. Create school node in public database + result = init_school.create_school( + db_name=public_db_name, + id=school_config["id"], + name=school_config["name"], + website=school_config["website"], + school_type=school_config["type"], + is_public=True, + school_node=public_school_node + ) + + if not result: + self.log_step("default_school_public_creation", False, "Failed to create public school node") + return False + + self.status.setdefault("default_school", {})["public_created"] = True + self.log_step("default_school_public_creation", True) + + # 3. Create private school database and node + logger.info(f"Creating private school database: {private_db_name}") + result = self.neo4j_service.create_database(private_db_name) + if result["status"] != "success": + self.log_step("default_school_private_creation", False, result["message"]) + return False + + # Create private school node with more details + logger.info("Creating private school node...") + private_school_node = SchoolNode( + unique_id=f'School_{school_config["id"]}', + tldraw_snapshot="", + id=school_config["id"], + school_type=school_config["type"], + name=school_config["name"], + website=school_config["website"], + # Add required private fields with default values + establishment_number="0000", + establishment_name=school_config["name"], + establishment_type="Development", + establishment_status="Open", + phase_of_education="All", + statutory_low_age=11, + statutory_high_age=18, + school_capacity=1000 + ) + + # Create school node in private database + result = init_school.create_school( + db_name=private_db_name, + id=school_config["id"], + name=school_config["name"], + website=school_config["website"], + school_type=school_config["type"], + is_public=False, + school_node=private_school_node + ) + + if not result: + self.log_step("default_school_private_creation", False, "Failed to create private school node") + return False + + # Create curriculum database + logger.info(f"Creating curriculum database: {curriculum_db_name}") + result = self.neo4j_service.create_database(curriculum_db_name) + if result["status"] != "success": + self.log_step("default_school_curriculum_creation", False, result["message"]) + return False + + # 4. Import timetable data + logger.info("Importing timetable data...") + timetable_path = os.path.join(self.init_dir, school_config["timetable_file"]) + if not os.path.exists(timetable_path): + self.log_step("default_school_timetable", False, f"Timetable file not found: {timetable_path}") + return False + + school_timetable_dataframes = xl.create_dataframes(timetable_path) + init_school_timetable.create_school_timetable( + dataframes=school_timetable_dataframes, + db_name=private_db_name, + school_node=private_school_node + ) + self.status["default_school"]["timetable_imported"] = True + self.log_step("default_school_timetable", True) + + # 5. Import curriculum data + logger.info("Importing curriculum data...") + curriculum_path = os.path.join(self.init_dir, school_config["curriculum_file"]) + if not os.path.exists(curriculum_path): + self.log_step("default_school_curriculum", False, f"Curriculum file not found: {curriculum_path}") + return False + + school_curriculum_dataframes = xl.create_dataframes(curriculum_path) + init_school_curriculum.create_curriculum( + dataframes=school_curriculum_dataframes, + db_name=private_db_name, + curriculum_db_name=curriculum_db_name, + school_node=private_school_node + ) + self.status["default_school"]["curriculum_imported"] = True + self.log_step("default_school_curriculum", True) + + # 6. Add the default school to Supabase institutes table + logger.info("Adding default school to Supabase institutes table...") + try: + # Check if the school already exists in the institutes table + response = self._supabase_request_with_retry( + 'get', + f"{SUPABASE_URL}/rest/v1/institutes", + headers=self.supabase_headers, + params={ + "select": "*", + "name": f"eq.{school_config['name']}" + } + ) + + if response.status_code != 200: + logger.error(f"Failed to check institutes table: {response.text}") + self.log_step("default_school_supabase", False, f"Failed to check institutes table: {response.text}") + return False + + existing_institutes = response.json() + institute_id = None + + if existing_institutes and len(existing_institutes) > 0: + # School already exists, use its ID + institute_id = existing_institutes[0]["id"] + logger.info(f"Default school already exists in institutes table with ID: {institute_id}") + else: + # Create the school in the institutes table + address_json = {"street": "123 Dev Street", "city": "Development City", "postcode": "DEV123"} + metadata_json = { + "school_type": school_config["type"], + "id": school_config["id"] + } + + school_data = { + "name": school_config["name"], + "urn": f"DEV-{school_config['id']}", + "status": "active", + "website": school_config["website"], + "address": json.dumps(address_json), + "metadata": json.dumps(metadata_json), + "neo4j_unique_id": private_school_node.unique_id, + "neo4j_public_sync_status": "synced", + "neo4j_public_sync_at": datetime.now().isoformat(), + "neo4j_private_sync_status": "synced", + "neo4j_private_sync_at": datetime.now().isoformat() + } + + # Log the request data for debugging + logger.debug(f"Sending request to create institute with data: {school_data}") + + response = self._supabase_request_with_retry( + 'post', + f"{SUPABASE_URL}/rest/v1/institutes", + headers=self.supabase_headers, + json=school_data + ) + + if response.status_code not in (200, 201): + logger.error(f"Failed to add default school to institutes table: {response.text}") + self.log_step("default_school_supabase", False, f"Failed to add default school to institutes table: {response.text}") + return False + + # Handle the response more carefully + try: + response_data = response.json() + if isinstance(response_data, list) and len(response_data) > 0: + institute_id = response_data[0]["id"] + elif isinstance(response_data, dict) and "id" in response_data: + institute_id = response_data["id"] + else: + logger.error(f"Unexpected response format: {response_data}") + self.log_step("default_school_supabase", False, f"Unexpected response format: {response_data}") + return False + + logger.info(f"Added default school to institutes table with ID: {institute_id}") + except json.JSONDecodeError as e: + logger.error(f"Failed to parse response from institutes table: {e}, Response: {response.text}") + self.log_step("default_school_supabase", False, f"Failed to parse response from institutes table: {e}") + # If we can't parse the response but the status code was successful, try to continue + # by querying for the school we just created + try: + # Query for the school we just created + query_response = self._supabase_request_with_retry( + 'get', + f"{SUPABASE_URL}/rest/v1/institutes", + headers=self.supabase_headers, + params={ + "select": "*", + "name": f"eq.{school_config['name']}" + } + ) + + if query_response.status_code == 200: + query_data = query_response.json() + if query_data and len(query_data) > 0: + institute_id = query_data[0]["id"] + logger.info(f"Retrieved default school from institutes table with ID: {institute_id}") + else: + logger.error("School was created but could not be retrieved") + self.log_step("default_school_supabase", False, "School was created but could not be retrieved") + return False + else: + logger.error(f"Failed to retrieve created school: {query_response.text}") + self.log_step("default_school_supabase", False, f"Failed to retrieve created school: {query_response.text}") + return False + except Exception as query_error: + logger.error(f"Error retrieving created school: {str(query_error)}") + self.log_step("default_school_supabase", False, f"Error retrieving created school: {str(query_error)}") + return False + + # 7. Add super admin to the default school in Neo4j + logger.info("Adding super admin to default school in Neo4j...") + + # Get the super admin worker node from the status + admin_user_id = self.status.get("admin_user_id") + if not admin_user_id: + logger.error("Admin user ID not found in status") + self.log_step("default_school_admin", False, "Admin user ID not found in status") + return False + + # Initialize Neontology connection + neon.init_neontology_connection() + + # Get the super admin worker node from the admin's private database + admin_db_name = f"cc.users.admin.{os.getenv('SUPER_ADMIN_USERNAME', 'superadmin')}" + + # First, update the worker_db_name property in the super admin node to include the default school + with get_session(database=admin_db_name) as session: + # Get the super admin worker node + result = session.run( + """ + MATCH (n:SuperAdmin {unique_id: $unique_id}) + RETURN n + """, + unique_id=f"SuperAdmin_{admin_user_id}" + ) + + admin_node_record = result.single() + if not admin_node_record: + logger.error(f"Super admin node not found in database {admin_db_name}") + self.log_step("default_school_admin", False, f"Super admin node not found in database {admin_db_name}") + return False + + admin_node = admin_node_record["n"] + + # Update the worker_db_name property to include the default school database + worker_db_name = f"{private_db_name}" + + # Update the worker_db_name property + session.run( + """ + MATCH (n:SuperAdmin {unique_id: $unique_id}) + SET n.worker_db_name = $worker_db_name + """, + unique_id=f"SuperAdmin_{admin_user_id}", + worker_db_name=worker_db_name, + database=admin_db_name + ) + + logger.info(f"Updated super admin worker_db_name to {worker_db_name} in {admin_db_name}") + + # Create a copy of the super admin node in the default school database + from modules.database.schemas.nodes.workers.workers import SuperAdminNode + + # Create the super admin node in the default school database + super_admin_node = SuperAdminNode( + unique_id=f"SuperAdmin_{admin_user_id}", + tldraw_snapshot="", + worker_name=os.getenv('SUPER_ADMIN_DISPLAY_NAME', 'Super Admin'), + worker_email=os.getenv('SUPER_ADMIN_WORKER_EMAIL') or os.getenv('ADMIN_EMAIL', 'admin@example.com'), + worker_db_name=worker_db_name, + worker_type="superadmin" + ) + + # Create the super admin node in the default school database + neon.create_or_merge_neontology_node( + node=super_admin_node, + database=private_db_name, + operation='merge' + ) + + logger.info(f"Created super admin node in default school database {private_db_name}") + + # Create the necessary structure nodes for the school if they don't exist + logger.info("Creating structure nodes for the default school...") + + # Create Staff Structure Node + staff_structure_node = school_structures.StaffStructureNode( + unique_id=f"StaffStructure_{school_config['id']}", + tldraw_snapshot="" + ) + + neon.create_or_merge_neontology_node( + node=staff_structure_node, + database=private_db_name, + operation='merge' + ) + + # Create Student Structure Node + student_structure_node = school_structures.StudentStructureNode( + unique_id=f"StudentStructure_{school_config['id']}", + tldraw_snapshot="" + ) + + neon.create_or_merge_neontology_node( + node=student_structure_node, + database=private_db_name, + operation='merge' + ) + + # Create IT Admin Structure Node + it_admin_structure_node = school_structures.ITAdminStructureNode( + unique_id=f"ITAdminStructure_{school_config['id']}", + tldraw_snapshot="" + ) + + neon.create_or_merge_neontology_node( + node=it_admin_structure_node, + database=private_db_name, + operation='merge' + ) + + # Create relationships between school and structure nodes + # School has Staff Structure + school_staff_rel = structure_relationships.SchoolHasStaffStructure( + source=private_school_node, + target=staff_structure_node + ) + + neon.create_or_merge_neontology_relationship( + relationship=school_staff_rel, + database=private_db_name, + operation='merge' + ) + + # School has Student Structure + school_student_rel = structure_relationships.SchoolHasStudentStructure( + source=private_school_node, + target=student_structure_node + ) + + neon.create_or_merge_neontology_relationship( + relationship=school_student_rel, + database=private_db_name, + operation='merge' + ) + + # School has IT Admin Structure + school_it_admin_rel = structure_relationships.SchoolHasITAdminStructure( + source=private_school_node, + target=it_admin_structure_node + ) + + neon.create_or_merge_neontology_relationship( + relationship=school_it_admin_rel, + database=private_db_name, + operation='merge' + ) + + # Connect super admin to IT Admin Structure + admin_structure_rel = structure_relationships.SuperAdminBelongsToITAdminStructure( + source=super_admin_node, + target=it_admin_structure_node + ) + + neon.create_or_merge_neontology_relationship( + relationship=admin_structure_rel, + database=private_db_name, + operation='merge' + ) + + logger.info("Created structure nodes and relationships for default school") + + # 8. Add super admin to the institute_memberships table in Supabase + logger.info("Adding super admin to institute_memberships table...") + + # Check if the membership already exists + response = self._supabase_request_with_retry( + 'get', + f"{SUPABASE_URL}/rest/v1/institute_memberships", + headers=self.supabase_headers, + params={ + "select": "*", + "profile_id": f"eq.{admin_user_id}", + "institute_id": f"eq.{institute_id}" + } + ) + + if response.status_code != 200: + logger.error(f"Failed to check institute_memberships table: {response.text}") + self.log_step("default_school_admin_membership", False, f"Failed to check institute_memberships table: {response.text}") + return False + + try: + existing_memberships = response.json() + + if not existing_memberships or len(existing_memberships) == 0: + # Create the membership + membership_data = { + "profile_id": admin_user_id, + "institute_id": institute_id, + "role": "admin", + "tldraw_preferences": "{}", # Use string instead of json.dumps({}) + "metadata": json.dumps({ + "worker_type": "superadmin", + "neo4j_unique_id": f"SuperAdmin_{admin_user_id}" + }) + } + + # Log the request data for debugging + logger.debug(f"Sending request to create institute membership with data: {membership_data}") + + response = self._supabase_request_with_retry( + 'post', + f"{SUPABASE_URL}/rest/v1/institute_memberships", + headers=self.supabase_headers, + json=membership_data + ) + + if response.status_code not in (200, 201): + logger.error(f"Failed to add super admin to institute_memberships table: {response.text}") + self.log_step("default_school_admin_membership", False, f"Failed to add super admin to institute_memberships table: {response.text}") + return False + + logger.info("Added super admin to institute_memberships table") + else: + logger.info("Super admin already exists in institute_memberships table") + except json.JSONDecodeError as e: + logger.error(f"Failed to parse response from institute_memberships table: {e}, Response: {response.text}") + self.log_step("default_school_admin_membership", False, f"Failed to parse response from institute_memberships table: {e}") + return False + + self.status["default_school"]["supabase_updated"] = True + self.log_step("default_school_supabase", True) + + except Exception as e: + logger.error(f"Error updating Supabase tables: {str(e)}") + self.log_step("default_school_supabase", False, f"Error updating Supabase tables: {str(e)}") + return False + + # Mark completion + self.status["default_school"]["initialized"] = True + self._save_status(self.status) + return True + + except Exception as e: + self.log_step("default_school_initialization", False, str(e)) + return False + + def _ensure_supabase_headers(self): + """Ensure Supabase headers are properly set""" + if not self.supabase_headers or 'apikey' not in self.supabase_headers: + logger.info("Initializing Supabase headers") + self.supabase_headers = { + "apikey": SERVICE_ROLE_KEY, + "Authorization": f"Bearer {SERVICE_ROLE_KEY}", + "Content-Type": "application/json", + "Prefer": "return=representation" # This ensures Supabase returns the created record + } + elif 'Prefer' not in self.supabase_headers: + # Add the Prefer header if it's missing + self.supabase_headers['Prefer'] = "return=representation" + + logger.debug(f"Using Supabase headers: {self.supabase_headers}") + + def _supabase_request_with_retry(self, method, url, **kwargs): + """Make a request to Supabase with retry logic""" + max_retries = 3 + retry_delay = 2 # seconds + + for attempt in range(max_retries): + try: + if method.lower() == 'get': + response = requests.get(url, **kwargs) + elif method.lower() == 'post': + response = requests.post(url, **kwargs) + elif method.lower() == 'put': + response = requests.put(url, **kwargs) + elif method.lower() == 'delete': + response = requests.delete(url, **kwargs) + else: + raise ValueError(f"Unsupported HTTP method: {method}") + + # If successful or client error (4xx), don't retry + if response.status_code < 500: + return response + + # Server error (5xx), retry after delay + logger.warning(f"Supabase server error (attempt {attempt+1}/{max_retries}): {response.status_code} - {response.text}") + time.sleep(retry_delay * (attempt + 1)) # Exponential backoff + + except requests.RequestException as e: + logger.warning(f"Supabase request exception (attempt {attempt+1}/{max_retries}): {str(e)}") + if attempt == max_retries - 1: + raise + time.sleep(retry_delay * (attempt + 1)) + + # If we get here, all retries failed with server errors + raise requests.RequestException(f"Failed after {max_retries} attempts to {method} {url}") + + def check_completion(self) -> bool: + """Check if all initialization steps are complete""" + try: + # Initialize required status dictionaries if they don't exist + self.status.setdefault("cc_database", {}) + self.status.setdefault("default_school", {}) + + # Add default school check to existing checks + if not (self.status["super_admin_created"] and + self.status["admin_token_obtained"] and + self.status["storage"]["initialized"] and + self.status["neo4j"]["initialized"] and + self.status["neo4j"]["schools_imported"] and + self.status["cc_database"].get("initialized", False) and + self.status["default_school"].get("initialized", False)): + return False + + # Check cc.institutes database + result = self.neo4j_service.check_database_exists("cc.institutes") + if not result.get("exists"): + logger.warning("cc.institutes database does not exist") + self.status["neo4j"]["initialized"] = False + self._save_status(self.status) + return False + + # Check cc database and calendar + result = self.neo4j_service.check_database_exists("cc") + if not result.get("exists"): + logger.warning("cc database does not exist") + self.status["cc_database"]["initialized"] = False + self._save_status(self.status) + return False + + # Verify calendar exists in cc database + try: + result = self.neo4j_service.check_node_exists("cc", "Calendar") + if not result["exists"]: + logger.warning("No calendar found in cc database") + self.status["cc_database"]["calendar_created"] = False + self._save_status(self.status) + return False + except Exception as e: + logger.error(f"Error checking calendar: {str(e)}") + return False + + return True + + except Exception as e: + logger.error(f"Error checking completion: {str(e)}") + return False + + def run(self) -> bool: + """Run the complete initialization process""" + # Check if super admin initialization is required + init_super_admin = os.getenv("SUPER_ADMIN_CHECK", "true").lower() == "true" + + if init_super_admin: + if self.check_completion(): + logger.info("System already initialized, skipping...") + return True + else: + logger.info("Skipping super admin check due to INIT_SUPER_ADMIN being false") + + # Wait for services + if not self.wait_for_services(): + return False + + # Ensure Supabase headers are properly set + self._ensure_supabase_headers() + + # Run initialization steps in order + steps = [ + self.create_super_admin if init_super_admin else lambda: True, + self.get_admin_token, + self.initialize_storage, + self.initialize_neo4j, + self.import_sample_schools, + self.initialize_calendar_database, + self.initialize_default_school + ] + + success = True + for step in steps: + if not step(): + success = False + break + + if success: + logger.info("System initialization completed successfully") + self.status["completed"] = True + self.status["timestamp"] = time.time() + self._save_status(self.status) + else: + logger.error("System initialization failed") + + return success + +if __name__ == "__main__": + init_system = InitializationSystem() + success = init_system.run() + sys.exit(0 if success else 1) \ No newline at end of file diff --git a/run/initialization/manager.py b/run/initialization/manager.py new file mode 100644 index 0000000..b3f84eb --- /dev/null +++ b/run/initialization/manager.py @@ -0,0 +1,146 @@ +""" +Initialization manager for ClassroomCopilot +""" +import os +import json +from typing import Dict +import requests + +from modules.logger_tool import initialise_logger + +logger = initialise_logger(__name__, os.getenv("LOG_LEVEL"), os.getenv("LOG_PATH"), 'default', True) + +class InitializationManager: + def __init__(self): + self.init_dir = "/init" + self.status_file = os.path.join(self.init_dir, "status.json") + self.data_dir = os.path.join(self.init_dir, "data") + self.supabase_url = os.getenv("SUPABASE_URL") + + # Ensure directories exist + os.makedirs(self.init_dir, exist_ok=True) + os.makedirs(self.data_dir, exist_ok=True) + + self.supabase_headers = { + "apikey": os.getenv("SERVICE_ROLE_KEY"), + "Authorization": f"Bearer {os.getenv('SERVICE_ROLE_KEY')}", + "Content-Type": "application/json" + } + + # Define default status structure + self.default_status = { + "super_admin_created": False, + "admin_token_obtained": False, + "storage": { + "initialized": False, + "buckets": { + "cc.users": False, + "cc.institutes": False + } + }, + "neo4j": { + "initialized": False, + "database_created": False, + "schema_initialized": False, + "schools_imported": False + }, + "completed": False, + "timestamp": None, + "steps": [] + } + + self.status = self._load_status() + + def _load_status(self) -> Dict: + """Load or create initialization status""" + try: + with open(self.status_file, "r") as f: + status = json.load(f) + + # Update with any missing keys + def update_dict(current: Dict, default: Dict) -> Dict: + for key, value in default.items(): + if key not in current: + current[key] = value + elif isinstance(value, dict) and isinstance(current[key], dict): + current[key] = update_dict(current[key], value) + return current + + status = update_dict(status, self.default_status) + self._save_status(status) + return status + + except (FileNotFoundError, json.JSONDecodeError): + self._save_status(self.default_status) + return self.default_status.copy() + + def _save_status(self, status: Dict) -> None: + """Save status to file""" + os.makedirs(os.path.dirname(self.status_file), exist_ok=True) + with open(self.status_file, "w") as f: + json.dump(status, f, indent=2) + + def check_admin_exists(self) -> bool: + """Check if super admin already exists""" + try: + responseURL = f"{self.supabase_url}/auth/v1/admin/users" + logger.info(f"Checking admin existence at: {responseURL}") + response = requests.get( + responseURL, + headers=self.supabase_headers + ) + + if response.status_code != 200: + logger.error(f"Error checking admin existence: {response.status_code}") + return False + + data = response.json() + # Fix: response format is {'users': [...], 'aud': 'authenticated'} + users = data.get('users', []) + if not isinstance(users, list): + logger.error(f"Unexpected users format: {users}") + return False + + admin_email = os.getenv('ADMIN_EMAIL') + + # Check for admin in users + admin_user = next( + (user for user in users + if user.get("email") == admin_email + and user.get("app_metadata", {}).get("role") == "supabase_admin"), + None + ) + + if admin_user: + logger.info(f"Super admin {admin_email} already exists") + return True + + return False + + except Exception as e: + logger.error(f"Error checking admin existence: {str(e)}") + return False + + def check_initialization_needed(self) -> bool: + """Check if initialization is needed""" + # First check if admin exists + if self.check_admin_exists(): + logger.info("Super admin exists, skipping initialization") + return False + + # Then check status file + if self.status.get("completed"): + logger.info("Initialization already completed") + return False + + # Check if any step needs completion + incomplete = not all( + v for k, v in self.status.items() + if k not in ("timestamp", "steps") + ) + + if incomplete: + logger.info("Incomplete initialization detected") + return True + + return False \ No newline at end of file diff --git a/run/routers.py b/run/routers.py new file mode 100644 index 0000000..5270183 --- /dev/null +++ b/run/routers.py @@ -0,0 +1,88 @@ +import os +from modules.logger_tool import initialise_logger +logger = initialise_logger(__name__, os.getenv("LOG_LEVEL"), os.getenv("LOG_PATH"), 'default', True) +from fastapi import FastAPI + +# Import all routers here +from routers.health import router as health_router +from routers.msgraph import router_onenote +from routers.dev.tests import timetable_test +from routers.admin_routes import router as admin_routes_router +from routers.database.init import entity_init, calendar, timetables, curriculum, get_data, schools +from routers.database.tools import get_nodes, get_nodes_and_edges, tldraw_filesystem, get_events, calendar_structure_router, default_nodes_router, worker_structure_router +from routers.assets import powerpoint, word, pdf +from routers.llm.private.ollama import ollama +from routers.llm.public.openai import openai +from routers.connections.arbor_router import router as arbor_router +from routers.langchain.neo4j_graph_qa import router as graph_qa_router +from routers.langchain.interactive_langgraph_query import router as interactive_langgraph_query_router +from routers.rpi import rpi_whisperlive_client +from routers.external import youtube +from routers.solid.pod_provisioner import router as solid_pod_router +from routers.dev.document_conversion import router as document_conversion_router +from routers.dev.test_analysis import router as test_analysis_router + +def register_routes(app: FastAPI): + logger.info("Starting to register routes...") + + # Health check route + app.include_router(health_router, prefix="/health", tags=["Health"]) + + # Admin Routes + app.include_router(admin_routes_router, prefix="/admin", tags=["Admin"]) + + # Microsoft Graph Routes + app.include_router(router_onenote.router, prefix="/msgraph", tags=["Microsoft Graph"]) + + # Database Routes + app.include_router(get_data.router, prefix="/database/upload", tags=["Upload"]) + app.include_router(get_events.router, prefix="/calendar", tags=["Calendar"]) + app.include_router(get_nodes.router, prefix="/database/tools", tags=["Tools"]) + app.include_router(get_nodes_and_edges.router, prefix="/database/tools", tags=["Tools"]) + app.include_router(entity_init.router, prefix="/database/entity", tags=["Entity"]) + app.include_router(calendar.router, prefix="/database/calendar", tags=["Calendar"]) + app.include_router(schools.router, prefix="/database/schools", tags=["Schools"]) + app.include_router(timetables.router, prefix="/database/timetables", tags=["Timetables"]) + app.include_router(curriculum.router, prefix="/database/curriculum", tags=["Curriculum"]) + + # Navigation Routes + app.include_router(calendar_structure_router.router, prefix="/database/calendar-structure", tags=["Calendar"]) + app.include_router(worker_structure_router.router, prefix="/database/worker-structure", tags=["Worker"]) + app.include_router(default_nodes_router.router, prefix="/database/tools", tags=["Navigation"]) + + # Database Filesystem Routes + app.include_router(tldraw_filesystem.router, prefix="/database/tldraw_fs", tags=["TLDraw Filesystem"]) + + # Assets Routes + app.include_router(powerpoint.router, prefix="/assets/powerpoint", tags=["PowerPoint"]) + app.include_router(word.router, prefix="/assets/word", tags=["Word"]) + app.include_router(pdf.router, prefix="/assets/pdf", tags=["PDF"]) + + # LLM Routes + app.include_router(ollama.router, prefix="/llm/private/ollama", tags=["LLM"]) + app.include_router(openai.router, prefix="/llm/public/openai", tags=["LLM"]) + + # Langchain Routes + app.include_router(graph_qa_router, prefix="/langchain/graph_qa", tags=["Langchain"]) + app.include_router(interactive_langgraph_query_router, prefix="/langchain/interactive_langgraph_query", tags=["Langchain"]) + + # External Routes + app.include_router(youtube.router, prefix="/external", tags=["External"]) + + # Arbor Data Routes + app.include_router(arbor_router, prefix="/arbor", tags=["Arbor Data"]) + + # RPi Routes + app.include_router(rpi_whisperlive_client.router, prefix="/rpi", tags=["RPi"]) + + # Solid Pod Provisioner Routes + app.include_router(solid_pod_router, prefix="/solid", tags=["Solid"]) + + # Document Conversion Routes + app.include_router(document_conversion_router, prefix="/dev/documents", tags=["Document Conversion"]) + + # Test Analysis Routes + app.include_router(test_analysis_router, prefix="/dev/tests", tags=["Test Analysis"]) + + # Test Routes + app.include_router(timetable_test.router, prefix="/tests", tags=["Tests"]) diff --git a/run/setup.py b/run/setup.py new file mode 100644 index 0000000..bb38a2b --- /dev/null +++ b/run/setup.py @@ -0,0 +1,31 @@ +import os +from modules.logger_tool import initialise_logger +logger = initialise_logger( + log_name='api_main_fastapi', + log_level=os.getenv("LOG_LEVEL", "DEBUG"), + log_dir=os.getenv("LOG_PATH", "/logs"), + log_format='default', + runtime=True +) +from fastapi import FastAPI + +def setup_cors(app: FastAPI) -> None: + """Configure CORS middleware for the FastAPI application""" + from fastapi.middleware.cors import CORSMiddleware + origins = [ + os.getenv('SITE_URL'), + os.getenv('APP_SITE_URL'), + os.getenv('APP_API_URL'), + os.getenv('APP_ADMIN_URL'), + ] + logger.info(f"Setting up CORS with origins: {origins}") + + app.add_middleware( + CORSMiddleware, + allow_origins=origins, + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], + expose_headers=["*"] + ) + diff --git a/tests/.archive/pytest_init_calendar.py b/tests/.archive/pytest_init_calendar.py new file mode 100644 index 0000000..f6c309d --- /dev/null +++ b/tests/.archive/pytest_init_calendar.py @@ -0,0 +1,64 @@ +from dotenv import load_dotenv, find_dotenv +load_dotenv(find_dotenv()) +import os +import modules.logger_tool as logger +log_name = 'pytest_calendar' +log_dir = os.getenv("LOG_PATH", "/logs") # Default path as fallback +logging = logger.get_logger( + name=log_name, + log_level=os.getenv("LOG_LEVEL", "DEBUG"), + log_path=log_dir, + log_file=log_name, + runtime=True, + log_format='default' +) +import modules.database.tools.neo4j_driver_tools as driver_tools +import modules.database.tools.neontology_tools as neon +import pytest +from fastapi.testclient import TestClient +from routers.database.init.calendar import router +from fastapi import FastAPI +from datetime import datetime, timedelta + +app = FastAPI() +app.include_router(router) + +client = TestClient(app) + +# Define a list of date ranges for testing +date_ranges = [ + (datetime.now(), datetime.now() + timedelta(days=1)), # 1 day + (datetime.now(), datetime.now() + timedelta(days=7)), # 1 week + (datetime.now(), datetime.now() + timedelta(days=30)), # 1 month + (datetime.now(), datetime.now() + timedelta(days=183)),# 6 months + (datetime.now(), datetime.now() + timedelta(days=365)) # 1 year +] + +# Fixture to manage database name increment +@pytest.fixture(scope="function", autouse=True) +def increment_db_name_counter(request): + if not hasattr(request.module, "db_name_counter"): + request.module.db_name_counter = 0 + request.module.db_name_counter += 1 + return request.module.db_name_counter + +@pytest.mark.parametrize("start_date, end_date", date_ranges) +def test_create_calendar(start_date, end_date, increment_db_name_counter): + db_name = f"test_create_calendar_db_{increment_db_name_counter}" + neo_safe_db_name = db_name.replace("_", "") + logging.info(f"Creating calendar for {db_name} from {start_date} to {end_date}") + logging.info(f"Creating calendar for {db_name} from {start_date} to {end_date}") + response = client.post( + "/create-calendar", + params={ + "db_name": neo_safe_db_name, + "start_date": start_date.strftime('%Y-%m-%d'), + "end_date": end_date.strftime('%Y-%m-%d') + } + ) + assert response.status_code == 200 + response_json = response.json() + assert "calendar_year_nodes" in response_json and response_json["calendar_year_nodes"] != 0 + assert "calendar_month_nodes" in response_json and response_json["calendar_month_nodes"] != 0 + assert "calendar_week_nodes" in response_json and response_json["calendar_week_nodes"] != 0 + assert "calendar_day_nodes" in response_json and response_json["calendar_day_nodes"] != 0 \ No newline at end of file diff --git a/tests/.archive/pytest_init_curriculum.py b/tests/.archive/pytest_init_curriculum.py new file mode 100644 index 0000000..48c21df --- /dev/null +++ b/tests/.archive/pytest_init_curriculum.py @@ -0,0 +1,61 @@ +from dotenv import load_dotenv, find_dotenv +load_dotenv(find_dotenv()) +import os +import modules.logger_tool as logger +log_name = 'pytest_init_curriculum' +log_dir = os.getenv("LOG_PATH", "/logs") # Default path as fallback +logging = logger.get_logger( + name=log_name, + log_level=os.getenv("LOG_LEVEL", "DEBUG"), + log_path=log_dir, + log_file=log_name, + runtime=True, + log_format='default' +) +import modules.database.tools.neo4j_driver_tools as driver_tools +import modules.database.tools.neontology_tools as neon +import pytest +from fastapi.testclient import TestClient +from routers.database.init.curriculum import router +from fastapi import FastAPI + +app = FastAPI() +app.include_router(router) + +client = TestClient(app) + +db_name = log_name.replace('_', '') +excel_file = os.environ['EXCEL_CURRICULUM_FILE'] + +driver = driver_tools.get_driver(database=db_name) +neon.init_neontology_connection() + +@pytest.fixture +def sample_file(): + # Use the existing Excel file to upload + file_path = excel_file + logging.info(f"Using sample file at {file_path}") + yield file_path + +def test_upload_curriculum(sample_file): + db_name = "test_curriculum_db" + with open(sample_file, "rb") as f: + response = client.post( + "/upload-curriculum", + files={"file": (excel_file, f, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")}, + data={"db_name": db_name.replace('_', '')} + ) + logging.info(f"Response status code: {response.status_code}") + logging.info(f"Response JSON: {response.json()}") + + assert response.status_code == 200 + response_json = response.json() + logging.info(f"Response JSON keys: {response_json.keys()}") + + # Adjust the assertions based on the actual response structure + assert "status" in response_json or "12" in response_json + if "status" in response_json: + assert response_json["status"] == "Success" + else: + assert "created" in response_json["12"] + assert "merged" in response_json["12"] \ No newline at end of file diff --git a/tests/.archive/pytest_init_school_timetable.py b/tests/.archive/pytest_init_school_timetable.py new file mode 100644 index 0000000..a5b6bf0 --- /dev/null +++ b/tests/.archive/pytest_init_school_timetable.py @@ -0,0 +1,54 @@ +from dotenv import load_dotenv, find_dotenv +load_dotenv(find_dotenv()) +import os +import modules.logger_tool as logger +log_name = 'pytest_timetable' +log_dir = os.getenv("LOG_PATH", "/logs") # Default path as fallback +logging = logger.get_logger( + name=log_name, + log_level=os.getenv("LOG_LEVEL", "DEBUG"), + log_path=log_dir, + log_file=log_name, + runtime=True, + log_format='default' +) +import modules.database.tools.neo4j_driver_tools as driver_tools +import modules.database.tools.neontology_tools as neon +import pytest +from fastapi.testclient import TestClient +from routers.database.init.timetable import router +from fastapi import FastAPI +import pandas as pd + +app = FastAPI() +app.include_router(router) + +client = TestClient(app) + +db_name = log_name.replace('_', '') +excel_file = os.environ['EXCEL_TIMETABLE_FILE'] + +@pytest.fixture +def sample_file(): + # Use the existing Excel file to upload + file_path = excel_file + logging.info(f"Using sample file at {file_path}") + yield file_path + +def test_upload_school_timetable(sample_file): + db_name = "pytest_school_timetable_db" + with open(sample_file, "rb") as f: + response = client.post( + "/upload-school-timetable", + data={"db_name": db_name.replace('_', '')}, + files={"file": (excel_file, f, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")} + ) + logging.info(f"Response status code: {response.status_code}") + logging.info(f"Response JSON: {response.json()}") + + assert response.status_code == 200 + response_json = response.json() + assert "calendar_nodes" in response_json + assert "school_timetable_nodes" in response_json + assert response_json["calendar_nodes"] is not None + assert response_json["school_timetable_nodes"] is not None \ No newline at end of file diff --git a/tests/.archive/pytest_init_user.py b/tests/.archive/pytest_init_user.py new file mode 100644 index 0000000..7d6328a --- /dev/null +++ b/tests/.archive/pytest_init_user.py @@ -0,0 +1,44 @@ +from dotenv import load_dotenv, find_dotenv +load_dotenv(find_dotenv()) +import os +import modules.logger_tool as logger +log_name = 'pytest_timetable' +log_dir = os.getenv("LOG_PATH", "/logs") # Default path as fallback +logging = logger.get_logger( + name=log_name, + log_level=os.getenv("LOG_LEVEL", "DEBUG"), + log_path=log_dir, + log_file=log_name, + runtime=True, + log_format='default' +) +import modules.database.tools.neo4j_driver_tools as driver_tools +import modules.database.tools.neontology_tools as neon +import pytest +from fastapi.testclient import TestClient +from fastapi import FastAPI +import pandas as pd + +# Import the router from entity_init.py +from routers.database.init.entity_init import router + +app = FastAPI() +app.include_router(router) + +client = TestClient(app) + +@pytest.mark.parametrize("username, email, user_id", [ + ("user1", "user1@example.com", "uuid1"), + ("user2", "user2@example.com", "uuid2"), + ("user3", "user3@example.com", "uuid3") +]) +def test_create_user(username, email, user_id): + response = client.post( + "/create-user", + data={"username": username, "email": email, "user_id": user_id} + ) + logging.info(f"Tested creating user {username}. Response status code: {response.status_code}") + response_json = response.json() + logging.info(f"Response JSON: {response_json}") + + assert response.status_code == 200 \ No newline at end of file diff --git a/tests/.archive/pytest_transcribe.py b/tests/.archive/pytest_transcribe.py new file mode 100644 index 0000000..6c2e7c6 --- /dev/null +++ b/tests/.archive/pytest_transcribe.py @@ -0,0 +1,35 @@ +import os +import pytest +from fastapi.testclient import TestClient +from main import app # Adjust the import based on your project structure + +client = TestClient(app) + +@pytest.fixture(autouse=True) +def setup_env(): + os.environ["WHISPERLIVE_HOST"] = "localhost" + os.environ["WHISPERLIVE_PORT"] = "9090" + +def test_start_transcription(): + user_id = "test_user" + response = client.post(f"/transcribe/live/start_transcription/{user_id}") + assert response.status_code == 200 + assert response.json() == {"message": "Transcription started", "user_id": user_id} + +def test_handle_whisper_live_eos_utterance(): + user_id = "test_user" + data = { + "utterance": "Hello, world!", + "start": 0, + "end": 1, + "eos": True + } + response = client.post(f"/transcribe/utterance/handle_whisper_live_eos_utterance/{user_id}", json=data) + assert response.status_code == 200 + assert response.json() == {"message": "Utterance logged successfully"} + +def test_get_utterances(): + user_id = "test_user" + response = client.get(f"/transcribe/utterance/get_utterances/{user_id}") + assert response.status_code == 200 + assert "utterances" in response.json() \ No newline at end of file diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/_transcribe.py b/tests/_transcribe.py new file mode 100644 index 0000000..e26aafe --- /dev/null +++ b/tests/_transcribe.py @@ -0,0 +1,34 @@ +from modules.whisper_live.client import TranscriptionClient +import os +import time + +def setup_directories(user_dir, user_id): + user_transcript_dir = f"{user_dir}/{user_id}/transcripts" + if not os.path.exists(user_transcript_dir): + os.makedirs(user_transcript_dir) + return user_transcript_dir + +def timestamped_callback(text, is_final): + if is_final: + print(f"Timestamp: {time.strftime('%H:%M:%S')}, Transcription: {text}") + +def main(): + user_dir = "../../data/users" + user_id = "kcar" + user_transcript_dir = setup_directories(user_dir, user_id) + + client = TranscriptionClient( + "localhost", + 9090, + lang="en", + translate=False, + use_vad=True, + save_output_recording=True, + output_recording_filename=f"{user_transcript_dir}/output_recording.wav", + output_transcription_path=f"{user_transcript_dir}/output.srt", + ) + + client() + +if __name__ == "__main__": + main() diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..566ff48 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,3 @@ +from modules.logger_tool import PytestFormatter + +pytest_formatter = PytestFormatter() \ No newline at end of file diff --git a/tests/formatting.py b/tests/formatting.py new file mode 100644 index 0000000..4073d6a --- /dev/null +++ b/tests/formatting.py @@ -0,0 +1,53 @@ +def ascii_header(): + return r""" +================================================== += = += _______ = += | | _ = += | |____ | | = += | / | | | ___ __ _ _ __ = += | | | | | / _ \/ _` | '_ \ = += | \____| | | | __/ (_| | | | | = += |_______| |_| \___|\__,_|_| |_| = += = += = += _________ = += | | = += | BOOK | = += |_________| = += = += = += /\ = += / \ = += /____\ = += / \ = += / \ = += /__________\ = += = += = += _____________ = += | | = += | COMPUTER | = += |_____________| = += = += = += = += _________ = += | | = += | TEACH | = += |_________| = += = += = += ____ = += / \ = += / \ = += / \ = += /__________\ = += = += = +================================================== += = += classroom-copilot.ai = += = +================================================== +""" \ No newline at end of file diff --git a/tests/pytest_arbor.py b/tests/pytest_arbor.py new file mode 100644 index 0000000..739ce1d --- /dev/null +++ b/tests/pytest_arbor.py @@ -0,0 +1,33 @@ +import os +import requests +import pytest +import json + +# Define the base URL and the tokens +base_url = f"{os.environ.get('APP_API_URL')}/arbor/data" +tokens = { + 1: os.getenv("KS3_COURSE_CLASS_MEMBERSHIP_AUTH"), + 2: os.getenv("TEACHING_GROUP_MEMBERSHIPS_2023_2024_AUTH"), + 3: os.getenv("SCHEDULED_TIMETABLE_SLOTS_AUTH"), + 4: os.getenv("BEHAVIOURAL_INCIDENTS_REPORTING_AUTH"), + 5: os.getenv("Y7_LESSON_TIMETABLE_AUTH") +} + +@pytest.mark.parametrize("id", [1, 2, 3, 4, 5]) +def test_fetch_arbor_data(id): + token = tokens.get(id) + if not token: + pytest.fail(f"Token for ID {id} is not set") + + endpoint = f"{base_url}/{id}" + headers = {"Authorization": f"Basic {token}"} + params = {"token": token} + + response = requests.get(endpoint, headers=headers, params=params) + + if response.status_code == 200: + print(json.dumps(response.json())) + assert response.status_code == 200 + else: + pytest.fail(f"Failed for ID {id}: {response.status_code} {response.text}") + diff --git a/tests/pytest_init_curriculum_graph_qa.py b/tests/pytest_init_curriculum_graph_qa.py new file mode 100644 index 0000000..12d4edc --- /dev/null +++ b/tests/pytest_init_curriculum_graph_qa.py @@ -0,0 +1,123 @@ +import os +import json +import requests +import pytest +from dotenv import load_dotenv, find_dotenv +from .formatting import ascii_header +import modules.logger_tool as logger + +load_dotenv(find_dotenv()) + +log_name = 'api_router_graph_qa_test' +log_dir = os.getenv("LOG_PATH", "/logs") # Default path as fallback +logging = logger.get_logger( + name=log_name, + log_level=os.getenv("LOG_LEVEL", "DEBUG"), + log_path=log_dir, + log_file=log_name, + runtime=True, + log_format='default' +) + +@pytest.fixture(scope="module") +def config(): + return { + "database": "cc.institutes.kevlarai", + "top_k": 40, + "model": "gpt-4o", + "temperature": 0, + "verbose": False, + "return_intermediate_steps": True, + "return_direct": False, + "validate_cypher": True, + "model_type": "openai" # Default model_type + } + +def load_test_cases(): + with open('backend/app/tests/test_inputs/init_curriculum_db_cases.json', 'r') as f: + return json.load(f) + +test_cases = load_test_cases() + +@pytest.mark.parametrize("case", test_cases["curriculum_cases"]) +def test_curriculum_cases(case, config): + assert run_test_case(case, config) + +@pytest.mark.parametrize("case", test_cases["include_exclude_cases"]["includes"]) +def test_include_cases(case, config): + assert run_test_case(case, config) + +@pytest.mark.parametrize("case", test_cases["include_exclude_cases"]["excludes"]) +def test_exclude_cases(case, config): + assert run_test_case(case, config) + +@pytest.mark.parametrize("case", test_cases["include_exclude_cases"]["includes_excludes"]) +def test_include_exclude_cases(case, config): + assert run_test_case(case, config) + +def run_test_case(case, config): + logging.info(f"Starting test case with prompt: {case['prompt']}") + url = f"{os.environ['APP_API_URL']}/langchain/graph_qa/prompt" + params = { + "database": config["database"], + "prompt": case["prompt"], + "top_k": config["top_k"], + "model": config["model"], + "temperature": config["temperature"], + "verbose": config["verbose"], + "return_intermediate_steps": config["return_intermediate_steps"], + "exclude_types": case["exclude_types"], + "include_types": case["include_types"], + "return_direct": config["return_direct"], + "validate_cypher": config["validate_cypher"], + "model_type": config["model_type"] + } + logging.info(f"Constructed URL: {url}") + logging.info(f"Parameters: {params}") + + try: + logging.info("Sending request to API...") + response = requests.get(url, params=params) + logging.info(f"HTTP Response Status: {response.status_code}") + response.raise_for_status() + data = response.json() + logging.info(f"Response Data: {data}") + + # Log detailed test execution information + logging.info("==================================================") + logging.info("= Test Execution =") + logging.info("==================================================") + logging.info(f"= Prompt: {data.get('query', 'N/A')}") + logging.info("= =") + logging.info(f"= Query: \n{data.get('intermediate_steps', [{'query': 'N/A'}])[0].get('query', 'N/A')}") + logging.info("= =") + logging.info("==================================================") + + # Determine if the test passed or failed + response_text = data.get('result', 'N/A') + context = data.get('intermediate_steps', [{'context': 'N/A'}])[1].get('context', 'N/A') + if "I don't know" in response_text or not context: + logging.error("==================================================") + logging.error("= XX Test Failed XX =") + logging.error("==================================================") + logging.error(f"= Prompt: {case['prompt']}") + logging.error(f"= Context: {context}") + logging.error(f"= Response: {response_text}") + logging.error("==================================================") + return False + else: + logging.info("==================================================") + logging.info("= ** Test Passed ** =") + logging.info("==================================================") + logging.info(f"= Prompt: {case['prompt']}") + logging.info(f"= Context: {context}") + logging.info(f"= Response: {response_text}") + logging.info("==================================================") + return True + except requests.exceptions.RequestException as e: + logging.error("==================================================") + logging.error("= ERROR =") + logging.error("==================================================") + logging.error(f"Error: {e}") + logging.error("==================================================") + return False \ No newline at end of file diff --git a/tests/pytest_init_x.py b/tests/pytest_init_x.py new file mode 100644 index 0000000..2e05ebf --- /dev/null +++ b/tests/pytest_init_x.py @@ -0,0 +1,294 @@ +from dotenv import load_dotenv, find_dotenv +load_dotenv(find_dotenv()) +import os +import pytest +from fastapi.testclient import TestClient +from fastapi import FastAPI +import json +import modules.logger_tool as logger +from routers.database.init.entity_init import router as entity_init_router +from routers.database.init.timetables import router as timetables_router +from routers.database.init.curriculum import router as curriculum_router +from backend.modules.database.schemas.entities import SchoolNode, UserNode +from modules.database.schemas.nodes.calendars import CalendarNode + +# Pytest configuration +def pytest_configure(config): + config.addinivalue_line( + "markers", "school: mark test as part of school creation" + ) + config.addinivalue_line( + "markers", "users: mark test as part of user creation" + ) + config.addinivalue_line( + "markers", "timetable: mark test as part of timetable upload" + ) + config.addinivalue_line( + "markers", "curriculum: mark test as part of curriculum upload" + ) + +# Setup logging +log_name = 'pytest_init_x' +log_dir = os.getenv("LOG_PATH", "/logs") # Default path as fallback +logging = logger.get_logger( + name=log_name, + log_level=os.getenv("LOG_LEVEL", "DEBUG"), + log_path=log_dir, + log_file=log_name, + runtime=True, + log_format='default' +) + +# Setup FastAPI app and test client +app = FastAPI() +app.include_router(entity_init_router) +app.include_router(timetables_router) +app.include_router(curriculum_router) +client = TestClient(app) + +school_timetable_file = os.environ['EXCEL_TIMETABLE_FILE'] +school_curriculum_file = os.environ['EXCEL_CURRICULUM_FILE'] + +@pytest.fixture(scope="module") +def school_info(): + db_name = "cc.institutes.devschool" + school_data = { + "db_name": db_name, + "school_uuid": "uuid1", + "school_name": "school1", + "school_website": "www.school1.com" + } + return school_data + +@pytest.fixture(scope="module") +def created_school(school_info): + school_data = school_info + response = client.post("/create-school", data=school_data) + logging.info(f"Create school response: {response.json()}") + assert response.status_code == 200 + logging.success("School created successfully") + + response_json = response.json() + school_node = SchoolNode(**response_json["school_node"]) + + logging.success(f"School node created: {school_node}") + return school_node + +@pytest.mark.school +def test_create_school(created_school): + school_node = created_school + assert school_node is not None + +@pytest.mark.users +@pytest.mark.parametrize("user_type, expected_status", [ + ("standard", 200), + ("developer", 200) +]) +def test_create_non_school_user(user_type, expected_status): + db_name = "cc.users.devusers" + user_data = { + "user_type": user_type, + "user_name": f"test_{user_type}", + "user_email": f"test_{user_type}@example.com", + "user_id": f"{user_type}_uuid" + } + response = client.post("/create-user", data=user_data) + assert response.status_code == expected_status + logging.success(f"{user_type.capitalize()} user created successfully") + +@pytest.mark.users +@pytest.mark.parametrize("user_type, expected_status", [ + ("cc_email_school_admin", 200), + ("cc_email_teacher", 200), + ("cc_email_student", 200) +]) +def test_create_school_user(created_school, user_type, expected_status): + school_node = created_school + worker_data = { + "cc_email_school_admin": { + "admin_code": "ADM001", + "admin_name_formal": "Mr. Admin", + "admin_email": "admin@school.com" + }, + "cc_email_teacher": { + "teacher_code": "TCH001", + "teacher_name_formal": "Ms. Teacher", + "teacher_email": "teacher@school.com" + }, + "cc_email_student": { + "student_code": "STU001", + "student_name_formal": "Student Name", + "student_email": "student@school.com" + } + } + user_data = { + "user_type": user_type, + "user_name": f"test_{user_type}", + "user_email": f"test_{user_type}@example.com", + "user_id": f"{user_type}_uuid", + "school_uuid": school_node.school_uuid, + "school_name": school_node.school_name, + "school_website": school_node.school_website, + "school_path": school_node.path, + "worker_data": json.dumps(worker_data[user_type]) + } + logging.info(f"Sending user data: {user_data}") + response = client.post("/create-user", data=user_data) + assert response.status_code == expected_status + logging.success(f"{user_type.capitalize()} user created successfully") + +def test_create_user_invalid_data(): + invalid_user_data = { + "user_type": "invalid_type", + "user_name": "test_invalid", + "user_email": "test_invalid@example.com", + "user_id": "invalid_uuid" + } + response = client.post("/create-user", data=invalid_user_data) + assert response.status_code == 400 + logging.success("Invalid user data handled correctly") + +@pytest.mark.users +def test_create_school_user_without_school_node(): + user_data = { + "user_type": "cc_email_teacher", + "user_name": "test_teacher_no_school", + "user_email": "test_teacher_no_school@example.com", + "user_id": "teacher_no_school_uuid" + } + response = client.post("/create-user", data=user_data) + assert response.status_code == 400 + logging.success("School-related user without school_node handled correctly") + +@pytest.fixture +def sample_file(): + logging.info(f"Using sample file: {school_timetable_file}") + return school_timetable_file + +@pytest.mark.timetable +def test_upload_school_timetable(created_school, sample_file): + school_node = created_school + with open(sample_file, "rb") as f: + response = client.post( + "/upload-school-timetable", + data={ + "db_name": "cc.institutes.devschool", + "unique_id": school_node.unique_id, + "school_uuid": school_node.school_uuid, + "school_name": school_node.school_name, + "school_db_name": school_node.school_db_name, + "school_website": school_node.school_website, + "path": school_node.path + }, + files={"file": (os.path.basename(sample_file), f, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")} + ) + logging.info(f"Timetable upload response: {response.json()}") + assert response.status_code == 200 + logging.success("Timetable uploaded successfully") + + response_json = response.json() + + for key in ["school_node", "school_calendar_nodes", "school_timetable_nodes"]: + assert key in response_json + logging.success(f"{key} present in response") + + school_node = SchoolNode(**response_json["school_node"]) + calendar_node = CalendarNode(**response_json['school_calendar_nodes']['calendar_node']) + + logging.success(f"School node validated: {school_node}") + logging.success(f"Calendar node validated: {calendar_node}") + + for key in ["school_node", "school_calendar_nodes", "school_timetable_nodes"]: + assert response_json[key] is not None + logging.success(f"{key} is not None") + + logging.success("All assertions passed in test_upload_school_timetable") + +@pytest.fixture +def curriculum_sample_file(): + logging.info(f"Using curriculum sample file: {school_curriculum_file}") + return school_curriculum_file + + +@pytest.mark.curriculum +def test_upload_school_curriculum(created_school, curriculum_sample_file): + school_node = created_school + with open(curriculum_sample_file, "rb") as f: + response = client.post( + "/upload-school-curriculum", + data={ + "db_name": "cc.institutes.devschool", + "school_uuid": school_node.school_uuid, + "school_name": school_node.school_name, + "school_website": school_node.school_website, + "school_path": school_node.path + }, + files={"file": (os.path.basename(curriculum_sample_file), f, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")} + ) + + assert response.status_code == 200 + logging.success("Curriculum uploaded successfully") + + response_json = response.json() + + assert "curriculum_node" in response_json + assert "pastoral_node" in response_json + assert "key_stage_nodes" in response_json + assert "year_group_syllabus_nodes" in response_json + assert "topic_nodes" in response_json + assert "topic_lesson_nodes" in response_json + assert "statement_nodes" in response_json + + logging.success("All assertions passed in test_upload_school_curriculum") + +@pytest.mark.users +@pytest.mark.timetable +def test_create_kcar_user_and_upload_timetable(created_school): + school_node = created_school + user_data = { + "user_type": "cc_email_teacher", + "user_name": "K Car", + "user_email": "kcar@example.com", + "user_id": "kcar_uuid", + "school_uuid": school_node.school_uuid, + "school_name": school_node.school_name, + "school_website": school_node.school_website, + "school_path": school_node.path, + "worker_data": json.dumps({ + "teacher_code": "KCAR", + "teacher_name_formal": "Mr. K Car", + "teacher_email": "kcar@example.com" + }) + } + logging.info(f"Creating KCar user with data: {user_data}") + response = client.post("/create-user", data=user_data) + logging.info(f"KCar user creation response: {response.json()}") + assert response.status_code == 200 + logging.success("KCar user created successfully") + kcar_user = UserNode(**response.json()["data"]["user_node"]) + + user_timetable_file = os.environ['KCAR_TIMETABLE_URL'] + logging.info(f"User timetable file: {user_timetable_file}") + with open(user_timetable_file, "rb") as f: + logging.info(f"Uploading teacher timetable for K Car: {user_timetable_file}") + response = client.post( + "/upload-worker-timetable", + data={ + "user_id": kcar_user.user_id, + "db_name": "cc.institutes.devschool" + }, + files={"file": (os.path.basename(user_timetable_file), f, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")} + ) + logging.info(f"Teacher timetable upload response: {response.json()}") + assert response.status_code == 200 + logging.success("K Car teacher timetable uploaded successfully") + + response_json = response.json() + + assert response_json["message"] == "Teacher timetable initialized successfully" + + logging.success("All assertions passed in test_create_kcar_user_and_upload_timetable") + +def pytest_runtest_makereport(item, call): + if call.when == "call" and call.excinfo is None: + logging.success(f"Test passed: {item.name}") \ No newline at end of file diff --git a/tests/pytest_langgraph.py b/tests/pytest_langgraph.py new file mode 100644 index 0000000..3677ca6 --- /dev/null +++ b/tests/pytest_langgraph.py @@ -0,0 +1,85 @@ +from dotenv import load_dotenv, find_dotenv +load_dotenv(find_dotenv()) +import os +import modules.logger_tool as logger +log_name = 'api_modules_interactive_langgraph_query' +log_dir = os.getenv("LOG_PATH", "/logs") # Default path as fallback +logging = logger.get_logger( + name=log_name, + log_level=os.getenv("LOG_LEVEL", "DEBUG"), + log_path=log_dir, + log_file=log_name, + runtime=True, + log_format='default' +) +import pytest +import requests + +# Define the URL of your FastAPI server +BASE_URL = "http://localhost:8000" +ENDPOINT = f"{BASE_URL}/api/langchain/interactive_langgraph_query/query" + +def send_query(query): + payload = {"query": query} + headers = {"Content-Type": "application/json"} + logging.info(f"Sending query to {ENDPOINT} with payload: {payload}") + + try: + response = requests.post(ENDPOINT, json=payload, headers=headers) + response.raise_for_status() + result = response.json() + logging.info(f"Received response from {ENDPOINT}: {result}") + return result + except requests.exceptions.RequestException as e: + logging.error(f"Error sending query to {ENDPOINT}: {str(e)}") + return {"error": str(e)} + +@pytest.mark.simple +def test_simple_queries(): + query = "Describe the relevance of Maidstone, England during the English Civil War." + logging.info(f"Running simple query test with query: {query}") + result = send_query(query) + + logging.info(f"Assertion 1: Checking for absence of error") + assert "error" not in result, f"Error in response: {result.get('error')}" + + logging.info(f"Assertion 2: Checking for presence of response") + assert "response" in result, "Response does not contain an answer" + + logging.info(f"Assertion 3: Checking for non-empty answer") + assert len(result["response"]) > 0, "Answer is empty" + + logging.info(f"All assertions passed. Response: {result['response'][:100]}...") + +@pytest.mark.followup +def test_followup_queries(): + initial_query = "What is the latest local news from a particular town?" + logging.info(f"Running followup query test with initial query: {initial_query}") + result = send_query(initial_query) + + logging.info(f"Assertion 1: Checking for absence of error") + assert "error" not in result, f"Error in response: {result.get('error')}" + + if result.get("needs_more_info", False): + logging.info("Follow-up required. Sending follow-up query.") + follow_up_query = f"{initial_query} The town is Maidstone." + follow_up_result = send_query(follow_up_query) + + logging.info(f"Assertion 2: Checking for absence of error in follow-up") + assert "error" not in follow_up_result, f"Error in follow-up response: {follow_up_result.get('error')}" + + logging.info(f"Assertion 3: Checking for presence of response in follow-up") + assert "response" in follow_up_result, "Follow-up response does not contain an answer" + + logging.info(f"Assertion 4: Checking for non-empty answer in follow-up") + assert len(follow_up_result["response"]) > 0, "Follow-up answer is empty" + + logging.info(f"All follow-up assertions passed. Response: {follow_up_result['response'][:100]}...") + else: + logging.info(f"Assertion 2: Checking for presence of response") + assert "response" in result, "Response does not contain an answer" + + logging.info(f"Assertion 3: Checking for non-empty answer") + assert len(result["response"]) > 0, "Answer is empty" + + logging.info(f"All assertions passed. Response: {result['response'][:100]}...") \ No newline at end of file diff --git a/tests/run_tests.py b/tests/run_tests.py new file mode 100644 index 0000000..c548b86 --- /dev/null +++ b/tests/run_tests.py @@ -0,0 +1,179 @@ +from dotenv import load_dotenv, find_dotenv +load_dotenv(find_dotenv()) +import os +import sys +import subprocess +from datetime import datetime +import webbrowser +import threading +import shutil +import time + +# Add the parent directory to the Python path +sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +import modules.logger_tool as logger + +# Setup logging +log_name = 'pytest_run_tests' +log_dir = os.getenv("LOG_PATH", "/logs") # Default path as fallback +logging = logger.get_logger( + name=log_name, + log_level=os.getenv("LOG_LEVEL", "DEBUG"), + log_path=log_dir, + log_file=log_name, + runtime=True, + log_format='default' +) + +def find_project_root(): + # Start from the current file location + root = os.path.dirname(os.path.abspath(__file__)) + # Traverse up until you find the .env file + while not os.path.exists(os.path.join(root, '.env')): + new_root = os.path.dirname(root) + if root == new_root: # root directory reached without finding .env + raise Exception("Project root not found.") + root = new_root + return root + +def load_env(): + project_root = find_project_root() + dotenv_path = find_dotenv(os.path.join(project_root, '.env')) + load_dotenv(dotenv_path) + required_vars = ["FIXME"] + for var in required_vars: + if var not in os.environ: + print(f"Error: {var} is not set in the environment.") + sys.exit(1) + +def select_test_file(): + project_root = find_project_root() + test_categories = { + "A": { + "name": "X Copilot Initialization", + "tests": { + "1": os.path.join(project_root, "backend", "app", "tests", "pytest_init_x.py") + } + }, + "B": { + "name": "Graph QA", + "tests": { + "1": os.path.join(project_root, "backend", "app", "tests", "pytest_init_school_timetable_graph_qa.py"), + "2": os.path.join(project_root, "backend", "app", "tests", "pytest_init_curriculum_graph_qa.py"), + "3": os.path.join(project_root, "backend", "app", "tests", "pytest_init_calendar_graph_qa.py") + } + }, + "C": { + "name": "Connections", + "tests": { + "1": os.path.join(project_root, "backend", "app", "tests", "pytest_arbor.py") + } + }, + "D": { + "name": "Transcription", + "tests": { + "1": os.path.join(project_root, "tests", "pytest_transcribe.py") + } + }, + "E": { + "name": "LangGraph", + "tests": { + "1": os.path.join(project_root, "backend", "app", "tests", "pytest_langgraph.py") + } + } + } + + print("Select a test file to run:") + for category_key, category in test_categories.items(): + print(f"\n{category_key}: {category['name']}") + for test_key, test_file in category["tests"].items(): + print(f" {category_key}{test_key}: {os.path.basename(test_file)}") + + choice = input("\nEnter your choice (e.g., A1): ").upper() + if len(choice) == 2 and choice[0] in test_categories and choice[1] in test_categories[choice[0]]["tests"]: + category_key, test_key = choice[0], choice[1] + return test_categories[category_key]["tests"][test_key], choice + + print("Invalid choice.") + sys.exit(1) + +def create_log_dir(choice, project_root): + log_dir = os.path.join(project_root, "logs", "pytests") + if choice[0] == "A": + log_dir = os.path.join(log_dir, "database", "init") + elif choice[0] == "B": + log_dir = os.path.join(log_dir, "database", "langchain", "graph_qa") + elif choice[0] == "C": + log_dir = os.path.join(log_dir, "database", "connections", "arbor") + elif choice[0] == "D": + log_dir = os.path.join(log_dir, "transcribe") + elif choice[0] == "E": + log_dir = os.path.join(log_dir, "langgraph") + else: + print("Invalid choice.") + sys.exit(1) + + os.makedirs(log_dir, exist_ok=True) + return log_dir + +def open_html_report_in_browser(html_path): + """Function to open the HTML report in the default web browser.""" + # Check for the existence of the file every 2 seconds, up to a maximum of 10 checks + for _ in range(10): + if os.path.exists(html_path): + webbrowser.open(html_path) + break + time.sleep(2) + else: + print("HTML report was not generated in time.") + +def run_tests(test_file, log_dir, choice): + timestamp = datetime.now().strftime('%Y%m%d_%H%M%S') + base_filename = os.path.basename(test_file).replace('.py', '') + html_report = os.path.join(log_dir, f"{base_filename}_pytest_report_{timestamp}.html") + xml_report = os.path.join(log_dir, f"{base_filename}_pytest_report_{timestamp}.xml") + + pytest_command = [ + "pytest", + "-v", + test_file, + f"--junitxml={xml_report}", + f"--html={html_report}", + "--self-contained-html", + "--capture=tee-sys", + "--show-capture=all" + ] + + if choice[0] == "A": + test_components = input("Enter test components to run (school,users,timetable), comma-separated, or 'all': ").lower() + if test_components != 'all': + components = test_components.split(',') + for component in components: + pytest_command.append(f"-m {component}") + + print("Running command:", ' '.join(pytest_command)) + + # Start a thread to open the HTML report, checking for its existence + threading.Thread(target=open_html_report_in_browser, args=(html_report,)).start() + + result = subprocess.run(pytest_command, check=True) + return result + +def main(): + project_root = find_project_root() + load_env() + data_dir = os.path.join(project_root, "APP_DATA") + # TODO: Modify this after initial testing + if os.path.exists(data_dir): + shutil.rmtree(data_dir) + test_file, choice = select_test_file() + if not test_file: + print("Invalid choice.") + sys.exit(1) + + log_dir = create_log_dir(choice, project_root) + run_tests(test_file, log_dir, choice) + +if __name__ == "__main__": + main() diff --git a/tests/test_inputs/init_curriculum_db_cases.json b/tests/test_inputs/init_curriculum_db_cases.json new file mode 100644 index 0000000..a9724ff --- /dev/null +++ b/tests/test_inputs/init_curriculum_db_cases.json @@ -0,0 +1,150 @@ +{ + "curriculum_cases": [ + { + "description": "Retrieve Information About Lessons in a Topic", + "prompt": "What are the lessons in the topic 'Maths Skills For Scientists'?", + "exclude_types": ["KeyStage", "KeyStageSyllabus", "YearGroup", "YearGroupSyllabus"], + "include_types": ["Topic", "Lesson", "LESSON_INCLUDES_LEARNING_STATEMENT"] + }, + { + "description": "Retrieve Information About a Specific Year Group Syllabus", + "prompt": "What is the syllabus for Year 8?", + "exclude_types": ["KeyStage", "KeyStageSyllabus", "Topic", "Lesson", "LearningStatement"], + "include_types": ["YearGroup", "YearGroupSyllabus", "YEAR_SYLLABUS_INCLUDES_TOPIC"] + }, + { + "description": "Retrieve Key Stages and Their Syllabuses", + "prompt": "What are the key stages and their syllabuses?", + "exclude_types": ["YearGroup", "YearGroupSyllabus", "Topic", "Lesson", "LearningStatement"], + "include_types": ["KeyStage", "KeyStageSyllabus", "KEY_STAGE_INCLUDES_KEY_STAGE_SYLLABUS"] + }, + { + "description": "Retrieve Topics Within a Specific Year Group Syllabus", + "prompt": "What are the topics in the Year 8 Science syllabus?", + "exclude_types": ["KeyStage", "KeyStageSyllabus", "Lesson", "LearningStatement"], + "include_types": ["YearGroup", "YearGroupSyllabus", "Topic", "YEAR_SYLLABUS_INCLUDES_TOPIC"] + }, + { + "description": "Retrieve All Learning Statements for a Specific Lesson", + "prompt": "What are the learning statements for the lesson '8P6.R'?", + "exclude_types": ["KeyStage", "KeyStageSyllabus", "YearGroup", "YearGroupSyllabus", "Topic"], + "include_types": ["Lesson", "LearningStatement", "LESSON_INCLUDES_LEARNING_STATEMENT"] + }, + { + "description": "General Information Retrieval Without Exclusions", + "prompt": "Give me an overview of the school curriculum.", + "exclude_types": [], + "include_types": [] + }, + { + "description": "Retrieve Detailed Information About a Specific Node Type", + "prompt": "Give me detailed information about all topics.", + "exclude_types": [], + "include_types": ["Topic"] + }, + { + "description": "Retrieve Relationships Between Specific Node Types", + "prompt": "What are the relationships between Year Groups and their syllabuses?", + "exclude_types": [], + "include_types": ["YearGroup", "YearGroupSyllabus", "KEY_STAGE_SYLLABUS_INCLUDES_YEAR_GROUP_SYLLABUS"] + } + ], + "include_exclude_cases": { + "includes": [ + { + "description": "Include only Lessons", + "prompt": "What are the lessons in the topic 'Maths Skills For Scientists'?", + "exclude_types": [], + "include_types": ["Lesson"] + }, + { + "description": "Include only Topics", + "prompt": "What are the topics in the Year 8 Science syllabus?", + "exclude_types": [], + "include_types": ["Topic"] + }, + { + "description": "Include only Year Groups", + "prompt": "What are the year groups in the school curriculum?", + "exclude_types": [], + "include_types": ["YearGroup"] + }, + { + "description": "Include only Learning Statements", + "prompt": "What are the learning statements for the lesson '8P6.R'?", + "exclude_types": [], + "include_types": ["LearningStatement"] + }, + { + "description": "Include only Key Stages", + "prompt": "What are the key stages in the school curriculum?", + "exclude_types": [], + "include_types": ["KeyStage"] + } + ], + "excludes": [ + { + "description": "Exclude Lessons", + "prompt": "What are the lessons in the topic 'Maths Skills For Scientists'?", + "exclude_types": ["Lesson"], + "include_types": [] + }, + { + "description": "Exclude Topics", + "prompt": "What are the topics in the Year 8 Science syllabus?", + "exclude_types": ["Topic"], + "include_types": [] + }, + { + "description": "Exclude Year Groups", + "prompt": "What are the year groups in the school curriculum?", + "exclude_types": ["YearGroup"], + "include_types": [] + }, + { + "description": "Exclude Learning Statements", + "prompt": "What are the learning statements for the lesson '8P6.R'?", + "exclude_types": ["LearningStatement"], + "include_types": [] + }, + { + "description": "Exclude Key Stages", + "prompt": "What are the key stages in the school curriculum?", + "exclude_types": ["KeyStage"], + "include_types": [] + } + ], + "includes_excludes": [ + { + "description": "Include Lessons, Exclude Topics", + "prompt": "What are the lessons in the topic 'Maths Skills For Scientists'?", + "exclude_types": ["Topic"], + "include_types": ["Lesson"] + }, + { + "description": "Include Topics, Exclude Lessons", + "prompt": "What are the topics in the Year 8 Science syllabus?", + "exclude_types": ["Lesson"], + "include_types": ["Topic"] + }, + { + "description": "Include Year Groups, Exclude Key Stages", + "prompt": "What are the year groups in the school curriculum?", + "exclude_types": ["KeyStage"], + "include_types": ["YearGroup"] + }, + { + "description": "Include Learning Statements, Exclude Lessons", + "prompt": "What are the learning statements for the lesson '8P6.R'?", + "exclude_types": ["Lesson"], + "include_types": ["LearningStatement"] + }, + { + "description": "Include Key Stages, Exclude Year Groups", + "prompt": "What are the key stages in the school curriculum?", + "exclude_types": ["YearGroup"], + "include_types": ["KeyStage"] + } + ] + } +} \ No newline at end of file