diff --git a/doc/pages/index.html b/doc/pages/index.html index 32ad5e1..9913ca0 100644 --- a/doc/pages/index.html +++ b/doc/pages/index.html @@ -1,1450 +1,2308 @@ - - - - RAVEN C2 — Command and Control Framework - - - - - - - - - - - - -
- -
-
- - logo - RAVENC2 - - -
- -
- -
- -
- -
-
-

- RAVEN - C2 FRAMEWORK -

- -

- Modular, enterprise-grade Command & Control framework built in - Java. Supports Web Panel, CLI, and JavaFX GUI with mutual TLS, - AES-256-GCM encryption, and multi-protocol session handling. -

- -
-
- OpenJDK 17+ -
-
-
- Maven -
-
-
- AES-256-GCM -
-
-
- mTLS -
-
-
- AGPL v3 -
-
- - -
+ + + + RAVEN C2 — Command and Control Framework + + + + + + + + + + +
-
-
08
-
-

Event-Driven Architecture

-

- Decoupled event system for clean separation between the operator - console, session manager, and agent handlers. -

-
-
-
09
-
- + + +
+ +
+ -

Cross-Platform

-

- Runs on Windows, Linux, macOS, and BSD via the JVM. - Platform-specific Maven build flags available for each target OS. -

-
+
-
-
-
-
-
- Installation -
-

Getting Started

-

Deploy RAVEN C2 v3.0 in under 5 minutes.

- -
-
-
-
01
-
-
-
-

Prerequisites

-

Ensure the following are installed before proceeding.

-
-
- - OpenJDK 17 or newer - Required -
-
- - Apache Maven 3.8+ - Required -
-
- - Git - Required +
+
+
+
+ + ADVERSARY EMULATION FRAMEWORK +
+

+ RAVEN + C2 FRAMEWORK v3.0 +

+

Modular, enterprise-grade Command & Control framework built in Java. Supports Web Panel, CLI, and JavaFX GUI with mutual TLS, AES-256-GCM encryption, and multi-protocol session handling.

+
+
OpenJDK 17+
+
Maven 3.8+
+
AES-256-GCM
+
mTLS
+
AGPL v3
+
+
-
- - Linux / Termux (Debian recommended) - Recommended -
-
-
-
-
-
-
02
-
-
-
-

Clone Repository

-

- Pull the source from GitHub. Use the - main branch for stable usage or - dev for contribution. -

-
-
- bash - +
+
+ + + + RAVEN-C2 — operator console +
+
+
+
RAVEN C2 Web Panel
+
RAVEN C2 Sessions
+
RAVEN C2 Terminal
+
RAVEN C2 CLI
+
RAVEN C2 GUI
+
RAVEN C2 Dashboard
+
+ + +
+
+ + + + + + +
-
-                    
-                        git clone --branch main https://github.com/MatrixTM26/RAVEN.git
-                        cd RAVEN
-                    
-                
-
-
+
-
-
-
03
-
-
-
-

Quick Run (Pre-built JAR)

-

- A ready-to-use JAR is included in the repository. No compilation - required. -

-
-
- bash - -
-
java -jar output/raven.jar
-
-
-
+
+
+
Overview
+

What is RAVEN C2

-
-
-
04
-
-
-
-

Build from Source

-

- Compile with Maven. Use platform-specific flags for JavaFX - support. -

-
-
- bash - +
+
+

RAVEN C2 is a multi-platform adversary emulation framework built in Java. It supports multiple interface modes — Web Panel (HTTP), CLI, and JavaFX GUI — and manages concurrent reverse shell sessions from a single operator console across diverse target environments.

+

Engineered for operational security: all agent communication is protected by AES-256-GCM encryption and mutual TLS authentication using PKCS12 keystores. The framework features a full certificate lifecycle manager (CA → Server → Agent), file transfer, thread-safe session handling, an event-driven architecture, and multi-operator TeamServer mode.

