ishaq101 commited on
Commit
478dec6
·
0 Parent(s):

clean init

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .env.example +67 -0
  2. .gitattributes +35 -0
  3. .gitignore +7 -0
  4. .python-version +1 -0
  5. Dockerfile +35 -0
  6. README.md +163 -0
  7. allfiles.txt +945 -0
  8. config/__init__.py +0 -0
  9. config/config.yaml +18 -0
  10. config/constant.py +38 -0
  11. config/env_constant.py +5 -0
  12. config/get_config.py +19 -0
  13. externals/__init__.py +0 -0
  14. externals/databases/__init__.py +0 -0
  15. externals/databases/_pg_tables.py +104 -0
  16. externals/databases/_pgdb.py +56 -0
  17. externals/databases/database.py +57 -0
  18. externals/databases/pg_crud.py +473 -0
  19. externals/databases/pg_models.py +169 -0
  20. externals/databases/pg_schema_down.py +33 -0
  21. externals/databases/pg_schema_up.py +32 -0
  22. externals/databases/schemas/__init__.py +0 -0
  23. externals/databases/schemas/auth.py +10 -0
  24. externals/databases/schemas/knowledge.py +7 -0
  25. externals/databases/schemas/tenant.py +29 -0
  26. externals/databases/schemas/user.py +30 -0
  27. externals/observability/__init__.py +0 -0
  28. externals/observability/langfuse.py +16 -0
  29. externals/storages/azure_blob.py +183 -0
  30. externals/storages/azure_generate_sas.py +52 -0
  31. interfaces/__init__.py +0 -0
  32. interfaces/api/agentic.py +247 -0
  33. interfaces/api/deps.py +40 -0
  34. interfaces/api/file.py +107 -0
  35. interfaces/api/profile.py +62 -0
  36. interfaces/api/tenant.py +57 -0
  37. interfaces/api/user.py +104 -0
  38. interfaces/auth/auth.py +0 -0
  39. interfaces/handlers/agentic_handlers.py +0 -0
  40. interfaces/handlers/handlers.py +2 -0
  41. interfaces/handlers/knowledge_handlers.py +0 -0
  42. interfaces/middlewares/cors.py +8 -0
  43. main.py +39 -0
  44. models/security.py +10 -0
  45. playground/playground.py +7 -0
  46. pyproject.toml +31 -0
  47. requirements.txt +356 -0
  48. run.sh +5 -0
  49. services/agentic/agentic_setup.py +70 -0
  50. services/agentic/filter.py +48 -0
