Skip to content

Agent API_p11

grisun0 edited this page Oct 16, 2026 · 20 revisions

API (page 11 of 23)

Previous: API_p10.md

modules/estorides_importer.py

Depends on: core/logging.py, modules/db.py Imported by: cli/commands/estorides.py, modules/intelligence_engine.py

modules/evasion_engine.py

Imported by: cli/commands/evasive_payload.py, skills/lazyown_mcp.py

modules/evasive_payloads.py

Imported by: cli/commands/evasive_payload.py

  • EvasivePayloadGenerator.__init__ (method) modules/evasive_payloads.py:84 def __init__(self)
  • EvasivePayloadGenerator.generate_powershell_obfuscated (method) modules/evasive_payloads.py:138 def generate_powershell_obfuscated(self, payload, obfuscation_level) -- Generate an obfuscated PowerShell payload.
  • EvasivePayloadGenerator.generate_javascript_obfuscated (method) modules/evasive_payloads.py:178 def generate_javascript_obfuscated(self, payload) -- Generate an obfuscated JavaScript payload.
  • EvasivePayloadGenerator.generate_vba_obfuscated (method) modules/evasive_payloads.py:197 def generate_vba_obfuscated(self, payload) -- Generate an obfuscated VBA macro payload.
  • EvasivePayloadGenerator.generate_linux_evasive (method) modules/evasive_payloads.py:214 def generate_linux_evasive(self, rhost, rport, technique) -- Generate an evasive Linux reverse shell payload.
  • EvasivePayloadGenerator.generate_shellcode_loader_powershell (method) modules/evasive_payloads.py:239 def generate_shellcode_loader_powershell(self, shellcode_b64, injection_technique) -- Generate a PowerShell shellcode loader with AMSI bypass.
  • EvasivePayloadGenerator.generate_lolbas_execution (method) modules/evasive_payloads.py:284 def generate_lolbas_execution(self, payload_url, technique) -- Generate a LOLBAS-based payload execution command.
  • EvasivePayloadGenerator.generate_polymorphic_command (method) modules/evasive_payloads.py:334 def generate_polymorphic_command(self, base_cmd, iterations) -- Generate a polymorphic command that mutates at each execution.
  • EvasivePayloadGenerator.list_techniques (method) modules/evasive_payloads.py:374 def list_techniques(self) -- Return all available evasion techniques.

modules/event_bus.py

Depends on: cli/commands/enum.py, core/logging.py, modules/collab_bp.py, modules/engagement_hooks.py Imported by: lazyc2.py, lazyown.py, modules/command_executor.py, modules/event_consumers.py, modules/loop_ai_bridge.py, modules/state_manager.py, modules/unified_bridge.py, skills/lazyown_mcp.py, tests/test_loop_ai_bridge.py

modules/event_consumers.py

Depends on: core/logging.py, modules/event_bus.py, modules/state_manager.py Imported by: lazyc2.py, lazyown.py, skills/autonomous_daemon.py

modules/event_engine.py

Imported by: lazyc2.py, skills/heartbeat.py, skills/lazyown_daemon.py, skills/lazyown_mcp.py, skills/sessions_watcher.py

modules/evidence.py

Imported by: modules/engage_summary.py, skills/autonomous_daemon.py, skills/lazyown_mcp.py, tests/test_engage_summary.py, tests/test_lazy_parity.py, tests/test_safety_gates.py

  • hash_bytes (function) modules/evidence.py:37 def hash_bytes(data) -- Return the lowercase hex SHA-256 of data.
  • EvidenceStore.__init__ (method) modules/evidence.py:57 def __init__(self, base_dir) -- Create vault directories.
  • EvidenceStore.blob_path (method) modules/evidence.py:65 def blob_path(self, content_hash) -- Resolve the canonical path for a validated hash.
  • EvidenceStore.put (method) modules/evidence.py:70 def put(self, data) -- Atomically store bytes and return their SHA-256 hash.
  • EvidenceStore.get (method) modules/evidence.py:90 def get(self, content_hash) -- Read and verify blob bytes for a hash.
  • EvidenceStore.exists (method) modules/evidence.py:98 def exists(self, content_hash) -- Return True when the blob exists on disk.
  • EvidenceStore.garbage_collect (method) modules/evidence.py:105 def garbage_collect(self, referenced) -- Remove unreferenced blobs older than the grace period.