+
+ Java 17 + Web Panel + CLI + JavaFX GUI + mTLS + AES-GCM + v3.0 Active +
+
+ +
+
+
+ Multi + Transport Security +
+
+ v17 + Min JDK +
+
+ AGPL + License +
+
+ v3.0 + Version +
+
+
+
+
+ Authorized Use Only +

This tool is for legally authorized penetration testing and red team engagements only. Unauthorized use is illegal and unethical.

+
+
+
-
-                    
-                        # Linux / Termux
-                        mvn clean package -Djavafx.platform=linux -q
-
-                        # Windows
-                        mvn clean package -Djavafx.platform=windows -q
-
-                        # macOS
-                        mvn clean package -Djavafx.platform=macos -q
-                    
-                
-
-
+
-
-
-
05
-
-
-
-

Initialize Certificates & Launch

-

- Initialize mTLS certificates first, then start the server in - your preferred interface mode. -

-
-
- bash - +
+
+
Features
+

Core Capabilities

+

Everything a red team operator needs in a single Java-based framework.

+ +
+
+
01
+
+

Multi-Interface Support

+

Operate via Web Panel (browser at port 5000), CLI mode (-C), or full JavaFX desktop GUI (-G) — whichever fits your workflow.

+
+
+
02
+
+

AES-256-GCM Encryption

+

All agent communication is encrypted end-to-end with AES-256-GCM, preventing traffic analysis and ensuring operational confidentiality.

+
+
+
03
+
+

Mutual TLS (mTLS)

+

Agent authentication via PKCS12 keystores. Full CA, server, and agent certificate lifecycle management with a single init command.

+
+
+
04
+
+

Multi-Protocol Sessions

+

Handle RAVEN agents, Meterpreter sessions, and plain reverse shells concurrently from a single operator console.

+
+
+
05
+
+

File Transfer

+

Upload payloads and download evidence files with built-in progress tracking. Evidence saved to the configurable output directory.

+
+
+
06
+
+

OPSEC Design

+

Minimal target footprint, encrypted payloads, and configurable listeners. Designed for operational security in authorized engagements.

+
+
+
07
+
+

Thread-Safe Sessions

+

Concurrent session handling backed by a thread-safe manager. Multiple agents can connect and be interacted with simultaneously.

+
+
+
08
+
+

Event-Driven Architecture

+

Decoupled event system for clean separation between the operator console, session manager, and agent handlers.

+
+
+
09
+
+

Cross-Platform

+

Runs on Windows, Linux, macOS via the JVM. Platform-specific Maven build flags available for each target OS.

+
+
+
10
+
+

Database Support

+

In-memory, SQLite, PostgreSQL, and MongoDB backends configurable via raven.properties.

+
+
+
11
+
+

Operator Roles

+

Role-based access control with four levels: SUPER, ADMIN, OPERATOR, MEMBER — each with distinct permission sets.

+
+
+
12
+
+

TeamServer Mode

+

Multi-operator collaborative C2 with dedicated REST API, allowing multiple clients to connect to the same instance simultaneously.

+
-
-                                
-                                    # Initialize CA and server certificates
-                                        java -jar target/raven.jar --init-certs
-
-                                    # Web Panel Mode (default — http://localhost:5000)
-                                        java -jar target/raven.jar
-
-                                    # CLI Mode
-                                        java -jar target/raven.jar -C
-
-                                    # JavaFX GUI Mode
-                                        java -jar target/raven.jar -G
-                                
-                            
-
-
- Server running. Web panel at - http://localhost:5000 — waiting for agents. -
-
-
-
- - -
-
-
Commands
-

Command Reference

-

- CLI flags and operator console command reference for RAVEN C2 v3.0. -

- -
- - - - -
+
-
-
-
-
- FlagSyntaxDescription -
-
- -S, --host-S <addr>C2 server bind address (default: 0.0.0.0) -
-
- -p, --port-p <port>Web panel port (default: 5000) -
-
- -T, --mtls-TEnable mutual TLS authentication -
-
- -M, --meterpreter-MEnable multi-protocol mode -
-
- -C, --cli-mode-CStart in CLI interface mode -
-
- -G, --gui-mode-GStart in JavaFX GUI mode -
-
- --init-certs--init-certsInitialize CA and server certificates -
-
- -l, --list-agents-lList all generated agent certificates -
-
-
-
+
+
+
Installation
+

