Some checks failed
CI / v3 / Check ui (pull_request) Failing after 15s
CI / v3 / Test backend (pull_request) Failing after 16s
CI / v3 / Docker / backend (pull_request) Has been skipped
CI / v3 / Docker / runner (pull_request) Has been skipped
CI / v3 / Docker / ui (pull_request) Has been skipped
- Remove all pre-v3 code: scraper, ui-v2, backend v1, ios v1+v2, legacy CI workflows - Flatten v3/ contents to repo root - Add Doppler secrets management (project=libnovel, config=prd) - Add justfile with doppler run wrappers for all docker compose commands - Strip hardcoded env fallbacks from docker-compose.yml - Add minimal README.md - Clean up .gitignore
128 lines
57 KiB
XML
128 lines
57 KiB
XML
<?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" data-d2-version="0.7.1" preserveAspectRatio="xMinYMin meet" viewBox="0 0 4539 2734"><svg class="d2-4154178137 d2-svg" width="4539" height="2734" viewBox="56 -33 4539 2734"><rect x="56.000000" y="-33.000000" width="4539.000000" height="2734.000000" rx="0.000000" fill="#FFFFFF" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[
|
|
.d2-4154178137 .text {
|
|
font-family: "d2-4154178137-font-regular";
|
|
}
|
|
@font-face {
|
|
font-family: d2-4154178137-font-regular;
|
|
src: url("data:application/font-woff;base64,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");
|
|
}
|
|
.d2-4154178137 .text-bold {
|
|
font-family: "d2-4154178137-font-bold";
|
|
}
|
|
@font-face {
|
|
font-family: d2-4154178137-font-bold;
|
|
src: url("data:application/font-woff;base64,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");
|
|
}
|
|
.d2-4154178137 .text-italic {
|
|
font-family: "d2-4154178137-font-italic";
|
|
}
|
|
@font-face {
|
|
font-family: d2-4154178137-font-italic;
|
|
src: url("data:application/font-woff;base64,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");
|
|
}]]></style><style type="text/css"><![CDATA[.shape {
|
|
shape-rendering: geometricPrecision;
|
|
stroke-linejoin: round;
|
|
}
|
|
.connection {
|
|
stroke-linecap: round;
|
|
stroke-linejoin: round;
|
|
}
|
|
.blend {
|
|
mix-blend-mode: multiply;
|
|
opacity: 0.5;
|
|
}
|
|
|
|
.d2-4154178137 .fill-N1{fill:#0A0F25;}
|
|
.d2-4154178137 .fill-N2{fill:#676C7E;}
|
|
.d2-4154178137 .fill-N3{fill:#9499AB;}
|
|
.d2-4154178137 .fill-N4{fill:#CFD2DD;}
|
|
.d2-4154178137 .fill-N5{fill:#DEE1EB;}
|
|
.d2-4154178137 .fill-N6{fill:#EEF1F8;}
|
|
.d2-4154178137 .fill-N7{fill:#FFFFFF;}
|
|
.d2-4154178137 .fill-B1{fill:#0D32B2;}
|
|
.d2-4154178137 .fill-B2{fill:#0D32B2;}
|
|
.d2-4154178137 .fill-B3{fill:#E3E9FD;}
|
|
.d2-4154178137 .fill-B4{fill:#E3E9FD;}
|
|
.d2-4154178137 .fill-B5{fill:#EDF0FD;}
|
|
.d2-4154178137 .fill-B6{fill:#F7F8FE;}
|
|
.d2-4154178137 .fill-AA2{fill:#4A6FF3;}
|
|
.d2-4154178137 .fill-AA4{fill:#EDF0FD;}
|
|
.d2-4154178137 .fill-AA5{fill:#F7F8FE;}
|
|
.d2-4154178137 .fill-AB4{fill:#EDF0FD;}
|
|
.d2-4154178137 .fill-AB5{fill:#F7F8FE;}
|
|
.d2-4154178137 .stroke-N1{stroke:#0A0F25;}
|
|
.d2-4154178137 .stroke-N2{stroke:#676C7E;}
|
|
.d2-4154178137 .stroke-N3{stroke:#9499AB;}
|
|
.d2-4154178137 .stroke-N4{stroke:#CFD2DD;}
|
|
.d2-4154178137 .stroke-N5{stroke:#DEE1EB;}
|
|
.d2-4154178137 .stroke-N6{stroke:#EEF1F8;}
|
|
.d2-4154178137 .stroke-N7{stroke:#FFFFFF;}
|
|
.d2-4154178137 .stroke-B1{stroke:#0D32B2;}
|
|
.d2-4154178137 .stroke-B2{stroke:#0D32B2;}
|
|
.d2-4154178137 .stroke-B3{stroke:#E3E9FD;}
|
|
.d2-4154178137 .stroke-B4{stroke:#E3E9FD;}
|
|
.d2-4154178137 .stroke-B5{stroke:#EDF0FD;}
|
|
.d2-4154178137 .stroke-B6{stroke:#F7F8FE;}
|
|
.d2-4154178137 .stroke-AA2{stroke:#4A6FF3;}
|
|
.d2-4154178137 .stroke-AA4{stroke:#EDF0FD;}
|
|
.d2-4154178137 .stroke-AA5{stroke:#F7F8FE;}
|
|
.d2-4154178137 .stroke-AB4{stroke:#EDF0FD;}
|
|
.d2-4154178137 .stroke-AB5{stroke:#F7F8FE;}
|
|
.d2-4154178137 .background-color-N1{background-color:#0A0F25;}
|
|
.d2-4154178137 .background-color-N2{background-color:#676C7E;}
|
|
.d2-4154178137 .background-color-N3{background-color:#9499AB;}
|
|
.d2-4154178137 .background-color-N4{background-color:#CFD2DD;}
|
|
.d2-4154178137 .background-color-N5{background-color:#DEE1EB;}
|
|
.d2-4154178137 .background-color-N6{background-color:#EEF1F8;}
|
|
.d2-4154178137 .background-color-N7{background-color:#FFFFFF;}
|
|
.d2-4154178137 .background-color-B1{background-color:#0D32B2;}
|
|
.d2-4154178137 .background-color-B2{background-color:#0D32B2;}
|
|
.d2-4154178137 .background-color-B3{background-color:#E3E9FD;}
|
|
.d2-4154178137 .background-color-B4{background-color:#E3E9FD;}
|
|
.d2-4154178137 .background-color-B5{background-color:#EDF0FD;}
|
|
.d2-4154178137 .background-color-B6{background-color:#F7F8FE;}
|
|
.d2-4154178137 .background-color-AA2{background-color:#4A6FF3;}
|
|
.d2-4154178137 .background-color-AA4{background-color:#EDF0FD;}
|
|
.d2-4154178137 .background-color-AA5{background-color:#F7F8FE;}
|
|
.d2-4154178137 .background-color-AB4{background-color:#EDF0FD;}
|
|
.d2-4154178137 .background-color-AB5{background-color:#F7F8FE;}
|
|
.d2-4154178137 .color-N1{color:#0A0F25;}
|
|
.d2-4154178137 .color-N2{color:#676C7E;}
|
|
.d2-4154178137 .color-N3{color:#9499AB;}
|
|
.d2-4154178137 .color-N4{color:#CFD2DD;}
|
|
.d2-4154178137 .color-N5{color:#DEE1EB;}
|
|
.d2-4154178137 .color-N6{color:#EEF1F8;}
|
|
.d2-4154178137 .color-N7{color:#FFFFFF;}
|
|
.d2-4154178137 .color-B1{color:#0D32B2;}
|
|
.d2-4154178137 .color-B2{color:#0D32B2;}
|
|
.d2-4154178137 .color-B3{color:#E3E9FD;}
|
|
.d2-4154178137 .color-B4{color:#E3E9FD;}
|
|
.d2-4154178137 .color-B5{color:#EDF0FD;}
|
|
.d2-4154178137 .color-B6{color:#F7F8FE;}
|
|
.d2-4154178137 .color-AA2{color:#4A6FF3;}
|
|
.d2-4154178137 .color-AA4{color:#EDF0FD;}
|
|
.d2-4154178137 .color-AA5{color:#F7F8FE;}
|
|
.d2-4154178137 .color-AB4{color:#EDF0FD;}
|
|
.d2-4154178137 .color-AB5{color:#F7F8FE;}.appendix text.text{fill:#0A0F25}.md{--color-fg-default:#0A0F25;--color-fg-muted:#676C7E;--color-fg-subtle:#9499AB;--color-canvas-default:#FFFFFF;--color-canvas-subtle:#EEF1F8;--color-border-default:#0D32B2;--color-border-muted:#0D32B2;--color-neutral-muted:#EEF1F8;--color-accent-fg:#0D32B2;--color-accent-emphasis:#0D32B2;--color-attention-subtle:#676C7E;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-darker-d2-4154178137);mix-blend-mode:lighten}.sketch-overlay-B2{fill:url(#streaks-darker-d2-4154178137);mix-blend-mode:lighten}.sketch-overlay-B3{fill:url(#streaks-bright-d2-4154178137);mix-blend-mode:darken}.sketch-overlay-B4{fill:url(#streaks-bright-d2-4154178137);mix-blend-mode:darken}.sketch-overlay-B5{fill:url(#streaks-bright-d2-4154178137);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright-d2-4154178137);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-dark-d2-4154178137);mix-blend-mode:overlay}.sketch-overlay-AA4{fill:url(#streaks-bright-d2-4154178137);mix-blend-mode:darken}.sketch-overlay-AA5{fill:url(#streaks-bright-d2-4154178137);mix-blend-mode:darken}.sketch-overlay-AB4{fill:url(#streaks-bright-d2-4154178137);mix-blend-mode:darken}.sketch-overlay-AB5{fill:url(#streaks-bright-d2-4154178137);mix-blend-mode:darken}.sketch-overlay-N1{fill:url(#streaks-darker-d2-4154178137);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark-d2-4154178137);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal-d2-4154178137);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal-d2-4154178137);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-bright-d2-4154178137);mix-blend-mode:darken}.sketch-overlay-N6{fill:url(#streaks-bright-d2-4154178137);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright-d2-4154178137);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}]]></style><g class="bGVnZW5k"><g class="shape" ><rect x="157.000000" y="381.000000" width="185.000000" height="378.000000" stroke="#d4d4d8" fill="#fafafa" style="stroke-width:2;" /></g><text x="249.500000" y="368.000000" fill="#0A0F25" class="text fill-N1" style="text-anchor:middle;font-size:28px">Legend</text></g><g class="Y2xpZW50"><g class="shape" ><path d="M 319 1815 H 179 V 1814 C 179 1798 194 1784 219 1777 C 205 1771 197 1762 197 1752 C 197 1736 220 1722 249 1722 C 277 1722 301 1736 301 1752 C 301 1762 293 1771 280 1777 C 304 1784 320 1798 320 1814 V 1815 H 319 Z" stroke="#0D32B2" fill="#fff9e6" class=" stroke-B1" style="stroke-width:2;" /></g><text x="249.000000" y="1836.000000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">Browser / iOS App</text></g><g class="Y2FkZHk="><g class="shape" ><rect x="930.000000" y="1711.000000" width="262.000000" height="114.000000" stroke="#0D32B2" fill="#f1f5f9" class=" stroke-B1" style="stroke-width:2;" /></g><text x="1061.000000" y="1749.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="1061.000000" dy="0.000000">Caddy :443</tspan><tspan x="1061.000000" dy="17.250000">custom build · caddy-ratelimit</tspan><tspan x="1061.000000" dy="17.250000">security headers · rate limiting</tspan><tspan x="1061.000000" dy="17.250000">static error pages</tspan></text></g><g class="c2s="><g class="shape" ><rect x="1861.000000" y="367.000000" width="393.000000" height="2119.000000" stroke="#0D32B2" fill="#fef3c7" class=" stroke-B1" style="stroke-width:2;" /></g><text x="2057.500000" y="354.000000" fill="#0A0F25" class="text fill-N1" style="text-anchor:middle;font-size:28px">SvelteKit UI :3000</text></g><g class="YmU="><g class="shape" ><rect x="3062.000000" y="1301.000000" width="382.000000" height="943.000000" stroke="#0D32B2" fill="#eef3ff" class=" stroke-B1" style="stroke-width:2;" /></g><text x="3253.000000" y="1288.000000" fill="#0A0F25" class="text fill-N1" style="text-anchor:middle;font-size:28px">Backend API :8080</text></g><g class="c3RvcmFnZQ=="><g class="shape" ><rect x="4204.000000" y="565.000000" width="290.000000" height="1885.000000" stroke="#0D32B2" fill="#eaf7ea" class=" stroke-B1" style="stroke-width:2;" /></g><text x="4349.000000" y="552.000000" fill="#0A0F25" class="text fill-N1" style="text-anchor:middle;font-size:28px">Storage</text></g><g class="bGVnZW5kLnB1Yg=="><g class="shape" ><rect x="205.000000" y="411.000000" width="89.000000" height="66.000000" stroke="#86efac" fill="#f0fdf4" style="stroke-width:2;" /></g><text x="249.500000" y="449.500000" fill="#15803d" class="text-bold" style="text-anchor:middle;font-size:16px">public</text></g><g class="bGVnZW5kLnVzZXI="><g class="shape" ><rect x="193.000000" y="537.000000" width="112.000000" height="66.000000" stroke="#93c5fd" fill="#eff6ff" style="stroke-width:2;" /></g><text x="249.000000" y="575.500000" fill="#1d4ed8" class="text-bold" style="text-anchor:middle;font-size:16px">user auth</text></g><g class="bGVnZW5kLmFkbQ=="><g class="shape" ><rect x="187.000000" y="663.000000" width="125.000000" height="66.000000" stroke="#fdba74" fill="#fff7ed" style="stroke-width:2;" /></g><text x="249.500000" y="701.500000" fill="#c2410c" class="text-bold" style="text-anchor:middle;font-size:16px">admin only</text></g><g class="c2suYXV0aA=="><g class="shape" ><rect x="1916.000000" y="397.000000" width="283.000000" height="114.000000" stroke="#f59e0b" fill="#fde68a" style="stroke-width:2;" /></g><text x="2057.500000" y="435.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="2057.500000" dy="0.000000">POST /api/auth/login</tspan><tspan x="2057.500000" dy="17.250000">POST /api/auth/register</tspan><tspan x="2057.500000" dy="17.250000">POST /api/auth/change-password</tspan><tspan x="2057.500000" dy="17.250000">GET /api/auth/session</tspan></text></g><g class="c2suY2F0YWxvZ3VlX3Nr"><g class="shape" ><rect x="1948.000000" y="2216.000000" width="219.000000" height="82.000000" stroke="#86efac" fill="#f0fdf4" style="stroke-width:2;" /></g><text x="2057.500000" y="2254.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="2057.500000" dy="0.000000">GET /api/catalogue-page</tspan><tspan x="2057.500000" dy="18.500000">GET /api/search</tspan></text></g><g class="c2suYm9va19zaw=="><g class="shape" ><rect x="1891.000000" y="1578.000000" width="333.000000" height="98.000000" stroke="#86efac" fill="#f0fdf4" style="stroke-width:2;" /></g><text x="2057.500000" y="1616.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="2057.500000" dy="0.000000">GET /api/book/{slug}</tspan><tspan x="2057.500000" dy="17.666667">GET /api/chapter/{slug}/{n}</tspan><tspan x="2057.500000" dy="17.666667">GET /api/chapter-text-preview/{slug}/{n}</tspan></text></g><g class="c2suc2NyYXBlX3Nr"><g class="shape" ><rect x="1934.000000" y="571.000000" width="248.000000" height="130.000000" stroke="#fdba74" fill="#fff7ed" style="stroke-width:2;" /></g><text x="2058.000000" y="609.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="2058.000000" dy="0.000000">GET /api/scrape/status</tspan><tspan x="2058.000000" dy="17.000000">GET /api/scrape/tasks</tspan><tspan x="2058.000000" dy="17.000000">POST /api/scrape</tspan><tspan x="2058.000000" dy="17.000000">POST /api/scrape/range</tspan><tspan x="2058.000000" dy="17.000000">POST /api/scrape/cancel/{id}</tspan></text></g><g class="c2suYXVkaW9fc2s="><g class="shape" ><rect x="1921.000000" y="2358.000000" width="274.000000" height="98.000000" stroke="#86efac" fill="#f0fdf4" style="stroke-width:2;" /></g><text x="2058.000000" y="2396.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="2058.000000" dy="0.000000">POST /api/audio/{slug}/{n}</tspan><tspan x="2058.000000" dy="17.666667">GET /api/audio/status/{slug}/{n}</tspan><tspan x="2058.000000" dy="17.666667">GET /api/voices</tspan></text></g><g class="c2sucHJlc2lnbl9zaw=="><g class="shape" ><rect x="1900.000000" y="1889.000000" width="316.000000" height="98.000000" stroke="#86efac" fill="#f0fdf4" style="stroke-width:2;" /></g><text x="2058.000000" y="1927.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="2058.000000" dy="0.000000">GET /api/presign/chapter/{slug}/{n}</tspan><tspan x="2058.000000" dy="17.666667">GET /api/presign/audio/{slug}/{n}</tspan><tspan x="2058.000000" dy="17.666667">GET /api/presign/voice-sample/{voice}</tspan></text></g><g class="c2sucHJlc2lnbl91c2Vy"><g class="shape" ><rect x="1893.000000" y="1219.000000" width="330.000000" height="82.000000" stroke="#93c5fd" fill="#eff6ff" style="stroke-width:2;" /></g><text x="2058.000000" y="1257.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="2058.000000" dy="0.000000">GET /api/presign/avatar-upload/{userId}</tspan><tspan x="2058.000000" dy="18.500000">GET /api/presign/avatar/{userId}</tspan></text></g><g class="c2sucHJvZ3Jlc3Nfc2s="><g class="shape" ><rect x="1936.000000" y="761.000000" width="243.000000" height="98.000000" stroke="#86efac" fill="#f0fdf4" style="stroke-width:2;" /></g><text x="2057.500000" y="799.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="2057.500000" dy="0.000000">GET /api/progress</tspan><tspan x="2057.500000" dy="17.666667">POST /api/progress/{slug}</tspan><tspan x="2057.500000" dy="17.666667">DELETE /api/progress/{slug}</tspan></text></g><g class="c2subGlicmFyeV9zaw=="><g class="shape" ><rect x="1943.000000" y="919.000000" width="229.000000" height="98.000000" stroke="#86efac" fill="#f0fdf4" style="stroke-width:2;" /></g><text x="2057.500000" y="957.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="2057.500000" dy="0.000000">GET /api/library</tspan><tspan x="2057.500000" dy="17.666667">POST /api/library/{slug}</tspan><tspan x="2057.500000" dy="17.666667">DELETE /api/library/{slug}</tspan></text></g><g class="c2suY29tbWVudHNfc2s="><g class="shape" ><rect x="1938.000000" y="1077.000000" width="240.000000" height="82.000000" stroke="#86efac" fill="#f0fdf4" style="stroke-width:2;" /></g><text x="2058.000000" y="1115.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="2058.000000" dy="0.000000">GET /api/comments/{slug}</tspan><tspan x="2058.000000" dy="18.500000">POST /api/comments/{slug}</tspan></text></g><g class="YmUuaGVhbHRoX2Jl"><g class="shape" ><rect x="3172.000000" y="1331.000000" width="162.000000" height="82.000000" stroke="#86efac" fill="#f0fdf4" style="stroke-width:2;" /></g><text x="3253.000000" y="1369.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="3253.000000" dy="0.000000">GET /health</tspan><tspan x="3253.000000" dy="18.500000">GET /api/version</tspan></text></g><g class="YmUuc2NyYXBlX2Jl"><g class="shape" ><rect x="3141.000000" y="1473.000000" width="225.000000" height="98.000000" stroke="#fdba74" fill="#fff7ed" style="stroke-width:2;" /></g><text x="3253.500000" y="1511.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="3253.500000" dy="0.000000">POST /scrape</tspan><tspan x="3253.500000" dy="17.666667">POST /scrape/book</tspan><tspan x="3253.500000" dy="17.666667">POST /scrape/book/range</tspan></text></g><g class="YmUuY2F0YWxvZ3VlX2Jl"><g class="shape" ><rect x="3121.000000" y="1893.000000" width="265.000000" height="114.000000" stroke="#86efac" fill="#f0fdf4" style="stroke-width:2;" /></g><text x="3253.500000" y="1931.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="3253.500000" dy="0.000000">GET /api/browse</tspan><tspan x="3253.500000" dy="17.250000">GET /api/catalogue</tspan><tspan x="3253.500000" dy="17.250000">GET /api/ranking</tspan><tspan x="3253.500000" dy="17.250000">GET /api/cover/{domain}/{slug}</tspan></text></g><g class="YmUuYm9va19iZQ=="><g class="shape" ><rect x="3092.000000" y="1631.000000" width="322.000000" height="114.000000" stroke="#86efac" fill="#f0fdf4" style="stroke-width:2;" /></g><text x="3253.000000" y="1669.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="3253.000000" dy="0.000000">GET /api/book-preview/{slug}</tspan><tspan x="3253.000000" dy="17.250000">GET /api/chapter-text/{slug}/{n}</tspan><tspan x="3253.000000" dy="17.250000">GET /api/chapter-markdown/{slug}/{n}</tspan><tspan x="3253.000000" dy="17.250000">POST /api/reindex/{slug} ⚠ admin</tspan></text></g><g class="YmUuYXVkaW9fYmU="><g class="shape" ><rect x="3119.000000" y="2132.000000" width="268.000000" height="82.000000" stroke="#86efac" fill="#f0fdf4" style="stroke-width:2;" /></g><text x="3253.000000" y="2170.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="3253.000000" dy="0.000000">GET /api/audio-proxy/{slug}/{n}</tspan><tspan x="3253.000000" dy="18.500000">GET /api/voices</tspan></text></g><g class="c3RvcmFnZS5wYg=="><g class="shape" ><path d="M 4234 619 C 4234 595 4338 595 4349 595 C 4361 595 4464 595 4464 619 V 721 C 4464 745 4361 745 4349 745 C 4338 745 4234 745 4234 721 V 619 Z" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /><path d="M 4234 619 C 4234 643 4338 643 4349 643 C 4361 643 4464 643 4464 619" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="4349.000000" y="671.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="4349.000000" dy="0.000000">auth · books · progress</tspan><tspan x="4349.000000" dy="17.666667">comments · library</tspan><tspan x="4349.000000" dy="17.666667">scrape_jobs · audio_cache</tspan></text></g><g class="c3RvcmFnZS5tbg=="><g class="shape" ><path d="M 4268 1665 C 4268 1641 4341 1641 4349 1641 C 4357 1641 4430 1641 4430 1665 V 1751 C 4430 1775 4357 1775 4349 1775 C 4341 1775 4268 1775 4268 1751 V 1665 Z" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /><path d="M 4268 1665 C 4268 1689 4341 1689 4349 1689 C 4357 1689 4430 1689 4430 1665" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="4349.000000" y="1717.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="4349.000000" dy="0.000000">chapters · audio</tspan><tspan x="4349.000000" dy="18.500000">avatars · browse</tspan></text></g><g class="c3RvcmFnZS5tcw=="><g class="shape" ><path d="M 4282 2148 C 4282 2124 4343 2124 4350 2124 C 4356 2124 4417 2124 4417 2148 V 2218 C 4417 2242 4356 2242 4350 2242 C 4343 2242 4282 2242 4282 2218 V 2148 Z" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /><path d="M 4282 2148 C 4282 2172 4343 2172 4350 2172 C 4356 2172 4417 2172 4417 2148" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="4349.500000" y="2200.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">index: books</text></g><g class="c3RvcmFnZS52aw=="><g class="shape" ><path d="M 4263 2326 C 4263 2302 4341 2302 4350 2302 C 4358 2302 4436 2302 4436 2326 V 2396 C 4436 2420 4358 2420 4350 2420 C 4341 2420 4263 2420 4263 2396 V 2326 Z" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /><path d="M 4263 2326 C 4263 2350 4341 2350 4350 2350 C 4358 2350 4436 2350 4436 2326" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="4349.500000" y="2378.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">presign URL cache</text></g><g class="KGNsaWVudCAtJmd0OyBjYWRkeSlbMF0="><marker id="mk-d2-4154178137-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" fill="#0D32B2" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 294.999999 1768.002438 C 457.000000 1768.199951 757.200012 1768.250000 926.000000 1768.250000" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-4154178137-3488378134)" mask="url(#d2-4154178137)" /><text x="611.000000" y="1774.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">HTTPS :443</text></g><g class="KGNhZGR5IC0mZ3Q7IHNrKVswXQ=="><path d="M 1193.834252 1825.297194 C 1400.000000 1914.900024 1533.800049 1937.500000 1857.000000 1937.500000" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-4154178137-3488378134)" mask="url(#d2-4154178137)" /><text x="1516.000000" y="1932.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="1516.000000" dy="0.000000">/* (catch-all)</tspan><tspan x="1516.000000" dy="18.500000">→ SvelteKit handles auth</tspan></text></g><g class="KGNhZGR5IC0mZ3Q7IGJlKVswXQ=="><path d="M 1090.098219 1827.042470 C 1379.442017 2411.649902 1504.000000 2558.250000 1582.000000 2558.250000 C 1660.000000 2558.250000 1781.099976 2558.250000 1884.750000 2558.250000 C 1988.400024 2558.250000 2126.600098 2558.250000 2230.250000 2558.250000 C 2333.899902 2558.250000 2738.800049 1934.250000 3058.000000 1934.250000" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-4154178137-3488378134)" mask="url(#d2-4154178137)" /><text x="2029.000000" y="2532.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="2029.000000" dy="0.000000">/health /scrape*</tspan><tspan x="2029.000000" dy="17.000000">/api/browse /api/book-preview/*</tspan><tspan x="2029.000000" dy="17.000000">/api/chapter-text/* /api/chapter-markdown/*</tspan><tspan x="2029.000000" dy="17.000000">/api/reindex/* /api/cover/*</tspan><tspan x="2029.000000" dy="17.000000">/api/audio-proxy/* /api/catalogue /api/ranking</tspan></text></g><g class="KGNhZGR5IC0mZ3Q7IHN0b3JhZ2UubW4pWzBd"><path d="M 1077.510662 1709.066293 C 1377.000000 575.000000 1504.000000 291.000000 1582.000000 291.000000 C 1660.000000 291.000000 1781.099976 291.000000 1884.750000 291.000000 C 1988.400024 291.000000 2126.600098 291.000000 2230.250000 291.000000 C 2333.899902 291.000000 2454.000000 348.649994 2530.500000 435.125000 C 2607.000000 521.599976 2709.000000 579.250000 2785.500000 579.250000 C 2862.000000 579.250000 2981.000000 579.250000 3083.000000 579.250000 C 3185.000000 579.250000 3321.000000 579.250000 3423.000000 579.250000 C 3525.000000 579.250000 3639.199951 668.700012 3708.500000 802.875000 C 3777.800049 937.049988 4108.200195 1149.599976 4319.413172 1638.328219" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-4154178137-3488378134)" mask="url(#d2-4154178137)" /><text x="2484.000000" y="364.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="2484.000000" dy="0.000000">/avatars/*</tspan><tspan x="2484.000000" dy="17.250000">/libnovel-audio/*</tspan><tspan x="2484.000000" dy="17.250000">/libnovel-chapters/*</tspan><tspan x="2484.000000" dy="17.250000">(presigned MinIO GETs)</tspan></text></g><g class="KHNrLmNhdGFsb2d1ZV9zayAtJmd0OyBiZS5jYXRhbG9ndWVfYmUpWzBd"><path d="M 2100.997176 2214.354040 C 2342.312988 1979.150024 2454.000000 1937.599976 2530.500000 1964.000000 C 2607.000000 1990.400024 2954.500000 2000.859009 3116.557926 1972.975271" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-4154178137-3488378134)" mask="url(#d2-4154178137)" /><text x="2558.000000" y="1979.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">internal proxy</text></g><g class="KHNrLmJvb2tfc2sgLSZndDsgYmUuYm9va19iZSlbMF0="><path d="M 2225.970665 1656.841289 C 2367.199951 1681.300049 2454.000000 1687.500000 2530.500000 1687.500000 C 2607.000000 1687.500000 2948.800049 1687.500000 3088.000000 1687.500000" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-4154178137-3488378134)" mask="url(#d2-4154178137)" /><text x="2657.000000" y="1693.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">internal proxy</text></g><g class="KHNrLmF1ZGlvX3NrIC0mZ3Q7IGJlLmF1ZGlvX2JlKVswXQ=="><path d="M 2103.726761 2356.275083 C 2342.875000 2095.149902 2454.000000 2058.100098 2530.500000 2101.000000 C 2607.000000 2143.899902 2954.199951 2172.500000 3115.000000 2172.500000" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-4154178137-3488378134)" mask="url(#d2-4154178137)" /><text x="2548.000000" y="2116.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">internal proxy</text></g><g class="KHNrLnByZXNpZ25fc2sgLSZndDsgc3RvcmFnZS52aylbMF0="><path d="M 2116.873295 1988.805224 C 2345.470947 2185.699951 2454.000000 2263.850098 2530.500000 2306.750000 C 2607.000000 2349.649902 2709.000000 2378.250000 2785.500000 2378.250000 C 2862.000000 2378.250000 2981.000000 2378.250000 3083.000000 2378.250000 C 3185.000000 2378.250000 3321.000000 2378.250000 3423.000000 2378.250000 C 3525.000000 2378.250000 3639.199951 2370.149902 3708.500000 2358.000000 C 3777.800049 2345.850098 4096.600098 2341.000000 4259.012151 2353.688449" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-4154178137-3488378134)" mask="url(#d2-4154178137)" /><text x="3128.000000" y="2384.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">check cache</text></g><g class="KHNrLnByZXNpZ25fc2sgLSZndDsgc3RvcmFnZS5tbilbMF0="><path d="M 2081.894799 1886.697090 C 2338.604980 1352.099976 2454.000000 1218.000000 2530.500000 1218.000000 C 2607.000000 1218.000000 2709.000000 1218.000000 2785.500000 1218.000000 C 2862.000000 1218.000000 2981.000000 1218.000000 3083.000000 1218.000000 C 3185.000000 1218.000000 3321.000000 1218.000000 3423.000000 1218.000000 C 3525.000000 1218.000000 3639.199951 1269.900024 3708.500000 1347.750000 C 3777.800049 1425.599976 4099.600098 1512.400024 4274.849831 1649.534957" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-4154178137-3488378134)" mask="url(#d2-4154178137)" /><text x="3050.500000" y="1224.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">generate presign</text></g><g class="KHNrLnByZXNpZ25fdXNlciAtJmd0OyBzdG9yYWdlLm1uKVswXQ=="><path d="M 2225.500000 1260.000000 C 2367.100098 1260.000000 2454.000000 1260.000000 2530.500000 1260.000000 C 2607.000000 1260.000000 2709.000000 1260.000000 2785.500000 1260.000000 C 2862.000000 1260.000000 2981.000000 1260.000000 3083.000000 1260.000000 C 3185.000000 1260.000000 3321.000000 1260.000000 3423.000000 1260.000000 C 3525.000000 1260.000000 3639.199951 1309.599976 3708.500000 1384.000000 C 3777.800049 1458.400024 4098.398926 1537.599976 4268.695407 1653.746189" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-4154178137-3488378134)" mask="url(#d2-4154178137)" /><text x="3308.500000" y="1266.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">generate presign</text></g><g class="KHNrLmF1dGggLSZndDsgc3RvcmFnZS5wYilbMF0="><path d="M 2201.000000 454.000000 C 2362.199951 454.000000 2454.000000 378.700012 2530.500000 265.750000 C 2607.000000 152.800003 2709.000000 77.500000 2785.500000 77.500000 C 2862.000000 77.500000 2981.000000 77.500000 3083.000000 77.500000 C 3185.000000 77.500000 3321.000000 77.500000 3423.000000 77.500000 C 3525.000000 77.500000 3639.199951 77.500000 3708.500000 77.500000 C 3777.800049 77.500000 4105.799805 181.199997 4307.240301 592.407862" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-4154178137-3488378134)" mask="url(#d2-4154178137)" /><text x="3306.000000" y="83.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">sessions / users</text></g><g class="KHNrLnNjcmFwZV9zayAtJmd0OyBzdG9yYWdlLnBiKVswXQ=="><path d="M 2184.000000 636.000000 C 2358.800049 636.000000 2454.000000 544.549988 2530.500000 407.375000 C 2607.000000 270.200012 2709.000000 178.750000 2785.500000 178.750000 C 2862.000000 178.750000 2981.000000 178.750000 3083.000000 178.750000 C 3185.000000 178.750000 3321.000000 178.750000 3423.000000 178.750000 C 3525.000000 178.750000 3639.199951 178.750000 3708.500000 178.750000 C 3777.800049 178.750000 4104.200195 262.399994 4298.972101 593.552156" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-4154178137-3488378134)" mask="url(#d2-4154178137)" /><text x="3226.000000" y="184.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">scrape job records</text></g><g class="KHNrLnByb2dyZXNzX3NrIC0mZ3Q7IHN0b3JhZ2UucGIpWzBd"><path d="M 2181.000000 810.000000 C 2358.199951 810.000000 2454.000000 704.200012 2530.500000 545.500000 C 2607.000000 386.799011 2709.000000 281.000000 2785.500000 281.000000 C 2862.000000 281.000000 2981.000000 281.000000 3083.000000 281.000000 C 3185.000000 281.000000 3321.000000 281.000000 3423.000000 281.000000 C 3525.000000 281.000000 3639.199951 281.000000 3708.500000 281.000000 C 3777.800049 281.000000 4101.398926 344.399994 4284.637628 594.772122" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-4154178137-3488378134)" mask="url(#d2-4154178137)" /></g><g class="KHNrLmxpYnJhcnlfc2sgLSZndDsgc3RvcmFnZS5wYilbMF0="><path d="M 2174.000000 968.000000 C 2356.800049 968.000000 2454.000000 857.599976 2530.500000 692.000000 C 2607.000000 526.400024 2709.000000 416.000000 2785.500000 416.000000 C 2862.000000 416.000000 2981.000000 416.000000 3083.000000 416.000000 C 3185.000000 416.000000 3321.000000 416.000000 3423.000000 416.000000 C 3525.000000 416.000000 3639.199951 416.000000 3708.500000 416.000000 C 3777.800049 416.000000 4097.799805 453.000000 4265.973979 598.384050" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-4154178137-3488378134)" mask="url(#d2-4154178137)" /></g><g class="KHNrLmNvbW1lbnRzX3NrIC0mZ3Q7IHN0b3JhZ2UucGIpWzBd"><path d="M 2180.500000 1118.000000 C 2358.100098 1118.000000 2454.000000 994.599976 2530.500000 809.500000 C 2607.000000 624.400024 2709.000000 501.000000 2785.500000 501.000000 C 2862.000000 501.000000 2981.000000 501.000000 3083.000000 501.000000 C 3185.000000 501.000000 3321.000000 501.000000 3423.000000 501.000000 C 3525.000000 501.000000 3639.199951 501.000000 3708.500000 501.000000 C 3777.800049 501.000000 4092.399902 522.599976 4238.536183 606.999507" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-4154178137-3488378134)" mask="url(#d2-4154178137)" /></g><g class="KGJlLmNhdGFsb2d1ZV9iZSAtJmd0OyBzdG9yYWdlLm1zKVswXQ=="><path d="M 3338.646662 2008.630861 C 3541.799072 2147.899902 3639.199951 2183.000000 3708.500000 2183.000000 C 3777.800049 2183.000000 4100.398926 2183.000000 4278.000000 2183.000000" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-4154178137-3488378134)" mask="url(#d2-4154178137)" /><text x="3785.000000" y="2189.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">full-text search</text></g><g class="KGJlLmNhdGFsb2d1ZV9iZSAtJmd0OyBzdG9yYWdlLnBiKVswXQ=="><path d="M 3297.222880 1890.903622 C 3533.603027 1577.699951 3639.199951 1358.599976 3708.500000 1148.000000 C 3777.800049 937.400024 4090.800049 781.400024 4230.333024 720.597901" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-4154178137-3488378134)" mask="url(#d2-4154178137)" /><text x="3688.000000" y="1216.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">ranking records</text></g><g class="KGJlLmNhdGFsb2d1ZV9iZSAtJmd0OyBzdG9yYWdlLm1uKVswXQ=="><path d="M 3388.500000 1949.500000 C 3551.699951 1949.500000 3639.199951 1949.500000 3708.500000 1949.500000 C 3777.800049 1949.500000 4100.000000 1912.599976 4276.906929 1767.536318" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-4154178137-3488378134)" mask="url(#d2-4154178137)" /><text x="3860.000000" y="1946.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">cover presign</text></g><g class="KGJlLmJvb2tfYmUgLSZndDsgc3RvcmFnZS5tbilbMF0="><path d="M 3311.246663 1746.913795 C 3536.365967 1971.900024 3639.199951 2028.500000 3708.500000 2028.500000 C 3777.800049 2028.500000 4102.398926 1976.599976 4289.302509 1771.953565" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-4154178137-3488378134)" mask="url(#d2-4154178137)" /><text x="3794.000000" y="2031.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">chapter objects</text></g><g class="KGJlLmJvb2tfYmUgLSZndDsgc3RvcmFnZS5wYilbMF0="><path d="M 3415.999969 1687.488826 C 3557.199951 1686.699951 3639.199951 1548.400024 3708.500000 1341.250000 C 3777.800049 1134.099976 4100.799805 945.200012 4281.321556 744.970848" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-4154178137-3488378134)" mask="url(#d2-4154178137)" /><text x="3763.000000" y="1184.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">book metadata</text></g><g class="KGJlLmF1ZGlvX2JlIC0mZ3Q7IHN0b3JhZ2UubW4pWzBd"><path d="M 3388.914098 2131.325178 C 3551.800049 2081.980957 3639.199951 2069.500000 3708.500000 2069.500000 C 3777.800049 2069.500000 4103.398926 2009.599976 4294.486039 1773.111269" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-4154178137-3488378134)" mask="url(#d2-4154178137)" /><text x="3896.000000" y="2053.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">audio presign</text></g><g class="KGJlLmF1ZGlvX2JlIC0mZ3Q7IHN0b3JhZ2UudmspWzBd"><path d="M 3367.622211 2215.184298 C 3547.548096 2280.699951 3639.199951 2313.050049 3708.500000 2336.750000 C 3777.800049 2360.449951 4096.600098 2374.000000 4259.005838 2365.216031" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-4154178137-3488378134)" mask="url(#d2-4154178137)" /><text x="3802.000000" y="2367.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">presign cache</text></g><mask id="d2-4154178137" maskUnits="userSpaceOnUse" x="56" y="-33" width="4539" height="2734">
|
|
<rect x="56" y="-33" width="4539" height="2734" fill="white"></rect>
|
|
<rect x="572.000000" y="1758.000000" width="78" height="21" fill="black"></rect>
|
|
<rect x="1433.000000" y="1916.000000" width="166" height="37" fill="black"></rect>
|
|
<rect x="1868.000000" y="2516.000000" width="322" height="85" fill="black"></rect>
|
|
<rect x="2406.000000" y="348.000000" width="156" height="69" fill="black"></rect>
|
|
<rect x="2510.000000" y="1963.000000" width="96" height="21" fill="black"></rect>
|
|
<rect x="2609.000000" y="1677.000000" width="96" height="21" fill="black"></rect>
|
|
<rect x="2500.000000" y="2100.000000" width="96" height="21" fill="black"></rect>
|
|
<rect x="3086.000000" y="2368.000000" width="84" height="21" fill="black"></rect>
|
|
<rect x="2993.000000" y="1208.000000" width="115" height="21" fill="black"></rect>
|
|
<rect x="3251.000000" y="1250.000000" width="115" height="21" fill="black"></rect>
|
|
<rect x="3253.000000" y="67.000000" width="106" height="21" fill="black"></rect>
|
|
<rect x="3163.000000" y="168.000000" width="126" height="21" fill="black"></rect>
|
|
<rect x="3734.000000" y="2173.000000" width="102" height="21" fill="black"></rect>
|
|
<rect x="3634.000000" y="1200.000000" width="108" height="21" fill="black"></rect>
|
|
<rect x="3814.000000" y="1930.000000" width="92" height="21" fill="black"></rect>
|
|
<rect x="3741.000000" y="2015.000000" width="106" height="21" fill="black"></rect>
|
|
<rect x="3710.000000" y="1168.000000" width="106" height="21" fill="black"></rect>
|
|
<rect x="3849.000000" y="2037.000000" width="94" height="21" fill="black"></rect>
|
|
<rect x="3754.000000" y="2351.000000" width="96" height="21" fill="black"></rect>
|
|
</mask></svg></svg>
|