.env.example ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ## -------------------- DATABASE CONFIGURATION -------------------- ##
2
+
3
+ # Local, Postgresql
4
+ causalogy--pg--name = ""
5
+ causalogy--pg--user = ""
6
+ causalogy--pg--password = ""
7
+ causalogy--pg--host = ""
8
+ causalogy--pg--port = ""
9
+
10
+ # Local Postgresql
11
+ ss--postgresql--url = ""
12
+
13
+
14
+ ## -------------------- OBSERVABILITY -------------------- ##
15
+
16
+ # Langfuse (dev)
17
+ ss--langfuse--secret-key = ""
18
+ ss--langfuse--public-key = ""
19
+ langfuse--host = ""
20
+
21
+
22
+ ## -------------------- LLM CONFIGURATION -------------------- ##
23
+
24
+ # GEMINI MODEL
25
+ GOOGLE_API_KEY= ""
26
+
27
+ # GPT-4O-MINI
28
+ azureai--api-key--4omini = ""
29
+ azureai--endpoint--url--4omini = ""
30
+ azureai--deployment--name--4omini = ""
31
+ azureai--api--version--4omini = ""
32
+
33
+ # GPT-5-MINI
34
+ azureai--api-key--5mini = ""
35
+ azureai--endpoint--url--5mini = ""
36
+ azureai--deployment--name--5mini = ""
37
+ azureai--api--version--5mini = ""
38
+
39
+ # GPT-4O-2
40
+ azureai--api-key--4o-2 = ""
41
+ azureai--endpoint--url--4o-2 = ""
42
+ azureai--deployment--name--4o-2 = ""
43
+ azureai--api--version--4o-2 = ""
44
+
45
+ # Qdrant
46
+ ss--qdrant--api-key = ""
47
+ ss--qdrant--endpoint--url = ""
48
+ ss--qdrant--collection--name = ""
49
+
50
+ # Embedding Model
51
+ azureai--embedmodel--endpoint = ""
52
+ azureai--embedmodel--api-key = ""
53
+ azureai--embedmodel--api--version = ""
54
+ azureai--embedmodel--name = ""
55
+
56
+ # AZURE BLOB
57
+ azureai--search--sas = ""
58
+ azureai--container--endpoint = ""
59
+ azureai--container--name = ""
60
+ azureai--container--account--name = ""
61
+ azureai--max-file-size-mb = 5
62
+
63
+
64
+ # JWT
65
+ ss--jwt--secret-key = ""
66
+ ss--jwt--algorithm = ""
67
+ ss--jwt--access-token-expire-minutes = 60
.gitattributes ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
.gitignore ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ .venv/
2
+ .env
3
+ __pycache__/
4
+ */__pycache__/
5
+ example/
6
+ software/
7
+ *.xlsx
.python-version ADDED
@@ -0,0 +1 @@
 
 
1
+ 3.13
Dockerfile ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM python:3.13-slim-bookworm
2
+
3
+ # Install uv
4
+ COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
5
+
6
+ WORKDIR /app
7
+
8
+ # Environment
9
+ ENV PYTHONUNBUFFERED=1 \
10
+ UV_COMPILE_BYTECODE=1 \
11
+ UV_SYSTEM_PYTHON=1
12
+
13
+ # System deps (IMPORTANT for bcrypt, cryptography, asyncpg)
14
+ RUN apt-get update && apt-get install -y --no-install-recommends \
15
+ build-essential \
16
+ libpq-dev \
17
+ gcc \
18
+ && rm -rf /var/lib/apt/lists/*
19
+
20
+ # Create non-root user
21
+ RUN addgroup --system app && adduser --system --group app
22
+
23
+ # Dependency layer
24
+ COPY pyproject.toml uv.lock ./
25
+ RUN uv sync --frozen
26
+
27
+ # App code
28
+ COPY . .
29
+
30
+ RUN chown -R app:app /app
31
+ USER app
32
+
33
+ EXPOSE 8111
34
+
35
+ CMD ["uv", "run", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8111"]
README.md ADDED
@@ -0,0 +1,163 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ## Schemas
2
+ ```plain
3
+ 1. Build Schema
4
+ a. table: cv_users ✅
5
+ - user_id
6
+ - username
7
+ - hashed_password
8
+ - email
9
+ - full_name
10
+ - role
11
+ - is_active
12
+ - tenant_id
13
+ - created_at
14
+ - date_modified
15
+ - notes
16
+ b. table: cv_tenant ✅
17
+ - tenant_id
18
+ - tenant_name
19
+ - created_at
20
+ - date_modified
21
+ - notes
22
+ c. table: cv_file ✅
23
+ - file_id
24
+ - file_type
25
+ - filename
26
+ - url
27
+ - is_extracted
28
+ - uploaded_at
29
+ - date_modified
30
+ d. table: cv_profile ✅
31
+ - profile_id
32
+ - fullname
33
+ - gpa_edu_1
34
+ - univ_edu_1
35
+ - major_edu_1
36
+ - gpa_edu_2
37
+ - univ_edu_2
38
+ - major_edu_2
39
+ - gpa_edu_3
40
+ - univ_edu_3
41
+ - major_edu_3
42
+ - domicile
43
+ - yoe
44
+ - hardskills
45
+ - softskills
46
+ - certifications
47
+ - business_domain
48
+ - filename
49
+ - file_id
50
+ - created_at
51
+ e. table: cv_filter
52
+ - criteria_id
53
+ - gpa_edu_1
54
+ - gpa_edu_2
55
+ - gpa_edu_3
56
+ - univ_edu_1
57
+ - univ_edu_2
58
+ - univ_edu_3
59
+ - major_edu_1
60
+ - major_edu_2
61
+ - major_edu_3
62
+ - domicile
63
+ - yoe
64
+ - hardskills
65
+ - softskills
66
+ - certifications
67
+ - business_domain
68
+ - created_at
69
+ f. table: cv_weight ✅
70
+ - weight_id
71
+ - gpa_edu_1
72
+ - gpa_edu_2
73
+ - gpa_edu_3
74
+ - univ_edu_1
75
+ - univ_edu_2
76
+ - univ_edu_3
77
+ - major_edu_1
78
+ - major_edu_2
79
+ - major_edu_3
80
+ - domicile
81
+ - yoe
82
+ - hardskills
83
+ - softskills
84
+ - certifications
85
+ - business_domain
86
+ - created_at
87
+ g. table: cv_matching ✅
88
+ - matching_id
89
+ - profile_id
90
+ - criteria_id
91
+ - gpa_edu_1
92
+ - gpa_edu_2
93
+ - gpa_edu_3
94
+ - univ_edu_1
95
+ - univ_edu_2
96
+ - univ_edu_3
97
+ - major_edu_1
98
+ - major_edu_2
99
+ - major_edu_3
100
+ - domicile
101
+ - yoe
102
+ - hardskills
103
+ - softskills
104
+ - certifications
105
+ - business_domain
106
+ - created_at
107
+ g. table: profile_scores ✅
108
+ - score_id
109
+ - matching_id
110
+ - score
111
+ - created_at
112
+ ```
113
+
114
+
115
+ ## List API
116
+ ### User
117
+ ```plain
118
+ 1. create user ✅
119
+ 2. get user by username ✅
120
+ 3. login #TODO
121
+ ```
122
+ ### Tenant
123
+ ```plain
124
+ 1. create tenant ✅
125
+ 2. get tenant by tenant_name ✅
126
+ ```
127
+
128
+ ## Create User Example
129
+ Input:
130
+ {
131
+ "username": "harryyanto.ia@bukittechnology.com",
132
+ "password": "Test12345$!",
133
+ "email": "harryyanto.ia@bukittechnology.com",
134
+ "full_name": "Harryyanto Ishaq Agasi",
135
+ "role": "Admin",
136
+ "tenant_id": "03ce53dd-9fc8-43e0-b047-c927602304a9",
137
+ "notes": "admin"
138
+ }
139
+
140
+ Output:
141
+ {
142
+ "user_id": "eb3de1ed-2e3f-4c95-b29b-b31f85f01730",
143
+ "username": "harryyanto.ia@bukittechnology.com",
144
+ "email": "harryyanto.ia@bukittechnology.com",
145
+ "full_name": "Harryyanto Ishaq Agasi",
146
+ "role": "Admin",
147
+ "is_active": true,
148
+ "tenant_id": "03ce53dd-9fc8-43e0-b047-c927602304a9",
149
+ "created_at": "2026-02-19T15:42:05.726988Z"
150
+ }
151
+
152
+
153
+
154
+ ## How To
155
+ 1. Init schema on DB
156
+ `uv run python -m externals.databases.pg_schema_up`
157
+
158
+ 2. Drop schema on DB
159
+ `uv run python -m externals.databases.pg_schema_down`
160
+
161
+
162
+ Compile pyproject.toml to requirements.txt
163
+ `uv pip compile pyproject.toml -o requirements.txt`
allfiles.txt ADDED
@@ -0,0 +1,945 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 0b13ebed794644b6a34ceeda60f416bfe32458dd
2
+ 2b6e87a1ac862ea3f70e6ccb60796c7bf4d175bb
3
+ 2fba27e30bb1f7eb5a2412f66751f4ea7015418b
4
+ 3e6af0dd88dca2150fe0c5bf4d1c568c9c50e68f
5
+ 43ff6b9dacc7f01238b1ae3ddfdec8061645622e
6
+ 484a5afebccc4d1d8dc0b945505943c59b787280
7
+ bfd625a4be135ad83eda97391d04eac1bf43ce2f
8
+ ce496bf803b49662a59783a281e477a147863614
9
+ d605a31fef53ae925289707c925a3c47bcae7938
10
+ ef6b5c4b4be954fe22fadd7f1c4612a42ef27572
11
+ 38c0e9574d2f03d64c8d3aba3f11682be2e96edc
12
+ 51b93bf595ae9d3e96bc974c61f5f0231db28b65
13
+ 870a26407445889ebab964776f2860e28353bb72
14
+ 96605499f87c6f9440d3428fa9006b03e0ba2b0f
15
+ 9a1f1da613f4f24eb3f51c59b9c96856c5239b0e
16
+ 9c985a2ae79975f0390db9f7339d0b878578ca0e
17
+ b90d7f072ee2870f1ffa89b3bdfd643f4538e67e
18
+ ce22fcc2a739826b5ebda00d72b6b42900d66ccc
19
+ dab9f4b784f01767f238842ad7b0fd8430191ca9
20
+ fadedf7e9d57688d58354ca6c7fee3a67fa5ad0e
21
+ 8eb523c29743d7cedc146534ddab163236a45a13 .env.example
22
+ a6344aac8c09253b3b630fb776ae94478aa0275b .gitattributes
23
+ 049f74a19fda63e951a83a68e6e18e255b3a0d9c .gitignore
24
+ d77e4f61bcaacc5e1a2d07b3516e70acc2c596b9 .gitignore
25
+ 24ee5b1be9961e38a503c8e764b7385dbb6ba124 .python-version
26
+ 0f75af977ead0f3a52ef2a2110a8d5844790389b app.py
27
+ 67c39967e785d7c9c512151546ff6f3a7d704ab8 app.py
28
+ b0a5db4b8a41d9163366f9a4c35607e92ef22702 app.py
29
+ cd239d67357a8fbdf62c4e881dfc1b9e96f6a0a7 app.py
30
+ dd6d4a056271f924b6531e49c795b487b1f6bc3c app.py
31
+ 31d368b92d4c6ac076edeeb0ebea816e67112c4d config
32
+ e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 config/__init__.py
33
+ 901cd6b713ff67c60b4b70319d7bd7289c4b0067 config/config.yaml
34
+ 5b6ae76d696bf5ff0788f6e349e2e84d32594fec config/constant.py
35
+ 664a24f2f3d8082d96efba45f5c5dbfb87bf5bb4 config/env_constant.py
36
+ afada3a9707e9d4f5907bb1b571b7bb79a65c726 config/get_config.py
37
+ 2586f65513a70f3a108881d2a3a1fd2bc8b66421 Dockerfile
38
+ e8bfe895ac2fb8738ca19d76676ee2d64ecdaaef Dockerfile
39
+ 859ef4ea893bc64421676a3c5288a200293b61bd externals
40
+ c8a4a6d629445af12265f315e09e194ed125d3a9 externals/databases
41
+ ab4ee64dc2565b991d1fadcf725f71423e943616 externals/databases/_pg_tables.py
42
+ f2be3781ec9f136dabeda11d9458b7bd21f1791e externals/databases/_pgdb.py
43
+ 8b54d8c1a80ccb5d1779c976aca9adf275bac32f externals/databases/database.py
44
+ 9b32ea520069e6f3ff230174b2317d932edacb85 externals/databases/pg_crud.py
45
+ 12b4af534976a7917b00ddfd6748cc7f63071d5b externals/databases/pg_models.py
46
+ d285f45a1e6fb88fba58df9477c6eef747c22010 externals/databases/pg_schema_down.py
47
+ 7b3c7007cbde7d3aa71b46a3575ed2c75b7a7ee9 externals/databases/pg_schema_up.py
48
+ 81067b349555c55fa34ec619e6094e447779dd6d externals/databases/schemas
49
+ 69638f1f43ae2ddafc2116c7d773d35635f0e0d3 externals/databases/schemas/auth.py
50
+ 77bac82d9d894290e2c518d0a9885280764b7349 externals/databases/schemas/knowledge.py
51
+ b5af23822d0a585ee7a6816580c8e2655f034235 externals/databases/schemas/tenant.py
52
+ ce994ebee65727d23353fd089ce1b77290659426 externals/databases/schemas/user.py
53
+ fe182aaf7fd60a82a6bfff5627e5b8888e4dabde externals/observability
54
+ f31c9224ccc815650c82d0156fd5281e696e84ce externals/observability/langfuse.py
55
+ 37d7cc77360973beab613611549528390feedbd9 externals/storages
56
+ adb47084bcd9671340616eba5e10e38fb7c486a3 externals/storages/azure_blob.py
57
+ 80d1aac571d98ab1b30ecc94bbdbccc5fb64a2a3 externals/storages/azure_generate_sas.py
58
+ 8d37c37033d8ba9b2c7e642f8dcfd24f24e93268 interfaces
59
+ 7d1a2f2a51f390458756e141a55d096bbc88f794 interfaces/api
60
+ d09a582dff8fd3b4439fda2c8c34e1acb02a29cb interfaces/api/agentic.py
61
+ 4f78886f89a0c498b474369d7f9f1031e54f8801 interfaces/api/deps.py
62
+ 4a8b4e2880bab2c3f9f36f3029721fad407a5d2d interfaces/api/file.py
63
+ e9ab3776b92be129f501c053e30e3223d36f9f2c interfaces/api/profile.py
64
+ 7286a971935996ac887ff81a943e86c5f7906940 interfaces/api/tenant.py
65
+ 0e83901366694cef25209bc989e91a7e6b4ecc66 interfaces/api/user.py
66
+ a72868dc2c8d3313c20c8e9e7c2f793cb23879a8 interfaces/auth
67
+ e566718a131034710b018a038d693eda842dbff1 interfaces/handlers
68
+ 139597f9cb07c5d48bed18984ec4747f4b4f3438 interfaces/handlers/handlers.py
69
+ 72c36a1fd2c34cffd1a0b7a0397772022371213c interfaces/middlewares
70
+ cf5ce287fbe0552ad50c8c1f664f50624ddc1c09 interfaces/middlewares/cors.py
71
+ 405e3917b44482cd60dac565ec81c3b510de1616 main.py
72
+ a61416c52c2805ff02bfd19bb80f81e554496841 models
73
+ e913418d0cc0d7f9cc79152274e573a83a597ce3 models/security.py
74
+ 660ee5ef1f122742d7b943164a700c0353c82fbb playground
75
+ 24073a266b90be2d80d1b08f5eeb08dfa9462101 playground/playground.py
76
+ bdc91f11d02935c0a1fc74fc05be86dee28e0a55 pyproject.toml
77
+ 1cfcee33a0fe57e36675d4233971eea4ad96fe0c README.md
78
+ 66d34b0167f59dead73b18c15f42c3b002fb4f97 README.md
79
+ bb6a859a13317f2890b74c654273ac22049675b0 README.md
80
+ c96b19ae32ad7d6d2ad1e5e256a5f5ab94cc550c README.md
81
+ 8e0578a0c2cb636e21d871d5ae4fdbb81887bee2 requirements.txt
82
+ c1eedc48871c549d796e7502fdaa1c04afcdd0e2 requirements.txt
83
+ f3d8b58be3e154106fc348596e7f8329a5be7a7b requirements.txt
84
+ ec75fb8e749e5761ba66f6420ba8f14adeb57da4 run.sh
85
+ 84561ef37696a594debcd5a82033c6f9360f15e4 services
86
+ b01f66d80226b76b7a9e349753bd161db56d5891 services
87
+ f8c4f72d8e1276052eee2cc62f5601168c5f39f7 services/agentic
88
+ c2247deaa58d326f0357f2ee41ba337d8f227436 services/agentic/agentic_setup.py
89
+ 3994811108414242ec6a132859447fc97a483fe7 services/agentic/filter.py
90
+ 9d4c0c3a64c1b1a854dc2d61e5210e3e3ed4745c services/agentic/profile_scoring.py
91
+ 62bd27fd4ec11c3abf76c51d0819704d1ae2eeb3 services/agentic/weight.py
92
+ 1033bd0433f781c259c1f049a67c1e002f31009d services/agents
93
+ f0ee98a09e1c686fe93fe9d733b28de4dcea0a1b services/agents/__init__.py
94
+ c221ed8406139355b613c9165f8e170e3976b93f services/agents/AutograderAgent.py
95
+ 39910c8af3512d41451083040d7050e2fc065331 services/agents/LearningRoadmapAgent.py
96
+ 8c091645299c0d46b0df85100089a5ec57fc5f9b services/agents/LLMAgent.py
97
+ bef791298b086cd223eeca3abeb41643a84cb200 services/agents/ProfileMatchingAgent.py
98
+ 6ae899ea18dda0183be5d4a5dadab8dc4cdf4477 services/base
99
+ 95de5a43c24b112839d4f61f9cd303cbc97a2eb8 services/base/BaseGenerator.py
100
+ 6615b6f93978c90867e5aea1037c5030213ce277 services/embed_model
101
+ ac1e1ada3de223cd46a9fe8154f8a718ceb12f8a services/embed_model/embed_model.py
102
+ b1182e7df744f0cd1a9c49fd068a54131809295b services/extractor
103
+ 5c4945e32274cab45a08564eb474104d49a45a74 services/extractor/pdf.py
104
+ 23c94e12d6e133fecec8f9b66e1f33152929f765 services/knowledge
105
+ fa139f0679d8159260db84f51df884cd1cefc075 services/knowledge/delete_file.py
106
+ fa6186940d0cf15e3e00d84ae1a7a9ae09ad0adc services/knowledge/extract_profile.py
107
+ c65ba06a2f718061c09dc9152758d1548d7f200e services/knowledge/get_profile.py
108
+ 898ad2aad187bb789cae0c2dd9fafa20e4a207c1 services/knowledge/knowledge_setup.py
109
+ 9732ee836c9f6da50766bff0099a98b0a6f8dea1 services/knowledge/upload_file.py
110
+ 1af56c096e9dc3db49b93376b65299a039fc4949 services/knowledge_base
111
+ bc2899960440ddebc395363497df93ade123362a services/knowledge_base/CV_urls.xlsx
112
+ f77bc420e968354e5b1d11f14783e299a482e506 services/knowledge_base/PipelineKBIngestion.py
113
+ bb596798cae105dac250161ca645ad26e90aadc8 services/llms
114
+ 45cd6281697eb88ea87bb02bfc1ad600e04b51bb services/llms/__init__.py
115
+ 27bebd8de9c33a1022466e247a147ae4dfbc7bbc services/llms/LLM.py
116
+ b9cb9b8496a7b76ee86d6a66b486c9aff082198f services/models
117
+ 182927603fb11f22a8db0a12b1a34985cc7a6915 services/models/data_model.py
118
+ 8c5ea878a828e39aa0ab36cf6f5ed3a78067c38a services/pipelines
119
+ 20c33c70d690f1bc9ff1fbcc59410719191de51f services/pipelines/PipelineKBIngestion.py
120
+ 716b88ac23286401ade002c66dbe14dddac346cd services/pipelines/PipelineKBProfileExtraction.py
121
+ bd7d9be15e69c0726e63126b39fdf9df976ad1e0 services/pipelines/PipelineKBProfileNorm.py
122
+ 270ab16d04f31a81d56061af1cd901963a03cc82 services/prompts
123
+ 9ce7dee8ac17e27ef19128b925796acc60489008 services/prompts/AutograderPrompt.md
124
+ 5c874db37fc457912917431994d465a468ee5e95 services/prompts/LearningRoadmapPrompt.md
125
+ 7633443bf25c103842fbccb2b9727d6d32f4b331 services/prompts/profile_extraction.py
126
+ 3b8573e80512f705f078cc636a8d4495c414fe43 services/prompts/profile_matching.py
127
+ 278dd98491ae6b88f8e1a9cf103da96d4d13305a services/software
128
+ 278f0b580f55521c0a67173359dca931545943db services/software/poppler-24.08.0
129
+ b115a675f506bd2433d206bd448a298ba025c0da services/software/poppler-24.08.0/Library
130
+ 0ca1c988cffa37470985a559747f64c81feef307 services/software/poppler-24.08.0/Library/bin
131
+ 5c723df8c4b2632d1d507012f86e4b2d266fe27e services/software/poppler-24.08.0/Library/bin/cairo.dll
132
+ ec63daf29ef67960f812ce4b166dbdce9490f275 services/software/poppler-24.08.0/Library/bin/charset.dll
133
+ ac81863783b5d7c7d4ce74ce53921d865a8f11ff services/software/poppler-24.08.0/Library/bin/deflate.dll
134
+ 963a8dbbeb31997df0317ca405a85120966fc442 services/software/poppler-24.08.0/Library/bin/expat.dll
135
+ 8d821d2c836662b346470e0a47b79e3f7ed910a1 services/software/poppler-24.08.0/Library/bin/fontconfig-1.dll
136
+ 10a54260d3045bfa6ee5ea2e282416c65c156c4c services/software/poppler-24.08.0/Library/bin/freetype.dll
137
+ 99dd64c13d1de1f45666a30a3b227de3d805384f services/software/poppler-24.08.0/Library/bin/iconv.dll
138
+ 13af15313b701c317135fdfbfdec91572a8781df services/software/poppler-24.08.0/Library/bin/jpeg8.dll
139
+ 8ce2ff9f262455c4f11ab4d5154e601760e63dc6 services/software/poppler-24.08.0/Library/bin/lcms2.dll
140
+ 564de764efd2bf60075bfc9bc1f5d6326f59036e services/software/poppler-24.08.0/Library/bin/Lerc.dll
141
+ 9b27073df1d5c47ea8689d5cec78e0c53b8a8e0b services/software/poppler-24.08.0/Library/bin/libcrypto-3-x64.dll
142
+ 2622385a31b81377f348d9fab4e8ea9a39df14bb services/software/poppler-24.08.0/Library/bin/libcurl.dll
143
+ b4a03710f450c95cbc80e9197714039bdfc8643b services/software/poppler-24.08.0/Library/bin/liblzma.dll
144
+ 5b5966b9766edde5ec285ae3695e1f6e7b504fe1 services/software/poppler-24.08.0/Library/bin/libpng16.dll
145
+ 6c98b7fad3c25598b6c6e3eccc7cb1fda934cc73 services/software/poppler-24.08.0/Library/bin/libssh2.dll
146
+ e54f84199732a81fcb3e446a657c639e2080908f services/software/poppler-24.08.0/Library/bin/libtiff.dll
147
+ fd7af57a7976aead501efb418f0a92fd19cec7a7 services/software/poppler-24.08.0/Library/bin/libzstd.dll
148
+ 2030ee9824310beb727f7c7c658d0a37c21b9159 services/software/poppler-24.08.0/Library/bin/openjp2.dll
149
+ 9cf25113fd9ada2bdf75caf5bbc6419fa265a9af services/software/poppler-24.08.0/Library/bin/pdfattach.exe
150
+ 64e28c540365fb22dcbc328f1773dba97ea25d83 services/software/poppler-24.08.0/Library/bin/pdfdetach.exe
151
+ ce8098097ce72b234df94f59818c589d9ad5954c services/software/poppler-24.08.0/Library/bin/pdffonts.exe
152
+ 18bd5e75ece9b6880355101cdaac9b21a90bd28c services/software/poppler-24.08.0/Library/bin/pdfimages.exe
153
+ a46425aba2453cf4c83aaca841d8c2136c7de209 services/software/poppler-24.08.0/Library/bin/pdfinfo.exe
154
+ ce5cf711bb919d6d3c991f1d19ccdc6a292dcfa3 services/software/poppler-24.08.0/Library/bin/pdfseparate.exe
155
+ f918644d7ed9afb242af2afce8146c8949519180 services/software/poppler-24.08.0/Library/bin/pdftocairo.exe
156
+ 4eb4a95d56fa7bdb57a6567fc063ea13e188453d services/software/poppler-24.08.0/Library/bin/pdftohtml.exe
157
+ 3078e3b3eaba60b2b7bc8a3206ac36895718aeac services/software/poppler-24.08.0/Library/bin/pdftoppm.exe
158
+ d65bbbf620268997c9a44cbc928e22bf5deb8bc5 services/software/poppler-24.08.0/Library/bin/pdftops.exe
159
+ 403ceef3023d2563bb252055870f68fa34bbd2d0 services/software/poppler-24.08.0/Library/bin/pdftotext.exe
160
+ 5d6e0344d2ed2bf8c543efa3e5daaccac0ccf66e services/software/poppler-24.08.0/Library/bin/pdfunite.exe
161
+ 24f4925dcb5c6b627e9973c061ce10d51c6482bc services/software/poppler-24.08.0/Library/bin/pixman-1-0.dll
162
+ 16eb098a67b5e741a6953355cd052042e94dc4c4 services/software/poppler-24.08.0/Library/bin/poppler.dll
163
+ 266cab62fa6b7562bae80d4cf16c8f6eeaeb3d41 services/software/poppler-24.08.0/Library/bin/poppler-cpp.dll
164
+ 5c68c4337652e0686c59f7792ee9786e2e82ec2f services/software/poppler-24.08.0/Library/bin/poppler-glib.dll
165
+ 48f858a677ab750b58564e5301fb271b4b37d899 services/software/poppler-24.08.0/Library/bin/zlib.dll
166
+ 7a427fbf4f88480a8056050d41ce2968fe0433ba services/software/poppler-24.08.0/Library/bin/zstd.exe
167
+ b7905bdc1e1201f6bda04ff0b483dabc913bee82 services/software/poppler-24.08.0/Library/include
168
+ 07b79aad77e0d6f54244579a785f5b4d501ad0e4 services/software/poppler-24.08.0/Library/include/poppler
169
+ 5d96e7532124a93311d0de827f3f936b36460737 services/software/poppler-24.08.0/Library/include/poppler/Annot.h
170
+ ebe6e9191570d1b97db1d9a35c480eb6fd3df310 services/software/poppler-24.08.0/Library/include/poppler/AnnotStampImageHelper.h
171
+ 50bc9d0aff4a54d2654b57cbd1fbb84b9fa665fb services/software/poppler-24.08.0/Library/include/poppler/Array.h
172
+ e48122fd48edcb2bd5844594be618936884cca12 services/software/poppler-24.08.0/Library/include/poppler/BBoxOutputDev.h
173
+ 854692ea764ce8150edec8c179d30647bdc3c364 services/software/poppler-24.08.0/Library/include/poppler/CachedFile.h
174
+ c97e0ea45d6b3235d89b9c740beb011952fdf7e1 services/software/poppler-24.08.0/Library/include/poppler/CairoFontEngine.h
175
+ 349ec6199b0a9ec376ec19803828a4e1a0d1f500 services/software/poppler-24.08.0/Library/include/poppler/CairoOutputDev.h
176
+ 2766d483bf33ce11375abb30d7e15fa04c2d882c services/software/poppler-24.08.0/Library/include/poppler/CairoRescaleBox.h
177
+ cb76ff8ac3c02ac7e2331cba5bac70f1cc47e6de services/software/poppler-24.08.0/Library/include/poppler/Catalog.h
178
+ d2dbc34f4020acbd8f46916ec229eb506e269dda services/software/poppler-24.08.0/Library/include/poppler/CertificateInfo.h
179
+ dc2fa84c40b8ce23e0ec739ecfb35f98e19864ca services/software/poppler-24.08.0/Library/include/poppler/CharCodeToUnicode.h
180
+ d0df630d0c937cc9af2cf09882cde242a7a8097f services/software/poppler-24.08.0/Library/include/poppler/CharTypes.h
181
+ 9ef876e9ea0d36ded0ce83aa3591735e2dc643a1 services/software/poppler-24.08.0/Library/include/poppler/CMap.h
182
+ 25e5ad0f166abca1edee6ef1b7e380e59d31cebd services/software/poppler-24.08.0/Library/include/poppler/cpp
183
+ 90fec01d31a40e5c675665fd7d9005d5a8b98fdb services/software/poppler-24.08.0/Library/include/poppler/cpp/poppler_cpp_export.h
184
+ 6b0f920c249940ab3a7a22e4812b77fb7f62327f services/software/poppler-24.08.0/Library/include/poppler/cpp/poppler-destination.h
185
+ 97fd9a878558843bf7bd4fdbfea072b879c8ddf7 services/software/poppler-24.08.0/Library/include/poppler/cpp/poppler-document.h
186
+ f39bd745489f70929443776e966732e58d6bab25 services/software/poppler-24.08.0/Library/include/poppler/cpp/poppler-embedded-file.h
187
+ b6bc48c50f2d7590373060cdd828a8ea399702cd services/software/poppler-24.08.0/Library/include/poppler/cpp/poppler-font.h
188
+ ba9c6e0db12e9ce43532794555dc242a1e1b8b7b services/software/poppler-24.08.0/Library/include/poppler/cpp/poppler-font-private.h
189
+ 248a759962a3f02dd9742b0759b9ae0db09bd1d9 services/software/poppler-24.08.0/Library/include/poppler/cpp/poppler-global.h
190
+ 2b98916c1ce3f81f6e1cf2b7e47b484a82a747e9 services/software/poppler-24.08.0/Library/include/poppler/cpp/poppler-image.h
191
+ 6041402c8337e948321a6dc315a823a1dbf5eeef services/software/poppler-24.08.0/Library/include/poppler/cpp/poppler-page.h
192
+ 166e5cdfe581f5bc8f0ddd7536a658420d5c35c6 services/software/poppler-24.08.0/Library/include/poppler/cpp/poppler-page-renderer.h
193
+ 68447508678a4ebd975d45f9158b05238d3852f4 services/software/poppler-24.08.0/Library/include/poppler/cpp/poppler-page-transition.h
194
+ 5657ec9a341d531cde5713044b12881d17688aca services/software/poppler-24.08.0/Library/include/poppler/cpp/poppler-rectangle.h
195
+ 1e528a6e70ed6701a182633e63fb637b26d48131 services/software/poppler-24.08.0/Library/include/poppler/cpp/poppler-toc.h
196
+ 58875ab79300f8538df1a8cf1dfdf6b91c031fc0 services/software/poppler-24.08.0/Library/include/poppler/cpp/poppler-version.h
197
+ 752b7005b493a56a827542106f0b3c5d1969afee services/software/poppler-24.08.0/Library/include/poppler/CurlCachedFile.h
198
+ f1106b3513ef8ef3ec78900ca28a74941de9772c services/software/poppler-24.08.0/Library/include/poppler/CurlPDFDocBuilder.h
199
+ 200536a087c98ce043d1170ae0eaf8ffb5772885 services/software/poppler-24.08.0/Library/include/poppler/DateInfo.h
200
+ 4f0c6d288c154369f59a208001a3bba7d1ce00ed services/software/poppler-24.08.0/Library/include/poppler/Decrypt.h
201
+ 621b76a2096e2c283786d85d2314731c26943e73 services/software/poppler-24.08.0/Library/include/poppler/Dict.h
202
+ b292afcf7419c6988ccf8ec05fd92e6a68ce3cb7 services/software/poppler-24.08.0/Library/include/poppler/Error.h
203
+ 34fd86ab2dca81bec951c371d875315a1a41c1f5 services/software/poppler-24.08.0/Library/include/poppler/ErrorCodes.h
204
+ 42c0ff6b2549222cc124fa0a2a2f704e42bffd3e services/software/poppler-24.08.0/Library/include/poppler/FDPDFDocBuilder.h
205
+ 6662ebcf8bd6e501d5e470905c9ac4ea1d17a0da services/software/poppler-24.08.0/Library/include/poppler/FILECacheLoader.h
206
+ 1650b89e792702bfa6eda152edbea10ebe46546f services/software/poppler-24.08.0/Library/include/poppler/FileSpec.h
207
+ 87d6909e1b64915f4d5974b6b110378bd08fba5c services/software/poppler-24.08.0/Library/include/poppler/fofi
208
+ ca62e948d286fa7d4fa47d18c8aa9c1d14918c11 services/software/poppler-24.08.0/Library/include/poppler/fofi/FoFiBase.h
209
+ 5a154405a448b3e0b947319a901aabac9b1b6798 services/software/poppler-24.08.0/Library/include/poppler/fofi/FoFiEncodings.h
210
+ f37ee3961218473bbec4c0dfd1f4374197eda99d services/software/poppler-24.08.0/Library/include/poppler/fofi/FoFiIdentifier.h
211
+ 4c464b9dae0285b9284b95191a7f90ce98ad697a services/software/poppler-24.08.0/Library/include/poppler/fofi/FoFiTrueType.h
212
+ b3cc91e8b708c1b87581c8446af82d3ff5e5358f services/software/poppler-24.08.0/Library/include/poppler/fofi/FoFiType1.h
213
+ f3a9b731cf7b80b7b3ed0fa2c6ed563410eb0428 services/software/poppler-24.08.0/Library/include/poppler/fofi/FoFiType1C.h
214
+ a417b324e48087cbb6264cbe366a2c6bb1817c69 services/software/poppler-24.08.0/Library/include/poppler/FontEncodingTables.h
215
+ ba37a742a0664dbc47cf1c2b758931a2dc64c4a1 services/software/poppler-24.08.0/Library/include/poppler/FontInfo.h
216
+ 51dae7420288443f09cdce4033301d9f3b0dace4 services/software/poppler-24.08.0/Library/include/poppler/Form.h
217
+ 965280257e6a3dd8af49d02d32b1253c99234548 services/software/poppler-24.08.0/Library/include/poppler/Function.h
218
+ fee97a7228e5b62d2f3e5a486fd04c7d204cd8f9 services/software/poppler-24.08.0/Library/include/poppler/Gfx.h
219
+ c4dde6cb5ba30e38970460aa8602e638152a83c2 services/software/poppler-24.08.0/Library/include/poppler/GfxFont.h
220
+ 9cf1afc193da5cc14fcc2aaf0f074a4a63f1cd17 services/software/poppler-24.08.0/Library/include/poppler/GfxState.h
221
+ 9572f035b3282b80843f44196527e4f36abc5740 services/software/poppler-24.08.0/Library/include/poppler/GfxState_helpers.h
222
+ e68d17fcb2e6fb4671d022d4068fb025df799c70 services/software/poppler-24.08.0/Library/include/poppler/glib
223
+ 70f2172a3e749b131a6ee0d13f4f4b570abf4e51 services/software/poppler-24.08.0/Library/include/poppler/glib/poppler.h
224
+ b4ea01e59d854f441dfb205c80318f6673cea127 services/software/poppler-24.08.0/Library/include/poppler/glib/poppler-action.h
225
+ 509ecdff00821ecdd9bbdfb0430409e864faee3f services/software/poppler-24.08.0/Library/include/poppler/glib/poppler-annot.h
226
+ 664a566e858cce8e6aedc13a862bae526274ba19 services/software/poppler-24.08.0/Library/include/poppler/glib/poppler-attachment.h
227
+ 26b8a3f5cd2d1450c33eac967cb81312ba0e6308 services/software/poppler-24.08.0/Library/include/poppler/glib/poppler-date.h
228
+ a793e08bd4ed316a52dcf054369e3bbdc05eeca6 services/software/poppler-24.08.0/Library/include/poppler/glib/poppler-document.h
229
+ 2fce5ceabefd3305e155897ada066793c766798c services/software/poppler-24.08.0/Library/include/poppler/glib/poppler-enums.h
230
+ 4de3d57d5b81ebe104f21490101e1c8d13fab464 services/software/poppler-24.08.0/Library/include/poppler/glib/poppler-features.h
231
+ 6cdf22405b80b7419d14c8a7fd5d0ba13db5ff91 services/software/poppler-24.08.0/Library/include/poppler/glib/poppler-form-field.h
232
+ 12dfd9a44b630cdb7f06b1688fbe051a0daf25e6 services/software/poppler-24.08.0/Library/include/poppler/glib/poppler-layer.h
233
+ fc491512b8e3b6acf9e9b3ec37f6a4ea9d95c31c services/software/poppler-24.08.0/Library/include/poppler/glib/poppler-macros.h
234
+ 72094b389b7f9fe5a59af51b10a99e3f59fe82ce services/software/poppler-24.08.0/Library/include/poppler/glib/poppler-media.h
235
+ abd69ba9db83a5cb9d976560aec7016274369314 services/software/poppler-24.08.0/Library/include/poppler/glib/poppler-movie.h
236
+ 2d037d8e6efb47d4c10f1066ae9cbe3a33a82559 services/software/poppler-24.08.0/Library/include/poppler/glib/poppler-page.h
237
+ 05cef08e3a4cb76b7aabe96dd635af2927969f86 services/software/poppler-24.08.0/Library/include/poppler/glib/poppler-structure-element.h
238
+ e8f3c53444ec070e27d9c7bdf073013739870535 services/software/poppler-24.08.0/Library/include/poppler/GlobalParams.h
239
+ 8c4d3365259576a9ea82636356ff75d21a40a696 services/software/poppler-24.08.0/Library/include/poppler/goo
240
+ 760687919cda357b1ce98859cae504700543dee7 services/software/poppler-24.08.0/Library/include/poppler/goo/gdir.h
241
+ 516c2fc289061a77cc978cfa2efd82e35a3fda82 services/software/poppler-24.08.0/Library/include/poppler/goo/gfile.h
242
+ 100c9b36db133a1af78a63bf0ee43b78c905b2f6 services/software/poppler-24.08.0/Library/include/poppler/goo/gmem.h
243
+ 0cb743372eb7b4e42d8a9597ffd5f3891b9e2e00 services/software/poppler-24.08.0/Library/include/poppler/goo/GooCheckedOps.h
244
+ 76128a71f958b2a07f887aaa6f19f3d503edbc4b services/software/poppler-24.08.0/Library/include/poppler/goo/GooLikely.h
245
+ ea62b67bb4c40b50894505add8a0d1b4e7ee1766 services/software/poppler-24.08.0/Library/include/poppler/goo/GooString.h
246
+ 00b85618fe929662773d9f583602651a53a1fc34 services/software/poppler-24.08.0/Library/include/poppler/goo/GooTimer.h
247
+ 2d535ee7670ce239db284a0bc2afe46bb676712b services/software/poppler-24.08.0/Library/include/poppler/goo/grandom.h
248
+ fbf1872fb213fa3e56a63c0f6ff1602fbf1d2749 services/software/poppler-24.08.0/Library/include/poppler/goo/gstrtod.h
249
+ 860b310f7899e8145ca099cf6331c0a5dfbaa431 services/software/poppler-24.08.0/Library/include/poppler/goo/ImgWriter.h
250
+ 4b94c51ecab70d4eb523255886f14b6f6a801dda services/software/poppler-24.08.0/Library/include/poppler/goo/JpegWriter.h
251
+ cd0ce4b8a83de769879111dba3b8f8bc8c2421d4 services/software/poppler-24.08.0/Library/include/poppler/goo/PNGWriter.h
252
+ 3691a6e2d5a608c656fcab592a1018628fbba9a2 services/software/poppler-24.08.0/Library/include/poppler/goo/TiffWriter.h
253
+ 5253a76a8dc95d3bdfec3cb43dccf4b4add33d43 services/software/poppler-24.08.0/Library/include/poppler/HashAlgorithm.h
254
+ 5104ca0efc7b3559959f2814fa1505767ff7f815 services/software/poppler-24.08.0/Library/include/poppler/Hints.h
255
+ ae31a99578862991c90a16f2baa74a77b6332f2a services/software/poppler-24.08.0/Library/include/poppler/JArithmeticDecoder.h
256
+ af63a6733776a1d8afb9b6f6434b3e6979ac5f18 services/software/poppler-24.08.0/Library/include/poppler/JBIG2Stream.h
257
+ fbaac8fc3bfd6a2ae3a9f3cd922029fa23af9d31 services/software/poppler-24.08.0/Library/include/poppler/JPEG2000Stream.h
258
+ cfd3a0d4d4f78d98f992b62914e47cb92bb1e2a4 services/software/poppler-24.08.0/Library/include/poppler/JSInfo.h
259
+ a117dbe020ac55bd51e039ccd3983b9994e5fb7f services/software/poppler-24.08.0/Library/include/poppler/Lexer.h
260
+ b5b366bfc34b3d951cf9fc446a13f727fd2ba489 services/software/poppler-24.08.0/Library/include/poppler/Linearization.h
261
+ 6337d79388707b4914bbb610f3cec121c752a3b7 services/software/poppler-24.08.0/Library/include/poppler/Link.h
262
+ 0595d1e620e5a2a3722f6d8dd30024c705372aac services/software/poppler-24.08.0/Library/include/poppler/LocalPDFDocBuilder.h
263
+ b025b158214f9df0541f31a8592a3c6f6987a6e8 services/software/poppler-24.08.0/Library/include/poppler/MarkedContentOutputDev.h
264
+ 0c36510eaa32bd4baa45791f5b8893b4608928ed services/software/poppler-24.08.0/Library/include/poppler/Movie.h
265
+ 53b8972e11ef6e34bca60e447dc22ac313f5f5ec services/software/poppler-24.08.0/Library/include/poppler/NameToCharCode.h
266
+ b4c29c461e188732133f84c835b0671ada1ee087 services/software/poppler-24.08.0/Library/include/poppler/NameToUnicodeTable.h
267
+ e70a97498639f7e5b88415e8100e97ed05e19b80 services/software/poppler-24.08.0/Library/include/poppler/Object.h
268
+ 22b9409ec2909ff2292eef67a4b1cc2972d9485d services/software/poppler-24.08.0/Library/include/poppler/OptionalContent.h
269
+ 877eaac4fd149a878bcb428267bd20a806587a1b services/software/poppler-24.08.0/Library/include/poppler/Outline.h
270
+ 35ab9bc0f1fe01b10c9ad36228f31f5b2245c042 services/software/poppler-24.08.0/Library/include/poppler/OutputDev.h
271
+ 331c8b61de7e7ecd0ae887aa67aad8c9d0f0e6c1 services/software/poppler-24.08.0/Library/include/poppler/Page.h
272
+ b8d51a9e8db22f51be22c3c9eadd61feed04d182 services/software/poppler-24.08.0/Library/include/poppler/PageTransition.h
273
+ b379b67d34ad9b7a6567a45dcc78bf609e892820 services/software/poppler-24.08.0/Library/include/poppler/Parser.h
274
+ 61aae6184f0871195808b19a7f7a56a356ee460a services/software/poppler-24.08.0/Library/include/poppler/PDFDoc.h
275
+ d0bd1ea61c8501788d58ecb8ef7202807d5736fa services/software/poppler-24.08.0/Library/include/poppler/PDFDocBuilder.h
276
+ 278a910d21815d24876e02e1139cf13536ffcfef services/software/poppler-24.08.0/Library/include/poppler/PDFDocEncoding.h
277
+ e84aca46bd14c699843e4f21f53b14c915b61592 services/software/poppler-24.08.0/Library/include/poppler/PDFDocFactory.h
278
+ eef49cf8d3a1777ff878bc08751cc160341715be services/software/poppler-24.08.0/Library/include/poppler/poppler_private_export.h
279
+ 68db15382fe68c03dc91f07561e3f8c89440b078 services/software/poppler-24.08.0/Library/include/poppler/PopplerCache.h
280
+ d52b48e4935fe516e138e9b748170c2cf6e78758 services/software/poppler-24.08.0/Library/include/poppler/poppler-config.h
281
+ 9b3234a42b7f4518e68b5e05a10b3147b14b1693 services/software/poppler-24.08.0/Library/include/poppler/PreScanOutputDev.h
282
+ b13cff7ffe289a9909b69c00e62589c3383498d4 services/software/poppler-24.08.0/Library/include/poppler/ProfileData.h
283
+ 9e64598ff5924a4994ecf0d471631613235b8dc5 services/software/poppler-24.08.0/Library/include/poppler/PSOutputDev.h
284
+ dab684bddbff93a16a5938a05b3de62f418bd8f5 services/software/poppler-24.08.0/Library/include/poppler/PSTokenizer.h
285
+ 9721abf86e8e77fdfe6e926652439ff90036e0b2 services/software/poppler-24.08.0/Library/include/poppler/Rendition.h
286
+ de10f23d3200d348dfa4ee53ae60e76771c9e218 services/software/poppler-24.08.0/Library/include/poppler/SecurityHandler.h
287
+ 8e5ad37f85ed2de5cb01c9137f9e86ff947132a8 services/software/poppler-24.08.0/Library/include/poppler/SignatureInfo.h
288
+ aa080bfd4bd7750f91b3f0169da71047ceaaf852 services/software/poppler-24.08.0/Library/include/poppler/Sound.h
289
+ ef221f6b717b450da5ccc9802708ff6746d956e3 services/software/poppler-24.08.0/Library/include/poppler/splash
290
+ e13be54c625f1e624a2c62fb33af6b3b0cd5935e services/software/poppler-24.08.0/Library/include/poppler/splash/Splash.h
291
+ 2d7cf413525e4ced4f90d222915ee493030f6792 services/software/poppler-24.08.0/Library/include/poppler/splash/SplashBitmap.h
292
+ 0b7dd14943a506eddfd16224b0bca6f266076a16 services/software/poppler-24.08.0/Library/include/poppler/splash/SplashClip.h
293
+ 10efd6db72f5c615fd5540664a35b13ab83945bf services/software/poppler-24.08.0/Library/include/poppler/splash/SplashErrorCodes.h
294
+ 8c54b08f24947749b31e545127410b329dbe66c8 services/software/poppler-24.08.0/Library/include/poppler/splash/SplashFont.h
295
+ 3e5458c09374658a65ce99a0e58dd6e3749ba2d3 services/software/poppler-24.08.0/Library/include/poppler/splash/SplashFontEngine.h
296
+ 7f55fdf01ad21c2376b7dc71d13db65cdd398d27 services/software/poppler-24.08.0/Library/include/poppler/splash/SplashFontFile.h
297
+ c127dd87f1d4a011c3a311518693ec292dea7dd4 services/software/poppler-24.08.0/Library/include/poppler/splash/SplashFontFileID.h
298
+ ae656b9cc523f1c8be8ad99a18f8f8654d1b5579 services/software/poppler-24.08.0/Library/include/poppler/splash/SplashFTFont.h
299
+ 607b2a6ac4e9e2807e3cfbe5b5cf994092e22d82 services/software/poppler-24.08.0/Library/include/poppler/splash/SplashFTFontEngine.h
300
+ 3e52dd85fab69b148d1c7c955b7a8663b2e7dcb3 services/software/poppler-24.08.0/Library/include/poppler/splash/SplashFTFontFile.h
301
+ a091941206f0b62d0a59948c93cca8975e3b6eb4 services/software/poppler-24.08.0/Library/include/poppler/splash/SplashGlyphBitmap.h
302
+ 5c076563327565fb43ab2b11a5b45215ffdb275e services/software/poppler-24.08.0/Library/include/poppler/splash/SplashMath.h
303
+ 815e48a73e802db957d50fd3abc9503a434cea56 services/software/poppler-24.08.0/Library/include/poppler/splash/SplashPath.h
304
+ 2a50aa8249ce2f17ac2efe96175a24c1a2a0ccd4 services/software/poppler-24.08.0/Library/include/poppler/splash/SplashPattern.h
305
+ d912ef02e24564ddab97ec732fa3fe7d4c8942f9 services/software/poppler-24.08.0/Library/include/poppler/splash/SplashScreen.h
306
+ 009c1f14c4eb9ea2d9e74b2ed587aab0f4ff75d8 services/software/poppler-24.08.0/Library/include/poppler/splash/SplashState.h
307
+ 30a98cd0f34195ff026a4c1039e67c5458a7aaae services/software/poppler-24.08.0/Library/include/poppler/splash/SplashTypes.h
308
+ e59649fa0abb11769633eebab056fec8431471dc services/software/poppler-24.08.0/Library/include/poppler/splash/SplashXPath.h
309
+ 476e98c92a3513d0bb8c8c720e67718f494aad93 services/software/poppler-24.08.0/Library/include/poppler/splash/SplashXPathScanner.h
310
+ 88b13b4238fabf53e1351863852c1d85d0fe8398 services/software/poppler-24.08.0/Library/include/poppler/SplashOutputDev.h
311
+ b1b8b492b5c8ccc8b8a001eaa8d9ea42b9feb7a0 services/software/poppler-24.08.0/Library/include/poppler/Stream.h
312
+ 3029ed09edffb7699efd08507d25363397558b4f services/software/poppler-24.08.0/Library/include/poppler/Stream-CCITT.h
313
+ fbc0781fc76f0bcd79252146564c687236ed9481 services/software/poppler-24.08.0/Library/include/poppler/StructElement.h
314
+ 8812a504bdae540dd69e4f82e0cd6f8d1d09d2f5 services/software/poppler-24.08.0/Library/include/poppler/StructTreeRoot.h
315
+ d598142176b5e6df5464165c51bdd52384546147 services/software/poppler-24.08.0/Library/include/poppler/TextOutputDev.h
316
+ 88d119bce559aab97c578da93bd0b282ee4f117e services/software/poppler-24.08.0/Library/include/poppler/UnicodeCClassTables.h
317
+ f74ffcd00b86fbf570897f634ea38baae0a98bc6 services/software/poppler-24.08.0/Library/include/poppler/UnicodeCompTables.h
318
+ 8cb793c0b95c58d3847a289e149a15c7c3fb8828 services/software/poppler-24.08.0/Library/include/poppler/UnicodeDecompTables.h
319
+ 0d80c0254760a518f40f03de8afecc5d52ac9c49 services/software/poppler-24.08.0/Library/include/poppler/UnicodeMap.h
320
+ bace0a62da1e0556a82089bb7cd0e20ec12bb0b1 services/software/poppler-24.08.0/Library/include/poppler/UnicodeMapFuncs.h
321
+ 7c89feb285716d8de73b7d35d357e3e29bec7f18 services/software/poppler-24.08.0/Library/include/poppler/UnicodeMapTables.h
322
+ 85d88d62bc431050269851f43645c7e3dd0d23e5 services/software/poppler-24.08.0/Library/include/poppler/UnicodeTypeTable.h
323
+ bd57188df2bd804751272f580b4123cc12f69f07 services/software/poppler-24.08.0/Library/include/poppler/UTF.h
324
+ 24a814ca2a4cfed1677ea9958367c1330d09456c services/software/poppler-24.08.0/Library/include/poppler/ViewerPreferences.h
325
+ 739b87bb0ab6798e2710e4b02cbfbe70dcb899c9 services/software/poppler-24.08.0/Library/include/poppler/XRef.h
326
+ e577541dda324eaf74fd622e6c7e8f8850287b9e services/software/poppler-24.08.0/Library/lib
327
+ 23c11bca60a554a2a2c2fa64ab5559fd43f5e056 services/software/poppler-24.08.0/Library/lib/pkgconfig
328
+ d2039943f70f89d2dd95b84b6cce5980aafa9d6b services/software/poppler-24.08.0/Library/lib/pkgconfig/poppler.pc
329
+ ad81a431c245429a867a68d6c6f70091abc59e64 services/software/poppler-24.08.0/Library/lib/pkgconfig/poppler-cpp.pc
330
+ 6e21bd230539a7a09ca257fcd1206ad4b8fffc7a services/software/poppler-24.08.0/Library/lib/pkgconfig/poppler-glib.pc
331
+ fc89ac109fde63c5e14256068ad555267b75a7ba services/software/poppler-24.08.0/Library/lib/poppler.lib
332
+ c3af3051970dde6afe4fd42e5e1b972e13801bfa services/software/poppler-24.08.0/Library/lib/poppler-cpp.lib
333
+ fc2de108fcc7508c542e2b5c1d352438a4c0c879 services/software/poppler-24.08.0/Library/lib/poppler-glib.lib
334
+ 6e55d667109010187de08f196378ab9702127c9b services/software/poppler-24.08.0/Library/share
335
+ 4ddce75f708030dd1a0901fe5f8123e33afb5f61 services/software/poppler-24.08.0/Library/share/man
336
+ f7702066f299e1af809744b0ca38c8fd1e97cfe7 services/software/poppler-24.08.0/Library/share/man/man1
337
+ c9589a783eb9b33bf65bc218a8625b846991b4d3 services/software/poppler-24.08.0/Library/share/man/man1/pdfattach.1
338
+ 0b8975dc620cbcb10bfdacc1dd33753f0145a5b8 services/software/poppler-24.08.0/Library/share/man/man1/pdfdetach.1
339
+ 1ec0db2722aa8bad093396c12148f8e4b2ce328e services/software/poppler-24.08.0/Library/share/man/man1/pdffonts.1
340
+ 1a5386a032d9173193ae60e750ca07f5df238e83 services/software/poppler-24.08.0/Library/share/man/man1/pdfimages.1
341
+ 2a17bbd50524eea38fdf68d77dfb0d3ae3231201 services/software/poppler-24.08.0/Library/share/man/man1/pdfinfo.1
342
+ 132511a12c87ad5c071dca31002c5db4bd8f15d2 services/software/poppler-24.08.0/Library/share/man/man1/pdfseparate.1
343
+ 782f81fdaa694e48ce36178c6572bd7eff324da1 services/software/poppler-24.08.0/Library/share/man/man1/pdftocairo.1
344
+ e4e9da5c5b6dccd0ab55e4c78913150d83591311 services/software/poppler-24.08.0/Library/share/man/man1/pdftohtml.1
345
+ ddbe4d70172cf8bb030965612dc8e4c7b2388da9 services/software/poppler-24.08.0/Library/share/man/man1/pdftoppm.1
346
+ 0ab17cbbae5c0a138ad5b63830b248bd4a25b83c services/software/poppler-24.08.0/Library/share/man/man1/pdftops.1
347
+ c34c98a907f8f915e6decf09ca7fd6811f7728c7 services/software/poppler-24.08.0/Library/share/man/man1/pdftotext.1
348
+ 4a1b4ea89bc114bb4b6f0f69d4d47b553389ee71 services/software/poppler-24.08.0/Library/share/man/man1/pdfunite.1
349
+ 5610ba299033167f7a2908aa7f3eee49669ff16b services/software/poppler-24.08.0/share
350
+ f61637285918a71f84572dce0ff0dd2aab3c6d78 services/software/poppler-24.08.0/share/poppler
351
+ 5fd8c09075d21693dcf9c029b345726e9a9e59f8 services/software/poppler-24.08.0/share/poppler/cidToUnicode
352
+ 6969f321f9c598a5163355505a4ca3ee0a670a88 services/software/poppler-24.08.0/share/poppler/cidToUnicode/Adobe-CNS1
353
+ 5fec270461acf17e1ba67a1a0a8b36dedb21d957 services/software/poppler-24.08.0/share/poppler/cidToUnicode/Adobe-GB1
354
+ 0d729403ec3e19ccb23f8efaeeddd7a3f9f074fa services/software/poppler-24.08.0/share/poppler/cidToUnicode/Adobe-Japan1
355
+ b0697040582c22b059193f6b07b12194926cbc35 services/software/poppler-24.08.0/share/poppler/cidToUnicode/Adobe-Korea1
356
+ e1d64b1977e0f3cd086331d74d57451da5bc17c1 services/software/poppler-24.08.0/share/poppler/CMakeLists.txt
357
+ bc37d20bcfa2b49cce76bbbb60a7f07fd2c9ced0 services/software/poppler-24.08.0/share/poppler/cMap
358
+ be4f1991223c7fd1ff159e9faa3f51ad0c230388 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1
359
+ 9a037f85b8df021b333eb0501fe695e2e924ecbd services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/Adobe-CNS1-0
360
+ 24c193aac7aa0bc5aac12ebf2379e1e64e98f66c services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/Adobe-CNS1-1
361
+ 544b73fc79d6db0fad73cfb392e0c4338bf4619c services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/Adobe-CNS1-2
362
+ f380656311673f79f95bf96aab5114e7f2258c39 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/Adobe-CNS1-3
363
+ d9f2f65d14ef703aeca66fcc36c0802f0ca80cb2 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/Adobe-CNS1-4
364
+ 7aa30aabbbfcca044c4c0b671eca3d7b9f3ed616 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/Adobe-CNS1-5
365
+ 7529a97aacacd0c76ab0c3f429f8c794da29b585 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/Adobe-CNS1-6
366
+ 17cec369e448e234a11206c29aff265e7c76d8e4 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/Adobe-CNS1-7
367
+ 4cde2fb486f95ac49670aee849eb67d2b1aed78a services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/Adobe-CNS1-B5pc
368
+ 2ab5ffeb09d89c94e3dfb60428078a528f349523 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/Adobe-CNS1-ETen-B5
369
+ 4332835c658cc195f1264e7e9ed2d811b2df20c6 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/Adobe-CNS1-H-CID
370
+ 2646dcce3a7af04e13fbf8d974eaa0d7b318cc48 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/Adobe-CNS1-H-Host
371
+ 9cf7735d587195f3398890454795e63716f5f9e3 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/Adobe-CNS1-H-Mac
372
+ d8265ce72bad27dadbd8b3617b21f5577e766b8e services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/Adobe-CNS1-UCS2
373
+ 08f05cc372f1372b90ad9a43cca1a686bb975afd services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/B5-H
374
+ 277ede77969762723ba531c698d5447724387a4f services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/B5pc-H
375
+ 08cca172468bb867962e490f0454e45737b296f2 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/B5pc-UCS2
376
+ 181ef364a082fb81583998b7aa2dc8b58f003b1c services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/B5pc-UCS2C
377
+ 70f89e7ab425e12f33b39f4ff089cef8731d0281 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/B5pc-V
378
+ 2b0482d0387d5f6ec69a7922e40c31b63885acba services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/B5-V
379
+ eefb687598b2783ce9be1dd4c9b26cc0d591c2ee services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/CNS1-H
380
+ fec58cd1e36e85082594a1fbcbdfd3e1331180cc services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/CNS1-V
381
+ 832b710a7bb75d25e2150b64b9d93b9d0b22aadc services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/CNS2-H
382
+ ee519fab4b293e19f013251e57b51a892c668de3 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/CNS2-V
383
+ 8e8936bf14a4d485a72019d39379fff6d40611f7 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/CNS-EUC-H
384
+ 62c458029881a185249af114c2c0a74e00a2e9a1 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/CNS-EUC-V
385
+ a25ea5ccbc2cf3ddf9dd0039a1cde5d6ffc2c747 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/ETen-B5-H
386
+ d71b62ad580d772ca9df1285d68ab729bd6339eb services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/ETen-B5-UCS2
387
+ 736fb4a403b94b9e6ce25f0a12675848c8dd5481 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/ETen-B5-V
388
+ 6a3395011aaef3e921ab44c1e535223ea6679734 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/ETenms-B5-H
389
+ 4a5c611fed53ddd6880f19b641233d89572f1c76 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/ETenms-B5-V
390
+ 974945adf77484b3121687352d972fcbb6c54983 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/ETHK-B5-H
391
+ 57d776389096381999a607dcceddb3c5e665710a services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/ETHK-B5-V
392
+ 199f52e58ebedf5da4c585994d89f13c72041721 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/HKdla-B5-H
393
+ cf1e5501d88934b7229736554cfd2bab70ee8d96 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/HKdla-B5-V
394
+ 1721d6ea0bc07c0a4e1f5bf7615d82934d7a90cc services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/HKdlb-B5-H
395
+ a6960b22df4115caef5126be85d209d2ed21540d services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/HKdlb-B5-V
396
+ d92536a2c1bf3f4b65f935524393e3378a912817 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/HKgccs-B5-H
397
+ 298cb275c68458ee93ea969251553e1daca28b34 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/HKgccs-B5-V
398
+ cfc47917b53f57044460b4639c48543281d1919f services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/HKm314-B5-H
399
+ 0f47a62e9400732840d5f40c51068c10bd6c7f0a services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/HKm314-B5-V
400
+ 543de49adcb83b8585fc7ec8a98ca80d0eaecbb1 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/HKm471-B5-H
401
+ 8782ca6b4ccbfd7a9e9ee23b21a5b4b186e72ee3 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/HKm471-B5-V
402
+ ea6e1c881ba1bb465b2b1d81bccefde9b602c977 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/HKscs-B5-H
403
+ da4f9bfe122fe49ab04878addf03f0ce95e57015 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/HKscs-B5-V
404
+ 4a01a36646a60c894258c6117ea5828c91292aef services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/UCS2-B5pc
405
+ 783b1d8a85520c7a77caecfeebffea24e791bd1f services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/UCS2-ETen-B5
406
+ 73ca664a26ba7835d0c06a1ae13f1c8b5ed16812 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/UniCNS-UCS2-H
407
+ 9927ba9fb7cb7bcc46ade671f95a845ac39156d9 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/UniCNS-UCS2-V
408
+ 76c15677f9fc536e83d4263a3fb26b785db9eecf services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/UniCNS-UTF16-H
409
+ 37e13a5a9605070f98291b396806d04c6ddcfd09 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/UniCNS-UTF16-V
410
+ beee8bb2efd85b85fb5457c1f048732bdde7d0a2 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/UniCNS-UTF32-H
411
+ 123ec46ca25b8649658b17cec29fab62cda29a8f services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/UniCNS-UTF32-V
412
+ 1b5fb46b21b49d1d5b143a4abca2afa7c5c62ad3 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/UniCNS-UTF8-H
413
+ ba1840bdb24e959384853adce5fba014ca4e308b services/software/poppler-24.08.0/share/poppler/cMap/Adobe-CNS1/UniCNS-UTF8-V
414
+ 662fbcb0b89dea7969aab1414b1ccbab47b4373d services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1
415
+ c96113ad786567fb9cf4e18bcf0d5b85b53b97ad services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/Adobe-GB1-0
416
+ 8cde432ee3a6cffbe4f0125ad6662098bbb9e929 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/Adobe-GB1-1
417
+ ee205248148aa4dc85e6b7c2231bcd7e9b7afb7b services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/Adobe-GB1-2
418
+ 96fd45a6e3c3ae360804a2af46fed374ccf76b4a services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/Adobe-GB1-3
419
+ ecb9212730c6e252bcd79f2b7185bc8d668a8adf services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/Adobe-GB1-4
420
+ 8a9ee3ee1035dad2fcbd89863ed4fe9eeb5fec07 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/Adobe-GB1-5
421
+ a121ca7d9980eee4c0a41a57848fd601ec876b2a services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/Adobe-GB1-GBK-EUC
422
+ 4e2af82f23b3013a1a800bac3e49da06c0dc4efa services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/Adobe-GB1-GBpc-EUC
423
+ 627822a07eebb2c5cd4562c50bd1501e3a1eee69 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/Adobe-GB1-H-CID
424
+ a6b36a877afdd0e39b9db90394234ca1a31ab579 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/Adobe-GB1-H-Host
425
+ 6d2eb49c68499d01a25c52d8b9fbf0db3b700c5d services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/Adobe-GB1-H-Mac
426
+ 72d9a1fe4d616b6c7c72acdc46b45fbed0731077 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/Adobe-GB1-UCS2
427
+ f28d6f1135ea9294e02dc0d5ecb09205867d61d9 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GB-EUC-H
428
+ d6c9ba76d827a5d9ee58a47730d1fcb3d9471d5c services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GB-EUC-V
429
+ 0c84cff673a589d8e56c3edd4319aab6d088cc3e services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GB-H
430
+ fe15bc780a68c465bb2112e53edd5ddb83c8ff0a services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GBK2K-H
431
+ 5ba0359d1360b984f9433d22a09b18e70d10202f services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GBK2K-V
432
+ ddb94e9f0457fe5560711a218556516103a56129 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GBK-EUC-H
433
+ c5d17dd5a83de47eadcbab334e4523e8a28ecba7 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GBK-EUC-UCS2
434
+ 7e5b586fb2eca868dce6dbfa2ce8bc1599f61792 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GBK-EUC-V
435
+ 15d15a49ded29b5995738a22d768bbf4af82798c services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GBKp-EUC-H
436
+ 9bcb51d848506c2ea49fd1679964ee68d43c79bf services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GBKp-EUC-V
437
+ 84f0e64a7a566183828e8fb6e7479fef10c9ea75 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GBpc-EUC-H
438
+ 34f77f542b01de92b8a5272e357931adfb77324d services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GBpc-EUC-UCS2
439
+ 5a04809e0a3825427e69433d04fffe2c7a9d9075 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GBpc-EUC-UCS2C
440
+ 851888210989436ace1415082fcd484cb1cfda25 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GBpc-EUC-V
441
+ e82b1ef0b5b4eab71f6f23e2f1cc5986b85da87d services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GBT-EUC-H
442
+ 0b8c4b0bced6e9887d10387fb8ae3805e84a9f88 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GBT-EUC-V
443
+ 9aa834eb0623a38e3fac7288ca25d134d7fe463c services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GBT-H
444
+ a5be785960f371ead7dddb79dc6fe4176370cf37 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GBTpc-EUC-H
445
+ bcc5f4713a914977860c668e9e6d7953992d9d8a services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GBTpc-EUC-V
446
+ c0bab3d590df40b841862dcc2eb84859610c3070 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GBT-V
447
+ c88725325f411b6caa8a09ccbef1d1ad5c6a93ec services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/GB-V
448
+ c5cc04933babdcc4c5b24f762b299f6385762916 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/UCS2-GBK-EUC
449
+ 7477d559160761f56c78f9b69ba17d6c1911590b services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/UCS2-GBpc-EUC
450
+ c7b40cda0527ed5d990bacceabc13164bf999fa2 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/UniGB-UCS2-H
451
+ e0f0fb56ed168c035169be8e72fdcc361ef9186d services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/UniGB-UCS2-V
452
+ 9575b1d7f276eb5e6af16878be82a575e8a61cf7 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/UniGB-UTF16-H
453
+ 0f302482564c3e90d9ed8d7959ae3273c2354fbc services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/UniGB-UTF16-V
454
+ 765869daab2df9015f4861d832c900d2de00d51e services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/UniGB-UTF32-H
455
+ 664a362ecd705e2e1ac506bb94eb6780358f1bd9 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/UniGB-UTF32-V
456
+ 8d2af6ba95c707c1d038ed6e68e9c46fbe49c685 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/UniGB-UTF8-H
457
+ 1c100efdeee5464beebcf24c1c1a7d2f249e8a90 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-GB1/UniGB-UTF8-V
458
+ b921f4c145e3d7613c18fbbb11d71ccba0da6c9f services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1
459
+ d30c5e8832eeb027cbc5715a0eedea6fe230b24a services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/78-EUC-H
460
+ 69fe9c26eb688d4651e5d5d939f0ca38d4072e28 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/78-EUC-V
461
+ 1c7cc2d10bd847a2806a16677d46f741278ea843 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/78-H
462
+ ca78cae23fd2f0e7e33bf5e4b28f3b289b126683 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/78ms-RKSJ-H
463
+ 03685c696791e40af7e369dea45fad938c035a79 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/78ms-RKSJ-V
464
+ d77d6308b1a3e4b3f65775dcf9f3274ad4b3df96 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/78-RKSJ-H
465
+ e68ca260312bd53965c407baf39b37a11b1ed49e services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/78-RKSJ-V
466
+ 465b79f995a725aedceb1e606104f8badf312e05 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/78-V
467
+ d80b465fa79480caa1e9606fb89716fbc370d1ed services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/83pv-RKSJ-H
468
+ 158f3f661cc7d0529d21adfbe92bcaaee5f8f756 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/90msp-RKSJ-H
469
+ 7081845f4fc2c965debd8906a557a6d772b5c87a services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/90msp-RKSJ-V
470
+ 89c83394e93d6568ba031f349b46fd883e76f755 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/90ms-RKSJ-H
471
+ 726c4bfb3ac40e6f3d8ec32b428ac4eabec64d4d services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/90ms-RKSJ-UCS2
472
+ eeb6a28a93d970d0d74c7000cc185a117aaaddf0 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/90ms-RKSJ-V
473
+ 0b68fba1392f9b6e5cff078f1642d29bc6a496e7 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/90pv-RKSJ-H
474
+ dc16eb5f301f15220d73caaa204fe51b02ca3db6 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/90pv-RKSJ-UCS2
475
+ 37759d6a9f0b804ace85840bcef26c419b2c0661 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/90pv-RKSJ-UCS2C
476
+ 32b993422ad421f7b22aaed08f19ccc22d2a3e98 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/90pv-RKSJ-V
477
+ a5889e51bebbc7188cc531c86fa1958e4ba73b0e services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Add-H
478
+ ff0b793bdb63feb6d09e01233cdd87b39f1660c0 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Add-RKSJ-H
479
+ db50cbcbf098a2e4603190d51f41fbc1c69f1008 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Add-RKSJ-V
480
+ 053dbff78d0793e80e8dfda5d52a76b03c13b97e services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Add-V
481
+ 7e172144da548b3dc9c706f9cd44c69f8c51f741 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Adobe-Japan1-0
482
+ f61f714cce4cd01615f95e67a7f4173fac2b2fb2 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Adobe-Japan1-1
483
+ d7767f65fcfd31c6f2a3551cf3b8942ef2d9ab72 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Adobe-Japan1-2
484
+ a5507b65ad1ed355e7c44f41f132b5d27844439c services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Adobe-Japan1-3
485
+ f6a4cf813712748a7351bea4919222d300f5b2a6 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Adobe-Japan1-4
486
+ e7991319e3b7e7e34bdcd6d554d9501c23f758c4 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Adobe-Japan1-5
487
+ 38e95eae7a7b595197357a17309bd96b0232deb9 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Adobe-Japan1-6
488
+ 6f195ced13be18738b7dd7ef33d66fd6fab48d23 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Adobe-Japan1-7
489
+ 9ac8341110e5b4a437fae3c57033caada449e740 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Adobe-Japan1-90ms-RKSJ
490
+ 7b7c6987eb2df73cdde7b5f3406df539764344c4 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Adobe-Japan1-90pv-RKSJ
491
+ ea30bbc9b2529db1a406e21ede465d32008c1aa0 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Adobe-Japan1-H-CID
492
+ 833b3a817bd6db31eb4ec6ae719a765dbf2eb358 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Adobe-Japan1-H-Host
493
+ 46b64ee42a55a81e643131fa19837a6fb7094e02 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Adobe-Japan1-H-Mac
494
+ c29524847c4d12dc59b5c6542098fe985cfb294f services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Adobe-Japan1-PS-H
495
+ c24698b4a8300ec49a583828395ffc9498e42527 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Adobe-Japan1-PS-V
496
+ 599d35a819e162aad1eb97ddff52aa35ec6fa517 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Adobe-Japan1-UCS2
497
+ 1167675bd41d5fa35bc35dbd02b7483070220b29 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/EUC-H
498
+ b3796b7443f306b81c0b857b6d9d472f3f1faa84 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/EUC-V
499
+ a67d3409ce7ec59d34ee7bd5aff3e703af5dce84 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Ext-H
500
+ fd6be155157daf82d09189b376fcca7b8facfeca services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Ext-RKSJ-H
501
+ 06f2ce07c5ac084b25786fa7d8a4514c1f1e15b5 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Ext-RKSJ-V
502
+ dfe6d14face1eb9ad49b05f07403d8c60611eca1 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Ext-V
503
+ f8efc4ed68400d9de0ab017c977b9ff15597fdf1 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/H
504
+ 24cfcca3ff60c00add8b12a0d1cf47d03bc0deb9 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Hankaku
505
+ f4983034846b44c8e6df204857ff37697a05dc64 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Hiragana
506
+ 4d33c8dec14ff765d6a83147c596c1b2f672d604 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Hojo-EUC-H
507
+ 223e544d2706c5d95751c55b1afe5420ca8d25ed services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Hojo-EUC-V
508
+ 35490e0858b9a4f826d80ecab5b00a494cff8bab services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Hojo-H
509
+ 0e3414499068f964bbc9f4e94040a30aa89b46dd services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Hojo-V
510
+ 7dbaffb7d3293c534070fbcb31794f10bdf74eb1 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Katakana
511
+ 4b8f7eb7d9b1765b18323be8c7aa1c7173b1f7cf services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/NWP-H
512
+ f44a34082bcf05655b4f4489a3a18b3089973c2c services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/NWP-V
513
+ 46fd6237fd77d10bdf6925654253e4ab3e4b3950 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/RKSJ-H
514
+ 7740b49416eb6b590a275fd67a3b80a7cfc22a60 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/RKSJ-V
515
+ 74eb81051b0a6af02c0585dcb2ddbf2b3f5fd234 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/Roman
516
+ b51c943b20a3af3db5375dadae1e115806c4d73d services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UCS2-90ms-RKSJ
517
+ 8e7da02a8b0f0c7f9a79d8eb8a96bb5ab5d0fc24 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UCS2-90pv-RKSJ
518
+ ca77057fb2e740885acd60c0b5176f3942e53aa4 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniHojo-UCS2-H
519
+ b82548d55002987bcf24feccc47f9b6865f1195d services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniHojo-UCS2-V
520
+ 87ff21bc045019fae7baec05378cb9e23f8902d8 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniHojo-UTF16-H
521
+ ba7d520d5165d0c1f834f603af9ae507ad0681cc services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniHojo-UTF16-V
522
+ 9685b63258a6931a68bdb9931126f65c908401e8 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniHojo-UTF32-H
523
+ 1b9959ec5afc61bcab07b5ba51b9f68bf6981ce7 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniHojo-UTF32-V
524
+ e92a0fc7ec3005993bd15260beae80c33c250f91 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniHojo-UTF8-H
525
+ 1d31b182e6cd26afaaf1c4d14d6de945e5b5ac06 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniHojo-UTF8-V
526
+ 296c2ab8d609a9a9b9025277c350f4763533734d services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJIS2004-UTF16-H
527
+ 441af72004ffaa37064c77ce254113a8f9bc4c2a services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJIS2004-UTF16-V
528
+ 723328206a8d9a875c39c24ace32bcc649b38ea0 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJIS2004-UTF32-H
529
+ ca945368992d110ed7d8637fd26ae3a4e3f5bcd0 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJIS2004-UTF32-V
530
+ 0169f03647f0a81ec6e7cb44c971665d90f97158 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJIS2004-UTF8-H
531
+ c4f75c08a05edf94ceb73d917714ed29d61a1f93 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJIS2004-UTF8-V
532
+ bb4b1208814e9829481d1b33b1b179c80ee3c5d1 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJISPro-UCS2-HW-V
533
+ 59d2d3d2fa01c0227b80989190490762a42bfe15 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJISPro-UCS2-V
534
+ 654601bcfd62c5c007dbb386b75708cbcb211a06 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJISPro-UTF8-V
535
+ bf5331822801a655b922e0efaf786e1250b4216d services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJIS-UCS2-H
536
+ ab516ed8a851126f4332608f19327bdc418fd8b8 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJIS-UCS2-HW-H
537
+ 311d584a1c207bd63e0967a8068590f98b72e896 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJIS-UCS2-HW-V
538
+ 7ade3d475e827114ca79d12640ada7bb48693a19 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJIS-UCS2-V
539
+ 11b725a80d6bf0aef98378558d83bd74df30dd4c services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJIS-UTF16-H
540
+ f18f11e82efd487e3115f92eb70da35da947d256 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJIS-UTF16-V
541
+ bdf61a04a29c82dec4c5e0945758ddbe0686dfa9 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJIS-UTF32-H
542
+ e9a3b9eed686719fd116ec626f1908c613484948 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJIS-UTF32-V
543
+ 82ed8d1e664a2a3d974630533d206381e94f91f3 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJIS-UTF8-H
544
+ 5e673f2303834f1b4e20891ecaff9c1fedc5b33b services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJIS-UTF8-V
545
+ 069d6991ea4171349d79f701a04c6e761304a79c services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJISX02132004-UTF32-H
546
+ bf6f0a7caa8349372255eb9dbe7765a883d62dde services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJISX02132004-UTF32-V
547
+ ebe76f629d11bb0dcc0f0a6463d0d2e0cff6f611 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJISX0213-UTF32-H
548
+ a7b8d41a6a379f6ac528afc80d833642bc690376 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/UniJISX0213-UTF32-V
549
+ e508e19ecf70faf17b5da0bfeec5b49b6dd38cbf services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/V
550
+ a450c2ad0ee4ee935b6f11b7c5d3703094629d76 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan1/WP-Symbol
551
+ 047dbf61188afa0073e4263c744379b9b89a0cb7 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan2
552
+ b4abbe49ec37b2d446993a1be95671cbf2f7cf0b services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Japan2/Adobe-Japan2-0
553
+ ea9959b2f1d007b9a751e4c1cb21df8c01bb1307 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1
554
+ 903ef2fe13e5480fad45828130e08146b06b7025 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/Adobe-Korea1-0
555
+ e6f3bba58f85de84ad05af9a64f3b598452f7d2f services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/Adobe-Korea1-1
556
+ 26c8ff78e06ac23862fb841becef6d60c462a2b6 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/Adobe-Korea1-2
557
+ e3a4ff547e5f3dd9b3fde4d120f12ed5fe18a77c services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/Adobe-Korea1-H-CID
558
+ 5aa6e313b5305237c191ef2907f784bc58f939ea services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/Adobe-Korea1-H-Host
559
+ d3ba9dee0bc90ff378fb1defb83db5657f688602 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/Adobe-Korea1-H-Mac
560
+ ab8c4f52bfa2fce31492c1caaedbcb8794e3e165 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/Adobe-Korea1-KSCms-UHC
561
+ 8665a742a0b77729e16001815c578d1b0ebd13d5 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/Adobe-Korea1-KSCpc-EUC
562
+ 4c0c00dbc80d49e0e5b69c960158a7fe5cf6dc6c services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/Adobe-Korea1-UCS2
563
+ 1b877a902a8d40c683c730102258a70ca548247d services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/KSC-EUC-H
564
+ 46b28ed5d57068c733839c4a61fd07d835f0017f services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/KSC-EUC-V
565
+ d7c42cddc29b8888d7e9e95685bc3b4aebd3b786 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/KSC-H
566
+ a08cc92b2288dbb715ae1d4da7253e099194b389 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/KSC-Johab-H
567
+ 6245a72b819abfd1da1f2040fca1c17e93770e08 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/KSC-Johab-V
568
+ 84dbbdc3cb433d9fb8ab0169c8bc8b08c05c49fe services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/KSCms-UHC-H
569
+ 6e89d5bd3672ec0104a14f98a653142e4decce07 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/KSCms-UHC-HW-H
570
+ 32f182f71dd824b9b00b93910ae7f4d536408cfb services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/KSCms-UHC-HW-V
571
+ 6d2297a4540c8a7f90c1509da6d8860b10d1730f services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/KSCms-UHC-UCS2
572
+ 8939350e036f64f861a50283c8db4afaedba6003 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/KSCms-UHC-V
573
+ a5aae5a37a3359954e09d1effee1e9ccafd7d96b services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/KSCpc-EUC-H
574
+ fca17f924ab4f20d6763db19a3727d70aaec8ec0 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/KSCpc-EUC-UCS2
575
+ 5ea87725ac0c6b73038090cbea26ca53ba3b17bd services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/KSCpc-EUC-UCS2C
576
+ c9615a341e09bf193af8307f9cbbba2008d07972 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/KSCpc-EUC-V
577
+ b0ee2ba209d7123bed8ae9af68a4ff46257f90d0 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/KSC-V
578
+ dc16001b7f80a46ad96ffb0a07c33b9156dcb71b services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/UCS2-KSCms-UHC
579
+ ddd27455320ff8643d3c0e0d7805aa6211cf24cb services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/UCS2-KSCpc-EUC
580
+ a7f64bd7c8e01039795a8d7eac11d90ad8500cf7 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/UniKS-UCS2-H
581
+ 4ecc9df8bec428f27eab46a7f0aa3a3b4101ff14 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/UniKS-UCS2-V
582
+ 61cab822075091ad36ed7abc975416bc8c408d3f services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/UniKS-UTF16-H
583
+ 049fd21f02ab5eb253a3d3e594729eb4f396ebac services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/UniKS-UTF16-V
584
+ 4f6c419826124b8b950cb39304e0a56cebc7a1b0 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/UniKS-UTF32-H
585
+ fe2fd2c28bce5892ce18330372be678f3588368e services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/UniKS-UTF32-V
586
+ 148162cdc5ae02edf172f5b25e744f507f0bbd48 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/UniKS-UTF8-H
587
+ e06985999662b52e67b48601581e671b4c447153 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-Korea1/UniKS-UTF8-V
588
+ d8f79e67690a4ed8956dc1c57735d3a406685a0b services/software/poppler-24.08.0/share/poppler/cMap/Adobe-KR
589
+ e87bc485e0587addee08b1ced23f5fc5465110a5 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-KR/Adobe-KR-0
590
+ 210a09224ed51f9c172aaaf6614173b16190f79b services/software/poppler-24.08.0/share/poppler/cMap/Adobe-KR/Adobe-KR-1
591
+ 6d6ee62aed11e7bc607871b9f7b72434c576a831 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-KR/Adobe-KR-2
592
+ 75503388388d9f4f48c2a475b98555ffffc0335b services/software/poppler-24.08.0/share/poppler/cMap/Adobe-KR/Adobe-KR-3
593
+ b16a34168049afe7b86f416c8ca826f77b790cf4 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-KR/Adobe-KR-4
594
+ abd3b546f7e815e0431eaeb7bca6f2c793cb0d38 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-KR/Adobe-KR-5
595
+ cde3707f562c88bfc3f4b6e07b1afa121fec5a71 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-KR/Adobe-KR-6
596
+ 654c5443c861e1f9c9fa0966d6beedb993df8d1a services/software/poppler-24.08.0/share/poppler/cMap/Adobe-KR/Adobe-KR-7
597
+ 8c80219e66deb00a3ccb445b99f59cfe40e19392 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-KR/Adobe-KR-8
598
+ 7f1f9a499a737b32f21152c20205032093328739 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-KR/Adobe-KR-9
599
+ 05698686f0ec900ffa67c89349548dca0dc63fa5 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-KR/Adobe-KR-UCS2
600
+ 7f0904446ce2b16855e08f8bfe5752470923550e services/software/poppler-24.08.0/share/poppler/cMap/Adobe-KR/UniAKR-UTF16-H
601
+ 82b117b4f1846a88dc2cbb0364b8f5f643a53d4f services/software/poppler-24.08.0/share/poppler/cMap/Adobe-KR/UniAKR-UTF32-H
602
+ 0853d1182d2302b1b8a1f890ecff0a716de9df09 services/software/poppler-24.08.0/share/poppler/cMap/Adobe-KR/UniAKR-UTF8-H
603
+ 5e53f88182fd288d28f43ba352d388587780e591 services/software/poppler-24.08.0/share/poppler/COPYING
604
+ d048f58bad011747136f76c9d8efb4e2492a9648 services/software/poppler-24.08.0/share/poppler/COPYING.adobe
605
+ d511905c1647a1e311e8b20d5930a37a9c2531cd services/software/poppler-24.08.0/share/poppler/COPYING.gpl2
606
+ a8a0b6c93a80038473c72a2ee165e23c35739842 services/software/poppler-24.08.0/share/poppler/Makefile
607
+ b68e032fd83fa2eda948fb2f97d663e33f3ac3fc services/software/poppler-24.08.0/share/poppler/nameToUnicode
608
+ 1f2229b2a90a2934a722a921acd056fff54ff770 services/software/poppler-24.08.0/share/poppler/nameToUnicode/Bulgarian
609
+ 351d111ee5119f2c47e0782b0a3d48151cfd905b services/software/poppler-24.08.0/share/poppler/nameToUnicode/Greek
610
+ 8fdc894b7ad86439d7b42968ed3a9811ea5613d1 services/software/poppler-24.08.0/share/poppler/nameToUnicode/Thai
611
+ d76795253ad4ddff800cb1c1792895e4a4f7b79e services/software/poppler-24.08.0/share/poppler/poppler-data.pc
612
+ b9741162db507c1b617d0bac0426e5610feb023b services/software/poppler-24.08.0/share/poppler/poppler-data.pc.in
613
+ 787f6d7593170c2b629485b1d51f84126ccd2d02 services/software/poppler-24.08.0/share/poppler/README
614
+ 716e5f0fadff577f91955484b46cca6d4791e762 services/software/poppler-24.08.0/share/poppler/unicodeMap
615
+ ec1dbc02a336defe017d881fe4d72c238a2b5493 services/software/poppler-24.08.0/share/poppler/unicodeMap/Big5
616
+ cbcd04488ff33ba575ba90d8188a19e248b6ea98 services/software/poppler-24.08.0/share/poppler/unicodeMap/Big5ascii
617
+ 7cc16e654cc03d73a7132df668a924361a18abf4 services/software/poppler-24.08.0/share/poppler/unicodeMap/EUC-CN
618
+ 4ed2544bcca799f5c12bfe2088e5579ded6f1dda services/software/poppler-24.08.0/share/poppler/unicodeMap/EUC-JP
619
+ 1d2a95fd36da219f91482dcc0d485557c41a102d services/software/poppler-24.08.0/share/poppler/unicodeMap/GBK
620
+ c41eb28a83907d1bba287c1c70a909e4e2c70d08 services/software/poppler-24.08.0/share/poppler/unicodeMap/ISO-2022-CN
621
+ 1c6af6a400bfade812f5c33d95d40cc37365f4ef services/software/poppler-24.08.0/share/poppler/unicodeMap/ISO-2022-JP
622
+ 7e37b4909260a96b5461e745cee1524c872bc7d4 services/software/poppler-24.08.0/share/poppler/unicodeMap/ISO-2022-KR
623
+ 25bee9eb08e43af72fb20a1930ab45267426aefa services/software/poppler-24.08.0/share/poppler/unicodeMap/ISO-8859-6
624
+ 3a4768911667adbe157a0e2196f554956c1b140c services/software/poppler-24.08.0/share/poppler/unicodeMap/ISO-8859-7
625
+ 970a7cdf0aaacec2fc4ff0fbb76beaf35fea45a5 services/software/poppler-24.08.0/share/poppler/unicodeMap/ISO-8859-8
626
+ 6326ca669d36251f85cf80237cd240916eae298e services/software/poppler-24.08.0/share/poppler/unicodeMap/ISO-8859-9
627
+ 8869ede78ba20cbb8f820b583643177bd92202d5 services/software/poppler-24.08.0/share/poppler/unicodeMap/KOI8-R
628
+ 993931e680ccd3f56b2505bd7966eea412e4eec7 services/software/poppler-24.08.0/share/poppler/unicodeMap/Latin2
629
+ a55e584143533c881b3d7a932cb051319af87550 services/software/poppler-24.08.0/share/poppler/unicodeMap/Shift-JIS
630
+ b336e8782e4c6cc473f85c13f374019e2df6d016 services/software/poppler-24.08.0/share/poppler/unicodeMap/TIS-620
631
+ f792be75b5fd724821506ea28676823947d4b80c services/software/poppler-24.08.0/share/poppler/unicodeMap/Windows-1255
632
+ 67b1b7ab5306bf1d14effe8d4cf7403b11262237 services/software/Tesseract-OCR
633
+ bc5cee639b404416e56f0659ab2e8b2fb67cdfa0 services/software/Tesseract-OCR/ambiguous_words.1.html
634
+ 82becf9ec64ae44cf2045a27f2306965c1dd4d83 services/software/Tesseract-OCR/ambiguous_words.exe
635
+ 7458133be8d759f7f5545b21bf91fe6d2fe134bd services/software/Tesseract-OCR/classifier_tester.1.html
636
+ 65024a4f4f87f0c9d643f52e2654fec7b527b26f services/software/Tesseract-OCR/classifier_tester.exe
637
+ cd8d0ea404ff2c43b5731233a39b1960897227e6 services/software/Tesseract-OCR/cntraining.1.html
638
+ 1ecc72ad141765ceb411184cc1370f62aba222ba services/software/Tesseract-OCR/cntraining.exe
639
+ 0c1d58261ee6fd4fdec9f99f32122e861223753f services/software/Tesseract-OCR/combine_lang_model.1.html
640
+ 16bb44dc152e05e93a379b0e3c1cbd519f331990 services/software/Tesseract-OCR/combine_lang_model.exe
641
+ e689c17e05681abefe26be2b9a281ad49b7fab13 services/software/Tesseract-OCR/combine_tessdata.1.html
642
+ 7cfb65471a7c5d05bdb3fc99c8abf9865d460720 services/software/Tesseract-OCR/combine_tessdata.exe
643
+ 4ae7b9283b1d2861d62515056bf8d21a0b6cfea2 services/software/Tesseract-OCR/dawg2wordlist.1.html
644
+ 432f9763da44cc1a9e8a5f82ca28e207dcb4e8f7 services/software/Tesseract-OCR/dawg2wordlist.exe
645
+ 3977bf96bea32e26844b9572d2964d74869bf633 services/software/Tesseract-OCR/doc
646
+ 9d1e73c3083260ae9485e7d07f6ac1fa271737fb services/software/Tesseract-OCR/doc/AUTHORS
647
+ d645695673349e3947e8e5ae42332d0ac3164cd7 services/software/Tesseract-OCR/doc/LICENSE
648
+ 99da6d275def3332f577e1554c0dca98c7ebda7a services/software/Tesseract-OCR/doc/README.md
649
+ 9b64829aba22310ffafe685ded30b37a126b4962 services/software/Tesseract-OCR/libarchive-13.dll
650
+ 1c1166a758d115949698f7ca4f48fb1287d37f4f services/software/Tesseract-OCR/libb2-1.dll
651
+ 6e49a79e514c0758a4d0a845f70924c6c2170299 services/software/Tesseract-OCR/libbrotlicommon.dll
652
+ c67e14b5053dd81bd35747db1e90b2f7798de3ae services/software/Tesseract-OCR/libbrotlidec.dll
653
+ 6f7db4827a41fef8a3aaa03efa31e72be3b7d366 services/software/Tesseract-OCR/libbz2-1.dll
654
+ 3a35c115310eb54c031f603ca60fa31ace908df1 services/software/Tesseract-OCR/libcairo-2.dll
655
+ 6fc26c9edd0220716d0313a7d14f3495297a2f10 services/software/Tesseract-OCR/libcrypto-3-x64.dll
656
+ b096c47d7c0022147e530c8009d9808e1569d743 services/software/Tesseract-OCR/libcurl-4.dll
657
+ 672e29208adc991593fcef2efbafc2728157cbc3 services/software/Tesseract-OCR/libdatrie-1.dll
658
+ dd1505a81e7e89a815d4b3898ac6a2427ba45605 services/software/Tesseract-OCR/libdeflate.dll
659
+ 78cd67b0890ca50cd311ca992a3a59644c9064ae services/software/Tesseract-OCR/libexpat-1.dll
660
+ 77212def06935f83edb0e56be1ab550c46d680d9 services/software/Tesseract-OCR/libffi-8.dll
661
+ 42edff502a584042bb6d6cf55e37e38af3d7e40e services/software/Tesseract-OCR/libfontconfig-1.dll
662
+ 0b4250e04bb19668d9d5723f7d8bb11184904458 services/software/Tesseract-OCR/libfreetype-6.dll
663
+ 19b30d590a03b49b091c48a4f619a8fd5d80a20e services/software/Tesseract-OCR/libfribidi-0.dll
664
+ cd1efb4b7af4abb238a543fdd2562e3ddf2a34a3 services/software/Tesseract-OCR/libgcc_s_seh-1.dll
665
+ 5693bac25dbd497caa771b108b80ac6e799583dc services/software/Tesseract-OCR/libgif-7.dll
666
+ b8805159fcfb05846ce6979e8b313aaa617487c0 services/software/Tesseract-OCR/libgio-2.0-0.dll
667
+ 884858efca1c2076618e1b98dbee6f578e7af398 services/software/Tesseract-OCR/libglib-2.0-0.dll
668
+ c95eb9947475b6fe9c5356623be8d0fe6432ebb0 services/software/Tesseract-OCR/libgmodule-2.0-0.dll
669
+ eec8d09494f28c3bc6e4b3338f8c93df61385b84 services/software/Tesseract-OCR/libgobject-2.0-0.dll
670
+ 9b5178ac8ab3cc3656cad59e95d56f41f888310d services/software/Tesseract-OCR/libgraphite2.dll
671
+ d148bd8d34d454f3dae23dfddd8f234a49adc95b services/software/Tesseract-OCR/libharfbuzz-0.dll
672
+ 34abf65eb7d43718fd74e3d954c617274216fb3e services/software/Tesseract-OCR/libiconv-2.dll
673
+ 95ebd5abbda37376573b025d7db81870e0eb8f77 services/software/Tesseract-OCR/libicudt74.dll
674
+ 627628997c7bb54e1f053877b7d778118d326fd4 services/software/Tesseract-OCR/libicuin74.dll
675
+ 497222f9bab31232a7f78ea8a712eed5397f1997 services/software/Tesseract-OCR/libicuuc74.dll
676
+ 37d62690f0d47e78067911251c4933965c7f08ab services/software/Tesseract-OCR/libidn2-0.dll
677
+ 2aed7ad9c1b6b841f911269b6c17ddc2d56cfda6 services/software/Tesseract-OCR/libintl-8.dll
678
+ 9bee42fd5a922d62660c5d71a53c2ad830c7c019 services/software/Tesseract-OCR/libjbig-0.dll
679
+ d45e627fdbe9d88fcebb20bb672b1aca68db803d services/software/Tesseract-OCR/libjpeg-8.dll
680
+ 5f06383c1f9da5edd60d3c8ea1d0f65e6eb50ae4 services/software/Tesseract-OCR/libleptonica-6.dll
681
+ 1c089e20ba3aa0a64a9af9fc49db564eab85a52d services/software/Tesseract-OCR/libLerc.dll
682
+ df85958c15533b23ab75ce58bd42c89ff26ce0e2 services/software/Tesseract-OCR/liblz4.dll
683
+ 5ec3362724e3e84349599c42960281e32445830b services/software/Tesseract-OCR/liblzma-5.dll
684
+ 74b3f134e4e91dcf61603f334fa688c30c1b3907 services/software/Tesseract-OCR/libopenjp2-7.dll
685
+ e86c4cfbabdb9b53d3c0eae620f154f9460a083c services/software/Tesseract-OCR/libpango-1.0-0.dll
686
+ cd072eb6f559c1981669330a4ffb598be8e02e2e services/software/Tesseract-OCR/libpangocairo-1.0-0.dll
687
+ 8b17f7421be6c91a16e81f226814500efe579a2a services/software/Tesseract-OCR/libpangoft2-1.0-0.dll
688
+ a4fe8203f5aaf2ff328466dfec6b4c433ae1cc8e services/software/Tesseract-OCR/libpangowin32-1.0-0.dll
689
+ 0349abf83154a6301d1e2b1b19c48ac703178360 services/software/Tesseract-OCR/libpcre2-8-0.dll
690
+ 535ea7c78ba493f7187e984b47f901fc6c56bd9c services/software/Tesseract-OCR/libpixman-1-0.dll
691
+ 4e7c3ac364ab521ea3580ab127c8f87c0ea0b30d services/software/Tesseract-OCR/libpng16-16.dll
692
+ 74ed8044917fd71f100d3c75a4cc7295013ee61e services/software/Tesseract-OCR/libpsl-5.dll
693
+ 22f3ee25ca999f021238a84fce073c2fb2b44945 services/software/Tesseract-OCR/libsharpyuv-0.dll
694
+ 2860272c6336c51479779327a40e5014f35f5455 services/software/Tesseract-OCR/libssh2-1.dll
695
+ 0ec8296d9e50a3225f88d4968161ed6348b2d8f6 services/software/Tesseract-OCR/libstdc++-6.dll
696
+ 6ee07fc831d1cebed554b76cfdb75490bd8d48e2 services/software/Tesseract-OCR/libtesseract-5.dll
697
+ b931aad412604d3f4ae88b369212af7af8c3156a services/software/Tesseract-OCR/libthai-0.dll
698
+ ffbfe6d3cf9b17d9a41073943d3324f4719e665c services/software/Tesseract-OCR/libtiff-6.dll
699
+ 95815c468603b80b47ad20ecca6b60d202fc5f58 services/software/Tesseract-OCR/libunistring-5.dll
700
+ 2d457d71b47975d3bbb090069b0c570a993f3483 services/software/Tesseract-OCR/libwebp-7.dll
701
+ 43ab09535c1f3909d24209a9c49b58bef7a00efc services/software/Tesseract-OCR/libwebpmux-3.dll
702
+ 362cfc0f5752c8f49e5acd99b3982c485804afd3 services/software/Tesseract-OCR/libwinpthread-1.dll
703
+ d59a28d172b49f010c27d722ecf3f8fee101afaf services/software/Tesseract-OCR/libzstd.dll
704
+ d5ce355e39af2e4424d3aefca1ae392274bf1879 services/software/Tesseract-OCR/lstmeval.1.html
705
+ 3658bcd2c9c07952d3f7b431a47c2a3d107d4e1f services/software/Tesseract-OCR/lstmeval.exe
706
+ 85651c80465af6445c79ecc716c110b9df966717 services/software/Tesseract-OCR/lstmtraining.1.html
707
+ b0ccfd764eeca12871867d21728c9351846c3afc services/software/Tesseract-OCR/lstmtraining.exe
708
+ b321b768f5afa23fc4d335bab23193423032e14f services/software/Tesseract-OCR/merge_unicharsets.1.html
709
+ bd947e775a39033b591e116b4f6eee83f1897ac2 services/software/Tesseract-OCR/merge_unicharsets.exe
710
+ 6ff757ba1a9173e475b84e5b25d5983263fb31e1 services/software/Tesseract-OCR/mftraining.1.html
711
+ fb1b10b73324930ccd63d5f0ccca873dd903b408 services/software/Tesseract-OCR/mftraining.exe
712
+ 98088653dea9b78be6116d672a3391a09f2b1753 services/software/Tesseract-OCR/set_unicharset_properties.1.html
713
+ 0bd70f8563a742391ebbdd7fd23bd74459a46e21 services/software/Tesseract-OCR/set_unicharset_properties.exe
714
+ 8085791f02ae971abcc43bb3b4cdbbf1f9fe1091 services/software/Tesseract-OCR/shapeclustering.1.html
715
+ 245d3d0bac84139d22f389192ee862c5673ce82e services/software/Tesseract-OCR/shapeclustering.exe
716
+ 461f252fa0ba1e5917fe326ac78010932e78fedc services/software/Tesseract-OCR/tessdata
717
+ 09e69cf5478cd6a0fb3ec5e7e7fa95a04f5cafb3 services/software/Tesseract-OCR/tessdata/afr.traineddata
718
+ 7a302b2bf6306c34177f594e0824eafc48906965 services/software/Tesseract-OCR/tessdata/amh.traineddata
719
+ c8d129c67821c1592cac46836686b057ecc203dc services/software/Tesseract-OCR/tessdata/ara.traineddata
720
+ 086035c6eacd5788c1f06d58c250023cee2aeb28 services/software/Tesseract-OCR/tessdata/asm.traineddata
721
+ 27bc73edf08e5e5f0c3e43c315c5c6d965c2f075 services/software/Tesseract-OCR/tessdata/aze.traineddata
722
+ e2b1b953a5b8db9247c6ddfcb58f062dc0b3b574 services/software/Tesseract-OCR/tessdata/aze_cyrl.traineddata
723
+ 65d83dad535f876de31847f5fa2ff1bdd57c7bab services/software/Tesseract-OCR/tessdata/bel.traineddata
724
+ 7e9054d1de309714009a85555f5276168d41af9c services/software/Tesseract-OCR/tessdata/ben.traineddata
725
+ 7bb5029466eaef46aad59fc23b96648df0e4f176 services/software/Tesseract-OCR/tessdata/bod.traineddata
726
+ 95bed5c32e3759347db0471569303f06e3485f42 services/software/Tesseract-OCR/tessdata/bos.traineddata
727
+ c01691329561938fb7d491ea7611c591202952dd services/software/Tesseract-OCR/tessdata/bre.traineddata
728
+ 1e65588d127d918ef3ba95b785b446f15827d60f services/software/Tesseract-OCR/tessdata/bul.traineddata
729
+ 3fcd350dd2bb76503de90249111fff4e3c6aa0f0 services/software/Tesseract-OCR/tessdata/cat.traineddata
730
+ 5a1b96928e54b175db96f00d2aa84b5878d301b9 services/software/Tesseract-OCR/tessdata/ceb.traineddata
731
+ dd6fc79a62f9fcd1c7c6da06b31bb4fdb10dc173 services/software/Tesseract-OCR/tessdata/ces.traineddata
732
+ 388bac276d033d06e5ed5ba7a7ad14ae58f97dab services/software/Tesseract-OCR/tessdata/chi_sim.traineddata
733
+ f9898e91068a9d04bcacf6d2a244da40e9f30c0c services/software/Tesseract-OCR/tessdata/chi_sim_vert.traineddata
734
+ 1955cd8b8d076b898616e9c2c1ace65b43105356 services/software/Tesseract-OCR/tessdata/chi_tra.traineddata
735
+ 94bc5dbd7fa25dd89ac9c5bd18f3fc6d8409aa0e services/software/Tesseract-OCR/tessdata/chi_tra_vert.traineddata
736
+ e0799a2b888466e5bc2ca60f1f2fb4a7ff4c6990 services/software/Tesseract-OCR/tessdata/chr.traineddata
737
+ d089c65b686fee201a62f40f50b3383a3a971f04 services/software/Tesseract-OCR/tessdata/configs
738
+ 0dd12a7a709c14e267fb7141cd9ef705102b8a3a services/software/Tesseract-OCR/tessdata/configs/alto
739
+ 23035a1904cfb8a2e5ad143ac638447bc1b04b4c services/software/Tesseract-OCR/tessdata/configs/ambigs.train
740
+ 5cd6ec0310213adbc59e5c48a49f858daf3cdc4f services/software/Tesseract-OCR/tessdata/configs/api_config
741
+ 5d6c2d061f4a0bae8ab3b2270da8e6744a048d11 services/software/Tesseract-OCR/tessdata/configs/bigram
742
+ d39f2687ef8c50f090895ba1f26367e25613a685 services/software/Tesseract-OCR/tessdata/configs/box.train
743
+ 82754e9cc90b7da072c9074e7ee1492beaa72db6 services/software/Tesseract-OCR/tessdata/configs/box.train.stderr
744
+ 6a329f892910ae9dd7af1f9fe8f7a1d48378fd8b services/software/Tesseract-OCR/tessdata/configs/digits
745
+ 7d00b613ffcbf7e4fa712d2c50a85c7643a027e3 services/software/Tesseract-OCR/tessdata/configs/get.images
746
+ 5ab372eaf819b05bdd87ba419c874f6a1be4677b services/software/Tesseract-OCR/tessdata/configs/hocr
747
+ 252f1a171a154f9ade798e210015a720af039d00 services/software/Tesseract-OCR/tessdata/configs/inter
748
+ c6ac105788137bc4e89821e94843ea86ed5b4564 services/software/Tesseract-OCR/tessdata/configs/kannada
749
+ bd9c114df65ddf13e640298075adb940225c5f96 services/software/Tesseract-OCR/tessdata/configs/linebox
750
+ a160f9be275a70fe3af1935fb8fe7af29efa8451 services/software/Tesseract-OCR/tessdata/configs/logfile
751
+ 5ff37726211ab360ceead7c76a1b52613cc2f277 services/software/Tesseract-OCR/tessdata/configs/lstm.train
752
+ a6f2cedc504e9010eec3bfb0b1336b75ef0c28e5 services/software/Tesseract-OCR/tessdata/configs/lstmbox
753
+ 3fa3dee71aafe30913c1863a5e67529872984743 services/software/Tesseract-OCR/tessdata/configs/lstmdebug
754
+ 3d90ac26f9542c6beac1082b2d900859906af8e9 services/software/Tesseract-OCR/tessdata/configs/makebox
755
+ 9928884cd0238d15533d30f1445df85695d814cc services/software/Tesseract-OCR/tessdata/configs/page
756
+ 59645d71ce52a143d819f2057c8c4e9ce2d46e40 services/software/Tesseract-OCR/tessdata/configs/pdf
757
+ 35b59a9d41dd462c6d13b2301d4b2c31219c582f services/software/Tesseract-OCR/tessdata/configs/quiet
758
+ f8342b4c2c7eb733e1d4078f32a0aa5aee677cc3 services/software/Tesseract-OCR/tessdata/configs/rebox
759
+ e95b59263daf6d43f1b20682a4fa79d386484536 services/software/Tesseract-OCR/tessdata/configs/strokewidth
760
+ dc52478177fd6fb7b1fe278e1374c2054f3e2442 services/software/Tesseract-OCR/tessdata/configs/tsv
761
+ a0cc952977f0f3562a5c94011c13044ace865519 services/software/Tesseract-OCR/tessdata/configs/txt
762
+ d2e22f5b93585032eef94f22966329144ba44d6f services/software/Tesseract-OCR/tessdata/configs/unlv
763
+ 38cd41cd60f89ec7ab3bc5161e094b20f06a3361 services/software/Tesseract-OCR/tessdata/configs/wordstrbox
764
+ 3105b7fb0cd6c26f4fb144ec5d594430e88927cb services/software/Tesseract-OCR/tessdata/cos.traineddata
765
+ 900cf17f74514934f87e9a8df3b29cb16b5606fe services/software/Tesseract-OCR/tessdata/cym.traineddata
766
+ 85501b582937493f9ae6a64ccd0a6bb0a2ea33d5 services/software/Tesseract-OCR/tessdata/dan.traineddata
767
+ 97ed7b2b60f2771c07040660ef0f6daf596dc7bf services/software/Tesseract-OCR/tessdata/deu.traineddata
768
+ 53b46df7d6ae94f75913d6377182867ea09d950b services/software/Tesseract-OCR/tessdata/div.traineddata
769
+ 3c31175be56ab4db42af614f384ea52ce949082c services/software/Tesseract-OCR/tessdata/dzo.traineddata
770
+ ed98ae1a88d84414da316e6eeab3232f2c68639b services/software/Tesseract-OCR/tessdata/ell.traineddata
771
+ bbef4675053b5b468cdb477053e28b1c698ba08e services/software/Tesseract-OCR/tessdata/eng.traineddata
772
+ 5daba44df897f1c6d67caeb6d0414f7b55625fa1 services/software/Tesseract-OCR/tessdata/eng.user-patterns
773
+ e0c5a630214ac69273e2b54107c62ed171fc50a0 services/software/Tesseract-OCR/tessdata/eng.user-words
774
+ e49b5b86da60f2e728ff2b7f4357692ac32b6a6d services/software/Tesseract-OCR/tessdata/enm.traineddata
775
+ 235fc67adf52f43d34b409d44d426d560aefc8e3 services/software/Tesseract-OCR/tessdata/epo.traineddata
776
+ 27b470378dc8718f1dc5a93931fefa3340336e4d services/software/Tesseract-OCR/tessdata/equ.traineddata
777
+ a2b52c3388358e6dfc4eb8d64d8fc6afbb3630ea services/software/Tesseract-OCR/tessdata/est.traineddata
778
+ 6247f975443ec82c219c39e0b5ea76b4833c82fe services/software/Tesseract-OCR/tessdata/eus.traineddata
779
+ 1b845e73759785908aef57161ae4c86a70cce622 services/software/Tesseract-OCR/tessdata/fao.traineddata
780
+ 1a17ee02076107e73abd15d2038389150c8f824f services/software/Tesseract-OCR/tessdata/fas.traineddata
781
+ 785f80decce6ddb6b50bd99f4840414359c806ff services/software/Tesseract-OCR/tessdata/fil.traineddata
782
+ 73f92402f1891b9066e0e145f245145a2402105c services/software/Tesseract-OCR/tessdata/fin.traineddata
783
+ d9e2b2160be0d1ca3b8f1bf2730fae476ef3b4a6 services/software/Tesseract-OCR/tessdata/fra.traineddata
784
+ d473893bcabcef536ed36480f976fcce482bd87c services/software/Tesseract-OCR/tessdata/frk.traineddata
785
+ ed06039efef821b78f22c86abb6c5aea7f02461e services/software/Tesseract-OCR/tessdata/frm.traineddata
786
+ 17199d2c33e201d6ad4003a6c86db5f8f273ddc1 services/software/Tesseract-OCR/tessdata/fry.traineddata
787
+ e8bae7f1863dd1872ab7d2b2e7f319874c480e60 services/software/Tesseract-OCR/tessdata/gla.traineddata
788
+ a7abc7be9aadc862b31ab7c7bc672051cd0245fb services/software/Tesseract-OCR/tessdata/gle.traineddata
789
+ 7bc00b38f40f8de1575397f7d05387e5fbbacca4 services/software/Tesseract-OCR/tessdata/glg.traineddata
790
+ e94990006fc18e88ab120e7ca6681cc3b290269b services/software/Tesseract-OCR/tessdata/grc.traineddata
791
+ 151b9aad2945e3103118e5d36eee288f631d985a services/software/Tesseract-OCR/tessdata/guj.traineddata
792
+ 30d3baeaeef791781d782e58feb415b25921df3f services/software/Tesseract-OCR/tessdata/hat.traineddata
793
+ 7356caf3cddc9c867fe6727e17726727b8284608 services/software/Tesseract-OCR/tessdata/heb.traineddata
794
+ a8f0aaec09378115b12a2c6287c57695d082aea2 services/software/Tesseract-OCR/tessdata/hin.traineddata
795
+ 6dd4f8638a58eb0663e8f9a80a355c505dcf01a6 services/software/Tesseract-OCR/tessdata/hrv.traineddata
796
+ 5d24fa8e922d6b57853dcb0cc490060c76643cab services/software/Tesseract-OCR/tessdata/hun.traineddata
797
+ ec2e2f3adea785e8964b9771871c44349a6e1b40 services/software/Tesseract-OCR/tessdata/hye.traineddata
798
+ 6eab87ffe818b5f89baa869c458cb0a6dbed6b2d services/software/Tesseract-OCR/tessdata/iku.traineddata
799
+ 3013f50cd2af9aceca00e865ed889144865f0848 services/software/Tesseract-OCR/tessdata/ind.traineddata
800
+ 20d3bdf8cb8f2289a1f45aa9cdf4ddf2a22e7462 services/software/Tesseract-OCR/tessdata/isl.traineddata
801
+ edbffbe0e51892b240630b5eeabededa7e7c9c4f services/software/Tesseract-OCR/tessdata/ita.traineddata
802
+ c8a2c3c3d8c82a2d953b0fc64b949c1aa0918c09 services/software/Tesseract-OCR/tessdata/ita_old.traineddata
803
+ 3155b8184d50af28dbf8dcbd972e26b388ab1581 services/software/Tesseract-OCR/tessdata/jav.traineddata
804
+ 45658654712b88d45c9464286ffc2fcb07036bdf services/software/Tesseract-OCR/tessdata/jaxb-api-2.3.1.jar
805
+ c4178f89991bde90b7fdc647e3e1901868423bd0 services/software/Tesseract-OCR/tessdata/jpn.traineddata
806
+ 43f38defe4b83588876d0d7a6dee928be1b73af0 services/software/Tesseract-OCR/tessdata/jpn_vert.traineddata
807
+ 78252baeed24bcf327e62226c321c60242108a24 services/software/Tesseract-OCR/tessdata/kan.traineddata
808
+ 1a3ae11fdd248891dd3fc74f156a0ce246ec1a15 services/software/Tesseract-OCR/tessdata/kat.traineddata
809
+ f4ae5ab4b3fe4bb3226639d9b23fa71513a40ec8 services/software/Tesseract-OCR/tessdata/kat_old.traineddata
810
+ f889e2b8ffd093d4f2dff8ffca2fa0b73296c028 services/software/Tesseract-OCR/tessdata/kaz.traineddata
811
+ d466dc2a7e35bf90cb7b54364985703728398687 services/software/Tesseract-OCR/tessdata/khm.traineddata
812
+ 3e04f2954f33dd021b95de4befffb68904d9e142 services/software/Tesseract-OCR/tessdata/kir.traineddata
813
+ d1afefb7c5a67e273c6612aba77753021506b557 services/software/Tesseract-OCR/tessdata/kmr.traineddata
814
+ 60986d44497689f3abace0b148199476d93292e1 services/software/Tesseract-OCR/tessdata/kor.traineddata
815
+ 10bd41ae9352889f85a489eb3183eb0cbebc2516 services/software/Tesseract-OCR/tessdata/lao.traineddata
816
+ 30dab6a24339f262d1eb21a3ee272d16c46aeba3 services/software/Tesseract-OCR/tessdata/lat.traineddata
817
+ 71d925c8b6c73980157fd0128412b46e6e8396b5 services/software/Tesseract-OCR/tessdata/lav.traineddata
818
+ af9e2b3cd6a65650206b7d89f1b93b51683b9692 services/software/Tesseract-OCR/tessdata/lit.traineddata
819
+ c1ac5b922bbcad34b2654ba471c0a752c0397404 services/software/Tesseract-OCR/tessdata/ltz.traineddata
820
+ 70e96f02cbc2f26630225112cd323a7f0b6ccdf3 services/software/Tesseract-OCR/tessdata/mal.traineddata
821
+ 79138fadcdb256ec7b59e3bf9df18bd5fb492bee services/software/Tesseract-OCR/tessdata/mar.traineddata
822
+ fb0b245fb9ec61696e818887a70d8413b2914905 services/software/Tesseract-OCR/tessdata/mkd.traineddata
823
+ 4242f9cd016987f16feb06973e988eced9604787 services/software/Tesseract-OCR/tessdata/mlt.traineddata
824
+ 2ef212c519edc66ff2508f48dbe1bb836a4ea274 services/software/Tesseract-OCR/tessdata/mon.traineddata
825
+ eab6b1a98e4b6ed510d6443a5e3d14519da3b338 services/software/Tesseract-OCR/tessdata/mri.traineddata
826
+ f0e2b8bef0a681f09baac99a418529205ee80201 services/software/Tesseract-OCR/tessdata/msa.traineddata
827
+ cf28ddca604dc7f46bc34f2f4c6a193a0706c03b services/software/Tesseract-OCR/tessdata/mya.traineddata
828
+ 948e365b55f9fe8179dde2ff0134feffb210496e services/software/Tesseract-OCR/tessdata/nep.traineddata
829
+ 53ce95a9c2488a9a0228939944a184157373d0ae services/software/Tesseract-OCR/tessdata/nld.traineddata
830
+ 9209df2c9904c127437c07e16c287cdefd024e7c services/software/Tesseract-OCR/tessdata/nor.traineddata
831
+ 4017d4405b09333f22a3de2a4d30cf009bdb4a9b services/software/Tesseract-OCR/tessdata/oci.traineddata
832
+ ae0f9ed13d5c9ad4a4de57c7266c434b83a9f583 services/software/Tesseract-OCR/tessdata/ori.traineddata
833
+ 527457ca8f8fe1fda7c2f88bce3c0e4be12be9d0 services/software/Tesseract-OCR/tessdata/osd.traineddata
834
+ d4f00533a6c76ce4045aa6ad40b39f47eeaa333f services/software/Tesseract-OCR/tessdata/pan.traineddata
835
+ d1472b20ef1aebbf5e11573867e9ac13873681b9 services/software/Tesseract-OCR/tessdata/pdf.ttf
836
+ df84ed5cc8059d640876d3be0ac4c11af0bf0853 services/software/Tesseract-OCR/tessdata/piccolo2d-core-3.0.1.jar
837
+ daf51c0ebbea07291c85cab9bc81b19ef0e99efc services/software/Tesseract-OCR/tessdata/piccolo2d-extras-3.0.1.jar
838
+ 2382f568f0ce0c4c0a7f4380a291255514e5e97f services/software/Tesseract-OCR/tessdata/pol.traineddata
839
+ e9f373e95c66b4bf557c263721ef31f78e5bc301 services/software/Tesseract-OCR/tessdata/por.traineddata
840
+ 220cdf92efdc76a227439c0b8734196af9743b98 services/software/Tesseract-OCR/tessdata/pus.traineddata
841
+ d80c1f308973b3129183843759f23fdcb1c5c2be services/software/Tesseract-OCR/tessdata/que.traineddata
842
+ 04cd2bc7b471431354e9446e973f3472f442e189 services/software/Tesseract-OCR/tessdata/ron.traineddata
843
+ b146cb2263acbc6383f8e92ea0ce759537687bb8 services/software/Tesseract-OCR/tessdata/rus.traineddata
844
+ 3df043f3247fd41a21ac47c3b199bc87643e984b services/software/Tesseract-OCR/tessdata/san.traineddata
845
+ 7ef1100eecc1563f12f847a8c5580b80a2341c5b services/software/Tesseract-OCR/tessdata/script
846
+ 4d4bac05b8be69aafb537d3a753efec6be473953 services/software/Tesseract-OCR/tessdata/script/Arabic.traineddata
847
+ 7e4cf10f1fb571dbce0afea837db15cd11b44f39 services/software/Tesseract-OCR/tessdata/script/Armenian.traineddata
848
+ a1b888e492320fb9b941dbf0d7fe9d767e5f6a42 services/software/Tesseract-OCR/tessdata/script/Bengali.traineddata
849
+ 9ba41b35b6b06892657a61dd33003bc8a0a9483a services/software/Tesseract-OCR/tessdata/script/Canadian_Aboriginal.traineddata
850
+ 94834e6e395e97209c59846dc78320e830f67a12 services/software/Tesseract-OCR/tessdata/script/Cherokee.traineddata
851
+ 1901a7483cccad6c43d1052bb40d754ae53694b4 services/software/Tesseract-OCR/tessdata/script/Cyrillic.traineddata
852
+ 3c33bd676b0ae7a480ec1c1f5ebdd13513aa5433 services/software/Tesseract-OCR/tessdata/script/Devanagari.traineddata
853
+ e6c0944e630c580f4a9d6d4a8ebeaeaca3583164 services/software/Tesseract-OCR/tessdata/script/Ethiopic.traineddata
854
+ 28262227524b894a1f283e8edd2245f11d9e3e9f services/software/Tesseract-OCR/tessdata/script/Fraktur.traineddata
855
+ 77511502fa8dd8d1aec6700b697bdd3cc501a78d services/software/Tesseract-OCR/tessdata/script/Georgian.traineddata
856
+ 0fdbf7f0eb07e1c4a72f580afba84cd85cafc177 services/software/Tesseract-OCR/tessdata/script/Greek.traineddata
857
+ 9f203b6620b479149fe022553278a48032c87f21 services/software/Tesseract-OCR/tessdata/script/Gujarati.traineddata
858
+ 36e1161b20dac2826f80c7e27f753670177116a2 services/software/Tesseract-OCR/tessdata/script/Gurmukhi.traineddata
859
+ 977fd63d7430853e04f49c43400dc576144cfe0e services/software/Tesseract-OCR/tessdata/script/Hangul.traineddata
860
+ 4e421ca8baa936ffad67b6bd78df848bbfb4fa03 services/software/Tesseract-OCR/tessdata/script/Hangul_vert.traineddata
861
+ 41d7386cacc0faf19b381f9bba035cb3bcc7f8f9 services/software/Tesseract-OCR/tessdata/script/HanS.traineddata
862
+ a0464cb0478f089f00cbfa715a15ba5aba5d0e37 services/software/Tesseract-OCR/tessdata/script/HanS_vert.traineddata
863
+ ac8c8e97a2e75db8afd1a843527f350737973435 services/software/Tesseract-OCR/tessdata/script/HanT.traineddata
864
+ 99757fde125138e5d889784d0d9f2edd659defac services/software/Tesseract-OCR/tessdata/script/HanT_vert.traineddata
865
+ 590055a3db20484eb90e6bd1a9223f36b69ea907 services/software/Tesseract-OCR/tessdata/script/Hebrew.traineddata
866
+ 89481f2c257019f1ea58c82b7daaac9688f7b172 services/software/Tesseract-OCR/tessdata/script/Japanese.traineddata
867
+ 5c211c42046ada01847b1628a6f1766826c2a371 services/software/Tesseract-OCR/tessdata/script/Japanese_vert.traineddata
868
+ 238f7a104e604a27b14ca956df2f346f7750099b services/software/Tesseract-OCR/tessdata/script/Kannada.traineddata
869
+ 635b310e6a79c3aac2fe5aa12dd5bcb7718c2e15 services/software/Tesseract-OCR/tessdata/script/Khmer.traineddata
870
+ 0bdf44f32650e6f15ef0491f88dee430994dca62 services/software/Tesseract-OCR/tessdata/script/Lao.traineddata
871
+ 8b6e3a3ae06e6b623b587e9f87c988e169fa1c6b services/software/Tesseract-OCR/tessdata/script/Latin.traineddata
872
+ 9e639ea78e5040c75bce36e1231755901448e4ef services/software/Tesseract-OCR/tessdata/script/Malayalam.traineddata
873
+ 733ebd14f67a5a52211abfc6f66b485a23a8b955 services/software/Tesseract-OCR/tessdata/script/Myanmar.traineddata
874
+ d9ef97617c0914028360f703d810564013542421 services/software/Tesseract-OCR/tessdata/script/Oriya.traineddata
875
+ 98d26bd5f71305d96f947e29d3fcb455ff26bc9f services/software/Tesseract-OCR/tessdata/script/Sinhala.traineddata
876
+ b97923946987070b6ee69ab41d4bc4c87b739001 services/software/Tesseract-OCR/tessdata/script/Syriac.traineddata
877
+ 48fede126ba6e563a69ca10eae3604e42143039f services/software/Tesseract-OCR/tessdata/script/Tamil.traineddata
878
+ 0468e5dc1eee3059191b4ac2d7109a9431ce42c1 services/software/Tesseract-OCR/tessdata/script/Telugu.traineddata
879
+ b13feb9f2af4762a80431e93de11e2e61ae40068 services/software/Tesseract-OCR/tessdata/script/Thaana.traineddata
880
+ 62acc3de815e28c43f764dc7e10e5c8afdfefb20 services/software/Tesseract-OCR/tessdata/script/Thai.traineddata
881
+ 223459ad4ee20b85075e423975aa44edbed190dd services/software/Tesseract-OCR/tessdata/script/Tibetan.traineddata
882
+ 92c69d17eab37670c3ffc0efce3f7918ef1d9468 services/software/Tesseract-OCR/tessdata/script/Vietnamese.traineddata
883
+ fe7fafcfe7e57d1ccd679a0b8a9775e1a821f881 services/software/Tesseract-OCR/tessdata/ScrollView.jar
884
+ d0c8584e78c44666efcd7fbd47940a8a1121550d services/software/Tesseract-OCR/tessdata/sin.traineddata
885
+ ca99e3e82f69a0e16b48cdfec3c4e706758269f2 services/software/Tesseract-OCR/tessdata/slk.traineddata
886
+ 835954e891897d3c8b63db48cb5c2712ef2e6b11 services/software/Tesseract-OCR/tessdata/slv.traineddata
887
+ 1ef6548d22977dc1f236be879dce3a62ac6a47ed services/software/Tesseract-OCR/tessdata/snd.traineddata
888
+ 72e901f13ca52cfe34cf239a368b9ed3c0ddaf26 services/software/Tesseract-OCR/tessdata/spa.traineddata
889
+ 42b281f55736b2f714598accfc2a78f409db1f0c services/software/Tesseract-OCR/tessdata/spa_old.traineddata
890
+ 9624fbf33452a95dd5a0a3a93fe9876108104895 services/software/Tesseract-OCR/tessdata/sqi.traineddata
891
+ 530fb4b1cb27f369bbee7eb0add89bfd73d6f15c services/software/Tesseract-OCR/tessdata/srp.traineddata
892
+ 5f81e591adad58a179a2d371aacccaf0801f93a2 services/software/Tesseract-OCR/tessdata/srp_latn.traineddata
893
+ 894891425c1fe302ce1d8f115a3c00967c6c2832 services/software/Tesseract-OCR/tessdata/sun.traineddata
894
+ 633d73b35869600452eec58dcd9036cc702c3e48 services/software/Tesseract-OCR/tessdata/swa.traineddata
895
+ 684e1fa66e4a55b983febf5f9ed04f26ad946e59 services/software/Tesseract-OCR/tessdata/swe.traineddata
896
+ 462aefc8a1485ae4c38db82f7f50fd105bf30195 services/software/Tesseract-OCR/tessdata/syr.traineddata
897
+ fa1793d68f9aba8bf191e8ff1036e2271d288e44 services/software/Tesseract-OCR/tessdata/tam.traineddata
898
+ 9485ca27d48bb161a47584f8381420462ef6fa27 services/software/Tesseract-OCR/tessdata/tat.traineddata
899
+ ee8a33b0f658fc75b8cbfe8c10413eac4f41e6ad services/software/Tesseract-OCR/tessdata/tel.traineddata
900
+ 51fe80ee88432b91fe829ac8d1f665e649722316 services/software/Tesseract-OCR/tessdata/tessconfigs
901
+ a681e4a443fa21ce6f32bbcf0334af3433888566 services/software/Tesseract-OCR/tessdata/tessconfigs/batch
902
+ ebaab9438e309b4dfdfd8428676170ab2b64a858 services/software/Tesseract-OCR/tessdata/tessconfigs/batch.nochop
903
+ c34567be7565d519806076b795fceff9fdad1477 services/software/Tesseract-OCR/tessdata/tessconfigs/matdemo
904
+ 9c1184a0c84bde5f58ea74a1f316af9eb2574b52 services/software/Tesseract-OCR/tessdata/tessconfigs/msdemo
905
+ 8b137891791fe96927ad78e64b0aad7bded08bdc services/software/Tesseract-OCR/tessdata/tessconfigs/nobatch
906
+ eaff69f54b9ed62d49987634a5fba2c79cccf3cf services/software/Tesseract-OCR/tessdata/tessconfigs/segdemo
907
+ 044766728ce9cb2cc73976175b970a4cea9a870a services/software/Tesseract-OCR/tessdata/tgk.traineddata
908
+ ea28de3985668cac00d261c5b91f023ea66e19cd services/software/Tesseract-OCR/tessdata/tha.traineddata
909
+ 55e62eb0297e07360db5e9dc5dd86aab8e0a1e9c services/software/Tesseract-OCR/tessdata/tir.traineddata
910
+ 9eff0fd002798089f5f7d8307be968a36f1ce433 services/software/Tesseract-OCR/tessdata/ton.traineddata
911
+ 1f0b331ef29f50ceb7c44da58e38c7ec42314d0a services/software/Tesseract-OCR/tessdata/tur.traineddata
912
+ 36124d6b0ed1c2654a13551203c25b44b4013978 services/software/Tesseract-OCR/tessdata/uig.traineddata
913
+ d02cf90b2911a3da66dac6ae380bcefb18dd7663 services/software/Tesseract-OCR/tessdata/ukr.traineddata
914
+ 715a159d4abea25294c82971be28be215b3d1c4a services/software/Tesseract-OCR/tessdata/urd.traineddata
915
+ 109abc765273b2c9eabd55781f0a619320c80007 services/software/Tesseract-OCR/tessdata/uzb.traineddata
916
+ c2ff8b9c282a9712b5f24970927377bc18dea7cf services/software/Tesseract-OCR/tessdata/uzb_cyrl.traineddata
917
+ e54a5912fb634c581c4a45ae9f37cbc021ec7140 services/software/Tesseract-OCR/tessdata/vie.traineddata
918
+ 6349588bbabf99f8a812e8231c98c015ea7b60c6 services/software/Tesseract-OCR/tessdata/yid.traineddata
919
+ 3e0cd582f65f17844039173057dfc015bf19f61d services/software/Tesseract-OCR/tessdata/yor.traineddata
920
+ eb39a979891e62373073aa012d1e722eccf53679 services/software/Tesseract-OCR/tesseract.1.html
921
+ 1b8266d099b65455e5d028794f27e0c97c56a410 services/software/Tesseract-OCR/tesseract.exe
922
+ f9a8aaca808fb84974a69db7058d39dfd6143940 services/software/Tesseract-OCR/tesseract-uninstall.exe
923
+ dabfda7747f42b0bf5a77f497f63cd9bcb24bac7 services/software/Tesseract-OCR/text2image.1.html
924
+ 5dec420773690de9c9ec1b5ef749bb697aad107a services/software/Tesseract-OCR/text2image.exe
925
+ d939cf54b047a0089add0e711657282ee6a97ae4 services/software/Tesseract-OCR/unicharambigs.5.html
926
+ 3f0f72aee992bbf1f8a364c9bc8607bbd66a2891 services/software/Tesseract-OCR/unicharset.5.html
927
+ efbeabdaf5aa4aedf38e5def2fff26789bb05f4f services/software/Tesseract-OCR/unicharset_extractor.1.html
928
+ 22f28c9f4aec70a28b30276337eb5368c4939cb2 services/software/Tesseract-OCR/unicharset_extractor.exe
929
+ 428e40e914e1fd615ecd931333cb2d192c060499 services/software/Tesseract-OCR/winpath.exe
930
+ 7503ef471c8cb9e9fe9af50012737f035df4ea03 services/software/Tesseract-OCR/wordlist2dawg.1.html
931
+ 5e9c230a56297f6f5d7834028f4f4af6d97c2a27 services/software/Tesseract-OCR/wordlist2dawg.exe
932
+ 93c94c53ea14cc76fb6d313835ccef795c154209 services/software/Tesseract-OCR/zlib1.dll
933
+ 74576a17b24af3b3461b3cf366bffc72b8af2247 services/tools
934
+ c060f8c47950ea007ef82d25341f6a236e690b1c services/tools/__init__.py
935
+ 1ab5b944403cc0b3f268e9ce08dbcbd7fcb37883 services/tools/profile_scoring.py
936
+ 3f523c2a536282d053c95a2f8149cb6f3d6d7fc7 services/uploader
937
+ e4cb1c1d046ce257dd41421a9529c2b5e972e5b7 services/uploader/azure_blob_service.py
938
+ 3df5871d164cfdc5e82242c3c431196d889d1fb6 utils
939
+ a333c68fbc8680eb129aff6ae6a77b5fefc71b45 utils/__init__.py
940
+ d53923b95ed7e11ca362be122da89b3bc03d061d utils/decorator.py
941
+ 9d0a562984f25046ddc3379aca73c1115d8fb528 utils/jwt.py
942
+ 41d27a764c6b8a814c28f9e4812f669397450dd6 utils/logger.py
943
+ da25f0b2a8b1d7ad1d4b2334b673b20b378d5788 utils/security.py
944
+ a8682aeeeac3e667bd5150cbe6d18e069999f4f5 utils/utils.py
945
+ 7ae84070d708061792beddf97a92f5daeaf97ea3 uv.lock
config/__init__.py ADDED
File without changes
config/config.yaml ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Environment
2
+ stage:
3
+ active: dev # choose one of dev | uat | prd
4
+
5
+ # Observability
6
+ langfuse:
7
+ is_active: false
8
+
9
+ # Prefix blob folder
10
+ blob:
11
+ prefix: dev/cv
12
+
13
+ llm:
14
+ default: "gpt-4o"
15
+
16
+
17
+ # "[dev|uat|prd]_[tenant_id]_[kb|caching|data_info]"
18
+ azure_search_index_name_template: "{stage}__{tenant_id}__{purpose}"
config/constant.py ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ from dataclasses import dataclass, field
3
+ from dotenv import load_dotenv
4
+ from typing import List
5
+ from config.env_constant import EnvFilepath
6
+ load_dotenv(EnvFilepath.ENVPATH)
7
+
8
+
9
+ @dataclass
10
+ class EnvPostgresConstants:
11
+ CONSTRING: str = os.environ.get("ss--postgresql--url")
12
+
13
+ @dataclass(frozen=True)
14
+ class SecurityConstants:
15
+ BCRYPT_MAX_BYTES: int = 72
16
+ JWT_SECRET_KEY: str = os.environ.get("ss--jwt--secret-key")
17
+ JWT_ALGORITHM: str = os.environ.get("ss--jwt--algorithm")
18
+ JWT_EXPIRE_MINUTES: int = int(os.environ.get("ss--jwt--access-token-expire-minutes", 60))
19
+
20
+ @dataclass(frozen=True)
21
+ class AzureBlobConstants:
22
+ BLOB_PREFIX: str = "dev" # DOCS: change accordingly
23
+ ENDPOINT: str = os.environ.get("azureai--container--endpoint")
24
+ CONTAINER_NAME: str = os.environ.get("azureai--container--name")
25
+ SAS_KEY: str = os.environ.get("azureai--search--sas")
26
+ MAX_FILE_SIZE_MB: int = int(os.getenv("azureai--max-file-size-mb", "5"))
27
+ CHUNK_SIZE: int = 4 * 1024 * 1024
28
+ ACCOUNT_NAME: str = os.environ.get("azureai--container--account--name")
29
+
30
+ @dataclass
31
+ class ProfileFieldTypes:
32
+ NUMERIC: List[str] = field(default_factory=lambda: ["gpa_edu_1", "gpa_edu_2", "gpa_edu_3", "yoe"])
33
+ TEXT: List[str] = field(default_factory=lambda: ["univ_edu_1", "major_edu_1",
34
+ "univ_edu_2", "major_edu_2",
35
+ "univ_edu_3", "major_edu_3",
36
+ "domicile",
37
+ "hardskills", "softskills", "certifications", "business_domain"])
38
+ ProfileFieldTypes = ProfileFieldTypes()
config/env_constant.py ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ from dataclasses import dataclass
2
+
3
+ @dataclass
4
+ class EnvFilepath:
5
+ ENVPATH: str = ".env" # DOCS: change in uat or prod environment!
config/get_config.py ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pytz
2
+ from sqlalchemy import func
3
+
4
+
5
+ class Config:
6
+
7
+ @property
8
+ def tzinfo(self):
9
+ tzinfo = pytz.timezone('Asia/Jakarta')
10
+ return tzinfo
11
+
12
+
13
+ @property
14
+ def JAKARTA_NOW(self):
15
+ return func.timezone("Asia/Jakarta", func.now())
16
+
17
+
18
+
19
+ master_config = Config()
externals/__init__.py ADDED
File without changes
externals/databases/__init__.py ADDED
File without changes
externals/databases/_pg_tables.py ADDED
@@ -0,0 +1,104 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # CREATE TABLES
2
+ query_create_cv_raw = """
3
+ CREATE TABLE cv_raw (
4
+ filename TEXT NOT NULL UNIQUE,
5
+ profile_id SERIAL PRIMARY KEY,
6
+ file_content BYTEA NOT NULL,
7
+ is_extracted BOOLEAN DEFAULT FALSE,
8
+ created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
9
+ );
10
+ """
11
+
12
+ alter_table_cv_raw_add_is_extracted = """
13
+ ALTER TABLE cv_raw
14
+ ADD COLUMN is_extracted BOOLEAN DEFAULT FALSE;"""
15
+
16
+ query_create_cv_profile_extracted = """
17
+ CREATE TABLE cv_profile_extracted (
18
+ fullname VARCHAR(100) NOT NULL,
19
+ profile_id SERIAL PRIMARY KEY,
20
+
21
+ gpa_edu_1 DECIMAL(4,2),
22
+ gpa_edu_2 DECIMAL(4,2),
23
+ gpa_edu_3 DECIMAL(4,2),
24
+
25
+ univ_edu_1 varchar(100),
26
+ univ_edu_2 varchar(100),
27
+ univ_edu_3 varchar(100),
28
+
29
+ major_edu_1 varchar(100),
30
+ major_edu_2 varchar(100),
31
+ major_edu_3 varchar(100),
32
+
33
+ domicile TEXT,
34
+ yoe DECIMAL(3,1),
35
+ hardskills TEXT,
36
+ softskills TEXT,
37
+ certifications TEXT,
38
+ business_domain TEXT,
39
+ created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
40
+ CONSTRAINT fk_profile_extracted
41
+ FOREIGN KEY (profile_id)
42
+ REFERENCES cv_raw (profile_id)
43
+ ON DELETE CASCADE
44
+ );
45
+ """
46
+
47
+ query_create_cv_profile_norm = """
48
+ CREATE TABLE cv_profile_norm (
49
+ fullname VARCHAR(100) NOT NULL,
50
+ profile_id SERIAL PRIMARY KEY,
51
+
52
+ gpa_edu_1 DECIMAL(4,2),
53
+ gpa_edu_2 DECIMAL(4,2),
54
+ gpa_edu_3 DECIMAL(4,2),
55
+
56
+ univ_edu_1 varchar(100),
57
+ univ_edu_2 varchar(100),
58
+ univ_edu_3 varchar(100),
59
+
60
+ major_edu_1 varchar(100),
61
+ major_edu_2 varchar(100),
62
+ major_edu_3 varchar(100),
63
+
64
+ domicile TEXT,
65
+ yoe DECIMAL(3,1),
66
+ hardskills TEXT,
67
+ softskills TEXT,
68
+ certifications TEXT,
69
+ business_domain TEXT,
70
+ created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
71
+ CONSTRAINT fk_profile_norm
72
+ FOREIGN KEY (profile_id)
73
+ REFERENCES cv_profile_extracted (profile_id)
74
+ ON DELETE CASCADE
75
+ );
76
+ """
77
+
78
+ # DROP TABLES
79
+ query_drop_cv_raw = "drop table cv_raw cascade"
80
+ query_drop_cv_profile_extracted = "drop table cv_profile_extracted cascade"
81
+ query_drop_cv_profile_norm = "drop table cv_profile_norm cascade"
82
+
83
+
84
+ # OPERATIONS
85
+ q_creates = [query_create_cv_raw, query_create_cv_profile_extracted, query_create_cv_profile_norm]
86
+ q_drops = [
87
+ # query_drop_cv_raw,
88
+ query_drop_cv_profile_extracted, query_drop_cv_profile_norm]
89
+
90
+ from externals.databases._pgdb import execute_query
91
+
92
+ async def get_create_queries():
93
+ for q in q_creates:
94
+ await execute_query(q)
95
+
96
+ async def get_drop_queries():
97
+ for q in q_drops:
98
+ await execute_query(q)
99
+
100
+
101
+ if __name__ == "__main__":
102
+ import asyncio
103
+ # asyncio.run(get_drop_queries())
104
+ asyncio.run(get_create_queries())
externals/databases/_pgdb.py ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # import os
2
+ # import dotenv
3
+ # dotenv.load_dotenv()
4
+ # import asyncpg
5
+ # # from datetime import datetime
6
+
7
+ # async def fetch_data(query:str):
8
+ # try:
9
+ # conn = await asyncpg.connect(user=os.environ.get("causalogy--pg--user"),
10
+ # password=os.environ.get("causalogy--pg--password"),
11
+ # database=os.environ.get("causalogy--pg--name"),
12
+ # host=os.environ.get("causalogy--pg--host"),
13
+ # port=os.environ.get("causalogy--pg--port"))
14
+ # values = await conn.fetch(query)
15
+ # print(f"""✅ Fetching data succeeded!""")
16
+ # return values
17
+ # except Exception as E:
18
+ # print(f"""❌ Error when Fetching data, {E}""")
19
+ # finally:
20
+ # await conn.close()
21
+
22
+
23
+ # async def execute_query(query:str):
24
+ # try:
25
+ # conn = await asyncpg.connect(user=os.environ.get("causalogy--pg--user"),
26
+ # password=os.environ.get("causalogy--pg--password"),
27
+ # database=os.environ.get("causalogy--pg--name"),
28
+ # host=os.environ.get("causalogy--pg--host"),
29
+ # port=os.environ.get("causalogy--pg--port"))
30
+ # values = await conn.execute(query)
31
+ # print(f"""✅ Executing query succeeded!""")
32
+ # return True
33
+ # except Exception as E:
34
+ # print(f"""❌ Error when Executing query, {E}""")
35
+ # return False
36
+ # finally:
37
+ # await conn.close()
38
+
39
+
40
+ # async def execute_insert_binary(filename: str, file_content: bytes, query:str="""INSERT INTO cv_raw (filename, file_content) VALUES ($1, $2);"""):
41
+ # conn = None
42
+ # try:
43
+ # conn = await asyncpg.connect(
44
+ # user=os.environ.get("causalogy--pg--user"),
45
+ # password=os.environ.get("causalogy--pg--password"),
46
+ # database=os.environ.get("causalogy--pg--name"),
47
+ # host=os.environ.get("causalogy--pg--host"),
48
+ # port=os.environ.get("causalogy--pg--port")
49
+ # )
50
+ # await conn.execute(query, filename, file_content)
51
+ # print(f"✅ Successfully inserted {filename} into cv_raw")
52
+ # except Exception as E:
53
+ # print(f"❌ Error when executing insert: {E}")
54
+ # finally:
55
+ # if conn:
56
+ # await conn.close()
externals/databases/database.py ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import dotenv
3
+
4
+ from config.constant import EnvPostgresConstants, EnvFilepath
5
+ dotenv.load_dotenv(EnvFilepath.ENVPATH)
6
+
7
+ from contextlib import asynccontextmanager
8
+ from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker, AsyncSession
9
+ from sqlalchemy.orm import declarative_base
10
+
11
+ DATABASE_URL = EnvPostgresConstants.CONSTRING.\
12
+ replace("postgresql+psycopg2", "postgresql+asyncpg")
13
+
14
+ engine = create_async_engine(
15
+ DATABASE_URL,
16
+ echo=False,
17
+ future=True
18
+ )
19
+
20
+ AsyncSessionLocal = async_sessionmaker(
21
+ engine,
22
+ expire_on_commit=False,
23
+ class_=AsyncSession
24
+ )
25
+
26
+ Base = declarative_base()
27
+
28
+ # async def get_db():
29
+ # async with AsyncSessionLocal() as session:
30
+ # try:
31
+ # return session
32
+ # finally:
33
+ # await session.close()
34
+
35
+ async def get_db():
36
+ async with AsyncSessionLocal() as session:
37
+ try:
38
+ yield session
39
+ finally:
40
+ await session.close()
41
+
42
+ # async def get_db_session():
43
+ # session = AsyncSessionLocal()
44
+ # try:
45
+ # return session
46
+ # except:
47
+ # await session.close()
48
+ # raise
49
+
50
+
51
+ @asynccontextmanager
52
+ async def db_session():
53
+ async with AsyncSessionLocal() as session:
54
+ try:
55
+ yield session
56
+ finally:
57
+ await session.close()
externals/databases/pg_crud.py ADDED
@@ -0,0 +1,473 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from typing import Optional, List
2
+ from uuid import UUID
3
+
4
+ from sqlalchemy import select, and_, update, delete
5
+ from sqlalchemy.ext.asyncio import AsyncSession
6
+ from externals.databases.pg_models import (
7
+ CVUser,
8
+ CVTenant,
9
+ CVFile,
10
+ CVProfile,
11
+ CVFilter,
12
+ CVWeight,
13
+ CVMatching,
14
+ CVScore,
15
+ )
16
+
17
+ # =========================
18
+ # USER
19
+ # =========================
20
+ from externals.databases.schemas.user import UserCreate, UserResponse
21
+ from utils.security import hash_password
22
+
23
+ async def get_user_by_username(
24
+ db: AsyncSession,
25
+ username: str,
26
+ ) -> CVUser | None:
27
+ result = await db.execute(
28
+ select(CVUser).where(CVUser.username == username)
29
+ )
30
+ return result.scalar_one_or_none()
31
+
32
+
33
+ async def create_user(
34
+ db: AsyncSession,
35
+ user_in: UserCreate,
36
+ ) -> CVUser:
37
+ # ✅ CONVERT Pydantic → ORM
38
+ user = CVUser(
39
+ username=user_in.username,
40
+ hashed_password=hash_password(user_in.password),
41
+ email=user_in.email,
42
+ full_name=user_in.full_name,
43
+ role=user_in.role,
44
+ is_active=True,
45
+ tenant_id=user_in.tenant_id,
46
+ notes=user_in.notes,
47
+ )
48
+
49
+ db.add(user) # ✅ ORM
50
+ await db.commit()
51
+ await db.refresh(user)
52
+
53
+ return user
54
+
55
+ async def deactivate_user(
56
+ db: AsyncSession,
57
+ username: str,
58
+ ) -> CVUser | None:
59
+ result = await db.execute(
60
+ select(CVUser).where(CVUser.username == username)
61
+ )
62
+ user = result.scalar_one_or_none()
63
+
64
+ if not user:
65
+ return None
66
+
67
+ user.is_active = False
68
+ await db.commit()
69
+ await db.refresh(user)
70
+
71
+ return user
72
+
73
+
74
+ async def get_user_by_email(db, email: str):
75
+ result = await db.execute(
76
+ select(CVUser).where(CVUser.email == email)
77
+ )
78
+ return result.scalar_one_or_none()
79
+
80
+
81
+ async def get_user_by_id(db, user_id: str):
82
+ result = await db.execute(
83
+ select(CVUser).where(CVUser.user_id == user_id)
84
+ )
85
+ return result.scalar_one_or_none()
86
+
87
+
88
+ # =========================
89
+ # TENANT
90
+ # =========================
91
+ from externals.databases.schemas.tenant import TenantCreate
92
+
93
+ async def get_tenant_by_name(
94
+ db: AsyncSession,
95
+ tenant_name: str,
96
+ ) -> CVTenant | None:
97
+ result = await db.execute(
98
+ select(CVTenant).where(CVTenant.tenant_name == tenant_name)
99
+ )
100
+ return result.scalar_one_or_none()
101
+
102
+
103
+ async def create_tenant(
104
+ db: AsyncSession,
105
+ tenant_in: TenantCreate,
106
+ ) -> CVTenant:
107
+ # ✅ CONVERT Pydantic → ORM
108
+ tenant = CVTenant(
109
+ tenant_name=tenant_in.tenant_name,
110
+ notes=tenant_in.notes,
111
+ )
112
+
113
+ db.add(tenant) # ✅ ORM
114
+ await db.commit()
115
+ await db.refresh(tenant)
116
+
117
+ return tenant
118
+
119
+
120
+ # =========================
121
+ # FILE
122
+ # =========================
123
+
124
+ # async def get_file_by_filename(
125
+ # db: AsyncSession,
126
+ # filename: str,
127
+ # ) -> Optional[CVFile]:
128
+ # stmt = select(CVFile).where(CVFile.filename == filename)
129
+ # result = await db.execute(stmt)
130
+ # return result.scalar_one_or_none()
131
+
132
+
133
+ async def mark_file_extracted(
134
+ db: AsyncSession,
135
+ file_id: UUID,
136
+ ) -> None:
137
+ stmt = (
138
+ update(CVFile)
139
+ .where(CVFile.file_id == file_id)
140
+ .values(is_extracted=True)
141
+ )
142
+ await db.execute(stmt)
143
+ await db.commit()
144
+
145
+
146
+ async def create_cv_file(
147
+ db: AsyncSession,
148
+ *,
149
+ user_id: str,
150
+ filename: str,
151
+ file_type: str,
152
+ url: str,
153
+ ):
154
+ cv_file = CVFile(
155
+ filename=filename,
156
+ file_type=file_type,
157
+ url=url,
158
+ is_extracted=False,
159
+ user_id=user_id,
160
+ )
161
+
162
+ db.add(cv_file)
163
+ await db.commit()
164
+ await db.refresh(cv_file)
165
+
166
+ return cv_file
167
+
168
+
169
+ async def delete_file_by_filename(
170
+ db: AsyncSession,
171
+ filename: str,
172
+ ) -> bool:
173
+ stmt = delete(CVFile).where(CVFile.filename == filename)
174
+ result = await db.execute(stmt)
175
+ await db.commit()
176
+ return result.rowcount > 0
177
+
178
+ async def get_file_by_user_id(
179
+ db: AsyncSession,
180
+ user_id: str,
181
+ ) -> CVFile | None:
182
+ result = await db.execute(
183
+ select(CVFile).where(CVFile.user_id == user_id)
184
+ )
185
+ return result.scalars().all()
186
+
187
+ async def get_file_by_filename(
188
+ db: AsyncSession,
189
+ filename: str,
190
+ user_id: UUID,
191
+ ) -> CVFile | None:
192
+
193
+ result = await db.execute(
194
+ select(CVFile)
195
+ .where(
196
+ CVFile.filename == filename,
197
+ CVFile.user_id == user_id,
198
+ )
199
+ )
200
+ return result.scalar_one_or_none()
201
+
202
+
203
+ async def mark_file_extracted(db: AsyncSession, file_id: UUID):
204
+ await db.execute(
205
+ update(CVFile)
206
+ .where(CVFile.file_id == file_id)
207
+ .values(is_extracted=True)
208
+ )
209
+
210
+ # =========================
211
+ # PROFILE
212
+ # =========================
213
+
214
+ # async def create_profile(
215
+ # db: AsyncSession,
216
+ # profile: CVProfile,
217
+ # ) -> CVProfile:
218
+ # db.add(profile)
219
+ # await db.commit()
220
+ # await db.refresh(profile)
221
+ # return profile
222
+
223
+ from services.models.data_model import AIProfile
224
+
225
+ async def create_profile(
226
+ db: AsyncSession,
227
+ filename: str,
228
+ file_id: str,
229
+ profile: AIProfile,
230
+ ) -> CVProfile:
231
+
232
+ profile = CVProfile(
233
+ fullname=profile.get("fullname"),
234
+ gpa_edu_1=profile.get("gpa_edu_1", None),
235
+ univ_edu_1=profile.get("univ_edu_1", None),
236
+ major_edu_1=profile.get("major_edu_1", None),
237
+
238
+ gpa_edu_2=profile.get("gpa_edu_2", None),
239
+ univ_edu_2=profile.get("univ_edu_2", None),
240
+ major_edu_2=profile.get("major_edu_2", None),
241
+ gpa_edu_3=profile.get("gpa_edu_3", None),
242
+ univ_edu_3=profile.get("univ_edu_3", None),
243
+ major_edu_3=profile.get("major_edu_3", None),
244
+
245
+ domicile=profile.get("domicile", None),
246
+ yoe=profile.get("yoe", None),
247
+
248
+ hardskills=profile.get("hardskills", []),
249
+ softskills=profile.get("softskills", []),
250
+ certifications=profile.get("certifications", []),
251
+ business_domain=profile.get("business_domain", []),
252
+
253
+ filename=filename,
254
+ file_id=file_id,
255
+ )
256
+
257
+ db.add(profile)
258
+ await db.flush()
259
+ return profile
260
+
261
+
262
+ async def get_profile_by_filename(
263
+ db: AsyncSession,
264
+ filename: str,
265
+ ) -> Optional[CVProfile]:
266
+ stmt = select(CVProfile).where(CVProfile.filename == filename)
267
+ result = await db.execute(stmt)
268
+ return result.scalar_one_or_none()
269
+
270
+
271
+ async def get_profile_by_id(
272
+ db: AsyncSession,
273
+ profile_id: str,
274
+ ) -> Optional[CVProfile]:
275
+ stmt = select(CVProfile).where(CVProfile.profile_id == profile_id)
276
+ result = await db.execute(stmt)
277
+ return result.scalar_one_or_none()
278
+
279
+
280
+ async def list_profiles(
281
+ db: AsyncSession,
282
+ limit: int = 50,
283
+ offset: int = 0,
284
+ ) -> List[CVProfile]:
285
+ stmt = select(CVProfile).limit(limit).offset(offset)
286
+ result = await db.execute(stmt)
287
+ return result.scalars().all()
288
+
289
+
290
+ # =========================
291
+ # FILTER & WEIGHT
292
+ # =========================
293
+ from sqlalchemy import select, and_
294
+ from sqlalchemy.ext.asyncio import AsyncSession
295
+
296
+ async def get_filter(
297
+ db: AsyncSession,
298
+ filter: CVFilter,
299
+ ):
300
+ conditions = []
301
+
302
+ # --- GPA ---
303
+ if filter.gpa_edu_1 is not None:
304
+ conditions.append(CVFilter.gpa_edu_1 >= filter.gpa_edu_1)
305
+ if filter.gpa_edu_2 is not None:
306
+ conditions.append(CVFilter.gpa_edu_2 >= filter.gpa_edu_2)
307
+ if filter.gpa_edu_3 is not None:
308
+ conditions.append(CVFilter.gpa_edu_3 >= filter.gpa_edu_3)
309
+
310
+ # --- University ---
311
+ if filter.univ_edu_1:
312
+ conditions.append(CVFilter.univ_edu_1 == filter.univ_edu_1)
313
+ if filter.univ_edu_2:
314
+ conditions.append(CVFilter.univ_edu_2 == filter.univ_edu_2)
315
+ if filter.univ_edu_3:
316
+ conditions.append(CVFilter.univ_edu_3 == filter.univ_edu_3)
317
+
318
+ # --- Major ---
319
+ if filter.major_edu_1:
320
+ conditions.append(CVFilter.major_edu_1 == filter.major_edu_1)
321
+ if filter.major_edu_2:
322
+ conditions.append(CVFilter.major_edu_2 == filter.major_edu_2)
323
+ if filter.major_edu_3:
324
+ conditions.append(CVFilter.major_edu_3 == filter.major_edu_3)
325
+
326
+ # --- Others ---
327
+ if filter.domicile:
328
+ conditions.append(CVFilter.domicile == filter.domicile)
329
+
330
+ if filter.yoe is not None:
331
+ conditions.append(CVFilter.yoe >= filter.yoe)
332
+
333
+ # --- ARRAY fields (exact match) ---
334
+ if filter.hardskills:
335
+ conditions.append(CVFilter.hardskills == filter.hardskills)
336
+
337
+ if filter.softskills:
338
+ conditions.append(CVFilter.softskills == filter.softskills)
339
+
340
+ if filter.certifications:
341
+ conditions.append(CVFilter.certifications == filter.certifications)
342
+
343
+ if filter.business_domain:
344
+ conditions.append(CVFilter.business_domain == filter.business_domain)
345
+
346
+ # ⛔ Prevent full table scan
347
+ if not conditions:
348
+ return None
349
+
350
+ stmt = select(CVFilter).where(and_(*conditions))
351
+ result = await db.execute(stmt)
352
+
353
+ return result.scalar_one_or_none()
354
+
355
+
356
+ async def get_filter_by_id(
357
+ db: AsyncSession,
358
+ criteria_id: str,
359
+ ) -> Optional[CVFilter]:
360
+ stmt = select(CVFilter).where(CVFilter.criteria_id == criteria_id)
361
+ result = await db.execute(stmt)
362
+ return result.scalar_one_or_none()
363
+
364
+
365
+
366
+ async def create_filter(
367
+ db: AsyncSession,
368
+ filter: CVFilter,
369
+ ):
370
+ db.add(filter)
371
+ await db.commit()
372
+ return filter
373
+
374
+
375
+ async def get_filter_and_weight(
376
+ db: AsyncSession,
377
+ criteria_id: str,
378
+ ):
379
+ stmt = (
380
+ select(CVFilter, CVWeight)
381
+ .join(CVWeight, CVFilter.criteria_id == CVWeight.criteria_id)
382
+ .where(CVFilter.criteria_id == criteria_id)
383
+ )
384
+ result = await db.execute(stmt)
385
+ return result.first()
386
+
387
+
388
+ async def get_weight_by_id(
389
+ db: AsyncSession,
390
+ weight_id: str,
391
+ ):
392
+ stmt = (
393
+ select(CVWeight)
394
+ .where(CVFilter.weight_id == weight_id)
395
+ )
396
+ result = await db.execute(stmt)
397
+ return result.first()
398
+
399
+
400
+ async def create_filter_and_weight(
401
+ db: AsyncSession,
402
+ cv_filter: CVFilter,
403
+ cv_weight: CVWeight,
404
+ ):
405
+ db.add_all([cv_filter, cv_weight])
406
+ await db.commit()
407
+
408
+ async def create_weight(
409
+ db: AsyncSession,
410
+ cv_weight: CVWeight,
411
+ ):
412
+ db.add(cv_weight)
413
+ await db.commit()
414
+
415
+
416
+ # =========================
417
+ # MATCHING
418
+ # =========================
419
+
420
+ async def create_matching(
421
+ db: AsyncSession,
422
+ matching: CVMatching,
423
+ ) -> CVMatching:
424
+ db.add(matching)
425
+ await db.commit()
426
+ await db.refresh(matching)
427
+ return matching
428
+
429
+
430
+ async def get_matching_by_profile_and_criteria(
431
+ db: AsyncSession,
432
+ profile_id: str,
433
+ criteria_id: str,
434
+ ) -> Optional[CVMatching]:
435
+ stmt = (
436
+ select(CVMatching)
437
+ .where(
438
+ and_(
439
+ CVMatching.profile_id == profile_id,
440
+ CVMatching.criteria_id == criteria_id,
441
+ )
442
+ )
443
+ )
444
+ result = await db.execute(stmt)
445
+ return result.scalar_one_or_none()
446
+
447
+
448
+ # =========================
449
+ # SCORE
450
+ # =========================
451
+
452
+ async def create_score(
453
+ db: AsyncSession,
454
+ score: CVScore,
455
+ ) -> CVScore:
456
+ db.add(score)
457
+ await db.commit()
458
+ await db.refresh(score)
459
+ return score
460
+
461
+
462
+ async def get_scores_by_criteria(
463
+ db: AsyncSession,
464
+ criteria_id: str,
465
+ ) -> List[CVScore]:
466
+ stmt = (
467
+ select(CVScore)
468
+ .join(CVMatching, CVScore.matching_id == CVMatching.matching_id)
469
+ .where(CVMatching.criteria_id == criteria_id)
470
+ .order_by(CVScore.score.desc())
471
+ )
472
+ result = await db.execute(stmt)
473
+ return result.scalars().all()
externals/databases/pg_models.py ADDED
@@ -0,0 +1,169 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from config.get_config import master_config
2
+ from sqlalchemy import Column, String, Integer, TIMESTAMP, func
3
+ from sqlalchemy.dialects.postgresql import UUID, ARRAY, DOUBLE_PRECISION, BOOLEAN
4
+ from sqlalchemy.orm import declarative_base
5
+
6
+
7
+ Base = declarative_base()
8
+
9
+ class CVUser(Base):
10
+ __tablename__ = "cv_user"
11
+
12
+ user_id = Column(UUID(as_uuid=True), primary_key=True, server_default=func.uuid_generate_v4())
13
+ username = Column(String, nullable=False, unique=True)
14
+ hashed_password = Column(String, nullable=False)
15
+ email = Column(String, nullable=False, unique=True)
16
+ full_name = Column(String, nullable=False)
17
+ role = Column(String, nullable=False)
18
+ is_active = Column(BOOLEAN, nullable=False)
19
+ tenant_id = Column(UUID(as_uuid=True), primary_key=False)
20
+ created_at = Column(TIMESTAMP(timezone=True), server_default=master_config.JAKARTA_NOW)
21
+ date_modified = Column(TIMESTAMP(timezone=True), server_default=master_config.JAKARTA_NOW)
22
+ notes = Column(String)
23
+
24
+ class CVTenant(Base):
25
+ __tablename__ = "cv_tenant"
26
+
27
+ tenant_id = Column(UUID(as_uuid=True), primary_key=True, server_default=func.uuid_generate_v4())
28
+ tenant_name = Column(String, nullable=False, unique=True)
29
+ created_at = Column(TIMESTAMP(timezone=True), server_default=master_config.JAKARTA_NOW)
30
+ date_modified = Column(TIMESTAMP(timezone=True), server_default=master_config.JAKARTA_NOW)
31
+ notes = Column(String)
32
+
33
+ class CVFile(Base):
34
+ __tablename__ = "cv_file"
35
+ file_id = Column(UUID(as_uuid=True), primary_key=True, server_default=func.uuid_generate_v4())
36
+ user_id = Column(UUID(as_uuid=True), nullable=False)
37
+ file_type = Column(String, nullable=False)
38
+ filename = Column(String, nullable=False)
39
+ url = Column(String, nullable=False)
40
+ is_extracted = Column(BOOLEAN, nullable=False)
41
+ uploaded_at = Column(TIMESTAMP(timezone=True), server_default=master_config.JAKARTA_NOW)
42
+ date_modified = Column(TIMESTAMP(timezone=True), server_default=master_config.JAKARTA_NOW)
43
+
44
+ class CVProfile(Base):
45
+ __tablename__ = "cv_profile"
46
+
47
+ profile_id = Column(UUID(as_uuid=True), primary_key=True, server_default=func.uuid_generate_v4())
48
+ fullname = Column(String, nullable=False)
49
+
50
+ gpa_edu_1 = Column(DOUBLE_PRECISION)
51
+ univ_edu_1 = Column(String)
52
+ major_edu_1 = Column(String)
53
+
54
+ gpa_edu_2 = Column(DOUBLE_PRECISION)
55
+ univ_edu_2 = Column(String)
56
+ major_edu_2 = Column(String)
57
+
58
+ gpa_edu_3 = Column(DOUBLE_PRECISION)
59
+ univ_edu_3 = Column(String)
60
+ major_edu_3 = Column(String)
61
+
62
+ domicile = Column(String)
63
+ yoe = Column(Integer)
64
+
65
+ hardskills = Column(ARRAY(String))
66
+ softskills = Column(ARRAY(String))
67
+ certifications = Column(ARRAY(String))
68
+ business_domain = Column(ARRAY(String))
69
+
70
+ filename = Column(String, nullable=False, unique=True)
71
+ file_id = Column(UUID(as_uuid=True), primary_key=False)
72
+ created_at = Column(TIMESTAMP(timezone=True), server_default=master_config.JAKARTA_NOW)
73
+
74
+
75
+ class CVFilter(Base):
76
+ __tablename__ = "cv_filter"
77
+
78
+ criteria_id = Column(UUID(as_uuid=True), primary_key=True, server_default=func.uuid_generate_v4())
79
+
80
+ gpa_edu_1 = Column(DOUBLE_PRECISION)
81
+ gpa_edu_2 = Column(DOUBLE_PRECISION)
82
+ gpa_edu_3 = Column(DOUBLE_PRECISION)
83
+
84
+ univ_edu_1 = Column(String)
85
+ univ_edu_2 = Column(String)
86
+ univ_edu_3 = Column(String)
87
+
88
+ major_edu_1 = Column(String)
89
+ major_edu_2 = Column(String)
90
+ major_edu_3 = Column(String)
91
+
92
+ domicile = Column(String)
93
+ yoe = Column(Integer)
94
+
95
+ hardskills = Column(ARRAY(String))
96
+ softskills = Column(ARRAY(String))
97
+ certifications = Column(ARRAY(String))
98
+ business_domain = Column(ARRAY(String))
99
+
100
+ created_at = Column(TIMESTAMP(timezone=True), server_default=master_config.JAKARTA_NOW)
101
+
102
+
103
+ class CVWeight(Base):
104
+ __tablename__ = "cv_weight"
105
+
106
+ weight_id = Column(UUID(as_uuid=True), primary_key=True, server_default=func.uuid_generate_v4())
107
+ criteria_id = Column(UUID(as_uuid=True), primary_key=True)
108
+
109
+ gpa_edu_1 = Column(DOUBLE_PRECISION)
110
+ gpa_edu_2 = Column(DOUBLE_PRECISION)
111
+ gpa_edu_3 = Column(DOUBLE_PRECISION)
112
+
113
+ univ_edu_1 = Column(DOUBLE_PRECISION)
114
+ univ_edu_2 = Column(DOUBLE_PRECISION)
115
+ univ_edu_3 = Column(DOUBLE_PRECISION)
116
+
117
+ major_edu_1 = Column(DOUBLE_PRECISION)
118
+ major_edu_2 = Column(DOUBLE_PRECISION)
119
+ major_edu_3 = Column(DOUBLE_PRECISION)
120
+
121
+ domicile = Column(DOUBLE_PRECISION)
122
+ yoe = Column(DOUBLE_PRECISION)
123
+
124
+ hardskills = Column(DOUBLE_PRECISION)
125
+ softskills = Column(DOUBLE_PRECISION)
126
+ certifications = Column(DOUBLE_PRECISION)
127
+ business_domain = Column(DOUBLE_PRECISION)
128
+
129
+ created_at = Column(TIMESTAMP(timezone=True), server_default=master_config.JAKARTA_NOW)
130
+
131
+
132
+ class CVMatching(Base):
133
+ __tablename__ = "cv_matching"
134
+
135
+ matching_id = Column(UUID(as_uuid=True), primary_key=True, server_default=func.uuid_generate_v4())
136
+ profile_id = Column(UUID(as_uuid=True))
137
+ criteria_id = Column(UUID(as_uuid=True))
138
+
139
+ gpa_edu_1 = Column(BOOLEAN)
140
+ gpa_edu_2 = Column(BOOLEAN)
141
+ gpa_edu_3 = Column(BOOLEAN)
142
+
143
+ univ_edu_1 = Column(BOOLEAN)
144
+ univ_edu_2 = Column(BOOLEAN)
145
+ univ_edu_3 = Column(BOOLEAN)
146
+
147
+ major_edu_1 = Column(BOOLEAN)
148
+ major_edu_2 = Column(BOOLEAN)
149
+ major_edu_3 = Column(BOOLEAN)
150
+
151
+ domicile = Column(BOOLEAN)
152
+ yoe = Column(BOOLEAN)
153
+
154
+ hardskills = Column(BOOLEAN)
155
+ softskills = Column(BOOLEAN)
156
+ certifications = Column(BOOLEAN)
157
+ business_domain = Column(BOOLEAN)
158
+
159
+ created_at = Column(TIMESTAMP(timezone=True), server_default=master_config.JAKARTA_NOW)
160
+
161
+
162
+ class CVScore(Base):
163
+ __tablename__ = "cv_score"
164
+
165
+ scoring_id = Column(UUID(as_uuid=True), primary_key=True, server_default=func.uuid_generate_v4())
166
+ matching_id = Column(UUID(as_uuid=True))
167
+ score = Column(Integer)
168
+
169
+ created_at = Column(TIMESTAMP(timezone=True), server_default=master_config.JAKARTA_NOW)
externals/databases/pg_schema_down.py ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import dotenv
3
+ from config.constant import EnvPostgresConstants, EnvFilepath
4
+ dotenv.load_dotenv(EnvFilepath.ENVPATH)
5
+
6
+ from sqlalchemy import create_engine, text
7
+ from externals.databases.pg_models import Base
8
+ from utils.logger import get_logger
9
+
10
+
11
+
12
+ logger = get_logger("init schema")
13
+
14
+ def drop_tables():
15
+ try:
16
+ DATABASE_URL = EnvPostgresConstants.CONSTRING
17
+ engine = create_engine(DATABASE_URL)
18
+
19
+ # Create extension
20
+ with engine.connect() as conn:
21
+ conn.execute(text('CREATE EXTENSION IF NOT EXISTS "uuid-ossp";'))
22
+ conn.commit()
23
+
24
+ # Create tables
25
+ Base.metadata.drop_all(engine)
26
+ logger.info("✅ drop schema success")
27
+ except Exception as E:
28
+ logger.error(f"❌ drop schema failed, {E}")
29
+
30
+
31
+
32
+ if __name__ == "__main__":
33
+ drop_tables()
externals/databases/pg_schema_up.py ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import dotenv
3
+
4
+ from config.constant import EnvPostgresConstants, EnvFilepath
5
+ dotenv.load_dotenv(EnvFilepath.ENVPATH)
6
+
7
+ from externals.databases.pg_models import Base
8
+ from sqlalchemy import create_engine, text
9
+ from utils.logger import get_logger
10
+
11
+ logger = get_logger("init schema")
12
+
13
+
14
+ def create_tables():
15
+ try:
16
+ DATABASE_URL = EnvPostgresConstants.CONSTRING
17
+ engine = create_engine(DATABASE_URL)
18
+
19
+ # Create extension
20
+ with engine.connect() as conn:
21
+ conn.execute(text('CREATE EXTENSION IF NOT EXISTS "uuid-ossp";'))
22
+ conn.commit()
23
+
24
+ # Create tables
25
+ Base.metadata.create_all(engine)
26
+ logger.info("✅ init schema success")
27
+ except Exception as E:
28
+ logger.error(f"❌ init schema failed, {E}")
29
+
30
+
31
+ if __name__ == "__main__":
32
+ create_tables()
externals/databases/schemas/__init__.py ADDED
File without changes
externals/databases/schemas/auth.py ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ from pydantic import BaseModel, EmailStr
2
+
3
+ class LoginRequest(BaseModel):
4
+ email: EmailStr
5
+ password: str
6
+
7
+
8
+ class TokenResponse(BaseModel):
9
+ access_token: str
10
+ token_type: str = "bearer"
externals/databases/schemas/knowledge.py ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ from pydantic import BaseModel
2
+ from typing import Any
3
+
4
+ class ResponseGetProfile(BaseModel):
5
+ status: str
6
+ message: str
7
+ data: Any
externals/databases/schemas/tenant.py ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from uuid import UUID
2
+ from typing import Optional
3
+ from datetime import datetime
4
+
5
+ from pydantic import BaseModel, Field
6
+
7
+
8
+ # ---------- REQUEST ----------
9
+ class TenantCreate(BaseModel):
10
+ tenant_name: str = Field(..., min_length=3, max_length=100)
11
+ notes: Optional[str] = None
12
+
13
+
14
+ # ---------- UPDATE (OPTIONAL) ----------
15
+ class TenantUpdate(BaseModel):
16
+ tenant_name: Optional[str] = Field(None, min_length=3, max_length=100)
17
+ notes: Optional[str] = None
18
+
19
+
20
+ # ---------- RESPONSE ----------
21
+ class TenantResponse(BaseModel):
22
+ tenant_id: UUID
23
+ tenant_name: str
24
+ created_at: datetime
25
+ date_modified: datetime
26
+ notes: Optional[str] = None
27
+
28
+ class Config:
29
+ from_attributes = True # Pydantic v2 (ORM support)
externals/databases/schemas/user.py ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from uuid import UUID
2
+ from typing import Optional
3
+ from datetime import datetime
4
+ from pydantic import BaseModel, EmailStr
5
+
6
+
7
+ # ---------- REQUEST ----------
8
+ class UserCreate(BaseModel):
9
+ username: str
10
+ password: str
11
+ email: EmailStr
12
+ full_name: str
13
+ role: str
14
+ tenant_id: Optional[UUID] = None
15
+ notes: Optional[str] = None
16
+
17
+
18
+ # ---------- RESPONSE ----------
19
+ class UserResponse(BaseModel):
20
+ user_id: UUID
21
+ username: str
22
+ email: EmailStr
23
+ full_name: str
24
+ role: str
25
+ is_active: bool
26
+ tenant_id: Optional[UUID]
27
+ created_at: datetime
28
+
29
+ class Config:
30
+ from_attributes = True # ⬅️ WAJIB (SQLAlchemy → Pydantic)
externals/observability/__init__.py ADDED
File without changes
externals/observability/langfuse.py ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import dotenv
3
+ from config.constant import EnvFilepath
4
+ dotenv.load_dotenv(EnvFilepath.ENVPATH)
5
+ from langfuse import Langfuse
6
+ from langchain_core.callbacks.base import BaseCallbackHandler
7
+
8
+
9
+ langfuse = Langfuse(
10
+ secret_key=os.environ.get('ss--langfuse--secret-key'),
11
+ public_key=os.environ.get('ss--langfuse--public-key'),
12
+ host=os.environ.get('langfuse--host'),
13
+ )
14
+
15
+
16
+ langfuse_handler = BaseCallbackHandler()
externals/storages/azure_blob.py ADDED
@@ -0,0 +1,183 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import uuid
3
+ from typing import List, Dict, Any
4
+
5
+ from azure.identity.aio import DefaultAzureCredential
6
+ from azure.storage.blob.aio import BlobServiceClient, ContainerClient
7
+ from fastapi import UploadFile, HTTPException, status
8
+
9
+ from config.constant import AzureBlobConstants
10
+ from utils.logger import get_logger
11
+
12
+ logger = get_logger("azure-blob")
13
+
14
+ # ---------- SINGLETONS ----------
15
+ _blob_service_client: BlobServiceClient | None = None
16
+ _credential: DefaultAzureCredential | None = None
17
+
18
+
19
+ async def get_blob_service_client() -> BlobServiceClient:
20
+ global _blob_service_client, _credential
21
+
22
+ if _blob_service_client is None:
23
+ _credential = DefaultAzureCredential()
24
+ _blob_service_client = BlobServiceClient(
25
+ account_url=AzureBlobConstants.ENDPOINT,
26
+ credential=_credential,
27
+ )
28
+ logger.info("✅ Azure BlobServiceClient initialized")
29
+
30
+ return _blob_service_client
31
+
32
+
33
+ async def get_container_client() -> ContainerClient:
34
+ service = await get_blob_service_client()
35
+ container = service.get_container_client(
36
+ AzureBlobConstants.CONTAINER_NAME
37
+ )
38
+
39
+ try:
40
+ await container.create_container()
41
+ logger.info("✅ Blob container created")
42
+ except Exception:
43
+ pass # already exists
44
+
45
+ return container
46
+
47
+
48
+ # ---------- HELPERS ----------
49
+ def build_blob_path(filename: str) -> str:
50
+ return f"{AzureBlobConstants.BLOB_PREFIX}/{filename}"
51
+
52
+
53
+ # ---------- UPLOAD ----------
54
+ # async def upload_pdf(
55
+ # file: UploadFile,
56
+ # ) -> Dict[str, Any]:
57
+
58
+ # if file.content_type != "application/pdf":
59
+ # raise HTTPException(
60
+ # status_code=status.HTTP_400_BAD_REQUEST,
61
+ # detail="Only PDF files are allowed",
62
+ # )
63
+
64
+ # container = await get_container_client()
65
+
66
+ # blob_name = f"{uuid.uuid4()}.pdf"
67
+ # blob_path = build_blob_path(blob_name)
68
+
69
+ # blob_client = container.get_blob_client(blob_path)
70
+
71
+ # size = 0
72
+ # chunks = []
73
+
74
+ # async for chunk in file.stream():
75
+ # size += len(chunk)
76
+ # if size > AzureBlobConstants.MAX_FILE_SIZE_MB * 1024 * 1024:
77
+ # raise HTTPException(
78
+ # status_code=status.HTTP_413_REQUEST_ENTITY_TOO_LARGE,
79
+ # detail="File too large",
80
+ # )
81
+ # chunks.append(chunk)
82
+
83
+ # await blob_client.upload_blob(
84
+ # b"".join(chunks),
85
+ # overwrite=False,
86
+ # content_type="application/pdf",
87
+ # )
88
+
89
+ # logger.info(f"✅ Uploaded PDF: {blob_path}")
90
+
91
+ # return {
92
+ # "blob_name": blob_name,
93
+ # "path": blob_path,
94
+ # "url": blob_client.url,
95
+ # "size_bytes": size,
96
+ # }
97
+ def helper_path_maker(
98
+ tenant_id: str,
99
+ user_id: str,
100
+ filename: str,
101
+ in_folder: str = AzureBlobConstants.BLOB_PREFIX,
102
+ ):
103
+ return f"{in_folder}/{tenant_id}/{user_id}/{filename}"
104
+
105
+
106
+ from azure.storage.blob import ContentSettings
107
+
108
+ async def upload_pdf(file: UploadFile, tenant_id: str, user_id: str) -> dict:
109
+ container_client = await get_container_client()
110
+ blob_name = helper_path_maker(tenant_id, user_id, file.filename)
111
+
112
+ blob_client = container_client.get_blob_client(blob_name)
113
+
114
+ await file.seek(0)
115
+
116
+ await blob_client.upload_blob(
117
+ data=_file_chunk_generator(file),
118
+ overwrite=True,
119
+ content_settings=ContentSettings(
120
+ content_type=file.content_type or "application/pdf"
121
+ ),
122
+ )
123
+
124
+ return {
125
+ "filename": file.filename,
126
+ "uploaded": True,
127
+ "url": blob_client.url,
128
+ }
129
+
130
+
131
+ async def _file_chunk_generator(file: UploadFile):
132
+ while True:
133
+ chunk = await file.read(AzureBlobConstants.CHUNK_SIZE)
134
+ if not chunk:
135
+ break
136
+ yield chunk
137
+
138
+
139
+ async def delete_blob_by_filename(filename: str, tenant_id: str, user_id: str) -> bool:
140
+ container = await get_container_client()
141
+ blob_path = helper_path_maker(tenant_id=tenant_id,
142
+ user_id=user_id,
143
+ filename=filename)
144
+
145
+ blob_client = container.get_blob_client(blob_path)
146
+
147
+ try:
148
+ await blob_client.delete_blob()
149
+ logger.info(
150
+ "azure.blob.delete.success",
151
+ extra={"cv_filename": filename},
152
+ )
153
+ return True
154
+ except Exception as e:
155
+ logger.error(
156
+ "azure.blob.delete.failed",
157
+ extra={
158
+ "cv_filename": filename,
159
+ "error": str(e),
160
+ },
161
+ )
162
+ return False
163
+
164
+
165
+
166
+ async def download_blob_by_filename(filename: str, tenant_id: str, user_id: str) -> bytes:
167
+ """
168
+ Download file from Azure Blob Storage by filename
169
+ Return raw bytes
170
+ """
171
+ try:
172
+ container_client = await get_container_client()
173
+ blob_name = helper_path_maker(tenant_id, user_id, filename)
174
+
175
+ blob_client = container_client.get_blob_client(blob_name)
176
+
177
+ downloader = await blob_client.download_blob()
178
+ file_bytes:bytes = await downloader.readall()
179
+
180
+ return file_bytes
181
+
182
+ except Exception as e:
183
+ raise RuntimeError(f"Failed to download blob '{filename}': {str(e)}")
externals/storages/azure_generate_sas.py ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from azure.identity import AzureCliCredential
2
+ from azure.storage.blob import (
3
+ BlobServiceClient,
4
+ generate_blob_sas,
5
+ BlobSasPermissions,
6
+ )
7
+ from config.constant import AzureBlobConstants
8
+ from config.get_config import master_config
9
+ from datetime import datetime, timedelta
10
+ from urllib.parse import quote
11
+ from urllib.parse import urlparse
12
+
13
+
14
+ async def get_blob_sas_url(blob_name:str,
15
+ account_name:str=AzureBlobConstants.ACCOUNT_NAME,
16
+ container_name:str=AzureBlobConstants.CONTAINER_NAME):
17
+
18
+ try:
19
+ blob_name = blob_name.replace('%20', ' ')
20
+ blob_name = urlparse(blob_name).path
21
+
22
+ permissions = BlobSasPermissions(read=True)
23
+
24
+ expiry = datetime.now(master_config.tzinfo) + timedelta(hours=1)
25
+
26
+ credential = AzureCliCredential()
27
+
28
+ account_url = f"https://{account_name}.blob.core.windows.net"
29
+ service_client = BlobServiceClient(account_url=account_url, credential=credential)
30
+
31
+ start_time = datetime.now(master_config.tzinfo) - timedelta(minutes=5)
32
+ udk = service_client.get_user_delegation_key(key_start_time=start_time, key_expiry_time=expiry)
33
+
34
+ sas_token = generate_blob_sas(
35
+ account_name=account_name,
36
+ container_name=container_name,
37
+ blob_name=blob_name,
38
+ permission=permissions,
39
+ start=start_time,
40
+ expiry=expiry,
41
+ user_delegation_key=udk,
42
+ protocol="https",
43
+ )
44
+
45
+ # Build a URL-safe path (encode reserved characters)
46
+ encoded_blob_name = quote(blob_name, safe="/") # keep '/' but encode spaces, etc.
47
+ blob_url_with_sas = f"{account_url}/{container_name}/{encoded_blob_name}?{sas_token}"
48
+
49
+ return blob_url_with_sas
50
+ except Exception as E:
51
+ print("Error generating SAS URL:", str(E))
52
+ return None
interfaces/__init__.py ADDED
File without changes
interfaces/api/agentic.py ADDED
@@ -0,0 +1,247 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import time
2
+ from fastapi import APIRouter
3
+ from uuid import uuid4
4
+ # from externals.databases.pg_crud import get_all_cv_profiles, get_cv_profile_with_scores
5
+ from externals.databases.database import get_db
6
+ from services.agentic.agentic_setup import AgenticService
7
+ from services.knowledge.knowledge_setup import KnowledgeService
8
+ from services.models.data_model import (Criteria,
9
+ CriteriaWeight,
10
+ PayloadMatchOne,
11
+ ResponseMatchOne,
12
+ DataResponseMatchOne,
13
+ PayloadMatchBulk,
14
+ ResponseMatchBulk,
15
+ DataResponseMatchBulk)
16
+ from interfaces.api.deps import get_current_user
17
+ from fastapi import APIRouter, UploadFile, File, Depends, status, HTTPException
18
+ from externals.databases.pg_models import CVUser, CVFilter, CVWeight
19
+
20
+ from utils.logger import get_logger
21
+
22
+ logger = get_logger("agentic service")
23
+ router = APIRouter(
24
+ prefix="/agentic",
25
+ tags=["Agentic"],
26
+ )
27
+
28
+
29
+ @router.post("/create_filter")
30
+ async def create_filter(
31
+ filter: Criteria,
32
+ db=Depends(get_db),
33
+ current_user: CVUser = Depends(get_current_user),
34
+ ):
35
+ try:
36
+ agentic_service = AgenticService(db=db,
37
+ user=current_user)
38
+
39
+ cv_filter = CVFilter(
40
+ criteria_id=uuid4(),
41
+
42
+ gpa_edu_1=filter.get("gpa_edu_1"),
43
+ gpa_edu_2=filter.get("gpa_edu_2"),
44
+ gpa_edu_3=filter.get("gpa_edu_3"),
45
+
46
+ univ_edu_1=filter.get("univ_edu_1"),
47
+ univ_edu_2=filter.get("univ_edu_2"),
48
+ univ_edu_3=filter.get("univ_edu_3"),
49
+
50
+ major_edu_1=filter.get("major_edu_1"),
51
+ major_edu_2=filter.get("major_edu_2"),
52
+ major_edu_3=filter.get("major_edu_3"),
53
+
54
+ domicile=filter.get("domicile"),
55
+ yoe=filter.get("yoe"),
56
+
57
+ hardskills=filter.get("hardskills"),
58
+ softskills=filter.get("softskills"),
59
+ certifications=filter.get("certifications"),
60
+ business_domain=filter.get("business_domain")
61
+ )
62
+
63
+ logger.info(f"cv_filter: {cv_filter}")
64
+
65
+ data = await agentic_service.filter.create_filter(filter=cv_filter)
66
+ return {
67
+ "status": "success",
68
+ "message": "Filter created successfully",
69
+ "criteria_id": data
70
+ }
71
+ except Exception as E:
72
+ logger.error(f"create filter error: {E}")
73
+ raise HTTPException(
74
+ status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
75
+ detail=f"create filter error: {E}"
76
+ )
77
+
78
+
79
+ @router.get("/filter/{criteria_id}")
80
+ async def get_filter_by_id(
81
+ criteria_id: str,
82
+ db=Depends(get_db),
83
+ current_user: CVUser = Depends(get_current_user),
84
+ ):
85
+ agentic_service = AgenticService(db=db,
86
+ user=current_user)
87
+
88
+ data = await agentic_service.filter.get_filter_by_id(criteria_id=criteria_id)
89
+ return data
90
+
91
+
92
+
93
+ @router.post("/create_weight")
94
+ async def create_weight(
95
+ criteria_id: str,
96
+ weight: CriteriaWeight,
97
+ db=Depends(get_db),
98
+ current_user: CVUser = Depends(get_current_user),
99
+ ):
100
+ try:
101
+ agentic_service = AgenticService(db=db,
102
+ user=current_user)
103
+
104
+ cv_weight = CVWeight(
105
+ criteria_id=criteria_id,
106
+
107
+ gpa_edu_1=weight.get("gpa_edu_1"),
108
+ gpa_edu_2=weight.get("gpa_edu_2"),
109
+ gpa_edu_3=weight.get("gpa_edu_3"),
110
+
111
+ univ_edu_1=weight.get("univ_edu_1"),
112
+ univ_edu_2=weight.get("univ_edu_2"),
113
+ univ_edu_3=weight.get("univ_edu_3"),
114
+
115
+ major_edu_1=weight.get("major_edu_1"),
116
+ major_edu_2=weight.get("major_edu_2"),
117
+ major_edu_3=weight.get("major_edu_3"),
118
+
119
+ domicile=weight.get("domicile"),
120
+ yoe=weight.get("yoe"),
121
+
122
+ hardskills=weight.get("hardskills"),
123
+ softskills=weight.get("softskills"),
124
+ certifications=weight.get("certifications"),
125
+ business_domain=weight.get("business_domain")
126
+ )
127
+
128
+ logger.info(f"cv_weight: {cv_weight}")
129
+
130
+ data = await agentic_service.weight.create_weight(weight=cv_weight)
131
+ return {
132
+ "status": "success",
133
+ "message": "Weight created successfully",
134
+ "criteria_id": data
135
+ }
136
+ except Exception as E:
137
+ logger.error(f"create weight error: {E}")
138
+ raise HTTPException(
139
+ status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
140
+ detail=f"create weight error: {E}"
141
+ )
142
+
143
+
144
+ @router.post("/calculate_score")
145
+ async def calculate_score(
146
+ weight_id: str,
147
+ db=Depends(get_db),
148
+ current_user: CVUser = Depends(get_current_user),
149
+ ):
150
+ # TODO: endpoint to calculate profile matching
151
+ pass
152
+
153
+
154
+ # @router.get("/get_profile_table")
155
+ # async def get_profile_table(
156
+ # limit: int,
157
+ # ):
158
+ # data = await get_all_cv_profiles(limit)
159
+ # return data
160
+
161
+
162
+ # @router.get("/get_profile_table_and_score")
163
+ # async def get_profile_table_and_score(
164
+ # criteria_id: str,
165
+ # profile_id: str,
166
+ # ):
167
+ # data = await get_cv_profile_with_scores(
168
+ # criteria_id=criteria_id,
169
+ # profile_id=profile_id,
170
+ # )
171
+ # return data
172
+
173
+
174
+ # @router.post("/match_one")
175
+ # async def profile_matching_one(
176
+ # payload: PayloadMatchOne,
177
+ # ):
178
+ # """
179
+ # Generate profile matching score between one profile and one criteria.
180
+
181
+ # Returns:
182
+ # status: str
183
+ # message: str
184
+ # data: DataResponseExtractOne
185
+ # """
186
+ # _start = time.time()
187
+ # try:
188
+ # agentic = Agent()
189
+ # response = await agentic.scoring_profile(input_scoring=payload)
190
+ # print(f"response match one profile:", response)
191
+ # _end = time.time() - _start
192
+ # logger.info(f"API runtime profile scoring: {_end}s")
193
+
194
+ # return response
195
+ # except Exception as E:
196
+ # logger.error(f"profile scoring error, {E}")
197
+
198
+ # _end = time.time() - _start
199
+ # logger.info(f"API runtime profile scoring: {_end}s")
200
+
201
+ # return ResponseMatchOne(
202
+ # status="failed",
203
+ # message=f"profile scoring error, {E}",
204
+ # data=DataResponseMatchOne(
205
+ # profile_id=payload.get("profile_id"),
206
+ # criteria_id=payload.get("criteria").get("criteria_id"),
207
+ # score=0
208
+ # )
209
+ # )
210
+
211
+
212
+ # @router.post("/match_bulk")
213
+ # async def profile_matching_bulk(
214
+ # payload: PayloadMatchBulk,
215
+ # ):
216
+ # """
217
+ # Generate profile matching score between many profiles and one criteria.
218
+
219
+ # Returns:
220
+ # status: str
221
+ # message: str
222
+ # data: DataResponseExtractOne
223
+ # """
224
+ # _start = time.time()
225
+ # try:
226
+ # agentic = Agent()
227
+ # response = await agentic.scoring_profile(input_scoring=payload)
228
+ # print(f"response match one profile:", response)
229
+ # _end = time.time() - _start
230
+ # logger.info(f"API runtime profile scoring: {_end}s")
231
+
232
+ # return response
233
+ # except Exception as E:
234
+ # logger.error(f"profile scoring error, {E}")
235
+
236
+ # _end = time.time() - _start
237
+ # logger.info(f"API runtime profile scoring: {_end}s")
238
+
239
+ # return ResponseMatchBulk(
240
+ # status="failed",
241
+ # message=f"profile scoring error, {E}",
242
+ # data=DataResponseMatchBulk(
243
+ # profile_id=payload.get("profile_id"),
244
+ # criteria_id=payload.get("criteria").get("criteria_id"),
245
+ # score=0
246
+ # )
247
+ # )
interfaces/api/deps.py ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from config.constant import SecurityConstants
2
+ from externals.databases.pg_crud import get_user_by_id
3
+ from externals.databases.database import get_db
4
+ from fastapi import Depends, HTTPException, status
5
+ from fastapi.security import OAuth2PasswordBearer
6
+ from jose import jwt, JWTError
7
+ from sqlalchemy.ext.asyncio import AsyncSession
8
+
9
+
10
+ oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/admin/login")
11
+
12
+
13
+ async def get_current_user(
14
+ token: str = Depends(oauth2_scheme),
15
+ db: AsyncSession = Depends(get_db),
16
+ ):
17
+ credentials_exception = HTTPException(
18
+ status_code=status.HTTP_401_UNAUTHORIZED,
19
+ detail="Could not validate credentials",
20
+ headers={"WWW-Authenticate": "Bearer"},
21
+ )
22
+
23
+ try:
24
+ payload = jwt.decode(
25
+ token,
26
+ SecurityConstants.JWT_SECRET_KEY,
27
+ algorithms=[SecurityConstants.JWT_ALGORITHM],
28
+ )
29
+ user_id: str | None = payload.get("sub")
30
+ if user_id is None:
31
+ raise credentials_exception
32
+
33
+ except JWTError:
34
+ raise credentials_exception
35
+
36
+ user = await get_user_by_id(db, user_id)
37
+ if not user:
38
+ raise credentials_exception
39
+
40
+ return user
interfaces/api/file.py ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from externals.databases.database import get_db
2
+ from fastapi import APIRouter, UploadFile, File, Depends, status, HTTPException
3
+ from interfaces.api.deps import get_current_user
4
+ from services.knowledge.knowledge_setup import KnowledgeService
5
+ from typing import List
6
+ from utils.logger import get_logger
7
+
8
+
9
+ logger = get_logger("File API")
10
+
11
+ router = APIRouter(
12
+ prefix="/file",
13
+ tags=["File"],
14
+ )
15
+
16
+
17
+ @router.post(
18
+ "/upload",
19
+ status_code=status.HTTP_201_CREATED,
20
+ summary="Upload multiple PDF knowledge files",
21
+ )
22
+ async def upload_knowledge_many(
23
+ files: List[UploadFile] = File(...),
24
+ db=Depends(get_db),
25
+ current_user=Depends(get_current_user),
26
+ ):
27
+ """
28
+ Upload multiple PDF files to Azure Blob Storage and log metadata.
29
+ """
30
+
31
+ knowledge_service = KnowledgeService(
32
+ db=db,
33
+ user=current_user,
34
+ )
35
+
36
+ results = []
37
+ for file in files:
38
+ if file.content_type != "application/pdf":
39
+ raise HTTPException(
40
+ status_code=status.HTTP_400_BAD_REQUEST,
41
+ detail=f"File '{file.filename}' is not a PDF",
42
+ )
43
+ else:
44
+ result = await knowledge_service.file.upload(file)
45
+ results.append(result)
46
+
47
+ return {
48
+ "message": "Upload completed",
49
+ "uploaded_by": current_user.email,
50
+ "files": results,
51
+ }
52
+
53
+ @router.get(
54
+ "/{user_id}",
55
+ status_code=status.HTTP_200_OK,
56
+ summary="Get file metadata by user ID",
57
+ )
58
+ async def get_file_metadata_by_user(
59
+ user_id: str,
60
+ db=Depends(get_db),
61
+ current_user=Depends(get_current_user),
62
+ ):
63
+ """
64
+ Retrieve all file metadata uploaded by a specific user.
65
+ """
66
+
67
+ knowledge_service = KnowledgeService(
68
+ db=db,
69
+ user=current_user,
70
+ )
71
+
72
+ files = await knowledge_service.file.get_files_by_user(user_id)
73
+
74
+ return {
75
+ "message": "File metadata retrieved successfully",
76
+ "requested_by": current_user.email,
77
+ "files": files,
78
+ }
79
+
80
+
81
+ @router.delete(
82
+ "/{filename}",
83
+ status_code=status.HTTP_200_OK,
84
+ summary="Delete knowledge file by filename",
85
+ )
86
+ async def delete_knowledge_file(
87
+ filename: str,
88
+ db=Depends(get_db),
89
+ current_user=Depends(get_current_user),
90
+ ):
91
+ """
92
+ Delete a PDF knowledge file from Azure Blob and database.
93
+ """
94
+
95
+ knowledge_service = KnowledgeService(
96
+ db=db,
97
+ user=current_user,
98
+ )
99
+
100
+ await knowledge_service.delete.delete(filename)
101
+
102
+ return {
103
+ "message": "File deleted successfully",
104
+ "filename": filename,
105
+ "deleted_by": current_user.email,
106
+ }
107
+
interfaces/api/profile.py ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from externals.databases.pg_models import CVUser
2
+ from externals.databases.database import get_db
3
+ from fastapi import APIRouter, Depends, status, HTTPException
4
+ from interfaces.api.deps import get_current_user
5
+ from services.knowledge.knowledge_setup import KnowledgeService
6
+ from utils.logger import get_logger
7
+
8
+
9
+ logger = get_logger("Profile API")
10
+
11
+ router = APIRouter(
12
+ prefix="/profile",
13
+ tags=["Profile"],
14
+ )
15
+
16
+ @router.post("/extract_profile")
17
+ async def extract_profile(
18
+ filename: str,
19
+ db=Depends(get_db),
20
+ current_user: CVUser = Depends(get_current_user),
21
+ ):
22
+ """
23
+ Extract structured profile from CV PDF
24
+ """
25
+
26
+ knowledge_service = KnowledgeService(
27
+ db=db,
28
+ user=current_user,
29
+ )
30
+
31
+ return await knowledge_service.extract.extract(filename)
32
+
33
+
34
+
35
+ @router.get("/{profile_id}")
36
+ async def get_profile(
37
+ profile_id: str,
38
+ current_user: CVUser = Depends(get_current_user),
39
+ ):
40
+ """
41
+ Get extracted profile by ID
42
+ """
43
+ knowledge_service = KnowledgeService(user=current_user)
44
+
45
+ profile = await knowledge_service.profile.get_profile(profile_id)
46
+
47
+ if not profile:
48
+ raise HTTPException(
49
+ status_code=status.HTTP_404_NOT_FOUND,
50
+ detail="Profile not found",
51
+ )
52
+
53
+ # 🔒 Tenant isolation (IMPORTANT)
54
+ if profile.tenant_id != current_user.tenant_id:
55
+ raise HTTPException(
56
+ status_code=status.HTTP_403_FORBIDDEN,
57
+ detail="Not authorized to access this profile",
58
+ )
59
+
60
+ return profile
61
+
62
+
interfaces/api/tenant.py ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from externals.databases.database import get_db
2
+ from externals.databases.pg_crud import (
3
+ get_tenant_by_name,
4
+ create_tenant,
5
+ )
6
+ from externals.databases.schemas.tenant import TenantCreate, TenantResponse
7
+ from fastapi import APIRouter, Depends, HTTPException, status
8
+ from sqlalchemy.ext.asyncio import AsyncSession
9
+ from utils.logger import get_logger
10
+
11
+
12
+ logger = get_logger("tenant management")
13
+ router = APIRouter(prefix="/admin", tags=["Tenant"])
14
+
15
+
16
+ # CREATE TENANT
17
+ @router.post(
18
+ "/tenants",
19
+ status_code=status.HTTP_201_CREATED,
20
+ response_model=TenantResponse,
21
+ )
22
+ async def create_tenant_endpoint(
23
+ tenant: TenantCreate,
24
+ db: AsyncSession = Depends(get_db),
25
+ ):
26
+ logger.info("Create tenant request", extra={"tenant_name": tenant.tenant_name})
27
+
28
+ existing = await get_tenant_by_name(db, tenant.tenant_name)
29
+ if existing:
30
+ raise HTTPException(
31
+ status_code=status.HTTP_409_CONFLICT,
32
+ detail="Tenant already exists",
33
+ )
34
+
35
+ created = await create_tenant(db, tenant)
36
+ return created
37
+
38
+
39
+ # GET TENANT BY NAME
40
+ @router.get(
41
+ "/tenants/{tenant_name}",
42
+ response_model=TenantResponse,
43
+ )
44
+ async def get_tenant_endpoint(
45
+ tenant_name: str,
46
+ db: AsyncSession = Depends(get_db),
47
+ ):
48
+ logger.info("Get tenant request", extra={"tenant_name": tenant_name})
49
+
50
+ tenant = await get_tenant_by_name(db, tenant_name)
51
+ if not tenant:
52
+ raise HTTPException(
53
+ status_code=status.HTTP_404_NOT_FOUND,
54
+ detail="Tenant not found",
55
+ )
56
+
57
+ return tenant
interfaces/api/user.py ADDED
@@ -0,0 +1,104 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from externals.databases.database import get_db
2
+ from externals.databases.pg_crud import (
3
+ get_user_by_username,
4
+ create_user,
5
+ get_user_by_email,
6
+ # deactivate_user,
7
+ # get_tenant_by_name,
8
+ # create_tenant,
9
+ )
10
+ from externals.databases.schemas.user import UserCreate, UserResponse
11
+ from externals.databases.schemas.auth import LoginRequest, TokenResponse
12
+ from fastapi import APIRouter, Depends, HTTPException, status
13
+ from fastapi.security import OAuth2PasswordRequestForm
14
+ from sqlalchemy.ext.asyncio import AsyncSession
15
+ from utils.logger import get_logger
16
+ from utils.security import verify_password
17
+ from utils.jwt import create_access_token
18
+
19
+
20
+ logger = get_logger("user management")
21
+ router = APIRouter(prefix="/admin", tags=["User"])
22
+
23
+
24
+
25
+ @router.post(
26
+ "/users",
27
+ status_code=status.HTTP_201_CREATED,
28
+ response_model=UserResponse,
29
+ )
30
+ async def create_user_endpoint(
31
+ user: UserCreate,
32
+ db: AsyncSession = Depends(get_db),
33
+ ):
34
+ logger.info("Create user request", extra={"username": user.username})
35
+
36
+ existing = await get_user_by_username(db, user.username)
37
+ if existing:
38
+ raise HTTPException(
39
+ status_code=status.HTTP_409_CONFLICT,
40
+ detail="Username already exists",
41
+ )
42
+
43
+ return await create_user(db, user)
44
+
45
+
46
+
47
+ # @router.get(
48
+ # "/users/{username}",
49
+ # response_model=UserResponse,
50
+ # )
51
+ # async def get_user_endpoint(
52
+ # username: str,
53
+ # db: AsyncSession = Depends(get_db),
54
+ # ):
55
+ # logger.info("Get user request", extra={"username": username})
56
+
57
+ # user = await get_user_by_username(db, username)
58
+ # if not user:
59
+ # raise HTTPException(
60
+ # status_code=status.HTTP_404_NOT_FOUND,
61
+ # detail="User not found",
62
+ # )
63
+
64
+ # return user
65
+
66
+
67
+ @router.post("/login", response_model=TokenResponse)
68
+ async def login(
69
+ form_data: OAuth2PasswordRequestForm = Depends(),
70
+ db: AsyncSession = Depends(get_db),
71
+ ):
72
+ user = await get_user_by_email(db, form_data.username)
73
+
74
+ if not user or not verify_password(form_data.password, user.hashed_password):
75
+ raise HTTPException(
76
+ status_code=status.HTTP_401_UNAUTHORIZED,
77
+ detail="Invalid email or password",
78
+ )
79
+
80
+ token = create_access_token(
81
+ data={
82
+ "sub": str(user.user_id),
83
+ "email": user.email,
84
+ "role": user.role,
85
+ "full_name": user.full_name,
86
+ }
87
+ )
88
+
89
+ return TokenResponse(access_token=token)
90
+
91
+
92
+
93
+ from interfaces.api.deps import get_current_user
94
+
95
+ @router.get("/me", response_model=UserResponse)
96
+ async def get_me(
97
+ current_user: UserResponse = Depends(get_current_user),
98
+ ):
99
+ logger.info(
100
+ "Get current user",
101
+ extra={"user_id": current_user.user_id},
102
+ )
103
+
104
+ return current_user
interfaces/auth/auth.py ADDED
File without changes
interfaces/handlers/agentic_handlers.py ADDED
File without changes
interfaces/handlers/handlers.py ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+
2
+
interfaces/handlers/knowledge_handlers.py ADDED
File without changes
interfaces/middlewares/cors.py ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ from fastapi.middleware.cors import CORSMiddleware
2
+
3
+ cors_context = {"middleware_class":CORSMiddleware,
4
+ "allow_origins": ["*"],
5
+ "allow_credentials": True,
6
+ "allow_methods": ["*"],
7
+ "allow_headers": ["*"]
8
+ }
main.py ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from interfaces.middlewares.cors import cors_context
2
+ from interfaces.api.user import router as router_user
3
+ from interfaces.api.tenant import router as router_tenant
4
+ from interfaces.api.file import router as router_file
5
+ from interfaces.api.profile import router as router_profile
6
+ from interfaces.api.agentic import router as router_agentic
7
+ from fastapi import FastAPI
8
+ from fastapi.responses import JSONResponse
9
+
10
+
11
+ # ====================== APP ======================
12
+ app = FastAPI(
13
+ title="Candidate Explorer Service",
14
+ description="Candidate Explorer Service",
15
+ docs_url="/docs",
16
+ root_path="/"
17
+ )
18
+ app.add_middleware(**cors_context)
19
+
20
+ # ====================== ROUTES ======================
21
+ app.include_router(router_tenant)
22
+ app.include_router(router_user)
23
+ app.include_router(router_file)
24
+ app.include_router(router_profile)
25
+ app.include_router(router_agentic)
26
+
27
+
28
+ # ====================== HEALTHCHECK & INFO ======================
29
+ @app.get("/health/ready")
30
+ def health_ready():
31
+ return JSONResponse(content="Ready", status_code=200)
32
+
33
+ @app.get("/health/live")
34
+ def health_live():
35
+ return JSONResponse(content="Live", status_code=200)
36
+
37
+ @app.get("/info")
38
+ async def info_endpoint():
39
+ return {"agentId": "candidate-explorer-agent", "status":"Online", "description": "agent candidate explorer!"}
models/security.py ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ from pydantic import BaseModel
2
+
3
+ class TokenRequest(BaseModel):
4
+ username: str
5
+ password: str
6
+
7
+ class TokenResponse(BaseModel):
8
+ access_token: str
9
+ token_type: str = "bearer"
10
+ expires_in: int
playground/playground.py ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ import requests
2
+
3
+ url = "https://api.typeform.com/responses/files/9223d2c317a66c9e7b0cfe2514d9f622c2be0568164be3fa7eb6e0a148a2b5f0/CV_Abdurahman_Wal_Ikram.pdf"
4
+
5
+ res = requests.get(url=url)
6
+
7
+ type(res.content)
pyproject.toml ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [project]
2
+ name = "service.explorer.backend"
3
+ version = "0.1.0"
4
+ description = "Add your description here"
5
+ readme = "README.md"
6
+ requires-python = ">=3.13"
7
+ dependencies = [
8
+ "aiohttp>=3.13.2",
9
+ "asyncpg>=0.31.0",
10
+ "azure-identity>=1.25.1",
11
+ "azure-storage-blob>=12.20.0",
12
+ "bcrypt==3.2.2",
13
+ "dotenv>=0.9.9",
14
+ "fastapi[standard]>=0.127.0",
15
+ "frontend>=0.0.3",
16
+ "langchain>=1.2.0",
17
+ "langchain-openai>=1.1.6",
18
+ "langfuse==2.33.0",
19
+ "pandas>=2.3.3",
20
+ "passlib==1.7.4",
21
+ "pdf2image>=1.17.0",
22
+ "psycopg2>=2.9.11",
23
+ "pymupdf>=1.26.7",
24
+ "pypdf>=6.5.0",
25
+ "pypdf2>=3.0.1",
26
+ "pytesseract>=0.3.13",
27
+ "python-jose[cryptography]>=3.5.0",
28
+ "pytz>=2025.2",
29
+ "sqlalchemy>=2.0.45",
30
+ "uvicorn>=0.40.0",
31
+ ]
requirements.txt ADDED
@@ -0,0 +1,356 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # This file was autogenerated by uv via the following command:
2
+ # uv pip compile pyproject.toml -o requirements.txt
3
+ aiofiles==25.1.0
4
+ # via frontend
5
+ aiohappyeyeballs==2.6.1
6
+ # via aiohttp
7
+ aiohttp==3.13.3
8
+ # via service-explorer-backend (pyproject.toml)
9
+ aiosignal==1.4.0
10
+ # via aiohttp
11
+ annotated-doc==0.0.4
12
+ # via
13
+ # fastapi
14
+ # typer
15
+ annotated-types==0.7.0
16
+ # via pydantic
17
+ anyio==4.12.1
18
+ # via
19
+ # httpx
20
+ # openai
21
+ # starlette
22
+ # watchfiles
23
+ asyncpg==0.31.0
24
+ # via service-explorer-backend (pyproject.toml)
25
+ attrs==25.4.0
26
+ # via aiohttp
27
+ azure-core==1.38.2
28
+ # via
29
+ # azure-identity
30
+ # azure-storage-blob
31
+ azure-identity==1.25.2
32
+ # via service-explorer-backend (pyproject.toml)
33
+ azure-storage-blob==12.28.0
34
+ # via service-explorer-backend (pyproject.toml)
35
+ backoff==2.2.1
36
+ # via langfuse
37
+ bcrypt==3.2.2
38
+ # via service-explorer-backend (pyproject.toml)
39
+ certifi==2026.1.4
40
+ # via
41
+ # httpcore
42
+ # httpx
43
+ # requests
44
+ # sentry-sdk
45
+ cffi==2.0.0
46
+ # via
47
+ # bcrypt
48
+ # cryptography
49
+ charset-normalizer==3.4.4
50
+ # via requests
51
+ click==8.3.1
52
+ # via
53
+ # rich-toolkit
54
+ # typer
55
+ # uvicorn
56
+ colorama==0.4.6
57
+ # via
58
+ # click
59
+ # tqdm
60
+ # uvicorn
61
+ cryptography==46.0.5
62
+ # via
63
+ # azure-identity
64
+ # azure-storage-blob
65
+ # msal
66
+ # pyjwt
67
+ # python-jose
68
+ distro==1.9.0
69
+ # via openai
70
+ dnspython==2.8.0
71
+ # via email-validator
72
+ dotenv==0.9.9
73
+ # via service-explorer-backend (pyproject.toml)
74
+ ecdsa==0.19.1
75
+ # via python-jose
76
+ email-validator==2.3.0
77
+ # via
78
+ # fastapi
79
+ # pydantic
80
+ fastapi==0.129.0
81
+ # via service-explorer-backend (pyproject.toml)
82
+ fastapi-cli==0.0.23
83
+ # via fastapi
84
+ fastapi-cloud-cli==0.13.0
85
+ # via fastapi-cli
86
+ fastar==0.8.0
87
+ # via fastapi-cloud-cli
88
+ frontend==0.0.3
89
+ # via service-explorer-backend (pyproject.toml)
90
+ frozenlist==1.8.0
91
+ # via
92
+ # aiohttp
93
+ # aiosignal
94
+ greenlet==3.3.1
95
+ # via sqlalchemy
96
+ h11==0.16.0
97
+ # via
98
+ # httpcore
99
+ # uvicorn
100
+ httpcore==1.0.9
101
+ # via httpx
102
+ httptools==0.7.1
103
+ # via uvicorn
104
+ httpx==0.28.1
105
+ # via
106
+ # fastapi
107
+ # fastapi-cloud-cli
108
+ # langfuse
109
+ # langgraph-sdk
110
+ # langsmith
111
+ # openai
112
+ idna==3.11
113
+ # via
114
+ # anyio
115
+ # email-validator
116
+ # httpx
117
+ # langfuse
118
+ # requests
119
+ # yarl
120
+ isodate==0.7.2
121
+ # via azure-storage-blob
122
+ itsdangerous==2.2.0
123
+ # via frontend
124
+ jinja2==3.1.6
125
+ # via fastapi
126
+ jiter==0.13.0
127
+ # via openai
128
+ jsonpatch==1.33
129
+ # via langchain-core
130
+ jsonpointer==3.0.0
131
+ # via jsonpatch
132
+ langchain==1.2.10
133
+ # via service-explorer-backend (pyproject.toml)
134
+ langchain-core==1.2.14
135
+ # via
136
+ # langchain
137
+ # langchain-openai
138
+ # langgraph
139
+ # langgraph-checkpoint
140
+ # langgraph-prebuilt
141
+ langchain-openai==1.1.10
142
+ # via service-explorer-backend (pyproject.toml)
143
+ langfuse==2.33.0
144
+ # via service-explorer-backend (pyproject.toml)
145
+ langgraph==1.0.9
146
+ # via langchain
147
+ langgraph-checkpoint==4.0.0
148
+ # via
149
+ # langgraph
150
+ # langgraph-prebuilt
151
+ langgraph-prebuilt==1.0.8
152
+ # via langgraph
153
+ langgraph-sdk==0.3.8
154
+ # via langgraph
155
+ langsmith==0.7.5
156
+ # via langchain-core
157
+ markdown-it-py==4.0.0
158
+ # via rich
159
+ markupsafe==3.0.3
160
+ # via jinja2
161
+ mdurl==0.1.2
162
+ # via markdown-it-py
163
+ msal==1.34.0
164
+ # via
165
+ # azure-identity
166
+ # msal-extensions
167
+ msal-extensions==1.3.1
168
+ # via azure-identity
169
+ multidict==6.7.1
170
+ # via
171
+ # aiohttp
172
+ # yarl
173
+ numpy==2.4.2
174
+ # via pandas
175
+ openai==2.21.0
176
+ # via langchain-openai
177
+ orjson==3.11.7
178
+ # via
179
+ # langgraph-sdk
180
+ # langsmith
181
+ ormsgpack==1.12.2
182
+ # via langgraph-checkpoint
183
+ packaging==23.2
184
+ # via
185
+ # langchain-core
186
+ # langfuse
187
+ # langsmith
188
+ # pytesseract
189
+ pandas==3.0.1
190
+ # via service-explorer-backend (pyproject.toml)
191
+ passlib==1.7.4
192
+ # via service-explorer-backend (pyproject.toml)
193
+ pdf2image==1.17.0
194
+ # via service-explorer-backend (pyproject.toml)
195
+ pillow==12.1.1
196
+ # via
197
+ # pdf2image
198
+ # pytesseract
199
+ propcache==0.4.1
200
+ # via
201
+ # aiohttp
202
+ # yarl
203
+ psycopg2==2.9.11
204
+ # via service-explorer-backend (pyproject.toml)
205
+ pyasn1==0.6.2
206
+ # via
207
+ # python-jose
208
+ # rsa
209
+ pycparser==3.0
210
+ # via cffi
211
+ pydantic==2.12.5
212
+ # via
213
+ # fastapi
214
+ # fastapi-cloud-cli
215
+ # langchain
216
+ # langchain-core
217
+ # langfuse
218
+ # langgraph
219
+ # langsmith
220
+ # openai
221
+ # pydantic-extra-types
222
+ # pydantic-settings
223
+ pydantic-core==2.41.5
224
+ # via pydantic
225
+ pydantic-extra-types==2.11.0
226
+ # via fastapi
227
+ pydantic-settings==2.13.1
228
+ # via fastapi
229
+ pygments==2.19.2
230
+ # via rich
231
+ pyjwt==2.11.0
232
+ # via msal
233
+ pymupdf==1.27.1
234
+ # via service-explorer-backend (pyproject.toml)
235
+ pypdf==6.7.1
236
+ # via service-explorer-backend (pyproject.toml)
237
+ pypdf2==3.0.1
238
+ # via service-explorer-backend (pyproject.toml)
239
+ pytesseract==0.3.13
240
+ # via service-explorer-backend (pyproject.toml)
241
+ python-dateutil==2.9.0.post0
242
+ # via pandas
243
+ python-dotenv==1.2.1
244
+ # via
245
+ # dotenv
246
+ # pydantic-settings
247
+ # uvicorn
248
+ python-jose==3.5.0
249
+ # via service-explorer-backend (pyproject.toml)
250
+ python-multipart==0.0.22
251
+ # via fastapi
252
+ pytz==2025.2
253
+ # via service-explorer-backend (pyproject.toml)
254
+ pyyaml==6.0.3
255
+ # via
256
+ # langchain-core
257
+ # uvicorn
258
+ regex==2026.2.19
259
+ # via tiktoken
260
+ requests==2.32.5
261
+ # via
262
+ # azure-core
263
+ # langsmith
264
+ # msal
265
+ # requests-toolbelt
266
+ # tiktoken
267
+ requests-toolbelt==1.0.0
268
+ # via langsmith
269
+ rich==14.3.3
270
+ # via
271
+ # rich-toolkit
272
+ # typer
273
+ rich-toolkit==0.19.4
274
+ # via
275
+ # fastapi-cli
276
+ # fastapi-cloud-cli
277
+ rignore==0.7.6
278
+ # via fastapi-cloud-cli
279
+ rsa==4.9.1
280
+ # via python-jose
281
+ sentry-sdk==2.53.0
282
+ # via fastapi-cloud-cli
283
+ shellingham==1.5.4
284
+ # via typer
285
+ six==1.17.0
286
+ # via
287
+ # ecdsa
288
+ # python-dateutil
289
+ sniffio==1.3.1
290
+ # via openai
291
+ sqlalchemy==2.0.46
292
+ # via service-explorer-backend (pyproject.toml)
293
+ starlette==0.52.1
294
+ # via
295
+ # fastapi
296
+ # frontend
297
+ tenacity==9.1.4
298
+ # via langchain-core
299
+ tiktoken==0.12.0
300
+ # via langchain-openai
301
+ tqdm==4.67.3
302
+ # via openai
303
+ typer==0.24.0
304
+ # via
305
+ # fastapi-cli
306
+ # fastapi-cloud-cli
307
+ typing-extensions==4.15.0
308
+ # via
309
+ # azure-core
310
+ # azure-identity
311
+ # azure-storage-blob
312
+ # fastapi
313
+ # langchain-core
314
+ # openai
315
+ # pydantic
316
+ # pydantic-core
317
+ # pydantic-extra-types
318
+ # rich-toolkit
319
+ # sqlalchemy
320
+ # typing-inspection
321
+ typing-inspection==0.4.2
322
+ # via
323
+ # fastapi
324
+ # pydantic
325
+ # pydantic-settings
326
+ tzdata==2025.3
327
+ # via pandas
328
+ urllib3==2.6.3
329
+ # via
330
+ # requests
331
+ # sentry-sdk
332
+ uuid-utils==0.14.0
333
+ # via
334
+ # langchain-core
335
+ # langsmith
336
+ uvicorn==0.41.0
337
+ # via
338
+ # service-explorer-backend (pyproject.toml)
339
+ # fastapi
340
+ # fastapi-cli
341
+ # fastapi-cloud-cli
342
+ # frontend
343
+ watchfiles==1.1.1
344
+ # via uvicorn
345
+ websockets==16.0
346
+ # via uvicorn
347
+ wrapt==1.17.3
348
+ # via langfuse
349
+ xxhash==3.6.0
350
+ # via
351
+ # langgraph
352
+ # langsmith
353
+ yarl==1.22.0
354
+ # via aiohttp
355
+ zstandard==0.25.0
356
+ # via langsmith
run.sh ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ uv sync
2
+
3
+ uv lock
4
+
5
+ uv run uvicorn main:app --host 0.0.0.0 --port 8000
services/agentic/agentic_setup.py ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from sqlalchemy.ext.asyncio import AsyncSession
2
+ from externals.databases.pg_models import CVUser
3
+ from services.agentic.filter import AgenticFilterService
4
+ from services.agentic.weight import AgenticWeightService
5
+ # from services.agentic.matching import AgenticMatchingService
6
+ # from services.agentic.profile_scoring import AgenticScoringService
7
+
8
+
9
+ from utils.logger import get_logger
10
+
11
+ logger = get_logger("agentic setup")
12
+
13
+ class AgenticService:
14
+ """
15
+ Facade / Orchestrator for all Agentic services
16
+ """
17
+
18
+ def __init__(self, db: AsyncSession, user: CVUser):
19
+ self.db = db
20
+ self.user = user
21
+
22
+ self.filter = AgenticFilterService(db, user)
23
+ self.weight = AgenticWeightService(db, user)
24
+ # self.filter = AgenticMatchingService(db, user)
25
+ # self.filter = AgenticScoringService(db, user)
26
+
27
+
28
+ # async def scoring_profile(self, input_scoring: PayloadMatchOne):
29
+ # "Generate profile scoring from an extracted profile and a criteria"
30
+ # try:
31
+ # profile : Profile = await get_profile(input_scoring.get("profile_id"))
32
+ # # profile : Profile = asyncio.run(get_profile(input_scoring.get("profile_id")))
33
+
34
+ # tobe_match = InputScoring(
35
+ # **profile,
36
+ # criteria=input_scoring.get("criteria"),
37
+ # criteria_weight=input_scoring.get("criteria_weight")
38
+ # )
39
+ # output = await match_one(input_scoring=tobe_match)
40
+ # # output = asyncio.run(match_one_profile(input_scoring=tobe_match))
41
+ # return output
42
+
43
+ # except Exception as E:
44
+ # logger.error(f"❌ scoring profile error, {E}")
45
+
46
+ # return ResponseExtractOne(
47
+ # status="failed",
48
+ # message=f"scoring profile error, {E}",
49
+ # )
50
+
51
+
52
+ # async def scoring_bulk_profile(self, input_scorings: PayloadMatchBulk):
53
+ # "Generate profile scoring from list of extracted profile and a criteria"
54
+ # try:
55
+ # input_scoring_bulk = InputScoringBulk(
56
+ # profile_ids=input_scorings.get("profile_ids"),
57
+ # criteria=input_scorings.get("criteria"),
58
+ # criteria_weight=input_scorings.get("criteria_weight"),
59
+ # )
60
+
61
+ # outputs = await match_bulk(input_scoring_bulk)
62
+ # return outputs
63
+
64
+ # except Exception as E:
65
+ # logger.error(f"❌ scoring profile bulk error, {E}")
66
+
67
+ # return ResponseMatchBulk(
68
+ # status="failed",
69
+ # message=f"scoring profile bulk error, {E}",
70
+ # )
services/agentic/filter.py ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from fastapi import HTTPException, status
2
+ from sqlalchemy.ext.asyncio import AsyncSession
3
+
4
+ from externals.databases.pg_models import CVFilter
5
+ from externals.databases.pg_crud import (
6
+ create_filter,
7
+ get_filter,
8
+ get_filter_by_id,
9
+ )
10
+ from utils.logger import get_logger
11
+
12
+ logger = get_logger("filter agentic service")
13
+
14
+
15
+ class AgenticFilterService:
16
+ def __init__(self, db: AsyncSession, user):
17
+ self.db = db
18
+ self.user = user
19
+
20
+ async def create_filter(self, filter: CVFilter) -> str:
21
+ """Return criteria_id:str"""
22
+
23
+ # check filter existence
24
+ existing_filter = await get_filter(self.db, filter)
25
+ if existing_filter:
26
+ logger.info(f"Filter already exists: {existing_filter}")
27
+ return existing_filter.criteria_id
28
+
29
+
30
+ # create filter
31
+ filter_id = await create_filter(self.db, filter)
32
+ logger.info(f"Filter not existed yet, creating new filter: {filter_id}")
33
+ return filter_id.criteria_id
34
+
35
+
36
+ async def get_filter_by_id(self, criteria_id: str) -> CVFilter:
37
+ """Return filter object"""
38
+
39
+ filter = await get_filter_by_id(self.db, criteria_id)
40
+ if not filter:
41
+ logger.error(f"Filter not found: {criteria_id}")
42
+ raise HTTPException(
43
+ status_code=status.HTTP_404_NOT_FOUND,
44
+ detail=f"Filter not found: {criteria_id}"
45
+ )
46
+ return filter
47
+
48
+