Getting Started

+

Deploy RAVEN C2 v3.0 in under 5 minutes.

-
-
-
-
- CommandSyntaxDescription -
-
- sessionssessionsList all active shell sessions -
-
- interactinteract [id]Open interactive shell with session -
-
- killkill [id]Terminate specified session -
-
- killallkillallTerminate all active sessions -
-
- infoinfo [id]Display session metadata and details -
-
- backgroundbackgroundBackground current interactive session -
-
- renamerename [id] [name]Label a session for identification -
-
-
-
+
+
+
+
01
+
+
+
+

Prerequisites

+

Ensure the following are installed before proceeding.

+
+
OpenJDK 17 or newerRequired
+
Apache Maven 3.8+Required
+
GitRequired
+
Linux / Termux (Debian recommended)Recommended
+
+
+
-
-
-
-
- CommandSyntaxDescription -
-
- uploadupload [local] [remote]Upload file from operator to target -
-
- downloaddownload [remote] [local]Download file from target to operator -
-
- lsls [path]List remote directory contents -
-
- cdcd [path]Change remote working directory -
-
- catcat [file]Read remote file contents -
-
- shellshell [cmd]Execute single command on remote session -
-
-
-
+
+
+
02
+
+
+
+

Clone Repository

+

Pull the source from GitHub. Use the main branch for stable usage or contrib for contribution.

+
+
+ bash + +
+
git clone --branch main https://github.com/MatrixTM26/RAVEN.git
+cd RAVEN
+
+
+
-
-
-
-
- FlagSyntaxDescription -
-
- --init-certs--init-certsInitialize CA and server certificate -
-
- -a, --gen-agent-a <id> -ah <host> -ap <port> -amGenerate single agent certificate -
-
- -m, --gen-multi-m -c <count> -u <prefix>Generate multiple agent certificates -
-
- -l, --list-agents-lList all generated agent certificates -
-
-
-
-
-
+
+
+
03
+
+
+
+

Quick Run (Pre-built JAR)

+

A ready-to-use JAR is included in the repository. No compilation required.

+
+
+ bash + +
+
java -jar output/raven.jar
+
+
+
-
-
-
- Architecture -
-

System Architecture

-

- How RAVEN C2 v3.0 components interconnect in a live deployment. -

- -
-
- - - - - - - - - - - - - - - - - - - - - OPERATOR INTERFACES - - - Web Panel · CLI · JavaFX GUI - - - - - - RAVEN C2 SERVER - - - Session Manager · mTLS Auth · AES-256-GCM - - - Event System · Cert Manager · File Transfer - - - - - - - RAVEN AGENT - - - 192.168.1.42 - - - session-1 · mTLS - - - - - METERPRETER - - - 10.0.0.15 - - - session-2 · multi-proto - - - - - REVERSE SHELL - - - 172.16.0.8 - - - session-3 · tcp - - - - - + more agents - - - - - - - - - mTLS / AES-256-GCM - - - - - OUTPUT LOGS - - - ./output - - - - - - CONFIG - - - server.properties - - - -
- -
-
-
-
-

Operator Interfaces

-

- Web Panel (browser), CLI terminal, and JavaFX desktop GUI — - all connecting to the same C2 server core. -

-
-
-
-
-
-

C2 Server Core

-

- Thread-safe session manager, mTLS auth, AES-256-GCM - encryption, event-driven architecture, and certificate - lifecycle manager. -

-
-
-
-
-
-

Multi-Protocol Agents

-

- Supports RAVEN agents (mTLS), Meterpreter sessions, and plain - reverse shells — all managed from one console. -

-
-
-
-
-
-

Output & Config

-

- All session I/O captured to timestamped logs in - ./output. All settings configurable via - server.properties. -

