Remove now useless source files
|
@ -1,7 +0,0 @@
|
|||
language: python
|
||||
python:
|
||||
- "2.7"
|
||||
# command to install dependencies
|
||||
install: "pip install -r budget/requirements.txt"
|
||||
# command to run tests
|
||||
script: cd budget && python tests.py
|
|
@ -1,2 +0,0 @@
|
|||
The project has been started by Alexis Métaireau and Frédéric Sureau. Friends are
|
||||
helping since that in the persons of Arnaud Bos and Quentin Roy.
|
|
@ -1,37 +0,0 @@
|
|||
Copyright (c) 2011 by Alexis Métaireau and contributors. See AUTHORS
|
||||
for more details.
|
||||
|
||||
Some rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms of the software as well
|
||||
as documentation, with or without modification, are permitted provided
|
||||
that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following
|
||||
disclaimer in the documentation and/or other materials provided
|
||||
with the distribution.
|
||||
|
||||
* The names of the contributors may not be used to endorse or
|
||||
promote products derived from this software without specific
|
||||
prior written permission.
|
||||
|
||||
* If you meet the authors of this software in person and you want to
|
||||
pay them a beer, you're encouraged to do so. Please, do. If you have
|
||||
homebrewed beer, this works as well (may even be better).
|
||||
|
||||
THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
|
||||
NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE AND DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGE.
|
|
@ -1 +0,0 @@
|
|||
web: python budget/run.py
|
|
@ -1,100 +0,0 @@
|
|||
Budget-manager
|
||||
##############
|
||||
|
||||
.. image:: https://travis-ci.org/spiral-project/ihatemoney.svg?branch=master
|
||||
:target: https://travis-ci.org/spiral-project/ihatemoney
|
||||
:alt: Travis CI Build Status
|
||||
|
||||
This is a really tiny app to ease the shared houses budget management. Keep
|
||||
track of who bought what, when, and for who to then compute the balance of each
|
||||
person.
|
||||
|
||||
The code is distributed under a BSD beerware derivative: if you meet the people
|
||||
in person and you want to pay them a beer, you are encouraged to do so (see
|
||||
LICENSE for more details).
|
||||
|
||||
Make it run!
|
||||
============
|
||||
|
||||
To make it run, you just have to do something like::
|
||||
|
||||
$ virtualenv venv
|
||||
$ source venv/bin/activate
|
||||
$ pip install -r budget/requirements.txt
|
||||
$ cd budget
|
||||
$ python run.py
|
||||
|
||||
It is also better to actually turn the debugging mode on when you're
|
||||
developing. You can create a `settings.py` file in the `budget` directory, with
|
||||
the following content::
|
||||
|
||||
DEBUG = True
|
||||
SQLACHEMY_ECHO = DEBUG
|
||||
|
||||
You can also set the `TESTING` flag to `True` so no mails are sent
|
||||
(and no exception is raised) while you're on development mode.
|
||||
|
||||
Deploy it
|
||||
=========
|
||||
|
||||
To deploy it, I'm using gunicorn and supervisord::
|
||||
|
||||
$ virtualenv venv
|
||||
$ source venv/bin/activate
|
||||
$ pip install -r requirements.txt
|
||||
|
||||
1. Add the lines in conf/supervisord.conf to your supervisord.conf file.
|
||||
**adapt them to your paths!**
|
||||
2. Copy and paste the content of conf/nginx.conf in your nginx conf file.
|
||||
**adapt them to your paths!**
|
||||
3. reload both nginx and supervisord. It should be working ;)
|
||||
|
||||
Don't forget to set the right permission for your files !
|
||||
|
||||
Also, create a `settings.py` file with the appropriate values if you need to
|
||||
use a different database for instance. You can also set `APPLICATION_ROOT` if
|
||||
you want to prefix your URLs to serve ihatemonney in the *folder* of a domain,
|
||||
e.g:
|
||||
|
||||
APPLICATION_ROOT='/budget'
|
||||
|
||||
|
||||
How about the REST API?
|
||||
=======================
|
||||
|
||||
Yep, you're right, there is a REST API with this. Head to the `api
|
||||
documentation <https://ihatemoney.readthedocs.io/en/latest/api.html>`_ to know more.
|
||||
|
||||
How to contribute
|
||||
=================
|
||||
|
||||
There are different ways to help us, regarding if you are a designer,
|
||||
a developer or just an user.
|
||||
|
||||
As a developer
|
||||
--------------
|
||||
|
||||
The best way to contribute code is to write it and to make a pull request on
|
||||
github. Please, think about updating and running the tests before asking for
|
||||
a pull request as it will help us to maintain the code clean and running.
|
||||
|
||||
To do so::
|
||||
|
||||
$ workon budget
|
||||
(budget) $ python tests.py
|
||||
|
||||
before pushing anything to master :)
|
||||
|
||||
As a designer / Front-end developer
|
||||
-----------------------------------
|
||||
|
||||
Feel free to provide us mockups or to involve yourself into the discussions
|
||||
hapenning on the github issue tracker. All ideas are welcome. Of course, if you
|
||||
know how to implement them, feel free to fork and make a pull request.
|
||||
|
||||
End-user
|
||||
--------
|
||||
|
||||
You just wanted to have a look at the application and found a bug? Please tell
|
||||
us and go fill a new issue:
|
||||
https://github.com/spiral-project/ihatemoney/issues
|
|
@ -1,154 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
from flask import Blueprint, request
|
||||
from flask_rest import RESTResource, need_auth
|
||||
|
||||
from models import db, Project, Person, Bill
|
||||
from forms import (ProjectForm, EditProjectForm, MemberForm,
|
||||
get_billform_for)
|
||||
|
||||
|
||||
api = Blueprint("api", __name__, url_prefix="/api")
|
||||
|
||||
|
||||
def check_project(*args, **kwargs):
|
||||
"""Check the request for basic authentication for a given project.
|
||||
|
||||
Return the project if the authorization is good, False otherwise
|
||||
"""
|
||||
auth = request.authorization
|
||||
|
||||
# project_id should be contained in kwargs and equal to the username
|
||||
if auth and "project_id" in kwargs and \
|
||||
auth.username == kwargs["project_id"]:
|
||||
project = Project.query.get(auth.username)
|
||||
if project and project.password == auth.password:
|
||||
return project
|
||||
return False
|
||||
|
||||
|
||||
class ProjectHandler(object):
|
||||
|
||||
def add(self):
|
||||
form = ProjectForm(csrf_enabled=False)
|
||||
if form.validate():
|
||||
project = form.save()
|
||||
db.session.add(project)
|
||||
db.session.commit()
|
||||
return 201, project.id
|
||||
return 400, form.errors
|
||||
|
||||
@need_auth(check_project, "project")
|
||||
def get(self, project):
|
||||
return 200, project
|
||||
|
||||
@need_auth(check_project, "project")
|
||||
def delete(self, project):
|
||||
db.session.delete(project)
|
||||
db.session.commit()
|
||||
return 200, "DELETED"
|
||||
|
||||
@need_auth(check_project, "project")
|
||||
def update(self, project):
|
||||
form = EditProjectForm(csrf_enabled=False)
|
||||
if form.validate():
|
||||
form.update(project)
|
||||
db.session.commit()
|
||||
return 200, "UPDATED"
|
||||
return 400, form.errors
|
||||
|
||||
|
||||
class MemberHandler(object):
|
||||
|
||||
def get(self, project, member_id):
|
||||
member = Person.query.get(member_id, project)
|
||||
if not member or member.project != project:
|
||||
return 404, "Not Found"
|
||||
return 200, member
|
||||
|
||||
def list(self, project):
|
||||
return 200, project.members
|
||||
|
||||
def add(self, project):
|
||||
form = MemberForm(project, csrf_enabled=False)
|
||||
if form.validate():
|
||||
member = Person()
|
||||
form.save(project, member)
|
||||
db.session.commit()
|
||||
return 201, member.id
|
||||
return 400, form.errors
|
||||
|
||||
def update(self, project, member_id):
|
||||
form = MemberForm(project, csrf_enabled=False)
|
||||
if form.validate():
|
||||
member = Person.query.get(member_id, project)
|
||||
form.save(project, member)
|
||||
db.session.commit()
|
||||
return 200, member
|
||||
return 400, form.errors
|
||||
|
||||
def delete(self, project, member_id):
|
||||
if project.remove_member(member_id):
|
||||
return 200, "OK"
|
||||
return 404, "Not Found"
|
||||
|
||||
|
||||
class BillHandler(object):
|
||||
|
||||
def get(self, project, bill_id):
|
||||
bill = Bill.query.get(project, bill_id)
|
||||
if not bill:
|
||||
return 404, "Not Found"
|
||||
return 200, bill
|
||||
|
||||
def list(self, project):
|
||||
return project.get_bills().all()
|
||||
|
||||
def add(self, project):
|
||||
form = get_billform_for(project, True, csrf_enabled=False)
|
||||
if form.validate():
|
||||
bill = Bill()
|
||||
form.save(bill, project)
|
||||
db.session.add(bill)
|
||||
db.session.commit()
|
||||
return 201, bill.id
|
||||
return 400, form.errors
|
||||
|
||||
def update(self, project, bill_id):
|
||||
form = get_billform_for(project, True, csrf_enabled=False)
|
||||
if form.validate():
|
||||
bill = Bill.query.get(project, bill_id)
|
||||
form.save(bill, project)
|
||||
db.session.commit()
|
||||
return 200, bill.id
|
||||
return 400, form.errors
|
||||
|
||||
def delete(self, project, bill_id):
|
||||
bill = Bill.query.delete(project, bill_id)
|
||||
db.session.commit()
|
||||
if not bill:
|
||||
return 404, "Not Found"
|
||||
return 200, "OK"
|
||||
|
||||
|
||||
project_resource = RESTResource(
|
||||
name="project",
|
||||
route="/projects",
|
||||
app=api,
|
||||
actions=["add", "update", "delete", "get"],
|
||||
handler=ProjectHandler())
|
||||
|
||||
member_resource = RESTResource(
|
||||
name="member",
|
||||
inject_name="project",
|
||||
route="/projects/<project_id>/members",
|
||||
app=api,
|
||||
handler=MemberHandler(),
|
||||
authentifier=check_project)
|
||||
|
||||
bill_resource = RESTResource(
|
||||
name="bill",
|
||||
inject_name="project",
|
||||
route="/projects/<project_id>/bills",
|
||||
app=api,
|
||||
handler=BillHandler(),
|
||||
authentifier=check_project)
|
|
@ -1,3 +0,0 @@
|
|||
[python: **.py]
|
||||
[jinja2: **/templates/**.html]
|
||||
extensions=jinja2.ext.autoescape,jinja2.ext.with_
|
|
@ -1,6 +0,0 @@
|
|||
DEBUG = False
|
||||
SQLALCHEMY_DATABASE_URI = 'sqlite:///budget.db'
|
||||
SQLACHEMY_ECHO = DEBUG
|
||||
SECRET_KEY = "tralala"
|
||||
|
||||
MAIL_DEFAULT_SENDER = ("Budget manager", "budget@notmyidea.org")
|
|
@ -1,189 +0,0 @@
|
|||
from flask_wtf import DateField, DecimalField, Email, Form, PasswordField, \
|
||||
Required, SelectField, SelectMultipleField, SubmitField, TextAreaField, \
|
||||
TextField, ValidationError
|
||||
from flask_babel import lazy_gettext as _
|
||||
from flask import request
|
||||
|
||||
from wtforms.widgets import html_params
|
||||
from models import Project, Person
|
||||
from datetime import datetime
|
||||
from jinja2 import Markup
|
||||
from utils import slugify
|
||||
|
||||
def get_billform_for(project, set_default=True, **kwargs):
|
||||
"""Return an instance of BillForm configured for a particular project.
|
||||
|
||||
:set_default: if set to True, on GET methods (usually when we want to
|
||||
display the default form, it will call set_default on it.
|
||||
|
||||
"""
|
||||
form = BillForm(**kwargs)
|
||||
form.payed_for.choices = form.payer.choices = [(m.id, m.name)
|
||||
for m in project.active_members]
|
||||
form.payed_for.default = [m.id for m in project.active_members]
|
||||
|
||||
if set_default and request.method == "GET":
|
||||
form.set_default()
|
||||
return form
|
||||
|
||||
|
||||
class CommaDecimalField(DecimalField):
|
||||
"""A class to deal with comma in Decimal Field"""
|
||||
def process_formdata(self, value):
|
||||
if value:
|
||||
value[0] = str(value[0]).replace(',', '.')
|
||||
return super(CommaDecimalField, self).process_formdata(value)
|
||||
|
||||
|
||||
class EditProjectForm(Form):
|
||||
name = TextField(_("Project name"), validators=[Required()])
|
||||
password = TextField(_("Private code"), validators=[Required()])
|
||||
contact_email = TextField(_("Email"), validators=[Required(), Email()])
|
||||
|
||||
def save(self):
|
||||
"""Create a new project with the information given by this form.
|
||||
|
||||
Returns the created instance
|
||||
"""
|
||||
project = Project(name=self.name.data, id=self.id.data,
|
||||
password=self.password.data,
|
||||
contact_email=self.contact_email.data)
|
||||
return project
|
||||
|
||||
def update(self, project):
|
||||
"""Update the project with the information from the form"""
|
||||
project.name = self.name.data
|
||||
project.password = self.password.data
|
||||
project.contact_email = self.contact_email.data
|
||||
|
||||
return project
|
||||
|
||||
|
||||
class ProjectForm(EditProjectForm):
|
||||
id = TextField(_("Project identifier"), validators=[Required()])
|
||||
password = PasswordField(_("Private code"), validators=[Required()])
|
||||
submit = SubmitField(_("Create the project"))
|
||||
|
||||
def validate_id(form, field):
|
||||
form.id.data = slugify(field.data)
|
||||
if (form.id.data == "dashboard") or Project.query.get(form.id.data):
|
||||
raise ValidationError(Markup(_("The project identifier is used "
|
||||
"to log in and for the URL of the project. "
|
||||
"We tried to generate an identifier for you but a project "
|
||||
"with this identifier already exists. "
|
||||
"Please create a new identifier "
|
||||
"that you will be able to remember.")))
|
||||
|
||||
|
||||
class AuthenticationForm(Form):
|
||||
id = TextField(_("Project identifier"), validators=[Required()])
|
||||
password = PasswordField(_("Private code"), validators=[Required()])
|
||||
submit = SubmitField(_("Get in"))
|
||||
|
||||
|
||||
class PasswordReminder(Form):
|
||||
id = TextField(_("Project identifier"), validators=[Required()])
|
||||
submit = SubmitField(_("Send me the code by email"))
|
||||
|
||||
def validate_id(form, field):
|
||||
if not Project.query.get(field.data):
|
||||
raise ValidationError(_("This project does not exists"))
|
||||
|
||||
|
||||
class BillForm(Form):
|
||||
date = DateField(_("Date"), validators=[Required()], default=datetime.now)
|
||||
what = TextField(_("What?"), validators=[Required()])
|
||||
payer = SelectField(_("Payer"), validators=[Required()], coerce=int)
|
||||
amount = CommaDecimalField(_("Amount paid"), validators=[Required()])
|
||||
payed_for = SelectMultipleField(_("For whom?"),
|
||||
validators=[Required()], coerce=int)
|
||||
submit = SubmitField(_("Submit"))
|
||||
submit2 = SubmitField(_("Submit and add a new one"))
|
||||
|
||||
def save(self, bill, project):
|
||||
bill.payer_id = self.payer.data
|
||||
bill.amount = self.amount.data
|
||||
bill.what = self.what.data
|
||||
bill.date = self.date.data
|
||||
bill.owers = [Person.query.get(ower, project)
|
||||
for ower in self.payed_for.data]
|
||||
|
||||
return bill
|
||||
|
||||
def fill(self, bill):
|
||||
self.payer.data = bill.payer_id
|
||||
self.amount.data = bill.amount
|
||||
self.what.data = bill.what
|
||||
self.date.data = bill.date
|
||||
self.payed_for.data = [int(ower.id) for ower in bill.owers]
|
||||
|
||||
def set_default(self):
|
||||
self.payed_for.data = self.payed_for.default
|
||||
|
||||
def validate_amount(self, field):
|
||||
if field.data == 0:
|
||||
raise ValidationError(_("Bills can't be null"))
|
||||
|
||||
|
||||
class MemberForm(Form):
|
||||
|
||||
name = TextField(_("Name"), validators=[Required()])
|
||||
weight = CommaDecimalField(_("Weight"), default=1)
|
||||
submit = SubmitField(_("Add"))
|
||||
|
||||
def __init__(self, project, edit=False, *args, **kwargs):
|
||||
super(MemberForm, self).__init__(*args, **kwargs)
|
||||
self.project = project
|
||||
self.edit = edit
|
||||
|
||||
def validate_name(form, field):
|
||||
if field.data == form.name.default:
|
||||
raise ValidationError(_("User name incorrect"))
|
||||
if (not form.edit and Person.query.filter(
|
||||
Person.name == field.data,
|
||||
Person.project == form.project,
|
||||
Person.activated == True).all()):
|
||||
raise ValidationError(_("This project already have this member"))
|
||||
|
||||
def save(self, project, person):
|
||||
# if the user is already bound to the project, just reactivate him
|
||||
person.name = self.name.data
|
||||
person.project = project
|
||||
person.weight = self.weight.data
|
||||
|
||||
return person
|
||||
|
||||
def fill(self, member):
|
||||
self.name.data = member.name
|
||||
self.weight.data = member.weight
|
||||
|
||||
|
||||
class InviteForm(Form):
|
||||
emails = TextAreaField(_("People to notify"))
|
||||
submit = SubmitField(_("Send invites"))
|
||||
|
||||
def validate_emails(form, field):
|
||||
validator = Email()
|
||||
for email in [email.strip() for email in form.emails.data.split(",")]:
|
||||
if not validator.regex.match(email):
|
||||
raise ValidationError(_("The email %(email)s is not valid",
|
||||
email=email))
|
||||
|
||||
|
||||
class CreateArchiveForm(Form):
|
||||
name = TextField(_("Name for this archive (optional)"), validators=[])
|
||||
start_date = DateField(_("Start date"), validators=[Required()])
|
||||
end_date = DateField(_("End date"), validators=[Required()], default=datetime.now)
|
||||
|
||||
|
||||
class ExportForm(Form):
|
||||
export_type = SelectField(_("What do you want to download ?"),
|
||||
validators=[Required()],
|
||||
coerce=str,
|
||||
choices=[("bills", _("bills")), ("transactions", _("transactions"))]
|
||||
)
|
||||
export_format = SelectField(_("Export file format"),
|
||||
validators=[Required()],
|
||||
coerce=str,
|
||||
choices=[("csv", "csv"), ("json", "json")]
|
||||
)
|
|
@ -1,16 +0,0 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
from flask.ext.script import Manager
|
||||
from flask.ext.migrate import Migrate, MigrateCommand
|
||||
|
||||
from run import app
|
||||
from models import db
|
||||
|
||||
migrate = Migrate(app, db)
|
||||
|
||||
manager = Manager(app)
|
||||
manager.add_command('db', MigrateCommand)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
manager.run()
|
|
@ -1,10 +0,0 @@
|
|||
"""
|
||||
Merges default settings with user-defined settings
|
||||
"""
|
||||
|
||||
from default_settings import *
|
||||
|
||||
try:
|
||||
from settings import *
|
||||
except ImportError:
|
||||
pass
|
|
@ -1,492 +0,0 @@
|
|||
# Translations template for PROJECT.
|
||||
# Copyright (C) 2013 ORGANIZATION
|
||||
# This file is distributed under the same license as the PROJECT project.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PROJECT VERSION\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2013-10-13 21:32+0200\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Generated-By: Babel 0.9.6\n"
|
||||
|
||||
#: forms.py:22
|
||||
msgid "Select all"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:22
|
||||
msgid "Select none"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:61
|
||||
msgid "Project name"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:62 forms.py:86 forms.py:102
|
||||
msgid "Private code"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:63
|
||||
msgid "Email"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:85 forms.py:101 forms.py:107
|
||||
msgid "Project identifier"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:87 templates/send_invites.html:5
|
||||
msgid "Create the project"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:92
|
||||
msgid ""
|
||||
"The project identifier is used to log in and for the URL of the project. "
|
||||
"We tried to generate an identifier for you but a project with this "
|
||||
"identifier already exists. Please create a new identifier that you will "
|
||||
"be able to remember."
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:103
|
||||
msgid "Get in"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:108
|
||||
msgid "Send me the code by email"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:112
|
||||
msgid "This project does not exists"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:116
|
||||
msgid "Date"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:117
|
||||
msgid "What?"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:118
|
||||
msgid "Payer"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:119
|
||||
msgid "Amount paid"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:120 templates/list_bills.html:103
|
||||
msgid "For whom?"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:122
|
||||
msgid "Submit"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:123
|
||||
msgid "Submit and add a new one"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:149
|
||||
msgid "Bills can't be null"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:154
|
||||
msgid "Name"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:155 templates/forms.html:95
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:163
|
||||
msgid "User name incorrect"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:167
|
||||
msgid "This project already have this member"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:178
|
||||
msgid "People to notify"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:179
|
||||
msgid "Send invites"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:185
|
||||
#, python-format
|
||||
msgid "The email %(email)s is not valid"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:190
|
||||
msgid "Name for this archive (optional)"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:191
|
||||
msgid "Start date"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:192
|
||||
msgid "End date"
|
||||
msgstr ""
|
||||
|
||||
#: web.py:95
|
||||
msgid "This private code is not the right one"
|
||||
msgstr ""
|
||||
|
||||
#: web.py:147
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr ""
|
||||
|
||||
#: web.py:165
|
||||
#, python-format
|
||||
msgid "%(msg_compl)sThe project identifier is %(project)s"
|
||||
msgstr ""
|
||||
|
||||
#: web.py:185
|
||||
msgid "a mail has been sent to you with the password"
|
||||
msgstr ""
|
||||
|
||||
#: web.py:211
|
||||
msgid "Project successfully deleted"
|
||||
msgstr ""
|
||||
|
||||
#: web.py:254
|
||||
#, python-format
|
||||
msgid "You have been invited to share your expenses for %(project)s"
|
||||
msgstr ""
|
||||
|
||||
#: web.py:261
|
||||
msgid "Your invitations have been sent"
|
||||
msgstr ""
|
||||
|
||||
#: web.py:290
|
||||
#, python-format
|
||||
msgid "%(member)s had been added"
|
||||
msgstr ""
|
||||
|
||||
#: web.py:303
|
||||
#, python-format
|
||||
msgid "%(name)s is part of this project again"
|
||||
msgstr ""
|
||||
|
||||
#: web.py:312
|
||||
#, python-format
|
||||
msgid "User '%(name)s' has been deactivated"
|
||||
msgstr ""
|
||||
|
||||
#: web.py:314
|
||||
#, python-format
|
||||
msgid "User '%(name)s' has been removed"
|
||||
msgstr ""
|
||||
|
||||
#: web.py:331
|
||||
msgid "The bill has been added"
|
||||
msgstr ""
|
||||
|
||||
#: web.py:351
|
||||
msgid "The bill has been deleted"
|
||||
msgstr ""
|
||||
|
||||
#: web.py:369
|
||||
msgid "The bill has been modified"
|
||||
msgstr ""
|
||||
|
||||
#: web.py:399
|
||||
msgid "The data from XX to XX has been archived"
|
||||
msgstr ""
|
||||
|
||||
#: templates/add_bill.html:9
|
||||
msgid "Back to the list"
|
||||
msgstr ""
|
||||
|
||||
#: templates/authenticate.html:6
|
||||
msgid ""
|
||||
"The project you are trying to access do not exist, do you want \n"
|
||||
"to"
|
||||
msgstr ""
|
||||
|
||||
#: templates/authenticate.html:7
|
||||
msgid "create it"
|
||||
msgstr ""
|
||||
|
||||
#: templates/authenticate.html:7
|
||||
msgid "?"
|
||||
msgstr ""
|
||||
|
||||
#: templates/create_project.html:4
|
||||
msgid "Create a new project"
|
||||
msgstr ""
|
||||
|
||||
#: templates/dashboard.html:5
|
||||
msgid "Project"
|
||||
msgstr ""
|
||||
|
||||
#: templates/dashboard.html:5
|
||||
msgid "Number of members"
|
||||
msgstr ""
|
||||
|
||||
#: templates/dashboard.html:5
|
||||
msgid "Number of bills"
|
||||
msgstr ""
|
||||
|
||||
#: templates/dashboard.html:5
|
||||
msgid "Newest bill"
|
||||
msgstr ""
|
||||
|
||||
#: templates/dashboard.html:5
|
||||
msgid "Oldest bill"
|
||||
msgstr ""
|
||||
|
||||
#: templates/edit_project.html:6 templates/list_bills.html:24
|
||||
msgid "you sure?"
|
||||
msgstr ""
|
||||
|
||||
#: templates/edit_project.html:11
|
||||
msgid "Edit this project"
|
||||
msgstr ""
|
||||
|
||||
#: templates/forms.html:23
|
||||
msgid "Can't remember the password?"
|
||||
msgstr ""
|
||||
|
||||
#: templates/forms.html:26
|
||||
msgid "Cancel"
|
||||
msgstr ""
|
||||
|
||||
#: templates/forms.html:68
|
||||
msgid "Edit the project"
|
||||
msgstr ""
|
||||
|
||||
#: templates/forms.html:69 templates/list_bills.html:70
|
||||
#: templates/list_bills.html:114
|
||||
msgid "delete"
|
||||
msgstr ""
|
||||
|
||||
#: templates/forms.html:77
|
||||
msgid "Edit this bill"
|
||||
msgstr ""
|
||||
|
||||
#: templates/forms.html:77 templates/list_bills.html:94
|
||||
msgid "Add a bill"
|
||||
msgstr ""
|
||||
|
||||
#: templates/forms.html:95
|
||||
msgid "Type user name here"
|
||||
msgstr ""
|
||||
|
||||
#: templates/forms.html:102
|
||||
msgid "Send the invitations"
|
||||
msgstr ""
|
||||
|
||||
#: templates/forms.html:103
|
||||
msgid "No, thanks"
|
||||
msgstr ""
|
||||
|
||||
#: templates/forms.html:109
|
||||
msgid "Create an archive"
|
||||
msgstr ""
|
||||
|
||||
#: templates/forms.html:116
|
||||
msgid "Create the archive"
|
||||
msgstr ""
|
||||
|
||||
#: templates/home.html:8
|
||||
msgid "Manage your shared <br>expenses, easily"
|
||||
msgstr ""
|
||||
|
||||
#: templates/home.html:9
|
||||
msgid "Try out the demo"
|
||||
msgstr ""
|
||||
|
||||
#: templates/home.html:12
|
||||
msgid "You're sharing a house?"
|
||||
msgstr ""
|
||||
|
||||
#: templates/home.html:12
|
||||
msgid "Going on holidays with friends?"
|
||||
msgstr ""
|
||||
|
||||
#: templates/home.html:12
|
||||
msgid "Simply sharing money with others?"
|
||||
msgstr ""
|
||||
|
||||
#: templates/home.html:12
|
||||
msgid "We can help!"
|
||||
msgstr ""
|
||||
|
||||
#: templates/home.html:24
|
||||
msgid "Log to an existing project"
|
||||
msgstr ""
|
||||
|
||||
#: templates/home.html:28
|
||||
msgid "log in"
|
||||
msgstr ""
|
||||
|
||||
#: templates/home.html:29
|
||||
msgid "can't remember your password?"
|
||||
msgstr ""
|
||||
|
||||
#: templates/home.html:36
|
||||
msgid "or create a new one"
|
||||
msgstr ""
|
||||
|
||||
#: templates/home.html:40
|
||||
msgid "let's get started"
|
||||
msgstr ""
|
||||
|
||||
#: templates/home.html:51
|
||||
msgid ""
|
||||
"This access code will be sent to your friends. It is stored as-is by the "
|
||||
"server, so don\\'t reuse a personal password!"
|
||||
msgstr ""
|
||||
|
||||
#: templates/layout.html:5
|
||||
msgid "Account manager"
|
||||
msgstr ""
|
||||
|
||||
#: templates/layout.html:45 templates/settle_bills.html:4
|
||||
msgid "Bills"
|
||||
msgstr ""
|
||||
|
||||
#: templates/layout.html:46 templates/settle_bills.html:5
|
||||
msgid "Settle"
|
||||
msgstr ""
|
||||
|
||||
#: templates/layout.html:53
|
||||
msgid "options"
|
||||
msgstr ""
|
||||
|
||||
#: templates/layout.html:55
|
||||
msgid "Project settings"
|
||||
msgstr ""
|
||||
|
||||
#: templates/layout.html:59
|
||||
msgid "switch to"
|
||||
msgstr ""
|
||||
|
||||
#: templates/layout.html:62
|
||||
msgid "Start a new project"
|
||||
msgstr ""
|
||||
|
||||
#: templates/layout.html:64
|
||||
msgid "Logout"
|
||||
msgstr ""
|
||||
|
||||
#: templates/layout.html:92
|
||||
msgid "This is a free software"
|
||||
msgstr ""
|
||||
|
||||
#: templates/layout.html:92
|
||||
msgid "you can contribute and improve it!"
|
||||
msgstr ""
|
||||
|
||||
#: templates/list_bills.html:74
|
||||
msgid "reactivate"
|
||||
msgstr ""
|
||||
|
||||
#: templates/list_bills.html:88
|
||||
msgid "The project identifier is"
|
||||
msgstr ""
|
||||
|
||||
#: templates/list_bills.html:88
|
||||
msgid "remember it!"
|
||||
msgstr ""
|
||||
|
||||
#: templates/list_bills.html:89
|
||||
msgid "Add a new bill"
|
||||
msgstr ""
|
||||
|
||||
#: templates/list_bills.html:103
|
||||
msgid "When?"
|
||||
msgstr ""
|
||||
|
||||
#: templates/list_bills.html:103
|
||||
msgid "Who paid?"
|
||||
msgstr ""
|
||||
|
||||
#: templates/list_bills.html:103
|
||||
msgid "For what?"
|
||||
msgstr ""
|
||||
|
||||
#: templates/list_bills.html:103 templates/settle_bills.html:31
|
||||
msgid "How much?"
|
||||
msgstr ""
|
||||
|
||||
#: templates/list_bills.html:103
|
||||
msgid "Actions"
|
||||
msgstr ""
|
||||
|
||||
#: templates/list_bills.html:111
|
||||
msgid "each"
|
||||
msgstr ""
|
||||
|
||||
#: templates/list_bills.html:113
|
||||
msgid "edit"
|
||||
msgstr ""
|
||||
|
||||
#: templates/list_bills.html:122
|
||||
msgid "Nothing to list yet. You probably want to"
|
||||
msgstr ""
|
||||
|
||||
#: templates/list_bills.html:122
|
||||
msgid "add a bill"
|
||||
msgstr ""
|
||||
|
||||
#: templates/password_reminder.html:4
|
||||
msgid "Password reminder"
|
||||
msgstr ""
|
||||
|
||||
#: templates/recent_projects.html:2
|
||||
msgid "Your projects"
|
||||
msgstr ""
|
||||
|
||||
#: templates/send_invites.html:6
|
||||
msgid "Invite people"
|
||||
msgstr ""
|
||||
|
||||
#: templates/send_invites.html:7
|
||||
msgid "Use it!"
|
||||
msgstr ""
|
||||
|
||||
#: templates/send_invites.html:11
|
||||
msgid "Invite people to join this project"
|
||||
msgstr ""
|
||||
|
||||
#: templates/send_invites.html:12
|
||||
msgid ""
|
||||
"Specify a (coma separated) list of email adresses you want to notify "
|
||||
"about the \n"
|
||||
"creation of this budget management project and we will send them an email"
|
||||
" for you."
|
||||
msgstr ""
|
||||
|
||||
#: templates/send_invites.html:14
|
||||
msgid "If you prefer, you can"
|
||||
msgstr ""
|
||||
|
||||
#: templates/send_invites.html:14
|
||||
msgid "skip this step"
|
||||
msgstr ""
|
||||
|
||||
#: templates/send_invites.html:14
|
||||
msgid "and notify them yourself"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settle_bills.html:31
|
||||
msgid "Who pays?"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settle_bills.html:31
|
||||
msgid "To whom?"
|
||||
msgstr ""
|
||||
|
|
@ -1 +0,0 @@
|
|||
Generic single-database configuration.
|
|
@ -1,45 +0,0 @@
|
|||
# A generic, single database configuration.
|
||||
|
||||
[alembic]
|
||||
# template used to generate migration files
|
||||
# file_template = %%(rev)s_%%(slug)s
|
||||
|
||||
# set to 'true' to run the environment during
|
||||
# the 'revision' command, regardless of autogenerate
|
||||
# revision_environment = false
|
||||
|
||||
|
||||
# Logging configuration
|
||||
[loggers]
|
||||
keys = root,sqlalchemy,alembic
|
||||
|
||||
[handlers]
|
||||
keys = console
|
||||
|
||||
[formatters]
|
||||
keys = generic
|
||||
|
||||
[logger_root]
|
||||
level = WARN
|
||||
handlers = console
|
||||
qualname =
|
||||
|
||||
[logger_sqlalchemy]
|
||||
level = WARN
|
||||
handlers =
|
||||
qualname = sqlalchemy.engine
|
||||
|
||||
[logger_alembic]
|
||||
level = INFO
|
||||
handlers =
|
||||
qualname = alembic
|
||||
|
||||
[handler_console]
|
||||
class = StreamHandler
|
||||
args = (sys.stderr,)
|
||||
level = NOTSET
|
||||
formatter = generic
|
||||
|
||||
[formatter_generic]
|
||||
format = %(levelname)-5.5s [%(name)s] %(message)s
|
||||
datefmt = %H:%M:%S
|
|
@ -1,85 +0,0 @@
|
|||
from __future__ import with_statement
|
||||
from alembic import context
|
||||
from sqlalchemy import engine_from_config, pool
|
||||
from logging.config import fileConfig
|
||||
import logging
|
||||
|
||||
# This is the Alembic Config object, which provides access to the values within
|
||||
# the .ini file in use.
|
||||
config = context.config
|
||||
|
||||
# Interpret the config file for Python logging. This line sets up loggers
|
||||
# basically.
|
||||
fileConfig(config.config_file_name)
|
||||
logger = logging.getLogger('alembic.env')
|
||||
|
||||
# Add your model's MetaData object here for 'autogenerate' support from myapp
|
||||
# import mymodel target_metadata = mymodel.Base.metadata.
|
||||
from flask import current_app
|
||||
config.set_main_option('sqlalchemy.url',
|
||||
current_app.config.get('SQLALCHEMY_DATABASE_URI'))
|
||||
target_metadata = current_app.extensions['migrate'].db.metadata
|
||||
|
||||
# Other values from the config, defined by the needs of env.py,
|
||||
# can be acquired:
|
||||
# my_important_option = config.get_main_option("my_important_option")
|
||||
# ... etc.
|
||||
|
||||
|
||||
def run_migrations_offline():
|
||||
"""Run migrations in 'offline' mode.
|
||||
|
||||
This configures the context with just a URL
|
||||
and not an Engine, though an Engine is acceptable
|
||||
here as well. By skipping the Engine creation
|
||||
we don't even need a DBAPI to be available.
|
||||
|
||||
Calls to context.execute() here emit the given string to the
|
||||
script output.
|
||||
|
||||
"""
|
||||
url = config.get_main_option("sqlalchemy.url")
|
||||
context.configure(url=url)
|
||||
|
||||
with context.begin_transaction():
|
||||
context.run_migrations()
|
||||
|
||||
|
||||
def run_migrations_online():
|
||||
"""Run migrations in 'online' mode.
|
||||
|
||||
In this scenario we need to create an Engine
|
||||
and associate a connection with the context.
|
||||
|
||||
"""
|
||||
|
||||
# This callback is used to prevent an auto-migration from being generated
|
||||
# when there are no changes to the schema.
|
||||
# reference: https://alembic.readthedocs.io/en/latest/cookbook.html
|
||||
def process_revision_directives(context, revision, directives):
|
||||
if getattr(config.cmd_opts, 'autogenerate', False):
|
||||
script = directives[0]
|
||||
if script.upgrade_ops.is_empty():
|
||||
directives[:] = []
|
||||
logger.info('No changes in schema detected.')
|
||||
|
||||
engine = engine_from_config(config.get_section(config.config_ini_section),
|
||||
prefix='sqlalchemy.',
|
||||
poolclass=pool.NullPool)
|
||||
|
||||
connection = engine.connect()
|
||||
context.configure(connection=connection,
|
||||
target_metadata=target_metadata,
|
||||
process_revision_directives=process_revision_directives,
|
||||
**current_app.extensions['migrate'].configure_args)
|
||||
|
||||
try:
|
||||
with context.begin_transaction():
|
||||
context.run_migrations()
|
||||
finally:
|
||||
connection.close()
|
||||
|
||||
if context.is_offline_mode():
|
||||
run_migrations_offline()
|
||||
else:
|
||||
run_migrations_online()
|
|
@ -1,22 +0,0 @@
|
|||
"""${message}
|
||||
|
||||
Revision ID: ${up_revision}
|
||||
Revises: ${down_revision}
|
||||
Create Date: ${create_date}
|
||||
|
||||
"""
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision = ${repr(up_revision)}
|
||||
down_revision = ${repr(down_revision)}
|
||||
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
${imports if imports else ""}
|
||||
|
||||
def upgrade():
|
||||
${upgrades if upgrades else "pass"}
|
||||
|
||||
|
||||
def downgrade():
|
||||
${downgrades if downgrades else "pass"}
|
|
@ -1,26 +0,0 @@
|
|||
"""Add Person.weight column
|
||||
|
||||
Revision ID: 26d6a218c329
|
||||
Revises: b9a10d5d63ce
|
||||
Create Date: 2016-06-15 09:22:04.069447
|
||||
|
||||
"""
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision = '26d6a218c329'
|
||||
down_revision = 'b9a10d5d63ce'
|
||||
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
|
||||
|
||||
def upgrade():
|
||||
### commands auto generated by Alembic - please adjust! ###
|
||||
op.add_column('person', sa.Column('weight', sa.Float(), nullable=True))
|
||||
### end Alembic commands ###
|
||||
|
||||
|
||||
def downgrade():
|
||||
### commands auto generated by Alembic - please adjust! ###
|
||||
op.drop_column('person', 'weight')
|
||||
### end Alembic commands ###
|
|
@ -1,68 +0,0 @@
|
|||
"""Initial migration
|
||||
|
||||
Revision ID: b9a10d5d63ce
|
||||
Revises: None
|
||||
Create Date: 2016-05-21 23:21:21.605076
|
||||
|
||||
"""
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision = 'b9a10d5d63ce'
|
||||
down_revision = None
|
||||
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
|
||||
|
||||
def upgrade():
|
||||
### commands auto generated by Alembic - please adjust! ###
|
||||
op.create_table('project',
|
||||
sa.Column('id', sa.String(length=64), nullable=False),
|
||||
sa.Column('name', sa.UnicodeText(), nullable=True),
|
||||
sa.Column('password', sa.String(length=128), nullable=True),
|
||||
sa.Column('contact_email', sa.String(length=128), nullable=True),
|
||||
sa.PrimaryKeyConstraint('id')
|
||||
)
|
||||
op.create_table('archive',
|
||||
sa.Column('id', sa.Integer(), nullable=False),
|
||||
sa.Column('project_id', sa.String(length=64), nullable=True),
|
||||
sa.Column('name', sa.UnicodeText(), nullable=True),
|
||||
sa.ForeignKeyConstraint(['project_id'], ['project.id'], ),
|
||||
sa.PrimaryKeyConstraint('id')
|
||||
)
|
||||
op.create_table('person',
|
||||
sa.Column('id', sa.Integer(), nullable=False),
|
||||
sa.Column('project_id', sa.String(length=64), nullable=True),
|
||||
sa.Column('name', sa.UnicodeText(), nullable=True),
|
||||
sa.Column('activated', sa.Boolean(), nullable=True),
|
||||
sa.ForeignKeyConstraint(['project_id'], ['project.id'], ),
|
||||
sa.PrimaryKeyConstraint('id')
|
||||
)
|
||||
op.create_table('bill',
|
||||
sa.Column('id', sa.Integer(), nullable=False),
|
||||
sa.Column('payer_id', sa.Integer(), nullable=True),
|
||||
sa.Column('amount', sa.Float(), nullable=True),
|
||||
sa.Column('date', sa.Date(), nullable=True),
|
||||
sa.Column('what', sa.UnicodeText(), nullable=True),
|
||||
sa.Column('archive', sa.Integer(), nullable=True),
|
||||
sa.ForeignKeyConstraint(['archive'], ['archive.id'], ),
|
||||
sa.ForeignKeyConstraint(['payer_id'], ['person.id'], ),
|
||||
sa.PrimaryKeyConstraint('id')
|
||||
)
|
||||
op.create_table('billowers',
|
||||
sa.Column('bill_id', sa.Integer(), nullable=True),
|
||||
sa.Column('person_id', sa.Integer(), nullable=True),
|
||||
sa.ForeignKeyConstraint(['bill_id'], ['bill.id'], ),
|
||||
sa.ForeignKeyConstraint(['person_id'], ['person.id'], )
|
||||
)
|
||||
### end Alembic commands ###
|
||||
|
||||
|
||||
def downgrade():
|
||||
### commands auto generated by Alembic - please adjust! ###
|
||||
op.drop_table('billowers')
|
||||
op.drop_table('bill')
|
||||
op.drop_table('person')
|
||||
op.drop_table('archive')
|
||||
op.drop_table('project')
|
||||
### end Alembic commands ###
|
|
@ -1,39 +0,0 @@
|
|||
"""Initialize all members weights to 1
|
||||
|
||||
Revision ID: f629c8ef4ab0
|
||||
Revises: 26d6a218c329
|
||||
Create Date: 2016-06-15 09:40:30.400862
|
||||
|
||||
"""
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision = 'f629c8ef4ab0'
|
||||
down_revision = '26d6a218c329'
|
||||
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
|
||||
# Snapshot of the person table
|
||||
person_helper = sa.Table(
|
||||
'person', sa.MetaData(),
|
||||
sa.Column('id', sa.Integer(), nullable=False),
|
||||
sa.Column('project_id', sa.String(length=64), nullable=True),
|
||||
sa.Column('name', sa.UnicodeText(), nullable=True),
|
||||
sa.Column('activated', sa.Boolean(), nullable=True),
|
||||
sa.Column('weight', sa.Float(), nullable=True),
|
||||
sa.ForeignKeyConstraint(['project_id'], ['project.id'], ),
|
||||
sa.PrimaryKeyConstraint('id')
|
||||
)
|
||||
|
||||
|
||||
def upgrade():
|
||||
op.execute(
|
||||
person_helper.update()
|
||||
.where(person_helper.c.weight == None)
|
||||
.values(weight=1)
|
||||
)
|
||||
|
||||
|
||||
def downgrade():
|
||||
# Downgrade path is not possible, because information has been lost.
|
||||
pass
|
|
@ -1,283 +0,0 @@
|
|||
from collections import defaultdict
|
||||
|
||||
from datetime import datetime
|
||||
from flask_sqlalchemy import SQLAlchemy, BaseQuery
|
||||
from flask import g
|
||||
|
||||
from sqlalchemy import orm
|
||||
|
||||
db = SQLAlchemy()
|
||||
|
||||
|
||||
# define models
|
||||
|
||||
|
||||
class Project(db.Model):
|
||||
|
||||
_to_serialize = ("id", "name", "password", "contact_email",
|
||||
"members", "active_members", "balance")
|
||||
|
||||
id = db.Column(db.String(64), primary_key=True)
|
||||
|
||||
name = db.Column(db.UnicodeText)
|
||||
password = db.Column(db.String(128))
|
||||
contact_email = db.Column(db.String(128))
|
||||
members = db.relationship("Person", backref="project")
|
||||
|
||||
@property
|
||||
def active_members(self):
|
||||
return [m for m in self.members if m.activated]
|
||||
|
||||
@property
|
||||
def balance(self):
|
||||
|
||||
balances, should_pay, should_receive = (defaultdict(int)
|
||||
for time in (1, 2, 3))
|
||||
|
||||
# for each person
|
||||
for person in self.members:
|
||||
# get the list of bills he has to pay
|
||||
bills = Bill.query.options(orm.subqueryload(Bill.owers)).filter(Bill.owers.contains(person))
|
||||
for bill in bills.all():
|
||||
if person != bill.payer:
|
||||
share = bill.pay_each() * person.weight
|
||||
should_pay[person] += share
|
||||
should_receive[bill.payer] += share
|
||||
|
||||
for person in self.members:
|
||||
balance = should_receive[person] - should_pay[person]
|
||||
balances[person.id] = balance
|
||||
|
||||
return balances
|
||||
|
||||
@property
|
||||
def uses_weights(self):
|
||||
return len([i for i in self.members if i.weight != 1]) > 0
|
||||
|
||||
def get_transactions_to_settle_bill(self, pretty_output=False):
|
||||
"""Return a list of transactions that could be made to settle the bill"""
|
||||
def prettify(transactions, pretty_output):
|
||||
""" Return pretty transactions
|
||||
"""
|
||||
if not pretty_output:
|
||||
return transactions
|
||||
pretty_transactions = []
|
||||
for transaction in transactions:
|
||||
pretty_transactions.append({'ower': transaction['ower'].name,
|
||||
'receiver': transaction['receiver'].name,
|
||||
'amount': round(transaction['amount'], 2)})
|
||||
return pretty_transactions
|
||||
|
||||
#cache value for better performance
|
||||
balance = self.balance
|
||||
credits, debts, transactions = [],[],[]
|
||||
# Create lists of credits and debts
|
||||
for person in self.members:
|
||||
if round(balance[person.id], 2) > 0:
|
||||
credits.append({"person": person, "balance": balance[person.id]})
|
||||
elif round(balance[person.id], 2) < 0:
|
||||
debts.append({"person": person, "balance": -balance[person.id]})
|
||||
# Try and find exact matches
|
||||
for credit in credits:
|
||||
match = self.exactmatch(round(credit["balance"], 2), debts)
|
||||
if match:
|
||||
for m in match:
|
||||
transactions.append({"ower": m["person"], "receiver": credit["person"], "amount": m["balance"]})
|
||||
debts.remove(m)
|
||||
credits.remove(credit)
|
||||
# Split any remaining debts & credits
|
||||
while credits and debts:
|
||||
if credits[0]["balance"] > debts[0]["balance"]:
|
||||
transactions.append({"ower": debts[0]["person"], "receiver": credits[0]["person"], "amount": debts[0]["balance"]})
|
||||
credits[0]["balance"] = credits[0]["balance"] - debts[0]["balance"]
|
||||
del debts[0]
|
||||
else:
|
||||
transactions.append({"ower": debts[0]["person"], "receiver": credits[0]["person"], "amount": credits[0]["balance"]})
|
||||
debts[0]["balance"] = debts[0]["balance"] - credits[0]["balance"]
|
||||
del credits[0]
|
||||
|
||||
return prettify(transactions, pretty_output)
|
||||
|
||||
def exactmatch(self, credit, debts):
|
||||
"""Recursively try and find subsets of 'debts' whose sum is equal to credit"""
|
||||
if not debts:
|
||||
return None
|
||||
if debts[0]["balance"] > credit:
|
||||
return self.exactmatch(credit, debts[1:])
|
||||
elif debts[0]["balance"] == credit:
|
||||
return [debts[0]]
|
||||
else:
|
||||
match = self.exactmatch(credit-debts[0]["balance"], debts[1:])
|
||||
if match:
|
||||
match.append(debts[0])
|
||||
else:
|
||||
match = self.exactmatch(credit, debts[1:])
|
||||
return match
|
||||
|
||||
def has_bills(self):
|
||||
"""return if the project do have bills or not"""
|
||||
return self.get_bills().count() > 0
|
||||
|
||||
def get_bills(self):
|
||||
"""Return the list of bills related to this project"""
|
||||
return Bill.query.join(Person, Project)\
|
||||
.filter(Bill.payer_id == Person.id)\
|
||||
.filter(Person.project_id == Project.id)\
|
||||
.filter(Project.id == self.id)\
|
||||
.order_by(Bill.date.desc())\
|
||||
.order_by(Bill.id.desc())
|
||||
|
||||
def get_pretty_bills(self, export_format="json"):
|
||||
"""Return a list of project's bills with pretty formatting"""
|
||||
bills = self.get_bills()
|
||||
pretty_bills = []
|
||||
for bill in bills:
|
||||
if export_format == "json":
|
||||
owers = [ower.name for ower in bill.owers]
|
||||
else:
|
||||
owers = ', '.join([ower.name for ower in bill.owers])
|
||||
pretty_bills.append({"what": bill.what,
|
||||
"amount": round(bill.amount, 2),
|
||||
"date": str(bill.date),
|
||||
"payer_name": Person.query.get(bill.payer_id).name,
|
||||
"payer_weight": Person.query.get(bill.payer_id).weight,
|
||||
"owers": owers})
|
||||
return pretty_bills
|
||||
|
||||
def remove_member(self, member_id):
|
||||
"""Remove a member from the project.
|
||||
|
||||
If the member is not bound to a bill, then he is deleted, otherwise
|
||||
he is only deactivated.
|
||||
|
||||
This method returns the status DELETED or DEACTIVATED regarding the
|
||||
changes made.
|
||||
"""
|
||||
try:
|
||||
person = Person.query.get(member_id, self)
|
||||
except orm.exc.NoResultFound:
|
||||
return None
|
||||
if not person.has_bills():
|
||||
db.session.delete(person)
|
||||
db.session.commit()
|
||||
else:
|
||||
person.activated = False
|
||||
db.session.commit()
|
||||
return person
|
||||
|
||||
def remove_project(self):
|
||||
db.session.delete(self)
|
||||
db.session.commit()
|
||||
|
||||
def __repr__(self):
|
||||
return "<Project %s>" % self.name
|
||||
|
||||
|
||||
class Person(db.Model):
|
||||
|
||||
class PersonQuery(BaseQuery):
|
||||
def get_by_name(self, name, project):
|
||||
return Person.query.filter(Person.name == name)\
|
||||
.filter(Project.id == project.id).one()
|
||||
|
||||
def get(self, id, project=None):
|
||||
if not project:
|
||||
project = g.project
|
||||
return Person.query.filter(Person.id == id)\
|
||||
.filter(Project.id == project.id).one()
|
||||
|
||||
query_class = PersonQuery
|
||||
|
||||
_to_serialize = ("id", "name", "weight", "activated")
|
||||
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
project_id = db.Column(db.String(64), db.ForeignKey("project.id"))
|
||||
bills = db.relationship("Bill", backref="payer")
|
||||
|
||||
name = db.Column(db.UnicodeText)
|
||||
weight = db.Column(db.Float, default=1)
|
||||
activated = db.Column(db.Boolean, default=True)
|
||||
|
||||
def has_bills(self):
|
||||
"""return if the user do have bills or not"""
|
||||
bills_as_ower_number = db.session.query(billowers)\
|
||||
.filter(billowers.columns.get("person_id") == self.id)\
|
||||
.count()
|
||||
return bills_as_ower_number != 0 or len(self.bills) != 0
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
def __repr__(self):
|
||||
return "<Person %s for project %s>" % (self.name, self.project.name)
|
||||
|
||||
# We need to manually define a join table for m2m relations
|
||||
billowers = db.Table('billowers',
|
||||
db.Column('bill_id', db.Integer, db.ForeignKey('bill.id')),
|
||||
db.Column('person_id', db.Integer, db.ForeignKey('person.id')),
|
||||
)
|
||||
|
||||
|
||||
class Bill(db.Model):
|
||||
|
||||
class BillQuery(BaseQuery):
|
||||
|
||||
def get(self, project, id):
|
||||
try:
|
||||
return self.join(Person, Project)\
|
||||
.filter(Bill.payer_id == Person.id)\
|
||||
.filter(Person.project_id == Project.id)\
|
||||
.filter(Project.id == project.id)\
|
||||
.filter(Bill.id == id).one()
|
||||
except orm.exc.NoResultFound:
|
||||
return None
|
||||
|
||||
def delete(self, project, id):
|
||||
bill = self.get(project, id)
|
||||
if bill:
|
||||
db.session.delete(bill)
|
||||
return bill
|
||||
|
||||
query_class = BillQuery
|
||||
|
||||
_to_serialize = ("id", "payer_id", "owers", "amount", "date", "what")
|
||||
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
|
||||
payer_id = db.Column(db.Integer, db.ForeignKey("person.id"))
|
||||
owers = db.relationship(Person, secondary=billowers)
|
||||
|
||||
amount = db.Column(db.Float)
|
||||
date = db.Column(db.Date, default=datetime.now)
|
||||
what = db.Column(db.UnicodeText)
|
||||
|
||||
archive = db.Column(db.Integer, db.ForeignKey("archive.id"))
|
||||
|
||||
def pay_each(self):
|
||||
"""Compute what each share has to pay"""
|
||||
if self.owers:
|
||||
# FIXME: SQL might dot that more efficiently
|
||||
return self.amount / sum(i.weight for i in self.owers)
|
||||
else:
|
||||
return 0
|
||||
|
||||
def __repr__(self):
|
||||
return "<Bill of %s from %s for %s>" % (self.amount,
|
||||
self.payer, ", ".join([o.name for o in self.owers]))
|
||||
|
||||
|
||||
class Archive(db.Model):
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
project_id = db.Column(db.String(64), db.ForeignKey("project.id"))
|
||||
name = db.Column(db.UnicodeText)
|
||||
|
||||
@property
|
||||
def start_date(self):
|
||||
pass
|
||||
|
||||
@property
|
||||
def end_date(self):
|
||||
pass
|
||||
|
||||
def __repr__(self):
|
||||
return "<Archive>"
|
|
@ -1,10 +0,0 @@
|
|||
flask>=0.9
|
||||
flask-wtf==0.8
|
||||
flask-sqlalchemy
|
||||
flask-mail>=0.8
|
||||
Flask-Migrate==1.8.0
|
||||
flask-babel
|
||||
flask-rest
|
||||
jinja2==2.6
|
||||
raven
|
||||
blinker
|
|
@ -1,90 +0,0 @@
|
|||
import os
|
||||
import warnings
|
||||
|
||||
from flask import Flask, g, request, session
|
||||
from flask_babel import Babel
|
||||
from flask_migrate import Migrate, upgrade, stamp
|
||||
from raven.contrib.flask import Sentry
|
||||
|
||||
from web import main, db, mail
|
||||
from api import api
|
||||
from utils import PrefixedWSGI
|
||||
from utils import minimal_round
|
||||
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
|
||||
def pre_alembic_db():
|
||||
""" Checks if we are migrating from a pre-alembic ihatemoney
|
||||
"""
|
||||
con = db.engine.connect()
|
||||
tables_exist = db.engine.dialect.has_table(con, 'project')
|
||||
alembic_setup = db.engine.dialect.has_table(con, 'alembic_version')
|
||||
return tables_exist and not alembic_setup
|
||||
|
||||
|
||||
def configure():
|
||||
""" A way to (re)configure the app, specially reset the settings
|
||||
"""
|
||||
config_obj = os.environ.get('FLASK_SETTINGS_MODULE', 'merged_settings')
|
||||
app.config.from_object(config_obj)
|
||||
app.wsgi_app = PrefixedWSGI(app)
|
||||
|
||||
# Deprecations
|
||||
if 'DEFAULT_MAIL_SENDER' in app.config:
|
||||
# Since flask-mail 0.8
|
||||
warnings.warn(
|
||||
"DEFAULT_MAIL_SENDER is deprecated in favor of MAIL_DEFAULT_SENDER"
|
||||
+" and will be removed in further version",
|
||||
UserWarning
|
||||
)
|
||||
if not 'MAIL_DEFAULT_SENDER' in app.config:
|
||||
app.config['MAIL_DEFAULT_SENDER'] = DEFAULT_MAIL_SENDER
|
||||
|
||||
configure()
|
||||
|
||||
app.register_blueprint(main)
|
||||
app.register_blueprint(api)
|
||||
|
||||
# custom jinja2 filters
|
||||
app.jinja_env.filters['minimal_round'] = minimal_round
|
||||
|
||||
# db
|
||||
db.init_app(app)
|
||||
db.app = app
|
||||
|
||||
# db migrations
|
||||
migrate = Migrate(app, db)
|
||||
|
||||
if pre_alembic_db():
|
||||
with app.app_context():
|
||||
# fake the first migration
|
||||
stamp(revision='b9a10d5d63ce')
|
||||
|
||||
# auto-execute migrations on runtime
|
||||
with app.app_context():
|
||||
upgrade()
|
||||
|
||||
# mail
|
||||
mail.init_app(app)
|
||||
|
||||
# translations
|
||||
babel = Babel(app)
|
||||
|
||||
# sentry
|
||||
sentry = Sentry(app)
|
||||
|
||||
@babel.localeselector
|
||||
def get_locale():
|
||||
# get the lang from the session if defined, fallback on the browser "accept
|
||||
# languages" header.
|
||||
lang = session.get('lang', request.accept_languages.best_match(['fr', 'en']))
|
||||
setattr(g, 'lang', lang)
|
||||
return lang
|
||||
|
||||
def main():
|
||||
app.run(host="0.0.0.0", debug=True)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
|
@ -1,707 +0,0 @@
|
|||
/*!
|
||||
* Datepicker for Bootstrap v1.6.4 (https://github.com/eternicode/bootstrap-datepicker)
|
||||
*
|
||||
* Copyright 2012 Stefan Petre
|
||||
* Improvements by Andrew Rowls
|
||||
* Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0)
|
||||
*/
|
||||
.datepicker {
|
||||
border-radius: 4px;
|
||||
direction: ltr;
|
||||
}
|
||||
.datepicker-inline {
|
||||
width: 220px;
|
||||
}
|
||||
.datepicker.datepicker-rtl {
|
||||
direction: rtl;
|
||||
}
|
||||
.datepicker.datepicker-rtl table tr td span {
|
||||
float: right;
|
||||
}
|
||||
.datepicker-dropdown {
|
||||
top: 0;
|
||||
left: 0;
|
||||
padding: 4px;
|
||||
}
|
||||
.datepicker-dropdown:before {
|
||||
content: '';
|
||||
display: inline-block;
|
||||
border-left: 7px solid transparent;
|
||||
border-right: 7px solid transparent;
|
||||
border-bottom: 7px solid rgba(0, 0, 0, 0.15);
|
||||
border-top: 0;
|
||||
border-bottom-color: rgba(0, 0, 0, 0.2);
|
||||
position: absolute;
|
||||
}
|
||||
.datepicker-dropdown:after {
|
||||
content: '';
|
||||
display: inline-block;
|
||||
border-left: 6px solid transparent;
|
||||
border-right: 6px solid transparent;
|
||||
border-bottom: 6px solid #fff;
|
||||
border-top: 0;
|
||||
position: absolute;
|
||||
}
|
||||
.datepicker-dropdown.datepicker-orient-left:before {
|
||||
left: 6px;
|
||||
}
|
||||
.datepicker-dropdown.datepicker-orient-left:after {
|
||||
left: 7px;
|
||||
}
|
||||
.datepicker-dropdown.datepicker-orient-right:before {
|
||||
right: 6px;
|
||||
}
|
||||
.datepicker-dropdown.datepicker-orient-right:after {
|
||||
right: 7px;
|
||||
}
|
||||
.datepicker-dropdown.datepicker-orient-bottom:before {
|
||||
top: -7px;
|
||||
}
|
||||
.datepicker-dropdown.datepicker-orient-bottom:after {
|
||||
top: -6px;
|
||||
}
|
||||
.datepicker-dropdown.datepicker-orient-top:before {
|
||||
bottom: -7px;
|
||||
border-bottom: 0;
|
||||
border-top: 7px solid rgba(0, 0, 0, 0.15);
|
||||
}
|
||||
.datepicker-dropdown.datepicker-orient-top:after {
|
||||
bottom: -6px;
|
||||
border-bottom: 0;
|
||||
border-top: 6px solid #fff;
|
||||
}
|
||||
.datepicker table {
|
||||
margin: 0;
|
||||
-webkit-touch-callout: none;
|
||||
-webkit-user-select: none;
|
||||
-khtml-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
.datepicker table tr td,
|
||||
.datepicker table tr th {
|
||||
text-align: center;
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
border-radius: 4px;
|
||||
border: none;
|
||||
}
|
||||
.table-striped .datepicker table tr td,
|
||||
.table-striped .datepicker table tr th {
|
||||
background-color: transparent;
|
||||
}
|
||||
.datepicker table tr td.old,
|
||||
.datepicker table tr td.new {
|
||||
color: #777777;
|
||||
}
|
||||
.datepicker table tr td.day:hover,
|
||||
.datepicker table tr td.focused {
|
||||
background: #eeeeee;
|
||||
cursor: pointer;
|
||||
}
|
||||
.datepicker table tr td.disabled,
|
||||
.datepicker table tr td.disabled:hover {
|
||||
background: none;
|
||||
color: #777777;
|
||||
cursor: default;
|
||||
}
|
||||
.datepicker table tr td.highlighted {
|
||||
color: #000;
|
||||
background-color: #d9edf7;
|
||||
border-color: #85c5e5;
|
||||
border-radius: 0;
|
||||
}
|
||||
.datepicker table tr td.highlighted:focus,
|
||||
.datepicker table tr td.highlighted.focus {
|
||||
color: #000;
|
||||
background-color: #afd9ee;
|
||||
border-color: #298fc2;
|
||||
}
|
||||
.datepicker table tr td.highlighted:hover {
|
||||
color: #000;
|
||||
background-color: #afd9ee;
|
||||
border-color: #52addb;
|
||||
}
|
||||
.datepicker table tr td.highlighted:active,
|
||||
.datepicker table tr td.highlighted.active {
|
||||
color: #000;
|
||||
background-color: #afd9ee;
|
||||
border-color: #52addb;
|
||||
}
|
||||
.datepicker table tr td.highlighted:active:hover,
|
||||
.datepicker table tr td.highlighted.active:hover,
|
||||
.datepicker table tr td.highlighted:active:focus,
|
||||
.datepicker table tr td.highlighted.active:focus,
|
||||
.datepicker table tr td.highlighted:active.focus,
|
||||
.datepicker table tr td.highlighted.active.focus {
|
||||
color: #000;
|
||||
background-color: #91cbe8;
|
||||
border-color: #298fc2;
|
||||
}
|
||||
.datepicker table tr td.highlighted.disabled:hover,
|
||||
.datepicker table tr td.highlighted[disabled]:hover,
|
||||
fieldset[disabled] .datepicker table tr td.highlighted:hover,
|
||||
.datepicker table tr td.highlighted.disabled:focus,
|
||||
.datepicker table tr td.highlighted[disabled]:focus,
|
||||
fieldset[disabled] .datepicker table tr td.highlighted:focus,
|
||||
.datepicker table tr td.highlighted.disabled.focus,
|
||||
.datepicker table tr td.highlighted[disabled].focus,
|
||||
fieldset[disabled] .datepicker table tr td.highlighted.focus {
|
||||
background-color: #d9edf7;
|
||||
border-color: #85c5e5;
|
||||
}
|
||||
.datepicker table tr td.highlighted.focused {
|
||||
background: #afd9ee;
|
||||
}
|
||||
.datepicker table tr td.highlighted.disabled,
|
||||
.datepicker table tr td.highlighted.disabled:active {
|
||||
background: #d9edf7;
|
||||
color: #777777;
|
||||
}
|
||||
.datepicker table tr td.today {
|
||||
color: #000;
|
||||
background-color: #ffdb99;
|
||||
border-color: #ffb733;
|
||||
}
|
||||
.datepicker table tr td.today:focus,
|
||||
.datepicker table tr td.today.focus {
|
||||
color: #000;
|
||||
background-color: #ffc966;
|
||||
border-color: #b37400;
|
||||
}
|
||||
.datepicker table tr td.today:hover {
|
||||
color: #000;
|
||||
background-color: #ffc966;
|
||||
border-color: #f59e00;
|
||||
}
|
||||
.datepicker table tr td.today:active,
|
||||
.datepicker table tr td.today.active {
|
||||
color: #000;
|
||||
background-color: #ffc966;
|
||||
border-color: #f59e00;
|
||||
}
|
||||
.datepicker table tr td.today:active:hover,
|
||||
.datepicker table tr td.today.active:hover,
|
||||
.datepicker table tr td.today:active:focus,
|
||||
.datepicker table tr td.today.active:focus,
|
||||
.datepicker table tr td.today:active.focus,
|
||||
.datepicker table tr td.today.active.focus {
|
||||
color: #000;
|
||||
background-color: #ffbc42;
|
||||
border-color: #b37400;
|
||||
}
|
||||
.datepicker table tr td.today.disabled:hover,
|
||||
.datepicker table tr td.today[disabled]:hover,
|
||||
fieldset[disabled] .datepicker table tr td.today:hover,
|
||||
.datepicker table tr td.today.disabled:focus,
|
||||
.datepicker table tr td.today[disabled]:focus,
|
||||
fieldset[disabled] .datepicker table tr td.today:focus,
|
||||
.datepicker table tr td.today.disabled.focus,
|
||||
.datepicker table tr td.today[disabled].focus,
|
||||
fieldset[disabled] .datepicker table tr td.today.focus {
|
||||
background-color: #ffdb99;
|
||||
border-color: #ffb733;
|
||||
}
|
||||
.datepicker table tr td.today.focused {
|
||||
background: #ffc966;
|
||||
}
|
||||
.datepicker table tr td.today.disabled,
|
||||
.datepicker table tr td.today.disabled:active {
|
||||
background: #ffdb99;
|
||||
color: #777777;
|
||||
}
|
||||
.datepicker table tr td.range {
|
||||
color: #000;
|
||||
background-color: #eeeeee;
|
||||
border-color: #bbbbbb;
|
||||
border-radius: 0;
|
||||
}
|
||||
.datepicker table tr td.range:focus,
|
||||
.datepicker table tr td.range.focus {
|
||||
color: #000;
|
||||
background-color: #d5d5d5;
|
||||
border-color: #7c7c7c;
|
||||
}
|
||||
.datepicker table tr td.range:hover {
|
||||
color: #000;
|
||||
background-color: #d5d5d5;
|
||||
border-color: #9d9d9d;
|
||||
}
|
||||
.datepicker table tr td.range:active,
|
||||
.datepicker table tr td.range.active {
|
||||
color: #000;
|
||||
background-color: #d5d5d5;
|
||||
border-color: #9d9d9d;
|
||||
}
|
||||
.datepicker table tr td.range:active:hover,
|
||||
.datepicker table tr td.range.active:hover,
|
||||
.datepicker table tr td.range:active:focus,
|
||||
.datepicker table tr td.range.active:focus,
|
||||
.datepicker table tr td.range:active.focus,
|
||||
.datepicker table tr td.range.active.focus {
|
||||
color: #000;
|
||||
background-color: #c3c3c3;
|
||||
border-color: #7c7c7c;
|
||||
}
|
||||
.datepicker table tr td.range.disabled:hover,
|
||||
.datepicker table tr td.range[disabled]:hover,
|
||||
fieldset[disabled] .datepicker table tr td.range:hover,
|
||||
.datepicker table tr td.range.disabled:focus,
|
||||
.datepicker table tr td.range[disabled]:focus,
|
||||
fieldset[disabled] .datepicker table tr td.range:focus,
|
||||
.datepicker table tr td.range.disabled.focus,
|
||||
.datepicker table tr td.range[disabled].focus,
|
||||
fieldset[disabled] .datepicker table tr td.range.focus {
|
||||
background-color: #eeeeee;
|
||||
border-color: #bbbbbb;
|
||||
}
|
||||
.datepicker table tr td.range.focused {
|
||||
background: #d5d5d5;
|
||||
}
|
||||
.datepicker table tr td.range.disabled,
|
||||
.datepicker table tr td.range.disabled:active {
|
||||
background: #eeeeee;
|
||||
color: #777777;
|
||||
}
|
||||
.datepicker table tr td.range.highlighted {
|
||||
color: #000;
|
||||
background-color: #e4eef3;
|
||||
border-color: #9dc1d3;
|
||||
}
|
||||
.datepicker table tr td.range.highlighted:focus,
|
||||
.datepicker table tr td.range.highlighted.focus {
|
||||
color: #000;
|
||||
background-color: #c1d7e3;
|
||||
border-color: #4b88a6;
|
||||
}
|
||||
.datepicker table tr td.range.highlighted:hover {
|
||||
color: #000;
|
||||
background-color: #c1d7e3;
|
||||
border-color: #73a6c0;
|
||||
}
|
||||
.datepicker table tr td.range.highlighted:active,
|
||||
.datepicker table tr td.range.highlighted.active {
|
||||
color: #000;
|
||||
background-color: #c1d7e3;
|
||||
border-color: #73a6c0;
|
||||
}
|
||||
.datepicker table tr td.range.highlighted:active:hover,
|
||||
.datepicker table tr td.range.highlighted.active:hover,
|
||||
.datepicker table tr td.range.highlighted:active:focus,
|
||||
.datepicker table tr td.range.highlighted.active:focus,
|
||||
.datepicker table tr td.range.highlighted:active.focus,
|
||||
.datepicker table tr td.range.highlighted.active.focus {
|
||||
color: #000;
|
||||
background-color: #a8c8d8;
|
||||
border-color: #4b88a6;
|
||||
}
|
||||
.datepicker table tr td.range.highlighted.disabled:hover,
|
||||
.datepicker table tr td.range.highlighted[disabled]:hover,
|
||||
fieldset[disabled] .datepicker table tr td.range.highlighted:hover,
|
||||
.datepicker table tr td.range.highlighted.disabled:focus,
|
||||
.datepicker table tr td.range.highlighted[disabled]:focus,
|
||||
fieldset[disabled] .datepicker table tr td.range.highlighted:focus,
|
||||
.datepicker table tr td.range.highlighted.disabled.focus,
|
||||
.datepicker table tr td.range.highlighted[disabled].focus,
|
||||
fieldset[disabled] .datepicker table tr td.range.highlighted.focus {
|
||||
background-color: #e4eef3;
|
||||
border-color: #9dc1d3;
|
||||
}
|
||||
.datepicker table tr td.range.highlighted.focused {
|
||||
background: #c1d7e3;
|
||||
}
|
||||
.datepicker table tr td.range.highlighted.disabled,
|
||||
.datepicker table tr td.range.highlighted.disabled:active {
|
||||
background: #e4eef3;
|
||||
color: #777777;
|
||||
}
|
||||
.datepicker table tr td.range.today {
|
||||
color: #000;
|
||||
background-color: #f7ca77;
|
||||
border-color: #f1a417;
|
||||
}
|
||||
.datepicker table tr td.range.today:focus,
|
||||
.datepicker table tr td.range.today.focus {
|
||||
color: #000;
|
||||
background-color: #f4b747;
|
||||
border-color: #815608;
|
||||
}
|
||||
.datepicker table tr td.range.today:hover {
|
||||
color: #000;
|
||||
background-color: #f4b747;
|
||||
border-color: #bf800c;
|
||||
}
|
||||
.datepicker table tr td.range.today:active,
|
||||
.datepicker table tr td.range.today.active {
|
||||
color: #000;
|
||||
background-color: #f4b747;
|
||||
border-color: #bf800c;
|
||||
}
|
||||
.datepicker table tr td.range.today:active:hover,
|
||||
.datepicker table tr td.range.today.active:hover,
|
||||
.datepicker table tr td.range.today:active:focus,
|
||||
.datepicker table tr td.range.today.active:focus,
|
||||
.datepicker table tr td.range.today:active.focus,
|
||||
.datepicker table tr td.range.today.active.focus {
|
||||
color: #000;
|
||||
background-color: #f2aa25;
|
||||
border-color: #815608;
|
||||
}
|
||||
.datepicker table tr td.range.today.disabled:hover,
|
||||
.datepicker table tr td.range.today[disabled]:hover,
|
||||
fieldset[disabled] .datepicker table tr td.range.today:hover,
|
||||
.datepicker table tr td.range.today.disabled:focus,
|
||||
.datepicker table tr td.range.today[disabled]:focus,
|
||||
fieldset[disabled] .datepicker table tr td.range.today:focus,
|
||||
.datepicker table tr td.range.today.disabled.focus,
|
||||
.datepicker table tr td.range.today[disabled].focus,
|
||||
fieldset[disabled] .datepicker table tr td.range.today.focus {
|
||||
background-color: #f7ca77;
|
||||
border-color: #f1a417;
|
||||
}
|
||||
.datepicker table tr td.range.today.disabled,
|
||||
.datepicker table tr td.range.today.disabled:active {
|
||||
background: #f7ca77;
|
||||
color: #777777;
|
||||
}
|
||||
.datepicker table tr td.selected,
|
||||
.datepicker table tr td.selected.highlighted {
|
||||
color: #fff;
|
||||
background-color: #777777;
|
||||
border-color: #555555;
|
||||
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
|
||||
}
|
||||
.datepicker table tr td.selected:focus,
|
||||
.datepicker table tr td.selected.highlighted:focus,
|
||||
.datepicker table tr td.selected.focus,
|
||||
.datepicker table tr td.selected.highlighted.focus {
|
||||
color: #fff;
|
||||
background-color: #5e5e5e;
|
||||
border-color: #161616;
|
||||
}
|
||||
.datepicker table tr td.selected:hover,
|
||||
.datepicker table tr td.selected.highlighted:hover {
|
||||
color: #fff;
|
||||
background-color: #5e5e5e;
|
||||
border-color: #373737;
|
||||
}
|
||||
.datepicker table tr td.selected:active,
|
||||
.datepicker table tr td.selected.highlighted:active,
|
||||
.datepicker table tr td.selected.active,
|
||||
.datepicker table tr td.selected.highlighted.active {
|
||||
color: #fff;
|
||||
background-color: #5e5e5e;
|
||||
border-color: #373737;
|
||||
}
|
||||
.datepicker table tr td.selected:active:hover,
|
||||
.datepicker table tr td.selected.highlighted:active:hover,
|
||||
.datepicker table tr td.selected.active:hover,
|
||||
.datepicker table tr td.selected.highlighted.active:hover,
|
||||
.datepicker table tr td.selected:active:focus,
|
||||
.datepicker table tr td.selected.highlighted:active:focus,
|
||||
.datepicker table tr td.selected.active:focus,
|
||||
.datepicker table tr td.selected.highlighted.active:focus,
|
||||
.datepicker table tr td.selected:active.focus,
|
||||
.datepicker table tr td.selected.highlighted:active.focus,
|
||||
.datepicker table tr td.selected.active.focus,
|
||||
.datepicker table tr td.selected.highlighted.active.focus {
|
||||
color: #fff;
|
||||
background-color: #4c4c4c;
|
||||
border-color: #161616;
|
||||
}
|
||||
.datepicker table tr td.selected.disabled:hover,
|
||||
.datepicker table tr td.selected.highlighted.disabled:hover,
|
||||
.datepicker table tr td.selected[disabled]:hover,
|
||||
.datepicker table tr td.selected.highlighted[disabled]:hover,
|
||||
fieldset[disabled] .datepicker table tr td.selected:hover,
|
||||
fieldset[disabled] .datepicker table tr td.selected.highlighted:hover,
|
||||
.datepicker table tr td.selected.disabled:focus,
|
||||
.datepicker table tr td.selected.highlighted.disabled:focus,
|
||||
.datepicker table tr td.selected[disabled]:focus,
|
||||
.datepicker table tr td.selected.highlighted[disabled]:focus,
|
||||
fieldset[disabled] .datepicker table tr td.selected:focus,
|
||||
fieldset[disabled] .datepicker table tr td.selected.highlighted:focus,
|
||||
.datepicker table tr td.selected.disabled.focus,
|
||||
.datepicker table tr td.selected.highlighted.disabled.focus,
|
||||
.datepicker table tr td.selected[disabled].focus,
|
||||
.datepicker table tr td.selected.highlighted[disabled].focus,
|
||||
fieldset[disabled] .datepicker table tr td.selected.focus,
|
||||
fieldset[disabled] .datepicker table tr td.selected.highlighted.focus {
|
||||
background-color: #777777;
|
||||
border-color: #555555;
|
||||
}
|
||||
.datepicker table tr td.active,
|
||||
.datepicker table tr td.active.highlighted {
|
||||
color: #fff;
|
||||
background-color: #337ab7;
|
||||
border-color: #2e6da4;
|
||||
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
|
||||
}
|
||||
.datepicker table tr td.active:focus,
|
||||
.datepicker table tr td.active.highlighted:focus,
|
||||
.datepicker table tr td.active.focus,
|
||||
.datepicker table tr td.active.highlighted.focus {
|
||||
color: #fff;
|
||||
background-color: #286090;
|
||||
border-color: #122b40;
|
||||
}
|
||||
.datepicker table tr td.active:hover,
|
||||
.datepicker table tr td.active.highlighted:hover {
|
||||
color: #fff;
|
||||
background-color: #286090;
|
||||
border-color: #204d74;
|
||||
}
|
||||
.datepicker table tr td.active:active,
|
||||
.datepicker table tr td.active.highlighted:active,
|
||||
.datepicker table tr td.active.active,
|
||||
.datepicker table tr td.active.highlighted.active {
|
||||
color: #fff;
|
||||
background-color: #286090;
|
||||
border-color: #204d74;
|
||||
}
|
||||
.datepicker table tr td.active:active:hover,
|
||||
.datepicker table tr td.active.highlighted:active:hover,
|
||||
.datepicker table tr td.active.active:hover,
|
||||
.datepicker table tr td.active.highlighted.active:hover,
|
||||
.datepicker table tr td.active:active:focus,
|
||||
.datepicker table tr td.active.highlighted:active:focus,
|
||||
.datepicker table tr td.active.active:focus,
|
||||
.datepicker table tr td.active.highlighted.active:focus,
|
||||
.datepicker table tr td.active:active.focus,
|
||||
.datepicker table tr td.active.highlighted:active.focus,
|
||||
.datepicker table tr td.active.active.focus,
|
||||
.datepicker table tr td.active.highlighted.active.focus {
|
||||
color: #fff;
|
||||
background-color: #204d74;
|
||||
border-color: #122b40;
|
||||
}
|
||||
.datepicker table tr td.active.disabled:hover,
|
||||
.datepicker table tr td.active.highlighted.disabled:hover,
|
||||
.datepicker table tr td.active[disabled]:hover,
|
||||
.datepicker table tr td.active.highlighted[disabled]:hover,
|
||||
fieldset[disabled] .datepicker table tr td.active:hover,
|
||||
fieldset[disabled] .datepicker table tr td.active.highlighted:hover,
|
||||
.datepicker table tr td.active.disabled:focus,
|
||||
.datepicker table tr td.active.highlighted.disabled:focus,
|
||||
.datepicker table tr td.active[disabled]:focus,
|
||||
.datepicker table tr td.active.highlighted[disabled]:focus,
|
||||
fieldset[disabled] .datepicker table tr td.active:focus,
|
||||
fieldset[disabled] .datepicker table tr td.active.highlighted:focus,
|
||||
.datepicker table tr td.active.disabled.focus,
|
||||
.datepicker table tr td.active.highlighted.disabled.focus,
|
||||
.datepicker table tr td.active[disabled].focus,
|
||||
.datepicker table tr td.active.highlighted[disabled].focus,
|
||||
fieldset[disabled] .datepicker table tr td.active.focus,
|
||||
fieldset[disabled] .datepicker table tr td.active.highlighted.focus {
|
||||
background-color: #337ab7;
|
||||
border-color: #2e6da4;
|
||||
}
|
||||
.datepicker table tr td span {
|
||||
display: block;
|
||||
width: 23%;
|
||||
height: 54px;
|
||||
line-height: 54px;
|
||||
float: left;
|
||||
margin: 1%;
|
||||
cursor: pointer;
|
||||
border-radius: 4px;
|
||||
}
|
||||
.datepicker table tr td span:hover,
|
||||
.datepicker table tr td span.focused {
|
||||
background: #eeeeee;
|
||||
}
|
||||
.datepicker table tr td span.disabled,
|
||||
.datepicker table tr td span.disabled:hover {
|
||||
background: none;
|
||||
color: #777777;
|
||||
cursor: default;
|
||||
}
|
||||
.datepicker table tr td span.active,
|
||||
.datepicker table tr td span.active:hover,
|
||||
.datepicker table tr td span.active.disabled,
|
||||
.datepicker table tr td span.active.disabled:hover {
|
||||
color: #fff;
|
||||
background-color: #337ab7;
|
||||
border-color: #2e6da4;
|
||||
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
|
||||
}
|
||||
.datepicker table tr td span.active:focus,
|
||||
.datepicker table tr td span.active:hover:focus,
|
||||
.datepicker table tr td span.active.disabled:focus,
|
||||
.datepicker table tr td span.active.disabled:hover:focus,
|
||||
.datepicker table tr td span.active.focus,
|
||||
.datepicker table tr td span.active:hover.focus,
|
||||
.datepicker table tr td span.active.disabled.focus,
|
||||
.datepicker table tr td span.active.disabled:hover.focus {
|
||||
color: #fff;
|
||||
background-color: #286090;
|
||||
border-color: #122b40;
|
||||
}
|
||||
.datepicker table tr td span.active:hover,
|
||||
.datepicker table tr td span.active:hover:hover,
|
||||
.datepicker table tr td span.active.disabled:hover,
|
||||
.datepicker table tr td span.active.disabled:hover:hover {
|
||||
color: #fff;
|
||||
background-color: #286090;
|
||||
border-color: #204d74;
|
||||
}
|
||||
.datepicker table tr td span.active:active,
|
||||
.datepicker table tr td span.active:hover:active,
|
||||
.datepicker table tr td span.active.disabled:active,
|
||||
.datepicker table tr td span.active.disabled:hover:active,
|
||||
.datepicker table tr td span.active.active,
|
||||
.datepicker table tr td span.active:hover.active,
|
||||
.datepicker table tr td span.active.disabled.active,
|
||||
.datepicker table tr td span.active.disabled:hover.active {
|
||||
color: #fff;
|
||||
background-color: #286090;
|
||||
border-color: #204d74;
|
||||
}
|
||||
.datepicker table tr td span.active:active:hover,
|
||||
.datepicker table tr td span.active:hover:active:hover,
|
||||
.datepicker table tr td span.active.disabled:active:hover,
|
||||
.datepicker table tr td span.active.disabled:hover:active:hover,
|
||||
.datepicker table tr td span.active.active:hover,
|
||||
.datepicker table tr td span.active:hover.active:hover,
|
||||
.datepicker table tr td span.active.disabled.active:hover,
|
||||
.datepicker table tr td span.active.disabled:hover.active:hover,
|
||||
.datepicker table tr td span.active:active:focus,
|
||||
.datepicker table tr td span.active:hover:active:focus,
|
||||
.datepicker table tr td span.active.disabled:active:focus,
|
||||
.datepicker table tr td span.active.disabled:hover:active:focus,
|
||||
.datepicker table tr td span.active.active:focus,
|
||||
.datepicker table tr td span.active:hover.active:focus,
|
||||
.datepicker table tr td span.active.disabled.active:focus,
|
||||
.datepicker table tr td span.active.disabled:hover.active:focus,
|
||||
.datepicker table tr td span.active:active.focus,
|
||||
.datepicker table tr td span.active:hover:active.focus,
|
||||
.datepicker table tr td span.active.disabled:active.focus,
|
||||
.datepicker table tr td span.active.disabled:hover:active.focus,
|
||||
.datepicker table tr td span.active.active.focus,
|
||||
.datepicker table tr td span.active:hover.active.focus,
|
||||
.datepicker table tr td span.active.disabled.active.focus,
|
||||
.datepicker table tr td span.active.disabled:hover.active.focus {
|
||||
color: #fff;
|
||||
background-color: #204d74;
|
||||
border-color: #122b40;
|
||||
}
|
||||
.datepicker table tr td span.active.disabled:hover,
|
||||
.datepicker table tr td span.active:hover.disabled:hover,
|
||||
.datepicker table tr td span.active.disabled.disabled:hover,
|
||||
.datepicker table tr td span.active.disabled:hover.disabled:hover,
|
||||
.datepicker table tr td span.active[disabled]:hover,
|
||||
.datepicker table tr td span.active:hover[disabled]:hover,
|
||||
.datepicker table tr td span.active.disabled[disabled]:hover,
|
||||
.datepicker table tr td span.active.disabled:hover[disabled]:hover,
|
||||
fieldset[disabled] .datepicker table tr td span.active:hover,
|
||||
fieldset[disabled] .datepicker table tr td span.active:hover:hover,
|
||||
fieldset[disabled] .datepicker table tr td span.active.disabled:hover,
|
||||
fieldset[disabled] .datepicker table tr td span.active.disabled:hover:hover,
|
||||
.datepicker table tr td span.active.disabled:focus,
|
||||
.datepicker table tr td span.active:hover.disabled:focus,
|
||||
.datepicker table tr td span.active.disabled.disabled:focus,
|
||||
.datepicker table tr td span.active.disabled:hover.disabled:focus,
|
||||
.datepicker table tr td span.active[disabled]:focus,
|
||||
.datepicker table tr td span.active:hover[disabled]:focus,
|
||||
.datepicker table tr td span.active.disabled[disabled]:focus,
|
||||
.datepicker table tr td span.active.disabled:hover[disabled]:focus,
|
||||
fieldset[disabled] .datepicker table tr td span.active:focus,
|
||||
fieldset[disabled] .datepicker table tr td span.active:hover:focus,
|
||||
fieldset[disabled] .datepicker table tr td span.active.disabled:focus,
|
||||
fieldset[disabled] .datepicker table tr td span.active.disabled:hover:focus,
|
||||
.datepicker table tr td span.active.disabled.focus,
|
||||
.datepicker table tr td span.active:hover.disabled.focus,
|
||||
.datepicker table tr td span.active.disabled.disabled.focus,
|
||||
.datepicker table tr td span.active.disabled:hover.disabled.focus,
|
||||
.datepicker table tr td span.active[disabled].focus,
|
||||
.datepicker table tr td span.active:hover[disabled].focus,
|
||||
.datepicker table tr td span.active.disabled[disabled].focus,
|
||||
.datepicker table tr td span.active.disabled:hover[disabled].focus,
|
||||
fieldset[disabled] .datepicker table tr td span.active.focus,
|
||||
fieldset[disabled] .datepicker table tr td span.active:hover.focus,
|
||||
fieldset[disabled] .datepicker table tr td span.active.disabled.focus,
|
||||
fieldset[disabled] .datepicker table tr td span.active.disabled:hover.focus {
|
||||
background-color: #337ab7;
|
||||
border-color: #2e6da4;
|
||||
}
|
||||
.datepicker table tr td span.old,
|
||||
.datepicker table tr td span.new {
|
||||
color: #777777;
|
||||
}
|
||||
.datepicker .datepicker-switch {
|
||||
width: 145px;
|
||||
}
|
||||
.datepicker .datepicker-switch,
|
||||
.datepicker .prev,
|
||||
.datepicker .next,
|
||||
.datepicker tfoot tr th {
|
||||
cursor: pointer;
|
||||
}
|
||||
.datepicker .datepicker-switch:hover,
|
||||
.datepicker .prev:hover,
|
||||
.datepicker .next:hover,
|
||||
.datepicker tfoot tr th:hover {
|
||||
background: #eeeeee;
|
||||
}
|
||||
.datepicker .cw {
|
||||
font-size: 10px;
|
||||
width: 12px;
|
||||
padding: 0 2px 0 5px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
.input-group.date .input-group-addon {
|
||||
cursor: pointer;
|
||||
}
|
||||
.input-daterange {
|
||||
width: 100%;
|
||||
}
|
||||
.input-daterange input {
|
||||
text-align: center;
|
||||
}
|
||||
.input-daterange input:first-child {
|
||||
border-radius: 3px 0 0 3px;
|
||||
}
|
||||
.input-daterange input:last-child {
|
||||
border-radius: 0 3px 3px 0;
|
||||
}
|
||||
.input-daterange .input-group-addon {
|
||||
width: auto;
|
||||
min-width: 16px;
|
||||
padding: 4px 5px;
|
||||
line-height: 1.42857143;
|
||||
text-shadow: 0 1px 0 #fff;
|
||||
border-width: 1px 0;
|
||||
margin-left: -5px;
|
||||
margin-right: -5px;
|
||||
}
|
||||
.datepicker.dropdown-menu {
|
||||
position: absolute;
|
||||
top: 100%;
|
||||
left: 0;
|
||||
z-index: 1000;
|
||||
display: none;
|
||||
float: left;
|
||||
min-width: 160px;
|
||||
list-style: none;
|
||||
background-color: #fff;
|
||||
border: 1px solid #ccc;
|
||||
border: 1px solid rgba(0, 0, 0, 0.15);
|
||||
border-radius: 4px;
|
||||
-webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
|
||||
-moz-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
|
||||
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
|
||||
-webkit-background-clip: padding-box;
|
||||
-moz-background-clip: padding;
|
||||
background-clip: padding-box;
|
||||
color: #333333;
|
||||
font-size: 13px;
|
||||
line-height: 1.42857143;
|
||||
}
|
||||
.datepicker.dropdown-menu th,
|
||||
.datepicker.datepicker-inline th,
|
||||
.datepicker.dropdown-menu td,
|
||||
.datepicker.datepicker-inline td {
|
||||
padding: 0px 5px;
|
||||
}
|
||||
/*# sourceMappingURL=bootstrap-datepicker3.standalone.css.map */
|
6
sources/budget/static/css/bootstrap.min.css
vendored
|
@ -1,249 +0,0 @@
|
|||
@import "bootstrap.min.css";
|
||||
@import "bootstrap-datepicker3.standalone.css";
|
||||
@import "../fonts/fontfaces.css";
|
||||
|
||||
/* General */
|
||||
|
||||
body {
|
||||
/* For fixed navbar */
|
||||
padding-top: 3.5rem;
|
||||
padding-bottom: 2rem;
|
||||
}
|
||||
|
||||
/* Navbar */
|
||||
|
||||
.navbar h1 {
|
||||
font-size: 1rem;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
.navbar .primary-nav { padding-left: 75px; }
|
||||
.navbar .secondary-nav {
|
||||
text-align: right;
|
||||
flex-direction: row-reverse;
|
||||
|
||||
}
|
||||
.navbar-brand{ font-family: 'Lobster', arial, serif; }
|
||||
|
||||
/* Header */
|
||||
|
||||
#header {
|
||||
padding-bottom: 2em;
|
||||
margin-bottom: 1em;
|
||||
background-color: #ABE128;
|
||||
background-image: url("../images/gradient.png");
|
||||
background-position: center top;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
|
||||
#header h2 {
|
||||
font-family: 'Comfortaa', arial, serif;
|
||||
margin-top: 1em;
|
||||
margin-bottom: 0.5em;
|
||||
color: #000;
|
||||
font-size: 2.4em;
|
||||
}
|
||||
|
||||
#header .tryout {
|
||||
margin-right: 10em;
|
||||
color: #fff;
|
||||
background-color: #414141;
|
||||
border-color: #414141;
|
||||
}
|
||||
|
||||
#header .tryout:hover {
|
||||
background-color: #606060;
|
||||
border-color: #606060;
|
||||
}
|
||||
|
||||
#header .additional-content {
|
||||
margin-top: 5em;
|
||||
font-family: 'Comfortaa', arial, serif;
|
||||
color: #000;
|
||||
}
|
||||
|
||||
/* Sidebar */
|
||||
|
||||
.balance tr td { font-weight: bold; }
|
||||
.positive { color: green; }
|
||||
.negative { color: red; }
|
||||
|
||||
.sidebar {
|
||||
background-color: #ABE128;
|
||||
background-position: center bottom;
|
||||
background-repeat: no-repeat;
|
||||
height: 100%;
|
||||
color: black;
|
||||
position: fixed;
|
||||
}
|
||||
|
||||
#add-member-form { padding-top: 1em; padding-bottom: 1em; }
|
||||
#add-member-form input[type="text"] { width: 60%; }
|
||||
|
||||
#table_overflow { overflow-y: auto; overflow-x: hidden;}
|
||||
|
||||
|
||||
/* Content */
|
||||
|
||||
.content {
|
||||
margin-top: 1rem;
|
||||
}
|
||||
|
||||
/* Home */
|
||||
|
||||
#authentication-form legend {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
/* Other */
|
||||
|
||||
#bills { color: black; }
|
||||
|
||||
.invites textarea{
|
||||
width: 800px;
|
||||
height: 100px;
|
||||
}
|
||||
|
||||
footer{
|
||||
margin-left: -15px;
|
||||
margin-right: -15px;
|
||||
margin-top: 30px;
|
||||
position: fixed;
|
||||
bottom: 0px;
|
||||
height: 20px;
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
background-color: #fff;
|
||||
opacity: 0.8;
|
||||
}
|
||||
|
||||
.identifier{
|
||||
float: right;
|
||||
}
|
||||
|
||||
#new-bill, .identifier {
|
||||
margin-top: 16px;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
/* Avoid text color flickering when it loose focus as the modal appears */
|
||||
.btn-primary[data-toggle="modal"] {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.password-reminder{
|
||||
float: right;
|
||||
margin-right: 20px;
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
.confirm, .confirm:hover {
|
||||
color: red;
|
||||
}
|
||||
|
||||
.bill-actions {
|
||||
padding-top: 10px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.bill-actions > .delete, .bill-actions > .edit {
|
||||
font-size: 0px;
|
||||
display: block;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
margin: 2px;
|
||||
margin-left: 5px;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.bill-actions > .delete{
|
||||
background: url('../images/delete.png') no-repeat right;
|
||||
}
|
||||
|
||||
.bill-actions > .edit{
|
||||
background: url('../images/edit.png') no-repeat right;
|
||||
}
|
||||
|
||||
.balance .balance-value{
|
||||
text-align:right;
|
||||
}
|
||||
|
||||
#sidebar .balance tr:hover td {
|
||||
background-color: #9BD118;
|
||||
}
|
||||
|
||||
tr.ower_line {
|
||||
background-color: #CBEF68;
|
||||
}
|
||||
|
||||
tr.payer_line .balance-name{
|
||||
color:green;
|
||||
text-indent:5px;
|
||||
}
|
||||
|
||||
.action {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.action button, .action button:hover {
|
||||
border-width: 0;
|
||||
width: auto;
|
||||
margin: 0;
|
||||
padding: 0 0 0 20px;
|
||||
}
|
||||
|
||||
.delete button, .delete button:hover {
|
||||
background: url('../images/deleter.png') left no-repeat;
|
||||
color: red;
|
||||
}
|
||||
|
||||
.edit button, .edit button:hover {
|
||||
background: url('../images/edit.png') left no-repeat;
|
||||
|
||||
}
|
||||
|
||||
.reactivate button, .reactivate button:hover {
|
||||
background: url('../images/reactivate.png') left no-repeat;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.balance.table {
|
||||
table-layout: fixed;
|
||||
}
|
||||
|
||||
#bill-form > fieldset {
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.flash {
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
.light {
|
||||
opacity: 0.3;
|
||||
}
|
||||
|
||||
.extra-info {
|
||||
display: none;
|
||||
}
|
||||
|
||||
tr:hover .extra-info {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
/* Fluid Offsets for Boostrap */
|
||||
|
||||
.row-fluid > [class*="span"]:not([class*="offset"]):first-child{margin-left:0;}
|
||||
.row-fluid > .offset12{margin-left:100%;}
|
||||
.row-fluid > .offset11{margin-left:93.5%;}
|
||||
.row-fluid > .offset10{margin-left:85%;}
|
||||
.row-fluid > .offset9{margin-left:76.5%;}
|
||||
.row-fluid > .offset8{margin-left:68%;}
|
||||
.row-fluid > .offset7{margin-left:59.5%;}
|
||||
.row-fluid > .offset6{margin-left:51%;}
|
||||
.row-fluid > .offset5{margin-left:42.5%;}
|
||||
.row-fluid > .offset4{margin-left:34%;}
|
||||
.row-fluid > .offset3{margin-left:25.5%;}
|
||||
.row-fluid > .offset2{margin-left:17%;}
|
||||
.row-fluid > .offset1{margin-left:8.5%;}
|
|
@ -1,95 +0,0 @@
|
|||
Copyright (c) 2010, Pablo Impallari (www.impallari.com|impallari@gmail.com),
|
||||
Copyright (c) 2010, 2011, Alexei Vanyashin (www.cyreal.org|a@cyreal.org),
|
||||
with Reserved Font Name Lobster.
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
http://scripts.sil.org/OFL
|
||||
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font creation
|
||||
efforts of academic and linguistic communities, and to provide a free and
|
||||
open framework in which fonts may be shared and improved in partnership
|
||||
with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply
|
||||
to any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting -- in part or in whole -- any of the components of the
|
||||
Original Version, by changing formats or by porting the Font Software to a
|
||||
new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components,
|
||||
in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the corresponding
|
||||
Copyright Holder. This restriction only applies to the primary font name as
|
||||
presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created
|
||||
using the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
|
@ -1,253 +0,0 @@
|
|||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg">
|
||||
<metadata>
|
||||
This is a custom SVG webfont generated by Font Squirrel.
|
||||
Copyright : Copyright c 20072010 Johan Aakerlund aajohangmailcom with Reserved Font Name Comfortaa This Font Software is licensed under the SIL Open Font License Version 11 httpscriptssilorgOFL
|
||||
Designer : Johan Aakerlund aajohan
|
||||
Foundry : Johan Aakerlund
|
||||
</metadata>
|
||||
<defs>
|
||||
<font id="ComfortaaRegular" horiz-adv-x="1280" >
|
||||
<font-face units-per-em="2048" ascent="1638" descent="-410" />
|
||||
<missing-glyph horiz-adv-x="560" />
|
||||
<glyph unicode=" " horiz-adv-x="560" />
|
||||
<glyph unicode="	" horiz-adv-x="560" />
|
||||
<glyph unicode=" " horiz-adv-x="560" />
|
||||
<glyph unicode="!" horiz-adv-x="400" d="M80 120q0 50 35 85t85 35t85 -35t35 -85t-35 -85t-85 -35t-85 35t-35 85zM120 399v1121q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-1121q0 -32 -23 -55q-24 -24 -57 -24t-56 24q-24 23 -24 55z" />
|
||||
<glyph unicode=""" horiz-adv-x="560" d="M80 1512v8q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-8l-20 -292q0 -25 -17.5 -42.5t-42.5 -17.5t-42.5 17.5t-17.5 42.5zM320 1512v8q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-8l-20 -292q0 -25 -17.5 -42.5t-42.5 -17.5t-42.5 17.5t-17.5 42.5z" />
|
||||
<glyph unicode="#" d="M73 545q0 7 1 15q6 33 33.5 56.5t60.5 23.5h160l56 320h-160q-33 0 -52 23.5t-14 56.5q6 33 34 56.5t61 23.5h160l70 400q6 33 33.5 56.5t60.5 23.5t52.5 -23.5t13.5 -56.5l-70 -400h240l70 400q6 33 33.5 56.5t60.5 23.5t52.5 -23.5t13.5 -56.5l-70 -400h160 q33 0 52 -23q14 -18 14 -42q0 -7 -1 -15q-5 -33 -33 -56.5t-61 -23.5h-160l-56 -320h160q33 0 52.5 -23.5t13.5 -56.5t-33.5 -56.5t-60.5 -23.5h-160l-71 -400q-6 -33 -33.5 -56.5t-60.5 -23.5t-52.5 23.5t-13.5 56.5l71 400h-240l-71 -400q-6 -33 -33.5 -56.5t-60.5 -23.5 t-52.5 23.5t-13.5 56.5l71 400h-160q-33 0 -52 24q-15 17 -15 41zM488 640h240l56 320h-240z" />
|
||||
<glyph unicode="$" horiz-adv-x="1060" d="M80 267q0 33 23.5 56.5t56.5 23.5q43 0 68 -37q12 -19 28 -36q85 -102 224 -113v644q-134 26 -226 134q-107 126 -94 292q14 165 140 272q82 69 180 88v89q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-90q133 -26 224 -133q22 -26 39 -54q12 -19 12 -43 q0 -33 -23.5 -56.5t-56.5 -23.5t-56 24q-9 8 -14 17q-10 16 -23 32q-44 51 -102 71v-484q132 -38 227 -149q113 -134 113 -304q0 -23 -2 -46q-16 -198 -167 -326q-79 -67 -171 -95v-100q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v81q-10 0 -20 1 q-198 16 -326 168q-21 23 -38 49q-16 21 -16 48zM320 1218q-8 -99 57 -175q43 -52 103 -72v454q-41 -14 -76 -44q-76 -65 -84 -163zM640 192q35 17 67 45q101 85 112 217q11 133 -74 234q-46 53 -105 81v-577z" />
|
||||
<glyph unicode="%" horiz-adv-x="1760" d="M80 1200q0 166 117 283t283 117t283 -117t117 -283t-117 -283t-283 -117t-283 117t-117 283zM240 80q0 31 20 54l1115 1433q28 33 65 33q33 0 56.5 -23.5t23.5 -56.5q0 -27 -16 -48l-1123 -1445q-28 -27 -61 -27t-56.5 23.5t-23.5 56.5zM240 1200q0 -99 70.5 -169.5 t169.5 -70.5t169.5 70.5t70.5 169.5t-70.5 169.5t-169.5 70.5t-169.5 -70.5t-70.5 -169.5zM880 400q0 166 117 283t283 117t283 -117t117 -283t-117 -283t-283 -117t-283 117t-117 283zM1040 400q0 -99 70.5 -169.5t169.5 -70.5t169.5 70.5t70.5 169.5t-70.5 169.5 t-169.5 70.5t-169.5 -70.5t-70.5 -169.5z" />
|
||||
<glyph unicode="&" horiz-adv-x="1440" d="M80 460q0 182 189 331l106 83l-110 111q-105 106 -105 255t105.5 254.5t254.5 105.5t254.5 -105.5t105.5 -254.5q0 -159 -146 -285l-121 -92l354 -355l177 189q23 23 56 23t56.5 -23.5t23.5 -56.5q0 -31 -20 -54l-180 -191l258 -261q22 -22 22 -54q0 -33 -23.5 -56.5 t-56.5 -23.5q-32 0 -56 22l-254 255l-139 -148q-129 -129 -311 -129t-311 129t-129 331zM240 460q0 -136 82 -218t198 -82t198 82l139 149l-372 373l-113 -86q-132 -102 -132 -218zM320 1240q0 -83 58 -141l124 -125l119 94q99 79 99 172q0 83 -58.5 141.5t-141.5 58.5 t-141.5 -58.5t-58.5 -141.5z" />
|
||||
<glyph unicode="'" horiz-adv-x="320" d="M80 1512v8q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-8l-20 -292q0 -25 -17.5 -42.5t-42.5 -17.5t-42.5 17.5t-17.5 42.5z" />
|
||||
<glyph unicode="(" horiz-adv-x="560" d="M80 562q0 493 243 985q6 16 19 30q24 23 57 23t56.5 -23.5t23.5 -56.5q-2 -24 -13 -43q-228 -458 -228 -916q0 -460 230 -920q11 -18 11 -41q0 -33 -23.5 -56.5t-56.5 -23.5t-57 24q-12 14 -19 30q-243 495 -243 988z" />
|
||||
<glyph unicode=")" horiz-adv-x="560" d="M80 -400q0 23 11 41q230 460 230 920q0 458 -228 916q-11 19 -13 43q0 33 23.5 56.5t56.5 23.5t57 -23q13 -14 19 -30q244 -492 244 -985t-244 -988q-8 -16 -19 -30q-24 -24 -57 -24t-56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="*" horiz-adv-x="780" d="M85 1360q0 13 5 26q11 32 41 46t61 3q14 -5 24 -13l157 -117l-58 188q-4 13 -4 27q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5q0 -14 -4 -27l-58 -189l158 118q11 8 24 13q31 11 61 -3t41 -46q5 -14 5 -27q0 -17 -8 -34q-14 -30 -45 -41q-14 -4 -27 -5l-196 -8 l161 -112q11 -7 20 -19q20 -26 16 -59t-30 -53q-22 -17 -59 -16q-33 4 -53 30q-9 11 -13 24l-72 181l-73 -181q-4 -13 -13 -24q-20 -31 -64 -31q-26 0 -48 17q-26 20 -30 53t16 59q9 12 20 19l161 112l-195 8q-14 1 -27 5q-31 11 -45 41q-9 17 -9 35z" />
|
||||
<glyph unicode="+" horiz-adv-x="1120" d="M80 800q0 33 23.5 56.5t56.5 23.5h320v320q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-320h320q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-320v-320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v320h-320q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="," horiz-adv-x="400" d="M80 120q0 50 35 85t85 35t85 -35t35 -85q0 -196 -87 -328q-18 -32 -53 -32q-25 0 -42.5 17.5t-17.5 42.5t17 42q70 78 -22 173q-35 35 -35 85z" />
|
||||
<glyph unicode="-" horiz-adv-x="800" d="M80 560q0 33 23.5 56.5t56.5 23.5h480q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-480q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="." horiz-adv-x="400" d="M80 120q0 50 35 85t85 35t85 -35t35 -85t-35 -85t-85 -35t-85 35t-35 85z" />
|
||||
<glyph unicode="/" horiz-adv-x="960" d="M80 -80q0 18 7 34l640 1600q6 12 17 23q23 23 56 23t56.5 -23.5t23.5 -56.5q0 -18 -7 -34l-640 -1600q-6 -12 -16 -22q-24 -24 -57 -24t-56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="0" horiz-adv-x="1120" d="M80 800q0 480 197 683q117 117 283 117t283 -117q197 -203 197 -683t-197 -683q-117 -117 -283 -117t-283 117q-197 203 -197 683zM240 800q0 -400 150 -569q71 -71 170 -71t170 71q150 169 150 569t-150 569q-71 71 -170 71t-170 -71q-150 -169 -150 -569z" />
|
||||
<glyph unicode="1" horiz-adv-x="560" d="M80 1440q0 33 24 57q12 12 27 18l240 80q13 5 29 5q33 0 56.5 -23.5t23.5 -56.5v-1440q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v1329l-129 -43q-15 -6 -31 -6q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="2" horiz-adv-x="1120" d="M80 80q0 33 23 57l683 756q94 94 94 227t-93.5 226.5t-226.5 93.5t-226.5 -93.5t-93.5 -226.5q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5q0 199 140.5 339.5t339.5 140.5t339.5 -140.5t140.5 -339.5t-141 -340l-558 -620h619q33 0 56.5 -23.5t23.5 -56.5 t-23.5 -56.5t-56.5 -23.5h-800q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="3" horiz-adv-x="1120" d="M80 480q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5t93.5 226.5t-93.5 226.5t-226.5 93.5q-33 0 -56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5q99 0 169.5 70.5t70.5 169.5t-70.5 169.5t-169.5 70.5t-169.5 -70.5 t-70.5 -169.5q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5q0 166 117 283t283 117t283 -117t117 -283q0 -176 -147 -311q46 -29 87 -69q140 -141 140 -340t-140.5 -339.5t-339.5 -140.5t-339.5 140.5t-140.5 339.5z" />
|
||||
<glyph unicode="4" d="M80 480q0 26 15 47l720 1040q22 33 65 33q33 0 56.5 -23.5t23.5 -56.5v-960h160q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-160v-320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v320h-640q-33 0 -56.5 23.5t-23.5 56.5zM313 560h487v704z" />
|
||||
<glyph unicode="5" horiz-adv-x="1200" d="M80 520q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5q0 -149 105.5 -254.5t254.5 -105.5t254.5 105.5t105.5 254.5t-105.5 254.5t-254.5 105.5h-360q-33 0 -56.5 23.5t-23.5 56.5v560q0 33 23.5 56.5t56.5 23.5h720q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5 t-56.5 -23.5h-640v-400h280q215 0 367.5 -152.5t152.5 -367.5t-152.5 -367.5t-367.5 -152.5t-367.5 152.5t-152.5 367.5z" />
|
||||
<glyph unicode="6" horiz-adv-x="1120" d="M80 480q0 147 77 262l491 814q6 11 16 21q23 23 56 23t56.5 -23.5t23.5 -56.5q0 -23 -11 -41l-318 -527q43 8 89 8q199 0 339.5 -140.5t140.5 -339.5t-140.5 -339.5t-339.5 -140.5t-339.5 140.5t-140.5 339.5zM240 480q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5 t93.5 226.5t-93.5 226.5t-226.5 93.5t-226.5 -93.5t-93.5 -226.5z" />
|
||||
<glyph unicode="7" horiz-adv-x="1120" d="M80 80q0 24 16 48l729 1312h-665q-33 0 -56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5h800q33 0 56.5 -23.5t23.5 -56.5q0 -24 -12 -43l-796 -1432q-7 -13 -15 -21q-24 -24 -57 -24t-56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="8" horiz-adv-x="1120" d="M80 480q0 199 141 340q40 40 86 69q-15 13 -30 28q-117 117 -117 283t117 283t283 117t283 -117t117 -283t-117 -283q-15 -15 -30 -28q46 -29 87 -69q140 -141 140 -340t-140.5 -339.5t-339.5 -140.5t-339.5 140.5t-140.5 339.5zM240 480q0 -133 93.5 -226.5t226.5 -93.5 t226.5 93.5t93.5 226.5t-93.5 226.5t-226.5 93.5t-226.5 -93.5t-93.5 -226.5zM320 1200q0 -99 70.5 -169.5t169.5 -70.5t169.5 70.5t70.5 169.5t-70.5 169.5t-169.5 70.5t-169.5 -70.5t-70.5 -169.5z" />
|
||||
<glyph unicode="9" horiz-adv-x="1120" d="M80 1120q0 199 140.5 339.5t339.5 140.5t339.5 -140.5t140.5 -339.5q0 -147 -77 -262l-491 -814q-6 -11 -15 -20q-24 -24 -57 -24t-56.5 23.5t-23.5 56.5q0 23 11 41l318 527q-43 -8 -89 -8q-199 0 -339.5 140.5t-140.5 339.5zM240 1120q0 -133 93.5 -226.5t226.5 -93.5 t226.5 93.5t93.5 226.5t-93.5 226.5t-226.5 93.5t-226.5 -93.5t-93.5 -226.5z" />
|
||||
<glyph unicode=":" horiz-adv-x="400" d="M80 120q0 50 35 85t85 35t85 -35t35 -85t-35 -85t-85 -35t-85 35t-35 85zM80 1001q0 50 35 85t85 35t85 -35t35 -85t-35 -85t-85 -35t-85 35t-35 85z" />
|
||||
<glyph unicode=";" horiz-adv-x="400" d="M80 120q0 50 35 85t85 35t85 -35t35 -85q0 -196 -87 -328q-22 -32 -53 -32q-25 0 -42.5 17.5t-17.5 42.5t17 42q70 78 -22 173q-35 35 -35 85zM80 1001q0 50 35 85t85 35t85 -35t35 -85t-35 -85t-85 -35t-85 35t-35 85z" />
|
||||
<glyph unicode=";" horiz-adv-x="400" d="M80 120q0 50 35 85t85 35t85 -35t35 -85q0 -196 -87 -328q-22 -32 -53 -32q-25 0 -42.5 17.5t-17.5 42.5t17 42q70 78 -22 173q-35 35 -35 85zM80 1001q0 50 35 85t85 35t85 -35t35 -85t-35 -85t-85 -35t-85 35t-35 85z" />
|
||||
<glyph unicode="<" horiz-adv-x="1120" d="M80 720q0 44 44 72l796 478q18 10 40 10q33 0 56.5 -23.5t23.5 -56.5q0 -43 -41 -70l-684 -410l684 -410q41 -27 41 -70q0 -33 -23.5 -56.5t-56.5 -23.5q-22 0 -40 10l-796 478q-44 28 -44 72z" />
|
||||
<glyph unicode="=" horiz-adv-x="1040" d="M80 480q0 33 23.5 56.5t56.5 23.5h720q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -24.5h-720q-33 1 -56.5 24.5t-23.5 56.5zM80 960q0 33 23.5 56.5t56.5 23.5h720q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-720q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode=">" horiz-adv-x="1120" d="M80 240q0 43 41 70l684 410l-684 410q-41 27 -41 70q0 33 23.5 56.5t56.5 23.5q22 0 40 -10l796 -478q44 -28 44 -72t-44 -72l-796 -478q-18 -10 -40 -10q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="?" horiz-adv-x="1120" d="M80 1120q0 199 140.5 339.5t339.5 140.5t339.5 -140.5t140.5 -339.5t-141 -340l-165 -153q-94 -94 -94 -227q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5q0 199 141 340l165 153q94 94 94 227t-93.5 226.5t-226.5 93.5t-226.5 -93.5t-93.5 -226.5 q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM440 120q0 50 35 85t85 35t85 -35t35 -85t-35 -85t-85 -35t-85 35t-35 85z" />
|
||||
<glyph unicode="@" horiz-adv-x="2240" d="M80 560q0 431 304.5 735.5t735.5 304.5t735.5 -304.5t304.5 -735.5q0 -640 -400 -640q-240 0 -240 247q-168 -167 -400 -167t-396 164t-164 396t164 396t396 164t396 -164t164 -396v-400q0 -80 80 -80q240 0 240 480q0 365 -257.5 622.5t-622.5 257.5t-622.5 -257.5 t-257.5 -622.5t257.5 -622.5t622.5 -257.5q196 0 362 74q18 11 40 11q33 0 56.5 -23.5t23.5 -56.5t-23 -56q-13 -13 -28 -19q-197 -90 -431 -90q-431 0 -735.5 304.5t-304.5 735.5zM720 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117 t-117 -283z" />
|
||||
<glyph unicode="A" horiz-adv-x="1440" d="M80 80q0 19 7 34l556 1430q6 18 21 33q23 23 56 23t57 -23q14 -15 20 -33l556 -1430q7 -15 7 -34q0 -33 -23.5 -56.5t-56.5 -23.5t-56 23q-12 12 -18 26l-199 511h-574l-199 -511q-6 -14 -17 -26q-24 -23 -57 -23t-56.5 23.5t-23.5 56.5zM495 720h450l-225 579z" />
|
||||
<glyph unicode="B" horiz-adv-x="1120" d="M80 80v1440q0 33 23.5 56.5t56.5 23.5h320q166 0 283 -117t117 -283t-117 -283q74 -35 137 -97q140 -141 140 -340t-140.5 -339.5t-339.5 -140.5h-400q-33 0 -56.5 23.5t-23.5 56.5zM240 160h320q133 0 226.5 93.5t93.5 226.5t-93.5 226.5t-226.5 93.5h-320v-640z M240 960h240q99 0 169.5 70.5t70.5 169.5t-70.5 169.5t-169.5 70.5h-240v-480z" />
|
||||
<glyph unicode="C" horiz-adv-x="1480" d="M80 800q0 331 234.5 565.5t565.5 234.5q286 0 509 -183q23 -24 23 -57t-23.5 -56.5t-56.5 -23.5t-57 24q-169 136 -395 136q-265 0 -452.5 -187.5t-187.5 -452.5t187.5 -452.5t452.5 -187.5q229 0 400 140q20 14 46 14q33 0 56.5 -23.5t23.5 -56.5t-23 -56 q-223 -178 -503 -178q-331 0 -565.5 234.5t-234.5 565.5z" />
|
||||
<glyph unicode="D" horiz-adv-x="1360" d="M80 80v1440q0 33 23.5 56.5t56.5 23.5h320q331 0 565.5 -234.5t234.5 -565.5t-234.5 -565.5t-565.5 -234.5h-320q-33 0 -56.5 23.5t-23.5 56.5zM240 160h240q265 0 452.5 187.5t187.5 452.5t-187.5 452.5t-452.5 187.5h-240v-1280z" />
|
||||
<glyph unicode="E" d="M80 80v1440q0 33 23.5 56.5t56.5 23.5h960q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-880v-560h640q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-640v-560h880q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-960q-33 0 -56.5 23.5 t-23.5 56.5z" />
|
||||
<glyph unicode="F" d="M80 80v1440q0 33 23.5 56.5t56.5 23.5h960q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-880v-560h640q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-640v-640q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="G" horiz-adv-x="1500" d="M80 800q0 331 234.5 565.5t565.5 234.5q286 0 509 -183q23 -24 23 -57t-23.5 -56.5t-56.5 -23.5t-57 24q-169 136 -395 136q-265 0 -452.5 -187.5t-187.5 -452.5t187.5 -452.5t452.5 -187.5q207 0 366 114v366h-316q-33 0 -56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5h397 q32 0 56 -23q23 -24 23 -57v-486q0 -33 -23 -56q-223 -178 -503 -178q-331 0 -565.5 234.5t-234.5 565.5z" />
|
||||
<glyph unicode="H" d="M80 80v1440q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-640h800v640q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-1440q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v640h-800v-640q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="I" horiz-adv-x="480" d="M160 80v1440q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-1440q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="J" horiz-adv-x="1120" d="M80 480q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5t93.5 226.5v1040q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-1040q0 -199 -140.5 -339.5t-339.5 -140.5t-339.5 140.5t-140.5 339.5z" />
|
||||
<glyph unicode="K" horiz-adv-x="1200" d="M80 80v1440q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-686l741 741q26 25 59 25t56.5 -23.5t23.5 -56.5t-23 -57l-562 -562l570 -773q15 -21 15 -45q0 -42 -32 -67q-22 -16 -46 -16q-44 0 -68 34l-554 752l-180 -180v-526q0 -33 -23.5 -56.5t-56.5 -23.5 t-56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="L" horiz-adv-x="1200" d="M80 80v1440q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-1360h800q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-880q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="M" horiz-adv-x="1760" d="M80 80v1440q0 33 23.5 56.5t56.5 23.5q48 0 71 -42l649 -1299l649 1299q23 42 71 42q33 0 56.5 -23.5t23.5 -56.5v-1440q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v1101l-571 -1142q-21 -39 -69 -39q-50 0 -74 49l-566 1132v-1101q0 -33 -23.5 -56.5 t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="N" horiz-adv-x="1440" d="M80 80v1440q0 33 23.5 56.5t56.5 23.5q36 0 62 -29l978 -1258v1207q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-1440q0 -33 -23.5 -56.5t-56.5 -23.5q-35 0 -60 26l-980 1260v-1206q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="O" horiz-adv-x="1760" d="M80 800q0 331 234.5 565.5t565.5 234.5t565.5 -234.5t234.5 -565.5t-234.5 -565.5t-565.5 -234.5t-565.5 234.5t-234.5 565.5zM240 800q0 -265 187.5 -452.5t452.5 -187.5t452.5 187.5t187.5 452.5t-187.5 452.5t-452.5 187.5t-452.5 -187.5t-187.5 -452.5z" />
|
||||
<glyph unicode="P" horiz-adv-x="1080" d="M80 80v1440q0 33 23.5 56.5t56.5 23.5h320q215 0 367.5 -152.5t152.5 -367.5t-152.5 -367.5t-367.5 -152.5h-240v-480q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM240 720h240q149 0 254.5 105.5t105.5 254.5t-105.5 254.5t-254.5 105.5h-240v-720z" />
|
||||
<glyph unicode="Q" horiz-adv-x="1760" d="M80 800q0 331 234.5 565.5t565.5 234.5t565.5 -234.5t234.5 -565.5q0 -290 -180 -506l158 -158q22 -24 22 -56q0 -33 -23.5 -56.5t-56.5 -23.5t-58 24l-156 156q-216 -180 -506 -180q-331 0 -565.5 234.5t-234.5 565.5zM240 800q0 -265 187.5 -452.5t452.5 -187.5 q224 0 392 134l-169 169q-23 24 -23 57t23.5 56.5t56.5 23.5t57 -23l169 -169q134 168 134 392q0 265 -187.5 452.5t-452.5 187.5t-452.5 -187.5t-187.5 -452.5z" />
|
||||
<glyph unicode="R" horiz-adv-x="1200" d="M80 80v1440q0 33 23.5 56.5t56.5 23.5h400q199 0 339.5 -140.5t140.5 -339.5t-140 -339q-65 -65 -141 -99l348 -558q13 -19 13 -44q0 -33 -23.5 -56.5t-56.5 -23.5q-43 0 -70 41l-375 600q-17 -1 -35 -1h-320v-560q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z M240 800h320q133 0 226.5 93.5t93.5 226.5t-93.5 226.5t-226.5 93.5h-320v-640z" />
|
||||
<glyph unicode="S" horiz-adv-x="1060" d="M80 267q0 33 23.5 56.5t56.5 23.5q43 0 68 -37q12 -19 28 -36q85 -102 218 -113q14 -1 27 -1q115 0 206 76q101 86 112 218q1 15 1 30q0 116 -76 204q-86 100 -218 111q-165 14 -272 140q-95 112 -95 257q0 18 1 35q14 165 140 272q113 97 260 97q174 0 304 -143 q22 -26 39 -54q12 -19 12 -43q0 -33 -23.5 -56.5t-56.5 -23.5q-38 0 -56 24t-37 49q-65 76 -163 84q-11 1 -22 1q-86 0 -153 -58q-76 -64 -84 -162q-1 -11 0 -22q0 -86 56 -153q64 -76 163 -84q199 -17 328 -168q113 -134 113 -304q0 -23 -2 -46q-16 -198 -167 -326 q-135 -115 -307 -115q-215 0 -370 170q-21 23 -38 49q-16 21 -16 48z" />
|
||||
<glyph unicode="T" horiz-adv-x="1360" d="M80 1520q0 33 23.5 56.5t56.5 23.5h1040q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-440v-1360q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v1360h-440q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="U" d="M80 560v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -166 117 -283t283 -117t283 117t117 283v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -232 -164 -396t-396 -164t-396 164t-164 396z" />
|
||||
<glyph unicode="V" horiz-adv-x="1440" d="M80 1520q0 33 23.5 56.5t56.5 23.5q53 0 73 -46l487 -1253l487 1253q20 46 73 46q33 0 56.5 -23.5t23.5 -56.5q0 -22 -10 -45l-557 -1425q-6 -16 -16 -26q-24 -24 -57 -24t-56 24q-11 10 -17 26l-557 1425q-10 23 -10 45z" />
|
||||
<glyph unicode="W" horiz-adv-x="1920" d="M80 1520q0 33 23.5 56.5t56.5 23.5t57 -23q13 -14 19 -30l324 -1168l324 1168q4 15 20 30q23 23 56 23t57 -23q13 -14 19 -30l324 -1168l324 1168q6 16 20 30q23 23 56 23t56.5 -23.5t23.5 -56.5q0 -17 -6 -35l-392 -1418q-8 -25 -25 -43q-24 -24 -57 -24t-56 24 q-18 18 -25 42l-319 1152l-318 -1151q-8 -25 -25 -43q-24 -24 -57 -24t-56 24q-18 18 -25 42l-393 1419q-6 18 -6 35z" />
|
||||
<glyph unicode="X" horiz-adv-x="1440" d="M80 80q0 28 17 50l521 670l-524 674q-14 20 -14 46q0 33 23.5 56.5t56.5 23.5q38 0 66 -34l494 -635l494 635q28 34 66 34q33 0 56.5 -23.5t23.5 -56.5q0 -26 -14 -46l-524 -674l521 -670q17 -22 17 -50q0 -33 -23.5 -56.5t-56.5 -23.5q-38 0 -61 28l-499 641l-499 -641 q-23 -28 -61 -28q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="Y" d="M80 1520q0 33 23.5 56.5t56.5 23.5q41 0 65 -33l415 -622l415 622q24 33 65 33q33 0 56.5 -23.5t23.5 -56.5q0 -25 -13 -45l-467 -699v-696q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v696l-467 699q-13 20 -13 45z" />
|
||||
<glyph unicode="Z" horiz-adv-x="1440" d="M80 80q0 28 17 50l1019 1310h-956q-33 0 -56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5h1120q33 0 56.5 -23.5t23.5 -56.5q0 -26 -14 -46l-1022 -1314h956q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-1120q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="[" horiz-adv-x="640" d="M80 -400v1920q0 33 23.5 56.5t56.5 23.5h320q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-240v-1760h240q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-320q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="\" horiz-adv-x="960" d="M80 1520q0 33 23.5 56.5t56.5 23.5t57 -23q10 -11 16 -23l640 -1600q7 -16 7 -34q0 -33 -23.5 -56.5t-56.5 -23.5t-57 24q-10 10 -16 22l-640 1600q-7 16 -7 34z" />
|
||||
<glyph unicode="]" horiz-adv-x="640" d="M80 -400q0 33 23.5 56.5t56.5 23.5h240v1760h-240q-33 0 -56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5h320q33 0 56.5 -23.5t23.5 -56.5v-1920q0 -33 -23.5 -56.5t-56.5 -23.5h-320q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="^" horiz-adv-x="960" d="M80 1040q0 23 11 41l324 486q22 33 65 33t65 -33l324 -486q11 -18 11 -41q0 -33 -23.5 -56.5t-56.5 -23.5q-40 0 -64 31l-256 384l-256 -384q-24 -31 -64 -31q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="_" horiz-adv-x="960" d="M-80 -80q0 33 23.5 56.5t56.5 23.5h960q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-960q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="`" horiz-adv-x="560" d="M80 1520q0 33 23.5 56.5t56.5 23.5t57 -23l243 -243q20 -23 20 -54q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -55 21l-243 243q-22 24 -22 56z" />
|
||||
<glyph unicode="a" d="M80 560q0 232 164 396t396 164t396 -164t164 -396v-480q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v88q-168 -168 -400 -168t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283z" />
|
||||
<glyph unicode="b" d="M80 560v962q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-570l4 4q164 164 396 164t396 -164t164 -396t-164 -396t-396 -164t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283z" />
|
||||
<glyph unicode="c" horiz-adv-x="1120" d="M80 560q0 232 164 396t396 164q210 0 365 -135q28 -25 28 -62q0 -33 -23.5 -56.5t-56.5 -23.5q-29 0 -51 18q-112 99 -262 99q-166 0 -283 -117t-117 -283t117 -283t283 -117q150 0 261 98q21 16 49 16q33 0 56.5 -23.5t23.5 -56.5t-25 -59q-155 -135 -365 -135 q-232 0 -396 164t-164 396z" />
|
||||
<glyph unicode="d" d="M80 560q0 232 164 396t396 164t396 -164l4 -4v570q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-962q0 -232 -164 -396t-396 -164t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283z" />
|
||||
<glyph unicode="e" d="M80 560q0 232 164 396t396 164t396 -164t164 -396q0 -33 -23.5 -56.5t-56.5 -23.5h-873q22 -115 110 -203q117 -117 283 -117q150 0 258 95q22 17 50 17q33 0 56.5 -23.5t23.5 -56.5t-23 -57q-155 -135 -365 -135q-232 0 -396 164t-164 396zM247 640h786 q-22 115 -110 203q-117 117 -283 117t-283 -117q-88 -88 -110 -203z" />
|
||||
<glyph unicode="f" horiz-adv-x="800" d="M80 980q0 33 23.5 56.5t56.5 23.5h80v60q0 480 480 480q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5q-320 0 -320 -320v-60h241q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-241v-820q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v820h-80 q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="g" d="M80 560q0 232 164 396t396 164t396 -164t164 -396v-560q0 -175 -126 -304q-176 -176 -425 -176t-424 176q-65 64 -106 139q-12 18 -12 42q0 33 23.5 56.5t56.5 23.5t57 -23q10 -11 17 -24q30 -54 77 -101q129 -129 311 -129t311 129q80 96 80 191v168l-4 -4 q-164 -164 -396 -164t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283z" />
|
||||
<glyph unicode="h" horiz-adv-x="1200" d="M80 80v1440q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-545q150 145 360 145q215 0 367.5 -152.5t152.5 -367.5v-520q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v520q0 149 -105.5 254.5t-254.5 105.5t-254.5 -105.5t-105.5 -254.5v-520 q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="i" horiz-adv-x="480" d="M140 1360q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5zM160 80v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="j" horiz-adv-x="656" d="M0 -400q0 33 23.5 56.5t56.5 23.5q133 0 226.5 93.5t93.5 226.5v1040q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-1040q0 -199 -140.5 -339.5t-339.5 -140.5q-33 0 -56.5 23.5t-23.5 56.5zM380 1360q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5 t-70.5 -29.5t-70.5 29.5t-29.5 70.5z" />
|
||||
<glyph unicode="k" horiz-adv-x="1120" d="M80 80v1440q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-852l677 440q19 12 43 12q33 0 56.5 -23.5t23.5 -56.5t-23 -56q-6 -6 -11 -10l-464 -302l476 -536q22 -24 22 -56q0 -33 -23.5 -56.5t-56.5 -23.5t-58 24l-497 560l-165 -107v-397q0 -33 -23.5 -56.5 t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="l" horiz-adv-x="480" d="M80 80v1440q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-1360h80q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-160q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="m" horiz-adv-x="1760" d="M80 80v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-21q119 101 280 101q182 0 311 -129q27 -27 49 -57q22 30 49 57q129 129 311 129t311 -129t129 -311v-600q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v600q0 116 -82 198t-198 82t-198 -82 t-82 -198v-600q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v600q0 116 -82 198t-198 82t-198 -82t-82 -198v-600q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="n" horiz-adv-x="1200" d="M80 80v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-65q150 145 360 145q215 0 367.5 -152.5t152.5 -367.5v-520q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v520q0 149 -105.5 254.5t-254.5 105.5t-254.5 -105.5t-105.5 -254.5v-520 q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="o" d="M80 560q0 232 164 396t396 164t396 -164t164 -396t-164 -396t-396 -164t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283z" />
|
||||
<glyph unicode="p" d="M80 -400v960q0 232 164 396t396 164t396 -164t164 -396t-164 -396t-396 -164t-396 164l-4 4v-568q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283z" />
|
||||
<glyph unicode="q" d="M80 560q0 232 164 396t396 164t396 -164t164 -396v-960q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v568l-4 -4q-164 -164 -396 -164t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283z" />
|
||||
<glyph unicode="r" horiz-adv-x="960" d="M80 80v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-88q168 168 400 168q117 0 215 -40q18 -7 33 -21q23 -24 23 -57t-23.5 -56.5t-56.5 -23.5q-19 0 -35 8q-71 30 -156 30q-166 0 -283 -117t-117 -283v-480q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5 t-23.5 56.5z" />
|
||||
<glyph unicode="s" horiz-adv-x="1060" d="M80 800q0 99 74 173q144 147 376 147q251 0 430 -201q16 -19 15 -47q0 -33 -23.5 -56.5t-56.5 -23.5t-53 21t-29 30q-117 117 -283 117t-265 -104q-24 -29 -24 -69q3 -47 49 -64l492 -163q91 -34 127 -71q71 -70 71 -169t-74 -173q-144 -147 -376 -147q-252 0 -430 201 q-15 21 -15 47q0 33 23.5 56.5t56.5 23.5t53 -21t29 -30q117 -117 283 -117t265 104q24 29 24 69q-3 47 -49 64l-492 163q-91 34 -127 71q-71 70 -71 169z" />
|
||||
<glyph unicode="t" horiz-adv-x="800" d="M80 1040q0 33 23.5 56.5t56.5 23.5h80v400q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-400h161q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-161v-560q0 -240 240 -240q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5q-400 0 -400 400v560h-80 q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="u" horiz-adv-x="1200" d="M80 520v520q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-520q0 -149 105.5 -254.5t254.5 -105.5t254.5 105.5t105.5 254.5v520q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v65q-150 -145 -360 -145 q-215 0 -367.5 152.5t-152.5 367.5z" />
|
||||
<glyph unicode="v" horiz-adv-x="1200" d="M80 1040q0 33 23.5 56.5t56.5 23.5t57 -23q8 -8 15 -21l368 -804l368 804q7 13 16 21q23 23 56 23t56.5 -23.5t23.5 -56.5q0 -17 -6 -31l-444 -967q-6 -13 -13 -20q-22 -22 -57 -22t-57 23q-7 6 -13 19l-444 967q-6 14 -6 31z" />
|
||||
<glyph unicode="w" horiz-adv-x="1600" d="M80 1040q0 33 23.5 56.5t56.5 23.5t57 -23q10 -11 16 -23l247 -741l242 727q7 21 22 37q23 23 56 23t57 -23q15 -16 21 -37l242 -727l247 741q6 12 17 23q23 23 56 23t56.5 -23.5t23.5 -56.5q0 -16 -6 -31l-319 -958q-6 -15 -18 -29q-24 -22 -57 -22t-56 22 q-13 14 -19 29l-245 736l-245 -736q-6 -15 -18 -29q-24 -22 -57 -22t-56 22q-13 14 -19 29l-319 958q-6 15 -6 31z" />
|
||||
<glyph unicode="x" horiz-adv-x="1120" d="M80 80q0 28 16 49l360 432l-357 427q-19 22 -19 52q0 33 23.5 56.5t56.5 23.5t59 -25l341 -409l341 409q26 25 59 25t56.5 -23.5t23.5 -56.5q0 -30 -19 -52l-357 -427l360 -432q16 -21 16 -49q0 -33 -23.5 -56.5t-56.5 -23.5t-56 24l-344 412l-344 -412q-23 -24 -56 -24 t-56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="y" horiz-adv-x="1120" d="M80 1040q0 33 23.5 56.5t56.5 23.5t57 -23q13 -14 19 -30l324 -777l324 777q6 16 20 30q23 23 56 23t56.5 -23.5t23.5 -56.5q0 -20 -9 -37l-596 -1430q-6 -16 -19 -29q-24 -24 -57 -24t-56.5 23.5t-23.5 56.5q0 20 9 37l185 444l-384 922q-9 17 -9 37z" />
|
||||
<glyph unicode="z" horiz-adv-x="1120" d="M80 80q0 28 16 49l693 831h-629q-33 0 -56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5h800q33 0 56.5 -23.5t23.5 -56.5q0 -30 -19 -52l-691 -828h630q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-800q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="{" horiz-adv-x="800" d="M80 560q0 33 23.5 56.5t56.5 23.5q160 0 160 160v480q0 320 320 320q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5q-160 0 -160 -160v-480q0 -160 -80 -240q80 -80 80 -240v-480q0 -160 160 -160q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5 q-320 0 -320 320v480q0 160 -160 160q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="|" horiz-adv-x="800" d="M320 -400v1920q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-1920q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="}" horiz-adv-x="800" d="M80 -400q0 33 23.5 56.5t56.5 23.5q160 0 160 160v480q0 160 80 240q-80 80 -80 240v480q0 160 -160 160q-33 0 -56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5q320 0 320 -320v-480q0 -160 160 -160q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5q-160 0 -160 -160 v-480q0 -320 -320 -320q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="~" horiz-adv-x="960" d="M71 757q0 33 23.5 56.5t56.5 23.5q32 0 56 -22q47 -48 113 -48q56 0 100 35q89 80 212 80q133 0 227 -94q22 -24 22 -56q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -56 22q-47 48 -113 48q-57 0 -100 -35q-90 -80 -212 -80q-133 0 -227 94q-22 24 -22 56z" />
|
||||
<glyph unicode="¡" horiz-adv-x="400" d="M80 999q0 50 35 85t85 35t85 -35t35 -85t-35 -85t-85 -35t-85 35t-35 85zM120 -400v1120q0 32 24 55q23 24 56 24t57 -24q23 -23 23 -55v-1120q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="¢" horiz-adv-x="1120" d="M87 560q0 232 164 396t396 164q25 0 49 -2l109 272q13 31 44 44q13 6 31 6q15 0 29 -5q31 -12 44 -42.5t1 -61.5l-99 -249q84 -34 157 -97q28 -25 28 -62q0 -33 -23.5 -56.5t-56.5 -23.5q-29 0 -51 18q-53 47 -114 71l-298 -744q69 -28 150 -28q150 0 261 98q21 16 49 16 q33 0 56.5 -23.5t23.5 -56.5t-25 -59q-155 -135 -365 -135q-113 0 -209 39l-123 -308q-12 -31 -42 -44q-16 -7 -32 -7q-15 0 -30 6q-31 12 -44 42.5t-1 61.5l132 331q-24 20 -47 43q-164 164 -164 396zM247 560q0 -164 114 -280l272 680q-157 -5 -269 -117 q-117 -117 -117 -283z" />
|
||||
<glyph unicode="£" horiz-adv-x="1040" d="M80 720q0 33 23.5 56.5t56.5 23.5h105q-22 127 -75 250h1q-31 75 -31 150q0 166 117 283t283 117t283 -117q29 -29 51 -61q16 -22 16 -50q0 -33 -23.5 -56.5t-56.5 -23.5q-37 0 -56 24q-17 25 -44 54q-71 70 -170 70t-169.5 -70.5t-70.5 -169.5q0 -45 19 -90 q65 -151 88 -310h293q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-281q2 -232 -83 -480h394l60 120q21 40 70 40q33 0 56.5 -23.5t23.5 -56.5q0 -21 -9 -38l-77 -154q-6 -13 -17 -24q-24 -24 -57 -24h-560q-33 0 -56.5 23.5t-23.5 56.5q0 17 6 32q117 273 113 528 h-119q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="¤" horiz-adv-x="960" d="M110 460q0 33 24 57l72 67q-46 73 -46 166q0 89 42 161l-68 73q-24 23 -24 56t23.5 56.5t56.5 23.5q32 0 55 -21l69 -74q74 45 166 45q89 0 161 -42l73 69q23 23 56 23t56.5 -23.5t23.5 -56.5t-24 -58l-71 -66q45 -74 45 -166q0 -89 -42 -161l69 -72q23 -24 23 -57 t-23.5 -56.5t-56.5 -23.5q-32 0 -54 22l-1 -1l-69 74q-74 -45 -166 -45q-89 0 -160 42l-77 -72q-22 -20 -53 -20q-33 0 -56.5 23.5t-23.5 56.5zM320 750q0 -66 47 -113t113 -47t113 47t47 113t-47 113t-113 47t-113 -47t-47 -113z" />
|
||||
<glyph unicode="¥" d="M80 560q0 33 23.5 56.5t56.5 23.5h400v136l-69 104h-331q-33 0 -56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5h224l-291 435q-13 20 -13 45q0 33 23.5 56.5t56.5 23.5q41 0 65 -33l415 -622l415 622q24 33 65 33q33 0 56.5 -23.5t23.5 -56.5q0 -25 -13 -45l-291 -435h225 q32 0 56 -23q23 -24 23 -57t-23 -56q-24 -24 -56 -24h-332l-69 -104v-136h400q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-400v-400q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v400h-400q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="¦" horiz-adv-x="480" d="M160 320q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-720q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v720zM160 960v720q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-720q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="§" horiz-adv-x="960" d="M80 -80q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5q0 -99 70.5 -169.5t169.5 -70.5t169.5 70.5t70.5 169.5t-70.5 169.5t-169.5 70.5q-166 0 -283 117t-117 283t117 283q20 20 42 37q-22 17 -42 37q-117 117 -117 283t117 283t283 117t283 -117t117 -283 q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5q0 99 -70.5 169.5t-169.5 70.5t-169.5 -70.5t-70.5 -169.5t70.5 -169.5t169.5 -70.5q166 0 283 -117t117 -283t-117 -283q-20 -20 -42 -37q22 -17 42 -37q117 -117 117 -283t-117 -283t-283 -117t-283 117t-117 283z M240 560q0 -99 70.5 -169.5t169.5 -70.5t169.5 70.5t70.5 169.5t-70.5 169.5t-169.5 70.5t-169.5 -70.5t-70.5 -169.5z" />
|
||||
<glyph unicode="¨" horiz-adv-x="960" d="M139 1360q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5zM619 1360q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5z" />
|
||||
<glyph unicode="©" horiz-adv-x="1760" d="M80 798q0 330 233.5 563.5t564.5 233.5q330 0 563.5 -233.5t233.5 -563.5q0 -331 -233.5 -564.5t-563.5 -233.5q-331 0 -564.5 233.5t-233.5 564.5zM203 798q0 -280 197.5 -477.5t477.5 -197.5q279 0 476.5 197.5t197.5 477.5q0 279 -197.5 476.5t-476.5 197.5 q-280 0 -477.5 -197.5t-197.5 -476.5zM320 800q0 232 164 396t396 164q210 0 365 -135q28 -25 28 -62q0 -33 -23.5 -56.5t-56.5 -23.5q-29 0 -51 18q-112 99 -262 99q-166 0 -283 -117t-117 -283t117 -283t283 -117q150 0 261 98q21 16 49 16q33 0 56.5 -23.5t23.5 -56.5 t-25 -59q-155 -135 -365 -135q-232 0 -396 164t-164 396z" />
|
||||
<glyph unicode="ª" horiz-adv-x="960" d="M80 1200q0 166 117 283t283 117t283 -117t117 -283v-320q0 -33 -23.5 -56.5t-56.5 -23.5t-56 24q-24 23 -24 55q-103 -79 -240 -79q-166 0 -283 117t-117 283zM240 1200q0 -99 70.5 -169.5t169.5 -70.5t169.5 70.5t70.5 169.5t-70.5 169.5t-169.5 70.5t-169.5 -70.5 t-70.5 -169.5z" />
|
||||
<glyph unicode="«" horiz-adv-x="960" d="M80 559q0 20 10 39l236 472q6 14 18 26q23 23 56 23t56.5 -23.5t23.5 -56.5q0 -18 -7 -34l-223 -445l223 -446q7 -16 7 -34q0 -33 -23.5 -56.5t-56.5 -23.5t-56 24q-12 11 -18 25l-234 467q-12 22 -12 43zM480 559q0 20 10 39l236 472q6 14 18 26q23 23 56 23t56.5 -23.5 t23.5 -56.5q0 -18 -7 -34l-223 -445l223 -446q7 -16 7 -34q0 -33 -23.5 -56.5t-56.5 -23.5t-56 24q-12 11 -18 25l-234 467q-12 22 -12 43z" />
|
||||
<glyph unicode="¬" horiz-adv-x="1120" d="M80 1040q0 33 23.5 56.5t56.5 23.5h800q33 0 56.5 -23.5t23.5 -56.5v-320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v240h-720q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="­" horiz-adv-x="800" d="M80 560q0 33 23.5 56.5t56.5 23.5h480q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-480q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="®" horiz-adv-x="1760" d="M80 798q0 330 233.5 563.5t564.5 233.5q330 0 563.5 -233.5t233.5 -563.5q0 -331 -233.5 -564.5t-563.5 -233.5q-331 0 -564.5 233.5t-233.5 564.5zM203 798q0 -280 197.5 -477.5t477.5 -197.5q279 0 476.5 197.5t197.5 477.5q0 279 -197.5 476.5t-476.5 197.5 q-280 0 -477.5 -197.5t-197.5 -476.5zM560 326v944q0 22 15.5 37t36.5 15h263q130 0 222.5 -92t92.5 -222q0 -131 -93 -223q-42 -42 -92 -65l228 -366q9 -12 9 -28q0 -22 -15.5 -37.5t-36.5 -15.5q-29 0 -46 27l-246 394q-12 -1 -23 -1h-210v-367q0 -22 -15.5 -37.5 t-37.5 -15.5q-21 0 -36.5 15.5t-15.5 37.5zM665 798h210q87 0 148.5 61t61.5 149q0 87 -61.5 148t-148.5 61h-210v-419z" />
|
||||
<glyph unicode="¯" horiz-adv-x="1120" d="M80 1840q0 33 23.5 56.5t56.5 23.5h800q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-800q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="°" horiz-adv-x="960" d="M80 1200q0 166 117 283t283 117t283 -117t117 -283t-117 -283t-283 -117t-283 117t-117 283zM240 1200q0 -99 70.5 -169.5t169.5 -70.5t169.5 70.5t70.5 169.5t-70.5 169.5t-169.5 70.5t-169.5 -70.5t-70.5 -169.5z" />
|
||||
<glyph unicode="±" horiz-adv-x="1120" d="M80 80q0 33 23.5 56.5t56.5 23.5h800q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-800q-33 0 -56.5 23.5t-23.5 56.5zM80 800q0 33 23.5 56.5t56.5 23.5h320v320q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-320h320q33 0 56.5 -23.5t23.5 -56.5 t-23.5 -56.5t-56.5 -23.5h-320v-320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v320h-320q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="²" horiz-adv-x="640" d="M80 848q0 16 11 28l338 374q47 47 47 112q0 66 -46.5 112.5t-111.5 46.5q-66 0 -112.5 -46.5t-46.5 -112.5q0 -16 -11.5 -27.5t-27.5 -11.5q-17 0 -28.5 11.5t-11.5 27.5q0 99 69.5 168.5t168.5 69.5q98 0 167.5 -69.5t69.5 -168.5q0 -98 -70 -168l-276 -307h307 q16 0 27.5 -11.5t11.5 -27.5q0 -17 -11.5 -28.5t-27.5 -11.5h-396q-17 0 -28.5 11.5t-11.5 28.5z" />
|
||||
<glyph unicode="³" horiz-adv-x="640" d="M80 1041q0 17 11.5 28.5t28.5 11.5q16 0 28 -11.5t12 -28.5q0 -66 46.5 -112.5t113.5 -46.5q66 0 112.5 46.5t46.5 112.5q0 67 -46.5 113.5t-112.5 46.5q-17 0 -28.5 11.5t-11.5 28.5q0 16 11.5 28t28.5 12q49 0 84 35t35 84q0 50 -35 85t-84 35q-50 0 -85 -35t-35 -85 q0 -16 -12 -27.5t-28 -11.5q-17 0 -28.5 11.5t-11.5 27.5q0 83 58.5 141.5t141.5 58.5q82 0 140.5 -58.5t58.5 -141.5q0 -92 -73 -155q23 -14 43 -34q70 -71 70 -170t-70 -169t-169 -70q-100 0 -170 70t-70 169z" />
|
||||
<glyph unicode="´" horiz-adv-x="560" d="M80 1280q0 31 20 54l243 243q24 23 57 23t56.5 -23.5t23.5 -56.5q0 -32 -22 -56l-243 -243q-23 -21 -55 -21q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="µ" horiz-adv-x="1200" d="M80 -400v1440q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-520q0 -149 105.5 -254.5t254.5 -105.5t254.5 105.5t105.5 254.5v520q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v65 q-150 -145 -360 -145t-360 145v-545q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="¶" horiz-adv-x="1120" d="M80 1200q0 166 117 283t283 117h480q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5v-1360q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v1360h-160v-1360q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v720q-166 0 -283 117t-117 283z" />
|
||||
<glyph unicode="·" horiz-adv-x="400" d="M80 760q0 50 35 85t85 35t85 -35t35 -85t-35 -85t-85 -35t-85 35t-35 85z" />
|
||||
<glyph unicode="∙" horiz-adv-x="400" d="M80 760q0 50 35 85t85 35t85 -35t35 -85t-35 -85t-85 -35t-85 35t-35 85z" />
|
||||
<glyph unicode="¸" horiz-adv-x="640" d="M80 -330q0 33 23.5 56.5t56.5 23.5q24 0 43 -12l78 -48q19 -10 39 -10q33 0 56.5 13.5t23.5 36.5t-23.5 36.5t-56.5 13.5t-56.5 23.5t-23.5 56.5q0 14 4 26l39 137q6 19 21 34q23 23 56 23t56.5 -23.5t23.5 -56.5q0 -10 -2 -19l-17 -60q37 -15 69 -41q70 -61 70 -150 t-70.5 -149.5t-169.5 -60.5q-59 0 -114 29l-91 54q-35 29 -35 67z" />
|
||||
<glyph unicode="¹" horiz-adv-x="480" d="M120 1521q0 16 12 28q6 6 13 9l120 40q6 2 14 2q16 0 28 -11.5t12 -28.5v-715q0 -17 -12 -28.5t-28 -11.5t-28 11.5t-12 28.5v660l-64 -21q-7 -3 -15 -3q-17 0 -28.5 11.5t-11.5 28.5z" />
|
||||
<glyph unicode="º" horiz-adv-x="640" d="M80 1203q0 238 98 339q58 58 141 58q82 0 140 -58q98 -101 98 -339q0 -239 -98 -340q-58 -58 -140 -58q-83 0 -141 58q-98 101 -98 340zM160 1203q0 -199 74 -283q35 -35 85 -35q49 0 84 35q75 84 75 283q0 198 -75 282q-35 36 -84 36q-50 0 -85 -36q-74 -84 -74 -282z " />
|
||||
<glyph unicode="»" horiz-adv-x="960" d="M80 80q0 18 7 34l223 446l-223 445q-7 16 -7 34q0 33 23.5 56.5t56.5 23.5t56 -23q12 -12 18 -26l236 -472q10 -19 10 -39q0 -21 -12 -43l-234 -467q-6 -14 -18 -25q-23 -24 -56 -24t-56.5 23.5t-23.5 56.5zM480 80q0 18 7 34l223 446l-223 445q-7 16 -7 34 q0 33 23.5 56.5t56.5 23.5t56 -23q12 -12 18 -26l236 -472q10 -19 10 -39q0 -21 -12 -43l-234 -467q-6 -14 -18 -25q-23 -24 -56 -24t-56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="¼" horiz-adv-x="1440" d="M80 1505q0 20 14 34q8 7 17 11l144 48q8 3 17 3q20 0 34 -14t14 -34v-865q0 -20 -14 -34t-34 -14t-34 14t-14 34v798l-77 -26q-9 -3 -19 -3q-20 0 -34 14t-14 34zM160 80q0 24 12 43l964 1446q21 31 64 31q33 0 56.5 -23.5t23.5 -56.5q0 -24 -12 -43l-958 -1436 q-27 -41 -70 -41q-33 0 -56.5 23.5t-23.5 56.5zM688 288q0 16 9 28l432 624q2 3 5 6q14 14 34 14t34 -14t14 -34v-576h96q20 0 34 -14t14 -34t-14 -34t-34 -14h-96v-192q0 -20 -14 -34t-34 -14t-34 14t-14 34v192h-384q-20 0 -34 14t-14 34zM828 336h292v422z" />
|
||||
<glyph unicode="½" horiz-adv-x="1600" d="M80 1505q0 20 14 34q8 7 17 11l144 48q8 3 17 3q20 0 34 -14t14 -34v-865q0 -20 -14 -34t-34 -14t-34 14t-14 34v798l-77 -26q-9 -3 -19 -3q-20 0 -34 14t-14 34zM160 80q0 24 12 43l964 1446q21 31 64 31q33 0 56.5 -23.5t23.5 -56.5q0 -24 -12 -43l-958 -1436 q-27 -41 -70 -41q-33 0 -56.5 23.5t-23.5 56.5zM943 48q0 20 14 34l410 454q57 57 57 137t-56.5 136t-136.5 56t-136 -56t-56 -136q0 -20 -14 -34t-34 -14t-34 14t-14 34q0 119 84.5 203.5t203.5 84.5q120 0 204.5 -84.5t84.5 -203.5q0 -120 -85 -205l-335 -372h372 q19 0 33.5 -14t14.5 -34t-14.5 -34t-33.5 -14h-481q-20 0 -34 14t-14 34z" />
|
||||
<glyph unicode="¾" horiz-adv-x="1600" d="M80 927q0 20 14 34t34 14t34 -14t14 -34q0 -79 55.5 -135t135.5 -56t135.5 56t55.5 135q0 80 -55.5 136t-135.5 56q-20 0 -34 14t-14 34q0 19 14 33t34 14q59 0 101.5 42.5t42.5 101.5t-42.5 101t-101.5 42t-101 -42t-42 -101q0 -20 -14.5 -34t-33.5 -14q-20 0 -34 14 t-14 34q0 99 70 169t169 70t169 -70t70 -169t-70 -169q-9 -9 -18 -17q28 -17 52 -41q84 -85 84 -204t-84 -203t-203 -84t-203 84t-84 203zM320 80q0 24 12 43l964 1446q21 31 64 31q33 0 56.5 -23.5t23.5 -56.5q0 -24 -12 -43l-958 -1436q-27 -41 -70 -41q-33 0 -56.5 23.5 t-23.5 56.5zM848 288q0 16 9 28l432 624q2 3 5 6q14 14 34 14t34 -14t14 -34v-576h96q20 0 34 -14t14 -34t-14 -34t-34 -14h-96v-192q0 -20 -14 -34t-34 -14t-34 14t-14 34v192h-384q-20 0 -34 14t-14 34zM988 336h292v422z" />
|
||||
<glyph unicode="¿" horiz-adv-x="1120" d="M80 0q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5t93.5 226.5t-94 227l-165 153q-141 141 -141 340q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5q0 -133 94 -227l165 -153q141 -141 141 -340t-140.5 -339.5 t-339.5 -140.5t-339.5 140.5t-140.5 339.5zM440 999q0 50 35 85t85 35t85 -35t35 -85t-35 -85t-85 -35t-85 35t-35 85z" />
|
||||
<glyph unicode="À" horiz-adv-x="1440" d="M80 80q0 19 7 34l556 1430q6 18 21 33q23 23 56 23t57 -23q14 -15 20 -33l556 -1430q7 -15 7 -34q0 -33 -23.5 -56.5t-56.5 -23.5t-56 23q-12 12 -18 26l-199 511h-574l-199 -511q-6 -14 -17 -26q-24 -23 -57 -23t-56.5 23.5t-23.5 56.5zM495 720h450l-225 579zM453 2000 q0 33 23.5 56.5t56.5 23.5t57 -23l243 -243q20 -23 20 -54q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -55 21l-243 243q-22 24 -22 56z" />
|
||||
<glyph unicode="Á" horiz-adv-x="1440" d="M80 80q0 19 7 34l556 1430q6 18 21 33q23 23 56 23t57 -23q14 -15 20 -33l556 -1430q7 -15 7 -34q0 -33 -23.5 -56.5t-56.5 -23.5t-56 23q-12 12 -18 26l-199 511h-574l-199 -511q-6 -14 -17 -26q-24 -23 -57 -23t-56.5 23.5t-23.5 56.5zM495 720h450l-225 579zM587 1760 q0 31 20 54l243 243q24 23 57 23t56.5 -23.5t23.5 -56.5q0 -32 -22 -56l-243 -243q-23 -21 -55 -21q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="Â" horiz-adv-x="1440" d="M80 80q0 19 7 34l556 1430q6 18 21 33q23 23 56 23t57 -23q14 -15 20 -33l556 -1430q7 -15 7 -34q0 -33 -23.5 -56.5t-56.5 -23.5t-56 23q-12 12 -18 26l-199 511h-574l-199 -511q-6 -14 -17 -26q-24 -23 -57 -23t-56.5 23.5t-23.5 56.5zM495 720h450l-225 579zM400 1800 q0 40 40 70l239 159q18 11 41 11t41 -11l239 -159q40 -30 40 -70q0 -33 -23.5 -56.5t-56.5 -23.5q-29 0 -50 17l-190 126l-190 -126q-21 -17 -50 -17q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="Ã" horiz-adv-x="1440" d="M80 80q0 19 7 34l556 1430q6 18 21 33q23 23 56 23t57 -23q14 -15 20 -33l556 -1430q7 -15 7 -34q0 -33 -23.5 -56.5t-56.5 -23.5t-56 23q-12 12 -18 26l-199 511h-574l-199 -511q-6 -14 -17 -26q-24 -23 -57 -23t-56.5 23.5t-23.5 56.5zM495 720h450l-225 579zM308 1871 q0 33 23.5 56.5t56.5 23.5q32 0 56 -22q47 -48 113 -48q56 0 100 35q89 80 212 80q133 0 227 -94q22 -24 22 -56q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -56 22q-47 48 -113 48q-57 0 -100 -35q-90 -80 -212 -80q-133 0 -227 94q-22 24 -22 56z" />
|
||||
<glyph unicode="Ä" horiz-adv-x="1440" d="M80 80q0 19 7 34l556 1430q6 18 21 33q23 23 56 23t57 -23q14 -15 20 -33l556 -1430q7 -15 7 -34q0 -33 -23.5 -56.5t-56.5 -23.5t-56 23q-12 12 -18 26l-199 511h-574l-199 -511q-6 -14 -17 -26q-24 -23 -57 -23t-56.5 23.5t-23.5 56.5zM495 720h450l-225 579zM380 1840 q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5zM860 1840q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5z" />
|
||||
<glyph unicode="Å" horiz-adv-x="1440" d="M80 80q0 19 7 34l556 1430q6 18 21 33q23 23 56 23t57 -23q14 -15 20 -33l556 -1430q7 -15 7 -34q0 -33 -23.5 -56.5t-56.5 -23.5t-56 23q-12 12 -18 26l-199 511h-574l-199 -511q-6 -14 -17 -26q-24 -23 -57 -23t-56.5 23.5t-23.5 56.5zM495 720h450l-225 579zM518 1879 q0 83 59 142t143 59q83 0 142 -59t59 -142q0 -84 -59 -143t-142 -59q-84 0 -143 59t-59 143zM619 1879q0 -42 29.5 -71.5t71.5 -29.5q41 0 70.5 29.5t29.5 71.5q0 41 -29.5 70.5t-70.5 29.5q-42 0 -71.5 -29.5t-29.5 -70.5z" />
|
||||
<glyph unicode="Æ" horiz-adv-x="1760" d="M80 80q0 22 10 39l802 1444q23 37 68 37h640q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-560v-640h400q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-400v-480h560q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-640q-33 0 -56.5 23.5 t-23.5 56.5v560h-317l-335 -603q-25 -37 -68 -37q-33 0 -56.5 23.5t-23.5 56.5zM652 800h228v410z" />
|
||||
<glyph unicode="Ç" horiz-adv-x="1480" d="M80 800q0 331 234.5 565.5t565.5 234.5q286 0 509 -183q23 -24 23 -57t-23.5 -56.5t-56.5 -23.5t-57 24q-169 136 -395 136q-265 0 -452.5 -187.5t-187.5 -452.5t187.5 -452.5t452.5 -187.5q229 0 400 140q20 14 46 14q33 0 56.5 -23.5t23.5 -56.5t-23 -56 q-223 -178 -503 -178q-331 0 -565.5 234.5t-234.5 565.5zM506 -330q0 33 23.5 56.5t56.5 23.5q24 0 43 -12l78 -48q19 -10 39 -10q33 0 56.5 13.5t23.5 36.5t-23.5 36.5t-56.5 13.5t-56.5 23.5t-23.5 56.5q0 14 4 26l39 137q6 19 21 34q23 23 56 23t56.5 -23.5t23.5 -56.5 q0 -10 -2 -19l-17 -60q37 -15 69 -41q70 -61 70 -150t-70.5 -149.5t-169.5 -60.5q-59 0 -114 29l-91 54q-35 29 -35 67z" />
|
||||
<glyph unicode="È" d="M81 80v1440q0 33 23.5 56.5t56.5 23.5h960q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-880v-560h640q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-640v-560h880q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-960q-33 0 -56.5 23.5 t-23.5 56.5zM375 2000q0 33 23.5 56.5t56.5 23.5t57 -23l243 -243q20 -23 20 -54q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -55 21l-243 243q-22 24 -22 56z" />
|
||||
<glyph unicode="É" d="M81 80v1440q0 33 23.5 56.5t56.5 23.5h960q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-880v-560h640q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-640v-560h880q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-960q-33 0 -56.5 23.5 t-23.5 56.5zM509 1760q0 31 20 54l243 243q24 23 57 23t56.5 -23.5t23.5 -56.5q0 -32 -22 -56l-243 -243q-23 -21 -55 -21q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="Ê" d="M81 80v1440q0 33 23.5 56.5t56.5 23.5h960q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-880v-560h640q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-640v-560h880q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-960q-33 0 -56.5 23.5 t-23.5 56.5zM320 1800q0 40 40 70l239 159q18 11 41 11t41 -11l239 -159q40 -30 40 -70q0 -33 -23.5 -56.5t-56.5 -23.5q-29 0 -50 17l-190 126l-190 -126q-21 -17 -50 -17q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="Ë" d="M81 80v1440q0 33 23.5 56.5t56.5 23.5h960q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-880v-560h640q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-640v-560h880q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-960q-33 0 -56.5 23.5 t-23.5 56.5zM302 1840q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5zM782 1840q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5z" />
|
||||
<glyph unicode="Ì" horiz-adv-x="480" d="M160 80v1440q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-1440q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM-27 2000q0 33 23.5 56.5t56.5 23.5t57 -23l243 -243q20 -23 20 -54q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -55 21l-243 243q-22 24 -22 56z " />
|
||||
<glyph unicode="Í" horiz-adv-x="480" d="M160 80v1440q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-1440q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM107 1760q0 31 20 54l243 243q24 23 57 23t56.5 -23.5t23.5 -56.5q0 -32 -22 -56l-243 -243q-23 -21 -55 -21q-33 0 -56.5 23.5t-23.5 56.5z " />
|
||||
<glyph unicode="Î" horiz-adv-x="480" d="M160 80v1440q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-1440q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM-80 1800q0 40 40 70l239 159q18 11 41 11t41 -11l239 -159q40 -30 40 -70q0 -33 -23.5 -56.5t-56.5 -23.5q-29 0 -50 17l-190 126l-190 -126 q-21 -17 -50 -17q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="Ï" horiz-adv-x="480" d="M160 80v1440q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-1440q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM-100 1840q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5zM380 1840q0 41 29.5 70.5 t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5z" />
|
||||
<glyph unicode="Ð" horiz-adv-x="1520" d="M0 800q0 33 23.5 56.5t56.5 23.5h159v640q0 33 23.5 56.5t56.5 23.5h320q331 0 565.5 -234.5t234.5 -565.5t-234.5 -565.5t-565.5 -234.5h-320q-33 0 -56.5 23.5t-23.5 56.5v640h-159q-33 0 -56.5 23.5t-23.5 56.5zM399 160h240q265 0 452.5 187.5t187.5 452.5 t-187.5 452.5t-452.5 187.5h-240v-560h320q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-320v-560z" />
|
||||
<glyph unicode="Ñ" horiz-adv-x="1440" d="M80 80v1440q0 33 23.5 56.5t56.5 23.5q36 0 62 -29l978 -1258v1207q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-1440q0 -33 -23.5 -56.5t-56.5 -23.5q-35 0 -60 26l-980 1260v-1206q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM308 1871 q0 33 23.5 56.5t56.5 23.5q32 0 56 -22q47 -48 113 -48q56 0 100 35q89 80 212 80q133 0 227 -94q22 -24 22 -56q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -56 22q-47 48 -113 48q-57 0 -100 -35q-90 -80 -212 -80q-133 0 -227 94q-22 24 -22 56z" />
|
||||
<glyph unicode="Ò" horiz-adv-x="1760" d="M80 800q0 331 234.5 565.5t565.5 234.5t565.5 -234.5t234.5 -565.5t-234.5 -565.5t-565.5 -234.5t-565.5 234.5t-234.5 565.5zM240 800q0 -265 187.5 -452.5t452.5 -187.5t452.5 187.5t187.5 452.5t-187.5 452.5t-452.5 187.5t-452.5 -187.5t-187.5 -452.5zM693 2000 q0 33 23.5 56.5t56.5 23.5t57 -23l243 -243q20 -23 20 -54q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -55 21l-243 243q-22 24 -22 56z" />
|
||||
<glyph unicode="Ó" horiz-adv-x="1760" d="M80 800q0 331 234.5 565.5t565.5 234.5t565.5 -234.5t234.5 -565.5t-234.5 -565.5t-565.5 -234.5t-565.5 234.5t-234.5 565.5zM240 800q0 -265 187.5 -452.5t452.5 -187.5t452.5 187.5t187.5 452.5t-187.5 452.5t-452.5 187.5t-452.5 -187.5t-187.5 -452.5zM677 1760 q0 31 20 54l243 243q24 23 57 23t56.5 -23.5t23.5 -56.5q0 -32 -22 -56l-243 -243q-23 -21 -55 -21q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="Ô" horiz-adv-x="1760" d="M80 800q0 331 234.5 565.5t565.5 234.5t565.5 -234.5t234.5 -565.5t-234.5 -565.5t-565.5 -234.5t-565.5 234.5t-234.5 565.5zM240 800q0 -265 187.5 -452.5t452.5 -187.5t452.5 187.5t187.5 452.5t-187.5 452.5t-452.5 187.5t-452.5 -187.5t-187.5 -452.5zM560 1800 q0 40 40 70l239 159q18 11 41 11t41 -11l239 -159q40 -30 40 -70q0 -33 -23.5 -56.5t-56.5 -23.5q-29 0 -50 17l-190 126l-190 -126q-21 -17 -50 -17q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="Õ" horiz-adv-x="1760" d="M80 800q0 331 234.5 565.5t565.5 234.5t565.5 -234.5t234.5 -565.5t-234.5 -565.5t-565.5 -234.5t-565.5 234.5t-234.5 565.5zM240 800q0 -265 187.5 -452.5t452.5 -187.5t452.5 187.5t187.5 452.5t-187.5 452.5t-452.5 187.5t-452.5 -187.5t-187.5 -452.5zM468 1871 q0 33 23.5 56.5t56.5 23.5q32 0 56 -22q47 -48 113 -48q56 0 100 35q89 80 212 80q133 0 227 -94q22 -24 22 -56q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -56 22q-47 48 -113 48q-57 0 -100 -35q-90 -80 -212 -80q-133 0 -227 94q-22 24 -22 56z" />
|
||||
<glyph unicode="Ö" horiz-adv-x="1760" d="M80 800q0 331 234.5 565.5t565.5 234.5t565.5 -234.5t234.5 -565.5t-234.5 -565.5t-565.5 -234.5t-565.5 234.5t-234.5 565.5zM240 800q0 -265 187.5 -452.5t452.5 -187.5t452.5 187.5t187.5 452.5t-187.5 452.5t-452.5 187.5t-452.5 -187.5t-187.5 -452.5zM540 1840 q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5zM1020 1840q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5z" />
|
||||
<glyph unicode="×" horiz-adv-x="960" d="M80 400q0 32 22 56l264 264l-264 264q-22 24 -22 56q0 33 23.5 56.5t56.5 23.5t58 -24l262 -262l262 262q25 24 58 24t56.5 -23.5t23.5 -56.5q0 -32 -22 -56l-264 -264l264 -264q22 -24 22 -56q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -55 21l-265 265l-265 -265 q-23 -21 -55 -21q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="Ø" horiz-adv-x="1760" d="M80 80q0 32 21 55l159 159q-180 216 -180 506q0 331 234.5 565.5t565.5 234.5q290 0 506 -180l157 157q24 23 57 23t56.5 -23.5t23.5 -56.5q0 -29 -18 -51l-162 -163q180 -216 180 -506q0 -331 -234.5 -565.5t-565.5 -234.5q-290 0 -506 180l-157 -157q-24 -23 -57 -23 t-56.5 23.5t-23.5 56.5zM240 800q0 -224 134 -392l898 898q-168 134 -392 134q-265 0 -452.5 -187.5t-187.5 -452.5zM488 294q168 -134 392 -134q265 0 452.5 187.5t187.5 452.5q0 224 -134 393z" />
|
||||
<glyph unicode="Ù" d="M80 560v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -166 117 -283t283 -117t283 117t117 283v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -232 -164 -396t-396 -164t-396 164t-164 396zM373 2000q0 33 23.5 56.5t56.5 23.5t57 -23 l243 -243q20 -23 20 -54q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -55 21l-243 243q-22 24 -22 56z" />
|
||||
<glyph unicode="Ú" d="M80 560v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -166 117 -283t283 -117t283 117t117 283v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -232 -164 -396t-396 -164t-396 164t-164 396zM507 1760q0 31 20 54l243 243q24 23 57 23 t56.5 -23.5t23.5 -56.5q0 -32 -22 -56l-243 -243q-23 -21 -55 -21q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="Û" d="M80 560v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -166 117 -283t283 -117t283 117t117 283v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -232 -164 -396t-396 -164t-396 164t-164 396zM320 1800q0 40 40 70l239 159q18 11 41 11 t41 -11l239 -159q40 -30 40 -70q0 -33 -23.5 -56.5t-56.5 -23.5q-29 0 -50 17l-190 126l-190 -126q-21 -17 -50 -17q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="Ü" d="M80 560v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -166 117 -283t283 -117t283 117t117 283v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -232 -164 -396t-396 -164t-396 164t-164 396zM300 1840q0 41 29.5 70.5t70.5 29.5t70.5 -29.5 t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5zM780 1840q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5z" />
|
||||
<glyph unicode="Ý" d="M80 1520q0 33 23.5 56.5t56.5 23.5q41 0 65 -33l415 -622l415 622q24 33 65 33q33 0 56.5 -23.5t23.5 -56.5q0 -25 -13 -45l-467 -699v-696q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v696l-467 699q-13 20 -13 45zM507 1760q0 31 20 54l243 243q24 23 57 23 t56.5 -23.5t23.5 -56.5q0 -32 -22 -56l-243 -243q-23 -21 -55 -21q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="Þ" d="M80 80v1440q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-240h480q199 0 339.5 -140.5t140.5 -339.5t-140.5 -339.5t-339.5 -140.5h-480v-240q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM240 480h480q133 0 226.5 93.5t93.5 226.5t-93.5 226.5 t-226.5 93.5h-480v-640z" />
|
||||
<glyph unicode="ß" horiz-adv-x="1120" d="M80 80v1120q0 166 117 283t283 117t283 -117t117 -283q0 -147 -92 -255q-25 -34 -25 -78q0 -77 56 -108q56 -28 104 -76q117 -117 117 -283t-117 -283t-283 -117t-283 117q-26 26 -26 59t23.5 56.5t56.5 23.5t60 -25q70 -71 169 -71t169.5 70.5t70.5 169.5t-70 170 q-29 28 -62.5 47t-63.5 50q-84 83 -84 201q0 107 72 188q48 62 48 144q0 99 -70.5 169.5t-169.5 70.5t-169 -70q-71 -71 -71 -170v-1120q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="à" d="M80 560q0 232 164 396t396 164t396 -164t164 -396v-480q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v88q-168 -168 -400 -168t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283zM400 1520 q0 33 23.5 56.5t56.5 23.5t57 -23l243 -243q20 -23 20 -54q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -55 21l-243 243q-22 24 -22 56z" />
|
||||
<glyph unicode="á" d="M80 560q0 232 164 396t396 164t396 -164t164 -396v-480q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v88q-168 -168 -400 -168t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283zM480 1280 q0 31 20 54l243 243q24 23 57 23t56.5 -23.5t23.5 -56.5q0 -32 -22 -56l-243 -243q-23 -21 -55 -21q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="â" d="M80 560q0 232 164 396t396 164t396 -164t164 -396v-480q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v88q-168 -168 -400 -168t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283zM320 1320 q0 40 40 70l239 159q18 11 41 11t41 -11l239 -159q40 -30 40 -70q0 -33 -23.5 -56.5t-56.5 -23.5q-29 0 -50 17l-190 126l-190 -126q-21 -17 -50 -17q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="ã" d="M80 560q0 232 164 396t396 164t396 -164t164 -396v-480q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v88q-168 -168 -400 -168t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283zM235 1391 q0 33 23.5 56.5t56.5 23.5q32 0 56 -22q47 -48 113 -48q56 0 100 35q89 80 212 80q133 0 227 -94q22 -24 22 -56q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -56 22q-47 48 -113 48q-57 0 -100 -35q-90 -80 -212 -80q-133 0 -227 94q-22 24 -22 56z" />
|
||||
<glyph unicode="ä" d="M80 560q0 232 164 396t396 164t396 -164t164 -396v-480q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v88q-168 -168 -400 -168t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283zM300 1360 q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5zM780 1360q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5z" />
|
||||
<glyph unicode="å" d="M80 560q0 232 164 396t396 164t396 -164t164 -396v-480q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v88q-168 -168 -400 -168t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283zM439 1399 q0 83 59 142t143 59q83 0 142 -59t59 -142q0 -84 -59 -143t-142 -59q-84 0 -143 59t-59 143zM540 1399q0 -42 29.5 -71.5t71.5 -29.5q41 0 70.5 29.5t29.5 71.5q0 41 -29.5 70.5t-70.5 29.5q-42 0 -71.5 -29.5t-29.5 -70.5z" />
|
||||
<glyph unicode="æ" horiz-adv-x="2240" d="M80 560q0 232 164 396t396 164t396 -164q49 -49 84 -105q35 56 84 105q164 164 396 164t396 -164t164 -396q0 -33 -23.5 -56.5t-56.5 -23.5h-873q22 -115 110 -203q117 -117 283 -117q150 0 258 95q22 17 50 17q33 0 56.5 -23.5t23.5 -56.5t-23 -57q-155 -135 -365 -135 q-232 0 -400 168v-88q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v88q-168 -168 -400 -168t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283zM1207 640h786q-22 115 -110 203q-117 117 -283 117 t-283 -117q-88 -88 -110 -203z" />
|
||||
<glyph unicode="ç" horiz-adv-x="1120" d="M80 560q0 232 164 396t396 164q210 0 365 -135q28 -25 28 -62q0 -33 -23.5 -56.5t-56.5 -23.5q-29 0 -51 18q-112 99 -262 99q-166 0 -283 -117t-117 -283t117 -283t283 -117q150 0 261 98q21 16 49 16q33 0 56.5 -23.5t23.5 -56.5t-25 -59q-155 -135 -365 -135 q-232 0 -396 164t-164 396zM317 -330q0 33 23.5 56.5t56.5 23.5q24 0 43 -12l78 -48q19 -10 39 -10q33 0 56.5 13.5t23.5 36.5t-23.5 36.5t-56.5 13.5t-56.5 23.5t-23.5 56.5q0 14 4 26l39 137q6 19 21 34q23 23 56 23t56.5 -23.5t23.5 -56.5q0 -10 -2 -19l-17 -60 q37 -15 69 -41q70 -61 70 -150t-70.5 -149.5t-169.5 -60.5q-59 0 -114 29l-91 54q-35 29 -35 67z" />
|
||||
<glyph unicode="è" d="M80 560q0 232 164 396t396 164t396 -164t164 -396q0 -33 -23.5 -56.5t-56.5 -23.5h-873q22 -115 110 -203q117 -117 283 -117q150 0 258 95q22 17 50 17q33 0 56.5 -23.5t23.5 -56.5t-23 -57q-155 -135 -365 -135q-232 0 -396 164t-164 396zM247 640h786 q-22 115 -110 203q-117 117 -283 117t-283 -117q-88 -88 -110 -203zM400 1520q0 33 23.5 56.5t56.5 23.5t57 -23l243 -243q20 -23 20 -54q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -55 21l-243 243q-22 24 -22 56z" />
|
||||
<glyph unicode="é" d="M80 560q0 232 164 396t396 164t396 -164t164 -396q0 -33 -23.5 -56.5t-56.5 -23.5h-873q22 -115 110 -203q117 -117 283 -117q150 0 258 95q22 17 50 17q33 0 56.5 -23.5t23.5 -56.5t-23 -57q-155 -135 -365 -135q-232 0 -396 164t-164 396zM247 640h786 q-22 115 -110 203q-117 117 -283 117t-283 -117q-88 -88 -110 -203zM480 1280q0 31 20 54l243 243q24 23 57 23t56.5 -23.5t23.5 -56.5q0 -32 -22 -56l-243 -243q-23 -21 -55 -21q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="ê" d="M80 560q0 232 164 396t396 164t396 -164t164 -396q0 -33 -23.5 -56.5t-56.5 -23.5h-873q22 -115 110 -203q117 -117 283 -117q150 0 258 95q22 17 50 17q33 0 56.5 -23.5t23.5 -56.5t-23 -57q-155 -135 -365 -135q-232 0 -396 164t-164 396zM247 640h786 q-22 115 -110 203q-117 117 -283 117t-283 -117q-88 -88 -110 -203zM320 1320q0 40 40 70l239 159q18 11 41 11t41 -11l239 -159q40 -30 40 -70q0 -33 -23.5 -56.5t-56.5 -23.5q-29 0 -50 17l-190 126l-190 -126q-21 -17 -50 -17q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="ë" d="M80 560q0 232 164 396t396 164t396 -164t164 -396q0 -33 -23.5 -56.5t-56.5 -23.5h-873q22 -115 110 -203q117 -117 283 -117q150 0 258 95q22 17 50 17q33 0 56.5 -23.5t23.5 -56.5t-23 -57q-155 -135 -365 -135q-232 0 -396 164t-164 396zM247 640h786 q-22 115 -110 203q-117 117 -283 117t-283 -117q-88 -88 -110 -203zM300 1360q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5zM780 1360q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5 t-70.5 29.5t-29.5 70.5z" />
|
||||
<glyph unicode="ì" horiz-adv-x="480" d="M160 80v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM0 1520q0 33 23.5 56.5t56.5 23.5t57 -23l243 -243q20 -23 20 -54q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -55 21l-243 243q-22 24 -22 56z" />
|
||||
<glyph unicode="í" horiz-adv-x="480" d="M160 80v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM82 1280q0 31 20 54l243 243q24 23 57 23t56.5 -23.5t23.5 -56.5q0 -32 -22 -56l-243 -243q-23 -21 -55 -21q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="î" horiz-adv-x="560" d="M201 80v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM-40 1320q0 40 40 70l239 159q18 11 41 11t41 -11l239 -159q40 -30 40 -70q0 -33 -23.5 -56.5t-56.5 -23.5q-29 0 -50 17l-190 126l-190 -126 q-21 -17 -50 -17q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="ï" horiz-adv-x="600" d="M220 80v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM-39 1360q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5zM441 1360q0 41 29.5 70.5 t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5z" />
|
||||
<glyph unicode="ð" d="M80 560q0 232 164 396t396 164q79 0 150 -19l-104 179l-139 -81q-28 -17 -60.5 -8.5t-48.5 36.5q-17 29 -8.5 61t36.5 49l140 81l-34 58q-12 22 -12 44q0 33 23.5 56.5t56.5 23.5q46 0 68 -37l37 -63l136 79q28 17 60.5 8.5t48.5 -36.5q17 -29 8.5 -61t-36.5 -49 l-137 -80l308 -532q67 -121 67 -269q0 -232 -164 -396t-396 -164t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283z" />
|
||||
<glyph unicode="ñ" horiz-adv-x="1200" d="M80 80v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-65q150 145 360 145q215 0 367.5 -152.5t152.5 -367.5v-520q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v520q0 149 -105.5 254.5t-254.5 105.5t-254.5 -105.5t-105.5 -254.5v-520 q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM200 1391q0 33 23.5 56.5t56.5 23.5q32 0 56 -22q47 -48 113 -48q56 0 100 35q89 80 212 80q133 0 227 -94q22 -24 22 -56q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -56 22q-47 48 -113 48q-57 0 -100 -35 q-90 -80 -212 -80q-133 0 -227 94q-22 24 -22 56z" />
|
||||
<glyph unicode="ò" d="M80 560q0 232 164 396t396 164t396 -164t164 -396t-164 -396t-396 -164t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283zM400 1520q0 33 23.5 56.5t56.5 23.5t57 -23l243 -243q20 -23 20 -54 q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -55 21l-243 243q-22 24 -22 56z" />
|
||||
<glyph unicode="ó" d="M80 560q0 232 164 396t396 164t396 -164t164 -396t-164 -396t-396 -164t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283zM480 1280q0 31 20 54l243 243q24 23 57 23t56.5 -23.5t23.5 -56.5q0 -32 -22 -56 l-243 -243q-23 -21 -55 -21q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="ô" d="M80 560q0 232 164 396t396 164t396 -164t164 -396t-164 -396t-396 -164t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283zM320 1320q0 40 40 70l239 159q18 11 41 11t41 -11l239 -159q40 -30 40 -70 q0 -33 -23.5 -56.5t-56.5 -23.5q-29 0 -50 17l-190 126l-190 -126q-21 -17 -50 -17q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="õ" d="M80 560q0 232 164 396t396 164t396 -164t164 -396t-164 -396t-396 -164t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283zM235 1391q0 33 23.5 56.5t56.5 23.5q32 0 56 -22q47 -48 113 -48q56 0 100 35 q89 80 212 80q133 0 227 -94q22 -24 22 -56q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -56 22q-47 48 -113 48q-57 0 -100 -35q-90 -80 -212 -80q-133 0 -227 94q-22 24 -22 56z" />
|
||||
<glyph unicode="ö" d="M80 560q0 232 164 396t396 164t396 -164t164 -396t-164 -396t-396 -164t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283zM300 1360q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5 t-70.5 -29.5t-70.5 29.5t-29.5 70.5zM780 1360q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5z" />
|
||||
<glyph unicode="÷" horiz-adv-x="960" d="M80 720q0 33 23.5 56.5t56.5 23.5h640q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-640q-33 0 -56.5 23.5t-23.5 56.5zM380 420q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5zM380 1020q0 41 29.5 70.5 t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5z" />
|
||||
<glyph unicode="ø" d="M80 80q0 32 22 56l89 89q-111 144 -111 335q0 232 164 396t396 164q191 0 336 -111l85 85q26 26 59 26t56.5 -23.5t23.5 -56.5q0 -32 -22 -56l-89 -89q111 -144 111 -335q0 -232 -164 -396t-396 -164q-191 0 -335 111l-88 -88q-24 -23 -57 -23t-56.5 23.5t-23.5 56.5z M240 560q0 -124 65 -221l556 555q-97 66 -221 66q-166 0 -283 -117t-117 -283zM419 225q97 -65 221 -65q166 0 283 117t117 283q0 124 -65 221z" />
|
||||
<glyph unicode="ù" horiz-adv-x="1200" d="M80 520v520q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-520q0 -149 105.5 -254.5t254.5 -105.5t254.5 105.5t105.5 254.5v520q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v65q-150 -145 -360 -145 q-215 0 -367.5 152.5t-152.5 367.5zM400 1520q0 33 23.5 56.5t56.5 23.5t57 -23l243 -243q20 -23 20 -54q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -55 21l-243 243q-22 24 -22 56z" />
|
||||
<glyph unicode="ú" horiz-adv-x="1200" d="M80 520v520q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-520q0 -149 105.5 -254.5t254.5 -105.5t254.5 105.5t105.5 254.5v520q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v65q-150 -145 -360 -145 q-215 0 -367.5 152.5t-152.5 367.5zM400 1280q0 31 20 54l243 243q24 23 57 23t56.5 -23.5t23.5 -56.5q0 -32 -22 -56l-243 -243q-23 -21 -55 -21q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="û" horiz-adv-x="1200" d="M80 520v520q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-520q0 -149 105.5 -254.5t254.5 -105.5t254.5 105.5t105.5 254.5v520q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v65q-150 -145 -360 -145 q-215 0 -367.5 152.5t-152.5 367.5zM280 1320q0 40 40 70l239 159q18 11 41 11t41 -11l239 -159q40 -30 40 -70q0 -33 -23.5 -56.5t-56.5 -23.5q-29 0 -50 17l-190 126l-190 -126q-21 -17 -50 -17q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="ü" horiz-adv-x="1200" d="M80 520v520q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-520q0 -149 105.5 -254.5t254.5 -105.5t254.5 105.5t105.5 254.5v520q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v65q-150 -145 -360 -145 q-215 0 -367.5 152.5t-152.5 367.5zM260 1360q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5zM740 1360q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5z" />
|
||||
<glyph unicode="ý" horiz-adv-x="1120" d="M80 1040q0 33 23.5 56.5t56.5 23.5t57 -23q13 -14 19 -30l324 -777l324 777q6 16 20 30q23 23 56 23t56.5 -23.5t23.5 -56.5q0 -20 -9 -37l-596 -1430q-6 -16 -19 -29q-24 -24 -57 -24t-56.5 23.5t-23.5 56.5q0 20 9 37l185 444l-384 922q-9 17 -9 37zM427 1280 q0 31 20 54l243 243q24 23 57 23t56.5 -23.5t23.5 -56.5q0 -32 -22 -56l-243 -243q-23 -21 -55 -21q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="þ" d="M80 -400v1922q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-568q168 168 400 168t396 -164t164 -396t-164 -396t-396 -164t-400 168v-570q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM240 562q0 -166 117 -283t283 -117t283 117t117 283t-117 283 t-283 117t-283 -117t-117 -283z" />
|
||||
<glyph unicode="ÿ" horiz-adv-x="1120" d="M80 1040q0 33 23.5 56.5t56.5 23.5t57 -23q13 -14 19 -30l324 -777l324 777q6 16 20 30q23 23 56 23t56.5 -23.5t23.5 -56.5q0 -20 -9 -37l-596 -1430q-6 -16 -19 -29q-24 -24 -57 -24t-56.5 23.5t-23.5 56.5q0 20 9 37l185 444l-384 922q-9 17 -9 37zM220 1360 q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5zM700 1360q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5z" />
|
||||
<glyph unicode="ı" horiz-adv-x="480" d="M160 80v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="Œ" horiz-adv-x="2160" d="M80 800q0 331 234.5 565.5t565.5 234.5h1121q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-881v-560h641q33 0 56.5 -23.5t23.5 -56.5q0 -34 -23.5 -57.5t-56.5 -23.5h-641v-559h880q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-1120 q-331 0 -565.5 234.5t-234.5 565.5zM240 800q0 -265 187.5 -452.5t452.5 -187.5h80v1280h-80q-265 0 -452.5 -187.5t-187.5 -452.5z" />
|
||||
<glyph unicode="œ" horiz-adv-x="2240" d="M80 560q0 232 164 396t396 164t396 -164q49 -49 84 -105q35 56 84 105q164 164 396 164t396 -164t164 -396q0 -33 -23.5 -56.5t-56.5 -23.5h-873q22 -115 110 -203q117 -117 283 -117q150 0 258 95q22 17 50 17q33 0 56.5 -23.5t23.5 -56.5t-23 -57q-155 -135 -365 -135 q-232 0 -396 164q-49 49 -84 105q-35 -56 -84 -105q-164 -164 -396 -164t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283zM1207 640h786q-22 115 -110 203q-117 117 -283 117t-283 -117q-88 -88 -110 -203z " />
|
||||
<glyph unicode="Ÿ" d="M80 1520q0 33 23.5 56.5t56.5 23.5q41 0 65 -33l415 -622l415 622q24 33 65 33q33 0 56.5 -23.5t23.5 -56.5q0 -25 -13 -45l-467 -699v-696q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v696l-467 699q-13 20 -13 45zM300 1840q0 41 29.5 70.5t70.5 29.5 t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5zM780 1840q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5z" />
|
||||
<glyph unicode="ˆ" horiz-adv-x="800" d="M80 1320q0 40 40 70l239 159q18 11 41 11t41 -11l239 -159q40 -30 40 -70q0 -33 -23.5 -56.5t-56.5 -23.5q-29 0 -50 17l-190 126l-190 -126q-21 -17 -50 -17q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="˚" horiz-adv-x="560" d="M80 1399q0 83 59 142t143 59q83 0 142 -59t59 -142q0 -84 -59 -143t-142 -59q-84 0 -143 59t-59 143zM181 1399q0 -42 29.5 -71.5t71.5 -29.5q41 0 70.5 29.5t29.5 71.5q0 41 -29.5 70.5t-70.5 29.5q-42 0 -71.5 -29.5t-29.5 -70.5z" />
|
||||
<glyph unicode="˜" horiz-adv-x="960" d="M71 1391q0 33 23.5 56.5t56.5 23.5q32 0 56 -22q47 -48 113 -48q56 0 100 35q89 80 212 80q133 0 227 -94q22 -24 22 -56q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -56 22q-47 48 -113 48q-57 0 -100 -35q-90 -80 -212 -80q-133 0 -227 94q-22 24 -22 56z" />
|
||||
<glyph unicode=" " horiz-adv-x="1040" />
|
||||
<glyph unicode=" " horiz-adv-x="2080" />
|
||||
<glyph unicode=" " horiz-adv-x="1040" />
|
||||
<glyph unicode=" " horiz-adv-x="2080" />
|
||||
<glyph unicode=" " horiz-adv-x="693" />
|
||||
<glyph unicode=" " horiz-adv-x="520" />
|
||||
<glyph unicode=" " horiz-adv-x="346" />
|
||||
<glyph unicode=" " horiz-adv-x="346" />
|
||||
<glyph unicode=" " horiz-adv-x="260" />
|
||||
<glyph unicode=" " horiz-adv-x="416" />
|
||||
<glyph unicode=" " horiz-adv-x="115" />
|
||||
<glyph unicode="‐" horiz-adv-x="800" d="M80 560q0 33 23.5 56.5t56.5 23.5h480q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-480q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="‑" horiz-adv-x="800" d="M80 560q0 33 23.5 56.5t56.5 23.5h480q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-480q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="‒" horiz-adv-x="800" d="M80 560q0 33 23.5 56.5t56.5 23.5h480q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-480q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="–" horiz-adv-x="800" d="M-80 560q0 33 23.5 56.5t56.5 23.5h800q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-800q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="—" horiz-adv-x="1920" d="M-80 560q0 33 23.5 56.5t56.5 23.5h1920q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-1920q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="‘" horiz-adv-x="480" d="M120 1225q0 175 152 358q17 17 42 17q24 0 41.5 -17.5t17.5 -41.5q0 -14 -5 -26q-98 -237 -3 -435q8 -18 8 -40q0 -41 -29.5 -70.5t-70.5 -29.5q-62 0 -90 58q-63 112 -63 227z" />
|
||||
<glyph unicode="’" horiz-adv-x="480" d="M120 999q0 14 5 26q98 237 3 435q-8 18 -8 40q0 41 29.5 70.5t70.5 29.5q62 0 90 -58q63 -112 63 -227q0 -175 -152 -358q-17 -17 -42 -17q-24 0 -41.5 17.5t-17.5 41.5z" />
|
||||
<glyph unicode="‚" horiz-adv-x="480" d="M120 219q0 41 29.5 70.5t70.5 29.5q62 0 90 -58q63 -112 63 -227q0 -175 -152 -358q-17 -17 -42 -17q-24 0 -41.5 17.5t-17.5 41.5q0 14 5 26q98 237 3 435q-8 18 -8 40z" />
|
||||
<glyph unicode="“" horiz-adv-x="760" d="M80 1227q0 175 152 358q17 17 42 17q24 0 41.5 -17.5t17.5 -41.5q0 -14 -5 -26q-98 -237 -3 -435q8 -18 8 -40q0 -41 -29.5 -70.5t-70.5 -29.5q-62 0 -90 58q-63 112 -63 227zM427 1227q0 175 152 358q17 17 42 17q24 0 41.5 -17.5t17.5 -41.5q0 -14 -5 -26 q-98 -237 -3 -435q8 -18 8 -40q0 -41 -29.5 -70.5t-70.5 -29.5q-62 0 -90 58q-63 112 -63 227z" />
|
||||
<glyph unicode="”" horiz-adv-x="760" d="M80 1001q0 14 5 26q98 237 3 435q-8 18 -8 40q0 41 29.5 70.5t70.5 29.5q62 0 90 -58q63 -112 63 -227q0 -175 -152 -358q-17 -17 -42 -17q-24 0 -41.5 17.5t-17.5 41.5zM427 1001q0 14 5 26q98 237 3 435q-8 18 -8 40q0 41 29.5 70.5t70.5 29.5q62 0 90 -58 q63 -112 63 -227q0 -175 -152 -358q-17 -17 -42 -17q-24 0 -41.5 17.5t-17.5 41.5z" />
|
||||
<glyph unicode="„" horiz-adv-x="760" d="M80 220q0 41 29.5 70.5t70.5 29.5q62 0 90 -58q63 -112 63 -227q0 -175 -152 -358q-17 -17 -42 -17q-24 0 -41.5 17.5t-17.5 41.5q0 14 5 26q98 237 3 435q-8 18 -8 40zM427 220q0 41 29.5 70.5t70.5 29.5q62 0 90 -58q63 -112 63 -227q0 -175 -152 -358q-17 -17 -42 -17 q-24 0 -41.5 17.5t-17.5 41.5q0 14 5 26q98 237 3 435q-8 18 -8 40z" />
|
||||
<glyph unicode="•" horiz-adv-x="800" d="M160 800q0 99 70.5 169.5t169.5 70.5t169.5 -70.5t70.5 -169.5t-70.5 -169.5t-169.5 -70.5t-169.5 70.5t-70.5 169.5z" />
|
||||
<glyph unicode="…" horiz-adv-x="1440" d="M80 120q0 50 35 85t85 35t85 -35t35 -85t-35 -85t-85 -35t-85 35t-35 85zM560 120q0 50 35 85t85 35t85 -35t35 -85t-35 -85t-85 -35t-85 35t-35 85zM1040 120q0 50 35 85t85 35t85 -35t35 -85t-35 -85t-85 -35t-85 35t-35 85z" />
|
||||
<glyph unicode=" " horiz-adv-x="416" />
|
||||
<glyph unicode="‹" horiz-adv-x="560" d="M80 559q0 20 10 39l236 472q6 14 18 26q23 23 56 23t56.5 -23.5t23.5 -56.5q0 -18 -7 -34l-223 -445l223 -446q7 -16 7 -34q0 -33 -23.5 -56.5t-56.5 -23.5t-56 24q-12 11 -18 25l-234 467q-12 22 -12 43z" />
|
||||
<glyph unicode="›" horiz-adv-x="560" d="M80 80q0 18 7 34l223 446l-223 445q-7 16 -7 34q0 33 23.5 56.5t56.5 23.5t56 -23q12 -12 18 -26l236 -472q10 -19 10 -39q0 -21 -12 -43l-234 -467q-6 -14 -18 -25q-23 -24 -56 -24t-56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode=" " horiz-adv-x="520" />
|
||||
<glyph unicode="€" horiz-adv-x="1480" d="M80 800q0 331 234.5 565.5t565.5 234.5q286 0 509 -183q23 -24 23 -57t-23.5 -56.5t-56.5 -23.5t-57 24q-169 136 -395 136q-265 0 -452 -187q-97 -97 -143 -213h915q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-956q-4 -39 -4 -80t4 -80h956q33 0 56.5 -23.5 t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-915q46 -116 143 -212q187 -188 452 -188q229 0 400 140q20 14 46 14q33 0 56.5 -23.5t23.5 -56.5t-23 -56q-223 -178 -503 -178q-331 0 -565.5 234.5t-234.5 565.5z" />
|
||||
<glyph unicode="™" horiz-adv-x="1500" d="M80.001 1568.04q0 13.2012 10.5752 22.6016t25.4258 9.40039h468.013q14.8506 0 25.4258 -9.40039t10.5752 -22.6016t-10.5752 -22.6016t-25.4258 -9.40039h-198.005v-544.033q0 -13.2012 -10.5762 -22.6016q-10.5752 -9.40039 -25.4258 -9.40039 q-14.8496 0 -25.4248 9.40039t-10.5752 22.6016v544.033h-198.006q-14.8506 0 -25.4258 9.40039t-10.5752 22.6016zM680.001 992.002v576.035q0 13.2012 10.5752 22.6016t25.4258 9.40039q21.6006 0 31.9512 -16.8008l292.058 -519.632l292.058 519.632 q10.3506 16.8008 31.9512 16.8008q14.8506 0 25.4258 -9.40039t10.5752 -22.6016v-576.035q0 -13.2012 -10.5752 -22.6016t-25.4258 -9.40039t-25.4258 9.40039t-10.5752 22.6016v440.427l-256.957 -456.828q-9.4502 -15.6006 -31.0508 -15.6006q-22.501 0 -33.3008 19.6016 l-254.707 452.827v-440.427q0 -13.2012 -10.5752 -22.6016t-25.4258 -9.40039t-25.4258 9.40039t-10.5752 22.6016z" />
|
||||
<glyph unicode="" horiz-adv-x="1120" d="M0 1120h1120v-1120h-1120v1120z" />
|
||||
<glyph unicode="" horiz-adv-x="1120" d="M80 980q0 33 23.5 56.5t56.5 23.5h80v60q0 480 440 480q380 0 380 -240q0 -41 -29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5q0 80 -180 80q-280 0 -280 -320v-60h241q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-241v-820q0 -33 -23.5 -56.5t-56.5 -23.5 t-56.5 23.5t-23.5 56.5v820h-80q-33 0 -56.5 23.5t-23.5 56.5zM880 80v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="fi" horiz-adv-x="1120" d="M80 980q0 33 23.5 56.5t56.5 23.5h80v60q0 480 440 480q380 0 380 -240q0 -41 -29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5q0 80 -180 80q-280 0 -280 -320v-60h241q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-241v-820q0 -33 -23.5 -56.5t-56.5 -23.5 t-56.5 23.5t-23.5 56.5v820h-80q-33 0 -56.5 23.5t-23.5 56.5zM880 80v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="" horiz-adv-x="1200" d="M80 980q0 33 23.5 56.5t56.5 23.5h80v60q0 480 480 480q240 0 240 -240v-1200h80q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-160q-33 0 -56.5 23.5t-23.5 56.5v1280q0 80 -80 80q-320 0 -320 -320v-60h241q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5 t-56.5 -23.5h-241v-820q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v820h-80q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="fl" horiz-adv-x="1200" d="M80 980q0 33 23.5 56.5t56.5 23.5h80v60q0 480 480 480q240 0 240 -240v-1200h80q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-160q-33 0 -56.5 23.5t-23.5 56.5v1280q0 80 -80 80q-320 0 -320 -320v-60h241q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5 t-56.5 -23.5h-241v-820q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v820h-80q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="ffi" horiz-adv-x="2080" d="M1740 1360q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5zM1760 80v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM880 980q0 33 23.5 56.5 t56.5 23.5h80v60q0 480 480 480q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5q-320 0 -320 -320v-60h241q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-241v-820q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v820h-80q-33 0 -56.5 23.5 t-23.5 56.5zM80 980q0 33 23.5 56.5t56.5 23.5h80v60q0 480 480 480q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5q-320 0 -320 -320v-60h241q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-241v-820q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5 v820h-80q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
<glyph unicode="ffl" horiz-adv-x="2080" d="M1680 80v1440q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-1360h80q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-160q-33 0 -56.5 23.5t-23.5 56.5zM880 980q0 33 23.5 56.5t56.5 23.5h80v60q0 480 480 480q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5 t-56.5 -23.5q-320 0 -320 -320v-60h241q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-241v-820q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v820h-80q-33 0 -56.5 23.5t-23.5 56.5zM80 980q0 33 23.5 56.5t56.5 23.5h80v60q0 480 480 480 q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5q-320 0 -320 -320v-60h241q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-241v-820q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v820h-80q-33 0 -56.5 23.5t-23.5 56.5z" />
|
||||
</font>
|
||||
</defs></svg>
|
Before Width: | Height: | Size: 80 KiB |
|
@ -1,26 +0,0 @@
|
|||
/* Generated by Font Squirrel (http://www.fontsquirrel.com) on February 9, 2012 */
|
||||
|
||||
|
||||
|
||||
@font-face {
|
||||
font-family: 'Comfortaa';
|
||||
src: url('comfortaa-regular-webfont.eot');
|
||||
src: url('comfortaa-regular-webfont.eot?#iefix') format('embedded-opentype'),
|
||||
url('comfortaa-regular-webfont.woff') format('woff'),
|
||||
url('comfortaa-regular-webfont.svg#ComfortaaRegular') format('svg');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Lobster';
|
||||
src: url('lobster-webfont.eot');
|
||||
src: url('lobster-webfont.eot?#iefix') format('embedded-opentype'),
|
||||
url('lobster-webfont.woff') format('woff'),
|
||||
url('lobster-webfont.svg#Lobster1.4Regular') format('svg');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
|
||||
}
|
||||
|
|
@ -1,247 +0,0 @@
|
|||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg">
|
||||
<metadata>
|
||||
This is a custom SVG webfont generated by Font Squirrel.
|
||||
Copyright : Copyright c 2010 by Pablo Impallari wwwimpallaricom All rights reserved
|
||||
Designer : Pablo Impallari
|
||||
Foundry : Pablo Impallari wwwimpallaricom
|
||||
Foundry URL : wwwimpallaricom
|
||||
</metadata>
|
||||
<defs>
|
||||
<font id="Lobster1.4Regular" horiz-adv-x="1034" >
|
||||
<font-face units-per-em="2048" ascent="1638" descent="-410" />
|
||||
<missing-glyph horiz-adv-x="444" />
|
||||
<glyph unicode=" " horiz-adv-x="444" />
|
||||
<glyph unicode="	" horiz-adv-x="444" />
|
||||
<glyph unicode=" " horiz-adv-x="444" />
|
||||
<glyph unicode="!" horiz-adv-x="526" d="M70 163.5q0 67.5 48 115t115.5 47.5t114.5 -47.5t47 -114.5t-47 -115.5t-114.5 -48.5t-115.5 48t-48 115.5zM201 473l145 961h295l-266 -961h-174z" />
|
||||
<glyph unicode=""" horiz-adv-x="860" d="M127 1149l125 387h215l-186 -387h-154zM449 1149l124 387h215l-186 -387h-153z" />
|
||||
<glyph unicode="#" horiz-adv-x="1350" d="M92 227l43 209h213l43 232h-209l43 209h203l107 593h180l-133 -593h215l106 593h180l-133 -593h213l-41 -209h-217l-51 -232h219l-41 -209h-225l-62 -282h-116l51 282h-242l-61 -282h-117l51 282h-219zM485 436h232l43 232h-223z" />
|
||||
<glyph unicode="$" horiz-adv-x="825" d="M49 455q0 79 43.5 127.5t95.5 48.5t74.5 -15.5t22.5 -35.5q-82 -17 -82 -152q0 -45 25.5 -77t60.5 -48l73 402l-76 59q-87 67 -114 119.5t-27 105.5q0 104 98 182t218 82l39 217h118l-51 -223q80 -14 113 -41q65 -50 65 -126q0 -158 -98 -158q-41 0 -80 47q49 29 49 106 q0 23 -15 49.5t-50 40.5l-74 -329l80 -58q152 -105 152 -251.5t-101.5 -225t-267.5 -82.5l-59 -274h-56l49 276q-94 7 -160 60q-65 53 -65 174zM340 1013.5q0 -55.5 57 -114.5l49 277q-60 -14 -83 -60.5t-23 -102zM358 295q73 10 105 63q31 53 31 128.5t-60 148.5z" />
|
||||
<glyph unicode="%" horiz-adv-x="1319" d="M219 986q0 200 90 326t242 126q90 0 129 -59.5t39 -189t-83 -276.5t-226 -147q-109 0 -150 58t-41 162zM248 0l790 1536h148l-791 -1536h-147zM367 1016q0 -92 10 -133t47 -41q76 0 124 117.5t48 277.5q0 53 -9 91t-42 38q-51 0 -103 -78q-75 -114 -75 -272zM727 218 q0 202 90 328t242 126q91 0 139.5 -59t48.5 -194.5t-73 -263.5q-87 -155 -251 -155q-114 0 -155 57t-41 161zM864 209q0 -51 10 -92t48 -41q74 0 119.5 109t45.5 260t-57 151q-49 0 -96 -76q-70 -110 -70 -311z" />
|
||||
<glyph unicode="&" horiz-adv-x="1397" d="M23 394q0 164 97 294t273 166q-203 109 -203 311q0 148 124 259.5t331 111.5q157 0 267 -68.5t110 -205.5q0 -189 -143 -189q-72 0 -117 53q34 11 62 68.5t28 85.5q0 166 -135 166q-109 0 -179.5 -74t-70.5 -170.5t62 -188.5q63 -91 208 -157q-184 -77 -270 -185.5 t-86 -223.5t70.5 -195t169.5 -80q195 0 305 199q41 74 65 186l-75 8q-35 4 -70 4q-134 0 -193 -92l-14 2q31 127 133 208t262 81l156 -10q55 0 111.5 20.5t82.5 67.5h13q0 -89 -94 -177.5t-218 -107.5q-123 -443 -389 -542q-83 -31 -219.5 -31t-215.5 35t-132 93 q-106 114 -106 278z" />
|
||||
<glyph unicode="'" horiz-adv-x="549" d="M209 1149l125 387h215l-187 -387h-153z" />
|
||||
<glyph unicode="(" horiz-adv-x="895" d="M283 205q0 196 47 403q97 432 345 713q127 143 275 215l27 -82q-225 -111 -387 -510q-99 -240 -138 -523q-20 -138 -20 -271q0 -376 150 -603l-68 -59q-231 254 -231 717z" />
|
||||
<glyph unicode=")" horiz-adv-x="846" d="M-59 -430q115 57 213 193q202 270 289 703q42 208 42 408q0 378 -149 603l67 59q120 -132 176 -320t56 -392q0 -423 -181 -799q-87 -182 -211.5 -323t-275.5 -214z" />
|
||||
<glyph unicode="*" horiz-adv-x="1055" d="M176 1026l223 129l-223 129l62 107l219 -127v276h131v-276l219 127l61 -107l-223 -129l223 -129l-61 -106l-219 127v-277h-131v277l-219 -127z" />
|
||||
<glyph unicode="+" horiz-adv-x="1055" d="M109 420l49 229h262l55 250h232l-56 -250h260l-47 -229h-262l-55 -252h-232l56 252h-262z" />
|
||||
<glyph unicode="," horiz-adv-x="442" d="M49 143q0 77 46.5 125.5t115.5 48.5q100 0 130 -93q9 -29 9 -68q0 -91 -72.5 -211.5t-193.5 -202.5q-18 12 -18 37q0 33 53 89t53 87t-34 53q-89 58 -89 135z" />
|
||||
<glyph unicode="-" horiz-adv-x="594" d="M39 455l37 161h409l-34 -161h-412z" />
|
||||
<glyph unicode="." horiz-adv-x="539" d="M63 153q0 67 47 116q48 48 115.5 48t115.5 -48t48 -116t-48.5 -114.5t-115 -46.5t-115.5 47q-47 47 -47 114z" />
|
||||
<glyph unicode="/" horiz-adv-x="637" d="M23 -512l434 2048h147l-434 -2048h-147z" />
|
||||
<glyph unicode="0" horiz-adv-x="1118" d="M61 486q0 588 293 876q177 174 418 174q365 0 365 -521q0 -360 -169 -676q-190 -357 -496 -357q-236 0 -332 141q-79 118 -79 363zM375 463q0 -309 121 -309q88 0 156 86q135 168 190 539q26 176 26 297q0 204 -18 268q-25 86 -90.5 86t-145.5 -96q-134 -162 -198 -452 q-41 -180 -41 -419z" />
|
||||
<glyph unicode="1" horiz-adv-x="649" d="M43 0l270 1278h-194l24 94q115 0 194 20q166 43 327 140l-326 -1532h-295z" />
|
||||
<glyph unicode="2" horiz-adv-x="1008" d="M-23 27v34q0 112 49 204q81 152 284 353.5t291 389.5q50 111 50 247q0 76 -40 122t-88 46q-94 0 -128.5 -40t-34.5 -119t42 -124q15 -16 36 -22q-78 -69 -148.5 -69t-112.5 47t-42 118q0 138 104 229t318 91q389 0 389 -330q0 -281 -300 -534l-164 -136 q-81 -65 -151.5 -129.5t-113.5 -134.5h10q92 0 184.5 -18.5t176 -18.5t119.5 9q64 17 123 72l63 61q2 -25 2 -47v-43q0 -163 -49.5 -235.5t-179.5 -72.5t-229.5 25.5t-157 37t-105.5 11.5q-63 0 -114 -23l-78 -34q-5 16 -5 33z" />
|
||||
<glyph unicode="3" horiz-adv-x="1053" d="M12 343q0 123 62 206q63 82 194 82t152 -105q-180 -12 -180 -221q0 -152 98 -175q28 -7 75.5 -7t100.5 28.5t90 76.5q76 99 76 241q0 198 -150 320q-51 42 -122 67q162 47 256 164.5t94 234.5q0 168 -174 168q-57 0 -100.5 -43.5t-43.5 -99.5q0 -140 78 -162 q-77 -69 -156 -69q-100 0 -136 99q-11 33 -11 88.5t33 113t90 98.5q120 86 300.5 86t281 -87t100.5 -201t-69.5 -217t-211.5 -175q135 -45 196.5 -136.5t61.5 -201.5q0 -197 -157 -356q-167 -169 -412 -169q-58 0 -122 9q-161 26 -247 150q-47 70 -47 193z" />
|
||||
<glyph unicode="4" horiz-adv-x="975" d="M16 563q18 56 47 120l129 277q123 271 123 453q0 64 -14 123q152 0 209 -110q18 -37 18 -109.5t-31.5 -155t-78 -157.5t-98 -145.5t-91.5 -143.5h320l166 780l303 41l-176 -821h131l-41 -152h-123l-119 -563h-295l121 563h-500z" />
|
||||
<glyph unicode="5" horiz-adv-x="1059" d="M31 285q0 147 79 218.5t195.5 71.5t136.5 -104q-80 -11 -132 -57t-52 -133.5t56 -124.5q42 -29 109 -29q122 0 192.5 115t70.5 262.5t-60 222t-154.5 74.5t-155.5 -29q-113 -55 -160 -86l168 817q54 -6 102 -12l93 -11q94 -12 173 -12q164 0 332 66q4 -32 4 -74 q0 -98 -55.5 -164.5t-179.5 -66.5q-80 0 -196 23.5t-146 27.5l-82 -371q132 64 241 64q191 0 283 -121t92 -303q0 -234 -140 -386q-160 -173 -454 -173q-360 0 -360 295z" />
|
||||
<glyph unicode="6" horiz-adv-x="1018" d="M33 395v37q0 137 32 304t75 286q90 242 248 378t378 136q108 0 171.5 -51t63.5 -110.5t-44 -100.5t-138 -45q33 31 33 72.5t-29 76.5t-73 35q-100 0 -202 -121.5t-172 -401.5q-38 -149 -54.5 -308.5t-16.5 -221.5q0 -126 40 -168t107 -42q118 0 206 134q92 136 92 282 q0 214 -107 214t-182 -155q-41 59 -41 111q0 96 85 154t181 58t148.5 -30.5t85.5 -78.5q65 -92 65 -227q0 -265 -165 -443.5t-388 -178.5q-326 0 -382 250q-17 73 -17 155z" />
|
||||
<glyph unicode="7" horiz-adv-x="950" d="M68 246q0 136 52 266q98 240 347 542l246 292q-90 12 -174 12q-295 0 -424 -146q-17 74 -17 122q0 101 65 151.5t214 50.5h672l-195 -298l-260 -414q-143 -239 -162 -281q-65 -151 -65 -264q0 -62 22.5 -107t77.5 -92q-30 -80 -179 -80q-113 0 -166.5 55t-53.5 191z" />
|
||||
<glyph unicode="8" horiz-adv-x="1022" d="M-16 392.5q0 159.5 95.5 284.5t272.5 177q-174 101 -174 279q0 153 130.5 277t320.5 124t291.5 -85t101.5 -200.5t-71 -219.5t-216 -175q130 -40 189 -128t59 -170.5t-19 -147.5t-54 -126q-77 -130 -206.5 -211t-287.5 -81q-202 0 -317 121.5t-115 281zM281 340 q0 -95 37.5 -149t98.5 -54q108 0 176.5 103.5t68.5 240.5q0 190 -130 303q-183 -125 -236 -334q-15 -61 -15 -110zM446 1188q0 -169 109 -264q145 94 193 274q14 50 14 103.5t-25.5 94t-76.5 40.5q-96 0 -155 -80.5t-59 -167.5z" />
|
||||
<glyph unicode="9" horiz-adv-x="1001" d="M59 184q0 152 177 152q-29 -29 -29 -72t31.5 -77.5t64.5 -34.5t51.5 2t59.5 19t74 47q88 78 157.5 261t93.5 516q4 78 4 107q0 176 -44 236.5t-139 60.5t-176 -141.5t-81 -303.5q0 -84 25.5 -147.5t89.5 -63.5q125 0 172 123q43 -51 43 -102q0 -78 -81 -133t-208 -55 t-200.5 108.5t-73.5 249.5q0 254 153.5 427t376.5 173q395 0 395 -481q0 -310 -83 -549.5t-241.5 -377.5t-369.5 -138q-111 0 -176.5 59.5t-65.5 134.5z" />
|
||||
<glyph unicode=":" horiz-adv-x="547" d="M84 276q0 67 46.5 115.5t114.5 48.5t116.5 -48t48.5 -116t-49 -114.5t-116 -46.5t-114 47t-47 114zM186 767.5q0 67.5 47 116.5q48 48 115.5 48t115.5 -48t48 -116.5t-48.5 -115t-115 -46.5t-115.5 47q-47 47 -47 114.5z" />
|
||||
<glyph unicode=";" horiz-adv-x="565" d="M94 176q0 77 46.5 125.5t115.5 48.5q100 0 130 -94q9 -28 9 -68q0 -91 -73 -212t-193 -201q-18 12 -18 37q0 33 53 89t53 86t-27 50q-96 62 -96 139zM193 677q0 67 46.5 116t114.5 49t116 -48.5t48 -116.5t-48.5 -114.5t-115.5 -46.5t-114 47t-47 114z" />
|
||||
<glyph unicode="<" horiz-adv-x="735" d="M41 487l18 84l629 308l-20 -113l-494 -246l397 -196l-24 -117z" />
|
||||
<glyph unicode="=" horiz-adv-x="1055" d="M66 207l49 229h753l-47 -229h-755zM156 647l49 230h753l-47 -230h-755z" />
|
||||
<glyph unicode=">" horiz-adv-x="705" d="M31 207l28 117l492 196l-397 246l18 113l504 -308l-23 -110z" />
|
||||
<glyph unicode="?" horiz-adv-x="903" d="M98 163.5q0 67.5 48.5 115t116 47.5t114.5 -47.5t47 -114.5t-47 -115.5t-114.5 -48.5t-116.5 48q-48 48 -48 115.5zM113 1087q0 141 99 234q118 113 331 113q275 0 316 -152q12 -43 12 -80t-1 -40q0 -207 -208 -364l-111 -90q-132 -111 -172 -233h-135q0 120 96 243 q42 52 90 102t90 104q96 127 96 246q0 153 -116 153q-57 0 -108.5 -49t-51.5 -120.5t41 -113.5q15 -16 37 -22q-54 -86 -150 -86q-60 0 -107.5 43t-47.5 112z" />
|
||||
<glyph unicode="@" horiz-adv-x="1151" d="M-16 336q0 335 206 570q130 149 308 206q90 28 162 28t126 -10q126 -23 187 -141q33 -64 33 -167t-30 -199.5t-79 -173t-111.5 -123.5t-127 -47t-91.5 47q-53 -80 -121 -80q-131 0 -131 136.5t60 279t131 195.5q37 27 83 27l1 1q45 0 74 -37l8 33l112 -13l-92 -393 q-8 -26 -8 -56t29 -30q80 0 142 339q13 74 13 110q0 79 -34 118q-44 54 -132.5 54t-153.5 -27.5t-118 -74.5q-104 -94 -162.5 -247t-58.5 -297t53 -201t180.5 -57t198.5 32.5t125 103.5q47 -19 47 -80q0 -112 -111 -174q-114 -66 -310.5 -66t-302 94.5t-105.5 319.5z M449 434q0 -63 36 -63q26 0 68 28q0 20 6 43l88 340q-14 17 -48 17t-65 -46q-67 -99 -83 -281q-2 -22 -2 -38z" />
|
||||
<glyph unicode="A" horiz-adv-x="1368" d="M18 684q0 106 119 180q121 74 299 74q41 0 107 -6q166 261 352.5 432.5t359.5 171.5q104 0 162 -29l-321 -1507h-295l157 743q-136 62 -274 74q-184 -407 -246 -747q-20 -109 -20 -186.5t28 -116.5q-121 0 -170 25q-104 52 -104 192q0 212 178 596q56 120 123 237 q-96 -6 -157.5 -29.5t-82.5 -76.5q9 0 18 -20.5t9 -50.5t-33.5 -51.5t-70.5 -21.5q-67 0 -102.5 31.5t-35.5 85.5zM727 905q143 -28 250 -71l119 557q-176 -96 -369 -486z" />
|
||||
<glyph unicode="B" horiz-adv-x="1313" d="M25 993q0 108 61 204.5t164 172.5q229 166 518 166q214 0 325 -94.5t111 -231.5q0 -92 -52 -180t-153 -145q124 -25 183 -115t59 -215q0 -73 -21 -175q-48 -226 -212 -351q-85 -64 -217.5 -64t-180.5 75q-20 30 -20 78.5t26 117.5q69 -74 132 -74q108 0 163 126 q45 102 45 242q0 261 -194 261q-45 0 -94 -7l-168 -784h-295l278 1303l303 40l-96 -454h12q118 0 206.5 106t88.5 226q0 150 -145 203q-52 18 -118.5 18t-128 -13.5t-117.5 -40.5q-125 -61 -199 -173.5t-74 -270.5q0 -81 25 -125q4 -8 4 -14q-162 0 -204 100q-15 36 -15 88z " />
|
||||
<glyph unicode="C" horiz-adv-x="1018" d="M39 457q0 257 85 513q99 302 292 452q148 114 338 114q238 0 315 -149q27 -52 27 -125q0 -189 -144 -189q-72 0 -116 53q37 20 65.5 75t28.5 109.5t-28.5 92t-91 37.5t-116 -42t-100.5 -114q-95 -144 -155 -368t-60 -406.5t53.5 -264t183.5 -81.5q256 0 408 205l47 -21 q-98 -248 -373 -344q-108 -38 -212 -38h-6q-227 2 -334 118t-107 373z" />
|
||||
<glyph unicode="D" horiz-adv-x="1358" d="M12 1004q0 61 27.5 128.5t77.5 127.5q102 123 278 199.5t379 76.5q369 0 494 -298q53 -127 53 -298.5t-47 -345.5q-97 -363 -305 -535q-104 -86 -221.5 -86t-243.5 109l-17 -82h-294l278 1303l303 40l-246 -1148q56 -41 117 -41q92 0 165 82q141 159 200 503 q28 158 28 316q0 387 -299 387q-234 0 -385 -135t-151 -363q0 -83 23 -125q5 -8 5 -14q-162 0 -204 101q-15 37 -15 98z" />
|
||||
<glyph unicode="E" horiz-adv-x="940" d="M14 332q0 162 105 321t274 201q-125 91 -125 251t130 297.5t319 137.5q127 0 210 -66.5t83 -174t-45 -168t-104 -60.5t-99 55q36 14 63 68t27 113.5t-36 85.5q-37 26 -80 26q-86 0 -146 -88.5t-60 -200.5q0 -154 112 -232q40 -28 95 -42q-156 -34 -261 -187t-105 -302 q0 -86 45 -146.5t148 -60.5t213.5 55t166.5 154l47 -21q-81 -178 -246.5 -281.5t-353 -103.5t-282.5 103.5t-95 265.5z" />
|
||||
<glyph unicode="F" horiz-adv-x="940" d="M18 1027q0 79 38 175t122 170q185 164 539 164q67 0 154 -12.5t190 -12.5t180 25l-19 -69q-37 -147 -175 -177q-111 0 -287 39l-86 -407h299l-33 -152h-299l-166 -770h-295l295 1368q-130 -4 -198 -98q-68 -93 -68 -326q0 -81 25 -125q4 -8 4 -14q-165 0 -206 105 q-14 38 -14 117z" />
|
||||
<glyph unicode="G" horiz-adv-x="1184" d="M39 748q0 148 49 290q75 213 251.5 355.5t428 142.5t344.5 -149q33 -52 33 -125q0 -189 -144 -189q-95 0 -141 53q34 13 62 69t28 84q0 161 -141 161q-83 0 -166.5 -65t-147 -166t-102.5 -228t-39 -222q0 -174 59 -270t177 -96t176 76l88 389l264 -2l-168 -770 q-52 -253 -169 -381.5t-355 -128.5q-136 0 -210.5 83t-74.5 197t67.5 198.5t169 84.5t137.5 -17q77 -34 77 -120q0 -37 -12 -82q-63 53 -129 53t-102 -49.5t-36 -104t31.5 -98t82.5 -43.5t81 10q92 29 139 242l82 367q-136 -74 -256 -74q-229 0 -340 156q-94 133 -94 369z " />
|
||||
<glyph unicode="H" horiz-adv-x="1362" d="M25 1004q0 103 65 198q131 195 396 289q127 45 257 45q42 0 82 -4l-131 -610h301l131 610h295l-325 -1532h-295l164 770h-301l-164 -770h-295l297 1393q-136 -58 -211.5 -171t-75.5 -278q0 -81 25 -125q4 -8 4 -14q-166 0 -205 105q-14 38 -14 94z" />
|
||||
<glyph unicode="I" horiz-adv-x="768" d="M12 1004q0 103 64.5 198.5t166.5 169.5q233 164 488 164q42 0 82 -4l-326 -1532h-294l296 1391q-286 -120 -286 -447q0 -83 23 -125q5 -8 5 -14q-164 0 -205 105q-14 38 -14 94z" />
|
||||
<glyph unicode="J" horiz-adv-x="1098" d="M35 -144.5q0 119.5 67 201.5t168.5 82t137.5 -17q77 -34 77 -120q0 -37 -12 -82q-57 46 -82.5 49.5t-40.5 3.5q-71 0 -107 -47t-36 -96q0 -82 42.5 -117t86.5 -35q83 0 126 49.5t79 202.5l321 1463q-135 -56 -212 -169.5t-77 -279.5q0 -81 25 -125q4 -8 4 -14 q-164 0 -204 105q-15 38 -15 94q0 103 64.5 198.5t166.5 169.5q233 164 488 164h82l-307 -1454q-54 -250 -176.5 -378t-362.5 -128q-148 0 -226 80q-77 80 -77 199.5z" />
|
||||
<glyph unicode="K" horiz-adv-x="1231" d="M12 1004q0 103 64.5 198.5t166.5 169.5q233 164 488 164q42 0 82 -4l-133 -627l450 603l15 18h215l-569 -656l71 2q205 0 242 -132q12 -40 12 -95q0 -83 -50 -265t-50 -237q0 -113 80 -143q-128 -35 -203 -35q-160 0 -160 137q1 72 54.5 262.5t54.5 276.5q0 139 -123 139 q-28 0 -68 -8l-164 -772h-294l296 1393q-136 -58 -211 -171t-75 -278q0 -83 23 -125q5 -8 5 -14q-164 0 -205 105q-14 38 -14 94z" />
|
||||
<glyph unicode="L" horiz-adv-x="776" d="M12 983q0 200 231 368q234 165 488 165q32 0 82 -5l-315 -1470q84 -19 177 -69l149 -81q207 -114 362 -114q94 0 172 33q-16 -146 -72.5 -234t-140.5 -88q-132 0 -313 140l-234 180q-198 145 -367 145h-23q-11 0 -24 -2l305 1419q-136 -55 -211 -167t-75 -279 q0 -83 23 -125q5 -8 5 -15q-164 0 -205 105q-14 38 -14 94z" />
|
||||
<glyph unicode="M" horiz-adv-x="1612" d="M137 0l520 1407q-153 -51 -239 -168t-86 -293q0 -88 24 -128q4 -7 4 -13q-219 0 -219 186q0 194 209 371q91 78 208.5 126t214.5 48t175 -29l-47 -1079l451 1079h295l-215 -1507h-295l131 920l-385 -920h-281l41 924l-342 -924h-164z" />
|
||||
<glyph unicode="N" horiz-adv-x="1368" d="M12 1005.5q0 57.5 18.5 119.5t53.5 121q76 129 208 209.5t300 80.5q48 0 96.5 -3t93.5 -26l162 -1085l223 1110h295l-325 -1532h-248l-174 1071l-228 -1071h-294l294 1391q-136 -57 -210 -169.5t-74 -277.5q0 -83 23 -125q5 -8 5 -14q-164 0 -205 105q-14 38 -14 95.5z " />
|
||||
<glyph unicode="O" horiz-adv-x="1362" d="M33 983q0 100 68 201q145 212 447 306q150 46 310 46q485 0 485 -524q0 -353 -177 -660q-126 -221 -336 -316q-108 -48 -215.5 -48t-174.5 22q-219 74 -219 389q0 211 79 449q126 384 346 484q61 28 126.5 28t110.5 -17q-89 -53 -176 -227q-126 -249 -169 -552 q-14 -94 -14 -173q0 -237 119 -237h2q99 0 198 144t163.5 363.5t64.5 416t-54 280.5t-208 84q-246 0 -418 -145.5t-172 -381.5q0 -60 10.5 -79.5t10.5 -30.5q-100 0 -153.5 39t-53.5 139z" />
|
||||
<glyph unicode="P" horiz-adv-x="1174" d="M12 1004q0 103 64.5 198.5t166.5 169.5q233 164 479 164t369 -116t123 -287q0 -98 -40.5 -196t-117.5 -177q-172 -176 -433 -176h-11l-125 -584h-294l278 1303l303 40l-145 -684q150 14 254 172t104 342t-139 247q-48 22 -115 22q-250 0 -390 -131t-140 -367 q0 -83 23 -125q5 -8 5 -14q-164 0 -205 105q-14 38 -14 94z" />
|
||||
<glyph unicode="Q" horiz-adv-x="1362" d="M33 983q0 100 68 201q145 212 447 306q150 46 310 46q485 0 485 -524q0 -240 -98.5 -502t-292.5 -404q55 -79 94 -109q73 -56 162 -56q21 0 45 4q-41 -107 -93.5 -141.5t-119.5 -34.5q-120 0 -184 79q-38 47 -78 168q-88 -28 -180 -28q-180 0 -278.5 98.5t-98.5 311 t79 450.5q126 384 346 484q61 28 126.5 28t110.5 -17q-89 -53 -176 -227q-126 -249 -169 -552q-14 -94 -14 -173v-46q0 -21 4 -42q72 19 144.5 19t146.5 -56q106 132 179 364.5t73 441.5v11q0 191 -54 275t-208 84q-246 0 -418 -145.5t-172 -381.5q0 -60 10.5 -79.5 t10.5 -30.5q-100 0 -153.5 39t-53.5 139zM545 238q28 -84 98 -84q43 0 78 22q-43 70 -117 70q-27 0 -59 -8z" />
|
||||
<glyph unicode="R" horiz-adv-x="1231" d="M12 1004q0 103 64.5 198.5t166.5 169.5q233 164 474.5 164t360 -94.5t118.5 -233.5q0 -95 -57.5 -190.5t-163.5 -159.5q141 -40 141 -201q0 -95 -50 -277t-50 -237q0 -113 80 -143q-128 -35 -203 -35q-160 0 -160 137q1 72 54.5 262.5t54.5 276.5q0 139 -123 139 q-26 0 -68 -8l-164 -772h-294l278 1303l303 40l-100 -473h16q122 0 206.5 115.5t84.5 252t-123 186.5q-42 18 -134 18t-194 -34t-174 -98q-153 -136 -153 -366q0 -83 23 -125q5 -8 5 -14q-164 0 -205 105q-14 38 -14 94z" />
|
||||
<glyph unicode="S" horiz-adv-x="1167" d="M55 304q0 161 92 251t206 90t163 -69q19 -26 21 -66q-157 0 -218 -103q-22 -37 -22 -83q0 -87 51.5 -145t150.5 -58t165.5 71t66.5 180t-31 179.5t-78 131.5t-101 116.5t-101 112.5q-109 132 -109 257q0 158 136.5 262.5t336.5 104.5q247 0 312 -150q18 -40 18 -113.5 t-45 -131.5t-112.5 -58t-104.5 43q92 53 92 190q0 40 -32.5 82t-119 42t-137.5 -46.5t-51 -121.5t20 -120q36 -83 126 -162l84 -76q112 -100 152 -166q79 -133 79 -270q0 -255 -176 -394q-159 -127 -400 -127q-298 0 -399 191q-35 67 -35 156z" />
|
||||
<glyph unicode="T" horiz-adv-x="985" d="M12 1025q0 79 38 175t122 170q185 164 539 164q145 0 230.5 -15t148.5 -23q64 -9 170.5 -9t212.5 43q-10 -260 -256 -260q-93 0 -318 45l-283 -1315h-294l290 1356h-24q-181 0 -274 -84q-111 -100 -111 -330q0 -83 23 -125q5 -8 5 -14q-164 0 -205 105q-14 38 -14 117z " />
|
||||
<glyph unicode="U" horiz-adv-x="1466" d="M0 993q0 109 65 207q137 203 420 292q141 44 289 44q45 0 98 -10l-209 -778q-67 -259 -67 -362t31.5 -151.5t120.5 -48.5t129 30q73 55 127 199.5t129 483.5l137 633h289l-136 -639q-78 -381 -160 -561q-98 -215 -263 -292q-118 -54 -258 -54t-215.5 21.5t-122.5 62.5 q-87 79 -87 237t51 368l185 742q-169 -45 -266 -164t-97 -307q0 -87 24 -128q5 -7 5 -13q-162 0 -204 100q-15 36 -15 88z" />
|
||||
<glyph unicode="V" horiz-adv-x="1260" d="M12 1004q0 103 64.5 198.5t166.5 169.5q233 164 488 164q42 0 82 -4l18 -1260l431 1254h143l-569 -1526h-295l-33 1399q-144 -54 -224.5 -169t-80.5 -286q0 -83 23 -125q5 -8 5 -14q-164 0 -205 105q-14 38 -14 94z" />
|
||||
<glyph unicode="W" horiz-adv-x="1970" d="M12 1004q0 103 64.5 198.5t166.5 169.5q233 164 488 164q42 0 82 -4l18 -1260l431 1254h260l18 -1254l430 1254h144l-570 -1526h-295l-24 1042l-389 -1042h-295l-33 1399q-144 -54 -224.5 -169t-80.5 -286q0 -83 23 -125q5 -8 5 -14q-164 0 -205 105q-14 38 -14 94z" />
|
||||
<glyph unicode="X" horiz-adv-x="1270" d="M12 1004q0 103 64.5 198.5t166.5 169.5q233 164 488 164q42 0 82 -4l88 -426l238 420h143l-344 -596l192 -930h-325l-109 512l-297 -512h-125l385 680l-151 719q-144 -54 -224.5 -169t-80.5 -286q0 -83 23 -125q5 -8 5 -14q-164 0 -205 105q-14 38 -14 94z" />
|
||||
<glyph unicode="Y" horiz-adv-x="1270" d="M12 1004q0 103 64.5 198.5t166.5 169.5q233 164 488 164q42 0 82 -4l178 -733l303 727h136l-398 -895l-135 -631h-328l136 631l-197 768q-144 -54 -224.5 -169t-80.5 -286q0 -83 23 -125q5 -8 5 -14q-164 0 -205 105q-14 38 -14 94z" />
|
||||
<glyph unicode="Z" horiz-adv-x="1110" d="M23 0l716 1425l-184 5q-188 0 -188 -46q10 0 22 -14t12 -50q0 -61 -37.5 -89.5t-90.5 -28.5t-75 38.5t-22 79.5q0 86 67 151t185 65h702l-706 -1403l197 -4q71 0 131 7.5t82 37.5q-11 0 -24 13.5t-13 48.5q0 61 37 90.5t90 29.5t76.5 -38t23.5 -78q0 -88 -74 -164 t-188 -76h-739z" />
|
||||
<glyph unicode="[" horiz-adv-x="819" d="M-49 -512l434 2048h395l-26 -127h-248l-381 -1794h248l-27 -127h-395z" />
|
||||
<glyph unicode="\" horiz-adv-x="741" d="M86 1536h147l435 -2048h-148z" />
|
||||
<glyph unicode="]" horiz-adv-x="819" d="M-49 -512l26 127h248l381 1794h-248l27 127h395l-434 -2048h-395z" />
|
||||
<glyph unicode="^" horiz-adv-x="862" d="M102 1149l435 387h43l122 -387h-65l-123 164l-321 -164h-91z" />
|
||||
<glyph unicode="_" horiz-adv-x="909" d="M74 0l37 162h716l-34 -162h-719z" />
|
||||
<glyph unicode="`" horiz-adv-x="412" d="M49 1536h215l60 -387h-154z" />
|
||||
<glyph unicode="a" horiz-adv-x="1077" d="M-27 306.5q0 80.5 14 161t43 160.5q64 176 183 291t287 115q88 0 127 -29.5t39 -74.5v-15l22 109h295l-147 -696q-9 -35 -9 -66q0 -88 84 -88q109 0 166 193h86q-130 -379 -411 -379q-181 0 -201 188q-134 -188 -312.5 -188t-242.5 175q-23 63 -23 143.5zM276 335 q0 -91 38 -127q22 -22 55 -22q61 0 111 48.5t69 132.5l98 462q0 19 -17.5 48.5t-74.5 29.5t-111 -61q-130 -147 -163 -422q-5 -42 -5 -89z" />
|
||||
<glyph unicode="b" horiz-adv-x="909" d="M-14 250q0 55 14 117l219 1026l303 41l-98 -461q92 57 168 57q242 0 242 -350q0 -236 -118 -436q-92 -156 -251 -222q-84 -34 -209.5 -34t-197.5 69t-72 193zM279 281q0 -95 108 -95q90 0 170 170q70 159 70 311t-61 201q-21 17 -40 17q-39 0 -76 -9.5t-53 -27.5 l-112 -520q-6 -26 -6 -47z" />
|
||||
<glyph unicode="c" horiz-adv-x="786" d="M-27 313q0 235 119 454q90 165 247 237q81 38 167 38q246 0 246 -186q0 -78 -32 -114.5t-72 -36.5t-77 24q25 66 25 121q0 84 -58.5 84t-123.5 -106q-93 -150 -128 -373q-10 -67 -10 -147q0 -148 141 -148q118 0 198.5 52.5t170.5 154.5h70q-230 -379 -563 -379 q-146 0 -233 75.5t-87 249.5z" />
|
||||
<glyph unicode="d" horiz-adv-x="1075" d="M-27 306.5q0 80.5 14 161t43 160.5q64 176 183 291t287 115q88 0 127 -29.5t39 -74.5v-8l100 471l303 41l-235 -1106q-9 -35 -9 -72q0 -70 84 -70q115 0 166 181h86q-128 -367 -411 -367q-177 0 -201 176q-124 -188 -306.5 -188t-246.5 175q-23 63 -23 143.5zM276 335 q0 -149 102 -149q43 0 95.5 41.5t73.5 128.5v11l100 469q-19 71 -84 71t-119 -61q-130 -147 -163 -422q-5 -42 -5 -89z" />
|
||||
<glyph unicode="e" horiz-adv-x="786" d="M-27 313q0 234 119 453q91 167 248 238q81 38 168 38q142 0 193 -53.5t51 -142.5q0 -175 -141 -297.5t-330 -134.5q-5 -58 -5 -82q0 -105 37 -138.5t104 -33.5q118 0 198.5 52.5t170.5 154.5h70q-230 -379 -563 -379q-146 0 -233 75.5t-87 249.5zM297 512 q118 8 207.5 110t89.5 238q0 74 -51 74q-75 -2 -145 -132.5t-101 -289.5z" />
|
||||
<glyph unicode="f" horiz-adv-x="547" d="M-426 -304q0 83 28 132t76 84q70 49 248 104l248 1170q73 348 373 348q95 0 168 -62t73 -159q0 -47 -6 -84h-96q4 32 4 61t-23.5 46.5t-46.5 17.5q-50 0 -91.5 -38.5t-59.5 -129.5l-35 -162h150l-15 -82h-151l-236 -1106q-70 -348 -366 -348q-95 0 -168.5 62.5 t-73.5 145.5zM-313 -262q0 -40 49 -62q15 -6 40.5 -6t57.5 35t51 125l27 119q-109 -38 -150 -71q-75 -62 -75 -140z" />
|
||||
<glyph unicode="g" horiz-adv-x="1038" d="M-27 306.5q0 80.5 14 161t43 160.5q64 176 183 291t287 115q88 0 127 -29.5t39 -74.5v-12l22 106h295l-203 -950q93 31 153.5 94.5t104.5 198.5h86q-78 -264 -264 -348q-51 -23 -98 -35l-31 -148q-39 -197 -156 -284q-86 -64 -197 -64t-178 49t-67 157q0 187 334 298 l25 108q-107 -112 -246 -112q-186 0 -250 175q-23 63 -23 143.5zM246 -285q0 -41 39 -61q13 -6 38 -6t58 44.5t53 137.5l12 59q-200 -72 -200 -174zM276 335q0 -91 38 -127q22 -22 54 -22q57 0 106 43.5t69 116.5l104 485q0 46 -43 67q-16 9 -41 9q-65 0 -119 -61 q-130 -147 -163 -422q-5 -42 -5 -89z" />
|
||||
<glyph unicode="h" d="M-78 0l297 1393l303 41l-110 -516q100 114 239 114q98 0 163 -54t65 -160t-34 -240l-49 -198q-16 -65 -16 -106q0 -88 75 -88q69 0 106 44t73 137h86q-119 -345 -322 -375q-32 -4 -79 -4t-93 20q-128 54 -128 211q0 84 46 268t46 254q0 105 -74 105t-132 -117 q-17 -33 -28 -72l-139 -657h-295z" />
|
||||
<glyph unicode="i" horiz-adv-x="547" d="M-16 233q0 58 16 134l139 657h295l-147 -696q-8 -37 -8 -73q0 -69 83 -69q60 0 111.5 52t73.5 129h86q-132 -379 -441 -379q-81 0 -145 58q-63 58 -63 187zM180 1296q0 67 46.5 115.5t115 48.5t116.5 -48t48 -116t-48.5 -114.5t-116 -46.5t-114.5 47t-47 114z" />
|
||||
<glyph unicode="j" horiz-adv-x="492" d="M-414 -313q0 166 218 260q60 26 118 45l219 1032h295l-203 -950q95 32 155 95t104 198h86q-80 -263 -264 -347q-51 -24 -99 -36l-31 -148q-39 -197 -156 -284q-86 -64 -196.5 -64t-178 49.5t-67.5 149.5zM-301 -285q0 -41 39 -61q13 -6 38 -6t58 44.5t53 137.5l13 59 q-201 -70 -201 -174zM164 1298q0 67 46.5 115.5t114.5 48.5t116 -48t48 -116t-48.5 -114.5t-115.5 -46.5t-114 47t-47 114z" />
|
||||
<glyph unicode="k" horiz-adv-x="1061" d="M-78 0l297 1393l303 41l-153 -721l395 311h203l-410 -285q36 9 68 9q113 0 169 -71t56 -169q0 -36 -8 -78l-23 -102q-10 -42 -10 -66q0 -76 83 -76t136 108q16 33 33 73h86q-128 -379 -377 -379q-128 0 -193 60.5t-65 172.5q0 47 12 107l17 80q8 43 8 75q0 99 -74 99 q-58 0 -151 -76l-107 -506h-295z" />
|
||||
<glyph unicode="l" horiz-adv-x="547" d="M-16 233q0 58 16 134l219 1026l303 41l-235 -1106q-8 -37 -8 -73q0 -69 83 -69q60 0 111.5 52t73.5 129h86q-132 -379 -441 -379q-81 0 -145 58q-63 58 -63 187z" />
|
||||
<glyph unicode="m" horiz-adv-x="1540" d="M-78 0l217 1024h295l-22 -106q102 116 250 116q181 0 210 -176q113 174 285 174q97 0 162 -54t65 -158t-34 -240l-48 -200q-16 -65 -16 -106q0 -88 75 -88q69 0 106 44t73 137h86q-76 -226 -192 -317q-80 -62 -168 -62q-262 0 -262 231q0 84 46 268t46 254q0 105 -74 105 t-132 -117q-17 -33 -28 -72l-139 -657h-295l150 707q6 24 6 51q0 90 -60.5 90t-103 -56.5t-64.5 -134.5l-139 -657h-295z" />
|
||||
<glyph unicode="n" d="M-78 0l217 1024h295l-22 -106q100 114 239 114q98 0 163 -54t65 -160t-34 -240l-49 -198q-16 -65 -16 -106q0 -88 75 -88q69 0 106 44t73 137h86q-119 -345 -322 -375q-32 -4 -79 -4t-93 20q-128 54 -128 211q0 84 46 268t46 254q0 105 -74 105t-132 -117 q-17 -33 -28 -72l-139 -657h-295z" />
|
||||
<glyph unicode="o" horiz-adv-x="899" d="M-29 301q0 74 12.5 150.5t39.5 157.5q61 183 177 297q138 136 332 136q263 0 263 -327v-2q10 -2 34 -2q55 0 141.5 35t162.5 88l18 -56q-124 -130 -363 -170q-24 -280 -161 -448t-328 -168q-236 0 -304 174q-24 61 -24 135zM276 342q0 -99 18 -125.5t38 -33.5t54 -7 q70 0 139 123t93 303q-55 14 -55 91t64 106q-4 65 -20.5 92t-64.5 27q-94 0 -180 -207.5t-86 -368.5z" />
|
||||
<glyph unicode="p" horiz-adv-x="958" d="M-186 -512l342 1612h295l-33 -154q102 88 239 88q177 0 231 -170q19 -62 19 -142.5t-9.5 -161t-32.5 -161t-60.5 -154.5t-93.5 -131.5t-132.5 -91.5t-191 -34t-158.5 73l-106 -499zM262 213q18 -47 87.5 -47t124.5 58q107 114 138 326q15 94 15 167q0 170 -103 170 q-35 0 -73.5 -25t-67.5 -76z" />
|
||||
<glyph unicode="q" horiz-adv-x="995" d="M-27 306.5q0 80.5 14 161t43 160.5q64 176 183 291t287 115q88 0 127 -29.5t39 -74.5v-4l20 98h295l-311 -1462l-310 -74l129 612q-105 -112 -243 -112q-186 0 -250 175q-23 63 -23 143.5zM276 335q0 -149 102 -149q43 0 89.5 37.5t71.5 108.5l108 506q-5 18 -22 43.5 t-72 25.5t-109 -61q-130 -147 -163 -422q-5 -42 -5 -89z" />
|
||||
<glyph unicode="r" horiz-adv-x="770" d="M-78 0l217 1024h295l-26 -127q51 45 112.5 86t133 41t107.5 -47t36 -90q0 -74 -39.5 -120t-95.5 -46t-74 25.5t-22 52t-10.5 42t-27.5 15.5q-42 0 -74 -19.5t-73 -58.5l-164 -778h-295z" />
|
||||
<glyph unicode="s" horiz-adv-x="782" d="M-66 233.5q0 88.5 34 137.5t75 69q144 258 252 607l303 40q8 -192 16 -321l25 -325q4 -48 4 -95t-8 -82q90 52 147 103h86q-127 -148 -313 -256q-116 -123 -322 -123q-144 0 -221.5 78.5t-77.5 167zM43 293q0 -143 107 -143q196 0 196 190q0 53 -8 125l-12 117 q-11 112 -19 243q-52 -168 -166 -387q47 -22 47 -65.5t-24.5 -75t-66 -31.5t-54.5 27z" />
|
||||
<glyph unicode="t" horiz-adv-x="547" d="M-16 233q0 58 16 134l123 575h-68l17 82h67l62 283l303 41l-70 -324h123l-16 -82h-123l-131 -614q-8 -37 -8 -73q0 -69 83 -69q60 0 111.5 52t73.5 129h86q-132 -379 -441 -379q-81 0 -145 58q-63 58 -63 187z" />
|
||||
<glyph unicode="u" d="M-16 233q0 58 16 134l139 657h295l-147 -696q-6 -32 -6 -58q0 -84 61 -84q108 0 164 181l139 657h295l-147 -696q-9 -35 -9 -72q0 -70 84 -70q115 0 166 181h86q-130 -379 -411 -379q-183 0 -203 194q-120 -194 -303 -194q-92 0 -156 58q-63 58 -63 187z" />
|
||||
<glyph unicode="v" horiz-adv-x="848" d="M-18 229q0 51 10 99l147 696h295l-147 -696q-11 -49 -11 -74q0 -68 70 -68q95 0 181 128q116 171 161 428q12 72 12 128q-5 -11 -29 -15l-21 -4q-9 -1 -15 -1q-36 0 -55 34.5t-19 75.5t31 73t82 32q81 0 112 -51.5t31 -130t-14 -177t-44 -198.5q-67 -225 -199.5 -372.5 t-326.5 -147.5q-116 0 -183.5 59t-67.5 182z" />
|
||||
<glyph unicode="w" horiz-adv-x="1354" d="M-16 233q0 58 16 134l139 657h295l-147 -696q-6 -26 -6 -52q0 -90 61 -90q108 0 164 181l139 657h295l-147 -696q-11 -49 -11 -74q0 -68 70 -68q95 0 181 128q116 171 161 428q12 72 12 128q-5 -11 -29 -15l-21 -4q-9 -1 -15 -1q-36 0 -55 34.5t-19 76t30.5 73t82.5 31.5 q81 0 112 -51.5t31 -130t-14 -177t-44 -198.5q-67 -225 -188 -360q-144 -160 -345.5 -160t-237.5 172q-114 -172 -291 -172q-92 0 -156 58q-63 58 -63 187z" />
|
||||
<glyph unicode="x" horiz-adv-x="1069" d="M0 367q49 214 91 306t71 141q64 103 143 161.5t160 58.5t121.5 -23.5t73 -71t45.5 -148.5l18 -156q171 191 178 295q-17 -4 -35 -4q-96 0 -96 114q0 54 42 77.5t84 23.5q66 0 97 -56t31 -117.5t-18 -107.5q-33 -88 -142 -212l-125 -140l19 -143q12 -98 35 -129.5 t44 -40.5t48 -9q59 0 110 51t74 130h86q-76 -214 -205 -309q-95 -70 -205 -70h-8q-193 0 -250 356l-282 -344h-148l414 467l-33 229q-17 104 -33.5 137t-45.5 33q-65 0 -143.5 -130.5t-129.5 -368.5h-86z" />
|
||||
<glyph unicode="y" horiz-adv-x="995" d="M-16 233q0 58 16 134l139 657h295l-147 -696q-6 -26 -6 -52q0 -90 58.5 -90t99.5 48q40 49 63 120l143 670h295l-203 -950q93 31 153.5 94.5t104.5 198.5h86q-78 -264 -264 -348q-51 -23 -98 -35l-31 -148q-39 -197 -156 -284q-86 -64 -197 -64t-178 49t-67 157 q0 187 334 298l25 110q-106 -114 -246 -114q-92 0 -156 58q-63 58 -63 187zM203 -285q0 -41 39 -61q13 -6 38 -6t58 44.5t53 137.5l12 59q-200 -72 -200 -174z" />
|
||||
<glyph unicode="z" horiz-adv-x="877" d="M0 0l522 913h-114q-48 0 -80.5 -5t-32.5 -27q0 -5 3.5 -6t11 -6.5t7.5 -48t-34.5 -68t-64.5 -25.5q-49 0 -77 24t-28 61q0 79 68 145.5t169 66.5h527l-502 -866q13 -1 31 -3l39 -5q46 -5 84 -5q91 0 98 41q-39 4 -39 43q0 30 28 59t86 29q91 0 91 -98q0 -79 -70 -149 t-180 -70h-543z" />
|
||||
<glyph unicode="{" horiz-adv-x="721" d="M61 -290.5q0 75.5 30 152.5t70 158l80 166q66 140 66 217q0 64 -84 64q-26 0 -65 -6l24 117q35 -7 74 -7q75 0 108 77q19 49 19 151l-14 325q0 142 72 264q87 148 255 148h88l-18 -102q-107 0 -138 -18t-48 -36q-56 -61 -74.5 -129.5t-20.5 -152.5l13 -350 q-7 -165 -82 -228q24 -29 24 -84.5t-28 -123.5l-101 -220q-114 -234 -114 -346q0 -164 174 -164l-19 -92h-18q-103 0 -149 14.5t-85 72t-39 133z" />
|
||||
<glyph unicode="|" horiz-adv-x="1090" d="M449 -512v2050h190v-2050h-190z" />
|
||||
<glyph unicode="}" horiz-adv-x="721" d="M61 -510l19 102q104 0 136 18q138 78 144 318l-12 351q7 164 82 227q-24 28 -24 85.5t43 156.5t83.5 183.5t78.5 178t38 170.5q0 164 -174 164l19 92h18q101 0 148 -13.5t85.5 -71t38.5 -122t-14 -115.5q-25 -91 -86 -208l-54 -110q-91 -192 -91 -273q0 -64 84 -64 q24 0 65 6l-24 -116q-38 6 -76 6q-73 0 -106 -77q-19 -49 -19 -151l14 -325q0 -142 -72 -264q-87 -148 -255 -148h-89z" />
|
||||
<glyph unicode="~" horiz-adv-x="883" d="M100 1192q104 201 342 201q82 0 150.5 -23.5t106 -34t81.5 -10.5q82 0 129 47l13 -2q-19 -76 -118 -140q-100 -65 -190 -65q-91 0 -167 26t-116 38t-83 12q-77 0 -135 -53z" />
|
||||
<glyph unicode="¡" horiz-adv-x="449" d="M-125 -508l266 961h174l-145 -961h-295zM121 761q0 67 46.5 116t114.5 49t116 -48.5t48 -116.5t-48.5 -114.5t-115.5 -46.5t-114 47t-47 114z" />
|
||||
<glyph unicode="¢" horiz-adv-x="825" d="M63 647q0 218 113.5 380.5t312.5 191.5l46 251h118l-55 -249q126 -7 168 -77q16 -26 16 -61.5t-10 -68.5h-117q11 39 11 57q0 70 -76 70h-10l-156 -703q10 -2 31 -2q82 0 130 32q87 59 140 107q-23 -129 -101.5 -200.5t-230.5 -77.5l-78 -352h-55l64 354 q-114 17 -187.5 107t-73.5 241zM279 672q0 -148 75 -203l113 625q-128 -103 -174 -314q-14 -64 -14 -108z" />
|
||||
<glyph unicode="£" horiz-adv-x="952" d="M51 686q70 138 215 182l148 605l307 63l-164 -678l84 -26q41 -13 106.5 -13t112.5 47l12 -2q-17 -75 -116 -140t-213 -65h-33l-115 -473q36 5 70.5 6t69.5 2q85 4 161.5 29.5t177.5 100.5q-16 -148 -72 -236t-140 -88h-605l176 733l-34 2q-77 0 -136 -53z" />
|
||||
<glyph unicode="¤" horiz-adv-x="1024" d="M139 1008l78 73l115 -114q83 61 185.5 61t182.5 -59l115 114l74 -73l-113 -113q62 -85 62 -187.5t-62 -187.5l113 -112l-74 -74l-113 113q-78 -60 -182.5 -60t-189.5 62l-115 -115l-74 74l115 114q-59 79 -59 183.5t59 183.5zM313 709.5q0 -85.5 59 -146.5 q61 -59 146.5 -59t145 59.5t59.5 145.5t-59.5 145t-145 59t-145.5 -59t-60 -144.5z" />
|
||||
<glyph unicode="¥" horiz-adv-x="971" d="M39 291l29 102h196l29 133h-203l29 103h196v2l-229 905h336l180 -739l307 739h135l-401 -905v-2h268l-28 -103h-262l-29 -133h268l-29 -102h-262l-61 -291h-328l62 291h-203z" />
|
||||
<glyph unicode="¦" horiz-adv-x="1090" d="M449 455h190v-967h-190v967zM449 616v922h190v-922h-190z" />
|
||||
<glyph unicode="§" horiz-adv-x="1110" d="M16 158q0 111 56 182q57 70 129.5 70t109 -33.5t64.5 -69.5q-134 -12 -157 -89q-9 -27 -9 -86.5t38 -99.5t122 -40q172 0 172 198q-3 158 -118 276l-134 124q-117 104 -117 213.5t61.5 184t151.5 108.5q-11 47 -11 110.5t40 133.5q74 129 238 174q87 23 167.5 23 t151.5 -31q104 -44 104 -161t-78 -157q-25 -12 -64 -12t-69 32q35 21 54.5 60.5t19.5 71.5q0 58 -29.5 89t-78.5 31q-89 0 -144 -66t-55 -153q0 -117 127 -221q36 -30 75 -59q93 -69 148 -147t55 -197.5t-63 -217t-174 -120.5v-7q0 -176 -117.5 -279.5t-327.5 -103.5 q-256 0 -321 165q-17 44 -17 104zM389 926q0 -45 25 -82.5t63.5 -74.5t86.5 -77q185 -154 222 -317q39 49 39 133q0 136 -138 248l-147 117q-66 51 -112 122q-39 -24 -39 -69z" />
|
||||
<glyph unicode="¨" horiz-adv-x="803" d="M115 1297q0 52 35 89q36 37 88.5 37t89.5 -36.5t37 -89t-37 -88.5q-38 -35 -76 -35q-66 0 -101.5 35.5t-35.5 87.5zM483 1297q0 53 36 89.5t88 36.5t89 -36.5t37 -89t-37 -88.5q-38 -35 -76 -35q-65 0 -101 35t-36 88z" />
|
||||
<glyph unicode="©" horiz-adv-x="1202" d="M104 678q0 220 146 372t350 152t350 -152.5t146 -369.5t-146 -370.5t-350.5 -153.5t-350 152t-145.5 370zM199 678q0 -183 117.5 -309.5t286.5 -126.5t287 126t118 310t-118.5 310t-287 126t-286 -126.5t-117.5 -309.5zM311 689q0 129 88.5 215.5t214.5 86.5 q98 -5 166.5 -59t87.5 -135l-96 -37l-14 40q-31 85 -140 85q-78 0 -136 -46t-58 -140.5t57 -157t137 -62.5q48 0 90 24.5t64 67.5l90 -59q-43 -66 -109.5 -102.5t-135.5 -36.5q-129 0 -217.5 93.5t-88.5 222.5z" />
|
||||
<glyph unicode="ª" horiz-adv-x="707" d="M88 1120q0 47 15 121t51 134.5t96 99t126 38.5t103 -28l6 31h170l-86 -377q-2 -11 -4 -19t-2 -18q0 -41 43 -41h14q9 0 17 4q-26 -73 -59 -87.5t-64 -14.5q-94 0 -119 81q-72 -88 -173 -88q-134 0 -134 164zM248 1126q0 -49 24 -63t45 -14q37 0 74 53l76 330 q-23 20 -58 20q-67 0 -114 -103t-47 -223z" />
|
||||
<glyph unicode="«" horiz-adv-x="1206" d="M41 487l18 84l629 308l-20 -113l-494 -246l397 -196l-24 -117zM471 487l18 84l629 308l-20 -113l-494 -246l397 -196l-24 -117z" />
|
||||
<glyph unicode="¬" horiz-adv-x="909" d="M39 455l37 161h741l-104 -512h-232l72 351h-514z" />
|
||||
<glyph unicode="­" horiz-adv-x="594" d="M39 455l37 161h409l-34 -161h-412z" />
|
||||
<glyph unicode="®" horiz-adv-x="1133" d="M70 684.5q0 217.5 144 370.5t349.5 153t351.5 -152.5t146 -369.5t-146 -370.5t-350.5 -153.5t-349.5 152q-145 153 -145 370.5zM164 684q0 -183 117.5 -309.5t286.5 -126.5t287 126t118 310t-118.5 310t-287 126t-286 -126.5t-117.5 -309.5zM360 393l2 596h193 q109 0 177.5 -44t68.5 -128q0 -57 -33.5 -99t-87.5 -59l133 -256l-96 -14l-127 256h-135v-252h-95zM455 723h106q146 0 146 90q0 71 -99 87q-26 5 -51 5h-102v-182z" />
|
||||
<glyph unicode="°" horiz-adv-x="643" d="M76 984q0 202 90 328t242 126q90 0 128.5 -59.5t38.5 -190t-82.5 -276.5t-226.5 -146q-107 0 -148.5 57t-41.5 161zM223 1016.5q0 -92.5 10 -133.5t48 -41q75 0 123.5 117.5t48.5 277.5q0 55 -9.5 92t-42.5 37q-50 0 -102 -78q-26 -38 -51 -108.5t-25 -163z" />
|
||||
<glyph unicode="±" horiz-adv-x="1092" d="M63 139l37 162h752l-35 -162h-754zM170 633l49 229h262l56 250h231l-55 -250h260l-47 -229h-262l-56 -252h-231l55 252h-262z" />
|
||||
<glyph unicode="²" horiz-adv-x="614" d="M6 760.5q0 38.5 29 89t72.5 98t94 94t94.5 98.5q101 120 101 244q0 62 -45 84q-13 7 -34 7q-49 0 -69 -22t-20 -49q0 -82 45 -93q-45 -39 -86 -39t-65.5 25.5t-24.5 64.5q0 74 60 123t186 49q225 0 225 -176q0 -92 -51 -161t-124 -129l-141 -110q-71 -51 -108 -106h9 q57 0 114.5 -10.5t115 -10.5t78.5 15q45 33 77 63q0 -123 -16 -155q-30 -60 -126 -60q-64 0 -149 20.5t-120 20.5t-48 -4t-25.5 -9t-24 -11t-20.5 -9q-4 20 -4 58.5z" />
|
||||
<glyph unicode="³" horiz-adv-x="647" d="M27 888q0 69 35.5 114t111.5 45t90 -56q-93 -10 -102 -87q-2 -22 -2 -46q0 -88 95 -88q71 0 113 57.5t42 127.5t-36.5 129.5t-117.5 84.5q94 24 148.5 89t54.5 116q0 101 -76 101q-107 0 -107 -89q0 -40 17 -56t29 -19q-47 -39 -87 -39t-65 25.5t-25 64.5q0 73 66 122.5 t180 49.5t166.5 -48t52.5 -108q0 -135 -161 -211q78 -22 112.5 -71t34.5 -104q0 -108 -89.5 -200t-215.5 -92q-172 0 -237 84q-27 35 -27 104z" />
|
||||
<glyph unicode="´" horiz-adv-x="647" d="M246 1149l186 387h215l-248 -387h-153z" />
|
||||
<glyph unicode="µ" d="M-150 -340l289 1364h295l-147 -696q-6 -26 -6 -52q0 -90 61 -90q108 0 164 181l139 657h295l-147 -696q-9 -35 -9 -72q0 -70 84 -70q115 0 166 181h86q-128 -367 -411 -367q-181 0 -201 184q-114 -184 -293 -184l-55 -266z" />
|
||||
<glyph unicode="¶" horiz-adv-x="1110" d="M147 1006q0 205 136 366q136 162 387 162t338 -182q30 -64 30 -142q0 -77 -16 -161l-260 -1215h-193l166 778q-35 -13 -88 -22l-158 -756h-192l158 756q-149 27 -229 146q-79 118 -79 270zM670 694h12q38 0 72 8l98 465q12 58 12 103q0 84 -47 127z" />
|
||||
<glyph unicode="·" horiz-adv-x="889" d="M246 546q0 82 57 140q57 59 139 59t140 -59q59 -58 59 -139q0 -82 -59 -139q-59 -58 -140.5 -58t-138.5 58q-57 57 -57 138z" />
|
||||
<glyph unicode="¸" horiz-adv-x="465" d="M0 -389q38 65 76 65q53 0 91.5 -27.5t65.5 -27.5t44.5 26.5t17.5 57.5t-18.5 53.5t-68 22.5t-99.5 -25l108 303l72 -47l-60 -147q64 16 109 16q127 0 127 -103t-74.5 -163.5t-161.5 -60.5t-123.5 12.5t-59.5 23.5z" />
|
||||
<glyph unicode="¹" horiz-adv-x="444" d="M45 707l158 690h-113l14 51q108 0 177.5 28.5t124.5 57.5l-189 -827h-172z" />
|
||||
<glyph unicode="º" horiz-adv-x="674" d="M86 1138q0 189 89 288.5t222 99.5q42 0 77.5 -14t35.5 -37t-17.5 -34t-35.5 -18q-17 39 -50 39t-56 -17t-41 -45q-33 -54 -49.5 -126t-16.5 -127q0 -84 84 -84q92 0 121 221q-31 7 -31 41t25 61t51 27t34.5 -8t8.5 -31q28 18 49 45l18 21l12 -23q-32 -89 -79 -117 q-9 -159 -90.5 -252.5t-176 -93.5t-139.5 42t-45 142z" />
|
||||
<glyph unicode="»" horiz-adv-x="1200" d="M31 207l28 117l492 196l-397 246l18 113l504 -308l-23 -110zM485 207l29 117l492 196l-398 246l19 113l503 -308l-22 -110z" />
|
||||
<glyph unicode="¼" horiz-adv-x="1411" d="M143 461l158 690h-113l14 51q108 0 177.5 28.5t124.5 57.5l-189 -827h-172zM285 -338l540 1874h148l-541 -1874h-147zM766 307q15 45 44 99q128 241 128 358q0 35 -8 67q52 0 92.5 -25.5t40.5 -78.5q0 -108 -122 -263q-30 -38 -52 -77h184l96 422l177 22l-103 -444h78 l-25 -80h-71l-70 -305h-170l70 305h-289z" />
|
||||
<glyph unicode="½" horiz-adv-x="1382" d="M143 461l158 690h-113l14 51q108 0 177.5 28.5t124.5 57.5l-189 -827h-172zM274 -338l541 1874h148l-541 -1874h-148zM749 64.5q0 38.5 29 89t72.5 98t93.5 94.5q196 180 196 342q0 62 -45 84q-13 7 -35 7q-47 0 -67.5 -22t-20.5 -49q0 -82 45 -93q-45 -39 -86 -39 t-65.5 25.5t-24.5 64.5q0 74 60 123t186 49q225 0 225 -176q0 -92 -51 -161t-124 -129l-141 -110q-71 -51 -108 -106h9q57 0 114.5 -10.5t115 -10.5t79.5 15q44 33 76 63q0 -123 -16 -155q-30 -60 -126 -60q-64 0 -148 20.5t-120.5 20.5t-56 -6t-36.5 -15t-26 -12 q-4 20 -4 58.5z" />
|
||||
<glyph unicode="¾" horiz-adv-x="1677" d="M125 642q0 69 35.5 114t111.5 45t90 -56q-93 -10 -102 -87q-2 -22 -2 -46q0 -88 95 -88q71 0 113 57.5t42 127.5t-36.5 129.5t-117.5 84.5q94 24 148.5 89t54.5 116q0 101 -76 101q-107 0 -107 -89q0 -40 17 -56t29 -19q-47 -39 -87 -39t-65 25.5t-25 64.5q0 73 66 122.5 t180 49.5t166.5 -48t52.5 -108q0 -135 -161 -211q78 -22 112.5 -71t34.5 -104q0 -108 -89.5 -200t-215.5 -92q-172 0 -237 84q-27 35 -27 104zM522 -338l541 1874h147l-540 -1874h-148zM1010 307q15 45 44 99l56 114q72 148 72 244q0 35 -8 67q52 0 92.5 -25.5t40.5 -78.5 q0 -108 -122 -263q-30 -38 -52 -77h184l96 422l176 22l-102 -444h78l-25 -80h-72l-69 -305h-170l69 305h-288z" />
|
||||
<glyph unicode="¿" horiz-adv-x="899" d="M25 -238.5q0 70.5 27 138.5q48 120 170 221l110 93q135 117 186 239h135q0 -120 -97 -243q-41 -53 -89 -103t-89 -104q-97 -126 -97 -244q0 -154 115 -154q61 0 111 48.5t50 120t-42 114.5q-15 16 -36 22q54 86 150 86q60 0 107.5 -43.5t47.5 -112.5q0 -139 -98 -233 q-119 -113 -332 -113q-262 0 -314 153q-15 44 -15 114.5zM473 762v2q0 66 46.5 115t114.5 49t116.5 -48.5t48.5 -115.5v-2q0 -69 -49 -115.5t-116 -46.5t-114 47t-47 115z" />
|
||||
<glyph unicode="À" horiz-adv-x="1368" d="M18 684q0 106 119 180q121 74 299 74q41 0 107 -6q166 261 352.5 432.5t359.5 171.5q104 0 162 -29l-321 -1507h-295l157 743q-136 62 -274 74q-184 -407 -246 -747q-20 -109 -20 -186.5t28 -116.5q-121 0 -170 25q-104 52 -104 192q0 212 178 596q56 120 123 237 q-96 -6 -157.5 -29.5t-82.5 -76.5q9 0 18 -20.5t9 -50.5t-33.5 -51.5t-70.5 -21.5q-67 0 -102.5 31.5t-35.5 85.5zM727 905q143 -28 250 -71l119 557q-176 -96 -369 -486zM895 2048h215l60 -387h-154z" />
|
||||
<glyph unicode="Á" horiz-adv-x="1368" d="M18 684q0 106 119 180q121 74 299 74q41 0 107 -6q166 261 352.5 432.5t359.5 171.5q104 0 162 -29l-321 -1507h-295l157 743q-136 62 -274 74q-184 -407 -246 -747q-20 -109 -20 -186.5t28 -116.5q-121 0 -170 25q-104 52 -104 192q0 212 178 596q56 120 123 237 q-96 -6 -157.5 -29.5t-82.5 -76.5q9 0 18 -20.5t9 -50.5t-33.5 -51.5t-70.5 -21.5q-67 0 -102.5 31.5t-35.5 85.5zM727 905q143 -28 250 -71l119 557q-176 -96 -369 -486zM996 1661l186 387h215l-248 -387h-153z" />
|
||||
<glyph unicode="Â" horiz-adv-x="1368" d="M18 684q0 106 119 180q121 74 299 74q41 0 107 -6q166 261 352.5 432.5t359.5 171.5q104 0 162 -29l-321 -1507h-295l157 743q-136 62 -274 74q-184 -407 -246 -747q-20 -109 -20 -186.5t28 -116.5q-121 0 -170 25q-104 52 -104 192q0 212 178 596q56 120 123 237 q-96 -6 -157.5 -29.5t-82.5 -76.5q9 0 18 -20.5t9 -50.5t-33.5 -51.5t-70.5 -21.5q-67 0 -102.5 31.5t-35.5 85.5zM727 905q143 -28 250 -71l119 557q-176 -96 -369 -486zM834 1661l434 387h43l123 -387h-65l-123 164l-322 -164h-90z" />
|
||||
<glyph unicode="Ã" horiz-adv-x="1368" d="M18 684q0 106 119 180q121 74 299 74q41 0 107 -6q166 261 352.5 432.5t359.5 171.5q104 0 162 -29l-321 -1507h-295l157 743q-136 62 -274 74q-184 -407 -246 -747q-20 -109 -20 -186.5t28 -116.5q-121 0 -170 25q-104 52 -104 192q0 212 178 596q56 120 123 237 q-96 -6 -157.5 -29.5t-82.5 -76.5q9 0 18 -20.5t9 -50.5t-33.5 -51.5t-70.5 -21.5q-67 0 -102.5 31.5t-35.5 85.5zM727 905q143 -28 250 -71l119 557q-176 -96 -369 -486zM838 1704q99 201 342 201q79 0 148.5 -23.5t107.5 -34t100 -10.5t111 47l12 -2 q-17 -74 -117.5 -139.5t-212.5 -65.5q-69 0 -145 26t-116 38t-83 12q-77 0 -135 -53z" />
|
||||
<glyph unicode="Ä" horiz-adv-x="1368" d="M18 684q0 106 119 180q121 74 299 74q41 0 107 -6q166 261 352.5 432.5t359.5 171.5q104 0 162 -29l-321 -1507h-295l157 743q-136 62 -274 74q-184 -407 -246 -747q-20 -109 -20 -186.5t28 -116.5q-121 0 -170 25q-104 52 -104 192q0 212 178 596q56 120 123 237 q-96 -6 -157.5 -29.5t-82.5 -76.5q9 0 18 -20.5t9 -50.5t-33.5 -51.5t-70.5 -21.5q-67 0 -102.5 31.5t-35.5 85.5zM727 905q143 -28 250 -71l119 557q-176 -96 -369 -486zM881 1809q0 52 35 89q36 37 88.5 37t89.5 -36.5t37 -89t-37 -88.5q-38 -35 -76 -35 q-66 0 -101.5 35.5t-35.5 87.5zM1249 1809q0 53 36 89.5t88 36.5t89 -36.5t37 -89t-37 -88.5q-38 -35 -76 -35q-65 0 -101 35t-36 88z" />
|
||||
<glyph unicode="Å" horiz-adv-x="1368" d="M18 684q0 106 119 180q121 74 299 74q41 0 107 -6q166 261 352.5 432.5t359.5 171.5q104 0 162 -29l-321 -1507h-295l157 743q-136 62 -274 74q-184 -407 -246 -747q-20 -109 -20 -186.5t28 -116.5q-121 0 -170 25q-104 52 -104 192q0 212 178 596q56 120 123 237 q-96 -6 -157.5 -29.5t-82.5 -76.5q9 0 18 -20.5t9 -50.5t-33.5 -51.5t-70.5 -21.5q-67 0 -102.5 31.5t-35.5 85.5zM727 905q143 -28 250 -71l119 557q-176 -96 -369 -486zM993 1770q0 129 94 183q33 19 94.5 19t97.5 -46.5t36 -112.5t-40.5 -118.5t-122 -52.5t-120.5 42 t-39 86zM1075 1790q0 -76 70 -76q94 0 94 94q0 67 -30 88q-14 9 -38 9q-52 0 -74 -38t-22 -77z" />
|
||||
<glyph unicode="Æ" horiz-adv-x="1565" d="M18 685q0 105 121 176t279 71q53 0 121 -6q258 421 530 563q94 49 184 49q42 0 85 -6l88 -14q124 -21 196 -21q123 0 240 39l-23 -74q-46 -151 -197 -151q-78 0 -136 21l-117 44l-111 -518h317l-41 -151h-309l-104 -490h458l-43 -217h-755l157 743q-148 66 -276 74 q-180 -394 -244 -744q-20 -109 -20 -169t4.5 -80.5t9.5 -30.5t9.5 -14t4.5 -10q-139 5 -183 31q-91 53 -91 198q0 204 178 584q56 118 123 235q-92 -6 -154.5 -28.5t-85.5 -77.5q9 0 18 -20.5t9 -48.5t-29.5 -51.5t-85 -23.5t-91.5 30t-36 88zM723 903q131 -24 254 -69 l119 557q-184 -102 -373 -488z" />
|
||||
<glyph unicode="Ç" horiz-adv-x="1018" d="M39 457q0 257 85 513q99 302 292 452q148 114 338 114q238 0 315 -149q27 -52 27 -125q0 -189 -144 -189q-72 0 -116 53q37 20 65.5 75t28.5 109.5t-28.5 92t-91 37.5t-116 -42t-100.5 -114q-95 -144 -155 -368t-60 -406.5t53.5 -264t183.5 -81.5q256 0 408 205l47 -21 q-98 -248 -373 -344q-74 -26 -151 -34l-42 -105q64 16 109 16q127 0 127 -103t-74.5 -163.5t-161.5 -60.5t-123.5 12.5t-59.5 23.5l-46 21q38 65 76 65q53 0 91.5 -27.5t65.5 -27.5t44.5 26.5t17.5 57.5t-18.5 53.5t-68 22.5t-99.5 -25l75 212q-210 4 -315.5 118t-105.5 371 z" />
|
||||
<glyph unicode="È" horiz-adv-x="940" d="M14 332q0 162 105 321t274 201q-125 91 -125 251t130 297.5t319 137.5q127 0 210 -66.5t83 -174t-45 -168t-104 -60.5t-99 55q36 14 63 68t27 113.5t-36 85.5q-37 26 -80 26q-86 0 -146 -88.5t-60 -200.5q0 -154 112 -232q40 -28 95 -42q-156 -34 -261 -187t-105 -302 q0 -86 45 -146.5t148 -60.5t213.5 55t166.5 154l47 -21q-81 -178 -246.5 -281.5t-353 -103.5t-282.5 103.5t-95 265.5zM516 2048h215l60 -387h-154z" />
|
||||
<glyph unicode="É" horiz-adv-x="940" d="M14 332q0 162 105 321t274 201q-125 91 -125 251t130 297.5t319 137.5q127 0 210 -66.5t83 -174t-45 -168t-104 -60.5t-99 55q36 14 63 68t27 113.5t-36 85.5q-37 26 -80 26q-86 0 -146 -88.5t-60 -200.5q0 -154 112 -232q40 -28 95 -42q-156 -34 -261 -187t-105 -302 q0 -86 45 -146.5t148 -60.5t213.5 55t166.5 154l47 -21q-81 -178 -246.5 -281.5t-353 -103.5t-282.5 103.5t-95 265.5zM676 1661l186 387h215l-248 -387h-153z" />
|
||||
<glyph unicode="Ê" horiz-adv-x="940" d="M14 332q0 162 105 321t274 201q-125 91 -125 251t130 297.5t319 137.5q127 0 210 -66.5t83 -174t-45 -168t-104 -60.5t-99 55q36 14 63 68t27 113.5t-36 85.5q-37 26 -80 26q-86 0 -146 -88.5t-60 -200.5q0 -154 112 -232q40 -28 95 -42q-156 -34 -261 -187t-105 -302 q0 -86 45 -146.5t148 -60.5t213.5 55t166.5 154l47 -21q-81 -178 -246.5 -281.5t-353 -103.5t-282.5 103.5t-95 265.5zM414 1661l434 387h43l123 -387h-65l-123 164l-322 -164h-90z" />
|
||||
<glyph unicode="Ë" horiz-adv-x="940" d="M14 332q0 162 105 321t274 201q-125 91 -125 251t130 297.5t319 137.5q127 0 210 -66.5t83 -174t-45 -168t-104 -60.5t-99 55q36 14 63 68t27 113.5t-36 85.5q-37 26 -80 26q-86 0 -146 -88.5t-60 -200.5q0 -154 112 -232q40 -28 95 -42q-156 -34 -261 -187t-105 -302 q0 -86 45 -146.5t148 -60.5t213.5 55t166.5 154l47 -21q-81 -178 -246.5 -281.5t-353 -103.5t-282.5 103.5t-95 265.5zM488 1809q0 52 35 89q36 37 88.5 37t89.5 -36.5t37 -89t-37 -88.5q-38 -35 -77 -35q-66 0 -101 35.5t-35 87.5zM856 1809q0 53 36 89.5t88 36.5t89 -36.5 t37 -89t-37 -88.5q-38 -35 -77 -35q-64 0 -100 35t-36 88z" />
|
||||
<glyph unicode="Ì" horiz-adv-x="768" d="M12 1004q0 103 64.5 198.5t166.5 169.5q233 164 488 164q42 0 82 -4l-326 -1532h-294l296 1391q-286 -120 -286 -447q0 -83 23 -125q5 -8 5 -14q-164 0 -205 105q-14 38 -14 94zM350 2048h215l60 -387h-154z" />
|
||||
<glyph unicode="Í" horiz-adv-x="768" d="M12 1004q0 103 64.5 198.5t166.5 169.5q233 164 488 164q42 0 82 -4l-326 -1532h-294l296 1391q-286 -120 -286 -447q0 -83 23 -125q5 -8 5 -14q-164 0 -205 105q-14 38 -14 94zM551 1661l186 387h215l-248 -387h-153z" />
|
||||
<glyph unicode="Î" horiz-adv-x="768" d="M12 1004q0 103 64.5 198.5t166.5 169.5q233 164 488 164q42 0 82 -4l-326 -1532h-294l296 1391q-286 -120 -286 -447q0 -83 23 -125q5 -8 5 -14q-164 0 -205 105q-14 38 -14 94zM309 1661l434 387h43l123 -387h-65l-123 164l-322 -164h-90z" />
|
||||
<glyph unicode="Ï" horiz-adv-x="768" d="M12 1004q0 103 64.5 198.5t166.5 169.5q233 164 488 164q42 0 82 -4l-326 -1532h-294l296 1391q-286 -120 -286 -447q0 -83 23 -125q5 -8 5 -14q-164 0 -205 105q-14 38 -14 94zM342 1809q0 52 35 89q36 37 88.5 37t89.5 -36.5t37 -89t-37 -88.5q-38 -35 -77 -35 q-66 0 -101 35.5t-35 87.5zM710 1809q0 53 36 89.5t88 36.5t89 -36.5t37 -89t-37 -88.5q-38 -35 -77 -35q-64 0 -100 35t-36 88z" />
|
||||
<glyph unicode="Ð" horiz-adv-x="1358" d="M12 1004q0 103 64.5 198.5t166.5 169.5q233 164 488 164q590 0 590 -553q0 -201 -46 -381q-97 -379 -307 -546q-103 -83 -220.5 -83t-243.5 109l-17 -82h-294l151 707h-80l41 151h72l94 445l303 40l-104 -485h161l-40 -151h-154l-109 -512q56 -41 117 -41q92 0 165 82 q140 157 200 500q28 155 28 278t-11 198t-42 126q-63 104 -229 104q-252 0 -402 -134q-151 -134 -151 -364q0 -83 23 -125q5 -8 5 -14q-164 0 -205 105q-14 38 -14 94z" />
|
||||
<glyph unicode="Ñ" horiz-adv-x="1405" d="M12 1005.5q0 57.5 18.5 119.5t53.5 121q76 129 208 209.5t300 80.5q48 0 96.5 -3t93.5 -26l162 -1085l223 1110h295l-325 -1532h-248l-174 1071l-228 -1071h-294l294 1391q-136 -57 -210 -169.5t-74 -277.5q0 -83 23 -125q5 -8 5 -14q-164 0 -205 105q-14 38 -14 95.5z M631 1704q99 201 342 201q79 0 148.5 -23.5t107.5 -34t100 -10.5t111 47l12 -2q-17 -74 -117.5 -139.5t-212.5 -65.5q-69 0 -145 26t-116 38t-83 12q-77 0 -135 -53z" />
|
||||
<glyph unicode="Ò" horiz-adv-x="1348" d="M33 983q0 100 68 201q145 212 447 306q150 46 310 46q485 0 485 -524q0 -353 -177 -660q-126 -221 -336 -316q-108 -48 -215.5 -48t-174.5 22q-219 74 -219 389q0 211 79 449q126 384 346 484q61 28 126.5 28t110.5 -17q-89 -53 -176 -227q-126 -249 -169 -552 q-14 -94 -14 -173q0 -237 119 -237h2q99 0 198 144t163.5 363.5t64.5 416t-54 280.5t-208 84q-246 0 -418 -145.5t-172 -381.5q0 -60 10.5 -79.5t10.5 -30.5q-100 0 -153.5 39t-53.5 139zM598 2048h215l60 -387h-154z" />
|
||||
<glyph unicode="Ó" horiz-adv-x="1348" d="M33 983q0 100 68 201q145 212 447 306q150 46 310 46q485 0 485 -524q0 -353 -177 -660q-126 -221 -336 -316q-108 -48 -215.5 -48t-174.5 22q-219 74 -219 389q0 211 79 449q126 384 346 484q61 28 126.5 28t110.5 -17q-89 -53 -176 -227q-126 -249 -169 -552 q-14 -94 -14 -173q0 -237 119 -237h2q99 0 198 144t163.5 363.5t64.5 416t-54 280.5t-208 84q-246 0 -418 -145.5t-172 -381.5q0 -60 10.5 -79.5t10.5 -30.5q-100 0 -153.5 39t-53.5 139zM813 1661l186 387h215l-248 -387h-153z" />
|
||||
<glyph unicode="Ô" horiz-adv-x="1348" d="M33 983q0 100 68 201q145 212 447 306q150 46 310 46q485 0 485 -524q0 -353 -177 -660q-126 -221 -336 -316q-108 -48 -215.5 -48t-174.5 22q-219 74 -219 389q0 211 79 449q126 384 346 484q61 28 126.5 28t110.5 -17q-89 -53 -176 -227q-126 -249 -169 -552 q-14 -94 -14 -173q0 -237 119 -237h2q99 0 198 144t163.5 363.5t64.5 416t-54 280.5t-208 84q-246 0 -418 -145.5t-172 -381.5q0 -60 10.5 -79.5t10.5 -30.5q-100 0 -153.5 39t-53.5 139zM557 1661l434 387h43l123 -387h-65l-123 164l-322 -164h-90z" />
|
||||
<glyph unicode="Õ" horiz-adv-x="1348" d="M33 983q0 100 68 201q145 212 447 306q150 46 310 46q485 0 485 -524q0 -353 -177 -660q-126 -221 -336 -316q-108 -48 -215.5 -48t-174.5 22q-219 74 -219 389q0 211 79 449q126 384 346 484q61 28 126.5 28t110.5 -17q-89 -53 -176 -227q-126 -249 -169 -552 q-14 -94 -14 -173q0 -237 119 -237h2q99 0 198 144t163.5 363.5t64.5 416t-54 280.5t-208 84q-246 0 -418 -145.5t-172 -381.5q0 -60 10.5 -79.5t10.5 -30.5q-100 0 -153.5 39t-53.5 139zM561 1704q99 201 342 201q79 0 148.5 -23.5t107.5 -34t100 -10.5t111 47l12 -2 q-17 -74 -117.5 -139.5t-212.5 -65.5q-69 0 -145 26t-116 38t-83 12q-77 0 -135 -53z" />
|
||||
<glyph unicode="Ö" horiz-adv-x="1348" d="M33 983q0 100 68 201q145 212 447 306q150 46 310 46q485 0 485 -524q0 -353 -177 -660q-126 -221 -336 -316q-108 -48 -215.5 -48t-174.5 22q-219 74 -219 389q0 211 79 449q126 384 346 484q61 28 126.5 28t110.5 -17q-89 -53 -176 -227q-126 -249 -169 -552 q-14 -94 -14 -173q0 -237 119 -237h2q99 0 198 144t163.5 363.5t64.5 416t-54 280.5t-208 84q-246 0 -418 -145.5t-172 -381.5q0 -60 10.5 -79.5t10.5 -30.5q-100 0 -153.5 39t-53.5 139zM590 1809q0 52 35 89q36 37 88.5 37t89.5 -36.5t37 -89t-37 -88.5q-38 -35 -77 -35 q-66 0 -101 35.5t-35 87.5zM958 1809q0 53 36 89.5t88 36.5t89 -36.5t37 -89t-37 -88.5q-38 -35 -77 -35q-64 0 -100 35t-36 88z" />
|
||||
<glyph unicode="×" horiz-adv-x="1055" d="M201 338l194 194l-194 195l133 131l192 -194l197 196l131 -133l-195 -195l195 -194l-131 -133l-197 194l-192 -192z" />
|
||||
<glyph unicode="Ø" horiz-adv-x="1348" d="M31 913q0 101 65 196q137 196 432 285q146 44 299 44h25q12 0 25 -2l22 100h107l-25 -115q313 -73 313 -475q0 -120 -35 -278q-74 -333 -301 -537q-117 -105 -278 -133l-31 -143h-106l28 133h-4q-254 0 -328 208q-26 74 -26 165t15 188t44 197q67 224 180 364 q131 164 296 164q47 0 92 -14l18 83q-32 7 -112 7t-183 -34.5t-181 -98.5q-171 -140 -171 -361q0 -55 10 -73t10 -29q-97 0 -135 27t-51.5 57.5t-13.5 74.5zM506 374q0 -211 98 -231l234 1106q-66 -44 -110 -121q-138 -239 -195 -518q-27 -135 -27 -236zM719 180 q126 94 219.5 344t93.5 490q0 102 -15.5 172.5t-62.5 111.5z" />
|
||||
<glyph unicode="Ù" horiz-adv-x="1473" d="M0 993q0 109 65 207q137 203 420 292q141 44 289 44q45 0 98 -10l-209 -778q-67 -259 -67 -362t31.5 -151.5t120.5 -48.5t129 30q73 55 127 199.5t129 483.5l137 633h289l-136 -639q-78 -381 -160 -561q-98 -215 -263 -292q-118 -54 -258 -54t-215.5 21.5t-122.5 62.5 q-87 79 -87 237t51 368l185 742q-169 -45 -266 -164t-97 -307q0 -87 24 -128q5 -7 5 -13q-162 0 -204 100q-15 36 -15 88zM840 2048h215l60 -387h-154z" />
|
||||
<glyph unicode="Ú" horiz-adv-x="1473" d="M0 993q0 109 65 207q137 203 420 292q141 44 289 44q45 0 98 -10l-209 -778q-67 -259 -67 -362t31.5 -151.5t120.5 -48.5t129 30q73 55 127 199.5t129 483.5l137 633h289l-136 -639q-78 -381 -160 -561q-98 -215 -263 -292q-118 -54 -258 -54t-215.5 21.5t-122.5 62.5 q-87 79 -87 237t51 368l185 742q-169 -45 -266 -164t-97 -307q0 -87 24 -128q5 -7 5 -13q-162 0 -204 100q-15 36 -15 88zM924 1661l186 387h215l-248 -387h-153z" />
|
||||
<glyph unicode="Û" horiz-adv-x="1473" d="M0 993q0 109 65 207q137 203 420 292q141 44 289 44q45 0 98 -10l-209 -778q-67 -259 -67 -362t31.5 -151.5t120.5 -48.5t129 30q73 55 127 199.5t129 483.5l137 633h289l-136 -639q-78 -381 -160 -561q-98 -215 -263 -292q-118 -54 -258 -54t-215.5 21.5t-122.5 62.5 q-87 79 -87 237t51 368l185 742q-169 -45 -266 -164t-97 -307q0 -87 24 -128q5 -7 5 -13q-162 0 -204 100q-15 36 -15 88zM743 1661l434 387h43l123 -387h-65l-123 164l-322 -164h-90z" />
|
||||
<glyph unicode="Ü" horiz-adv-x="1473" d="M0 993q0 109 65 207q137 203 420 292q141 44 289 44q45 0 98 -10l-209 -778q-67 -259 -67 -362t31.5 -151.5t120.5 -48.5t129 30q73 55 127 199.5t129 483.5l137 633h289l-136 -639q-78 -381 -160 -561q-98 -215 -263 -292q-118 -54 -258 -54t-215.5 21.5t-122.5 62.5 q-87 79 -87 237t51 368l185 742q-169 -45 -266 -164t-97 -307q0 -87 24 -128q5 -7 5 -13q-162 0 -204 100q-15 36 -15 88zM764 1809q0 52 35 89q36 37 88.5 37t89.5 -36.5t37 -89t-37 -88.5q-38 -35 -77 -35q-66 0 -101 35.5t-35 87.5zM1132 1809q0 53 36 89.5t88 36.5 t89 -36.5t37 -89t-37 -88.5q-38 -35 -77 -35q-64 0 -100 35t-36 88z" />
|
||||
<glyph unicode="Ý" horiz-adv-x="1270" d="M12 1004q0 103 64.5 198.5t166.5 169.5q233 164 488 164q42 0 82 -4l178 -733l303 727h136l-398 -895l-135 -631h-328l136 631l-197 768q-144 -54 -224.5 -169t-80.5 -286q0 -83 23 -125q5 -8 5 -14q-164 0 -205 105q-14 38 -14 94zM928 1661l186 387h215l-248 -387h-153 z" />
|
||||
<glyph unicode="Þ" horiz-adv-x="1194" d="M12 788q0 65 36 138t98 136q127 132 315 200l51 233l303 41l-49 -225q222 -11 335 -125t113 -279q0 -208 -164 -378.5t-427 -170.5h-60l-76 -358h-294l245 1151q-235 -123 -235 -432q0 -83 23 -125q5 -8 5 -14q-164 0 -205 105q-14 38 -14 103zM580 434h28q102 0 194 81 q129 114 172 308q13 59 13 115q0 119 -59.5 196t-179.5 83z" />
|
||||
<glyph unicode="ß" horiz-adv-x="922" d="M-174 -512l340 1597q39 197 158 284q89 65 219.5 65t203 -76t72.5 -174.5t-48.5 -182.5t-139.5 -127q108 -36 153 -117t45 -179.5t-18.5 -182.5t-48.5 -149q-57 -118 -146.5 -181t-175.5 -65q-35 0 -67 4l26 121q137 0 197 260q27 111 27 241q0 68 -32 112t-116 67 l37 119q64 26 117 81t53 130t-18.5 96.5t-47.5 21.5q-54 0 -95.5 -38t-59.5 -130l-326 -1523z" />
|
||||
<glyph unicode="à" horiz-adv-x="1077" d="M-27 306.5q0 80.5 14 161t43 160.5q64 176 183 291t287 115q88 0 127 -29.5t39 -74.5v-15l22 109h295l-147 -696q-9 -35 -9 -66q0 -88 84 -88q109 0 166 193h86q-130 -379 -411 -379q-181 0 -201 188q-134 -188 -312.5 -188t-242.5 175q-23 63 -23 143.5zM276 335 q0 -91 38 -127q22 -22 55 -22q61 0 111 48.5t69 132.5l98 462q0 19 -17.5 48.5t-74.5 29.5t-111 -61q-130 -147 -163 -422q-5 -42 -5 -89zM442 1536h215l60 -387h-154z" />
|
||||
<glyph unicode="á" horiz-adv-x="1077" d="M-27 306.5q0 80.5 14 161t43 160.5q64 176 183 291t287 115q88 0 127 -29.5t39 -74.5v-15l22 109h295l-147 -696q-9 -35 -9 -66q0 -88 84 -88q109 0 166 193h86q-130 -379 -411 -379q-181 0 -201 188q-134 -188 -312.5 -188t-242.5 175q-23 63 -23 143.5zM276 335 q0 -91 38 -127q22 -22 55 -22q61 0 111 48.5t69 132.5l98 462q0 19 -17.5 48.5t-74.5 29.5t-111 -61q-130 -147 -163 -422q-5 -42 -5 -89zM502 1149l186 387h215l-248 -387h-153z" />
|
||||
<glyph unicode="â" horiz-adv-x="1077" d="M-27 306.5q0 80.5 14 161t43 160.5q64 176 183 291t287 115q88 0 127 -29.5t39 -74.5v-15l22 109h295l-147 -696q-9 -35 -9 -66q0 -88 84 -88q109 0 166 193h86q-130 -379 -411 -379q-181 0 -201 188q-134 -188 -312.5 -188t-242.5 175q-23 63 -23 143.5zM276 335 q0 -91 38 -127q22 -22 55 -22q61 0 111 48.5t69 132.5l98 462q0 19 -17.5 48.5t-74.5 29.5t-111 -61q-130 -147 -163 -422q-5 -42 -5 -89zM299 1149l434 387h43l123 -387h-65l-123 164l-322 -164h-90z" />
|
||||
<glyph unicode="ã" horiz-adv-x="1077" d="M-27 306.5q0 80.5 14 161t43 160.5q64 176 183 291t287 115q88 0 127 -29.5t39 -74.5v-15l22 109h295l-147 -696q-9 -35 -9 -66q0 -88 84 -88q109 0 166 193h86q-130 -379 -411 -379q-181 0 -201 188q-134 -188 -312.5 -188t-242.5 175q-23 63 -23 143.5zM209 1192 q99 201 342 201q79 0 148.5 -23.5t107.5 -34t100 -10.5t111 47l12 -2q-17 -74 -117.5 -139.5t-212.5 -65.5q-69 0 -145 26t-116 38t-83 12q-77 0 -135 -53zM276 335q0 -91 38 -127q22 -22 55 -22q61 0 111 48.5t69 132.5l98 462q0 19 -17.5 48.5t-74.5 29.5t-111 -61 q-130 -147 -163 -422q-5 -42 -5 -89z" />
|
||||
<glyph unicode="ä" horiz-adv-x="1077" d="M-27 306.5q0 80.5 14 161t43 160.5q64 176 183 291t287 115q88 0 127 -29.5t39 -74.5v-15l22 109h295l-147 -696q-9 -35 -9 -66q0 -88 84 -88q109 0 166 193h86q-130 -379 -411 -379q-181 0 -201 188q-134 -188 -312.5 -188t-242.5 175q-23 63 -23 143.5zM276 335 q0 -91 38 -127q22 -22 55 -22q61 0 111 48.5t69 132.5l98 462q0 19 -17.5 48.5t-74.5 29.5t-111 -61q-130 -147 -163 -422q-5 -42 -5 -89zM369 1297q0 52 35 89q36 37 88.5 37t89.5 -36.5t37 -89t-37 -88.5q-38 -35 -76 -35q-66 0 -101.5 35.5t-35.5 87.5zM737 1297 q0 53 36 89.5t88 36.5t89 -36.5t37 -89t-37 -88.5q-38 -35 -76 -35q-65 0 -101 35t-36 88z" />
|
||||
<glyph unicode="å" horiz-adv-x="1077" d="M-27 306.5q0 80.5 14 161t43 160.5q64 176 183 291t287 115q88 0 127 -29.5t39 -74.5v-15l22 109h295l-147 -696q-9 -35 -9 -66q0 -88 84 -88q109 0 166 193h86q-130 -379 -411 -379q-181 0 -201 188q-134 -188 -312.5 -188t-242.5 175q-23 63 -23 143.5zM276 335 q0 -91 38 -127q22 -22 55 -22q61 0 111 48.5t69 132.5l98 462q0 19 -17.5 48.5t-74.5 29.5t-111 -61q-130 -147 -163 -422q-5 -42 -5 -89zM479 1258q0 129 94 183q33 19 94.5 19t97.5 -46.5t36 -112.5t-40.5 -118.5t-122 -52.5t-120.5 42t-39 86zM561 1278q0 -76 70 -76 q94 0 94 94q0 67 -30 88q-14 9 -38 9q-52 0 -74 -38t-22 -77z" />
|
||||
<glyph unicode="æ" horiz-adv-x="1331" d="M-16 261q0 172 122.5 252.5t331.5 80.5q69 0 107 -8q43 92 43 186t-68 128q-24 11 -87 11q-111 0 -218 -96l-57 59q144 147 287 157q42 3 85 3q164 0 267 -82q118 90 288.5 90t201.5 -124q9 -37 9 -100.5t-39 -138.5t-104 -132q-138 -121 -328 -133q-4 -34 -4 -66 q0 -115 34 -151.5t99 -36.5q126 0 201 47t176 160h70q-228 -375 -565 -375q-248 0 -301 192q-50 -92 -95 -128q-85 -68 -196 -68q-176 0 -236 134q-24 51 -24 139zM272 300q0 -71 31.5 -92.5t60.5 -21.5q58 0 97 61t69 220q-10 2 -17 2h-17q-102 0 -163 -49t-61 -120z M840 512q117 8 208 108.5t91 207t-49 106.5q-75 0 -144 -126.5t-106 -295.5z" />
|
||||
<glyph unicode="ç" horiz-adv-x="786" d="M-27 313q0 235 119 454q90 165 247 237q81 38 167 38q246 0 246 -186q0 -78 -32 -114.5t-72 -36.5t-77 24q25 66 25 121q0 84 -58.5 84t-123.5 -106q-93 -150 -128 -373q-10 -67 -10 -147q0 -148 141 -148q118 0 198.5 52.5t170.5 154.5h70q-159 -262 -378 -347 q-15 -6 -30 -10l-59 -145q64 16 109 16q127 0 127 -103t-74.5 -163.5t-161.5 -60.5t-123.5 12.5t-59.5 23.5l-46 21q38 65 76 65q53 0 91.5 -27.5t65.5 -27.5t44.5 26.5t17.5 57.5t-18.5 53.5t-68 22.5t-99.5 -25l84 235q-29 -3 -60 -3q-146 0 -233 75.5t-87 249.5z" />
|
||||
<glyph unicode="è" horiz-adv-x="786" d="M-27 313q0 234 119 453q91 167 248 238q81 38 168 38q142 0 193 -53.5t51 -142.5q0 -175 -141 -297.5t-330 -134.5q-5 -58 -5 -82q0 -105 37 -138.5t104 -33.5q118 0 198.5 52.5t170.5 154.5h70q-230 -379 -563 -379q-146 0 -233 75.5t-87 249.5zM297 512 q118 8 207.5 110t89.5 238q0 74 -51 74q-75 -2 -145 -132.5t-101 -289.5zM354 1536h215l60 -387h-154z" />
|
||||
<glyph unicode="é" horiz-adv-x="786" d="M-27 313q0 234 119 453q91 167 248 238q81 38 168 38q142 0 193 -53.5t51 -142.5q0 -175 -141 -297.5t-330 -134.5q-5 -58 -5 -82q0 -105 37 -138.5t104 -33.5q118 0 198.5 52.5t170.5 154.5h70q-230 -379 -563 -379q-146 0 -233 75.5t-87 249.5zM297 512 q118 8 207.5 110t89.5 238q0 74 -51 74q-75 -2 -145 -132.5t-101 -289.5zM398 1149l186 387h215l-248 -387h-153z" />
|
||||
<glyph unicode="ê" horiz-adv-x="786" d="M-27 313q0 234 119 453q91 167 248 238q81 38 168 38q142 0 193 -53.5t51 -142.5q0 -175 -141 -297.5t-330 -134.5q-5 -58 -5 -82q0 -105 37 -138.5t104 -33.5q118 0 198.5 52.5t170.5 154.5h70q-230 -379 -563 -379q-146 0 -233 75.5t-87 249.5zM215 1149l434 387h43 l123 -387h-65l-123 164l-322 -164h-90zM297 512q118 8 207.5 110t89.5 238q0 74 -51 74q-75 -2 -145 -132.5t-101 -289.5z" />
|
||||
<glyph unicode="ë" horiz-adv-x="786" d="M-27 313q0 234 119 453q91 167 248 238q81 38 168 38q142 0 193 -53.5t51 -142.5q0 -175 -141 -297.5t-330 -134.5q-5 -58 -5 -82q0 -105 37 -138.5t104 -33.5q118 0 198.5 52.5t170.5 154.5h70q-230 -379 -563 -379q-146 0 -233 75.5t-87 249.5zM244 1297q0 52 35 89 q36 37 88.5 37t89.5 -36.5t37 -89t-37 -88.5q-38 -35 -77 -35q-66 0 -101 35.5t-35 87.5zM297 512q118 8 207.5 110t89.5 238q0 74 -51 74q-75 -2 -145 -132.5t-101 -289.5zM612 1297q0 53 36 89.5t88 36.5t89 -36.5t37 -89t-37 -88.5q-38 -35 -77 -35q-64 0 -100 35t-36 88 z" />
|
||||
<glyph unicode="ì" horiz-adv-x="547" d="M-16 233q0 58 16 134l139 657h295l-147 -696q-8 -37 -8 -73q0 -69 83 -69q60 0 111.5 52t73.5 129h86q-132 -379 -441 -379q-81 0 -145 58q-63 58 -63 187zM135 1536h215l60 -387h-154z" />
|
||||
<glyph unicode="í" horiz-adv-x="547" d="M-16 233q0 58 16 134l139 657h295l-147 -696q-8 -37 -8 -73q0 -69 83 -69q60 0 111.5 52t73.5 129h86q-132 -379 -441 -379q-81 0 -145 58q-63 58 -63 187zM248 1149l186 387h215l-248 -387h-153z" />
|
||||
<glyph unicode="î" horiz-adv-x="547" d="M-16 233q0 58 16 134l139 657h295l-147 -696q-8 -37 -8 -73q0 -69 83 -69q60 0 111.5 52t73.5 129h86q-132 -379 -441 -379q-81 0 -145 58q-63 58 -63 187zM12 1149l434 387h43l123 -387h-65l-123 164l-322 -164h-90z" />
|
||||
<glyph unicode="ï" horiz-adv-x="547" d="M-16 233q0 58 16 134l139 657h295l-147 -696q-8 -37 -8 -73q0 -69 83 -69q60 0 111.5 52t73.5 129h86q-132 -379 -441 -379q-81 0 -145 58q-63 58 -63 187zM36 1297q0 52 35 89q36 37 88.5 37t89.5 -36.5t37 -89t-37 -88.5q-38 -35 -77 -35q-66 0 -101 35.5t-35 87.5z M404 1297q0 53 36 89.5t88 36.5t89 -36.5t37 -89t-37 -88.5q-38 -35 -77 -35q-64 0 -100 35t-36 88z" />
|
||||
<glyph unicode="ð" horiz-adv-x="1102" d="M-2 306.5q0 80.5 14.5 161t43.5 160.5q63 177 174 282q127 124 294 124q88 0 127 -29.5t39 -74.5v-12l17 75q17 75 22 156h-158l17 82h141q-12 103 -86 203h92q74 -43 129 -86t90 -117h129l-16 -82h-86q12 -50 12 -117.5t-22 -181.5l-111 -522q-8 -37 -8 -73 q0 -69 84 -69q110 0 166 181h86q-128 -367 -412 -367q-175 0 -201 178q-121 -190 -305.5 -190t-248.5 175q-23 63 -23 143.5zM301 335q0 -90 29.5 -119.5t62.5 -29.5q61 0 111 48t69 133l99 462q0 45 -44 69q-16 9 -40 9q-67 0 -120 -61q-130 -149 -162 -422q-5 -42 -5 -89z " />
|
||||
<glyph unicode="ñ" d="M-78 0l217 1024h295l-22 -106q100 114 239 114q98 0 163 -54t65 -160t-34 -240l-49 -198q-16 -65 -16 -106q0 -88 75 -88q69 0 106 44t73 137h86q-119 -345 -322 -375q-32 -4 -79 -4t-93 20q-128 54 -128 211q0 84 46 268t46 254q0 105 -74 105t-132 -117 q-17 -33 -28 -72l-139 -657h-295zM180 1192q99 201 342 201q79 0 148.5 -23.5t107.5 -34t100 -10.5t111 47l12 -2q-17 -74 -117.5 -139.5t-212.5 -65.5q-69 0 -145 26t-116 38t-83 12q-77 0 -135 -53z" />
|
||||
<glyph unicode="ò" horiz-adv-x="887" d="M-40 301q0 74 12.5 150.5t39.5 157.5q61 183 177 297q138 136 332 136q263 0 263 -327v-2q10 -2 34 -2q55 0 141.5 35t162.5 88l18 -56q-124 -130 -363 -170q-24 -280 -161 -448t-328 -168q-236 0 -304 174q-24 61 -24 135zM265 342q0 -99 18 -125.5t38 -33.5t53 -7 q71 0 140 123t93 303q-55 14 -55 91t64 106q-4 65 -20.5 92t-64.5 27q-94 0 -180 -207.5t-86 -368.5zM366 1536h215l60 -387h-154z" />
|
||||
<glyph unicode="ó" horiz-adv-x="887" d="M-40 301q0 74 12.5 150.5t39.5 157.5q61 183 177 297q138 136 332 136q263 0 263 -327v-2q10 -2 34 -2q55 0 141.5 35t162.5 88l18 -56q-124 -130 -363 -170q-24 -280 -161 -448t-328 -168q-236 0 -304 174q-24 61 -24 135zM265 342q0 -99 18 -125.5t38 -33.5t53 -7 q71 0 140 123t93 303q-55 14 -55 91t64 106q-4 65 -20.5 92t-64.5 27q-94 0 -180 -207.5t-86 -368.5zM449 1149l186 387h215l-248 -387h-153z" />
|
||||
<glyph unicode="ô" horiz-adv-x="887" d="M-40 301q0 74 12.5 150.5t39.5 157.5q61 183 177 297q138 136 332 136q263 0 263 -327v-2q10 -2 34 -2q55 0 141.5 35t162.5 88l18 -56q-124 -130 -363 -170q-24 -280 -161 -448t-328 -168q-236 0 -304 174q-24 61 -24 135zM195 1149l434 387h43l123 -387h-65l-123 164 l-322 -164h-90zM265 342q0 -99 18 -125.5t38 -33.5t53 -7q71 0 140 123t93 303q-55 14 -55 91t64 106q-4 65 -20.5 92t-64.5 27q-94 0 -180 -207.5t-86 -368.5z" />
|
||||
<glyph unicode="õ" horiz-adv-x="887" d="M-40 301q0 74 12.5 150.5t39.5 157.5q61 183 177 297q138 136 332 136q263 0 263 -327v-2q10 -2 34 -2q55 0 141.5 35t162.5 88l18 -56q-124 -130 -363 -170q-24 -280 -161 -448t-328 -168q-236 0 -304 174q-24 61 -24 135zM82 1192q99 201 342 201q79 0 148.5 -23.5 t107.5 -34t100 -10.5t111 47l12 -2q-17 -74 -117.5 -139.5t-212.5 -65.5q-69 0 -145 26t-116 38t-83 12q-77 0 -135 -53zM265 342q0 -99 18 -125.5t38 -33.5t53 -7q71 0 140 123t93 303q-55 14 -55 91t64 106q-4 65 -20.5 92t-64.5 27q-94 0 -180 -207.5t-86 -368.5z" />
|
||||
<glyph unicode="ö" horiz-adv-x="887" d="M-40 301q0 74 12.5 150.5t39.5 157.5q61 183 177 297q138 136 332 136q263 0 263 -327v-2q10 -2 34 -2q55 0 141.5 35t162.5 88l18 -56q-124 -130 -363 -170q-24 -280 -161 -448t-328 -168q-236 0 -304 174q-24 61 -24 135zM215 1297q0 52 35 89q36 37 88.5 37 t89.5 -36.5t37 -89t-37 -88.5q-38 -35 -76 -35q-66 0 -101.5 35.5t-35.5 87.5zM265 342q0 -99 18 -125.5t38 -33.5t53 -7q71 0 140 123t93 303q-55 14 -55 91t64 106q-4 65 -20.5 92t-64.5 27q-94 0 -180 -207.5t-86 -368.5zM583 1297q0 53 36 89.5t88 36.5t89 -36.5t37 -89 t-37 -88.5q-38 -35 -76 -35q-65 0 -101 35t-36 88z" />
|
||||
<glyph unicode="÷" horiz-adv-x="967" d="M105 422l37 161h717l-35 -161h-719zM301 163q0 67 46.5 116t114.5 49t116.5 -48.5t48.5 -116.5t-49 -114.5t-116 -46.5t-114 47t-47 114zM424 849.5q0 67.5 46.5 116t114.5 48.5t116.5 -48t48.5 -116.5t-49 -115t-116 -46.5t-114 47t-47 114.5z" />
|
||||
<glyph unicode="ø" horiz-adv-x="877" d="M-29 301q0 72 11.5 147.5t37.5 154.5q60 182 180.5 306t307.5 131l41 199h106l-43 -209q170 -45 176 -299q143 7 304 123h65q-42 -64 -149.5 -131.5t-223.5 -95.5q-16 -251 -122 -415.5t-269 -207.5l-45 -215h-106l43 203q-226 7 -291 177q-23 60 -23 132zM276 354 q0 -111 22.5 -144.5t71.5 -33.5q86 0 153 123t91 309q-57 16 -57 98.5t64 104.5q-5 60 -23 83.5t-64.5 23.5t-94.5 -62q-94 -122 -142 -339q-21 -99 -21 -163z" />
|
||||
<glyph unicode="ù" d="M-16 233q0 58 16 134l139 657h295l-147 -696q-6 -32 -6 -58q0 -84 61 -84q108 0 164 181l139 657h295l-147 -696q-9 -35 -9 -72q0 -70 84 -70q115 0 166 181h86q-130 -379 -411 -379q-183 0 -203 194q-120 -194 -303 -194q-92 0 -156 58q-63 58 -63 187zM379 1536h215 l60 -387h-154z" />
|
||||
<glyph unicode="ú" d="M-16 233q0 58 16 134l139 657h295l-147 -696q-6 -32 -6 -58q0 -84 61 -84q108 0 164 181l139 657h295l-147 -696q-9 -35 -9 -72q0 -70 84 -70q115 0 166 181h86q-130 -379 -411 -379q-183 0 -203 194q-120 -194 -303 -194q-92 0 -156 58q-63 58 -63 187zM490 1149 l186 387h215l-248 -387h-153z" />
|
||||
<glyph unicode="û" d="M-16 233q0 58 16 134l139 657h295l-147 -696q-6 -32 -6 -58q0 -84 61 -84q108 0 164 181l139 657h295l-147 -696q-9 -35 -9 -72q0 -70 84 -70q115 0 166 181h86q-130 -379 -411 -379q-183 0 -203 194q-120 -194 -303 -194q-92 0 -156 58q-63 58 -63 187zM258 1149 l434 387h43l123 -387h-65l-123 164l-322 -164h-90z" />
|
||||
<glyph unicode="ü" d="M-16 233q0 58 16 134l139 657h295l-147 -696q-6 -32 -6 -58q0 -84 61 -84q108 0 164 181l139 657h295l-147 -696q-9 -35 -9 -72q0 -70 84 -70q115 0 166 181h86q-130 -379 -411 -379q-183 0 -203 194q-120 -194 -303 -194q-92 0 -156 58q-63 58 -63 187zM279 1297 q0 52 35 89q36 37 88.5 37t89.5 -36.5t37 -89t-37 -88.5q-38 -35 -76 -35q-66 0 -101.5 35.5t-35.5 87.5zM647 1297q0 53 36 89.5t88 36.5t89 -36.5t37 -89t-37 -88.5q-38 -35 -76 -35q-65 0 -101 35t-36 88z" />
|
||||
<glyph unicode="ý" d="M-16 233q0 58 16 134l139 657h295l-147 -696q-6 -26 -6 -52q0 -90 58.5 -90t99.5 48q40 49 63 120l143 670h295l-203 -950q93 31 153.5 94.5t104.5 198.5h86q-78 -264 -264 -348q-51 -23 -98 -35l-31 -148q-39 -197 -156 -284q-86 -64 -197 -64t-178 49t-67 157 q0 187 334 298l25 110q-106 -114 -246 -114q-92 0 -156 58q-63 58 -63 187zM203 -285q0 -41 39 -61q13 -6 38 -6t58 44.5t53 137.5l12 59q-200 -72 -200 -174zM488 1149l186 387h215l-248 -387h-153z" />
|
||||
<glyph unicode="þ" horiz-adv-x="969" d="M-188 -512l319 1505q25 109 25 191q0 134 -88 250h92q127 -75 170 -129q88 -108 88 -265q0 -42 -8 -100q101 94 247 94q177 0 231 -170q19 -62 19 -142.5t-9.5 -161t-32.5 -161t-60.5 -154.5t-93.5 -131.5t-132.5 -91.5t-192.5 -34t-159 75l-106 -501zM260 217 q17 -51 88 -51t126 58q107 114 138 326q15 94 15 167q0 170 -103 170q-35 0 -74.5 -26.5t-68.5 -80.5z" />
|
||||
<glyph unicode="ÿ" d="M-16 233q0 58 16 134l139 657h295l-147 -696q-6 -26 -6 -52q0 -90 58.5 -90t99.5 48q40 49 63 120l143 670h295l-203 -950q93 31 153.5 94.5t104.5 198.5h86q-78 -264 -264 -348q-51 -23 -98 -35l-31 -148q-39 -197 -156 -284q-86 -64 -197 -64t-178 49t-67 157 q0 187 334 298l25 110q-106 -114 -246 -114q-92 0 -156 58q-63 58 -63 187zM203 -285q0 -41 39 -61q13 -6 38 -6t58 44.5t53 137.5l12 59q-200 -72 -200 -174zM252 1297q0 52 35 89q36 37 88.5 37t89.5 -36.5t37 -89t-37 -88.5q-38 -35 -77 -35q-66 0 -101 35.5t-35 87.5z M620 1297q0 53 36 89.5t88 36.5t89 -36.5t37 -89t-37 -88.5q-38 -35 -77 -35q-64 0 -100 35t-36 88z" />
|
||||
<glyph unicode="Œ" horiz-adv-x="1733" d="M33 983q0 100 68 201q145 212 447 306q150 46 296.5 46t238.5 -38q118 38 225 38t194 -12.5t190 -12.5t180 25l-19 -70q-39 -146 -176 -176q-98 0 -232 34t-192 40q90 -128 90 -352q0 -73 -10 -154h273l-41 -151h-259q-44 -189 -140 -356q-42 -73 -95 -134h498l-43 -217 h-793q-67 -12 -147 -12q-168 0 -266.5 98.5t-98.5 311t79 450.5q126 384 346 484q61 28 126.5 28t110.5 -17q-89 -53 -176 -227q-126 -249 -169 -552q-14 -94 -14 -173q0 -237 119 -237h2q99 0 198 144t163.5 363.5t64.5 416t-54 280.5t-208 84q-246 0 -418 -145.5 t-172 -381.5q0 -60 10.5 -79.5t10.5 -30.5q-100 0 -153.5 39t-53.5 139z" />
|
||||
<glyph unicode="œ" horiz-adv-x="1358" d="M-14 326q0 353 162 546q146 172 376 172q104 0 156 -49t74 -125q126 172 327 172q262 0 262 -213q0 -175 -159 -294q-140 -106 -303 -123q-7 -44 -7 -92q0 -91 49 -132t103 -41q95 0 202.5 79.5t157.5 191.5h93q-157 -285 -393 -382q-86 -35 -188 -36h-2 q-100 0 -169.5 50t-101.5 128q-135 -190 -326 -190q-164 0 -239 76q-74 77 -74 262zM258 326q0 -77 39.5 -108.5t92.5 -31.5q94 0 152 124q49 101 72 272q-45 0 -65.5 27.5t-20.5 56.5q0 54 25.5 94.5t64.5 56.5q-8 107 -86 107q-71 0 -124 -68q-96 -126 -135 -355 q-15 -98 -15 -175zM897 510q133 0 228.5 97.5t95.5 211.5q0 72 -36 103q-14 12 -46.5 12t-70.5 -39q-110 -111 -171 -385z" />
|
||||
<glyph unicode="Ÿ" horiz-adv-x="1270" d="M12 1004q0 103 64.5 198.5t166.5 169.5q233 164 488 164q42 0 82 -4l178 -733l303 727h136l-398 -895l-135 -631h-328l136 631l-197 768q-144 -54 -224.5 -169t-80.5 -286q0 -83 23 -125q5 -8 5 -14q-164 0 -205 105q-14 38 -14 94zM777 1809q0 52 35 89q36 37 88.5 37 t89.5 -36.5t37 -89t-37 -88.5q-38 -35 -76 -35q-66 0 -101.5 35.5t-35.5 87.5zM1145 1809q0 53 36 89.5t88 36.5t89 -36.5t37 -89t-37 -88.5q-38 -35 -76 -35q-65 0 -101 35t-36 88z" />
|
||||
<glyph unicode="ˆ" horiz-adv-x="600" d="M0 1149l434 387h43l123 -387h-65l-123 164l-322 -164h-90z" />
|
||||
<glyph unicode="˜" horiz-adv-x="825" d="M78 1192q99 201 342 201q79 0 148.5 -23.5t107.5 -34t100 -10.5t111 47l12 -2q-17 -74 -117 -140q-101 -65 -213 -65q-69 0 -145 26t-116 38t-83 12q-77 0 -135 -53z" />
|
||||
<glyph unicode=" " horiz-adv-x="1024" />
|
||||
<glyph unicode=" " horiz-adv-x="2048" />
|
||||
<glyph unicode=" " horiz-adv-x="1024" />
|
||||
<glyph unicode=" " horiz-adv-x="2048" />
|
||||
<glyph unicode=" " horiz-adv-x="682" />
|
||||
<glyph unicode=" " horiz-adv-x="512" />
|
||||
<glyph unicode=" " horiz-adv-x="341" />
|
||||
<glyph unicode=" " horiz-adv-x="341" />
|
||||
<glyph unicode=" " horiz-adv-x="256" />
|
||||
<glyph unicode=" " horiz-adv-x="409" />
|
||||
<glyph unicode=" " horiz-adv-x="113" />
|
||||
<glyph unicode="‐" horiz-adv-x="594" d="M39 455l37 161h409l-34 -161h-412z" />
|
||||
<glyph unicode="‑" horiz-adv-x="594" d="M39 455l37 161h409l-34 -161h-412z" />
|
||||
<glyph unicode="‒" horiz-adv-x="594" d="M39 455l37 161h409l-34 -161h-412z" />
|
||||
<glyph unicode="–" horiz-adv-x="721" d="M39 455l37 161h532l-35 -161h-534z" />
|
||||
<glyph unicode="—" horiz-adv-x="909" d="M39 455l37 161h717l-35 -161h-719z" />
|
||||
<glyph unicode="‘" horiz-adv-x="625" d="M172 1387q0 70 34 107.5t97 37.5t106.5 -42t43.5 -93q0 -86 -91 -137q-24 -17 -24 -35l100 -144q0 -18 -18 -28q-118 75 -183 169.5t-65 164.5z" />
|
||||
<glyph unicode="’" horiz-adv-x="625" d="M172 1379.5q0 68.5 43 110.5t106.5 42t97.5 -37.5t34 -108t-65 -164t-183 -169.5q-19 10 -19 28l101 144q0 19 -25 35q-90 51 -90 119.5z" />
|
||||
<glyph unicode="‚" horiz-adv-x="580" d="M156 146.5q0 68.5 43 110.5t106.5 42t97 -37.5t33.5 -107.5t-64 -163t-184 -171q-18 10 -18 28l100 144q0 18 -24 35q-90 51 -90 119.5z" />
|
||||
<glyph unicode="“" horiz-adv-x="1042" d="M156 1198q0 70 65 164t182 170q19 -10 19 -28l-100 -144q0 -18 24 -35q90 -51 90 -137q0 -51 -43.5 -93t-105.5 -42q-131 0 -131 145zM606 1198q0 70 65 164.5t183 169.5q18 -10 18 -28l-100 -144q0 -19 25 -35q90 -51 90 -137q0 -51 -43.5 -93t-106.5 -42t-97 37.5 t-34 107.5z" />
|
||||
<glyph unicode="”" horiz-adv-x="1042" d="M156 1379.5q0 68.5 43 110.5t106.5 42t97 -37.5t33.5 -108t-65 -164t-183 -169.5q-18 10 -18 28l100 144q0 18 -24 35q-90 51 -90 119.5zM606 1379.5q0 68.5 43 110.5t106.5 42t97.5 -37.5t34 -108t-65 -164t-183 -169.5q-18 10 -18 28l100 144q0 19 -25 35 q-90 51 -90 119.5z" />
|
||||
<glyph unicode="„" horiz-adv-x="1042" d="M156 146.5q0 68.5 43 110.5t106.5 42t97 -37.5t33.5 -107.5t-64 -163t-184 -171q-18 10 -18 28l100 144q0 18 -24 35q-90 51 -90 119.5zM606 146.5q0 68.5 43 110.5t106.5 42t97.5 -37.5t34 -107.5t-64 -163t-184 -171q-18 10 -18 28l100 144q0 19 -25 35 q-90 51 -90 119.5z" />
|
||||
<glyph unicode="•" horiz-adv-x="889" d="M246 546q0 82 57 140q57 59 139 59t140 -59q59 -58 59 -139q0 -82 -59 -139q-59 -58 -140.5 -58t-138.5 58q-57 57 -57 138z" />
|
||||
<glyph unicode="…" horiz-adv-x="1438" d="M63 153q0 67 47 116q48 48 115.5 48t115.5 -48t48 -116t-48.5 -114.5t-115 -46.5t-115.5 47q-47 47 -47 114zM545 153q0 67 46.5 115.5t114.5 48.5t116 -48t48 -116t-48.5 -114.5t-115.5 -46.5t-114 47t-47 114zM1047 153q0 67 46.5 115.5t114.5 48.5t116 -48t48 -116 t-48.5 -114.5t-115.5 -46.5t-114 47t-47 114z" />
|
||||
<glyph unicode=" " horiz-adv-x="409" />
|
||||
<glyph unicode="‹" horiz-adv-x="735" d="M41 487l18 84l629 349l-20 -113l-494 -287l397 -237l-24 -117z" />
|
||||
<glyph unicode="›" horiz-adv-x="705" d="M31 166l28 117l492 237l-397 287l18 113l504 -349l-23 -110z" />
|
||||
<glyph unicode=" " horiz-adv-x="512" />
|
||||
<glyph unicode="€" horiz-adv-x="1174" d="M-6 582l29 102h151q12 102 16 133h-145l29 103h137q101 429 394 566q108 50 253 50q246 0 328 -149q28 -52 28 -125q0 -189 -143 -189q-72 0 -117 53q55 20 83 123q7 26 7 42q0 53 -21 89q-35 60 -110 60q-132 0 -228.5 -148.5t-149.5 -371.5h413l-28 -103h-408 q-6 -35 -9 -67.5t-7 -65.5h401l-29 -102h-379v-27q0 -211 55 -297t222 -86t248 42q31 16 61 40l4 -59q-90 -120 -203.5 -163.5t-278 -43.5t-282.5 104q-147 128 -147 418v72h-174z" />
|
||||
<glyph unicode="™" horiz-adv-x="776" d="M-47 1188q0 109 111 146q40 14 98 14l153 -11q54 0 76 11q-16 -80 -51 -80q-25 0 -55.5 7t-65.5 11l-86 -399h-88l88 407q-123 -2 -123 -125q0 -21 8 -41q-65 0 -65 60zM305 887l139 430l84 12v-346l136 356h96l-78 -452h-88l55 319l-129 -319h-84v268l-82 -268h-49z" />
|
||||
<glyph unicode="" horiz-adv-x="1140" d="M0 1140h1140v-1140h-1140v1140z" />
|
||||
<glyph unicode="fi" horiz-adv-x="1094" d="M-424 -283q0 172 226 255q63 24 128 44l228 1078q94 440 479 440q286 0 351 -150q16 -37 16 -86q0 -91 -50 -128t-112 -37q-123 0 -123 110q0 35 18.5 67.5t50.5 32.5h10q5 0 7 -2q-4 82 -113 82q-135 0 -192 -145q-17 -42 -25 -86l-35 -168h164l-16 -82h-164l-234 -1106 q-40 -192 -154 -280q-88 -68 -203 -68t-186 62t-71 167zM-311 -248q0 -45 28 -63.5t57 -18.5t64 36.5t53 123.5l25 119q-227 -74 -227 -197zM531 233q0 58 16 134l139 657h295l-147 -696q-8 -37 -8 -73q0 -69 83 -69q60 0 111.5 52t73.5 129h86q-132 -379 -442 -379 q-80 0 -144 58q-63 58 -63 187z" />
|
||||
<glyph unicode="fl" horiz-adv-x="1122" d="M-428 -304q0 83 27.5 131.5t88 92t238.5 96.5l246 1170q72 348 381 348q133 0 231 -32l166 -57q67 -24 137 -52l-225 -1065q-8 -37 -8 -73q0 -69 84 -69q59 0 110 51t74 130h86q-133 -379 -441 -379q-81 0 -145 58q-63 58 -63 187q0 58 16 134l213 1005q-82 33 -167 33 q-105 0 -140 -162l-45 -219h191l-17 -82h-190l-234 -1106q-70 -348 -372 -348q-95 0 -168.5 62.5t-73.5 145.5zM-315 -262q0 -40 49 -62q15 -6 39.5 -6t60 34t53.5 126l25 119q-110 -39 -151 -72q-76 -61 -76 -139z" />
|
||||
<glyph unicode="ffi" horiz-adv-x="1565" d="M-428 -304q0 83 27.5 131.5t88 92t238.5 96.5l246 1170q73 348 373 348q169 0 252 -107q113 107 309 107q286 0 351 -150q16 -37 16 -86q0 -91 -50 -128t-112 -37q-123 0 -123 110q0 35 18.5 67.5t50.5 32.5h10q5 0 7 -2q-4 82 -113 82q-175 0 -217 -231l-35 -168h543 l-147 -696q-8 -37 -8 -73q0 -69 83 -69q60 0 111.5 52t73.5 129h86q-132 -379 -441 -379q-81 0 -145 58q-63 58 -63 187q0 58 16 134l121 575h-246l-234 -1106q-40 -192 -154 -280q-88 -68 -206 -68q-160 0 -223 109q-99 -109 -262 -109q-95 0 -168.5 62.5t-73.5 145.5z M-303 -262q0 -40 49 -62q15 -6 40 -6t60 34q34 34 54 126l24 119q-110 -39 -151 -72q-76 -61 -76 -139zM145 -293q13 -65 79 -65q42 0 78.5 45t57.5 143l48 223l-183 -37l-39 -180q-13 -67 -41 -129zM238 74l180 30l176 838h-172zM438 1024h174l15 70q28 148 102 256 q-30 34 -77 34q-148 0 -181 -192z" />
|
||||
<glyph unicode="ffl" horiz-adv-x="1597" d="M-428 -304q0 83 27.5 131.5t88 92t238.5 96.5l246 1170q42 199 158 284q89 64 227.5 64t222.5 -86q96 86 238.5 86t240.5 -32l166 -57q68 -24 138 -52l-226 -1065q-8 -37 -8 -73q0 -69 84 -69q60 0 111 51q50 52 73 130h86q-133 -379 -441 -379q-81 0 -145 58 q-63 58 -63 187q0 54 17 134l213 1005q-82 33 -168 33q-105 0 -140 -162l-45 -219h191l-17 -82h-190l-236 -1106q-40 -192 -154 -280q-88 -68 -206 -68q-161 0 -223 111q-101 -111 -262 -111q-95 0 -168.5 62.5t-73.5 145.5zM-303 -262q0 -40 49 -62q15 -6 40 -6t60 34 q34 34 54 126l24 119q-110 -39 -151 -72q-76 -61 -76 -139zM145 -291q6 -67 76 -67q99 0 139 188l48 223l-183 -37l-39 -180q-13 -65 -41 -127zM238 74l180 30l178 838h-174zM438 1024h174l35 162q18 98 66 178q-28 20 -69 20q-74 0 -116.5 -55t-56.5 -137z" />
|
||||
</font>
|
||||
</defs></svg>
|
Before Width: | Height: | Size: 76 KiB |
Before Width: | Height: | Size: 274 B |
Before Width: | Height: | Size: 226 B |
Before Width: | Height: | Size: 258 B |
Before Width: | Height: | Size: 4.3 KiB |
Before Width: | Height: | Size: 4.3 KiB |
Before Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 259 B |
2096
sources/budget/static/js/bootstrap-datepicker.js
vendored
7
sources/budget/static/js/bootstrap.min.js
vendored
|
@ -1,18 +0,0 @@
|
|||
// Add scripts to select all or non of the checkboxes in the add_bill form
|
||||
function selectall()
|
||||
{
|
||||
var els = document.getElementsByName('payed_for');
|
||||
for(var i =0;i<els.length;i++)
|
||||
{
|
||||
els[i].checked=true;
|
||||
}
|
||||
}
|
||||
function selectnone()
|
||||
{
|
||||
var els = document.getElementsByName('payed_for');
|
||||
for(var i =0;i<els.length;i++)
|
||||
{
|
||||
els[i].checked=false;
|
||||
}
|
||||
}
|
||||
|
4
sources/budget/static/js/jquery-3.1.1.min.js
vendored
|
@ -1,2 +0,0 @@
|
|||
!function(a){a.fn.datepicker.dates.fr={days:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],daysShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],daysMin:["d","l","ma","me","j","v","s"],months:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthsShort:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","déc."],today:"Aujourd'hui",monthsTitle:"Mois",clear:"Effacer",weekStart:1,format:"dd/mm/yyyy"}}(jQuery);
|
||||
console.log("foo", jQuery.fn.datepicker.dates);
|
1
sources/budget/static/js/tether.min.js
vendored
|
@ -1,17 +0,0 @@
|
|||
{% extends "layout.html" %}
|
||||
|
||||
{% block js %}
|
||||
$('#cancel-form').click(function(){location.href={{ url_for(".list_bills") }};});
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block top_menu %}
|
||||
<a href="{{ url_for(".list_bills") }}">{{ _("Back to the list") }}</a>
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<form class="form-horizontal" method="post">
|
||||
{{ forms.add_bill(form, edit) }}
|
||||
</form>
|
||||
{% endblock %}
|
|
@ -1,9 +0,0 @@
|
|||
{% extends "layout.html" %}
|
||||
{% block js %}
|
||||
auto_hide_default_text('#name');
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
<form class="form-horizontal" action="{{ url_for(".add_member") }}" method="post">
|
||||
{{ forms.add_member(form) }}
|
||||
</form>
|
||||
{% endblock %}
|
|
@ -1,13 +0,0 @@
|
|||
{% extends "layout.html" %}
|
||||
{% block content %}
|
||||
<h2>Authentication</h2>
|
||||
|
||||
{% if create_project %}
|
||||
<p class="info">{{ _("The project you are trying to access do not exist, do you want
|
||||
to") }} <a href="{{ url_for(".create_project", project_id=create_project) }}">{{ _("create it") }}</a>{{ _("?") }}
|
||||
</p>
|
||||
{% endif %}
|
||||
<form class="form-horizontal" method="POST" accept-charset="utf-8">
|
||||
{{ forms.authenticate(form) }}
|
||||
</form>
|
||||
{% endblock %}
|
|
@ -1,7 +0,0 @@
|
|||
{% extends "layout.html" %}
|
||||
|
||||
{% block content %}
|
||||
<form class="form-horizontal" method="post" accept-charset="utf-8">
|
||||
{{ forms.create_archive(form) }}
|
||||
</form>
|
||||
{% endblock %}
|
|
@ -1,8 +0,0 @@
|
|||
{% extends "layout.html" %}
|
||||
|
||||
{% block content %}
|
||||
<h2>{{ _("Create a new project") }}</h2>
|
||||
<form class="form-horizontal" method="post">
|
||||
{{ forms.create_project(form) }}
|
||||
</form>
|
||||
{% endblock %}
|
|
@ -1,21 +0,0 @@
|
|||
{% extends "layout.html" %}
|
||||
{% block content %}
|
||||
|
||||
<table id="bill_table" class="table table-striped">
|
||||
<thead><tr><th>{{ _("Project") }}</th><th>{{ _("Number of members") }}</th><th>{{ _("Number of bills") }}</th><th>{{_("Newest bill")}}</th><th>{{_("Oldest bill")}}</th></tr></thead>
|
||||
<tbody>{% for project in projects|sort(attribute='name') %}
|
||||
<tr class="{{ loop.cycle("odd", "even") }}">
|
||||
<td>{{ project.name }}</td><td>{{ project.members | count }}</td><td>{{ project.get_bills().count() }}</td>
|
||||
{% if project.has_bills() %}
|
||||
<td>{{ project.get_bills().all()[0].date }}</td>
|
||||
<td>{{ project.get_bills().all()[-1].date }}</td>
|
||||
{% else %}
|
||||
<td></td>
|
||||
<td></td>
|
||||
{% endif %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% endblock %}
|
||||
|
|
@ -1 +0,0 @@
|
|||
Yeah
|
|
@ -1,5 +0,0 @@
|
|||
{% for field_name, field_errors in form.errors.items() if field_errors %}
|
||||
{% for error in field_errors %}
|
||||
<p class="alert alert-danger"><strong>{{ form[field_name].label.text }}:</strong> {{ error }}</p>
|
||||
{% endfor %}
|
||||
{% endfor %}
|
|
@ -1,17 +0,0 @@
|
|||
{% extends "layout.html" %}
|
||||
|
||||
{% block js %}
|
||||
$('#cancel-form').click(function(){location.href={{ url_for(".list_bills") }};});
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block top_menu %}
|
||||
<a href="{{ url_for(".list_bills") }}">{{ _("Back to the list") }}</a>
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<form class="form-horizontal" method="post">
|
||||
{{ forms.edit_member(form, edit) }}
|
||||
</form>
|
||||
{% endblock %}
|
|
@ -1,19 +0,0 @@
|
|||
{% extends "layout.html" %}
|
||||
|
||||
{% block js %}
|
||||
$('#delete-project').click(function ()
|
||||
{
|
||||
$(this).html("<a style='color:red; ' href='{{ url_for('.delete_project') }}' >{{_("you sure?")}}</a>");
|
||||
});
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<h2>{{ _("Edit this project") }}</h2>
|
||||
<form class="form-horizontal" method="post">
|
||||
{{ forms.edit_project(edit_form) }}
|
||||
</form></br>
|
||||
<h2>{{ _("Download this project's data") }}</h2>
|
||||
<form class="form-horizontal" method="post">
|
||||
{{ forms.export_project(export_form) }}
|
||||
</form>
|
||||
{% endblock %}
|
|
@ -1,171 +0,0 @@
|
|||
{% macro input(field, multiple=False, class='form-control', inline=False) -%}
|
||||
<div class="form-group{% if inline %} row{% endif %}">
|
||||
{% if field.type != "SubmitField" %}
|
||||
{% if inline %}
|
||||
{{ field.label(class="col-3") }}
|
||||
{% else %}
|
||||
{{ field.label() }}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
<div class="controls{% if inline %} col-9{% endif %}">
|
||||
{% if multiple == True %}
|
||||
{{ field(multiple=True, class=class) }}
|
||||
{% else %}
|
||||
{{ field(class=class) | safe }}
|
||||
{% endif %}
|
||||
{% if field.description %}
|
||||
<p class="help-inline">{{ field.description }}</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endmacro %}
|
||||
|
||||
{% macro submit(field, cancel=False, home=False) -%}
|
||||
<div class="actions">
|
||||
<button type="submit" class="btn btn-primary">{{ field.name }}</button>
|
||||
{% if home %}
|
||||
<a href="{{ url_for(".remind_password") }}">{{ _("Can't remember the password?") }}</a>
|
||||
{% endif %}
|
||||
{% if cancel %}
|
||||
<button type="reset" class="btn">{{ _("Cancel") }}</button>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endmacro %}
|
||||
|
||||
{% macro authenticate(form, home=False) %}
|
||||
|
||||
{% include "display_errors.html" %}
|
||||
|
||||
{{ form.hidden_tag() }}
|
||||
{{ input(form.id) }}
|
||||
{{ input(form.password) }}
|
||||
{% if not home %}
|
||||
{{ submit(form.submit, home=True) }}
|
||||
{% endif %}
|
||||
|
||||
{% endmacro %}
|
||||
|
||||
{% macro create_project(form, home=False) %}
|
||||
|
||||
{% include "display_errors.html" %}
|
||||
{{ form.hidden_tag() }}
|
||||
{% if not home %}
|
||||
{{ input(form.id) }}
|
||||
{% endif %}
|
||||
{{ input(form.name) }}
|
||||
{{ input(form.password) }}
|
||||
{{ input(form.contact_email) }}
|
||||
{% if not home %}
|
||||
{{ submit(form.submit, home=True) }}
|
||||
{% endif %}
|
||||
|
||||
{% endmacro %}
|
||||
|
||||
{% macro edit_project(form) %}
|
||||
|
||||
{% include "display_errors.html" %}
|
||||
{{ form.hidden_tag() }}
|
||||
{{ input(form.name) }}
|
||||
{{ input(form.password) }}
|
||||
{{ input(form.contact_email) }}
|
||||
<div class="actions">
|
||||
<button class="btn btn-primary">{{ _("Edit the project") }}</button>
|
||||
<a id="delete-project" style="color:red; margin-left:10px; cursor:pointer; ">{{ _("delete") }}</a>
|
||||
</div>
|
||||
|
||||
{% endmacro %}
|
||||
|
||||
{% macro add_bill(form, edit=False, title=True) %}
|
||||
|
||||
<fieldset>
|
||||
{% if title %}<legend>{% if edit %}{{ _("Edit this bill") }} {% else %}{{ _("Add a bill") }} {% endif %}</legend>{% endif %}
|
||||
{% include "display_errors.html" %}
|
||||
{{ form.hidden_tag() }}
|
||||
{{ input(form.date, class="form-control datepicker", inline=True) }}
|
||||
{{ input(form.what, inline=True) }}
|
||||
{{ input(form.payer, inline=True, class="form-control custom-select") }}
|
||||
{{ input(form.amount, inline=True) }}
|
||||
|
||||
<div class="form-group row">
|
||||
<label class="col-3" for="payed_for">{{ _("For whom?") }}</label>
|
||||
<div class="controls col-9">
|
||||
<ul id="payed_for" class="inputs-list">
|
||||
<p><a href="#" id="selectall" onclick="selectall()">{{ _("Select all") }}</a> | <a href="#" id="selectnone" onclick="selectnone()">{{_("Select none")}}</a></p>
|
||||
{% for key, value, checked in form.payed_for.iter_choices() %}
|
||||
<p class="form-check"><label for="payed_for-{{key}}" class="form-check-label"><input name="payed_for" type="checkbox" {% if checked %}checked{% endif %} class="form-check-input" value="{{key}}" id="payed_for-{{key}}"/><span>{{value}}</span></label></p>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
<div class="actions">
|
||||
{{ form.submit(class="btn btn-primary") }}
|
||||
{% if not edit %} {{ form.submit2(class="btn") }}{% endif %}
|
||||
</div>
|
||||
|
||||
{% endmacro %}
|
||||
|
||||
{% macro add_member(form) %}
|
||||
{{ form.hidden_tag() }}
|
||||
<div class="input-group">
|
||||
<label class="sr-only" for="name">_("Type user name here")</label>
|
||||
{{ form.name(placeholder=_("Type user name here"), class="form-control") }}
|
||||
<button class=" input-group-addon btn">{{ _("Add") }}</button>
|
||||
</div>
|
||||
{% endmacro %}
|
||||
|
||||
{% macro edit_member(form, title=True) %}
|
||||
<fieldset>
|
||||
{% if title %}<legend>{{ _("Edit this member") }}</legend>{% endif %}
|
||||
{% include "display_errors.html" %}
|
||||
{{ form.hidden_tag() }}
|
||||
{{ input(form.name) }}
|
||||
{{ input(form.weight) }}
|
||||
</fieldset>
|
||||
<div class="actions">
|
||||
{{ form.submit(class="btn btn-primary") }}
|
||||
</div>
|
||||
{% endmacro %}
|
||||
|
||||
|
||||
{% macro invites(form) %}
|
||||
{{ form.hidden_tag() }}
|
||||
{{ input(form.emails) }}
|
||||
<div class="actions">
|
||||
<button class="btn btn-primary">{{ _("Send the invitations") }}</button>
|
||||
<a href="{{ url_for(".list_bills") }}">{{ _("No, thanks") }}</a>
|
||||
</div>
|
||||
{% endmacro %}
|
||||
|
||||
{% macro create_archive(form) %}
|
||||
<fieldset>
|
||||
<legend>{{ _("Create an archive") }}</legend>
|
||||
{{ form.hidden_tag() }}
|
||||
{{ input(form.name) }}
|
||||
{{ input(form.start_date) }}
|
||||
{{ input(form.end_date) }}
|
||||
</fieldset>
|
||||
<div class="actions">
|
||||
<button class="btn">{{ _("Create the archive") }}</button>
|
||||
</div>
|
||||
{% endmacro %}
|
||||
|
||||
{% macro export_project(form) %}
|
||||
<fieldset>
|
||||
{{ form.hidden_tag() }}
|
||||
{{ input(form.export_type) }}
|
||||
{{ input(form.export_format) }}
|
||||
</fieldset>
|
||||
<div class="actions">
|
||||
<button class="btn btn-primary">{{ _("Download") }}</button>
|
||||
</div>
|
||||
{% endmacro %}
|
||||
|
||||
{% macro remind_password(form) %}
|
||||
|
||||
{% include "display_errors.html" %}
|
||||
{{ form.hidden_tag() }}
|
||||
{{ input(form.id) }}
|
||||
{{ submit(form.submit) }}
|
||||
|
||||
{% endmacro %}
|
|
@ -1,50 +0,0 @@
|
|||
{% extends "layout.html" %}
|
||||
|
||||
|
||||
{% block body %}
|
||||
<header id="header" class="row">
|
||||
<div class="col-5 offset-md-2">
|
||||
<h2>{{ _("Manage your shared <br>expenses, easily") }}</h2>
|
||||
<a href="{{ url_for(".demo") }}" class="tryout btn">{{ _("Try out the demo") }}</a>
|
||||
</div>
|
||||
<div class="col-4">
|
||||
<p class="additional-content">{{ _("You're sharing a house?") }}<br /> {{ _("Going on holidays with friends?") }}<br /> {{ _("Simply sharing money with others?") }} <br /><strong>{{ _("We can help!") }}</strong></p>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="row home">
|
||||
<div class="col-4 offset-md-2">
|
||||
<form id="authentication-form" class="form-horizontal" action="{{ url_for(".authenticate") }}" method="post">
|
||||
<fieldset class="form-group">
|
||||
<legend>{{ _("Log to an existing project") }}...</legend>
|
||||
{{ forms.authenticate(auth_form, home=True) }}
|
||||
</fieldset>
|
||||
<div class="controls">
|
||||
<button class="btn" type="submit">{{ _("log in") }}</button>
|
||||
<a class="password-reminder" href="{{ url_for(".remind_password") }}">{{ _("can't remember your password?") }}</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="col-3 offset-md-1">
|
||||
<form id="creation-form" class="form-horizontal" action="{{ url_for(".create_project") }}" method="post">
|
||||
<fieldset class="form-group">
|
||||
<legend>...{{ _("or create a new one") }}</legend>
|
||||
{{ forms.create_project(project_form, home=True) }}
|
||||
</fieldset>
|
||||
<div class="controls">
|
||||
<button class="btn" type="submit">{{ _("let's get started") }}</button>
|
||||
</div>
|
||||
</form>
|
||||
</main>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% block js %}
|
||||
|
||||
$('#creation-form #password').tooltip({
|
||||
title: '{{ _("This access code will be sent to your friends. It is stored as-is by the server, so don\\'t reuse a personal password!") }}',
|
||||
trigger: 'focus',
|
||||
placement: 'right'
|
||||
});
|
||||
|
||||
{% endblock %}
|
|
@ -1,10 +0,0 @@
|
|||
Hi,
|
||||
|
||||
Someone using the email address {{ g.project.contact_email }} invited you to share your expenses for "{{ g.project.name }}".
|
||||
|
||||
It's as simple as saying what did you paid for, for who, and how much did it cost you, we are caring about the rest.
|
||||
|
||||
You can access it here: {{ config['SITE_URL'] }}{{ url_for(".list_bills") }} and the private code is "{{ g.project.password }}".
|
||||
|
||||
Enjoy,
|
||||
Some weird guys (with beards)
|
|
@ -1,9 +0,0 @@
|
|||
Salut,
|
||||
|
||||
Quelqu'un avec l'addresse email "{{ g.project.contact_email }}" vous à invité à partager vos dépenses pour "{{ g.project.name }}".
|
||||
|
||||
C'est aussi simple que de dire qui à payé pour quoi, pour qui, et combien celà à coûté, on s'occuppe du reste.
|
||||
|
||||
Vous pouvez accéder à la page ici: {{ config['SITE_URL'] }}{{ url_for(".list_bills") }} et le code est "{{ g.project.password }}".
|
||||
|
||||
Have fun,
|
|
@ -1,93 +0,0 @@
|
|||
{% import "forms.html" as forms %}
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>{{ _("Account manager") }}{% block title %}{% endblock %}</title>
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
||||
<link rel=stylesheet type=text/css href="{{ url_for("static", filename='css/main.css') }}">
|
||||
<script src="{{ url_for("static", filename="js/jquery-3.1.1.min.js") }}"></script>
|
||||
<script src="{{ url_for("static", filename="js/ihatemoney.js") }}"></script>
|
||||
<script src="{{ url_for("static", filename="js/tether.min.js") }}"></script>
|
||||
<script src="{{ url_for("static", filename="js/bootstrap.min.js") }}"></script>
|
||||
{% block head %}{% endblock %}
|
||||
<script type="text/javascript" charset="utf-8">
|
||||
$(document).ready(function(){
|
||||
var left = window.innerWidth/2-$('.flash').width()/2;
|
||||
$(".flash").css({ "left": left+"px", "top":"0.6rem" });
|
||||
setTimeout(function(){
|
||||
$(".flash").fadeOut("slow", function () {
|
||||
$(".flash").remove();
|
||||
});
|
||||
}, 4000);
|
||||
|
||||
$('.datepicker').datepicker({
|
||||
format: 'yyyy-mm-dd',
|
||||
weekStart: 1,
|
||||
autoclose: true,
|
||||
language: '{{ g.lang }}'
|
||||
});
|
||||
|
||||
$('.dropdown-toggle').dropdown();
|
||||
|
||||
{% block js %}{% endblock %}
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<nav class="navbar navbar-toggleable-md navbar fixed-top navbar-inverse bg-inverse">
|
||||
<h1 class="col-2"><a class="navbar-brand" href="{{ url_for(".home") }}">#! money?</a></h1>
|
||||
<ul class="navbar-nav col-5 offset-md-1">
|
||||
{% if g.project %}
|
||||
{% block navbar %}
|
||||
<li class="nav-item{% if current_view == 'list_bills' %} active{% endif %}"><a class="nav-link" href="{{ url_for(".list_bills") }}">{{ _("Bills") }}</a></li>
|
||||
<li class="nav-item{% if current_view == 'settle_bill' %} active{% endif %}"><a class="nav-link" href="{{ url_for(".settle_bill") }}">{{ _("Settle") }}</a></li>
|
||||
{% endblock %}
|
||||
{% endif %}
|
||||
</ul>
|
||||
<ul class="navbar-nav secondary-nav col-4">
|
||||
{% if g.project %}
|
||||
<li class="nav-item dropdown">
|
||||
<a href="#" class="nav-link dropdown-toggle" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><strong>{{ g.project.name }}</strong> {{ _("options") }} <b class="caret"></b></a>
|
||||
<ul class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
|
||||
<li><a class="dropdown-item" href="{{ url_for(".edit_project") }}">{{ _("Project settings") }}</a></li>
|
||||
<li class="dropdown-divider"></li>
|
||||
{% for id, name in session['projects'] %}
|
||||
{% if id != g.project.id %}
|
||||
<li><a class="dropdown-item" href="{{ url_for(".list_bills", project_id=id) }}">{{ _("switch to") }} {{ name }}</a></li>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
<li><a class="dropdown-item" href="{{ url_for(".create_project") }}">{{ _("Start a new project") }}</a></li>
|
||||
<li class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" href="{{ url_for(".exit") }}">{{ _("Logout") }}</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
{% endif %}
|
||||
<li class="nav-item{% if g.lang == "fr" %} active{% endif %}"><a class="nav-link" href="{{ url_for(".change_lang", lang="fr") }}">fr</a></li>
|
||||
<li class="nav-item{% if g.lang == "en" %} active{% endif %}"><a class="nav-link" href="{{ url_for(".change_lang", lang="en") }}">en</a></li>
|
||||
</ul>
|
||||
|
||||
|
||||
</nav>
|
||||
|
||||
<div class="container-fluid">
|
||||
{% block body %}
|
||||
{% block sidebar %}{% endblock %}
|
||||
<main class="content offset-1 col-10">
|
||||
{% block content %}{% endblock %}
|
||||
</main>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% for message in get_flashed_messages() %}
|
||||
<div class="flash alert alert-success">{{ message }}</div>
|
||||
{% endfor %}
|
||||
|
||||
{% block footer %}
|
||||
<footer>
|
||||
<p><a href="https://github.com/spiral-project/ihatemoney">{{ _("This is a free software") }}</a>, {{ _("you can contribute and improve it!") }}</p>
|
||||
</footer>
|
||||
{% endblock %}
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -1,128 +0,0 @@
|
|||
{% extends "sidebar_table_layout.html" %}
|
||||
|
||||
{% block title %} - {{ g.project.name }}{% endblock %}
|
||||
{% block head %}
|
||||
<script src="{{ url_for("static", filename="js/bootstrap-datepicker.js") }}"></script>
|
||||
<script src="{{ url_for("static", filename="js/locales/bootstrap-datepicker.fr.min.js") }}" charset="utf-8"></script>
|
||||
{% endblock %}
|
||||
{% block js %}
|
||||
{% if add_bill %} $('#new-bill').click(); {% endif %}
|
||||
|
||||
// Hide all members actions
|
||||
$('.action').each(function(){
|
||||
$(this).hide();
|
||||
});
|
||||
|
||||
// ask for confirmation before removing an user
|
||||
$('.action.delete').each(function(){
|
||||
var link = $(this).find('button');
|
||||
link.click(function(){
|
||||
if ($(this).hasClass("confirm")){
|
||||
return true;
|
||||
}
|
||||
$(this).html("{{_("you sure?")}}");
|
||||
$(this).addClass("confirm");
|
||||
return false;
|
||||
});
|
||||
});
|
||||
|
||||
// display the remove button on mouse over (and hide them per default)
|
||||
$('.balance tr').hover(function(){
|
||||
$(this).find('.action').show();
|
||||
}, function(){
|
||||
$(this).find('.action').hide();
|
||||
});
|
||||
|
||||
var highlight_owers = function(){
|
||||
var ower_ids = $(this).attr("owers").split(',');
|
||||
var payer_id = $(this).attr("payer");
|
||||
$.each(ower_ids, function(i, val){
|
||||
$('#bal-member-'+val).addClass("ower_line");
|
||||
});
|
||||
$("#bal-member-"+payer_id).addClass("payer_line");
|
||||
};
|
||||
|
||||
var unhighlight_owers = function(){
|
||||
$('[id^="bal-member-"]').removeClass("ower_line payer_line");
|
||||
};
|
||||
|
||||
$('#bill_table tbody tr').hover(highlight_owers, unhighlight_owers);
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
<form id="add-member-form" action="{{ url_for(".add_member") }}" method="post" class="form-inline">
|
||||
{{ forms.add_member(member_form) }}
|
||||
</form>
|
||||
|
||||
<div id="table_overflow">
|
||||
<table class="balance table">
|
||||
{% set balance = g.project.balance %}
|
||||
{% for member in g.project.members | sort(attribute='name') if member.activated or balance[member.id]|round(2) != 0 %}
|
||||
<tr id="bal-member-{{ member.id }}" action={% if member.activated %}delete{% else %}reactivate{% endif %}>
|
||||
<td class="balance-name">{{ member.name }}
|
||||
<span class="light{% if not g.project.uses_weights %} extra-info{% endif %}">(x{{ member.weight|minimal_round(1) }})</span>
|
||||
</td>
|
||||
{% if member.activated %}
|
||||
<td>
|
||||
<form class="action delete" action="{{ url_for(".remove_member", member_id=member.id) }}" method="POST">
|
||||
<button type="submit">{{ _("delete") }}</button></form>
|
||||
<form class="action edit" action="{{ url_for(".edit_member", member_id=member.id) }}" method="GET">
|
||||
<button type="submit">{{ _("edit") }}</button></form>
|
||||
</td>
|
||||
{% else %}
|
||||
<td>
|
||||
<form class="action reactivate" action="{{ url_for(".reactivate", member_id=member.id) }}" method="POST">
|
||||
<button type="submit">{{ _("reactivate") }}</button></form></td>
|
||||
{% endif %}
|
||||
<td class="balance-value {% if balance[member.id]|round(2) > 0 %}positive{% elif balance[member.id]|round(2) < 0 %}negative{% endif %}">
|
||||
{% if balance[member.id]|round(2) > 0 %}+{% endif %}{{ "%.2f" | format(balance[member.id]) }}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="identifier">{{ _("The project identifier is") }} <a href="{{ url_for(".list_bills") }}">{{ g.project.id }}</a>, {{ _("remember it!") }}</div>
|
||||
<a id="new-bill" href="{{ url_for(".add_bill") }}" class="btn btn-primary" data-toggle="modal" data-target="#bill-form">{{ _("Add a new bill") }}</a>
|
||||
|
||||
<div id="bill-form" class="modal fade show" role="dialog">
|
||||
<div class="modal-dialog" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h3 class="modal-title">{{ _('Add a bill') }}</h3>
|
||||
<a href="#" class="close" data-dismiss="modal">×</a>
|
||||
</div>
|
||||
<form action="{{ url_for(".add_bill") }}" method="post" class="modal-body container">
|
||||
{{ forms.add_bill(bill_form, title=False) }}
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if bills.count() > 0 %}
|
||||
<table id="bill_table" class="col table table-striped table-hover">
|
||||
<thead><tr><th>{{ _("When?") }}</th><th>{{ _("Who paid?") }}</th><th>{{ _("For what?") }}</th><th>{{ _("For whom?") }}</th><th>{{ _("How much?") }}</th><th>{{ _("Actions") }}</th></tr></thead>
|
||||
<tbody>
|
||||
{% for bill in bills %}
|
||||
<tr owers="{{bill.owers|join(',','id')}}" payer="{{bill.payer.id}}">
|
||||
<td>{{ bill.date }}</td>
|
||||
<td>{{ bill.payer }}</td>
|
||||
<td>{{ bill.what }}</td>
|
||||
<td>{{ bill.owers|join(', ', 'name') }} </td>
|
||||
<td>{{ "%0.2f"|format(bill.amount) }} ({{ "%0.2f"|format(bill.pay_each()) }} {{ _("each") }})</td>
|
||||
<td class="bill-actions">
|
||||
<a class="edit" href="{{ url_for(".edit_bill", bill_id=bill.id) }}" title="{{ _("edit") }}">{{ _('edit') }}</a>
|
||||
<a class="delete" href="{{ url_for(".delete_bill", bill_id=bill.id) }}" title="{{ _("delete") }}">{{ _('delete') }}</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
{% else %}
|
||||
<p>{{ _("Nothing to list yet. You probably want to") }} <a href="{{ url_for(".add_bill") }}" data-toggle="modal" data-target="#bill-form">{{ _("add a bill") }}</a> ?</p>
|
||||
{% endif %}
|
||||
{% endblock %}
|
|
@ -1,8 +0,0 @@
|
|||
Hi,
|
||||
|
||||
You requested to be reminded about your password for "{{ project.name }}".
|
||||
|
||||
You can access it here: {{ config['SITE_URL'] }}{{ url_for(".list_bills", project_id=project.id) }}, the private code is "{{ project.password }}".
|
||||
|
||||
Hope this helps,
|
||||
Some weird guys (with beards)
|
|
@ -1,7 +0,0 @@
|
|||
Salut,
|
||||
|
||||
Vous avez demandez des informations sur votre mot de passe pour "{{ project.name }}".
|
||||
|
||||
Vous pouvez y accéder ici {{ config['SITE_URL'] }}{{ url_for(".list_bills", project_id=project.id) }}, le code d'accès est "{{ project.password }}".
|
||||
|
||||
Faites en bon usage !
|
|
@ -1,8 +0,0 @@
|
|||
{% extends "layout.html" %}
|
||||
|
||||
{% block content %}
|
||||
<h2>{{ _("Password reminder") }}</h2>
|
||||
<form class="form-horizontal" method="post">
|
||||
{{ forms.remind_password(form) }}
|
||||
</form>
|
||||
{% endblock %}
|
|
@ -1,8 +0,0 @@
|
|||
{% if 'projects' in session %}
|
||||
<h3>{{ _("Your projects") }}</h3>
|
||||
<ul>
|
||||
{% for id, name in session['projects'] %}
|
||||
<li><a href="{{ url_for("list_bills", project_id=id) }}">{{ name }}</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
|
@ -1,9 +0,0 @@
|
|||
Hi,
|
||||
|
||||
You have just (or someone else using your email address) created the project "{{ g.project.name }}" to share your expenses.
|
||||
|
||||
You can access it here: {{ config['SITE_URL'] }}{{ url_for(".list_bills") }} (the identifier is {{ g.project.id }}),
|
||||
and the private code is "{{ g.project.password }}".
|
||||
|
||||
Enjoy,
|
||||
Some weird guys (with beards)
|
|
@ -1,8 +0,0 @@
|
|||
Hey,
|
||||
|
||||
Vous venez de créer le projet "{{ g.project.name }}" pour partager vos dépenses.
|
||||
|
||||
Vous pouvez y accéder ici: {{ config['SITE_URL'] }}{{ url_for(".list_bills") }} (l'identifieur est {{ g.project.id }}),
|
||||
et le code d'accès "{{ g.project.password }}".
|
||||
|
||||
Faites en bon usage !
|
|
@ -1,20 +0,0 @@
|
|||
{% extends "layout.html" %}
|
||||
|
||||
{% block sidebar %}
|
||||
<ol>
|
||||
<li>{{ _("Create the project") }}</li>
|
||||
<li><strong>{{ _("Invite people") }}</strong></li>
|
||||
<li><a href="{{ url_for(".list_bills") }}">{{ _("Use it!") }}</a></li>
|
||||
</ol>
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
<h2>{{ _("Invite people to join this project") }}</h2>
|
||||
<p>{{ _("Specify a (comma separated) list of email adresses you want to notify about the
|
||||
creation of this budget management project and we will send them an email for you.") }}</p>
|
||||
<p>{{ _("If you prefer, you can") }} <a href="{{ url_for(".list_bills") }}">{{ _("skip this step") }}</a> {{ _("and notify them yourself") }}</p>
|
||||
|
||||
{% include "display_errors.html" %}
|
||||
<form class="invites form-horizontal" method="post" accept-charset="utf-8">
|
||||
{{ forms.invites(form) }}
|
||||
</form>
|
||||
{% endblock %}
|
|
@ -1,34 +0,0 @@
|
|||
{% extends "sidebar_table_layout.html" %}
|
||||
|
||||
{% block sidebar %}
|
||||
<div id="table_overflow">
|
||||
<table class="balance table">
|
||||
{% set balance = g.project.balance %}
|
||||
{% for member in g.project.members | sort(attribute='name') if member.activated or balance[member.id]|round(2) != 0 %}
|
||||
<tr id="bal-member-{{ member.id }}" action={% if member.activated %}delete{% else %}reactivate{% endif %}>
|
||||
<td class="balance-name">{{ member.name }}</td>
|
||||
<td class="balance-value {% if balance[member.id]|round(2) > 0 %}positive{% elif balance[member.id]|round(2) < 0 %}negative{% endif %}">
|
||||
{% if balance[member.id]|round(2) > 0 %}+{% endif %}{{ "%.2f" | format(balance[member.id]) }}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block content %}
|
||||
<table id="bill_table" class="split_bills table table-striped">
|
||||
<thead><tr><th>{{ _("Who pays?") }}</th><th>{{ _("To whom?") }}</th><th>{{ _("How much?") }}</th></tr></thead>
|
||||
<tbody>
|
||||
{% for bill in bills %}
|
||||
<tr class="{{ loop.cycle("odd", "even") }}" receiver={{bill.receiver.id}}>
|
||||
<td>{{ bill.ower }}</td>
|
||||
<td>{{ bill.receiver }}</td>
|
||||
<td>{{ "%0.2f"|format(bill.amount) }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
{% endblock %}
|
|
@ -1,14 +0,0 @@
|
|||
{% extends "layout.html" %}
|
||||
|
||||
{% block body %}
|
||||
<div class="row" style="height: 100%">
|
||||
<aside id="sidebar" class="sidebar col-3 " style="height: 100%">
|
||||
{% block sidebar %}{% endblock %}
|
||||
</aside>
|
||||
|
||||
<main class="offset-md-3 col-9">
|
||||
{% block content %}{% endblock %}
|
||||
</main>
|
||||
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -1,531 +0,0 @@
|
|||
# French translations for PROJECT.
|
||||
# Copyright (C) 2011 ORGANIZATION
|
||||
# This file is distributed under the same license as the PROJECT project.
|
||||
# Alexis Métaireau <alexis@notmyidea.org>, 2011.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PROJECT VERSION\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2013-10-13 21:32+0200\n"
|
||||
"PO-Revision-Date: 2011-10-14 23:51+0200\n"
|
||||
"Last-Translator: Quentin Roy <royque@gmail.com>\n"
|
||||
"Language-Team: fr <LL@li.org>\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Generated-By: Babel 0.9.6\n"
|
||||
|
||||
#: forms.py:22
|
||||
msgid "Select all"
|
||||
msgstr "Tout cocher"
|
||||
|
||||
#: forms.py:22
|
||||
msgid "Select none"
|
||||
msgstr "Tout décocher"
|
||||
|
||||
#: forms.py:61
|
||||
msgid "Project name"
|
||||
msgstr "Nom de projet"
|
||||
|
||||
#: forms.py:62 forms.py:86 forms.py:102
|
||||
msgid "Private code"
|
||||
msgstr "Code d'accès"
|
||||
|
||||
#: forms.py:63
|
||||
msgid "Email"
|
||||
msgstr "Email"
|
||||
|
||||
#: forms.py:85 forms.py:101 forms.py:107
|
||||
msgid "Project identifier"
|
||||
msgstr "Identifiant du projet"
|
||||
|
||||
#: forms.py:87 templates/send_invites.html:5
|
||||
msgid "Create the project"
|
||||
msgstr "Créer le projet"
|
||||
|
||||
#: forms.py:92
|
||||
msgid ""
|
||||
"The project identifier is used to log in and for the URL of the project. "
|
||||
"We tried to generate an identifier for you but a project with this "
|
||||
"identifier already exists. Please create a new identifier that you will "
|
||||
"be able to remember."
|
||||
msgstr ""
|
||||
"L'identifiant du projet est utilisé pour se connecter."
|
||||
"Nous avons essayé de générer un identifiant mais "
|
||||
"celui ci existe déjà. Merci de créer un nouvel identifiant que vous serez"
|
||||
" capable de retenir"
|
||||
|
||||
#: forms.py:103
|
||||
msgid "Get in"
|
||||
msgstr "Entrer"
|
||||
|
||||
#: forms.py:108
|
||||
msgid "Send me the code by email"
|
||||
msgstr "Envoyez moi le code par email"
|
||||
|
||||
#: forms.py:112
|
||||
msgid "This project does not exists"
|
||||
msgstr "Ce projet n'existe pas"
|
||||
|
||||
#: forms.py:116
|
||||
msgid "Date"
|
||||
msgstr "Date"
|
||||
|
||||
#: forms.py:117
|
||||
msgid "What?"
|
||||
msgstr "Quoi ?"
|
||||
|
||||
#: forms.py:118
|
||||
msgid "Payer"
|
||||
msgstr "Payeur"
|
||||
|
||||
#: forms.py:119
|
||||
msgid "Amount paid"
|
||||
msgstr "Montant"
|
||||
|
||||
#: forms.py:120 templates/list_bills.html:103
|
||||
msgid "For whom?"
|
||||
msgstr "Pour qui ?"
|
||||
|
||||
#: forms.py:122
|
||||
msgid "Submit"
|
||||
msgstr "Valider"
|
||||
|
||||
#: forms.py:123
|
||||
msgid "Submit and add a new one"
|
||||
msgstr "Valider et ajouter une autre facture"
|
||||
|
||||
#: forms.py:149
|
||||
msgid "Bills can't be null"
|
||||
msgstr "Le montant d'une facture ne peut pas être nul."
|
||||
|
||||
#: forms.py:154
|
||||
msgid "Name"
|
||||
msgstr "Nom"
|
||||
|
||||
#: forms.py:155
|
||||
msgid "Weight"
|
||||
msgstr "Parts"
|
||||
|
||||
#: forms.py:155 templates/forms.html:95
|
||||
msgid "Add"
|
||||
msgstr "Ajouter"
|
||||
|
||||
#: forms.py:163
|
||||
msgid "User name incorrect"
|
||||
msgstr "Nom d'utilisateur incorrect"
|
||||
|
||||
#: forms.py:167
|
||||
msgid "This project already have this member"
|
||||
msgstr "Ce membre existe déjà pour ce projet"
|
||||
|
||||
#: forms.py:178
|
||||
msgid "People to notify"
|
||||
msgstr "Personnes à prévenir"
|
||||
|
||||
#: forms.py:179
|
||||
msgid "Send invites"
|
||||
msgstr "Envoyer les invitations"
|
||||
|
||||
#: forms.py:185
|
||||
#, python-format
|
||||
msgid "The email %(email)s is not valid"
|
||||
msgstr "L'email %(email)s est invalide"
|
||||
|
||||
#: forms.py:190
|
||||
msgid "Name for this archive (optional)"
|
||||
msgstr "Nom pour cette archive (optionnel)"
|
||||
|
||||
#: forms.py:191
|
||||
msgid "Start date"
|
||||
msgstr "Date de départ"
|
||||
|
||||
#: forms.py:192
|
||||
msgid "End date"
|
||||
msgstr "Date de fin"
|
||||
|
||||
#: forms.py:202
|
||||
msgid "What do you want to download ?"
|
||||
msgstr "Que voulez-vous télécharger ?"
|
||||
|
||||
#: forms.py:205
|
||||
msgid "bills"
|
||||
msgstr "factures"
|
||||
|
||||
#: forms.py:205
|
||||
msgid "transactions"
|
||||
msgstr "remboursements"
|
||||
|
||||
#: forms.py:206
|
||||
msgid "Export file format"
|
||||
msgstr "Format du fichier d'export"
|
||||
|
||||
#: web.py:95
|
||||
msgid "This private code is not the right one"
|
||||
msgstr "Le code que vous avez entré n'est pas correct"
|
||||
|
||||
#: web.py:147
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr "Vous venez de créer '%(project)s' pour partager vos dépenses"
|
||||
|
||||
#: web.py:165
|
||||
#, python-format
|
||||
msgid "%(msg_compl)sThe project identifier is %(project)s"
|
||||
msgstr "L'identifiant de ce projet est '%(project)s'"
|
||||
|
||||
#: web.py:185
|
||||
msgid "a mail has been sent to you with the password"
|
||||
msgstr "Un email vous a été envoyé avec le mot de passe"
|
||||
|
||||
#: web.py:211
|
||||
msgid "Project successfully deleted"
|
||||
msgstr "Projet supprimé"
|
||||
|
||||
#: web.py:254
|
||||
#, python-format
|
||||
msgid "You have been invited to share your expenses for %(project)s"
|
||||
msgstr "Vous avez été invité à partager vos dépenses pour %(project)s"
|
||||
|
||||
#: web.py:261
|
||||
msgid "Your invitations have been sent"
|
||||
msgstr "Vos invitations ont bien été envoyées"
|
||||
|
||||
#: web.py:290
|
||||
#, python-format
|
||||
msgid "%(member)s had been added"
|
||||
msgstr "%(member)s a bien été ajouté"
|
||||
|
||||
#: web.py:303
|
||||
#, python-format
|
||||
msgid "%(name)s is part of this project again"
|
||||
msgstr "%(name)s a rejoint le projet"
|
||||
|
||||
#: web.py:312
|
||||
#, python-format
|
||||
msgid "User '%(name)s' has been deactivated"
|
||||
msgstr "Le membre '%(name)s' a été désactivé"
|
||||
|
||||
#: web.py:314
|
||||
#, python-format
|
||||
msgid "User '%(name)s' has been removed"
|
||||
msgstr "Le membre '%(name)s' a été supprimé"
|
||||
|
||||
#: web.py:331
|
||||
msgid "The bill has been added"
|
||||
msgstr "La facture a bien été ajoutée"
|
||||
|
||||
#: web.py:351
|
||||
msgid "The bill has been deleted"
|
||||
msgstr "La facture a été supprimée"
|
||||
|
||||
#: web.py:369
|
||||
msgid "The bill has been modified"
|
||||
msgstr "La facture a été modifiée"
|
||||
|
||||
#: web.py:399
|
||||
msgid "The data from XX to XX has been archived"
|
||||
msgstr "Les données de XX à XX ont été archivées"
|
||||
|
||||
#: templates/add_bill.html:9
|
||||
msgid "Back to the list"
|
||||
msgstr "Retourner à la liste"
|
||||
|
||||
#: templates/authenticate.html:6
|
||||
msgid ""
|
||||
"The project you are trying to access do not exist, do you want \n"
|
||||
"to"
|
||||
msgstr "Le projet auquel vous essayez d'acceder n'existe pas. Souhaitez vous"
|
||||
|
||||
#: templates/authenticate.html:7
|
||||
msgid "create it"
|
||||
msgstr "le créer"
|
||||
|
||||
#: templates/authenticate.html:7
|
||||
msgid "?"
|
||||
msgstr " ?"
|
||||
|
||||
#: templates/create_project.html:4
|
||||
msgid "Create a new project"
|
||||
msgstr "Créer un nouveau projet"
|
||||
|
||||
#: templates/dashboard.html:5
|
||||
msgid "Project"
|
||||
msgstr "Projets"
|
||||
|
||||
#: templates/dashboard.html:5
|
||||
msgid "Number of members"
|
||||
msgstr "Nombre de membres"
|
||||
|
||||
#: templates/dashboard.html:5
|
||||
msgid "Number of bills"
|
||||
msgstr "Nombre de factures"
|
||||
|
||||
#: templates/dashboard.html:5
|
||||
msgid "Newest bill"
|
||||
msgstr "Facture la plus récente"
|
||||
|
||||
#: templates/dashboard.html:5
|
||||
msgid "Oldest bill"
|
||||
msgstr "Facture la plus ancienne"
|
||||
|
||||
#: templates/edit_project.html:6 templates/list_bills.html:24
|
||||
msgid "you sure?"
|
||||
msgstr "c'est sûr ?"
|
||||
|
||||
#: templates/edit_project.html:11
|
||||
msgid "Edit this project"
|
||||
msgstr "Éditer ce projet"
|
||||
|
||||
#: templates/forms.html:23
|
||||
msgid "Can't remember the password?"
|
||||
msgstr "Vous ne vous souvenez plus du code d'accès ?"
|
||||
|
||||
#: templates/forms.html:26
|
||||
msgid "Cancel"
|
||||
msgstr "Annuler"
|
||||
|
||||
#: templates/forms.html:68
|
||||
msgid "Edit the project"
|
||||
msgstr "Éditer le projet"
|
||||
|
||||
#: templates/forms.html:69 templates/list_bills.html:70
|
||||
#: templates/list_bills.html:114
|
||||
msgid "delete"
|
||||
msgstr "supprimer"
|
||||
|
||||
#: templates/forms.html:77
|
||||
msgid "Edit this bill"
|
||||
msgstr "Éditer cette facture"
|
||||
|
||||
#: templates/forms.html:77 templates/list_bills.html:94
|
||||
msgid "Add a bill"
|
||||
msgstr "Ajouter une facture"
|
||||
|
||||
#: templates/forms.html:95
|
||||
msgid "Type user name here"
|
||||
msgstr "Nouveau participant"
|
||||
|
||||
#: templates/forms.html:100
|
||||
msgid "Edit this member"
|
||||
msgstr "Éditer ce participant"
|
||||
|
||||
#: templates/forms.html:102
|
||||
msgid "Send the invitations"
|
||||
msgstr "Envoyer les invitations"
|
||||
|
||||
#: templates/forms.html:103
|
||||
msgid "No, thanks"
|
||||
msgstr "Non merci"
|
||||
|
||||
#: templates/forms.html:109
|
||||
msgid "Create an archive"
|
||||
msgstr "Créer une archive"
|
||||
|
||||
#: templates/forms.html:116
|
||||
msgid "Create the archive"
|
||||
msgstr "Créer l'archive"
|
||||
|
||||
#: templates/forms.html:136
|
||||
msgid "Download this project's data"
|
||||
msgstr "Télécharger les données de ce projet"
|
||||
|
||||
#: templates/forms.html:136
|
||||
msgid "Download"
|
||||
msgstr "Télécharger"
|
||||
|
||||
#: templates/home.html:8
|
||||
msgid "Manage your shared <br>expenses, easily"
|
||||
msgstr "Gérez vos dépenses<br> partagées, facilement"
|
||||
|
||||
#: templates/home.html:9
|
||||
msgid "Try out the demo"
|
||||
msgstr "Essayez la démo"
|
||||
|
||||
#: templates/home.html:12
|
||||
msgid "You're sharing a house?"
|
||||
msgstr "Vous êtes en colocation ?"
|
||||
|
||||
#: templates/home.html:12
|
||||
msgid "Going on holidays with friends?"
|
||||
msgstr "Partez en vacances avec des amis ?"
|
||||
|
||||
#: templates/home.html:12
|
||||
msgid "Simply sharing money with others?"
|
||||
msgstr "Ça vous arrive de partager de l'argent avec d'autres ?"
|
||||
|
||||
#: templates/home.html:12
|
||||
msgid "We can help!"
|
||||
msgstr "On peut vous aider !"
|
||||
|
||||
#: templates/home.html:24
|
||||
msgid "Log to an existing project"
|
||||
msgstr "Se connecter à un projet existant"
|
||||
|
||||
#: templates/home.html:28
|
||||
msgid "log in"
|
||||
msgstr "se connecter"
|
||||
|
||||
#: templates/home.html:29
|
||||
msgid "can't remember your password?"
|
||||
msgstr "vous ne vous souvenez plus du code d'accès ?"
|
||||
|
||||
#: templates/home.html:36
|
||||
msgid "or create a new one"
|
||||
msgstr "ou créez en un nouveau"
|
||||
|
||||
#: templates/home.html:40
|
||||
msgid "let's get started"
|
||||
msgstr "c'est parti !"
|
||||
|
||||
#: templates/home.html:51
|
||||
msgid ""
|
||||
"This access code will be sent to your friends. It is stored as-is by the "
|
||||
"server, so don\\'t reuse a personal password!"
|
||||
msgstr ""
|
||||
"Ce code d\\'accès va être envoyé à vos amis et stocké en clair sur le "
|
||||
"serveur.N\\'utilisez pas un mot de passe personnel !"
|
||||
|
||||
#: templates/layout.html:5
|
||||
msgid "Account manager"
|
||||
msgstr "Gestion de comptes"
|
||||
|
||||
#: templates/layout.html:45 templates/settle_bills.html:4
|
||||
msgid "Bills"
|
||||
msgstr "Factures"
|
||||
|
||||
#: templates/layout.html:46 templates/settle_bills.html:5
|
||||
msgid "Settle"
|
||||
msgstr "Remboursements"
|
||||
|
||||
#: templates/layout.html:53
|
||||
msgid "options"
|
||||
msgstr "options"
|
||||
|
||||
#: templates/layout.html:55
|
||||
msgid "Project settings"
|
||||
msgstr "Options du projet"
|
||||
|
||||
#: templates/layout.html:59
|
||||
msgid "switch to"
|
||||
msgstr "aller à"
|
||||
|
||||
#: templates/layout.html:62
|
||||
msgid "Start a new project"
|
||||
msgstr "Nouveau projet"
|
||||
|
||||
#: templates/layout.html:64
|
||||
msgid "Logout"
|
||||
msgstr "Se déconnecter"
|
||||
|
||||
#: templates/layout.html:92
|
||||
msgid "This is a free software"
|
||||
msgstr "Ceci est un logiciel libre"
|
||||
|
||||
#: templates/layout.html:92
|
||||
msgid "you can contribute and improve it!"
|
||||
msgstr "vous pouvez y contribuer et l'améliorer"
|
||||
|
||||
#: templates/list_bills.html:74
|
||||
msgid "reactivate"
|
||||
msgstr "ré-activer"
|
||||
|
||||
#: templates/list_bills.html:88
|
||||
msgid "The project identifier is"
|
||||
msgstr "L'identifiant de ce projet est"
|
||||
|
||||
#: templates/list_bills.html:88
|
||||
msgid "remember it!"
|
||||
msgstr "souvenez vous en !"
|
||||
|
||||
#: templates/list_bills.html:89
|
||||
msgid "Add a new bill"
|
||||
msgstr "Nouvelle facture"
|
||||
|
||||
#: templates/list_bills.html:103
|
||||
msgid "When?"
|
||||
msgstr "Quand ?"
|
||||
|
||||
#: templates/list_bills.html:103
|
||||
msgid "Who paid?"
|
||||
msgstr "Qui a payé ?"
|
||||
|
||||
#: templates/list_bills.html:103
|
||||
msgid "For what?"
|
||||
msgstr "Pour quoi ?"
|
||||
|
||||
#: templates/list_bills.html:103 templates/settle_bills.html:31
|
||||
msgid "How much?"
|
||||
msgstr "Combien ?"
|
||||
|
||||
#: templates/list_bills.html:103
|
||||
msgid "Actions"
|
||||
msgstr "Actions"
|
||||
|
||||
#: templates/list_bills.html:111
|
||||
msgid "each"
|
||||
msgstr "chacun"
|
||||
|
||||
#: templates/list_bills.html:113
|
||||
msgid "edit"
|
||||
msgstr "éditer"
|
||||
|
||||
#: templates/list_bills.html:122
|
||||
msgid "Nothing to list yet. You probably want to"
|
||||
msgstr "Rien à lister pour l'instant. Vous voulez surement"
|
||||
|
||||
#: templates/list_bills.html:122
|
||||
msgid "add a bill"
|
||||
msgstr "ajouter une facture"
|
||||
|
||||
#: templates/password_reminder.html:4
|
||||
msgid "Password reminder"
|
||||
msgstr "Rappel du code d'accès"
|
||||
|
||||
#: templates/recent_projects.html:2
|
||||
msgid "Your projects"
|
||||
msgstr "Vos projets"
|
||||
|
||||
#: templates/send_invites.html:6
|
||||
msgid "Invite people"
|
||||
msgstr "Invitez des gens"
|
||||
|
||||
#: templates/send_invites.html:7
|
||||
msgid "Use it!"
|
||||
msgstr "Utilisez le !"
|
||||
|
||||
#: templates/send_invites.html:11
|
||||
msgid "Invite people to join this project"
|
||||
msgstr "Invitez des personnes à rejoindre ce projet"
|
||||
|
||||
#: templates/send_invites.html:12
|
||||
msgid ""
|
||||
"Specify a (comma separated) list of email adresses you want to notify "
|
||||
"about the \n"
|
||||
"creation of this budget management project and we will send them an email"
|
||||
" for you."
|
||||
msgstr ""
|
||||
"Entrez les addresses des personnes que vous souhaitez inviter, séparées "
|
||||
"par des virgules. On s'occupe de leur envoyer un email."
|
||||
|
||||
#: templates/send_invites.html:14
|
||||
msgid "If you prefer, you can"
|
||||
msgstr "Si vous préférez vous pouvez"
|
||||
|
||||
#: templates/send_invites.html:14
|
||||
msgid "skip this step"
|
||||
msgstr "sauter cette étape"
|
||||
|
||||
#: templates/send_invites.html:14
|
||||
msgid "and notify them yourself"
|
||||
msgstr "et les avertir vous même"
|
||||
|
||||
#: templates/settle_bills.html:31
|
||||
msgid "Who pays?"
|
||||
msgstr "Qui doit payer ?"
|
||||
|
||||
#: templates/settle_bills.html:31
|
||||
msgid "To whom?"
|
||||
msgstr "Pour qui ?"
|
|
@ -1,110 +0,0 @@
|
|||
import re
|
||||
import inspect
|
||||
|
||||
from jinja2 import filters
|
||||
from json import dumps
|
||||
from flask import redirect
|
||||
from werkzeug.routing import HTTPException, RoutingException
|
||||
from io import BytesIO
|
||||
|
||||
import csv
|
||||
|
||||
|
||||
def slugify(value):
|
||||
"""Normalizes string, converts to lowercase, removes non-alpha characters,
|
||||
and converts spaces to hyphens.
|
||||
|
||||
Copy/Pasted from ametaireau/pelican/utils itself took from django sources.
|
||||
"""
|
||||
if type(value) == unicode:
|
||||
import unicodedata
|
||||
value = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore')
|
||||
value = unicode(re.sub('[^\w\s-]', '', value).strip().lower())
|
||||
return re.sub('[-\s]+', '-', value)
|
||||
|
||||
|
||||
class Redirect303(HTTPException, RoutingException):
|
||||
"""Raise if the map requests a redirect. This is for example the case if
|
||||
`strict_slashes` are activated and an url that requires a trailing slash.
|
||||
|
||||
The attribute `new_url` contains the absolute destination url.
|
||||
"""
|
||||
code = 303
|
||||
|
||||
def __init__(self, new_url):
|
||||
RoutingException.__init__(self, new_url)
|
||||
self.new_url = new_url
|
||||
|
||||
def get_response(self, environ):
|
||||
return redirect(self.new_url, 303)
|
||||
|
||||
|
||||
class PrefixedWSGI(object):
|
||||
'''
|
||||
Wrap the application in this middleware and configure the
|
||||
front-end server to add these headers, to let you quietly bind
|
||||
this to a URL other than / and to an HTTP scheme that is
|
||||
different than what is used locally.
|
||||
|
||||
It relies on "APPLICATION_ROOT" app setting.
|
||||
|
||||
Inspired from http://flask.pocoo.org/snippets/35/
|
||||
|
||||
:param app: the WSGI application
|
||||
'''
|
||||
def __init__(self, app):
|
||||
self.app = app
|
||||
self.wsgi_app = app.wsgi_app
|
||||
|
||||
def __call__(self, environ, start_response):
|
||||
script_name = self.app.config['APPLICATION_ROOT']
|
||||
if script_name:
|
||||
environ['SCRIPT_NAME'] = script_name
|
||||
path_info = environ['PATH_INFO']
|
||||
if path_info.startswith(script_name):
|
||||
environ['PATH_INFO'] = path_info[len(script_name):]
|
||||
|
||||
scheme = environ.get('HTTP_X_SCHEME', '')
|
||||
if scheme:
|
||||
environ['wsgi.url_scheme'] = scheme
|
||||
return self.wsgi_app(environ, start_response)
|
||||
|
||||
|
||||
def minimal_round(*args, **kw):
|
||||
""" Jinja2 filter: rounds, but display only non-zero decimals
|
||||
|
||||
from http://stackoverflow.com/questions/28458524/
|
||||
"""
|
||||
# Use the original round filter, to deal with the extra arguments
|
||||
res = filters.do_round(*args, **kw)
|
||||
# Test if the result is equivalent to an integer and
|
||||
# return depending on it
|
||||
ires = int(res)
|
||||
return (res if res != ires else ires)
|
||||
|
||||
def list_of_dicts2json(dict_to_convert):
|
||||
"""Take a list of dictionnaries and turns it into
|
||||
a json in-memory file
|
||||
"""
|
||||
bytes_io = BytesIO()
|
||||
bytes_io.write(dumps(dict_to_convert))
|
||||
bytes_io.seek(0)
|
||||
return bytes_io
|
||||
|
||||
def list_of_dicts2csv(dict_to_convert):
|
||||
"""Take a list of dictionnaries and turns it into
|
||||
a csv in-memory file, assume all dict have the same keys
|
||||
"""
|
||||
bytes_io = BytesIO()
|
||||
try:
|
||||
csv_data = [dict_to_convert[0].keys()]
|
||||
for dic in dict_to_convert:
|
||||
csv_data.append([dic[h].encode('utf8')
|
||||
if isinstance(dic[h], unicode) else str(dic[h]).encode('utf8')
|
||||
for h in dict_to_convert[0].keys()])
|
||||
except (KeyError, IndexError):
|
||||
csv_data = []
|
||||
writer = csv.writer(bytes_io)
|
||||
writer.writerows(csv_data)
|
||||
bytes_io.seek(0)
|
||||
return bytes_io
|
|
@ -1,461 +0,0 @@
|
|||
"""
|
||||
The blueprint for the web interface.
|
||||
|
||||
Contains all the interaction logic with the end user (except forms which
|
||||
are directly handled in the forms module.
|
||||
|
||||
Basically, this blueprint takes care of the authentication and provides
|
||||
some shortcuts to make your life better when coding (see `pull_project`
|
||||
and `add_project_id` for a quick overview)
|
||||
"""
|
||||
|
||||
from flask import Blueprint, current_app, flash, g, redirect, \
|
||||
render_template, request, session, url_for, send_file
|
||||
from flask_mail import Mail, Message
|
||||
from flask_babel import get_locale, gettext as _
|
||||
from smtplib import SMTPRecipientsRefused
|
||||
import werkzeug
|
||||
from sqlalchemy import orm
|
||||
|
||||
# local modules
|
||||
from models import db, Project, Person, Bill
|
||||
from forms import AuthenticationForm, CreateArchiveForm, EditProjectForm, \
|
||||
InviteForm, MemberForm, PasswordReminder, ProjectForm, get_billform_for, \
|
||||
ExportForm
|
||||
from utils import Redirect303, list_of_dicts2json, list_of_dicts2csv
|
||||
|
||||
main = Blueprint("main", __name__)
|
||||
mail = Mail()
|
||||
|
||||
|
||||
@main.url_defaults
|
||||
def add_project_id(endpoint, values):
|
||||
"""Add the project id to the url calls if it is expected.
|
||||
|
||||
This is to not carry it everywhere in the templates.
|
||||
"""
|
||||
if 'project_id' in values or not hasattr(g, 'project'):
|
||||
return
|
||||
if current_app.url_map.is_endpoint_expecting(endpoint, 'project_id'):
|
||||
values['project_id'] = g.project.id
|
||||
|
||||
|
||||
@main.url_value_preprocessor
|
||||
def pull_project(endpoint, values):
|
||||
"""When a request contains a project_id value, transform it directly
|
||||
into a project by checking the credentials are stored in session.
|
||||
|
||||
If not, redirect the user to an authentication form
|
||||
"""
|
||||
if endpoint == "authenticate":
|
||||
return
|
||||
if not values:
|
||||
values = {}
|
||||
project_id = values.pop('project_id', None)
|
||||
if project_id:
|
||||
project = Project.query.get(project_id)
|
||||
if not project:
|
||||
raise Redirect303(url_for(".create_project",
|
||||
project_id=project_id))
|
||||
if project.id in session and session[project.id] == project.password:
|
||||
# add project into kwargs and call the original function
|
||||
g.project = project
|
||||
else:
|
||||
# redirect to authentication page
|
||||
raise Redirect303(
|
||||
url_for(".authenticate", project_id=project_id))
|
||||
|
||||
|
||||
@main.route("/authenticate", methods=["GET", "POST"])
|
||||
def authenticate(project_id=None):
|
||||
"""Authentication form"""
|
||||
form = AuthenticationForm()
|
||||
if not form.id.data and request.args.get('project_id'):
|
||||
form.id.data = request.args['project_id']
|
||||
project_id = form.id.data
|
||||
if project_id is None:
|
||||
#User doesn't provide project identifier, return to authenticate form
|
||||
msg = _("You need to enter a project identifier")
|
||||
form.errors["id"] = [msg]
|
||||
return render_template("authenticate.html", form=form)
|
||||
else:
|
||||
project = Project.query.get(project_id)
|
||||
|
||||
create_project = False # We don't want to create the project by default
|
||||
if not project:
|
||||
# But if the user try to connect to an unexisting project, we will
|
||||
# propose him a link to the creation form.
|
||||
if request.method == "POST":
|
||||
form.validate()
|
||||
else:
|
||||
create_project = project_id
|
||||
|
||||
else:
|
||||
# if credentials are already in session, redirect
|
||||
if project_id in session and project.password == session[project_id]:
|
||||
setattr(g, 'project', project)
|
||||
return redirect(url_for(".list_bills"))
|
||||
|
||||
# else process the form
|
||||
if request.method == "POST":
|
||||
if form.validate():
|
||||
if not form.password.data == project.password:
|
||||
msg = _("This private code is not the right one")
|
||||
form.errors['password'] = [msg]
|
||||
else:
|
||||
# maintain a list of visited projects
|
||||
if "projects" not in session:
|
||||
session["projects"] = []
|
||||
# add the project on the top of the list
|
||||
session["projects"].insert(0, (project_id, project.name))
|
||||
session[project_id] = form.password.data
|
||||
session.update()
|
||||
setattr(g, 'project', project)
|
||||
return redirect(url_for(".list_bills"))
|
||||
|
||||
return render_template("authenticate.html", form=form,
|
||||
create_project=create_project)
|
||||
|
||||
|
||||
@main.route("/")
|
||||
def home():
|
||||
project_form = ProjectForm()
|
||||
auth_form = AuthenticationForm()
|
||||
return render_template("home.html", project_form=project_form,
|
||||
auth_form=auth_form, session=session)
|
||||
|
||||
|
||||
@main.route("/create", methods=["GET", "POST"])
|
||||
def create_project():
|
||||
form = ProjectForm()
|
||||
if request.method == "GET" and 'project_id' in request.values:
|
||||
form.name.data = request.values['project_id']
|
||||
|
||||
if request.method == "POST":
|
||||
# At first, we don't want the user to bother with the identifier
|
||||
# so it will automatically be missing because not displayed into
|
||||
# the form
|
||||
# Thus we fill it with the same value as the filled name,
|
||||
# the validation will take care of the slug
|
||||
if not form.id.data:
|
||||
form.id.data = form.name.data
|
||||
if form.validate():
|
||||
# save the object in the db
|
||||
project = form.save()
|
||||
db.session.add(project)
|
||||
db.session.commit()
|
||||
|
||||
# create the session object (authenticate)
|
||||
session[project.id] = project.password
|
||||
session.update()
|
||||
|
||||
# send reminder email
|
||||
g.project = project
|
||||
|
||||
message_title = _("You have just created '%(project)s' "
|
||||
"to share your expenses", project=g.project.name)
|
||||
|
||||
message_body = render_template("reminder_mail.%s" %
|
||||
get_locale().language)
|
||||
|
||||
msg = Message(message_title,
|
||||
body=message_body,
|
||||
recipients=[project.contact_email])
|
||||
try:
|
||||
mail.send(msg)
|
||||
except SMTPRecipientsRefused:
|
||||
msg_compl = 'Problem sending mail. '
|
||||
# TODO: destroy the project and cancel instead?
|
||||
else:
|
||||
msg_compl = ''
|
||||
|
||||
# redirect the user to the next step (invite)
|
||||
flash(_("%(msg_compl)sThe project identifier is %(project)s",
|
||||
msg_compl=msg_compl, project=project.id))
|
||||
return redirect(url_for(".invite", project_id=project.id))
|
||||
|
||||
return render_template("create_project.html", form=form)
|
||||
|
||||
|
||||
@main.route("/password-reminder", methods=["GET", "POST"])
|
||||
def remind_password():
|
||||
form = PasswordReminder()
|
||||
if request.method == "POST":
|
||||
if form.validate():
|
||||
# get the project
|
||||
project = Project.query.get(form.id.data)
|
||||
|
||||
# send the password reminder
|
||||
password_reminder = "password_reminder.%s" % get_locale().language
|
||||
mail.send(Message("password recovery",
|
||||
body=render_template(password_reminder, project=project),
|
||||
recipients=[project.contact_email]))
|
||||
flash(_("a mail has been sent to you with the password"))
|
||||
|
||||
return render_template("password_reminder.html", form=form)
|
||||
|
||||
|
||||
@main.route("/<project_id>/edit", methods=["GET", "POST"])
|
||||
def edit_project():
|
||||
edit_form = EditProjectForm()
|
||||
export_form = ExportForm()
|
||||
if request.method == "POST":
|
||||
if edit_form.validate():
|
||||
project = edit_form.update(g.project)
|
||||
db.session.commit()
|
||||
session[project.id] = project.password
|
||||
|
||||
return redirect(url_for(".list_bills"))
|
||||
|
||||
if export_form.validate():
|
||||
export_format = export_form.export_format.data
|
||||
export_type = export_form.export_type.data
|
||||
|
||||
if export_type == 'transactions':
|
||||
export = g.project.get_transactions_to_settle_bill(
|
||||
pretty_output=True)
|
||||
if export_type == "bills":
|
||||
export = g.project.get_pretty_bills(
|
||||
export_format=export_format)
|
||||
|
||||
if export_format == "json":
|
||||
file2export = list_of_dicts2json(export)
|
||||
if export_format == "csv":
|
||||
file2export = list_of_dicts2csv(export)
|
||||
|
||||
return send_file(file2export,
|
||||
attachment_filename="%s-%s.%s" %
|
||||
(g.project.name, export_type, export_format),
|
||||
as_attachment=True
|
||||
)
|
||||
else:
|
||||
edit_form.name.data = g.project.name
|
||||
edit_form.password.data = g.project.password
|
||||
edit_form.contact_email.data = g.project.contact_email
|
||||
|
||||
return render_template("edit_project.html", edit_form=edit_form, export_form=export_form)
|
||||
|
||||
|
||||
@main.route("/<project_id>/delete")
|
||||
def delete_project():
|
||||
g.project.remove_project()
|
||||
flash(_('Project successfully deleted'))
|
||||
|
||||
return redirect(url_for(".home"))
|
||||
|
||||
|
||||
@main.route("/exit")
|
||||
def exit():
|
||||
# delete the session
|
||||
session.clear()
|
||||
return redirect(url_for(".home"))
|
||||
|
||||
|
||||
@main.route("/demo")
|
||||
def demo():
|
||||
"""
|
||||
Authenticate the user for the demonstration project and redirect him to
|
||||
the bills list for this project.
|
||||
|
||||
Create a demo project if it doesnt exists yet (or has been deleted)
|
||||
"""
|
||||
project = Project.query.get("demo")
|
||||
if not project:
|
||||
project = Project(id="demo", name=u"demonstration", password="demo",
|
||||
contact_email="demo@notmyidea.org")
|
||||
db.session.add(project)
|
||||
db.session.commit()
|
||||
session[project.id] = project.password
|
||||
return redirect(url_for(".list_bills", project_id=project.id))
|
||||
|
||||
|
||||
@main.route("/<project_id>/invite", methods=["GET", "POST"])
|
||||
def invite():
|
||||
"""Send invitations for this particular project"""
|
||||
|
||||
form = InviteForm()
|
||||
|
||||
if request.method == "POST":
|
||||
if form.validate():
|
||||
# send the email
|
||||
|
||||
message_body = render_template("invitation_mail.%s" %
|
||||
get_locale().language)
|
||||
|
||||
message_title = _("You have been invited to share your "
|
||||
"expenses for %(project)s", project=g.project.name)
|
||||
msg = Message(message_title,
|
||||
body=message_body,
|
||||
recipients=[email.strip()
|
||||
for email in form.emails.data.split(",")])
|
||||
mail.send(msg)
|
||||
flash(_("Your invitations have been sent"))
|
||||
return redirect(url_for(".list_bills"))
|
||||
|
||||
return render_template("send_invites.html", form=form)
|
||||
|
||||
|
||||
@main.route("/<project_id>/")
|
||||
def list_bills():
|
||||
bill_form = get_billform_for(g.project)
|
||||
# set the last selected payer as default choice if exists
|
||||
if 'last_selected_payer' in session:
|
||||
bill_form.payer.data = session['last_selected_payer']
|
||||
# Preload the "owers" relationship for all bills
|
||||
bills = g.project.get_bills().options(orm.subqueryload(Bill.owers))
|
||||
|
||||
return render_template("list_bills.html",
|
||||
bills=bills, member_form=MemberForm(g.project),
|
||||
bill_form=bill_form,
|
||||
add_bill=request.values.get('add_bill', False),
|
||||
current_view="list_bills",
|
||||
)
|
||||
|
||||
|
||||
@main.route("/<project_id>/members/add", methods=["GET", "POST"])
|
||||
def add_member():
|
||||
# FIXME manage form errors on the list_bills page
|
||||
form = MemberForm(g.project)
|
||||
if request.method == "POST":
|
||||
if form.validate():
|
||||
member = form.save(g.project, Person())
|
||||
db.session.commit()
|
||||
flash(_("%(member)s had been added", member=member.name))
|
||||
return redirect(url_for(".list_bills"))
|
||||
|
||||
return render_template("add_member.html", form=form)
|
||||
|
||||
|
||||
@main.route("/<project_id>/members/<member_id>/reactivate", methods=["POST"])
|
||||
def reactivate(member_id):
|
||||
person = Person.query.filter(Person.id == member_id)\
|
||||
.filter(Project.id == g.project.id).all()
|
||||
if person:
|
||||
person[0].activated = True
|
||||
db.session.commit()
|
||||
flash(_("%(name)s is part of this project again", name=person[0].name))
|
||||
return redirect(url_for(".list_bills"))
|
||||
|
||||
|
||||
@main.route("/<project_id>/members/<member_id>/delete", methods=["POST"])
|
||||
def remove_member(member_id):
|
||||
member = g.project.remove_member(member_id)
|
||||
if member:
|
||||
if member.activated == False:
|
||||
flash(_("User '%(name)s' has been deactivated", name=member.name))
|
||||
else:
|
||||
flash(_("User '%(name)s' has been removed", name=member.name))
|
||||
return redirect(url_for(".list_bills"))
|
||||
|
||||
|
||||
@main.route("/<project_id>/members/<member_id>/edit",
|
||||
methods=["POST", "GET"])
|
||||
def edit_member(member_id):
|
||||
member = Person.query.get(member_id, g.project)
|
||||
if not member:
|
||||
raise werkzeug.exceptions.NotFound()
|
||||
form = MemberForm(g.project, edit=True)
|
||||
|
||||
if request.method == 'POST' and form.validate():
|
||||
form.save(g.project, member)
|
||||
db.session.commit()
|
||||
flash(_("User '%(name)s' has been edited", name=member.name))
|
||||
return redirect(url_for(".list_bills"))
|
||||
|
||||
form.fill(member)
|
||||
return render_template("edit_member.html", form=form, edit=True)
|
||||
|
||||
|
||||
@main.route("/<project_id>/add", methods=["GET", "POST"])
|
||||
def add_bill():
|
||||
form = get_billform_for(g.project)
|
||||
if request.method == 'POST':
|
||||
if form.validate():
|
||||
# save last selected payer in session
|
||||
session['last_selected_payer'] = form.payer.data
|
||||
session.update()
|
||||
|
||||
bill = Bill()
|
||||
db.session.add(form.save(bill, g.project))
|
||||
db.session.commit()
|
||||
|
||||
flash(_("The bill has been added"))
|
||||
|
||||
args = {}
|
||||
if form.submit2.data:
|
||||
args['add_bill'] = True
|
||||
|
||||
return redirect(url_for('.list_bills', **args))
|
||||
|
||||
return render_template("add_bill.html", form=form)
|
||||
|
||||
|
||||
@main.route("/<project_id>/delete/<int:bill_id>")
|
||||
def delete_bill(bill_id):
|
||||
# fixme: everyone is able to delete a bill
|
||||
bill = Bill.query.get(g.project, bill_id)
|
||||
if not bill:
|
||||
raise werkzeug.exceptions.NotFound()
|
||||
|
||||
db.session.delete(bill)
|
||||
db.session.commit()
|
||||
flash(_("The bill has been deleted"))
|
||||
|
||||
return redirect(url_for('.list_bills'))
|
||||
|
||||
|
||||
@main.route("/<project_id>/edit/<int:bill_id>", methods=["GET", "POST"])
|
||||
def edit_bill(bill_id):
|
||||
# FIXME: Test this bill belongs to this project !
|
||||
bill = Bill.query.get(g.project, bill_id)
|
||||
if not bill:
|
||||
raise werkzeug.exceptions.NotFound()
|
||||
|
||||
form = get_billform_for(g.project, set_default=False)
|
||||
|
||||
if request.method == 'POST' and form.validate():
|
||||
form.save(bill, g.project)
|
||||
db.session.commit()
|
||||
|
||||
flash(_("The bill has been modified"))
|
||||
return redirect(url_for('.list_bills'))
|
||||
|
||||
if not form.errors:
|
||||
form.fill(bill)
|
||||
|
||||
return render_template("add_bill.html", form=form, edit=True)
|
||||
|
||||
|
||||
@main.route("/lang/<lang>")
|
||||
def change_lang(lang):
|
||||
session['lang'] = lang
|
||||
session.update()
|
||||
|
||||
return redirect(request.headers.get('Referer') or url_for('.home'))
|
||||
|
||||
|
||||
@main.route("/<project_id>/settle_bills")
|
||||
def settle_bill():
|
||||
"""Compute the sum each one have to pay to each other and display it"""
|
||||
bills = g.project.get_transactions_to_settle_bill()
|
||||
return render_template(
|
||||
"settle_bills.html",
|
||||
bills=bills,
|
||||
current_view='settle_bill',
|
||||
)
|
||||
|
||||
|
||||
@main.route("/<project_id>/archives/create", methods=["GET", "POST"])
|
||||
def create_archive():
|
||||
form = CreateArchiveForm()
|
||||
if request.method == "POST":
|
||||
if form.validate():
|
||||
pass
|
||||
flash(_("The data from XX to XX has been archived"))
|
||||
|
||||
return render_template("create_archive.html", form=form)
|
||||
|
||||
|
||||
@main.route("/dashboard")
|
||||
def dashboard():
|
||||
return render_template("dashboard.html", projects=Project.query.all())
|
|
@ -1,7 +0,0 @@
|
|||
backlog = 2048
|
||||
daemon = False
|
||||
debug = True
|
||||
workers = 3
|
||||
logfile = "/path/to/your/app/budget.gunicorn.log"
|
||||
loglevel = "info"
|
||||
bind = "unix:/path/to/your/app/budget.gunicorn.sock"
|
|
@ -1,28 +0,0 @@
|
|||
server {
|
||||
server_name yourur;
|
||||
keepalive_timeout 5;
|
||||
|
||||
location /static/ {
|
||||
alias /path/to/app/budget/static/;
|
||||
}
|
||||
location / {
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header Host $http_host;
|
||||
proxy_redirect off;
|
||||
proxy_connect_timeout 90;
|
||||
proxy_send_timeout 180;
|
||||
proxy_read_timeout 180;
|
||||
proxy_buffer_size 16k;
|
||||
proxy_buffers 8 16k;
|
||||
proxy_busy_buffers_size 32k;
|
||||
proxy_intercept_errors on;
|
||||
if (!-f $request_filename) {
|
||||
proxy_pass http://budget_backend;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
upstream budget_backend {
|
||||
server unix:/path/to/app/budget.gunicorn.sock;
|
||||
}
|
|
@ -1,7 +0,0 @@
|
|||
[program:budget]
|
||||
command=/path/to/your/app/venv/bin/gunicorn -c /path/to/your/app/conf/gunicorn.conf.py run:app
|
||||
directory=/path/to/your/app/budget/
|
||||
user=www
|
||||
autostart=true
|
||||
autorestart=true
|
||||
redirect_stderr=True
|
|
@ -1,130 +0,0 @@
|
|||
# Makefile for Sphinx documentation
|
||||
#
|
||||
|
||||
# You can set these variables from the command line.
|
||||
SPHINXOPTS =
|
||||
SPHINXBUILD = sphinx-build
|
||||
PAPER =
|
||||
BUILDDIR = _build
|
||||
|
||||
# Internal variables.
|
||||
PAPEROPT_a4 = -D latex_paper_size=a4
|
||||
PAPEROPT_letter = -D latex_paper_size=letter
|
||||
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
|
||||
|
||||
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest
|
||||
|
||||
help:
|
||||
@echo "Please use \`make <target>' where <target> is one of"
|
||||
@echo " html to make standalone HTML files"
|
||||
@echo " dirhtml to make HTML files named index.html in directories"
|
||||
@echo " singlehtml to make a single large HTML file"
|
||||
@echo " pickle to make pickle files"
|
||||
@echo " json to make JSON files"
|
||||
@echo " htmlhelp to make HTML files and a HTML help project"
|
||||
@echo " qthelp to make HTML files and a qthelp project"
|
||||
@echo " devhelp to make HTML files and a Devhelp project"
|
||||
@echo " epub to make an epub"
|
||||
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
|
||||
@echo " latexpdf to make LaTeX files and run them through pdflatex"
|
||||
@echo " text to make text files"
|
||||
@echo " man to make manual pages"
|
||||
@echo " changes to make an overview of all changed/added/deprecated items"
|
||||
@echo " linkcheck to check all external links for integrity"
|
||||
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
|
||||
|
||||
clean:
|
||||
-rm -rf $(BUILDDIR)/*
|
||||
|
||||
html:
|
||||
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
|
||||
@echo
|
||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
|
||||
|
||||
dirhtml:
|
||||
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
|
||||
@echo
|
||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
|
||||
|
||||
singlehtml:
|
||||
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
|
||||
@echo
|
||||
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
|
||||
|
||||
pickle:
|
||||
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
|
||||
@echo
|
||||
@echo "Build finished; now you can process the pickle files."
|
||||
|
||||
json:
|
||||
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
|
||||
@echo
|
||||
@echo "Build finished; now you can process the JSON files."
|
||||
|
||||
htmlhelp:
|
||||
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
|
||||
@echo
|
||||
@echo "Build finished; now you can run HTML Help Workshop with the" \
|
||||
".hhp project file in $(BUILDDIR)/htmlhelp."
|
||||
|
||||
qthelp:
|
||||
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
|
||||
@echo
|
||||
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
|
||||
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
|
||||
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Ihatemoney.qhcp"
|
||||
@echo "To view the help file:"
|
||||
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Ihatemoney.qhc"
|
||||
|
||||
devhelp:
|
||||
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
|
||||
@echo
|
||||
@echo "Build finished."
|
||||
@echo "To view the help file:"
|
||||
@echo "# mkdir -p $$HOME/.local/share/devhelp/Ihatemoney"
|
||||
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Ihatemoney"
|
||||
@echo "# devhelp"
|
||||
|
||||
epub:
|
||||
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
|
||||
@echo
|
||||
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
|
||||
|
||||
latex:
|
||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||
@echo
|
||||
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
|
||||
@echo "Run \`make' in that directory to run these through (pdf)latex" \
|
||||
"(use \`make latexpdf' here to do that automatically)."
|
||||
|
||||
latexpdf:
|
||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||
@echo "Running LaTeX files through pdflatex..."
|
||||
make -C $(BUILDDIR)/latex all-pdf
|
||||
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
|
||||
|
||||
text:
|
||||
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
|
||||
@echo
|
||||
@echo "Build finished. The text files are in $(BUILDDIR)/text."
|
||||
|
||||
man:
|
||||
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
|
||||
@echo
|
||||
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
|
||||
|
||||
changes:
|
||||
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
|
||||
@echo
|
||||
@echo "The overview file is in $(BUILDDIR)/changes."
|
||||
|
||||
linkcheck:
|
||||
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
|
||||
@echo
|
||||
@echo "Link check complete; look for any errors in the above output " \
|
||||
"or in $(BUILDDIR)/linkcheck/output.txt."
|
||||
|
||||
doctest:
|
||||
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
|
||||
@echo "Testing of doctests in the sources finished, look at the " \
|
||||
"results in $(BUILDDIR)/doctest/output.txt."
|
22
sources/docs/_themes/pelican/layout.html
vendored
|
@ -1,22 +0,0 @@
|
|||
{% extends "basic/layout.html" %}
|
||||
{% block header %}
|
||||
{{ super() }}
|
||||
{% if pagename == 'index' %}
|
||||
<div class=indexwrapper>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
{% block footer %}
|
||||
{% if pagename == 'index' %}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
{# do not display relbars #}
|
||||
{% block relbar1 %}{% endblock %}
|
||||
{% block relbar2 %}
|
||||
{% if theme_github_fork %}
|
||||
<a href="http://github.com/{{ theme_github_fork }}"><img style="position: fixed; top: 0; right: 0; border: 0;"
|
||||
src="http://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub" /></a>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
{% block sidebar1 %}{% endblock %}
|
||||
{% block sidebar2 %}{% endblock %}
|
254
sources/docs/_themes/pelican/static/pelican.css_t
vendored
|
@ -1,254 +0,0 @@
|
|||
/*
|
||||
* pelican.css_t
|
||||
* ~~~~~~~~~~~~
|
||||
*
|
||||
* Sphinx stylesheet -- pelican theme, based on the nature theme
|
||||
*
|
||||
* :copyright: Copyright 2011 by Alexis Metaireau.
|
||||
*/
|
||||
|
||||
@import url("basic.css");
|
||||
|
||||
/* -- page layout ----------------------------------------------------------- */
|
||||
|
||||
body {
|
||||
font-family: Arial, sans-serif;
|
||||
font-size: 100%;
|
||||
background-color: white;
|
||||
color: #555;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
div.documentwrapper {
|
||||
width: 70%;
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
div.bodywrapper {
|
||||
margin: 0 0 0 230px;
|
||||
}
|
||||
|
||||
hr {
|
||||
border: 1px solid #B1B4B6;
|
||||
}
|
||||
|
||||
div.document {
|
||||
}
|
||||
|
||||
div.body {
|
||||
background-color: #ffffff;
|
||||
color: #3E4349;
|
||||
padding: 0 30px 30px 30px;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
div.footer {
|
||||
color: #555;
|
||||
width: 100%;
|
||||
padding: 13px 0;
|
||||
text-align: center;
|
||||
font-size: 75%;
|
||||
}
|
||||
|
||||
div.footer a {
|
||||
color: #444;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
div.related {
|
||||
background-color: #6BA81E;
|
||||
line-height: 32px;
|
||||
color: #fff;
|
||||
text-shadow: 0px 1px 0 #444;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
div.related a {
|
||||
color: #E2F3CC;
|
||||
}
|
||||
|
||||
div.sphinxsidebar {
|
||||
font-size: 0.75em;
|
||||
line-height: 1.5em;
|
||||
}
|
||||
|
||||
div.sphinxsidebarwrapper{
|
||||
padding: 20px 0;
|
||||
}
|
||||
|
||||
div.sphinxsidebar h3,
|
||||
div.sphinxsidebar h4 {
|
||||
font-family: Arial, sans-serif;
|
||||
color: #222;
|
||||
font-size: 1.2em;
|
||||
font-weight: normal;
|
||||
margin: 0;
|
||||
padding: 5px 10px;
|
||||
background-color: #ddd;
|
||||
text-shadow: 1px 1px 0 white
|
||||
}
|
||||
|
||||
div.sphinxsidebar h4{
|
||||
font-size: 1.1em;
|
||||
}
|
||||
|
||||
div.sphinxsidebar h3 a {
|
||||
color: #444;
|
||||
}
|
||||
|
||||
|
||||
div.sphinxsidebar p {
|
||||
color: #888;
|
||||
padding: 5px 20px;
|
||||
}
|
||||
|
||||
div.sphinxsidebar p.topless {
|
||||
}
|
||||
|
||||
div.sphinxsidebar ul {
|
||||
margin: 10px 20px;
|
||||
padding: 0;
|
||||
color: #000;
|
||||
}
|
||||
|
||||
div.sphinxsidebar a {
|
||||
color: #444;
|
||||
}
|
||||
|
||||
div.sphinxsidebar input {
|
||||
border: 1px solid #ccc;
|
||||
font-family: sans-serif;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
div.sphinxsidebar input[type=text]{
|
||||
margin-left: 20px;
|
||||
}
|
||||
|
||||
/* -- body styles ----------------------------------------------------------- */
|
||||
|
||||
a {
|
||||
color: #005B81;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: #E32E00;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
div.body h1,
|
||||
div.body h2,
|
||||
div.body h3,
|
||||
div.body h4,
|
||||
div.body h5,
|
||||
div.body h6 {
|
||||
font-family: Arial, sans-serif;
|
||||
font-weight: normal;
|
||||
color: #212224;
|
||||
margin: 30px 0px 10px 0px;
|
||||
padding: 5px 0 5px 10px;
|
||||
text-shadow: 0px 1px 0 white
|
||||
}
|
||||
|
||||
{% if theme_index_logo %}
|
||||
div.indexwrapper h1 {
|
||||
text-indent: -999999px;
|
||||
background: url({{ theme_index_logo }}) no-repeat center center;
|
||||
height: {{ theme_index_logo_height }};
|
||||
}
|
||||
{% endif %}
|
||||
div.body h1 {
|
||||
border-top: 20px solid white;
|
||||
margin-top: 0;
|
||||
font-size: 250%;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
div.body h2 { font-size: 150%; background-color: #C8D5E3; }
|
||||
div.body h3 { font-size: 120%; background-color: #D8DEE3; }
|
||||
div.body h4 { font-size: 110%; background-color: #D8DEE3; }
|
||||
div.body h5 { font-size: 100%; background-color: #D8DEE3; }
|
||||
div.body h6 { font-size: 100%; background-color: #D8DEE3; }
|
||||
|
||||
a.headerlink {
|
||||
color: #c60f0f;
|
||||
font-size: 0.8em;
|
||||
padding: 0 4px 0 4px;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a.headerlink:hover {
|
||||
background-color: #c60f0f;
|
||||
color: white;
|
||||
}
|
||||
|
||||
div.body p, div.body dd, div.body li {
|
||||
line-height: 1.5em;
|
||||
}
|
||||
|
||||
div.admonition p.admonition-title + p {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
div.highlight{
|
||||
background-color: #111;
|
||||
}
|
||||
|
||||
div.note {
|
||||
background-color: #eee;
|
||||
border: 1px solid #ccc;
|
||||
}
|
||||
|
||||
div.seealso {
|
||||
background-color: #ffc;
|
||||
border: 1px solid #ff6;
|
||||
}
|
||||
|
||||
div.topic {
|
||||
background-color: #eee;
|
||||
}
|
||||
|
||||
div.warning {
|
||||
background-color: #ffe4e4;
|
||||
border: 1px solid #f66;
|
||||
}
|
||||
|
||||
p.admonition-title {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
p.admonition-title:after {
|
||||
content: ":";
|
||||
}
|
||||
|
||||
pre {
|
||||
padding: 10px;
|
||||
background-color: #111;
|
||||
color: #fff;
|
||||
line-height: 1.2em;
|
||||
border: 1px solid #C6C9CB;
|
||||
font-size: 1.1em;
|
||||
margin: 1.5em 0 1.5em 0;
|
||||
-webkit-box-shadow: 1px 1px 1px #d8d8d8;
|
||||
-moz-box-shadow: 1px 1px 1px #d8d8d8;
|
||||
}
|
||||
|
||||
tt {
|
||||
background-color: #ecf0f3;
|
||||
color: #222;
|
||||
/* padding: 1px 2px; */
|
||||
font-size: 1.1em;
|
||||
font-family: monospace;
|
||||
}
|
||||
|
||||
.viewcode-back {
|
||||
font-family: Arial, sans-serif;
|
||||
}
|
||||
|
||||
div.viewcode-block:target {
|
||||
background-color: #f4debf;
|
||||
border-top: 1px solid #ac9;
|
||||
border-bottom: 1px solid #ac9;
|
||||
}
|
10
sources/docs/_themes/pelican/theme.conf
vendored
|
@ -1,10 +0,0 @@
|
|||
[theme]
|
||||
inherit = basic
|
||||
stylesheet = pelican.css
|
||||
nosidebar = true
|
||||
pygments_style = fruity
|
||||
|
||||
[options]
|
||||
index_logo_height = 120px
|
||||
index_logo =
|
||||
github_fork =
|
|
@ -1,160 +0,0 @@
|
|||
The REST API
|
||||
############
|
||||
|
||||
All of what's possible to do with the website is also possible via a web API.
|
||||
This document explains how the API is organized and how you can query it.
|
||||
|
||||
By default, the API talks JSON. There is no other way to speak with it
|
||||
currently.
|
||||
|
||||
Overall organisation
|
||||
====================
|
||||
|
||||
You can access three different things: projects, members and bills. You can
|
||||
also get the balance for a project.
|
||||
|
||||
For the examples, I'm using curl, feel free to use whatever you want to do the
|
||||
same thing, curl is not a requirement.
|
||||
|
||||
Authentication
|
||||
--------------
|
||||
|
||||
To interact with bills and members, and to do something else than creating
|
||||
a project, you need to be authenticated. The only way to authenticate yourself
|
||||
currently is using the "basic" HTTP authentication.
|
||||
|
||||
For instance, here is how to see the what's in a project, using curl::
|
||||
|
||||
$ curl --basic -u demo:demo https://ihatemoney.org/api/projects/demo
|
||||
|
||||
Projects
|
||||
--------
|
||||
|
||||
You can't list projects, for security reasons. But you can create, update and
|
||||
delete one directly from the API.
|
||||
|
||||
The URLs are `/api/projects` and `/api/projects/<identifier>`.
|
||||
|
||||
Creating a project
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
A project needs the following arguments:
|
||||
|
||||
* `name`: The project name (string)
|
||||
* `id`: the project identifier (string without special chars or spaces)
|
||||
* `password`: the project password / secret code (string)
|
||||
* `contact_email`: the contact email
|
||||
|
||||
::
|
||||
|
||||
$ curl -X POST https://ihatemoney.org/api/projects \
|
||||
-d 'name=yay&id=yay&password=yay&contact_email=yay@notmyidea.org'
|
||||
"yay"
|
||||
|
||||
As you can see, the API retuns the identifier of the project
|
||||
|
||||
Getting information about the project
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Getting information about the project::
|
||||
|
||||
|
||||
$ curl --basic -u demo:demo https://ihatemoney.org/api/projects/demo
|
||||
{
|
||||
"name": "demonstration",
|
||||
"contact_email": "demo@notmyidea.org",
|
||||
"password": "demo",
|
||||
"id": "demo",
|
||||
"active_members": [{"activated": true, "id": 31, "name": "Arnaud"},
|
||||
{"activated": true, "id": 32, "name": "Alexis"},
|
||||
{"activated": true, "id": 33, "name": "Olivier"},
|
||||
{"activated": true, "id": 34, "name": "Fred"}],
|
||||
"members": [{"activated": true, "id": 31, "name": "Arnaud"},
|
||||
{"activated": true, "id": 32, "name": "Alexis"},
|
||||
{"activated": true, "id": 33, "name": "Olivier"},
|
||||
{"activated": true, "id": 34, "name": "Fred"}],
|
||||
}
|
||||
|
||||
|
||||
Updating a project
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Updating a project is done with the `PUT` verb::
|
||||
|
||||
$ curl --basic -u yay:yay -X PUT\
|
||||
https://ihatemoney.org/api/projects/yay -d\
|
||||
'name=yay&id=yay&password=yay&contact_email=youpi@notmyidea.org'
|
||||
|
||||
Deleting a project
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Just send a DELETE request ont the project URI ::
|
||||
|
||||
$ curl --basic -u demo:demo -X DELETE https://ihatemoney.org/api/projects/demo
|
||||
|
||||
Members
|
||||
-------
|
||||
|
||||
You can get all the members with a `GET` on `/api/projects/<id>/members`::
|
||||
|
||||
$ curl --basic -u demo:demo https://ihatemoney.org/api/projects/demo/members\
|
||||
[{"activated": true, "id": 31, "name": "Arnaud"},
|
||||
{"activated": true, "id": 32, "name": "Alexis"},
|
||||
{"activated": true, "id": 33, "name": "Olivier"},
|
||||
{"activated": true, "id": 34, "name": "Fred"}]
|
||||
|
||||
Add a member with a `POST` request on `/api/projects/<id>/members`::
|
||||
|
||||
$ curl --basic -u demo:demo -X POST\
|
||||
https://ihatemoney.org/api/projects/demo/members -d 'name=tatayoyo'
|
||||
35
|
||||
|
||||
You can also `PUT` a new version of a member (changing its name)::
|
||||
|
||||
$ curl --basic -u demo:demo -X PUT\
|
||||
https://ihatemoney.org/api/projects/demo/members/36\
|
||||
-d 'name=yeaaaaah'
|
||||
{"activated": true, "id": 36, "name": "yeaaaaah"}
|
||||
|
||||
Delete a member with a `DELETE` request on `/api/projects/<id>/members/<member-id>`::
|
||||
|
||||
$ curl --basic -u demo:demo -X DELETE\
|
||||
https://ihatemoney.org/api/projects/demo/members/35
|
||||
"OK
|
||||
|
||||
Bills
|
||||
-----
|
||||
|
||||
You can get the list of bills by doing a `GET` on `/api/projects/<id>/bills` ::
|
||||
|
||||
$ curl --basic -u demo:demo https://ihatemoney.org/api/projects/demo/bills
|
||||
|
||||
Add a bill with a `POST` query on `/api/projects/<id>/bills`. you need the
|
||||
following params:
|
||||
|
||||
* `date`: the date of the bill; defaults to current date if not provided. (yy-mm-dd)
|
||||
* `what`: what have been payed
|
||||
* `payer`: by who ? (id)
|
||||
* `payed_for`: for who ? (id, repeat the parameter to set multiple id)
|
||||
* `amount`: amount payed
|
||||
|
||||
Returns the id of the created bill ::
|
||||
|
||||
$ curl --basic -u demo:demo -X POST\
|
||||
https://ihatemoney.org/api/projects/demo/bills\
|
||||
-d "date=2011-09-10&what=raclette&payer=31&payed_for=31&amount=200"
|
||||
80
|
||||
|
||||
You can also `PUT` a new version of the bill at
|
||||
`/api/projects/<id>/bills/<bill-id>`::
|
||||
|
||||
$ curl --basic -u demo:demo -X PUT\
|
||||
https://ihatemoney.org/api/projects/demo/bills/80\
|
||||
-d "date=2011-09-10&what=raclette&payer=31&payed_for=31&amount=250"
|
||||
80
|
||||
|
||||
And you can of course `DELETE` them at `/api/projects/<id>/bills/<bill-id>`::
|
||||
|
||||
$ curl --basic -u demo:demo -X DELETE\
|
||||
https://ihatemoney.org/api/projects/demo/bills/80\
|
||||
"OK"
|
|
@ -1,20 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
import sys, os
|
||||
templates_path = ['_templates']
|
||||
source_suffix = '.rst'
|
||||
master_doc = 'index'
|
||||
|
||||
project = u'I hate money'
|
||||
copyright = u'2011, The \'I hate money\' team'
|
||||
|
||||
version = '1.0'
|
||||
release = '1.0'
|
||||
|
||||
exclude_patterns = ['_build']
|
||||
pygments_style = 'sphinx'
|
||||
|
||||
sys.path.append(os.path.abspath('_themes'))
|
||||
html_theme_path = ['_themes']
|
||||
html_theme = 'pelican'
|
||||
html_static_path = ['_static']
|
||||
html_theme_options = { 'nosidebar': True }
|
|
@ -1 +0,0 @@
|
|||
../README.rst
|
|
@ -1,170 +0,0 @@
|
|||
@ECHO OFF
|
||||
|
||||
REM Command file for Sphinx documentation
|
||||
|
||||
if "%SPHINXBUILD%" == "" (
|
||||
set SPHINXBUILD=sphinx-build
|
||||
)
|
||||
set BUILDDIR=_build
|
||||
set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% .
|
||||
if NOT "%PAPER%" == "" (
|
||||
set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
|
||||
)
|
||||
|
||||
if "%1" == "" goto help
|
||||
|
||||
if "%1" == "help" (
|
||||
:help
|
||||
echo.Please use `make ^<target^>` where ^<target^> is one of
|
||||
echo. html to make standalone HTML files
|
||||
echo. dirhtml to make HTML files named index.html in directories
|
||||
echo. singlehtml to make a single large HTML file
|
||||
echo. pickle to make pickle files
|
||||
echo. json to make JSON files
|
||||
echo. htmlhelp to make HTML files and a HTML help project
|
||||
echo. qthelp to make HTML files and a qthelp project
|
||||
echo. devhelp to make HTML files and a Devhelp project
|
||||
echo. epub to make an epub
|
||||
echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter
|
||||
echo. text to make text files
|
||||
echo. man to make manual pages
|
||||
echo. changes to make an overview over all changed/added/deprecated items
|
||||
echo. linkcheck to check all external links for integrity
|
||||
echo. doctest to run all doctests embedded in the documentation if enabled
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "clean" (
|
||||
for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
|
||||
del /q /s %BUILDDIR%\*
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "html" (
|
||||
%SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The HTML pages are in %BUILDDIR%/html.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "dirhtml" (
|
||||
%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "singlehtml" (
|
||||
%SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "pickle" (
|
||||
%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished; now you can process the pickle files.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "json" (
|
||||
%SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished; now you can process the JSON files.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "htmlhelp" (
|
||||
%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished; now you can run HTML Help Workshop with the ^
|
||||
.hhp project file in %BUILDDIR%/htmlhelp.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "qthelp" (
|
||||
%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished; now you can run "qcollectiongenerator" with the ^
|
||||
.qhcp project file in %BUILDDIR%/qthelp, like this:
|
||||
echo.^> qcollectiongenerator %BUILDDIR%\qthelp\Ihatemoney.qhcp
|
||||
echo.To view the help file:
|
||||
echo.^> assistant -collectionFile %BUILDDIR%\qthelp\Ihatemoney.ghc
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "devhelp" (
|
||||
%SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "epub" (
|
||||
%SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The epub file is in %BUILDDIR%/epub.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "latex" (
|
||||
%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "text" (
|
||||
%SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The text files are in %BUILDDIR%/text.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "man" (
|
||||
%SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The manual pages are in %BUILDDIR%/man.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "changes" (
|
||||
%SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.The overview file is in %BUILDDIR%/changes.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "linkcheck" (
|
||||
%SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Link check complete; look for any errors in the above output ^
|
||||
or in %BUILDDIR%/linkcheck/output.txt.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "doctest" (
|
||||
%SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Testing of doctests in the sources finished, look at the ^
|
||||
results in %BUILDDIR%/doctest/output.txt.
|
||||
goto end
|
||||
)
|
||||
|
||||
:end
|
13
sources/fabfile.py
vendored
|
@ -1,13 +0,0 @@
|
|||
from fabric.api import env, cd, sudo, run
|
||||
|
||||
env.hosts = ['sites.lolnet.lan']
|
||||
|
||||
|
||||
def deploy():
|
||||
with cd('/home//www/ihatemoney.org/code'):
|
||||
sudo('git pull', user="www-data")
|
||||
sudo('supervisorctl restart ihatemoney.org')
|
||||
|
||||
|
||||
def whoami():
|
||||
run('/usr/bin/whoami')
|