From f408b8004af61a03243589913fce34544f54d3ab Mon Sep 17 00:00:00 2001 From: Sebastian Hugentobler Date: Thu, 29 Dec 2016 15:27:39 +0100 Subject: [PATCH] initial commit --- .editorconfig | 12 ++ .gitignore | 10 ++ lib/lyluatex.lua | 184 ++++++++++++++++++++++ lib/lyluatex.sty | 71 +++++++++ src/lyrics/bierlein_rinn.tex | 29 ++++ src/lyrics/ergo_bibamus.tex | 22 +++ src/lyrics/gaudeamus_igitur.tex | 38 +++++ src/lyrics/in_jedem_vollen_glase_wein.tex | 10 ++ src/lyrics/lindenwirtin.tex | 25 +++ src/lyrics/viel_volle_becher.tex | 16 ++ src/scores/bierlein_rinn.ly | 92 +++++++++++ src/scores/ergo_bibamus.ly | 100 ++++++++++++ src/scores/gaudeamus_igitur.ly | 82 ++++++++++ src/scores/in_jedem_vollen_glase_wein.ly | 82 ++++++++++ src/scores/lindenwirtin.ly | 88 +++++++++++ src/scores/viel_volle_becher.ly | 91 +++++++++++ src/templates/book.j2 | 75 +++++++++ src/templates/score_lyrics.j2 | 20 +++ src/tools/templater.py | 23 +++ waf | 170 ++++++++++++++++++++ wscript | 178 +++++++++++++++++++++ 21 files changed, 1418 insertions(+) create mode 100644 .editorconfig create mode 100755 .gitignore create mode 100644 lib/lyluatex.lua create mode 100644 lib/lyluatex.sty create mode 100644 src/lyrics/bierlein_rinn.tex create mode 100644 src/lyrics/ergo_bibamus.tex create mode 100644 src/lyrics/gaudeamus_igitur.tex create mode 100644 src/lyrics/in_jedem_vollen_glase_wein.tex create mode 100644 src/lyrics/lindenwirtin.tex create mode 100644 src/lyrics/viel_volle_becher.tex create mode 100644 src/scores/bierlein_rinn.ly create mode 100644 src/scores/ergo_bibamus.ly create mode 100644 src/scores/gaudeamus_igitur.ly create mode 100644 src/scores/in_jedem_vollen_glase_wein.ly create mode 100644 src/scores/lindenwirtin.ly create mode 100644 src/scores/viel_volle_becher.ly create mode 100644 src/templates/book.j2 create mode 100644 src/templates/score_lyrics.j2 create mode 100755 src/tools/templater.py create mode 100755 waf create mode 100644 wscript diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..eae7250 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +root = true + +[*] +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +indent_style = space +indent_size = 4 + +[Makefile] +indent_style = tab diff --git a/.gitignore b/.gitignore new file mode 100755 index 0000000..d69aabb --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +*~ +.DS_Store +*.swp +*.lock* +*.waf* +out +pdf +midi +music +build diff --git a/lib/lyluatex.lua b/lib/lyluatex.lua new file mode 100644 index 0000000..1cea106 --- /dev/null +++ b/lib/lyluatex.lua @@ -0,0 +1,184 @@ +local err, warn, info, log = luatexbase.provides_module({ + name = "lyluatex", + version = '0', + greinternalversion = internalversion, + date = "2016/09/08", + description = "Module lyluatex.", + author = "The Gregorio Project (see CONTRIBUTORS.md)", + copyright = "2008-2016 - The Gregorio Project", + license = "MIT", +}) + +local md5 = require 'md5' + +LILYPOND = 'lilypond' +TMP = (os.getenv('TMP_LY') and os.getenv('TMP_LY') or 'tmp_ly') +N = 0 + + +function ly_definir_programme(lilypond) + if lilypond then LILYPOND = lilypond end +end + + +function contenuIntegral(contenu) + local content ="" + for i, Line in ipairs(contenu:explode('\n')) do + if Line:find("^%s*[^%%]*\\include") then + local i = io.open(Line:gsub('%s*\\include%s*"(.*)"%s*$', "%1"), 'r') + if i then + content = content .. contenuIntegral(i:read('*a')) + else + content = content .. Line .. "\n" + end + else + content = content .. Line .. "\n" + end + end + return content +end + + +function direct_ly(ly, largeur, facteur) + N = N + 1 + facteur = calcul_facteur(facteur) + ly = ly:gsub('\\par ', '\n') + local sortie = TMP..'/'..string.gsub(md5.sumhexa(contenuIntegral(ly))..'-'..facteur..'-'..largeur, '%.', '-') + if not lfs.isfile(sortie..'-systems.tex') then + compiler_ly(entete_lilypond(facteur, largeur - 10)..'\n'..ly, sortie) + end + retour_tex(sortie) +end + + +function inclure_ly(entree, currfiledir, largeur, facteur) + facteur = calcul_facteur(facteur) + nom = splitext(entree, 'ly') + entree = currfiledir..nom..'.ly' + if not lfs.isfile(entree) then entree = kpse.find_file(nom..'.ly') end + if not lfs.isfile(entree) then err("Le fichier %s.ly n'existe pas.", nom) end + local i = io.open(entree, 'r') + ly = i:read('*a') + i:close() + local sortie = TMP..'/' ..string.gsub(md5.sumhexa(contenuIntegral(ly))..'-'..facteur..'-'..largeur, '%.', '-') + if not lfs.isfile(sortie..'-systems.tex') then + compiler_ly(entete_lilypond(facteur, largeur - 10)..'\n'..ly, sortie, dirname(entree)) + end + retour_tex(sortie) +end + + +function compiler_ly(ly, sortie, include) + mkdirs(dirname(sortie)) + local commande = LILYPOND.." ".. + "-dno-point-and-click ".. + "-dbackend=eps ".. + "-djob-count=2 ".. + "-ddelete-intermediate-files " + if include then commande = commande.."-I "..lfs.currentdir()..'/'..include.." " end + commande = commande.."-o "..sortie.." -" + local p = io.popen(commande, 'w') + p:write(ly) + p:close() +end + + +function entete_lilypond(facteur, largeur) + return string.format( +[[%%En-tête +\version "2.18.2" +#(define default-toplevel-book-handler + print-book-with-defaults-as-systems ) + +#(define toplevel-book-handler + (lambda ( . rest) + (set! output-empty-score-list #f) + (apply print-book-with-defaults rest))) + +#(define toplevel-music-handler + (lambda ( . rest) + (apply collect-music-for-book rest))) + +#(define toplevel-score-handler + (lambda ( . rest) + (apply collect-scores-for-book rest))) + +#(define toplevel-text-handler + (lambda ( . rest) + (apply collect-scores-for-book rest))) + + +#(set-global-staff-size %s) + + +%%Paramètres de la partition +\paper{ + indent = 0\mm + line-width = %s\pt +} + +%%Partition originale +]], +facteur, +largeur +) +end + + +function calcul_facteur(facteur) + if facteur == 0 then facteur = fontinfo(font.current()).size/39321.6 end + return facteur +end + + +function retour_tex(sortie) + local i = io.open(sortie..'-systems.tex', 'r') + contenu = i:read("*all") + i:close() + texoutput, _ = string.gsub( + contenu, + [[includegraphics{]], [[includegraphics{]]..dirname(sortie) + ) + tex.print(([[\noindent]]..texoutput):explode('\n')) +end + + +function dirname(str) + if str:match(".-/.-") then + local name = string.gsub(str, "(.*/)(.*)", "%1") + return name + else + return '' + end +end + + +function splitext(str, ext) + if str:match(".-%..-") then + local name = string.gsub(str, "(.*)(%." .. ext .. ")", "%1") + return name + else + return str + end +end + + +function mkdirs(str) + path = '.' + for dir in string.gmatch(str, '([^%/]+)') do + path = path .. '/' .. dir + lfs.mkdir(path) + end +end + + +local fontdata = fonts.hashes.identifiers +function fontinfo(id) + local f = fontdata[id] + if f then + return f + end + return font.fonts[id] +end + +mkdirs(TMP) diff --git a/lib/lyluatex.sty b/lib/lyluatex.sty new file mode 100644 index 0000000..47b715b --- /dev/null +++ b/lib/lyluatex.sty @@ -0,0 +1,71 @@ +\ProvidesPackage{lyluatex} + +% Dépendances +\RequirePackage{luatexbase} +\RequirePackage{luaotfload} +\RequirePackage{kvoptions} +\RequirePackage{graphicx} +\RequirePackage{keycommand} +\RequirePackage{environ} +\RequirePackage{currfile} +% Options +\DeclareStringOption[lilypond]{program}[lilypond] +\ProcessKeyvalOptions* +% Script lua +\directlua{dofile(kpse.find_file("lyluatex.lua"))} +\directlua{LILYPOND = '\lyluatex@program'} + +% Une tricherie un peu sale pour récupérer la largeur de ligne +\let\bs\textbackslash +{\catcode`p=12 \catcode`t=12 \gdef\un#1pt{#1}} +\newcommand*{\largeur}{\expandafter\un\the\linewidth} +% Taille des partitions +% Si la valeur est 0, elle sera automatiquement calculée +% à partir de la taille de police. +\def\staffsize{0} +\let\localstaffsize\staffsize + + +% Commandes principales +% Inclusion d'un fichier ly +\newkeycommand*\includely[staffsize=\staffsize][autres][1]{% +\directlua{% + inclure_ly( + "\luatexluaescapestring{#1}", + "\luatexluaescapestring{\currfiledir}", + \luatexluaescapestring{\largeur}, + \luatexluaescapestring{\commandkey{staffsize}} + )% +}% +} + +% Inclusion d'un fragment intégré au document (environnement de base) +\NewEnviron{compilerly}{% +\directlua{% + direct_ly( + "\luatexluaescapestring{\unexpanded\expandafter{\BODY}}", + \luatexluaescapestring{\largeur}, + \luatexluaescapestring{\localstaffsize} + )% +}% +} + +% Commande et environnement avec paramètres +\newkeycommand{\lily}[staffsize=\staffsize][autres][1]{% +\def\localstaffsize{\commandkey{staffsize}}% +\begin{compilerly}% +#1 +\end{compilerly}% +} + +\newkeyenvironment{ly}[staffsize=\staffsize][autres]{% +\def\localstaffsize{\commandkey{staffsize}}% +\compilerly% +}{ +\endcompilerly% +} + +% Commandes pour la compatibilité avec lilypond-book +\let\lilypondfile\includely +\let\lilypond\ly +\let\endlilypond\endly diff --git a/src/lyrics/bierlein_rinn.tex b/src/lyrics/bierlein_rinn.tex new file mode 100644 index 0000000..97a502d --- /dev/null +++ b/src/lyrics/bierlein_rinn.tex @@ -0,0 +1,29 @@ +\par +2. Beim Rosenwirt im Stübel drin, da sitzt ein junges Blut, +die schmucke, schlanke Kellnerin war ihm noch gestern gut. +Doch heute ist sie durchgebrannt fahr wohl du falsche Hex! +Der Bursch kehrt sein Gesicht zur Wand und summt um halber sechs: +|: "Bierlein rinn! Bierlein rinn! Bierlein rinn! Bierlein rinn! Was nutzen mir die Kreuzerlein, wenn ich gestorben bin!" :| +\par +3. Beim Rosenwirt am Eichentisch, da thront ein braver Greis, +die Wangen rot, die Augen frisch, die Haare silberweiss! +Schlug ihm gleich manchen grossen Plan das Schicksal schnöd entzwei --- +um halber sechs schlächt auch wer an, der alte brummt dabei: +"Bierlein rinn! ..." +\par +4. +Beim Rosenwirt am Grabentor, da blüht ein fein Gewächs, +das heben wir im Glas empor schon abends um halb sechs. +Wir heben es gar emsig hoch, wir leeren's auf den Grund --- +um Mitternacht da klingt es noch, schallt's noch von Mund zu Mund: +"Bierlein rinn! ..." +\par +5. Und schlägt mir einst der Sensenmann den Nagel auf die Truh, +rast ich von harter Lebensbahn in kühler Grabesruh, +dann schwingt bekränzt den Becher mir, dem müden Wandersmann, +der euch gelehrt den Spruch zum Bier, und hebet also an: +"Bierlein rinn! ..." +\\~ +\begin{flushright} +Julius Rudolf Gspandl +\end{flushright} diff --git a/src/lyrics/ergo_bibamus.tex b/src/lyrics/ergo_bibamus.tex new file mode 100644 index 0000000..d899413 --- /dev/null +++ b/src/lyrics/ergo_bibamus.tex @@ -0,0 +1,22 @@ +\par +2. Mich ruft mein Geschick von den Freunden hinweg: +ihr Redlichen ergo bibamus! +Ich scheide von hinnen mit leichtem Gepäck, +drum doppeltes: ergo bibamus! +Und was auch der Filz von dem Leibe sich schmort, +so bleibt für den Heitern doch immer gesorgt, +weil immer dem Frohen der Fröhliche sorgt; +|: drum, Brüderchen: ergo bibamus! :| +\par +3. Was sollen wir sagen zum heutigen Tag? +Ich dächte nur: ergo bibamus! +Er ist nun einmal von besonderem Schlag, +drum immer aufs neue: bibamus! +Er führet die Freude durchs offene Tor, +es glänzen die Wolken, es teilt sich der Flor, +da scheint uns ein Bildchen, ein göttliches, vor, +|: wir klingen und singen: bibamus! :| +\\~ +\begin{flushright} +Goethe, 1810 +\end{flushright} diff --git a/src/lyrics/gaudeamus_igitur.tex b/src/lyrics/gaudeamus_igitur.tex new file mode 100644 index 0000000..d337a3b --- /dev/null +++ b/src/lyrics/gaudeamus_igitur.tex @@ -0,0 +1,38 @@ +\par +2. Ubi sunt, qui ante nod in munod luere? +Vadite ad superos, transite ad inferos, +|: ubi iam luere. :| +\par +3. Vita nostra brevis est, +brevi finietur, +venit mors velociter, +rapit nos atrociter, +nemini parcetur. +\par +4. Vivat academia, +vivant professores, +vivat membrum quodlibet, +vivant membra quaelibet, +semper sint in flore! +\par +5. Vivat omnes virgines +faciles, formosae, +vivant et mulieres, +tenerae, amabiles, +bonae, laboriosae! +\par +6. Vivat et res publica +et qui illam regit, +vivat nostra civitas, +maecenatum caritas, +quae nos hic protegit! +\par +7. Pereat tristitia, +pereant osores, +pereat diabolus, +quivis antiburschius, +atque irrisores! +\\~ +\begin{flushright} +Neuere Fassung von Kindleben, 1781 +\end{flushright} diff --git a/src/lyrics/in_jedem_vollen_glase_wein.tex b/src/lyrics/in_jedem_vollen_glase_wein.tex new file mode 100644 index 0000000..7697c80 --- /dev/null +++ b/src/lyrics/in_jedem_vollen_glase_wein.tex @@ -0,0 +1,10 @@ +\par +2. Da trink ich schnell und warte nicht und küsse dich im Wein, +|: aufs neu zu schaun dein Angesicht, :|: schenk schnell ich wieder ein! :| +\par +3. So füll und leer mein Gläschen ich und trinke immerzu. +|: Nennt man mich nächstens liederlich, :|: die Schuld mein Schatz hast du! :| +\\~ +\begin{flushright} +Rudolf Hermanns +\end{flushright} diff --git a/src/lyrics/lindenwirtin.tex b/src/lyrics/lindenwirtin.tex new file mode 100644 index 0000000..34ea9f3 --- /dev/null +++ b/src/lyrics/lindenwirtin.tex @@ -0,0 +1,25 @@ +\par +2. "Angekreidet wird hier nicht, weils an Kreide uns gebricht," +lacht die Wirtin heiter. +"Hast du keinen Heller mehr, gib zum Pfand dein Ränzel her, |: aber trinke weiter! :|" +\par +3. Tauscht der Bursch sein Ränzel ein, +gegen einen Krug voll Wein, +tät zum Gehn sich wenden. +Spricht die Wirtin: "Junges Blut, hast ja Mantel, Stab und Hut: |: trink und lass dich pfänden! :|" +\par +4. Da vertrank der Wanderknab Mantel, Hut und Wanderstab, sprach betrübt: +"Ich scheide. Fahre wohl du kühler Trank, Lindenwirtin jung und schlank, |: liebliche Augenweide! :|" +\par +5. Spricht zu ihm das schöne Weib: "Hast ja noch ein Herz im Leib, lass mir's trauter Wandrer!" +Was geschah ich tu's euch kund: auf der Wirtin rotem Mund |: brannte heiss ein andrer. :| +\par +6. Der dies neue Lied erdacht, +sang's in einer Sommernacht lustig in die Winde, +vor ihm stund ein volles Glas, +neben ihm Frau Wirtin sass +|: unter der blühenden Linde :| +\\~ +\begin{flushright} +Rudolf Baumbach, 1876 +\end{flushright} diff --git a/src/lyrics/viel_volle_becher.tex b/src/lyrics/viel_volle_becher.tex new file mode 100644 index 0000000..2843421 --- /dev/null +++ b/src/lyrics/viel_volle_becher.tex @@ -0,0 +1,16 @@ +\par +2. Noch klingen Lied und Becher, +doch sitzen andre Zecher, +|: wir selbst in diesem Raum, :| +und lassen's uns behagen nach gut und bösen Tagen, +|: doch alles ist ein Traum. :| +\par +3. Nicht lang, so füllen wieder bei Becherklang und Lieder, +ganz andre diesen Raum, +und treiben was wir trieben, +und singen, trinken, lieben, +bis alles wird ein Traum. +\\~ +\begin{flushright} +Johann Nepomuk Vogl, vor 1852 +\end{flushright} diff --git a/src/scores/bierlein_rinn.ly b/src/scores/bierlein_rinn.ly new file mode 100644 index 0000000..48c2097 --- /dev/null +++ b/src/scores/bierlein_rinn.ly @@ -0,0 +1,92 @@ +\version "2.18.2" +\include "articulate.ly" + +\header { + title = "Bierlein, rinn!" + composer = "Otto Lob, 1896" + poet = "Gemütlich" + tagline = "" +} + +musicOne = \relative d' { + \time 4/4 + \key g \major + + \partial 8 d8 | + g8. fis16 g8 d fis fis fis b, | + e8. dis16 e8 c d4 r8 d | + d c' c d, d b' b g | + fis a g e d4 r8 d\p | + d8. e16 fis8 g a gis a fis | + fis8.^"zögernd" g16 a8\< b\! c4\fermata r8 d,^"im Zeitmass" | + b'8. ais16 b8 d a gis a c | + b g a fis g4 d'8.\fermata c16 | + \repeat volta 2 + { + b4 d,8. d16 d4 c'8.-> b16 | + a4 d,8. d16 d4 r8 d\p | + g8. a16 b8 c d8. e16 d8 c | + b^"zögernd" g a fis g4 r8 s | + } + \alternative + { + { d'8.\fermata c16 | } + { r2 r4 | } + } +} + +verseOne = \lyricmode { + Beim Ro -- sen -- wirt am Gra -- ben -- tor des | + Ab -- ends um halb sechs den | + Ham -- mer schwingt der Wirt em -- por und | + schlägt den Zap -- fen ex! Das | + schlurrt und glurrt aus feuch -- ter Nacht vom | + Spund -- loch in die Kann'; ei | + seht, wie's Ant -- litz je -- dem lacht, jed -- | + we -- dem Ze -- chers -- mann: Bier -- lein, | + rinn! Bier -- lein rinn! Bier -- lein | + rinn! Bier -- lein rinn! Was | + nut -- zen mir die Keu -- zer -- lein, wenn | + ich ge -- stor -- ben bin! | + Bier -- lein | +} + +\book { + \score { + << + \new Voice = "one" { + \musicOne + } + \new Lyrics \lyricsto "one" { + \verseOne + } + >> + \layout { + } + } +} + +\book { + \bookOutputName "bierlein_rinn_score" + \score { + << + \new Voice = "one" { + \musicOne + } + >> + \layout { + } + } + + \score { + \unfoldRepeats \articulate + << + \new Voice = "one" { + \musicOne + } + >> + \midi { + \tempo 4 = 110 + } + } +} diff --git a/src/scores/ergo_bibamus.ly b/src/scores/ergo_bibamus.ly new file mode 100644 index 0000000..d90a922 --- /dev/null +++ b/src/scores/ergo_bibamus.ly @@ -0,0 +1,100 @@ +\version "2.18.2" +\include "articulate.ly" + +\header { + title = "Ergo Bibamus!" + composer = "Max Eberwein, 1813" + tagline = "" +} + +musicOne = \relative f' { + \time 4/4 + \key g \minor + \partial 8 f8\f + \repeat volta 2 { + f4 d8 es f4 g8 a | + bes4 a8 g f4 r8 f | + a4 g8 a bes4 a8 g | + f4 (e) f r8 f | + } + + c'4 c8 bes a4 (a8) g | + f4 f8 es d4 r8 f | + c'4 c8 bes a4 a8 g | + f4 f8 es d4 r8 f | + f4 g8 a bes4 a8 bes | + c4 bes8 c d4 r8 d | + d4 c8 d es4 d8 c | + bes4 (c) d r8 d \ff | + d4 c8 d f (es) d c | + bes2 (a) | + bes\fermata r4 r8 \bar "|." +} + +verseOne = \lyricmode { + Hier sind wir ver -- sam -- melt zu | + löb -- li -- chem Run, drum, | + Brü -- der -- chen, er -- go bi -- | + ba -- mus! (Das) | + heisst noch ein altes, ein | + tüch -- ti -- ges Wort, es | + pas -- set zum er -- sten und | + pas -- set so -- fort und | + schal -- let, ein E -- cho, vom | + fest -- li -- chen Ort, ein | + herr -- li -- ches: er -- go bi -- | + ba -- mus! ein | + herr -- li -- ches: er -- go bi -- | + ba -- | + mus! | +} + +verseOneRepeat = \lyricmode { + Die Glä -- ser sie klin -- gen, Ge -- | + sprä -- che sie ruhn; be -- | + her -- zi -- get: er -- go bi -- | + ba -- mus! _ | +} + +\book { + \score { + << + \new Voice = "one" { + \musicOne + } + \new Lyrics \lyricsto "one" { + \verseOne + } + \new Lyrics \lyricsto "one" { + \verseOneRepeat + } + >> + \layout { + } + } +} + +\book { + \bookOutputName "ergo_bibamus_score" + \score { + << + \new Voice = "one" { + \musicOne + } + >> + \layout { + } + } + + \score { + \unfoldRepeats \articulate + << + \new Voice = "one" { + \musicOne + } + >> + \midi { + \tempo 4 = 120 + } + } +} diff --git a/src/scores/gaudeamus_igitur.ly b/src/scores/gaudeamus_igitur.ly new file mode 100644 index 0000000..47bc606 --- /dev/null +++ b/src/scores/gaudeamus_igitur.ly @@ -0,0 +1,82 @@ +\version "2.18.2" +\include "articulate.ly" + +\header { + title = "Gaudeamus Igitur" + poet = "Frisch" + tagline = "" +} + +musicOne = \relative b' { + \time 3/4 + \key g \minor + \repeat volta 2 { + bes8. \f f16 f4 bes | + g8. g16 g2 | + a8. bes16 c4 a | + bes8 (d) bes4 r | + a8. bes16 c4 c | + d8 bes c4 c | + a8. bes16 c4 c | + d8 bes c4 c | + bes8. a16 g8 (es') d (c) | + d4 (c) bes\fermata | + bes8. a16 g8 (es') d (c) | + f4 (a,) bes\fermata | + } +} + +verseOne = \lyricmode { + Gau -- de -- a -- mus | + i -- gi -- tur, | + iu -- ve -- nes dum | + su -- mus; | + post iu -- cum -- dam | + iu -- ven -- tu -- tem, | + post mo -- le -- stam | + se -- nec -- tu -- tem | + nos ha -- be -- bit | + hu -- mus, | + nos ha -- be -- bit | + hu -- mus! | +} + +\book { + \score { + << + \new Voice = "one" { + \musicOne + } + \new Lyrics \lyricsto "one" { + \verseOne + } + >> + \layout { + } + } +} + +\book { + \bookOutputName "gaudeamus_igitur_score" + \score { + << + \new Voice = "one" { + \musicOne + } + >> + \layout { + } + } + + \score { + \unfoldRepeats \articulate + << + \new Voice = "one" { + \musicOne + } + >> + \midi { + \tempo 4 = 100 + } + } +} diff --git a/src/scores/in_jedem_vollen_glase_wein.ly b/src/scores/in_jedem_vollen_glase_wein.ly new file mode 100644 index 0000000..8a7afb9 --- /dev/null +++ b/src/scores/in_jedem_vollen_glase_wein.ly @@ -0,0 +1,82 @@ +\version "2.18.2" +\include "articulate.ly" + +\header { + title = "In jedem vollen Glase Wein" + composer = "Otto Lob, 1896" + poet = "Mit Ausdruck" + tagline = "" +} + +musicOne = \relative d' { + \time 6/8 + \key g \major + \partial 8 d8 | + b (d) g b4-^ a8 | + g4 e8 d4 d8^"zart" | + a'4 gis8 a4 c,8 | + e4. (d8) r d | + g4 g8 g (fis) e8 | + fis4 b,8 b4 b8 | + b'4 b8 b (a) g | + a4 d,8 d4 d8 | + b8 (d) g b-^ (c-^) d-^ | + d4.\> (e,8\fermata\!) r c'^"langsamer" | + b8 (d,) b' a\< (d\fermata) fis,\!\> | + g4. (g8\!) r \bar "|." +} + +verseOne = \lyricmode { + In je -- dem vol -- len | + Gla -- se Wein seh | + un -- ten auf dem | + Grund ich | + dei -- ne hel -- len | + Äu -- ge -- lein, ich | + dei -- ne hel -- len | + Äu -- ge -- lein und | + dei -- nen sü -- ssen | + Mund, und | + dei -- nen sü -- ssen | + Mund. | +} + +\book { + \score { + << + \new Voice = "one" { + \musicOne + } + \new Lyrics \lyricsto "one" { + \verseOne + } + >> + \layout { + } + } +} + +\book { + \bookOutputName "in_jedem_vollen_glase_wein_score" + \score { + << + \new Voice = "one" { + \musicOne + } + >> + \layout { + } + } + + \score { + \unfoldRepeats \articulate + << + \new Voice = "one" { + \musicOne + } + >> + \midi { + \tempo 4 = 100 + } + } +} diff --git a/src/scores/lindenwirtin.ly b/src/scores/lindenwirtin.ly new file mode 100644 index 0000000..77deba2 --- /dev/null +++ b/src/scores/lindenwirtin.ly @@ -0,0 +1,88 @@ +\version "2.18.2" +\include "articulate.ly" + +\header { + title = "Die Lindenwirtin" + composer = "Franz Abt, 1878" + poet = "In gemütlicher Bewegung" + tagline = "" +} + +musicOne = \relative a' { + \time 6/8 + \key d \major + + a4\mf a8 a8. (g16) fis8 | + b4 b8 b4. | + b4 b8 d8. (g,16) b8 | + b4 a8 a4. | + a4\< e8 e (a) cis\! | + b4.\> a4\! r8 | + g4\p g8 g8. (fis16) e8 | + fis4\< a8 d4.\! | + g,4\p\< g8 g8. (fis16) e8\! | + fis4 a8 d4. | + d4\f cis8 e8. (d16) b 8 | + b4. a4 r8 | + a4\p a8 b8. (a16) fis8 | + a4. (cis) | + d4 r8 r4 r8 \bar "|." +} + +verseOne = \lyricmode { + Kei -- nen Tropfen im | + Be -- cher mehr | + und der Beu -- tel | + schlaff und leer, | + lech -- zend Herz und | + Zun -- ge. | + An -- ge -- tan hat | + mir's dein Wein, | + dei -- ner Äug -- lein | + hel -- ler Schein, | + Lin -- den -- wirtin, du | + jun -- ge | + Lin -- den -- wirtin, du | + jun -- | + ge! | +} + +\book { + \score { + << + \new Voice = "one" { + \musicOne + } + \new Lyrics \lyricsto "one" { + \verseOne + } + >> + \layout { + } + } +} + +\book { + \bookOutputName "lindenwirtin_score" + \score { + << + \new Voice = "one" { + \musicOne + } + >> + \layout { + } + } + + \score { + \unfoldRepeats \articulate + << + \new Voice = "one" { + \musicOne + } + >> + \midi { + \tempo 4 = 100 + } + } +} diff --git a/src/scores/viel_volle_becher.ly b/src/scores/viel_volle_becher.ly new file mode 100644 index 0000000..e3e19c0 --- /dev/null +++ b/src/scores/viel_volle_becher.ly @@ -0,0 +1,91 @@ +\version "2.18.2" +\include "articulate.ly" + +\header { + title = "Viel volle Becher" + composer = "Otto Lob, 1896" + poet = "Langsam" + tagline = "" +} + +musicOne = \relative es' { + \time 6/8 + \key f \minor + + \partial 8 es8 \mf | + aes4 aes8 c (bes) aes | + g4. f4 f8 | + bes4 bes8 des (c) bes | + aes4. g4 bes8 | + bes4 bes8 bes c d | + es4. (g,4) g8 | + f4^"zögernd" f8 aes4 g8 | + es4. (es8) r es^"im Zeitmass" | + bes'4 bes8 des (c) bes | + aes4. es4 es8 | + c'4 c8 es (des) c | + c4. bes4 bes8 | + bes4 des8 c4 bes8^"zögernd" | + es4. (es,4\fermata) es8\p^"verhallend" | + f4 g8 c4 bes8 | + aes4. (aes8) r4 \bar "|." +} + +verseOne = \lyricmode { + Viel vol -- le Be -- cher | + klan -- gen, viel | + hel -- le Stim -- men | + san -- gen vor | + uns in die -- _ sem | + Raum, vor | + uns in die -- sem | + Raum. Doch | + Klang und Sang ver -- | + hall -- ten, ver -- | + weht sind die Ge -- | + stal -- ten, und | + al -- les war ein | + Traum! Und | + al -- les war ein | + Traum! | +} + +\book { + \score { + << + \new Voice = "one" { + \musicOne + } + \new Lyrics \lyricsto "one" { + \verseOne + } + >> + \layout { + } + } +} + +\book { + \bookOutputName "viel_volle_becher_score" + \score { + << + \new Voice = "one" { + \musicOne + } + >> + \layout { + } + } + + \score { + \unfoldRepeats \articulate + << + \new Voice = "one" { + \musicOne + } + >> + \midi { + \tempo 4 = 100 + } + } +} diff --git a/src/templates/book.j2 b/src/templates/book.j2 new file mode 100644 index 0000000..874657c --- /dev/null +++ b/src/templates/book.j2 @@ -0,0 +1,75 @@ +% !Mode:: "TeX:UTF-8" + +\documentclass[9pt, a5paper, openany]{scrbook} + +\usepackage{fontspec} +\usepackage{lmodern} +\usepackage{fancyhdr} +\usepackage{geometry} +\usepackage{tgschola} +\usepackage{tocloft} +\usepackage[unicode]{hyperref} +\usepackage{lyluatex} + +\makeatletter +\newcommand{\unchapter}[1]{% + \begingroup + \let\@makechapterhead\@gobble % make \@makechapterhead do nothing + \chapter{#1} + \endgroup +} + +\makeatother + +\setlength{\headheight}{15pt} + +\pagestyle{fancy} +\renewcommand{\chaptermark}[1]{ \markboth{#1}{} } +\renewcommand{\sectionmark}[1]{ \markright{#1}{} } + +\fancyhf{} +\fancyhead[LE,RO]{\thepage} +\fancyhead[RE]{\textit{ \nouppercase{\leftmark}} } +\fancyhead[LO]{\textit{ \nouppercase{\rightmark}} } + +\fancypagestyle{plain}{ + \fancyhf{} + \fancyhead[LE,RO]{\thepage} + \fancyhead[RE]{\textit{ \nouppercase{Vivat Alcolica!}} } + \fancyhead[LO]{\textit{ \nouppercase{Vivat Alcolica!}} } +} + +\geometry{a5paper,left=20mm,right=20mm, top=3cm, bottom=3cm} + +\renewcommand\addchaptertocentry[2]{\addtocentrydefault{chapter}{}{#2}} +\renewcommand{\contentsname}{Inhalt} +\renewcommand{\cfttoctitlefont}{\huge\textbf\rmfamily} +\renewcommand{\cftchapfont}{\large\rmfamily} + +\begin{document} + \begin{titlepage} + \begin{center} + \rule{\linewidth}{0.5mm} \\[0.4cm] + { \huge \bfseries Vivat Alcolica!} + + \rule{\linewidth}{0.5mm} \\[1.5cm] + \end{center} + + \end{titlepage} + + \pagenumbering{Roman} + + \tableofcontents + + \newpage + + ((* for score in scores *)) + \unchapter{((( score.title )))} + + \includely[staffsize=14]{((( score.score )))} + ~\\ + ~\\ + \input{((( score.lyrics )))} + ((* endfor *)) + +\end{document} diff --git a/src/templates/score_lyrics.j2 b/src/templates/score_lyrics.j2 new file mode 100644 index 0000000..5464c30 --- /dev/null +++ b/src/templates/score_lyrics.j2 @@ -0,0 +1,20 @@ +% !Mode:: "TeX:UTF-8" + +\documentclass[9pt, a5paper, openany]{scrbook} + +\usepackage{fontspec} +\usepackage{lmodern} +\usepackage{fancyhdr} +\usepackage[unicode]{hyperref} +\usepackage{lyluatex} + +\begin{document} + +\pagenumbering{gobble} + +\includely[staffsize=18]{((( score_file )))} +~\\ +~\\ +\input{((( lyrics_file )))} + +\end{document} diff --git a/src/tools/templater.py b/src/tools/templater.py new file mode 100755 index 0000000..ff0b1cf --- /dev/null +++ b/src/tools/templater.py @@ -0,0 +1,23 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import ast +import os +import sys +from jinja2 import Environment, FileSystemLoader, Template + +template_dir = os.path.abspath(os.path.dirname(sys.argv[1])) +template_name = os.path.basename(sys.argv[1]) + +env = Environment(loader=FileSystemLoader(template_dir)) +env.block_start_string = '((*' +env.block_end_string = '*))' +env.variable_start_string = '(((' +env.variable_end_string = ')))' +env.comment_start_string = '((=' +env.comment_end_string = '=))' + +template = env.get_template(template_name) +rendered = template.render(ast.literal_eval(sys.argv[2])) + +print(rendered) diff --git a/waf b/waf new file mode 100755 index 0000000..90efc5c --- /dev/null +++ b/waf @@ -0,0 +1,170 @@ +#!/usr/bin/env python +# encoding: ISO8859-1 +# Thomas Nagy, 2005-2016 +# +""" +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +""" + +import os, sys, inspect + +VERSION="1.9.7" +REVISION="d27222240ebc8bcbca7fcd8f4ae914fb" +GIT="4095f1403a11e4138d720e650b435411e757ed70" +INSTALL='' +C1='#-' +C2='#+' +C3='#(' +cwd = os.getcwd() +join = os.path.join + + +WAF='waf' +def b(x): + return x +if sys.hexversion>0x300000f: + WAF='waf3' + def b(x): + return x.encode() + +def err(m): + print(('\033[91mError: %s\033[0m' % m)) + sys.exit(1) + +def unpack_wafdir(dir, src): + f = open(src,'rb') + c = 'corrupt archive (%d)' + while 1: + line = f.readline() + if not line: err('run waf-light from a folder containing waflib') + if line == b('#==>\n'): + txt = f.readline() + if not txt: err(c % 1) + if f.readline() != b('#<==\n'): err(c % 2) + break + if not txt: err(c % 3) + txt = txt[1:-1].replace(b(C1), b('\n')).replace(b(C2), b('\r')).replace(b(C3), b('\x00')) + + import shutil, tarfile + try: shutil.rmtree(dir) + except OSError: pass + try: + for x in ('Tools', 'extras'): + os.makedirs(join(dir, 'waflib', x)) + except OSError: + err("Cannot unpack waf lib into %s\nMove waf in a writable directory" % dir) + + os.chdir(dir) + tmp = 't.bz2' + t = open(tmp,'wb') + try: t.write(txt) + finally: t.close() + + try: + t = tarfile.open(tmp) + except: + try: + os.system('bunzip2 t.bz2') + t = tarfile.open('t') + tmp = 't' + except: + os.chdir(cwd) + try: shutil.rmtree(dir) + except OSError: pass + err("Waf cannot be unpacked, check that bzip2 support is present") + + try: + for x in t: t.extract(x) + finally: + t.close() + + for x in ('Tools', 'extras'): + os.chmod(join('waflib',x), 493) + + if sys.hexversion<0x300000f: + sys.path = [join(dir, 'waflib')] + sys.path + import fixpy2 + fixpy2.fixdir(dir) + + os.remove(tmp) + os.chdir(cwd) + + try: dir = unicode(dir, 'mbcs') + except: pass + try: + from ctypes import windll + windll.kernel32.SetFileAttributesW(dir, 2) + except: + pass + +def test(dir): + try: + os.stat(join(dir, 'waflib')) + return os.path.abspath(dir) + except OSError: + pass + +def find_lib(): + src = os.path.abspath(inspect.getfile(inspect.getmodule(err))) + base, name = os.path.split(src) + + #devs use $WAFDIR + w=test(os.environ.get('WAFDIR', '')) + if w: return w + + #waf-light + if name.endswith('waf-light'): + w = test(base) + if w: return w + err('waf-light requires waflib -> export WAFDIR=/folder') + + dirname = '%s-%s-%s' % (WAF, VERSION, REVISION) + for i in (INSTALL,'/usr','/usr/local','/opt'): + w = test(i + '/lib/' + dirname) + if w: return w + + #waf-local + dir = join(base, (sys.platform != 'win32' and '.' or '') + dirname) + w = test(dir) + if w: return w + + #unpack + unpack_wafdir(dir, src) + return dir + +wafdir = find_lib() +sys.path.insert(0, wafdir) + +if __name__ == '__main__': + + from waflib import Scripting + Scripting.waf_entry_point(cwd, VERSION, wafdir) + +#==> +#BZh91AY&SYL24@4#+#(E(a<7۹#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(u}w$2ћi^@#MFkcT/+2e5ǵNwoǾ>{vv{Vg[n3ٽ^ƻվWeӟ{=}1A{}`ǵ6=zz#(#(#( #(làimfemT4h=4#(z@#-uf٠U4"kYI#(#($Ppr>]ݹb==듽\қ:芎Q)ѵLs{>hogS۾W{|ےkmףKkݍ> #-vnuۯmwv;s=zvyݸͳmnܻӃ#-VM#-qnc[@ƞ{u}ћ:_Mc#(8v{Os_swl7;vvw񻳏U{:*bʮݶ˝a^{mvյ+g;N;wRoM;N7o`%{uo>󰢞{ݾJR]r.>͖[cݢ{n׮ynwpwo#({w[Q{:4%#-An !}ުvnܦjAfnٝ5Kݳ}M_mlYx#(oq#(޶dZ<\޻tcG:im#6F.HtΈw"/7spJݞwK7yzew>}q;nln{Pܭ7nٗǦcC݄N﭂fl;GŎwfgqV{^F#+g7;z[m{{#+-k޾Gm#(#-lhP#+ݏsC݊pw:c/`7={k{w#(#(˰2#([PW=/v.@#;X5a\twuu.uH-ji1uww'N5$;=ow!ϴlς!D7s;شuu}ތy{ڇ`iy<Ѿ5i#(F&42aL$m*d`AAL Ɉ :W.IG9(??D !M Z-b_uyq[ՈJ0y@l1Mֿ X>#+Da2xzwѣYC_O|E,Ds^umtr<꼗y˖=.4\5b.Q=߷5׻{v+C|ݷony<Ŋœ_;o,5AhFx#(LT)%4φl~LDb+mfy!0 Z%.1XZ7wWN^[#+0( 8!7E2%[JwՊFy2VBb*0<نZe0XqʊC#-dѓ-%XK/7)U;hYK8plU϶C2U5#-#+00Y""V0Xѝowb$RՁ-x`E#(D*#-1'夬APRP{PѾчjh GŠSJ?^~>\tp(4o=\cr#wUeI7-Hg#+72&(pz=r>H?O~?jB-9g;#efd .?]1.cJe,lbO4:?W.0LwMZ#-!y{ R D70;dn2nTyrH|:η]S:q=i|b#-zf0NS)$UܨTj3 r֬1VFc"sVBqJT-(d4AM֦P#G/.ό'GQ#+0r!H2&3kǍF?4 ې_fA)\)@*tSDo/kcb.χ$YxߘۦW#Bq27G8yT!kYvB}ϙjۚ#-hxgU26S g*ڃjlٜO섒H+>n'GCca oٜFH0 v$%:%I7΅#L{Lzuzxts6$aif=̉?8OӋ]"Q1HE 3Gt-bu׾ncE"VM31EE‰ m쪤<luN+ksN YrCoNa[9F 49`UkWӋ5+G0`GF-9aΧž%op4o^(HK&ws3} +w3շ Xp\=6ƨd#+~@x(͎ӑ(C<&uP:HNBEtx˳cUUCd3c-I)2~r-gG9GLy1?96Dxْ4#+̴#-dfI9Gkij!Y ˋ=@lmx|Y#+!l=,YsݬNܖ%#(I'Fj0sxv ֬tJ{U0كҎdXLؕUWE`JG!9:j^ jD[3SZ-N1|D~oi/T}4M#rGK9}vpyqr^!4¤C)_ftA5~KK@sr4)Wޣ9.~vTblΆ3{)RmX3#Y1㬒#+c"Jzu#-皟 Qn>ʗ. AfbJ(SLx▰˰1}aRw~PLWEM=)Q 6@,|'g^۲5h(;&Rom !nzu$/=q\zG4b8Q2¾槽30YUD%`xF8_>+>r'8%ak,e6&YÌ?2c^k01n^E{1(oW}q9ѧ=#6\Vz~,iD8n.#تX*&0^Tj#+DGWgYb#g #+,۶軭щ<|Wꔬ<ۛr)qw']eݱk[ÙIovx߿JfgCOaRLY_~XGۼO9]=FgVBpa#(L#(i}Z5GйBZu3`jfJ<+ue97 <u ՟47x(8/JҨc*S&Mh7}3Ȧ"PzcwILjw>*i& nC$6w.g]mP-?dw_syE&Ĉְ_CH}^#53x-MJhY#2MϊѸYdᝯy鹛S\ ߓpo;j^s)Koj4|u;+۹QvBzTxxg;QlQsUv fuziΒftT P˻ocvo\"t{g;'&wN|&^~]zQdV%HZڨ2sJ5#+]k_@8߷$}h#+kp- 0C_4iu|LhB NFNNޯ ZCE8_C)دc RRkrTg"->} o7wywD:\q&ڦ-hc.jIpUFCIΉn98]qVYqo:#k. Gߌ#+cQP)q)be+7Y=ٟ#($ '>E\veDu:uc:&qXa_]4gbkKgp/eV!HM #cmL-Uݙv$ pF`wWәcjζ )k%#(>DOz^2SQS`| Hڭ. >+9t80Ru!s11̣=j/Y>Tխ#-H#-Q啀zcA#-(K36DOݿ]8r`JqILn:.v=('||K3t2p5iR2NJPts]7Pd#-W83r u:a‘>^_zxWa{>wKd](Z@[hn0[G$7YkֽG5gұI0>"csAךA'C]V2{.K6A Vh%5rC HV(mGdZJG5wk] @e9mu&lУ3O3`D{zuBZكAks[ ;Su,f#+}R|e}HԀqIx !FѻP 2^e ފ_EOq U 7P>ͻxAZyh& -MzPjUUBG#?.]vx|f́=˱rТܧ&iUW/̀:|}ެ̋©Q!D#+҆<L zl9[kD#+xc?xŅ7i>}COMQ&_12 I[[i6,##+=nH[=8@c#-Œmo"(m9N.4s9MQq|#Q#-ĝ`*BE 4Rz/XO/6-mp}<Ӊ*C!h$#+3;LtL \Ӻ'oߥyo+yO#(cbC20y!qߺ='ut9(Q~OT8fJ\)H&iˍlNo~#- Ua߻+qIISSZjWpâZL#+bUӏM} Л>}~N[_CkM-9g$CJ 09V÷ڱwQwi;!Y0d!$MA{o]3zD"h)92rf-Ա|*Ef#f\T%1N$7_g9.0J`;.sbZdɓ<Gn70yڝоu0gQa#(N4q 9Jg![#2˃;>Gmnwؓ9x#v:YU؁Svwm[_mb ]k0ܬ{ݖ#B`oz1ӃP\M>ʾݪlZ̷Ifl+L6LYRMvuz@sBtGo/gT5eF|ۮ&$WàQ銲VQrs,5Wma#(#+I$$D;%V!K>ygOKMT#(cң- Fa:,PH `w ${!Yd*+zw.9B)LYQnpy!BIL,#-ELUaL`40 [xR R(;*V- 7>3uy"d6#-}*28RrItXv/j`ܪ#efhMXd+c`X[!:߹)Ofʆ#-HH3xɐ#âLo&׏}s;jup5XyxvgUZ\Y:$ھD.M"8aॗfp+l^յs fLקo՜O+[l'ssDGء:`r#+ |Kl]2YfH e8 v*)rafh …JA0QA\@#(ЪU (^r!DC\rq=w7ȡIJĞ+LZn@[ȣ*j*&ۚ2X6.a%H$F#lj6y VVErֳ˭`3I=,>['pϻg9#U'Rʡ/gBrDg~%di!zX+UI<;#+sޯ>{;^CK#;E{v#+M)IZt,!A'-ך]CZl#-l [&c§UhҒnH9.5L67<LKMQ)wJorƅ@کI֨:gP~U1c>cܶ?%-"AOFy&D&u:vUMhY@VZ [?1?NwSQٿ jC#-$yXU5#b]5Kn~^s70欈WEM)`6Jd :!8bJE#6mDtk慠&XrF tu+F{팴<hQ#-s/T0>{{jqotgRŃC؎2V qbI'LSqK2c&#+< a γC{a)ݻ=a_ ]jIBtS[QR%!Rocmӑ'LiceJHZ1/GԻ ?հS\Yb"`hgrʴ66R#!U\ÈC#+N'=1tᓱ,Jaȟ>8M` !E6gl:w܏H튬bkRw7BcSCUNkM텁+p-!>c$wK#(PF[k-Fi"#+ha"L1Il.h=h& "Pgfmj!7=/g@b5^8#(rPt+k#+|yUTJkza.N9Ӗ(4|#+C7[zgڠVPE⇪vmK_~=>|=o!/C?^V%ZU#Zr-]N¨}.?3?ӯEMǮIԕy);[z_d?#s]b%.}nW_OR-Xq6̑xu\iUuF 1dE}X&+ _}4 #-AeΊ+:)ΏkmQ6\1x<7/T׏/SU@sbŸ )Q() l(*LtJ#( #-WqU )-C%0 d/@8 )#(Wݕe)ץXM k3.-ZߎvKy)_/$:M-_6ʪ~}m^lueAW]ӥ,14Mls]^a_7B+%J'moo#k->M}\%W=t:6eɱx+N"t|+f3f5 ͗.~W2-(-yq[AǍxrSH/<Cp)Oa17axহ 9loN6:#ږ2Ѿ~5w. oeLy>-sAu<+-b9#-*.w+WQt~l9dk@a\guK>$*rx|aE^#+4W0?Vt`qd+ehSߞNrՅ膙ˍ}nA,j?_uWYq$EtN;6[orzoȝݞF4j/0엑z{8^  ^?#+i̅Vxo˱譞=[Z.}-ߗf}U#(1v>4dwdWSy9{GhJAE܄M!b?5pp5gr@0!^Ɓ P|Ef @:iqͰ^ug,{|| yFfpOEPv''OɕAј/zu9ya^y9o|>qx9`B߬r#(R#(>O|x+3#+|eٌc/R?#ȶDz?a~~#-%}9Jӣ{^%g`9OC&C[H!#- O맠&DH"k#+Ӏ=p{ ۃgW=L/Nx=񾸊=KW&.#+!s,@|rOFiY#((iP$#-*Gk.CzDАM80@(xsTh@2 V3V#+#J`if͞[pJ#Jn%1⣍[Wk"/DI,AClakwe<pkw(@f:ܨT텕(`e>Wd4hptdӉY׾8m3ݓ+jѼ9WUqN^?=czu1Vd߼^֗<#.l5.T2 i^I|fؒ(j{xRCi΃EEV(3G kg_W[^G;.5D#-TD{"at8hPYu:1E4Uuhju7r>#So]3tO&bdKk6:>˨K<F\B=AS/rq^v#].162IR`0"VbU[ЛR=Kc07`#-5#+WrÌKi?b_8GouT IO7_'k0vdClY|l_|9@-V܄g*XHlǶFlXGG5(D #D68dXH*J7].`Vj5fYС ɎX 洛#+2M 447Bi eq8Nh}dAaC"o43)6"ОV6hww^-g(PP|ehkQj/^*u!alaaci2B4K ?I~~3C܁JFf IAb¥*i5CYnL#-K#**(ZL0Ot[w#-t緜K컢:M7㾖E\,k,d-+~oR۟6oϫɈ`*~`?;4 o3RnUsXXf `+( %H7w]mXo'}Z;%A7op8P VϧseGÌSϚNη#{sXZv]^?).u#v9>W;>_G7񳗯]d"t]_?/4ŒY1J >apvBVa#-7vM'!~_(?V2biRmZ$VҘ9[lTkD42TVbƕiI6 I)+|kѯ[B֩SӑDAcab" ¼c0vThqGիэ)j!lZ7A؈Aty ‘v%r(*`2 ilA4m^uWM1!K2&qVt-!ittYKk$-pA@DP +F,὚Q$I8 }+tL?-ib+&E\Q(3DaWjeF8Y)6O 38+Ì*5%l)4AzxdCE#+/.DH:G#"DjT:faD1m@zuloo4yR`# EZ # u:`nsjUZ*9m?NͶhjSz8 J3ZA"C#(`~o ^~t'͜K,zj{O:`C@9/`>l4d9ԫ Fޓ"ܘttpQ4c, R#-2di/.L"R#+SM*lVJȤ$cDtJ(f#+T3+ ;mӭio]FL[#;v#+ gs!Y<5SyQ"14B\I bF܍Rin1V6DZJt;T$K+[ٯ۾^,]v8fæg3#+yAb>|^ڡۆ!6?mf)@lU8pH>֎*˅ftgcq[ka0$p,D8][éll+""VkӗvI<:س糂M'ǜX0ڏ)3G4s:dQɠ`d<[wŔ/l}#9Wh 5Ժ6m&0;AjUpҨ#+r4\sxܲߒ#`shmQo[&嵮ʈl7B{;븣m:"o1,>[;#++`*d1!3+Xq~눬 n#s\<,FU ƹݙYX-9yȨÄf9&D!.15]µ `˜l`y&e6^f/r}1Y6F\:q!b 'JU'?|S9C¨r[{-twiyUuћH8Ü3l $h] W1gbninN%׸O T K1#-Ē8 lޱMW%#-4 ۭF#(ZL%T[v$&#+Ȥa@7A}`K G1+Ʈ513^hAp`ɼש8/v>UN/x\"C#w#-8F[Sت\K90gNr5N0u޻e(oMQׁ 1TLno9lRU%eBm0JF) :8D"F`<mQA>},y},nb%xmYP&w$[]cjگ!S XhO6žj'pౚ ?MT]}E2_wT;QhzkGv0kкrO$|8:Dn{(B$@w&I57eqIt}ӼJIAfńtCC:f2cYMs'%Գy݋KN\Ϫc6BWY',A:SNZ~4}xc#+M~ھa#+ТL [QƱkduz(}&]#+cB8N673&Cu\dlڂ3]&ՁjKE?=Mh<G9u飢(ʙaoayfZdyP=οrr"./Cw]ATy Zk -(~O89>>!DUN!Bڈ>}=9v1'Ꮌnths2xܲ#?#l+`z$ 3`(wW&do?#ո''/vw.aUN&ϥ~onT#+ LLެe"49``wo=#Hȫs_u@ m5zCǯ]kMݺÓA DV49!4ga2]Ro#-+~H}6nEa$qRPG?Jp|=E8h'JxxZ$a#-%Zv{W?Db ʴhU#+N3mNQqc̘YadeuJA*IfDYp6j#wa4ҋ%q1\K=WiṔ[Λ; Vi%Ԏ0Z7:^RifZ!3Uf}5*ܖNxD'ҚC['*]TymHGNvY#-އ]3vdFG!j5Knb4 6?NHuс8S5?Ϙ9M"i\NF<"W{o^u4D1ߝ@`y^b1'|y"[ l3uxjlJ˃8A"AIuwѩ#;B9*]wU@#磣UU  j!6J^N—uFR^lw38*u#+JL6.Emo3ueز~X^ٸ&ز,! JT⭬R\?f|]^\ӉTPvj}BGau|,v#-^]’^Q.ߟcF}[809s:q}Ay5Tư;yż#+π~8zs^1]29_0\FuY վSa{!-XaҎD<خ#-%I P4mo-^yRʊ+NtY% Ćfdd34*t msĸaKiY'lsȈm,3{3ÃиmU]N#+*gOx©ԊUeEpY8}i=ŕD1Qk#6&I@u>O<0gs>#-' AbQӱh~p$I'],9>oEOOsX0v69m){̨]&+{G5%_5qw߄})8(8;f@ Et@%] =^7G|VO5)uzmwaWe>:K{Ȗk]WǛ3-s2q1Sx:sMs9pL9+/:zd.0xQ `QͰ.]Bm]nCsޖ8ja &\bm03n]|y(xՄȽm pL\R52ɰq2>'4ll \Y7#(8޾sVH:m6IB0R׺4t+/pm6q\0ӎ&cʇ&{~cIUs7sy5m&a\8Ռ\$ B_%j^kśٞMbf3T%1%ՆWmtE`"N3$6܎&ʍ)QtE/mgZZܟQ0;MHM!իѻp^RB"UCfbnG[\bFRK-FW(Eg}Is-X5 rO$Btq˱m<ܷ6U#-=#֩_Mu(Ŀ@,ұ,M˄񕥄"A`f{۬r:=6f1Sy~mTepX4(,5+ps,2Ƥ`35&HհTNxghqZJہՔtmCk׃uva`ϯd!(% ,^Nq,fj\8+i{ ֎0U˲ƈOS8/>{'A?^|1q@$fӺ " l9f Z~#-9{UU)R]B<7tU<> *â?>v.#h4wui!IϦ5VՏ~kOv7YKVںTk'EtCd#Hnn_8jkE}ZV^G4.ok౬)fuF'K3)c<#{ 5ESbo6Oc8}Қ%cwϖÚ}gpMcq;JBGĮy*!3D,*,Cq<7qN &Ł}x"Rxw]X{)t?ϡSo$X3ێ`r<JLa`tU'⭝8TܑubLppКh2/9=p1S')Azonm {߳TPҖfucH壁MU<-eυ'U$m[&R_ `1^#Hb0;گ=PQ.d3Hx.ӃY]]1D_.#/ς ՞L#Ꚙ#-pŮA*a!QrQp5.unl<Zh V<ܼB+ &9Tms#(%{`8·#-4 |°zz+d9n+({6Ͱ D'2^9U.I SeYFAT~6 ^P;ٝow.&&K o=0AkhVcl%UŬ[ r@V5a};v<:h`t@^dj^Z~K,lOwU=;˔|kjy/ȍDʫU.ȪA]~Vs=sHFȯib]Pe%#-#-yv?AV:#(JGr%#-sռ;8h*W$[#(Y,pt(D( xK*`Y@t®gh(#(VT$WYs:GXKTg+.=q+G2P4BSϦ4Lk<`R=Zxt4Ip̗DeUߍS'ɬM_FEi7z:u *ܭ%UUTz2&˓"}nN{.}U1M\9.pP ,pĐj! /HS(軉r&i<8:<^x4M׍kr攂dLE8]0Nǀ+ *{x;N;}Cd6,7S9"a5~]Ȉ:-m 84qKɍɢFwWSqb#-E>@Rfy~ϣNo5))o :pt:8}nc}-wntP%"_m<[T'ɫ+t$|t#+Ws}x2!mݦfi$"ꑔXXc͡ubYБp8sLOei_koR]5, hg+Hv#-iHGj5Jyܓw,`rLMZƫǝCPNO#++R!jɱ-[̚i=W½r`кpx] cWpƊNOK׳(Pz jgp#8t-Kb/Q29)wJw5cyoi|$pVsG59ⴠjO38{);bff=| u43Ԑqϼu9q%d(MO:N_k~ٳx&1~CSiaGlcPX܋q19\mnr n+u_wo;}<],@>BG~otg›8)BWˆLy~q&Y 0Q?oO`y6]2_v@J`I%:ҿEDZl $4Z  pde[ұLyc!}Ӝd$P!76u(n}yإLk4WųիGO6dza`;Ʉ@T>d |}^{BBb {Y_j[oSαCi/#+I kT)kqO6Z(oܣ\_=-zkVkEhG}6ty\zYVE)}pJl|r3k? >OvB<˸g5z#(jIu5.>88#-׽aA\U o|߃L2@W6{xɁđ?T#-bKppȣ<"r>=;tﭕ#-f[4mo̿NWJ V2h싏 8/tl#-.k\AG2Ta?O;uҖ!tg32(E5E2ӺQ{=*!GH#PP3Sӭ!VNL||t:f7; \"L"#-|hN|Dڍ1싯"5\w1m#-O6Q>lߺpԆrG5|;*KvJZ! 83=uk3֤1%OB,*EH_E#-@jIz!I3(ڨ(6d|k2N!VXv,;tqoƔ<pn-1?pB #($  5v>tx缐N(Ň#-g@(Ko38;e mKռv6>(-6/2̢J=byLs1t,;@Z` :\vE>pqVfN'g~>5iS&ֵ2Gl-Sl|AKhi% 21Kjo ю=?;e^w&+@_^BP7T_[5il̊CWrߍ(eWƅgˎ>,qy8*r^#nZ81k9FwJ !Uv0f"I#-N]ohl[[4<#+^>L %e2Fu{v_3}#+> ۬#(Q`j1)E.tvo5j$\EGN!t5BZ2\4rD"MgVSc甩8p/23s"\B׳s.L1b0$ɠ<%7͸+UC ,8`lpfo.:=jCTKoLx93ï;I듮*+M?g pe#+u.32M ٟ"lCF%q,{W9*dB-;SgoiM>Cf01aCw05)ϲ;l4f <%#oN4k-lwHs_#8[yv>y2ޜg`d{ml" a#+# ŀ*,y9a#( BE~=$%폇]5^'rU.XImks=dΰ&vH(@9.ggl+}nv&O9ƸiɭmsQ DP "rxAT"cЃ0p(HnHbЌ fr_Xac-s3sm9e@!*+qpP#q$ګ5[1`Sv_,eWw,/m{N5ǎ/m\ Ogc"bSKndmUpK`[d#!C;ӧL@.!ċqAT%5ڥV5*\CmYھ&c%u}ݜ9f{7N:pz'zg GstQĊb殐Q`JيZ$?_8}d#-@ߊkh ^##+c2ג캜;vt /lJk#b<&E^pp|*IzK 8ݓ<#+6޺O} ApUR5Ow 5&/"6xiSSBP˼M(k!BX5=死c<^9LɚjS"S>zW"-M.u |Ro L^^糹VM{%xafB$NT)IQ$5sxWIs<%EJ̎xF,MwKl[w ayMvD.$3#(Cz.@o`azk2G^S®C0P;|ʱvq=$.áJ-$ZlaM>~Ӝ7=vgg/Ijcw;#+lfF}곁IOp 24Y,Ħ1Jq$Fu-w^o^Ζ?H,b{zkD2ܮkGY!SkP..1F#-U`WO#(iI2˶/>#+!DJ#-xPH#(O_:{=?rOZב**? AH Ϗ#(-?<՞~9HBr_2k[޼op9i)興>ib }d`C/;drc7!b|"'_/T%CaÎK/ÍdEJSD;=ʊ`7٪ Ϩ;6i~seJG #+Ǫcߒs iFl=0d_fW~tM&=rPt= 1| 9'0 >EE A>_aӕCWQ2t".W3*_s?gz(#*%39hJ@wuJ&0i&#+XR=(EYF,P,9 `c!/b(!n`E6FG f#(ce,~rn&c"#-HK7(,e#+ u*sa~N#+)@@=;B (T"ȴ2=ZAA B=~GT;;?LCϏ=P;E1=>2W@vU#+} kRK\hF6&n5g5,i!f<;TqŃ>G>41O=<_lYi\xg m҃_ '$]">d0ez)2\ۭuO&"o4ɪAI0vjw5r-%?xBb ƭ6JqQĹQXܢNL8I4MYѥsGUF(z_<,peJ*d $6&,֓3J>ϪwpF8mBDSӏ Aa^=6lneb$& cT"#-)9QR$60ʗ7_IOեcuS)Djn6s@9\7*ZT7PeD_1rzfX&w Y6bobAp@v"Q#+pԣ`G_cl2¯'`M!\FN2R' $z.{bE,iGc#-cԤL#K5)G{8wC*(*Ĩȉ[IVƭF5ՂEy7UBT2"RREv9 svl# sD!#+9N@ P] 6lxltHjy&>}QҾwC޴tĵ>73NNi`DH " Z9kd|\2~:Mzv\a &A6%,$dйtâv74)oVu쯾I#61`Cl914DEj;y,Z WQݫv;9ˍOeggP2w-!TVu"1adڧFKw#+ebʙ㞺6ᅣbEB"l M>tNwB|}+yCWN]VXBds G5{]6ӣ1$x#+#+(^Ѷ[œՊue,8#-dR#+;Ҭ5d#(ygq secY}~xa70xh~5 Onl23:VPeSuW<}( 8eN#(E@dm%#+4WwJ%1"or#(9r(ݹ#+`oG@fQzݣsaqݞ:ӭBOXP3hOSD0CY"aY  Bsy3Cb5TJ'W~Ks=dp17t=M/ h5dIT) `#(#(>ߎhe.DMe:5ٹ~ߡb΢o1b^N#D#( /@D~>{灃,I?pL!I(\_kZ:T&DW9\X1dO`WbBSdt}!}}\j9Cyz;5I;sh#(DD?#-]ąW)ʹh,_bTEESRtVBԃ=IZ9?$S~m/)CNF2gL3z^̶Fsc{1)% AT ڀKӒSMnI#-+/-=9՗BOA^>H6K%-Q+ί^IƝ9>@ogU 2z - .!j}y-'Pw]6./p&y PA9S7 }k +I*AyQ.cgqW No>*׸C-AubSgT6]" N">nᷣ~2M.z59Ҹ#+Ju#_o{ko&#PQ*5xA 4T#!#nRwǏz(U)n1IOL#-dXȔ9 <7?fhơ"?IPZ( |~uf@ѧu9yʢɇoPqD}.m&f"N$Xd "Bhc'#`\[%(zb}UU2[gkL7cСM.JT HPQC(m?Ux.E|]H8f)ҜfRJ-y$;!'wLޜT#(a0Ln%Y2m\ub)ΎP9#(28W7=NJxb^SW/Fй\E¢^V"L; /g/{Av|/#(>ksƭcSo6}۵Z#(AG|=j#(@G?Hs[u,٥DՏA9+}(4ٖ4#(/EnPaߥ#(2G q$MdB}#+;U!ܥs+~CÏOz$uITO[3/yw#c#zIB]~6OKB9Ns_Ʌg"Цf|Ns:Lb=2XJ3% l)#8^(}v˫ 2ńƥӳ0EwK?!c#+_؎6&*8B/Bwu*U%J.Nz^tX|D<;YjTFUpxwd]pNs1SYFWt\TIy^U'~mQp>вk(t@}>7"=<+M*4]꾘uy0 [ThRo?ݱ0Zt=Fm}IJ2?;@/7B ?L Z}&qn3QJI\;*zyɼyѓ V{?W]>~N6S|]A^=7tӟ,|+ΕTQ=6#*O'5\D,gu:~91?SÆOla9Lo<_ʻ[6KĻB;||@z{j&7\ժeerVSD){f6K^\63l_ZN xvz̄';Rkʉ|FӲ?aIsӊ;5Nqo=Bݜov"O)_}9[:GfqPnc$?&e|QOeHmi\omvt\Ep'Pe) ɋúwKXn 8gy~m>h+PM[uEwJ/6la}pq5=t ꭮0 =xW|Pjv)jub6=b3'$--m%ꞦSZ0+e_x*RY. M2&?u.GO#(XŽ܌Eu7lAbdc|w#+#-P!}5EH%06z|9M|{V96ū*x@]>ە&n q6PjmϬ.qXAvctt08wr,*^#-J$(P@$3A ı>#+,sF11PԘ 6;/JO jarz'ͷTEBĸƊp8WmN1X%# 7mRԧ܄'#+"6L yr@\EOCesBoNNy8_wx1}ڪH*uIP mUXk6`62I=:qg4yT9)ёҖ;\҅5TdzX,HN-Eߖv}um`DiO#(m#+L#(`+RUoQEΫr#(e@]K sNȅC#+OV5r["Cx+髃*•~SAgCC#(ts}C㾭*RV1дQow.Ia^'05BLM|'{Ѓiv?Xs *]p$"q!{+@Тx2T]$j[52#-VCT!/'έ :UQ VI;7W.ˊ$azKHR?7?xzC''k}2#}wSwG#+jܼwrvKG)AJfb1 )DJPi k<>=u@#(#(-PP)E01xm9'k<,2_q^*&je?-:&C2*k !m\o18mjȼ#+bs2!1 o_ESN>spCoZƥyD*cYUff#-꒕eŀ -#({*QzFTQ++*%rroxnDnPiro{T;7L,&1fe7qb`֩Wi[;s;2`?T#+#-r'"ۭpD: :l:sG;zksf߂ !Jnڐ6:_Ky;#+`?"P3ELו+SnnE޾9oW^cSse *LBe,3ǢeQsRH4uo3fjO&i z,^0D,MG|V'W h۹!9g##! \Rà@n}5ĠQxηq( w3\^Rɬ*["H<ͷ]4--+T_t7ql[Jt?Yr6ܒ]F~|mNbc&CVf5E[;C-,ue&Db4yQtwAǧ\x.c[iy/7ע3iʁtF_yiG\mpy?$u {V3FusO7d#-%~No8J{'rI&IY~g4$Q)[e9BJjYemUG!V,85%%|n1=*Kӡ?zam2.yP sxxY%%K:xu#+Sl #-v_Łm,GzvYd̃9y;Jn+X&`30AUȽeeG9H̍ߖQʪb"͌(]P#+);5oL&D(}#i!aXGLSNOT㧹8.c@LZoRtiwg(GXbI#+_=\k?1#+WClW#+ǢaL!(Mj3=~Z]?#o0P#h0Ad%`k^E =7&Ҟ[6a!<,}.i(s#3L񗞵`*)L'諩<^M7iVT|BjtIHU#(6C7gk\#+ɽC}ߏ7l.GmL*I<0#uVF ʬ ڪp4qҟX no4hZyG Q&2LQ9zZ#(Gx챁ցpM1LT.8]z7E#+#-|5 )bU<ؽ3Tlh@i>n6i{AC k#+:o_鹾t;: agÏ֧[rnlc5#+zYRF}vY#(:A8K`)SjUH8Oh &+DžwL,w~W0lvl)65-'2\nwLks,$T ȩg̾#+,nL9>pzccTSSb1BRAq)=@WLڶ-7 5ϐko7~Aq{E"O1䂪*ZD#-A,@Gһ>qL qKU[c#(?SSQu%Gjd#-ub ԱZgC9\!"2,}KI*#~W(!k#+Z#({^gʱg[8#-bӖrT&%g-#+b܂Hl{{`֘mQ | [#(}3ZmCԋȎ֍jQy14=Q GdDtuW9,.O'8ظ `C”yuK~ (߿׉T[@| X#+ 7>{<8,5hGޙ#-nSǣһk*:惃 [6dDgsrxf#(wzʃW/?>|DUw{Q*Tռw (ws0X*$HUĔc %{8co#+og @ST R'01W쯿@|0;#(5$?(:,D2Ers =wvbQenRcqAlc?fǷ۝ohT#-?ra}M¦ m;Αv!^fo6H%#-|;1Q#-< TلжN0kXu{A\~4Au#-X;]'Pͅ\+6#(:?c@}f!:N_W$pܷOa~ u=\ LRTwDѸv(`/I,2_;8jE4#+pI#~ W6$"Dqؚs#-Q.y!QHi4%d SUf<˒puNq˭b@eglTo?ez˹7R\081AB#-D8> o{ R,=^ 0s9/#fDu*ƱԶDŁ%Upl-?"OAn#(a}\5w?god2K̤{0`b@Ր Y1d/p2z@#(3&6#5y.մ%'ヰ;{m l|40 C$z4S?:Z+ϝqoFG#+13;em3"H>V yRR}#(*@zD} ]J/|}>2_)-ߵ#+s#-Xc".PlNV=? &?ljٟzY8\QDDb;CѴJ0Rռd8||NH *P1ƝA%S.=ꝁ4E88#+.\yŏLajv}L^ԣF$@Ż$#-B]ۺJI!2V)ytn\xi)ǃπٯpl#+^R2 o8bc#+3q{,wbY%aTZZ"H#(#(,.#(w@!#-L"!eч̭__$5C"*Ԧr}w N(uve%Bp P1M;)zY.sI;RB[U^2[%܍YHSR̒@RG#-hLddh M$gi Xb7YBs*CY:kdI#(c1d􅮔]L2#"k}__~^(0?_-;#oƺzMђ&$~]2,5~*;iHtM![YZ2'8D.d妐N$L#+LTk.d`R^nV`df2nu`Xj>8MF#6m #.>ʂH! #(} @&8P#Q0ޏ^S>|w췸\9?^Λlr3DPVؕZ#.%%"ûܟr>4Δ h~9w، f+6I۷+.22BPAiNdNWz5B)6 'OqmgwB#AT:Jk;tL|̼J'.L.j l(PaPQ$S_E1\y=؉A,Кóϔ9AV#-WNJnh湠Ƞ$/vu>k'o'_]z }=`_#*O ?cT\bBS~S٤b/;>x#8  BQCF{dB b#+#-s L4M|#(@]`) ?-x`Ċ#(!|{Y o>+=*(W[[: (۴ȱ,by̾R|s+ųa/a Hs}-Npӈ~9EՌ쟈]{7pAެ{;I8##+χbL&KF y>80FǑ3#+YS*Zc=ڄCT$I=X9z="Xw*Ĥ_F9!ܝߡAjXO:RFF$Jm j#-G,L< #(pOGP'<Nre_SCA#(+x97Bc_ЮbCqі*#(zG7~*b#`h=~?/HY֊uPυcp S>cQnS_B ngFBN#-}ꘘ+}KY t~Vgv|ʯctlچjæӐyl'X9ː8CGI(a]^-)%YV"R>QCeLH`νy8D)Q8kPLJO_!#TJ^|ݶZ0fŹfEzLyԛoE2e + |zB -z;MBĤJ(~΃veKRDWw%|zR'A3':s#+ NXwdo@d5U(wcяo۔1R5:~ .0rOE?e#-qcJ0#+cWN6kH/WoiIG#(vOQ'|?!Qئ#-t bTK|Ң[$#+L4C.Gk*{c<mr67tDMw\(mg])$3]^Sοm߷\w!exyg~aO…)BaBѫ Om[.,frw>_B?{ƀO[?<={}2ITT8MX*0La 0^b*$0l7Zԅ#-Z51 fTpL^r 2JzH7|e,6f(_bmzR;H۵BN&3b7?oɕ#-ސ̏cŁTgXz2C:dH>e*mC5W%,cI߰aD+ܠFKV0\###T|Q̷ Lk8z1* B |}p=_xw=Rϒ"Y..#-c3t"@9y#(ˆBѻx;#(v'R Y.L-uqSb=*sadH (d6cvOj#+|pgjQ6q=fA0U B!́s6ϣsj&rtbQx'gZN'!Uʛ*#-%|~[^ERD҂v1"m0#-1݉9D|s5f ӻUX!2O&?*˵up/G0Z1p>FZSF>941{="tɳ.$@>֗SP#-ǧ|]Q:`#(QoPI@w[#( oܹۅHE%C:^{q`BdmRAW CPNh\@"Ъzt X 0#!VlA'(Ls9 NΰoʦwmjcNjz(#+אݲ#(5#(˲(6#(Cpsćg0.'I(6ȪJ-#+p\ЅB)C`Ul?/چF?lFG.$XdG=6Bz;S ,Bb%Pitɠm6՘=#O@^X=-FVp'!`3~@zKxQZ=zK jŰ)p ݃gV~!EXp,#|P60~O>H ["]R yPb_,L== Sfu/JnΎ] 6)$+:z0nV?poI> DA7\D$5IDŮwN +KZn~[WڛapT ?8#+j:U,dPPÆ tn3)oꩵ}|v68PvSfOL=z'yS8PGʎy5l*Weh.h:#+87#(P{Kv|@?"~$-"k@ǐ|6raSYy yafpw>{N 2l?&*ٚi5IQz*Nҡb0IĴ;ó|G_m@FƠD,"J@Sz#&W .3>kYvR-$`9-$aGJ,~/5_(A?ңy˗5pTn? ӟ'sZ!#+v b#@yκf['ݰJdʰxɑ#(Dt&cNHB:xjai*f)d YS?jC5!#-? caj1ٴ,b!V.$)1vNVq Vn#+يhF {j#+Dq+Դi*pob@o231.i?љ`$fWVk^;>DWj:X( //痂&@2I'*,]6~A@ n"H@* hZKHN-Nlw(~8,w ov[QyDWҀ%s]>}zO5pvG9i':zQ XX* !LjH A_sAJ8axTj#(,!2$R#-Oǃ`}^DXyT2U4;k.`4e̔\D<|j] v`#-uchsmbI.]&Rp7!R88h~u6\G8jj23uK8Sj|j1Oy׃Fad5ػ ΧmA`#-#(әA_XD)ֱm.RwAȥ#(u/7K湽gw)3Y wV{ p`:s]EkaA~Ώz"#-@<0O9bWyL%pn: #UD@JO[l&TQ~1 TzȆ#+ýo9z]ک$#(`o/ Hi_ZrVqP(T*7Eێb5\zNW(s#OZmɑ#5D@o*m=T-"`ZAP> ;g XSUHʔTR`j#(t#-ȟ?NnYZ;LE^Kn}U<^~~A69#+"7MMAχG|d\s4{Y39dx4ܞ`Ǝ9 ʸc0&LH)Q9Q fr~{E:ncnoxGٜ3_/ m @ӦɌNr\%(I#(B^HGG&h$u@b3PIPDpHH{#+Q-9}\ fk0Kϝʖ>}J%eF*j#-7 B@ }|?Sjo>_>ҽ6#4)#-ޖ?6xL?,=G#+33'A#(}l*WSqdDɔ< T_sp_|F<`旃+ʪ`` Áf߄ 1~z &'㑼m?(s{Ģ4R$`F6vzkI(}N(a0l0YXK^QX2md&弳au$F;Zm*.;_^x~Pwb4G$0zQ8aF$48-&y^V0zU+R6#O1pFg!aX#-; _#|džeoo*i\ s`>b9pԪZ#(&ks\lO-|~wuyj_^t#(eXD$UP2hS"f!bA+Q Oe&~)%jo\dy_C})YK]fiTK#gT+STѯoۡNY/`oB؃@ 'cHONr;j& f,B8{zwvNGf;TےxKZ(mAèq3Ӱb Qȴi!ǥGƁfwF 4ⷐBdb#- }']0P:Wp,bC#-8ME棿ʹ_|&(ۀsCXF:%ML޵F7Lok:H%6%6x9li86Fhh6ǖ\ aLltՎDJ($4ihcocx.Pjs҈0m#+^fPg?>mBat@9ܘ!A!LVSIL`tGg׃G2Yne @|Dp­6'ÿ7 tV..8j 28ӆA]#Qw>G94u]F(lp *K~vVCLJ8^;":f蘦b`t#+qH7"TCh$s1dT\e~aɸj)XV9g>#-Kd\dV#]og7&6nR\00Sfs6DLN='wƩPZqߓ "(1#4&0A N{Nd`3b't6tfQH=oiX303(lh"q7؇\ DR7k9e#-Sm#+{S{|awnJ8ˑ4QT1Is١]\CXCjKį쬓.fb44!;{Dc_ 6n,$#(ݷA'F`FO#(Xω^IFSfaS!jmfiɃ]}ZfI#b50nzEf%Ң8Ⱥ[qAE! Ɖn17uf3+`w'#Bi=9Ʒ78aofz04I=/"r*X,SQ@BQ ;eQCPR 4Ô#+[)OG}L?U$M"oN )DUFIH#(>p3]h6IFv:~x$b5v)@b܊ChF#({`}I Cq)@21K+1(e]\ǤPG9i/DQ < `.{r*&ERY߱|-oUWjŪֳA!?FLz0#(TT8D>qҏem^)-֠0k#+aM#A`8#(lidqy*s5EEwoܯSoSraIywrs\~6sttwW74cO%!׾A]JTf|HBD!V*DEae>'dH7H#+X"x#-ǰ=mE+l*+;CJbp8l?OwŴł#(.fnSLYE7bc$xMDTirX@Ć=P5u.þ=T#C}9Ҟ~&e0xdy#k^#(YX#+IkIt }=C]jEh,6= H RU^@9~U5m`A1,;l[h6沢#-_=RN{޲bygKn( Q"0)&rqD:DXa#-U\)R(>gۥZ:#+X0#+ݟuѲʩQQL(MԔ#+E?޽VcfՋ[ZIR-Ŧҵf4&lU&#+*4)A#-O#I|ӍyRtCo2"$$y{l u'#+d59ڬw\!VC,ULB#r!A0NUT0rbvbew 0Jp!H膲,&3$i-)"pmD 3&, 1JU{꣼A۴^Ns!QUC&ݨ$[jYQ&"P N+#͆hY(U)M($e;T(22 ! 5Fۛ%rffQL[EnTEMd`v1` Jh!m8>]#kk>vM4m_+˖;RAO#+|$=ww7]byFHY_/`J`1U`tFweB0c4B!E0*!_3ۅ9豊4hd]`?!5} ,p@錁~;޹j]c/괧:>ir#(A#+*t{M=hzc1N),8%(je#+Ou *~ `ZpĘxt&!0Mo79udG]G+l/<v _)f3NG{w'xC}nۜU */K8:OA$0~`JF'|{:xLk8f[vn\&2prռ9Cﹴa#(?.}A#(2Cq YΨZFS#+3R>3 ωz;ZҔ$̭0H<J8U8giblS4@ [ְ\d   >Ғ@z(#(N#-S [|| ޒ]cSaQiS;,{@#+du5MWDT2*+ђO.\z!#-5$<AV1_KK@PhU fa4P @#l)4f]E~&RfAbM&m?iRx"J7e{?˔/?^BvK/ѻi7ns#Q3q6gVYhSk5QƬW$A@aԓ](>-& Zqێ㎱\}g /w٤m*a\>!]N%^怼ZB2vWl7< z M[sy65p#-l`[ű|bDDbRRnHJ #-A @@cw71{xl.|CSG͇^϶Bd7OI%5@o}5fT:pA2:!ܣsm!S_p%Ԣ3B.hMjERP:z|f$k@,O/W_\Mzʷ#-GLhl(=r5Dndfm6>5 Em:( B,0C`GjMd_m3aul|sb9ȉ`= ˳#-Eվ].T.h={n#+n^ 9rIvɹNU(,b1d;;vХ&`;,u7#(J."0A)HA`xb!2&ٰ]M[bMrʏm56[;xu%2^E1xU_!hKLvVY y ${u%tsu/ePmTLFBgk 1T48S'W6O#-bl72nhUA幐V)ݒD}_cA[6y̪I4r]vq$6b($P",##- kfM]r#8jÊ|Ϩ\Pj;2;Զ!m={lXLOmG#+YXTנcX0,__j>p^y]x_FN]MRw,~ޞsElh9RI$*jA$Y#(E:UN+Slwhb,raqN9mbT F^Ȩ"d3%N1G29sDJa;\#A@CS,`"~)R1FYFqT#+B$#(lR []zzx0ISW<X2TH;;7.g_@Cx-PP*jb=rLKBcrVhLx#(DO v8CLKF``fa#+mcHKH#(&TQ2k0#cjjdgd`S7 !=io>M6p'~M1Topm.@r؝CD+gLz\VQI=jg] wS8`ioR]k 9c3`bOوǣPns8>rN2n@D*"$dB0Xi~FNOGkԳQ6(،wa|c ) p.pE94Y$%}aPVNz[>εL/d3v=U< ^BRZ9mr@fiJW}H&^8'(띰qK;# S<#b(mQ'_*(:%J[ilքRo|A.jmef0C]G̈۾6M˄" dJiCTp$90; 92o[A9C#&7CgA)#(XMX4!>;Ѳ{`ps @r%DC hdBKT2$*1HuD7]#f J9YM "c6FJA9|k2&N(gf/0Ks!T#-HCKä`82sa9Lpq 2#-\oʃ `"4"(^("qxB`[a̸jg>]½Z#d4!{n:z/Di.ca_I;Q}}R&l"HOP2zAWHM4M$HF$I M2IDF\lbŰ`=PBn q1QLD7ln8E%$ifV#-Gy9cc/P61$= y7L'U)Tlʃ B/}qmcQ?M*jeg_ A`>V@~V~Z%*Z6\mĖ-Tk^*6ܵըo[ƶ+mA!C@|93BO@jYBH}l{_j#0BH%2e,ڙfILblZL?LZC-4C%6%#-Mi۔2kI$S6B123 B*bR?ull"dFS15),&&a JPP*how|>?Wnp">`1 Lf"z-ṡ)hJJJf^SY9c!Ē߻vBLXX PEao<@͢HTgAq7nf.nq_C΍ڽw5ВL ZSC/Z313'!}/l@aV1$f믵bcPڍ$6VJŒRm2FK/`z(RpaD1iY25VX|z#-I_Lrjd[86;\6^HwrCq:J8 GH҇t&d"!UEOez[ k*Tx^>i"mG:P;1I㷟svwrW$P!ѻNh'=@BWf1}5Xnލ!d!viso2@|C,=%@!E3+aK%Rφ F@ցM,<[mEI_62p$%Lgq߃<|Pt0t/n];?X@`#+PXNº+p'2h3YtIRS3#+*p"O:21GjFC${3ٚPXy$cziսWY]f9/:E\2lmY!ѣQEMKÊְƩTl[rL›Zh4]ՅXq uˤA97HP#~#(ÏL!Afc5G|B)őuS-3ѳ`6m5KgR7e;Il=SlS0ӎ.w^ \lh5{F$fq0PFpBmemqu+͛v9 2 LTQC3Ljdy@ntMUe9#VJ`1<#(D\4iWjb`W.av:W~\l;c|a\:%֣xr cg)0ìMLo^7d!H;K;DzuJ_*Xeu)SEd6QX9CszPwڈxtqe9^ȥ^uQSaH $n#-m=Uٽz8 [A;-1#=n$%%iȝQoX8$׉˱TU#-5av$lg0i3qD}K5Jvz3ƙՌ#dDž+F(i?C3B61lnvZ+#$ݱi#-ftʘc],҉F $K64P`QiZ4ݏMBGNcugYK\Ec`1iP 1f5W3o P[2.ThqKҷMD&`F:U y)nmellq%p!îDqOӒrS^zUֈE3>ЈȒ\7$h'u#+P^nВDǥ[{l֢f}^XlZ,)ٞ/"nLJ&H$,6$;lΏN-Ԉ8ʗ1Sd"SbML`ihm]NpTeLZ.}KAf鍞֟4N" d,X.skre~7#-M+bCy,]PaSC#+Qh#(`Kтim7]!/CIlei:a[@͕D6_ )֍^' p@D;qQ7HC`A7h6#+ 'eBTPLb4H!#+'>$ ԃn0#-x<:4ɖ`[j a#+Ƙ&H[%!Rr#-XZUfi"00%;\;taEtr,P6O"g%旽M #+zT7@&-9\&fR{\ӳ8652'8~Y+_Mf:0iz8D PS(3323k 8 &P/Ob;q eʱ4B0}`Di10)b;z$4g.uɖ#(⅌1Xlm##C(C8Kb(#-38aÌP48+&Bp5o Ľ,]+yTD88B fbX]MAr]#\.Ӄ,}اsvH -7`@8xj+F#0qͤҁv7ͥhF[v+-#-r#+yřn!B`G7c48Լ\H S:еޭۧ;\5ȓZ6 B#-!H!C`^qB@0X |=])#+(9-#-LА4M(~_H1C~0=0:~p#-Yмl.vb]ٗ7].,FK G8yQ9Pfവ=cڐAb800LqL.V.e`LJ$ vC`~,r#(S`}e7\\&*?#-a_;"@6wY#-2L>j#+d-GJ qPVքYb{G/Mj]+|V/Kze*]e)d#+0#-#-ᙢ aR&+7?#-ݻ)ީDVHmOzYᙏiC^[|Q Aӫ^gjʈ Jk#+hi7itatKڻXE` %ΰ;4T*v}P![N 39̴V%I*,Vnj)n#->欴XLa8b?W[3㝌Ap0"g#+/2SlD@Z9Yr&Osvz;%a4q=5:mu;V]`1#+[:AK#(ݺ2"d rCp90&`1!b AK &s3SN72lhb+@A#-#- qpYrg2K~ޯm{JdQb{(=Gt }pAR~{p;'ݠ#-=2 !VzSBQydw-⿜Z6UXִ_RѤM`$P@"87bb#+̱+*PK,j']SuZ7̦0XȡogM8k;fLR@B  I#-vf50Ÿ@,fJ0jN9*mks6-ML(od#(cx2JDH#-щ#++ 1fe°Đ:;õ1;ӹ8l0Z?~f{o'24`T5dvf$T\-je2+!$Cf_uՇi݇-hp~F3y`}%T2r V.8ž#+"(4{8Lu.#(w?cd6B]{P.+! fG*+GCq^ yJ~zxXۉKLr8#(H @/!\is67GZ#(pC34QlCy}xcj"/wQmfR{v$oMmsAY&+yri%-يD,i,ց1nͫ)٨di-m[Tz([ewt ]۷b2զI4IjhM-U9 $X5I"m^-3TR<3I-6(̩#+-m[c<[iuurJmS+՚ uFLKm xMqQ#$O#+DY-я#+e?aY(#(tn\-:vo&X7Bua#+uEld>ϟZ͑$UsrQ5oeZ#-{LԴ4ԥ5R.'_j{+e*Ͷ4,S 4!QvU `]**,km:U:l҅")Œ-̖Һ0jRZVe2M4TC F$Y%RQ)M"jLe2aFV)cdȖF%Y*+EJl(Id1d5fJ%&, IJ)fmj*ȑ2L"֥ɍ&iPV AE2@Jm!kUfji-Eݫ͚bT^ʫZDE I%!-i &zPn6X}q#(;68&~F"'svг٥AzHvCM~tO z!4K#ƺuv-6PLǬp{:+ YEBCy#+ @S28,0)Mz*x,Z<-ʂ_#a#+sj`}9@Jآ)oPTgVe>0 V'}$lȰ`{!!fxaC|&xX^[}PsX4;0?wͪݖ<)`Q}QZJPJ8m@3RiP:;$$WUBܦ#+6*L6QSB/ FЛbIJ)T#(#(+ljm*C+a#-CHPkurM\b|_C}| #(lxאXl#+!514Jlν+@37J~\#(8Mt8uym`uE@#(1s[UĜ#-PPR)bG0R4:*v2&Y(IF5d`#0ŒPT`%Uc7 #-ȈPiV ՎB$Ür0mi!͉D6&b2i5Z-pRA6nxaUՉaqPRoRj`@c΂ IGH6! c3Ӑ #(ǽ#+2-VR4j ?Kwbyo)F^'`ɛ'M;z&N LieJ0+#(&Ē#(7|yI- [',sD =&:pL0/aHc)4& *>t+W\]EorB0+mGu[Bb!bk}nt*ź`WdT%eL+}{13z*BzVf%Zʼ&S?vıO &QqNކ\lFBhl7H[L\S>/w6ɭ)8bvI'bB +@6#+5G ݣۨhnQ,r#-2=8#+[Nw==K>"ui`4#-Pe]z#fefVӃ&z5騌z49*HXQ8~TU e?GVr aMQIjAxSmgLB`0B"l[BSID2&1ړF{w#Jx#Dx,yJM#(Jhl&#֋#-V&if}Q8ˏkNcz=2+!$֛CFԏӡ#.f:j\Nf`E*#+2Tuf#-S%넅y׃k\δ' c0`9͵pnb$QNR'e-b#+e)?4V&/G]:$Ȋخ˘e{mݏt8s]7檓L͹*/ TJ›Un8m%T =؜w=" ӽB:Ay(,#(d')ů2`h@U&**¨2q,<{nX`KjM/;#(AH#-Uuԛ}k&e^u"n:vbW'yONd1K(ĸ\E[eP P&:+R mb׷q*hibNweJ؇/WS))W螗$HU#4mE ZSZthՑp2XԙyaQ[٦+EjFmi4]t\guJlmmȋZ+^F.EѨ /-Z$  DF W4I~Se>ia2뵙ĆP-  1##(|1,X1O R9P6q>(f"|DΜ *B!UGUj{ `NaP\#+ksT"Ui+bӶ_=|g.M O&H1֦k(`^QPCC0%PMIPѠ V"s,XS'CeW\]{i5 #(h`pT#(*( G"h#+mW]mäMdlA! ]H$.h dLM$5&ˉ-'ٖ[oDrkAD8%5so~o6HR!CCĂ"I 2AITD( ** ! ލ0/"0YQizquke>Ԁ܂b u*@1DJ3<C sNgc~Ѫ*D%!$ry( МMYĬNܪ#-@;l-0ڒ"aHW.<ԙҨt!`&=~A9h?-tmaZvG#=uw=C,a"vb#-sTVaqd(E"Wa/٭L1ҤXP3n)#-@L#-JXK0) #+(_âZlBS#- )NWX;Q,:X%mz0-"Q)0LێBD)[ pBa elIl`[Ueѐe}Xgo6ܵHATऊ)DWQ$TC"f3ˆahJdF&0#-zoQ #+1B2k5BbbjLAiԣtʹ#-Ja9aZ,M꡽dXeiϟүfHo'9ErQwl\5sc^{ pQRlb*J^*cypէX*Ѽ"J]Av6#+2FĸdsP) ޟq1 lU,+l5CkKCK킊IL-&tcAAi#(ɇRPr# c5襶yT fs c!Ϯn36i"Mf5㵵vC41%щ_:Pd<+qz!㓒'DyM'5XD,B)"?iTny[&dYUldD7r[hQrJŬcm[$ 1hR"hn@E})AXu#-XXvcXt"D<%;>o~6cs3\P0T) ER`F)n\D0AtɄey^u>w^f |s"c/UPI!'UBaJ7Dd"$ͷ5ͷ_J;QMZd6X؈64&QdMĈmyL)&&Ilo WJRr4SD?[X(RɜUY`#*\>0I6$!2Yc*Tk,`3P aff~-LBB%6c8teڰ) XOjϸwөx>^Y_,UCdƝwCo^ԈBhBѻ=p 6(r1#+ʹ)PP ,"op#(%PçpvBð)iR)(JTƶPmMv5YOi]FF&hm^~ϫw㷳}5X@7(PHϛK`yӲqBaz3q1.lZH=J% h5H?xn^c9WCk|D^D(-CDT`ƖR'#->#(F8[#-$xl#޻ :$I&br(Z[3N/d8%ˈs gx CvHS279+6&Px`Σg4~#-(jct3$%kBHLF#R,نrbFmb!K0#+9$„b JL4R' ^:3zsC3q]He>(q:5Q`eL'a$Ի\؇TKm3:6e(U'#+]@ [M3^UÁ`e%pDX-"A))6i565#,DʋK?mjeSf6F3LVmLKRmbXX-S)e4ITjIZ#+3?+G?N;#+e!4CUNܔB#((TmFڹ[x6#-fMko6MP:ǤᘇFT"ԣ.-7mo_B/A q*2Q m -`Lpg{e:`u.)x߀s#(#+E_dW34':XG~B 0@Q*#+D\%KtExоb<egݷe (2FZq[jC|p$CX4h5~%D0E<dN"5/3hpvU6 fR AՂjܓǙ,kN l49gO0#+ $3h(Łbxv|bt,{?#NŹBid~8y_5W: X=+w2tĖ2 Mt^GF+F@ׇ^mo j1K#!&%cf`^oBNO X#(j.@, gP)#+`m4§`H24τn1f8jCT)"Jь4#-@Z#(0`"BaKSrb$MF p·u44[x6s`#+G.m(4b8cBO P2vlDX0#(֔QGd(G9~NzK֒ĹLj{g\Ck*FsB׺!:ZJ#Tݛ8bTHT 7蹶 AOE5;wD 9(XQ#-J4#+K!) N-#-z=OO/E6*9dcW0}.A"Q#+#-KgW[Ob~)=zB#+v%&aYj'@}&:4#BׂC!&IaX" ,)c)\,Dɶ+E~T7klFmC.x72JE*v%"#QTG&M@PdPĈR*vPm7.2fi hZN'w&9e$BS!4}696v(rr*g3-^0?#-ܓT}qT&˕r"-޴50;_ܐ~;+ti\J~Y~ b*Zb%hh2@jnHcj?TD,bipman#+0,RrMSmqaZ~bћ#$)&@Y7Oם;(F}^ךNoxcnDZx~܉g7M1̑ l|9n_K9J VF%U< )m6zuKo/XhEy#(Vxv)SElEM]w_ֈAۺ41j1anO#-EÌI#(YEģ;r{ht9YnH^ jhLtz4C-N&;C&"_odDtUYM%-nk7^yEmvujt`i#-FUe d:Mۺ$\D9A˨EU0#>˻ lb&+DlZIcU#ZM&{ _)wV1 L^&j@ qbE#Ǝ؛ƅM'7kY&jgjΩ82;b]%#+0 J|qL1)(%2IԪ]j꽅Uji6QJٖj)#ZLmŹmTFH!Ӱ4w ~vcrQsw60=0tnE]VBSQdžێ<\|#^(hD%݂mzSGy^mjp-{Rx-om0l*7P^?o>0aW&9-)z8<3ˋY3љ2Da"e~LIlMr!1ILQs`L;*A#(4߹@1mDҚy%|cVN}#+d<㹷7;Q緂Z'Hykhd&qmc8$nS-KRY{9üCO1UہFpvwd^1"=}?h6c44+R_U \6mta3|o.r;k!>m#+:41mB$r LkdN&pPeQ@8F.lECŁ辖 cш!ԍu#,v;RAV_CG`235Mq*EڣG͢#(iHB;r[[M+iۭ]IK3VVWU\^.Ijj .O9~qxdRk2#d?PfyOC@8=`c9U&-0K2\45Z=7] GcHlK܃,71#ņfr F gg_McᱲdPR 湕g:CeN~( @DLΣ2z#( k/W-t,[TZm4FjM!iQ@$T ; heק v"AдaU{##(8'Nۅ`@Ag`;* C*$6+<p`Fvl/@󗷀]5tZ/|sX-Xp!SGꑢ\&M{kczU ZKoxasweYU-RU"QLKyx"FtBTz˭f6fuj)eYƮ,N%M+']u9흞η#/!TF^mlޔW\mL#O{Cldwo8ZX iC);U6dIU͹Y~iݷ3!7稺(4QX0[0o#-19s<0?_Vvuꛍ"|3PXyOBf[l$ wGvD#+Xi#ˣlzHl趯2KGI<"yS6\|>`iB@Jƿkj6.j[YFȑҪtF^#+xB)Hhv׎7[%WxثM][r̆\mE:KHHʛsNj*dnmמxŢI6> X|ve^zeL9&-Z@4e"E X% O9"0Ը(Aw Ġ(aSΒim&hޮ#-.LX#-jH2{6ڔ'𺨦+b ScQh*-Ze`)&ƙI3TF̖Q #(Q!ƤR7"͑|{1N$fկ^i-&a$'~[.w7NC#+1{6j[4S+E/%6lU_k~kpկ]/nj)n5N-wi)#cmd+wWiJ֕٬Wm6o/ܱS#(>#+!CD#(c4 ]"6HfS(ڔ7|JAƒi]S#(Pȸuuxl[BgH{vt|לi!LC*p1@mhch?#+GRH>üGwuQZƍ cL.~RH1ew2M5 i"f ͩL3$ɷe8#+XGyǯ9NehU퓦 TcS5J.x4`xM#-c*+ G;䶤 q< g9m؂(z=P4q :5q]s4X* ;hV" :0gf;w+!;#+וdTڦgxǣ@ci0SVJ89C`z0S@Rbړm5kHii AlLbAXP#-BHXQ|ם/xQq&$@!3iÌ0* Šf"H@EKD|Jj#+#-#+n#(Z mZ#->牆1#-[qA!&1EZm;؞˼mvl/.[ץV0.ID"N2q0Z8nR@)e0*bTܕqY ќ$0X PDE#-,q#(E6>ZKUK`@zq* #Q,g8J7(hyS,ϻ "-p5}o\qϵ&fq ɓ*Pgrx<@$;DH yPL$P{> NLj'=3C(\Y]t`HGSk9UUDXsƜFL;-]g>A#+85ݺsYw ed6{:>&;w7'[2#(Ј JMS{`g?[T+5}VC֨ji-8 .(y[$EZ HEl,Q/0r+gD䜒AfOql!gdνW^a"Nq$SO`1#(1җ:HU(T*A1#(]J=Ɏ}gqmʐTIB*D!B/.Xxb]zx2W#-QwlJre)&4MV))60x#+6g]َt.Wwn\[ǒ4nܻ̱Ͷ[\ҫhKN)4%gwItٝ+)Stlm9j] Qw6K=p $^;l0=n@lGr#(S D B @v#-}"qNT}tOp*vA,U_'M5ZL0>1yw#-O#-{fӨdQ#(ɬ^we34kywmUhZP,#-` }^Vֽ5jƪХD"='7RPKM:뻩eb&UqF!Vorq""HFmQ o2dA^hR@K`f8A`(B,[U^Hkvgʞnջ%#k*F4#+߽s >*Y׌*ߢ *(M]`6tDUxD@")1[ViJeQ~F7:)1bAYi5F6%_{ߛ t }AAb*9ehTmˆ@?S;+T=1Sr3WwjI&z^qD$b@ T}1%{PeG8@Ȑ3lu76b:^(<ިyZJ#M>]@R`5$Kd!DJ#-TEd" p ؼs]$zx5Tv-B,yͲ(#+XXKEZ@#-Z "JLBKAT'UI$EL"AGZOqŎ쪰jxbS(HK#(ՒCZQP4i-i$MPa iFQFoVE+LfXt#(#-M۷&p8G}ڀRySXcߙ#(z*#-DiDTZƞTa?O F0#(NʡXHhB~(M)k_3QWdXf#+Q!c1E&h_{ o ؝."I!)(Bgji'n_MWsc> hR"<]wzABHUѬx2hnI4`#-$|"# L/7Y~ddj)%Pi}}Uu!;`Ƅ }Z-e4J((E76Ԏ3jLnF>L3NQI&C↍lP~\h(Ӊǝ#(̺A\#+PU aF$KOܝ~~ϴmp{5&fb<5\pcO/s0U>&͎%슇y!#ei߭H٣]M(WÂx#-cU Cz4 " ]W:r$:RI0\40e3ܝ;5r ._{Ù_tQm:.VfG3_eT)$#+@"4ZoFZM%\ZܾYz5JX׵=‹KZҾED_yZvxd/yTL:8O:uj5o'jz8׸sё#(%>6ca*3< x%@$NAQĆhۙGܴ\d@>$4t>>:w6 t}\9t'dP7lH;X/ YLv6iA2c}Uz9:x'^g 3KR{B#0/vR+#+2] "jv$> X7{H "E!Ciz.? z>OIv*/=ࠩ4ijnCYb3/4VKG-%Cַ̳"V ,$ o4#-,\#+@H6ҝn9ѫj*p. k;#+!Z$i.qgX $|_mmCA4{ 2?GgN~ XcrG2%%1ܞtޱTVl-san`'Eł7[ .ȿ\7H˜P7$"&T! #+bl;`Θ~a^.cj;xO4*S!diӎkRQbilٱbmjQ>#+Eh0܇%bcݟ:ZJ)֛h6*רyB&dfS KDZJ4J16&!&͓e շj(!#Cl%˛\YdнL$aKXs#-F-RWJ/2qP8#VBM&jpԚo@Ȉ4Z`c%+u8Ҏ`C(m4#+eۍ#5]EW,乺F7vRQ4J+52TJVٖA6ь0F4Xl0H#+@30i(c{dW($D$RD-WkLp*e5|]ٕ D:&$Tt61fUk—K51ZU]W#oI2.PQ̜LA13"^x TA0T"m#+,-zSӢJ&{g&AkAfʛ7a]3:M6 4hCC-("݂܌5NO9Da%!K#-"%TF l5U!=m5Kj>\(nfdc<n#(FD#(#+6&š" (@Ch*%EQR`F#+/i,!!Gښ$@'uH)LRPJg&+p$޺zGvn[z֒mE DXbAT]!K)Axb q0tx~;g0 EF:bwc#(WS`aX#-:A(#-9T*bI=vB*?Ҿ툣cmҭH+UB0C%#-6#.XJe,~, z滲0b0ى8:qٟi1~XDhXl͵dRanP:[zqd쐋:)0|vW3b)"E24xp$_n)۞1|nE : R@$Ia0^#-jHx!Zyo =/N0UulMy>=[:.ί̏uaڈ7}W䓻gx!<޾ҭ}й4$wq?c(C$I+]$,q{M!)zD6XtXꊅEsuirc@߄uȶZ,qe]%_3F*/2LӶQeTޔp}/_*f5nZU@bad8z1WYUh\L:xw)pjC$iRnME=B8?Iܴ(mS?˦NbqOMToΆQH~L1Ӻo#-ڒ?m잫#:\6Ò= KqeG|~Z%s9]sg8\x=Bv 0dՐk/a^lWyfijc3ItG}Z035ޭlSqf UK7JX:8ߝ pSmc2R>JU 3XgI#H{d ۗ|#+wl6D d"x/m58 LZ#+PRn#-B_s#+25`znr)eHxڊ#+dS|TɧEZ=ޟYbW(⚭].bqq0ZKR> ?=d{n)aļ3MMA^#-8b^_\ $9wi>=lvuhq#-CznCM 虘k[Ӱ4bm䳬jqLفfUIg#(kro:,OE@oXcrmL1:c-m,lƱN6!qd#-NYխ$+N8"6oYc;j}eg^)C6Øot>ؗ޺v/$fx6’bƱ!qHrɛkI$j;y#-xyqRƌ~trhD޷-v[Egsk|z>CL)pU- +rAPlYyQٚǬ.ڏGJ6҈nԫlJ]l[NW6C'JFo3G0{+<]Czc_lz==Hf("/c<_nQeB6ۖZr#+Y„cMUl6.u(0d#-oQe7sO =rGhdsCڟ0Y)O5fg'ȑOAM@(.T/ #+˴ӉxC=]AAg]ȸ$t[ę*ivhCZ$)ap; N;ݩ@͸5V,T9$aJ7{6\ jH×)[u8+x:&O4$344 xʭ%r:Qwm0F C<@(#-^#-r#-$n!@#ѩ#n׷r@P,(B³90tskLM fqD!#(.z%5P%dLe`V5#+(FA6A `심>͏a+'GfÖ?M'BܵN6:1T'2F >#-vBmqScʝK'j1=Q nQt#- DvJe-ʖ]視-E代uk]cb#+7p'0 A6t[ZWrʾy!*bH>mz~8T\##n*jStl>Աx Q$fKxeQ8x|#-wX pf#1na'L\Ve+\W`|Hsdnٷ 1\oo&]qt]Qfɬbޡ/jNv#+sn;{s̾\u+̺[T#-1fLʁު}17G8OPK6dsVժO*0W,)`ijĴ(}M'ƱUϷ2\,T]& /Bk@_2/YwG<=Gl oNd|8a#-7֜m䉰6'g=Jj ,$)Ŝ#+ņ. {6wɜvp BH]BEao$fmr%,)LЈX *ANqc &l8؇@@nP]0Ĺ3 8iѥlva#-wSh>VE.)[H# gcQȹ#+> ǘƗU<D@\Y}=>gh 8`/al2=h>e`c}BmNN]~'ƶU"Fŝ؍_7+Znz7н#KF@J׋Mrp껶w[uyxzUAl[%nmE0D,#(%E_PTZQmͪ6!B010`2*"#-JjArn}6PGggcTvϗݫ&3|"_q^6\Ki~UVsI@5OPvwJx>fˬxRcT&P|Kp vҏP.fiҫne4 3+m@,1K #-A #L Gz j숌N<)LZLM3&IU"UcD0 -k#-0K%V.PRɀILӃ.)+unF;;G^974BCQVkXdreoV h۱M*pU˔u MI_Vt!,/ Z%i=4Stn9ɑfL"2#(#(`2D6YTޮe|3Jɒ$nj8LU:@v{Kz}͊DnK8axm6&ijlNChc]x]g-[&rtC%c!nJB2#+n%48LLayգo[o&K,޼YOZ65#-G:C[5F#-cw rJ2efNJV[#-#+>#NH+gH;L:’&)+BQwE mc KGLgjSTGgm%g ReU[DA EG#-NHSIUc;jHb1ݟPa"28*(_k#-i\nYt[I:½3UP#+v@!S7#2w&7zH1+rqfo.1Z=/𱴔6Z\\gÌ o N#tݛ7w33<؋guN>:1pa8I7j~lMN^%C#('| _R#+Vݛi$U0"BTDD(XhAy꘧2#ڱp ETTkk#- !dLƲj+V4m6c6TXMiPM$TE SPj%"j4LѲl4hZF#+DLj#[k;Z)t`{'Q EDw)΍7+Ov]#+Bo@Mt{m^w$˫h'(,Sm4~#xyPR@Ķ1)!`p~qxcH$"6p7ֆȨ>!I!uF/#_w*e(r? ݽ's} wJ2_K ߀@'8)XDjm}+Va&F+bFr)#-H)T,s #-JP )#-Q*mVK=` Ei7?F]aơҢ SRLDPx9 ؘ[@VbZ@lx9V{_jIיF2MTܿTYљ%`vwJAD( X"1/Eö>L\2,H} H-ld#JE_gaER)")LF1D)!J#1R1mͥ:lG:x*E!Q&I s((C#kՐm#-h ŠRbo@0$G#(L׿04#JU#-I䰐UOca<߻ Hu{?d{t3%D6g=HFB~?^$A;sX23@j2rql+ KB\P _o߰VtZWoO65>F-}sEllw$#l燰~c Ge~*hXGAwm[jGm#+-I=񟞬IRSBt`IK$d`R] [Bz-:-Qi<ꆵBtZOHȵ\1^BD"NtvIIuQ3eKB'|(#-IRf<;!9:KnPRfO5*q!E(Z_L7vImQzcNq $DDRB(&%?Vq$= #-fg_os8*%=#3ud*h1f|[sjqɻ5t؆EYX!̑c#-f6BJfZזSҌ6F~NH5\]>,D<'QUon?g;g١S *`R$ 5^U1͠!J=(lAZ<3i%@3MDA$+.@v9a0#V&#(V3LۥsԱYƩC]!ۧ=#+DtAIDOr`l`RJ"*QMO3d0 P0)mlZEyH#+h͉* o!eGVQb% #,Nwq)dDHn9cZ]j#-3C&NX@l鵙F¡&fA` ^jgnۥA3VEL8#+1 ƙZY BqRv$m8\}10t>2ÂK[vRc>J߸qL5`?.I!!2QCz4e]J$x2kfX|u*b:"\0|;rN1XVaѥ#(xr3V2ethU 5qNT4e# ߝ=RY|F̙>Dk65>Q.-خPqJrF'VTmȥȽ0$(vCmE Z-嬺ԥbF Iƥ{ bׯ)GYh[퉦Q u$=:äK#-LIlXKDAVa xW54D!#+fm+Gt۹X~Ѩ,Yhjg\3@DsםHC2TJkݰ!YHʏ7qp*IɠXE2FčfqNۘR.Tl8}m/RtCo7$" ݿKo0[]Qm#(6$.M'Jh`Cf:){(\aKa@Q.: H~Wes." -yXh>>ͻӋ!Qt0V:61mPF],'qN憐aRaimy"aud֠lŚwwŹ4뇔`VMh~rLDh 6vf(<2M9BH۠]ӀLd{nUAxH);)؍^q##+t1|l(#&B BZ'#:2h%K|#-)頲ˁ=1#+m* w:.$R!&_Zb y$r̋@_-W u^;A/"d=yU$1XM!49}>b+-yUA 29KOe!?]]:bTdZxDc8~LHAL8r2"dV>, ;;d<eEpKf#(饉?3ZWR0!+G9@-CR3r^K\lk 7PޭНp$//$x#Lk辚DZtUK >Ȧ)Ǒ({ ̾)ݬ}yRvtҡ`T%1/V^]^i!(גhr5Tay`! d !D4MJC@3VNg'9wk)#K#+r#(L@H.lmPcbܢo ~(-nYmZQdjLEA/q -*)#+텕j$HtB$vcEP$.#(R[|#+"rXA22#"HB"i{{#(TUzg 2#( Hnq}z,|Fsh/O$0Qg"FD)#+ha48%d(6!b&FM0H#+ (`1ThU'BF.8@Ш2w#(XZP%Fv('acy$¾{&N.M,hjs !'wŒQS0Aϰu#+H*\ b#(K9p2bO6lG,Q>m[]/70EUm<&#("ȅG̓2L`?5*Q=,#-2IU(b, ]Fy;8(j]ʐm$~\2 mYN/tʞ  "s,0 hԪ 2lKBeԟQvrF-A/iYLRJj&1emla*FiEZ߼q$y&j_ہvwr{ny  t\<S^85$ .zrS.AױMB!)ާ]A4 "#(8HfE:m qUI#+ &}e}=U$8(F2ZI #%DMqx1r$kE|$`$-ﮮ3=glm&6 дԶ Ć&,vd&ctVng}j7$R@ZXell\~}($z{ӉHwj)D{[a=MJ27U8%6o> p0:`Y,"޳Rv?`!:N7j·0lV.gN:8._qЭ%& {>(4YB1E8[@%Y-)߭'#(w \@#+O𡣥5-QB4MAdP)Gz]bXEBdd󮢢K]aW˼*^^yz+8jSd-^FɍFV#rI3mnɷ2R0"U#+ݷE|Ǡٞ$4羐 )TdVDbd%ߞ5j-iRdLK,lٵ~?׊VFceFTm)M-޽5TD섥љBSĈSrtgh/Qn"M61f٘i4[RjjDQ:@D"*?x==>G0vbI=#- `phIS_"!d[, -u)*e$){$ߙBF$6ؼg$3Gy!Bl#+:4X*+!j65#-r`?vp#+a,6?88H6mY>ѧf%W-n%le0݁MLc?ϵ&R16H5E%DmU#-m+~%*mEIL,*[~/m#J#-D~0QO:d݄c P&CP|δe#(E.݀ov-u B@^kEBЛSe4~_wo4ǖ$wTD tM}fc@#J̤3It cKvch+eq֬m%I#CCFpl(IP(eOJm4Rf\vwexכT,ޕrT[fnʮks-^]kRP4Bh XH0U(,PIbX"SKdԙe\uo.󵷍E̫-۫u3V]5nju{_7#8D*TBaa6h~lPI8hr&Չ:h+I8 #(I.U]~TAU 53d'T(8ix!%_8#(0Od$lOV ("݌IfN, m}z7r-M#+R57p53F0faS>Eq\^/#&T#+iu,>I/љo/c쒴'ֆ#-*[#-Z(i8&M `VVгJQj }ov#+p`L[ߺfm! D[#'$f\Cl0نLfj(%#({M6hˠ!}ɓ,ϛ'pdLTvC`l(WVi\?|N @8,6p{ k_#+aE8 Nۚ D\sr7@JԒpeRIсf,?*r Wʭmڃp8QC'(YjrK׉F];SG~\ a9QS>Ҩroa!"0CT /m6'$9 F\Lxfj#-㚂22xaܓmBGߠSodC{ag#{s1 or&ǮOl̴4]1#(R}@-#(?_ V⃜#-Epb Ջ'?!)H S+}m}+M/|˂1P*O_oo_?z/vo~ju_o~>?{o|?~j.{#+#(@}C8+WA"!6|P*l XTT!9W;Hfg-U%>9 y]m'$*5a,cLsP\%Cuup#-#< H!نc1cgP+#(O)3OY3/7uԭLiԣRc1* #+`0ZhCՁ5Ww)%HZcc+#;3<]ojTԑ#+L{6Ʒ- :1?`ѨBeh8R4`G N'CKXS)`Xfi憛E Ìަڠ8և`."]?Y]$l!zdzV7FO:$;n(^{: zf2 ;B hY#\d@A8MQO"-èflّk6+UNF/\U 慚o5Sܒ9i1$D3]’r,#-•{>p`T@=8v%^_S o}#(GO)(&86k@V薈qъyDe_O>;I` ${{TGT}}' + book_template_rule = templater_path + ' ' + \ + book_template_path + ' "{0}" > ${{TGT}}' + lyrics_combined_rule = 'cd ' + built_lyrics_path + \ + ' && ${LUALATEX} --shell-escape ' + + scoredata = [] + scores = ctx.path.ant_glob(src_scores + '/*.ly') + for score in scores: + filename = os.path.basename(score.abspath()) + + lyricsfile = os.path.join(src_lyrics, filename.replace('.ly', '.tex')) + lilyfile = filename.replace('.ly', '.pdf') + lily_score_file = '{0}_score.pdf'.format( + lilyfile.replace('.pdf', '')) + lily_midi_file = lilyfile.replace('.pdf', '_score.midi') + target_files = '{0} {1} {2}'.format( + os.path.join(src_scores, lilyfile), + os.path.join(src_scores, lily_score_file), + os.path.join(src_scores, lily_midi_file)) + + score_content = '' + with open(score.abspath(), 'r') as f: + score_content = f.read() + + matches = re.findall('title = "(.*)"', score_content) + score_title = matches[0] + + scoredata.append( + {'title': score_title, + 'score': score.abspath(), + 'lyrics': os.path.abspath(lyricsfile)}) + + ctx.set_group('lilypond') + + # score without lyrics & midi + + ctx( + rule=lilypond_rule, + source=score, + target=target_files, + shell=True + ) + + # score with lyrics + + template_data = { + 'score_file': score.abspath(), + 'lyrics_file': os.path.abspath(lyricsfile) + } + + lyrics_rule = lyrics_template_rule.format(str(template_data)) + built_lyricsfile = os.path.join( + src_lyrics, + filename.replace('.ly', '_built.tex')) + + ctx( + rule=lyrics_rule, + source=lyricsfile, + target=built_lyricsfile, + shell=True + ) + + final_lyrics_path = os.path.join( + built_scores_path, filename.replace('.ly', '_lyrics.pdf')) + + lyrics_combined_rule_final = lyrics_combined_rule + \ + filename.replace('.ly', '_built.tex') + \ + ' && cp ' + filename.replace('.ly', '_built.pdf') + \ + ' ' + final_lyrics_path + + ctx( + rule=lyrics_combined_rule_final, + source=score.relpath() + ' ' + built_lyricsfile, + target=os.path.join( + src_scores, filename.replace('.ly', '_lyrics.pdf')), + shell=True + ) + + # opus + + ctx.set_group('opus') + ctx(source=os.path.join(src_scores, lily_midi_file)) + + # booklet + + template_data = { + 'scores': scoredata, + } + + book_rule = book_template_rule.format(str(template_data)) + built_bookfile = os.path.join(src_lyrics, 'book.tex') + + ctx.set_group('book') + ctx( + rule=book_rule, + source=os.path.relpath(book_template_path), + target=built_bookfile, + shell=True + ) + + final_book_path = os.path.join(built_scores_path, 'book.pdf') + book_combined_rule_final = lyrics_combined_rule + \ + 'book.tex' + \ + ' && cp book.pdf' + \ + ' ' + final_book_path + + book_sources = os.path.relpath(book_template_path) + for score in scoredata: + book_sources = '{0} {1} {2}'.format( + book_sources, + os.path.relpath(score['score']), + os.path.relpath(score['lyrics'])) + + ctx( + rule='{0} && {0}'.format(book_combined_rule_final), + source=book_sources, + target=os.path.join(src_scores, 'book.pdf'), + shell=True + )