https://github.com/harry0703/MoneyPrinterTurbo.git ·
lang: python ·
LOC: ·
source: user_submitted
| Rule | Severity | Count |
|---|---|---|
MINED108 self.attribute used but never assigned in __init__ |
high | 25 |
MINED112 FastAPI POST/PUT/DELETE/PATCH endpoint without auth |
high | 8 |
MINED106 Phantom test coverage (assertion-free test) |
high | 5 |
COMP001 [COMP001] High cognitive complexity: Function `load_yfinanc… |
low | 4 |
MINED111 Bare except continues silently |
medium | 4 |
MINED050 Stub Only Function |
info | 4 |
MINED072 Python Pass Only Class |
info | 3 |
SEC078 Python: requests without timeout |
high | 2 |
MINED067 Python Requests No Timeout |
info | 2 |
MINED001 Bare Except Pass |
high | 2 |
DKR014
Dockerfile copies the entire context without .dockerignore
Dockerfile:59
· conf 0.92
Dockerfile copies the entire context without .dockerignore
MINED001
Bare Except Pass
CWE-755
app/models/exception.py:27
· conf 1.00
[MINED001] Bare Except Pass: except: pass or except Exception: pass — silently swallows everything including KeyboardInterrupt and bugs.
MINED001
Bare Except Pass
CWE-755
app/services/state.py:146
· conf 1.00
[MINED001] Bare Except Pass: except: pass or except Exception: pass — silently swallows everything including KeyboardInterrupt and bugs.
MINED004
Weak Crypto
CWE-327
app/services/material.py:176
· conf 1.00
[MINED004] Weak Crypto: MD5/SHA1/DES/RC4 used for security context (not just checksums).
MINED004
Weak Crypto
CWE-327
app/utils/utils.py:208
· conf 1.00
[MINED004] Weak Crypto: MD5/SHA1/DES/RC4 used for security context (not just checksums).
MINED014
Disabled Tls Verify
CWE-295
app/services/material.py:30
· conf 1.00
[MINED014] Disabled Tls Verify: verify=False in requests, rejectUnauthorized:false in node, InsecureSkipVerify:true in Go.
MINED106
Phantom test coverage (assertion-free test)
CWE-1126
test/services/test_llm.py:234
· conf 1.00
[MINED106] Phantom test coverage: test_ollama_default_base_url_uses_localhost_outside_container: Test function `test_ollama_default_base_url_uses_localhost_outside_container` runs code but contains n…
MINED106
Phantom test coverage (assertion-free test)
CWE-1126
test/services/test_llm.py:243
· conf 1.00
[MINED106] Phantom test coverage: test_ollama_default_base_url_uses_host_gateway_inside_container: Test function `test_ollama_default_base_url_uses_host_gateway_inside_container` runs code but contai…
MINED106
Phantom test coverage (assertion-free test)
CWE-1126
test/services/test_llm.py:256
· conf 1.00
[MINED106] Phantom test coverage: test_ollama_default_base_url_falls_back_to_container_gateway: Test function `test_ollama_default_base_url_falls_back_to_container_gateway` runs code but contains no …
MINED106
Phantom test coverage (assertion-free test)
CWE-1126
test/services/test_llm.py:270
· conf 1.00
[MINED106] Phantom test coverage: test_ollama_explicit_base_url_takes_precedence: Test function `test_ollama_explicit_base_url_takes_precedence` runs code but contains no assert / expect / should cal…
MINED106
Phantom test coverage (assertion-free test)
CWE-1126
test/services/test_task.py:48
· conf 1.00
[MINED106] Phantom test coverage: test_task_local_materials: Test function `test_task_local_materials` runs code but contains no assert / expect / should call — it passes regardless of behaviour. Add…
MINED108
self.attribute used but never assigned in __init__
CWE-476
test/services/test_task.py:39
· conf 1.00
[MINED108] `self.assertEqual` used but never assigned in __init__: Method `test_generate_script_forwards_advanced_prompt_options` of class `TestTaskService` reads `self.assertEqual`, but no assignmen…
MINED108
self.attribute used but never assigned in __init__
CWE-476
test/services/test_video.py:37
· conf 1.00
[MINED108] `self.original_app_config` used but never assigned in __init__: Method `setUp` of class `TestSecurityControls` reads `self.original_app_config`, but no assignment to it exists in __init__ …
MINED108
self.attribute used but never assigned in __init__
CWE-476
test/services/test_video.py:41
· conf 1.00
[MINED108] `self.original_app_config` used but never assigned in __init__: Method `tearDown` of class `TestSecurityControls` reads `self.original_app_config`, but no assignment to it exists in __init…
MINED108
self.attribute used but never assigned in __init__
CWE-476
test/services/test_video.py:64
· conf 1.00
[MINED108] `self.assertEqual` used but never assigned in __init__: Method `test_task_query_returns_relative_task_url_without_mutating_state` of class `TestSecurityControls` reads `self.assertEqual`, …
MINED108
self.attribute used but never assigned in __init__
CWE-476
test/services/test_video.py:65
· conf 1.00
[MINED108] `self.assertEqual` used but never assigned in __init__: Method `test_task_query_returns_relative_task_url_without_mutating_state` of class `TestSecurityControls` reads `self.assertEqual`, …
MINED108
self.attribute used but never assigned in __init__
CWE-476
test/services/test_video.py:79
· conf 1.00
[MINED108] `self.assertRaises` used but never assigned in __init__: Method `test_in_memory_task_manager_rejects_when_queue_is_full` of class `TestSecurityControls` reads `self.assertRaises`, but no a…
MINED108
self.attribute used but never assigned in __init__
CWE-476
test/services/test_video.py:84
· conf 1.00
[MINED108] `self.test_img_path` used but never assigned in __init__: Method `setUp` of class `TestVideoService` reads `self.test_img_path`, but no assignment to it exists in __init__ (and no class-le…
MINED108
self.attribute used but never assigned in __init__
CWE-476
test/services/test_video.py:90
· conf 1.00
[MINED108] `self.test_img_path` used but never assigned in __init__: Method `test_preprocess_video` of class `TestVideoService` reads `self.test_img_path`, but no assignment to it exists in __init__ …
MINED108
self.attribute used but never assigned in __init__
CWE-476
test/services/test_video.py:91
· conf 1.00
[MINED108] `self.test_img_path` used but never assigned in __init__: Method `test_preprocess_video` of class `TestVideoService` reads `self.test_img_path`, but no assignment to it exists in __init__ …
MINED108
self.attribute used but never assigned in __init__
CWE-476
test/services/test_video.py:91
· conf 1.00
[MINED108] `self.fail` used but never assigned in __init__: Method `test_preprocess_video` of class `TestVideoService` reads `self.fail`, but no assignment to it exists in __init__ (and no class-leve…
MINED108
self.attribute used but never assigned in __init__
CWE-476
test/services/test_video.py:95
· conf 1.00
[MINED108] `self.test_img_path` used but never assigned in __init__: Method `test_preprocess_video` of class `TestVideoService` reads `self.test_img_path`, but no assignment to it exists in __init__ …
MINED108
self.attribute used but never assigned in __init__
CWE-476
test/services/test_video.py:108
· conf 1.00
[MINED108] `self.assertIsNotNone` used but never assigned in __init__: Method `test_preprocess_video` of class `TestVideoService` reads `self.assertIsNotNone`, but no assignment to it exists in __ini…
MINED108
self.attribute used but never assigned in __init__
CWE-476
test/services/test_video.py:109
· conf 1.00
[MINED108] `self.assertEqual` used but never assigned in __init__: Method `test_preprocess_video` of class `TestVideoService` reads `self.assertEqual`, but no assignment to it exists in __init__ (and…
MINED108
self.attribute used but never assigned in __init__
CWE-476
test/services/test_video.py:110
· conf 1.00
[MINED108] `self.assertTrue` used but never assigned in __init__: Method `test_preprocess_video` of class `TestVideoService` reads `self.assertTrue`, but no assignment to it exists in __init__ (and n…
MINED108
self.attribute used but never assigned in __init__
CWE-476
test/services/test_video.py:131
· conf 1.00
[MINED108] `self.test_img_path` used but never assigned in __init__: Method `test_preprocess_video_rejects_material_outside_local_videos` of class `TestVideoService` reads `self.test_img_path`, but n…
MINED108
self.attribute used but never assigned in __init__
CWE-476
test/services/test_video.py:135
· conf 1.00
[MINED108] `self.assertEqual` used but never assigned in __init__: Method `test_preprocess_video_rejects_material_outside_local_videos` of class `TestVideoService` reads `self.assertEqual`, but no as…
MINED108
self.attribute used but never assigned in __init__
CWE-476
test/services/test_video.py:147
· conf 1.00
[MINED108] `self.assertEqual` used but never assigned in __init__: Method `test_get_bgm_file_accepts_song_directory_filename` of class `TestVideoService` reads `self.assertEqual`, but no assignment t…
MINED108
self.attribute used but never assigned in __init__
CWE-476
test/services/test_video.py:163
· conf 1.00
[MINED108] `self.assertEqual` used but never assigned in __init__: Method `test_get_bgm_file_accepts_project_relative_song_path` of class `TestVideoService` reads `self.assertEqual`, but no assignmen…
MINED108
self.attribute used but never assigned in __init__
CWE-476
test/services/test_video.py:177
· conf 1.00
[MINED108] `self.assertEqual` used but never assigned in __init__: Method `test_get_bgm_file_rejects_path_outside_song_directory` of class `TestVideoService` reads `self.assertEqual`, but no assignme…
MINED108
self.attribute used but never assigned in __init__
CWE-476
test/services/test_video.py:182
· conf 1.00
[MINED108] `self.assertEqual` used but never assigned in __init__: Method `test_get_ffmpeg_binary_uses_configured_env_path` of class `TestVideoService` reads `self.assertEqual`, but no assignment to …
MINED108
self.attribute used but never assigned in __init__
CWE-476
test/services/test_video.py:196
· conf 1.00
[MINED108] `self.assertEqual` used but never assigned in __init__: Method `test_get_ffmpeg_binary_falls_back_to_imageio_ffmpeg` of class `TestVideoService` reads `self.assertEqual`, but no assignment…
MINED108
self.attribute used but never assigned in __init__
CWE-476
test/services/test_video.py:206
· conf 1.00
[MINED108] `self.fail` used but never assigned in __init__: Method `test_open_video_clip_quietly_suppresses_moviepy_stdout` of class `TestVideoService` reads `self.fail`, but no assignment to it exis…
MINED108
self.attribute used but never assigned in __init__
CWE-476
test/services/test_video.py:213
· conf 1.00
[MINED108] `self.assertEqual` used but never assigned in __init__: Method `test_open_video_clip_quietly_suppresses_moviepy_stdout` of class `TestVideoService` reads `self.assertEqual`, but no assignm…
MINED108
self.attribute used but never assigned in __init__
CWE-476
test/services/test_video.py:214
· conf 1.00
[MINED108] `self.assertIsNone` used but never assigned in __init__: Method `test_open_video_clip_quietly_suppresses_moviepy_stdout` of class `TestVideoService` reads `self.assertIsNone`, but no assig…
MINED108
self.attribute used but never assigned in __init__
CWE-476
test/services/test_video.py:215
· conf 1.00
[MINED108] `self.assertGreater` used but never assigned in __init__: Method `test_open_video_clip_quietly_suppresses_moviepy_stdout` of class `TestVideoService` reads `self.assertGreater`, but no ass…
MINED112
FastAPI POST/PUT/DELETE/PATCH endpoint without auth
CWE-306CWE-862
app/controllers/v1/llm.py:23
· conf 0.80
[MINED112] FastAPI POST /scripts has no auth: Handler `generate_video_script` is registered with router/app.post(...) but no Depends/Security parameter is declared and no auth marker appears in the f…
MINED112
FastAPI POST/PUT/DELETE/PATCH endpoint without auth
CWE-306CWE-862
app/controllers/v1/llm.py:40
· conf 0.80
[MINED112] FastAPI POST /terms has no auth: Handler `generate_video_terms` is registered with router/app.post(...) but no Depends/Security parameter is declared and no auth marker appears in the func…
MINED112
FastAPI POST/PUT/DELETE/PATCH endpoint without auth
CWE-306CWE-862
app/controllers/v1/video.py:116
· conf 0.80
[MINED112] FastAPI POST /videos has no auth: Handler `create_video` is registered with router/app.post(...) but no Depends/Security parameter is declared and no auth marker appears in the function bo…
MINED112
FastAPI POST/PUT/DELETE/PATCH endpoint without auth
CWE-306CWE-862
app/controllers/v1/video.py:123
· conf 0.80
[MINED112] FastAPI POST /subtitle has no auth: Handler `create_subtitle` is registered with router/app.post(...) but no Depends/Security parameter is declared and no auth marker appears in the functi…
MINED112
FastAPI POST/PUT/DELETE/PATCH endpoint without auth
CWE-306CWE-862
app/controllers/v1/video.py:130
· conf 0.80
[MINED112] FastAPI POST /audio has no auth: Handler `create_audio` is registered with router/app.post(...) but no Depends/Security parameter is declared and no auth marker appears in the function bod…
MINED112
FastAPI POST/PUT/DELETE/PATCH endpoint without auth
CWE-306CWE-862
app/controllers/v1/video.py:217
· conf 0.80
[MINED112] FastAPI DELETE /tasks/{task_id} has no auth: Handler `delete_video` is registered with router/app.delete(...) but no Depends/Security parameter is declared and no auth marker appears in th…
MINED112
FastAPI POST/PUT/DELETE/PATCH endpoint without auth
CWE-306CWE-862
app/controllers/v1/video.py:263
· conf 0.80
[MINED112] FastAPI POST /musics has no auth: Handler `upload_bgm_file` is registered with router/app.post(...) but no Depends/Security parameter is declared and no auth marker appears in the function…
MINED112
FastAPI POST/PUT/DELETE/PATCH endpoint without auth
CWE-306CWE-862
app/controllers/v1/video.py:315
· conf 0.80
[MINED112] FastAPI POST /video_materials has no auth: Handler `upload_video_material_file` is registered with router/app.post(...) but no Depends/Security parameter is declared and no auth marker app…
MINED118
Dockerfile FROM not pinned by sha256 digest
CWE-829
Dockerfile:2
· conf 0.90
[MINED118] Dockerfile FROM `python:3.11-slim-bullseye` not pinned by digest: `FROM python:3.11-slim-bullseye` resolves the tag at build time. The registry CAN re-push a different image for the same t…
SEC029
Server-Side Request Forgery (SSRF) — outbound HTTP from user input
app/controllers/manager/redis_manager.py:23
· conf 1.00
[SEC029] Server-Side Request Forgery (SSRF) — outbound HTTP from user input: Outbound HTTP request to a user-controlled URL without allowlist validation. Attackers can probe internal services (169.25…
SEC029
Server-Side Request Forgery (SSRF) — outbound HTTP from user input
app/services/material.py:74
· conf 1.00
[SEC029] Server-Side Request Forgery (SSRF) — outbound HTTP from user input: Outbound HTTP request to a user-controlled URL without allowlist validation. Attackers can probe internal services (169.25…
SEC078
Python: requests without timeout
app/services/material.py:74
· conf 1.00
[SEC078] Python: requests without timeout: requests.get/post without a timeout will hang indefinitely on a non-responsive server, causing thread exhaustion and ReDoS. Ported from bandit B113 (Apache-…
SEC078
Python: requests without timeout
app/services/upload_post.py:80
· conf 1.00
[SEC078] Python: requests without timeout: requests.get/post without a timeout will hang indefinitely on a non-responsive server, causing thread exhaustion and ReDoS. Ported from bandit B113 (Apache-…
SEC128
Async function without await — fire-and-forget Promise (AI mistake)
app/services/state.py:133
· conf 1.00
[SEC128] Async function without await — fire-and-forget Promise (AI mistake): Async call invoked without `await` returns an unhandled Promise. The outer function resolves before the inner work comple…
SEC135
Auth/permission check missing on AI-generated endpoint
app/controllers/v1/llm.py:18
· conf 1.00
[SEC135] Auth/permission check missing on AI-generated endpoint: Mutating HTTP endpoint generated by an AI agent without an auth decorator or middleware. The number-one production-incident pattern we…
AUC001
[AUC001] No Repobility access matrix policy found: The repository uses web/API frameworks but does not define .repobility/access.yml or equivalent authorization documentation.
· conf 0.92
[AUC001] No Repobility access matrix policy found: The repository uses web/API frameworks but does not define .repobility/access.yml or equivalent authorization documentation.
AUC002
[AUC002] Low visible authorization coverage in route inventory: Only 0.0% of discovered routes show nearby authentication, authorization, middleware, or public-route evidence.
· conf 0.74
[AUC002] Low visible authorization coverage in route inventory: Only 0.0% of discovered routes show nearby authentication, authorization, middleware, or public-route evidence.
AUC012
[AUC012] FastAPI interactive docs may be exposed by framework defaults: FastAPI exposes /docs, /redoc, and /openapi.json by default. Public production APIs should explicitly disable those defaults, protect them behind admin authentication, or publish a reviewed OpenAPI spec with declared security requirements.
· conf 0.72
[AUC012] FastAPI interactive docs may be exposed by framework defaults: FastAPI exposes /docs, /redoc, and /openapi.json by default. Public production APIs should explicitly disable those defaults, p…
CFG006
[CFG006] Missing .gitignore: No .gitignore file. Risk of committing secrets and build artifacts.
· conf 1.00
[CFG006] Missing .gitignore: No .gitignore file. Risk of committing secrets and build artifacts.
COMP001
[COMP001] High cognitive complexity: Function `load_yfinance_data` has cognitive complexity 9 (SonarSource scale). Cognitive complexity measures how hard the function is for a human to understand — nested branches, boolean chains, and recursion all weigh in. Breakdown: except=1, for=1, if=2, nested_bonus=3, or=2.
app/services/material.py:168
· conf 0.95
[COMP001] High cognitive complexity: Function `save_video` has cognitive complexity 16 (SonarSource scale). Cognitive complexity measures how hard the function is for a human to understand — nested b…
COMP001
[COMP001] High cognitive complexity: Function `load_yfinance_data` has cognitive complexity 9 (SonarSource scale). Cognitive complexity measures how hard the function is for a human to understand — nested branches, boolean chains, and recursion all weigh in. Breakdown: except=1, for=1, if=2, nested_bonus=3, or=2.
app/services/material.py:228
· conf 0.95
[COMP001] High cognitive complexity: Function `download_videos` has cognitive complexity 19 (SonarSource scale). Cognitive complexity measures how hard the function is for a human to understand — nes…
CORE_NO_CI
No CI/CD configuration found
No CI/CD configuration found
DKR001
Docker final stage has no non-root USER
Dockerfile:2
· conf 0.82
Docker final stage has no non-root USER
DKR007
Docker build context has no .dockerignore
.dockerignore
· conf 0.90
Docker build context has no .dockerignore
MINED111
Bare except continues silently
app/services/llm.py:490
· conf 1.00
[MINED111] Bare except continues silently: Bare `except:` (or `except Exception:`) that runs code without re-raising or logging the exception. Hides real failures and makes bugs hard to diagnose.
MINED111
Bare except continues silently
app/services/voice.py:1433
· conf 1.00
[MINED111] Bare except continues silently: Bare `except:` (or `except Exception:`) that runs code without re-raising or logging the exception. Hides real failures and makes bugs hard to diagnose.
MINED111
Bare except continues silently
app/utils/utils.py:221
· conf 1.00
[MINED111] Bare except continues silently: Bare `except:` (or `except Exception:`) that runs code without re-raising or logging the exception. Hides real failures and makes bugs hard to diagnose.
MINED111
Bare except continues silently
test/services/test_video.py:311
· conf 1.00
[MINED111] Bare except continues silently: Bare `except:` (or `except Exception:`) that runs code without re-raising or logging the exception. Hides real failures and makes bugs hard to diagnose.
SEC014
SSL Verification Disabled
app/services/material.py:30
· conf 1.00
[SEC014] SSL Verification Disabled: SSL certificate verification is disabled, allowing man-in-the-middle attacks.
SEC034
Log Injection / Log Forging — unsanitized user input in log
app/services/material.py:71
· conf 1.00
[SEC034] Log Injection / Log Forging — unsanitized user input in log: User input is logged without sanitizing newlines or control characters. Attackers inject `\n` to forge fake log entries, hide tra…
SEC127
AI agent stub — TODO: implement / pass placeholder body
app/controllers/manager/base_manager.py:19
· conf 1.00
[SEC127] AI agent stub — TODO: implement / pass placeholder body: Function body left as TODO/pass/raise NotImplementedError after an AI scaffolding pass. The route appears to exist (and may even pass…
WEB003
Public web service has no security.txt
.well-known/security.txt
· conf 0.78
Public web service has no security.txt
AUC005
[AUC005] No authorization-focused tests detected: No test files with common authorization, ownership, 403, admin, or super_admin assertions were found.
· conf 0.76
[AUC005] No authorization-focused tests detected: No test files with common authorization, ownership, 403, admin, or super_admin assertions were found.
COMP001
[COMP001] High cognitive complexity: Function `load_yfinance_data` has cognitive complexity 9 (SonarSource scale). Cognitive complexity measures how hard the function is for a human to understand — nested branches, boolean chains, and recursion all weigh in. Breakdown: except=1, for=1, if=2, nested_bonus=3, or=2.
app/config/config.py:65
· conf 0.95
[COMP001] High cognitive complexity: Function `get_container_default_gateway_ip` has cognitive complexity 10 (SonarSource scale). Cognitive complexity measures how hard the function is for a human to…
SEC132
String concat where the language has interpolation (AI style drift)
main.py:8
· conf 1.00
[SEC132] String concat where the language has interpolation (AI style drift): String built by concatenation where the language has cleaner interpolation (Python f-strings since 3.6, JS template liter…
COMP001
[COMP001] High cognitive complexity: Function `load_yfinance_data` has cognitive complexity 9 (SonarSource scale). Cognitive complexity measures how hard the function is for a human to understand — nested branches, boolean chains, and recursion all weigh in. Breakdown: except=1, for=1, if=2, nested_bonus=3, or=2.
· conf 0.20
[COMP001] High cognitive complexity (and 8 more): Same pattern found in 8 additional files. Review if needed.
MINED043
Http Not Https
CWE-319
app/config/config.py:110
· conf 1.00
[MINED043] Http Not Https: Hardcoded http:// (not localhost) for endpoints that handle credentials or data.
MINED050
Stub Only Function
CWE-1188
· conf 0.20
[MINED050] Stub Only Function (and 1 more): Same pattern found in 1 additional files. Review if needed.
MINED050
Stub Only Function
CWE-1188
app/controllers/manager/base_manager.py:8
· conf 1.00
[MINED050] Stub Only Function: Function declared but body is just pass, return None, raise NotImplementedError, or TODO comment.
MINED050
Stub Only Function
CWE-1188
app/models/exception.py:28
· conf 1.00
[MINED050] Stub Only Function: Function declared but body is just pass, return None, raise NotImplementedError, or TODO comment.
MINED050
Stub Only Function
CWE-1188
app/models/schema.py:188
· conf 1.00
[MINED050] Stub Only Function: Function declared but body is just pass, return None, raise NotImplementedError, or TODO comment.
MINED065
Cors Wildcard
CWE-942CWE-346
app/asgi.py:56
· conf 1.00
[MINED065] Cors Wildcard: Access-Control-Allow-Origin: * exposes the API to any browser origin. Acceptable for public read-only endpoints; dangerous when paired with credentials or write endpoints.
MINED067
Python Requests No Timeout
CWE-400
app/services/material.py:74
· conf 1.00
[MINED067] Python Requests No Timeout: requests.get/post/etc. without timeout= can hang forever.
MINED067
Python Requests No Timeout
CWE-400
app/services/upload_post.py:80
· conf 1.00
[MINED067] Python Requests No Timeout: requests.get/post/etc. without timeout= can hang forever.
MINED072
Python Pass Only Class
CWE-1188
app/controllers/manager/base_manager.py:7
· conf 1.00
[MINED072] Python Pass Only Class: class Foo: pass — stub waiting to be filled in.
MINED072
Python Pass Only Class
CWE-1188
app/models/exception.py:27
· conf 1.00
[MINED072] Python Pass Only Class: class Foo: pass — stub waiting to be filled in.
MINED072
Python Pass Only Class
CWE-1188
app/models/schema.py:187
· conf 1.00
[MINED072] Python Pass Only Class: class Foo: pass — stub waiting to be filled in.
MINED079
Off By One Slice
CWE-193
app/services/subtitle.py:174
· conf 1.00
[MINED079] Off By One Slice: range(len(x)+1), arr[i+1:i+n+1], or while i<=len(arr) — off-by-one risk.
Reading from rp.scan + rp.finding + rp.rule (unified schema, R78 series). Legacy data path unchanged. Compare with /scan/73fa1dd3-8519-4431-8a03-a547e973030a/.