Index: README.md ================================================================== --- README.md +++ README.md @@ -25,28 +25,40 @@ It contains the ABC parser and the SVG generation engine. It must be included in the (X)HTML header of the pages where ABC rendering is needed (in ` + Index: err-de.js ================================================================== --- err-de.js +++ err-de.js @@ -14,11 +14,11 @@ user.textrans = { "+: lyric without music": "+: Liedtext ohne Musik", "+: symbol line without music": "+: Symbolzeile ohne Musik", "+: without previous info field": "+: ohne vorhergehends Info-Feld", "'{' in grace note": "'{' in Verzierungsnote", - "'}', ')' or ']' missing in %%staves": "'}', ')' oder ']' fehlt in %%staves", + "'}', ')' or ']' missing in %%score": "'}', ')' oder ']' fehlt in %%score", "',' lacking in annotation '@x,y'": "',' fehlt in Beschriftung '@x,y'", "'$1' is not a note": "'$1' is keine Note", "'$1:' line ignored": "'$1:' Zeile ignoreirt", "$1: inside tune - ignored": "$1: innerhalb der Stimme ignoriert", "!$1! must be on a note": "!$1! muss an einer Note stehen", @@ -31,24 +31,24 @@ "%%deco: bad C function value '$1'": "%%deco: falscher C Funtionswert '$1'", "%%deco: cannot have a negative value '$1'": "%%deco: '$1' kann keinen egativen Wert haben", "%%multicol end without start": "%%multicol end ohne start", "%%multicol new without start": "%%multicol new ohne stand", "%%repeat cannot start a tune": "%%repeat kann nicht am Anfang einer Stimme stehen", - "%%select ignored": "%%select ignoriert", "%%staffwidth too big": "%%staffwidth zu groß", "%%staffwidth too small": "%%staffwidth zu klein", "%%tune not treated yet": "%%tune noch nicht behandelt", - "%%voice ignored": "%%voice ignoriert", "%%vskip cannot be negative": "%%vskip kann nicht negativ sein", "Bad !xstem!": "!xstem! fehlerhaft", "Bad %%setbarnb value": "fehlerhaft Wert für %%setbarnb", "Bad %%staff number $1 (cur $2, max $3)": "falsche %%staff Nummer $1 (cur $2, max $3)", "Bad %%staff value '$1'": "fehlerhafte %%staff Nummer '$1'", "Bad %%stafflines value": "fehlerhafter Wert für %%stafflines", "Bad %%staffscale value": "fehlerhafter Wert für %%staffscale", "Bad char '$1' in M:": "fehlerhaftes Zeichen '$1' in M:", "Bad character '$1'": "fehlerhaftes Zeichen '$1'", + "Bad character in grace note sequence": + "fehlerhaftes Zeichen in Sequenz von Vorschlagnoten", "Bad controller number in %%MIDI": "Bad controller number in %%MIDI", "Bad controller value in %%MIDI": "Bad controller value in %%MIDI", "Bad duration '$1' in M:": "fehlerhafte Dauer '$1' in M:", "Bad integer value": "fehlerhafte Ganzzahl", "Bad instr= value": "fehlerhafter Wert für instr=", @@ -55,19 +55,20 @@ "Bad L: value": "Fehlerhafter Wert für L:", "Bad note in %%map": "fehlerhafte Note in %%map", "Bad page width": "fehlerhafte Seitenbreite", "Bad program in %%MIDI": "falsches Program in %%MIDI", "Bad scale value in %%font": "fehlerhafter Wert für scale in %%font", + "Bad tempo value": "Bad tempo value", "Bad tie": "fehlerhafter Haltebogen", "Bad transpose value": "fehlerhafter Wert für transpose", "Bad user character '$1'": "falsches benutzerdefiniertes Zeichen '$1' in U:/%%user", "Bad value '$1' in %%linebreak - ignored": "fehlerhafter Wert '$1' in %%linebreak - ignoriert", "Bad value in $1": "fehlerhafter Wert in $1", - "Bad voice ID in %%staves": "Fehlerhafte ID für Stimme in %%staves", + "Bad voice ID in %%score": "Fehlerhafte ID für Stimme in %%score", "Bar in repeat sequence": "Taktstrich in Wiederholungssequenz", "Cannot have !$1! on a head": "!$1! im Kopfbereich nicht erlaubt", - "Cannot have %%fullsvg inside a tune": "'%%fullsvg' innerhalb einer Stimme nicht erlaubt", + "Cannot have '$1' inside a tune": "'$1' innerhalb einer Stimme nicht erlaubt", "Cannot have a bar in grace notes": "Taktstrich in Vorschlagnote nicht erlaubt", "Cannot have a broken rhythm in grace notes": "gebrochener Rythmus in Ziernoten nicht erlaubt ", "Cannot have V:* in tune body": "V:* im Notenbereich nicht erlaubt", "Cannot read file '$1'": "File '$1' kann nicht gelesen werden", "Decoration ignored": "Dekoration ignoriert", @@ -77,16 +78,16 @@ "Incorrect 2nd value in %%repeat": "zweiter Wert fehlerhaft in %%repeat", "Invalid 'r' in tuplet": "'r' fehlerhaft in Tuplet", "Invalid decoration '$1'": "fehlerhafte Dekoration '$1'", "Invalid note duration $1": "Fehlerhafte Notendekoration '$1'", "Lack of ']'": "']' fehlt", - "Lack of ending $1 in U:/%%user": "Ende von $1 fehlt in U:/%%user", - "Lack of starting ! or \" in U: / %%user": "! or \" fehlt in U: / %%user", + "Lack of starting [, ! or \" in U: / %%user": + "[, ! or \" fehlt in U: / %%user", "Line split problem - adjust maxshrink and/or breaklimit": "Probleme beim Aufteilen der Zeile - justiere maxshrink und/oder breaklimit", "Line too much shrunk $1 $2 $3": "Zeile zu stark geschrumpft $1 $2 $3", "Line underfull ($1pt of $2pt)": "Zeile nicht voll genug ($1pt of $2pt)", - "Misplaced '$1' in %%staves": "'$1' fehlerhaft platziert in %%staves", + "Misplaced '$1' in %%score": "'$1' fehlerhaft platziert in %%score", "Misplaced dot": "fehlerhaft platzierter Punkt", "Mix of old and new transposition syntaxes": "Mix von alter und neuer Transponierungs-syntax", "No $1 after %%$2": "kein $1 nach %%$2", "No in %%beginsvg sequence": "kein in %%beginsvg squenz", @@ -102,13 +103,13 @@ "No end of voice overlay": "kein Ende der Stimmüberlagerung", "No function for decoration '$1'": "keine Funktion für Dekoration '$1'", "No note before '-'": "keine Note vor '-'", "No note before '<'": "keine Note vor '<'", "No note in voice overlay": "keine Note in Stimmüberlagerung", +// "Non standard note duration $1": "??", "No read_file support": "Einlesen von Files nicht unterstützt", "No start of !$1!": "kein Start von !$1!", - "Not a note in grace note sequence": "Keine Note in Sequenz von Vorschlagnoten", "Not an ASCII character": "kein ASCII - Zeichen", "Not enough measure bars for lyric line": "nicht genug Takte für Liedtextzeile", "Not enough measure bars for symbol line": "Nicht genügend Takte für eine Symbolzeile", "Not enough measures for %%repeat": "nicht genug Takte für %%repeat", Index: err-fr.js ================================================================== --- err-fr.js +++ err-fr.js @@ -8,12 +8,12 @@ "+: lyric without music": "+: paroles sans musique", "+: symbol line without music": "+: plus de musique pour s:", "+: without previous info field": "Pas de ligne info avant +:", "'{' in grace note": "'{' dans notes d'agrément", - "'}', ')' or ']' missing in %%staves": - "Il manque '}', ')' ou ']' dans %%staves", + "'}', ')' or ']' missing in %%score": + "Il manque '}', ')' ou ']' dans %%score", "',' lacking in annotation '@x,y'": "Il manque une ',' dans l'annotation '@x,y'", "'$1' is not a note": "'$1' n'est pas une note", "'$1:' line ignored": "'$1:' ligne ignorée", "$1: inside tune - ignored": "$1: en milieu de morceau - ignoré", @@ -33,25 +33,25 @@ "%%deco: cannot have a negative value '$1'": "%%deco: '$1' ne peut pas avoir de valeur négative", "%%multicol end without start": "%%multicol end sans start", "%%multicol new without start": "%%multicol new sans start", "%%repeat cannot start a tune": "%%repeat ne peut pas être en début de morceau", - "%%select ignored": "%%select ignoré", "%%staffwidth too big": "%%staffwidth trop grand", "%%staffwidth too small": "%%staffwidth trop petit", "%%tune not treated yet": "%%tune n'est pas encore traité", - "%%voice ignored": "%%voice ignoré", "%%vskip cannot be negative": "%%vskip ne peut pas être négatif", "Bad !xstem!": "!xstem! erroné", "Bad %%setbarnb value": "Valeur incorrecte dans %%setbarnb", "Bad %%staff number $1 (cur $2, max $3)": - "Numéro $1 %%staff incorrect (cur $2, max $3)", + "Numéro %%staff $1 incorrect (cur $2, max $3)", "Bad %%staff value '$1'": "Valeur incorrecte '$1' dans %%staff", "Bad %%stafflines value": "Valeur incorrecte dans %%stafflines", "Bad %%staffscale value": "Valeur incorrecte dans %%staffscale", "Bad char '$1' in M:": "Mauvais caractère '$1' dans M:", "Bad character '$1'": "Mauvais caractère '$1'", + "Bad character in grace note sequence": + "Caractère incorrect dans notes d'agrément", "Bad controller number in %%MIDI": "Mauvais numéro de controleur dans %%MIDI", "Bad controller value in %%MIDI": "Mauvaise valeur de controle dans %%MIDI", "Bad duration '$1' in M:": "Durée '$1' incorrecte dans M:", "Bad integer value": "Mauvaise valeur entière", "Bad instr= value": "Mauvaise valeur de instr=", @@ -58,21 +58,21 @@ "Bad L: value": "Mauvaise valeur pour L:", "Bad note in %%map": "Note incorrecte dans %%map", "Bad page width": "Mauvaise largeur de page", "Bad program in %%MIDI": "Mauvais 'program' dans %%MIDI", "Bad scale value in %%font": "Mauvaise échelle dans %%font", + "Bad tempo value": "Mauvaise valeur de tempo", "Bad tie": "Mauvaise liaison de prolongation", "Bad transpose value": "Mauvaise valeur de transposition", "Bad user character '$1'": "Caractère illégal '$1' dans U:/%%user", "Bad value '$1' in %%linebreak - ignored": "Valeur incorrecte '$1' dans %%linebreak - ignorée", "Bad value in $1": "Mauvaise valeur dans $1", - "Bad voice ID in %%staves": "Mauvaise identité de voix dans %%staves", + "Bad voice ID in %%score": "Mauvaise identité de voix dans %%score", "Bar in repeat sequence": "Barre dans la séquence à répéter", "Cannot have !$1! on a head": "!$1! ne peut pas être sur une tête de note", - "Cannot have %%fullsvg inside a tune": - "'%%fullsvg' ne peut pas être dans un morceau", + "Cannot have '$1' inside a tune": "'$1' ne peut pas être dans un morceau", "Cannot have a bar in grace notes": "Il ne peut pas y avoir de barre dans les notes d'agrément", "Cannot have a broken rhythm in grace notes": "Il ne peut pas y avoir '<' ou '>' dans les notes d'agrément", "Cannot have V:* in tune body": @@ -86,18 +86,17 @@ "Incorrect 2nd value in %%repeat": "Deuxième valeur incorrecte dans %%repeat", "Invalid 'r' in tuplet": "'r' invalide dans le tuplet", "Invalid decoration '$1'": "Décoration '$1' invalide", "Invalid note duration $1": "Durée de note $1 invalide", "Lack of ']'": "']' manquant", - "Lack of ending $1 in U:/%%user": "Pas de $1 terminant U:/%%user", - 'Lack of starting ! or " in U: / %%user': - 'U: / %%user ne commence pas par ! ou "', + 'Lack of starting [, ! or " in U: / %%user': + 'U: / %%user ne commence pas par [, ! ou "', "Line split problem - adjust maxshrink and/or breaklimit": "Problème de découpe en lignes - ajuster maxshrink et/ou breaklimit", "Line too much shrunk $1 $2 $3": "Ligne trop compressée $1 $2 $3", "Line underfull ($1pt of $2pt)": "Trop d'espacement ($1pt of $2pt)", - "Misplaced '$1' in %%staves": "'$1' mal placé dans %%staves", + "Misplaced '$1' in %%score": "'$1' mal placé dans %%score", "Misplaced dot": "Point mal placé", "Mix of old and new transposition syntaxes": "Mélange des syntaxes de transposition ancienne et nouvelle", "No $1 after %%$2": "Pas de $1 après %%$2", "No in %%beginsvg sequence": @@ -115,14 +114,13 @@ "No end of voice overlay": "Pas de fin de superposition de voix", "No function for decoration '$1'": "Pas de fonction pour décoration '$1'", "No note before '-'": "Pas de note devant '-'", "No note before '<'": "Pas de note devant '<'", "No note in voice overlay": "Pas de note dans voix superposée", + "Non standard note duration $1": "Durée de note $1 non standard" "No read_file support": "La fonction read_file n'existe pas", "No start of !$1!": "Pas de début pour !$1!", - "Not a note in grace note sequence": - "Caractère incorrect dans notes d'agrément", "Not an ASCII character": "Ce n'est pas un caractère ASCII", "Not enough measure bars for lyric line": "Pas assez de barres pour la ligne de paroles", "Not enough measure bars for symbol line": "Pas assez de barres pour ligne s:", Index: err-it.js ================================================================== --- err-it.js +++ err-it.js @@ -8,12 +8,12 @@ "+: lyric without music": "+: parole senza musica", "+: symbol line without music": "+: linea di simboli senza musica", "+: without previous info field": "Nessun campo di informazioni prima di +:", "'{' in grace note": "'{' in nota di abbellimento", - "'}', ')' or ']' missing in %%staves": - "'}', ')' o ']' mancanti in %%staves", + "'}', ')' or ']' missing in %%score": + "'}', ')' o ']' mancanti in %%score", "',' lacking in annotation '@x,y'": "Manca una ',' nell'annotazione '@x,y'", "'$1' is not a note": "'$1' non è una nota", "'$1:' line ignored": "'$1:' linea ignorata", "$1: inside tune - ignored": "$1: nel corpo del brano - ignorato", @@ -33,15 +33,13 @@ "%%deco: cannot have a negative value '$1'": "%%deco: '$1' non può avere un valore negativo", "%%multicol end without start": "%%multicol end senza start", "%%multicol new without start": "%%multicol new senza start", "%%repeat cannot start a tune": "%%repeat non può stare all'inizio del brano", - "%%select ignored": "%%select ignorato", "%%staffwidth too big": "%%staffwidth troppo grande", "%%staffwidth too small": "%%staffwidth troppo piccolo", "%%tune not treated yet": "%%tune non ancora gestito", - "%%voice ignored": "%%voice ignorato", "%%vskip cannot be negative": "%%vskip non può essere negativo", "Bad !xstem!": "!xstem! errato", "Bad %%setbarnb value": "Valore errato in %%setbarnb", "Bad %%staff number $1 (cur $2, max $3)": "Numero $1 in %%staff errato (attuale $2, max $3)", @@ -48,10 +46,12 @@ "Bad %%staff value '$1'": "Valore errato '$1' in %%staff", "Bad %%stafflines value": "Valore errato in %%stafflines", "Bad %%staffscale value": "Valore errato in %%staffscale", "Bad char '$1' in M:": "Carattere errato '$1' in M:", "Bad character '$1'": "Carattere errato '$1'", + "Bad character in grace note sequence": + "Carattere errato nelle note di abbellimento", "Bad controller number in %%MIDI": "Numero errato del controller in %%MIDI", "Bad controller value in %%MIDI": "Valore errato del controller in %%MIDI", "Bad duration '$1' in M:": "Durata '$1' errata in M:", "Bad integer value": "Valore intero errato", "Bad instr= value": "Valore errato di instr=", @@ -58,21 +58,21 @@ "Bad L: value": "Valore errato per L:", "Bad note in %%map": "Nota errata in %%map", "Bad page width": "Larghezza di pagina errata", "Bad program in %%MIDI": "Numero di programma non valido in %%MIDI", "Bad scale value in %%font": "Valore di scala non valido in %%font", + "Bad tempo value": "Bad tempo value", "Bad tie": "Legatura non valida", "Bad transpose value": "Valore non valido per la trasposizione", "Bad user character '$1'": "Carattere illegale '$1' in U:/%%user", "Bad value '$1' in %%linebreak - ignored": "Valore errato '$1' in %%linebreak - ignorato", "Bad value in $1": "Valore errato in $1", - "Bad voice ID in %%staves": "ID di voce non valido in %%staves", + "Bad voice ID in %%score": "ID di voce non valido in %%score", "Bar in repeat sequence": "Stanghetta in sequenza ripetuta", "Cannot have !$1! on a head": "!$1! non è consentito su una nota", - "Cannot have %%fullsvg inside a tune": - "'%%fullsvg' non è consentito entro il brano", + "Cannot have '$1' inside a tune": "'$1' non è consentito entro il brano", "Cannot have a bar in grace notes": "Stanghette non consentite nelle note di abbellimento", "Cannot have a broken rhythm in grace notes": "'Broken rhythm' non consentito nelle note di abbellimento", "Cannot have V:* in tune body": @@ -86,18 +86,17 @@ "Incorrect 2nd value in %%repeat": "Secondo valore in %%repeat errato", "Invalid 'r' in tuplet": "'r' non valido in gruppo irregolare", "Invalid decoration '$1'": "Decorazione '$1' non valida", "Invalid note duration $1": "Durée de note $1 non valida", "Lack of ']'": "']' mancante", - "Lack of ending $1 in U:/%%user": "Manca $1 alla fine di U:/%%user", - 'Lack of starting ! or " in U: / %%user': - 'U: / %%user non inizia con ! o "', + 'Lack of starting [, ! or " in U: / %%user': + 'U: / %%user non inizia con [, ! o "', "Line split problem - adjust maxshrink and/or breaklimit": "Problema di linea divisa - modificare maxshrink e/o breaklimit", "Line too much shrunk $1 $2 $3": "Linea troppo compressa $1 $2 $3", "Line underfull ($1pt of $2pt)": "Linea troppo vuota ($1pt di $2pt)", - "Misplaced '$1' in %%staves": "'$1' in posizione errata in %%staves", + "Misplaced '$1' in %%score": "'$1' in posizione errata in %%score", "Misplaced dot": "Punto in posizione errata", "Mix of old and new transposition syntaxes": "Sintassi di trasposizione vecchia e nuova allo stesso tempo", "No $1 after %%$2": "Manca $1 dopo %%$2", "No in %%beginsvg sequence": @@ -114,14 +113,13 @@ "Gruppo irregolare non terminato in questa linea", "No function for decoration '$1'": "Funzione inesistente per la decorazione '$1'", "No note before '-'": "Nota mancante davanti a '-'", "No note before '<'": "Nota mancante davanti a '<'", "No note in voice overlay": "Nota mancante in voce sovrapposta (overlay)", +// "Non standard note duration $1": "??", "No read_file support": "La funzione read_file non è supportata", "No start of !$1!": "Manca l'inizio di !$1!", - "Not a note in grace note sequence": - "Carattere errato nelle note di abbellimento", "Not an ASCII character": "Non è un carattere ASCII", "Not enough measure bars for lyric line": "Battute insufficienti per le parole", "Not enough measure bars for symbol line": "Battute insufficienti per la linea s:", Index: err-pt_BR.js ================================================================== --- err-pt_BR.js +++ err-pt_BR.js @@ -7,12 +7,12 @@ user.textrans = { "+: lyric without music": "+: palavras sem música", "+: symbol line without music": "+: linha de símbolos sem música", "+: without previous info field": "+: continuação sem campo anterior", "'{' in grace note": "'{' em notinha ornamental", - "'}', ')' or ']' missing in %%staves": - "Falta '}', ')' ou ']' em %%staves", + "'}', ')' or ']' missing in %%score": + "Falta '}', ')' ou ']' em %%score", "',' lacking in annotation '@x,y'": "Falta uma ',' na anotação '@x,y'", "'$1' is not a note": "'$1' não é uma nota", "'$1:' line ignored": "'$1:' linha ignorada", "$1: inside tune - ignored": "$1: no meio da música - ignorando", @@ -32,25 +32,25 @@ "%%deco: cannot have a negative value '$1'": "%%deco: valor '$1' não pode ser negativo", "%%multicol end without start": "%%multicol end sem 'start'", "%%multicol new without start": "%%multicol new sem 'start'", "%%repeat cannot start a tune": "%%repeat não pode estar no início de uma música", - "%%select ignored": "%%select ignorado", "%%staffwidth too big": "%%staffwidth muito grande", "%%staffwidth too small": "%%staffwidth muito pequeno", "%%tune not treated yet": "%%tune ainda não é tratado", - "%%voice ignored": "%%voice ignorado", "%%vskip cannot be negative": "%%vskip não pode ser negativo", "Bad !xstem!": "!xstem! incorreto", "Bad %%setbarnb value": "Valor incorreto para %%setbarnb", "Bad %%staff number $1 (cur $2, max $3)": "Número incorreto $1 em %%staff (atual $2, máximo $3)", "Bad %%staff value '$1'": "Valor incorreto '$1' em %%staff", "Bad %%stafflines value": "Valor incorreto em %%stafflines", "Bad %%staffscale value": "Valor incorreto em %%staffscale", - "Bad char '$1' in M:": "Caractere inválido '$1' em M:", - "Bad character '$1'": "Caractere inválido '$1'", + "Bad char '$1' in M:": "Caráter inválido '$1' em M:", + "Bad character '$1'": "Caráter inválido '$1'", + "Bad character in grace note sequence": + "Caráter inválido em grupo de notinhas ornamentais", "Bad controller number in %%MIDI": "Número inválido do controlador em %%MIDI", "Bad controller value in %%MIDI": "Valor incorreto para controlador em %%MIDI", "Bad duration '$1' in M:": "Duração '$1' incorreta em M:", "Bad integer value": "Número inteiro incorreto", "Bad instr= value": "Valor incorreto para instr=", @@ -57,21 +57,21 @@ "Bad L: value": "Valor incorreto de L:", "Bad note in %%map": "Nota incorreta em %%map", "Bad page width": "Largura de página incorreta", "Bad program in %%MIDI": "Valor incorreto de instrumento %%MIDI", "Bad scale value in %%font": "Tamanho incorreto em %%font", + "Bad tempo value": "Bad tempo value", "Bad tie": "Ligadura de prolongamento incorreta", "Bad transpose value": "Valor incorreto de transposição", - "Bad user character '$1'": "Caractere ilegal '$1' em U:/%%user", + "Bad user character '$1'": "Caráter ilegal '$1' em U:/%%user", "Bad value '$1' in %%linebreak - ignored": "Valor incorreto '$1' em %%linebreak - ignorado", "Bad value in $1": "Valor incorreto em $1", - "Bad voice ID in %%staves": "Identificador de voz incorreto em %%staves", + "Bad voice ID in %%score": "Identificador de voz incorreto em %%score", "Bar in repeat sequence": "Barra de compasso em um fragmento %%repeat", "Cannot have !$1! on a head": "!$1! não pode estar em cabeça de nota", - "Cannot have %%fullsvg inside a tune": - "'%%fullsvg' não pode estar dentro de uma música", + "Cannot have '$1' inside a tune": "'$1' não pode estar dentro de uma música", "Cannot have a bar in grace notes": "Não pode haver barra de compasso em grupo de notinhas ornamentais", "Cannot have a broken rhythm in grace notes": "Não pode haver ritmo quebrado em notinhas ornamentais", "Cannot have V:* in tune body": "Não pode haver V:* no corpo da música", @@ -84,18 +84,17 @@ "Incorrect 2nd value in %%repeat": "Segundo valor incorreto em %%repeat", "Invalid 'r' in tuplet": "'r' inválido em quiáltera", "Invalid decoration '$1'": "Decoração '$1' inválida", "Invalid note duration $1": "Duração de nota $1 inválida", "Lack of ']'": "']' faltando", - "Lack of ending $1 in U:/%%user": "Falta de $1 final em U:/%%user", - 'Lack of starting ! or " in U: / %%user': - 'U: / %%user não começou com ! ou "', + 'Lack of starting [, ! or " in U: / %%user': + 'U: / %%user não começou com [, ! ou "', "Line split problem - adjust maxshrink and/or breaklimit": "Problema de quebra de linha - ajuste maxshrink e/ou breaklimit", "Line too much shrunk $1 $2 $3": "Linha muito encolhida $1 $2 $3", "Line underfull ($1pt of $2pt)": "Linha muito espaçada ($1pt de $2pt)", - "Misplaced '$1' in %%staves": "'$1' deslocado em %%staves", + "Misplaced '$1' in %%score": "'$1' deslocado em %%score", "Misplaced dot": "Ponto fora de lugar", "Mix of old and new transposition syntaxes": "Mistura de sintaxes de transposição antiga e nova", "No $1 after %%$2": "Falta $1 após %%$2", "No in %%beginsvg sequence": @@ -114,15 +113,14 @@ "No function for decoration '$1'": "Falta função para decoração '$1'", "No note before '-'": "Falta nota antes de '-'", "No note before '<'": "Falta nota antes de '<'", "No note in voice overlay": "Falta nota em superposição de vozes", + "Non standard note duration $1": "Duração não padronizada: $1", "No read_file support": "A função read_file não existe", "No start of !$1!": "Falta início de !$1!", - "Not a note in grace note sequence": - "Caractere inválido em grupo de notinhas ornamentais", - "Not an ASCII character": "Não é um caractere ASCII", + "Not an ASCII character": "Não é um caráter ASCII", "Not enough measure bars for lyric line": "Faltam barras de compasso na linha de palavras (letra)", "Not enough measure bars for symbol line": "Faltam barras de compasso na linha de símbolos", "Not enough measures for %%repeat": "Faltam compassos para %%repeat", Index: font.js ================================================================== --- font.js +++ font.js @@ -1,377 +1,400 @@ // abc2svg music font -var musicfont = 'url("data:application/x-font-ttf;base64,\ -AAEAAAAOAIAAAwBgRkZUTYGiLYcAAFMIAAAAHEdERUYAFQAUAABS7AAAABxPUy8yWLxbCQAAAWgA\ -AABWY21hcM7xzSEAAAPMAAADKmN2dCAAIgKIAAAG+AAAAARnYXNw//8AAwAAUuQAAAAIZ2x5ZvUw\ -oLYAAAgEAABCqGhlYWQNXJHdAAAA7AAAADZoaGVhCWn/CwAAASQAAAAkaG10eM2n+wQAAAHAAAAC\ -CmxvY2HVL+UYAAAG/AAAAQhtYXhwAMoBPQAAAUgAAAAgbmFtZcjHNnAAAEqsAAADGHBvc3TQFqwa\ -AABNxAAABR8AAQAAAAEAAGk1jGtfDzz1AAsEAAAAAADRlyIXAAAAANgjLVL/OPzvBUsEiAAAAAgA\ -AgAAAAAAAAABAAAEiPzvAFwEJf84/XQFSwABAAAAAAAAAAAAAAAAAAAAggABAAAAgwEMAAUAAAAA\ -AAIAAAABAAEAAABAAC4AAAAAAAEBlwGQAAUACAKZAswAAACPApkCzAAAAesAMwEJAAACAAUDAAAA\ -AAAAAAAAARAAAAAAAAAAAAAAAFBmRWQAQAAA6qQDM/8zAFwEiAMRAAAAAQAAAAAAAAF2ACIAAAAA\ -AVUAAAGQAAACWAAAAFcAAAFK/7ACE/+wANL/sAAjAAAAIwAAACMAAABkAAAEIwAABCUAAAHg/9wD\ -XgB6AwsAAALSAAACv/+6AdYAAAMLAAADDgAAAyf/yADIAAABrgAAASIAAAGQAAABfAAAAZAAAAGQ\ -AAABgQAAAZAAAAGQAAABgQAAAZkACQGYAAkB9AAAAQQAFAEEAAoCawAkAhIAAAHCAAABSQAAAUAA\ -AAFK//4BLAAAAjAAAAFKAAABSgAAAGQAAAE7AAABOwAAATsAAAE7AAABOwAAATsAAAE7AAABOwAA\ -ATsAAAE7AAABDQAAAMgAAAD/AAABCwAUAW4AAAENADIBbv/1AKkAAAE6AAABQP/9AFAAAAFAAAAB\ -QAAAARgAAAJYAAAAtgAAAIIAAACCAAABLAAAASwAAADuAAAA/wAAAUkAAAGPAAAB2AAAAdgAAANT\ -AAACM//wAyD/4QIz/7QBuP/bAV//fgIzAAACM//kAr//tAIz/7QCv/+0Ayv/2wFf/9sCaf9+AV//\ -fgJp/34BXwAAAf0ABQG1AAABtQAAAkQADQJEAA0BGAAAATYAAAEs//8BLAAAAPoAAADIAAABGP84\ -APoAAADIAAAEDQAAAhwADAH0AAAB9AAAAfQAAAH0AAAB9AAAAfQAAAB4AAAALQAAAhwAAAD6AAD/\ -6gAAAAAAAwAAAAMAAAAcAAEAAAAAAiQAAwABAAAAHAAEAggAAAB+AEAABQA+AAAAIOAA4CTgMOA5\ -4EPgSOBQ4FzgYuBp4H3gjOCV4KTgqeCz4QHhueG74efiSeJk4oPkoOSi5KTkqOSs5MDkzuTq5O7l\ -AeUi5SXlLeUx5TnlZ+Vp5W3lguXQ5eLmEOYS5hTmGOYk5jDmUOZV6RLpFekY6SDpJeld6gLqpP//\ -AAAAAAAg4ADgIuAw4DjgQ+BF4FDgXOBi4GngeuCA4JTgoOCp4LPhAeG54bvh5+JA4mDigOSg5KLk\ -pOSo5KzkwOTO5OHk7uUA5SDlJOUp5S/lOeVm5WnlbOWC5dDl4uYQ5hLmFOYY5iTmMOZQ5lXpEOkU\ -6RjpIOkl6V3qAuqk//8AA//kIAUf5B/ZH9IfyR/IH8Efth+xH6sfmx+ZH5IfiB+EH3sfLh53HnYe\ -Sx3zHd0dwhumG6UbpBuhG54bixt+G2wbaRtYGzobORs2GzUbLhsCGwEa/xrrGp4ajRpgGl8aXhpb\ -GlAaRRomGiIXaBdnF2UXXhdaFyMWfxXeAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\ -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\ -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGAAADAAAAAAAAAAECAAAA\ -AgAAAAAAAAAAAAAAAAAAAAEAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\ -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\ -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\ -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\ -AAAAAAAAAAAAAAAAAAAAAAAAIgKIAAAAKgAqACoANgA+AG4AfACKAJgApACwAL4A3AFQAawCHAJe\ -AvADggPkA/gElAUmBX4FvAXeBfIGRAaUBrQG+gc6B3QHwAgACEYIoAi0CNoJAAkyCU4JcAmcCbIJ\ -zAoCChAKHAooCjoKVApuCqIK1gsqC3QL1AwyDKgNHA1CDVwNjA22Dg4ONA6ODq4O7A8UDygPNA9C\ -D1IPeg+gD6wPuA/ED9AP8hAYEE4QnBD8EXARhhGsEdoSPhK2ExQTXBO4FRIWHhbYF5gYaBkEGeIa\ -/hwAHEIchhzQHOodDh0iHTYdZh12HYgdpB26Hd4eDh7wH6wf1B/yICQgYiCUINYg6CD2IRIhLCFU\ -AAIAIgAAATICqgADAAcALrEBAC88sgcEAO0ysQYF3DyyAwIA7TIAsQMALzyyBQQA7TKyBwYB/Dyy\ -AQIA7TIzESERJzMRIyIBEO7MzAKq/VYiAmYAAAEAAAAAAZEBkAADAAAxESERAZEBkP5wAAEAAAAA\ -AAAAAAAAAAAxAAABAAAAAABXBAMAIAAAETU2NTQnJjU0NwYVFBcWFRQHFhUUBwYVFBcmNTQ3NjU0\ -NSMSVz8VJU1NJRU/VxIjAgMCGEM2YDk0ZjoySyI5YU1hGBhmTGA5JUoyOmY0OWA2SAAB/7D/7AGa\ -ABQAAwAAJyEVIVAB6v4WFCgAAAAAAf+w/+wCYgAUAAMAACchFSFQArL9ThQoAAAAAAH/sP/sASIA\ -FAADAAAnIRUhUAFy/o4UKAAAAAABAAAAAAAjA+gAAwAAETMRIyMjA+j8GAABAAAB9AAjA+gAAwAA\ -ETMRIyMjA+j+DAABAAAC+AAjBFYAAwAAETcRIyMjBEwK/qIAAAAAAgAAAUAAZAKeAAcADwAAEiIm\ -NDYyFhQCIiY0NjIWFEcqHR0qHR0qHR0qHQI6HSodHSr+6R0qHR0qAAAABQAAAAAEJAGuAC8ANwA/\ -AEcAUwAAITUzHgEzMjY1NCcuBDU0NjMyFhc3MxcjLgEjIgYVFB4DFx4BFRQGIyInByAiJjQ2MhYU\ -BCImNDYyFhQBETMyNjQmIwM1MxEjNTMyFhUUIwJOHhVPMik7lBkaKhYRWT0kJxkeHgceD0owHzkQ\ -IhkyCE5NW09FLiMBmyodHSod/eoqHR0qHf6JKDxGRjzcRkbccYn6oDxLICEtKAcIFBQjFUNNCw4Z\ -mzpIKBsPFw8JCwIVNzM6TiAgHSodHSodHSodHSoBaf6YYaZh/noeAWgeZ2vSAAUAAAAABCQBrgAa\ -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\ -NTQ2MzIWFRQGIyIuATU0NyYjIgYVFB4CFx4BFRRQHjISDA4XDAYYFiEJCxgGPDctIjYWEAgQCwUQ\ -Dg8ZERIeBRsXKxsQFg0LGAwSFhILDwcNBCYqIy0kGBAYCQ8KCAgUEQ0JEwwRAxIfFVoAAAH/5P//\ -AOcBEAA/AAAnBi4BPwEuASMqASMiDgEHBicmNz4BNxYzMj4BMzIXFhQPAQ4BFRQeARcWNicuATU0\ -NjMyFRQHBgciJiMuASMiCgYLAQWwCBcRBQwHBREUBQ8EAwgMCwEwIhkgEQcFCAsHngEBECwXCAwD\ -AyQUDCYkERIDBQIXNAkSAwQIDQbBBAMbIQQNCwkSHjACAwMEAQERB6cDAwIFAQkLBA8JCAgUCxM3\ -KhUJAQEDDQAF/7T/iAVLARgAGwA1ANkA8AELAAAlFjMyPgE3PgY1NCYnJiMiBgcOAhUUBRYzMjY3\ -PgU1NCYnJiMiBgcGFRQeARciJwczMhQrASI0OwETPgI1NC4CIyIOAwcGJjc2NzYzMhYXPgEzMhc+\ -ATMyFhc+ATMyFz4BMzIWFz4BMzIXPgEzMhYXPgEzMhYVFAYjIicHMzIUKwEiNDsBEz4CNTQmIyIG\ -BxUUBiMiJwczMhQrASI0OwETPgI1NCYjIgYHFRQGIyInBzMyFCsBIjQ7ARM0PgM0NTQmIyIGBxUU\ -BiUWMzI2Nz4ENTQmJyYjIgYHBhUUBRYzMjY3PgY1NCYnJiMiDgEHBhUUFgIKAwQMHx4JAgMCAgIB\ -AQcIAwMTNAsFBwP+ywMEEjIOAgMDAwEBBwgDAxM0Cw8EBwgWGS00CwvhCwtLaAEDAgECBQMIDA8L\ -GQoFGwUxDxgkIyQHHSYjLxMSIhsjJAcdJiMvExIiGyMkBx0mIy8TEiIbIyQHHSYjHi1rSRYZLTQL\ -C+ELC0toAQMCBQYOFBRrSRYZLTQLC+ELC0toAQMCBQYOFBRrSRYZLTQLC+ELC0toAQIBAgUGDhQU\ -awODAwQSMg4CBAMDAQcIAwMTNAsP/ssDBBIyDgIDAgICAQEHCAMDDCEeBw8JKAEYKhcECgkLCgoL\ -BRAXAwEzHA0bGAsoBwE1JAULDAwMDAYQFwMBMxwmJQwUDSogeh4eAR0CCA4GAwUFAgcUEiwQCA8J\ -WBAZExoeDzIcFhMaHg8yHBYTGh4PMhwWExoeDzQwR20geh4eAR0CCA4GBwgYIwFHbSB6Hh4BHQII\ -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\ -AzsBPgEzMhYVFAYjIiY1NDc2NCMiBwYHFz4BMzIWFRQGIyImNTQ3NjQjIg4HBzMyFhQGKwEOASMi\ -JjU0NjMyFhUUBwYVFDMyPgcBX5shdl8gMBcTEhcSChkLEA8LDQoODRQKNQkKAQMEBgNBFGk0IDAX\ -ExIXEgoZJhcDAZsUaTQgMBcTEhcSChkHDAoHCAUGAwYBNgkLCwk/IXZfIDAXExIXEgoZCxAPCw0K\ -Dw0U5sXBJiAaIhQPDgsHDQ4GERMlJDw3VScMCQMFBQQCS18mIBoiFA8OCwYccwwGAUtfJiAaIhQP\ -DgsGHAULChQNGg0eBgwQDMXBJiAaIhQPDgsHDQ4GERMlJDw3VQAAAAAB/37/YAN0AbgAswAAEzM+\ -ATMyFhUUBiMiJjU0NzY0IyIHBgcXPgEzMhYVFAYjIiY1NDc2NCMiDgcHMzIWFRQOASsBDgEjIiY1\ -NDYzMhYVFAcGFRQzMj4HNyMOASMiJjU0NjMyFhUUBwYVFDMyPgc3Iw4BIyImNTQ2MzIWFRQHBhUU\ -MzI+BzcjIiY1ND4DOwE+ATMyFhUUBiMiJjU0NzY0IyIOAgcGzJwUaTQgMBcTEhcSChkmFwMBmxRp\ -NCAwFxMSFxIKGQcMCgcIBQYDBgE2CQoECQY/IXZfIDAXExIXEgoZCxAPCw0KDw0UCpshdl8gMBcT\ -EhcSChkLEA8LDQoODRUKmyF2XyAwFxMSFxIKGQsQDwsNCg4NFAo1CQoBAwQGA0EUaTQgMBcTEhcS\ -ChkOFQ4IBgIBDktfJiAaIhQPDgsGHHMMBgFLXyYgGiIUDw4LBhwFCwoUDRoNHgYMCAUJBsXBJiAa\ -IhQPDgsHDQ4GERMlJDw3VSfFwSYgGiIUDw4LBw0OBhETJSQ7OFUnxcEmIBoiFA8OCwcNDgYREyUk\ -PDdVJwwJAwUFBAJLXyYgGiIUDw4LBhwTJyIbCgAB/37/YASAAbgA5wAAARc+ATMyFhUUBiMiJjU0\ -NzY0IyIHBgcXPgEzMhYVFAYjIiY1NDc2NCMiDgcHMzIWFAYrAQ4BIyImNTQ2MzIWFRQHBhUUMzI+\ -BzcjDgEjIiY1NDYzMhYVFAcGFRQzMj4HNyMOASMiJjU0NjMyFhUUBwYVFDMyPgc3Iw4BIyImNTQ2\ -MzIWFRQHBhUUMzI+BzcjIiY1ND4DOwE+ATMyFhUUBiMiJjU0NzY0IyIHBgcXPgEzMhYVFAYjIiY1\ -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\ -AAIABwGlAAEAAAAAAAMAJAH3AAEAAAAAAAQABwIsAAEAAAAAAAUACQJIAAEAAAAAAAYABwJiAAMA\ -AQQJAAAA/AAAAAMAAQQJAAEADgF9AAMAAQQJAAIADgGVAAMAAQQJAAMASAGtAAMAAQQJAAQADgIc\ -AAMAAQQJAAUAEgI0AAMAAQQJAAYADgJSAEMAbwBwAHkAcgBpAGcAaAB0ACAAXAAyADUAMQAgADIA\ -MAAxADgAIABKAGUAYQBuAC0ARgByAGEAbgBjAG8AaQBzACAATQBvAGkAbgBlAC4AIABUAGgAaQBz\ -ACAAZgBvAG4AdAAgAGkAcwAgAGwAaQBjAGUAbgBzAGUAZAAgAHUAbgBkAGUAcgAgAHQAaABlACAA\ -UwBJAEwAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBzAGUAIABcACgAaAB0AHQAcAA6\ -AC8ALwBzAGMAcgBpAHAAdABzAC4AcwBpAGwALgBvAHIAZwAvAE8ARgBMAFwAKQAuAABDb3B5cmln\ -aHQgXDI1MSAyMDE4IEplYW4tRnJhbmNvaXMgTW9pbmUuIFRoaXMgZm9udCBpcyBsaWNlbnNlZCB1\ -bmRlciB0aGUgU0lMIE9wZW4gRm9udCBMaWNlbnNlIFwoaHR0cDovL3NjcmlwdHMuc2lsLm9yZy9P\ -RkxcKS4AAGEAYgBjADIAcwB2AGcAAGFiYzJzdmcAAFIAZQBnAHUAbABhAHIAAFJlZ3VsYXIAAEYA\ -bwBuAHQARgBvAHIAZwBlACAAMgAuADAAIAA6ACAAYQBiAGMAMgBzAHYAZwAgADoAIAAyADcALQAx\ -ADEALQAyADAAMQA4AABGb250Rm9yZ2UgMi4wIDogYWJjMnN2ZyA6IDI3LTExLTIwMTgAAGEAYgBj\ -ADIAcwB2AGcAAGFiYzJzdmcAAFYAZQByAHMAaQBvAG4AIAAgAABWZXJzaW9uICAAAGEAYgBjADIA\ -cwB2AGcAAGFiYzJzdmcAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgwAAAAEAAgEC\ -AAMBAwEEAQUBBgEHAQgBCQEKAQsBDAENAQ4BDwEQAREBEgETARQBFQEWARcBGAEZARoBGwEcAR0B\ -HgEfASABIQEiASMBJAElASYBJwEoASkBKgErASwBLQEuAS8BMAExATIBMwE0ATUBNgE3ATgBOQE6\ -ATsBPAE9AT4BPwFAAUEBQgFDAUQBRQFGAUcBSAFJAUoBSwFMAU0BTgFPAVABUQFSAVMBVAFVAVYB\ -VwFYAVkBWgFbAVwBXQFeAV8BYAFhAWIBYwFkAWUBZgFnAWgBaQFqAWsBbAFtAW4BbwFwAXEBcgFz\ -AXQBdQF2AXcBeAF5AXoBewF8AX0BfgF/AYAGLm5vZGVmB3VuaUUwMDAHdW5pRTAyMgd1bmlFMDIz\ -B3VuaUUwMjQHdW5pRTAzMAd1bmlFMDM4B3VuaUUwMzkHdW5pRTA0Mwd1bmlFMDQ1B3VuaUUwNDYH\ -dW5pRTA0Nwd1bmlFMDQ4B3VuaUUwNTAHdW5pRTA1Qwd1bmlFMDYyB3VuaUUwNjkHdW5pRTA3QQd1\ -bmlFMDdCB3VuaUUwN0MHdW5pRTA3RAd1bmlFMDgwB3VuaUUwODEHdW5pRTA4Mgd1bmlFMDgzB3Vu\ -aUUwODQHdW5pRTA4NQd1bmlFMDg2B3VuaUUwODcHdW5pRTA4OAd1bmlFMDg5B3VuaUUwOEEHdW5p\ -RTA4Qgd1bmlFMDhDB3VuaUUwOTQHdW5pRTA5NQd1bmlFMEEwB3VuaUUwQTEHdW5pRTBBMgd1bmlF\ -MEEzB3VuaUUwQTQHdW5pRTBBOQd1bmlFMEIzB3VuaUUxMDEHdW5pRTFCOQd1bmlFMUJCB3VuaUUx\ -RTcHdW5pRTI0MAd1bmlFMjQxB3VuaUUyNDIHdW5pRTI0Mwd1bmlFMjQ0B3VuaUUyNDUHdW5pRTI0\ -Ngd1bmlFMjQ3B3VuaUUyNDgHdW5pRTI0OQd1bmlFMjYwB3VuaUUyNjEHdW5pRTI2Mgd1bmlFMjYz\ -B3VuaUUyNjQHdW5pRTI4MAd1bmlFMjgxB3VuaUUyODIHdW5pRTI4Mwd1bmlFNEEwB3VuaUU0QTIH\ -dW5pRTRBNAd1bmlFNEE4B3VuaUU0QUMHdW5pRTRDMAd1bmlFNENFB3VuaUU0RTEHdW5pRTRFMgd1\ -bmlFNEUzB3VuaUU0RTQHdW5pRTRFNQd1bmlFNEU2B3VuaUU0RTcHdW5pRTRFOAd1bmlFNEU5B3Vu\ -aUU0RUEHdW5pRTRFRQd1bmlFNTAwB3VuaUU1MDEHdW5pRTUyMAd1bmlFNTIxB3VuaUU1MjIHdW5p\ +var musicfont = 'url("data:application/octet-stream;base64,\ +AAEAAAAOAIAAAwBgRkZUTYTd79wAAFggAAAAHEdERUYAFQAUAABYBAAAABxPUy8yWLxdCwAAAWgA\ +AABWY21hcFxKS5kAAAQIAAADemN2dCAAIgKIAAAHhAAAAARnYXNw//8AAwAAV/wAAAAIZ2x5Zp27\ +6QgAAAiwAABGeGhlYWQPFh8MAAAA7AAAADZoaGVhCWn/GwAAASQAAAAkaG10eNzF+scAAAHAAAAC\ +SGxvY2GpopfcAAAHiAAAASZtYXhwANkBPQAAAUgAAAAgbmFtZbni4sIAAE8oAAADG3Bvc3Qtfw6A\ +AABSRAAABbUAAQAAAAEAAI87udRfDzz1AAsEAAAAAADRlyIXAAAAANncuoH/OPzvBUsEiAAAAAgA\ +AgAAAAAAAAABAAAEiPzvAFwEJf84/XQFSwABAAAAAAAAAAAAAAAAAAAAkgABAAAAkgEMAAUAAAAA\ +AAIAAAABAAEAAABAAC4AAAAAAAEBhgGQAAUACAKZAswAAACPApkCzAAAAesAMwEJAAACAAUDAAAA\ +AAAAAAAAARAAAAAAAAAAAAAAAFBmRWQAQAAA7LcDM/8zAFwEiAMRAAAAAQAAAAAAAAF2ACIAAAAA\ +AVUAAAGQAAACWAAAAFcAAAFK/7ACE/+wANL/sAAjAAAAIwAAACMAAABkAAAEIwAABCUAAAHg/9wD\ +XgB6AwsAAALSAAACv/+6AdYAAAMLAAADDgAAAyf/yADIAAABrgAAASIAAAGQAAABfAAAAZAAAAGQ\ +AAABgQAAAZAAAAGQAAABgQAAAZkACQGYAAkB9AAAAQQAFAEEAAoCawAkAhIAAAHCAAABSQAAAUAA\ +AAFK//4BLAAAAjAAAAFKAAABSgAAAGQAAAFAAAABQAAAAUAAAAFAAAAAZAAAATYAAADmAAABNgAA\ +ATsAAAE7AAABOwAAATsAAAE7AAABOwAAATsAAAE7AAABOwAAATsAAAENAAAAyAAAAP8AAAELABQB\ +bgAAAQ0AMgFu//UAqQAAAToAAAFA//0AUAAAAUAAAABkAAABGAAAAlgAAAC2AAAAggAAAIIAAAEs\ +AAABLAAAAO4AAAD/AAABSQAAAY8AAAHYAAAB2AAAA1MAAAIz//ADIP/hAXv/tAG4/9sBFv9+ARP/\ +2wDcAAAA6P/kAr//tAIz/7QCv/+0Ayv/2wFf/9sCaf9+AV//fgJp/34BXwAAAf0ABQG1AAABtQAA\ +AkQADQJEAA0BGAAAATYAAAEs//8BLAAAAPoAAADIAAABGP84APoAAADIAAAEDQAAAhwADAH0AAAB\ +9AAAAfQAAAH0AAAB9AAAAfQAAAB4AAAALQAAAhwAAAD6AAAA+v/oAcIAAAFIAAABQAAAAgoAAAIK\ +AAAAZAAAAAAAAwAAAAMAAAAcAAEAAAAAAnQAAwABAAAAHAAEAlgAAACSAIAABgASAAAAIOAA4CTg\ +MOA54EPgSOBQ4FzgYuBp4H3gjOCV4KTgqeCz4QHhueG74efh8uH04ffh+eH84gDiSeJk4oPkoOSi\ +5KTkqOSs5MDkzuTq5O7lAeUl5S3lMeU55WflaeVt5YLl0OXi5hDmEuYU5hjmJOYw5lDmVekS6RXp\ +GOkg6SXpXeoC6qTso+yl7Kfsqey3//8AAAAAACDgAOAi4DDgOOBD4EXgUOBc4GLgaeB64IDglOCg\ +4Kngs+EB4bnhu+Hn4fLh9OH34fnh/OH+4kDiYOKA5KDkouSk5KjkrOTA5M7k4eTu5QDlIOUp5S/l\ +OeVm5WnlbOWC5dDl4uYQ5hLmFOYY5iTmMOZQ5lXpEOkU6RjpIOkl6V3qAuqk7KLspeyn7Knst///\ +AAP/5CAFH+Qf2R/SH8kfyB/BH7YfsR+rH5sfmR+SH4gfhB97Hy4edx52HkseQR5AHj4ePR47Hjod\ ++x3lHcobrhutG6wbqRumG5Mbhht0G3EbYBtCGz8bPhs3GwsbChsIGvQapxqWGmkaaBpnGmQaWRpO\ +Gi8aKxdxF3AXbhdnF2MXLBaIFecT6hPpE+gT5xPaAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\ +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\ +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\ +AAAAAAAAAAAAAQYAAAMAAAAAAAAAAQIAAAACAAAAAAAAAAAAAAAAAAAAAQAABAAAAAAAAAAAAAAA\ +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\ +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\ +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\ +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiAogAAAAqACoAKgA2\ +AD4AbgB8AIoAmACkALAAvgDcAVABrAIcAl4C6gN8A9wD8ASMBR4FdgW0BdYF6gY8BowGrAbyBzIH\ +bAe4B/gIPgiYCKwI0gj4CSoJRgloCZQJqgnECfoKCAoUCiAKMgpOCnAKfgqSCqQKtAsACxALKgtE\ +C3wLtAwCDE4MtA0WDZQODA4yDkwOfA6mDv4PJA9+D54P3BAEEBgQJBAyEEIQahCQEJwQqBC0EMAQ\ +4hEIET4RjBHsEmASdhKcEsoTHhOSE+YUJhRqFMAWGhcmF+AYoBlwGgwa6hwGHQgdSh2OHdgd8h4W\ +HioePh5uHn4ekB6sHsIe5h8WH/ggtCDcIPohLCFqIZwh3iHwIf4iGiI0IloifCKqIsQi7iMqIzwA\ +AAACACIAAAEyAqoAAwAHAC6xAQAvPLIHBADtMrEGBdw8sgMCAO0yALEDAC88sgUEAO0ysgcGAfw8\ +sgECAO0yMxEhESczESMiARDuzMwCqv1WIgJmAAABAAAAAAGRAZAAAwAAMREhEQGRAZD+cAABAAAA\ +AAAAAAAAAAAAMQAAAQAAAAAAVwQDACAAABE1NjU0JyY1NDcGFRQXFhUUBxYVFAcGFRQXJjU0NzY1\ +NDUjElc/FSVNTSUVP1cSIwIDAhhDNmA5NGY6MksiOWFNYRgYZkxgOSVKMjpmNDlgNkgAAf+w/+wB\ +mgAUAAMAACchFSFQAer+FhQoAAAAAAH/sP/sAmIAFAADAAAnIRUhUAKy/U4UKAAAAAAB/7D/7AEi\ +ABQAAwAAJyEVIVABcv6OFCgAAAAAAQAAAAAAIwPoAAMAABEzESMjIwPo/BgAAQAAAfQAIwPoAAMA\ +ABEzESMjIwPo/gwAAQAAAvgAIwRWAAMAABE3ESMjIwRMCv6iAAAAAAIAAAFAAGQCngAHAA8AABIi\ +JjQ2MhYUAiImNDYyFhRHKh0dKh0dKh0dKh0COh0qHR0q/ukdKh0dKgAAAAUAAAAABCQBrgAvADcA\ +PwBHAFMAACE1Mx4BMzI2NTQnLgQ1NDYzMhYXNzMXIy4BIyIGFRQeAxceARUUBiMiJwcgIiY0NjIW\ +FAQiJjQ2MhYUAREzMjY0JiMDNTMRIzUzMhYVFCMCTh4VTzIpO5QZGioWEVk9JCcZHh4HHg9KMB85\ +ECIZMghOTVtPRS4jAZsqHR0qHf3qKh0dKh3+iSg8RkY83EZG3HGJ+qA8SyAhLSgHCBQUIxVDTQsO\ +GZs6SCgbDxcPCQsCFTczOk4gIB0qHR0qHR0qHR0qAWn+mGGmYf56HgFoHmdr0gAFAAAAAAQkAa4A\ +GgAiACoAMgA+AAAhIiY1NDYzMhYXNzMXByYjIgYUFjMyNjcXDgEyIiY0NjIWFAQiJjQ2MhYUAREz\ +MjY0JiMDNTMRIzUzMhYVFCMDAmd1glolKRseHgghJF44NjY4Nk0RIxRZsSodHSod/eoqHR0qHf6J\ +KDxGRjzcRkbccYn6a2dldwwSHqYEjG2YbUk+CkpRHSodHSodHSodHSoBaf6YYaZh/noeAWgeZ2vS\ +AAAAA//cAAIB3gKzAAcADwBNAAAAIiY0NjIWFAQiJjQ2MhYUFzQ2MzIWFRQHFjMyNjU0LwEDJxMu\ +ATU0PgE3NjMyFhUUBiMiJjU0NyYjIgYVFB8BExcDHgEVFA4BBwYjIiYBniAYGCAY/n4gGBggGFsb\ +FBMeLBcpJjYme88r0VpIHBMUJjMwOBsUEx4sFykmNiZ61CvVWkgcExQmMzA4AVIYIBgYIFQYIBgY\ +INMSHBoRHQ4XLSYtJmX+3iABJUdxOBYtERETOCESHBoRHQ4XLSYtJmUBJh/+10dyOBYtERETOAAF\ +AHr/NANeAlQAFwAbAB8AIwAnAAABMxUeARczFSMOAQcVIzUuAScjNTM+ATcRIxYXNxU2NyczJicH\ +NQYHAdgoVXgHiooHeFUoVXgHiooHeFVwBWsoawVwcAVrKGsFAlSJCItgKGCLCImJCItgKGKJCP7l\ +ug7IyA66KLoOyMkOuwAAAAAEAAD9bwKnBIgACwBEAE4AYwAAAQYVFBc+ATU0Jw4BExcVFAYjIiY1\ +NDYzMhYUBgcWMzI2PQEnBiMiJjU0Nz4GPwEmNTQ2NxYVFAYHFzYzMhYVFCc0JiMiBiMTPgEnDgEV\ +FBYXLgE1NDcnDgEHHgEzMjcBbAcFSHU2OUJLF09NUl9AMi9BPy8tGC9AFxwNmNs6DSQgLh0xEhcW\ +DWxJYlx5FBQLcYhOYlACBwIhW0HiNkYnHT0/phGPbAECoXkKFgNTNy0jWjGVSHINB177bOwDTFxT\ +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\ +JFRDXSkDDQQ3ZUUzGaskVENdKQQMBDdlRTMZqyRUQ10pAw4DN2VFMxmrJFRDXSkEDAQ3ZUUzGQAA\ +BQAA/bwBPAJ5ACMAMAA9AEoAVwAAGQEzMj4CNTQnFhUUBxYVFAcWFRQHFhUUBxYVFA4FBzUyPgI1\ +NCY1DgMnMj4CNTQmNQ4DJzI+AjU0JjUOAycyPgI1NCY1DgMeHFVXPQUeExISEhISEhIcLjg7MycG\ +HVVXPQEVVk1ECR1VVz0BFVZNRAkdVVc9ARVWTUQJHVVXPQEVVk1E/bwDVylId0QhGTk2KykrLC0n\ +KywtJyssLScrLCVIPTo3MzkbqilJeEQDDQQpXUNUhilJeEQDDQQpXUNUhilJeEQDDQQpXUNUhilJ\ +eEQDDQQpXUNUAAAAAgAA/2QA4QGwAAoAFgAANyIGHQE2NzY1NCY3MhYVFAcGIxEzETZnFCsiJisd\ +ByM5S1JEKCN6JhO5Dzg7LxsmJjIjSUxSAkz+vDQAAAIAAP6GAMUBegADAAwAABc3NQcRFTcRIzUH\ +ETcckJCpGawBZS2WLQFJ6DT9wOIzAkMBAAACAAD+mAD/AWgAAwAfAAA3FTc1AyM1BzU3NQc1NzUz\ +FTc1MxU3FQcVNxUHFSM1B1NaWh41NTU1HlodNTU1NR1aRqcbp/43ow9cD6cPWg+onxyrow9cD6cP\ +Wg+onxwAAAABABT/hAELAHoAHgAAFzUmJwcwFSM1MzcnMCM1MxUWFzcwNTMVIwYHFzAzFcMoDDNI\ +OTMzOUghEjRIOSETNDl8OyYNMztKMjJIOSIRMzlHIhE0SAAEAAD/agFsAbAADgAcACsAOgAANw4B\ +HQEyNzY3NjU0JyYjNzIWFRQHBgcGIxEzETYXDgEdATI3Njc2NTQnJiM3MhYVFAcGBw4BIxEzETZO\ +ER4OHh8MBAoQERkdKwkYKzUvHxnRER0QHh0LBgsQDxYfKgsZKBY3Fh4bfQEeEMYpKzQNGR4UFSY5\ +IRIgOTRAAkb+wTImAR0RxikvMBMTHBYVJjYkFhw+LxslAkb+wTIAAAIAMv9kAQ0BsAAKABYAADci\ +BhUUFxYXNTQmJzIXETMRIicmNTQ2qxcgLi4aKjM6IyM6Uk85eiYbMEVCA8sSHiY0AUT9tFJQRSMy\ +AAAE//X/agFsAbAADgAdACwAOwAANyMiBwYVFBcWFxYzNTQmJzIXETMRIiYnJicmNTQ2Fw4BHQEy\ +NzY3NjU0JyYjNzIWFRQHBgcOASMRMxE2VwEREAoEDB8eDh4rMBkfFjcXKxgJK+kRHRAeHQsGCxAP\ +Fh8qCxkoFjcWHht9FRQeGQ00KynGEB4nMgE//bolGzQ5IBIhOSYBHRHGKS8wExMcFhUmNiQWHD4v\ +GyUCRv7BMgAAAAABAAD+wACpAUAAEwAAEzMVNxUHFTcVBxUjNQc1NzUHNTdEHkdHR0ceRERERAFA\ +og5cDn8OWg+oog5cDn8OWg8AAwAA/pgBOgFoACMAJwArAAA3NTMVNxUHFTcVBxUjNQcVIzUPASM1\ +BzU3NQc1NzUzFTc1MxUDNQcVNxU3NekeMzMzMx49HjwBHjMzMzMePR4ePVs9wKieD1wPnw9aD7Wq\ +EqykEKieD1wPnw9aD7WqEqyk/v2eEZ+4nhGfAAH//QAAAT8A9AAYAAA3BiMiJjU0PwE2LwEmNTQ2\ +MzIxFwUWFRQHEgIDBwkGzw4OzQgLBwECAR8ODgEBEAgKA0kHBk8DCwoSAWsGDg0FAAAAAQAAAAAA\ +UABQAAkAADU0NjIWFAYjIiYXIhcXERAYKBEXFyIXGAAAAAEAAAAAAUAAKAADAAAxNSEVAUAoKAAA\ +AAEAAAAAAGQBGAADAAAzAzMDKChkKAEY/ugAAAABAAAAAAEYATUABQAAMRsBIycHjIxBWFoBNf7L\ +xsYAAAIAAAAAAlgBSgAOABkAADE0NjMyHgIVIy4BIgYHISImNDYzMhYVFAazeTlrVTMPC6LgogsB\ +HBclJRcZIyOYsixRgE1uhoZuJDAkJBgZIwAAAQAAAAAAtgEtABcAABMyFhcWFRQHDgEjJyY1NDY1\ +NCMuATU0NlYbGxAaMhlEEAYBRxQbKC0BLQwRHTA9PB0tAwECCGsTDwEmHB4xAAEAAP8GAIIA+gAD\ +AAA1MxEjgoL6/gwAAAEAAAAAAIIA+gADAAA1MxUjgoL6+gAAAAEAAP+DASwAAAADAAAxIRUhASz+\ +1H0AAAEAAAAAASwAfQADAAA1IRUhASz+1H19AAEAAP5+AOsBhwATAAATFwcXJiMiBhUUFyY1NDYz\ +MhcnNym9Z2wyNB8mOHg0JSIih2QBh+XZzy4kHTU0S00jLRW8tAAAAQAA/w0BAADAABYAADcOAiMi\ +JjU0NjIWFRQHMjY3NjIXAyerAxkaEys3JjgpFyIzIQIVA5YwPAEHBCkoHyAeGR0bISwCAv5vEAAA\ +AAEAAP4MAUgAwAAkAAAXBiMiJjU0NjMyFhUUBzI/AQYjIiY1NDYzMhYVFAcyNzYyFwMnqyghKzcn\ +GxwpF0ELPDYYKzcnGxwpF0guAhUDxS3EDCgoICAfGR0bIsoMKSgfIB4ZHRtNAgL9bgwAAAEAAP4M\ +AY8BwAA2AAA3BiMiJjU0NjMyFhUUBzI/ASIOASMiJjU0NjMyFhUUBzI3NjIXAScTBiMiJjU0NjMy\ +FhUUBzI39igfKzcnGxwpFz8LOgEgHBMrNycbHCkXSC4BFgP+9C1VKCErNycbHCkXQQs8DCgoICAf\ +GR0bIssJBCkoHyAeGR0bTQIC/G4MASQMKCggIB8ZHRsiAAAAAAEAAP0MAdoBwABFAAATBiMiJjU0\ +NjMyFhUUBzI/AQYjIiY1NDYzMhYVFAcyPwEGIyImNTQ2MzIWFRQHMj8BIg4BIyImNTQ2MhYVFAcy\ +NzYyFwEnqyghKzcnGxwpF0ELOighKzcnGxwpF0ELOigfKzcnGxwpFz8LOgEgHBMrNyY4KRdILgIV\ +A/6pLf48DCgoICAfGR0bIsoMKCggIB8ZHRsiygwoKCAgHxkdGyLLCQQpKB8gHhkdG00CAvtuDAAA\ +AAEAAP0MAhkCrgBWAAAlBiMiJjU0NjMyFhUUBzI/AQYjIiY1NDYzMhYVFAcyPwEiDgEjIiY1NDYz\ +MhYVFAcyNzYyFwEnEwYjIiY1NDYzMhYVFAcyPwEGIyImNTQ2MzIWFRQHMjcBPyghKzcnGxwpF0EL\ +NigfKzcnGxwpFz8LNAEgHBMrNycbHCkXSC4BFgP+ai1VKCErNycbHCkXQQs6KCErNycbHCkXQQs0\ +DCgoICAfGR0bIsQMKCggIB8ZHRsixwkEKSgfIB4ZHRtNAgL6gAwBJAwoKCAgHxkdGyLIDCgoICAf\ +GR0bIgABAAD/GgNSAOYACwAANTMVITUzESM1IRUjGQMgGRn84BnmfX3+NH19AAAAAAP/8P8GAiYA\ ++gAHAA8AEwAANiImNDYyFhQAIiY0NjIWFAUBMwFQMiMjMiMBiDIjIzIj/dIBuH7+R0sjMiMjMv7P\ +IzIjIzJaAfT+DAAE/+H/BgMHAPoABwAPABMAFwAANiImNDYyFhQAIiY0NjIWFAUBMwEzATMBQTIj\ +IzIjAncyIyMyI/zjAbh7/kd5Abh7/kdLIzIjIzL+zyMyIyMyWgH0/gwB9P4MAAL/tP+IAXwBGAAR\ +ADsAADcWMzI2NzY1NCcmIyIGBwYVFBciJwczMhQrASI0OwETNjU0IyIOAwcGJjc2NzYzMhYXPgEz\ +MhYVFAbFAgUSMg4NDwIEEjULDycqGS00CwvhCwtLaAYLCAwPCxkKBRsFMQ8YJCMkBx0mIx4tWSgB\ +NSQgJiUFATMcJyQpLiB6Hh4BHRIMDwcUEiwQCA8JWBAZExoeDzQwSWsAAAH/2//2Ab4BGABTAAA3\ +BgcGKwEiPwE2JiMiBgcGJjc+AzMyFzYzMhc+ATMyFhUUDwEGFRQzMjc+BTc2FgcOAiMiJjU0PwE2\ +NTQjIg8BBgcnBiY/ATY1NCMiB1AHCAQENQ0NQgQGCA0WJAUVBBQQIh8SNwskJC0JCykTGSQFLwQI\ +AQQFCwcMAw0BBhUGEhctHxUZBTQBFRsIQQgPJg0IBEMBFRsIFREDARqnDQ8aOQgMCSUaMBIoKCgQ\ +GCMaCw99CwkOAgMJBg8FEgEJDQsfHxoWEw0NiAIEDhSrFgEBAQ8IqwIEDhQAAAAB/37/YAFeAbgA\ +QQAAByImNTQ2MzIWFRQHBhUUMzI+BzcjIjU0OwE+ATMyFhUUBiMiJjU0NzY0IyIOBwczMhQrAQ4B\ +MiAwFxMSFxIKGQsQDwsNCg4NFAo1ExFBFGk0IDAXExIXEgoZBwwKBwgFBgMGATYTEz8hdqAmIBoi\ +FA8OCwcNDgYREyUkPDdVJxUTS18mIBoiFA8OCwYcBQsKFA0aDR4GKMXBAAAB/9sAAAETARMAKgAA\ +Nz4BJiMiBg8BBgcGKwEiPwE2JiMiBgcGJjc+ATMyFhc2MzIWFRQjIiY1NNAFAwMFFCQJPwcIBAQ1\ +DQ1CBAYIDhciBRUEITgiGx0EHyQaICsPG+cDBwQsGJwRAwEaow0PGjUIDAk8QBoNJx4ZNxYNFAAA\ +AAEAAAAAANwBGAAxAAAzIiY1NDYyFhUUBxYzMjY1NC4CJyY1NDYzMhYVFAYjIiY1NDcmIyIGFRQe\ +AhcWFRRQHjIVGhcQDBMWIQkLGAY6Ny0iNhYQDRYHDxEPGRESHgUwKxsQFhAMEhAQFhILDwcNBCUw\ +IygkGBAYFA4DDhMRDQkTDBEDICtVAAAB/+T//ADnAQ8APAAAJwYuAT8BIgYjIiYOAQcGJyY3PgE3\ +HgEzMjYzMhcWFA8BBhUUMzI2MzIXFjc2JyI1NDYzMhUUBisBLgEjIgoGCwEFsAUfDAMUDB8FDwQD\ +CAwLAQ4vFSIrBAgFCweeAgIBDQYaIw0IBQckEg0mKB4dGCUIDgMECA0GwQYGAjIFDQsJEh4wAgEG\ +CwEBEQenBgIDAxoKDg0DHQ4VNx4vAxgABf+0/4gFSwEYABsANQDZAPABCwAAJRYzMj4BNz4GNTQm\ +JyYjIgYHDgIVFAUWMzI2Nz4FNTQmJyYjIgYHBhUUHgEXIicHMzIUKwEiNDsBEz4CNTQuAiMiDgMH\ +BiY3Njc2MzIWFz4BMzIXPgEzMhYXPgEzMhc+ATMyFhc+ATMyFz4BMzIWFz4BMzIWFRQGIyInBzMy\ +FCsBIjQ7ARM+AjU0JiMiBgcVFAYjIicHMzIUKwEiNDsBEz4CNTQmIyIGBxUUBiMiJwczMhQrASI0\ +OwETND4DNDU0JiMiBgcVFAYlFjMyNjc+BDU0JicmIyIGBwYVFAUWMzI2Nz4GNTQmJyYjIg4BBwYV\ +FBYCCgMEDB8eCQIDAgICAQEHCAMDEzQLBQcD/ssDBBIyDgIDAwMBAQcIAwMTNAsPBAcIFhktNAsL\ +4QsLS2gBAwIBAgUDCAwPCxkKBRsFMQ8YJCMkBx0mIy8TEiIbIyQHHSYjLxMSIhsjJAcdJiMvExIi\ +GyMkBx0mIx4ta0kWGS00CwvhCwtLaAEDAgUGDhQUa0kWGS00CwvhCwtLaAEDAgUGDhQUa0kWGS00\ +CwvhCwtLaAECAQIFBg4UFGsDgwMEEjIOAgQDAwEHCAMDEzQLD/7LAwQSMg4CAwICAgEBBwgDAwwh\ +HgcPCSgBGCoXBAoJCwoKCwUQFwMBMxwNGxgLKAcBNSQFCwwMDAwGEBcDATMcJiUMFA0qIHoeHgEd\ +AggOBgMFBQIHFBIsEAgPCVgQGRMaHg8yHBYTGh4PMhwWExoeDzIcFhMaHg80MEdtIHoeHgEdAggO\ +BgcIGCMBR20geh4eAR0CCA4GBwgYIwFHbSB6Hh4BHQEDBQUGBwMHCBgjAUdtKAE1JAYNDw4PBxAX\ +AwEzHCYlKAcBNSQECgkLCgoLBRAXAwEYJRImJRIaAAAE/7T/iAQGARgAfQCYALQAzgAAISInBzMy\ +FCsBIjQ7ARM+AjU0JiMiBgcVFAYjIicHMzIUKwEiNDsBEzQ+AzQ1NCYjIgYHFRQGIyInBzMyFCsB\ +IjQ7ARM+AjU0LgIjIg4DBwYmNzY3NjMyFhc+ATMyFz4BMzIWFz4BMzIXPgEzMhYXPgEzMhYVFAYn\ +FjMyNjc+BjU0JicmIyIOAQcGFRQWBRYzMj4BNz4GNTQmJyYjIgYHDgIVFAUWMzI2Nz4FNTQmJyYj\ +IgYHBhUUHgEDUhYZLTQLC+ELC0toAQMCBQYOFBRrSRYZLTQLC+ELC0toAQIBAgUGDhQUa0kWGS00\ +CwvhCwtLaAEDAgECBQMIDA8LGQoFGwUxDxgkIyQHHSYjLxMSIhsjJAcdJiMvExIiGyMkBx0mIx4t\ +a0wDBBIyDgIDAgICAQEHCAMDDCEeBw8J/sIDBAwfHgkCAwICAgEBBwgDAxM0CwUHA/7LAwQSMg4C\ +AwMDAQEHCAMDEzQLDwQHIHoeHgEdAggOBgcIGCMBR20geh4eAR0BAwUFBgcDBwgYIwFHbSB6Hh4B\ +HQIIDgYDBQUCBxQSLBAIDwlYEBkTGh4PMhwWExoeDzIcFhMaHg80MEdtKAE1JAQKCQsKCgsFEBcD\ +ARglEiYlEhoDARgqFwQKCQsKCgsFEBcDATMcDRsYCygHATUkBQsMDAwMBhAXAwEzHCYlDBQNAAP/\ +tP+IAsEBGABXAHEAjQAAMyInBzMyFCsBIjQ7ARM+AjU0LgIjIg4DBwYmNzY3NjMyFhc+ATMyFz4B\ +MzIWFz4BMzIWFRQGIyInBzMyFCsBIjQ7ARM0PgM0NTQmIyIGBxUUBicWMzI2Nz4FNTQmJyYjIgYH\ +BhUUHgEFFjMyPgE3PgY1NCYnJiMiBgcOAhUUyBYZLTQLC+ELC0toAQMCAQIFAwgMDwsZCgUbBTEP\ +GCQjJAcdJiMvExIiGyMkBx0mIx4ta0kWGS00CwvhCwtLaAECAQIFBg4UFGtMAwQSMg4CAwMDAQEH\ +CAMDEzQLDwQHAUoDBAwfHgkCAwICAgEBBwgDAxM0CwUHAyB6Hh4BHQIIDgYDBQUCBxQSLBAIDwlY\ +EBkTGh4PMhwWExoeDzQwR20geh4eAR0BAwUFBgcDBwgYIwFHbSgBNSQFCwwMDAwGEBcDATMcJiUM\ +FA0CARgqFwQKCQsKCgsFEBcDATMcDRsYCygAAAL/2/+IAysBGAB6AI8AACU2NzYzMhYXPgEzMhYV\ +FAYjIicHMzIUKwEiNDsBEz4DNTQmIyIOAwcOASMiJjU0Nj8CNCMiDwEGBycGJj8BNjU0JiMiDwEG\ +BwYrASI/ATYmIyIGBwYmNz4DMzIXNjMyFz4BMzIeAxUUDwEGFRQzMjc+ARcWMzI2Nz4BNTQmJyYj\ +IgYHBhUUFgGtMRQYIiMkBx0mIx4ta0kWGS00CwvhCwtLaAEBAwEFBgcPEg4YCBo8LRUZAgM0ARUb\ +CEEIDyYNCARDAQwJGwhEBwgEBDUNDUIEBggNFiQFFQQUECIfEjcLJCQtCQspEwoSDwsHBS8ECAID\ +DyXRAwQSMg4GBwcIAwMTNAsPCXdsGB0TGh4PNDBHbSB6Hh4BHQIFCQkFBwgNHxs1EDY4FRQGDQeI\ +Bg4UqxYBAQEPCKsDAwYIFKwRAwEapw0PGjkIDAklGjASKCgoEBgGCw8TCg0NfQsJDgIINTkBNSQP\ +JhEQFwMBMxwmJRIaAAL/2/9gAxkBuABXAJ8AADcGBwYrASI/ATYmIyIGBwYmNz4DMzIXNjMyFz4B\ +MzIeAxUUDwEGFRQzMjc+BTc2FgcOAiMiJjU0Nj8CNCMiDwEGBycGJj8BNjU0JiMiBxMiJjU0NjMy\ +FhUUBwYVFDMyPgc3IyImNTQ2OwE+ATMyFhUUBiMiJjU0NzY0IyIOBwczMhYVFA4BKwEOAVAHCAQE\ +NQ0NQgQGCA0WJAUVBBQQIh8SNwskJC0JCykTChIPCwcFLwQIAgMFCwcMAw0BBhUGEhctHxUZAgM0\ +ARUbCEEIDyYNCARDAQwJGwj1IDAXExIXEgoZCxAPCw0KDg0UCjUJCgkIQRRpNCAwFxMSFxIKGQcM\ +CgcIBQYDBgE2CQsFCQY/IXYVEQMBGqcNDxo5CAwJJRowEigoKBAYBgsPEwoNDX0LCQ4CAwkGDwUS\ +AQkNCx8fGhUUBg0HiAYOFKsWAQEBDwirAwMGCBT+nyYgGiIUDw4LBw0OBhETJSQ8N1UnDAkIC0tf\ +JiAaIhQPDgsGHAULChQNGg0eBgwIBQkGxcEAAAAAAf9+/2ACaQG4AHsAACUjDgEjIiY1NDYzMhYV\ +FAcGFRQzMj4HNyMiJjU0PgM7AT4BMzIWFRQGIyImNTQ3NjQjIgcGBxc+ATMyFhUUBiMiJjU0NzY0\ +IyIOBwczMhYUBisBDgEjIiY1NDYzMhYVFAcGFRQzMj4HAV+bIXZfIDAXExIXEgoZCxAPCw0KDg0U\ +CjUJCgEDBAYDQRRpNCAwFxMSFxIKGSYXAwGbFGk0IDAXExIXEgoZBwwKBwgFBgMGATYJCwsJPyF2\ +XyAwFxMSFxIKGQsQDwsNCg8NFObFwSYgGiIUDw4LBw0OBhETJSQ8N1UnDAkDBQUEAktfJiAaIhQP\ +DgsGHHMMBgFLXyYgGiIUDw4LBhwFCwoUDRoNHgYMEAzFwSYgGiIUDw4LBw0OBhETJSQ8N1UAAAAA\ +Af9+/2ADdAG4ALMAABMzPgEzMhYVFAYjIiY1NDc2NCMiBwYHFz4BMzIWFRQGIyImNTQ3NjQjIg4H\ +BzMyFhUUDgErAQ4BIyImNTQ2MzIWFRQHBhUUMzI+BzcjDgEjIiY1NDYzMhYVFAcGFRQzMj4HNyMO\ +ASMiJjU0NjMyFhUUBwYVFDMyPgc3IyImNTQ+AzsBPgEzMhYVFAYjIiY1NDc2NCMiDgIHBsycFGk0\ +IDAXExIXEgoZJhcDAZsUaTQgMBcTEhcSChkHDAoHCAUGAwYBNgkKBAkGPyF2XyAwFxMSFxIKGQsQ\ +DwsNCg8NFAqbIXZfIDAXExIXEgoZCxAPCw0KDg0VCpshdl8gMBcTEhcSChkLEA8LDQoODRQKNQkK\ +AQMEBgNBFGk0IDAXExIXEgoZDhUOCAYCAQ5LXyYgGiIUDw4LBhxzDAYBS18mIBoiFA8OCwYcBQsK\ +FA0aDR4GDAgFCQbFwSYgGiIUDw4LBw0OBhETJSQ8N1UnxcEmIBoiFA8OCwcNDgYREyUkOzhVJ8XB\ +JiAaIhQPDgsHDQ4GERMlJDw3VScMCQMFBQQCS18mIBoiFA8OCwYcEyciGwoAAf9+/2AEgAG4AOcA\ +AAEXPgEzMhYVFAYjIiY1NDc2NCMiBwYHFz4BMzIWFRQGIyImNTQ3NjQjIg4HBzMyFhQGKwEOASMi\ +JjU0NjMyFhUUBwYVFDMyPgc3Iw4BIyImNTQ2MzIWFRQHBhUUMzI+BzcjDgEjIiY1NDYzMhYVFAcG\ +FRQzMj4HNyMOASMiJjU0NjMyFhUUBwYVFDMyPgc3IyImNTQ+AzsBPgEzMhYVFAYjIiY1NDc2NCMi\ +BwYHFz4BMzIWFRQGIyImNTQ3NjQjIg4HAdicFGk0IDAXExIXEgoZJhcDAZsUaTQgMBcTEhcSChkH\ +DAoHCAUGAwYBNgkKCgk/IXZfIDAXExIXEgoZCxAPCw0KDw0UCpshdl8gMBcTEhcSChkLEA8LDQoO\ +DRQKmyF2XyAwFxMSFxIKGQsQDwsNCg8NFAqbIXZfIDAXExIXEgoZCxAPCw0KDg0UCjUJCgEDBAYD\ +QRRpNCAwFxMSFxIKGSYXAwGbFGk0IDAXExIXEgoZBwwKBwgFBgMGAQ8BS18mIBoiFA8OCwYccwwG\ +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\ +eVkyPHpYMR8eBi45OCUyEgG5/m9GaTgnRWocAU7vNVxHTnVJSHJBSe8AAAAAAgAA/3kCCwKoAB8A\ +KAAAJTURMx4EFRQHFhUUBzY1NCYjERQGIyImNTQ2MzITHgEXNDY1NCYBIh4JMDg2IxUWIgV2OHlZ\ +Mjx6WDE9DoUbAXZr5gFXJEc7QlgzJTIwJC5BGSFfnv7WRmk4J0VqAXY7ojUDDgNfnwAAAQAA/84A\ +ZAAyAAcAABYiJjQ2MhYURyodHSodMh0qHR0qAAAAAAAOAK4AAQAAAAAAAACDAQgAAQAAAAAAAQAH\ +AZwAAQAAAAAAAgAHAbQAAQAAAAAAAwAgAf4AAQAAAAAABAAHAi8AAQAAAAAABQAJAksAAQAAAAAA\ +BgAHAmUAAwABBAkAAAEGAAAAAwABBAkAAQAOAYwAAwABBAkAAgAOAaQAAwABBAkAAwBAAbwAAwAB\ +BAkABAAOAh8AAwABBAkABQASAjcAAwABBAkABgAOAlUAQwBvAHAAeQByAGkAZwBoAHQAIABcADIA\ +NQAxACAAMgAwADEAOAAtADIAMAAxADkAIABKAGUAYQBuAC0ARgByAGEAbgBjAG8AaQBzACAATQBv\ +AGkAbgBlAC4AIABUAGgAaQBzACAAZgBvAG4AdAAgAGkAcwAgAGwAaQBjAGUAbgBzAGUAZAAgAHUA\ +bgBkAGUAcgAgAHQAaABlACAAUwBJAEwAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBz\ +AGUAIABcACgAaAB0AHQAcAA6AC8ALwBzAGMAcgBpAHAAdABzAC4AcwBpAGwALgBvAHIAZwAvAE8A\ +RgBMAFwAKQAuAABDb3B5cmlnaHQgXDI1MSAyMDE4LTIwMTkgSmVhbi1GcmFuY29pcyBNb2luZS4g\ +VGhpcyBmb250IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBTSUwgT3BlbiBGb250IExpY2Vuc2UgXCho\ +dHRwOi8vc2NyaXB0cy5zaWwub3JnL09GTFwpLgAAYQBiAGMAMgBzAHYAZwAAYWJjMnN2ZwAAUgBl\ +AGcAdQBsAGEAcgAAUmVndWxhcgAARgBvAG4AdABGAG8AcgBnAGUAIAA6ACAAYQBiAGMAMgBzAHYA\ +ZwAgADoAIAAyADgALQAxADAALQAyADAAMQA5AABGb250Rm9yZ2UgOiBhYmMyc3ZnIDogMjgtMTAt\ +MjAxOQAAYQBiAGMAMgBzAHYAZwAAYWJjMnN2ZwAAVgBlAHIAcwBpAG8AbgAgACAAAFZlcnNpb24g\ +IAAAYQBiAGMAMgBzAHYAZwAAYWJjMnN2ZwAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\ +AAAAkgAAAAEAAgECAAMBAwEEAQUBBgEHAQgBCQEKAQsBDAENAQ4BDwEQAREBEgETARQBFQEWARcB\ +GAEZARoBGwEcAR0BHgEfASABIQEiASMBJAElASYBJwEoASkBKgErASwBLQEuAS8BMAExATIBMwE0\ +ATUBNgE3ATgBOQE6ATsBPAE9AT4BPwFAAUEBQgFDAUQBRQFGAUcBSAFJAUoBSwFMAU0BTgFPAVAB\ +UQFSAVMBVAFVAVYBVwFYAVkBWgFbAVwBXQFeAV8BYAFhAWIBYwFkAWUBZgFnAWgBaQFqAWsBbAFt\ +AW4BbwFwAXEBcgFzAXQBdQF2AXcBeAF5AXoBewF8AX0BfgF/AYABgQGCAYMBhAGFAYYBhwGIAYkB\ +igGLAYwBjQGOAY8GLm5vZGVmB3VuaUUwMDAHdW5pRTAyMgd1bmlFMDIzB3VuaUUwMjQHdW5pRTAz\ +MAd1bmlFMDM4B3VuaUUwMzkHdW5pRTA0Mwd1bmlFMDQ1B3VuaUUwNDYHdW5pRTA0Nwd1bmlFMDQ4\ +B3VuaUUwNTAHdW5pRTA1Qwd1bmlFMDYyB3VuaUUwNjkHdW5pRTA3QQd1bmlFMDdCB3VuaUUwN0MH\ +dW5pRTA3RAd1bmlFMDgwB3VuaUUwODEHdW5pRTA4Mgd1bmlFMDgzB3VuaUUwODQHdW5pRTA4NQd1\ +bmlFMDg2B3VuaUUwODcHdW5pRTA4OAd1bmlFMDg5B3VuaUUwOEEHdW5pRTA4Qgd1bmlFMDhDB3Vu\ +aUUwOTQHdW5pRTA5NQd1bmlFMEEwB3VuaUUwQTEHdW5pRTBBMgd1bmlFMEEzB3VuaUUwQTQHdW5p\ +RTBBOQd1bmlFMEIzB3VuaUUxMDEHdW5pRTFCOQd1bmlFMUJCB3VuaUUxRTcHdW5pRTFGMgd1bmlF\ +MUY0B3VuaUUxRjcHdW5pRTFGOQd1bmlFMUZDB3VuaUUxRkUHdW5pRTFGRgd1bmlFMjAwB3VuaUUy\ +NDAHdW5pRTI0MQd1bmlFMjQyB3VuaUUyNDMHdW5pRTI0NAd1bmlFMjQ1B3VuaUUyNDYHdW5pRTI0\ +Nwd1bmlFMjQ4B3VuaUUyNDkHdW5pRTI2MAd1bmlFMjYxB3VuaUUyNjIHdW5pRTI2Mwd1bmlFMjY0\ +B3VuaUUyODAHdW5pRTI4MQd1bmlFMjgyB3VuaUUyODMHdW5pRTRBMAd1bmlFNEEyB3VuaUU0QTQH\ +dW5pRTRBOAd1bmlFNEFDB3VuaUU0QzAHdW5pRTRDRQd1bmlFNEUxB3VuaUU0RTIHdW5pRTRFMwd1\ +bmlFNEU0B3VuaUU0RTUHdW5pRTRFNgd1bmlFNEU3B3VuaUU0RTgHdW5pRTRFOQd1bmlFNEVBB3Vu\ +aUU0RUUHdW5pRTUwMAd1bmlFNTAxB3VuaUU1MjAHdW5pRTUyMQd1bmlFNTIyB3VuaUU1MjMHdW5p\ RTUyNAd1bmlFNTI1B3VuaUU1MjkHdW5pRTUyQQd1bmlFNTJCB3VuaUU1MkMHdW5pRTUyRAd1bmlF\ NTJGB3VuaUU1MzAHdW5pRTUzMQd1bmlFNTM5B3VuaUU1NjYHdW5pRTU2Nwd1bmlFNTY5B3VuaUU1\ NkMHdW5pRTU2RAd1bmlFNTgyB3VuaUU1RDAHdW5pRTVFMgd1bmlFNjEwB3VuaUU2MTIHdW5pRTYx\ NAd1bmlFNjE4B3VuaUU2MjQHdW5pRTYzMAd1bmlFNjUwB3VuaUU2NTUHdW5pRTkxMAd1bmlFOTEx\ B3VuaUU5MTIHdW5pRTkxNAd1bmlFOTE1B3VuaUU5MTgHdW5pRTkyMAd1bmlFOTI1B3VuaUU5NUQH\ -dW5pRUEwMgd1bmlFQUE0AAAAAAH//wACAAEAAAAAAAAADAAUAAQAAAACAAAAAQAAAAEAAAAAAAEA\ -AAAA1+feHQAAAADRlyIXAAAAANgjLVI=\ -")' +dW5pRUEwMgd1bmlFQUE0B3VuaUVDQTIHdW5pRUNBMwd1bmlFQ0E1B3VuaUVDQTcHdW5pRUNBOQd1\ +bmlFQ0I3AAAAAAAAAf//AAIAAQAAAAAAAAAMABQABAAAAAIAAAABAAAAAQAAAAAAAQAAAADZahND\ +AAAAANGXIhcAAAAA2dy6gQ==\ +") format("truetype")' Index: font/abc2svg.sfd ================================================================== --- font/abc2svg.sfd +++ font/abc2svg.sfd @@ -1,11 +1,11 @@ -SplineFontDB: 3.0 +SplineFontDB: 3.2 FontName: abc2svg FullName: abc2svg FamilyName: abc2svg Weight: Regular -Copyright: Copyright \\251 2018 Jean-Francois Moine. This font is licensed under the SIL Open Font License \\(http://scripts.sil.org/OFL\\). +Copyright: Copyright \\251 2018-2019 Jean-Francois Moine. This font is licensed under the SIL Open Font License \\(http://scripts.sil.org/OFL\\). Version: ItalicAngle: 0 UnderlinePosition: 0 UnderlineWidth: 0 Ascent: 819 @@ -17,11 +17,11 @@ XUID: [1021 296 1430826605 13506888] OS2Version: 0 OS2_WeightWidthSlopeOnly: 0 OS2_UseTypoMetrics: 0 CreationTime: 1433498007 -ModificationTime: 1543339218 +ModificationTime: 1572276737 PfmFamily: 17 TTFWeight: 400 TTFWidth: 5 LineGap: 92 VLineGap: 92 @@ -48,15 +48,15 @@ UnicodeInterp: none NameList: Adobe Glyph List DisplaySize: -96 AntiAlias: 1 FitToEm: 1 -WinInfo: 48 8 2 +WinInfo: 128 8 2 BeginPrivate: 0 EndPrivate TeXData: 1 0 0 346030 173015 115343 0 1048576 115343 783286 444596 497025 792723 393216 433062 380633 303038 157286 324010 404750 52429 2506097 1059062 262144 -BeginChars: 128 128 +BeginChars: 143 143 StartChar: .nodef Encoding: 0 0 0 Width: 400 Flags: M @@ -210,13 +210,11 @@ EndChar StartChar: uniE043 Encoding: 9 57411 9 Width: 100 -Flags: W -HStem: 320 100<8.4375 91.5625> 570 100<8.4375 91.5625> -VStem: 0 100<328.438 411.562 578.438 661.562> +Flags: MW LayerCount: 2 Fore SplineSet 50 570 m 3 22 570 0 592 0 620 c 3 @@ -392,14 +390,11 @@ EndChar StartChar: uniE048 Encoding: 13 57416 13 Width: 862 -Flags: W -HStem: -67 43<422.573 472 512 561.427> 176 40<122 261.794 360 472 512 624 722.206 862> 417 42<420.937 472 512 558.146> -VStem: 260 100<86.3906 176 216 307.453> 472 40<-204 -64.8472 -24 176 216 416 456.872 596> 624 100<86.3906 176 216 306.031> -CounterMasks: 1 1c +Flags: MW LayerCount: 2 Fore SplineSet 472 596 m 1 512 596 l 1 @@ -444,64 +439,62 @@ Flags: HMW LayerCount: 2 Fore SplineSet 364 851 m 0 - 358.834831965 811.556898639 356.976973124 782.035724861 356.976973124 751.255004513 c 0 - 356.976973124 716.483564406 359.347803652 680.10480549 362 626 c 1 - 443 681 551 791 551 896 c 4 - 551 942 546 1011 497 1023 c 5 + 359 812 357 782 357 751 c 0 + 357 716 359 680 362 626 c 1 + 443 681 551 791 551 896 c 0 + 551 942 546 1011 497 1023 c 1 417 1013 376 939 364 851 c 0 449 -250 m 9 472 -486 l 0 - 472.010742188 -487.030273438 472.015625 -488.056640625 472.015625 -489.081054688 c 0 - 472.015625 -586.490234375 422.876582453 -657 316 -657 c 0 + 472 -487 472 -488 472 -489 c 0 + 472 -586 423 -657 316 -657 c 0 204 -657 139 -593 139 -509 c 0 139 -452 184 -392 253 -392 c 0 315 -392 365 -436 365 -495 c 0 365 -554 317 -594 255 -595 c 1 275 -606 298 -620 324 -620 c 0 - 376.540978621 -620 435.012695312 -591.5 435.012695312 -489.685546875 c 0 - 435.012695312 -488.795898438 435.008789062 -487.900390625 435 -487 c 0 + 377 -620 435 -592 435 -490 c 0 + 435 -489 435 -488 435 -487 c 0 412 -254 l 17 - 398.364449186 -255.357092735 384.770660292 -256.025113783 371.270180398 -256.025113783 c 0 - 175.860782244 -256.025113783 5.68434188608e-14 -116.071979914 0 100 c 0 + 398 -255 385 -256 371 -256 c 0 + 176 -256 0 -116 0 100 c 0 0 188 25 277 58 335 c 8 131 463 275 562 326 600 c 1 317 704 313 787 313 852 c 0 313 1052 406 1152 494 1160 c 1 570 1115 592 1005 592 873 c 0 592 688 538 598 379 473 c 1 399 266 l 0 - 409.453125 267.208007812 419.672851562 267.79296875 429.6484375 267.79296875 c 0 - 584.774414062 267.79296875 679 144.540865361 679 -3 c 0 + 409 267 420 268 430 268 c 0 + 585 268 679 145 679 -3 c 0 679 -124 618 -220 449 -250 c 9 601 -23 m 0 - 601 51.748046875 536.096679688 141.236328125 423.16015625 141.236328125 c 0 - 419.477539062 141.236328125 415.756835938 140.158203125 412 140 c 1 + 601 52 536 141 423 141 c 0 + 419 141 416 140 412 140 c 1 445 -215 l 1 575 -189 601 -121 601 -23 c 0 375 138 m 1 306 124 251 75 251 8 c 0 251 -35 281 -84 319 -108 c 1 246 -91 195 -56 195 46 c 0 195 176 270 236 361 261 c 1 344 450 l 1 164 306 93 226 92 82 c 1 - 94.8109172159 -111.016315493 218.774420218 -221.508405886 375.873991765 -221.508405886 c 0 - 386.441654234 -221.508405886 397.159253713 -221.008441515 408 -220 c 0 + 95 -111 219 -222 376 -222 c 0 + 387 -222 397 -221 408 -220 c 0 375 138 l 1 EndSplineSet Validated: 1 EndChar StartChar: uniE05C Encoding: 15 57436 15 Width: 722 -Flags: W -HStem: -516 36<404.33 535.95> -88 35<438.435 550.878> 50 35<444.881 548.647> 475 37<397.951 540.179> -VStem: 0 123<-514 510> 186 28<-514 -6 15 510> 290 157<-427.748 -329.281 326.281 424.154> 614 108<-378.538 -189.443 184.402 376.99> +Flags: MW LayerCount: 2 Fore SplineSet 478 -480 m 0 567 -480 614 -375 614 -286 c 0 @@ -563,43 +556,41 @@ EndChar StartChar: uniE062 Encoding: 16 57442 16 Width: 703 -Flags: W -HStem: -170 101<618.042 698.676> -113 224<91.5691 210.802> 72 102<613.779 693.281> 215 40<163.491 326.905> -VStem: 19 241<-54.3228 59.215> 422 121<-211.326 98.8623> 610 97<-162.037 -77.8382 83.7117 162.856> +Flags: HMW LayerCount: 2 Fore SplineSet -19 29 m 0x5e +19 29 m 0 19 161 125 255 261 255 c 0 378 255 440 220 496 146 c 0 - 528.135801023 103.534834363 543 31 543 -30 c 0 - 543 -193 509 -303 392 -412 c 24 - 250 -545 118 -593 -70 -603 c 1 - 72 -565 193 -517 296 -414 c 0 - 362.272166103 -347.727833897 383 -307 408 -201 c 0 - 417.095703125 -162.434570312 422 -69 422 -36 c 0 + 528 104 543 31 543 -30 c 0 + 543 -193 505 -313 388 -422 c 24 + 246 -555 118 -593 -70 -603 c 1 + 72 -565 189 -512 292 -409 c 0 + 358 -343 387 -287 412 -181 c 0 + 421 -142 422 -69 422 -36 c 0 422 48 418 100 376 150 c 0 - 339.06264499 193.973041679 314 215 245 215 c 0 - 168 215 91 170 67 62 c 1 - 97 100 116 111 153 111 c 4 + 339 194 314 207 245 207 c 0 + 168 207 97 154 67 58 c 1 + 97 96 116 111 153 111 c 0 214 111 260 62 260 -1 c 0 260 -33 248 -61 221 -83 c 1 198 -104 166 -113 139 -113 c 0 - 71 -113 19 -52 19 29 c 0x5e -661 -170 m 0x9e + 71 -113 19 -52 19 29 c 0 +661 -170 m 0 632 -170 610 -150 610 -119 c 0 - 610 -90 629 -69 656 -69 c 4 + 610 -90 629 -69 656 -69 c 0 683 -69 707 -90 707 -119 c 0 - 707 -148 687 -170 661 -170 c 0x9e -655 72 m 0x3e + 707 -148 687 -170 661 -170 c 0 +655 72 m 0 625 72 605 94 605 127 c 0 - 605 156 626 174 654 174 c 4 + 605 156 626 174 654 174 c 0 681 174 702 153 702 127 c 0 - 702 94 682 72 655 72 c 0x3e + 702 94 682 72 655 72 c 0 EndSplineSet Validated: 1 EndChar StartChar: uniE069 @@ -625,27 +616,25 @@ EndChar StartChar: uniE07A Encoding: 18 57466 18 Width: 779 -Flags: W -HStem: -502 30<205.501 304.477> -204 31<214.246 323 357 391.941> 113 95<243.207 289> 118 99<329.167 431.634> -VStem: 0 76<-48.8921 170.465> 111 181<-436.162 -326.772> 154 43<-16.0423 68.9973> 249 38<502.74 719.447> 338 32<-437.341 -205.711> 442 32<651.371 785.751> 502 41<-92.0505 45.5518> +Flags: MW LayerCount: 2 Fore SplineSet -329 117 m 1xd8e0 +329 117 m 1 329 117 348 -79 354 -170 c 1 464 -145 502 -83 502 -22 c 0 502 46 442 118 350 118 c 0 - 343 118 336 118 329 117 c 1xd8e0 + 343 118 336 118 329 117 c 1 323 -170 m 2 323 -170 299 97 298 113 c 1 243 102 197 67 197 13 c 0 197 -13 207 -40 228 -66 c 1 188 -44 154 0 154 58 c 0 - 154 137 216 188 289 208 c 1xeae0 + 154 137 216 188 289 208 c 1 284 266 280 308 275 360 c 1 131 245 77 181 76 66 c 1 82 -68 133 -173 320 -173 c 0 323 -173 323 -172 323 -170 c 2 357 -199 m 1 @@ -653,11 +642,11 @@ 371 -351 370 -359 370 -368 c 0 370 -370 370 -373 370 -375 c 0 370 -462 329 -502 248 -502 c 0 178 -502 111 -448 111 -381 c 0 111 -335 147 -294 202 -294 c 0 - 252 -294 292 -338 292 -385 c 0xdce0 + 252 -294 292 -338 292 -385 c 0 292 -432 254 -459 204 -460 c 1 220 -469 238 -472 259 -472 c 0 303 -472 338 -442 338 -368 c 0 338 -361 338 -353 337 -344 c 2 324 -203 l 1 @@ -669,17 +658,17 @@ 257 564 249 630 249 682 c 0 249 842 328 916 402 938 c 1 470 864 474 804 474 698 c 0 474 550 431 478 304 378 c 1 309 324 311 278 318 215 c 1 - 327 216 335 217 344 217 c 0xd9e0 + 327 216 335 217 344 217 c 0 398 217 453 197 493 150 c 1 534 106 543 55 543 -2 c 0 543 -76 514 -135 444 -169 c 1 414 -184 391 -196 357 -199 c 1 290 658 m 0 - 288 638 287 615 287 594 c 0xc9e0 + 288 638 287 615 287 594 c 0 287 552 291 513 293 501 c 1 358 545 442 639 442 712 c 0 442 749 433 790 401 820 c 1 331 792 299 728 290 658 c 0 EndSplineSet @@ -687,13 +676,11 @@ EndChar StartChar: uniE07B Encoding: 19 57467 19 Width: 782 -Flags: W -HStem: -413 29<322.95 428.387> -70 28<351.623 440.673> 40 28<355.737 438.873> 380 30<318.164 432.756> -VStem: 0 98<-411 408> 149 22<-411 -5 12 408> 232 126<-344.637 -259.418 257.61 342.509> 491 87<-311.532 -144.136 138.096 308.532> +Flags: MW LayerCount: 2 Fore SplineSet 382 -384 m 0 453 -384 491 -300 491 -229 c 0 @@ -755,17 +742,15 @@ EndChar StartChar: uniE07C Encoding: 20 57468 20 Width: 807 -Flags: W -HStem: -136 81<491.982 561.648> -102 188<67.2812 172.801> 58 81<488.633 557.386> 170 34<129.66 260.591> -VStem: 15 195<-48.9031 47.6335> 340 94<-168.512 89.0947> 488 78<-131.953 -59.6448 63.9747 133.311> +Flags: MW LayerCount: 2 Fore SplineSet -15 33 m 0x5e +15 33 m 0 15 139 104 204 209 204 c 0 299 204 358 176 399 117 c 0 423 82 434 25 434 -24 c 0 434 -154 394 -258 314 -330 c 1 233 -401 94 -474 -56 -482 c 1 @@ -777,21 +762,21 @@ 133 170 68 125 54 50 c 1 78 80 86 86 116 86 c 0 165 86 210 38 210 -12 c 0 210 -38 200 -60 178 -78 c 1 160 -95 138 -102 116 -102 c 0 - 54 -102 15 -32 15 33 c 0x5e -529 -136 m 0x9e + 54 -102 15 -32 15 33 c 0 +529 -136 m 0 506 -136 488 -120 488 -95 c 0 488 -72 502 -55 525 -55 c 0 547 -55 566 -72 566 -95 c 0 - 566 -118 550 -136 529 -136 c 0x9e -524 58 m 0x3e + 566 -118 550 -136 529 -136 c 0 +524 58 m 0 500 58 484 76 484 102 c 0 484 125 499 139 523 139 c 0 545 139 562 123 562 102 c 0 - 562 76 546 58 524 58 c 0x3e + 562 76 546 58 524 58 c 0 EndSplineSet Validated: 1 EndChar StartChar: uniE07D @@ -1120,21 +1105,19 @@ EndChar StartChar: uniE08A Encoding: 32 57482 32 Width: 409 -Flags: W -HStem: -246 29<187.663 292.861> 30 134<264.058 320.72> 228 21<196.786 281.147> -VStem: 9 110<-126.934 138.101> 325 54<100.5 183.933> 392 17<-84.7973 -75.9219> +Flags: HMW LayerCount: 2 Fore SplineSet 303 164 m 1 311 163 315 162 321 161 c 1 324 165 325 170 325 174 c 0 - 325 202 273 228 234 228 c 1 - 173 226 119 170 119 18 c 0 + 325 202 273 224 234 224 c 5 + 173 222 119 170 119 18 c 0 119 -58 126 -133 158 -175 c 0 181 -204 207 -217 239 -217 c 0 265 -217 294 -207 322 -183 c 0 350 -159 369 -119 392 -71 c 1 392 -74 410 -77 409 -80 c 0 @@ -1154,13 +1137,11 @@ EndChar StartChar: uniE08B Encoding: 33 57483 33 Width: 408 -Flags: W -HStem: -246 29<215.419 292.933> 30 134<264.058 320.72> 228 21<215.371 280.515> -VStem: 9 110<-126.934 136.6> 180 35<-350 -246 -197 209 248 350> 325 54<100.5 183.933> 392 17<-84.661 -75.9219> +Flags: MW LayerCount: 2 Fore SplineSet 303 164 m 1 311 163 315 162 321 161 c 1 @@ -1332,42 +1313,40 @@ 337 -30 m 4 337 40 264 101 193 101 c 4 154 101 109 75 109 31 c 4 109 -40 186 -97 257 -97 c 4 298 -97 337 -75 337 -30 c 4 -450 0 m 0 - 450 -70 361 -129 225 -129 c 0 - 89 -129 0 -70 0 0 c 0 - 0 70 89 129 225 129 c 0 - 361 129 450 70 450 0 c 0 +450 0 m 4 + 450 -70 361 -129 225 -129 c 4 + 89 -129 0 -70 0 0 c 4 + 0 70 89 129 225 129 c 4 + 361 129 450 70 450 0 c 4 EndSplineSet Validated: 1 EndChar StartChar: uniE0A3 Encoding: 40 57507 40 Width: 329 -Flags: W -HStem: -148 57<54.5533 171.763> 91 57<156.237 273.528> -VStem: 0 31<-79.2669 -12.3025> 297 31<12.3025 73.4219> +Flags: MW LayerCount: 2 Fore SplineSet -292 68 m 0 - 283 84 264 91 242 91 c 0 - 164 91 31 10 31 -49 c 0 - 31 -56 33 -62 37 -68 c 0 - 45 -84 64 -91 86 -91 c 0 - 164 -91 297 -10 297 49 c 0 - 297 56 295 62 292 68 c 0 -313 81 m 0 - 323 61 328 41 328 22 c 0 - 328 -70 223 -148 130 -148 c 0 - 83 -148 40 -128 15 -81 c 0 - 5 -61 0 -41 0 -22 c 0 - 0 70 105 148 198 148 c 0 - 245 148 288 128 313 81 c 0 +292 68 m 4 + 283 84 264 91 242 91 c 4 + 164 91 31 10 31 -49 c 4 + 31 -56 33 -62 37 -68 c 4 + 45 -84 64 -91 86 -91 c 4 + 164 -91 297 -10 297 49 c 4 + 297 56 295 62 292 68 c 4 +313 81 m 4 + 323 61 328 41 328 22 c 4 + 328 -70 223 -148 130 -148 c 4 + 83 -148 40 -128 15 -81 c 4 + 5 -61 0 -41 0 -22 c 4 + 0 70 105 148 198 148 c 4 + 245 148 288 128 313 81 c 4 EndSplineSet Validated: 1 EndChar StartChar: uniE0A4 @@ -1375,15 +1354,15 @@ Width: 320 Flags: HMW LayerCount: 2 Fore SplineSet -320 40 m 0 - 320 -51 231 -135 110 -135 c 0 - 40 -135 0 -90 0 -40 c 0 - 0 50 90 135 210 135 c 0 - 280 135 320 90 320 40 c 0 +320 40 m 4 + 320 -51 231 -135 110 -135 c 4 + 40 -135 0 -90 0 -40 c 4 + 0 50 90 135 210 135 c 4 + 280 135 320 90 320 40 c 4 EndSplineSet Validated: 1 EndChar StartChar: uniE0A9 @@ -1510,32 +1489,201 @@ 78 50 100 28 100 0 c 3 100 -28 78 -50 50 -50 c 3 EndSplineSet Validated: 1 EndChar + +StartChar: uniE1F2 +Encoding: 48 57842 48 +Width: 320 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +0 680 m 1 + 320 680 l 1 + 320 40 l 2 + 320 -51 231 -135 110 -135 c 0 + 40 -135 0 -90 0 -40 c 0 + 0 50 90 135 210 135 c 0 + 244 135 271 124 290 107 c 1 + 290 560 l 1 + 0 560 l 1 + 0 680 l 1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE1F4 +Encoding: 49 57844 49 +Width: 320 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +0 680 m 1 + 320 680 l 1 + 320 40 l 2 + 320 -51 231 -135 110 -135 c 0 + 40 -135 0 -90 0 -40 c 0 + 0 50 90 135 210 135 c 0 + 244 135 271 124 290 107 c 1 + 290 380 l 1 + 0 380 l 1 + 0 500 l 1 + 290 500 l 1 + 290 560 l 1 + 0 560 l 1 + 0 680 l 1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE1F7 +Encoding: 50 57847 50 +Width: 320 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +0 680 m 25 + 320 680 l 29 + 320 560 l 25 + 0 560 l 25 + 0 680 l 25 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE1F9 +Encoding: 51 57849 51 +Width: 320 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +0 500 m 25 + 320 500 l 25 + 320 380 l 25 + 0 380 l 29 + 0 500 l 25 +0 680 m 25 + 320 680 l 25 + 320 560 l 25 + 0 560 l 25 + 0 680 l 25 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE1FC +Encoding: 52 57852 52 +Width: 100 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +50 -38 m 7 + 22 -38 0 -16 0 12 c 7 + 0 40 22 62 50 62 c 7 + 78 62 100 40 100 12 c 7 + 100 -16 78 -38 50 -38 c 7 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE1FE +Encoding: 53 57854 53 +Width: 310 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +0 960 m 29 + 310 960 l 29 + 310 930 l 29 + 30 930 l 29 + 30 770 l 29 + 0 770 l 29 + 0 960 l 29 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE1FF +Encoding: 54 57855 54 +Width: 230 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +80 810 m 0 + 27 810 0 833 0 864 c 0 + 0 882 11 900 30 900 c 0 + 51 900 63 888 63 872 c 0 + 63 842 40 846 40 840 c 0 + 40 831 59 827 73 827 c 0 + 100 827 130 857 130 900 c 0 + 130 918 120 940 98 940 c 0 + 88 940 90 940 80 940 c 0 + 70 940 60 943 60 954 c 24 + 60 965 69 970 80 970 c 0 + 95 970 105 970 120 970 c 0 + 151 970 180 1001 180 1028 c 0 + 180 1043 172 1060 152 1060 c 0 + 141 1060 131 1056 131 1047 c 0 + 131 1040 133 1043 133 1028 c 0 + 133 1014 124 1000 100 1000 c 0 + 84 1000 70 1013 70 1029 c 0 + 70 1052 86 1080 150 1080 c 0 + 197 1080 230 1055 230 1020 c 0 + 230 966 160 949 160 940 c 0 + 160 933 180 916 180 890 c 0 + 180 847 149 810 80 810 c 0 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE200 +Encoding: 55 57856 55 +Width: 310 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +310 960 m 25 + 310 770 l 25 + 280 770 l 25 + 280 930 l 25 + 0 930 l 25 + 0 960 l 25 + 310 960 l 25 +EndSplineSet +Validated: 1 +EndChar StartChar: uniE240 -Encoding: 48 57920 48 +Encoding: 56 57920 56 Width: 315 Flags: HMW LayerCount: 2 Fore SplineSet -0 -239 m 9 - 0 0 l 1 - 30 0 l 1 - 51 -195 315 -321 315 -584 c 0 - 315 -643 302 -710 269 -785 c 1 - 282 -738 287 -691 287 -647 c 0 - 287 -452 175 -294 30 -239 c 1 - 0 -239 l 9 +0 -239 m 13 + 0 0 l 5 + 30 0 l 5 + 51 -195 315 -321 315 -584 c 4 + 315 -643 302 -710 269 -785 c 5 + 282 -738 287 -691 287 -647 c 4 + 287 -452 175 -294 30 -239 c 5 + 0 -239 l 13 EndSplineSet Validated: 1 EndChar StartChar: uniE241 -Encoding: 49 57921 49 +Encoding: 57 57921 57 Width: 315 Flags: HMW LayerCount: 2 Fore SplineSet @@ -1550,61 +1698,61 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE242 -Encoding: 50 57922 50 +Encoding: 58 57922 58 Width: 315 Flags: HMW LayerCount: 2 Fore SplineSet -0 -343 m 9 - 0 0 l 1 - 30 0 l 1 - 62.1962890625 -133.135742188 315.4921875 -235.983398438 315.4921875 -417.918945312 c 0 - 315.4921875 -445.063476562 309.853515625 -473.969726562 297 -505 c 1 - 308.7109375 -531.232421875 315.594726562 -559.000976562 315.594726562 -588.922851562 c 0 - 315.594726562 -622.875976562 306.73046875 -659.6015625 286 -700 c 1 - 289.740234375 -679.993164062 291.475585938 -660.758789062 291.475585938 -642.3125 c 0 - 291.475585938 -448.700195312 100.301757812 -342 30 -342 c 1 - 0 -343 l 9 -30 -171 m 1 - 56 -278 226 -366 291 -492 c 1 - 291.465820312 -485.108398438 291.692382812 -478.3203125 291.692382812 -471.635742188 c 0 - 291.692382812 -277.536132812 100.569335938 -171 30 -171 c 1 +0 -343 m 13 + 0 0 l 5 + 30 0 l 5 + 62 -133 315 -236 315 -418 c 4 + 315 -445 310 -474 297 -505 c 5 + 309 -531 316 -559 316 -589 c 4 + 316 -623 307 -660 286 -700 c 5 + 290 -680 291 -660 291 -642 c 4 + 291 -448 100 -342 30 -342 c 5 + 0 -343 l 13 +30 -171 m 5 + 56 -278 226 -366 291 -492 c 5 + 291 -485 292 -479 292 -472 c 4 + 292 -278 101 -171 30 -171 c 5 EndSplineSet Validated: 1 EndChar StartChar: uniE243 -Encoding: 51 57923 51 +Encoding: 59 57923 59 Width: 315 Flags: HMW LayerCount: 2 Fore SplineSet 0 -1 m 9 0 342 l 1 30 342 l 1 - 100.301757812 342 291.475585938 448.700195312 291.475585938 642.3125 c 0 - 291.475585938 660.758789062 289.740234375 679.993164062 286 700 c 1 - 306.73046875 659.6015625 315.594726562 622.875976562 315.594726562 588.922851562 c 0 - 315.594726562 559.000976562 308.7109375 531.232421875 297 505 c 1 - 309.853515625 473.969726562 315.4921875 445.063476562 315.4921875 417.918945312 c 0 - 315.4921875 235.983398438 62.1962890625 133.135742188 30 0 c 1 + 100 342 291 448 291 642 c 0 + 291 660 290 680 286 700 c 1 + 307 660 316 623 316 589 c 0 + 316 559 309 531 297 505 c 1 + 310 474 315 445 315 418 c 0 + 315 236 62 133 30 0 c 1 0 -1 l 9 30 171 m 1 - 100.569335938 171 291.692382812 277.536132812 291.692382812 471.635742188 c 0 - 291.692382812 478.3203125 291.465820312 484.108398438 291 491 c 1 + 101 171 292 278 292 472 c 0 + 292 479 291 484 291 491 c 1 226 365 56 278 30 171 c 1 EndSplineSet Validated: 1 EndChar StartChar: uniE244 -Encoding: 52 57924 52 +Encoding: 60 57924 60 Width: 315 Flags: HMW LayerCount: 2 Fore SplineSet @@ -1621,214 +1769,214 @@ 291 -475 100 -368 30 -368 c 1 0 -368 l 9 30 -199 m 1 56 -307 226 -392 291 -518 c 1 291 -511 292 -504 292 -498 c 0 - 292 -305.781467412 104.491731968 -198.972460053 31.9860569235 -198.972460053 c 0 - 31.3140795885 -198.972460053 30.6519803414 -198.981634357 30 -199 c 1 + 292 -306 105 -199 32 -199 c 0 + 31 -199 31 -199 30 -199 c 1 30 -28 m 1 56 -135 226 -221 291 -347 c 1 291 -340 292 -333 292 -327 c 0 - 292 -134.781467412 104.491731968 -27.9724600525 31.9860569235 -27.9724600525 c 0 - 31.3140795885 -27.9724600525 30.6519803414 -27.9816343566 30 -28 c 1 + 292 -135 105 -28 32 -28 c 0 + 31 -28 31 -28 30 -28 c 1 EndSplineSet Validated: 1 EndChar StartChar: uniE245 -Encoding: 53 57925 53 +Encoding: 61 57925 61 Width: 315 Flags: HMW LayerCount: 2 Fore SplineSet 0 343 m 17 30 343 l 1 - 100.301757812 343 291.475585938 449.700195312 291.475585938 643.3125 c 0 - 291.475585938 661.758789062 289.740234375 680.993164062 286 701 c 1 - 306.73046875 660.6015625 315.594726562 623.875976562 315.594726562 589.922851562 c 0 - 315.594726562 560.000976562 308.7109375 532.232421875 297 506 c 1 - 309.81640625 475.145507812 315.422851562 446.318359375 315.422851562 419.19921875 c 0 - 315.422851562 389.1875 308.556640625 361.265625 297 335 c 1 - 309.853515625 303.969726562 315.4921875 275.063476562 315.4921875 247.918945312 c 0 - 315.4921875 65.9833984375 62.1962890625 -36.8642578125 30 -170 c 1 + 100 343 291 449 291 643 c 0 + 291 661 290 681 286 701 c 1 + 307 661 316 624 316 590 c 0 + 316 560 309 532 297 506 c 1 + 310 475 315 446 315 419 c 0 + 315 389 309 361 297 335 c 1 + 310 304 315 275 315 248 c 0 + 315 66 62 -37 30 -170 c 1 0 -170 l 1 0 343 l 17 30 0 m 1 - 100.569335938 0 291.692382812 107.536132812 291.692382812 301.635742188 c 0 - 291.692382812 308.3203125 291.465820312 315.108398438 291 322 c 1 + 101 0 292 108 292 302 c 0 + 292 309 291 315 291 322 c 1 226 196 56 109 30 0 c 1 30 171 m 1 - 100.569335938 171 291.692382812 278.536132812 291.692382812 472.635742188 c 0 - 291.692382812 479.3203125 291.465820312 486.108398438 291 493 c 1 + 101 171 292 279 292 473 c 0 + 292 480 291 486 291 493 c 1 226 367 56 280 30 171 c 1 EndSplineSet Validated: 1 EndChar StartChar: uniE246 -Encoding: 54 57926 54 +Encoding: 62 57926 62 Width: 315 Flags: HMW LayerCount: 2 Fore SplineSet 0 -344 m 9 0 340 l 1 30 340 l 1 - 62.1962890625 206.864257812 315.4921875 104.016601562 315.4921875 -77.9189453125 c 0 - 315.4921875 -105.063476562 309.853515625 -133.969726562 297 -165 c 1 - 308.556640625 -191.265625 315.422851562 -219.1875 315.422851562 -249.19921875 c 0 - 315.422851562 -276.318359375 309.81640625 -305.145507812 297 -336 c 1 - 308.556640625 -362.265625 315.422851562 -390.1875 315.422851562 -420.19921875 c 0 - 315.422851562 -447.318359375 309.81640625 -476.145507812 297 -507 c 1 - 308.7109375 -533.232421875 315.594726562 -561.000976562 315.594726562 -590.922851562 c 0 - 315.594726562 -624.875976562 306.73046875 -661.6015625 286 -702 c 1 - 289.740234375 -681.993164062 291.475585938 -662.758789062 291.475585938 -644.3125 c 0 - 291.475585938 -450.700195312 100.301757812 -344 30 -344 c 1 + 62 207 315 104 315 -78 c 0 + 315 -105 310 -134 297 -165 c 1 + 309 -191 315 -219 315 -249 c 0 + 315 -276 310 -305 297 -336 c 1 + 309 -362 315 -390 315 -420 c 0 + 315 -447 310 -476 297 -507 c 1 + 309 -533 316 -561 316 -591 c 0 + 316 -625 307 -662 286 -702 c 1 + 290 -682 291 -662 291 -644 c 0 + 291 -450 100 -344 30 -344 c 1 0 -344 l 9 30 -173 m 1 56 -281 226 -368 291 -494 c 1 - 291.465820312 -487.108398438 291.692382812 -480.3203125 291.692382812 -473.635742188 c 0 - 291.692382812 -279.536132812 100.569335938 -173 30 -173 c 1 + 291 -487 292 -481 292 -474 c 0 + 292 -280 101 -173 30 -173 c 1 30 -2 m 1 56 -110 226 -197 291 -323 c 1 - 291.465820312 -316.108398438 291.692382812 -309.3203125 291.692382812 -302.635742188 c 0 - 291.692382812 -108.536132812 100.569335938 -2 30 -2 c 1 + 291 -316 292 -310 292 -303 c 0 + 292 -109 101 -2 30 -2 c 1 30 169 m 1 56 62 226 -26 291 -152 c 1 - 291.465820312 -145.108398438 291.692382812 -138.3203125 291.692382812 -131.635742188 c 0 - 291.692382812 62.4638671875 100.569335938 169 30 169 c 1 + 291 -145 292 -139 292 -132 c 0 + 292 62 101 169 30 169 c 1 EndSplineSet Validated: 1 EndChar StartChar: uniE247 -Encoding: 55 57927 55 +Encoding: 63 57927 63 Width: 315 Flags: HMW LayerCount: 2 Fore SplineSet 0 -370 m 9 0 314 l 1 30 314 l 1 - 100.301757812 314 291.475585938 420.700195312 291.475585938 614.3125 c 0 - 291.475585938 632.758789062 289.740234375 651.993164062 286 672 c 1 - 306.73046875 631.6015625 315.594726562 594.875976562 315.594726562 560.922851562 c 0 - 315.594726562 531.000976562 308.7109375 503.232421875 297 477 c 1 - 309.81640625 446.145507812 315.422851562 417.318359375 315.422851562 390.19921875 c 0 - 315.422851562 360.1875 308.556640625 332.265625 297 306 c 1 - 309.81640625 275.145507812 315.422851562 246.318359375 315.422851562 219.19921875 c 0 - 315.422851562 189.1875 308.556640625 161.265625 297 135 c 1 - 309.853515625 103.969726562 315.4921875 75.0634765625 315.4921875 47.9189453125 c 0 - 315.4921875 -134.016601562 62.1962890625 -236.864257812 30 -370 c 1 + 100 314 291 421 291 614 c 0 + 291 633 290 652 286 672 c 1 + 307 632 316 595 316 561 c 0 + 316 531 309 503 297 477 c 1 + 310 446 315 417 315 390 c 0 + 315 360 309 332 297 306 c 1 + 310 275 315 246 315 219 c 0 + 315 189 309 161 297 135 c 1 + 310 104 315 75 315 48 c 0 + 315 -134 62 -237 30 -370 c 1 0 -370 l 9 -30 -200 m 5 - 100.569335938 -200 291.692382812 -92.4638671875 291.692382812 101.635742188 c 0 - 291.692382812 108.3203125 291.465820312 115.108398438 291 122 c 5 - 226 -4 56 -91 30 -200 c 5 +30 -200 m 1 + 101 -200 292 -92 292 102 c 0 + 292 108 291 115 291 122 c 1 + 226 -4 56 -91 30 -200 c 1 30 -29 m 1 - 100.569335938 -29 291.692382812 78.5361328125 291.692382812 272.635742188 c 0 - 291.692382812 279.3203125 291.465820312 286.108398438 291 293 c 1 + 101 -29 292 79 292 273 c 0 + 292 279 291 286 291 293 c 1 226 167 56 81 30 -29 c 1 30 142 m 1 - 100.569335938 142 291.692382812 249.536132812 291.692382812 443.635742188 c 0 - 291.692382812 450.3203125 291.465820312 457.108398438 291 464 c 1 + 101 142 292 250 292 444 c 0 + 292 450 291 457 291 464 c 1 226 338 56 251 30 142 c 1 EndSplineSet Validated: 1 EndChar StartChar: uniE248 -Encoding: 56 57928 56 +Encoding: 64 57928 64 Width: 315 Flags: HMW LayerCount: 2 Fore SplineSet 0 -325 m 9 0 530 l 1 30 530 l 1 - 62.1962890625 396.864257812 315.4921875 294.016601562 315.4921875 112.081054688 c 0 - 315.4921875 84.9365234375 309.853515625 56.0302734375 297 25 c 1 - 308.556640625 -1.265625 315.422851562 -29.1875 315.422851562 -59.19921875 c 0 - 315.422851562 -86.318359375 309.81640625 -115.145507812 297 -146 c 1 - 308.556640625 -172.265625 315.422851562 -200.1875 315.422851562 -230.19921875 c 0 - 315.422851562 -257.318359375 309.81640625 -286.145507812 297 -317 c 1 - 308.556640625 -343.265625 315.422851562 -371.1875 315.422851562 -401.19921875 c 0 - 315.422851562 -428.318359375 309.81640625 -457.145507812 297 -488 c 1 - 308.7109375 -514.232421875 315.594726562 -542.000976562 315.594726562 -571.922851562 c 0 - 315.594726562 -605.875976562 306.73046875 -642.6015625 286 -683 c 1 - 289.740234375 -662.993164062 291.475585938 -643.758789062 291.475585938 -625.3125 c 0 - 291.475585938 -431.700195312 100.301757812 -325 30 -325 c 1 + 62 397 315 294 315 112 c 0 + 315 85 310 56 297 25 c 1 + 309 -1 315 -29 315 -59 c 0 + 315 -86 310 -115 297 -146 c 1 + 309 -172 315 -200 315 -230 c 0 + 315 -257 310 -286 297 -317 c 1 + 309 -343 315 -371 315 -401 c 0 + 315 -428 310 -457 297 -488 c 1 + 309 -514 316 -542 316 -572 c 0 + 316 -606 307 -643 286 -683 c 1 + 290 -663 291 -643 291 -625 c 0 + 291 -431 100 -325 30 -325 c 1 0 -325 l 9 30 -154 m 1 56 -262 226 -349 291 -475 c 1 - 291.465820312 -468.108398438 291.692382812 -461.3203125 291.692382812 -454.635742188 c 0 - 291.692382812 -260.536132812 100.569335938 -154 30 -154 c 1 + 291 -468 292 -462 292 -455 c 0 + 292 -261 101 -154 30 -154 c 1 30 17 m 1 56 -91 226 -178 291 -304 c 1 - 291.465820312 -297.108398438 291.692382812 -290.3203125 291.692382812 -283.635742188 c 0 - 291.692382812 -89.5361328125 100.569335938 17 30 17 c 1 + 291 -297 292 -291 292 -284 c 0 + 292 -90 101 17 30 17 c 1 30 188 m 1 56 80 226 -7 291 -133 c 1 - 291.465820312 -126.108398438 291.692382812 -119.3203125 291.692382812 -112.635742188 c 0 - 291.692382812 81.4638671875 100.569335938 188 30 188 c 1 + 291 -126 292 -120 292 -113 c 0 + 292 81 101 188 30 188 c 1 30 359 m 1 56 252 226 164 291 38 c 1 - 291.465820312 44.8916015625 291.692382812 51.6796875 291.692382812 58.3642578125 c 0 - 291.692382812 252.463867188 100.569335938 359 30 359 c 1 + 291 45 292 51 292 58 c 0 + 292 252 101 359 30 359 c 1 EndSplineSet Validated: 1 EndChar StartChar: uniE249 -Encoding: 57 57929 57 +Encoding: 65 57929 65 Width: 315 Flags: HMW LayerCount: 2 Fore SplineSet 0 -580 m 9 0 275 l 1 30 275 l 1 - 100.301757812 275 291.475585938 381.700195312 291.475585938 575.3125 c 0 - 291.475585938 593.758789062 289.740234375 612.993164062 286 633 c 1 - 306.73046875 592.6015625 315.594726562 555.875976562 315.594726562 521.922851562 c 0 - 315.594726562 492.000976562 308.7109375 464.232421875 297 438 c 1 - 309.81640625 407.145507812 315.422851562 378.318359375 315.422851562 351.19921875 c 0 - 315.422851562 321.1875 308.556640625 293.265625 297 267 c 1 - 309.81640625 236.145507812 315.422851562 207.318359375 315.422851562 180.19921875 c 0 - 315.422851562 150.1875 308.556640625 122.265625 297 96 c 1 - 309.81640625 65.1455078125 315.422851562 36.318359375 315.422851562 9.19921875 c 0 - 315.422851562 -20.8125 308.556640625 -48.734375 297 -75 c 1 - 309.853515625 -106.030273438 315.4921875 -134.936523438 315.4921875 -162.081054688 c 0 - 315.4921875 -344.016601562 62.1962890625 -446.864257812 30 -580 c 1 + 100 275 291 382 291 575 c 0 + 291 594 290 613 286 633 c 1 + 307 593 316 556 316 522 c 0 + 316 492 309 464 297 438 c 1 + 310 407 315 378 315 351 c 0 + 315 321 309 293 297 267 c 1 + 310 236 315 207 315 180 c 0 + 315 150 309 122 297 96 c 1 + 310 65 315 36 315 9 c 0 + 315 -21 309 -49 297 -75 c 1 + 310 -106 315 -135 315 -162 c 0 + 315 -344 62 -447 30 -580 c 1 0 -580 l 9 -30 -410 m 5 - 100.569335938 -410 291.692382812 -302.463867188 291.692382812 -108.364257812 c 0 - 291.692382812 -101.6796875 291.465820312 -94.8916015625 291 -88 c 5 - 226 -214 56 -301 30 -410 c 5 +30 -410 m 1 + 101 -410 292 -302 292 -108 c 0 + 292 -102 291 -95 291 -88 c 1 + 226 -214 56 -301 30 -410 c 1 30 -239 m 1 - 100.569335938 -239 291.692382812 -131.463867188 291.692382812 62.6357421875 c 0 - 291.692382812 69.3203125 291.465820312 76.1083984375 291 83 c 1 + 101 -239 292 -131 292 63 c 0 + 292 69 291 76 291 83 c 1 226 -43 56 -129 30 -239 c 1 30 -68 m 1 - 100.569335938 -68 291.692382812 39.5361328125 291.692382812 233.635742188 c 0 - 291.692382812 240.3203125 291.465820312 247.108398438 291 254 c 1 + 101 -68 292 40 292 234 c 0 + 292 240 291 247 291 254 c 1 226 128 56 41 30 -68 c 1 30 103 m 1 - 100.569335938 103 291.692382812 210.536132812 291.692382812 404.635742188 c 0 - 291.692382812 411.3203125 291.465820312 418.108398438 291 425 c 1 + 101 103 292 211 292 405 c 0 + 292 411 291 418 291 425 c 1 226 299 56 213 30 103 c 1 EndSplineSet Validated: 1 EndChar StartChar: uniE260 -Encoding: 58 57952 58 +Encoding: 66 57952 66 Width: 269 Flags: HMW LayerCount: 2 Fore SplineSet @@ -1849,14 +1997,13 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE261 -Encoding: 59 57953 59 +Encoding: 67 57953 67 Width: 200 -Flags: W -VStem: 0 28<-101 49 146 376> 172 25<-378 -152 -56 94> +Flags: MW LayerCount: 2 Fore SplineSet 28 -101 m 1 172 -56 l 1 @@ -1876,11 +2023,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE262 -Encoding: 60 57954 60 +Encoding: 68 57954 68 Width: 255 Flags: HMW LayerCount: 2 Fore SplineSet @@ -1921,15 +2068,13 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE263 -Encoding: 61 57955 61 +Encoding: 69 57955 69 Width: 267 -Flags: W -HStem: -124 74<20 77 210 267> 50 72<20 77 210 267> -VStem: 20 72<-124 -65 65 122> 195 72<-124 -65 65 122> +Flags: MW LayerCount: 2 Fore SplineSet 195 -124 m 9 195 -65 l 25 @@ -1959,11 +2104,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE264 -Encoding: 62 57956 62 +Encoding: 70 57956 70 Width: 366 Flags: HMW LayerCount: 2 Fore SplineSet @@ -2006,11 +2151,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE280 -Encoding: 63 57984 63 +Encoding: 71 57984 71 Width: 269 Flags: HMW LayerCount: 2 Fore SplineSet @@ -2031,11 +2176,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE281 -Encoding: 64 57985 64 +Encoding: 72 57985 72 Width: 366 Flags: HMW LayerCount: 2 Fore SplineSet @@ -2078,11 +2223,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE282 -Encoding: 65 57986 65 +Encoding: 73 57986 73 Width: 169 Flags: HMW LayerCount: 2 Fore SplineSet @@ -2110,11 +2255,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE283 -Encoding: 66 57987 66 +Encoding: 74 57987 74 Width: 314 Flags: HMW LayerCount: 2 Fore SplineSet @@ -2168,11 +2313,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE4A0 -Encoding: 67 58528 67 +Encoding: 75 58528 75 Width: 320 Flags: W HStem: 0 244<5 15> VStem: -3 322 LayerCount: 2 @@ -2195,11 +2340,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE4A2 -Encoding: 68 58530 68 +Encoding: 76 58530 76 Width: 80 Flags: HMW LayerCount: 2 Fore SplineSet @@ -2211,11 +2356,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE4A4 -Encoding: 69 58532 69 +Encoding: 77 58532 77 Width: 320 Flags: HMW LayerCount: 2 Fore SplineSet @@ -2227,27 +2372,27 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE4A8 -Encoding: 70 58536 70 -Width: 320 +Encoding: 78 58536 78 +Width: 100 Flags: HMW LayerCount: 2 Fore SplineSet -40 0 m 29 +40 0 m 25 0 280 l 25 100 280 l 25 60 0 l 25 - 40 0 l 29 + 40 0 l 25 EndSplineSet Validated: 1 EndChar StartChar: uniE4AC -Encoding: 71 58540 71 +Encoding: 79 58540 79 Width: 280 Flags: W HStem: 0 309 VStem: 0 280 LayerCount: 2 @@ -2263,11 +2408,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE4C0 -Encoding: 72 58560 72 +Encoding: 80 58560 80 Width: 600 Flags: HMW LayerCount: 2 Fore SplineSet @@ -2286,11 +2431,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE4CE -Encoding: 73 58574 73 +Encoding: 81 58574 81 Width: 182 Flags: HMW LayerCount: 2 Fore SplineSet @@ -2308,11 +2453,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE4E1 -Encoding: 74 58593 74 +Encoding: 82 58593 82 Width: 130 Flags: HMW LayerCount: 2 Fore SplineSet @@ -2324,11 +2469,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE4E2 -Encoding: 75 58594 75 +Encoding: 83 58594 83 Width: 130 Flags: MW LayerCount: 2 Fore SplineSet @@ -2340,11 +2485,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE4E3 -Encoding: 76 58595 76 +Encoding: 84 58595 84 Width: 300 Flags: MW LayerCount: 2 Fore SplineSet @@ -2356,11 +2501,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE4E4 -Encoding: 77 58596 77 +Encoding: 85 58596 85 Width: 300 Flags: MW LayerCount: 2 Fore SplineSet @@ -2372,11 +2517,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE4E5 -Encoding: 78 58597 78 +Encoding: 86 58597 86 Width: 238 Flags: MW LayerCount: 2 Fore SplineSet @@ -2396,11 +2541,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE4E6 -Encoding: 79 58598 79 +Encoding: 87 58598 87 Width: 255 Flags: W HStem: 48 33<112 170.038> VStem: 0 135<81.9955 177.625> LayerCount: 2 @@ -2420,23 +2565,21 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE4E7 -Encoding: 80 58599 80 +Encoding: 88 58599 88 Width: 329 -Flags: W -HStem: -208 32<112 170.069> 48 33<184 242.918> -VStem: 0 135<-174.731 -78.875> 72 135<81.9955 177.625> +Flags: MW LayerCount: 2 Fore SplineSet -171 -196 m 1xd0 +171 -196 m 1 151 -202 140 -208 98 -208 c 0 45 -208 0 -184 0 -128 c 0 0 -83 33 -64 66 -64 c 0 - 101 -64 135 -85 135 -120 c 0xe0 + 101 -64 135 -85 135 -120 c 0 135 -136 130 -155 112 -176 c 1 158 -176 182 -160 188 -142 c 1 248 60 l 1 230 56 212 48 170 48 c 0 117 48 72 73 72 129 c 0 @@ -2445,29 +2588,27 @@ 207 121 202 102 184 81 c 1 230 81 272 108 302 158 c 1 304 160 324 160 328 158 c 1 131 -500 l 1 86 -488 l 1 - 171 -196 l 1xd0 + 171 -196 l 1 EndSplineSet Validated: 1 EndChar StartChar: uniE4E8 -Encoding: 81 58600 81 +Encoding: 89 58600 89 Width: 399 -Flags: W -HStem: -208 32<112 170.069> 48 32<189 245.07> 304 33<255 314.117> -VStem: 0 135<-174.731 -78.875> 77 135<81.2688 177.125> 143 135<337.996 433.625> +Flags: MW LayerCount: 2 Fore SplineSet -246 60 m 1xf4 +246 60 m 1 226 54 217 48 175 48 c 0 - 122 48 77 72 77 128 c 0xe8 - 77 173 110 192 143 192 c 0xe4 - 178 192 212 171 212 136 c 0xe8 + 122 48 77 72 77 128 c 0 + 77 173 110 192 143 192 c 0 + 178 192 212 171 212 136 c 0 212 120 207 101 189 80 c 1 235 80 257 96 263 114 c 1 321 317 l 1 303 313 283 304 241 304 c 0 188 304 143 329 143 385 c 0 @@ -2483,43 +2624,41 @@ 45 -208 0 -184 0 -128 c 0 0 -83 33 -64 66 -64 c 0 101 -64 135 -85 135 -120 c 0 135 -136 130 -155 112 -176 c 1 158 -176 182 -160 188 -142 c 1 - 246 60 l 1xf4 + 246 60 l 1 EndSplineSet Validated: 1 EndChar StartChar: uniE4E9 -Encoding: 82 58601 82 +Encoding: 90 58601 90 Width: 472 -Flags: W -HStem: -464 32<112 170.069> -208 32<187 245.069> 48 32<264 320.07> 304 33<330 389.117> -VStem: 0 135<-430.731 -334.875> 75 135<-174.731 -78.875> 152 135<81.2688 177.125> 218 135<337.996 433.625> +Flags: MW LayerCount: 2 Fore SplineSet -171 -452 m 1xf1 +171 -452 m 1 151 -458 140 -464 98 -464 c 0 45 -464 0 -440 0 -384 c 0 0 -339 33 -320 66 -320 c 0 - 101 -320 135 -341 135 -376 c 0xf9 + 101 -320 135 -341 135 -376 c 0 135 -392 130 -411 112 -432 c 1 158 -432 182 -416 188 -398 c 1 246 -196 l 1 226 -202 215 -208 173 -208 c 0 120 -208 75 -184 75 -128 c 0 75 -83 108 -64 141 -64 c 0 - 176 -64 210 -85 210 -120 c 0xf4 + 176 -64 210 -85 210 -120 c 0 210 -136 205 -155 187 -176 c 1 233 -176 257 -160 263 -142 c 1 321 60 l 1 301 54 292 48 250 48 c 0 - 197 48 152 72 152 128 c 0xf2 - 152 173 185 192 218 192 c 0xf1 - 253 192 287 171 287 136 c 0xf2 + 197 48 152 72 152 128 c 0 + 152 173 185 192 218 192 c 0 + 253 192 287 171 287 136 c 0 287 120 282 101 264 80 c 1 310 80 332 96 338 114 c 1 396 317 l 1 378 313 358 304 316 304 c 0 263 304 218 329 218 385 c 0 @@ -2528,36 +2667,34 @@ 353 377 348 358 330 337 c 1 376 337 418 364 448 414 c 1 450 416 470 416 474 414 c 1 131 -756 l 1 86 -744 l 1 - 171 -452 l 1xf1 + 171 -452 l 1 EndSplineSet Validated: 1 EndChar StartChar: uniE4EA -Encoding: 83 58602 83 +Encoding: 91 58602 91 Width: 472 -Flags: W -HStem: -464 32<112 170.069> -210 32<187 245.069> 40 32<260 318.069> 290 32<333 389.07> 542 33<393 452.117> -VStem: 0 135<-430.731 -334.875> 75 135<-176.731 -80.875> 148 135<73.2688 169.125> 221 135<323.269 419.125> 281 135<575.996 671.625> +Flags: MW LayerCount: 2 Fore SplineSet -319 52 m 1xfa +319 52 m 1 299 46 288 40 246 40 c 0 193 40 148 64 148 120 c 0 148 165 181 184 214 184 c 0 - 249 184 283 163 283 128 c 0xf9 + 249 184 283 163 283 128 c 0 283 112 278 93 260 72 c 1 306 72 330 88 336 106 c 1 390 302 l 1 370 296 361 290 319 290 c 0 266 290 221 314 221 370 c 0 221 415 254 434 287 434 c 0 - 322 434 356 413 356 378 c 0xf880 + 322 434 356 413 356 378 c 0 356 362 351 343 333 322 c 1 379 322 401 338 407 356 c 1 459 555 l 1 441 551 421 542 379 542 c 0 326 542 281 567 281 623 c 0 @@ -2570,27 +2707,27 @@ 86 -744 l 1 171 -452 l 1 151 -458 140 -464 98 -464 c 0 45 -464 0 -440 0 -384 c 0 0 -339 33 -320 66 -320 c 0 - 101 -320 135 -341 135 -376 c 0xfc40 + 101 -320 135 -341 135 -376 c 0 135 -392 130 -411 112 -432 c 1 158 -432 182 -416 188 -398 c 1 246 -198 l 1 226 -204 215 -210 173 -210 c 0 120 -210 75 -186 75 -130 c 0 75 -85 108 -66 141 -66 c 0 176 -66 210 -87 210 -122 c 0 210 -138 205 -157 187 -178 c 1 233 -178 257 -162 263 -144 c 1 - 319 52 l 1xfa + 319 52 l 1 EndSplineSet Validated: 1 EndChar StartChar: uniE4EE -Encoding: 84 58606 84 +Encoding: 92 58606 92 Width: 851 Flags: W HStem: -105 210<25 825> VStem: 0 25<-230 -105 105 230> 825 25<-230 -105 105 230> LayerCount: 2 @@ -2612,15 +2749,13 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE500 -Encoding: 85 58624 85 +Encoding: 93 58624 93 Width: 563 -Flags: W -HStem: -195 120<435.745 528.255> 75 120<8.74536 101.255> -VStem: -5 120<88.7454 181.255> 422 120<-181.255 -88.7454> +Flags: MW LayerCount: 2 Fore SplineSet 55 75 m 3 22 75 -5 102 -5 135 c 3 @@ -2640,11 +2775,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE501 -Encoding: 86 58625 86 +Encoding: 94 58625 94 Width: 800 Flags: W HStem: -195 120<659.745 752.255> 75 120<-6.25464 86.2546> VStem: -20 120<88.7454 181.255> 646 120<-181.255 -88.7454> LayerCount: 2 @@ -2673,100 +2808,98 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE520 -Encoding: 87 58656 87 -Width: 563 +Encoding: 95 58656 95 +Width: 379 Flags: HMW LayerCount: 2 Fore SplineSet 197 40 m 0 - 199.179123831 39.0525548563 201.555731167 38.5988184777 204.0907001 38.5988184777 c 0 - 228.311569742 38.5988184777 266.989634802 80.0214592618 286 128 c 0 - 293.801273837 147.763227053 298.897664408 174.829638922 298.897664408 197.52305288 c 0 - 298.897664408 218.46369363 294.558131706 235.680764302 284 240 c 0 - 282.059714009 240.759242344 279.934395026 241.11995209 277.659464452 241.11995209 c 0 - 252.96754404 241.11995209 210.650235832 198.625589581 196 162 c 0 - 185.665333312 135.693575703 181.068143327 108.945807045 181.068143327 87.1471403297 c 0 - 181.068143327 62.5417301443 186.925393958 44.2419393862 197 40 c 0 -200 0 m 0 - 183 0 173 6 153 32 c 1 + 199 39 201 39 204 39 c 0 + 228 39 267 80 286 128 c 0 + 294 148 299 175 299 198 c 0 + 299 219 295 236 284 240 c 0 + 282 241 280 241 278 241 c 0 + 253 241 211 199 196 162 c 0 + 186 136 181 109 181 87 c 0 + 181 62 187 44 197 40 c 0 +220 0 m 4 + 203 0 173 6 153 32 c 1 108 -90 l 1 160 -90 l 2 175 -90 175 -120 160 -120 c 0 -65 -120 l 0 -79 -120 -80 -90 -65 -90 c 2 10 -90 l 1 114 195 l 0 - 115.167116963 197.917792406 120.420719938 212.754502351 120.420719938 224.605732511 c 0 - 120.420719938 233.06305846 117.745271893 240 109 240 c 0 + 115 198 120 213 120 225 c 0 + 120 233 118 240 109 240 c 0 83 240 72 207 28 135 c 0 21 124 -6 139 1 151 c 0 56 249 69 280 125 280 c 0 170 280 193 271 203 235 c 1 244 278 263 280 305 280 c 0 341 280 380 248 380 180 c 0 - 380 87 299 0 200 0 c 0 + 380 87 319 0 220 0 c 4 EndSplineSet Validated: 1 EndChar StartChar: uniE521 -Encoding: 88 58657 88 +Encoding: 96 58657 96 Width: 440 -Flags: W -HStem: -10 44.404<309.482 391.648> 0 21G<-1 65.5 153 199> 212.877 67.1232<170.507 229.008 295.16 358.649> 221 59<37.7036 99.8884> -VStem: 276.686 77.1955<12.819 101.414> 335.007 74.6509<146.188 236.074> +Flags: MW LayerCount: 2 Fore SplineSet -80 21 m 0x64 - 76 11 74 1 57 0 c 0 - 4 0 l 0 - -6 0 0 18 4 26 c 1 - 70 193 l 0 - 77 211 69 221 60 221 c 0 - 42 221 35 210 -11 138 c 0 - -18 127 -39 139 -33 151 c 0 - 3 216 36 280 86 280 c 0x54 - 128 280 145 266 152 240 c 1 - 170 260 194 280 224 280 c 0 - 254 280 273 263 278 240 c 1 - 292 259 322 280 349 280 c 0 - 382.297060451 280 409.658220776 253.618221661 409.658220776 218.530504648 c 0x24 - 409.658220776 210.41331474 408.193901764 201.830198995 405 193 c 0 - 358 68 l 0 - 355.211869734 60.3326417674 353.881302664 53.2726015335 353.881302664 47.6241881024 c 0 - 353.881302664 39.5840041338 356.577277218 34.4040367054 361.602949871 34.4040367054 c 0 - 363.177144158 34.4040367054 364.979913018 34.9122608557 367 36 c 0 - 389 48 404 72 419 93 c 0 - 427 104 449 93 440 78 c 0 - 411 27 388 -10 323 -10 c 0 - 295.96461562 -10 276.685848474 4.31990873934 276.685848474 30.6552962356 c 0xa8 - 276.685848474 38.4136929968 278.359032859 47.2149008096 282 57 c 0 - 334 193 l 0 - 334.687448544 195.062345631 335.007330587 196.961328373 335.007330587 198.698285174 c 0 - 335.007330587 208.224115412 325.386390673 212.876768553 314.009865299 212.876768553 c 0 - 300.302784706 212.876768553 284.047157224 206.122608782 279 193 c 0 - 214 22 l 0 - 211 14 207 0 191 -1 c 1 - 153 0 l 16 - 134 -2 132 12 136 22 c 0 - 203 193 l 0 - 203.698722351 195.018531237 204.023750859 196.886379473 204.023750859 198.6021409 c 0 - 204.023750859 208.040661137 194.187819777 212.876768553 182.617370253 212.876768553 c 0 - 169.199127766 212.876768553 153.448127054 206.372675496 148 193 c 0 - 80 21 l 0x64 +80 21 m 4 + 76 11 74 1 57 0 c 4 + 4 0 l 4 + -6 0 0 18 4 26 c 5 + 70 193 l 4 + 77 211 69 221 60 221 c 4 + 42 221 35 210 -11 138 c 4 + -18 127 -39 139 -33 151 c 4 + 3 216 36 280 86 280 c 4 + 128 280 145 266 152 240 c 5 + 170 260 194 280 224 280 c 4 + 254 280 273 263 278 240 c 5 + 292 259 322 280 349 280 c 4 + 382 280 410 254 410 219 c 4 + 410 211 408 202 405 193 c 4 + 358 68 l 4 + 355 60 354 54 354 48 c 4 + 354 40 357 34 362 34 c 4 + 364 34 365 35 367 36 c 4 + 389 48 404 72 419 93 c 4 + 427 104 449 93 440 78 c 4 + 411 27 388 -10 323 -10 c 4 + 296 -10 277 5 277 31 c 4 + 277 39 278 47 282 57 c 4 + 334 193 l 4 + 335 195 335 197 335 199 c 4 + 335 209 325 213 314 213 c 4 + 300 213 284 206 279 193 c 4 + 214 22 l 4 + 211 14 207 0 191 -1 c 5 + 153 0 l 20 + 134 -2 132 12 136 22 c 4 + 203 193 l 4 + 204 195 204 197 204 199 c 4 + 204 208 195 213 183 213 c 4 + 170 213 153 206 148 193 c 4 + 80 21 l 4 EndSplineSet Validated: 1 EndChar StartChar: uniE522 -Encoding: 89 58658 89 -Width: 351 +Encoding: 97 58658 97 +Width: 278 Flags: HMW LayerCount: 2 Fore SplineSet -50 -160 m 0 @@ -2776,12 +2909,12 @@ -47 -75 -54 -83 -65 -90 c 0 -75 -97 -75 -100 -75 -110 c 0 -75 -120 -65 -124 -50 -124 c 0 13 -124 16 -35 83 230 c 1 64 230 65 230 30 230 c 0 - 17.239470207 230 10.992185238 240.421191718 10.992185238 250.625180963 c 0 - 10.992185238 260.412503619 16.7396874095 270 28 270 c 0 + 17 230 11 241 11 251 c 0 + 11 261 17 270 28 270 c 0 59 270 61 270 93 270 c 1 121 374 204 440 270 440 c 0 310 440 350 415 350 370 c 0 350 335 333 310 308 310 c 0 283 310 267 325 267 345 c 0 @@ -2788,86 +2921,115 @@ 267 355 274 363 285 370 c 0 296 377 295 380 295 390 c 0 295 400 285 404 270 404 c 0 228 404 218 332 205 270 c 1 232 270 229 270 259 270 c 0 - 272 270 278.5 260 278.5 250 c 0 - 278.5 240 272 230 259 230 c 0 + 272 270 278 260 278 250 c 0 + 278 240 272 230 259 230 c 0 233 230 229 230 196 230 c 1 153 -26 80 -160 -50 -160 c 0 EndSplineSet Validated: 1 EndChar + +StartChar: uniE523 +Encoding: 98 58659 98 +Width: 275 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +208 231 m 0 + 218 237 218 245 208 245 c 0 + 179 245 153 203 143 177 c 0 + 80 21 l 0 + 76 11 74 1 57 0 c 0 + 4 0 l 0 + -6 0 0 18 4 26 c 1 + 70 189 l 0 + 77 207 69 217 60 217 c 0 + 42 217 35 210 -11 138 c 0 + -18 127 -39 139 -33 151 c 0 + 3 216 40 275 90 275 c 0 + 132 275 147 246 150 236 c 1 + 162 251 182 275 217 275 c 0 + 252 275 275 254 275 220 c 0 + 275 181 256 165 232 165 c 0 + 212 165 190 182 190 200 c 0 + 190 216 196 224 208 231 c 0 +EndSplineSet +Validated: 1 +EndChar StartChar: uniE524 -Encoding: 90 58660 90 -Width: 563 -Flags: W -HStem: 0 30<56.2969 128.192> 250 30<86.1231 145.206> -VStem: 0 67<48.3332 106.102> 30 50<188.851 246.418> 140 60<38.2418 104.228> 145.315 72.6848<183.703 229.735> +Encoding: 99 58660 99 +Width: 220 +Flags: HMW LayerCount: 2 Fore SplineSet -80 0 m 0xd8 - 41 0 0 33 0 70 c 0xe0 - 0 92 14 108 30 108 c 0xd0 - 47 108 67 100 67 84 c 0 - 67 69 62 55 55 48 c 1 - 60 34 69 30 85 30 c 0 - 113 30 140 45 140 70 c 0xe8 +80 0 m 0 + 41 0 0 33 0 70 c 0 + 0 92 18 108 34 108 c 0 + 51 108 70 96 70 80 c 0 + 70 65 61 53 54 46 c 1 + 62 35 69 30 85 30 c 0 + 113 30 140 45 140 70 c 0 140 100 116 103 90 120 c 0 - 57 141 30 167 30 200 c 0 - 30 247 70 280 130 280 c 0 - 175 280 218 253 218 220 c 0 - 218 199 202 180 180 180 c 0 - 163.575188443 180 145.315176651 194.681601887 145.315176651 213.518742217 c 0xd4 - 145.315176651 218.765893239 146.732008255 224.335480975 150 230 c 1 - 142 240 133 250 120 250 c 0 - 101 250 80 239 80 220 c 0 - 80 193 127 175 150 160 c 0 - 184 137 200 120 200 90 c 0 - 200 26 156 0 80 0 c 0xd8 + 57 141 32 172 32 205 c 0 + 32 252 72 280 132 280 c 0 + 177 280 220 253 220 220 c 0 + 220 199 204 180 182 180 c 0 + 166 180 147 195 147 214 c 0 + 147 219 151 225 154 231 c 1 + 146 241 135 250 122 250 c 0 + 103 250 82 239 82 220 c 0 + 82 193 129 175 152 160 c 0 + 186 137 200 115 200 85 c 0 + 200 26 156 0 80 0 c 0 EndSplineSet Validated: 1 EndChar StartChar: uniE525 -Encoding: 91 58661 91 -Width: 563 +Encoding: 100 58661 100 +Width: 232 Flags: HMW LayerCount: 2 Fore SplineSet -10 3 m 0 -22 -6 -34 16 -23 26 c 0 153 219 l 0 - 141.918058124 224.910369 126.469558534 226.454180286 105.444752759 226.454180286 c 0 - 98.0113613903 226.454180286 89.8809317488 226.261203875 81 226 c 0 - 70 226 47 173 34 162 c 0 + 138 218 126 213 105 213 c 0 + 98 213 86 219 76 218 c 0 + 65 217 47 173 34 162 c 0 20 150 6 154 20 187 c 0 41 238 38 251 44 267 c 1 - 79.2709584661 264.544426942 105.57190844 263.63368868 125.594979066 263.63368868 c 0 - 183.112330324 263.63368868 188.827343421 271.148705903 206.551743542 271.148705903 c 0 - 210.297411805 271.148705903 214.579415356 270.813087697 220 270 c 0 + 79 265 89 260 126 260 c 0 + 184 260 189 271 207 271 c 0 + 211 271 215 271 220 270 c 0 235 268 233 254 224 245 c 0 66 78 l 0 - 64.6486486486 74.6216216216 63.972972973 72.1015339664 63.972972973 70.1929599431 c 0 - 63.972972973 57.9780861943 91.6486486486 70.8108108108 147 44 c 0 - 158 39 168 52 164 64 c 0 - 157 84 125 65 125 100 c 0 - 125 115 141 130 157 130 c 0 - 177 130 195 117 195 75 c 0 - 195 36.9571906054 164.866783384 2.35817739562 123.772791397 2.35817739562 c 0 - 120.578422501 2.35817739562 117.317823606 2.5672403992 114 3 c 0 - 69.8119048549 8.52351189314 48.9765181701 18.5669028431 29.7645164434 18.5669028431 c 0 - 17.6725183082 18.5669028431 6.22361116537 14.5882936895 -10 3 c 0 + 65 75 64 72 64 70 c 0 + 64 68 65 67 66 67 c 0 + 69 67 76 70 86 70 c 0 + 99 70 119 65 147 44 c 0 + 166 29 179 64 166 64 c 0 + 148 64 130 72 130 93 c 0 + 130 111 143 128 161 128 c 0 + 181 128 199 115 199 73 c 0 + 199 35 170 -4 129 -4 c 0 + 126 -4 103 -4 100 -4 c 0 + 56 2 50 23 31 23 c 0 + 19 23 6 15 -10 3 c 0 EndSplineSet Validated: 1 EndChar StartChar: uniE529 -Encoding: 92 58665 92 +Encoding: 101 58665 101 Width: 703 Flags: HMW LayerCount: 2 Fore SplineSet @@ -2979,11 +3141,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE52A -Encoding: 93 58666 93 +Encoding: 102 58666 102 Width: 563 Flags: W HStem: -120 30<-74.2249 10 108 169.668 250.775 335 433 494.668 575.775 660 758 819.668> 0 38.5988<191.014 237.319 516.014 562.319 841.014 887.319> 240 40<80.1149 147.5 239.117 318 404.386 472.5 564.117 643 729.386 797.5 889.117 973> VStem: 120.421 60.6474<87.1471 224.606> 298.898 81.1023<108.679 217.246> 445.421 60.6474<87.1471 224.606> 623.898 81.1023<108.679 217.246> 770.421 60.6474<87.1471 224.606> 948.898 81.1023<108.462 239.669> LayerCount: 2 @@ -3071,11 +3233,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE52B -Encoding: 94 58667 94 +Encoding: 103 58667 103 Width: 703 Flags: HMW LayerCount: 2 Fore SplineSet @@ -3135,11 +3297,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE52C -Encoding: 95 58668 95 +Encoding: 104 58668 104 Width: 811 Flags: HMW LayerCount: 2 Fore SplineSet @@ -3207,11 +3369,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE52D -Encoding: 96 58669 96 +Encoding: 105 58669 105 Width: 351 Flags: HMW LayerCount: 2 Fore SplineSet @@ -3280,11 +3442,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE52F -Encoding: 97 58671 97 +Encoding: 106 58671 106 Width: 617 Flags: HMW LayerCount: 2 Fore SplineSet @@ -3334,11 +3496,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE530 -Encoding: 98 58672 98 +Encoding: 107 58672 107 Width: 351 Flags: HMW LayerCount: 2 Fore SplineSet @@ -3406,11 +3568,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE531 -Encoding: 99 58673 99 +Encoding: 108 58673 108 Width: 617 Flags: HMW LayerCount: 2 Fore SplineSet @@ -3496,11 +3658,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE539 -Encoding: 100 58681 100 +Encoding: 109 58681 109 Width: 351 Flags: HMW LayerCount: 2 Fore SplineSet @@ -3574,11 +3736,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE566 -Encoding: 101 58726 101 +Encoding: 110 58726 110 Width: 509 Flags: HMW LayerCount: 2 Fore SplineSet @@ -3614,11 +3776,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE567 -Encoding: 102 58727 102 +Encoding: 111 58727 111 Width: 437 Flags: W HStem: -3 72<49.5596 110.739> 0 49<319.775 397.094> 141 71<327.059 386.441> 161 47<36.904 118.027> VStem: 0 24<64.6579 145.71> 413 24<63.9568 143.617> LayerCount: 2 @@ -3651,11 +3813,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE569 -Encoding: 103 58729 103 +Encoding: 112 58729 112 Width: 437 Flags: HMW LayerCount: 2 Fore SplineSet @@ -3693,11 +3855,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE56C -Encoding: 104 58732 104 +Encoding: 113 58732 113 Width: 580 Flags: W HStem: 0 224 LayerCount: 2 Fore @@ -3718,11 +3880,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE56D -Encoding: 105 58733 105 +Encoding: 114 58733 114 Width: 580 Flags: W HStem: -53 326<278 305> 0 21G<197.065 232.286 418.065 453.137> VStem: 278 27<-53 70 150 273> LayerCount: 2 @@ -3752,11 +3914,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE582 -Encoding: 106 58754 106 +Encoding: 115 58754 115 Width: 280 Flags: HMW LayerCount: 2 Fore SplineSet @@ -3776,11 +3938,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE5D0 -Encoding: 107 58832 107 +Encoding: 116 58832 116 Width: 310 Flags: HMW LayerCount: 2 Fore SplineSet @@ -3792,11 +3954,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE5E2 -Encoding: 108 58850 108 +Encoding: 117 58850 117 Width: 300 Flags: W HStem: 0 62<198.921 262.211> 96 64<38.8054 112.592> VStem: 283 16<88.1179 101.401> LayerCount: 2 @@ -3816,11 +3978,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE610 -Encoding: 109 58896 109 +Encoding: 118 58896 118 Width: 300 Flags: HMW LayerCount: 2 Fore SplineSet @@ -3836,30 +3998,30 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE612 -Encoding: 110 58898 110 +Encoding: 119 58898 119 Width: 250 Flags: HMW LayerCount: 2 Fore SplineSet -105 0 m 25 - 0 450 l 29 - 40 450 l 29 +105 0 m 29 + 0 450 l 25 + 40 450 l 25 125 90 l 25 - 210 450 l 29 - 250 450 l 29 + 210 450 l 25 + 250 450 l 25 145 0 l 25 - 105 0 l 25 + 105 0 l 29 EndSplineSet Validated: 1 EndChar StartChar: uniE614 -Encoding: 111 58900 111 +Encoding: 120 58900 120 Width: 200 Flags: HMW LayerCount: 2 Fore SplineSet @@ -3876,11 +4038,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE618 -Encoding: 112 58904 112 +Encoding: 121 58904 121 Width: 280 Flags: HMW LayerCount: 2 Fore SplineSet @@ -3894,11 +4056,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE624 -Encoding: 113 58916 113 +Encoding: 122 58916 122 Width: 250 Flags: HMW LayerCount: 2 Fore SplineSet @@ -3918,42 +4080,42 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE630 -Encoding: 114 58928 114 +Encoding: 123 58928 123 Width: 200 Flags: HMW LayerCount: 2 Fore SplineSet 84 102 m 1 - 36.534641833 109.00393025 -7.1054273576e-15 150.442560477 0 200 c 24 + 37 109 -0 150 0 200 c 24 0 255 45 300 100 300 c 24 155 300 200 255 200 200 c 24 - 200 150.442560477 163.465358167 109.00393025 116 102 c 1 - 116 101.288034818 l 1 + 200 150 163 109 116 102 c 1 + 116 101 l 1 116 0 l 25 84 0 l 25 - 84 101.288034818 l 1 + 84 101 l 1 84 102 l 1 -116 126 m 5 - 149.481193966 134.213607404 175 164.479867787 175 200 c 24 +116 126 m 1 + 149 134 175 164 175 200 c 24 175 241 141 275 100 275 c 24 59 275 25 241 25 200 c 24 - 25 164.479867787 50.5188060342 134.213607404 84 126 c 1 - 84 126.757636954 l 1 + 25 164 51 134 84 126 c 1 + 84 127 l 1 84 200 l 25 116 200 l 25 - 116 126.757636954 l 1 - 116 126 l 5 + 116 127 l 1 + 116 126 l 1 EndSplineSet Validated: 1 EndChar StartChar: uniE650 -Encoding: 115 58960 115 +Encoding: 124 58960 124 Width: 1037 Flags: W HStem: -2 60<361.035 435.033 953.253 1010.82> 0 49<543.265 652.027> 286 36<514.943 580.797> 359 66<58.4784 125.129> 402 58<367.211 444.917> 607 32<177.106 261> VStem: 0 57<406 505.924> 148 26<463.933 475.584> 200 67<410.241 442> 274.641 84.3586<205.588 329> 425 56<126.64 255.856> 452 64<466.983 558.522> 585 40<194.878 284.873> 675 60<72.5613 225.441> 887 59<79.8865 267.532> 952 60<-0.820206 56.8202> LayerCount: 2 @@ -4028,11 +4190,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE655 -Encoding: 116 58965 116 +Encoding: 125 58965 125 Width: 540 Flags: W HStem: 68 93<79.5149 155.133> 182 17<220 222.173 252.655 264.303> 192 94<18.5323 100.176 375.888 460.387> 230 56<60.9363 133.273> 230 18<300.618 361.695> 274 18<213.64 227.572 256.894 258> 315 97<73.5817 155.121 322.704 406.413> VStem: 179 23<209.875 223.47 254.181 264.625> 192 98<17.9339 97.9009 381.276 451.65> 230 18<113.95 174.519 300.936 363.797> 278 17<212.458 224.186 254.5 261> LayerCount: 2 @@ -4101,11 +4263,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE910 -Encoding: 117 59664 117 +Encoding: 126 59664 126 Width: 500 Flags: HMW LayerCount: 2 Fore SplineSet @@ -4127,11 +4289,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE911 -Encoding: 118 59665 118 +Encoding: 127 59665 127 Width: 500 Flags: HMW LayerCount: 2 Fore SplineSet @@ -4148,41 +4310,41 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE912 -Encoding: 119 59666 119 +Encoding: 128 59666 128 Width: 500 Flags: HMW LayerCount: 2 Fore SplineSet -228 350 m 1 - 273 350 l 1 - 273 250 l 1 - 400 237 500 131 500 0 c 0 - 500 -130 401 -237 273 -250 c 1 +228 350 m 5 + 273 350 l 5 + 273 250 l 5 + 400 237 500 131 500 0 c 4 + 500 -130 401 -237 273 -250 c 5 273 -350 l 5 228 -350 l 5 - 228 -249 l 1 - 100 -238 0 -131 0 0 c 0 - 0 132 99 238 228 249 c 1 - 228 350 l 1 -228 -203.826663616 m 1 - 228 203.826663616 l 1 - 125.298009966 192.809355922 45 105.569124751 45 0 c 0 - 45 -105.569124751 125.298009966 -192.809355922 228 -203.826663616 c 1 -273 -203.716902537 m 1 - 375.222749877 -192.242459755 455 -105.22624212 455 0 c 0 - 455 105.22624212 375.222749877 192.242459755 273 203.716902537 c 1 - 273 -203.716902537 l 1 + 228 -249 l 5 + 100 -238 0 -131 0 0 c 4 + 0 132 99 238 228 249 c 5 + 228 350 l 5 +228 -204 m 5 + 228 204 l 5 + 125 193 45 106 45 0 c 4 + 45 -106 125 -193 228 -204 c 5 +273 -204 m 5 + 375 -193 455 -105 455 0 c 4 + 455 105 375 193 273 204 c 5 + 273 -204 l 5 EndSplineSet Validated: 1 EndChar StartChar: uniE914 -Encoding: 120 59668 120 +Encoding: 129 59668 129 Width: 500 Flags: HMW LayerCount: 2 Fore SplineSet @@ -4211,11 +4373,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE915 -Encoding: 121 59669 121 +Encoding: 130 59669 130 Width: 500 Flags: HMW LayerCount: 2 Fore SplineSet @@ -4239,11 +4401,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE918 -Encoding: 122 59672 122 +Encoding: 131 59672 131 Width: 500 Flags: HMW LayerCount: 2 Fore SplineSet @@ -4276,11 +4438,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE920 -Encoding: 123 59680 123 +Encoding: 132 59680 132 Width: 120 Flags: HMW LayerCount: 2 Fore SplineSet @@ -4292,11 +4454,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE925 -Encoding: 124 59685 124 +Encoding: 133 59685 133 Width: 45 Flags: HMW LayerCount: 2 Fore SplineSet @@ -4308,11 +4470,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniE95D -Encoding: 125 59741 125 +Encoding: 134 59741 134 Width: 540 Flags: HMW LayerCount: 2 Fore SplineSet @@ -4337,11 +4499,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniEA02 -Encoding: 126 59906 126 +Encoding: 135 59906 135 Width: 250 Flags: HMW LayerCount: 2 Fore SplineSet @@ -4361,11 +4523,11 @@ EndSplineSet Validated: 1 EndChar StartChar: uniEAA4 -Encoding: 127 60068 127 +Encoding: 136 60068 136 Width: 250 Flags: HMW LayerCount: 2 Fore SplineSet @@ -4372,18 +4534,154 @@ 0 270 m 0 30 300 45 311 85 311 c 0 125 311 170 250 210 250 c 0 222 250 230 250 250 270 c 0 252 272 256 273 260 273 c 0 - 266 273 272 271 272 264 c 0 - 272 257 266 246 250 230 c 0 + 266 273 274 273 274 266 c 0 + 274 259 266 246 250 230 c 0 220 200 205 189 165 189 c 0 125 189 80 250 40 250 c 0 28 250 20 250 0 230 c 0 -2 228 -7 226 -11 226 c 0 - -17 226 -22 229 -22 236 c 0 - -22 243 -17 253 0 270 c 0 + -17 226 -24 227 -24 234 c 0 + -24 241 -17 253 0 270 c 0 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniECA2 +Encoding: 137 60578 137 +Width: 450 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +337 -20 m 4 + 337 50 264 111 193 111 c 4 + 154 111 109 85 109 41 c 4 + 109 -30 186 -87 257 -87 c 4 + 298 -87 337 -65 337 -20 c 4 +450 10 m 4 + 450 -60 361 -119 225 -119 c 4 + 89 -119 0 -60 0 10 c 4 + 0 80 89 139 225 139 c 4 + 361 139 450 80 450 10 c 4 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniECA3 +Encoding: 138 60579 138 +Width: 328 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +292 68 m 0 + 283 84 264 91 242 91 c 0 + 164 91 31 10 31 -49 c 0 + 31 -56 33 -62 37 -68 c 0 + 45 -84 64 -91 86 -91 c 0 + 164 -91 297 -10 297 49 c 0 + 297 56 295 62 292 68 c 0 +299 680 m 1 + 328 680 l 1 + 328 22 l 2 + 328 -70 223 -148 130 -148 c 0 + 83 -148 40 -128 15 -81 c 0 + 5 -61 0 -41 0 -22 c 0 + 0 70 105 148 198 148 c 0 + 237 148 273 134 298 103 c 1 + 299 680 l 1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniECA5 +Encoding: 139 60581 139 +Width: 320 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +290 680 m 1 + 320 680 l 1 + 320 40 l 2 + 320 -51 231 -135 110 -135 c 0 + 40 -135 0 -90 0 -40 c 0 + 0 50 90 135 210 135 c 0 + 244 135 271 124 290 107 c 1 + 290 680 l 1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniECA7 +Encoding: 140 60583 140 +Width: 522 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +320 441 m 1 + 320 40 l 2 + 320 -51 231 -135 110 -135 c 0 + 40 -135 0 -90 0 -40 c 0 + 0 50 90 135 210 135 c 0 + 244 135 271 124 290 107 c 1 + 290 441 l 1 + 290 680 l 1 + 320 680 l 1 + 341 485 522 459 522 196 c 0 + 522 137 505 85 472 10 c 1 + 485 57 490 104 490 148 c 0 + 490 258 462 396 320 441 c 1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniECA9 +Encoding: 141 60585 141 +Width: 522 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +290 107 m 1 + 290 337 l 1 + 290 680 l 1 + 320 680 l 1 + 352 547 522 491 522 309 c 0 + 522 282 514 253 501 222 c 1 + 513 196 523 168 523 138 c 0 + 523 104 510 67 489 27 c 1 + 493 47 494 67 494 85 c 0 + 494 219 390 338 320 338 c 1 + 320 40 l 2 + 320 -51 231 -135 110 -135 c 0 + 40 -135 0 -90 0 -40 c 0 + 0 50 90 135 210 135 c 0 + 244 135 271 124 290 107 c 1 +320 509 m 1 + 346 402 429 361 494 235 c 1 + 494 242 495 248 495 255 c 0 + 495 388 391 509 320 509 c 1 EndSplineSet Validated: 1 EndChar + +StartChar: uniECB7 +Encoding: 142 60599 142 +Width: 100 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +50 -50 m 3 + 22 -50 0 -28 0 0 c 3 + 0 28 22 50 50 50 c 3 + 78 50 100 28 100 0 c 3 + 100 -28 78 -50 50 -50 c 3 +EndSplineSet +EndChar EndChars EndSplineFont Index: modules/MIDI.js ================================================================== --- modules/MIDI.js +++ modules/MIDI.js @@ -8,71 +8,99 @@ // %%MIDI channel n // %%MIDI program n // %%MIDI control k v // %%MIDI drummap ABC_note MIDI_pitch +// Using %%MIDI drummap creates a voicemap named "MIDIdrum". +// This name must be used if some print map is required: +// %%MIDI drummap g 42 +// %%map MIDIdrum g heads=x +// A same effect may be done by +// %%percmap g 42 x +// but this is not abcMIDI compatible! + abc2svg.MIDI = { // parse %%MIDI commands do_midi: function(parm) { - var pits = new Int8Array([0, 0, 1, 2, 2, 3, 3, 4, 5, 5, 6, 6]), - accs = new Int8Array([0, 1, 0, -1, 0, 0, 1, 0, -1, 0, -1, 0]) + + // convert a ABC note to b40 (string) + function abc_b40(p) { + var pit, + acc = 0, + i = 0 + + switch (p[0]) { + case '^': + if (p[++i] == '^') { + acc = 2 + i++ + } else { + acc = 1 + } + break + case '=': + i++ + break + case '_': + if (p[++i] == '_') { + acc = -2 + i++ + } else { + acc = -1 + } + break + } + pit = 'CDEFGABcdefgab'.indexOf(p[i++]) + 16 + if (pit < 16) + return + while (p[i] == "'") { + pit += 7 + i++ + } + while (p[i] == ",") { + pit -= 7 + i++ + } + return abc2svg.pab40(pit, acc).toString() + } // abc_b40() - // convert a MIDI pitch to a note - function tonote(p) { + // convert a MIDI pitch to b40 + function mid_b40(p) { var pit = Number(p) if (isNaN(pit)) return - p = ((pit / 12) | 0) * 7 - 19; // octave + p = (pit / 12) | 0 // octave pit = pit % 12; // in octave - p += pits[pit] - note = { - pit: p - } - if (accs[pit]) - note.acc = accs[pit] - return note - } // tonote() - - // normalize a note for mapping - function norm(p) { - var a = p.match(/^([_^=]*)([A-Ga-g])([,']*)$/) // ' - if (!a) - return - if (p.match(/[A-Z]/)) { - p = p.toLowerCase(); - if (p.indexOf("'") > 0) - p = p.replace("'", '') - else - p += ',' - } - return p - } // norm() - - var n, v, s, - maps = this.get_maps(), - a = parm.split(/\s+/) + return p * 40 + abc2svg.isb40[pit] + 2 + } // mid_b40() + + // do_midi() + var n, v, s, maps, + a = parm.split(/\s+/) switch (a[1]) { - case "channel": + case "channel": // channel 10 is bank 128 if (a[2] != "10") - break - this.set_v_param("midictl", "0 1") // channel 10 is bank 128 program 0 + break // other channel values are ignored + abc2svg.MIDI.do_midi.call(this, "MIDI control 0 1") // MSB bank + abc2svg.MIDI.do_midi.call(this, "MIDI control 32 0") // LSB bank break case "drummap": - if (this.cfmt().sound != "play") - break //fixme: should have a 'MIDIdrum' per voice? - n = norm(a[2]); - v = tonote(a[3]); + n = abc_b40(a[2]) + v = mid_b40(a[3]) if (!n || !v) { this.syntax(1, this.errs.bad_val, "%%MIDI drummap") break } + maps = this.get_maps() if (!maps.MIDIdrum) maps.MIDIdrum = {} - maps.MIDIdrum[n] = [null, v]; + if (!maps.MIDIdrum[n]) + maps.MIDIdrum[n] = [] + maps.MIDIdrum[n][3] = v this.set_v_param("mididrum", "MIDIdrum") break case "program": if (a[3] != undefined) // the channel is unused v = a[3] @@ -81,11 +109,17 @@ v = parseInt(v) if (isNaN(v) || v < 0 || v > 127) { this.syntax(1, "Bad program in %%MIDI") return } - this.set_v_param("instr", v) + if (this.parse.state == 3) { + s = this.new_block("midiprog"); + s.play = true + s.instr = v + } else { + this.set_v_param("instr", v) + } break case "control": n = parseInt(a[2]) if (isNaN(n) || n < 0 || n > 127) { this.syntax(1, "Bad controller number in %%MIDI") @@ -94,16 +128,17 @@ v = parseInt(a[3]) if (isNaN(v) || v < 0 || v > 127) { this.syntax(1, "Bad controller value in %%MIDI") return } - if (this.cfmt().sound != "play") - break - if (this.parse.state >= 2) { + if (this.parse.state == 3) { s = this.new_block("midictl"); + s.play = true s.ctrl = n; s.val = v + } else { + this.set_v_param("midictl", a[2] + ' ' + a[3]) } break } }, // do_midi() Index: modules/ambitus.js ================================================================== --- modules/ambitus.js +++ modules/ambitus.js @@ -62,10 +62,11 @@ this.out_svg('v' + ((s.notes[1].pit - s.notes[0].pit) * 3).toFixed(1) + '" stroke-width=".6"/>\n'); } s.x += 26; + s.nhd = 0 p_voice.clef.nhd = 0 } of(p_voice) }, // draw_symbols() @@ -73,16 +74,16 @@ of(last_s) if (!last_s && this.cfmt().ambitus) abc2svg.ambitus.do_ambitus.call(this) }, - set_fmt: function(of, cmd, param, lock) { + set_fmt: function(of, cmd, param) { if (cmd == "ambitus") { this.cfmt().ambitus = param return } - of(cmd, param, lock) + of(cmd, param) }, set_width: function(of, s) { if (s.clef_type != undefined && s.nhd > 0) { s.wl = 40; Index: modules/capo.js ================================================================== --- modules/capo.js +++ modules/capo.js @@ -23,12 +23,11 @@ if (gch.type == 'g') break } gch2 = Object.create(gch); gch2.capo = false; // (would be erased when setting gch) - gch2.text = this.gch_tr1(gch2.text, - [0, 5, -2, 3, -4, 1, -6, -1, 4, -3, 2, -5][transp % 12]) + gch2.text = this.gch_tr1(gch2.text, -abc2svg.ifb40[transp % 12]) if (!this.capo_first) { // if new tune this.capo_first = true; gch2.text += " (capo: " + transp.toString() + ")" } @@ -49,16 +48,16 @@ output_music: function(of) { this.capo_first = false; of() }, - set_fmt: function(of, cmd, param, lock) { + set_fmt: function(of, cmd, param) { if (cmd == "capo") { this.cfmt().capo = param return } - of(cmd, param, lock) + of(cmd, param) }, set_hooks: function(abc) { abc.gch_build = abc2svg.capo.gch_build.bind(abc, abc.gch_build); abc.output_music = abc2svg.capo.output_music.bind(abc, abc.output_music); ADDED modules/clair.js Index: modules/clair.js ================================================================== --- /dev/null +++ modules/clair.js @@ -0,0 +1,372 @@ +// clair.js - module to output Clairnote sheets (https:clairnote.org) +// +// Copyright (C) 2019 Jean-Francois Moine - GPL3+ +// +// This module is loaded when "%%clairnote" appears in a ABC source. +// +// Parameters (none) +// %%clairnote 1 + +abc2svg.clair = { + +// table for helper lines (from C, to c'') +// index = (note pitch + 16) +// value = array of staff offsets / null + hl_tb: [ + new Int8Array([-20,-16,-12,-8,-4]), // _B,, -18 + new Int8Array([-20,-18,-16,-12,-8,-4]), // B,, -17 + new Int8Array([-16,-12,-8,-4]), // C, -16 + new Int8Array([-16,-12,-8,-4]), // ^C, -15 + new Int8Array([-16,-14,-12,-8,-4]), // D, -14 + new Int8Array([-12,-8,-4]), // ^D, -13 + new Int8Array([-12,-8,-4]), // E, -12 + new Int8Array([-12,-8,-4]), // F, -11 + new Int8Array([-12,-10,-8,-4]), // ^F, -10 + new Int8Array([-8,-4]), // G, -9 + new Int8Array([-8,-4]), // ^G, -8 + new Int8Array([-8,-4]), // A, -7 + new Int8Array([-8,-6,-4]), // _B, -6 + new Int8Array([-4]), // B, -5 + new Int8Array([-4]), // C -4 + new Int8Array([-4]), // ^C -3 + new Int8Array([-4,-2]), // D -2 + null, // ^D -1 + null, // E 0 + null, // F 1 + new Int8Array([2]), // ^F 2 + null, // G 3 + null, // ^G 4 + null, // A 5 + new Int8Array([6,8]), // _B 6 + new Int8Array([8]), // B 7 + new Int8Array([8]), // c 8 + new Int8Array([8]), // ^c 9 + new Int8Array([8,10]), // d 10 + null, // _e 11 + null, // e 12 + null, // f 13 + new Int8Array([14]), // ^f 14 + null, // g 15 + null, // ^g 16 + null, // a 17 + new Int8Array([18,20]), // _b 18 + new Int8Array([20]), // b 19 + new Int8Array([20]), // c' 20 + new Int8Array([20]), // ^c' 21 + new Int8Array([20,22]), // d' 22 + new Int8Array([20,22]), // _e' 23 + new Int8Array([20,24]), // e' 24 + new Int8Array([20,24]), // f' 25 + new Int8Array([20,24,26]), // ^f' 26 + new Int8Array([20,24,26]), // g' 27 + new Int8Array([20,24,28]), // ^g' 28 + new Int8Array([20,24,28]), // a' 29 + new Int8Array([20,24,28,30]), // _b' 30 + new Int8Array([20,24,28,30]), // b' 31 + new Int8Array([20,24,28,32]) // c'' 32 + ], + +// draw the helper lines + draw_hl: function(of, x, s, hltype) { + if (!s.p_v.clair) { + of(x, s, hltype) + return + } + + var i, m, hl, + staffb = this.get_staff_tb()[s.st].y + + for (m = 0; m <= s.nhd; m++) { + hl = abc2svg.clair.hl_tb[s.notes[m].pit] + if (!hl) + continue + for (i = 0; i < hl.length; i++) + this.xygl(x, staffb + hl[i] * 3, hltype) + } + }, // draw_hl() + +// draw the key signature + draw_keysig: function(of, x, s) { + if (!s.p_v.clair) { + of(x, s) + return + } + + var i, + staffb = this.get_staff_tb()[s.st].y, + a_tb = new Int8Array(24), + sc = [0, 2, 4, 5, 7, 9, 11, 12, 14, 16, 17, 19, 21, 23], + // major scale (2 octaves) + bn_tb = [7, 2, -3, 4, -1, 6, 1, 8, 3, -2, 5, 0, 7, 2, -3], + // #sf -> (major) base note + bn = bn_tb[s.k_sf + 7] // base note + + if (!s.k_a_acc) { + if (s.k_sf > 0) { + for (i = 1; i <= s.k_sf; i++) { + a_tb[bn_tb[i] + 3] = 1; // index = y + 3 + a_tb[bn_tb[i] + 12 + 3] = 1 + } + if (bn + sc[s.k_mode] > 8) + bn -= 12 + for (i = 7; --i >= 0; ) { + y = bn + sc[s.k_mode + i] + this.xygl(x, staffb + y * 3, (y & 1) ? "wk" : "bk"); + if (a_tb[y + 3]) + this.xygl(x, + staffb + y * 3, + "sht"); + switch (s.k_mode + i) { + case 3: + case 7: + case 10: + x += 4.5 + break + } + } + } else { + for (i = s.k_sf; i < 0; i++) { + a_tb[bn_tb[i + 6] + 3] = 1; // index = y + 3 + a_tb[bn_tb[i + 6] + 12 + 3 ] = 1 + } + if (bn + sc[s.k_mode] > 8) + bn -= 12 + for (i = 0; i < 7; i++) { // down top + y = bn + sc[s.k_mode + i] + this.xygl(x, staffb + y * 3, (y & 1) ? "wk" : "bk"); + if (a_tb[y + 3]) + this.xygl(x, + staffb + y * 3, + "flt"); + switch (s.k_mode + i) { + case 2: + case 6: + case 9: + x += 4.5 + break + } + } + } + } else if (s.k_a_acc.length) { + for (i = 0; i < s.k_a_acc.length; i++) { + var acc = s.k_a_acc[i]; + j = sc[(acc.pit + 3) % 7]; + a_tb[j] = acc.acc; + a_tb[j + 12] = acc.acc + } +// todo + } + }, // draw_keysig() + +// update a clef + new_clef: function(s) { + switch (s.clef_type) { + case 't': + s.clef_line = 3; + s.clefpit = -2; + s.clef_name = "cl4" + break + case 'c': + s.clef_line = 3; + s.clefpit = 6; + s.clef_name = "cl3" + break + case 'b': + s.clef_line = 3; + s.clefpit = 14; + s.clef_name = "cl2" + break + } + }, // new_clef() + +// function called before SVG generation + output_music: function(of) { + var s, m, mp, p_v, v, + cfmt = this.cfmt(), + tsfirst = this.get_tsfirst(), + voice_tb = this.get_voice_tb(), + abcmidi = new AbcMIDI(); + + abcmidi.add(tsfirst, voice_tb); // get the MIDI pitches + + // define the new clefs and key signatures + // (clefs converted from clairnote.ly) + this.do_begin_end("svg", null, '\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +') + + // change the pitches of all notes + // (pitch + accidental => offset) + for (v = 0; v < voice_tb.length; v++) { + p_v = voice_tb[v] + if (!p_v.clair) + continue + p_v.scale = 1.3; + for (s = p_v.sym; s; s = s.next) { + if (!s.dur) + continue + for (m = 0; m <= s.nhd; m++) { + mp = s.notes[m].midi + if (mp) { + mp -= 46; + s.notes[m].pit = mp + delete s.notes[m].acc + } + } + } + } + of() + }, + +// set a format parameter + set_fmt: function(of, cmd, param) { + if (cmd == "clairnote") { + this.set_v_param("clair", true); + this.set_v_param("stafflines", "|-|---|-|") + this.set_v_param("staffscale", .8) + return + } + of(cmd, param) + }, + +// set the pitches according to the clefs + set_pitch: function(of, last_s) { + if (last_s) { + of(last_s) + return // not the 1st time + } + var p_v, s, v, + voice_tb = this.get_voice_tb(), + staff_tb = this.get_staff_tb() + + for (v = 0; v < voice_tb.length; v++) { + p_v = voice_tb[v] + if (!p_v.clair) + continue + abc2svg.clair.new_clef(staff_tb[p_v.st].clef) + for (s = p_v.sym; s; s = s.next) { + if (s.clef_type) + abc2svg.clair.new_clef(s) + } + } + of(last_s) + }, + +// set the clairnote flag in the current voice + set_vp: function(of, a) { + var i, + curvoice = this.get_curvoice() + + for (i = 0; i < a.length; i++) { + if (a[i] == "clair=") { + curvoice.clair = a[i + 1] + break + } + } + of(a) + }, + +// set the width of the clairnote key signatures + set_width: function(of, s) { + if (s.k_sf && s.p_v && s.p_v.clair) { + s.wl = 8; + s.wr = 10 + } else { + of(s) + } + }, + + set_hooks: function(abc) { + abc.draw_hl = abc2svg.clair.draw_hl.bind(abc, abc.draw_hl); + abc.draw_keysig = abc2svg.clair.draw_keysig.bind(abc, abc.draw_keysig); + abc.output_music = abc2svg.clair.output_music.bind(abc, abc.output_music); + abc.set_format = abc2svg.clair.set_fmt.bind(abc, abc.set_format); + abc.set_pitch = abc2svg.clair.set_pitch.bind(abc, abc.set_pitch); + abc.set_vp = abc2svg.clair.set_vp.bind(abc, abc.set_vp); + abc.set_width = abc2svg.clair.set_width.bind(abc, abc.set_width) + } +} // clair + +abc2svg.modules.hooks.push(abc2svg.clair.set_hooks); + +// the module is loaded +abc2svg.modules.clairnote.loaded = true Index: modules/combine.js ================================================================== --- modules/combine.js +++ modules/combine.js @@ -9,11 +9,12 @@ abc2svg.combine = { // function called at start of the generation when multi-voices comb_v: function() { - var C = abc2svg.C + var C = abc2svg.C, + delsym = [] // deleted symbols for slurs and ties // check if voice combine may occur function may_combine(s) { var nhd2, s2 = s.ts_next @@ -36,13 +37,11 @@ if (s.type == C.REST) { if (s.type == s2.type && s.invis && !s2.invis) return false return true } - if (s2.a_ly - || s2.sl1 || s2.sl2 - || s2.slur_start || s2.slur_end) + if (s2.a_ly) return false if (s2.beam_st != s.beam_st || s2.beam_end != s.beam_end) return false; nhd2 = s2.nhd @@ -54,13 +53,15 @@ // combine two notes function combine_notes(s, s2) { var nhd, type, m; - s.notes = s.notes.concat(s2.notes); + for (m = 0; m <= s2.nhd; m++) // change the container of the notes + s2.notes[m].s = s + Array.prototype.push.apply(s.notes, s2.notes); s.nhd = nhd = s.notes.length - 1; - this.sort_pitch(s) // sort the notes by pitch + s.notes.sort(abc2svg.pitcmp) // sort the notes by pitch if (s.combine >= 3) { // remove unison heads for (m = nhd; m > 0; m--) { if (s.notes[m].pit == s.notes[m - 1].pit && s.notes[m].acc == s.notes[m - 1].acc) @@ -71,16 +72,16 @@ s.ymx = 3 * (s.notes[nhd].pit - 18) + 4; s.ymn = 3 * (s.notes[0].pit - 18) - 4; // force the tie directions - type = s.notes[0].ti1 - if ((type & 0x0f) == C.SL_AUTO) - s.notes[0].ti1 = C.SL_BELOW | (type & ~C.SL_DOTTED); - type = s.notes[nhd].ti1 - if ((type & 0x0f) == C.SL_AUTO) - s.notes[nhd].ti1 = C.SL_ABOVE | (type & ~C.SL_DOTTED) + type = s.notes[0].tie_ty + if ((type & 0x07) == C.SL_AUTO) + s.notes[0].tie_ty = C.SL_BELOW | (type & C.SL_DOTTED); + type = s.notes[nhd].tie_ty + if ((type & 0x07) == C.SL_AUTO) + s.notes[nhd].tie_ty = C.SL_ABOVE | (type & C.SL_DOTTED) } // combine_notes() // combine 2 voices function do_combine(s) { var s2, nhd, nhd2, type @@ -98,28 +99,56 @@ if (s.invis && !s2.invis) delete s.invis } else { combine_notes.call(this, s, s2) + if (s2.tie_s) + s.tie_s = s2.tie_s + } + + if (s2.sls) { + if (s.sls) + Array.prototype.push.apply(s.sls, s2.sls) + else + s.sls = s2.sls } - + if (s2.sl1) + s.sl1 = true if (s2.a_gch) s.a_gch = s2.a_gch if (s2.a_dd) { if (!s.a_dd) s.a_dd = s2.a_dd else - s.a_dd = s.a_dd.concat(s2.a_dd) + Array.prototype.push.apply(s.a_dd, s2.a_dd) } + + // memorize the deleted symbol: it may support slur or tie endings + delsym.push({s: s2, r: s}); + this.unlksym(s2) // remove the next symbol // there may be more voices if (s.in_tuplet || !may_combine.call(this, s)) break } } // do_combine() + // replace tie endings + function tie_repl(s) { + var s1 = s.tie_s, + i = delsym.length + + while (--i >= 0) { + if (delsym[i].s == s1) { + s.tie_s = delsym[i].r + break + } + } + } // tie_repl() + + // code of comb_v() var s, s2, g, i, r for (s = this.get_tsfirst(); s; s = s.ts_next) { switch (s.type) { case C.REST: @@ -168,10 +197,16 @@ do { s2 = s2.next } while (s2.type != C.NOTE && s2.type != C.REST) } } + + // replace the tie endings + for (s = this.get_tsfirst(); s; s = s.ts_next) { + if (s.tie_s) + tie_repl(s) + } }, // comb_v() do_pscom: function(of, text) { if (text.slice(0, 13) == "voicecombine ") this.set_v_param("combine", text.split(/[ \t]/)[1]) Index: modules/diag.js ================================================================== --- modules/diag.js +++ modules/diag.js @@ -480,16 +480,16 @@ if (this.cfmt().diag) abc2svg.diag.do_diag.call(this) of() }, - set_fmt: function(of, cmd, param, lock) { + set_fmt: function(of, cmd, param) { if (cmd == "diagram") { this.cfmt().diag = param return } - of(cmd, param, lock) + of(cmd, param) }, set_hooks: function(abc) { abc.output_music = abc2svg.diag.output_music.bind(abc, abc.output_music); abc.set_format = abc2svg.diag.set_fmt.bind(abc, abc.set_format) Index: modules/equalbars.js ================================================================== --- modules/equalbars.js +++ modules/equalbars.js @@ -14,15 +14,15 @@ this.equalbars_d = 0; of() }, // get the equalbars parameter - set_fmt: function(of, cmd, param, lock) { + set_fmt: function(of, cmd, param) { if (cmd == "equalbars") this.cfmt().equalbars = this.get_bool(param) else - of(cmd, param, lock) + of(cmd, param) }, // adjust the symbol offsets of a music line set_sym_glue: function(of, width) { var C = abc2svg.C, @@ -32,14 +32,12 @@ of(width) // compute the x offset of the symbols if (!this.cfmt().equalbars) return - // search the first note/rest/bar + // search the first note/rest/space for (s2 = tsfirst; s2; s2 = s2.ts_next) { - if (!s2.seqst) - continue switch (s2.type) { default: continue case C.GRACE: case C.MREST: @@ -59,11 +57,17 @@ if (s.type == C.BAR && s.seqst) { bars.push([s, s.time - t]); t = s.time } } - bars.push([s, s.time - t]); + + // push the last bar if it is not the invisible bar after a key change + if (!s.invis || s.prev.type != C.KEY) + bars.push([s, s.time - t]) + else + bars[bars.length - 1][0] = s // replace the last bar + width = s.x t = s.time if (s.dur) t += s.dur; n = bars.length @@ -70,14 +74,14 @@ if (n <= 1) return // one or no bar // set the measure parameters x = s2.type == C.GRACE ? s2.extra.x : s2.x; - d = this.equalbars_d - if (!d) - d = this.equalbars_d = x; // offset first note/rest + if (this.equalbars_d < x) + this.equalbars_d = x // new offset of the first note/rest + d = this.equalbars_d w = (width - d) / (t - t0) // width per time unit // loop on the bars for (i = 0; i < n; i++) { s = bars[i][0]; // next bar Index: modules/grid.js ================================================================== --- modules/grid.js +++ modules/grid.js @@ -3,16 +3,17 @@ // Copyright (C) 2018-2019 Jean-Francois Moine - GPL3+ // // This module is loaded when "%%grid" appears in a ABC source. // // Parameters -// %%grid [include=] [nomusic] [norepeat] +// %%grid [include=] [nomusic] [norepeat] [repbrk] // = number of columns (1: auto) // > 0: above the tune, < 0: under the tune // = comma separated list of (continuous) measure numbers // 'nomusic' displays only the grid // 'norepeat' omits the ':' indications +// 'repbrk' starts a new grid line on start/stop repeat // %%gridfont font_name size (default: 'serif 16') abc2svg.grid = { // function called before tune generation @@ -36,15 +37,16 @@ return beat } // get_beat() // generate the grid function build_grid(chords, bars, font, wmx) { - var i, j, k, l, nr, line, bar, w, hr, x0, x, y, yl, - cell = '', - pcell = '', + var i, k, l, nr, line, bar, w, hr, x0, x, y, yl, + lc = '', cells = [], - nc = grid.n + nc = grid.n, + sf = '" style="font-size:' + (font.size * .72).toFixed(1) + // small font // set some chord(s) in each cell function set_chords() { var i, ch, pch = '-' @@ -72,10 +74,70 @@ if (!ch[2]) ch[2] = ch[1] || ch[0]; pch = ch[3] } } // set_chords() + + function build_cell(cell, x, y, yl, hr) { + var line = '' + if (cell.length > 1) { + line += '\n' + if (cell[1]) { + line += '\n' + line += '' + + cell[0] + '\n' + line += '' + + cell[1] + '\n' + } else { + line += '' + + cell[0] + '\n' + } + if (cell.length >= 3) { + if (cell[3]) { + line += '\n' + line += '' + + cell[2] + '\n' + line += '' + + cell[3] + '\n' + } else { + line += '' + + cell[2] + '\n' + } + } + } else { + line += '' + + cell[0] + '\n' + } + return line + } // build_cell() + + // build_grid() // set some chords in each cell set_chords() // build the content of the cells @@ -97,29 +159,48 @@ bars.push(bar[k]) } } } - // get the number of columns and rows + // get the number of columns if (nc < 0) nc = -nc if (nc < 3) // auto nc = cells.length % 6 == 0 ? 6 : 8 if (nc > cells.length) nc = cells.length; - nr = ((cells.length + nc - 1) / nc) |0; hr = font.size * 2 if (wmx < hr * 1.4) wmx = hr * 1.4; // cell width w = wmx * nc if (w > img.width) { nc /= 2; - nr *= 2; w /= 2 } + + // generate the cells + yl = 1 + y = 1 - hr / 2 + font.size * .3 + nr = 0 + x0 = (img.width - w) / 2 + for (i = 0; i < cells.length; i++) { + if (i == 0 + || (grid.repbrk + && (bars[i].slice(-1) == ':' || bars[i][0] == ':')) + || k >= nc) { + y += hr // new row + yl += hr + x = x0 + wmx / 2 + k = 0 + nr++ + } + k++ + lc += build_cell(cells[i], x, y, yl, hr) + x += wmx + } // build the SVG image line = '\n'; - // insert the chords - y = 1 - hr / 2 + font.size * .3; - yl = 1 - for (i = 0; i < cells.length; i++) { - cell = cells[i] - if (i % nc == 0) { - y += hr; // new row - yl += hr; - x = x0 + wmx / 2 - } - if (cell.length > 1) { - line += '\n'; - if (cell[1]) { - line += '\n'; - line += '' + - cell[0] + '\n'; - line += '' + - cell[1] + '\n' - } else { - line += '' + - cell[0] + '\n' - } - if (cell.length >= 3) { - if (cell[3]) { - line += '\n'; - line += '' + - cell[2] + '\n'; - line += '' + - cell[3] + '\n' - } else { - line += '' + - cell[2] + '\n' - } - } - } else { - line += '' + - cell[0] + '\n' - } - x += wmx - } + // insert the cells + line += lc // show the repeat signs y = 1 - hr / 2 + font.size * .3; x = x0 for (i = 0; i < bars.length; i++) { @@ -233,15 +244,20 @@ line += ':\n' - if (i % nc == 0) { + if (i == 0 + || (grid.repbrk + && (bars[i].slice(-1) == ':' || bars[i][0] == ':')) + || k >= nc) { y += hr; // new row x = x0 + k = 0 } - if (bar[bar.length - 1] == ':') + k++ + if (bar.slice(-1) == ':') line += ':\n' @@ -271,11 +287,11 @@ this.set_font('grid'); // (for strwh()) // scan the first voice of the tune cur_beat = beat_i = n = wmx = 0; bars.push('|') - for (s = voice_tb[0].sym; s; s = s.next) { + for (s = tsfirst; s; s = s.ts_next) { while (s.time > cur_beat) { if (beat_i < 3) // only 2, 3 or 4 beats / measure... beat_i++; cur_beat += beat } @@ -313,12 +329,14 @@ bars.push(bt) } chord = []; cur_beat = s.time; // synchronize in case of error beat_i = 0 - if (bt.indexOf(':')) + if (bt.indexOf(':') >= 0) rep = true // some repeat + while (s.ts_next && s.ts_next.type == C.BAR) + s = s.ts_next break case C.METER: beat = get_beat(s) wm = s.wmeasure break @@ -340,10 +358,11 @@ subtype: 'ml', dur: 0, time: 0, p_v: p_voice, v: p_voice.v, + st: p_voice.st, text: build_grid.call(this, chords, bars, font, wmx) } if (grid.nomusic) { // if no music this.set_tsfirst(s) @@ -374,11 +393,11 @@ if (this.cfmt().grid) abc2svg.grid.do_grid.call(this); of() }, - set_fmt: function(of, cmd, parm, lock) { + set_fmt: function(of, cmd, parm) { if (cmd == "grid") { if (!parm) parm = "1"; parm = parm.split(/\s+/) var grid = {n: Number(parm.shift())} @@ -393,17 +412,19 @@ var item = parm.shift() if (item == "norepeat") grid.norep = true else if (item == "nomusic") grid.nomusic = true + else if (item == "repbrk") + grid.repbrk = true else if (item.slice(0, 8) == "include=") grid.ls = item.slice(8).split(',') } this.cfmt().grid = grid return } - of(cmd, parm, lock) + of(cmd, parm) }, set_hooks: function(abc) { abc.output_music = abc2svg.grid.output_music.bind(abc, abc.output_music); abc.set_format = abc2svg.grid.set_fmt.bind(abc, abc.set_format) Index: modules/grid2.js ================================================================== --- modules/grid2.js +++ modules/grid2.js @@ -10,11 +10,11 @@ abc2svg.grid2 = { // function called before tune generation do_grid: function() { - var s, v, p_v, + var s, v, p_v, ix, cs, c_a_cs, bt, voice_tb = this.get_voice_tb() for (v = 0; v < voice_tb.length; v++) { p_v = voice_tb[v] if (!p_v.grid2) @@ -21,17 +21,35 @@ continue p_v.clef.invis = true; // no clef p_v.key.k_sf = p_v.key.k_a_acc = 0; // no key signature p_v.staffnonote = 2 // draw the staff for (s = p_v.sym; s; s = s.next) { - if (s.dur) { // set all notes + delete s.a_dd // no decoration + if (!s.dur) { + if (s.bar_type) + bt = s.time + continue + } + + // set all notes s.invis = true; // as invisible delete s.sl1; // with no slur - s.ti1 = 0 // and no tie + delete s.tie_s // and no tie if (s.tf) // don't show the tuplets s.tf[0] = 1 - } + if (!s.a_gch) { + if (s.time == bt) + s.a_gch = c_a_cs + continue + } + for (ix = 0; ix < s.a_gch.length; ix++) { + gch = s.a_gch[ix] + if (gch.type == 'g') { + c_a_cs = s.a_gch + break + } + } } } }, // do_grid() // draw the chord symbol in the middle of the staff @@ -59,20 +77,20 @@ output_music: function(of) { abc2svg.grid2.do_grid.call(this); of() }, - set_fmt: function(of, cmd, param, lock) { + set_fmt: function(of, cmd, param) { if (cmd == "grid2") { var curvoice = this.get_curvoice() if (curvoice) { this.set_v_param("stafflines", "..."); // no staff lines curvoice.grid2 = param } return } - of(cmd, param, lock) + of(cmd, param) }, set_hooks: function(abc) { abc.draw_gchord = abc2svg.grid2.draw_gchord.bind(abc, abc.draw_gchord); abc.output_music = abc2svg.grid2.output_music.bind(abc, abc.output_music); Index: modules/page.js ================================================================== --- modules/page.js +++ modules/page.js @@ -25,41 +25,34 @@ user.img_out = cur_img_out // .. by an other extension } } }, - //function called at end of generation + // function called at end of generation abc_end: function(of) { var page = this.page - if (page.h) { - abc2svg.page.img_out(page, - page.head + page.style + page.hf + page.out + ''); - abc2svg.page.img_out(page, ''); - page.h = 0; - page.out = '' + if (page && page.in_page) { + abc2svg.page.close_page(page) + if (user.img_out == page.img_out_sav) + user.img_out = page.user_out } of() }, // abc_end() - // define the SVG header of the page - svg_head: function(cfmt) { - return '\n' - }, // svg_head() - - // start a new page - svg_out: function(abc, page) { - var h, - cfmt = abc.cfmt() - - function header_footer(str) { - var c, i, t, + // generate a header or a footer in page.hf and return its height + gen_hf: function(page, up, font, str) { + var a, i, j, k, x, y, y0, s, + cfmt = page.abc.cfmt(), + fh = font.size * 1.1, + pos = [ '">', + '" text-anchor="middle">', + '" text-anchor="end">' ] + + // create the text of a header or a footer + function header_footer(o_font, str) { + var c, i, k, t, n_font, + c_font = o_font, nl = 1, j = 0, r = ["", "", ""] if (str[0] == '"') @@ -68,15 +61,33 @@ str = '\t' + str // center for (i = 0; i < str.length; i++) { c = str[i] switch (c) { + case '>': + r[j] += ">" + continue + case '<': + r[j] += "<" + continue + case '&': + for (k = i + 1; k < i + 8; k++) { + if (!str[k] || str[k] == '&' + || str[k] == ';') + break + } + r[j] += str[k] == ';' ? "&" : "&" + continue case '\t': if (j < 2) j++ // next column continue case '\\': // hope '\n' + if (c_font != o_font) { + r[j] += "" +// c_font = o_font + } for (j = 0; j < 3; j++) r[j] += '\n'; nl++; j = 0; i++ @@ -87,17 +98,21 @@ case '$': break } c = str[++i] switch (c) { - case 'd': // cannot know the modification date of the file + case 'd': + if (!abc2svg.get_mtime) + break // cannot know the change time of the file + r[j] += strftime(cfmt.dateformat, + abc2svg.get_mtime(page.abc.parse.fname)) break case 'D': - r[j] += new Date().toUTCString() + r[j] += strftime(cfmt.dateformat) break case 'F': - r[j] += abc.get_fname() + r[j] += page.abc.parse.fname break case 'I': c = str[++i] case 'T': t = abc.info()[c] @@ -124,13 +139,34 @@ } break case 'V': r[j] += "abc2svg-" + abc2svg.version break -//fixme: handle the font changes ($) ? + default: + if (c == '0') + n_font = o_font + else if (c >= '1' && c < '9') + n_font = page.abc.get_font("u" + c) + else + break + + // handle the font changes + if (n_font == c_font) + break + if (c_font != o_font) + r[j] += ""; + c_font = n_font + if (c_font == o_font) + break + r[j] += '' + break } } + if (c_font != o_font) + r[j] += ""; + r[4] = nl // number of lines return r } // header_footer() function font_class(font) { @@ -137,201 +173,198 @@ if (font.class) return 'f' + font.fid + cfmt.fullsvg + ' ' + font.class return 'f' + font.fid + cfmt.fullsvg } - // generate a header or footer - function gen_hf(up, font, str) { - var a, i, j, k, x, y, y0, s, - fh = font.size * 1.1, - pos = [ '">', - '" text-anchor="middle">', - '" text-anchor="end">' ] - - if (str[0] == '-') { // not on 1st page - if (page.pn == 1) - return 0 - str = str.slice(1) - } - - a = header_footer(str) - if (up) - y0 = page.hbase + fh - else - y0 = cfmt.pageheight - page.topmargin - fh * a[4] - for (i = 0; i < 3; i++) { - str = a[i] - if (!str) - continue - if (i == 0) - x = cfmt.leftmargin - else if (i == 1) - x = cfmt.pagewidth / 2 - else - x = cfmt.pagewidth - cfmt.rightmargin; - x += page.gutter; - y = y0; - k = 0 - while (1) { - j = str.indexOf('\n', k) - if (j >= 0) - s = str.slice(k, j) - else - s = str.slice(k) - if (s) - page.hf += '' : + '
') + page.in_page = true + + page.hmax = cfmt.pageheight - page.topmargin - page.botmargin - ht // define the header/footer page.hf = '' if (page.header) { - h = gen_hf(true, abc.get_font("header"), page.header); + h = abc2svg.page.gen_hf(page, true, + abc.get_font("header"), page.header) + abc2svg.page.img_out(page, + '\n' + + '' + + page.hf + '\n') page.hmax -= h; - page.hbase += h - } - if (page.footer) - page.hmax -= gen_hf(false, abc.get_font("footer"), page.footer); - - page.h = page.hb = 0; - page.out = '' - }, // svg_out() + page.hf = '' + } else { + abc2svg.page.img_out(page, + '\n') + } + if (page.footer) { + page.fh = abc2svg.page.gen_hf(page, false, + abc.get_font("footer"), page.footer) + page.hmax -= page.fh + } + + page.h = 0 + }, // open_page() + + close_page: function(page) { + var h, + cfmt = page.abc.cfmt() + + page.in_page = false + if (page.footer) { + h = page.hmax + page.fh - page.h + abc2svg.page.img_out(page, + '\n' + + page.hf + '\n') + } + abc2svg.page.img_out(page, '
') + page.h = 0 + }, // close_page() // handle the output flow of the abc2svg generator img_in: function(p) { - var h, i, + var h, ht, page = this.page // copy a block function blkcpy(page) { - var b, h, i + var b - if (!page.blk || !page.blk.length) { + if (!page.blk.length) { page.blk = null return } - h = page.hb - for (i = 0; i < page.blk.length; i++) { - b = page.blk[i] - page.out += b.p - .replace(//, - '') - .replace('', '\n'); - h += b.h - } - page.blk = null - page.h = h - } // blkcpy() - - // get the style from the image and remove it from the block - function get_style(p, page) { - var i, - sty = p.match(/((.|\n)*?)<\/style>/) - - if (!sty) - return p - sty = sty[1].split('\n') - if (!page.style) - page.style = '\n' - for (i = 0; i < sty.length; i++) { - if (page.style.indexOf(sty[i]) < 0) - page.style = page.style.replace('\n', - sty[i] + '\n\n') - } - return p.replace(/\n/, '') - } // get_style() + page.h = page.hb + while (page.blk.length) { + b = page.blk.shift() + abc2svg.page.img_out(page, b.p) + page.h += b.h + } + page.blk = null // direct output + } // blkcpy() // img_in() switch (p.slice(0, 4)) { case " 0 || (page.oneperpage && this.info().X) - || page.h == 0) { - if (page.h) { - abc2svg.page.img_out(page, - page.head + page.style + page.hf + - page.out + ''); - abc2svg.page.img_out(page, '') - } - abc2svg.page.svg_out(this, page) - if (!this.cfmt().fullsvg) - page.style = '' - } - page.blk = []; - page.hb = page.h + || !page.h) // empty page + abc2svg.page.open_page(page, 0) + page.blk = [] // in block + page.hb = page.h // keep the offset of the start of tune break case "= page.hmax) { // if page overflow - if (!page.out) // if at start of page - blkcpy(page); // output the start of tune - abc2svg.page.img_out(page, - page.head + page.style + page.hf + - page.out + ''); - abc2svg.page.img_out(page, ''); - abc2svg.page.svg_out(this, page); - page.h = page.hb = this.cfmt().topspace; - if (page.blk) - blkcpy(page) // output the start of tune - if (!this.cfmt().fullsvg) - page.style = '' - } - - p = get_style(p, page) - - // if no overflow yet, keep the block - if (page.blk) { - page.blk.push({p: p, h: h}) - } else { - page.out += p - .replace(//, - '') - .replace('', '\n') - } + if (h + page.h >= page.hmax) { // if page overflow + if (page.blk) // if inside a block + blkcpy(page) // output the beginning of the tune + + ht = page.blk ? 0 : + this.cfmt().topspace // tune continuation +// if (page.in_page) + abc2svg.page.close_page(page) + abc2svg.page.open_page(page, ht) + } + + // if no overflow yet, keep the block + if (page.blk) + page.blk.push({p: p, h: h}) + else + abc2svg.page.img_out(page, p) page.h += h break case " 0) - p = p.replace("'", '') - else - p += ',' - } - return p - } // norm() - - var n, v, - maps = this.get_maps(), - a = parm.split(/\s+/); - - n = norm(a[1]) + if (!pit) + return + } + } + return mid_b40(pit) + } // tob40() + + // do_perc() + var vpr, vpl, + maps = this.get_maps(), + a = parm.split(/\s+/), + n = abc_b40(a[1]) // note as b40 + if (!n) { this.syntax(1, this.errs.bad_val, "%%percmap") return } - if (this.cfmt().sound != "play") { // !play - if (!a[3]) - return - if (!maps.MIDIdrum) - maps.MIDIdrum = {} - v = tonote(n) - if (!v) { - this.syntax(1, this.errs.bad_val, "%%percmap") - return - } - delete v.acc - maps.MIDIdrum[n] = [[a[3]], v] - } else { // play - v = tonote(a[2]) - if (!v) { - this.syntax(1, this.errs.bad_val, "%%percmap") - return - } - if (!maps.MIDIdrum) - maps.MIDIdrum = {} - maps.MIDIdrum[n] = [null, v] - } + + vpr = { // print + pit: abc2svg.b40p(n), + acc: 0 + } + + vpl = tob40(a[2]) // play + if (!vpl) { + this.syntax(1, this.errs.bad_val, "%%percmap") + return + } + a = a[3] ? [a[3]] : null // head + if (!maps.MIDIdrum) + maps.MIDIdrum = {} + n = n.toString() + if (!maps.MIDIdrum[n]) { + maps.MIDIdrum[n] = + [a, vpr, null, vpl] // [heads, print, color, play] + } else { + if (a) + maps.MIDIdrum[n][0] = a + if (!maps.MIDIdrum[n][1]) + maps.MIDIdrum[n][1] = vpr + maps.MIDIdrum[n][3] = vpl + } + this.set_v_param("perc", "MIDIdrum") }, // do_perc() // set the MIDI parameters in the current voice set_perc: function(a) { @@ -255,11 +271,11 @@ case "perc=": // %%percmap if (!curvoice.map) curvoice.map = {} curvoice.map = a[i + 1]; if (!curvoice.midictl) - curvoice.midictl = {} + curvoice.midictl = [] curvoice.midictl[0] = 1 // bank 128 break } } }, // set_perc() Index: modules/psvg.js ================================================================== --- modules/psvg.js +++ modules/psvg.js @@ -545,11 +545,11 @@ Psvg.prototype.ps_flush = ps_flush // evaluate a PS user sequence (%beginps .. %%endps) Psvg.prototype.ps_eval = function(txt) { wps.parse(txt); - ps_flush() + ps_flush(true) } // ------ output builtin decorations // common part function pscall(f, x, y, script) { Index: modules/soloffs.js ================================================================== --- modules/soloffs.js +++ modules/soloffs.js @@ -7,11 +7,11 @@ // is one of 'part', 'tempo' or 'space' // is the X offset from the start of staff abc2svg.soloffs = { - set_fmt: function(of, cmd, parm, lock) { + set_fmt: function(of, cmd, parm) { if (cmd == "soloffs") { var i, v, C = abc2svg.C, soloffs = this.cfmt().soloffs = {} @@ -39,11 +39,11 @@ // break } } return } - of(cmd, parm, lock) + of(cmd, parm) }, set_sym_glue: function(of, width) { var s, C = abc2svg.C, Index: modules/sth.js ================================================================== --- modules/sth.js +++ modules/sth.js @@ -98,20 +98,20 @@ curvoice.sth = null // some stem widths in this voice } return s }, - set_format: function(of, cmd, param, lock) { + set_fmt: function(of, cmd, param) { if (cmd == "sth") { var curvoice = this.get_curvoice() if (this.parse.state == 2) this.goto_tune() if (curvoice) curvoice.sth = param.split(/[ \t;-]+/) return } - of(cmd, param, lock) + of(cmd, param) }, set_stems: function(of) { of(); abc2svg.sth.set_sth.call(this) @@ -118,14 +118,14 @@ }, set_hooks: function(abc) { abc.calculate_beam = abc2svg.sth.calculate_beam.bind(abc, abc.calculate_beam); abc.new_note = abc2svg.sth.new_note.bind(abc, abc.new_note); - abc.set_format = abc2svg.sth.set_format.bind(abc, abc.set_format); + abc.set_format = abc2svg.sth.set_fmt.bind(abc, abc.set_format); abc.set_stems = abc2svg.sth.set_stems.bind(abc, abc.set_stems) } } // sth abc2svg.modules.hooks.push(abc2svg.sth.set_hooks); // the module is loaded abc2svg.modules.sth.loaded = true ADDED modules/strftime.js Index: modules/strftime.js ================================================================== --- /dev/null +++ modules/strftime.js @@ -0,0 +1,73 @@ +/* Port of strftime() by T. H. Doan (https://thdoan.github.io/strftime/) + * + * Day of year (%j) code based on Joe Orost's answer: + * http://stackoverflow.com/questions/8619879/javascript-calculate-the-day-of-the-year-1-366 + * + * Week number (%V) code based on Taco van den Broek's prototype: + * http://techblog.procurios.nl/k/news/view/33796/14863/calculate-iso-8601-week-and-year-in-javascript.html + */ +function strftime(sFormat, date) { + if (!(date instanceof Date)) date = new Date(); + var nDay = date.getDay(), + nDate = date.getDate(), + nMonth = date.getMonth(), + nYear = date.getFullYear(), + nHour = date.getHours(), + aDays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], + aMonths = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], + aDayCount = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334], + isLeapYear = function() { + return (nYear%4===0 && nYear%100!==0) || nYear%400===0; + }, + getThursday = function() { + var target = new Date(date); + target.setDate(nDate - ((nDay+6)%7) + 3); + return target; + }, + zeroPad = function(nNum, nPad) { + return ((Math.pow(10, nPad) + nNum) + '').slice(1); + }; + return sFormat.replace(/%[a-z]/gi, function(sMatch) { + return (({ + '%a': aDays[nDay].slice(0,3), + '%A': aDays[nDay], + '%b': aMonths[nMonth].slice(0,3), + '%B': aMonths[nMonth], + '%c': date.toUTCString(), + '%C': Math.floor(nYear/100), + '%d': zeroPad(nDate, 2), + '%e': nDate, + '%F': date.toISOString().slice(0,10), + '%G': getThursday().getFullYear(), + '%g': (getThursday().getFullYear() + '').slice(2), + '%H': zeroPad(nHour, 2), + '%I': zeroPad((nHour+11)%12 + 1, 2), + '%j': zeroPad(aDayCount[nMonth] + nDate + ((nMonth>1 && isLeapYear()) ? 1 : 0), 3), + '%k': nHour, + '%l': (nHour+11)%12 + 1, + '%m': zeroPad(nMonth + 1, 2), + '%n': nMonth + 1, + '%M': zeroPad(date.getMinutes(), 2), + '%p': (nHour<12) ? 'AM' : 'PM', + '%P': (nHour<12) ? 'am' : 'pm', + '%s': Math.round(date.getTime()/1000), + '%S': zeroPad(date.getSeconds(), 2), + '%u': nDay || 7, + '%V': (function() { + var target = getThursday(), + n1stThu = target.valueOf(); + target.setMonth(0, 1); + var nJan1 = target.getDay(); + if (nJan1!==4) target.setMonth(0, 1 + ((4-nJan1)+7)%7); + return zeroPad(1 + Math.ceil((n1stThu-target)/604800000), 2); + })(), + '%w': nDay, + '%x': date.toLocaleDateString(), + '%X': date.toLocaleTimeString(), + '%y': (nYear + '').slice(2), + '%Y': nYear, + '%z': date.toTimeString().replace(/.+GMT([+-]\d+).+/, '$1'), + '%Z': date.toTimeString().replace(/.+\((.+?)\)$/, '$1') + }[sMatch] || '') + '') || sMatch; + }); +} Index: modules/temper.js ================================================================== --- modules/temper.js +++ modules/temper.js @@ -38,11 +38,11 @@ v0.temper[i] = this.cfmt().temper[i] / 100 } }, // get the temperament - set_fmt: function(of, cmd, param, lock) { + set_fmt: function(of, cmd, param) { if (cmd == "temperament") { var ls = new Float32Array(param.split(/ +/)), i = ls.length if (i == 12) { @@ -56,11 +56,11 @@ } } this.syntax(1, this.errs.bad_val, "%%temperament") return } - of(cmd, param, lock) + of(cmd, param) }, set_hooks: function(abc) { abc.set_bar_num = abc2svg.temper.set_bar_num.bind(abc, abc.set_bar_num); abc.set_format = abc2svg.temper.set_fmt.bind(abc, abc.set_format) Index: package.json ================================================================== --- package.json +++ package.json @@ -1,8 +1,8 @@ { "name": "abc2svg", - "version": "1.19.1", + "version": "1.20.7", "description": "ABC music notation translator", "devDependencies": { "uglify-js": "^2.5.0" }, "files": [ @@ -14,14 +14,18 @@ "abc2svg", "abc2svg-1.js", "abc2svg.ttf", "abcdoc-1.js", "abcemb-1.js", + "abcemb1-1.js", "abcemb2-1.js", + "abctopdf", + "abcweb2-1.js", "ambitus-1.js", "break-1.js", "capo-1.js", + "clair-1.js", "clip-1.js", "cmdline.js", "combine-1.js", "diag-1.js", "edit-1.css", @@ -45,25 +49,29 @@ "page-1.js", "perc-1.js", "play-1.js", "psvg-1.js", "setmidi-1.js", - "sth-1.js", + "snd-1.js", "soloffs-1.js", + "sth-1.js", "temper-1.js", "toabc.js", "toaudio-1.js", "toabw.js", + "tomei.js", "toodt.js", + "toparam.js", "toxhtml.js" ], "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "bin": { "abc2odt": "./abc2odt", - "abc2svg": "./abc2svg" + "abc2svg": "./abc2svg", + "abctopdf": "./abctopdf" }, "repository": { "type": "fossil", "url": "https://chiselapp.com/user/moinejf/repository/abc2svg" }, @@ -75,7 +83,10 @@ "author": "Jean-François Moine", "license": "LGPL-3.0", "bugs": { "url": "https://chiselapp.com/user/moinejf/repository/abc2svg/reportlist" }, - "homepage": "https://chiselapp.com/user/moinejf/repository/abc2svg" + "homepage": "https://chiselapp.com/user/moinejf/repository/abc2svg", + "dependencies": { + "npm": "^6.10.1" + } } Index: toabc.js ================================================================== --- toabc.js +++ toabc.js @@ -45,10 +45,11 @@ trill: 'T', upbow: 'u', downbow: 'v', roll: '~' }, + old_font = [], mode_tb = [ // key modes [0, ""], [2, "dor"], [4, "phr"], [-1, "lyd"], @@ -82,12 +83,14 @@ if (!vold[v]) { vold[v] = true if (p_voice.clef && p_voice.clef.clef_type != 'a') ln += ' ' + clef_dump(p_voice.clef) - if (p_voice.nm) + if (p_voice.nm) { ln += ' nm="' + p_voice.nm + '"' + font_def("voice", p_voice.nm) + } if (p_voice.snm) ln += ' snm="' + p_voice.snm + '"'; if (p_voice.scale != 1) ln += ' scale=' + p_voice.scale if (p_voice.uscale) @@ -94,26 +97,33 @@ ln += ' microscale=' + p_voice.uscale } abc2svg.print(ln) } // vi_out() - eoln = false if (nv == 1) { if (vo[0].length == 0) return if (!vold[0] && (voice_tb[0].nm || voice_tb[0].snm || voice_tb[0].scale != 1 || voice_tb[0].uscale)) vi_out(0); + if (eoln) { + eoln = false + vo[0][vo[0].length - 1] += "$" + } abc2svg.print(vo[0].join('')); vo[0] = [] return } for (var v = 0; v < nv; v++) { if (vo[v].length == 0) continue vi_out(v); + if (eoln) { + eoln = false + vo[v][vo[v].length - 1] += "$" + } abc2svg.print(vo[v].join('')); vo[v] = [] } } // voice_out() @@ -121,16 +131,11 @@ var ln = "%%" + s.subtype + ' ' switch (s.subtype) { case "ml": ln += s.text break - case "leftmargin": - case "rightmargin": - case "pagescale": - case "pagewidth": - case "scale": - case "staffwidth": + default: ln += s.param break case "sep": ln += s.sk1.toFixed(1) + ' ' + s.l.toFixed(1) + ' ' + @@ -138,10 +143,11 @@ break case "skip": ln += s.sk break case "text": + font_def("text", s.text) if (s.text.indexOf('\n') <= 0 && (!s.opt || s.opt == 'c')) { if (s.opt == 'c') ln = "%%center " + s.text else @@ -160,13 +166,10 @@ "\n%%endtext") return case "title": abc2svg.print('T:' + s.text.replace(/\n/g, '\nT:')) return - default: - ln += "(unknown)" - break } abc2svg.print(ln) } // block_dump() function clef_dump(s) { @@ -218,16 +221,62 @@ d++ } if (d > 0) line += "//////".slice(0, d) } // dur_dump() + + function font_def(fn, p) { + var c, f, + i = p.indexOf('$') + + abc.get_font(fn) // used font +// fixme: one '$' only + if (i >= 0) { + c = p[i + 1] + if (c >= '1' && c <= '9') { + c = "u" + c + f = abc.cfmt()[c + "font"] // user font + f.fid = abc.get_font(c).fid // dump it! + } + } + font_dump() // dump the new fonts + } // font_def() + + function font_dump() { + var k, f, def, + cfmt = abc.cfmt() +// fs = abc.get_font_style().split("\n").shift() + + for (k in cfmt) { + if (k.slice(-4) != "font") + continue + f = cfmt[k] + if (f.fid == undefined) + continue // not used + if (old_font[f.fid]) + continue // already out + old_font[f.fid] = true + def = f.name || "" + if (f.weight) + def += f.weight + if (f.style) + def += f.style + if (!def) + def = "*" + if (k[0] == "u") + k = "setfont-" + k[1] + abc2svg.print('%%' + k + ' ' + + def + ' ' + (f.size || "*")) + } + } // font_dump() function gch_dump(a_gch) { var i, j, gch for (i = 0; i < a_gch.length; i++) { - line += '"'; gch = a_gch[i] + font_def(gch.type == 'g' ? "gchord" : "annotation", gch.text) + line += '"'; switch (gch.type) { case 'g': for (j = 0; j < gch.text.length; j++) { switch (gch.text.charCodeAt(j)) { case 0x266d: @@ -301,12 +350,13 @@ //fixme: to continue return ln } // key_dump() function lyric_dump() { - var v, s, i, ly, nly, t, w, - nb = 0 + var v, s, i, ly, nly, t, w + + font_def("vocal", "") for (v = 0; v < nv; v++) { nly = 0; w = [] for (s = voice_tb[v].sym; s; s = s.next) { @@ -316,33 +366,12 @@ w[nly++] = "" } if (nly == 0) continue for (s = voice_tb[v].sym; s; s = s.next) { - switch (s.type) { - case C.BAR: - if (w.length == 0) - continue - if (++nb < 4) - continue - nb = 0 - if (!s.next) - continue - for (i = 0; i < nly; i++) - w[i] += '\n' -// t = "|" -// if (++nb >= 4) { -// nb = 0; -// t = "|\n" -// } -// for (i = 0; i < nly; i++) -// w[i] += t - default: - continue - case C.NOTE: - break - } + if (s.type != C.NOTE) + continue ly = s.a_ly if (!ly) { for (i = 0; i < nly; i++) w[i] += "*" continue @@ -364,20 +393,22 @@ break default: t = t.replace(/ /g, '~') t = t.replace(/-/g, '\\-') t = t.replace(/\n/g, '-'); - w[i] += t + ' ' + if (t.slice(-1) != "-") + t += ' ' + w[i] += t break } } } if (w.length != 0) { if (voice_tb.length > 1) abc2svg.print("V:" + voice_tb[v].id) for (i = 0; i < w.length; i++) - abc2svg.print("w:" + w[i].replace(/\n/g, '\n+:')) + abc2svg.print("w:" + w[i].replace(/\*+$/,"")) } } } // lyric_dump() function meter_dump(s) { @@ -394,13 +425,22 @@ } return ln } // meter_dump() function note_dump(s, note, tie_ch) { - var p, j - if (note.sl1) - slti_dump(note.sl1, '(') + var p, j, sl, s2 + if (note.sls) { + for (j = 0; j < note.sls.length; j++) { + sl = note.sls[j]; + slti_dump(sl.ty, '('); + s2 = sl.note.s + if (s2.sl2) + s2.sl2++ + else + s2.sl2 = 1 + } + } if (note.a_dcn) { for (j = 0; j < note.a_dcn.length; j++) line += '!' + note.a_dcn[j] + '!' } if (note.color) @@ -438,14 +478,16 @@ if (p < 9) line += "," } } } - if (!tie_ch && note.ti1) - slti_dump(note.ti1, '-') - if (note.sl2) - line += ')' + if (!tie_ch && note.tie_ty) + slti_dump(note.tie_ty, '-') + while (note.sl2) { + line += ')'; + note.sl2-- + } } // note_dump() function slti_dump(fl, ty) { if (fl & C.SL_DOTTED) line += "."; @@ -470,11 +512,11 @@ curv = -1; ln = "%%score " for (v = 0; v < sy.voices.length; v++) { p_v = sy.voices[v] - if (p_v.range >= 0) + if (p_v) vn[p_v.range] = v } for (v = 0; v < sy.voices.length; v++) { if (vn[v] == undefined || vn[v] < 0) continue @@ -589,66 +631,56 @@ ln += '"' + s.tempo_str2 + '"' info_out(ln) } // tempo_dump() function tuplet_dump(s) { - var s2, r - if (s.tp0) { - line += '(' + s.tp0; - r = 1 - for (s2 = s.next; s2; s2 = s2.next) { - if (!s2.dur) - continue - r++ - if (s2.te0) - break - } - if (r == s.tp0 - && ((s.tp0 == 2 && s.tq0 == 3) - || (s.tp0 == 3 && s.tq0 == 2) - || (s.tp0 == 4 && s.tq0 == 3))) - ; - else - line += ':' + s.tq0 + ':' + r - } - if (s.tp1) { - line += '(' + s.tp1; - r = 1 - for (s2 = s.next; s2; s2 = s2.next) { - if (!s2.dur) - continue - r++ - if (s2.te1) - break - } - if (r == s.tp1 - && ((s.tp1 == 2 && s.tq1 == 3) - || (s.tp1 == 3 && s.tq1 == 2) - || (s.tp1 == 4 && s.tq1 == 3))) - ; - else - line += ':' + s.tq1 + ':' + r + var tp + + while (1) { + tp = s.tp.shift() + if (!tp) + break + line += '(' + tp.p + if (tp.ro == tp.p + && ((tp.p == 2 && tp.q == 3) + || (tp.p == 3 && tp.q == 2) + || (tp.p == 4 && tp.q == 3))) + ; + else + line += ':' + tp.q + ':' + tp.ro } } // tuplet_dump() function sym_dump(s) { - var tie_ch + var tie_ch, i, sl if (s.repeat_n) { if (s.repeat_n < 0) line += "[I:repeat " + (-s.repeat_n).toString() + ' ' + s.repeat_k + ']' else line += "[I:repeat " + s.repeat_n + ' ' + s.repeat_k + ']' } - if (s.tp0 || s.tp1) + if (s.tp) tuplet_dump(s) - tmp = s.slur_start - while (tmp) { - slti_dump(tmp, '('); - tmp >>= 4 + if (s.sls) { + for (i = 0; i < s.sls.length; i++) { + sl = s.sls[i]; + slti_dump(sl.ty, '('); + if (sl.is_note) { + if (sl.note.sl2) + sl.note.sl2++ + else + sl.note.sl2 = 1 + } else { + if (sl.note.s.sl2) + sl.note.s.sl2++ + else + sl.note.s.sl2 = 1 + } + } } if (s.a_gch) gch_dump(s.a_gch) if (s.a_dd) deco_dump(s.a_dd) @@ -697,10 +729,23 @@ line += s.invis ? 'X' : 'Z' if (s.nmes != 1) line += s.nmes break case C.NOTE: + if (s.stem) { // if forced stem direction + if (s.stem > 0) { + if (s.p_v.pos.stm != C.SL_ABOVE) { + s.p_v.pos.stm = C.SL_ABOVE + line += "[I:pos stem up]" + } + } else { + if (s.p_v.pos.stm != C.SL_BELOW) { + s.p_v.pos.stm = C.SL_BELOW + line += "[I:pos stem down]" + } + } + } if (s.beam_br1) line += "!beambr1!" if (s.beam_br2) line += "!beambr2!" if (s.trem1) @@ -717,11 +762,11 @@ tie_ch = true if (s.notes.length == 1) { note_dump(s, s.notes[0], tie_ch) } else { for (i = 0; i < s.notes.length; i++) { - if (!s.notes[i].ti1) { + if (!s.notes[i].tie_n) { tie_ch = false break } } line += '[' @@ -742,19 +787,20 @@ tmp = s.notes[0].dur // head duration if (s.trem2) tmp /= 2; dur_dump(tmp) } - if (s.ti1 && tie_ch) - slti_dump(s.notes[0].ti1, '-'); - tmp = s.slur_end + if (s.tie_s && tie_ch) + slti_dump(s.notes[0].tie_ty, '-'); + tmp = s.sl2 while (tmp) { line += ')'; tmp-- } break case C.PART: + font_def("parts", s.text) info_out('P:' + s.text) break case C.REST: line += s.invis ? 'x' : 'z'; dur_dump(s.dur) @@ -788,10 +834,12 @@ voice_out(); abc2svg.print('% ??sym: ' + music_types[s.type]) break } } // sym_dump() + + font_dump() abc2svg.print('\nX:' + info['X']) header_dump("TC") abc2svg.print(meter_dump(voice_tb[0].meter)); @@ -825,22 +873,24 @@ continue line = ""; // (all voices are synchronized on %%score) if (s.type != C.STAVES && s.time > vti[s.v]) { //fixme: put 'X' if more than one measure - line += 'x'; - dur_dump(s.time - vti[s.v]); + if (s.time > vti[s.v] + 2) { + line += 'x'; + dur_dump(s.time - vti[s.v]); + } vti[s.v] = s.time } sym_dump(s) if (s.dur) vti[s.v] = s.time + s.dur - if (s.beam_end) - line += ' ' - if (s.eoln && s.next) { - line += '$'; - eoln = true + if (s.next) { + if (s.beam_end && !s.beam_st && !s.next.beam_end) + line += ' ' + if (s.eoln) + eoln = true } if (line) vo[s.v].push(line) } voice_out(); @@ -848,13 +898,14 @@ header_dump("W") } // abc_dump() user.get_abcmodel = abc_dump // -- local functions -abc2svg.abc_init = function() { +abc2svg.abc_init = function(args) { abc2svg.print('%abc-2.2\n\ -% generated by abc2svg toabc\n\ +% generated by abc2svg toabc from\n\ +%\t' + args.join(' ') + '\n\ %%linebreak $') } abc2svg.abc_end = function() { if (user.errtxt) Index: toabw.js ================================================================== --- toabw.js +++ toabw.js @@ -81,17 +81,20 @@ case '$': break } c = str[++i] switch (c) { - case 'd': // cannot know the modification date of the file + case 'd': + if (!abc2svg.get_mtime) + break // cannot know the modification date of the file + r[j] += abc2svg.get_mtime(abc.parse.fname) break case 'D': r[j] += (new Date()).toUTCString() break case 'F': - r[j] += abc.get_fname() + r[j] += abc.parse.fname break case 'I': c = str[++i] case 'T': t = abc.info()[c] @@ -132,11 +135,11 @@ '" xid="' + (++seq).toString() + '">\n\ \n'; - a = header_footer(str) + a = header_footer(clean_txt(str)) for (i = 0; i < 3; i++) { res += '': return ">" + case '&': return "&" } - if (c == '&') - return "&" return c }) } abc2svg.abort = function(e) { ADDED tomei.js Index: tomei.js ================================================================== --- /dev/null +++ tomei.js @@ -0,0 +1,1121 @@ +// abc2svg - tomei.js - convert ABC to MEI +// +// Copyright (C) 2019 Jean-Francois Moine +// +// This file is part of abc2svg. +// +// abc2svg is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// abc2svg is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with abc2svg. If not, see . + +// constants from core/abc2svg.js + var C = abc2svg.C, + + OPEN_BRACE = 0x01, + CLOSE_BRACE = 0x02, + OPEN_BRACKET = 0x04, + CLOSE_BRACKET = 0x08, + OPEN_PARENTH = 0x10, + CLOSE_PARENTH = 0x20, + STOP_BAR = 0x40, + FL_VOICE = 0x80, + OPEN_BRACE2 = 0x0100, + CLOSE_BRACE2 = 0x0200, + OPEN_BRACKET2 = 0x0400, + CLOSE_BRACKET2 = 0x0800, + MASTER_VOICE = 0x1000 + + // generate a new reference + function new_ref(s) { + if (!s.ref) { + s.ref = ++meas.ref + if (!s.items) + s.items = "" + s.items += ' xml:id="a' + s.ref.toString() + '"' + } + } + +// --- decorations + + // decoration as text (dynam, fing) at end of measure + // d[1] = tag + // d[2] = item in the tag + // d[3] = optional 'place' + function decotxt1(s, d) { + new_ref(s) + var t = '\t <' + d[1] + ' startid="#a' + s.ref + '"' + + //fixme: above or below + if (d[3]) // place + t += ' ' + d[3] + '="above"' + meas.tags.push(t + '>' + d[2] + '') + } + + // decoration in a symbol + // d[1] = tag + // d[2] = item in the tag + // d[3] = optional 'place' + function decosym(s, d) { +//fixme: if no place +// if (1) +// return' ' + d[2] + + var t = '\t\t<' + d[1] + + if (d[2]) + t += ' ' + d[2] + //fixme: above or below + if (d[3]) // place + t += ' ' + d[3] + '="above"' + if (!s.tags) + s.tags = [] + s.tags.push(t + '/>') + } + + // (decoration either in a symbol or at end of the measure) + // decoration at end of the measure + // d[1] = tag + // d[2] = item in the tag + // d[3] = optional 'place' + function decotag1(s, d) { + new_ref(s) + var t = '\t <' + d[1] + ' startid="#a' + s.ref + '"' + + if (d[2]) + t += ' ' + d[2] + //fixme: above or below + if (d[3]) // place + t += ' ' + d[3] + '="above"' + meas.tags.push(t + '/>') + } + + var deco_l = { +// "-(" +// "-)" +// "~(" +// "~)" +//fixme: form=cres/dim, place=above/below and 2 references +// "<(": [null, "hairpin"], // "cres", +// "<)": [null, "hairpin"], // "cres", +// ">" +// ">(": [null, "hairpin"], // "dim", +// ">)": [null, "hairpin"], // "dim", + "^": [decosym, "artic", 'artic="marc"', "place"], +// "+": + "0": [decotxt1, "fing", "0", "place"], + "1": [decotxt1, "fing", "1", "place"], +// "15va(" +// "15va)" +// "15vb(" +// "15vb)" + "2": [decotxt1, "fing", "2", "place"], + "3": [decotxt1, "fing", "3", "place"], + "4": [decotxt1, "fing", "4", "place"], + "5": [decotxt1, "fing", "5", "place"], +// "8va(" +// "8va)" +// "8vb(" +// "8vb)" + accent: [decosym, "artic", 'artic="acc"', "place"], +//fixme: plist on notes +// arpeggio + + breath: [decotag1, "breath"], +// coda: [null, "O"], +// crescendo( +// crescendo) +// dacapo +// dacoda +// "D.C." +// "D.C.alcoda" +// "D.C.alfine" +// diminuendo( +// diminuendo) +// "D.S." +// "D.S.alcoda" +// "D.S.alfine" + dot: [decosym, "artic", 'artic="stacc"', "place"], + downbow: [decosym, "artic", 'artic="dnbow"', "place"], +// emphasis: [null, "L"], + f: [decotxt1, "dynam", "f", "place"], + fermata: [decotag1, "fermata", null, "place"], + ff: [decotxt1, "dynam", "ff", "place"], + fff: [decotxt1, "dynam", "fff", "place"], + ffff: [decotxt1, "dynam", "ffff", "place"], +// fine +// gmark + invertedfermata: [decotag1, "fermata", 'form="inv"', "place"], +// invertedturn: [decotag1, "fermata", 'form="inv"', "place"], +// invertedturnx: [decotag1, "fermata", 'form="inv"', "place"], +// longphrase + lowermordent: [decotag1, "mordent", 'form="lower"'], + marcato: [decosym, "artic", 'artic="marc"', "place"], +// mediumphrase + mf: [decotxt1, "dynam", "mf", "place"], + mp: [decotxt1, "dynam", "mp", "place"], + open: [decosym, "artic", 'artic="open"', "place"], + p: [decotxt1, "dynam", "p", "place"], + pralltriller: [decotag1, "mordent", 'form="upper"'], +// ped + "ped)": [decotxt1, "pedal", dir="up"], + "ped(": [decotxt1, "pedal", dir="down"], +// ped-up +// plus + pp: [decotxt1, "dynam", "pp", "place"], + ppp: [decotxt1, "dynam", "ppp", "place"], + pppp: [decotxt1, "dynam", "pppp", "place"], +// rbstop +// roll: [null, '~'], +// segno: [null, 'S'], + sfz: [decotxt1, "dynam", "sfz", "place"], +// shortphrase +// slide + snap: [decosym, "artic", 'artic="snap"', "place"], + tenuto: [decosym, "artic", 'artic="ten"', "place"], +// thumb + trill: [decotag1, "trill", null, "place"], +//2 references +// "trill(": [null, "trill("], // place=above/below +// "trill)": [null, "trill)"], + turn: [decotag1, "turn", 'form="upper"'], + turnx: [decotag1, "turn", 'form="lower"'], + upbow: [decosym, "artic", 'artic="upbow"', "place"], + uppermordent: [decotag1, "mordent", 'form="upper"'] +// wedge + } + + // build the decorations of a symbol + // a decoration may be: + // - as an item in the symbol (in s.items) + // - as a tag in the symbol (in s.tags) + // - as a tag at the end of the measure (in meas.tags) + function deco_build(s) { + var i, n, d + + for (i = 0; i < s.a_dd.length; i++) { + n = s.a_dd[i].name + d = deco_l[n] +//keep until all done +if (!d) +{ +abc2svg.printErr('') + continue +} + d[0](s, d) + } + } // deco_build() + + // global variables/constants + var mode_tb = ["major", "dor", "phr", "lyd", "mix", "minor", "loc"], + bar_ty = {".|": "dashed", + "||": "dbl", + ".||": "dbldashed", + ".||": "dbldotted", + ".|": "dotted", + "|]": "end", + "": "invis", + "[|:": "rptstart", + ":[]:": "rptboth", + ":|]": "rptend", + "|": "single" + }, + meas = { // measure + bar_num: 0, + no_head: true, + st: [], + vo: [], + ref: 100, + clefs: [], // clefs per staff + tags: [] + } + + // dump the staves at start of tune (no 's') and inside the tune + function staves_dump(s) { + var v, p_v, staff, in_parenth, ln, stop, s2, + voice_tb = abc.get_voice_tb(), + vn = [], + st = -1, + sy = s ? s.sy : abc.get_cur_sy() + + // clef in staffDef + function clef_dump(s) { + var ln = ' clef.shape="' + switch (s.clef_type) { + case 't': ln += 'G"'; break + case 'c': ln += 'C"'; break + case 'b': ln += 'F"'; break + case 'p': ln += 'perc"'; break +//fixme: TAB + default: return '' + } + ln += ' clef.line="' + s.clef_line + '"' + if (s.clef_octave) + ln += ' clef.dis="8" clef.dis.place="' + + (s.clef_octave > 0 ? 'above"' : 'below"') + return ln + } // clef_dump() + +// meas.sy = sy + + for (v = 0; v < sy.voices.length; v++) { + p_v = sy.voices[v] + if (p_v) + vn[p_v.range] = v + } + + for (v = 0; v < sy.voices.length; v++) { + if (vn[v] == undefined) + continue + p_v = sy.voices[vn[v]] + if (p_v.st == st) + continue + if (st >= 0) { + if (staff.flags & CLOSE_BRACE2) + abc2svg.print('\t ') + if (staff.flags & CLOSE_BRACE) + abc2svg.print('\t ') + if (staff.flags & CLOSE_BRACKET2) + abc2svg.print('\t ') + if (staff.flags & CLOSE_BRACKET) + abc2svg.print('\t ') + } + + staff = sy.staves[++st] + + stop = (staff.flags & STOP_BAR) ? + ' bar.thru="false"' : '' + if (staff.flags & OPEN_BRACKET) + abc2svg.print('\t ') + if (staff.flags & OPEN_BRACKET2) + abc2svg.print('\t ') + if (staff.flags & OPEN_BRACE) + abc2svg.print('\t ') + if (staff.flags & OPEN_BRACE2) + abc2svg.print('\t ') + + ln = '\t ') + + } + if (staff.flags & CLOSE_BRACE2) + abc2svg.print('\t ') + if (staff.flags & CLOSE_BRACE) + abc2svg.print('\t ') + if (staff.flags & CLOSE_BRACKET2) + abc2svg.print('\t ') + if (staff.flags & CLOSE_BRACKET) + abc2svg.print('\t ') + } // staves_dump() + +// dump the header +function head_dump() { + var i, v, s, g, line, ulen, tmp, tmp2, grace, bagpipe, eoln, curv, + info = abc.info(), + first = abc.get_tsfirst(), + voice_tb = abc.get_voice_tb(), + nv = voice_tb.length, + vo = [], // dump line per voice + vold = [], // false/true for voice name + vti = [] + + // -- main code of head_dump() + + info.T = info.T ? info.T.replace(/\n/g,'') : '' + abc2svg.print('\ +\n\ + \n\ + \n\ + \n\ + ' + info.T + '\n\ + \n\ + \n\ + \n\ + \n\ + \n\ + \n\ + abc2svg\n\ +

Transcoded from ABC

\n\ +
\n\ +
\n\ +
\n\ + \n\ + \n' + + (info.T ? ('\ + \n\ + ' + info.T + '\n\ + \n') : '') + + (info.C ? ('\ + \n\ + ' + info.C + '\n\ + \n') : '') + '\ + \n\ + \n\ +
\n\ + \n\ + \n\ + \n\ + ') + line = '\ + 0) + tmp = tmp.toString() + 's' + else if (tmp < 0) + tmp = (-tmp).toString() + 'f' + line += ' key.sig="' + tmp + '" key.mode="' + + mode_tb[s.k_mode] + '">' + abc2svg.print(line) + + // output the staff system + staves_dump() + + abc2svg.print('\ + \n\ +
') +} // head_dump() + +user.img_out = function() {} // do the generation with no output + +// dump a whole measure +function meas_dump(s2) { + var ln, i, s, t, st, v, staff, voice, tim, g, s1 + + // clef in a measure + function clef_dump(s) { +if (!meas.clefs[s.st]) +abc2svg.printErr('!! V:'+s.p_v.id+' '+s.time+' '+s.type+' st '+s.st) + if (s.clef_type == meas.clefs[s.st].clef_type) + return + meas.clefs[s.st] = s + var ln = '\t 0 ? 'above"' : 'below"') + abc2svg.print(ln + '/>') + } // clef_dump() + + // dump a duration + function dur_dump(dur, nflags) { + var t, + d = ' dur="' + + if (nflags == undefined) { +//fixme: what if dur % 12 != 0 ? + t = (dur / 12) | 0 + for (nflags = 5; t; t >>= 1, nflags--) { + if (t & 1) + break + } + } + if (nflags == -4) + d += "long" + else if (nflags == -3) + d += "breve" + else + d += (1 << (nflags + 2)).toString() + dur >>= (5 - nflags) + switch (dur) { + case 12: break + case 18: d += '" dots="1'; break + case 21: d += '" dots="2'; break +// case 22: + default: d += '" dots="3'; break + } + return d + '"' + } // dur_dump() + + function gch_dump(s) { + new_ref(s) + var i, gch, t + + for (i = 0; i < s.a_gch.length; i++) { + t = ' startid="#a' + s.ref + gch = s.a_gch[i] +// font_def(gch.type == 'g' ? "gchord" : "annotation", gch.text) + if (gch.type == 'g') { + t = '\t ' + gch.text + '' + } else { + if (gch.type == "^") + t += '" place="above"' + else if (gch.type == "_") + t += '" place="below"' + t = '\t ' + gch.text + '' + } + meas.tags.push(t) + } + } // gch_dump() + + function note_dump(s) { + var m, note, t, item, s2, b_tp, i, r, + n = s.nhd, + line = "" + + function ly_dump(s) { + var ly, i, + nly = s.a_ly.length + + function ly_du1(t) { + var ln = '\t\t ' + t + '') + } + + if (nly == 1) { + ly_du1(s.a_ly[0].t) + return + } + for (i = 0; i < nly; i++) { + abc2svg.print('\t\t') + ly_du1(s.a_ly[i].t) + abc2svg.print('\t\t') + } + } // ly_dump() + + function pit_dump(note) { + var pit = (note.opit || note.pit) + 12, + ln = ' pname="' + + "cdefgab"[pit % 7] + '" oct="' + + ((pit / 7) | 0).toString() + '"' + switch (note.acc) { + case -2: ln += ' accid="ff"'; break + case -1: ln += ' accid="f"'; break + case 1: ln += ' accid="s"'; break + case 2: ln += ' accid="x"'; break + case 3: ln += ' accid="n"'; break + } + return ln + } // pit_dump() + + // dump the starting beam and tuplets + function btps_dump(s) { + var i, tp, ln, st + + function tp_dump(tp) { + var ln = '\t ') + } // tp_dump() + + // if start of a beam, check if crossing a measure bar +// // or with notes on different staves + if (s.beam_st && !s.beam_end) { +// st = s.st + for (s2 = s.next; ; s2 = s2.next) { +// if (s2.st != st || s2.type == C.BAR) { + if (s2.type == C.BAR) { + while (!s2.beam_end) + s2 = s2.next + new_ref(s) + new_ref(s2) +// if (s.st != s2.st) +// beam.with="above" or "below" + meas.tags.push( + '\t ') + s2 = null // the beam is treated + break + } + if (s2.beam_end) + break + } + } + if (!s2) { // if no beam + if (s.tp) { // but tuplets + i = s.tp.length + while (--i >= 0) + tp_dump(s.tp[i]) + } + return + } + + ln = '\t ' + if (!s.tp) { // beam without any tuplet + abc2svg.print(ln) + return + } + + // start of beam and tuplet(s) + i = 0 + while (i < s.tp.length) { + tp = s.tp[i] + r = tp.ro + for (s2 = s; s2; s2 = s2.next) { + if (s2.dur) + r-- + if (s2.beam_end || r < 0) + break + } + if (!s2.beam_end) + break + tp_dump(tp) + i++ + } + abc2svg.print(ln) + while (i < s.tp.length) + tp_dump(s.tp[i++]) + } // btps_dump() + + // -- main of note_dump() + + btps_dump(s) + + if (s.beam_br1 || s.beam_br2) { + if (!s.items) + s.items = "" + s.items += s.beam_br1 ? ' breaksec="1"' : + ' breaksec="2"' + } + if (n) { // chord + line = '\t 0) + line += ' stem.dir="up"' + else if (s.stem < 0) + line += ' stem.dir="down"' + if (s.st != s.p_v.st) + line += ' staff="' + (s.st + 1).toString() + '"' + if (s.items) + line += s.items + abc2svg.print(line + '>') + line = "" + for (m = 0; m <= n; m++) { + note = s.notes[m] + line = '\t ') + } + if (s.tags) + abc2svg.print(s.tags.join("\n")) + if (s.a_ly) + ly_dump(s) + abc2svg.print('\t ') + } else { // single note + line = '\t 0) + line += ' stem.dir="up"' + else if (s.stem < 0) + line += ' stem.dir="down"' + if (s.grace) + line += ' grace="unknown"' + if (s.st != s.p_v.st) + line += ' staff="' + (s.st + 1).toString() + '"' + if (s.items) + line += s.items + if (s.tags || s.a_ly) { + abc2svg.print(line + '>') + if (s.tags) + abc2svg.print(s.tags) + if (s.a_ly) + ly_dump(s) + abc2svg.print('\t ') + } else { + abc2svg.print(line + '/>') + } + } + + n = s.tpe + if (s.beam_st || !s.beam_end) { // if no beam end + while (--n >= 0) + abc2svg.print('\t ') + return + } + if (!n) { // beam end but no tuplet end + abc2svg.print('\t ') + return + } + for (s2 = s.prev; s2; s2 = s2.prev) { + if (s2.beam_st) { + abc2svg.print('\t ') + break + } + if (s2.tp) { + i = s2.tp.length + while (i > 0 && n > 0) { + abc2svg.print('\t ') + i-- + n-- + } + } + } + while (--n >= 0) + abc2svg.print('\t ') + } // note_dump() + + function tempo_dump(s) { + if (s.del) + return + var v, + t = '\t ') + } else { + meas.tags.push(t + '>') + t = '' + if (s.tempo_str1) + t += s.tempo_str1 + //fixme: note + if (!t) + t += ' ' + t += 'fixme=' + s.tempo + if (s.tempo_str2) { + if (!t) + t += ' ' + t += s.tempo_str2 + } + meas.tags.push('\t ') + } + } // tempo_dump() + + // -- main of meas_dump() + + // get the start time + tim = 1000000 + for (st = 0; st < meas.st.length; st++) { + staff = meas.st[st] + if (!staff) + continue + for (v = 0; v < staff.vo.length; v++) { + s = staff.vo[v].s[0] + if (s && s.time < tim) { + s1 = s + tim = s.time + } + } + } + if (!s1) + return // ! + + if (tim == 0 && s2.time < meas.wmeasure) + meas.bar_num = -1 // upbeat + ln = '\t ') + + for (st = 0; st < meas.st.length; st++) { + staff = meas.st[st] + if (!staff) + continue + ln = '\t ') + for (v = 0; v < staff.vo.length; v++) { + voice = staff.vo[v] +// if (!voice) +// continue + ln = '\t ') + tim = s1.time + for (i = 0; i < voice.s.length; i++) { + s = voice.s[i] + if (s.time > tim) + abc2svg.print('\t ') + if (s.a_dd) + deco_build(s) + if (s.a_gch) + gch_dump(s) +//fixme:s.repeat_.. +//fixme:s.invis + switch (s.type) { + case C.CLEF: + clef_dump(s) + break + case C.GRACE: + for (g = s.extra; g; g = g.next) + note_dump(g) + break +// case C.KEY: +// break +// case C.METER: +// break +// case C.MREST: +// break + case C.NOTE: + note_dump(s) + break + case C.REST: +//fixme: test if full measure + ln = '\t <' + + (s.invis ? 'space' : 'rest') + + dur_dump(s.dur_orig, s.nflags) + if (s.items) + ln += s.items + if (s.tags) { + abc2svg.print(ln + '>') + abc2svg.print(s.tags) + abc2svg.print('\t ') + } else { + abc2svg.print(ln + '/>') + } + break + case C.TEMPO: + tempo_dump(s) + break + } + if (s.dur) + tim = s.time + s.dur + } + abc2svg.print('\t ') + } + abc2svg.print('\t ') + } + + // output the decorations + if (meas.tags.length) { + abc2svg.print(meas.tags.join('\n')) + meas.tags = [] + } + + abc2svg.print('\t ') +} // meas_dump() + +// dump a music line (SVG image) +function glue(of, width) { + var s, staff, v, voice, ending, + tsfirst = this.get_tsfirst() + + of(width) + + function slur_dump(s) { + var i, m, note, note2, sl, refs, refs2, ref, ref2 + + function slur_out(ty, r1, r2) { + var line = '\t ') + } // slur_out() + + if (s.sls) { + new_ref(s) + ref = s.ref + for (i = 0; i < s.sls.length; i++) { + sl = s.sls[i] + note = sl.note + if (sl.is_note) { + new_ref(note) + ref2 = note.ref + } else { + new_ref(note.s) + ref2 = note.s.ref + } + slur_out(sl.ty, ref, ref2) + } + } + if (s.sl1) { + for (m = 0; m <= s.nhd; m++) { + note = s.notes[m] + if (note.sls) { + new_ref(note) + ref = note.ref + for (i = 0; i < note.sls.length; i++) { + sl = note.sls[i] + note2 = sl.note + if (sl.is_note) { + new_ref(note2) + ref2 = note2.ref + } else { + new_ref(note2.s) + ref2 = note2.s.ref + } + slur_out(sl.ty, ref, ref2) + } + } + } + } + + } // slur_dump() + + function tie_dump(s) { + var m, note, note2, refs, refs2, ref, ref2, + s2 = s.tie_s + + if (!s.nhd) { + new_ref(s) + refs = s.ref + } + if (!s2.nhd) { + new_ref(s2) + refs2 = s2.ref + } + for (m = 0; m <= s.nhd; m++) { + note = s.notes[m] + note2 = note.tie_n + if (refs) { + ref = refs + } else { + new_ref(note) + ref = note.ref + } + if (refs2) { + ref2 = refs2 + } else { + new_ref(note2) + ref2 = note2.ref + } + line = '\t ') + } + } // tie_dump() + + // main code of glue() + + // output the MEI header if not done yet + if (meas.no_head) { + meas.no_head = false + head_dump() + } + + // loop on the measures + for (s = tsfirst; s; s = s.ts_next) { +// if (abc.get_cur_sy() != meas.sy) +// staves_dump() + + if (ending && s.rbstop) + ending = 2 + if (s.type == C.BAR) + continue + + // create the staves and voices if not done yet + staff = meas.st[s.st] + if (!staff) { + meas.st[s.st] = staff = { + vo: [] + } + } + +//other structure: voice sequences per staff +// v = staff.vo.length +// while (--v >= 0) { +// if (staff.vo[v].v == s.v) +// break +// } +// if (v < 0) { // new voice in this staff +// v = staff.vo.length +// staff.vo.push({ +// v: s.v, +// s: [] // array of symbols +// }) +// } +// voice = staff.vo[v] + +//simple structure: use 'staff=' on staff changes + voice = meas.vo[s.v] + if (!voice) { + meas.vo[s.v] = voice = { + s: [] + } + staff.vo.push(voice) + } + + if (s.time == 0 && s.prev && s.prev == C.BAR + && voice.s.length == 0) // start with a bar + voice.s.push(s.prev) + + voice.s.push(s) + + switch (s.type) { + case C.GRACE: + case C.NOTE: + if (s.sls || s.sl1) + slur_dump(s) + if (s.tie_s) + tie_dump(s) + break + case C.STAVES: + staves_dump(s) + break + } + + if (!s.ts_next || s.ts_next.type == C.BAR) { + if (meas.eol) { + meas.eol = false + abc2svg.print('\t ') + } + meas_dump(s.ts_next) + if (ending == 2) { // if end of ending + abc2svg.print('\t') + ending = 0 + } + if (s.ts_next && s.ts_next.text) { // if ending + abc2svg.print('\t') + ending = 1 + } + meas.st = [] + meas.vo = [] + } + } + meas.eol = true +} // glue() + +// hook at tune generation start +function mei_output(of) { + if (meas.done) // do only one generation + return + meas.done = true + of() +} + +// -- local functions +abc2svg.abc_init = function(args) { + + abc.output_music = mei_output.bind(abc, abc.output_music) + abc.set_sym_glue = glue.bind(abc, abc.set_sym_glue) + + abc2svg.print('\n\ +\n\ +') +} + +abc2svg.abc_end = function() { + abc2svg.print('\ +
\n\ +
\n\ +
\n\ + \n\ +
\n\ +
') +//fixme: terminer derniere mesure si pas barre de fin +//fixme: W: dans
- cf +// /home/jef/abc/mei/McFerrin_Don't_worry.mei + if (user.errtxt) + abc2svg.printErr("Errors:\n" + user.errtxt) +} + +abc2svg.abort = function(e) { + abc2svg.printErr(e.message + "\n*** Abort ***\n" + e.stack) + abc2svg.abc_end() + abc2svg.quit() +} Index: toodt.js ================================================================== --- toodt.js +++ toodt.js @@ -65,10 +65,22 @@ return p if (page_type[0] == 'L') return (p / 96).toFixed(1) + 'in' return (p / 37.8).toFixed(1) + 'cm' } + +// replace <>& by XML character references +function clean_txt(txt) { + return txt.replace(/<|>|&.*?;|&/g, function(c) { + switch (c) { + case '<': return "<" + case '>': return ">" + case '&': return "&" + } + return c + }) +} // output a header or a footer function gen_hf(type, stype, str) { var c, i, res_left, j = 0, @@ -75,10 +87,11 @@ res = '\n\ ' if (str[0] == '"') str = str.slice(1, -1) + str = clean_txt(str) if (str.indexOf('\t') < 0) // if no TAB str = '\t' + str // center for (i = 0; i < str.length; i++) { c = str[i] @@ -102,18 +115,19 @@ break } c = str[++i] switch (c) { case 'd': - t = abc.get_fname(); - res += fs.statSync(t).ctime.toLocaleString() + if (!abc2svg.get_mtime) + break // cannot know the modification date of the file + res += abc2svg.get_mtime(abc.parse.fname).toLocaleString() break case 'D': res += (new Date()).toLocaleString() break case 'F': - res += abc.get_fname() + res += abc.parse.fname break case 'I': c = str[++i] case 'T': t = abc.info()[c] ADDED toparam.js Index: toparam.js ================================================================== --- /dev/null +++ toparam.js @@ -0,0 +1,64 @@ +// abc2svg - toparam - dump the abc2svg parameters +// +// Copyright (C) 2019 Jean-Francois Moine +// +// This file is part of abc2svg. +// +// abc2svg is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// abc2svg is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with abc2svg. If not, see . + +abc2svg.abort = function(e) { + abc2svg.quit() +} + +abc2svg.abc_init = function() { +} + +abc2svg.abc_end = function() { + var k, v, t, + cfmt = abc.cfmt() + + if (user.errtxt) + abc2svg.print("Errors:\n" + user.errtxt) + abc2svg.print('% abc2svg default parameters\n') + for (k in cfmt) { + if (cfmt.hasOwnProperty(k)) { + v = cfmt[k] + if (k.slice(-4) == "font") { + t = v.name || "" + if (v.weight) + t += v.weight + if (v.style) + t += v.style + if (!t) + t = "*" + if (k[0] == "u") + k = "setfont-" + k[1] + v = t + ' ' + (v.size || "*") + } else if (k == "infoname") { + t = v.split("\n") + while (t.length) + abc2svg.print('%%' + k + ' ' + t.shift()) + continue + } else if (k.slice(-6) == "margin" + || k.slice(0, 4) == "page") { + v = (v / 37.8).toFixed(2).replace(/\.?0+$/,"") + "cm" + } else if (k == "writefields") { + v = v + " 1" + } else if (v === "") { + v = '""' + } + abc2svg.print('%%' + k + ' ' + v) + } + } +} Index: toxhtml.js ================================================================== --- toxhtml.js +++ toxhtml.js @@ -76,17 +76,20 @@ case '$': break } c = str[++i] switch (c) { - case 'd': // cannot know the modification date of the file + case 'd': + if (!abc2svg.get_mtime) + break // cannot know the modification date of the file + r[j] += abc2svg.get_mtime(abc.parse.fname) break case 'D': r[j] += get_date() break case 'F': - r[j] += abc.get_fname() + r[j] += abc.parse.fname break case 'I': c = str[++i] case 'T': t = abc.info()[c] @@ -150,11 +153,11 @@ // output a header or footer function gen_hf(type, str) { var a, i, page, lcr = ["left", "center", "right"]; - a = header_footer(str) + a = header_footer(clean_txt(str)) for (i = 0; i < 3; i++) { str = a[i] if (!str) continue if (str.indexOf('\x0c') >= 0) { @@ -227,13 +230,20 @@ \n\ + ((header || footer) ? media_f : media_s)) +// works with chrome and --headless + if (abc.page) + abc2svg.print('@page{size:' + + (cfmt.pagewidth / 96).toFixed(2) + 'in ' + + (cfmt.pageheight / 96).toFixed(2) + 'in;margin:0}') + else + abc2svg.print('@page{margin:0' + topmargin + ' 0 ' + + botmargin + ' 0}') + abc2svg.print('\n\ abc2svg document\n\ \n\ ') if (header) gen_hf("header", header) Index: util/abcdoc.js ================================================================== --- util/abcdoc.js +++ util/abcdoc.js @@ -15,10 +15,12 @@ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with abc2svg. If not, see . + +(function(){ window.onerror = function(msg, url, line) { if (typeof msg == 'string') alert("window error: " + msg + "\nURL: " + url + @@ -28,30 +30,35 @@ else alert("window error: " + msg) return false } -var errtxt = '', +// function called when abc2svg is fully loaded +function abcdoc() { + var errtxt = '', new_page = '', - abc, + page, // document source jsdir = document.currentScript ? - document.currentScript.src.match(/.*\//) : - (function() { - var scrs = document.getElementsByTagName('script'); - return scrs[scrs.length - 1].src.match(/.*\//) || '' - })() - -// -- abc2svg init argument -var user = { + document.currentScript.src.match(/.*\//) : + (function() { + var s_a = document.getElementsByTagName('script') + for (var k = 0; k < s_a.length; k++) { + if (s_a[k].src.indexOf('abcdoc-') >= 0) + return s_a[k].src.match(/.*\//) || '' + } + return "" // ?? + + })(), + user = { // -- abc2svg init argument errmsg: function(msg, l, c) { // get the errors errtxt += clean_txt(msg) + '\n' }, img_out: function(str) { // image output new_page += str }, page_format: true // define the non-page-breakable blocks -} + } // replace <>& by XML character references function clean_txt(txt) { return txt.replace(/<|>|&.*?;|&/g, function(c) { switch (c) { @@ -61,20 +68,10 @@ } return c }) } -// function called when the page is loaded -function dom_loaded() { - - // loop until abc2svg is fully loaded - if (typeof abc2svg != "object" - || !abc2svg.modules) { - setTimeout(dom_loaded, 500) - return - } - // function to load javascript files abc2svg.loadjs = function(fn, relay, onerror) { var s = document.createElement('script'); if (/:\/\//.test(fn)) s.src = fn // absolute URL @@ -87,25 +84,17 @@ alert('error loading ' + fn) } document.head.appendChild(s) } - var page = document.body.innerHTML - - // accept page formatting - abc2svg.abc_end = function() {} - - // load the required modules - if (!abc2svg.modules.load(page, dom_loaded)) - return - - // search the ABC tunes and add their rendering as SVG images + // search the ABC tunes and add their rendering as SVG images + function render() { var i = 0, j, k, res, re = /\n%abc|\nX:/g, // start on "%abc" or "X:" - re_stop = /\n<|\n%.begin/g; // stop on "<" and skip "%%begin" - + re_stop = /\n<|\n%.begin/g, // stop on "<" and skip "%%begin" abc = new abc2svg.Abc(user); + abc.tosvg('abcdoc', '%%bgcolor white\n\ %%rightmargin 0.8cm\n\ %%leftmargin 0.8cm\n\ %%topspace 0') for (;;) { @@ -166,9 +155,33 @@ document.body.innerHTML = new_page + page.slice(i) } catch (e) { alert("abc2svg bad generated SVG: " + e.message + "\nStack:\n" + e.stack) } + } // render() + + // --- abcdoc() main code --- + + // get the page content + page = document.body.innerHTML; + + // accept page formatting + abc2svg.abc_end = function() {} + + // load the required modules, then render the music + if (abc2svg.modules.load(page, render)) + render() +} // abcdoc() + +// loop until abc2svg is fully loaded +function dom_loaded() { + if (typeof abc2svg != "object" + || !abc2svg.modules) { + setTimeout(dom_loaded, 500) + return + } + abcdoc() } // wait for the page to be loaded document.addEventListener("DOMContentLoaded", dom_loaded, false) +})() Index: util/abcemb.js ================================================================== --- util/abcemb.js +++ util/abcemb.js @@ -28,41 +28,52 @@ else alert("window error: " + msg) return false } +var abc2svg = {} + +// function called when abc2svg is fully loaded +function dom_loaded() { var errtxt = '', new_page = '', - abc, // (must be global for follow.js) playing, abcplay, - playconf = { - onend: endplay - }, page, // document source a_src = [], // index: #sequence, // value: [start_idx, end_idx] a_pe = [], // index: #sequence, value: playing events glop, // global sequence for play old_gm, jsdir = document.currentScript ? - document.currentScript.src.match(/.*\//) : - (function() { - var scrs = document.getElementsByTagName('script'); - return scrs[scrs.length - 1].src.match(/.*\//) || '' - })() + document.currentScript.src.match(/.*\//) : + (function() { + var s_a = document.getElementsByTagName('script') + for (var k = 0; k < s_a.length; k++) { + if (s_a[k].src.indexOf('abcemb-') >= 0) + return s_a[k].src.match(/.*\//) || '' + } + return "" // ?? + })(), // -- abc2svg init argument -var user = { + user = { errmsg: function(msg, l, c) { // get the errors errtxt += clean_txt(msg) + '\n' }, img_out: function(str) { // image output new_page += str }, page_format: true // define the non-page-breakable blocks -} + }; + +// play arguments + playconf = { + onend: function() { + playing = false + } + } // replace <>& by XML character references function clean_txt(txt) { return txt.replace(/<|>|&.*?;|&/g, function(c) { switch (c) { @@ -77,16 +88,16 @@ function endplay() { playing = false } // function called on click on the music -function playseq(seq) { +abc2svg.playseq = function(seq) { var outputs if (!abcplay) { if (typeof AbcPlay == "undefined") { // as play-1.js not loaded, - playseq = function(){} // don't come here anymore + abc2svg.playseq = function(){} // don't come here anymore return } abcplay = AbcPlay(playconf); } if (playing) { @@ -112,20 +123,10 @@ a_pe[seq] = abcplay.clear() // keep the playing events } abcplay.play(0, 100000, a_pe[seq]) } -// function called when the page is loaded -function dom_loaded() { - - // loop until abc2svg is fully loaded - if (typeof abc2svg != "object" - || !abc2svg.modules) { - setTimeout(dom_loaded, 500) - return - } - // function to load javascript files abc2svg.loadjs = function(fn, relay, onerror) { var s = document.createElement('script'); if (/:\/\//.test(fn)) s.src = fn // absolute URL @@ -138,33 +139,41 @@ alert('error loading ' + fn) } document.head.appendChild(s) } - page = document.body.innerHTML; - - // accept page formatting - abc2svg.abc_end = function() {} - - // load the required modules - if (abc2svg.modules.load(page, render)) - render() -} - function render() { - page = document.body.innerHTML; // search the ABC tunes, // replace them by SVG images with play on click - var i = 0, j, k, res, src, + var i = 0, j, k, res, abc, seq = 0, re = /\n%abc|\nX:/g, re_stop = /\nX:|\n<|\n%.begin/g, select = window.location.hash.slice(1); + // aweful hack: user.anno_stop must be defined before Abc creation + // for being set later by follow() ! + if (typeof follow == "function") + user.anno_stop = function(){}; + abc = new abc2svg.Abc(user) + // handle MEI files + j = page.indexOf("= 0) { + k = page.indexOf("") + 6 + abc.mei2mus(page.slice(j, k)) + document.body.innerHTML = new_page + // no play yet + return + } + + // initialize the play follow function + if (typeof follow == "function") + follow(abc, user, playconf) + // check if a selection if (select) { select = decodeURIComponent(select); select = page.search(select) if (select < 0) @@ -201,11 +210,11 @@ // selection if (!select || page[j] != 'X' || (select >= j && select < k)) { // clicking on the music plays this tune if (page[j] == 'X') { - new_page += '
\n'; a_src.push([j, k]) } else if (!glop) { glop = [j, k] } @@ -214,19 +223,16 @@ abc.tosvg('abcemb', page, j, k) } catch (e) { alert("abc2svg javascript error: " + e.message + "\nStack:\n" + e.stack) } - abc2svg.abc_end() // close the page if %%pageheight if (errtxt) { - i = page.indexOf("\n", j); - i = page.indexOf("\n", i + 1); - alert("Errors in\n" + - page.slice(j, i) + - "\n...\n\n" + errtxt); + new_page += '
' +
+					errtxt + "
\n"; errtxt = "" } + abc2svg.abc_end() // close the page if %%pageheight if (page[j] == 'X') new_page += '
\n' } // selection i = k @@ -251,9 +257,31 @@ user.get_abcmodel = function(tsfirst, voice_tb, music_types, info) { if (old_gm) old_gm(tsfirst, voice_tb, music_types, info); abcplay.add(tsfirst, voice_tb) } +} // render() + + // --- dom_loaded() main code --- + + // get the page content + page = document.body.innerHTML + + // load the abc2svg core if not done by