-
-
-
-
-
-
+
+
+
04
+
+
+
+

Build from Source

+

Compile with Maven. Use platform-specific flags for JavaFX support.

+
+
+ bash + +
+
# Linux / Termux
+mvn clean package -Djavafx.platform=linux -q
 
-    
-
-
- Configuration -
-

Configuration Reference

-

- All parameters available in server.properties. -

- -
-
-
- Server -
-
-
-
- KeyDefaultDescription +# Windows +mvn clean package -Djavafx.platform=windows -q + +# macOS +mvn clean package -Djavafx.platform=macos -q
+
+
+
+ +
+
+
05
+
+
+
+

Initialize Certificates & Launch

+

Initialize mTLS certificates first, then start the server in your preferred interface mode.

+
+
+ bash + +
+
# Initialize CA and server certificates
+java -jar target/raven-3.0.0.jar -i
+
+# Web Panel mode (default — http://localhost:5000)
+java -jar target/raven-3.0.0.jar
+
+# CLI mode
+java -jar target/raven-3.0.0.jar -C
+
+# JavaFX GUI mode
+java -jar target/raven-3.0.0.jar -G
+
+
Server running — Web panel at http://localhost:5000, waiting for agents.
+
+
-
- server.host0.0.0.0Bind address for C2 listener +
+ + +
+
+
Commands
+

Command Reference

+

CLI flags and operator console commands for RAVEN C2 v3.0.

