From e915e1aa7daef5d8e484225ecd8a527173560bee Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Sun, 9 Nov 2025 12:43:33 +0000 Subject: [PATCH] tpye3 text edit init --- .gitignore | 14 + .../src/main/resources/settings.yml.template | 4 + .../src/main/resources/type3/catalogue.json | 592 + .../type3/library/fonts/cm/cmmi10.ttf | 25 + .../type3/library/fonts/cm/cmr10.ttf | Bin 0 -> 26348 bytes .../type3/library/fonts/cm/cmsy10.ttf | Bin 0 -> 29396 bytes .../library/fonts/dejavu/DejaVuSans-Bold.ttf | Bin 0 -> 708920 bytes .../fonts/dejavu/DejaVuSans-Oblique.ttf | Bin 0 -> 637648 bytes .../type3/library/fonts/dejavu/DejaVuSans.ttf | Bin 0 -> 759720 bytes .../library/fonts/dejavu/DejaVuSansMono.ttf | Bin 0 -> 343140 bytes .../scp/SauceCodeProNerdFont-Regular.ttf | 1882 +++ .../fonts/stix/STIXSizeThreeSym-Regular.otf | 2055 +++ .../main/resources/type3/library/index.json | 462 + app/proprietary/build.gradle | 8 + .../software/SPDF/model/json/PdfJsonFont.java | 8 + .../json/PdfJsonFontConversionCandidate.java | 69 + .../json/PdfJsonFontConversionStatus.java | 9 + .../model/json/PdfJsonFontType3Glyph.java | 27 + .../SPDF/model/json/PdfJsonTextElement.java | 1 + .../service/PdfJsonConversionService.java | 1225 +- .../service/PdfJsonFallbackFontService.java | 12 +- .../pdfjson/type3/Type3ConversionRequest.java | 17 + .../type3/Type3ConversionStrategy.java | 32 + .../type3/Type3FontConversionService.java | 133 + .../type3/Type3FontSignatureCalculator.java | 218 + .../pdfjson/type3/Type3GlyphContext.java | 38 + .../pdfjson/type3/Type3GlyphExtractor.java | 126 + .../pdfjson/type3/Type3GraphicsEngine.java | 164 + .../pdfjson/type3/Type3LibraryStrategy.java | 113 + .../type3/library/Type3FontLibrary.java | 299 + .../type3/library/Type3FontLibraryEntry.java | 30 + .../type3/library/Type3FontLibraryMatch.java | 12 + .../library/Type3FontLibraryPayload.java | 13 + .../type3/model/Type3GlyphOutline.java | 25 + .../type3/tool/Type3SignatureTool.java | 299 + docs/pdf_json_type3_fonts.md | 443 + docs/pdf_text_edit_flow.md | 50 + docs/type3/harvest_report.json | 13216 ++++++++++++++++ docs/type3/signature_inventory.md | 191 + docs/type3_fallback_plan.md | 150 + .../tools/pdfJsonEditor/pdfJsonEditorTypes.ts | 1 + .../tools/pdfJsonEditor/pdfJsonEditorUtils.ts | 10 + scripts/download_pdf_collection.py | 583 + scripts/download_pdf_samples.py | 195 + scripts/harvest_type3_fonts.py | 245 + scripts/index_type3_catalogue.py | 75 + scripts/summarize_type3_signatures.py | 97 + scripts/type3_to_cff.py | 481 + scripts/update_type3_library.py | 243 + 49 files changed, 23741 insertions(+), 151 deletions(-) create mode 100644 app/core/src/main/resources/type3/catalogue.json create mode 100644 app/core/src/main/resources/type3/library/fonts/cm/cmmi10.ttf create mode 100644 app/core/src/main/resources/type3/library/fonts/cm/cmr10.ttf create mode 100644 app/core/src/main/resources/type3/library/fonts/cm/cmsy10.ttf create mode 100644 app/core/src/main/resources/type3/library/fonts/dejavu/DejaVuSans-Bold.ttf create mode 100644 app/core/src/main/resources/type3/library/fonts/dejavu/DejaVuSans-Oblique.ttf create mode 100644 app/core/src/main/resources/type3/library/fonts/dejavu/DejaVuSans.ttf create mode 100644 app/core/src/main/resources/type3/library/fonts/dejavu/DejaVuSansMono.ttf create mode 100644 app/core/src/main/resources/type3/library/fonts/scp/SauceCodeProNerdFont-Regular.ttf create mode 100644 app/core/src/main/resources/type3/library/fonts/stix/STIXSizeThreeSym-Regular.otf create mode 100644 app/core/src/main/resources/type3/library/index.json create mode 100644 app/proprietary/src/main/java/stirling/software/SPDF/model/json/PdfJsonFontConversionCandidate.java create mode 100644 app/proprietary/src/main/java/stirling/software/SPDF/model/json/PdfJsonFontConversionStatus.java create mode 100644 app/proprietary/src/main/java/stirling/software/SPDF/model/json/PdfJsonFontType3Glyph.java create mode 100644 app/proprietary/src/main/java/stirling/software/SPDF/service/pdfjson/type3/Type3ConversionRequest.java create mode 100644 app/proprietary/src/main/java/stirling/software/SPDF/service/pdfjson/type3/Type3ConversionStrategy.java create mode 100644 app/proprietary/src/main/java/stirling/software/SPDF/service/pdfjson/type3/Type3FontConversionService.java create mode 100644 app/proprietary/src/main/java/stirling/software/SPDF/service/pdfjson/type3/Type3FontSignatureCalculator.java create mode 100644 app/proprietary/src/main/java/stirling/software/SPDF/service/pdfjson/type3/Type3GlyphContext.java create mode 100644 app/proprietary/src/main/java/stirling/software/SPDF/service/pdfjson/type3/Type3GlyphExtractor.java create mode 100644 app/proprietary/src/main/java/stirling/software/SPDF/service/pdfjson/type3/Type3GraphicsEngine.java create mode 100644 app/proprietary/src/main/java/stirling/software/SPDF/service/pdfjson/type3/Type3LibraryStrategy.java create mode 100644 app/proprietary/src/main/java/stirling/software/SPDF/service/pdfjson/type3/library/Type3FontLibrary.java create mode 100644 app/proprietary/src/main/java/stirling/software/SPDF/service/pdfjson/type3/library/Type3FontLibraryEntry.java create mode 100644 app/proprietary/src/main/java/stirling/software/SPDF/service/pdfjson/type3/library/Type3FontLibraryMatch.java create mode 100644 app/proprietary/src/main/java/stirling/software/SPDF/service/pdfjson/type3/library/Type3FontLibraryPayload.java create mode 100644 app/proprietary/src/main/java/stirling/software/SPDF/service/pdfjson/type3/model/Type3GlyphOutline.java create mode 100644 app/proprietary/src/main/java/stirling/software/SPDF/service/pdfjson/type3/tool/Type3SignatureTool.java create mode 100644 docs/pdf_json_type3_fonts.md create mode 100644 docs/pdf_text_edit_flow.md create mode 100644 docs/type3/harvest_report.json create mode 100644 docs/type3/signature_inventory.md create mode 100644 docs/type3_fallback_plan.md create mode 100644 scripts/download_pdf_collection.py create mode 100644 scripts/download_pdf_samples.py create mode 100644 scripts/harvest_type3_fonts.py create mode 100644 scripts/index_type3_catalogue.py create mode 100644 scripts/summarize_type3_signatures.py create mode 100644 scripts/type3_to_cff.py create mode 100644 scripts/update_type3_library.py diff --git a/.gitignore b/.gitignore index b339d7ff6..8c0402ad5 100644 --- a/.gitignore +++ b/.gitignore @@ -210,3 +210,17 @@ node_modules/ test_batch.json *.backup.*.json frontend/public/locales/*/translation.backup*.json + +# Development/build artifacts +.gradle-cache/ +scripts/pdf-collection/ +**/tmp/ +*.backup + +# Type3 development data +docs/type3/signatures/ + + +# Type3 sample PDFs (development only) +**/type3/samples/ + diff --git a/app/core/src/main/resources/settings.yml.template b/app/core/src/main/resources/settings.yml.template index c7e86a6e0..cf117e649 100644 --- a/app/core/src/main/resources/settings.yml.template +++ b/app/core/src/main/resources/settings.yml.template @@ -183,6 +183,10 @@ stirling: python-command: /opt/venv/bin/python3 # Python interpreter path python-script: /scripts/convert_cff_to_ttf.py # Path to font wrapping script fontforge-command: fontforge # Override if FontForge is installed under a different name/path + type3: + library: + enabled: true # Match common Type3 fonts against the built-in library of converted programs + index: classpath:/type3/library/index.json # Override to point at a custom index.json (supports http:, file:, classpath:) ui: appNameNavbar: '' # name displayed on the navigation bar diff --git a/app/core/src/main/resources/type3/catalogue.json b/app/core/src/main/resources/type3/catalogue.json new file mode 100644 index 000000000..4aca2f414 --- /dev/null +++ b/app/core/src/main/resources/type3/catalogue.json @@ -0,0 +1,592 @@ +[ + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "1867" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "1888" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "2029" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "2069" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "2089" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "2116" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSansMono", + "encoding": "2174" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans-Oblique", + "encoding": "2192" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "2209" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "Cmsy10", + "encoding": "2228" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "STIXSizeThreeSym-Regular", + "encoding": "2233" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSansDisplay", + "encoding": "2239" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "4403" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "4438" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "4519" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "4685" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "4733" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "4782" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "4813" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "4834" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSansMono", + "encoding": "4878" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "4906" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "4929" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "4971" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "5001" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "5030" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "5052" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "5083" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "5116" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "5143" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "5175" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "5207" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "5243" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "Cmr10", + "encoding": "5263" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "Cmex10", + "encoding": "5270" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "Cmsy10", + "encoding": "5275" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "Cmmi10", + "encoding": "5280" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "5295" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans-Oblique", + "encoding": "5313" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSansDisplay", + "encoding": "5319" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "5334" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "5370" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "5399" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "5427" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "5459" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "5486" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "5513" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "5554" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "5601" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "5647" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "5694" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "5732" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "5771" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "5803" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "5861" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "5904" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "5924" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "5951" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "6084" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "6445" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "7195" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "7409" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "7474" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "7708" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "7747" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "7885" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "9029" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "9617" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "10460" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "11445" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans-Bold", + "encoding": "11486" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "11497" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "11543" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "12280" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "12301" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "12350" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "12372" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "12395" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "12416" + }, + { + "source": "01_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "13324" + }, + { + "source": "02_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "3214" + }, + { + "source": "02_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "3251" + }, + { + "source": "02_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "7190" + }, + { + "source": "02_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "9937" + }, + { + "source": "02_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "10792" + }, + { + "source": "02_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "10852" + }, + { + "source": "02_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "14712" + }, + { + "source": "02_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "18396" + }, + { + "source": "02_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "18719" + }, + { + "source": "02_Matplotlib.pdf", + "fontName": "DejaVuSans-Bold", + "encoding": "18741" + }, + { + "source": "02_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "18778" + }, + { + "source": "02_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "18804" + }, + { + "source": "02_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "20974" + }, + { + "source": "02_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "20993" + }, + { + "source": "02_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "21093" + }, + { + "source": "02_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "21117" + }, + { + "source": "02_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "21141" + }, + { + "source": "02_Matplotlib.pdf", + "fontName": "DejaVuSans", + "encoding": "21174" + }, + { + "source": "03_handout-beginner.pdf", + "fontName": "BMQQDV+DejaVuSans", + "encoding": "17" + }, + { + "source": "03_handout-beginner.pdf", + "fontName": "EVICAO+DejaVuSans-Bold", + "encoding": "133" + }, + { + "source": "03_handout-beginner.pdf", + "fontName": "BMQQDV+DejaVuSans", + "encoding": "152" + }, + { + "source": "04_handout-intermediate.pdf", + "fontName": "BMQQDV+DejaVuSans", + "encoding": "13" + }, + { + "source": "04_handout-intermediate.pdf", + "fontName": "BMQQDV+DejaVuSans", + "encoding": "85" + }, + { + "source": "04_handout-intermediate.pdf", + "fontName": "BMQQDV+DejaVuSans", + "encoding": "104" + }, + { + "source": "04_handout-intermediate.pdf", + "fontName": "BMQQDV+DejaVuSans", + "encoding": "121" + }, + { + "source": "04_handout-intermediate.pdf", + "fontName": "BMQQDV+DejaVuSans", + "encoding": "135" + }, + { + "source": "04_handout-intermediate.pdf", + "fontName": "BMQQDV+DejaVuSans", + "encoding": "159" + }, + { + "source": "04_handout-intermediate.pdf", + "fontName": "BMQQDV+DejaVuSans", + "encoding": "179" + }, + { + "source": "04_handout-intermediate.pdf", + "fontName": "BMQQDV+DejaVuSans", + "encoding": "198" + }, + { + "source": "04_handout-intermediate.pdf", + "fontName": "NVMZUP+SourceCodePro-Regular", + "encoding": "208" + }, + { + "source": "04_handout-intermediate.pdf", + "fontName": "BMQQDV+DejaVuSans", + "encoding": "231" + }, + { + "source": "04_handout-intermediate.pdf", + "fontName": "NVMZUP+SourceCodePro-Regular", + "encoding": "241" + }, + { + "source": "07_matplotlib.pdf", + "fontName": "SauceCodePowerline-Bold", + "encoding": "22" + }, + { + "source": "07_matplotlib.pdf", + "fontName": "SauceCodePowerline-Regular", + "encoding": "47" + }, + { + "source": "07_matplotlib.pdf", + "fontName": "SauceCodePowerline-Regular", + "encoding": "65" + }, + { + "source": "07_matplotlib.pdf", + "fontName": "SauceCodePowerline-Bold", + "encoding": "110" + }, + { + "source": "08_matplotlib.pdf", + "fontName": "F36", + "encoding": "12" + }, + { + "source": "08_matplotlib.pdf", + "fontName": "F59", + "encoding": "42" + } +] \ No newline at end of file diff --git a/app/core/src/main/resources/type3/library/fonts/cm/cmmi10.ttf b/app/core/src/main/resources/type3/library/fonts/cm/cmmi10.ttf new file mode 100644 index 000000000..fd9d30ced --- /dev/null +++ b/app/core/src/main/resources/type3/library/fonts/cm/cmmi10.ttf @@ -0,0 +1,25 @@ + + +
++ diff --git a/app/core/src/main/resources/type3/library/fonts/cm/cmr10.ttf b/app/core/src/main/resources/type3/library/fonts/cm/cmr10.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8bc44966a84421629220f03a87d1cf479733d2aa GIT binary patch literal 26348 zcma)l2Yg)Bnf<-5O_emgs7}$$sEyiaG?GST)MZ(gC0UkLZOc}(Bv-k~1sfYName Last modified Size Description
Parent Directory - +
BaKoMa-AMS.Fonts 2005-06-15 21:10 9.0K +
BaKoMa-CM.Fonts 2005-06-15 21:09 9.4K +
LICENCE 2005-06-15 22:56 1.4K +
README.news 2005-06-15 23:25 959 +
afm/ 2009-06-30 22:43 - +
bkm-art.ps.gz 1995-01-23 11:12 110K +
etc/ 2009-06-30 22:43 - +
mac/ 2009-06-30 22:43 - +
mrf/ 2009-06-30 22:43 - +
otf/ 2009-06-30 22:43 - +
patched-pfb/ 2009-06-30 22:43 - +
pfb/ 2009-06-30 22:43 - +
pfm/ 2009-06-30 22:43 - +
tfm/ 2009-06-30 22:43 - +
ttf/ 2009-06-30 22:43 - +
bzL@Q4Ema^B2h<7KRWTzIi}Uo4f4?Zy^F*`9 zp$YqhcYKxFG;ho49$1#|k0A?17|k=cdLG?PFGq84`En+U`+xdnB&e`<_=RBL`WNyf zL~VnT!{Zn7B#bfWwi*>5rR6)^w!h|ziOCK}en#}AZ19>cMA$!oDqM^e44Wg>8mbah zDzBA=*%5W~31O3zm%){K3(%6hkgb~ZxQG}AXB ArpqisoB-qk*jY2H(Mh`OAuiB1;DH*Dh^YQ@5q&a@7G= zW3t)?HkrlrLk&WUOmEZ5dYe3(41)Oox85d4zyA-tjirbEjox-G9qjYvHk6Za5+CKl zG3DA9Q?5&IP_FeDE4V}of+EV-D?WRD?%!OGOXAnRjLd}7P_P^ tFXb7z1YZG^P{AFNjg>bOt34>FSWCl%vD}F~E0oX{x#O{Z$B>joA(+bu{8TV& z1nwQC=v)k6;TgJRo34*x^bNKtF8@7cUa=!`? 724^4wIwLikiAQtl6a= zny^Oqh6)b6v3~cPdnV4U&94ai^Qzc7;%GMRNni }i&!uro;DEVMd8!` 4= h7YbCzRj*f zj%vnv>& +EJ8u9N7l|#R69vK> zIc<$RZer=VkYgw^D-=FzVkI_YzbCZkQd9K(+}D7hLB#+4K$A3h*wv8|CCzbS_PmDX zcoG3BHtNJGhb*}YsY{CG285N<;DKO$MKv9;i)k^(nz4OGPh)%^@e+@WE6gv8^;bEL zlMY@rpI{>?;EHv0(1No2x@W(?9!XaBjSn=Q%-rAByuQ^Pp6yw7G+WLE;D1q;+G5#P zU3>8I4kTI4Mjt>n0N1@}Ronh!bzR>(xO@@X>JWE~p9K yD3Ra)J6~H zB?L }#QFu8&Cc8e zxDqiwLPxTetgrp<@1yr>Qf%S+%1?G;IXxQv-9!mnODVYJ=a*mW$DCy6g9x{IEJ2Rr zqFWz`-WGiqiV#Y}vPj>-7-jR)D!iUdtsqf^qRj>s&(vG>XXd8mxMEY&pvPzoJ~^Q@ zJ~0iQ (N@tTpZu;EmebM{q3!!Ce=l-LpJ~?{# zZx_}_nw#KOr=~ib@HnEU=Egg-T3SpVyN`4HGI}VcB^99jucQ1$q$yIJldabwN~N;X zWb1sSzcACuyB9*1MgE*@UuIfrvdyH|C2CXxZzy!J$Yo$2vhfmF@egnvBYh?-(mEGX znr?WL`K8GUe!Pr!M-MyJcXL&q)g0BnuUwW-Km75s=)3eA?x|&S-*=Ak(dVLXOI`k! zt@IPFn$4+BOBRIa1YK>= X8DE;v)IbJ0c2dK za!DqY7fY5BWtI!;;b19o*$^er!E~2Wbkc4;TV<0?3YBw0u4N-J$H$GnBhwm4mP~8_ zTFtNS6y5vAj`c6@TzRxV-#qt^N4{J$wKNfnZW+vJ&qrtJrQDIut^2G8f3a)l&kogW zx_= #Ez2xC_Z!?5FCT!+63+H3}z!l>M;T!Bdi) HiJLIu)USRaee zee^hYt*BZZ^m$8t+GXqVUS 65rdxR9y zrVJ4e&iV0q1D@G{^Jn5^?UCOV3)pj;@qI#G;eDimJA>9egL8O4Jg1I53(qLP_p9WM zAU;asb&0ZzxG%T)>f`(|%q4i4c-Uvyp2GPWcAnjbl}&sH*Tw6FJp*Ov!F4@yy)?=9 z!<=GxAz17^{v0H6L(xtlFXP-8_YUfb5FhG+y~F$Lp7?tR8*9@Vd{)5f2*<~GC;BMs z5{JlYf)n`RkcS~5cZraf@Gnf@h1lofsb~}aU4YQl$FCm83KQ2lk^B{WoAB?_yI{`= meSmHzB-$VQD?Ebo7;sY!KKlDV5#sPp;Tc$6ll}7rg#14m=Zp3L literal 0 HcmV?d00001 diff --git a/app/core/src/main/resources/type3/library/fonts/cm/cmsy10.ttf b/app/core/src/main/resources/type3/library/fonts/cm/cmsy10.ttf new file mode 100644 index 0000000000000000000000000000000000000000..45d8421a5b118b1f49132337f80fb7730521483a GIT binary patch literal 29396 zcmafc31C#!z4tkHn|+_ml9^0q$;@P%>? `3dJXtooGq=EXwjhO&(Q9zFt-Y>g?hW j^O(!Ewp*wY}@wx4e>y{f`LY<}cqc z?r#b-)DyyEBd1rcTeX(6{Gb=d9}_} +du>KNa zM}M(Lld<99iIe!|lzWt0E`Q+SLcQDTT3$Xhux@&NVa>Q{mcL?4`!x$Pl0 Ti~&qvmfI2ptE&Lx{kh^)e(vmu&Ic4Kgzq=3vP^GG^IGM{KMZERc_ zc}f@$7v5TMNhajd)5=*wqtr+~CGV0K$w_h_IYw?IUn6_)+%dF&8QR@}R?I|CDlmq{ zB%n5`##C-;yHqV@NJjA^@h$Nsajw`QwhQkGW5Nh8^Y8Gl^KR}F`VM`GPS7xB;$8A8 zd5k hCt$Mbh%yx1H1Fv4?{H#FfLjZ^Q4JCf`+tHo?G8uU7?My--Wf#)d6ei)-) z=ilGAKUBMNek}W8^t*2ErZXg~%UQlq`I@eLozZ44JVWcuUpf`b&cc6ZxXf5~;)C{` zA)(rbC?Br%H~I&9SDfL)`1YR>>O#H#6%WPZ`{#BA@b?f2co()~_aP#L{fz@>RN;o+ zGh|Lzz;i~dD_iL4U9qsUE0i1h%#$1X5bwr|&isd`_pbPlcZ%WK>JPv2 bU zJeK`^bQ_|e&d(aTzu^pD*E_hZepziSyTN~k57j
p<34&9qTYU z>S`D~6Yupa?LJfE!9LqP)95)fbK$}>VyG66prP8qGhC?lj6Ty9%l0=6)W@=)1SyJ_ zo~uQt9=3>tef#|nas2+;&>7lW+lT>+&+R%BU$&6FFP4oA)1G=og+m1Q$lnd*iI9ohuk(4K)FO9|G_6F z++)VGEbZ7nBE)(vA+}u*#XdrkAcq}RY%dey#B-g0B*gU$A#U8~xt99A%XeW@SET|LP9&BN?s!*j4g7Kkmx@NNxzej4D=zhhmb4@8#okm zO=9@Y`57U(M+wR6!uA}*WHz?<2`NN>i#8EbjAs}B3hD~|D8aK!(bh5tA?3B$4iYjA z*Qfn}kP7r;I(}1$=Tx2`qzdnan4pO?YlI+R!o`+b4vy%23N_ &J%o z&WmGvkdXNUge({(qzmuq!fzI$jSF8Rr28ngKM=AQ$4iC@>A9PbrRe)oyk}Wo+$9D@ zuhGeSTlEI9L)RLN^R2CEhB@TW {@ai?Vz2;-r-e!qrJ=5 z^p6kquN>F)ZyFpM?;jo?>>Uy(h6hK6#j$n0EBf`lI6FExwq|Yb_<*K&baZ4RyWOy^ ze{@~{@QT6Z6GOeDTIKxc;HrUf{kqYSbt9wWctG!vcKP7w@}d59Lla}d@}Y@7{opVj zHrBtKUDn_&8*qg80d|d!Cm!B6GCrVE9yhU0?8R>fRAYl{2l0}`^%Wx 3;O-T3CQ{&Cfc!QQna!z* n8>`;K#$u`*o{E`+M=ywG+z+B*4Y7@e$)_ z|H`5MO=A=21Ae6)8d){CymzQ~c!kv0JG!E8NH_T$)@9Yok)ffHjblo`aQ{Rfexg?z zh&x$p)w5P&7{@0@4OgDspqp&u;PAwlQMocUGBJ*xj*V-T@l~3y>L2P~i&0OEAf7m} zPP2RjW4K~s`M4(Wh!rE_i3bd0Tn9GxkBuAgw&Ahy!6D2H#$2U5Z*2YLX0buij$nTJ zCWeOk$HjG{gKPV>D~Co#MwK5J65SYEkAdnPG60q??_beBrW~oqM+ZR~L;d>Y{ewe; z!>g2EsE7K;#@HAd+5EC`NDQ7~xPMhIo6WJI-mwAG=QNf0)zp&{-D9J*LESMqT$;&o z9~srGWrM`1 bq!RKFa3R|pp~v3YcI@RiwPgRfD>kv+qBB{`3+Hzmk! zY%|Dl1kDyP3;mz~}`p}2=8_XX(FZIk;VaOLjFeTEB LtU%)*_Cig{>Opj0Q19j5JCin4t`hz+)f{aG}>2(?Y{POamY=3R<*x-=A zImh4HJG6OhpnpS-zh-F2-@$Gh^LKy_M>q7Z$jQqusO@bYY3=nljtt{M9T+hoIkNpN z{Tup+VzoKT*N$z@&+F)4#iS6st#xF0RsZO;#QDT$eolUFenG5lWJ9dHs80C-Q1}S! zgU!JCgFw^+un_#f&~=c|e#qK#{3`->_X7#{0=W)iT>U`pIrwbFnIQ$w4q)UrDCcT$ zhTYL|`DtUyQ9pj$k9Taq=L+1Jhi4Zk&uqr~*^~Uh!6UE>#&M@#X%%}?KWvzBJd0gn zt!Po+)Q>AM{5l6$*W&)ocv>Fb*^eGf;94) 0^J zVnF^QXlYF8d)*appoHuIflU30Kn{t4ojL>i0)M5Kn5CioosY9GV0hp&`~y9xNHFdR zaUee-gaZ{P%;Rxso{AEQ)0p_Ie3F$HummhoY!t>-;6klP&Xa)f%=uc->$@`HPD+4b z#1%I?)HZ4|a?^CYMx<`#$2mE98X74sDy1cb1u!Til?Iv^-=QGaEgujBI-&Aeos`Ol z>3T|C7N6|q-&9M2o
E6T|Vhf*ANn;AcHWft%N8H>$I zFSGIrgRG%dd^P2ZB3XbLs!*i33d$V~w^i|_CB;RNP!26FDk)X^qB3$So83_XwO?B3 zNHTI+6i?uBR!Xuva0b2oadxpM )7BIVC( 2={<;m5F`194ZX*PtV6DmaAJWGfL{6*3G@Qc_l)&4RZo@A7el1yx+} ?!bM+B_+f6 zv6jgHgcbb@@LgKm6ASxvg3YBNnpk#bdcc>W%CYfOr1?r?s;e{e#2{B(WG%(yqfJh$ z)5j&*6V0fkA-fZ^uh2sg=q6;B=+0x~FP!S$SETZJ^aH2IZx~Ff7@AYFrE_I@l6kYm z!IiDLH%3z*|0cB^>wNcGw_E=G9jovD#m4sAj&w)nRdbI#qPDnP7KwZ6fu5ep`4e9h z=R!K>#G@{NTTGu;3Q#tIYEZpB?A7yvH2?_R>NIObn#m?H=iklZ VywbuH zcnA_wL}j3iyF$Te*rt3(iXke#?+mBVsQhM1*l99Q$rp6H0zN7kOzu#M{3ea2gxn^B ze9jkgxI#YpoPi2aXUKTyfIjSuYM-TTZokhd$PYiOjXJ~n1BZ+uc3OT!a{2-;+V-qg z8TCsastyQF*c8#YPa|?(M+!uUU`f*id=8sNB&tZV3S<&ZkO_uc%;BR6xl&pJQIZ6) zGBwaX>a>GKxTtB?@WBqVx%0sAER$%;NOFE-Lb9?^|LlLpZgVDOn1s2 uN-e)mbTv~ZPJ%uwS zliV$Lnambfh1r0Mr?eO=gWN?=8eA3&?vlF TE zE{j%>KVXx_CXxT1l#;CD(s`G~qrE6!Jg0SAodQ}lcIiX$C4L{|M=2?b=Y^d*J}*O~ zqBe_}_ZagulFthlct&bKXN5FL)nunSErNA!5f5rAXVg>;jiAWDDloGn6 fTmexx+~VXNG@u;MkV>n|`3KmR8==^R-!{ zvxWJ(+cwoN`$kXgt2f^;@%8l&ELix&RzRDvOY_ASg;VeXyP@GCKu;C%q8RmSfpya1 zDewpVS}B?O?L;l{LOSg*rE+4FhG<7}5|g4G4iOh}6-s8^%z>=0LZ1{NkN#K!cB`PM zpg=fa2@0GTD9YhNe9FOpK07$@+&>Q<`1I+))lYqT>f)J`)c)$aU!Goe@yx{uuKlR| zmv3 hFEF|KLBL8(96lPY>)n|J0fat^?Qa?|tx>Bh$I|Z^?f-y6*J{ zVPH^lik=k@aT%Z?XWTqVL7*GVg=w;lU! ?PVKS5kW@}E5`%O`Om76L z?#r4_qPMKNv#W03(v6L|Egd~4`)6O%SKQg0*SKlfwRH>bT-9^S=PIyieQflJ6+KUG z>gt*HaL@9m*2l*Wwe>tw*3-4=$(|KYjP`Y3p$9AHXDCuBfgb`uvTiTf47`=9F=|?M zaF@1v7>*51_983K3BZu1%p!v;Xs(6L8l%d@@z^P<-QD}rw^lONS$N>V&e7i-Wt^nu zQ?L8sisF&`1}?nIc#d~<@0*{~e)q(MKjM(Jf;=X?%e{%HfhTVFs;sOPMxI)gR!}<{ zz*O%Qb2RmSMf?dtlY_mH+sj_&Fv(FSgXw9-Zw7oc2At+ZBm}s`t4(Ilb{Qnz=FlX& zU3`I=p;)hiVyiPjtW#>!7O*AMrKDm)t&|2h`^Aq1hb=|>FgNmu%4cy=dhxH?l#~?e zy!g6ZT& I#sYk)bRYbHC` zyhN2*0eShrt50^{u;`9QXYCpA7d*1=(L1`YU#7dMD(=;Le5%O29b)-tN4l>jz9QJO zW8UbI)?J-CRnX+5`i>oQTKmhLg>zTZZQakjIraigsu-wUb+!EG7slRve3|aXSz~Q( z_o^K`HkFMG&8h5Z><#vucz*R=?|1BNj#^A@2Ra(o?`v$oW&cJt0%S~lk$(pxP{$-m z26Yuwsiku2iUm0gugmOJOYlDG2qy_bF =|gt@nF%VE-3zD0biWqgj6v&M{K^4{k+ zYBW04gYvm3XAokNp0mywZ#frc;zf}!L>NIE=aSrbbY^K`#FHf1I#qS5`1HJxU$o9P za8}A`X|l*QG$lDjI-j+fnJJ~kMTG^$5Od6K1z#zU8eqps!F7r?3mOEUDfSC`S6mbY zbD~oUu*MOEHLFN^0JbsfouTs7u9n*D$~;%9%CMG;iawW_ubSaX)vMEMBuh`0GhnY3 z>?t v`(k402#u$rPPrvd&hNTmc2SXj`46@(d}0yXXR|X!K^csK(!EZb zNh{g>D$Yu1E9AIHvnDAB6cPdXFt*2tPg$=C6B3pLw5gFF_}S>lB4Z`3nt zsXx0-;6Ojp=}%mu)hh4V`25~v(HH|__S~{ge2ZzNbK!NjcsQ*(CK$M|{ON;Mra%4z z`gD3JtW}Ho|A#)W0Lu&_E1D#71-dw2>k+EYKWPW*l!RNXuJgkZkm%?5lYZB2 )o$lA &$wD(t+stH;66lfV?fG8ZLoAMW%0Z5dMi$ z21_N?SCHGqUwr3p>))O$FO>`F-Ez zUMue3OHa@f^WU79eRO|m>Hed$*|)qni{3rEv!fk;x3Nplh%X7X$Zv4NmduEU3@IUa zU~GCK@dk~Cd0^l{vHB6js+0( BCi(l}Ddiz3_&WMZMqIc 7(QFJ _%AtPh35Ioch;lfEVktTyvqY0?gZyo9W{P5n=QzSOlt}Q^OiK&| zvy_}g)ilBtn<0Um%wYs>S23x|LF7gi%u@;qWu51uFi(MmaMAi67aN&z>fHRcsLF3~ z0Y1Abo_t_&OGuw$O5R^PXX$8>&XFZAqkVO4%SH CI(PrvQsH#R>^tqacIB0N@p=;uG5_`duGlM-X{!;0_AgMI_SM!d;- z!IlvTc!eB0GXxTr5Og3>?9r0sgxAZFOcjG3sZju!Orh{miJ)T+?wl;kd$iiCKYG4h z>vn0|pa1A;olf2(%UYM)UB2_sw>oEk^BWs0Hp+kaPRIS%?vr2SG;|?MX~TMiZ42+R z+3u2Gk$=D5V6tlDZ(jVDZTH&Oo_nsX`N=nau @nCy9>fTu zalbd@1s^3D@xknDUWmB3R124@<-tTu3^Rvz=@&WY|2R_MxhOF>e(s#YN?+M;V#uB0 zc6#VCH(@VfelzWG xc&+2P$sySWS8X_#!1sv~FP C{t2f(MZ zpnEW@jr@zi?d3r25g+0FoF-`X6Di2Wz@|cx%SUUIJX9jIwlt4QT!qpcMS$8EHBtrV z0Gu ylACBf1hEg)7 zuJ{{WgKO#+IntBE`33Ub(f+~N>woiJ>5{`Y9dAAO{h`KiVPQB_ICc7u^0xiY57)cW zUHQ>8BqmT&dg++@f_MViRlq{UDLg;3fHSK*EkLGi@rYBfRcHvcmZo!Y8qcY+h;#vC zLuMM4PHJAL0yu8DQut=^uMj8>bX>yd7o!g)$ML{CP6tjYUVO|!q}Xf&ERqlsfC}fL zk``uTq_i* 7 zmACFYamVhT-!GRZg}j+^l^koF(Y82Kohqm_8GSbnQZF~{-dBG7cH1h^Lc{aEMdJ^4 zLu<{K&sMV0Y62I85i>!=E50Nn>~ab|YkyzMEI~hy)09w;gDa$t9G^j|LZU(&O}6Td z(yDgOF>i!Qt7$hf4mp(|jIHYL?QU;tnbp`(TUA_`5l!>C0Q^DB$=T%`jDm?o6eSZ; z6c$9`l#xaJgau1LM{r7F6w{*6v>+XZGI0-Ff E`0DlAnr5Ft zpSAbSz4|%J{`EvdAiXoi2)4@2a?~9>c}A!6WC?43x|HL&Vp=*g(kL1^vFAjO!ETSK zwW9gncdtuT`@Ct{yk4ya@-YeWpJf?4X0wgkpO;(^#D#k{?Noa$`Y<9f%oDc}KIMI| z@LA*`B^F512sXIh(tMs|$QC`%=^{~ypNc(XLYG|jU^<)$RHpFZ6`sv6oFB6bN$3A; zcUncgD9pFn&Yyxm)avBcB? 3_P>Z>b0OmcUdS@ZYyVuv2Q3IzX=!Vg8>)&$XrOSf z@U;LfUB*g){> t