Deploy SAT & ACT Learning Lab 1.3.5
Browse files- DEPLOYMENT_NOTES.md +18 -8
- README.md +16 -7
- app.py +0 -0
- release_manifest.json +37 -17
- requirements.txt +2 -2
DEPLOYMENT_NOTES.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
# Deployment notes — SAT & ACT Learning Lab 1.3.
|
| 2 |
|
| 3 |
Target private Space: `DearmonAnalytics/SAT_ACT_Learning_Lab`
|
| 4 |
|
|
@@ -6,7 +6,7 @@ Turso database: `dearmon-sat-act-learning-lab`
|
|
| 6 |
|
| 7 |
Schema namespace: `sat_act_learning_lab_v1`
|
| 8 |
|
| 9 |
-
Encrypted-source secret: `
|
| 10 |
|
| 11 |
## Runtime contract
|
| 12 |
|
|
@@ -40,7 +40,15 @@ Encrypted-source secret: `SAT_ACT_APP_FERNET_V1_3_0_530ED11365EB_0A5895DF3462`
|
|
| 40 |
simulation may reserve blueprint duration plus a 45-minute grace period,
|
| 41 |
capped at four hours; sign-out or restart still erases it immediately.
|
| 42 |
- Instructor-wide access requires a strong secret with no fallback.
|
| 43 |
-
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 44 |
- Break It Apart is a deterministic, provider-independent, post-miss reasoning
|
| 45 |
DAG. It is available after every incorrect practice grade and for every
|
| 46 |
missed objective item reviewed after a completed simulation—never before
|
|
@@ -61,7 +69,7 @@ Encrypted-source secret: `SAT_ACT_APP_FERNET_V1_3_0_530ED11365EB_0A5895DF3462`
|
|
| 61 |
|
| 62 |
Core secrets are `OPENAI_API_KEY`, `TURSO_DATABASE_URL`, `TURSO_AUTH_TOKEN`,
|
| 63 |
`LEARNER_ID_HMAC_SECRET`, `INSTRUCTOR_EXPORT_SECRET`, and
|
| 64 |
-
`
|
| 65 |
`SIMLI_API_KEY`.
|
| 66 |
|
| 67 |
Email recovery uses `AUTH_RECOVERY_EMAIL_ENABLED`, `AUTH_SMTP_HOST`,
|
|
@@ -75,20 +83,22 @@ Release runtime defaults include `ACCOUNT_AUTH_ENABLED=1`,
|
|
| 75 |
`SAT_ACT_DEMO_MODE_ENABLED=1`,
|
| 76 |
`SAT_ACT_DEMO_SESSION_TTL_SECONDS=2700`,
|
| 77 |
`ASK_PROFESSOR_COMPONENT_DEFAULT=1`, `ASK_PROFESSOR_TTS_DEFAULT=0`, and
|
| 78 |
-
`ASK_PROFESSOR_SIMLI_DEFAULT=0`.
|
|
|
|
|
|
|
| 79 |
listed in `environment.example` used to prepare this deployment.
|
| 80 |
|
| 81 |
-
## v1.3.
|
| 82 |
|
| 83 |
Finish or explicitly abandon every active timed simulation from an earlier
|
| 84 |
-
release before installing v1.3.
|
| 85 |
app/source/form versions and cannot be resumed across this release. Back up
|
| 86 |
Turso, preserve `LEARNER_ID_HMAC_SECRET`, and retain prior Fernet secrets and
|
| 87 |
rollback commits needed through acceptance testing.
|
| 88 |
|
| 89 |
## Key lifecycle and rollback
|
| 90 |
|
| 91 |
-
The current loader reads only `
|
| 92 |
new versioned, fingerprinted secret name. The deployer adds that secret before
|
| 93 |
the repository commit and retains earlier keys. Roll back by reverting the
|
| 94 |
Space repository to the prior commit recorded in `deployment_receipt.json`.
|
|
|
|
| 1 |
+
# Deployment notes — SAT & ACT Learning Lab 1.3.5
|
| 2 |
|
| 3 |
Target private Space: `DearmonAnalytics/SAT_ACT_Learning_Lab`
|
| 4 |
|
|
|
|
| 6 |
|
| 7 |
Schema namespace: `sat_act_learning_lab_v1`
|
| 8 |
|
| 9 |
+
Encrypted-source secret: `SAT_ACT_APP_FERNET_V1_3_5_6C38E208CB90_7C200BA80629`
|
| 10 |
|
| 11 |
## Runtime contract
|
| 12 |
|
|
|
|
| 40 |
simulation may reserve blueprint duration plus a 45-minute grace period,
|
| 41 |
capped at four hours; sign-out or restart still erases it immediately.
|
| 42 |
- Instructor-wide access requires a strong secret with no fallback.
|
| 43 |
+
- Core scored questions and answer keys are deterministic and model-independent.
|
| 44 |
+
- The Printable Exam Builder requires an active demo or signed-in learner so
|
| 45 |
+
every generated file is vault-owned, then produces separate matched
|
| 46 |
+
student/key PDFs from selected or learner-missed topics. Optional AI overflow
|
| 47 |
+
is explicit, serialized, globally/individually rate-limited, capped at two
|
| 48 |
+
topic batches and eight items per build,
|
| 49 |
+
independently reviewed, print-only, and locked until the active learner has
|
| 50 |
+
completed every built-in question type for that exact topic. It never enters
|
| 51 |
+
mastery, readiness, routing, diagnostics, or simulation scoring.
|
| 52 |
- Break It Apart is a deterministic, provider-independent, post-miss reasoning
|
| 53 |
DAG. It is available after every incorrect practice grade and for every
|
| 54 |
missed objective item reviewed after a completed simulation—never before
|
|
|
|
| 69 |
|
| 70 |
Core secrets are `OPENAI_API_KEY`, `TURSO_DATABASE_URL`, `TURSO_AUTH_TOKEN`,
|
| 71 |
`LEARNER_ID_HMAC_SECRET`, `INSTRUCTOR_EXPORT_SECRET`, and
|
| 72 |
+
`SAT_ACT_APP_FERNET_V1_3_5_6C38E208CB90_7C200BA80629`. Live avatar video additionally uses optional
|
| 73 |
`SIMLI_API_KEY`.
|
| 74 |
|
| 75 |
Email recovery uses `AUTH_RECOVERY_EMAIL_ENABLED`, `AUTH_SMTP_HOST`,
|
|
|
|
| 83 |
`SAT_ACT_DEMO_MODE_ENABLED=1`,
|
| 84 |
`SAT_ACT_DEMO_SESSION_TTL_SECONDS=2700`,
|
| 85 |
`ASK_PROFESSOR_COMPONENT_DEFAULT=1`, `ASK_PROFESSOR_TTS_DEFAULT=0`, and
|
| 86 |
+
`ASK_PROFESSOR_SIMLI_DEFAULT=0`. Printable supplemental generation defaults to
|
| 87 |
+
`OPENAI_OVERFLOW_MODEL=gpt-5-mini` and
|
| 88 |
+
`OPENAI_OVERFLOW_REVIEW_MODEL=gpt-5-mini`. Face IDs and the pinned Simli client module are
|
| 89 |
listed in `environment.example` used to prepare this deployment.
|
| 90 |
|
| 91 |
+
## v1.3.5 upgrade gate
|
| 92 |
|
| 93 |
Finish or explicitly abandon every active timed simulation from an earlier
|
| 94 |
+
release before installing v1.3.5. Checkpoints are intentionally bound to
|
| 95 |
app/source/form versions and cannot be resumed across this release. Back up
|
| 96 |
Turso, preserve `LEARNER_ID_HMAC_SECRET`, and retain prior Fernet secrets and
|
| 97 |
rollback commits needed through acceptance testing.
|
| 98 |
|
| 99 |
## Key lifecycle and rollback
|
| 100 |
|
| 101 |
+
The current loader reads only `SAT_ACT_APP_FERNET_V1_3_5_6C38E208CB90_7C200BA80629`. A later release must generate a
|
| 102 |
new versioned, fingerprinted secret name. The deployer adds that secret before
|
| 103 |
the repository commit and retains earlier keys. Roll back by reverting the
|
| 104 |
Space repository to the prior commit recorded in `deployment_receipt.json`.
|
README.md
CHANGED
|
@@ -14,16 +14,25 @@ short_description: Dynamic SAT/ACT practice, mastery, and reasoning graphs
|
|
| 14 |
|
| 15 |
# Dearmon Analytics SAT & ACT Learning Lab
|
| 16 |
|
| 17 |
-
Release `1.3.
|
| 18 |
ACT skill blueprints, a four-level topic graph, individual mastery tracking,
|
| 19 |
targeted practice, and test-like diagnostic sessions. It adds username/password
|
| 20 |
accounts, secure recovery, an isolated one-click demo, and the embedded teaching
|
| 21 |
avatar layer used by the Dearmon Analytics Business Calculus platform. Release
|
| 22 |
1.2.0 introduced deterministic post-miss **Break It Apart** attribute graphs.
|
|
|
|
|
|
|
|
|
|
| 23 |
|
| 24 |
-
The
|
| 25 |
-
|
| 26 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 27 |
|
| 28 |
After every incorrectly graded practice question, and for every missed
|
| 29 |
objective item reviewed after a completed simulation, Break It Apart constructs
|
|
@@ -41,7 +50,7 @@ attribute-level mastery or retention records.
|
|
| 41 |
This private Space uses the separate Turso database
|
| 42 |
`dearmon-sat-act-learning-lab` and schema namespace
|
| 43 |
`sat_act_learning_lab_v1`. Its encrypted application uses the versioned Space
|
| 44 |
-
secret `
|
| 45 |
|
| 46 |
Required Space secrets are `OPENAI_API_KEY`, `TURSO_DATABASE_URL`,
|
| 47 |
`TURSO_AUTH_TOKEN`, `LEARNER_ID_HMAC_SECRET`, `INSTRUCTOR_EXPORT_SECRET`, and
|
|
@@ -83,9 +92,9 @@ controls, and retention policies.
|
|
| 83 |
|
| 84 |
## Upgrade note
|
| 85 |
|
| 86 |
-
Before replacing any earlier release with v1.3.
|
| 87 |
must be finished or explicitly abandoned. Saved forms are bound to the app
|
| 88 |
-
version and encrypted-source fingerprint, so v1.3.
|
| 89 |
checkpoints. Preserve `LEARNER_ID_HMAC_SECRET` and retain every prior versioned
|
| 90 |
Fernet secret and rollback commit needed through acceptance testing.
|
| 91 |
|
|
|
|
| 14 |
|
| 15 |
# Dearmon Analytics SAT & ACT Learning Lab
|
| 16 |
|
| 17 |
+
Release `1.3.5` provides original dynamic practice for current SAT and
|
| 18 |
ACT skill blueprints, a four-level topic graph, individual mastery tracking,
|
| 19 |
targeted practice, and test-like diagnostic sessions. It adds username/password
|
| 20 |
accounts, secure recovery, an isolated one-click demo, and the embedded teaching
|
| 21 |
avatar layer used by the Dearmon Analytics Business Calculus platform. Release
|
| 22 |
1.2.0 introduced deterministic post-miss **Break It Apart** attribute graphs.
|
| 23 |
+
Signed-in students can also download their complete personalized Topic Graph as
|
| 24 |
+
a branded PNG, printable PDF, accessible hierarchy-and-concepts CSV, and
|
| 25 |
+
verification manifest; demo sessions remain nonexportable.
|
| 26 |
|
| 27 |
+
The Printable Exam Builder requires an active demo or signed-in learner so
|
| 28 |
+
every generated file has a cleanup owner. It creates a clean Dearmon
|
| 29 |
+
Analytics-branded student PDF and a separate answer-key PDF from selected or
|
| 30 |
+
previously missed topics.
|
| 31 |
+
Both carry the same random form code. Core scored questions and their answer
|
| 32 |
+
keys are deterministic. After the active learner has completed every built-in
|
| 33 |
+
question type for an exact topic, explicit opt-in can create separately labeled,
|
| 34 |
+
independently reviewed AI supplemental items for printing only. They never
|
| 35 |
+
decide correctness or alter mastery, readiness, routing, or simulation scores.
|
| 36 |
|
| 37 |
After every incorrectly graded practice question, and for every missed
|
| 38 |
objective item reviewed after a completed simulation, Break It Apart constructs
|
|
|
|
| 50 |
This private Space uses the separate Turso database
|
| 51 |
`dearmon-sat-act-learning-lab` and schema namespace
|
| 52 |
`sat_act_learning_lab_v1`. Its encrypted application uses the versioned Space
|
| 53 |
+
secret `SAT_ACT_APP_FERNET_V1_3_5_6C38E208CB90_7C200BA80629`.
|
| 54 |
|
| 55 |
Required Space secrets are `OPENAI_API_KEY`, `TURSO_DATABASE_URL`,
|
| 56 |
`TURSO_AUTH_TOKEN`, `LEARNER_ID_HMAC_SECRET`, `INSTRUCTOR_EXPORT_SECRET`, and
|
|
|
|
| 92 |
|
| 93 |
## Upgrade note
|
| 94 |
|
| 95 |
+
Before replacing any earlier release with v1.3.5, every active timed simulation
|
| 96 |
must be finished or explicitly abandoned. Saved forms are bound to the app
|
| 97 |
+
version and encrypted-source fingerprint, so v1.3.5 intentionally rejects older
|
| 98 |
checkpoints. Preserve `LEARNER_ID_HMAC_SECRET` and retain every prior versioned
|
| 99 |
Fernet secret and rollback commit needed through acceptance testing.
|
| 100 |
|
app.py
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|
release_manifest.json
CHANGED
|
@@ -1,18 +1,18 @@
|
|
| 1 |
{
|
| 2 |
-
"built_utc": "2026-08-
|
| 3 |
"database_name": "dearmon-sat-act-learning-lab",
|
| 4 |
-
"encrypted_payload_sha256": "
|
| 5 |
"entry_module": "sat_act_lab.app_main",
|
| 6 |
-
"fernet_secret_name": "
|
| 7 |
-
"key_fingerprint_sha256_prefix": "
|
| 8 |
-
"plaintext_archive_sha256": "
|
| 9 |
-
"release_version": "1.3.
|
| 10 |
"schema_namespace": "sat_act_learning_lab_v1",
|
| 11 |
"schema_version": "dearmon-sat-act-release-v1",
|
| 12 |
"source_members": {
|
| 13 |
"sat_act_lab/__init__.py": {
|
| 14 |
"bytes": 71,
|
| 15 |
-
"sha256": "
|
| 16 |
},
|
| 17 |
"sat_act_lab/act_english_bank.py": {
|
| 18 |
"bytes": 79622,
|
|
@@ -26,9 +26,13 @@
|
|
| 26 |
"bytes": 43952,
|
| 27 |
"sha256": "5959db1e6a007f9384978c2a65af82e9bfd81216db939a1d852a91852badef8e"
|
| 28 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
| 29 |
"sat_act_lab/app_main.py": {
|
| 30 |
-
"bytes":
|
| 31 |
-
"sha256": "
|
| 32 |
},
|
| 33 |
"sat_act_lab/attribute_graph.py": {
|
| 34 |
"bytes": 131004,
|
|
@@ -58,14 +62,30 @@
|
|
| 58 |
"bytes": 100384,
|
| 59 |
"sha256": "2abb720cd5a0a5a459cbcdc7ec1a8919ea50d7203cc809adccdefed4317e3a7f"
|
| 60 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 61 |
"sat_act_lab/learning_concepts.py": {
|
| 62 |
"bytes": 51335,
|
| 63 |
"sha256": "202212791dc80fcc20b2dcc5d662c98e43f53db1e39b2b9992c8289183263346"
|
| 64 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
| 65 |
"sat_act_lab/question_engine.py": {
|
| 66 |
"bytes": 221287,
|
| 67 |
"sha256": "929d8e424bbb845e69cab76f6e591f9bfb1f825c00733cd90efce089ea1a89a2"
|
| 68 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
| 69 |
"sat_act_lab/tracking.py": {
|
| 70 |
"bytes": 139074,
|
| 71 |
"sha256": "c814032247eac63b59d7c619aa172af6340840bc2d1cd5e2b9e5294862231d82"
|
|
@@ -77,20 +97,20 @@
|
|
| 77 |
"sha256": "3b1fdd8eb2e17dc4edae8387f1bc9a18a8072a8d6fae3a71041f00f0b9b04103"
|
| 78 |
},
|
| 79 |
"DEPLOYMENT_NOTES.md": {
|
| 80 |
-
"bytes":
|
| 81 |
-
"sha256": "
|
| 82 |
},
|
| 83 |
"README.md": {
|
| 84 |
-
"bytes":
|
| 85 |
-
"sha256": "
|
| 86 |
},
|
| 87 |
"app.py": {
|
| 88 |
-
"bytes":
|
| 89 |
-
"sha256": "
|
| 90 |
},
|
| 91 |
"requirements.txt": {
|
| 92 |
-
"bytes":
|
| 93 |
-
"sha256": "
|
| 94 |
},
|
| 95 |
"runtime.txt": {
|
| 96 |
"bytes": 13,
|
|
|
|
| 1 |
{
|
| 2 |
+
"built_utc": "2026-08-30T00:47:26+00:00",
|
| 3 |
"database_name": "dearmon-sat-act-learning-lab",
|
| 4 |
+
"encrypted_payload_sha256": "59927fc17c5ad940f89bf68e270172797eba7c1d6338cfa25b109f12b6d18689",
|
| 5 |
"entry_module": "sat_act_lab.app_main",
|
| 6 |
+
"fernet_secret_name": "SAT_ACT_APP_FERNET_V1_3_5_6C38E208CB90_7C200BA80629",
|
| 7 |
+
"key_fingerprint_sha256_prefix": "7C200BA80629",
|
| 8 |
+
"plaintext_archive_sha256": "6c38e208cb90270b2afe08fdda1db1636cc414b4777f77b24c833d6539763d9a",
|
| 9 |
+
"release_version": "1.3.5",
|
| 10 |
"schema_namespace": "sat_act_learning_lab_v1",
|
| 11 |
"schema_version": "dearmon-sat-act-release-v1",
|
| 12 |
"source_members": {
|
| 13 |
"sat_act_lab/__init__.py": {
|
| 14 |
"bytes": 71,
|
| 15 |
+
"sha256": "426d046e94f484f4a732cd52bb4cd8434236ab98e52d9a91bd456cae3d3635de"
|
| 16 |
},
|
| 17 |
"sat_act_lab/act_english_bank.py": {
|
| 18 |
"bytes": 79622,
|
|
|
|
| 26 |
"bytes": 43952,
|
| 27 |
"sha256": "5959db1e6a007f9384978c2a65af82e9bfd81216db939a1d852a91852badef8e"
|
| 28 |
},
|
| 29 |
+
"sat_act_lab/ai_question_overflow.py": {
|
| 30 |
+
"bytes": 30007,
|
| 31 |
+
"sha256": "9f557aea11cc2796e011031c70776dfd9cf3f4c0f8255fcbff9ded341580a4e4"
|
| 32 |
+
},
|
| 33 |
"sat_act_lab/app_main.py": {
|
| 34 |
+
"bytes": 305777,
|
| 35 |
+
"sha256": "3024712d00f7b461229b3088d327fc029a3f7571bd1973c684b0f71b1913c61c"
|
| 36 |
},
|
| 37 |
"sat_act_lab/attribute_graph.py": {
|
| 38 |
"bytes": 131004,
|
|
|
|
| 62 |
"bytes": 100384,
|
| 63 |
"sha256": "2abb720cd5a0a5a459cbcdc7ec1a8919ea50d7203cc809adccdefed4317e3a7f"
|
| 64 |
},
|
| 65 |
+
"sat_act_lab/exam_pdf_export.py": {
|
| 66 |
+
"bytes": 47043,
|
| 67 |
+
"sha256": "876991e8fb86d85606854b0a2d2609203b77537b9a91e2183edfdee0aead7a16"
|
| 68 |
+
},
|
| 69 |
+
"sat_act_lab/learner_exam_topics.py": {
|
| 70 |
+
"bytes": 11795,
|
| 71 |
+
"sha256": "bc32af89d411d8ff8918d74e026421707004adbf0e64e61d49706e3062526167"
|
| 72 |
+
},
|
| 73 |
"sat_act_lab/learning_concepts.py": {
|
| 74 |
"bytes": 51335,
|
| 75 |
"sha256": "202212791dc80fcc20b2dcc5d662c98e43f53db1e39b2b9992c8289183263346"
|
| 76 |
},
|
| 77 |
+
"sat_act_lab/practice_exam_planner.py": {
|
| 78 |
+
"bytes": 6731,
|
| 79 |
+
"sha256": "96dda3ddb76bc2d837769865fdbe177ad650bfd21cd158d161e5cb13123fa6a9"
|
| 80 |
+
},
|
| 81 |
"sat_act_lab/question_engine.py": {
|
| 82 |
"bytes": 221287,
|
| 83 |
"sha256": "929d8e424bbb845e69cab76f6e591f9bfb1f825c00733cd90efce089ea1a89a2"
|
| 84 |
},
|
| 85 |
+
"sat_act_lab/topic_graph_report.py": {
|
| 86 |
+
"bytes": 19837,
|
| 87 |
+
"sha256": "0a6bb8a950a1f600e2d365bbbc7e9afba48c23be30d5440aa0fb94a2ed4ecbea"
|
| 88 |
+
},
|
| 89 |
"sat_act_lab/tracking.py": {
|
| 90 |
"bytes": 139074,
|
| 91 |
"sha256": "c814032247eac63b59d7c619aa172af6340840bc2d1cd5e2b9e5294862231d82"
|
|
|
|
| 97 |
"sha256": "3b1fdd8eb2e17dc4edae8387f1bc9a18a8072a8d6fae3a71041f00f0b9b04103"
|
| 98 |
},
|
| 99 |
"DEPLOYMENT_NOTES.md": {
|
| 100 |
+
"bytes": 6367,
|
| 101 |
+
"sha256": "67ef67799bb031e0a80c11afac6294dd59b97089b4e557a9d358217d60cc0c78"
|
| 102 |
},
|
| 103 |
"README.md": {
|
| 104 |
+
"bytes": 5754,
|
| 105 |
+
"sha256": "74cf786233b9bf01c141e2477e62ad4a501eff30e695f5bd0706dc7775758649"
|
| 106 |
},
|
| 107 |
"app.py": {
|
| 108 |
+
"bytes": 669889,
|
| 109 |
+
"sha256": "1af30556d5b23a7ab747a49b76486bcba933f621e8a4a583dd2fb7ef13bbf6aa"
|
| 110 |
},
|
| 111 |
"requirements.txt": {
|
| 112 |
+
"bytes": 301,
|
| 113 |
+
"sha256": "82e9c9f08bbba04825943a5442185d82389605a6822b9740f555c6fe3aef5f3b"
|
| 114 |
},
|
| 115 |
"runtime.txt": {
|
| 116 |
"bytes": 13,
|
requirements.txt
CHANGED
|
@@ -6,13 +6,13 @@ starlette==1.6.0
|
|
| 6 |
jinja2==3.1.6
|
| 7 |
uvicorn==0.41.0
|
| 8 |
numpy==2.5.2
|
| 9 |
-
pandas==3.
|
| 10 |
matplotlib==3.10.8
|
| 11 |
sympy==1.14.0
|
| 12 |
requests==2.34.2
|
| 13 |
pillow==12.1.1
|
| 14 |
python-docx==1.2.0
|
|
|
|
| 15 |
libsql==0.1.11
|
| 16 |
openai==2.54.0
|
| 17 |
cryptography==46.0.7
|
| 18 |
-
|
|
|
|
| 6 |
jinja2==3.1.6
|
| 7 |
uvicorn==0.41.0
|
| 8 |
numpy==2.5.2
|
| 9 |
+
pandas==2.3.3
|
| 10 |
matplotlib==3.10.8
|
| 11 |
sympy==1.14.0
|
| 12 |
requests==2.34.2
|
| 13 |
pillow==12.1.1
|
| 14 |
python-docx==1.2.0
|
| 15 |
+
socksio==1.0.0
|
| 16 |
libsql==0.1.11
|
| 17 |
openai==2.54.0
|
| 18 |
cryptography==46.0.7
|
|
|