modules/exp.c

Imported by: static/js/3d-force-graph-1.73.4.min.js, static/js/force-graph-1.43.5.min.js

  • add_key (function) modules/exp.c:147 static inline key_serial_t add_key(const char *type, const char *description, const void *payload...
  • keyctl (function) modules/exp.c:151 static inline long keyctl(int operation, unsigned long arg2, unsigned long arg3, unsigned long ar...
  • bye (function) modules/exp.c:155 void bye(char *info)
  • do_error_exit (function) modules/exp.c:161 void do_error_exit(char *info)
  • bye2 (function) modules/exp.c:167 void bye2(char *info, char *arg)
  • spray_keyring (function) modules/exp.c:172 key_serial_t *spray_keyring(uint32_t start, uint32_t spray_size)
  • spray_keyring_list_del_purpose (function) modules/exp.c:190 key_serial_t *spray_keyring_list_del_purpose(uint32_t spray_size, uint64_t next, uint64_t prev, u...
  • spray_keyring_list_overwrite_purpose (function) modules/exp.c:214 key_serial_t *spray_keyring_list_overwrite_purpose(uint32_t spray_size, uint64_t len, uint64_t of...
  • get_keyring_leak (function) modules/exp.c:248 int get_keyring_leak(key_serial_t *id_buffer, uint32_t id_buffer_size)
  • awake_partial_keys (function) modules/exp.c:271 void awake_partial_keys(key_serial_t *id_buffer, uint32_t idx)
  • release_keys (function) modules/exp.c:279 void release_keys(key_serial_t *id_buffer, uint32_t id_buffer_size)
  • release_partial_keys (function) modules/exp.c:290 void release_partial_keys(key_serial_t *id_buffer, int i)
  • unshare_setup (function) modules/exp.c:297 void unshare_setup(uid_t uid, gid_t gid)
  • set_stable_table_and_set (function) modules/exp.c:322 void set_stable_table_and_set(struct mnl_socket* nl, const char *name)
  • set_trigger_set_and_overwrite (function) modules/exp.c:385 void set_trigger_set_and_overwrite(struct mnl_socket* nl, const char *name, const char *set_name)
  • set_cpu_affinity (function) modules/exp.c:438 void set_cpu_affinity(int cpu_n, pid_t pid)
  • spray_mqueue (function) modules/exp.c:448 void spray_mqueue(mqd_t mqdes, char *msgptr, int spray_size)
  • gather_mqueue (function) modules/exp.c:463 int gather_mqueue(mqd_t mqdes, int gather_size)
  • gather_mqueue_nosave (function) modules/exp.c:485 int gather_mqueue_nosave(mqd_t mqdes, int gather_size)
  • spray_msg_msg (function) modules/exp.c:496 void spray_msg_msg(unsigned int size, unsigned int amount, int qid)
  • io_uring_setup (function) modules/exp.c:520 static inline int io_uring_setup(uint32_t entries, struct io_uring_params *p)
  • io_uring_register (function) modules/exp.c:524 static inline int io_uring_register(int fd, unsigned int opcode, void *arg, unsigned int nr_args)
  • spray_uring (function) modules/exp.c:529 struct fd_uring *spray_uring(uint32_t spray_size, struct fd_uring *fd_buffer)
  • release_uring (function) modules/exp.c:546 void release_uring(struct fd_uring *fd_buffer, uint32_t buffer_size)
  • release_partial_uring (function) modules/exp.c:554 void release_partial_uring(struct fd_uring *fd_buffer, uint32_t buffer_idx)
  • prepare_root_shell (function) modules/exp.c:559 void prepare_root_shell(void)
  • create_dummy_file (function) modules/exp.c:564 void create_dummy_file(void)
  • create_priv_file (function) modules/exp.c:572 void create_priv_file(void)
  • write_new_modprobe (function) modules/exp.c:582 void write_new_modprobe()
  • setup_modprobe_payload (function) modules/exp.c:601 void setup_modprobe_payload()
  • userland_T (function) modules/exp.c:605 void userland_T(int *sema)
  • sema_up (function) modules/exp.c:610 void sema_up(int *sema)
  • sema_down (function) modules/exp.c:615 void sema_down(int *sema)
  • main (function) modules/exp.c:620 int main(int argc, char ** argv)

modules/exploit_chain.py

Imported by: cli/commands/exploit_migrated.py

  • ExploitChain.__init__ (method) modules/exploit_chain.py:292 def __init__(self, rhost, rport, lhost, lport, sessions_dir, nmap_xml_path)
  • ExploitChain.fingerprint_services (method) modules/exploit_chain.py:311 def fingerprint_services(self, nmap_output) -- Parse service information from all available nmap XML files.
  • ExploitChain.map_vulnerabilities (method) modules/exploit_chain.py:446 def map_vulnerabilities(self) -- Map discovered services to known vulnerabilities.
  • ExploitChain.generate_exploit_plan (method) modules/exploit_chain.py:499 def generate_exploit_plan(self) -- Generate a prioritized exploitation plan.
  • ExploitChain.get_post_exploit_commands (method) modules/exploit_chain.py:519 def get_post_exploit_commands(self, platform) -- Return recommended post-exploitation commands for the platform.
  • ExploitChain.generate_report (method) modules/exploit_chain.py:531 def generate_report(self) -- Generate a structured exploitation chain report.
  • ExploitChain.save_report (method) modules/exploit_chain.py:566 def save_report(self, path) -- Save the exploitation chain report to a file.

modules/exploit_recommender.py

Depends on: lazygui/version.py, modules/world_model.py Imported by: cli/commands/exploit_migrated.py, cli/commands/pwn.py, modules/unified_dashboard.py, skills/lazyown_mcp.py

modules/exploitgym_gym.py

Depends on: modules/redteam_gym.py Imported by: cli/commands/exploitgym.py, skills/lazyown_mcp.py, tests/test_exploitgym_gym.py

  • check_readiness (function) modules/exploitgym_gym.py:112 def check_readiness(params) -- Report whether the ExploitGym harness can run.
  • list_tasks (function) modules/exploitgym_gym.py:178 def list_tasks(params, domain, limit) -- List available ExploitGym tasks, optionally filtered by domain.
  • setup_harness (function) modules/exploitgym_gym.py:249 def setup_harness(params, steps) -- Automate ExploitGym installation (clone, deps, data, firewall, images).
  • pull_task (function) modules/exploitgym_gym.py:344 def pull_task(task_id, params, timeout) -- Pull the Docker image required by a task.
  • run_task (function) modules/exploitgym_gym.py:423 def run_task(task_id, params, model, mitigations, timeout) -- Run the agent against an ExploitGym task and capture the outcome.
  • verify_flag (function) modules/exploitgym_gym.py:548 def verify_flag(task_id, params) -- Verify whether a task flag was captured from a previous run.
  • score_task (function) modules/exploitgym_gym.py:565 def score_task(task_id, success, techniques, params) -- Award Red Team Gym ELO and leaderboard points for a task outcome.

modules/fast_run_service.sh

modules/finding_lifecycle.py

Depends on: modules/osint_enrich.py Imported by: cli/commands/database.py, modules/attack_surface3d.py, modules/intel_fusion.py, modules/lazy_bridge.py, modules/lazy_loop.py, skills/autonomous_daemon.py, tests/test_autonomous_ops.py, tests/test_finding_lifecycle.py

  • confirm (function) modules/finding_lifecycle.py:61 def confirm(finding_id, evidence, sessions_dir, by) -- Mark a finding confirmed with linked evidence (CAIRN seed-add).
  • reject (function) modules/finding_lifecycle.py:90 def reject(finding_id, reason, sessions_dir, by) -- Mark a finding rejected (disproven lead, CAIRN dead-end discipline).
  • add_dead_end (function) modules/finding_lifecycle.py:104 def add_dead_end(kind, value, reason, sessions_dir) -- Suppress a value campaign-wide with a labeled reason (dead_end_hashes).
  • is_dead_end (function) modules/finding_lifecycle.py:116 def is_dead_end(kind, value, sessions_dir) -- Return True when a kind/value pair sits on the suppression list.
  • suppressed_values (function) modules/finding_lifecycle.py:123 def suppressed_values(sessions_dir) -- Return every suppressed value for text-level filtering by the loop.
  • resolve (function) modules/finding_lifecycle.py:129 def resolve(node, sessions_dir) -- Resolve a finding node's confirmation state.
  • apply_confirmation (function) modules/finding_lifecycle.py:154 def apply_confirmation(nodes, sessions_dir) -- Stamp confirmation/status on every finding node in place.
  • record (function) modules/finding_lifecycle.py:234 def record(db, workspace, host, title, severity, summary, poc) -- Record a campaign finding on the DB for one host.
  • findings_for (function) modules/finding_lifecycle.py:259 def findings_for(db, workspace) -- List campaign findings with parsed status markers.
  • set_status (function) modules/finding_lifecycle.py:264 def set_status(db, finding_id, status) -- Set the lifecycle status marker on one finding.
  • has_running_retest (function) modules/finding_lifecycle.py:310 def has_running_retest(finding_id, sessions_dir) -- Return True while a retest for the finding is still running.
  • request_retest (function) modules/finding_lifecycle.py:318 def request_retest(db, finding_id, sessions_dir) -- Queue a retest; an already-running one is returned unchanged.
  • resolve_retest (function) modules/finding_lifecycle.py:338 def resolve_retest(db, retest_id, conclusion, evidence, sessions_dir) -- Close a retest, bump the evidence version and apply the verdict.
  • classify_retest (function) modules/finding_lifecycle.py:384 def classify_retest(needle, output) -- Map retest output onto reproducible / fixed / inconclusive.
  • render_markdown (function) modules/finding_lifecycle.py:403 def render_markdown(db, workspace, title) -- Render campaign findings as a markdown report.

modules/forensic_cleaner.py

Imported by: cli/commands/opsec_cleanup.py

modules/gcp_attacks.py

Imported by: cli/commands/cloud_attacks.py

  • GCPAttackEngine.__init__ (method) modules/gcp_attacks.py:90 def __init__(self, config)
  • GCPAttackEngine.enumerate_iam_policy (method) modules/gcp_attacks.py:93 def enumerate_iam_policy(self, resource) -- Enumerate IAM policies for projects, folders, or organizations.
  • GCPAttackEngine.service_account_impersonation (method) modules/gcp_attacks.py:119 def service_account_impersonation(self) -- Exploit service account impersonation for privilege escalation.
  • GCPAttackEngine.cloud_functions_backdoor (method) modules/gcp_attacks.py:144 def cloud_functions_backdoor(self) -- Backdoor Cloud Functions for privilege escalation.
  • GCPAttackEngine.compute_engine_metadata_exfil (method) modules/gcp_attacks.py:173 def compute_engine_metadata_exfil(self) -- Exfiltrate GCE instance metadata and service account tokens.
  • GCPAttackEngine.gcs_enumeration (method) modules/gcp_attacks.py:194 def gcs_enumeration(self) -- Enumerate Cloud Storage buckets for sensitive data.
  • GCPAttackEngine.cloudbuild_abuse (method) modules/gcp_attacks.py:230 def cloudbuild_abuse(self) -- Abuse Cloud Build for privilege escalation.
  • GCPAttackEngine.organization_escalation (method) modules/gcp_attacks.py:261 def organization_escalation(self) -- Escalate from project-level to organization-level access.
  • GCPAttackEngine.summary (method) modules/gcp_attacks.py:297 def summary(self)

modules/generate_tools.py

modules/goals.py

Imported by: cli/commands/daemon_ctl.py, skills/autonomous_daemon.py, skills/lazyown_mcp.py, tests/test_lazy_parity.py

  • TaskConstraints.blocked (method) modules/goals.py:35 def blocked(self, command) -- Return the blocking constraint or empty string.
  • decompose_rule_based (function) modules/goals.py:63 def decompose_rule_based(objective_text, max_goals) -- Split objective text into goal specs without an LLM (deterministic).
  • load_constraints (function) modules/goals.py:83 def load_constraints(payload) -- Build constraints from payload config (deny wins, LAZY parity).
  • constraint_block_text (function) modules/goals.py:103 def constraint_block_text(constraints) -- Render the constraint block injected at max priority (LAZY parity).
  • GoalTracker.__init__ (method) modules/goals.py:120 def __init__(self, goals) -- Bind to an initial goal list.
  • GoalTracker.goals (method) modules/goals.py:125 def goals(self) -- Return a copy of tracked goals.
  • GoalTracker.prove_goal (method) modules/goals.py:129 def prove_goal(self, goal_text, evidence) -- Mark one goal achieved from evidence; return True when found.
  • GoalTracker.goal_met (method) modules/goals.py:140 def goal_met(self, opt_in) -- End the whole task; requires explicit opt-in (default unbound).
  • GoalTracker.all_achieved (method) modules/goals.py:148 def all_achieved(self) -- Return True when every goal is achieved.
  • GoalTracker.open_goals (method) modules/goals.py:152 def open_goals(self) -- Return goals still open.

modules/gpo_abuse.py

Imported by: cli/commands/active_directory.py

  • GPOAbuseEngine.__init__ (method) modules/gpo_abuse.py:118 def __init__(self, domain, dc_ip)
  • GPOAbuseEngine.parse_gpo_list (method) modules/gpo_abuse.py:124 def parse_gpo_list(self, raw_gpo_output) -- Parse Get-GPO or ldapsearch output for GPO information.
  • GPOAbuseEngine.parse_bloodhound_gpos (method) modules/gpo_abuse.py:160 def parse_bloodhound_gpos(self, bloodhound_nodes) -- Parse BloodHound GPO nodes for abusable policies.
  • GPOAbuseEngine.plan_scheduled_task (method) modules/gpo_abuse.py:182 def plan_scheduled_task(self, gpo, command, task_name) -- Plan a GPO-backed scheduled task for immediate code execution.
  • GPOAbuseEngine.plan_startup_script (method) modules/gpo_abuse.py:208 def plan_startup_script(self, gpo, script_content, script_name) -- Plan a GPO startup script for persistence via SYSVOL.
  • GPOAbuseEngine.plan_logon_script (method) modules/gpo_abuse.py:238 def plan_logon_script(self, gpo, command) -- Plan a GPO user logon script for user-triggered code execution.
  • GPOAbuseEngine.plan_local_admin_addition (method) modules/gpo_abuse.py:266 def plan_local_admin_addition(self, gpo, username, group) -- Plan adding a user to the local Administrators group via GPO preferences.
  • GPOAbuseEngine.plan_wmi_filter_abuse (method) modules/gpo_abuse.py:293 def plan_wmi_filter_abuse(self, gpo, wmi_query) -- Plan WMI filter abuse for targeted GPO scope control.
  • GPOAbuseEngine.plan_registry_preference (method) modules/gpo_abuse.py:322 def plan_registry_preference(self, gpo, registry_path, value_name, value_data, value_type) -- Plan a registry modification via GPO preferences.
  • GPOAbuseEngine.plan_service_installation (method) modules/gpo_abuse.py:356 def plan_service_installation(self, gpo, service_name, binary_path) -- Plan a service installation via GPO for SYSTEM-level persistence.
  • GPOAbuseEngine.generate_all_plans (method) modules/gpo_abuse.py:382 def generate_all_plans(self, command, username) -- Generate all abuse plans for the discovered GPOs.
  • GPOAbuseEngine.detect_risky_gpos (method) modules/gpo_abuse.py:406 def detect_risky_gpos(self) -- Identify GPOs with risky configurations for post-compromise cleanup.
  • GPOAbuseEngine.summary (method) modules/gpo_abuse.py:434 def summary(self) -- Return a summary of GPO abuse capabilities.

modules/gui_askpass.sh

modules/hash_cracker.py

Depends on: core/defaults.py, core/logging.py, modules/db.py Imported by: cli/commands/security.py, tests/test_hash_cracker.py

  • HashCracker.__init__ (method) modules/hash_cracker.py:164 def __init__(self, wordlist, rules, use_hashcat, timeout)
  • HashCracker.identify (method) modules/hash_cracker.py:186 def identify(self, line) -- Identify the hash type of a single line.
  • HashCracker.identify_file (method) modules/hash_cracker.py:273 def identify_file(self, filepath) -- Parse a hash file and group hashes by type.
  • HashCracker.crack_hash (method) modules/hash_cracker.py:295 def crack_hash(self, hash_value, hash_type, wordlist) -- Attempt to crack a single hash.
  • HashCracker.crack_file (method) modules/hash_cracker.py:349 def crack_file(self, filepath, wordlist, hash_types) -- Crack all hashes in a file.
  • HashCracker.import_to_db (method) modules/hash_cracker.py:405 def import_to_db(self, results, rhost, workspace_name) -- Import cracked results into the LazyOwnDB credentials table.
  • crack_secretsdump_output (function) modules/hash_cracker.py:695 def crack_secretsdump_output(filepath, wordlist, rhost) -- Convenience function: crack a secretsdump output file and import results.

modules/hive_invoke.py

Depends on: modules/toposwarm_bridge.py

modules/hostdiscover.sh

modules/ia_code_analysis.py

Depends on: core/console.py, core/logging.py, modules/logging_config.py

modules/ia_logs_analysis.py

Depends on: core/console.py, core/logging.py, modules/logging_config.py

modules/ia_network_analysis.py

Depends on: core/console.py, core/logging.py, modules/logging_config.py

modules/icmp_client.py

modules/icmp_server.py

Depends on: core/logging.py, modules/logging_config.py Imported by: tests/test_security_hardening_v3.py, tests/test_security_hardening_v5.py

modules/img2bin.py

modules/integrations/misp_export.py

Depends on: core/logging.py Imported by: modules/integrations/__init__.py, skills/lazyown_mcp.py, tests/test_core_modules.py

modules/integrations/nuclei_bridge.py

Depends on: core/logging.py Imported by: modules/integrations/__init__.py, modules/integrations/nuclei_parser.py, modules/intelligence_engine.py

modules/integrations/nuclei_parser.py

Depends on: core/logging.py, modules/db.py, modules/integrations/nuclei_bridge.py, modules/world_model.py Imported by: modules/intelligence_engine.py, tests/test_nuclei_parser.py

modules/integrations/searchsploit.py

Depends on: core/logging.py Imported by: modules/integrations/__init__.py, tests/test_core_modules.py

modules/intel_fusion.py

Depends on: modules/estorides_fusion.py, modules/finding_lifecycle.py Imported by: lazyc2.py, modules/atomic_exploit_bridge.py, modules/attack_surface3d.py, tests/test_asset_gate.py, tests/test_attack_surface3d.py, tests/test_intel_fusion.py

  • node_id (function) modules/intel_fusion.py:106 def node_id(kind, value) -- Deterministic node id from kind + normalized value.
  • build_intel_graph (function) modules/intel_fusion.py:176 def build_intel_graph(sessions_dir, est_cap) -- Fuse all session artefacts into one C2-centred intel graph.
  • add_node (function) modules/intel_fusion.py:183 def add_node(kind, value, label) -- Insert node or merge extra fields into the existing one.
  • add_edge (function) modules/intel_fusion.py:197 def add_edge(src, dst, kind, evidence, weight) -- Append one provenance-tagged relation.
  • tag_source (function) modules/intel_fusion.py:205 def tag_source(nid, source) -- Record a corroborating artefact on a node, deduped.
  • group_colors (function) modules/intel_fusion.py:512 def group_colors(graph) -- Stable colors for layer/language groupings (ReadMenator contract).
  • page_settings (function) modules/intel_fusion.py:528 def page_settings(graph) -- Explorer page settings with ReadMenator physics sizes (exact values).
  • build_analytics (function) modules/intel_fusion.py:585 def build_analytics(graph, summary) -- Side-panel analytics (attribution funnel + intel summary).
  • build_bundle_payload (function) modules/intel_fusion.py:659 def build_bundle_payload(graph) -- Derive the circular/spherical bundle payload from a fused graph.
  • bundle_settings (function) modules/intel_fusion.py:769 def bundle_settings(graph) -- Bundle page settings with ReadMenator sizes (exact values).
  • assign_layout (function) modules/intel_fusion.py:800 def assign_layout(graph, mode) -- Attach x/y/z for radial/spherical modes; force modes stay free.
  • write_summary (function) modules/intel_fusion.py:865 def write_summary(graph, sessions_dir) -- Score host exposure and suggest intents for the autonomous planner.

modules/intelligence_engine.py

Depends on: core/logging.py, modules/estorides_importer.py, modules/integrations/nuclei_bridge.py, modules/integrations/nuclei_parser.py, modules/obs_parser.py, modules/world_model.py, modules/yara_scanner.py Imported by: cli/commands/mcp_bridge.py, cli/commands/recon.py, skills/lazyown_mcp.py, tests/test_intelligence_engine.py

Next: API_p12.md

Start

Wiki

Agent Docs

Recipes

Clone this wiki locally