+ +
+ + + + + + + +
-
- server.port4444Default agent listener port + +
+
+
+
OptionLong OptionDescription
+
-h-helpShow help and exit
+
-s <addr>-host <addr>C2 server bind address (default: server.properties)
+
-p <port>-port <port>C2 listener port (default: server.properties)
+
-C-cli-modeStart in CLI interface mode
+
-G-gui-modeStart in JavaFX GUI mode
+
-W-web-modeStart in Web Panel mode
+
-TSC-teamserver-cliTeamServer with CLI interface
+
-TSW-teamserver-webTeamServer with Web interface
+
-TSG-teamserver-guiTeamServer with GUI interface
+
-tp <port>-teamserver-port <port>TeamServer API port (default: server.properties)
+
-i-init-certsInitialize CA and server certificates
+
-l-listList all generated agent certificates
+
+
-
- server.web.port5000Web panel HTTP port + +
+
+
+
OptionLong OptionDescription
+
-A-multiMulti-protocol auto-detect
+
-R-rawRaw TCP reverse shell only
+
-b-httpHTTP beacon only
+
-B-httpsHTTPS beacon only
+
-T-tlsTCP TLS — RAVEN agent
+
-M-mtlsMutual TLS — RAVEN agent
+
-F-fmtlsFull mTLS + HTTPS beacon
+
+
-
- server.timeout30000Session timeout in milliseconds + +
+
+
+
CommandSyntaxDescription
+
sessionssessionsList all active agent sessions
+
agentsagentsAlias for sessions
+
useuse <id>Enter interactive shell with agent
+
sysinfosysinfo <id>Show full system info for agent
+
execexec <id> <cmd>Execute arbitrary command on agent (raw passthrough)
+
shellshell <id> <cmd>Execute via shell interpreter (sh -c / cmd /c)
+
broadcastbroadcast <id,...|all> <cmd>Broadcast command to selected or all agents
+
killkill <id>Terminate an agent session
+
pingping <id>Ping agent to verify liveness (raven: protocol)
+
reconnectreconnect <id>Ask RAVEN agent to reconnect
+
self-destructself-destruct <id>Wipe agent and terminate session (ADMIN+)
+
sleepsleep <id> <seconds>Set agent sleep interval
+
jitterjitter <id> <ms>Set agent jitter delay in ms
+
+
-
- server.backlog50Max pending connection queue size + +
+
+
+
CommandSyntaxDescription
+
whoamiwhoami <id>Current user info
+
idid <id>User ID / groups
+
hostnamehostname <id>Show agent hostname
+
unameuname <id>OS / kernel info
+
psps <id>Process list
+
netstatnetstat <id>Network connections
+
ifconfigifconfig <id>Network interfaces
+
arparp <id>ARP table
+
routeroute <id>Routing table
+
usersusers <id>Local users list
+
servicesservices <id>Running services
+
screenshotscreenshot <id>Capture desktop screenshot (raven: protocol)
+
privcheckprivcheck <id>Privilege escalation check
+
antivirusantivirus <id>Detect AV / EDR presence
+
hashdumphashdump <id>Dump credential hashes (raven: protocol)
+
keystrokekeystroke <id> <on|off>Toggle keylogger on agent
+
dumpbrowsersdumpbrowsers <id>Saved browser credentials (raven: protocol)
+
wifidumpwifidump <id>WiFi credentials dump
+
osqueryosquery <id> <sql>Run osquery SQL on agent
+
+
-
-
-
-
-
- Output -
-
-
-
- KeyDefaultDescription +
+
+
+
CommandSyntaxDescription
+
lsls <id> [path]List directory
+
pwdpwd <id>Working directory
+
cdcd <id> <path>Change directory on agent
+
catcat <id> <file>Read file contents
+
headhead <id> <file> [n]First N lines of a file
+
tailtail <id> <file> [n]Last N lines of a file
+
rmrm <id> <path>Delete file / directory
+
mkdirmkdir <id> <path>Create directory
+
cpcp <id> <src> <dst>Copy file or directory
+
mvmv <id> <src> <dst>Move file or directory
+
findfind <id> <path> [name]Find files
+
grepgrep <id> <pattern> <file>Search text in file
+
hashhash <id> <file> [sha256|md5]File hash computation
+
downloaddownload <id> <remote-path>Download file from agent (raven: protocol)
+
uploadupload <id> <local-path> [remote-path]Upload file to agent (raven: protocol)
+
+
-
- output.dir./outputDirectory for session logs and downloads + +
+
+
+
CommandSyntaxDescription
+
pivotpivot <id> <host:port>Register pivot route through agent
+
portfwdportfwd <id> <lport> <rhost> <rport>Port forward through agent
+
sockssocks <id> <lport>SOCKS5 proxy through agent
+
spawnspawn <id>Spawn new agent process on target
+
shellcodeshellcode <id> <hex>Inject shellcode into agent process
+
persistpersist <id> [method]Install persistence (cron/bashrc/systemd/reg/schtask)
+
unpersistunpersist <id> [method]Remove persistence entry
+
runasrunas <id> <user> <pass> <cmd>Run command as another user
+
+
-
- output.logtrueEnable command and output logging + +
+
+
+
OptionLong OptionDescription
+
-i-init-certsInitialize CA and server certificates
+
-s <host>-server <host>Server host used during cert init
+
-a <id>-agent <id>Generate a single agent certificate
+
-m-multiGenerate multiple agent certificates
+
-c <count>-count <count>Number of agents to generate (default: 10)
+
-u <prefix>-prefix <prefix>Username prefix for bulk agent certs
+
-ah <host>-agent-host <host>Agent callback host
+
-ap <port>-agent-port <port>Agent callback port
+
-am-agent-mtlsEnable mTLS in generated agent
+
-ps-persistentEnable persistence in generated agent
+
-hc-hide-consoleHide console window in generated agent
+
-l-listList all generated agent certificates
+
-r <id>-revoke <id>Revoke an agent certificate by ID
+
+
-
- output.timestamptruePrefix log entries with timestamps + +
+
+
+
OptionLong OptionDescription
+
-AO-add-operatorAdd a new operator
+
-RO-remove-operatorRemove an existing operator
+
-OP-operator-permissionView or update operator role
+
-u <user>-username <user>Operator username
+
-pw <pass>-password <pass>Operator password (min 8 characters)
+
-r <role>-role <role>Operator role: SUPER / ADMIN / OPERATOR / MEMBER
+
+
-
-
+
+ +
+
+
Architecture
+

System Architecture

+

