diff --git a/Verovio.xcodeproj/project.pbxproj b/Verovio.xcodeproj/project.pbxproj index d5ec055fae2..e2fda8406a0 100644 --- a/Verovio.xcodeproj/project.pbxproj +++ b/Verovio.xcodeproj/project.pbxproj @@ -182,6 +182,12 @@ 4D16945A1E3A44F300569BF4 /* dot.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DC34BA719BC4A83006175CD /* dot.cpp */; }; 4D16946A1E3A455100569BF4 /* humlib.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 40CA06581E351161009CFDD7 /* humlib.cpp */; }; 4D1694741E3A455200569BF4 /* humlib.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 40CA06581E351161009CFDD7 /* humlib.cpp */; }; + 4D1AC9772B6A9BB200434023 /* filereader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D1AC9762B6A9BB200434023 /* filereader.cpp */; }; + 4D1AC9782B6A9BB200434023 /* filereader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D1AC9762B6A9BB200434023 /* filereader.cpp */; }; + 4D1AC9792B6A9BB200434023 /* filereader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D1AC9762B6A9BB200434023 /* filereader.cpp */; }; + 4D1AC97A2B6A9BB200434023 /* filereader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D1AC9762B6A9BB200434023 /* filereader.cpp */; }; + 4D1AC97C2B6A9BD000434023 /* filereader.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D1AC97B2B6A9BD000434023 /* filereader.h */; }; + 4D1AC97D2B6A9BD000434023 /* filereader.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D1AC97B2B6A9BD000434023 /* filereader.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4D1BD1B521908D6B000D35B2 /* halfmrpt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D1BD1B421908D6B000D35B2 /* halfmrpt.cpp */; }; 4D1BD1B621908D6B000D35B2 /* halfmrpt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D1BD1B421908D6B000D35B2 /* halfmrpt.cpp */; }; 4D1BD1B721908D6B000D35B2 /* halfmrpt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D1BD1B421908D6B000D35B2 /* halfmrpt.cpp */; }; @@ -1763,6 +1769,8 @@ 4D09D3EC1EA8AD8500A420E6 /* horizontalaligner.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = horizontalaligner.cpp; path = src/horizontalaligner.cpp; sourceTree = ""; }; 4D14600F1EA8A913007DB90C /* horizontalaligner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = horizontalaligner.h; path = include/vrv/horizontalaligner.h; sourceTree = ""; }; 4D1694601E3A44F300569BF4 /* Verovio-Humdrum */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "Verovio-Humdrum"; sourceTree = BUILT_PRODUCTS_DIR; }; + 4D1AC9762B6A9BB200434023 /* filereader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = filereader.cpp; path = src/filereader.cpp; sourceTree = ""; }; + 4D1AC97B2B6A9BD000434023 /* filereader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = filereader.h; path = include/vrv/filereader.h; sourceTree = ""; }; 4D1BD1B421908D6B000D35B2 /* halfmrpt.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = halfmrpt.cpp; path = src/halfmrpt.cpp; sourceTree = ""; }; 4D1BD1B821908D78000D35B2 /* halfmrpt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = halfmrpt.h; path = include/vrv/halfmrpt.h; sourceTree = ""; }; 4D1BE7661C688F5A0086DC0E /* Binasc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Binasc.cpp; path = src/midi/Binasc.cpp; sourceTree = ""; }; @@ -2776,6 +2784,8 @@ 36E0442D2347A9290054F141 /* expansionmap.h */, 4D79643826C6B3520026288B /* featureextractor.cpp */, 4D79643026C6AA720026288B /* featureextractor.h */, + 4D1AC9762B6A9BB200434023 /* filereader.cpp */, + 4D1AC97B2B6A9BD000434023 /* filereader.h */, 4DF28A041A754DF000BA9F7D /* floatingobject.cpp */, 4D95D4F41D7185DE00B2B856 /* floatingobject.h */, 4D09D3EC1EA8AD8500A420E6 /* horizontalaligner.cpp */, @@ -3388,6 +3398,7 @@ E79320642991452100D80975 /* calcstemfunctor.h in Headers */, 4D1BD1B921908D78000D35B2 /* halfmrpt.h in Headers */, 4DACC9F42990F29A00B55913 /* atts_visual.h in Headers */, + 4D1AC97C2B6A9BD000434023 /* filereader.h in Headers */, 4DA0EADD22BB77AF00A7EBEB /* zone.h in Headers */, E71EF3C32975E4DC00D36264 /* resetfunctor.h in Headers */, 4D763EC91987D067003FCAB5 /* metersig.h in Headers */, @@ -3706,6 +3717,7 @@ BBC19FBF22B37CA000100F42 /* all.h in Headers */, 4DA0EAE222BB77AF00A7EBEB /* editortoolkit_mensural.h in Headers */, E79C87C8269440810098FE85 /* lv.h in Headers */, + 4D1AC97D2B6A9BD000434023 /* filereader.h in Headers */, BB4C4B5822A932D7001F6AF0 /* layerelement.h in Headers */, BB4C4B9422A932E5001F6AF0 /* areaposinterface.h in Headers */, ); @@ -3873,6 +3885,7 @@ 4D1693F61E3A44F300569BF4 /* barline.cpp in Sources */, E7901661298BCB2C008FDB4E /* calcalignmentxposfunctor.cpp in Sources */, 400FEDD6206FA74D000D3233 /* gracegrp.cpp in Sources */, + 4D1AC9782B6A9BB200434023 /* filereader.cpp in Sources */, 4D89F90F201771AE00A4D336 /* num.cpp in Sources */, 4D1693F71E3A44F300569BF4 /* bboxdevicecontext.cpp in Sources */, 4D1693F81E3A44F300569BF4 /* beam.cpp in Sources */, @@ -4153,6 +4166,7 @@ files = ( 4DEF8A6421B7AAF90093A76B /* f.cpp in Sources */, 4DB3D89E1F7E7FAA00B5FC2B /* fig.cpp in Sources */, + 4D1AC9772B6A9BB200434023 /* filereader.cpp in Sources */, 4D4FCD121F54570E0009C455 /* staffdef.cpp in Sources */, 8F086EE2188539540037FD8E /* verticalaligner.cpp in Sources */, 4DEC4D9621C81E3B00D1D273 /* expan.cpp in Sources */, @@ -4438,6 +4452,7 @@ 4DB3D8F01F83D1A700B5FC2B /* fig.cpp in Sources */, E790165F298BCB27008FDB4E /* calcalignmentxposfunctor.cpp in Sources */, 8F3DD36718854B410051330C /* verticalaligner.cpp in Sources */, + 4D1AC9792B6A9BB200434023 /* filereader.cpp in Sources */, 4D766F0220ACAD6E006875D8 /* nc.cpp in Sources */, 4DEC4D9821C81E3B00D1D273 /* expan.cpp in Sources */, 4D3C3F0E294B89AF009993E6 /* ornam.cpp in Sources */, @@ -4721,6 +4736,7 @@ BB4C4B9322A932E5001F6AF0 /* areaposinterface.cpp in Sources */, E7901660298BCB27008FDB4E /* calcalignmentxposfunctor.cpp in Sources */, BB4C4AA122A9328F001F6AF0 /* verticalaligner.cpp in Sources */, + 4D1AC97A2B6A9BB200434023 /* filereader.cpp in Sources */, BB4C4B2F22A932CF001F6AF0 /* pedal.cpp in Sources */, 4D2E759222BC2B80004C51F0 /* tuning.cpp in Sources */, BB4C4B4922A932D7001F6AF0 /* clef.cpp in Sources */, @@ -5003,7 +5019,7 @@ buildSettings = { CODE_SIGN_IDENTITY = "-"; DEAD_CODE_STRIPPING = YES; - MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MACOSX_DEPLOYMENT_TARGET = 10.15; PRODUCT_NAME = "$(TARGET_NAME)"; USER_HEADER_SEARCH_PATHS = ""; }; @@ -5014,7 +5030,7 @@ buildSettings = { CODE_SIGN_IDENTITY = "-"; DEAD_CODE_STRIPPING = YES; - MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MACOSX_DEPLOYMENT_TARGET = 10.15; PRODUCT_NAME = "$(TARGET_NAME)"; USER_HEADER_SEARCH_PATHS = ""; }; @@ -5072,7 +5088,7 @@ "$(inherited)", /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, ); - MACOSX_DEPLOYMENT_TARGET = 10.9; + MACOSX_DEPLOYMENT_TARGET = 10.15; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; USER_HEADER_SEARCH_PATHS = ""; @@ -5124,7 +5140,7 @@ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, ./include/vrv/, ); - MACOSX_DEPLOYMENT_TARGET = 10.9; + MACOSX_DEPLOYMENT_TARGET = 10.15; ONLY_ACTIVE_ARCH = NO; SDKROOT = macosx; USER_HEADER_SEARCH_PATHS = ""; @@ -5140,7 +5156,7 @@ "$(inherited)", NO_HUMDRUM_SUPPORT, ); - MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MACOSX_DEPLOYMENT_TARGET = ""; PRODUCT_NAME = "$(TARGET_NAME)"; USER_HEADER_SEARCH_PATHS = ""; }; @@ -5152,7 +5168,7 @@ CODE_SIGN_IDENTITY = "-"; DEAD_CODE_STRIPPING = YES; GCC_PREPROCESSOR_DEFINITIONS = NO_HUMDRUM_SUPPORT; - MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MACOSX_DEPLOYMENT_TARGET = ""; PRODUCT_NAME = "$(TARGET_NAME)"; USER_HEADER_SEARCH_PATHS = ""; }; @@ -5166,7 +5182,7 @@ EXECUTABLE_PREFIX = lib; HEADER_SEARCH_PATHS = ""; MACH_O_TYPE = staticlib; - MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MACOSX_DEPLOYMENT_TARGET = 10.15; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; }; @@ -5180,7 +5196,7 @@ EXECUTABLE_PREFIX = lib; HEADER_SEARCH_PATHS = ""; MACH_O_TYPE = staticlib; - MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MACOSX_DEPLOYMENT_TARGET = 10.15; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; }; @@ -5227,7 +5243,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MACOSX_DEPLOYMENT_TARGET = 10.15; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.rism.VerovioFramework; @@ -5280,7 +5296,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MACOSX_DEPLOYMENT_TARGET = 10.15; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.rism.VerovioFramework; diff --git a/bindings/iOS/all.h b/bindings/iOS/all.h index 9698250ef2e..0a5dbb6b62d 100644 --- a/bindings/iOS/all.h +++ b/bindings/iOS/all.h @@ -100,6 +100,7 @@ #import #import #import +#import #import #import #import diff --git a/data/Leipzig.css b/data/Leipzig.css index 1c5ceaffd16..3e434c0f8f2 100644 --- a/data/Leipzig.css +++ b/data/Leipzig.css @@ -1,6 +1,6 @@ @font-face { font-family: 'Leipzig'; - src: url(data:application/font-woff2;charset=utf-8;base64,d09GMgABAAAAAKOsAA0AAAABvkwAAKNSAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP0ZGVE0cGh4GVgCTIBEICoaUcITcNAuJXAABNgIkA5MmBCAFgwAHsERbT1xxRLx9UCluB3bHtvNTRyJsJec1HxQdqMF5QCS03Lmz////05LKITZlaYFht+2/EIxgBCN4slyg5tyKuDiJ3V38HDKlZRlng7ZMsxOuQqkUzx/HMsCW7Nu1bjLFsSMX1CEjaQVbVf3RrNCokioZaFQLL8ILXzgVk/IKcek7eMa/cckV5Re9bExAaU/drUsLnkN1xu+9bWUeL6nluFlPDHUhTFhiISPYtDngRTbVdUMiD9TuOrfBfby/WmQ8+JGkJ/HYFvF3tGWA7TojRAYpm9cnVFQXRVb3nmS/KM7w/Nx6fx0sEzbYxojRazZ6RJVEKxaoKFZhBjaKeqJ3Z+SpZ+aZ53lGnXrGxP5egKGKpe466+puXQ/0h9yWykIa/QMnu7fByDIKfFRAnEmUJZ8qmWzn2gRhLMYYLD84b20ZBzhdrEXL5kJMXD23x8wGPoEvOnln5t3u5ZKfJAYVKGGlFS4AF6hif1Hvue8KE5sZR25V1gMFrVgDs4w4486p6YunGn2okYcfRZ9F92DcvIHTg/NyHnUI8TWd54E19zfapCFipRPKrDRCfYR+h0tTKwm/PqfVLTmZqt/OnGJpCD1LBJK+MwoM4Gmuu+xXe+u+2lagtoYMS5gsENjOEpi0bCvkP9VW40pV7iyt2Vc0h3UoJDhuLp/s3iT0Mt87taRkUbpjgZMsx4lTWkDOdUZTWE4P+BNw5nfmlyTLjgsGybLjNOjGTnip5a1t7bsvzu9KACra/e0EzAkFIA3Pb7OXv/n8TyuK8CfGMMHYGsTaLIxaWbG5Uuey++52Xbuo2EX+3ze1/t545kHVLld1SWpDQEC2A06MYe7qcqKBxJ73ZjkPaCY/rd0/6eyf0PawSZIdJ2yScSBsO+5WP4SvFwIREAN/b6rVhd3kYBbUOGh0hprZmpLOSmdskHA5s95F56ILst+vG+zu32iw0Q1QQIPUgE3ODIy0AzSoFQhIs0DDEGpCEuh0cmOMXeNASNylyDUaaI2WZzWz3kTGmuyMs+JG1EaaMy66cOuySzc65yNro0uiCdKLsrskMTZILkvW/2/5zt6bzZzzJn3zaW04J6UZT1MIiVH7Z/eX2RIyhAm1FQdOpUgcDmkhEIcp/kiXdOlRDQsIz7I71e1nvl/TL8DMIJYIAaM/Fkp79z3vIZvWQFNKnU4Mj9hd0ixjr8LLIZu2Fptb63jkDiIEIvD7YSzNMwVT2+a5ZV16a34ffEAlMY0PvgEF3cxZJjNK6ybosfE14yvNCGMWbfk8joSBqG7tvgpNZH5IUrFzAYW5//zB3WEPPwx6kI/EyTi83T4p3GqDQDwsAKnPPyQYm7ZeU0zKdXqYIdj4YqQDp49XtMzmVXs7SkH1ZN86xWdS9uX7tmzta9FdORJ1GsLOEaCVDRG2K45Rfiwg+NUg2WOUNoBALNKRh3oswGbswD7cw1dD80ymxCCJ0io9Gq1Felqv9FbfrCzCkm2UTbEVdspKHsoh2ZGzy7hyqVh72n7mQQXjuJKH2eeHt1f4Ot8R0lgRW+NC8GbyZvLNvpvfbxf/lcW2XgAsIwm5KEYzVr2eEMO4idfGzQUZEx8xS6GMV7MW6io9r9Ank3Usycqtx5bbTnuSO1n/etSSSkO5WPptr31Pk0ITZ3MnH/DB40mvbW8OfsyODfF74Cbd9G5WveoWzr764L7S6Q6dPkgjiNesmyJLuTOTtmrvO6QKxfToHzhWO2xJoZrTFdfQzNptdBG6gI2ts71S5duv6zLsEgZ9H85hCZsAgEfjAbgK1+AxeDKeidfi6/hD+H8IMYkhGWQYAIhOMo0sJHvJSfIM4l2kRpMAQJYSNQgoZQAoydo8cg/iJUpqwa7yoKNhYPKqTHkUVCxsHFw8AJhJNgVqqVSOXAXy5AdAzRQpDgB8oHy0gwELDjwEiPjx9dijxgOAIDAECsPh2wAOWQOSD7dS86PjS6OOipo3H1WqD1cmg/pq1LrhpltuB3TXkvfI++QD8iH5iHxMPiGfjv2sFBlSpUlP6+IPTbcpq6h2Suua266744a7brrnlvvR0DEwExLgkxKREZOQU1BSOeMPADjrnPP+dMFFl1x2xdVSpEqTLkOWTNnznV+58iyiM5gstlcFChWpUGk5l8cXCEVi4hKSUtIy8gqmgHS87dPS0JaVU1PXMQW66KJLLgdAV3kkSZQgPh09A39GAR546K/qAwDqWrJRGlqYmBaOwxMQKDQSg+1NpU5dRgcoy8nBxS1Gi1adOrRrM9oY3bJkypajy1jjjAcAwRAQFNafZ54XpUSxcmWqmFmU5pYcAFCFnnqSnoE/owCBggQzCREqTLgIkaKYWVjZ2Dk4RXOZjsFWVFFSVu1doybNAbAcM2qZodhiW/KVOMnvKt4UZ5+Orp6WvoGRXwxNHHbUMSccd9Ipe9Q1uhckmEmIUGHCRYhkPzKXtezlLHd5NVpQpo+WpvZpTM2NNa6X/vXKa+988917//vhJ73xNgh8CIBvPvnPZ198Va0GADqpM6KXyeZweXyBUFTf0MBoOYfBYnNILo+/k6LvnxN8mkyBhKSUtIysnLyCopJQWUVVrec+vyeKwBCGEyTFe5aKJ4tIj5vbu/sHC+h8iCmXygKoE+vfO7v/VPo86td5F1x0yWVX9pHeYDSZLVab3eF0uT1i9LJP3778GNL1/PhGkEim0pnsz51uLzAeLrenNy/vPpI+H/oGhkbGJqZm5haWIgCEYATFcIKkaIbleEEklkhl8n45eQVFKenNhIyUpCVTskmWZJcckpfklFyS27+IOru0JaUcmpaMgIgQx0/oPSPtvS/Ns3y7zp8l3ta77nlNm+JPUexTN7aiP4VUlDt/dLCRkY3YbJRYjDlBq4loBWZvMds0Nm4Cg2XzQ/hLueqYMI6LlXfFIgDMoA6ZOInYLJEAoEsHlU7EqsgWp6hxKEZZExt2WaNwkx1/PoYdI1YsevYhl9DFEmSq+rAIWEfZcYMToyY/DbnZDbCx6zeBsMbo6LGdQiXMeCAzluyEY/bCaEKKNra0+0wkrAmxMbFiubgXy7CdsOKkYMiwcjKJMmPH5GSLQ6GJWcfirFjExlPA6cIwCuwnuqxwtjD644mdErmbq1fBKzFvsmYLv+grM5LDEiO0/TEp6pP7adeRAyqrRIjNs0QNhy3CEqSAfXwTMRu9/J0r6TMcslngH0u2jfKpz9IK/xdgPrjKl+Sny5oWwDXJKv4YIECc0TSlbQaPXOBJAXB62WiZAXwHg6VSMOrtyHX2X77DTHPTNDsv826CySKHbSTsO5Lxc3snfnEW/k4Fwz/ZrIKpg7dhfarjhkYAkKYheEuREGiZ+OvDorQVQsRx9u+N9hxWlD39ds55QnB+a0WMyHKz/wH6ue+J/9mG/3jE/28qfPhef/ve7XW/LhvD7bsnyKKIemrXpIbDknLe7cWQKiQJjk+j6GjPW+iMOLZfFCHg92TQQh6QeFZSQIOIqpQrAER3CFAogUilCqOum8mAB34dxRBSWvJ8gRSXMmjng6lHHCEVq1qoHwKUjTHiPkPUEJlZnAVsFCpC4qXJxetIdinmHfO05IsHXxOOTne8Ef/mr/8I8VwhTFP/9iUfhVNAKIpYBPt+DA9IQhRB0yELIldxPTUlcBOQBNtttHbujlopQ/b6CXmqd/9rwcd60Vo3VfiWJVs8w8brJDew6vvI1NzDNq+OmK4fHeMzswrJ2IEVCBNtiArTVVCB6FjFigJqd+vq9tXOvcsffXJ9+tCZ83s27zgXbT9+dtvqhdWrO1u9B0eFIDoasRRnzFV6OwhQHqGXbOxFCvm5QcaEm+g0g9RtNHJLpq1TRSurq5DlP9sK13DMskQlyzQQ1Uhc5Abs1EBiW/E2oVAgJ8azifQejU+d/lgULZebN/PGEOnUa4qY70kCCPHEjKnrnmgYwBzOpOMzNUg5tdxBaRQv8CJjG88ArVtYqOuxbbEYCtBlNoETgZwbZZADVzhK0jbo8LqYT/OkRGiV4Om760huXQjr0wVeGzQ+eHVyAHaY2yS+YbHQHQl3YRjuFuHwLu9leShlVal7hhNGOJWXIR9XbGTL/XVsrffns1hXC7IJWeZIIdKWWVKVNKB6HQEdV2LD5pWRnDtmZJrWVptoi60CM8p2SM7A+fSi4Gx0oQsFLMDUsVOJO42xizBu3nOxuRdaZya9IlRNxp7Uiq6QAqfVTBMbqGR0xyBJVSPeppoURk436zU9Xda2NrVw12bVSfCxnB1sOu7ZwuAUOfTuqsGpusI16kyyTNTfg70R+rl7g7jUNoBNVB1N1bBOOs8CJnacKjVErbaQmrdtqZseIidBRIP6JCWZmq431pBYGEPdtdYWYoWov8wE3ye4AAZ9rafz0bOZe2NtYDr8WtqhtsOs29MPiWrmaZeVC5ex7DrDjbaXA7UeqPryiFVaYVUwwQJqawjC2yfva6IeMVIE80QXEK5MXWXO2h6wHjbZAwUCFiWCNoXsfOqQkTvUVI/cNBoEa95g4hmxSFQ/AzvIATUX38TM2Tdimb++F01w8jUZabozVRc6xMvEWU1qYyGi/xyvG6xH60QNg2WOK6Ep9SRV1GYiQWBVPdKL+57nbRtqyaO7Kl2UTJELb45q0YSnnyALj4lOw14kDsC1Xvrt8xWEql5yhMmcPZqZBMY5+/EKL1NbRWzYRjypx7IENXyHaFe1/GnOl6TFy84XYTkV6ndJ0pXEl4/Wybayh3s4aChGYmqipoeQ6F9hEmZQxBKhmkp4/PiXriLROaLz9SofYnzCHikQxaMxJXKPPcYcmMCXorYlkoBM712OXINxbJOLHp1c2U2oNWSsLCfdnFasUmtNcFg7sbeVNM5qMlrXhtxDdNQdThIdBpGYC2qDBmcc8GCGWgWh5aOSqADePV1e5KmQQpB5xGLI0e1p5ailtaw55FZIsIzb0rIoL+iiV9udXipcTR2X0xhXPQcyWmXcklK1g19DowajSc1tDRGNg+1LRLsGZofEXE3V7PbTR/ho2s7kXZVDvR4ehnlq+zdqM4IvvvAWgad3yhQD0/5smXEmpcega4RWYpifKLOIkGlZUGCYLqkQQXSaKMLVqcZtG4wA0iL6kCgWT3TlYnGaHwe9SIUSMkhI4Da5QzhezxtsSFX60Tyam3D7sBPgbGDSZ+jutHvTl3qHtib71NoHNW3PvskIkvNIDqHSMpKayGSgFJnOoBmiZ+r1xlonc+UbDRCdxJev3aYjiDwkD6AXoe2X6oI9G1KkyJN+snr9J8VYPYbV9xUjkVNsZKTU63bRg5sI0ec+KXB0PIKYwa15r9TymhSVULuayG2GtRk72WKsOksh174gbH0kwQ5ILkSaYfGuzhQ/Zu0yK3FFpbhaLSlutFCafCypG/k7ttFQvz4NG14SUwDQJd42HlYvw1kNBJbW0qpShS5uVIubQcpMqQFIWvn/k4vpqjWf+sePmvvYjPd2zLinS3Q2uobYk6rHckyObtvXu5GlWIg0hFy12FQSg+15TaprOUQ72hCRhb+K8EfwzKc7lEAfkWL8VtNcAO+CAgZNjUyzKPMAYCSQSCLyyPXcZwppFRfExAO5mCfVz4ffMYiCZDOAKGwBW3hrutbjd0REtSpCqDRL3LujXapxIWbiRWUyJoyuSUXKxLU9mhURGqRxWZAqQIKSMrqCEgtBzwj2VhVKCBpeB25A9+qqYcGYKDe1C/ZHqTs/Km1R04AznC8H6tKfOz/xShdq19peZhNM5lygX1yDEGgI6W1K6i3HmcLEMaopUPGO4ENXGXhbJlId2mLrIqKjPM7MBh1fjJduHpbg3N7YKBQy44yHm1BQ9N5liY/gnUblHTTXKrLkKp/9KgzZMbqQ14y3uSSsReZiZIxfLnK6fpqxF5tS95TLaDyvOtamP/WMlQIzhr9TZhOC2UXbcs4L2BJX3GTtgqPH5uC3htFCLgbdB+6mm3Y2HOeed8RoDdTe1FK2bXsy/7XmUwvJxTRKswhS2tWj6WNmo2DftdftVMlRtfu+f18mS3pmkLx4IX3ande+enexybKuZkpTFytVubi8r6ZeD09hTPL592UuhxFJ83WZjHaV8flx4nhZpB21mLPqIgQ3NwNe0lW6JOlAeOD1+H6tW4lWG8lmQHI1aWtE2VCH2mbrfSFK/9xFQgQXay3SN9uff070UAN4XV5NtXaY7p+qBzYMuhxLXOZAoMKbSCwRC8gbr10l5qJ6pKhFRKkasAoXZudRbns44/VnDzcl7XozOEnDloX3Cx5zS2qyay3a6KUm6XmzfmHDl/elCFyYCy17BceMt9k2c2NKV3laI/lw28uk6sic9oXExwS1g+gpUe0LPHmyMuLFWTDuF3Spu1bRXdfs/71h5OOnXHJZ+Zjf1hIdU3nhomlBBpkwhudz2F7oKDNcIx0hriq1I8K2+kaxUKpy9h9JPtwgVcsY+ZCVvP7BHeP2andnjxnbHxSMeXuncdR1W9stBjAXqlTUY3ywKX6fj1WMONGGl9YMZc7lc7qPooxdbscWf1mhdvZCkxmbif13xrKKiKtyYW9U+LxokyCu1DZ7nCwuXqiEkvm9Fzoat5dj22BBi5sBCbY8mUMAVbW1JkmQGj0YEFlzW+vqDjSYOJIJTJirjLWmCaUjQ0MJwKI6wNc95vYCfkTxcXCKExmfRcR1NadK2swyEFPiQCeUq8USjMkgXrXetjHRAcRmggVn0CJC/LzvcamnVRiYCHu2OT9K1rJQgigHsxxKrlEcM4fr0V1GrPVnjE2cP5Ix1uZcpd9prE3055LWh8xrMj2RAZWiCVWMlVAhVqjLwtwOd2qIZNDJWtkpw2dH+CPmjteW+tgXBCGtMi4M+jg93QTbhpnF/Y4jBUvNSaJG5rbkiYjQ+CCcQBA9vZj0YmqtJYyYSozf5if8+oJx0G4JaoOx3au7e5zIL0Jeoox3eQxPHQB8YOrguKTBwiiEfMCdwhuA8Y4RW/ARD/RK1bVROLeDaFKrEx0H+2EyetFky1TWD5UjE+KoKsxtQV+9H+8ILPj0BV/jwut75D333KmaslbZx4fOvIrjjXpcDJi2qIcKMMw7CIX91Oe6rsPJG56MbzPDJ3OoHY+fBeZlFvlbyTHJC5QhGnXppxJSiyCadB+otTPozyxSK93AJVpxc+MkpiL7EOMw4L67uN3lAkPKmgdA2hdVg8JITsoiEIVUhW6HESXc5/JxOdhmS/PKZNyyNIJXcBI5DaQ2rljgnLOxPDnJbZzRFmpaR25C/pwOpol7VBb6+cTEEuo6ysQnKyggwkxa0K1NqCSY0qTB3xU5a1VNoT6OCMsXSbXV3ekRFAP5g4EKZ3DmtSadcEnQ0D0Pop4PMZOIbfTijXAXDLeuqmUyqof7UOggwOJM9L4Ig3ncaJ7j90R+GnQkHnV1otE4ID5ZG3Xw+OCMaRRjubVFrSEJqc2pHr3KeDWE24n2LuVqiy4Sb8PM7xLsNz9YEqcBJvi4iKUt7ThGTp1Ix6GJ+gLYw4U2rKtBBC8hoooiIuYI9zTGb1RcyVGxTWpQWGxX6UtAsYpYVVu74yNrdLvgFRAFlfrGcJDq8V3l63wsjA1HbfQ1xhozay/McJb6wjhsahBeDVWifoP9scxwhhmekjFG7RktUH2kcgv3dImT7Kkx7jeuetpo+fLEtcMRM6CuIFrmthM9bCJZbbO2Z0Zbf5rKCzGBRdqolkfNkc5tu86LiEbrmgh4zLGEGGvdJ4n6fY8PmmERhDmU3iBQOyL78jY7wB3iogFnudoNi1KdISXywQqLamBWa8Fl2Tfzb1A/Z1UhTA9lQC2WNM3ILFeON4AUMKgMKx1NKXFWSZbNUPi4L1RywFU60Ub3j4qjUEIIZ67iYMCuNZFtPD4k8sKAPkD3g3nWMc5kdL+iLM0E3J5oZJa/Cr0oe0Ru3rZQ1lX29fEVFU2CFLRV70LJdYZcVcNlttJIKunIxESts8NoO46LvpX36Vat7tCWTdxeacRH5gmnfPHCntZNpuwe0a56yxzi6O7FK1SMPzKRMxOCpbr2nu5OUOOaBkVU6LKN/z7FKtlZEiSXC1a9PFsFcwEbqOb203nLG0dEqTTcCnFpVvfJURWnxcS/Cns7Q4olpPpkWQ5hOTM8GEqoGT2sk1H0QcP4++IETT3I4QSdANWZTsERTZ7tH67lBTzhaSiGE6OdedMgvnZgDnExJLxCv8s3mv97FCEX1+/snbJT5VtGvf62TINFhkbwIqkNzDt0x4KmUkzXkoRqQhf6hlcCcXPgQJ2skaxdvUKIoIYjDx9imuWBhNKxRB8H6Ajw/vh9iJkcW0Tc0d4FAy+rOhp0wgNcF4TeQyFpdTORvsRM4aXw1InjMYI39p1swPHGqfYxemLlTaNbotJp3g6IEdoU7GCIa+aYuTMawczqbpuN1n2j0tI5Vjp44BJGrHavaVVya6rY5Rj6C2LLrShVq+4jVmfjjWv6ZeEqn6GUgM98QA7eSI6iiIPsEdTs5qZmzMCNF7KOBLJXfPtHrFuTf2jZUgx58U05JxlMohMtNoWujkjfjs+HG21ZS6RXJcR4BcRTikr3S71jZNt9R4i6CFAyGQMXGPxMjKfiQ2GwHG01495Ja6ImzkemBMOJWZvfai7PbFH/+8Ihrhso4AwaeHU3H9yAeee2yq3Oh6O2LN0ucaHyl0cP61YYncTe2YjTJ5biGPWVCF19rdupi0pfXisBBQzSZLr23DnwCORllTog+Wg9FAotDVRcOH7Rty9vlVdjgMU32Ljg4eMuFsq4Y+4YJfrMMjokTJEsZwrucQXA2VhlUFfCDlpSiK1WqF/NP6oIlZwwO8ZRO4c1Jub9hZOh6Y9n54KeXsydIhclftVPEPOY3TfQm2BHwd3KMGmTB3zWC0haPqk5K1MwPLIQUiL9YHnmSXcWj1LjE4KbuyndIerPWqDgz3LWJt3oZcSDkKLSmYHdcRrJHhSC+chCUEIvVIttxjqxZfJPN/rx+jEarHfVD9SD1SAduyIQTOM/aTQvnvYvX+H7w2jvEOsUfKLihS6J2hSiTBp/N0ykjWQuxHYFsGlkmCUdOcwtQfZT1ERFL9yoXpAzgfLUeJ2LPCRcWbqoifTGNJ8Yj3oij+/B2aBtQlAVI2dCVENs0rdLeEr0SN1HWmXnWBhCTkXMOs9yyWfcvG30TrzjbI2ydEFENYL3ZZeZyFIWYmxKTZIZJKeSKlpLUAt8DbsTZBEhxpT4J+GDngbeERuOeEcEb8JueGu5PHZhinYA0wtiKiZyqmac9+WjG9G5aB5PbqKXBk2VaSiZeU1lXOADjDJ/y/ZHjHNzvxZv5ymF5G3uIzmRLDjsOqI9ETgslq/RdVDMjnA2+ECgnMRLxOm+6grCPanGxuh7ibll1/uz5yjc6ZvzSQzE1FV7wPKRHPAjHtiYsPwQ4IXxCRPLRLbY3PzkrhQM1RQyYbdsg4ZyJTv/JpDqumRKDBpvuZHsb56Bjt6NdkTqhKiw+UQykoX2NWrz+dgPXHc5szQbCsZJZgC8ItPcPgpWSvPMpOYYrmZYRHOaM3gbrqmmBMrrclFzudcQdd9l4y/vdkfbESsqJ/NFNmXQWcf8g4x4hrNCfIsccRdYiOEoxWdytSHRNy6j5QYc3+oDZrffW1J/+FPSjZWpEWphLzcFD73WiHVWaTOi08c9Bfj3mbDgW6hkJa2kvr3TXxFYgKa9yE4DNKYLVNNf399XWY1Z20dylcBt6WwXomJKh4eYKSfPmJ72p3Fcyi3BQaLws1vZR9mN+alWSTpCao3cBNbPNRn3GwxjZkpioW7tS2pKNvWzMMis/f4a1v6vuFkT/bOBa/9GS2tFKtzJhzJDUAs9A7rGo+kMOIL8dOeitIeH5b52WU6Ayhx1UnAhMYCCmMox3RtzWjJ9pHiPJxcF43Zay2nfa9z7yxvr3WCyKcC/gwojBdOFHlXVG+dNhcRPA3AcTfL4qJ8zlhxLTkYTnuLM3mfV6qzqNMmPEaT1dqDwXtftxJ5IICHJTToL1UJmjSGx2CQiQjX+iKBPVoP2PNFRfkwy1s66EBCIxZYaYkSNJTtaddZh2O8IN18Ea/P7qEo/4mzSdvIUMfBieY7SUjpfbZJ8R4ANutBCtIJZobK6i8gRnfcAIDn0Al5CzHB7C/9ouEJQP4ZYx95GMcRU6AftVAy7dJSwOeN0Q4XRGL+eFgfuQ7oyjagjY1k8lTPuVzHe9yEuZwacOaDNuN/8stxagxYYXoNoexEzXqb1z+B9WuzsyX/xa6bcigY2BTPgabPEHA1uIEZW0JtwfULAwN3Gsf3MPmaxaWzMGY0A/bcOJc9Ylu/xw9xfxmSd6yAlnz7RgLy7H7YywdDCb+BeuN9me1pJl3m2vjUTCUcSF79mVKiGIQpolruksfIDBTl2Pw39Gu8jFrogQooGbqdNDMdGyzNvyUjKBF8Ug0KkVI3o7lkFSGUyahqFPHJ4TGA0xXA8BGkQTnWIjAC/gwEUEBdoWRmLcKY0XyD3cLLbHoEnZW19Td+1hI+Uta2Yfk+ugImFUO0VXoE2ZBnl1V52RZOa7l00QXXniM6eYHTrtJwXrj+NYzX6qVyLdoypj5He9V36Xp09fktE2GKH75vjlaGE4kKAwxswKP0ezliiKTmecrzb1I4mO5gQIL6VOjKHEEJSJrAy8W76cBMwSU5Ed4ge8tUNhrUmyKCID2v0MPTYJ335W/COV2iKPj8PV3N6Th8+ofYoEqOqA9ha6zRJ/rfGeR4+XfomLWO4MsD+L/QIhb5vJS+J/2EW01cpQfWHQUy/4gqMk5VdSxHkMTLpFPk+fQ9TGlHPXgQdkQ97rw/C900U5A6b1y9KJjfTG9Z6qmZV04vJhZTv3F/8ZDqW9Gl+jMAocvmoG86PKO3XrAQFqPwdTTYgdOeDfPeo+l/WdGo2OZe+/v+IMEummuz62QfjjK8hGVJwQlx3lZVF0LkUiHqYYMtS/Deq2vtPc1dT1LI3u/OZn344NzMCY22f1M4vx/dB9JXXvB3KiD0QXT4SS/qiLejxw1vG6Gos4m0puZLjGDom/J6B4d9lp1TgCBkRjSwJWF+KBC6U0Q358BwWwmpGpB8fNjwlEvk65LfwBRJvOZZwea851F8Oc4gnyetIkuu29Opbbi6WgYj5YfliXGPQazEMJSC+8c8JR2mS0DtUaQozF2g+b6oHDoSa0DdVp5n0WpyVlnNuI3JdQ1rBgpgctIpFBpm1Xc3XSSnLXdnBtSG2kCFiEAo777ua+/W3+NtL95DYZTpOlOyHxc2NbAjtn7zxRrtzigM8HS6zswnsuKEkwoudQTE5OQxy7dqus9dpOjzt6YWbLqyLvvQO4EHFyXw9bUYdkXezw+xem7yPLJpB7LPLyK9mpFG8HZGPciQk//CyQvoUlcfPLuzQZ8xf8romJljttZmE2XXE9ngsnTdMFFrgrfXOGzdBbeXnnqGXOcFm5PX5XnaPWWjyjlcO4x/R56NRQCbmbjO9a+pjMoyxyS20jncHGexd6R7ue4QHBM/jY0ORYO0eE/z+sX//jq2903Zcoq5Z1TszcgSLk+cf6D0DC0hSRiyiTKA+FzkNythTziFVIPGGtTOdn4M2SiOyLPN10PXeYb+IDQ9BcMq+59tevIPSIIKGkPWJ3vx2IwslbZjlpli7/Rx3CU8C/d2wXvs8fTq9SW1/QJ5JrRNF1TepbaRjrH8a9+aOGSD1sTFPGqrLGyVqXdCA7gD8Mc2hgItqZcxtF2C9Wpw0iNba5DYSzRAqjBA65bkFxPOsvJAVw8GjJkj5QMbHT8xppkF42ZNaOFpESwMDl7iC7ZknyusbblGreqvILj0EbzKX8/k1gNI1vhAC24XQ5Tl5n2dTffRuuOEstQciuokLkjIfgmcYkfcdkH9aSEwrizW5AGqVmhQDZebecgWzTjRTyHhKURxC7J4WtZFqoK+X6OgJYiHY4SRKFBCnxQ06EM5wv8Sa5aTdZC319ykEp2TZKXe/M2GSs0O+Kg1rflANhX077ZIpmprnZTjy1FTQtPgjo3eSUyHdYvfPI8DBtB1EERZd8u4Tr5QdKOZlXT78+zZLLtUD/IJBN+1IQ6BYwNAcp2CumlmpuSynWD36xHxIaOA5/C/yHcoPrPsH5CyVUwNTI4NXxc5j2GFT2oKHI/+2iHIf7gNF71ReA1klDmgXX7mfiaeI/RBdkWbkAavMI/KlJ/0iOluLbXjO4q48ZW2kN5NvUjZloYTYQmzxEJlsLOcQbk2iXDDy2DpQdz+1fQknLUlqf1ORfkP4zxKRvhzuX1u2XO9hmfvRwNOM26Qr+54K+M/jSrl2beE8sur/BJWEE/bigcKRID2kWpDr2ojG/XPkIMsLlR9Lj2T5OuhJI/zRDZVghfYMB6oUWzMEgWA9soh7/pSiI5RTyFk/4S5FKnNC5tyl1gjUT6bzvYBlGLdJ+BEtkEMsLq7yZUFMdyncUanbtnNWbh6RESw0psMTMG28AmuoDVsQeqhwNYf1HzIcCxzipLyqqGCAK5sJMBucqwepyIkdqg8jU4Q6BjLMlJYDP/rkkUDF8fRESURhYTCVHFL+AD9lUlAGJ6uaTPJPQbUERYRQEPC6pPGQcdaegHlFE9oRusuKVY34N4iDSlx3PZBh5bDF3T7IEComG8Pq5hKlcByEIgkl8xiBVI5g6HeLLPcEwgpzu1LrZUKMQLUtPqQP9pkqLR8MyeHXYwYBx5xfjmoNJh7Emg3ophAkISuE3zSdQY+sKQaacMS6RRxXqnqyxqlyGye0Tgx1Yi2Er56KCRCkOvaHiH9mKPEUDM1yQBFS9Bon/tWUA7dJng5kv7ORJ5C1yieNb41H9ZmkTqgFosD/uNUqLiCia6YnqdUl8ee1Wzgja+ftyxzqvmrWYldTkZCHEm6ognx0BdN8OcO3bfZzFOaYPHnZGTMIeiEMhsMcPy95w7rzUGrisd5Yl5TgmqAtMRA8XyPEW0WYkUE8wvWgrdB1p4bhIcFDDHCR187AKGx7AD5MWp5WGEWU8wExGL2suOokbEUatN8c+mCD2Tgj7EEppxDtbm5pdW1VoEfrgu4F6Wy07rSjnlIsuPhR9i07PogsukHJf+P9k7hML4rKQNFfamEpWzEfx/VFsMhsTHprEKW/X40yUyaZjCcSZh8zonIMPl3EdqOWgbNKhONh4DRLu61NmLbJLKUbl7lNru82YxiQO7D/Tp0os04KNZvVLtaO+oo+/Scqe3OuHS7hBLWy1QBKbUJnPd5spSyjMrC2DKoN+c581UZstLBYkWTmtUy4zCJIGqaKRBYLWOs/IkTNeeinDiBOaiH1gt7Rjva0hvscUvYLRZlG0w26rqr5dMeUf4TDPTj9Lks9xopJGMR5XEDXEkyWEDF1pujNtgGmsosdlKg2aMwEIZUDJQmovuHGbzQZZciH4CPICUQYjlb3kT4b7W7Y1ANyAkLTR06gMsMDsN7G98qkt/qm6okB0UyqqsI454p1PyW99eSm0nA1AUOFCTqfTWPFht8rIBbgBGTF/DRSbeoQGKI32VNKbeo6grwAssXDTbpMAaAQxZta1MY7VqjndwiGOW6MFhUxW3oOlwxP+AcE+zPQpXXSixBBJLHr3Cqv2jN9JaCQFoY9rHMVAjz0pOEnoMiCP4CeqI2iXpHENfbRjIDQOfzQr5dwGJrK1VwB5c3ljIMZ7iOH3+4TDFRTamt5uNBRyIW35DXKCnOftl+GkdaLh0oxRXvuQZ9krUM7oaJEX3lJjKEsHUPx430WZllFAYUacSmlSpMDiCZJC6yKez8qlEnRj6tVRFnrq6qOuuomSprhd+IOUYqvwB7GGQj7jprhRhuF1Kxob+0w4jc0R1gIpuzQHuIaeu8AFdQQQj+qt9pN47FidoX5Qpa5l3oivkJo7b0tuwQjQntC5QVyE9+OGBED1OYU0QyF3O4mO5ATyihJLHQxXDQUveiKdZ2DBP9IwTYf8MN0//oej/wYh9mnvt6laxJpzPvKPdSV5rcHRN4Jol5A+23Wv5+iDXxROOrhCZ8vZ3D1SoKP9ZtkoCbdV+5ECY7OEE+UyJRpCHUmfwyLDmL7nqbSWSa/hztlrecu8VtPLQFkuJSZZMaggqRA7bhANACIGwXIOtrBmmfoklQYaXpPYhFHVgrZ1ZMiVZHe4kapGhEWi+bH1xmeS01bJkVdlOL0R85WfY9xq4pPl/dIal4uxZxmABhYkoZMLNcHRBtYkOU5DICKyCUELkdL8nTMst6EQJbKBcqOfDnRBVsHrzO/1Xp6RF8rcFmEOgPyrgKWF11hXQlGqHUr4fmnVY7oTeKT2tty0FQ21+1KwSWvcV5W0NSxaRqD5rzcfk8Wm/6ioEsXn3xFKRQG7uj87Y4nXn2pGMasOzA9JLh73e3h+czbOnsvdePe7OqBMJbMoBXQ1XQ0Pn4DlQyRcjfkGw39oOEJmylN+DM0iN7xXArZ+UmePqiPny2rEzdYZzTuwGxm8xOs4yNPCNSZKn93mBDhnPfcs5yBhGXgL7uXrvm6nqkTFFTBHZHQ4YY+tddhISNLu5PVTUFQVL8mywOPF/4QJDncXneodNoJsBrCGdQXxaUyuGy7Isun8clNTQANi7UQ9annXJLCm4PCtYVyObfmkOsdKYpZi6dqnM1L7/F7rdyiSlHoGvjzwoU+XUiZPKf0AEcVHgCAziOAG7zR9ieJPoj6plGIuuc2pRE8I4yCVHjkVauuXjWU2LrS7iQEbqrRk7p2yNBZoame6Rr709uNriPo8FgwMTNMEPMhGf856Pg6I9ps1UIt23Z4uc8ApF22Oc24slhn3uyBiwJQ3ExbbLRe03zqnBlYeUPuc7zw1PKVJ9+FNH8pGzSRJeeQc78z8nejMCnbEBkGWJc1JRG9EF4BlKozM1SW3KtJ6IJgfPzl072UGmpJPGqktdrXeMB+lGx6RhIpqIdA3uZdBTHP3VtIZH37kHlQf+aUf6GUSYIcHSr0HtGVRh0PplaFonXGl2wQuUat/T6d9Tqfn1rf+ZAlnwYGRnO8ovgbGhjgMQ1/m8NKvzmQwqHnuvL7Tnw2NcfCulCWp+Pqqq7WkOk1Dt2dJzpTIxgNmtih1GaUPQnZLDJr4Uq/CjrcI74r6UTYLBvMtF+2wVNVNKtHAF26M4N9psLF1MkU6PuuqzaVTc1zwFAC36me8cQ9XHcL3o6b+UIKjDxUzuXliSDIBX5qj9tQ0s91JOjPF0TB3Ppn4ZQ5i87aAWV2qizY17E2b9Oh1jpAPrpJ5dPmGNIzvqpyyUOzWqcPv/pKH9SwpE5uxqCytmHuVKIrkcpyu1Wq82R9XxofyLTReTP3sfIZmhWAZhJf7c1HV56jdDyTEZb7t0XrMHfMb7puauc5x7eQ1GpuU523P9wxUw1e31wN+HhYX1gn7rOWelB0W4Qsg7uuUj0vsF593wGME92UICjxitPc9waSGhAb2nGmaWAaPyK/BDkL3EcKgkWRUAE4ty+8QulIXgRTsUK0DQhO2ZaXOtHjrrUQhgQv2566hFtsP8kLHaGaiZ6LGPecNERDcVdfwhEpOCbV//gS2ZPS7Y/IatR1RNNEDyj/idoYzv27NXHhy4DRiE+EAZM1jPgyy0riC/85nfXdIVRH0RNhJnIO7OwZD2epuYBQaX+OQcF6fmAb8/UF1t8WcBG5RK27g9zK4Tv/6SndhQA5JVfhuNe9qdDtYhKGCx/e5MJGOGK8vgDnJ/ZsA0eaHIWY972XJx3JPYlw35Z9+GFaQ3oOuZq0r1KPWWrfSvQb3EhceuEjE4LHDZho45ibU7ST5bMLROMR/DvHv9yBG4pcRGI+LKNuxe5hovsG5oIs3IUubqrTvll5z24ba/I2zbJ3bnVwJrvV0ani9thTgcMDYOs6v92mJ+0NVS8Rt63pKotpYLtydPe6J8iktG1bWvcHywGQpJKQN95zMQ4oWD90uiYre96Tx1dXdxB1ecIDKE1rhJDUmOJzcKsj+NzsSzCsr07KUa26fT7bsiy/FkwqCTqHEyv79upfxH8F8By1LSu/lGSzH0frtl2VK5NFGZ4NnW6cZvcqDhsXRRuSSfH7Am3aFhc+oOQhMEGy7Ux5p06eAdPxpN9JiKaTxmf8ImIhoYtVyyTRSPYSr6wdX++zLiAEiVH5KTs2VhKNCvppVzy8ik/18TDdq2qdV0ekPucg7zi34M65NtvV7bDb+ocQdZ9vme8Jg0NKNTYKyZhTCLMA6Scu7WpFO6oXPold/hCWxVDqheFMIYEEln8z+QYosv+FplYHUlPNTSsNVRBQ4I1CMKM6BfNNBrNsskWbNyoe+d6+7x/84AcHb5F9dF/0vYPtM+2xw/U6z0brtSAcb8Y6xjPMyho3PQ4eJTsHFw8aKtPYXdEkFiJsr8ykVaL7TKq4KK/Va2TcWm7kDE+Q7qyvO+hsy4FjVJx4MUUBIwcnBwj5mLL4RmkVXhA66KwGdIlDUYYfmflSb5TE7bM4veBUR3SDSWRonXBUIkkD8Ty/AspwFEUlYFEJCBBFuT2tND5qWRo0NmUG1YDupHJ0zV2h6oJjKWCmUY0G7tZnG9caXjiKSH76UBxltLG548984ReZ6lBSPHcv2DV18NB9JRStCT2rbIhIMZ9kXxa/3inWMmTZ44qUFEcSHlNuScoouzSnDV8Ll/adw0NuQ7fvGZuCDeTnnvYi6DfQ2zPtk2E4M65v6EyBI7XbDSXZkw8M/yiEzJymcN+EqCuE0/q7631NV8VKUsMnVFi/Ra5JSaUpXKTyuxiUQ0XAMQAoMKxxCEUnqp4h8bTkHqihZCLXey3uLQDu6nUmcRrw+9RnSZi835CXTOOKMq9KJYFxTYwFUmQLbwKy4lwqsOInyhJIZLxXW6l9aRZAZnzlxq26B83YRnN1bd1gOQvvF1sgNt2GZC35wKgeK1ox3x13BIkFIBr+3J5sye4xxh2Je8GQ0Nffa0C+2bcnNC80bAhVo5NLpY4xwcPESOWyjcNnhOJxrS60P2Zce1JrRlYqJvl2dGZf6ql7FrGjAeX+h/aPv/397ypmCFxpef5mHW8UyPxc3c/Vop1YTaIiHGh5d/hTobQZw3Zab/2hnZXnu8i4vIhDbxWLtPboHRggapCCqjNTw6llwQegZzlINmPHkx75Z5FV83vwCYZO/MetxfLdMsgQSCEWjSSF8HE7SfJthuquzGB/k+8pV5RjB3+rg0ZI2/9w3vh55MRNLNOfkLA8fUrcWCgioyynn0es5BQZmkkxbWocDSUYHCrk6t14QlnqwmGFGl9RIdc7lFu0pAdxangyLfQTjvctRpR98DZ7FnMM+r0tU430inivywfAN0Yr+4ONCNuDbnNTfrWZw4sq7Ninn1QG85iqpdgQrPC9Us62owOfat2nREdzAznEpvuEWjY9Jtwu5kLZb6UQJkRS5VQBTx7tl7i3hvpdyx+YKI/7GNf0cZmGEt6ETFiVQYCeJzVeh5ERmfC3d5nynprI6cU5MySRN+15jXpngiY5kzEfUjMjNc0W3ujGQl4O1HBSl9LXiDP624iumauXL9nJYtnpSwYLbXLFua5oN+uPM7zKjTZ2BC8CHCcChMhHOjkB0TtBZmfi6SUjwvj0jqDrlSNDzezR1vQvs3xQSrl2bmkBHmUP4PKNfk9QLzirTr40IbWD1zGUoG5cJVqHmhXVU5oZax/JQrd/wqSilSm54tqG3N+pdZ7GkyaGXHjWZWq+2Rt7Z/F1ErzeEYmdy1RrlcSR4PHXCD1ca13Cy+10wZdEVdXi6dQRT6oJxHNVZdedxCi8vs7QzoRfyXENnzvq/9WwbH0Y6QJF8BTrxc92pgehtQ/LpHHKJB+9/3aS4JHgrw0j4s45cdR/bNi/I++aMIgciMkhMqH3p8VPDLuQYlB450xk3PSeljFP8cOaxxaCmo00YOIREzL2oeDHbbzBF1IeqHuHSpBxQkVDv9QAh3wh5B0FXtQ/JApmsR/TKXK6OW22Ofneu+/X7b5RNxaUD9LAHRDcwSuHcsu7/3LLHujrh7+UWzL8FcDdCQDcf6oXGHWS0xqxJCW/N5+GEriVZfmflFn/e8PY8rrvzJsSOy5dDbc6fsRm627xfZNSXD+J6ZXXslcix0nNwqoHuApo+cqinGSFaDaX/GDVpRa5UUabv2W7/8tjk3Hp3Lf7dWt2wNtyreTugXnDRaoHQ7Qo/KFCtIgMpmQsHkxu8PUCvOegxFl4AAXaco6gukqI69f2DUF8MweGdK9Url5bbhAK1AqM/5LWnG9MfXJyg29zNQhuU4ABIFCaRa/IIvnRLwO6xAjozIscD5Kff6hQGK/H07ztg2IQMFpFeOCam6SidT8tjQPiiPvsNk7EErR3y60Wh9hpGHDx7dCR6zNSkmH5S5ONXIhJA/w05LdHmIe+4nFEbpm77hh0R3xdrErIW4NWxhhDg+Y2fLDJp78zBJJJpCHk4Vd8ZP0ekfVb67eW1we4eeIIzL5709a9LLZHr0egrtPxqjS978IgDVn8Drd0dJ7GzEBNbfY6LbN9AslMOWJ9AKtbE1VePi1Pl3IYsA5Y/A3jm4ycPywkLr4RgtXP2ixNegNoCdKP2NsHjwpaW4YbyPJkKqNuN+c62lT906E9S+P1/pYWhOQGa9AogAYM5fdAfe4RbNlBtKbUEtoWi4uARrAnFIpJJjPd06ZID252fDGSYZxnxLT98YYhere5NiCm3SyUN6BKoHw/01qLfeOsKSTqPesOVhHIEi223s79lalBmLhbOU9zg3pKtKJhyymxu/Qh75N2CfayucJ/h5oIEi8QtbywOQtWcmcsByqReNJNR3WIb3YHtMusI3C9UA7v9Ewj1E81BdMDcMI9DpWw8yOTLF923GacPRvIEVbdZ5u1keD8XWgibwmqlFaWBikcGcEjuggU18w5osWM0tzsK2Sidh0SacnVNxvhmnFW2OBlmBFJaL0k55Ltdlp5fQ9aFe0roE0gAcbpDtkgUW1V1gTUm0O4UHxCHsfswyXQ1o8kBpe/HOZS9luaxwiMqO41d45DlR4ZE9A1b0CXucn1hXD3VLnNUZTdM3mgW2U/t7+ZrS0KVqIZvLXBG/c7CrheI6wyCRFf5ByMsw3AIP5UIwrDXaXCWiWWjAE2z6sLPaGnKwmEI/Y+C/Vw9n5dYBWvpTY0Z44bJmKqOwCp0jK1hVHxhzT/BjHyAv82fYcGWo/HdE+Jj8V1qx7NS66dTkxMnGRitUnVirV6DhlHyl8JCE5BBnQoarAw+6h0nbOxvsSrc/HHdHJ1K79kXHAAo1buDEGbfSO8B62ChgZ1P84C26IMFeZD5JJ5lqvzxvcDK95z+PrkPYPl9fLPvkB7hIjh4D2NSrM8JZUDOm+scyg4srmTlHZixGFBTV/lQs3bXIUpWkGQfD8ufuF1N/tr/c10di/372XpuOiyA4jisPIcy3hvnSxiwXmPGACm1IG9M6YY8pOmecAJtZrjfrIMEPvWd/6uImAZIvpSqIP4y6EHeGs3n1MrxIMYuWpQZ8OLZlftjIZ7exmtrZcwBL7ItWZQzFJhG2MXq44682NJYlcQtHjsRP10UX+wLUmlqbb4L0nK5kJygSCNNkSx+3NmeXj4jzYcBs8XmmSCnP9snetKfaZx4lFcWqA3GyuuuDnI7iyOnPm/exprEEpjLYty5Dhqovkj9l8gg60msvwa7Cfe4K3lIfc6uetRoTqzEYm7DjWYn0N5BS0sIYAx52bS9g1nLZCfvpTdWUHw85I1xQ4MdqwKleQctWcQp0rGPlB0UWWxI05zLz5oSRU0CsxP+UZzgrN2kwhPTUYa4bloy0khTwMX0QqHqaeT8Z45Xm3guZTI3CoxXeLaD68d9IlgLPk4KHl/ApP4NnEE1VkBZNvH5rULTWoHSYGQPBWWVRCgS52ytLx87iSzthSkAWRCeVxRJht0HaQHrkDOILxVggk3B3RzBqOqgwz8JTeygVGfJzH1H+Ulak0a6M5/yC8Qt5DMox/0OFiuOxWoNoBK0Vl2mnGuoLZjyODAravdg5qt9d64/ZzT2bY7hjxIAwjeAgQT7J3VM0xR6DTWzuJtUpnKUiG8AhjQZFlzfj61jcsbHplxZPDRI3eXN9JNj2PJ1bMDs3QnOBPQHFleib5Ke6GAabtNPJPezL203KDt01Hvk5wA0fpys+ZAG7RMc6OdX0Ge1nycgSM12zaMYU31pd6hNJodhop7/emhMrzRlThUXz5nnKq/n9qZpKWB2dQ01JJp9ZV1up5UWmrCmqSUal6BJpsuLcNw2y3wv1y5Ii9soOWRGwxEB4gHlbX9XOr4BGh+YUKFbsU63UIrxCyYSH51EbQPKroILU13TK15kLh12+8heslNuimMg859qYq87ylce4qPZxis9gN2fAQiNrrj1vLGhpNlolTnPHt6UsZffC/3pnwHH1I4G5cpMNAU+rwjT6+RK9k2OL1vLEk0j4P66aw7NQBzB9n+ghqN6m/rOnaUWu/zPhyys+WHwyJl8MhGjGW1SWKb0Y/lEhR4YUx9hvOlmhwdvTbJ/WiYtNQHPkUcRK8aEWj+kyBqas/UZGvliqBIhUiqTJTwoWLHZBsC81MVkWufEDpGn+BWsEqcZywGT587Iw6QcustYffJ2EHnviRR39dpbe6NZFRsKsLmS03x5WAnhrOlmKXd9K65R6s1AyrZ77/Ky3Bf5ux2fDRPf8Zdh4Jk6SU800uXPCOrbvI5KmNtvcedp+ZJbmrcrofj/p5VtWX1ovsp6KrcqW3Xr0JehuBikSDhdaE6YqCaK8beXYfQ4XGWDwTlpwMD6v6W1DrlIrZn3dpB4MYg55khcKbkPoW641y8mvTeXBo2TD3pdS+CMu2TyWqAUbl6a12OFakGtKwCvOy1S4jGam60d7b2JeIfsTVKxrMO6rwNVffalpay15hhIFjVeoq16otdDeBcGyAn980WFrvRK6kNG72EjPMt3+/IMtF6C8zsneIYKcHJqhgeGCCtRG89JUnNpIl1KveMVK8z9I73M8tRrKoK0wRLBaWYQPa/Pmperws8At73DrLRFBM2OJDiDWeT0Vq6D0Sek9DuaBO3rQC2PSMUI4YPD1FxL7ojJlWbiANzAhy2LaeKqHi58REJPskdopeg3tI7awd3fPkTDgtRT80bHE5jSi0EwdWsdxphW0xO1pR8rg086x0T3dxySdS6NZjcI5Ta7qhKvyMZTnW6OYD68ez5JfBJ9VGAR1GXoIeg3mrkRZWjtdoWBzS1e3ILXVSqQcdN7en/foHgupPLfa31VBUzM5cmdsXwWuJzD5E1KpXyElSTtJKzR5dNbt3BRHM9wnYc7jMhSHXk47/n6UVEXeGKauHQH4fKXMjcDhdTIb80L+I+nRCDON/RR68m7xX7MEOmcU9Svz9RYL79lFTLJ0asPH/8Pjv8HIzZwLSh/dNnOHaFmrh7zZsGlh2E5qkVokv257ewEdlfEw2wa7jNuf5cBb+4CPTH4cAEuPVjLK2D6gjn8IlPwDFIS33VC2DY06dN4AEyRZeu1CUodOz3e9JDcpOmhy6EHwB3ib5pNEVF6CUIjsj2EM+m33G+wQ6uBX+4sMxfaez0IgYooh6nRcc5RYqJXK2fDmgD8gLiwWJFbBB9+HQenLYG3ULEd4QjtIZbFMPgCXarECmBnJ15xnqSU7E2EE7p28jZVW5BYffIoA9748+xmKokqYqoErVvZiVo5680+O85GwImgfuzs6OhhbRZosMFXA3K0fADOHuEZ+Qlt8ytlEeJGrDhRvJt7DpgOe9hL1cGQw/3JX6C8Z9oApiZiQK4x9Ezx/lC6JcUwsOEkfpwHmxQoW/JRyTTCoWhCoiBT2qDJRNPlcN9MDTxlOi3kyGpDsknVk3jxkIVkjNld7ZYHOl45BMdEUltaGdSNbxPntHkwO6Bjw5nQPELUCClPk9lmBETn5vQBD5sUx4byyjFnf/RxNJXTsOUk0BTl2lBW5/WVJuiijKn/JbnO3DUxGEOauNhr8dB+RoD5eOpfIx9fHxDnkyt8NR9RdhDEeMHPxPqiag9JA/by50cLFcdxRz64tRXiC9rtRU/4/ZqudGF+16EpRqszHF/wZZ208tsrS/Fg7+wrKIFLmu6DS70SfevhsIl3nl/JdtLYSN6cso5fBuUN1YLLm4W5UL8gmDoR+/Sot/h4mJwERKnuCFU7XA7vl2MS96AVaLUisxVpj77KqRt0Sq+nm9renlljUQOlgJjaIVhBPUlciYu/Bh5XuNDFcYaUIUiQxoeLtTiqvrBv5FXuBvvxWWOP5ePxtRWOsO9LtntH87pmFXJDAob1ZTp/1FjnlybUggefwUfkib0j2pon5qV3ragtLx7/qavMlRAcWZzU69LUFmKM1wfRrNjcoDti1x+eI/8q2f81uof46fJd0nkYPR+2tgiua+ce31ihycuAWXU5GuNYlZGRFhaw/WzVdSQBAqPnJTWkJzKeoas65UmNQRkqxvgTEqtGudYLQtiROdzmZZruPNm8OcXd4VNX9nKeB8X4a97deGnT8mwPtE8WUuTJgkl3lwebjndbpcvkXVPk9u+BqvJMbHDzpnX2bwhHuuyOnhUOKDHRzhNM0lTT06KGfUgpdC9YU352K6HIaoQqSVE+kEunSPn/QFWKQKaxAimVrWHxlKojTOoQ07ExKUud0WWwz06N8PsseqVdwT8qUL0oMMynDXa3zsxwDcgDvCyRWN4XKVN4xNhFsUEFsqCksvou8MjEqxBzsZMuyklSJ1MixGJy+fyC+yCYKM53i5XQjZLdHYm+cwSogLyxnSr1hBX1eu9ZHyLYqki+6/Dk+bfbDm8ukEq1Hd+2NNMDIQwFRmFd/CxWfy21O12JMzPireowZGrccRg7ITwu4Ff1/swik7m8ntfcMRn2CEZLWPMPNUYDycsW6WIztSeNVjUoVVuF42tx0+49o1vsofJdGapsycZTKv28RXxI3XKOo5Abgm6Ez6fj186KUHDT739PtoPbptxPFIWUlSU7RstnsuzLOHXdQykuz12sQQc700Z7Yw0T7HnJBY7xjY6hgYY7dsy7ikNFUeVZm8qa8L4SeUq2E97954EqrBRDZn+7zXmydUphWD7R82p+Rtdue7Jds6aG7UaN4i3v17jI9Si8u8HIg/xexoK/OOLD1DPzhukSXJLctJB4t6997eG5mZIczNCt97fuzdRnF6UkyuhDfoJi+P9C4qWYw/R9PsuVILDZ81rO4jXuGtvrOHYJ7tzXRvnn9LgfnnZ9rINjBarDYQESTa2SubBxbtTolLgu1UEypX0cquODNz5YRjGK78Wtb1s83suHhYzngYlITD62Yvb9MDgy05dIo/OO6VEOKJUl/6ygFjvmBnP5/Yk+53SvNSc+gZ65j6fEcfzwYFYy1+XVCIhIuapeUcRl5hxCf0oNac4O0Ps2bO2Jf0DeMvaPR5xWl5uOu5HsRA3fEXaBtBGC5rB8L38EdyfotqkiqsU9MRrY/0NJ4wcN7WqhemTsbYnMihb72lOz91y02VLDC1Lc8gy+FXj/BM9QmWOuiguQVCcGJg8dKpZuOctIf3j4ujJGRXj40Sm9hWSfIn2ptTyGcuPRegNweMpQ5fKGHCujOp2Ea1eqbEHajgJPE4ZQngfz/2MIUUGvMwlBKeLkg0XeSE8tI7aEKIpVWbDpSOEl/wSf0GMFWLU+TGSFJiJsCzRLBhsKM5pA5LGmERlgtFkY6be8rnHgWk1wkxyXYLE4TIFOsMS4cHs9YsJ6Tl1irD1cr/oQyWKhgDsNDHZmxLLPsDfrJjoigqylcc35CWkuVoVmbhA3BdhY7QZ7P/A/KuhtqM6sYTLEjI0aZYIDGYbPYp7osiCZeuLIkuy5TLNmGmM/sqaqnlTBxRWItF55FsZK4NniwnDF1tR0ZslWMi98oQQ3BhEblGfFI6hoVT4prTstTqazPJr1hgao82BaKCzL+PkbqzliUS2rSI6OwFBd8vZRUnNbBJ2KY2Un0lQ835oVlI4PuImvWuiiGUIK6bNp+LrNYc/LosDM30e5EGhn72kF+AbZMI3Teusp3wD0h1Ro4q/WJqSqX2H+LsQOcu7Y621RnbukffYYS+ELnY2i2nrOtoHELTRmTJdqtphS05hcp/LfvehGIkvEvHK8x2mJlkRGaQ+d+UJK1CuTcGDfyvfJaSlrlBuVhLSGjq0fO7khozcrfdmVAeKPyD2F1X9bc9iFBnE402QUoKrnoLT3MAcylci1GkcRs5Rju1qsJifj5Bn0S78QcaOcK5GDO4nNVW0GqclKuIDTTbgmKWnPnkk1M9/Ofa0RFk2+IlbF/FgmkZ1ZL+fI+STtyufHjjnSsQwPXi6ra71N0XBFRIX1+oQLI/3mZeh3ywympHcqJdGj15u49ld/cu0FCgWHq33Q4/lNoUq8XwsZ1gwTpbLQDBS9Qw2Bqt5KYMDhG1NWLwIUkJg2SMIWSexfGwZQngez+WehiM5HGlWczLB4cTYti6iouqdKMRACLgfEbBxhfCsyZHBDRBiK42lrZaed+Pp+hLPHEkKERKsACiAFBISLR7q6TI1UbBPLH/D43zT8ZifAILR70E2dSmnUYSUrKOZhCltN0EbJWgM3Xc1kymaL2RcUXjgSP2/m0dbS4cdcMMkpE5Pm9yDMHkKbcS/yeicb8hyto51NxJdOyTDFJ523en8QK22zqde8ZA2WhGvqGVlxN89N2bZyIyb3GXO9vcvbx5P8EtYYW3kK2AI4oUqduObkJc7l7UowMJVL+Mx/vQWq5UtjD7ngim/bKauO5RzaP1IzsGl1IWxzKXUBVuzt23clrt1M3Vt7sZY5iZwkEf7bRqTST3Qae6k7OykAXpdtkowvSbEpDqM+C8joZfhqJbzjwzufyND6qDhVBNgVW26MCJc/LA4jN3KqMiffFK168NBp+y8pygKF/3Ia7wutSE2rsShOnPAOWHpAdOgDWNeRjIsi69UR0zQg8TXwTGusH7lrDBnbPC9pHv88gxfrjwYCpajN9zlrMLGpIzMe1RleXfZCK9lVZGw5gUeo32jwz8VYAAu8s4D/pVbX8esFoN/foq9Tz5aAUBlqJZlOtf6bFl1tnSTzsaxYZwuMbteEZ9Trh9f7hdokVmdGVa3FjyZg8P9iou31eHP/qctON4bP84sm/ihfsUOu8zitEvGgKFJt74KPKaYgopoZmMC8a4Fnqz/L7W4s3GcS5otTiVNE+hAOHseGJpEGzcGGkiFabKzQprtGtfZWJz6g6zDlrsJxCl5zIKKGJPA8xWMnHxQ225SMJaMnM6r6PXQXWJkXt6t30IcBvaRJ6jMRn8JeWGEjUvHcV+ptNTHO4y42C/kqBxdONexZkWsXejalxZWOWvgC0gZSmrnRbn76irGDZ485R2tiTE285KWBWfaPg2ZOpw+qpyDd9O8tVwXO3/U8lUa5VulZL2QF50ZdBlUyzLvwlUfzFCe1jJJ9O9Se7myiyKIGrWqOjzBypm5yZ2BP/Suo1BRF4F3TTh0eyNS+3xRUQbsA5ewICk81nijr5yz5uF7WkNBhgyMdiWu6dkfnMcerMZc/FDsFCvvLRE/RKw6Jq93c+XBuBRFPDepFvTW64KPEpLPWo6xI6Ubqwy7W99HjcAwNH5jmUSde7Ou+0DhHES/rpl7ZXWKGtsjo/B0pWG49WMUsAd6+S7zClplaqYKPra8NMrCD6Rq+Ow83c0grplN3jvj2TG8TfzQctz++KO46P0EuP7CS71d+q8m3QVu2d4yKn1RKpfsV/U0+Ax3VcQKPyl7eAtvNyDujjxeic943AOh1JfmbJyShGqqf3q0lO1mOq8ypLt9emU1pKxk4YlqHS/hr4+FU3m2G8dwic9HHpRqyLYirdGGeeCZxnaMjmuiHh4JPzDHh/Opy/9RGty/m2vcP4T3/BTx6zM32eo8maNnN4KuoFRkrB1/h1vAlP4mzGfukcqi78vr30XQkLu8exZ/2F2DK3+rmAbt8R9FJvbDjE45WQ4P3OG1nXAgX/434tgVg3XPDH3/t8vI0C5e3/AxwvpxF6MO7zbyzV7TDUODT3qW8MufXCEnvWo+PiVSeK1bN7zpcBzHF6x3SNcpsvLnOuTrVYk+jik1thDRFIOsmp9uEgATtR9vu3KFEV8Lzgel0pxMKr5ibyqZv/yyJ2iHM3igdjJYH6R7rPFtcojGjmHOGS4+UNxM/GRj+2rM36dLfxXgOp96gdWT8fksnwjn3f2tPuoseKwZb74xg67p14gEHNyPeNmXYJUj3x7mkY4Sq6LD/QhRyWyDguC1o888RTiOnT1+qtRzovSA6RcCmRSL/24CNplCvTXTVkMpUFLEiEEA1lUR9t51hZq6NJXy6IrnZK+99yJurNlapF9WYs9LqIEZ8xLjkJ7NIDXVSozJ6GPglg/ghgf7jyJsepTs2l0p1Wq9HoF32CJzxLBlkhkmNHIrUnClAZeshmdKnUu5cmxLhtS/dyIYcJj0OPOc7JTf95YThBn6eNWX5Z6ZkkyKMMvZgZa0AP8UEw0Xr18WkZLywY6PtQv8/hN75yyl0MTXXeBdUOTlwxon7N4CUakiEZ79UxrVnr0Hz517k4Kv/HflZqaig9GNZtQlzX5MzNgYoowengwGQPgnucXHRx76rXESWdm37vJKN0uqdWoD/ew6VWCmFD2odEJgugc9eECngsM8SpVQSGukRIOU+vMtFu0x0Tklo3uoPM3fZDDR4Yv3aWtWJAcmWdkWLNdiwvUFxDasrIt8cClo3ZiT0RSxU2KI8uRHyDeIbP501jE6wpBYZQGrN8iasPpfvuqF7wplD2kuXy7GB2CG5w4sEzeFh4dcRQShfnDBYy3dlM9cFiLgLGVDiMHG8uteLNjPfC7sJ6HguaQlynd5/vul/mwmtvpzFTVnuYzZyZQcrbw2SUhvA8yw8QuwgrkjF3ulJJeDzmnPndxS6LQlho1bcBpNc9rz2giMFsobwDLp7Xl9eJoNmGEdM+0pkkaUszNvv3BliB3OzCuPea6fdo8XXDXmNzx0qVD5jXiHnRjIduwXLgh/jW3YtigjcWAu8jYAgYFX5roNkjlbQWws9Dp4kuUuEDpw2ocAjLoAaTm4OkeW+wm4ChUUgK1zJG7D3CuBgJJOMVIpA4Nk+fQOKsUo66MMDlDJJ3dQyCd3iAcGQfaQHELr7aacy4OmO5o/Q5XO/olTjn5HqeJI5t1d6OEGAXrTgNupF2c3uE1cem33zZtEA6Mee3FfdSd8AqwoLo1aKq7kpY1RZMao5OFPxNzh/pYFOHn8GpYPSu7QumXTQRJS3URmh12l7yK+MLUcOjAHus8a22qUrubW/YhFHkwc10b4kB0eNRwdd5WoyjM7TkYNO+IuIvirdqWr9o6XyPL5mZ6fuVD9mSXIpGyybSzZMHfNauA1mnXry+632Ok7qN3TUabonBiql05SPXOpe+UKPinetYCaUhW8XGZqFAu2CZionkpVWwwqvox4673xq+atMogXLqHLvRgbTo4+Ia/XYuIJF0bz5jCY4PA2lgDnYTmT4+dvygmscNNhpMLpyJnXr8dX/JR58eEyynNT2im+IElMSRHgZ+bdhF/i3AnyoSuL6gTY2vyd7Gh/Yg8JK8efjGyby/iVjYt6YhVNESAkFW4/yhahYgfCmbewYGsT2WOStmca6c3D2BGcThelXNj5ZhV2+gy2IP2Q+NIaNQMTRC9T6UoiALMnBUZnGkirsiHJ8ufiAutYUtHQ/klkvHAm4ramLbcDFef7N4JXHG0qotxLuvbWSgu5YGAvBWH+ipoKIN5y4ROLtPdVmT0rxZ4wo5vhVSLk8vuX0bD1DU4O32v0GLqwsND5F5LV+hRKqdARmKVnSPrPYt/ztz9duGghib+9nIHk4qc2asQjZ/UQRfbKDZPG/jmTQ0to7WOh0weesgmEDnNgpMcUf8WsTPIz2CLTmAi+9Me8emyUYOr/R+OkiROZrGAvoXrRwIPvTC+9fCMX29eK5/taCS+/57WCG++pqRTi4pfI6Q7/ETf9HoObk3FW2QX79TrA5R4AkxgvvJhnabix2QOPXGzYCHTyjaHYUAN9kMG8wdYaYkE6dO9SH+VWQilJ3QvJnqMTZ483z7WRdb6FsrVr17H/OMVh3D3QQvu5XUzsmkXj5sPW4PxZ7W65iPaYSV9HFTjTc50MAadZbfT7ryUwMyKSHJLFnly8MmXWlWNE00rlRIFyAVXqFwxwSTkJfDZC7GtF8tuf3uCq8IwLS1ha97lvvKg6y8pV+kRAEZu3Bm3MiHB3OgrK/Bxzzil0Fq5605EoGrY0Y99MnHk23rfqtE9o+Tr33eACVsT43qNYp4vstfUvoBCi3+GKeNQFU0nS9TYKAfRW4989amukwTDhbnG2M+wEPvvv2raeu8rrx3je8qwBj2eUBLgZTp5IIAtfHq8kDw3RLxmwHQ04ybSU7OQL6n7mqOWsVongkt1dPphO+uudjH9WeNZPgfqTjHuJaJ2Gaxo3jobfBhGNC4WxxKAc5SI6QM1NSjKTveXG3GTx1LPec+5ssy8NNEY7A4S3hJQFVOGkCV6MPDat+8bKQ5P+VE+/Fy2J/6yJyJwnltdIKLup/MryziCsM4dsyBI7yao9j2YTO0lqkEINAOznZs6f1348/7/JRXXL3GU71yX6CCtPSC1qi2L3ooi6jmuPm4diZDFBk7xIpZvXioo45k1MBXdW7Dr2CdkJr87aILYNE81HP6NKPcbOCMqf0dx/LJWpcMRVgAMTLYq5Fnnv9bZgDsN47eP8rusLHF6wMoN/TbqPRTY7/CvqtR4FVxN8eW6XR8kPtEgzBSXvr8Tr4EVycV3LsuCM15BJS5+rSE3zO5+zEptx/xfMp/5a3bSHsIhmGbHsj6J8w2loyuQQ/hBTwa+SdisEgRZRGr+YEyBuOnVQg+AY465tP/9/xk9nuDk4tbGIZTwSljAK1O29xRNukbEG7VPaXy2a1aJbeBZPnJ0S8Xyn/8DoUdtw6urVe8H/b6seza16FDiaefYuhXn7NuJjqdcff/jfTETG3iiwhu1YUPpBov6kcCQVY3frhfWN9V9F+sH6tnpxf5tLrTIq5+8Aqu0UDUxdsyKzBi1ExhvO13O76qlp03E5A8+MaaibU0UVSxS8nBqcr13O/B+N9TmmUaK9T8zA+gefq9fXnJd4p5kjeB2UfBph1BuX0ILyftvuZ/THwum0nCxNiNJxcKQv1+XH7g0dLOHqGMlPkUxND04r8SyaTXcV1Dp84YGIE7sm83TediQzVjWJls72cmM/s7GnmjY3s3V063UUM0cJES6NU6bh8j7kt8vjZnfPCqP6fcynaSOBT7tgU9lDyA7V9GDx4YxVpuDzMo825u0anyURSRS82BpqPJ3o77Ee9Ye2ntORtxqXl3Fwv6HmV6oYO71RTM6aubycEgHTjXjjL7TgmHL5MaeJVKAkhiidomqn0eXHWsgTbm7m6GhzV3+yQ3v0ruL4g+to0cV1dl/QY6dpGZh8tvPKY4K/UzE3QfMdxYrXtEaxDROU0vEwP7SWKI7cpLCo+17c/5UWHa9OI1UN+PVFUFWkJF/O62eTU1Xs2NcALcMBo/uloVFFzTB4csAWvwezwF3tcrk4RaB/ML3O+0m7aeLsO5o/Zzd7GDX57pQ+FMnpD33iEkb8/P6JAteU7DmRFk5lcq4YV8u4gyqDl9lt2S2S/1P+TwMvv1ya5CTXbYLF9+Pux96X7+6+7pkYs+gjVlB8XBQz0XO9e7c8Fg3AG8kbAOzvFCXgcjdSu3Y3eALSlMYn+SIWFtGjWPzTXGpowWKz9YFAOKk3QHVkASnovDb1uhdyvmQbzyVca900Qa3BkOIbQdKu5HkoOKig5W6F4NJ5KWUcuNwaOI4iPX9JUHG3JTYU4r+qyPolAcF54iZsKt9HCB/PJsynljenXhPbSFvuqQJ6JwkFD8zWxQWhVO5pPiuKXrSQbyRFpDGQCzLv7pOC45Nqx9opniZqZnzZHLPUkhCNOVwT39polloT2lGopzo+bbVZarIZasbOgyllKRnx81F9WQlGBLOtJn5dUrk1wQj3a2WZcXYU7RtoBd2XA/+DpN/6Xmy7G71nLQW7t3fh0sekNbKnlY9OuMr+HRM+d3EdjPcgS6uyuTIfXiRl+ad+XPsils1/T/eqOtwYZCSxidF2Rq8Qq0omCdfYs/sYoEJzHEuiLOw+MGpyykD8gKAPA6CvJ1brZaQ2624wO4lh45N8j1R50d+z+Mu41LUfp1rNpJcfZrpsKm3WA5u4bvFYLuZh9l4uYVbrNHYP7dinSxe0rcAqh/ZE32276PtSCv0OwPTHOcCn2DO9eNO99MhT1Ng6k7NpvmS3osAfX/Le149u8O9EVELhdNS8fP148buzSy4suFHz7FvJr4Gznm0KrvKNMGXqeNRyU8KGZQvZ231X65mHTtdIECfcsaLEpNS88HOBcK/j3061j9vtNXutFBmWZyqJHdWrjhsX7CVbUUWy6fn1Xh1BSedaty+tAJjBueCgY3vOHEsah9Qv57w0zexrLrcQB9p/4v7F57UxW59Hr/zGRUeaqfFUfSCRVl9eTTPHRqxFEmM/hmsDXgBblIHWUVONlrrBj6jkazN2Nc0yn378arvQPXZZ86zvexKO1Z6sff5ROnwyT7Jakn4yXQqg56GzKok5waJnoUElmMjK9iYe/D24ia81IX4FE/wEjHJsLspGqSnvPAiq5QLkThPXF7UCvo3QFqidsBlokYnMLcMEBSawQTlQNoFAmdqR2iH1N+SE+kNOlI91MxHeP4ij3Vq6fz6oF2/2kzO7w6C3JokPfTTdRVOhbDzDxQ9dSwmYHjp98MPuWlWbS/78lOmY3/VaERCqOK4uvnCd05LxL2/ch2KnETN+P6XYCNM1wAM/uFngzamAdVhG4mqw4WwfWUYOZisnn/lmdi48QRRU3+B6MwHyuFj1ed/RPdKXQnTuWeMx8YTEYfVnDv6cAlyrFIaFbPqL9c9UkFMIzvTHbvoPEj+HgqhCa3rocA9Jx0yndECpbqnuQajSaSvfdFXcK7SU3xY2rdSPh+eGvvqGi3tRiNAyz9172jyQC+TsQpx3bvQi6rKnKWop9ZTC/YEnJPCIITcJguyoH7DFLwOHUy2c/VeY/8F24F5niFnW7f8VdbfwpboRk3JUPn/Q9oodoJqRF/wt+Pkzt67A/EXkveXJvka/EErs6ntJt29smBM+H1bXFR/RoqQIvFYvpM+M5m6xFE13hjYz4sHmMaGvHasrRL8HV3Ca60r5GOPpOCDagcxpLFF6SlJV91Bysvd50S5+FgZQmkX+/cOldE1lKr3l2XQn+WdE8HhIUX/sHWPgfqZMnNrWSfq7vypXq1VUDjLRLU+mEXX/Jm3a7q5g8pTJ/3zy0w4uEXLgOOqBj/zGf6EB+3+h8nKCmy4tYIvDbOzbB7hmVmydN+fd2zk+sbwVoEbNgJ9/2bbSRmclt0YaLyEqsT/I7dubT8jizd3ZZoMcIf6TQjN/ez6H7OfjdqccCUdO3QQPqxwjVW5V6dyJJtkHibcU9yMep/3TQie+SBOe20rnnePyKZn/KTJoCCteq5zCVwM4OFvVkYBX9WEzYBBiRDLvyunxAM3kcBUdVLoXI//nQ0TNbqfaGUIZU5pNNCiMZzAAKdj9t5lHdlVSMM9iTfHT+OnwMADFdKsI5jh2Pz8dhi3bAu78wmJs62fTEdaGUapcCWsqx1uKZBmGdfb48okcczs3B1bvTubGQ52GroCUcpIlDF+gf58XNyOUoG/JnS2QOIpM6ghEGCPlZayq74Z1NwRBcFtziKqd6Yybnz/w8G3B6711If/iIN7k0lE8GF0kCBsXnVHr3O9uapz0NtGKGDeDcv4afnyT4qyz7xBUrMDkv8rzDla3iELmNXyjz8WIo6/0PsvOzSEv+V4GK+d+oyQlwRmRpnipODZvAIEhKeXzj2KCaFBBkh1ua4+52CMhDZ1LoVL/CWbp4FHRjeh8gEQ4zMr1yeqZwFzOwRjNIwdQ6v9Pt0wNIzYHKfbN3RAN62YW3eR8vAbLDCmubmQi9WyYARChxPqZYd3CvCXcP/otJSHoevviRJmAwVp1prSCziYVJWxC2rIwYtyT2qW8U39fpBw6KMQzXFHzB5LvI4+Dypn4sHCyAYf8u3bd920aFu6Wn23oBU5+6f7QffK9+xFgoB+ywrh79dvrwZ6J4uWf9c5YVJ6Hi4sPJ+Q/iI3Wofe4vGdrVCxSfTje5yPYxFLZ3X/H1RkYkGfEh9eTrOJplqR+GUiXLEcn58V+dBHC49E6YEEJLIu0FDjvMdkF+OqRqg3Y7wPNMRhJC9xhAMDUfHX3g0xvZPTBIvlQkQq2joM0NMJKUyhFQ/KiNXJkPBZk8tR/KP+wbUvqvrOHfIvtoBbiAWN4SwaystqyfrSLpn1tji8/5EXBdK6T9kuyJeOSJvu+CARIYjrDGSAjZx0k0qFRBuFoxsLe5E2n/e/XzhV7lYySObX3QU9zb6FRPAoAcUSxPYEF/DDP8xAIIvt6gxeqphhJZhB94iHAJPmWqRYGtxrJGQB6XgPzB2CfgQY2Rf0ixVZO2+6ELgCAtIbhhsZpll13rVurfoUY/zQxcvxqERCfrkF8r167znV9mUYdgQuzIgHYBeWepZXbUl6oweGNfj+r0WwnmZuZ3unezEWWIyGLOcWzl9nJAG6RsHQe0pBlWUQNlPh0WV5/jDD2eqag+/IASHIk8tSImuRstuNN0BtJy4cWCeB6pntmeJQV/xkV8BS3nJK7AWBE3oDw9JH8UNGkyJF8oY02iqADxMeIyqfs18enk6PkF3v/JEWNWC+DdiVBDeEf2I8fHLujmKiTjgUHx/mRE/T2aybN4uzKl5tpxOqnsZsadQESb/rPKdQyicGMELcGCaYd7YeOW528X2pr1oMn/uV4PnoJOtBoP/kL9MiQPXUjkg9qaF0rOOgxsx0zvxHHzhlgEIJb8cSfKimjTlE7GSDRFc/DLk7LIBpOdD5eO5jsKSeyWhBLj504PASx+zV7sQVdpslw4nqnQdb6XRiHj8oTlNh9tAJfwfRpEUYnRx8RESkSgM9CgxSFPPgttwC2d9bVg0shKWvUA8GIb8UCWFV6LuhXXvBVbShFfEDkeE68yENfIvQQ0/H0zKcqKJQJ8XY9iC+4oUfosnusyrYOEKNiAg4GKLNBFpwrv06DyVXNDylI6n3u101vVRiJCbPsz4hZ6VrJtXT8Wu5gUtdMRA8eH6I9DH/xgiUjeV0R8L7G9WRrMxmZ5Jky99gWXuvhuldiH6WVHsqBIvFgJ+3Q2Q9RJCfhFt2fxoqgnupnpxUB6jrY72ujnQv4E4u4o+HmOyDMNRdl8ygB135bpTuWcbeZ177yTPEeSvsdF+dnba0fJb8aAnbVVTB6MxJ+IA6rTCE10wWqHw+bttAgHe334/7BI3zw7zymEcxGHpWqIber3gWqgPXw+suefWMCCcl3oRtXWH0BelYD5/7Ru2MdabUe9m+5pNMUDUJK9SmrdhZxabkaUT13LkzU+8eAY/5jOMW/wX/n2wNwYzSl00vWiQJ2pl+AuTv3edAqvnhzOPiU0Cqix2ev5FcbCA+Twl/ccQbZkOE+R83XXz9jjOmw7V6Lpiu1t23DOHb+giUbhMHF3zrNhh8vWL/BOLPHBeAWMkaR6zdpzoDfcrroAbZKA4F4KNAKFZysSquD+MTrvyNxf5g54PH733w6RS747/yhTaXWc/BAR1l8mh8T2FEztDXu+BOuMbQhs+LkS2+Yw+kXKAafEkhXNypCbbFgUQLWogpyDl47EtjssMiHtJO2zdebl3vTRGVaSgb3hTtjfSMsptm6264Z3DpbkWQDMDj61U6zLRsHzbSINFH2X4Yya3TYwlphOZzF8sSIGV4XYsoeVXf8vKabtjag52kNFUemJtGxTKlIZv1Bz1N/b8mcquQsxrAKQBcjk+aOxXmRg4eOcIrdFtDYkhrvfLOFJyPo3FN1oN4EZjkK+lFo8kTLfP+//fMGLEfnwPWrmylnfQu/xkFDoFeUVkGO0aeVRMPj3f6w471G3YYJdNT8DZ5hyxeDz92IA3/fY0knr90DAh9cbXbku9DsvZcmbNu9qD9XLF3+uCHDj0fkG6+k2FRcHFJcZCoqAWnyyZNjztsJqLrx7YuwTHOruywJ9qrHbZw5toxwXa7F1YqjLYxeOZlREkTHjdLB5m2PGZOpBNrrpO6InzTGyB16rER6c4RB+8lvJgcDLTuaxMssmUdLjJ+ZNtDHmX7ooU4kyGqYvfzdMn0zMw1sx32At9pxHzC+W+qxlBF1LCvWD6BfpiN5dlgSEEGEQeeJUSEIihm5ZROFZeGw/L34J5IvJ8N1OlLDoP2Y2c1DkYa/R3C5yjtmqPKJUbkCRhSL4ghAoDTD8TUw+J4wefd7qah4UGk9PcShla0LjGciNr7zg0tA1eOwzliNYaJSgZQmk8MEQ3G36JGRO8+PgjVsnU8OmtmP+lmk62b1bff8Dc1Q9XoiEjmVXcXqfG3Fa3SRYi2XWBFgc0Uxkd7qLia9xujNUntR5Lm5RYaAmOBrZO7p/fkeiGdyMMeTxAd6Eftnk89pKn7R/P8idMqTE6iSeLXSx2QPjc+KMXMT2VzCy0RXGAVNwU5OgL1aumveYFsb/bglfiemT98cIEvtTby7SL45FzV/xUGGvsUnnqJvbk1AdXav4p4m1D0SOQoep9/FgPHa8QGz1ujRHDMuuI/dUZ4SYsssmT69JNMWcmaWY8KiombGpLW1pcW4ku8rPQcKqjwaNWbF+IMfNB9ZKI97iopGFXdXr+KIp5UpYF0BO80/Is3DLaWFJhtDkF802KwlXi5bYq2N8qbMukTrgbthoPA6kA+CXijf3IUOTh4OKy1HroN9z/JRw1uQr5Zaj3q5NbCLa+dSrpeVRyQBHL2stNuPM5CScuHY8PGtF4HCOqa0bGaMfaNA75JtCQFcFJXzaMoRBn1QPaBe5sv44sGnmEGQSHb2mc5y6QsvDsTjYe1R3BIV42kTV0grbFtiNAmNyX6Vfc9Epa+ujYurRygjYLFcL08a613/W/1ik51HFBP6XJ0gtGCh8OvsiytKeJ8hB5aIocKoi/fPnm3Y1tCFNk2dL/rRUutl5PCWfNTWVuTKacG+eI/XkhXDJmHUKJot9d6KCcjfO3n8mTFV3VR/S1xyYNLZd8MXiZ6To0wmsTilf30MWDv9Mf+Emp8ZjE9AP22KZwjtaDwmNIZAKvjn9EblqVPfpWHh5YMGKGlHGuBeQWEM+UxlQpG4D8mGsXIyx8GJvOkiKbwCvh+z3RAyhqYmJhIsR4gSqQDcM0hTE0sChALE8ymQyYlcH4KegzjezEkZwQYYz0AzosGn47gkKgsWlnBg/TnO0iH7T5pooGJDXHmaiFFuREoG/lAjDHODACywrR0waJNpKN8nkCBgVfv0lNs+AJBi+XW8Pr6sFc0x/FcT+IKQGeB3OYeI/JCyHM+9jEQvIQWUgij2IkSfRrg7AEYVcLVBOmNpOVovQNa3ZgYE4iAAKQgDB9lmIhRAvIGjpIeDSGEYcInAQ9VddEWs73r7hscnfb8vQG6XosZ2s0L1HhQJ3aP9ReJFuxkKwfne8asoBjhG+3+ydHle8OUj7TucoHOaZEikMKQa1BK1ccR+e7USwyLiS506vH+gPEROHaQy8D0uvQb2MZz6VJR6C+z/F/IU7MknqAJBxbcgjJRmgAqlo4hFge/HicICXgbRv1EG7USD6c9OBvGFf+her9rxS6K/H2BzqCNExQcyjCWUEqMeadDiuD/t/r5rYJMV/2AAJqW9ovM+zJbo0u4y6XfbN5yApULlMhAbng+84rCpZaWj/LRfYWB8L4rR4Xu4+P+tAuHC/Qp9V7o30RusKdfhxgTQhOexD2x/HrZew1zj4/NoFY3xc4BAygEM/6r4UIRW+qFj8TRQqgmFPsKIAh4Cu4co8QncfE4DYB5cHig0c52GCawd3igIKiQlAgvjnR62namVrr4EAPoTWCIvksbvxZ6Iw1Lxw0FkvuR6CdFkacGjail9orJL46cg88cRn8egUsn8JXOtvwZV78SoYioROQRDaNAYYbHEQgvE1Wlw1AxxRBjc2n09g1spDKLu4sHnSGQ1msSBjiH5RtSxVO3baBfyehj8HnyRkMB+Isdy0SWY+Wqdwz0g/U9yIgN5SX0rndLHeXVByH8InqyHUy+OMqxvEbWQgYec0aHo0IiC8cwb0BtYazG+pTUQucTth+dkwhgsuLwaWaXPnzL8WUjakT0GX/FnMr9UEkzaUA2bj4bW8orFVlYwXCh1wq5DnI8tPX2HPax4wsc4fjmi6wAAxlC8kM4DCC6QcwyFXMUWhuDhAaSY4GG/VI3iNuH0aDLKnCDrUOlNBOYm5PMoDkmWLzuW6/yOwSJRIkochvU3qloM40Sj4SqhdhwX5v/QzalUhuA3mMJxw6tE5XILNZiWSEWgUbg/NfU8z+JXSgIpjcAKy4Dj/ihVWRmhqHIXAo2GKJlYur9k8GukwTCDH+bgwddH/kI8zZ87Z1sktCnFx9v4rBhlIFhM8ybXA0jv0kBln+cQ+oT45ilVNJtrtC6e/z4oL8IbHVwwEsKaH9hpduzFgq+PztkiQ4xzxjtAD9LzeFVgOlue6tR1YuFWGIC+9AlIfQDpxeOUstNqHbF6t8/TfV5ZZUwkZQxJ7GhCFu2m+0OkwdHv+lbmG3aaPbZx8ImI5uAEayhusLxyP5AfIaU5Hvtj/PK9QCPCdlDJpzrcO/GfL/n9om6JLTYll/MefCJCPYT+PYrZg8d7ivF+SnNI+a5ZAvsj2yd7AeoVU2N9UFSUF9I17d+KuZzYFJukW7T/9J+VPzAewlDWZhKlVx4P8UYoJCi1TCcn/ZUaUJZThaSDCRqbLNdk6Ju3i5g3Ju3DRTPGaeUrn31iwB6BMdWlEKVEKBICGQC0zOOcL/Wl/36Pw71PHrwAD0VNcL3eaBTw7eWTHnNhjZhSMYzujiwBEKVZ2JBBA5/2ImlUPhEysxlkgU3BBayQa0jIMNR7fRIMEmyf7GqcN4ATOOq9mh92DUAAyh943IxCJeD7MPJOP7RFSxOyflIEUER9ARuwNBgGAlUqJLKwodEMoMaonE5xRd/57hM8Y+dbSHD36au+6BlewS9PezuJ8Wgy2FODpBC+AjlTlsEjzHBDTieL//eRszI9HEPnrbOHAUQoGgIhROqXeHaDAVJl63sQIjYrQh92toJK3gYojrk4tZJKmrQPgHEPmmRIe/fRVxR4UtZkPspEqcHRwMVM5yhRCKVYws6mdlgEhxHESE+pRBqQmiXJYRVnhAbT6fIjr3v6JDARg+aHZJ+GV6wCGIIc7rEJPveWKy5KmHVe8qlT5KIMNonSOEooQKBjlwFEcCJL6YdxACKI0Tuk7ndfvYOA19sUklTPUKsJhlXtgoGPN1/Gqc/d23adD4aE7JlCPHZVpQ1ycFx66s71dcUsLytHemM6gMFfEUjizB1LI2my1JUTAGCU2thK/s2xAEIqAqiDJma8d9SPLips8dTNuGSPwD6yQLEUgAbYINYqwMnUPmMLjMCrIqVo2go5C2VmuUMDYIRSOAET110xFfYJQkhkzNlSDN6IaWMzXPxfqEsHJZ2kV0Di3iMU7JRDFGqLP+ad2wwkJM/BblUwGIl7YwjKjIdpcB0ifLRAOYGHDy+EoxIIe49SAYxSCAch0rf8CJyewokY44WIUuhLCuaQsIJYSbZyPMxiwzzQxVeX0BC6VRisSYd3YATar7f30SFsoxQBOxXnFvR0gA3BM9idDiGApE1v2fZSUX6lOwWeOTwoLqgQYqsgBoyTlIew2ADW9eTwMIA3U4pA3evyyeJHjwYpMIzq5qQ5LGF3RgZ2UeEE68YF5zUDGDa2rHSYDAtvoqEgItVxaxsEKWFyUmNKY60QImjIED99916nBcAocY4MyW76+2aanQZDDAQxJTgWQcNJHxgkWBpXnXT2VQ2ECZbHqD73qLCLfgRSNRll/RcZgGPUmGKz2cdislQYIZuy03m/gxwUNBI1p7JOQy69QTf0G/37DYxfyKWeOkclRA0odVShilx1lG9uaDDzN5CrYgvBAtYE7TVOmIQO4wvFtx/Uo4PTittK7GidRFJnVXZXGuC0j+GyniiEKCDriMYRryBF6AAhXB7fSXJNOr/5Nh7AGa3I4UqSIok23aeyTyxFac6+Sp8OKYJq+UnxDiCToFwHmq0IxnuwWQrDrkOtVgTRUPjRj6hJ9VKM1sIJFPyZInBYUd69jaW48v3NUhhxHmqxIlAW8/akwklFk4s8OyQnIil7/p0j2yt1h/YstSWgUG9HRKK3FKXVlU7O6V9fLLCkAN98fHQpRtcrbGDra2lVDWg9G8rHiT0nz9RttmYVPtNwoVqgCJoRn625562LMNqLfO6/XJvk+f7nw6Wp+IiUW23sB8nJ9i3MRlpiItvLYLhOzV4aI42JvYhPBnIGoz3OVWsLsuRvlv4bZWmzZXpadi5q0rjHss7I+01pPZIQFZFKS1MD/GpAwBmSIOBhrQvUKCCXL/3eGjyR+mzvzO8Ofy1+fHt6YpkYYxrxtCpkU7cWsqDRI2TSvBdaaSBwlq2REeKpKSRE+lFTIysNnSU6SxVRRk0uUm2+8l7+CVa5hAJnXysINnqbHYkuU7FSj9tBmfso09AuXYErzvnr+vzcAZx3x84W8IubYCwW4lKotp+nJZgI3VGbcxw1lA/1g72sVyeZcBm6Mz+lYNJooYesF2+JrROCMif42NG8T7r9eV5tfl0nASPW+WiTXiNK4b+64QPYIyBA2hRKpfuoP1syvmy0qVDIcNU2znz2j/TTaMikz0WKFbMvTcZNs7KT9qc5j6vChxNeCC29ubBcYVBfmR3zMKSMgrgnYpRbxVD0zBBzsldbyu+Jr3GWgK3giSg1vfFjBPyfWORRCxyvX73slwdh1rOE5dEGka3+alEkcisdPHrt1M4QWBbI/g6AA8zFbg7lYRG2suRkxMsx6RR0VxExPYoopQVEa0BSggk9Q+QMovr51bmj5eFmZTRfdh9mbEu/ezDDSYdRc1dCoKVzIo+OgAxyjUgstPSUTh3AYSWlFaX6NEad2BsadyUvrc+zHr6YlJ3CFbItsjomWuGSjBqULS2YenqvcN7oXx8YQk9/W1AmnownqYmvj+l0noaEe+Kzr895yV8l7H5k1DT+xv0AEV4f1C1bOL5xXsu07ViRho+l+l2WtW16+PIu1Xpsf/5J3SwJ/ZKuyurKyQGvPcr44RTyFg6L5gTAph67633C+tcFfr5GKcl52iTcYk2A1UhqxhbhlEcU6STUPEvielz0w75AUd9rrA8jX8pxlIcUYBkVvStwqq2vZRIPOzMyp6iBTumh2+BwfnrS2ti02qXqvE4xZcli6vuxekfU5klZBhuKqXQaKkLj49XeKcv2oghmzqodV6LuyA3TUyQ2n/NTMpYZkpFiE706T7uFexNy4AXnXiXs/mAULmuHnxZ7Ldi03SCgd/BAOoQwqQIRedERj73IXzgCRlWNnhUPL8PBJHdA2G6Fs6HRo8vo85BwINI1v+C0Q8Il/xksDUbIVOr0N5sc+ygICEGJmvfzm3ZQOPDUgIS9O6UJS8FP56RNmXEOlABbhsW9MYbv8lFXsYkFhELHPQHO3mk+I7NAxIjKNbfMtz8kQ1h2uxyQEdh53C3ca02AHwAZq4RjHhm5qQP8KguMKoUJC5WvYxZqbJBgiEUX9NbFiH6OYDcGqQL/vAw/bPPlJ7E1Y6UGfp0MpizIfSkJsajnCzcBSaPNX8Ce1A8vscWkwmWn2ml9KIWn5vsuEe6UpEVKhWe06Gi9hQy2VKMsSikosn848Avq7YdtYwLcM/AK5q713khDMBCxSfnA16uTLwbXwWqszdq3g4LmAy/uc1yBQ/j0gzcPduo/LP/yGg74E3v64kEMNwZMqxJvGpiKFH8KZeGjxf426oZp+9xUOQg+Rn4Kn/PxkKyJesD4e26GXIBAVqEFqvilkYCxSGgSraHnA+G5AhMTjaZ5y7IWly+8ge9NxsBOIMRMN02OIJvWMyFRobHiWK8g9rsI8MeHUGpVSILceMIQ66+Nm1cpiMO6NstRWdujtHicXSCbZoSvx+00rf6mVpMqWdFuihNVjM8gM9y0GvNf6YSfhHuaTw0FJicKSuLJKNudpcwRKoyecfyqDJkjrSwx1GWzRGjStBnJcAkznXH2oOyeyLUZPvDmo7BUGuKGDE4MdLpMDomWXOfIzITK0whr+DWsflaXIt4mVH/BWfKVrWmu1Gh0m64kqzzIFTVRwd88qI71T9Hh+WmTAxQly3R2gE4fYWMC8fJFqmhewPG0eD91fE80blzbpEF+xEHrXfXWESVRhIKUFEnhpCQafG5FlVbaO0kQ4vAobbwSt1wo4M5V5Ii2rTbzqtIFsZnFyREOsz1KnYJJEMU82xVrgTd2ObXR5HYERtoTNgD6637EcI+5uNxSyXl0jXs2L90ZRTz5o18PsGf6pWjxQt8ko6LkoNYpRKflWoGowHsDFAuVhGX9LjvPtnz06AuYUdTvE+k3z8uI91nuEJSrMfJrioLW32x104PpEcNX5gTm071dn0IcfvuPqDTTHkTUcT8NlvUe0r/lUI8nRBM5T3QXfY6Qw36pfKek6q8Us2BJCIg2y8nfb6lvTa/+q3/LEc6hd8k1GF1e8XEqh13o+cuztfGKnqp8B7Z/fDl9jiz004mi5sVzQHrJ6Z13lnpA42+x336D9ENXBFZdhcHb/hhZjnk0THNIrboz7qBJVLHczvQ8rBeyBU6+XYkfaon7PTf/7zus/iSKLdSmR48lUnaoZL+aVOkIVsrmqmM8CDQfxT62VY5x/Rk5ERnxJBc9OMTShEs3fp2t5plkxHJwdKvUP55epKMb+xfd0aGL3dpu729p/EICZbom7lw93gfFVwxsz/RBjeLysgOuXGP2HN6Qf8eYGImjoUWjcsQbJggOgukLZI29VoaJMdFIWm45EErKXJEjZe8mj1mCnPpmV75THZU059WIBwSB1YdjkmIcuGG6RR6OLsbJj3HqOJoe4rD+zgR3zOHVIAiM/JUUpXbmd11vQi4ZQ75kk+ZMDSYNuunVR/ItZJgY1t5GGeZVbYG2AHzr9jnnc9d4+K+//m+wswRi6aKLrBzua4VSPG7hP2GGnYnJlI9JBwJXvNSPDi0o2wCVbyayltaGYZt8fJzPfKqZiY6yQWzoRkZXtWFvmFntUpGgGwYAdX9gY+CSNeFr4J+wDNPNG68mrLtq009/57oad7X4yPXfLG5roMssSBN7wmJjo2SrWxa25C+MPDNvzTz1IZl8K8C9JPtPVsFWs71JzjpNQ1hAXZivqGCVfpZxluVa2HgtPjp5fW+wWuLDYiWUJUT5G72nlNSW8M7pz43NsknEZcd0LJee2brFGGg5MhmKWehELae7ZvSWv0evOd/I2Pb0JEvsKCKZ07QciPfnTNSlN8ZTe6PnrBrhpXzNOLr0RH0qa48PrqCA55d5I7FsEvVaalw8LPSW8EVhU0pYx+VEtmmYtuGpfWx8TtkRMSafOal28U8gj/fghNmjqG8onzBLBOFdnDBE4N/5hO+EndxvlDfU7DH444T3vk+OtNNNRB6iSUMbR42KgkHIITXHv7bCYZIAEnLlmCpqF68cg5LS8FH4oCJgAAKLH+Ax2lIZsCBtrIIF13vn7fTOm70o4MFOsffliuC/izGatTH7/sh7r/wEQPLF9be69eSE9MZX7cVpdQfAIb8FWx8cendOlciyhPl6/AF6l642aa6YosdlRnPr3fL+jYiX9UvuKZ1i8YMhTOdJdl7w/p41iUDXZcljDgdiX3Hzvbw2bg3K1YmCO5heF8TAuWgWa8FNoYm/1GCtZiR9RKM2pUZwI1JNzZL5Jr5oJHJExDfN93BBxUmstiI1tzyLPBdjQPk5dY+D9nP0NLQ0H+DuuesesGjRYu7iv3YRyNoVGVYiSpaGhjpeyRPCIkvfzvIKljZH5URwI6w6mYVrYfy0KJ//O7m3y4xS0IDTyoqTS2QMDAVplY9zd8CpQsHcuQChyDvGHs2oBAhezHMlsqIcK/IEVrdfrluGBiuBJLTAzjGP0yoh74Z9l/WPAAeGQTltpxLWwZ7MMFv4Mr9Y1aLxXBlWvpcu+Ttlv2NKsIuDvIHDUdc7GwF+lSRbJN7AS9IaXgIEaYW/aWETwPY2qCoaYXjD5i4K0tKEYvEh2JAYtgSa9NUo8HO42Y8BPZm95U5o/XgM3DsN0QOOZ2xur/VLHKjH1Ef0RfTm8WJ304Gye3h1P/psihibrjuc3ZZF+0xo0ku2Z/Oq6f7mTzqIQDCAIg3YR34O44NydiUsoFDRHYSiRag3V50kVUITmBWJRKaW0J1gEV3a5EH8rDfYYRsTsa0mAXj4oZmBXUEofo+3rj1NgCmBg9Cz6BOMrK6uQ1KWxoEOEWo1MNeBJh+b2z+6/h2m7zkM6IhJj0lb72YBhRzftDYxahXBpBd4DEBcaGD9KkIL5CtRrMpGjdvDA2gN/IP2b9N4K9sNbl/1YgEIQI/bYs4L4z6iU1CKIKSgnXtw4877733HIUChoiyOgKkBcUIHqQFXbYdXyQ0OR0Dc1AxwjVB9bnVTPFsMsv+RoVvW0qZWF0XYb+dss4cDaNdwVRkjQvqsKEJ4+aO5DJn2KgItyFS0G2mYnOEYx61fRgXEUekr0tL+SgxZhOztRc4OGy3Roc7mjtkLbJk1Zgxm2pB8aXpiELYuBinpaFdFsWpMlXdrww7yrDqpd2WF0hpeoi6tn+K/iJDplYHTnyAqG/hTiS7+Zoqxt4gl/8pgPVDj+qudF49cjGE7TKPvxP9B6edtzwEUvUZVtiG9LAwMtNYT8FLsCiW2Hn2Ryneg8RJgCILLeL4Va/IQtv/5HMtkqqDY5+xvD9/r6wDABEXw+r9H3DL3gZPS3yf8+0CMLGbkb/OmEyknZCdST6h396a0HXNu0KYsllUfOyjoPLgMPF89Y730PIK7yusQC8VT6jruZoELB/r70/r7wRpDrak287BkgmmC5Lmk09Qp8d59wsvPaWcB+FxR6DaElUXbwBfyH5gpx7VpgQq5ywcA4RcbCElhhpS34rb3Q5IrgudJu6kRnAI5ueIRSP5w3gEt8rT0mpVRglId18beWjH66tMUahQxXgTcEuFTn1sR5a7lcJDr618Dvu5cRPqlDu+Oa37wwkxa4OsrLn3Bi7tW9iQBsb7cFan/xcNphE3miWBA9kfDpFQFROlgOnq097Y6H3LH6SQUivPYef9g0AVm8YEhESEJnG+6STNL95Mwb+L4gnh8AeHFF9bAt6SeOszm/5DQRwDGbfwfKT6iAtTBEP5qcm5GCbNAnq77EuBP/hHIHLf5lFvBC8yYzdtIKUxwo7KdtvFudpgjiC132++KTUx8fbehy4V8R8FfcSN+CKNm9vwGUxybCt+hUODuFzt8bMBvGmcvpRBWdyp22Ho0nvOLh/ODI3uFcoUd7NZj4ZefsTDskUOMpUmFhPwt4UELwcoxkKpWrt6ekZsSOpGmzlYrOvKKGtvOfDqLCtJl9xhrkyllVlBBNZCwrCM4yS8pGLA+uY6bD6Ru8sjQTsD3hOLYmzqBCbnaOO/ndLCA12PeuWtd99myVvLwvof7iebIW3qYu3bJPIZXnlbPV+f/oj6gztCotCrLGIs66XfhLGpsvfjWMvM2r8ZgdfD4KHtmwjFYYvhoXlubesC2WDWj2bm3tkO9w7ZV3XcDmVKx7Pu6ULNWZ7Pp9FbLac/4dT+4ulPOtMoLxn1fhB+jH2O16XW2zuDjQzLKrrQJUPaYu41xXNeVeX3u+rnqa+cKLaxNr3okrGn3TJK/ShMkjNDDLBr3zMZGt2hrF9lOsOjcY4Z0wquNbInp1TSWpOfVJpalsLVCtWRa11YurXHjGd7KyjYBxj3GIhOegjmZDDy8MeuqgLXxVbOE3fXK4j2aKKExr53rMo2zmh24F2y/UfIuqL5+jkmTTHy1iSUxvepiS3pebWQJrnatjlllexiLzgLdHPD6rMfjg54jdzbf6Wy+M3Inquxbdc3PT2PKuPE/h/AZCUJK7MnwgHt7RJsbbFu1I3OJZ//5OXt2xs8h7D6wXfLxxdFkkD/Dw88TUsQy5ArY6wSpb+GMgNYZRtbmiJbNka2LAAczFTMDymp8QDmjy5c3tRGCBeHrJrZAY+tGauvmtGhsHnkbc1vXcVqB4ava+HXm3SRVMvA/iZlSA6cAlPRi5964ACAujdancH5U04q+6i9X4sGKA6mx7v+0tvVPuq6rhCr5Nl+sMMH9c/hA5cr9cyKGOUQlg2l7zH4EWQY1N2KDu9+XMoFEYkDTB/mHhYTWF09REcxCdkfXW9jG2t6aDADr8WpoPqQRnV8RGuvDqqYUpp/xip/rnXgd3FYqUXpouj0R7E9nXBlgJ9H/nBw9mXZ0MgMMnTxI3/uj7Me+b+KfW7fSN6ayttE3vCp9/cur8n8P0ofLD6SyD3xsNPB4789z5f4P3Z+uu/3yg1TorqsC1dfkASpm1hGupOi27wxvVvSZVKVJv/8Oj09ccm8wXgBoFfd5fHNvjVPTrbK3V6T4AnpKHiPfVZY/CT6fdepLC2ZhKbhGZtxDugI1HSWMvMK6qjrb172NX1H+lFHA3Y88ZFxPWJYNQ3oJGNc3pSNmJQ3BZ6biahCBm3y0jMqxWJQFD6pIONERfUricBvXPIvqqTby7TMgKWGJDe3DB4PkWX4U9vx+OQRu7UDYifmJyKqciuU3Oi46WV17UXJsgykjBr4CzjtuXWpc9hzOcG4cEXOYE5OzAgNT4GEDqivKtUdij9aveWr8KtkQiqLPIttf/G8qI7AMo6aKToUycYbq6jIIYgaWAMHucritZ52oqmyIlExW7lvygYpfhiOx6YnI6pyEcem9W7d3srr2ofXuxpAMt7gPmnc8daoxS0tDcm4UKY/2y7l2zzY0UQ5T0ROczr3uDQLkcxjxzGvoIUtIezCtHK0mKW9EoGEgathDhpDHyi07tHbJsuXMarAOVl3OHTVo4+DZbdGGuc+exw0Bklyc82bwgH0h6MZb6oMzPR5Rk9e05Ue5F7KV2tV4YzP5ZTsL1QbWe+Nw4VzWbBai4ztYWPMTEZW50OSnZo5sm5UK1vHQMYtLrAFypChNXL64o8JqRPAWo/K5lqJ5W4H3SR6zBcnVuREAGeorwBPtAg2Jeq3mQxKny3/NE9jbv4uTcUqqF2rcoUzCzh+XvfGwafq3G+Rsxtawl1Hbz/VAcDVSjVfuR9XkNJ1btOR+sFc7QMX4Ritm89Q/o+ErJiBkbdSBzoCLsJXZfX10i5fKHjLbyI4Y7kdW5ECT79ceormR61yqnhJ7AF9B1FQ7U7e8uy6F82ajmFhXKuMmVs7CkNQDdCScGOU4JXG6DGvugN5FqCG4iTgJDBmYyHEbO89seb2NmizCJDFH00XYJHJ4gAiXwBw5G5PJkYyrzv1XBd+PKme4IQIxEBw/EIZWv46oyms6eKtzKT29EzowFK3cj6rNzVUWdtnaZq7JCdzskD7JNO4fjDaQ1dH/VLCxS4eimBJZI9mxBNE2hiPTM8797oNBTOR6OyZmUYvVCIRATK9hiU6KFNjouGEEpIUzZ2Gomo4Fupy2A1KHde6aumrSPoHmJECdwU0pYqQ/F1PnVbV778ZUB1MxiczlWIo2dM5KJumdCDbhl9HopD9eAAJBXAe4ARkBFQHlAeCb3xtPcGCQO+gi7t1Eqdo7WfIvaPf7MTrEbu0MOY99d4w0KNRWfAlgSf+vMJXkrwi5589fJ01K3PxD6Vsw9vIESxM5O0FLzu22hE4kBxKzuXMsxm+CtBjjd0mqrV5otoaBZQXwDNO64VXoDdyHCxeyXhPSM7DMpUNN6LHJcAA+5hUJCAkxxhSePGvrodV/PHkm025ZqvI5OVxU2sZZ0Hs9mRd9XiCuIV2cWkwpn7Vxec7odaD2DlWuE3CvTjShCKZrpxaL+UIhh5868Lxx4d59CtWggM1YFjHt7i8afWpZtOjmfjw7SwAD2rFD4yjP2M+DpEGZ3pnzpWCwiP1caxVZOVKOTWTT9rjmDfFvuoF4YQPRMSJLaXPyC2QwP4AMEEE4YGY9ZkuV0Q/yO9HNYyY7/k7z53FDWydFcj5MYaJzcgiK1LE2g8hAkAxTX5TRLH0LKJN6nfn0s8w2z/alH9zlI10e8a97eYW/2aXuUj3FKriUROR8HrSjR59/RcJhU8uzMQ3DlkYi1KfqJAvqR5FcX4VBZ8F10VW9nzs1OifabA5KwtCODhqFKI4O68lgeI8cDNCFZvB8vE/U/TjtXlCKdsukYGR5y01ulE5JOXcSVqsNOIuLrvaBFnid3SYeCfAyFzupRloR2sA6uRG3KMlV1umR4xK5qK2lJjaJTL2v2oAzn2HuCN9+qWHRSVhehKZX5ocxhjhv2Ly39wLzFqxnyuQMvgD94SM+++F9MevfH14sRuCuwlpYnEO6d5+fd+tkgXDKv2+3m9Rixf5fdD7XrislrvtePmD+XJsSpheVDApFyvn00U/5+rVS92dkdrDq+fPtDDBwzHuB8pvkwMvoyZG9a4iJa2f5BF/+S7dYGQLgBqxWm3Ba8V4D1d6whd7ts/7V8CZ5WYhNXFkBy44MWCfVz9sMH+FQdwf2ZDiw1cvSMYgZakGyQlugga7Y9IzwvohNe3ZNJ2L/en8gaUyuqepW4Szi++SNVkPHEravUCdg76BU2K7r/FZ4sDhpJsHzAUtLJ5yFYu5fX8U3FeOnVRJGCN0FylhcVwEeFNqr8K3HTZvKN5g2FuLHfleIH7PNtLhicciiKnzLwIp/KwB+U5JkqmGx1Fcrf8N+L9f4SfsMfVI/X+VbNlX+id7z2d8V1L+y01n4lPw0f8e+UBJMiq+8G7X5CPID17hofdelimJ7oLHZDp5nSd3qwmA1at51kdKiKRmgYWcdXXFbO0bNcv6Sqgz2228L9mokLr63OU4AznRrNhphAy3Q5GE91Q6fWoWtrRxIVpKSytnz2KgK3Rh6RWaNw8IjX727SuniBZETK52FTxlrW1mydqEtEAUp+B5NiEu3J4bDjMgE4SYvjaHVgm40KptJ6jM7b0mjY4yXpJETKh0q3656c8PwsqV2py20IuO/5fpcbG4ODxXfE55tx9AtxDhvyZSKsdVy8EVNGl6b5sWkw5DEClzNKxEZy1HQCRcrqKoY9x6pw204Atf5rHbcDSM3ScdDlpAOhayUaxAFDAWX1IQgTuB5z1qnSRcoUGIWZFEkfMh0I7I6Dw7b9r0o/5CB3GtF2MGjvbCT93hcc2o/WjaxVTHRe41fL6LmLhOc3MB1Cyr2bomwPtX5KU/m8gyiAB3Kb3IwvSCIDiriA7B5J6eUjxT+juJya+hBpbXlDFlRqwuOSualT97SdYE5gwWPvMa4EVWTi1JQydSg/QMBndMuwu3bXIahtHiv54Pr5+H9Z6T1uk4D9kXzMBB55QCiX4/PKIqa3HDYemd46uFlZXa4Hbw6AMUmwmCc5+0IW8O0kBpd3KTyeJxiAgjqMrFwgTvSaLfxCAzl4/MW2gQxJ9cdyhROffOOo/VFALWv6FxgaUMgUidX1wZRjW2BKJNw6jDB8kRkdSGEt46Mt0tGHcWYr5Vq8uFo1N6MxUsC6nFs0+MRdQVwPPXOPxUV1qGA+yjaDG/+WvBsC6bJyY2r7kYrJtR0i/2WNNrtf+QLimdLgBzDiIST6jZ2/rHlNexCr9CHS5VrWHS5mkuXaFl0mYT0FJ+zLz8R0Tmwos6IlPXLxKBfJ0MKMd3YtWiz6G5qdIOe+YTJ3jzYfbLpjchabLF9Sw/RUQe+8WxRdXnVpr4w0hEguiAvbnbVHh+/dFZefPmLtKQ1Go6nvr9o2vnRD8B3X7Y60JoYCjMiZISwLhoBqSHOBM1hVSNEiOvi4LNv4ne8fVUmKK2t5Snahdap93+wXoR5Xd0mHFd6Top8VeuLkuKTEFL/ZMTOPF0Fuv4J7+FxQ1CbMsvqA5BkOdP1oY4VKUcbuVO0cjjSeD/qIlef/HX3Fgat9yE2uqElBuWDONPhyMLuSYgYg3A3N0fvw7ZBWWlLvvXnz7R3Hn69lyazplgDBBNj/t1HnNTjUKoGqFeaJp/6GjDUZ+mMs26nGXRQNI9zQCzRchZsjtcgY+PzwPRuNunwKhAzytf2B/lua+1qp0FaSniqwU6Z/tjvyfxylrMfK8zM5emswBDzb8TLiLvml3QQ0RIpXjWLJ7ndPbwZhPAmrBEKoagAZ/Oe7tsAPiYdsTrRhR2e/DuGoQyX6REj6ucB5HqGe1gXhc1PnB7iGFeIcHqCMQzwXwsx0BFG3PseVksa7dn2ws1EwE82alQSGvLuQ3gXMP1Gp8Dy5rhiCSINXMbKTP4Ob5LYWUqnUGdScVcVAHMeY+O+XLu2yTfK7DsAYli/eWhLaBzWeqLPDn6jLaUl7WQxBUbiUStYSEzQAW67RwS2Gh2wfU8E30W5WAemPHo1MH/fyn7PlQrNoSEqqPR0YV5rp+Fcp3fS2JVzy9e1JJWBT82jKieP7Bu7fc+Ryob8gBk7vMgLxwpBwt57+sTpKR1F679kxW/EWo/sYtKmL0ywtDOSvIO/5IlbQm1XGQ/mD+XPPz6YMYwCl94u3ZrOn/8mqRsPVavTnTLfGPYDp1zrlEWqkw9NCYs/NOZQyaRk72RvEJnE2OFMnzwlIglal1GxaBGI+jHZm003Xrvb4D/QVbgNbZq5e+/trnlsnir47igmLZmjqSkWa0eTqjNAFsp3ITyhJbbN4iNcqmQeLC/+l7M7EBGR2BX+/kqFj0VK8tcVb1dU/b/bmuaJstN8A7rQNOWJ20+vWH1FL5tEi9q14nxNLtfku5uhyI9XT3fszdbHHNSiWPJPbsfFnwGLubCcogQnLDwHVlz8Q+q6ucXxDpnt+KFWBZdPanyr8H8nl5yxvaLb9NOi2KN6XVadTOENI7P3Jyd2Dgz6k1v1D1xWF5+50byRyZ91HuRseVP+psAVbZlsVeaa/xfwzMogpw50moJ06FS8bQuSqTb50mOpUAqEIDkZUeKpf6VDr2p1JXoHuI3cXffyzo8n9su74aBp/k0fpJpDJMAaJSvdcp+tNufTsXP2gr5tC4KzAn9Si8CG69+xXqFKOVOv5TQ65Pifr+WRmEWDw2Utn8v8gtQ+HL6z8UBan8oCQj4QGPGxORJs6ynbWanrBTaisMAY6jI9OzWBJLS2pfuXU3FdIOi1oLKoVBmtoowtmdXpMAbNSjC4LZUZfSeW7mBDw5bF2LROtRDTOOGzQm3/vx3nyQ/zl9VPnpZ5hlcV5o46/MYByk1VC/oqdKtPYw3ntqamJaaaKQ7pZ7vx5nPw7MoSUsmzU27ffjUigK3SuLwfxQjmBvyZJDX0zENcfsUXlAErOtewlZKF/OstWINKKhI89XNYNx/GERhxas7z1NzjzACf4Ln67Mxh5BfXGFEf4sIlYZwb43iBv4ucgYvFPp1zewY9AgV/P5P4gECiesVNcrUHeTMyJQDxV0Chg9pHGBlPJjeqjrd/jbc5c1yuWTGd6hKtVJCBYfHN1S6MCU2Y83blZPSBASp4rylyL6hRmbJ1ZPeI0QfKFkeBlORXLmL4hrH/UMvSdOMEDMyN9Pkv0HoNnIpdnToI/d8G994JE4LuDhBGxpNg4EZ1yz+C2YvsBlheaUamai0Sd/Q/HC1jRa9U/vLCNisliQn3onFdb2e1omeBHpwFjzIFLXhc7B0oP7ZaSiTh0vNWg5cS/GeuDfO/1AZT0l8U34+AoS+oXxLMpxDVbWvhrvGEuvdw3akS1KrohOTA+G7TOGq0DimUalz+TZLwlhLjfGoeUj3ny0IVSKB5YZ4J4h7Znyan8Ahm3gYmvFkXAxJHYUJF/no3dvtP0Ki8+JFoHbK81qnwIsn/Y6rCsW4ZE52vB6A/rP1u8Rxfgjzi64ZtU/2lg7CypHi/EFdgaAUS7DesubZ0SK6KsAf0dvwJFnzto4NipIl8FHykX69wyN7PdD/moerzIcyGwfRCzG/EwLKo11DukLPUnfl4Xi9o7bMG3AkZZ+ZgNoBeG5nd8lLRapk+NNsZQp1VneSOJo4YGu9NNgd8DHY4ncA06B4F2wXYAwpq0ptkeaao/yIOPvtC8TuwPuUd1uvBnl/P8scRm1du8EAfR13HRCUhTBkWcNiC9dFf6TViASNoWrTxDhO1aUvAeOu3yR8bkLLljS8rx6mlVWRd/9MZNPmBs+Z6Gbn+cZkeHQ0Wy6HfWcmKJ5jGmeIIJCSeF49pVBb0QgA3hOF+5NGCa6SDAHmzCqvvK3cQlnuslGQDjfGRR4tPmmDJypxWrpJzZxmzxul8W7QOJ4r18jTzdxS3kxS+NKnjRj/A5onJ6XO+kIw8zStzYeT2JjtKeHyuKySuPn4mjkk5OIPEL/k6hT19+Z7jnQiJ7hgYbbejhMeiso+f/UXISjWcLFmD4h6AljDD7LKDChzxpfp3GNvK7Ug+Jj7m87AX4ywLJjQ/ubMgOpMRTQ4kiNCBV/e2UhVqizmXpQgqvJ4m8TIAAhNqXZ1634hgxB5SWPJoFVx7TKHLyTKwZ30J/LKRKf+ilLJkgXXFfXDRAKa+c1BskUmx6fVR9rS+RPvcxabwFV8lpXC1w56ZBNPtutgiz+Iii0dC4U1CBqaydiC1jE6UMTuo38WWkYEKj9ZLj7GNFMUHBqfrogIqA0Ki7NoAS5IFpP+uj4ov0BayVMLV9WITH70QQwBdY57GWzP/rpRkeuwaVlqwWWWIswT4uRL1GH0ODrWYQ7NzXIGWwB+D+YsXoqFxSGolDbeofUrqlGsngQq1UUGvLHK3Ffh/ktfTHWLURfWRU5kMP3o5QxecmBCojMn9DpbF6sb/U0NouObtaRCFW2GNf2R0vubFR8toY3PGUzr37e7GDzdki2K/RHzcMODZbmLFZl72ZMK8zrPUzGoQ9XGMO3JBmgDNRhQFpQcryBnJtQkWeD0yfMfFFZb0YvSWVbuKFUk0JKqeFXErdrRMRD67cQB6XOXiRA1UJSasLmzYIpghFUoyInNSeuTZO7LmQ6Ml04clATNzNvFNc7pBiJPfZvXool7+MYpkvu6d1MydH1nzHMpLOdIx/ouwOiNCkgTp7F9whLF8XNzUS1Hx7hDRYoqlgFXyZ6LV6uZlcaLMKsbELOTs20Pgi+xLtH6oY+VK54DLne8wOZPT9OxENwPRVkhyjvkPo7VX0uiWGKYqKt1oCk/RUr9cpY5aCLVnKme2ffi0J4jyoixRHHVoeowyRXkwSXgPr82K5QmP7E8rSQlIkWeHAOo+o19srDKe6t2ydbhdRMiJjD3oUGo4J3V75jwY+GcHWTD2z0mgKUZ1RkBXU9C5RfJfMu2uD5nlY6Gu1D9iueY2m1bkVcKk++UJOY8DFRVHib6ifNx24bP5MTqW/aiJ4kWMzotPVOtW9am3+U60ATQJe2RIQZs1RYdybOV7G7cM+Ou0Fp6qIkoIbzPbyVplq5WtNBkvIcSIcoUka4DJ2nHY5i0Pib02fQlMzkrmU3gUgr32au6Unxys/1Iz1rIQMWxkoewfuhhh3rVvbp7EHimInscu6p0LikXbaV7dLqw8NZ9L2nNCqEyWIAw9EXEqaawlQUyBIBgXk4Nkbguse9xNZkS9gLX76V2CpVBSqXMpKJ+///DGejlvq/UrBIOW4WyW1Mu7gIXxly5CxF5/c5cmtngLleULwaGZ+DlFNKh+Rl44rPmL2Wz88REt9FLrxm/txlYF48wgHK6dwjHfSvNlFBLetpD0iX/dvU5S/3rSTbY+y8AYZ3/zSs8b91ocuGyKh2S8JPa3nW1bRFu9KKU8K5Dt7RlAOKH6ASFnhOHsv0RijcjrjPePPusFB+eeymo+TQpX0ajrvl5JLHwq9p8/OqRvrz5HUgGH92DUcj4TaRqSEJ7Kd9ZX2aKLkiIQXW4FDW3JpxCfpJO27gpnhlswYYcbxbSefr1/ckCAdkAWj7PErpBawLgiYpYbKlVfKNA+ucGa8lqojjOH+hjMA9Qj5x/c9Y4oLw1zqJ3sebkTuMrf003HVlzmGZLTAmnhe8haTIcQ44nBGQk1rmTwhztTY1KJtk/rLt2YR1cGWLVR06lOXye7VZcx+SCT9Pv1K/hEFRNcw2YVxjlZNcFckvJTgDg2t8q5xG1jCP87cvwrFA6+G/kntFT6BH179cl5DFWgRYNP/yd16DCx1pCsSl8oDKSsJFUAfyuFyCrRhHevkw3vfOqn0rezOCn9guZArDkTnusq/xTBUMWbw7z15kHqr6EZxoiy0og8bXJ8RKncPzkjgBq+h+zm+uB7zE7w9Svpq/ssH0gfQDvpe1JD03dffoC5Qoew1dHHxaKkZAmFjs2opSP6B0MLAMmdUNGHerO5WN35+6CPVd80Skk3uPFw3KlefhUnezrlof//d9nOoAwaN+od8tE9KrRcHvrnxUFqS9wePNR+6iQLs56coifZY6R3eR8WvaYBIfi/b5W0s7lYceT9vytld7DfsVLmcWUh8ctCK+1Uyr72rJpoZvFfzOu1GW0/WhUu+L9/ywc/TiQH7/tQCT8n4n7mHCiOxIV/8szWAIyLay2u1TdUG1vBbKWY/p8CxL5B3uTw3xIe/vx2wz0i3P/T0ccfX3sjGJQwWXMcPF6YhPxos0svfJ22NmuAV+XAAuZ4jJJ4gMu4hTO4gQcvzG9Fm7VckBusCXc14X5u8k4PNDeG4wCLcVI0SqyE1gAa77A/FvWwssfqpaeqYoPLuabKFl8oFaT5ePBBMLOG5v1uuCDymgBO+Chc13wxMQI8wjZvjYGKPZr6l0yz7fkaLbgr9r8/9XAvdeQwq3/eyT5s9W4t0MhroTC+TeV/L/Wny5N5tuca3L/GZ7nOvJOxRk6gl/lMjhQ9uurtRKy+FjFQQKgSQOXDWbEP3l8GIonVarM8HyTp3ZyYn38mk0KvjJ267jxef407eVfSXdJMGOK9pNu6G2567wXzvG1T3L1Op+5lzok3rruwoVl9XndhSbNuPjd9B9wDbdM5Ad20/rI0tJrds23+WSHQowbddGmVZPlK9nC0R1HW8Hrf1zxeQda6FMyjEtU74XwzLQ7/AjW7VBK1qzrA99Ph/RF4vw9Ug6Xu7apu7ZqGdrmFq2Nwx2GWNUUHZv0KMTDKRtzPXZCHN6bvgOqUfet/kuN7hzWaAuJObVMP9T3Nh9svQxKP0ViAB1UqCxFujlSpdJdpYbC7pvkL3UE1344Ntnhg2wnlArcTXMOD3G37oZl5P03laI771OCyEO8UT4ByrEU8aNuZxYvkbR9Ps8q8ApkCtf/oXt6PFq6aNKAIP3960S9NAnqSRSvbtek94q56H42oLq4ufAz5gMvxAqEcnYTqG5frz8G1P+OKhOhGFpfv0OMf2Rx7CEtjHwBZrw0q5lNlJnYzOKsVExQ/PC1THmeH6nJr4MPLPdGW0/4eey/W398iuAbuO3JI0+1XWFsz0NHq4P7AK6sHVjA2s5XnqRVBVUCqwK3WRhuxTre5XsHdb/7wIocOmFIdVOllTOfdbrto25Af8zeHbjK3GqCROD9HsUvM/DDQVA432vYxenVwdkifcxKDV9bnO3q/tKQp/bdjGoxB/oDzg36hnoNiz3fhpDKFfqdrsg2er9L4phvd4XGt0N9P2Hj3dI4btYzevUwJWr2ihzGwR3jS40poZTKHA8zhb6QapciA76FEadoTNNurmMV9h/MSkfpmsNCyLZH7//XGbjjt7vvpPTUGEPgsNDQgCwfIfMLqLiBlCLkup4QQUg9iABVrfIPTQhyAgBCHyMJgaZzwgMQCa3QiAHtblxgvb4YwwghL2AnqICxbBjxQVG/bh6vB5XMmWgcmBjWN0zlpcpRglvXg1DYBohVbWPhXp5FGNGyWvrbHkGKq83ViGDujcnuERdy+jv+ixazSIU2NorqvTmol4CcT/771g1dcQuKJVtELBYKEi9unKZ5pq4PjY2a+T35/8OT9GO1++o/tKRqGbEXc32NZSn0+sAdrY8IOupevenhUAOtsSctRYUsV1OMyuRKJhabzjqChdEMGCuWQQ6rZ+bTaMBQCzwkXZp37KyuGPJakTIZgEGAPwbHzdQhRC4eQeNnuUHLokrjbunegQdfvgxVApVdVQ1fVs6ssrvTxcqs64B+1eBSAMkap16IHmlRsvlHMnx89fhdKzL4pmy8Y+Qq2sT/9QSOgikZ82BhNFWVi6acXh4r7qD/N6Bvs+9PG0sBFZB1fk2YJR/jFDM0icGNupvDTrynG+PyC191QrPNL+oWZ8mh03hwSRLZrAXOF5y0vI6egBAiGNbR8MYKFRvm9Kd1ixIoTL0GiJB7JoEBbpixgDkLcCkKDB/1lyg2A/irVcsG71Kk3yuzXrUUrk48xAWrG6Nb3GYMHe+IIJMr1B+7Bt1ACkUSmUGl0BpNF72Ple2dNSctw9uy2QQb010NTS9v5R4cfMv4wg8w57kQmpK+FJXgcV1x1zXUkIUIIIYQQQgwvsBAOv6Jv1cLjQwghhBBC6BJ8J3moNOTf6eTydH9AJLwWodMb/I32vgxmYB6svz8kNk3b9cM4zcu67cd53c/7ASAEIyiGEyRFMyzHC6IkK6qmG6ZlO67nB2EUiyeSqXQmm8sXiqVypVqrN5qtdqfb6w+GI4QJZVxIpY31/CCM4iTN8qKsagdN2/XDOM3Luu3Hed3P+/0W0PkQUy6VWFQtJsCgaCYbi52DFyeXuHkQJoqq6YZp2Y7r+UEYxUma5UVZ1U1LGRey64dxmpd124/zugFAEBgChcERSBQag8XhCUTEJKRk5BSUVNQ0tHT0DIxMzCysbOwcnFzz+zlN80FxSb2/CoAIE8q4yKyilNKxECCcUkaY0LBBRhAQxjEVUkUPGZiX3J/aAlyW6VceOSXjQkZ11EAIIYQQQhw1g4kdALIOGXWUCBBgEjpMIXSAGOXiRyPhRgSEybyEe+6P17qgIwUChVTRQy24U2sXY6NPckCa2I1waZ8RNBKQzBpd6AVcK5mxmWFsHr7wCxgXWiqTWwiEUyYkRMk/oQ/LqF9pUZvlq7aYUMb7NL8aIMKEMi6kWp7AVq6JPYZAhGHIkAlJEKZx1+T8ktQqp54RBIQyvjzS5G4HQIRJaocIIbYQCBMKUy6jr3Im9goRMzTvVb7U16S0cdvU6o0AiLA2hOcVAUSYpBYGZVL52NEHEGFCGReZVS6U1DFXEuviRw9AhAllXEilY/4D4KeNVbuS+bVtrOtE1IF20LChDRBhQhkXUmljXX4NQIQJZXyNlfk7vPUbueY6BCPYsOtMbQGBCBNGp8XbGYRxqnRO2eaV6hrL1NxleiI4CCTzEnot+PA0c44xCEQ4YuQxgE3SAxs3EoKrNRftQ34lQIRJaG+N7Kl6zJZxLq9hTgYe/zbJmiNiEjkUePbtS70conUsS/gJcaMiTCjjyyOsy3+/0DPXNieBZaVgE/Caw/Zp/mwFdPwYJLUciIAIUya5Vsb6vFoMGo1jXf4cu7T+Lod4JsLkzj+R2brXQ77BfQVEmHKpbX4dYho+VAEGda1TD4UJZVxIpY11+dsAMOg2A9wCyn547qVeABGmXGqbX42Yhn/MBF2JCBPKuMuuRoQJZVxIpY11+TUQOMRgldTvZV3e3iksfAwARJhQxoVU2liXXwgQYUIZF1JpY11+EUD0yls8CGU8YnQCRJhQxoVU2thvBwA=) format('woff2'); + src: url(data:application/font-woff2;charset=utf-8;base64,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) format('woff2'); font-weight: normal; font-style: normal; } \ No newline at end of file diff --git a/data/Leipzig.xml b/data/Leipzig.xml index e9ec64193a3..fe1e59903e5 100644 --- a/data/Leipzig.xml +++ b/data/Leipzig.xml @@ -776,7 +776,7 @@ - + @@ -792,4 +792,5 @@ + \ No newline at end of file diff --git a/data/Leipzig/E8F8.xml b/data/Leipzig/E8F8.xml index dd25ac4801a..d42573c956c 100644 --- a/data/Leipzig/E8F8.xml +++ b/data/Leipzig/E8F8.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/data/Leipzig/EB9F.xml b/data/Leipzig/EB9F.xml new file mode 100644 index 00000000000..bfbba5c5de9 --- /dev/null +++ b/data/Leipzig/EB9F.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/emscripten/npm/src/verovio-toolkit.js b/emscripten/npm/src/verovio-toolkit.js index 68714185384..6ee8b347c42 100644 --- a/emscripten/npm/src/verovio-toolkit.js +++ b/emscripten/npm/src/verovio-toolkit.js @@ -1,6 +1,19 @@ import { createEmscriptenProxy } from "./emscripten-proxy.js"; +async function solve(options) { + const res = await fetch( + `https://raw.githubusercontent.com/lpugin/test-font/main/GoldenAge.zip`, + { + method: "GET", + } + ); + const data = await res.blob(); + console.log( res ); + console.log( options ); + return options; +} + export class VerovioToolkit { constructor(VerovioModule) { @@ -183,6 +196,7 @@ export class VerovioToolkit { } setOptions(options) { + options = this.preprocessOptions(options); return this.proxy.setOptions(this.ptr, JSON.stringify(options)); } @@ -193,6 +207,30 @@ export class VerovioToolkit { return JSON.parse(this.proxy.validatePAE(this.ptr, data)); } + preprocessOptions(options) { + // Nothing to do if we do not have 'fontAddCustom' set + if (!Object.hasOwn(options, 'fontAddCustom')) { + return options; + } + const filenames = options['fontAddCustom']; + let filesInBase64 = []; + // Get all the files and convert them to a base64 string + for (let i = 0; i < filenames.length; i++ ) { + const request = new XMLHttpRequest(); + request.open("GET", filenames[i], false); // `false` makes the request synchronous + request.send(null); + + if (request.status === 200) { + filesInBase64.push(request.responseText); + } + else { + console.error(`${filenames[i]} could not be retrieved`); + } + } + options["fontAddCustom"] = filesInBase64; + //console.log( options ); + return options; + } } // A pointer to the object - only one instance can be created for now diff --git a/fonts/Leipzig/Leipzig.svg b/fonts/Leipzig/Leipzig.svg index 5ea289cf111..9672c1539a9 100644 --- a/fonts/Leipzig/Leipzig.svg +++ b/fonts/Leipzig/Leipzig.svg @@ -2,11 +2,11 @@ -Created by FontForge 20220308 at Sun Jul 2 12:58:41 2023 +Created by FontForge 20220308 at Tue Jan 30 18:14:47 2024 By Laurent Pugin Created by Etienne Darbellay, Jean-Francois Marti, Laurent Pugin, and Klaus Rettinghaus. This font is licensed under the SIL Open Font License \(http://scripts.sil.org/OFL\). -Version 5.2.85 +Version 5.2.87 @@ -2402,7 +2402,7 @@ d="M0 375h14v-750h-14v750zM100 375h14v-750h-14v750z" /> +d="M120.146 498.265c0.224774 0 17.1897 -1.82497 17.1897 -14.4827c0 -13.3186 -15.0253 -42.3383 -63.3358 -117.782c-34 -53 -64 -102 -64 -102c-10 6 -3 2 -10 6c74.9234 172.649 99.0583 228.265 120.146 228.265z" /> + diff --git a/fonts/Leipzig/Leipzig.ttf b/fonts/Leipzig/Leipzig.ttf index 5527ea96b9f..c674abd7203 100644 Binary files a/fonts/Leipzig/Leipzig.ttf and b/fonts/Leipzig/Leipzig.ttf differ diff --git a/fonts/Leipzig/Leipzig.woff2 b/fonts/Leipzig/Leipzig.woff2 index e1cfe002396..3f3c9daf924 100644 Binary files a/fonts/Leipzig/Leipzig.woff2 and b/fonts/Leipzig/Leipzig.woff2 differ diff --git a/fonts/Leipzig/leipzig_metadata.json b/fonts/Leipzig/leipzig_metadata.json index 83e976a9651..c0a32252cc8 100644 --- a/fonts/Leipzig/leipzig_metadata.json +++ b/fonts/Leipzig/leipzig_metadata.json @@ -30,7 +30,7 @@ "tupletBracketThickness": 0.16 }, "fontName": "Leipzig", - "fontVersion": "5.2.86", + "fontVersion": "5.2.87", "glyphBBoxes": { "4stringTabClef": { "bBoxNE": [ @@ -1078,8 +1078,8 @@ 1.9931 ], "bBoxSW": [ - -0.0005, - 1.0547 + 0.0, + 1.056 ] }, "chantCclef": { @@ -6452,6 +6452,16 @@ 0.0 ] }, + "staffPosLower8": { + "bBoxNE": [ + 0.0, + 0.0 + ], + "bBoxSW": [ + 0.0, + 0.0 + ] + }, "staffPosRaise1": { "bBoxNE": [ 0.0, diff --git a/include/vrv/clef.h b/include/vrv/clef.h index 9dcd9e635b7..bc16c6fdc42 100644 --- a/include/vrv/clef.h +++ b/include/vrv/clef.h @@ -35,6 +35,7 @@ class Clef : public LayerElement, public AttOctave, public AttOctaveDisplacement, public AttStaffIdent, + public AttTypography, public AttVisibility { public: /** diff --git a/include/vrv/filereader.h b/include/vrv/filereader.h new file mode 100644 index 00000000000..ea17d92de86 --- /dev/null +++ b/include/vrv/filereader.h @@ -0,0 +1,86 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: filereader.h +// Author: Laurent Pugin +// Created: 31/01/2024 +// Copyright (c) Authors and others. All rights reserved. +///////////////////////////////////////////////////////////////////////////// + +#ifndef __VRV_FILEREADER_H__ +#define __VRV_FILEREADER_H__ + +#include +#include +#include + +//---------------------------------------------------------------------------- + +/** Forward declaration of the zip_file.hpp class */ +namespace miniz_cpp { +class zip_file; +} + +//---------------------------------------------------------------------------- + +namespace vrv { + +//---------------------------------------------------------------------------- +// ZipFileReader +//---------------------------------------------------------------------------- + +/** + * This class is a reader for zip archives. + */ +class ZipFileReader { +public: + /** + * @name Constructors, destructors, and other standard methods + */ + ///@{ + ZipFileReader(); + ~ZipFileReader(); + ///@} + + /** + * Reset a previously loaded file. + */ + void Reset(); + + /** + * Load a file into memory. + */ + bool Load(const std::string &filename); + + /** + * Load a vector into memory + */ + bool Load(const std::vector &bytes); + + /** + * Check if the archive contains the file + */ + bool HasFile(const std::string &filename); + + /** + * Read the text file. + * Return an empty string if the file does not exist. + */ + std::string ReadTextFile(const std::string &filename); + + /** + * Return a list of all files (including directories) + */ + std::list GetFileList() const; + +private: + // +public: + // +private: + /** A pointer to the miniz zip file */ + miniz_cpp::zip_file *m_file; + +}; // class ZipFileReader + +} // namespace vrv + +#endif // __VRV_FILEREADER_H__ diff --git a/include/vrv/glyph.h b/include/vrv/glyph.h index 24089f559cf..dc28607aeeb 100644 --- a/include/vrv/glyph.h +++ b/include/vrv/glyph.h @@ -106,6 +106,18 @@ class Glyph { */ const Point *GetAnchor(SMuFLGlyphAnchor anchor) const; + /** + * Set the XML (content) of the glyph. + * This is used only for glyph added from zip archive custom fonts. + */ + void SetXML(const std::string &xml) { m_xml = xml; } + + /** + * Return the XML (content) of the glyph. + * Return the stored XML or load it from the path. + */ + std::string GetXML() const; + private: // public: @@ -124,6 +136,8 @@ class Glyph { std::string m_codeStr; /** Path to the glyph XML file */ std::string m_path; + /** XML of the content for files loaded from zip archive custom font */ + std::string m_xml; /** A map of the available anchors */ std::map m_anchors; /** A flag indicating it is a fallback */ diff --git a/include/vrv/metersig.h b/include/vrv/metersig.h index df024fd5149..585c259b9c4 100644 --- a/include/vrv/metersig.h +++ b/include/vrv/metersig.h @@ -8,6 +8,7 @@ #ifndef __VRV_METERSIG_H__ #define __VRV_METERSIG_H__ +#include "atts_externalsymbols.h" #include "atts_shared.h" #include "atts_visual.h" #include "layerelement.h" @@ -24,9 +25,12 @@ class ScoreDefInterface; * This class models the MEI element. */ class MeterSig : public LayerElement, + public AttColor, public AttEnclosingChars, + public AttExtSymNames, public AttMeterSigLog, public AttMeterSigVis, + public AttTypography, public AttVisibility { public: /** diff --git a/include/vrv/options.h b/include/vrv/options.h index 42f59ce1b77..98a66d74f36 100644 --- a/include/vrv/options.h +++ b/include/vrv/options.h @@ -67,6 +67,8 @@ enum option_ELISION { ELISION_unicode = UNICODE_UNDERTIE }; +enum option_FONT_FALLBACK { FONT_FALLBACK_Leipzig = 0, FONT_FALLBACK_Bravura }; + enum option_FOOTER { FOOTER_none = 0, FOOTER_auto, FOOTER_encoded, FOOTER_always }; enum option_HEADER { HEADER_none = 0, HEADER_auto, HEADER_encoded }; @@ -140,6 +142,7 @@ class Option { static const std::map s_breaks; static const std::map s_condense; static const std::map s_elision; + static const std::map s_fontFallback; static const std::map s_footer; static const std::map s_header; static const std::map s_multiRestStyle; @@ -689,6 +692,9 @@ class Options { OptionDbl m_extenderLineMinSpace; OptionDbl m_fingeringScale; OptionString m_font; + OptionArray m_fontAddCustom; + OptionIntMap m_fontFallback; + OptionBool m_fontLoadAll; OptionDbl m_graceFactor; OptionBool m_graceRhythmAlign; OptionBool m_graceRightAlign; diff --git a/include/vrv/resources.h b/include/vrv/resources.h index 597ae6b6545..7988fb1faf4 100644 --- a/include/vrv/resources.h +++ b/include/vrv/resources.h @@ -12,6 +12,7 @@ //---------------------------------------------------------------------------- +#include "filereader.h" #include "glyph.h" namespace vrv { @@ -57,11 +58,23 @@ class Resources { ///@{ /** Init the SMufL music and text fonts */ bool InitFonts(); + /** Set the font to be used and loads it if necessary */ + bool SetFont(const std::string &fontName); + /** Add custom (external) fonts */ + bool AddCustom(const std::vector &extraFonts); + /** Load all music fonts available in the resource directory */ + bool LoadAll(); + /** Set the fallback font (Leipzig or Bravura) when some glyphs are missing in the current font */ + bool SetFallback(const std::string &fontName); + /** Get the fallback font name */ + std::string GetFallbackFont() const { return m_defaultFontName; } /** Init the text font (bounding boxes and ASCII only) */ bool InitTextFont(const std::string &fontName, const StyleAttributes &style); + /** Select a particular font */ - bool SetFont(const std::string &fontName); - std::string GetCurrentFontName() const { return m_fontName; } + bool SetCurrentFont(const std::string &fontName, bool allowLoading = false); + std::string GetCurrentFont() const { return m_currentFontName; } + bool IsFontLoaded(const std::string &fontName) const { return m_loadedFonts.find(fontName) != m_loadedFonts.end(); } ///@} /** @@ -81,6 +94,11 @@ class Resources { */ bool IsSmuflFallbackNeeded(const std::u32string &text) const; + /** + * Check if the current font is the fallback font + */ + bool IsCurrentFontFallback() const; + /** * Text fonts */ @@ -89,8 +107,21 @@ class Resources { void SelectTextFont(data_FONTWEIGHT fontWeight, data_FONTSTYLE fontStyle) const; /** Returns the glyph (if exists) for the text font (bounding box and ASCII only) */ const Glyph *GetTextGlyph(char32_t code) const; + /** Returns true if the specified font is loaded and it contains the requested glyph */ + bool FontHasGlyphAvailable(const std::string &fontName, char32_t smuflCode) const; ///@} + /** + * Get the CSS font string for the corresponding font. + * Return an empty string if the font has not been loaded. + */ + std::string GetCSSFontFor(const std::string &fontName) const; + + /** + * Retrieve the font name either from the filename path or from the zipFile content. + */ + std::string GetCustomFontname(const std::string &filename, const ZipFileReader &zipFile); + /** * Static method that converts unicode music code points to SMuFL equivalent. * Return the parameter char if nothing can be converted. @@ -98,15 +129,46 @@ class Resources { static char32_t GetSmuflGlyphForUnicodeChar(const char32_t unicodeChar); private: - bool LoadFont(const std::string &fontName, bool withFallback = true); + //---------------------------------------------------------------------------- + // LoadedFont + //---------------------------------------------------------------------------- + + class LoadedFont { + + public: + LoadedFont(const std::string &name, bool isFallback) : m_name(name), m_isFallback(isFallback){}; + ~LoadedFont(){}; + const std::string GetName() const { return m_name; }; + const GlyphTable &GetGlyphTable() const { return m_glyphTable; }; + GlyphTable &GetGlyphTableForModification() { return m_glyphTable; }; + bool isFallback() const { return m_isFallback; }; + + void SetCSSFont(const std::string &css) { m_css = css; } + std::string GetCSSFont(const std::string &path) const; + + private: + std::string m_name; + /** The loaded SMuFL font */ + GlyphTable m_glyphTable; + /** If the font needs to fallback when a glyph is not present **/ + const bool m_isFallback; + /** CSS font for font loaded as zip archive */ + std::string m_css; + }; + + //---------------------------------------------------------------------------- + + bool LoadFont(const std::string &fontName, ZipFileReader *zipFile = NULL); + + const GlyphTable &GetCurrentGlyphTable() const { return m_loadedFonts.at(m_currentFontName).GetGlyphTable(); }; + const GlyphTable &GetFallbackGlyphTable() const { return m_loadedFonts.at(m_fallbackFontName).GetGlyphTable(); }; -private: - /** The font name of the font that is currently loaded */ - std::string m_fontName; - /** The path to the resources directory (e.g., for the svg/ subdirectory with fonts as XML */ std::string m_path; - /** The loaded SMuFL font */ - GlyphTable m_fontGlyphTable; + std::string m_defaultFontName; + std::string m_fallbackFontName; + std::map m_loadedFonts; + std::string m_currentFontName; + /** A text font used for bounding box calculations */ GlyphTextMap m_textFont; mutable StyleAttributes m_currentStyle; diff --git a/include/vrv/svgdevicecontext.h b/include/vrv/svgdevicecontext.h index 0e7b43e4afd..0139e26ed8b 100644 --- a/include/vrv/svgdevicecontext.h +++ b/include/vrv/svgdevicecontext.h @@ -9,10 +9,8 @@ #define __VRV_SVG_DC_H__ #include -#include #include #include -#include #include #include @@ -328,9 +326,28 @@ class SvgDeviceContext : public DeviceContext { bool m_committed; // did we flushed the file? int m_originX, m_originY; - // holds the list of glyphs from the smufl font used so far - // they will be added at the end of the file as - std::set m_smuflGlyphs; + // Here we hold references to all different glyphs used so far, + // including any glyph for the same code but from different fonts. + // They will be added at the end of the file as . + // With multiple font support we need to keep track of: + // a) the glyph (to check if is has been already added) + // b) the id assigned to glyphs on the (that is has been consumed by the already rendered elements) + // To keep things as similar as possible to previous versions we generate ids with as uuuu-ss (where uuuu is the + // Smulf code for the glyph and ss the per-session suffix) for most of the cases (single font usage). When the same + // glyph has been used from several fonts we use uuuu-n-ss where n indicates the collision count. + class GlyphRef { + public: + GlyphRef(const Glyph *glyph, int count, const std::string &postfix); + const Glyph *GetGlyph() const { return m_glyph; }; + const std::string &GetRefId() const { return m_refId; }; + + private: + const Glyph *m_glyph; + std::string m_refId; + }; + const std::string InsertGlyphRef(const Glyph *glyph); + std::map m_smuflGlyphs; + std::map m_glyphCodeFontCounter; // pugixml data pugi::xml_document m_svgDoc; @@ -358,7 +375,7 @@ class SvgDeviceContext : public DeviceContext { bool m_removeXlink; // indentation value (-1 for tabs) int m_indent; - // prefix to be added to font glyphs + // postfix to be added to font glyphs std::string m_glyphPostfixId; // embedding of the smufl text font option_SMUFLTEXTFONT m_smuflTextFont; diff --git a/include/vrv/toolkit.h b/include/vrv/toolkit.h index 268175e3217..14a5499baeb 100644 --- a/include/vrv/toolkit.h +++ b/include/vrv/toolkit.h @@ -77,7 +77,7 @@ class Toolkit { std::string GetResourcePath() const; /** - * Set the resource path for the Toolkit instance. + * Set the resource path for the Toolkit instance and any extra fonts * * This method needs to be called if the constructor had initFont=false or if the resource path * needs to be changed. diff --git a/include/vrv/view.h b/include/vrv/view.h index 2c5473db68d..c9137403e20 100644 --- a/include/vrv/view.h +++ b/include/vrv/view.h @@ -567,6 +567,9 @@ class View { DeviceContext *dc, int y1, SegmentedLine &line, int width, int dashLength = 0, int gapLength = 0); void DrawSmuflCode( DeviceContext *dc, int x, int y, char32_t code, int staffSize, bool dimin, bool setBBGlyph = false); + // void DrawSmuflCodeWithCustomFont(DeviceContext *dc, const std::string &customFont, int x, int y, char32_t code, + // int staffSize, bool dimin, bool setBBGlyph = false); + void DrawThickBezierCurve( DeviceContext *dc, Point bezier[4], int thickness, int staffSize, int penWidth, int penStyle = AxSOLID); void DrawPartFilledRectangle(DeviceContext *dc, int x1, int y1, int x2, int y2, int fillSection); diff --git a/src/clef.cpp b/src/clef.cpp index d14a60822dc..3e73f0cc14d 100644 --- a/src/clef.cpp +++ b/src/clef.cpp @@ -41,6 +41,7 @@ Clef::Clef() , AttOctave() , AttOctaveDisplacement() , AttStaffIdent() + , AttTypography() , AttVisibility() { this->RegisterAttClass(ATT_CLEFLOG); @@ -53,6 +54,7 @@ Clef::Clef() this->RegisterAttClass(ATT_OCTAVE); this->RegisterAttClass(ATT_OCTAVEDISPLACEMENT); this->RegisterAttClass(ATT_STAFFIDENT); + this->RegisterAttClass(ATT_TYPOGRAPHY); this->RegisterAttClass(ATT_VISIBILITY); this->Reset(); @@ -73,6 +75,7 @@ void Clef::Reset() this->ResetOctave(); this->ResetOctaveDisplacement(); this->ResetStaffIdent(); + this->ResetTypography(); this->ResetVisibility(); } diff --git a/src/doc.cpp b/src/doc.cpp index 5f36ed7264a..5b13dd476d7 100644 --- a/src/doc.cpp +++ b/src/doc.cpp @@ -1843,7 +1843,7 @@ double Doc::GetCueScaling() const FontInfo *Doc::GetDrawingSmuflFont(int staffSize, bool graceSize) { - m_drawingSmuflFont.SetFaceName(m_options->m_font.GetValue().c_str()); + m_drawingSmuflFont.SetFaceName(this->GetResources().GetCurrentFont().c_str()); int value = m_drawingSmuflFontSize * staffSize / 100; if (graceSize) value = value * m_options->m_graceFactor.GetValue(); m_drawingSmuflFont.SetPointSize(value); diff --git a/src/filereader.cpp b/src/filereader.cpp new file mode 100644 index 00000000000..4703dd56a44 --- /dev/null +++ b/src/filereader.cpp @@ -0,0 +1,130 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: filereader.cpp +// Author: Laurent Pugin +// Created: 31/01/2024 +// Copyright (c) Authors and others. All rights reserved. +///////////////////////////////////////////////////////////////////////////// + +#include "filereader.h" + +//---------------------------------------------------------------------------- + +#include + +//---------------------------------------------------------------------------- + +#include "vrv.h" + +//---------------------------------------------------------------------------- + +#include "zip_file.hpp" + +namespace vrv { + +//---------------------------------------------------------------------------- +// ZipFileReader +//---------------------------------------------------------------------------- + +ZipFileReader::ZipFileReader() +{ + m_file = NULL; + + this->Reset(); +} + +ZipFileReader::~ZipFileReader() +{ + this->Reset(); +} + +void ZipFileReader::Reset() +{ + if (m_file) { + delete m_file; + m_file = NULL; + } +} + +bool ZipFileReader::Load(const std::string &filename) +{ +#ifdef __EMSCRIPTEN__ + std::string data = filename; + // Remove the mimetype prefix if any + if (data.starts_with("data:")) { + data = data.substr(data.find("base64,") + 7); + } + std::vector bytes = Base64Decode(data); + return this->Load(bytes); +#else + std::ifstream fin(filename.c_str(), std::ios::in | std::ios::binary); + if (!fin.is_open()) { + LogError("File archive '%s' could not be open.", filename.c_str()); + return false; + } + + fin.seekg(0, std::ios::end); + std::streamsize fileSize = (std::streamsize)fin.tellg(); + fin.clear(); + fin.seekg(0, std::wios::beg); + + std::vector bytes; + bytes.reserve(fileSize + 1); + + unsigned char buffer; + while (fin.read((char *)&buffer, sizeof(unsigned char))) { + bytes.push_back(buffer); + } + return this->Load(bytes); +#endif +} + +bool ZipFileReader::Load(const std::vector &bytes) +{ + this->Reset(); + + m_file = new miniz_cpp::zip_file(bytes); + + return true; +} + +std::list ZipFileReader::GetFileList() const +{ + assert(m_file); + + std::list list; + for (miniz_cpp::zip_info &member : m_file->infolist()) { + list.push_back(member.filename); + } + return list; +} + +bool ZipFileReader::HasFile(const std::string &filename) +{ + assert(m_file); + + // Look for the file in the zip + for (miniz_cpp::zip_info &member : m_file->infolist()) { + if (member.filename == filename) { + return true; + } + } + + return true; +} + +std::string ZipFileReader::ReadTextFile(const std::string &filename) +{ + assert(m_file); + + // Look for the meta file in the zip + for (miniz_cpp::zip_info &member : m_file->infolist()) { + if (member.filename == filename) { + return m_file->read(member.filename); + } + } + + LogError("No file '%s' to read found in the archive", filename.c_str()); + return ""; +} + +} // namespace vrv diff --git a/src/glyph.cpp b/src/glyph.cpp index e78b91c0d1f..2413bf0f8bc 100644 --- a/src/glyph.cpp +++ b/src/glyph.cpp @@ -11,6 +11,9 @@ #include #include +#include +#include +#include //---------------------------------------------------------------------------- @@ -144,4 +147,17 @@ const Point *Glyph::GetAnchor(SMuFLGlyphAnchor anchor) const return &m_anchors.at(anchor); } +std::string Glyph::GetXML() const +{ + if (!m_xml.empty()) { + return m_xml; + } + else { + std::ifstream fstream(m_path); + std::stringstream sstream; + sstream << fstream.rdbuf(); + return sstream.str(); + } +} + } // namespace vrv diff --git a/src/iomei.cpp b/src/iomei.cpp index 1cac00367ae..aa139f99077 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -2629,6 +2629,7 @@ void MEIOutput::WriteMeterSig(pugi::xml_node currentNode, MeterSig *meterSig) } this->WriteLayerElement(currentNode, meterSig); + meterSig->WriteColor(currentNode); meterSig->WriteEnclosingChars(currentNode); meterSig->WriteMeterSigLog(currentNode); meterSig->WriteMeterSigVis(currentNode); @@ -6473,6 +6474,7 @@ bool MEIInput::ReadClef(Object *parent, pugi::xml_node clef) vrvClef->ReadOctave(clef); vrvClef->ReadOctaveDisplacement(clef); vrvClef->ReadStaffIdent(clef); + vrvClef->ReadTypography(clef); vrvClef->ReadVisibility(clef); parent->AddChild(vrvClef); @@ -6688,9 +6690,12 @@ bool MEIInput::ReadMeterSig(Object *parent, pugi::xml_node meterSig) this->UpgradeMeterSigTo_5_0(meterSig, vrvMeterSig); } + vrvMeterSig->ReadColor(meterSig); vrvMeterSig->ReadEnclosingChars(meterSig); + vrvMeterSig->ReadExtSymNames(meterSig); vrvMeterSig->ReadMeterSigLog(meterSig); vrvMeterSig->ReadMeterSigVis(meterSig); + vrvMeterSig->ReadTypography(meterSig); vrvMeterSig->ReadVisibility(meterSig); parent->AddChild(vrvMeterSig); diff --git a/src/metersig.cpp b/src/metersig.cpp index e27022f9d79..f3df8054d23 100644 --- a/src/metersig.cpp +++ b/src/metersig.cpp @@ -16,6 +16,7 @@ //---------------------------------------------------------------------------- #include "functor.h" +#include "resources.h" #include "scoredefinterface.h" #include "smufl.h" #include "vrv.h" @@ -29,11 +30,21 @@ namespace vrv { static const ClassRegistrar s_factory("meterSig", METERSIG); MeterSig::MeterSig() - : LayerElement(METERSIG, "msig-"), AttEnclosingChars(), AttMeterSigLog(), AttMeterSigVis(), AttVisibility() + : LayerElement(METERSIG, "msig-") + , AttColor() + , AttEnclosingChars() + , AttExtSymNames() + , AttMeterSigLog() + , AttMeterSigVis() + , AttTypography() + , AttVisibility() { + this->RegisterAttClass(ATT_COLOR); this->RegisterAttClass(ATT_ENCLOSINGCHARS); + this->RegisterAttClass(ATT_EXTSYMNAMES); this->RegisterAttClass(ATT_METERSIGLOG); this->RegisterAttClass(ATT_METERSIGVIS); + this->RegisterAttClass(ATT_TYPOGRAPHY); this->RegisterAttClass(ATT_VISIBILITY); this->Reset(); @@ -44,9 +55,12 @@ MeterSig::~MeterSig() {} void MeterSig::Reset() { LayerElement::Reset(); + this->ResetColor(); this->ResetEnclosingChars(); + this->ResetExtSymNames(); this->ResetMeterSigLog(); this->ResetMeterSigVis(); + this->ResetTypography(); this->ResetVisibility(); } @@ -97,6 +111,19 @@ int MeterSig::GetTotalCount() const char32_t MeterSig::GetSymbolGlyph() const { char32_t glyph = 0; + const Resources *resources = this->GetDocResources(); + + // If there is glyph.num, prioritize it + if (this->HasGlyphNum()) { + glyph = this->GetGlyphNum(); + if (NULL != resources->GetGlyph(glyph)) return glyph; + } + // If there is glyph.name (second priority) + else if (this->HasGlyphName()) { + glyph = resources->GetGlyphCode(this->GetGlyphName()); + if (NULL != resources->GetGlyph(glyph)) return glyph; + } + switch (this->GetSym()) { case METERSIGN_common: glyph = SMUFL_E08A_timeSigCommon; break; case METERSIGN_cut: glyph = SMUFL_E08B_timeSigCutCommon; break; diff --git a/src/options.cpp b/src/options.cpp index b634bf9924b..0a24f1c16bd 100644 --- a/src/options.cpp +++ b/src/options.cpp @@ -32,6 +32,9 @@ const std::map Option::s_condense const std::map Option::s_elision = { { ELISION_regular, "regular" }, { ELISION_narrow, "narrow" }, { ELISION_wide, "wide" }, { ELISION_unicode, "unicode" } }; +const std::map Option::s_fontFallback + = { { FONT_FALLBACK_Leipzig, "Leipzig" }, { FONT_FALLBACK_Bravura, "Bravura" } }; + const std::map Option::s_footer = { { FOOTER_none, "none" }, { FOOTER_auto, "auto" }, { FOOTER_encoded, "encoded" }, { FOOTER_always, "always" } }; @@ -1290,6 +1293,18 @@ Options::Options() m_font.Init("Leipzig"); this->Register(&m_font, "font", &m_generalLayout); + m_fontAddCustom.SetInfo("Add custom font", "Add a custom music font as zip file"); + m_fontAddCustom.Init(); + this->Register(&m_fontAddCustom, "fontAddCustom", &m_generalLayout); + + m_fontFallback.SetInfo("Font fallback", "The music font fallback for missing glyphs"); + m_fontFallback.Init(FONT_FALLBACK_Leipzig, &Option::s_fontFallback); + this->Register(&m_fontFallback, "fontFallback", &m_generalLayout); + + m_fontLoadAll.SetInfo("Font init all", "Load all music fonts"); + m_fontLoadAll.Init(false); + this->Register(&m_fontLoadAll, "fontLoadAll", &m_generalLayout); + m_graceFactor.SetInfo("Grace factor", "The grace size ratio numerator"); m_graceFactor.Init(0.75, 0.5, 1.0); this->Register(&m_graceFactor, "graceFactor", &m_generalLayout); diff --git a/src/resources.cpp b/src/resources.cpp index 114821fbe0a..d2f5774be50 100644 --- a/src/resources.cpp +++ b/src/resources.cpp @@ -9,6 +9,10 @@ //---------------------------------------------------------------------------- +#include +#include +#include +#include #include //---------------------------------------------------------------------------- @@ -21,6 +25,9 @@ #include "pugixml.hpp" +#define BRAVURA "Bravura" +#define LEIPZIG "Leipzig" + namespace vrv { //---------------------------------------------------------------------------- @@ -52,16 +59,16 @@ Resources::Resources() bool Resources::InitFonts() { - // We will need to rethink this for adding the option to add custom fonts - // Font Bravura first since it is expected to have always all symbols - if (!LoadFont("Bravura", false)) LogError("Bravura font could not be loaded."); - // The Leipzig as the default font - if (!LoadFont("Leipzig", false)) LogError("Leipzig font could not be loaded."); - - if (m_fontGlyphTable.size() < SMUFL_COUNT) { - LogError("Expected %d default SMuFL glyphs but could load only %d.", SMUFL_COUNT, m_fontGlyphTable.size()); - return false; - } + m_loadedFonts.clear(); + + // Font Bravura first. As it is expected to have always all symbols we build the code -> name table from it + if (!LoadFont(BRAVURA)) LogError("Bravura font could not be loaded."); + // Leipzig is our initial default font + if (!LoadFont(LEIPZIG)) LogError("Leipzig font could not be loaded."); + + m_defaultFontName = LEIPZIG; + m_currentFontName = m_defaultFontName; + m_fallbackFontName = m_defaultFontName; struct TextFontInfo_type { const StyleAttributes m_style; @@ -88,33 +95,160 @@ bool Resources::InitFonts() bool Resources::SetFont(const std::string &fontName) { - return LoadFont(fontName); + // and the default font provided in options, if it is not one of the previous + if (!fontName.empty() && !IsFontLoaded(fontName)) { + if (!LoadFont(fontName)) { + LogError("%s font could not be loaded.", fontName.c_str()); + return false; + } + } + + m_defaultFontName = IsFontLoaded(fontName) ? fontName : LEIPZIG; + m_currentFontName = m_defaultFontName; + + return true; +} + +bool Resources::AddCustom(const std::vector &extraFonts) +{ + bool success = true; + // options supplied fonts + for (const std::string &fontFile : extraFonts) { + ZipFileReader zipFile; + if (!zipFile.Load(fontFile)) { + continue; + } + std::string fontName = GetCustomFontname(fontFile, zipFile); + if (fontName.empty() || IsFontLoaded(fontName)) { + continue; + } + success = success && LoadFont(fontName, &zipFile); + if (!success) { + LogError("Option supplied font %s could not be loaded.", fontName.c_str()); + } + } + return success; +} + +bool Resources::LoadAll() +{ + bool success = true; + std::string path = Resources::GetPath() + "/"; + for (const std::filesystem::directory_entry &entry : std::filesystem::directory_iterator(path)) { + const std::filesystem::path path = entry.path(); + if (path.has_extension() && path.has_stem() && path.extension() == ".xml") { + const std::string fontName = path.stem().string(); + if (!IsFontLoaded(fontName)) { + success = success && LoadFont(fontName); + } + } + } + return success; +} + +bool Resources::SetFallback(const std::string &fontName) +{ + m_fallbackFontName = fontName; + return true; +} + +bool Resources::SetCurrentFont(const std::string &fontName, bool allowLoading) +{ + if (IsFontLoaded(fontName)) { + m_currentFontName = fontName; + return true; + } + else if (allowLoading && LoadFont(fontName)) { + m_currentFontName = fontName; + return true; + } + else { + return false; + } } const Glyph *Resources::GetGlyph(char32_t smuflCode) const { - return m_fontGlyphTable.count(smuflCode) ? &m_fontGlyphTable.at(smuflCode) : NULL; + if (GetCurrentGlyphTable().contains(smuflCode)) { + return &GetCurrentGlyphTable().at(smuflCode); + } + else if (!this->IsCurrentFontFallback()) { + const GlyphTable &fallbackTable = this->GetFallbackGlyphTable(); + return (fallbackTable.contains(smuflCode)) ? &fallbackTable.at(smuflCode) : NULL; + } + else { + return NULL; + } } const Glyph *Resources::GetGlyph(const std::string &smuflName) const { - return m_glyphNameTable.count(smuflName) ? &m_fontGlyphTable.at(m_glyphNameTable.at(smuflName)) : NULL; + return (this->GetGlyphCode(smuflName)) ? &GetCurrentGlyphTable().at(this->GetGlyphCode(smuflName)) : NULL; } char32_t Resources::GetGlyphCode(const std::string &smuflName) const { - return m_glyphNameTable.count(smuflName) ? m_glyphNameTable.at(smuflName) : 0; + return m_glyphNameTable.contains(smuflName) ? m_glyphNameTable.at(smuflName) : 0; } bool Resources::IsSmuflFallbackNeeded(const std::u32string &text) const { + if (m_loadedFonts.at(m_currentFontName).isFallback()) { + return false; + } for (char32_t c : text) { - const Glyph *glyph = this->GetGlyph(c); - if (glyph && glyph->GetFallback()) return true; + if (!GetCurrentGlyphTable().contains(c)) return true; } return false; } +bool Resources::IsCurrentFontFallback() const +{ + return (m_currentFontName == m_fallbackFontName); +} + +bool Resources::FontHasGlyphAvailable(const std::string &fontName, char32_t smuflCode) const +{ + if (!IsFontLoaded(fontName)) { + return false; + } + + const GlyphTable &table = m_loadedFonts.at(fontName).GetGlyphTable(); + if (table.find(smuflCode) != table.end()) { + return true; + } + else { + return false; + } +} + +std::string Resources::GetCSSFontFor(const std::string &fontName) const +{ + if (!IsFontLoaded(fontName)) { + return ""; + } + + const LoadedFont &font = m_loadedFonts.at(fontName); + return font.GetCSSFont(m_path); +} + +std::string Resources::GetCustomFontname(const std::string &filename, const ZipFileReader &zipFile) +{ +#ifdef __EMSCRIPTEN__ + for (auto &s : zipFile.GetFileList()) { + std::filesystem::path path(s); + if (!path.has_parent_path() && path.has_extension() && path.extension() == ".xml") { + return path.stem(); + } + } + LogWarning("The font name could not be extracted from the archive"); + return ""; +#else + std::filesystem::path path(filename); + return (path.has_stem()) ? path.stem().string() : ""; +#endif +} + void Resources::SelectTextFont(data_FONTWEIGHT fontWeight, data_FONTSTYLE fontStyle) const { if (fontWeight == FONTWEIGHT_NONE) { @@ -158,15 +292,33 @@ char32_t Resources::GetSmuflGlyphForUnicodeChar(const char32_t unicodeChar) return smuflChar; } -bool Resources::LoadFont(const std::string &fontName, bool withFallback) +bool Resources::LoadFont(const std::string &fontName, ZipFileReader *zipFile) { pugi::xml_document doc; - const std::string filename = Resources::GetPath() + "/" + fontName + ".xml"; - pugi::xml_parse_result parseResult = doc.load_file(filename.c_str()); - if (!parseResult) { - // File not found, default bounding boxes will be used - LogError("Failed to load font and glyph bounding boxes"); - return false; + // For zip archive custom font, load the data from the zipFile + if (zipFile) { + const std::string filename = fontName + ".xml"; + if (!zipFile->HasFile(filename)) { + // File not found, default bounding boxes will be used + LogError("Failed to load font and glyph bounding boxes"); + return false; + } + pugi::xml_parse_result parseResult = doc.load_string(zipFile->ReadTextFile(filename).c_str()); + if (!parseResult) { + // File not found, default bounding boxes will be used + LogError("Failed to load font and glyph bounding boxes"); + return false; + } + } + // Other wise use the resource directory + else { + const std::string filename = Resources::GetPath() + "/" + fontName + ".xml"; + pugi::xml_parse_result parseResult = doc.load_file(filename.c_str()); + if (!parseResult) { + // File not found, default bounding boxes will be used + LogError("Failed to load font and glyph bounding boxes"); + return false; + } } pugi::xml_node root = doc.first_child(); if (!root.attribute("units-per-em")) { @@ -174,12 +326,19 @@ bool Resources::LoadFont(const std::string &fontName, bool withFallback) return false; } - if (withFallback) { - for (auto &glyph : m_fontGlyphTable) { - glyph.second.SetFallback(true); - } + bool buildNameTable = (fontName == BRAVURA) ? true : false; + bool isFallback = ((fontName == BRAVURA) || (fontName == LEIPZIG)) ? true : false; + + m_loadedFonts.insert(std::pair(fontName, Resources::LoadedFont(fontName, isFallback))); + LoadedFont &font = m_loadedFonts.at(fontName); + + // For zip archive custom font also store the CSS + if (zipFile) { + font.SetCSSFont(zipFile->ReadTextFile(fontName + ".css")); } + GlyphTable &glyphTable = font.GetGlyphTableForModification(); + const int unitsPerEm = atoi(root.attribute("units-per-em").value()); for (pugi::xml_node current = root.child("g"); current; current = current.next_sibling("g")) { @@ -196,7 +355,17 @@ bool Resources::LoadFont(const std::string &fontName, bool withFallback) if (current.attribute("w")) width = current.attribute("w").as_float(); if (current.attribute("h")) height = current.attribute("h").as_float(); glyph.SetBoundingBox(x, y, width, height); - glyph.SetPath(Resources::GetPath() + "/" + fontName + "/" + c_attribute.value() + ".xml"); + + std::string glyphFilename = fontName + "/" + c_attribute.value() + ".xml"; + // Store the XML in the glyph for fonts loaded from zip files + if (zipFile) { + glyph.SetXML(zipFile->ReadTextFile(glyphFilename)); + } + // Otherwise only store the path + else { + glyph.SetPath(Resources::GetPath() + "/" + glyphFilename); + } + if (current.attribute("h-a-x")) glyph.SetHorizAdvX(current.attribute("h-a-x").as_float()); // load anchors @@ -211,12 +380,17 @@ bool Resources::LoadFont(const std::string &fontName, bool withFallback) } const char32_t smuflCode = (char32_t)strtol(c_attribute.value(), NULL, 16); - glyph.SetFallback(false); - m_fontGlyphTable[smuflCode] = glyph; - m_glyphNameTable[n_attribute.value()] = smuflCode; + glyphTable[smuflCode] = glyph; + if (buildNameTable) { + m_glyphNameTable[n_attribute.value()] = smuflCode; + } + } + + if (isFallback && glyphTable.size() < SMUFL_COUNT) { + LogError("Expected %d default SMuFL glyphs but could load only %d.", SMUFL_COUNT, glyphTable.size()); + return false; } - m_fontName = fontName; return true; } @@ -268,4 +442,18 @@ bool Resources::InitTextFont(const std::string &fontName, const StyleAttributes return true; } +std::string Resources::LoadedFont::GetCSSFont(const std::string &path) const +{ + if (!m_css.empty()) { + return m_css; + } + else { + const std::string cssFontPath = StringFormat("%s/%s.css", path.c_str(), m_name.c_str()); + std::ifstream fstream(cssFontPath); + std::stringstream sstream; + sstream << fstream.rdbuf(); + return sstream.str(); + } +} + } // namespace vrv diff --git a/src/svgdevicecontext.cpp b/src/svgdevicecontext.cpp index 4451b067d8c..1769f1f138d 100644 --- a/src/svgdevicecontext.cpp +++ b/src/svgdevicecontext.cpp @@ -84,6 +84,43 @@ bool SvgDeviceContext::CopyFileToStream(const std::string &filename, std::ostrea return true; } +SvgDeviceContext::GlyphRef::GlyphRef(const Glyph *glyph, int count, const std::string &postfix) : m_glyph(glyph) +{ + // Add the counter only when necessary (more than one font for that glyph) + if (count == 0) { + m_refId = StringFormat("%s-%s", glyph->GetCodeStr().c_str(), postfix.c_str()); + } + else { + m_refId = StringFormat("%s-%d-%s", glyph->GetCodeStr().c_str(), count, postfix.c_str()); + } +}; + +const std::string SvgDeviceContext::InsertGlyphRef(const Glyph *glyph) +{ + const std::string code = glyph->GetCodeStr(); + + // We have already used this glyph + if (m_smuflGlyphs.find(glyph) != m_smuflGlyphs.end()) { + return m_smuflGlyphs.at(glyph).GetRefId(); + } + + int count; + // This is the first time we have a glyph with this code + if (m_glyphCodeFontCounter.find(code) == m_glyphCodeFontCounter.end()) { + count = 0; + } + // We used it but with another font + else { + count = m_glyphCodeFontCounter[(code)]; + } + GlyphRef ref(glyph, count, m_glyphPostfixId); + const std::string id = ref.GetRefId(); + m_smuflGlyphs.insert(std::pair(glyph, ref)); + m_glyphCodeFontCounter[code] = count + 1; + + return id; +} + void SvgDeviceContext::IncludeTextFont(const std::string &fontname, const Resources *resources) { assert(resources); @@ -91,17 +128,7 @@ void SvgDeviceContext::IncludeTextFont(const std::string &fontname, const Resour std::string cssContent; if (m_smuflTextFont == SMUFLTEXTFONT_embedded) { - const std::string cssFontPath = StringFormat("%s/%s.css", resources->GetPath().c_str(), fontname.c_str()); - std::ifstream cssFontFile(cssFontPath); - if (!cssFontFile.is_open()) { - LogWarning("The CSS font for '%s' could not be loaded and will not be embedded in the SVG", - resources->GetCurrentFontName().c_str()); - } - else { - std::stringstream cssFontStream; - cssFontStream << cssFontFile.rdbuf(); - cssContent = cssFontStream.str(); - } + cssContent = resources->GetCSSFontFor(fontname); } else { std::string versionPath @@ -156,11 +183,11 @@ void SvgDeviceContext::Commit(bool xml_declaration) const Resources *resources = this->GetResources(true); // include the selected font if (m_vrvTextFont && resources) { - this->IncludeTextFont(resources->GetCurrentFontName(), resources); + this->IncludeTextFont(resources->GetCurrentFont(), resources); } - // include the Leipzig fallback font + // include the fallback font if (m_vrvTextFontFallback && resources) { - this->IncludeTextFont("Leipzig", resources); + this->IncludeTextFont(resources->GetFallbackFont(), resources); } } @@ -171,15 +198,13 @@ void SvgDeviceContext::Commit(bool xml_declaration) pugi::xml_document sourceDoc; // for each needed glyph - for (const Glyph *smuflGlyph : m_smuflGlyphs) { - // load the XML file that contains it as a pugi::xml_document - std::ifstream source(smuflGlyph->GetPath()); - sourceDoc.load(source); + for (const std::pair entry : m_smuflGlyphs) { + // load the XML as a pugi::xml_document + sourceDoc.load_string(entry.first->GetXML().c_str()); // copy all the nodes inside into the master document for (pugi::xml_node child = sourceDoc.first_child(); child; child = child.next_sibling()) { - std::string id = StringFormat("%s-%s", child.attribute("id").value(), m_glyphPostfixId.c_str()); - child.attribute("id").set_value(id.c_str()); + child.attribute("id").set_value(entry.second.GetRefId().c_str()); defs.append_copy(child); } } @@ -1020,12 +1045,11 @@ void SvgDeviceContext::DrawMusicText(const std::u32string &text, int x, int y, b } // Add the glyph to the array for the - m_smuflGlyphs.insert(glyph); + const std::string id = InsertGlyphRef(glyph); // Write the char in the SVG pugi::xml_node useChild = AddChild("use"); - useChild.append_attribute(hrefAttrib.c_str()) - = StringFormat("#%s-%s", glyph->GetCodeStr().c_str(), m_glyphPostfixId.c_str()).c_str(); + useChild.append_attribute(hrefAttrib.c_str()) = StringFormat("#%s", id.c_str()).c_str(); useChild.append_attribute("x") = x; useChild.append_attribute("y") = y; useChild.append_attribute("height") = StringFormat("%dpx", m_fontStack.top()->GetPointSize()).c_str(); diff --git a/src/toolkit.cpp b/src/toolkit.cpp index 4821605cf8b..3552ff2279f 100644 --- a/src/toolkit.cpp +++ b/src/toolkit.cpp @@ -21,6 +21,7 @@ #include "editortoolkit_cmn.h" #include "editortoolkit_mensural.h" #include "editortoolkit_neume.h" +#include "filereader.h" #include "findfunctor.h" #include "ioabc.h" #include "iodarms.h" @@ -48,10 +49,6 @@ #include "crc.h" #include "jsonxx.h" -#ifndef NO_MXL_SUPPORT -#include "zip_file.hpp" -#endif /* NO_MXL_SUPPORT */ - namespace vrv { const char *UTF_16_BE_BOM = "\xFE\xFF"; @@ -117,13 +114,26 @@ bool Toolkit::SetResourcePath(const std::string &path) { Resources &resources = m_doc.GetResourcesForModification(); resources.SetPath(path); - return resources.InitFonts(); + bool success = resources.InitFonts(); + if (m_options->m_fontAddCustom.IsSet()) { + success = success && resources.AddCustom(m_options->m_fontAddCustom.GetValue()); + } + if (m_options->m_font.IsSet()) { + success = success && this->SetFont(m_options->m_font.GetValue()); + } + if (m_options->m_fontFallback.IsSet()) { + success = success && resources.SetFallback(m_options->m_fontFallback.GetStrValue()); + } + if (m_options->m_fontLoadAll.IsSet()) { + success = success && resources.LoadAll(); + } + return success; } bool Toolkit::SetFont(const std::string &fontName) { Resources &resources = m_doc.GetResourcesForModification(); - const bool ok = resources.SetFont(fontName); + const bool ok = resources.SetCurrentFont(fontName, true); if (!ok) LogWarning("Font '%s' could not be loaded", fontName.c_str()); return ok; } @@ -423,26 +433,24 @@ bool Toolkit::LoadZipFile(const std::string &filename) bool Toolkit::LoadZipData(const std::vector &bytes) { #ifndef NO_MXL_SUPPORT - miniz_cpp::zip_file file(bytes); - - std::string filename; - // Look for the meta file in the zip - for (miniz_cpp::zip_info &member : file.infolist()) { - if (member.filename == "META-INF/container.xml") { - std::string container = file.read(member.filename); - // Find the file name with an xpath query - pugi::xml_document doc; - doc.load_buffer(container.c_str(), container.size()); - pugi::xml_node root = doc.first_child(); - pugi::xml_node rootfile = root.select_node("/container/rootfiles/rootfile").node(); - filename = rootfile.attribute("full-path").value(); - break; - } + ZipFileReader zipFileReader; + zipFileReader.Load(bytes); + + const std::string metaInf = "META-INF/container.xml"; + if (!zipFileReader.HasFile(metaInf)) { + LogError("No '%s' file to load found in the archive", metaInf.c_str()); + return false; } + std::string containerXml = zipFileReader.ReadTextFile("META-INF/container.xml"); + pugi::xml_document doc; + doc.load_buffer(containerXml.c_str(), containerXml.size()); + pugi::xml_node root = doc.first_child(); + pugi::xml_node rootfile = root.select_node("/container/rootfiles/rootfile").node(); + std::string filename = rootfile.attribute("full-path").value(); if (!filename.empty()) { LogInfo("Loading file '%s' in the archive", filename.c_str()); - return this->LoadData(file.read(filename)); + return this->LoadData(zipFileReader.ReadTextFile(filename)); } else { LogError("No file to load found in the archive"); @@ -1129,7 +1137,21 @@ bool Toolkit::SetOptions(const std::string &jsonOptions) m_options->Sync(); // Forcing font resource to be reset if the font is given in the options - if (json.has("font")) this->SetFont(m_options->m_font.GetValue()); + if (json.has("fontAddCustom")) { + Resources &resources = m_doc.GetResourcesForModification(); + resources.AddCustom(m_options->m_fontAddCustom.GetValue()); + } + if (json.has("font")) { + this->SetFont(m_options->m_font.GetValue()); + } + if (json.has("fontFallback")) { + Resources &resources = m_doc.GetResourcesForModification(); + resources.SetFallback(m_options->m_fontFallback.GetStrValue()); + } + if (json.has("fontLoadAll")) { + Resources &resources = m_doc.GetResourcesForModification(); + resources.LoadAll(); + } return true; } diff --git a/src/view_element.cpp b/src/view_element.cpp index 82ba0443207..88a2d28ec34 100644 --- a/src/view_element.cpp +++ b/src/view_element.cpp @@ -687,6 +687,13 @@ void View::DrawClef(DeviceContext *dc, LayerElement *element, Layer *layer, Staf dc->StartGraphic(element, "", element->GetID()); + std::string previousFont = ""; + if (clef->HasFontname()) { + Resources &resources = m_doc->GetResourcesForModification(); + previousFont = resources.GetCurrentFont(); + resources.SetCurrentFont(clef->GetFontname()); + } + this->DrawSmuflCode(dc, x, y, sym, staff->m_drawingStaffSize, false); if (m_doc->IsFacs() && element->HasFacs()) { @@ -705,6 +712,11 @@ void View::DrawClef(DeviceContext *dc, LayerElement *element, Layer *layer, Staf // Possibly draw enclosing brackets this->DrawClefEnclosing(dc, clef, staff, sym, x, y); + if (!previousFont.empty()) { + Resources &resources = m_doc->GetResourcesForModification(); + resources.SetCurrentFont(previousFont); + } + dc->EndGraphic(element, this); } @@ -1123,6 +1135,13 @@ void View::DrawMeterSig(DeviceContext *dc, MeterSig *meterSig, Staff *staff, int dc->StartGraphic(meterSig, "", meterSig->GetID()); + std::string previousFont; + if (meterSig->HasFontname()) { + Resources &resources = m_doc->GetResourcesForModification(); + previousFont = resources.GetCurrentFont(); + resources.SetCurrentFont(meterSig->GetFontname()); + } + int y = staff->GetDrawingY() - m_doc->GetDrawingUnit(staff->m_drawingStaffSize) * (staff->m_drawingLines - 1); int x = meterSig->GetDrawingX() + horizOffset; @@ -1133,7 +1152,7 @@ void View::DrawMeterSig(DeviceContext *dc, MeterSig *meterSig, Staff *staff, int x += m_doc->GetGlyphWidth(enclosingFront, glyphSize, false); } - if (meterSig->HasSym()) { + if (meterSig->HasSym() || meterSig->HasGlyphNum() || meterSig->HasGlyphName()) { const char32_t code = meterSig->GetSymbolGlyph(); this->DrawSmuflCode(dc, x, y, code, glyphSize, false); x += m_doc->GetGlyphWidth(code, glyphSize, false); @@ -1149,6 +1168,11 @@ void View::DrawMeterSig(DeviceContext *dc, MeterSig *meterSig, Staff *staff, int this->DrawSmuflCode(dc, x, y, enclosingBack, glyphSize, false); } + if (!previousFont.empty()) { + Resources &resources = m_doc->GetResourcesForModification(); + resources.SetCurrentFont(previousFont); + } + dc->EndGraphic(meterSig, this); } @@ -1792,7 +1816,7 @@ void View::DrawSyl(DeviceContext *dc, LayerElement *element, Layer *layer, Staff FontInfo vrvTxt; assert(dc->HasFont()); vrvTxt.SetPointSize(dc->GetFont()->GetPointSize() * m_doc->GetMusicToLyricFontSizeRatio()); - vrvTxt.SetFaceName(m_doc->GetOptions()->m_font.GetValue()); + vrvTxt.SetFaceName(m_doc->GetResources().GetCurrentFont()); std::u32string str; str.push_back(m_doc->GetOptions()->m_lyricElision.GetValue()); bool isFallbackNeeded = (m_doc->GetResources()).IsSmuflFallbackNeeded(str); diff --git a/src/view_graph.cpp b/src/view_graph.cpp index 76bf8ade512..8165042c2a0 100644 --- a/src/view_graph.cpp +++ b/src/view_graph.cpp @@ -276,6 +276,26 @@ void View::DrawEnclosingBrackets(DeviceContext *dc, int x, int y, int height, in horizontalThickness, verticalThickness); } +/* +void View::DrawSmuflCodeWithCustomFont(DeviceContext *dc, const std::string &customFont, int x, int y, char32_t code, + int staffSize, bool dimin, bool setBBGlyph) +{ + if (customFont.empty()) { + this->DrawSmuflCode(dc, x, y, code, staffSize, dimin, setBBGlyph); + return; + } + + Resources &resources = m_doc->GetResourcesForModification(); + const std::string prevFont = resources.GetCurrentFont(); + + resources.SetCurrentFont(customFont); + + DrawSmuflCode(dc, x, y, code, staffSize, dimin, setBBGlyph); + + resources.SetCurrentFont(prevFont); +} +*/ + void View::DrawSmuflCode(DeviceContext *dc, int x, int y, char32_t code, int staffSize, bool dimin, bool setBBGlyph) { assert(dc); diff --git a/src/view_text.cpp b/src/view_text.cpp index 2d2839dd935..ff281247add 100644 --- a/src/view_text.cpp +++ b/src/view_text.cpp @@ -123,7 +123,7 @@ void View::DrawDynamString(DeviceContext *dc, const std::u32string &str, TextDra std::u32string smuflStr = Dynam::GetSymbolStr(token.first, singleGlyphs); FontInfo vrvTxt; vrvTxt.SetPointSize(dc->GetFont()->GetPointSize() * m_doc->GetMusicToLyricFontSizeRatio()); - vrvTxt.SetFaceName(m_doc->GetOptions()->m_font.GetValue()); + vrvTxt.SetFaceName(m_doc->GetResources().GetCurrentFont()); bool isFallbackNeeded = (m_doc->GetResources()).IsSmuflFallbackNeeded(smuflStr); vrvTxt.SetSmuflWithFallback(isFallbackNeeded); vrvTxt.SetStyle(FONTSTYLE_normal); @@ -197,7 +197,7 @@ void View::DrawHarmString(DeviceContext *dc, const std::u32string &str, TextDraw FontInfo vrvTxt; vrvTxt.SetPointSize(dc->GetFont()->GetPointSize() * m_doc->GetMusicToLyricFontSizeRatio()); - vrvTxt.SetFaceName(m_doc->GetOptions()->m_font.GetValue()); + vrvTxt.SetFaceName(m_doc->GetResources().GetCurrentFont()); bool isFallbackNeeded = (m_doc->GetResources()).IsSmuflFallbackNeeded(smuflAccid); vrvTxt.SetSmuflWithFallback(isFallbackNeeded); dc->SetFont(&vrvTxt); @@ -292,7 +292,7 @@ void View::DrawLyricString( FontInfo vrvTxt; vrvTxt.SetPointSize(dc->GetFont()->GetPointSize() * m_doc->GetMusicToLyricFontSizeRatio()); - vrvTxt.SetFaceName(m_doc->GetOptions()->m_font.GetValue()); + vrvTxt.SetFaceName(m_doc->GetResources().GetCurrentFont()); std::u32string elision; elision.push_back(m_doc->GetOptions()->m_lyricElision.GetValue()); bool isFallbackNeeded = (m_doc->GetResources()).IsSmuflFallbackNeeded(elision); @@ -407,7 +407,7 @@ void View::DrawRend(DeviceContext *dc, Rend *rend, TextDrawingParams ¶ms) // Because we do not have the string at this stage we rely only on the selected font // This means fallback will not work for missing glyphs within rendFont.SetSmuflWithFallback(false); - rendFont.SetFaceName(m_doc->GetOptions()->m_font.GetValue()); + rendFont.SetFaceName(m_doc->GetResources().GetCurrentFont()); int pointSize = (rendFont.GetPointSize() != 0) ? rendFont.GetPointSize() : params.m_pointSize; rendFont.SetPointSize(pointSize * m_doc->GetMusicToLyricFontSizeRatio()); customFont = true; @@ -619,7 +619,7 @@ void View::DrawSymbol(DeviceContext *dc, Symbol *symbol, TextDrawingParams ¶ if (symbol->HasGlyphAuth() && symbol->GetGlyphAuth() == "smufl") { bool isFallbackNeeded = (m_doc->GetResources()).IsSmuflFallbackNeeded(str); symbolFont.SetSmuflWithFallback(isFallbackNeeded); - symbolFont.SetFaceName(m_doc->GetOptions()->m_font.GetValue()); + symbolFont.SetFaceName(m_doc->GetResources().GetCurrentFont()); int pointSize = (symbolFont.GetPointSize() != 0) ? symbolFont.GetPointSize() : params.m_pointSize; symbolFont.SetPointSize(pointSize * m_doc->GetMusicToLyricFontSizeRatio()); } diff --git a/tools/main.cpp b/tools/main.cpp index ab9593f207f..d30a41fca43 100644 --- a/tools/main.cpp +++ b/tools/main.cpp @@ -293,12 +293,6 @@ int main(int argc, char **argv) exit(1); } - // Load a specified font - if (!toolkit.SetOptions(vrv::StringFormat("{\"font\": \"%s\" }", options->m_font.GetValue().c_str()))) { - std::cerr << "Font '" << options->m_font.GetValue() << "' could not be loaded." << std::endl; - exit(1); - } - const std::vector outformats = { "mei", "mei-basic", "mei-pb", "mei-facs", "svg", "midi", "timemap", "expansionmap", "humdrum", "hum", "pae" }; if (std::find(outformats.begin(), outformats.end(), outformat) == outformats.end()) {