How RAVEN C2 v3.0 components interconnect in a live deployment.

-
-
- Security +
+
+ + + + + + + + + OPERATOR INTERFACES + Web Panel · CLI · JavaFX GUI + + + RAVEN C2 SERVER + Session Manager · mTLS Auth · AES-256-GCM + Event System · Cert Manager · File Transfer + + + + + RAVEN AGENT + 192.168.1.42 + session-1 · mTLS + + + METERPRETER + 10.0.0.15 + session-2 · multi-proto + + + REVERSE SHELL + 172.16.0.8 + session-3 · tcp + + + + more agents + + + + + + + mTLS / AES-256-GCM + + + OUTPUT LOGS + ./output + + + + CONFIG + server.properties + + +
+ +
+
+
+
+

Operator Interfaces

+

Web Panel (browser), CLI terminal, and JavaFX desktop GUI — all connecting to the same C2 server core.

+
+
+
+
+
+

C2 Server Core

+

Thread-safe session manager, mTLS auth, AES-256-GCM encryption, event-driven architecture, and certificate lifecycle manager.

+
+
+
+
+
+

Multi-Protocol Agents

+

Supports RAVEN agents (mTLS), Meterpreter sessions, and plain reverse shells — all managed from one console.

+
+
+
+
+
+

Output & Config

+

All session I/O captured to timestamped logs in ./output. All settings configurable via server.properties.

+
+
+
+
-
-
-
- KeyDefaultDescription +
+ +
+
+
Configuration
+

Configuration Reference

+

All parameters available in config/server/raven.properties.

+ +
+
+ properties + +
+
# C2 listener
+server.host=0.0.0.0
+server.port=4444
+server.mode=multi
+
+# Web panel
+web.host=0.0.0.0
+web.port=5000
+
+# Database backend (none | sqlite | postgres | mongo)
+db.type=none
+
+# TLS protocol
+cert.tls.protocol=TLSv1.3
+
+# Logging
+logging.level=INFO
+logging.file.enabled=false
-
- crypto.enabledtrueEnable AES-256-GCM session encryption + +
+
+
Server
+
+
+
KeyDefaultDescription
+
server.host0.0.0.0Bind address for C2 listener
+
server.port4444Default agent listener port
+
server.modemultiListener mode (single / multi)
+
web.host0.0.0.0Web panel bind address
+
web.port5000Web panel HTTP port
+
+
+
+ +
+
Database
+
+
+
Valuedb.typeNotes
+
In-memorynoneDefault, no persistence
+
SQLitesqliteFile-based, no server required
+
PostgreSQLpostgresProduction-grade relational DB
+
MongoDBmongoDocument-oriented store
+
+
+
+ +
+
Security
+
+
+
KeyDefaultDescription
+
cert.tls.protocolTLSv1.3TLS protocol version enforced
+
logging.levelINFOLog verbosity level
+
logging.file.enabledfalseEnable file-based logging
+
+
+
-
- crypto.algorithmAES/GCM/NoPaddingEncryption algorithm for C2 traffic +
+
+ +
+
+
+
+ +

LEGAL DISCLAIMER

+
+

RAVEN C2 Framework is an offensive security tool designed exclusively for authorized penetration testing and red team engagements, controlled lab and research environments, and cybersecurity education under supervised conditions. You MUST have explicit written authorization from the system/network owner before deployment. Unauthorized use constitutes a criminal offense under applicable international and local cybercrime laws.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
-
- crypto.keysize256Key size in bits +
+
+ +
+
+
+
+

Ready to deploy

+

Explore the source, open issues, or contribute to RAVEN C2 on GitHub.

+
+
-
- mtls.enabledfalseEnable mutual TLS agent authentication +
+
+ + + + + + - - - + revealEls.forEach((el) => observer.observe(el)); + + diff --git a/doc/pages/public/logo.svg b/doc/pages/public/logo.svg index 6f9d042..622fc88 100644 --- a/doc/pages/public/logo.svg +++ b/doc/pages/public/logo.svg @@ -1,39 +1,897 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +