Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1ce449320c |
No files matched your search
@@ -1,5 +1,17 @@
|
||||
{
|
||||
"presets": [
|
||||
"next/babel"
|
||||
[
|
||||
"env",
|
||||
{
|
||||
"targets": {
|
||||
"node": "8.5.0"
|
||||
}
|
||||
}
|
||||
]
|
||||
],
|
||||
"plugins": [
|
||||
"transform-react-jsx",
|
||||
"transform-object-rest-spread",
|
||||
"transform-class-properties"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
pipeline:
|
||||
build:
|
||||
image: docker
|
||||
commands:
|
||||
- docker build -t tmshv/hudozka:latest -t tmshv/hudozka:build-${DRONE_BUILD_NUMBER} .
|
||||
- docker save -o hudozka-docker_container${DRONE_BUILD_NUMBER}.tar tmshv/hudozka:build-${DRONE_BUILD_NUMBER}
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
|
||||
scp:
|
||||
image: appleboy/drone-scp
|
||||
host: art.shlisselburg.org
|
||||
username: master
|
||||
target: ~/Hudozka
|
||||
source: hudozka-docker_container${DRONE_BUILD_NUMBER}.tar
|
||||
secrets: [scp_key]
|
||||
when:
|
||||
branch: master
|
||||
@@ -0,0 +1,2 @@
|
||||
MONGO_HUDOZKA_PASSWORD=h123
|
||||
HUDOZKA_DB_URI=mongodb://hudozka:h123@mongo:27017/hudozka?authSource=admin
|
||||
@@ -9,6 +9,10 @@ module.exports = {
|
||||
"promise",
|
||||
"react",
|
||||
],
|
||||
"globals": {
|
||||
"angular": true,
|
||||
"DISQUS": true
|
||||
},
|
||||
"rules": {
|
||||
"semi": ["error", "never"],
|
||||
"space-before-function-paren": "off",
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
---
|
||||
label: Article
|
||||
hide_body: false
|
||||
fields:
|
||||
- name: slug
|
||||
type: text
|
||||
config:
|
||||
required: false
|
||||
label: slug
|
||||
- name: tags
|
||||
type: tag_list
|
||||
default: []
|
||||
label: tags
|
||||
pages:
|
||||
- data/articles/article-test.md
|
||||
@@ -1,29 +0,0 @@
|
||||
---
|
||||
new_page_extension: md
|
||||
auto_deploy: false
|
||||
admin_path: ''
|
||||
webhook_url:
|
||||
sections:
|
||||
- type: directory
|
||||
path: data/articles
|
||||
label: Articles
|
||||
create: documents
|
||||
match: "**/*"
|
||||
- type: document
|
||||
path: data/settings.json
|
||||
label: Settings
|
||||
upload_dir: uploads
|
||||
public_path: "/uploads"
|
||||
front_matter_path: ''
|
||||
use_front_matter_path: false
|
||||
file_template: ":year:/:filename:"
|
||||
build:
|
||||
preview_command: gatsby build
|
||||
publish_command: gatsby build
|
||||
preview_output_directory: public
|
||||
output_directory: public
|
||||
instant_preview_command: npm run forestry:preview
|
||||
install_dependencies_command: yarn install
|
||||
preview_docker_image: node:10
|
||||
mount_path: "/srv"
|
||||
working_dir: "/srv"
|
||||
@@ -8,15 +8,12 @@ private*.json
|
||||
/node_modules
|
||||
/bower_components
|
||||
/modules/hudozka-api-v1/lib
|
||||
/public
|
||||
/build
|
||||
/out
|
||||
dist
|
||||
.next
|
||||
**/env
|
||||
**/venv
|
||||
**/__pycache__
|
||||
**/*.pyc
|
||||
/coverage
|
||||
**/.vscode
|
||||
*.log
|
||||
.now
|
||||
@@ -1,5 +0,0 @@
|
||||
.forestry
|
||||
./utils
|
||||
modules
|
||||
data
|
||||
uploads
|
||||
@@ -0,0 +1,27 @@
|
||||
# Build
|
||||
FROM node:10 as build
|
||||
WORKDIR /app
|
||||
|
||||
COPY package.json package-lock.json ./
|
||||
RUN npm i
|
||||
COPY webpack.config.js gulpfile.js .babelrc ./
|
||||
COPY robots.txt ./
|
||||
COPY src ./src
|
||||
RUN npm run gulp
|
||||
RUN npm run build-app
|
||||
RUN npm run out
|
||||
|
||||
|
||||
# Run
|
||||
FROM node:8-alpine
|
||||
WORKDIR /app
|
||||
|
||||
COPY package.json package-lock.json ./
|
||||
RUN npm i --production
|
||||
|
||||
COPY --from=build /app/out ./src
|
||||
COPY --from=build /app/public ./public
|
||||
|
||||
EXPOSE 3000
|
||||
|
||||
CMD npm start
|
||||
@@ -2,8 +2,6 @@
|
||||
|
||||
Site of Art school of Shlisselburg
|
||||
|
||||
Font: [«Shadow»](http://mishapanfilov.ru/font_shadow.html)
|
||||
|
||||
## Usage
|
||||
|
||||
### Build
|
||||
@@ -38,5 +36,11 @@ PWD=<mongo_password>
|
||||
mongodump -d ${DB} --gzip --archive | mongorestore -h ${HOST} -u ${USER} -p ${PWD} -d ${DB} --gzip --archive
|
||||
```
|
||||
|
||||
## Based on:
|
||||
- [NodeJS](http://nodejs.org) 10.0
|
||||
- [koa.js](http://koajs.com) 2.0
|
||||
- [React](https://react.org) 16.3
|
||||
- [MongoDB](http://mongodb.org) 3.6
|
||||
|
||||
## Contributors
|
||||
- Roman Timashev ([roman@tmshv.ru](mailto:roman@tmshv.ru))
|
||||
@@ -1,16 +0,0 @@
|
||||
---
|
||||
tags:
|
||||
- test
|
||||
- dev
|
||||
slug: article-test
|
||||
|
||||
---
|
||||
This is **Hudozka**
|
||||
|
||||

|
||||
|
||||
1. 1
|
||||
2. 2
|
||||
3. 3
|
||||
|
||||
[Устав 2015](https://app.forestry.io/sites/tadnt0fp3fdrgg/body-media//uploads/2019/Устав 2015.pdf "Устав 2015")
|
||||
@@ -1,3 +0,0 @@
|
||||
{
|
||||
"name": "Hudozka"
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
version: '3'
|
||||
volumes:
|
||||
data:
|
||||
|
||||
services:
|
||||
mongo:
|
||||
image: mongo:3.6
|
||||
restart: always
|
||||
volumes:
|
||||
- data:/data/db
|
||||
ports:
|
||||
- "1817:27017"
|
||||
environment:
|
||||
- MONGO_INITDB_ROOT_USERNAME=hudozka
|
||||
- MONGO_INITDB_ROOT_PASSWORD=${MONGO_HUDOZKA_PASSWORD}
|
||||
|
||||
app:
|
||||
restart: always
|
||||
depends_on:
|
||||
- mongo
|
||||
build:
|
||||
context: ./
|
||||
dockerfile: Dockerfile
|
||||
links:
|
||||
- mongo
|
||||
ports:
|
||||
- "1880:3000"
|
||||
environment:
|
||||
- DB_URI=${HUDOZKA_DB_URI}
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"uid": "hudozka",
|
||||
"append": true,
|
||||
"watch": false,
|
||||
"script": "index.js",
|
||||
"sourceDir": "/home/hoster/www/art.shburg.org/out",
|
||||
"wordingDir": "/home/hoster/www/art.shburg.org"
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
const gulp = require('gulp')
|
||||
const postcss = require('gulp-postcss')
|
||||
const sass = require('gulp-sass')
|
||||
const imageMin = require('gulp-imagemin')
|
||||
const concat = require('gulp-concat')
|
||||
const autoprefixer = require('autoprefixer')
|
||||
const cssnano = require('cssnano')
|
||||
|
||||
gulp.task('style', () => {
|
||||
const processors = [
|
||||
autoprefixer({
|
||||
browsers: ['last 1 version']
|
||||
}),
|
||||
cssnano({
|
||||
zindex: false
|
||||
})
|
||||
]
|
||||
|
||||
return gulp.src('./src/style/style.scss')
|
||||
.pipe(sass())
|
||||
.pipe(postcss(processors))
|
||||
.pipe(concat('style.css'))
|
||||
.pipe(gulp.dest('./public'))
|
||||
})
|
||||
|
||||
gulp.task('copy fonts', () => {
|
||||
return gulp.src('./src/assets/fonts/*/*')
|
||||
.pipe(gulp.dest('./public/fonts'))
|
||||
})
|
||||
|
||||
gulp.task('copy graphics', () => {
|
||||
return gulp.src('./src/assets/graphics/*')
|
||||
.pipe(gulp.dest('./public/graphics'))
|
||||
})
|
||||
|
||||
gulp.task('copy 3rdparty', () => {
|
||||
return gulp.src('./src/3rdparty/*')
|
||||
.pipe(gulp.dest('./public'))
|
||||
})
|
||||
|
||||
gulp.task('copy robots.txt', () => {
|
||||
return gulp.src('./robots.txt')
|
||||
.pipe(gulp.dest('./public'))
|
||||
})
|
||||
|
||||
gulp.task('copy views', () => {
|
||||
return gulp.src('./src/views/**')
|
||||
.pipe(gulp.dest('./out/views'))
|
||||
})
|
||||
|
||||
gulp.task('imagemin', () => {
|
||||
return gulp.src('./src/assets/graphics/**/*')
|
||||
.pipe(imageMin())
|
||||
.pipe(gulp.dest('./public/graphics'))
|
||||
})
|
||||
|
||||
gulp.task('copy', gulp.series('copy views', 'copy fonts', 'copy graphics', 'copy robots.txt', 'copy 3rdparty'))
|
||||
gulp.task('default', gulp.series('style', 'copy', 'imagemin'))
|
||||
@@ -0,0 +1,16 @@
|
||||
#!/bin/sh
|
||||
|
||||
dir_path="$1"
|
||||
build_file="$2"
|
||||
app="hudozka"
|
||||
script="forever.json"
|
||||
|
||||
cd ${dir_path}
|
||||
|
||||
gunzip -c ${build_file} | tar xopf -
|
||||
|
||||
#rm build.tar
|
||||
|
||||
npm install --production --loglevel error
|
||||
|
||||
echo "Deploying finish. Please restart hudozka.service manually"
|
||||
@@ -0,0 +1,27 @@
|
||||
FROM alpine:3.5
|
||||
|
||||
RUN apk add --no-cache python3 && \
|
||||
apk add --no-cache py3-lxml && \
|
||||
python3 -m ensurepip && \
|
||||
rm -r /usr/lib/python*/ensurepip && \
|
||||
pip3 install --upgrade pip setuptools && \
|
||||
rm -r /root/.cache
|
||||
|
||||
LABEL maintainer "Roman Timashev <roman@tmshv.ru>"
|
||||
|
||||
ENV INSTALL_PATH /app
|
||||
RUN mkdir -p $INSTALL_PATH
|
||||
WORKDIR /$INSTALL_PATH
|
||||
|
||||
COPY requirements.txt .
|
||||
RUN pip3 install -r requirements.txt
|
||||
|
||||
COPY app ./app
|
||||
|
||||
ENV DB_URI "mongodb://localhost:27017"
|
||||
ENV DB_USER ""
|
||||
ENV DB_PASSWORD ""
|
||||
ENV DB_NAME "hudozka"
|
||||
|
||||
EXPOSE 5000
|
||||
CMD python3 app/main.py
|
||||
@@ -0,0 +1,10 @@
|
||||
# Feed
|
||||
|
||||
Link to feed: [art.shlisselburg.org/feed](https://art.shlisselburg.org/feed)
|
||||
|
||||
## How to deploy with Docker
|
||||
|
||||
```bash
|
||||
docker build -t hudozka/feed .
|
||||
docker run -d --name hudozka-feed -p 18050:5000 -e DB_USER="<DB_USER>" -e DB_PASSWORD="<DB_PASSWORD>" -e DB_URI="<DB_URI>" hudozka/feed
|
||||
```
|
||||
@@ -0,0 +1,13 @@
|
||||
from pymongo import MongoClient
|
||||
from settings import db_uri, db_name, db_user, db_password
|
||||
|
||||
db = MongoClient(db_uri)[db_name]
|
||||
if db_user and db_password:
|
||||
auth_status = db.authenticate(db_user, db_password)
|
||||
if not auth_status:
|
||||
print('Failed to authenticate user')
|
||||
exit(1)
|
||||
|
||||
|
||||
def collection(name):
|
||||
return db[name]
|
||||
@@ -0,0 +1,39 @@
|
||||
import html
|
||||
|
||||
from feedgen.feed import FeedGenerator
|
||||
|
||||
from db import collection
|
||||
|
||||
|
||||
def get_items(collection_name, query={}):
|
||||
return list(
|
||||
collection(collection_name).find(query)
|
||||
)
|
||||
|
||||
|
||||
def get_feed():
|
||||
events = get_items('events')
|
||||
news = get_items('timeline', {'type': 'post'})
|
||||
|
||||
articles = sorted(events + news, key=lambda item: item['date'], reverse=True)
|
||||
|
||||
fg = FeedGenerator()
|
||||
fg.id('art.shlisselburg.org')
|
||||
fg.title('Шлиссельбургская ДХШ')
|
||||
fg.link(href='https://art.shlisselburg.org', rel='alternate')
|
||||
fg.logo('https://static.shlisselburg.org/art/graphics/favicon-144.png')
|
||||
fg.link(href='https://art.shlisselburg.org/feed', rel='self')
|
||||
fg.language('ru')
|
||||
|
||||
for article in articles:
|
||||
content = html.unescape(article['post'])
|
||||
article_id = article['id']
|
||||
url = 'https://art.shlisselburg.org/article/{id}'.format(id=article_id)
|
||||
|
||||
fe = fg.add_entry()
|
||||
fe.id(article_id)
|
||||
fe.title(article['title'])
|
||||
fe.content(content, None, 'CDATA')
|
||||
fe.link({'href': url})
|
||||
|
||||
return fg.atom_str(pretty=True)
|
||||
@@ -0,0 +1,5 @@
|
||||
from server import app
|
||||
from settings import host
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run(host=host)
|
||||
@@ -0,0 +1,14 @@
|
||||
from flask import Flask
|
||||
|
||||
from feed import get_feed
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
|
||||
@app.route('/')
|
||||
def root():
|
||||
feed = get_feed()
|
||||
if not feed:
|
||||
return '', 404
|
||||
|
||||
return feed
|
||||
@@ -0,0 +1,7 @@
|
||||
import os
|
||||
|
||||
db_uri = os.getenv('DB_URI', 'mongodb://localhost:27017')
|
||||
db_name = os.getenv('DB_NAME', 'hudozka')
|
||||
db_user = os.getenv('DB_USER', None)
|
||||
db_password = os.getenv('DB_PASSWORD', None)
|
||||
host = os.getenv('APP_HOST', '0.0.0.0')
|
||||
@@ -0,0 +1,5 @@
|
||||
pymongo==3.4.0
|
||||
Flask==0.12
|
||||
redis==2.10.5
|
||||
PyYAML==3.12
|
||||
feedgen==0.5.1
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
vk: {
|
||||
appId: '4202466',
|
||||
appSecret: '5NMWIbgb2ImAQeMeODEd'
|
||||
},
|
||||
outputDir: '/Users/tmshv/Yandex.Disk.localized/Hudozka/Site/Events'
|
||||
}
|
||||
@@ -0,0 +1,202 @@
|
||||
#!/usr/local/bin/python3
|
||||
|
||||
import json
|
||||
import os
|
||||
import re
|
||||
import string
|
||||
from datetime import datetime
|
||||
from functools import reduce
|
||||
from os import makedirs
|
||||
|
||||
import json5
|
||||
import sys
|
||||
|
||||
import requests
|
||||
|
||||
from utils import until, copy
|
||||
from vk import vk_init, vk_wall_get_by_id, vk_photos_get_albums, vk_photos_get
|
||||
|
||||
config = json5.load(open('config.json5', 'r'))
|
||||
vk_init(config['vk']['appId'], config['vk']['appSecret'])
|
||||
|
||||
pattern = re.compile(r'https?://vk\.com/wall([-\d]+)_(\d+)')
|
||||
ms = []
|
||||
|
||||
size_priority = ['w', 'z', 'y']
|
||||
|
||||
|
||||
# get_album_item = until(size_priority)
|
||||
|
||||
|
||||
def get_item_by_size(size, item):
|
||||
for s in item:
|
||||
if s['type'] == size:
|
||||
return s
|
||||
|
||||
return None
|
||||
|
||||
|
||||
def get_album_item(item):
|
||||
for s in size_priority:
|
||||
img = get_item_by_size(s, item)
|
||||
if img:
|
||||
return img
|
||||
return None
|
||||
|
||||
|
||||
def is_valid_url(i: str):
|
||||
return pattern.match(i) is not None
|
||||
|
||||
|
||||
def add_middleware(var: str, fn):
|
||||
ms.append((var, fn))
|
||||
|
||||
|
||||
def apply_middleware(data: str, mw: tuple):
|
||||
key, fn = mw
|
||||
value = fn(data)
|
||||
form = {}
|
||||
form[mw[0]] = ''
|
||||
data.format(**form)
|
||||
return data
|
||||
|
||||
|
||||
def apply_middlewares(output_dir, template, data):
|
||||
result = template
|
||||
for mw in ms:
|
||||
key, fn = mw
|
||||
form = {key: fn(output_dir, data)}
|
||||
result = string.Template(result)
|
||||
result = result.safe_substitute(**form)
|
||||
|
||||
return result
|
||||
|
||||
|
||||
def attach_album(output_dir, data):
|
||||
"""
|
||||
{
|
||||
'size': 13,
|
||||
'title': 'Каллиграфия 27.11.2016',
|
||||
'owner_id': -132442859,
|
||||
'updated': 1480340404,
|
||||
'description': '',
|
||||
'id': '238711857',
|
||||
'thumb': {'user_id': 100, 'access_key': '428f3dad13bdd5d730', 'owner_id': -132442859,
|
||||
'date': 1480340404,
|
||||
'photo_807': 'https://pp.vk.me/c837134/v837134463/11056/ZaoO1h5Idaw.jpg',
|
||||
'id': 456239050,
|
||||
'width': 1024, 'photo_75': 'https://pp.vk.me/c837134/v837134463/11053/aHOALfgr0VU.jpg',
|
||||
'photo_130': 'https://pp.vk.me/c837134/v837134463/11054/czcuc7o-bN4.jpg', 'text': '',
|
||||
'photo_604': 'https://pp.vk.me/c837134/v837134463/11055/P7yUE6WitSA.jpg', 'height': 683,
|
||||
'photo_1280': 'https://pp.vk.me/c837134/v837134463/11057/eLG5Akgx3fk.jpg',
|
||||
'album_id': 238711857
|
||||
},
|
||||
'created': 1480340311
|
||||
}
|
||||
:param data:
|
||||
:return:
|
||||
"""
|
||||
oid = data['owner_id']
|
||||
aid = data['id']
|
||||
|
||||
album = vk_photos_get(oid, aid)['response']['items']
|
||||
|
||||
files = []
|
||||
for file in album:
|
||||
img = get_album_item(file['sizes'])
|
||||
if img:
|
||||
files.append(img['src'])
|
||||
# files.append(file['sizes'])
|
||||
|
||||
download_files(files, output_dir)
|
||||
return '\n'.join(list(
|
||||
map(
|
||||
lambda i: '' % i,
|
||||
map(
|
||||
lambda f: os.path.basename(f),
|
||||
files
|
||||
)
|
||||
)
|
||||
))
|
||||
|
||||
|
||||
def get_date(ts: int):
|
||||
date = datetime.fromtimestamp(ts)
|
||||
return date.strftime("%Y.%m.%d")
|
||||
|
||||
|
||||
def get_folder_name(post):
|
||||
date_formatted = get_date(post['date'])
|
||||
|
||||
return '{date} vk-{owner_id}-{id}'.format(
|
||||
date=date_formatted,
|
||||
owner_id=post['owner_id'],
|
||||
id=post['id'],
|
||||
)
|
||||
|
||||
|
||||
def download_files(files, output):
|
||||
for url in files:
|
||||
file_out = os.path.join(output, os.path.basename(url))
|
||||
req = requests.get(url)
|
||||
data = req.content
|
||||
f = open(file_out, 'wb')
|
||||
f.write(data)
|
||||
f.close()
|
||||
|
||||
|
||||
attachment_types = {
|
||||
'album': attach_album
|
||||
}
|
||||
|
||||
|
||||
def get_post_attachments(output_dir, data):
|
||||
attachments = []
|
||||
for a in data['attachments']:
|
||||
a_type = a['type']
|
||||
if a_type in attachment_types:
|
||||
fn = attachment_types[a_type]
|
||||
|
||||
attachment = fn(output_dir, a[a_type])
|
||||
attachments.append(attachment)
|
||||
|
||||
return '\n'.join(attachments)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
add_middleware('id', lambda _, data: 'vk-{owner_id}-{id}'.format(
|
||||
owner_id=data['owner_id'],
|
||||
id=data['id'],
|
||||
))
|
||||
|
||||
add_middleware('date', lambda _, data: get_date(data['date']))
|
||||
add_middleware('text', lambda _, data: data['text'])
|
||||
add_middleware('attachments', get_post_attachments)
|
||||
|
||||
article_file = open('template.md', 'r', encoding='utf-8')
|
||||
article = article_file.read()
|
||||
article_file.close()
|
||||
|
||||
urls = sys.argv[1:]
|
||||
for url in urls:
|
||||
if not is_valid_url(url):
|
||||
raise Exception('Cannot perform URL %s' % url)
|
||||
|
||||
vid = '%s_%s' % pattern.findall(url)[0]
|
||||
res = vk_wall_get_by_id(vid)
|
||||
if 'response' in res:
|
||||
post = res['response'][0]
|
||||
|
||||
if 'copy_history' in post:
|
||||
copy(post['copy_history'][0], post)
|
||||
|
||||
output_dir = os.path.join(config['outputDir'], get_folder_name(post))
|
||||
makedirs(output_dir, exist_ok=True)
|
||||
|
||||
article = apply_middlewares(output_dir, article, post)
|
||||
|
||||
article_file = open(os.path.join(output_dir, 'vk.md'), 'w', encoding='utf-8')
|
||||
article_file.write(article)
|
||||
article_file.close()
|
||||
|
||||
# print(json.dumps(post, indent=4, ensure_ascii=False))
|
||||
@@ -0,0 +1,8 @@
|
||||
---
|
||||
id: ${id}
|
||||
date: ${date}
|
||||
---
|
||||
|
||||
${text}
|
||||
|
||||
${attachments}
|
||||
@@ -0,0 +1,13 @@
|
||||
def until(keys: list):
|
||||
def select(value):
|
||||
for key in keys:
|
||||
if key in value:
|
||||
return value[key]
|
||||
return None
|
||||
|
||||
return select
|
||||
|
||||
|
||||
def copy(source: dict, destination: dict):
|
||||
for k, v in source.items():
|
||||
destination[k] = v
|
||||
@@ -0,0 +1,166 @@
|
||||
import requests
|
||||
from urllib.parse import urlencode
|
||||
|
||||
client_id = '4362480'
|
||||
client_secret = 'CI8hARpbqa5amp4OfTS6'
|
||||
access_token = '39c1712d4005b24bd9faddf34b7f4647a26afb4c7b1a935ba7680b24378a9acb3e0faed5b3af8a1e7879c'
|
||||
api_version = '5.52'
|
||||
VK_API = 'https://api.vk.com/method/'
|
||||
|
||||
|
||||
def vk_init(app_id, app_secret):
|
||||
global client_id
|
||||
global client_secret
|
||||
client_id = app_id
|
||||
client_secret = app_secret
|
||||
|
||||
|
||||
def http_get(url):
|
||||
req = requests.get(url)
|
||||
return req.json()
|
||||
|
||||
|
||||
def upload_file(url, file):
|
||||
req = requests.post(url, files={'photo': file})
|
||||
return req.json()
|
||||
|
||||
|
||||
def vk_auth(client_id, redirect_uri, scope, response_type):
|
||||
q = urlencode({
|
||||
'client_id': client_id,
|
||||
'scope': ','.join(scope),
|
||||
'v': api_version,
|
||||
'redirect_uri': redirect_uri,
|
||||
'display': 'page',
|
||||
'response_type': response_type
|
||||
})
|
||||
return 'https://oauth.vk.com/authorize?' + q
|
||||
|
||||
|
||||
def vk_get_access_token(client_id, client_secret, redirect_uri, code):
|
||||
q = urlencode({
|
||||
'client_id': client_id,
|
||||
'client_secret': client_secret,
|
||||
'code': code,
|
||||
'redirect_uri': redirect_uri,
|
||||
})
|
||||
uri = 'https://oauth.vk.com/access_token?' + q
|
||||
return http_get(uri)
|
||||
|
||||
|
||||
def vk_photos_get_wall_upload_server():
|
||||
q = urlencode({
|
||||
'access_token': access_token,
|
||||
})
|
||||
uri = VK_API + 'photos.getWallUploadServer?' + q
|
||||
return http_get(uri)['response']
|
||||
|
||||
|
||||
def vk_photos_save_wall_photo(server, hash, photo):
|
||||
q = urlencode({
|
||||
'access_token': access_token,
|
||||
'v': api_version,
|
||||
'server': server,
|
||||
'hash': hash,
|
||||
'photo': photo,
|
||||
})
|
||||
uri = VK_API + 'photos.saveWallPhoto?' + q
|
||||
return http_get(uri)
|
||||
|
||||
|
||||
def vk_wall_get_by_id(ids):
|
||||
if not isinstance(ids, list):
|
||||
ids = [ids]
|
||||
|
||||
q = urlencode({
|
||||
'posts': ','.join(ids),
|
||||
'v': api_version,
|
||||
})
|
||||
uri = VK_API + 'wall.getById?{q}'.format(q=q)
|
||||
return http_get(uri)
|
||||
|
||||
|
||||
def vk_wall_post(owner_id, message, attachments):
|
||||
q = urlencode({
|
||||
'access_token': access_token,
|
||||
'v': api_version,
|
||||
'owner_id': owner_id,
|
||||
'message': message,
|
||||
'attachments': ','.join(attachments)
|
||||
})
|
||||
uri = VK_API + 'wall.post?{q}'.format(q=q)
|
||||
return http_get(uri)
|
||||
|
||||
|
||||
def vk_photos_get_albums(owner_id, album_ids):
|
||||
q = urlencode({
|
||||
'v': api_version,
|
||||
'owner_id': owner_id,
|
||||
'album_ids': ','.join(album_ids),
|
||||
'photo_sizes': '1',
|
||||
'need_covers': '1',
|
||||
})
|
||||
uri = VK_API + 'photos.getAlbums?{q}'.format(q=q)
|
||||
return http_get(uri)
|
||||
|
||||
|
||||
def vk_photos_get(owner_id, album_id):
|
||||
q = urlencode({
|
||||
'v': api_version,
|
||||
'owner_id': owner_id,
|
||||
'album_id': album_id,
|
||||
'photo_sizes': '1',
|
||||
})
|
||||
uri = VK_API + 'photos.get?{q}'.format(q=q)
|
||||
return http_get(uri)
|
||||
|
||||
if __name__ == '__main__':
|
||||
import os
|
||||
|
||||
print(os.getcwd())
|
||||
|
||||
# redirect_uri = 'http://tmshv.ru/callback'
|
||||
redirect_uri = 'http://vk.com/blank.html'
|
||||
|
||||
# print(vk_auth(client_id, redirect_uri, ['photos', 'wall', 'offline', 'messages'], 'token'))
|
||||
|
||||
# exit()
|
||||
|
||||
upload_url = vk_photos_get_wall_upload_server()['upload_url']
|
||||
print(upload_url)
|
||||
|
||||
# UPLOADING
|
||||
uploaded = upload_file(upload_url, open('1.jpg', 'rb'))
|
||||
print(uploaded)
|
||||
exit()
|
||||
|
||||
# uploaded_photo = uploaded['photo']
|
||||
saved_photo = vk_photos_save_wall_photo(**uploaded)
|
||||
print(saved_photo)
|
||||
|
||||
# {'response': [
|
||||
# {
|
||||
# 'text': '',
|
||||
# 'id': 420377937,
|
||||
# 'album_id': -14,
|
||||
# 'photo_75': 'http://cs631817.vk.me/v631817931/37c93/eiG89yDwZl4.jpg',
|
||||
# 'photo_130': 'http://cs631817.vk.me/v631817931/37c94/FDDyNTsJYYQ.jpg',
|
||||
# 'date': 1467142947,
|
||||
# 'width': 200,
|
||||
# 'owner_id': 1338931,
|
||||
# 'photo_604': 'http://cs631817.vk.me/v631817931/37c95/_TMbT8QHwAc.jpg',
|
||||
# 'height': 200}
|
||||
# ]
|
||||
# }
|
||||
|
||||
photo_id = saved_photo['response'][0]['id']
|
||||
photo_owner_id = saved_photo['response'][0]['owner_id']
|
||||
|
||||
attachment = '{type}{owner_id}_{media_id}'.format(
|
||||
type='photo',
|
||||
owner_id=photo_owner_id,
|
||||
media_id=photo_id
|
||||
)
|
||||
|
||||
post = vk_wall_post(photo_owner_id, '#api #test', [attachment])
|
||||
print(post)
|
||||
@@ -1,4 +0,0 @@
|
||||
.env
|
||||
*.tar
|
||||
node_modules
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
node_modules
|
||||
.env
|
||||
*.tar
|
||||
@@ -1,27 +0,0 @@
|
||||
# BUILD
|
||||
FROM node:12-alpine as build
|
||||
WORKDIR /app
|
||||
|
||||
COPY package.json package-lock.json ./
|
||||
RUN npm ci
|
||||
|
||||
COPY . .
|
||||
|
||||
# Building app
|
||||
RUN npm run build
|
||||
|
||||
# RUNTIME
|
||||
FROM node:12-alpine
|
||||
WORKDIR /app
|
||||
|
||||
COPY package.json package-lock.json ./
|
||||
RUN npm install --production
|
||||
|
||||
COPY --from=build /app/build ./build
|
||||
|
||||
EXPOSE 80
|
||||
ENV PORT 80
|
||||
ENV NODE_ENV production
|
||||
|
||||
# Running the app
|
||||
CMD [ "npm", "start" ]
|
||||
@@ -1,755 +0,0 @@
|
||||
{
|
||||
"name": "hudozka-api",
|
||||
"version": "1.0.0",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
"@types/body-parser": {
|
||||
"version": "1.19.0",
|
||||
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz",
|
||||
"integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@types/connect": "*",
|
||||
"@types/node": "*"
|
||||
}
|
||||
},
|
||||
"@types/bson": {
|
||||
"version": "4.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.1.tgz",
|
||||
"integrity": "sha512-K6VAEdLVJFBxKp8m5cRTbUfeZpuSvOuLKJLrgw9ANIXo00RiyGzgH4BKWWR4F520gV4tWmxG7q9sKQRVDuzrBw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@types/node": "*"
|
||||
}
|
||||
},
|
||||
"@types/classnames": {
|
||||
"version": "2.2.9",
|
||||
"resolved": "https://registry.npmjs.org/@types/classnames/-/classnames-2.2.9.tgz",
|
||||
"integrity": "sha512-MNl+rT5UmZeilaPxAVs6YaPC2m6aA8rofviZbhbxpPpl61uKodfdQVsBtgJGTqGizEf02oW3tsVe7FYB8kK14A==",
|
||||
"dev": true
|
||||
},
|
||||
"@types/connect": {
|
||||
"version": "3.4.33",
|
||||
"resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz",
|
||||
"integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@types/node": "*"
|
||||
}
|
||||
},
|
||||
"@types/express": {
|
||||
"version": "4.17.2",
|
||||
"resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.2.tgz",
|
||||
"integrity": "sha512-5mHFNyavtLoJmnusB8OKJ5bshSzw+qkMIBAobLrIM48HJvunFva9mOa6aBwh64lBFyNwBbs0xiEFuj4eU/NjCA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@types/body-parser": "*",
|
||||
"@types/express-serve-static-core": "*",
|
||||
"@types/serve-static": "*"
|
||||
}
|
||||
},
|
||||
"@types/express-serve-static-core": {
|
||||
"version": "4.17.2",
|
||||
"resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.2.tgz",
|
||||
"integrity": "sha512-El9yMpctM6tORDAiBwZVLMcxoTMcqqRO9dVyYcn7ycLWbvR8klrDn8CAOwRfZujZtWD7yS/mshTdz43jMOejbg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@types/node": "*",
|
||||
"@types/range-parser": "*"
|
||||
}
|
||||
},
|
||||
"@types/mime": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.1.tgz",
|
||||
"integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==",
|
||||
"dev": true
|
||||
},
|
||||
"@types/mongodb": {
|
||||
"version": "3.3.16",
|
||||
"resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.3.16.tgz",
|
||||
"integrity": "sha512-i1Ov36BXdp+urtPsaSvrNfCdsaVn4Ukq1m1kGyzdWB1+eg3gJ68unXU5LNmnF4EAMRFY6FXZzA7/W3NST40b8g==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@types/bson": "*",
|
||||
"@types/node": "*"
|
||||
}
|
||||
},
|
||||
"@types/node": {
|
||||
"version": "13.7.1",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.1.tgz",
|
||||
"integrity": "sha512-Zq8gcQGmn4txQEJeiXo/KiLpon8TzAl0kmKH4zdWctPj05nWwp1ClMdAVEloqrQKfaC48PNLdgN/aVaLqUrluA==",
|
||||
"dev": true
|
||||
},
|
||||
"@types/range-parser": {
|
||||
"version": "1.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz",
|
||||
"integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==",
|
||||
"dev": true
|
||||
},
|
||||
"@types/serve-static": {
|
||||
"version": "1.13.3",
|
||||
"resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.3.tgz",
|
||||
"integrity": "sha512-oprSwp094zOglVrXdlo/4bAHtKTAxX6VT8FOZlBKrmyLbNvE1zxZyJ6yikMVtHIvwP45+ZQGJn+FdXGKTozq0g==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@types/express-serve-static-core": "*",
|
||||
"@types/mime": "*"
|
||||
}
|
||||
},
|
||||
"accepts": {
|
||||
"version": "1.3.7",
|
||||
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
|
||||
"integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
|
||||
"requires": {
|
||||
"mime-types": "~2.1.24",
|
||||
"negotiator": "0.6.2"
|
||||
}
|
||||
},
|
||||
"arg": {
|
||||
"version": "4.1.3",
|
||||
"resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
|
||||
"integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
|
||||
"dev": true
|
||||
},
|
||||
"array-flatten": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
|
||||
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
|
||||
},
|
||||
"bl": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/bl/-/bl-2.2.0.tgz",
|
||||
"integrity": "sha512-wbgvOpqopSr7uq6fJrLH8EsvYMJf9gzfo2jCsL2eTy75qXPukA4pCgHamOQkZtY5vmfVtjB+P3LNlMHW5CEZXA==",
|
||||
"requires": {
|
||||
"readable-stream": "^2.3.5",
|
||||
"safe-buffer": "^5.1.1"
|
||||
}
|
||||
},
|
||||
"body-parser": {
|
||||
"version": "1.19.0",
|
||||
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
|
||||
"integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
|
||||
"requires": {
|
||||
"bytes": "3.1.0",
|
||||
"content-type": "~1.0.4",
|
||||
"debug": "2.6.9",
|
||||
"depd": "~1.1.2",
|
||||
"http-errors": "1.7.2",
|
||||
"iconv-lite": "0.4.24",
|
||||
"on-finished": "~2.3.0",
|
||||
"qs": "6.7.0",
|
||||
"raw-body": "2.4.0",
|
||||
"type-is": "~1.6.17"
|
||||
},
|
||||
"dependencies": {
|
||||
"bytes": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
|
||||
"integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
|
||||
},
|
||||
"debug": {
|
||||
"version": "2.6.9",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
||||
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
|
||||
"requires": {
|
||||
"ms": "2.0.0"
|
||||
}
|
||||
},
|
||||
"http-errors": {
|
||||
"version": "1.7.2",
|
||||
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
|
||||
"integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
|
||||
"requires": {
|
||||
"depd": "~1.1.2",
|
||||
"inherits": "2.0.3",
|
||||
"setprototypeof": "1.1.1",
|
||||
"statuses": ">= 1.5.0 < 2",
|
||||
"toidentifier": "1.0.0"
|
||||
}
|
||||
},
|
||||
"iconv-lite": {
|
||||
"version": "0.4.24",
|
||||
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
|
||||
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
|
||||
"requires": {
|
||||
"safer-buffer": ">= 2.1.2 < 3"
|
||||
}
|
||||
},
|
||||
"inherits": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
|
||||
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
|
||||
},
|
||||
"raw-body": {
|
||||
"version": "2.4.0",
|
||||
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
|
||||
"integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
|
||||
"requires": {
|
||||
"bytes": "3.1.0",
|
||||
"http-errors": "1.7.2",
|
||||
"iconv-lite": "0.4.24",
|
||||
"unpipe": "1.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"bson": {
|
||||
"version": "1.1.3",
|
||||
"resolved": "https://registry.npmjs.org/bson/-/bson-1.1.3.tgz",
|
||||
"integrity": "sha512-TdiJxMVnodVS7r0BdL42y/pqC9cL2iKynVwA0Ho3qbsQYr428veL3l7BQyuqiw+Q5SqqoT0m4srSY/BlZ9AxXg=="
|
||||
},
|
||||
"buffer-from": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
|
||||
"integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
|
||||
"dev": true
|
||||
},
|
||||
"content-disposition": {
|
||||
"version": "0.5.3",
|
||||
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
|
||||
"integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
|
||||
"requires": {
|
||||
"safe-buffer": "5.1.2"
|
||||
}
|
||||
},
|
||||
"content-type": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
|
||||
"integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
|
||||
},
|
||||
"cookie": {
|
||||
"version": "0.4.0",
|
||||
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
|
||||
"integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
|
||||
},
|
||||
"cookie-signature": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
|
||||
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
|
||||
},
|
||||
"core-util-is": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
|
||||
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
|
||||
},
|
||||
"denque": {
|
||||
"version": "1.4.1",
|
||||
"resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz",
|
||||
"integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ=="
|
||||
},
|
||||
"depd": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
|
||||
"integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
|
||||
},
|
||||
"destroy": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
|
||||
"integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
|
||||
},
|
||||
"diff": {
|
||||
"version": "4.0.2",
|
||||
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
|
||||
"integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
|
||||
"dev": true
|
||||
},
|
||||
"dotenv": {
|
||||
"version": "8.2.0",
|
||||
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
|
||||
"integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw=="
|
||||
},
|
||||
"ee-first": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
|
||||
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
|
||||
},
|
||||
"encodeurl": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
|
||||
"integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
|
||||
},
|
||||
"escape-html": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
|
||||
"integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
|
||||
},
|
||||
"etag": {
|
||||
"version": "1.8.1",
|
||||
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
|
||||
"integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
|
||||
},
|
||||
"express": {
|
||||
"version": "4.17.1",
|
||||
"resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
|
||||
"integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
|
||||
"requires": {
|
||||
"accepts": "~1.3.7",
|
||||
"array-flatten": "1.1.1",
|
||||
"body-parser": "1.19.0",
|
||||
"content-disposition": "0.5.3",
|
||||
"content-type": "~1.0.4",
|
||||
"cookie": "0.4.0",
|
||||
"cookie-signature": "1.0.6",
|
||||
"debug": "2.6.9",
|
||||
"depd": "~1.1.2",
|
||||
"encodeurl": "~1.0.2",
|
||||
"escape-html": "~1.0.3",
|
||||
"etag": "~1.8.1",
|
||||
"finalhandler": "~1.1.2",
|
||||
"fresh": "0.5.2",
|
||||
"merge-descriptors": "1.0.1",
|
||||
"methods": "~1.1.2",
|
||||
"on-finished": "~2.3.0",
|
||||
"parseurl": "~1.3.3",
|
||||
"path-to-regexp": "0.1.7",
|
||||
"proxy-addr": "~2.0.5",
|
||||
"qs": "6.7.0",
|
||||
"range-parser": "~1.2.1",
|
||||
"safe-buffer": "5.1.2",
|
||||
"send": "0.17.1",
|
||||
"serve-static": "1.14.1",
|
||||
"setprototypeof": "1.1.1",
|
||||
"statuses": "~1.5.0",
|
||||
"type-is": "~1.6.18",
|
||||
"utils-merge": "1.0.1",
|
||||
"vary": "~1.1.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
"version": "2.6.9",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
||||
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
|
||||
"requires": {
|
||||
"ms": "2.0.0"
|
||||
}
|
||||
},
|
||||
"path-to-regexp": {
|
||||
"version": "0.1.7",
|
||||
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
|
||||
"integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
|
||||
}
|
||||
}
|
||||
},
|
||||
"feed": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/feed/-/feed-4.1.0.tgz",
|
||||
"integrity": "sha512-dAXWXM8QMxZ1DRnAxDmy1MaWZFlh1Ku7TU3onbXgHrVJynsxkNGPUed1AxszVW8AXo43xExronVkIqK+ACsoBA==",
|
||||
"requires": {
|
||||
"xml-js": "^1.6.11"
|
||||
}
|
||||
},
|
||||
"finalhandler": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
|
||||
"integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
|
||||
"requires": {
|
||||
"debug": "2.6.9",
|
||||
"encodeurl": "~1.0.2",
|
||||
"escape-html": "~1.0.3",
|
||||
"on-finished": "~2.3.0",
|
||||
"parseurl": "~1.3.3",
|
||||
"statuses": "~1.5.0",
|
||||
"unpipe": "~1.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
"version": "2.6.9",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
||||
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
|
||||
"requires": {
|
||||
"ms": "2.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"forwarded": {
|
||||
"version": "0.1.2",
|
||||
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
|
||||
"integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
|
||||
},
|
||||
"fresh": {
|
||||
"version": "0.5.2",
|
||||
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
|
||||
"integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
|
||||
},
|
||||
"http-errors": {
|
||||
"version": "1.7.3",
|
||||
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz",
|
||||
"integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==",
|
||||
"requires": {
|
||||
"depd": "~1.1.2",
|
||||
"inherits": "2.0.4",
|
||||
"setprototypeof": "1.1.1",
|
||||
"statuses": ">= 1.5.0 < 2",
|
||||
"toidentifier": "1.0.0"
|
||||
}
|
||||
},
|
||||
"inherits": {
|
||||
"version": "2.0.4",
|
||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
|
||||
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
|
||||
},
|
||||
"ipaddr.js": {
|
||||
"version": "1.9.0",
|
||||
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz",
|
||||
"integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA=="
|
||||
},
|
||||
"lodash": {
|
||||
"version": "4.17.15",
|
||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
|
||||
"integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
|
||||
},
|
||||
"make-error": {
|
||||
"version": "1.3.5",
|
||||
"resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz",
|
||||
"integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==",
|
||||
"dev": true
|
||||
},
|
||||
"media-typer": {
|
||||
"version": "0.3.0",
|
||||
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
|
||||
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
|
||||
},
|
||||
"memory-pager": {
|
||||
"version": "1.5.0",
|
||||
"resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
|
||||
"integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
|
||||
"optional": true
|
||||
},
|
||||
"merge-descriptors": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
|
||||
"integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
|
||||
},
|
||||
"methods": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
|
||||
"integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
|
||||
},
|
||||
"mime": {
|
||||
"version": "1.6.0",
|
||||
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
|
||||
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
|
||||
},
|
||||
"mime-db": {
|
||||
"version": "1.43.0",
|
||||
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz",
|
||||
"integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ=="
|
||||
},
|
||||
"mime-types": {
|
||||
"version": "2.1.26",
|
||||
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz",
|
||||
"integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==",
|
||||
"requires": {
|
||||
"mime-db": "1.43.0"
|
||||
}
|
||||
},
|
||||
"mongodb": {
|
||||
"version": "3.5.3",
|
||||
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.5.3.tgz",
|
||||
"integrity": "sha512-II7P7A3XUdPiXRgcN96qIoRa1oesM6qLNZkzfPluNZjVkgQk3jnQwOT6/uDk4USRDTTLjNFw2vwfmbRGTA7msg==",
|
||||
"requires": {
|
||||
"bl": "^2.2.0",
|
||||
"bson": "^1.1.1",
|
||||
"denque": "^1.4.1",
|
||||
"require_optional": "^1.0.1",
|
||||
"safe-buffer": "^5.1.2",
|
||||
"saslprep": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"ms": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
|
||||
},
|
||||
"negotiator": {
|
||||
"version": "0.6.2",
|
||||
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
|
||||
"integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
|
||||
},
|
||||
"on-finished": {
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
|
||||
"integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
|
||||
"requires": {
|
||||
"ee-first": "1.1.1"
|
||||
}
|
||||
},
|
||||
"parseurl": {
|
||||
"version": "1.3.3",
|
||||
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
|
||||
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
|
||||
},
|
||||
"process-nextick-args": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
|
||||
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
|
||||
},
|
||||
"proxy-addr": {
|
||||
"version": "2.0.5",
|
||||
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz",
|
||||
"integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==",
|
||||
"requires": {
|
||||
"forwarded": "~0.1.2",
|
||||
"ipaddr.js": "1.9.0"
|
||||
}
|
||||
},
|
||||
"qs": {
|
||||
"version": "6.7.0",
|
||||
"resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
|
||||
"integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
|
||||
},
|
||||
"range-parser": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
|
||||
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
|
||||
},
|
||||
"readable-stream": {
|
||||
"version": "2.3.7",
|
||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
|
||||
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
|
||||
"requires": {
|
||||
"core-util-is": "~1.0.0",
|
||||
"inherits": "~2.0.3",
|
||||
"isarray": "~1.0.0",
|
||||
"process-nextick-args": "~2.0.0",
|
||||
"safe-buffer": "~5.1.1",
|
||||
"string_decoder": "~1.1.1",
|
||||
"util-deprecate": "~1.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"isarray": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
|
||||
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
|
||||
}
|
||||
}
|
||||
},
|
||||
"require_optional": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz",
|
||||
"integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==",
|
||||
"requires": {
|
||||
"resolve-from": "^2.0.0",
|
||||
"semver": "^5.1.0"
|
||||
}
|
||||
},
|
||||
"resolve-from": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz",
|
||||
"integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c="
|
||||
},
|
||||
"safe-buffer": {
|
||||
"version": "5.1.2",
|
||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
|
||||
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
|
||||
},
|
||||
"safer-buffer": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
|
||||
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
|
||||
},
|
||||
"saslprep": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz",
|
||||
"integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"sparse-bitfield": "^3.0.3"
|
||||
}
|
||||
},
|
||||
"sax": {
|
||||
"version": "1.2.4",
|
||||
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
|
||||
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
|
||||
},
|
||||
"semver": {
|
||||
"version": "5.7.1",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
|
||||
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
|
||||
},
|
||||
"send": {
|
||||
"version": "0.17.1",
|
||||
"resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
|
||||
"integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
|
||||
"requires": {
|
||||
"debug": "2.6.9",
|
||||
"depd": "~1.1.2",
|
||||
"destroy": "~1.0.4",
|
||||
"encodeurl": "~1.0.2",
|
||||
"escape-html": "~1.0.3",
|
||||
"etag": "~1.8.1",
|
||||
"fresh": "0.5.2",
|
||||
"http-errors": "~1.7.2",
|
||||
"mime": "1.6.0",
|
||||
"ms": "2.1.1",
|
||||
"on-finished": "~2.3.0",
|
||||
"range-parser": "~1.2.1",
|
||||
"statuses": "~1.5.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
"version": "2.6.9",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
||||
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
|
||||
"requires": {
|
||||
"ms": "2.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"ms": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
|
||||
}
|
||||
}
|
||||
},
|
||||
"ms": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
|
||||
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"serve-static": {
|
||||
"version": "1.14.1",
|
||||
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
|
||||
"integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
|
||||
"requires": {
|
||||
"encodeurl": "~1.0.2",
|
||||
"escape-html": "~1.0.3",
|
||||
"parseurl": "~1.3.3",
|
||||
"send": "0.17.1"
|
||||
}
|
||||
},
|
||||
"setprototypeof": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
|
||||
"integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
|
||||
},
|
||||
"sitemap": {
|
||||
"version": "1.13.0",
|
||||
"resolved": "https://registry.npmjs.org/sitemap/-/sitemap-1.13.0.tgz",
|
||||
"integrity": "sha1-Vpy+IYAgKSamKiZs094Jyc60P4M=",
|
||||
"requires": {
|
||||
"underscore": "^1.7.0",
|
||||
"url-join": "^1.1.0"
|
||||
}
|
||||
},
|
||||
"source-map": {
|
||||
"version": "0.6.1",
|
||||
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
|
||||
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
|
||||
"dev": true
|
||||
},
|
||||
"source-map-support": {
|
||||
"version": "0.5.16",
|
||||
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz",
|
||||
"integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"buffer-from": "^1.0.0",
|
||||
"source-map": "^0.6.0"
|
||||
}
|
||||
},
|
||||
"sparse-bitfield": {
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
|
||||
"integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"memory-pager": "^1.0.2"
|
||||
}
|
||||
},
|
||||
"statuses": {
|
||||
"version": "1.5.0",
|
||||
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
|
||||
"integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
|
||||
},
|
||||
"string_decoder": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
|
||||
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
|
||||
"requires": {
|
||||
"safe-buffer": "~5.1.0"
|
||||
}
|
||||
},
|
||||
"toidentifier": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
|
||||
"integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
|
||||
},
|
||||
"ts-node": {
|
||||
"version": "8.6.2",
|
||||
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.6.2.tgz",
|
||||
"integrity": "sha512-4mZEbofxGqLL2RImpe3zMJukvEvcO1XP8bj8ozBPySdCUXEcU5cIRwR0aM3R+VoZq7iXc8N86NC0FspGRqP4gg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"arg": "^4.1.0",
|
||||
"diff": "^4.0.1",
|
||||
"make-error": "^1.1.1",
|
||||
"source-map-support": "^0.5.6",
|
||||
"yn": "3.1.1"
|
||||
}
|
||||
},
|
||||
"type-is": {
|
||||
"version": "1.6.18",
|
||||
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
|
||||
"integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
|
||||
"requires": {
|
||||
"media-typer": "0.3.0",
|
||||
"mime-types": "~2.1.24"
|
||||
}
|
||||
},
|
||||
"typescript": {
|
||||
"version": "3.7.5",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.5.tgz",
|
||||
"integrity": "sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw==",
|
||||
"dev": true
|
||||
},
|
||||
"underscore": {
|
||||
"version": "1.9.2",
|
||||
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.2.tgz",
|
||||
"integrity": "sha512-D39qtimx0c1fI3ya1Lnhk3E9nONswSKhnffBI0gME9C99fYOkNi04xs8K6pePLhvl1frbDemkaBQ5ikWllR2HQ=="
|
||||
},
|
||||
"unpipe": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
|
||||
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
|
||||
},
|
||||
"url-join": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/url-join/-/url-join-1.1.0.tgz",
|
||||
"integrity": "sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg="
|
||||
},
|
||||
"util-deprecate": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
||||
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
|
||||
},
|
||||
"utils-merge": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
|
||||
"integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
|
||||
},
|
||||
"vary": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
|
||||
"integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
|
||||
},
|
||||
"xml-js": {
|
||||
"version": "1.6.11",
|
||||
"resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz",
|
||||
"integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==",
|
||||
"requires": {
|
||||
"sax": "^1.2.4"
|
||||
}
|
||||
},
|
||||
"yn": {
|
||||
"version": "3.1.1",
|
||||
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
|
||||
"integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,36 +0,0 @@
|
||||
{
|
||||
"name": "hudozka-api",
|
||||
"private": true,
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "src/server.ts",
|
||||
"scripts": {
|
||||
"start": "node build/server.js",
|
||||
"dev": "ts-node src/server.ts",
|
||||
"build": "tsc",
|
||||
"sitemap": "node scripts/sitemap.js",
|
||||
"feed": "node scripts/feed.js"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/tmshv/hudozka"
|
||||
},
|
||||
"author": "Roman Timashev",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"dotenv": "^8.2.0",
|
||||
"express": "^4.17.1",
|
||||
"feed": "^4.0.0",
|
||||
"lodash": "^4.17.15",
|
||||
"mongodb": "^3.5.3",
|
||||
"sitemap": "^1.5.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/classnames": "^2.2.9",
|
||||
"@types/express": "^4.17.2",
|
||||
"@types/mongodb": "^3.3.16",
|
||||
"@types/node": "^13.7.1",
|
||||
"ts-node": "^8.6.2",
|
||||
"typescript": "^3.7.5"
|
||||
}
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
import { getPathWaterfall } from '../lib/url'
|
||||
import { Breadcrumb } from '../types'
|
||||
import Page from '../core/Page'
|
||||
|
||||
export async function getItems(path: string): Promise<Breadcrumb> {
|
||||
const bc = getPathWaterfall(path)
|
||||
const parts = await Promise.all(bc.map(async href => {
|
||||
const resource = await Page.findByUrl(href)
|
||||
|
||||
if (!resource) {
|
||||
return null
|
||||
}
|
||||
|
||||
const name = resource.title
|
||||
|
||||
return {
|
||||
name,
|
||||
href,
|
||||
}
|
||||
}))
|
||||
|
||||
return parts.filter(Boolean)
|
||||
}
|
||||
@@ -1,51 +0,0 @@
|
||||
import { Request, Response } from 'express'
|
||||
import Document from '../core/Document'
|
||||
import { encodeFile } from '../factory/file'
|
||||
|
||||
export async function getItem(req: Request, res: Response) {
|
||||
const id = req.params.slug
|
||||
const document = await Document.findById(id)
|
||||
|
||||
if (document) {
|
||||
res.json(encodeFile(document))
|
||||
} else {
|
||||
res.status(404)
|
||||
res.json({
|
||||
error: `Resource ${id} not found`
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
export async function getAll(req: Request, res: Response) {
|
||||
const documents = await Document.find({ hidden: false })
|
||||
if (documents) {
|
||||
const items = documents
|
||||
.map(encodeFile)
|
||||
.filter(x => x.imageUrl) // skip documents without preview image; needs to be refactored
|
||||
|
||||
res.json({
|
||||
items,
|
||||
})
|
||||
} else {
|
||||
res.status(404)
|
||||
res.json({
|
||||
error: `Not found`
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
export async function getUrls(req: Request, res: Response) {
|
||||
const data = await Document.find({})
|
||||
|
||||
if (data) {
|
||||
const items = data.map(x => `/document/${x.id}`)
|
||||
res.json({
|
||||
items
|
||||
})
|
||||
} else {
|
||||
res.status(404)
|
||||
res.json({
|
||||
error: `Not found`
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
import Image from '../core/Image'
|
||||
import { encodeImage } from '../factory/image'
|
||||
import { Request, Response } from 'express'
|
||||
|
||||
export async function getItem(req: Request, res: Response) {
|
||||
const file = req.query.file
|
||||
const image = await Image.findByFile(file)
|
||||
|
||||
if (image) {
|
||||
res.json(encodeImage(image))
|
||||
} else {
|
||||
res.status(404)
|
||||
res.json({
|
||||
error: `Resource ${file} not found`
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -1,117 +0,0 @@
|
||||
import { pick } from 'lodash'
|
||||
import { Request, Response } from 'express'
|
||||
import Page from '../core/Page'
|
||||
import { dropTrailingSlash, readQueryArray, readQueryInt, readQueryString } from '../lib/url'
|
||||
import { encodePage } from '../factory/page'
|
||||
import * as breadcrumb from './breadcrumb'
|
||||
import { isArrayOk } from '../lib/array'
|
||||
|
||||
function getSort(sortBy: string) {
|
||||
if (!sortBy) {
|
||||
return null
|
||||
}
|
||||
|
||||
if (sortBy.charAt(0) === '-') {
|
||||
const key = sortBy.substr(1, sortBy.length)
|
||||
|
||||
return {
|
||||
[key]: -1,
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
[sortBy]: 1,
|
||||
}
|
||||
}
|
||||
|
||||
async function resolveItem(page: Page) {
|
||||
const breadcrumbs = await breadcrumb.getItems(page.getUrl())
|
||||
page.setBreadcrumb(breadcrumbs)
|
||||
|
||||
return page
|
||||
}
|
||||
|
||||
export async function getItem(req: Request, res: Response) {
|
||||
const pageUrl = dropTrailingSlash(req.query.page)
|
||||
const resource = await Page.findByUrl(pageUrl)
|
||||
|
||||
if (resource) {
|
||||
const page = await resolveItem(resource)
|
||||
res.json(encodePage(page))
|
||||
} else {
|
||||
res.status(404)
|
||||
res.json({
|
||||
error: `Resource ${pageUrl} not found`
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
export async function getAll(req: Request, res: Response) {
|
||||
const items = await Page.find({})
|
||||
|
||||
if (items) {
|
||||
res.json({
|
||||
items,
|
||||
})
|
||||
} else {
|
||||
res.status(404)
|
||||
res.json({
|
||||
error: `Not found`
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
export async function getByTags(req: Request, res: Response) {
|
||||
const skip = readQueryInt(req, 'skip')
|
||||
const limit = readQueryInt(req, 'limit')
|
||||
const sortBy = readQueryString(req, 'sortBy')
|
||||
const sort = getSort(sortBy)
|
||||
const fields = readQueryArray(req, 'field')
|
||||
|
||||
const tags = readQueryArray(req, 'tag')
|
||||
if (tags.length === 0) {
|
||||
res.status(400)
|
||||
return res.json({
|
||||
error: `No tags in request`
|
||||
})
|
||||
}
|
||||
|
||||
const options = { skip, limit, sort }
|
||||
const models = await Page.find({
|
||||
tags: { $in: tags },
|
||||
}, options)
|
||||
|
||||
if (models) {
|
||||
const pages = await Promise.all(models.map(resolveItem))
|
||||
const encodedItems = pages.map(encodePage)
|
||||
const items = isArrayOk(fields)
|
||||
? encodedItems.map(x => pick(x, fields))
|
||||
: encodedItems
|
||||
|
||||
res.json({
|
||||
items,
|
||||
})
|
||||
} else {
|
||||
res.status(404)
|
||||
res.json({
|
||||
error: `Not found`
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
export async function getUrls(req: Request, res: Response) {
|
||||
const data = await Page.find({})
|
||||
|
||||
if (data) {
|
||||
const items = data.map(x => x.url)
|
||||
|
||||
res.json({
|
||||
items,
|
||||
})
|
||||
} else {
|
||||
res.status(404)
|
||||
res.json({
|
||||
error: `Not found`
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
import Page from '../core/Page'
|
||||
import { Request, Response } from 'express'
|
||||
import { unique } from '../lib/array'
|
||||
|
||||
export async function getAll(req: Request, res: Response) {
|
||||
const data = await Page.find({})
|
||||
const tags = data
|
||||
.flatMap(x => x.tags)
|
||||
.filter(x => x.isValid())
|
||||
const items = unique(tags, t => t.slug)
|
||||
|
||||
if (data) {
|
||||
res.json({
|
||||
items,
|
||||
})
|
||||
} else {
|
||||
res.status(404)
|
||||
res.json({
|
||||
error: `Not found`
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
import { Collection } from 'mongodb'
|
||||
import * as db from '../db'
|
||||
|
||||
const store = new Map<string, Collection>()
|
||||
|
||||
export default class Data {
|
||||
static setStore(key: string, collection: Collection) {
|
||||
store.set(key, collection)
|
||||
}
|
||||
|
||||
static getStore<T>(key: string): Collection<T> {
|
||||
return store.get(key)
|
||||
}
|
||||
|
||||
static getCollection(name: string): Collection {
|
||||
return db.collection(name)
|
||||
}
|
||||
}
|
||||
@@ -1,68 +0,0 @@
|
||||
import Data from './Data'
|
||||
import Image from './Image'
|
||||
import { find, findOne } from '../lib/store'
|
||||
|
||||
const store = () => Data.getStore('Document')
|
||||
|
||||
export default class Document {
|
||||
static async find(query, options = {}): Promise<Document[]> {
|
||||
const items = await find(store(), query, options as any)
|
||||
|
||||
return Promise.all(items.map(processDocument))
|
||||
}
|
||||
|
||||
static async findById(id) {
|
||||
const data = await findOne(store(), { id })
|
||||
if (!data) return null
|
||||
|
||||
return processDocument(data)
|
||||
}
|
||||
|
||||
public id: any
|
||||
public hash: any
|
||||
public file: any
|
||||
public fileInfo: any
|
||||
public type: any
|
||||
public title: any
|
||||
public category: any
|
||||
public url: any
|
||||
public preview: any
|
||||
public viewUrl: any
|
||||
|
||||
constructor(data) {
|
||||
this.id = data.id
|
||||
this.hash = data.hash
|
||||
this.file = data.file
|
||||
// In the future: use fileInfo only
|
||||
this.fileInfo = data.fileInfo
|
||||
? new DocumentFile(data.fileInfo)
|
||||
: new DocumentFile(data.file)
|
||||
this.type = data.type
|
||||
this.title = data.title
|
||||
this.category = data.category
|
||||
this.url = data.url
|
||||
|
||||
this.preview = data.preview
|
||||
this.viewUrl = `/document/${this.id}`
|
||||
}
|
||||
}
|
||||
|
||||
class DocumentFile {
|
||||
public name: any
|
||||
public size: any
|
||||
|
||||
constructor(data) {
|
||||
this.name = data.name
|
||||
this.size = data.size
|
||||
}
|
||||
}
|
||||
|
||||
const processDocument = async data => {
|
||||
const imageId = data.preview
|
||||
const preview = await Image.findById(imageId)
|
||||
|
||||
return new Document({
|
||||
...data,
|
||||
preview,
|
||||
})
|
||||
}
|
||||
@@ -1,105 +0,0 @@
|
||||
import Data from './Data'
|
||||
import ImageArtifactType from './ImageArtifactType'
|
||||
import { findOne } from '../lib/store'
|
||||
import { ObjectId } from 'mongodb'
|
||||
|
||||
/**
|
||||
*
|
||||
* {a: {}, b: {}, ...} -> Map (a: Class, b: Class)
|
||||
*
|
||||
* @param Class
|
||||
* @param object
|
||||
*/
|
||||
function mapOf(Class, object) {
|
||||
return Object
|
||||
.entries(object)
|
||||
.reduce((map, i) => (
|
||||
map.set(i[0], new Class(i[1]))
|
||||
), new Map())
|
||||
}
|
||||
|
||||
const store = () => Data.getStore('Image')
|
||||
|
||||
export default class Image {
|
||||
static async findById(id: ObjectId) {
|
||||
const data = await findOne(store(), { _id: id })
|
||||
if (!data) return null
|
||||
|
||||
const artifacts = data.data
|
||||
return new Image({ ...data, artifacts })
|
||||
}
|
||||
|
||||
static async findByFile(file: string) {
|
||||
const data = await findOne(store(), { file })
|
||||
if (!data) return null
|
||||
|
||||
const artifacts = data.data
|
||||
return new Image({ ...data, artifacts })
|
||||
}
|
||||
public hash: string
|
||||
public file: string
|
||||
public artifacts: Map<string, ImageArtifact>
|
||||
|
||||
constructor({ hash, file, artifacts }) {
|
||||
this.hash = hash
|
||||
this.file = file
|
||||
|
||||
this.artifacts = mapOf(ImageArtifact, artifacts)
|
||||
}
|
||||
|
||||
getArtifact(size) {
|
||||
return this.artifacts.get(size)
|
||||
}
|
||||
|
||||
findArtifact(sizes) {
|
||||
for (let size of sizes) {
|
||||
const a = this.getArtifact(size)
|
||||
if (a) return a
|
||||
}
|
||||
|
||||
return null
|
||||
}
|
||||
|
||||
getPicture(size) {
|
||||
const retinaSize = ImageArtifactType.retina(size)
|
||||
|
||||
const a = this.getArtifact(size)
|
||||
const a2 = this.getArtifact(retinaSize)
|
||||
const srcset = !a2
|
||||
? []
|
||||
: [{
|
||||
url: a2.url,
|
||||
density: ImageArtifactType.RETINA_DENSITY,
|
||||
}]
|
||||
|
||||
return {
|
||||
src: a.url,
|
||||
width: a.width,
|
||||
height: a.height,
|
||||
set: srcset,
|
||||
}
|
||||
}
|
||||
|
||||
getSrc(): string | null {
|
||||
const a = this.getArtifact(ImageArtifactType.ORIGINAL)
|
||||
if (!a) {
|
||||
return null
|
||||
}
|
||||
|
||||
return a.url
|
||||
}
|
||||
}
|
||||
|
||||
class ImageArtifact {
|
||||
public url: string
|
||||
public size: string
|
||||
public width: number
|
||||
public height: number
|
||||
|
||||
constructor({ url, size, width, height }) {
|
||||
this.url = url
|
||||
this.size = size
|
||||
this.width = width
|
||||
this.height = height
|
||||
}
|
||||
}
|
||||
@@ -1,113 +0,0 @@
|
||||
import Data from './Data'
|
||||
import { find as storeFind, findOne, total } from '../lib/store'
|
||||
import Image from './Image'
|
||||
import { Tag } from './Tag'
|
||||
import { ObjectId } from 'mongodb'
|
||||
import { Breadcrumb } from '../types'
|
||||
|
||||
const store = () => Data.getStore('Page')
|
||||
|
||||
type PageDto = {
|
||||
[name: string]: any
|
||||
preview?: ObjectId
|
||||
images: ObjectId[]
|
||||
}
|
||||
|
||||
export default class Page {
|
||||
static async find(query, options = {}): Promise<Page[]> {
|
||||
const items = await storeFind(store(), query, options as any)
|
||||
|
||||
return Promise.all(items.map(processPage))
|
||||
}
|
||||
|
||||
static async findById(id) {
|
||||
const item = await findOne(store(), { id })
|
||||
|
||||
return !item
|
||||
? null
|
||||
: processPage(item)
|
||||
}
|
||||
|
||||
static async findByUrl(url: string) {
|
||||
const item = await findOne(store(), { url })
|
||||
|
||||
return !item
|
||||
? null
|
||||
: processPage(item)
|
||||
}
|
||||
|
||||
static async total(query = {}) {
|
||||
return total(store(), query)
|
||||
}
|
||||
|
||||
public id: any
|
||||
public hash: any
|
||||
public file: any
|
||||
public url: string
|
||||
public content: any
|
||||
public title: any
|
||||
public date: Date
|
||||
public tags: Tag[]
|
||||
public data: any
|
||||
public images: ObjectId[]
|
||||
public documents: any
|
||||
public preview?: Image
|
||||
public tokens: any[]
|
||||
public description: string
|
||||
public featured: boolean
|
||||
|
||||
private breadcrumb: Breadcrumb
|
||||
|
||||
constructor(data: { [name: string]: any }) {
|
||||
this.id = data.id
|
||||
this.hash = data.hash
|
||||
this.file = data.file
|
||||
this.url = data.url
|
||||
this.content = data.content
|
||||
this.title = data.title
|
||||
this.data = data.data
|
||||
this.date = data.date
|
||||
this.images = data.images
|
||||
this.documents = data.documents
|
||||
this.preview = data.preview
|
||||
this.tokens = data.tokens
|
||||
this.tags = (data.tags || []).map((x: string) => new Tag(x, x))
|
||||
this.featured = data.featured
|
||||
this.description = data.description
|
||||
}
|
||||
|
||||
public setBreadcrumb(value: Breadcrumb) {
|
||||
this.breadcrumb = value
|
||||
return this
|
||||
}
|
||||
|
||||
public getBreadcrumb() {
|
||||
return this.breadcrumb
|
||||
}
|
||||
|
||||
public getUrl() {
|
||||
return this.url
|
||||
}
|
||||
}
|
||||
|
||||
function firstItem<T>(items: T[] = []): T {
|
||||
return items.length
|
||||
? items[0]
|
||||
: null
|
||||
}
|
||||
|
||||
async function processPage(item: PageDto): Promise<Page> {
|
||||
let preview: Image = null
|
||||
const previewId = item.preview
|
||||
? item.preview
|
||||
: firstItem(item.images)
|
||||
|
||||
if (previewId) {
|
||||
preview = await Image.findById(previewId)
|
||||
}
|
||||
|
||||
return new Page({
|
||||
...item,
|
||||
preview,
|
||||
})
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
import { translit } from '../lib/translit'
|
||||
|
||||
export class Tag {
|
||||
public static fromCyrillic(tag: string) {
|
||||
const slug = tag
|
||||
? translit(tag).toLowerCase()
|
||||
: tag
|
||||
|
||||
return new Tag(tag, slug)
|
||||
}
|
||||
|
||||
public name: string
|
||||
public slug: string
|
||||
|
||||
constructor(name: string, slug: string) {
|
||||
this.name = name
|
||||
this.slug = slug
|
||||
}
|
||||
|
||||
public isValid() {
|
||||
return !!this.slug
|
||||
}
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
import Data from './core/Data'
|
||||
import { MongoClient, ObjectId, Db } from 'mongodb'
|
||||
|
||||
var db: Db
|
||||
|
||||
export async function connect(dbName: string, mongoUri: string) {
|
||||
if (db) {
|
||||
return db
|
||||
}
|
||||
const connection = await MongoClient.connect(mongoUri, { useUnifiedTopology: true })
|
||||
db = init(connection.db(dbName))
|
||||
return db
|
||||
}
|
||||
|
||||
export function collection(name) {
|
||||
return db.collection(name)
|
||||
}
|
||||
|
||||
export function id(i) {
|
||||
if (typeof i === 'string') return new ObjectId(i)
|
||||
else if (i instanceof ObjectId) return i
|
||||
else if (i instanceof Object) return '_id' in i ? new ObjectId(i._id) : null
|
||||
return null
|
||||
}
|
||||
|
||||
function init(db: Db) {
|
||||
console.log('INIT DB')
|
||||
|
||||
Data.setStore('Page', db.collection('pages'))
|
||||
Data.setStore('Image', db.collection('images'))
|
||||
Data.setStore('Document', db.collection('documents'))
|
||||
Data.setStore('Settings', db.collection('settings'))
|
||||
|
||||
return db
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
import ImageArtifactType from '../core/ImageArtifactType'
|
||||
|
||||
const sizes = [
|
||||
ImageArtifactType.MEDIUM,
|
||||
ImageArtifactType.BIG,
|
||||
ImageArtifactType.ORIGIN,
|
||||
]
|
||||
|
||||
export function encodeFilePreview(file, sizes) {
|
||||
const preview = file.preview
|
||||
if (!preview) return null
|
||||
|
||||
const image = preview.findArtifact(sizes)
|
||||
if (!image) return null
|
||||
|
||||
return image.url
|
||||
}
|
||||
|
||||
export function encodeFile(file) {
|
||||
const imageUrl = encodeFilePreview(file, sizes)
|
||||
const category = (file.category || '')
|
||||
.replace('Documents/', '')
|
||||
.replace('Pages/', '')
|
||||
.replace('Articles /', '')
|
||||
|
||||
return {
|
||||
imageUrl,
|
||||
category,
|
||||
title: file.title,
|
||||
fileName: file.fileInfo.name,
|
||||
fileSize: file.fileInfo.size,
|
||||
fileUrl: file.url,
|
||||
url: file.viewUrl,
|
||||
}
|
||||
}
|
||||
@@ -1,48 +0,0 @@
|
||||
import ImageArtifactType from '../core/ImageArtifactType'
|
||||
import Image from '../core/Image'
|
||||
|
||||
export type ImageArtifactDto = {
|
||||
height: number
|
||||
width: number
|
||||
src: string
|
||||
set: Array<{
|
||||
density: number
|
||||
url: string
|
||||
}>
|
||||
}
|
||||
|
||||
export type ImageDto = {
|
||||
artifacts: {
|
||||
original: ImageArtifactDto,
|
||||
large: ImageArtifactDto,
|
||||
big: ImageArtifactDto,
|
||||
medium: ImageArtifactDto,
|
||||
small: ImageArtifactDto,
|
||||
fb: ImageArtifactDto,
|
||||
},
|
||||
hash: string
|
||||
file: string
|
||||
}
|
||||
|
||||
export function encodeImage(image: Image): ImageDto {
|
||||
const artifacts = [
|
||||
ImageArtifactType.SMALL,
|
||||
ImageArtifactType.MEDIUM,
|
||||
ImageArtifactType.BIG,
|
||||
ImageArtifactType.LARGE,
|
||||
ImageArtifactType.ORIGIN,
|
||||
ImageArtifactType.ORIGINAL,
|
||||
ImageArtifactType.FACEBOOK = 'fb'
|
||||
].reduce((acc, size) => {
|
||||
return {
|
||||
...acc,
|
||||
[size]: image.getPicture(size),
|
||||
}
|
||||
}, {})
|
||||
|
||||
return {
|
||||
artifacts: artifacts as any,
|
||||
hash: image.hash,
|
||||
file: image.file,
|
||||
}
|
||||
}
|
||||
@@ -1,47 +0,0 @@
|
||||
import { encodeImage, ImageDto } from './image'
|
||||
import Page from '../core/Page'
|
||||
import { Breadcrumb } from '../types'
|
||||
import { Tag } from '../core/Tag'
|
||||
|
||||
type Token = {
|
||||
token: string
|
||||
data: any
|
||||
}
|
||||
|
||||
type PageDto = {
|
||||
id: string
|
||||
title: string
|
||||
date?: string
|
||||
url: string
|
||||
data: string
|
||||
description: string
|
||||
preview?: ImageDto
|
||||
tokens: Token[]
|
||||
tags: Tag[]
|
||||
featured: boolean
|
||||
breadcrumb: Breadcrumb
|
||||
coverSrc?: string
|
||||
}
|
||||
|
||||
export function encodePage(page: Page): PageDto {
|
||||
const preview = page.preview ? encodeImage(page.preview) : null
|
||||
const date = page.date ? page.date.toString() : null
|
||||
const breadcrumb = page.getBreadcrumb()
|
||||
|
||||
const coverSrc = page.preview ? page.preview.getSrc() : null
|
||||
|
||||
return {
|
||||
id: page.id,
|
||||
title: page.title,
|
||||
url: page.url,
|
||||
data: page.data,
|
||||
description: page.description,
|
||||
tokens: page.tokens,
|
||||
tags: page.tags,
|
||||
featured: page.featured,
|
||||
preview,
|
||||
date,
|
||||
breadcrumb,
|
||||
coverSrc,
|
||||
}
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
export function unique<T>(items: T[], key: (item: T) => string): T[] {
|
||||
const map = new Map(items.map(x => [key(x), x]))
|
||||
|
||||
return [...map.values()]
|
||||
}
|
||||
|
||||
export function ensureArray<T>(value: T | T[]): T[] {
|
||||
if (!value) {
|
||||
return []
|
||||
}
|
||||
|
||||
if (Array.isArray(value)) {
|
||||
return value
|
||||
}
|
||||
|
||||
return [value]
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* Check if array has one item at least
|
||||
*
|
||||
* @param items
|
||||
*/
|
||||
export function isArrayOk<T>(items: T[]): boolean {
|
||||
if (!Array.isArray(items)) {
|
||||
return false
|
||||
}
|
||||
|
||||
return items.length > 0
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
export async function find(collection, query, { sort, skip, limit }) {
|
||||
const cursor = collection.find(query)
|
||||
|
||||
if (sort) cursor.sort(sort)
|
||||
if (skip) cursor.skip(skip)
|
||||
if (limit) cursor.limit(limit)
|
||||
|
||||
return cursor.toArray()
|
||||
}
|
||||
|
||||
export async function findOne(collection, query) {
|
||||
return collection.findOne(query)
|
||||
}
|
||||
|
||||
export async function total(collection, query) {
|
||||
return collection
|
||||
.find(query)
|
||||
.count()
|
||||
}
|
||||
@@ -1,80 +0,0 @@
|
||||
const map = new Map<string, string>([
|
||||
['', '_'],
|
||||
|
||||
['А', 'A'],
|
||||
['а', 'a'],
|
||||
['Б', 'B'],
|
||||
['б', 'b'],
|
||||
['В', 'V'],
|
||||
['в', 'v'],
|
||||
['Г', 'G'],
|
||||
['г', 'g'],
|
||||
['Д', 'D'],
|
||||
['д', 'd'],
|
||||
['Е', 'E'],
|
||||
['е', 'e'],
|
||||
['Ё', 'E'],
|
||||
['ё', 'e'],
|
||||
['Ж', 'Zh'],
|
||||
['ж', 'zh'],
|
||||
['З', 'Z'],
|
||||
['з', 'z'],
|
||||
['И', 'I'],
|
||||
['и', 'i'],
|
||||
['Й', 'Y'],
|
||||
['й', 'y'],
|
||||
['К', 'K'],
|
||||
['к', 'k'],
|
||||
['Л', 'L'],
|
||||
['л', 'l'],
|
||||
['М', 'M'],
|
||||
['м', 'm'],
|
||||
['Н', 'N'],
|
||||
['н', 'n'],
|
||||
['О', 'O'],
|
||||
['о', 'o'],
|
||||
['П', 'P'],
|
||||
['п', 'p'],
|
||||
['Р', 'R'],
|
||||
['р', 'r'],
|
||||
['С', 'S'],
|
||||
['с', 's'],
|
||||
['Т', 'T'],
|
||||
['т', 't'],
|
||||
['У', 'U'],
|
||||
['у', 'u'],
|
||||
['Ф', 'F'],
|
||||
['ф', 'f'],
|
||||
['Х', 'Kh'],
|
||||
['х', 'kh'],
|
||||
['Ц', 'Ts'],
|
||||
['ц', 'ts'],
|
||||
['Ч', 'Ch'],
|
||||
['ч', 'ch'],
|
||||
['Ш', 'Sh'],
|
||||
['ш', 'sh'],
|
||||
['Щ', 'Sch'],
|
||||
['щ', 'sch'],
|
||||
['ь', ''],
|
||||
['Ы', 'Y'],
|
||||
['ы', 'y'],
|
||||
['ъ', ''],
|
||||
['Э', 'E'],
|
||||
['э', 'e'],
|
||||
['Ю', 'Yu'],
|
||||
['ю', 'yu'],
|
||||
['Я', 'Ya'],
|
||||
['я', 'ya'],
|
||||
])
|
||||
|
||||
export function translit(sample: string): string {
|
||||
return [...sample]
|
||||
.map(char => {
|
||||
if (map.has(char)) {
|
||||
return map.get(char)
|
||||
}
|
||||
|
||||
return ''
|
||||
})
|
||||
.join('')
|
||||
}
|
||||
@@ -1,48 +0,0 @@
|
||||
import { Request } from 'express'
|
||||
import { ensureArray } from './array'
|
||||
|
||||
export function dropTrailingSlash(path: string) {
|
||||
if (path === '/' || path === '') {
|
||||
return '/'
|
||||
}
|
||||
|
||||
const lastChar = path.charAt(path.length - 1)
|
||||
if (lastChar === '/') {
|
||||
return path.substr(0, path.length - 1)
|
||||
}
|
||||
|
||||
return path
|
||||
}
|
||||
|
||||
export function getPathWaterfall(path: string): string[] {
|
||||
const parts = path
|
||||
.split('/')
|
||||
.filter(Boolean)
|
||||
.reduce((acc, part, index, parts) => {
|
||||
const i = index + 1
|
||||
const item = `/${parts.slice(0, i).join('/')}`
|
||||
return [
|
||||
...acc,
|
||||
item
|
||||
]
|
||||
}, [])
|
||||
|
||||
return ['/', ...parts]
|
||||
}
|
||||
|
||||
export function readQueryInt(req: Request, key: string) {
|
||||
const int = (value: string | string[]) => parseInt(Array.isArray(value)
|
||||
? value[0]
|
||||
: value
|
||||
)
|
||||
|
||||
return int(req.query[key]) || 0
|
||||
}
|
||||
|
||||
export function readQueryString(req: Request, key: string) {
|
||||
return `${req.query[key]}`
|
||||
}
|
||||
|
||||
export function readQueryArray(req: Request, key: string) {
|
||||
return ensureArray(req.query[key])
|
||||
}
|
||||
@@ -1,43 +0,0 @@
|
||||
import { config } from 'dotenv'
|
||||
import express from 'express'
|
||||
import { connect } from './db'
|
||||
import * as file from './controllers/file'
|
||||
import * as page from './controllers/page'
|
||||
import * as image from './controllers/image'
|
||||
import * as tag from './controllers/tag'
|
||||
|
||||
async function main() {
|
||||
const port = process.env.PORT || '3000'
|
||||
const mongoUri = process.env.MONGO_URI
|
||||
|
||||
try {
|
||||
await connect('hudozka', mongoUri)
|
||||
|
||||
console.log('connected')
|
||||
} catch (e) {
|
||||
console.error(e.message)
|
||||
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
const app = express()
|
||||
app.get('/files', file.getAll)
|
||||
app.get('/files/urls', file.getUrls)
|
||||
app.get('/files/:slug', file.getItem)
|
||||
|
||||
app.get('/pages', page.getAll)
|
||||
app.get('/pages/urls', page.getUrls)
|
||||
app.get('/pages/tags', page.getByTags)
|
||||
app.get('/page', page.getItem)
|
||||
|
||||
app.get('/image', image.getItem)
|
||||
|
||||
app.get('/tags', tag.getAll)
|
||||
|
||||
app.listen(port, () => {
|
||||
console.log(`> Ready on http://localhost:${port}`)
|
||||
})
|
||||
}
|
||||
|
||||
config()
|
||||
main()
|
||||
@@ -1,6 +0,0 @@
|
||||
export type BreadcrumbPart = {
|
||||
name: string
|
||||
href: string
|
||||
}
|
||||
|
||||
export type Breadcrumb = BreadcrumbPart[]
|
||||
@@ -1,23 +0,0 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"outDir": "./build",
|
||||
"target": "esnext",
|
||||
"lib": [
|
||||
"esnext"
|
||||
],
|
||||
"allowJs": true,
|
||||
"skipLibCheck": true,
|
||||
"strict": false,
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"esModuleInterop": true,
|
||||
"module": "commonjs",
|
||||
"moduleResolution": "node",
|
||||
"resolveJsonModule": true
|
||||
},
|
||||
"exclude": [
|
||||
"node_modules"
|
||||
],
|
||||
"include": [
|
||||
"**/*.ts"
|
||||
]
|
||||
}
|
||||
@@ -1,34 +0,0 @@
|
||||
import lxml.html
|
||||
import re
|
||||
from markdown import markdown
|
||||
|
||||
from kazimir.figure import FigureExtension
|
||||
from kazimir.instagram import InstagramExtension
|
||||
from sync.data import request
|
||||
|
||||
def extract_files(text: str) -> [str]:
|
||||
html = markdown(text)
|
||||
post_html = lxml.html.fromstring(html)
|
||||
|
||||
images = post_html.cssselect('img')
|
||||
images = [img.get('src') for img in images]
|
||||
|
||||
return images, []
|
||||
|
||||
|
||||
def html_from_tree(tree):
|
||||
html = lxml.html.tostring(tree, encoding='unicode')
|
||||
|
||||
return html
|
||||
|
||||
|
||||
async def typo(text):
|
||||
from kazimir import artlebedev
|
||||
result = await artlebedev.typograf(text)
|
||||
if result == 'Размер текста ограничен 32 КБ':
|
||||
return text
|
||||
|
||||
return result
|
||||
# url = 'http://www.typograf.ru/webservice/'
|
||||
# params = dict(text=text)
|
||||
# return await request.post(url, params, {'chr': 'utf-8'})
|
||||
@@ -1,75 +0,0 @@
|
||||
import settings
|
||||
from sync.core import Sync
|
||||
from sync.data.fs import FSProvider
|
||||
from sync.data.yandexdisk import YDProvider
|
||||
|
||||
import asyncio
|
||||
import logging
|
||||
|
||||
from sync.models.Page import Page, PageController
|
||||
|
||||
|
||||
def init_logger(name: str, file: str):
|
||||
logger = logging.getLogger(name)
|
||||
logger.setLevel(logging.DEBUG)
|
||||
|
||||
# create file handler which logs even debug messages
|
||||
fh = logging.FileHandler(file)
|
||||
fh.setLevel(logging.DEBUG)
|
||||
|
||||
# create console handler with a higher log level
|
||||
ch = logging.StreamHandler()
|
||||
# ch.setLevel(logging.ERROR)
|
||||
ch.setLevel(logging.DEBUG)
|
||||
|
||||
# create formatter and add it to the handlers
|
||||
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
||||
fh.setFormatter(formatter)
|
||||
ch.setFormatter(formatter)
|
||||
|
||||
# add the handlers to the logger
|
||||
logger.addHandler(fh)
|
||||
logger.addHandler(ch)
|
||||
|
||||
|
||||
async def run_sync(sync: Sync, **kwargs):
|
||||
await sync.run(**kwargs)
|
||||
|
||||
|
||||
async def run(run_interval=0):
|
||||
provider = get_provider(settings.provider_name, settings.provider_root)
|
||||
controller = PageController(provider)
|
||||
|
||||
sync_pages = Sync(
|
||||
ctrl=controller,
|
||||
name='Page'
|
||||
)
|
||||
sync_pages.set_options(True, True, True)
|
||||
|
||||
while True:
|
||||
await asyncio.wait([
|
||||
run_sync(sync_pages),
|
||||
])
|
||||
|
||||
if run_interval == 0:
|
||||
break
|
||||
else:
|
||||
await asyncio.sleep(run_interval)
|
||||
|
||||
|
||||
def get_provider(provider_type, root):
|
||||
if provider_type == 'fs':
|
||||
return FSProvider(root)
|
||||
elif provider_type == 'yd':
|
||||
return YDProvider(root, settings.yandex_disk_access_token)
|
||||
return None
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
init_logger(settings.name, 'hudozka.log')
|
||||
|
||||
interval = settings.interval
|
||||
|
||||
loop = asyncio.get_event_loop()
|
||||
loop.run_until_complete(run(interval))
|
||||
loop.close()
|
||||
@@ -1,40 +0,0 @@
|
||||
import aiohttp
|
||||
from boto3 import session
|
||||
from mimetypes import MimeTypes
|
||||
import logging
|
||||
import settings
|
||||
|
||||
logger = logging.getLogger(settings.name + '.S3')
|
||||
|
||||
|
||||
async def s3_put(obj, path):
|
||||
"""
|
||||
:param obj: uploads/file.pdf
|
||||
:param path: to/to/local/file.pdf
|
||||
:return:
|
||||
"""
|
||||
logger.info('Put {}'.format(obj))
|
||||
|
||||
s = session.Session()
|
||||
client = s.client('s3', **settings.auth_s3)
|
||||
|
||||
mime = MimeTypes()
|
||||
mime_type, enc = mime.guess_type(path)
|
||||
|
||||
# Upload a file to your Space
|
||||
client.upload_file(path, 'hudozka', obj, ExtraArgs={
|
||||
'ACL': 'public-read',
|
||||
'ContentType': mime_type,
|
||||
})
|
||||
|
||||
|
||||
async def get(url):
|
||||
async with aiohttp.ClientSession as aio_session:
|
||||
res = aio_session.get(url)
|
||||
return await res.text()
|
||||
|
||||
|
||||
async def post(url, data, params={}, headers={}):
|
||||
async with aiohttp.ClientSession() as aio_session:
|
||||
async with aio_session.post(url, data=data, params=params, headers=headers) as resp:
|
||||
return await resp.text()
|
||||
@@ -1,2 +0,0 @@
|
||||
/// <reference types="next" />
|
||||
/// <reference types="next/types/global" />
|
||||
@@ -1,14 +0,0 @@
|
||||
const withCss = require('@zeit/next-css')
|
||||
const withSass = require('@zeit/next-sass')
|
||||
|
||||
module.exports = withCss(withSass({
|
||||
exportTrailingSlash: true,
|
||||
env: {
|
||||
APP_ARTICLES_PAGE_SIZE: 24,
|
||||
APP_CARD_DEFAULT_IMAGE: 'https://art.shlisselburg.org/static/img/main.jpg',
|
||||
},
|
||||
webpack(config) {
|
||||
config.resolve.modules.push(__dirname)
|
||||
return config;
|
||||
},
|
||||
}))
|
||||
@@ -0,0 +1,48 @@
|
||||
server {
|
||||
listen 443 ssl;
|
||||
charset utf-8;
|
||||
|
||||
server_name art.shlisselburg.org;
|
||||
|
||||
ssl_certificate /etc/letsencrypt/live/art.shlisselburg.org/fullchain.pem;
|
||||
ssl_certificate_key /etc/letsencrypt/live/art.shlisselburg.org/privkey.pem;
|
||||
|
||||
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
|
||||
ssl_prefer_server_ciphers on;
|
||||
ssl_ciphers AES256+EECDH:AES256+EDH:!aNULL;
|
||||
|
||||
location / {
|
||||
proxy_pass http://hudozka;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection $connection_upgrade;
|
||||
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Forwarded-For $remote_addr;
|
||||
}
|
||||
|
||||
error_log /var/log/nginx/art.shburg.error.log;
|
||||
access_log /var/log/nginx/art.shburg.access.log;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
server_name art.shlisselburg.org art.shburg.org;
|
||||
|
||||
location ^~ /.well-known/acme-challenge {
|
||||
root /home/hoster/www/art.shburg.org/public;
|
||||
}
|
||||
|
||||
location / {
|
||||
return 301 https://art.shlisselburg.org$request_uri;
|
||||
}
|
||||
}
|
||||
|
||||
map $http_upgrade $connection_upgrade {
|
||||
default upgrade;
|
||||
'' close;
|
||||
}
|
||||
|
||||
upstream hudozka {
|
||||
server localhost:1800;
|
||||
}
|
||||
@@ -1,50 +1,109 @@
|
||||
{
|
||||
"name": "hudozka",
|
||||
"private": true,
|
||||
"version": "6.10.0",
|
||||
"description": "",
|
||||
"scripts": {
|
||||
"start": "next dev",
|
||||
"build": "npm run next-build && npm run export && npm run sitemap && npm run feed",
|
||||
"next-build": "next build",
|
||||
"export": "next export -o dist",
|
||||
"sitemap": "node scripts/sitemap.js",
|
||||
"feed": "node scripts/feed.js",
|
||||
"test": "mocha --compilers js:babel-register"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/tmshv/hudozka"
|
||||
},
|
||||
"author": "Roman Timashev",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"axios": "^0.19.0",
|
||||
"classnames": "^2.2.6",
|
||||
"date-fns": "^2.10.0",
|
||||
"lodash": "^4.17.15",
|
||||
"next": "^9.2.2",
|
||||
"react": "^16.12.0",
|
||||
"react-dom": "^16.12.0",
|
||||
"sitemap": "^1.5.0",
|
||||
"use-media": "^1.4.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/classnames": "^2.2.9",
|
||||
"@types/lodash": "^4.14.149",
|
||||
"@types/node": "^12.12.12",
|
||||
"@types/react": "^16.9.12",
|
||||
"@zeit/next-css": "^1.0.1",
|
||||
"@zeit/next-sass": "^1.0.1",
|
||||
"eslint": "^4.18.2",
|
||||
"eslint-config-standard": "^6.2.1",
|
||||
"eslint-plugin-promise": "^3.8.0",
|
||||
"eslint-plugin-react": "^7.16.0",
|
||||
"eslint-plugin-standard": "^2.0.1",
|
||||
"feed": "^4.0.0",
|
||||
"mocha": "^6.2.2",
|
||||
"node-sass": "^4.13.0",
|
||||
"should": "^8.2.2",
|
||||
"typescript": "^3.7.5"
|
||||
}
|
||||
"name": "Hudozka",
|
||||
"private": true,
|
||||
"version": "4.0.0",
|
||||
"description": "",
|
||||
"main": "src/bin/www.js",
|
||||
"scripts": {
|
||||
"start": "node src/index.js",
|
||||
"build-edit": "webpack -w --env.NODE_ENV=production --env.TARGET=edit",
|
||||
"build-app": "webpack --env.NODE_ENV=production --env.TARGET=app",
|
||||
"out": "babel src/ -d out/",
|
||||
"gulp": "gulp",
|
||||
"test": "mocha --compilers js:babel-register",
|
||||
"coverage": "istanbul cover mocha -- --compilers js:babel-register"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/tmshv/hudozka"
|
||||
},
|
||||
"author": "Roman Timashev",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"@mikeljames/draft-js-drag-n-drop-upload-plugin": "^2.0.1",
|
||||
"async-file": "^2.0.2",
|
||||
"classnames": "^2.2.5",
|
||||
"co": "^4.4.0",
|
||||
"draft-js": "^0.10.5",
|
||||
"draft-js-alignment-plugin": "^2.0.3",
|
||||
"draft-js-drag-n-drop-plugin": "^2.0.3",
|
||||
"draft-js-focus-plugin": "^2.0.4",
|
||||
"draft-js-image-plugin": "^2.0.5",
|
||||
"draft-js-plugins-editor": "^2.0.8",
|
||||
"draft-js-resizeable-plugin": "^2.0.6",
|
||||
"ejson": "^2.1.2",
|
||||
"handlebars": "^4.0.5",
|
||||
"immutable": "^3.8.2",
|
||||
"instagram-node": "^0.5.1",
|
||||
"koa": "^2.5.1",
|
||||
"koa-bodyparser": "^3.0.0",
|
||||
"koa-compose": "^3.1.0",
|
||||
"koa-conditional-get": "^1.0.2",
|
||||
"koa-convert": "^1.2.0",
|
||||
"koa-cookie": "^1.0.0",
|
||||
"koa-etag": "^2.0.0",
|
||||
"koa-helmet": "^1.0.0",
|
||||
"koa-logger": "^2.0.0",
|
||||
"koa-mount": "^2.0.0",
|
||||
"koa-route": "^3.1.0",
|
||||
"koa-session": "^4.0.0",
|
||||
"koa-static": "^3.0.0",
|
||||
"markdown": "^0.5.0",
|
||||
"moment": "^2.22.2",
|
||||
"mongodb": "^2.1.14",
|
||||
"mz": "^2.4.0",
|
||||
"react": "^16.3.2",
|
||||
"react-dom": "^16.3.2",
|
||||
"react-redux": "^4.4.8",
|
||||
"react-router": "^4.2.0",
|
||||
"react-router-redux": "^4.0.8",
|
||||
"redux": "^3.7.2",
|
||||
"redux-thunk": "^2.2.0",
|
||||
"request-promise": "^2.0.1",
|
||||
"sitemap": "^1.5.0",
|
||||
"thunkify": "^2.1.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/cli": "^7.0.0-beta.47",
|
||||
"@babel/core": "^7.0.0-beta.47",
|
||||
"@babel/plugin-proposal-class-properties": "^7.0.0-beta.47",
|
||||
"@babel/polyfill": "^7.0.0-beta.47",
|
||||
"@babel/preset-env": "^7.0.0-beta.47",
|
||||
"@babel/register": "^7.0.0-beta.47",
|
||||
"autoprefixer": "^6.3.6",
|
||||
"babel-loader": "^8.0.0-beta.3",
|
||||
"babel-plugin-transform-class-properties": "^6.24.1",
|
||||
"babel-plugin-transform-object-rest-spread": "^6.26.0",
|
||||
"babel-plugin-transform-react-jsx": "^6.23.0",
|
||||
"babel-plugin-transform-regenerator": "^6.26.0",
|
||||
"babel-preset-env": "^1.7.0",
|
||||
"babel-register": "^6.26.0",
|
||||
"css-loader": "^0.28.9",
|
||||
"cssnano": "^3.4.0",
|
||||
"eslint": "^3.9.1",
|
||||
"eslint-config-standard": "^6.2.1",
|
||||
"eslint-plugin-promise": "^3.3.1",
|
||||
"eslint-plugin-react": "^7.4.0",
|
||||
"eslint-plugin-standard": "^2.0.1",
|
||||
"gulp": "^4.0.0",
|
||||
"gulp-concat": "^2.4.1",
|
||||
"gulp-if": "^2.0.0",
|
||||
"gulp-imagemin": "~2.4.0",
|
||||
"gulp-postcss": "^6.0.1",
|
||||
"gulp-rename": "^1.2.2",
|
||||
"gulp-sass": "^4.0.1",
|
||||
"gulp-uglify": "~1.5.0",
|
||||
"html-minify-loader": "~1.1.0",
|
||||
"html-webpack-plugin": "^2.30.1",
|
||||
"istanbul": "~0.4.2",
|
||||
"less": "^3.0.4",
|
||||
"less-loader": "^4.1.0",
|
||||
"mocha": "~2.4.5",
|
||||
"raw-loader": "~0.5.1",
|
||||
"should": "^8.2.2",
|
||||
"style-loader": "^0.20.2",
|
||||
"vinyl-named": "~1.1.0",
|
||||
"webpack": "^3.11.0",
|
||||
"webpack-merge": "^4.1.1"
|
||||
}
|
||||
}
|
||||
@@ -1,102 +0,0 @@
|
||||
import Head from 'next/head'
|
||||
import { App } from 'src/components/App'
|
||||
import { tail } from 'lodash'
|
||||
import { Page } from 'src/components/Page'
|
||||
import { Meta } from 'src/components/Meta'
|
||||
import { MetaBuilder } from 'src/lib/meta'
|
||||
import { createApiUrl, requestGet, IResponseItems } from 'src/next-lib'
|
||||
import { NextPage } from 'next'
|
||||
import { IBreadcumbsPart, IMeta, IPage, ITag } from 'src/types'
|
||||
|
||||
function array<T>(value: T | T[]) {
|
||||
return Array.isArray(value)
|
||||
? value
|
||||
: [value]
|
||||
}
|
||||
|
||||
type Props = {
|
||||
title: string
|
||||
tags: ITag[]
|
||||
date: string
|
||||
content: string
|
||||
breadcrumb: IBreadcumbsPart[]
|
||||
meta?: IMeta
|
||||
}
|
||||
|
||||
const Index: NextPage<Props> = props => (
|
||||
<App
|
||||
contentStyle={{
|
||||
marginTop: 'var(--size-l)',
|
||||
marginBottom: 'var(--size-xl)',
|
||||
}}
|
||||
breadcrumbs={props.breadcrumb}
|
||||
>
|
||||
<Head>
|
||||
<title>{props.title}</title>
|
||||
{!props.meta ? null : (
|
||||
<Meta meta={props.meta} />
|
||||
)}
|
||||
</Head>
|
||||
|
||||
<Page
|
||||
tags={props.tags}
|
||||
date={props.date ? new Date(props.date) : null}
|
||||
>
|
||||
{props.content}
|
||||
</Page>
|
||||
</App>
|
||||
)
|
||||
|
||||
export const unstable_getStaticProps = async (ctx: any) => {
|
||||
let slug = null
|
||||
if (ctx.query) {
|
||||
slug = '/' + array(ctx.query.slug).join('/')
|
||||
} else {
|
||||
slug = '/' + array(ctx.params.slug).join('/')
|
||||
}
|
||||
const page = await requestGet<IPage>(createApiUrl(`/api/page?page=${slug}`), null)
|
||||
if (!page) {
|
||||
throw new Error(`Not found: ${slug}`)
|
||||
}
|
||||
const description = page.description ?? undefined
|
||||
const breadcrumbSize = page?.breadcrumb?.length ?? 0
|
||||
const breadcrumb = breadcrumbSize < 2 ? null : page.breadcrumb
|
||||
const meta = (new MetaBuilder())
|
||||
.setImage(page.preview)
|
||||
.setTitle(page.title)
|
||||
.setDescription(description)
|
||||
.build()
|
||||
|
||||
return {
|
||||
props: {
|
||||
content: page.data,
|
||||
title: page.title,
|
||||
tags: page.tags,
|
||||
date: page.date,
|
||||
meta,
|
||||
breadcrumb,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export const unstable_getStaticPaths = async () => {
|
||||
const urls = await requestGet<IResponseItems<string>>(createApiUrl(`/api/pages/urls`), null)
|
||||
if (!urls) {
|
||||
return null
|
||||
}
|
||||
|
||||
return {
|
||||
paths: urls.items
|
||||
.map(path => {
|
||||
const slug = tail(path.split('/'))
|
||||
|
||||
return {
|
||||
params: {
|
||||
slug,
|
||||
},
|
||||
}
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
export default Index
|
||||
@@ -1,63 +0,0 @@
|
||||
import 'src/style.css'
|
||||
import 'src/style/content.css'
|
||||
import 'src/style/article.css'
|
||||
import 'src/style/marker/marker-table.css'
|
||||
import 'src/style/kazimir/image.css'
|
||||
import 'src/style/kazimir/video.css'
|
||||
import 'src/style/style.scss'
|
||||
|
||||
import App from 'next/app'
|
||||
import Head from 'next/head'
|
||||
import { YMetrika } from 'src/components/YMetrika'
|
||||
import { GAnalytics } from 'src/components/GAnalytics'
|
||||
|
||||
export default class MyApp extends App {
|
||||
render() {
|
||||
const { Component, pageProps } = this.props
|
||||
|
||||
return (
|
||||
<>
|
||||
<Head>
|
||||
<meta charSet="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, maximum-scale=1.0" />
|
||||
<meta name="referrer" content="unsafe-url" />
|
||||
|
||||
<meta name="google-site-verification" content="8BxOTw-Q02DS2KAdcGcnIMwiPZ58DVB18XpOfRibCcg" />
|
||||
<meta name="google-site-verification" content="A-TEemUw4hHpULUDCd6xhxfHnyRbgKtss90JGKXnSpw" />
|
||||
<meta name='yandex-verification' content='643c7dac144b9dac' />
|
||||
<meta name="msvalidate.01" content="E878301FE3E3F12D233A6B1156889601" />
|
||||
|
||||
<link rel="icon" type="image/png" href="/static/graphics/favicon-32.png" />
|
||||
<link rel="apple-touch-icon" sizes="57x57" href="/static/graphics/favicon-57.png" />
|
||||
<link rel="apple-touch-icon" sizes="72x72" href="/static/graphics/favicon-72.png" />
|
||||
<link rel="apple-touch-icon" sizes="114x114" href="/static/graphics/favicon-114.png" />
|
||||
<link rel="apple-touch-icon" sizes="144x144" href="/static/graphics/favicon-144.png" />
|
||||
|
||||
<link
|
||||
rel="alternate"
|
||||
type="application/rss+xml"
|
||||
title="Шлиссельбургская Детская Художественная Школа"
|
||||
href="/feed.xml"
|
||||
/>
|
||||
|
||||
<link href='/static/shadow-font/style.css' rel='stylesheet' />
|
||||
|
||||
{/* Opa */}
|
||||
<script src="/static/opa.js" />
|
||||
<link rel="stylesheet" href="/static/opa.css" />
|
||||
|
||||
{/* Likely */}
|
||||
<script src='/static/likely.js' />
|
||||
<link href='/static/likely.css' rel='stylesheet' />
|
||||
|
||||
{/* Instagram Embed */}
|
||||
<script async defer src="//platform.instagram.com/en_US/embeds.js" />
|
||||
|
||||
<YMetrika account={24027460} />
|
||||
<GAnalytics account={'UA-60209057-1'} />
|
||||
</Head>
|
||||
<Component {...pageProps} />
|
||||
</>
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
import { NextPage } from 'next'
|
||||
import { Wrapper } from 'src/components/Wrapper'
|
||||
import { NotFound } from 'src/components/NotFound'
|
||||
import { Copyright } from 'src/components/Copyright'
|
||||
import { Block } from 'src/components/Block'
|
||||
import { Spacer } from 'src/components/Spacer'
|
||||
|
||||
const Page: NextPage = () => (
|
||||
<Wrapper
|
||||
header={null}
|
||||
footer={(
|
||||
<Block as={'footer'} direction={'horizontal'}>
|
||||
<Spacer />
|
||||
<Copyright />
|
||||
<Spacer />
|
||||
</Block>
|
||||
)}
|
||||
>
|
||||
<NotFound />
|
||||
</Wrapper>
|
||||
)
|
||||
|
||||
export default Page
|
||||
@@ -1,136 +0,0 @@
|
||||
import Head from 'next/head'
|
||||
import { App } from 'src/components/App'
|
||||
import { Meta } from 'src/components/Meta'
|
||||
import { meta } from 'src/lib/meta'
|
||||
import { IMeta, IPage, ImageSize } from 'src/types'
|
||||
import { createApiUrl, requestGet } from 'src/next-lib'
|
||||
import { NextPage, NextPageContext } from 'next'
|
||||
import { CardGrid } from 'src/components/CardGrid'
|
||||
import { Card } from 'src/components/Card'
|
||||
import { Block } from 'src/components/Block'
|
||||
import { Image } from 'src/components/Image'
|
||||
import { imageSrcSet } from 'src/lib/image'
|
||||
|
||||
const persons = [
|
||||
'/teacher/mg-timasheva',
|
||||
'/teacher/va-sarzhin',
|
||||
'/teacher/od-gogoleva',
|
||||
'/teacher/nv-andreeva',
|
||||
'/teacher/vv-voronova',
|
||||
'/teacher/ea-burovtseva',
|
||||
'/teacher/sa-latipova',
|
||||
'/teacher/iv-khramov',
|
||||
'/teacher/ma-khramova',
|
||||
// АС Тимашева
|
||||
// ЕЮ Тарасова
|
||||
// ИН Втюрина
|
||||
// МЮ Валькова
|
||||
// РК Тимашев
|
||||
]
|
||||
|
||||
type CardData = {
|
||||
title: string
|
||||
caption?: string
|
||||
imageSrc: string
|
||||
imageAlt: string
|
||||
imageSrcSet: string
|
||||
href: string
|
||||
}
|
||||
|
||||
type Props = {
|
||||
title: string
|
||||
meta: IMeta
|
||||
data: CardData[]
|
||||
}
|
||||
|
||||
const Page: NextPage<Props> = props => {
|
||||
if (!props.data) {
|
||||
console.log('kek error')
|
||||
return
|
||||
}
|
||||
|
||||
const src = 'https://art.shlisselburg.org/static/img/collective.jpg'
|
||||
const srcSet = imageSrcSet(src, [ImageSize.big, ImageSize.large, ImageSize.medium, ImageSize.small])
|
||||
|
||||
return (
|
||||
<App
|
||||
showAuthor={true}
|
||||
wide={true}
|
||||
>
|
||||
<Head>
|
||||
<title>{props.title}</title>
|
||||
<Meta meta={props.meta} />
|
||||
</Head>
|
||||
|
||||
<Image
|
||||
src={src}
|
||||
srcSet={srcSet}
|
||||
style={{
|
||||
marginBottom: 'var(--size-l)',
|
||||
borderRadius: 'var(--radius)',
|
||||
}}
|
||||
/>
|
||||
|
||||
<CardGrid style={{
|
||||
marginBottom: 'var(--size-xl)',
|
||||
}}>
|
||||
{props.data.map(item => (
|
||||
<Card
|
||||
key={item.href}
|
||||
layout={'featured'}
|
||||
img={{
|
||||
src: item.imageSrc,
|
||||
alt: item.imageAlt,
|
||||
srcSet: item.imageSrcSet,
|
||||
}}
|
||||
href={item.href}
|
||||
>
|
||||
<Block direction={'vertical'}>
|
||||
<span>{item.title}</span>
|
||||
<span style={{
|
||||
paddingTop: 'var(--size-s)',
|
||||
fontSize: 'var(--font-size-second)',
|
||||
}}>
|
||||
{item.caption}
|
||||
</span>
|
||||
</Block>
|
||||
</Card>
|
||||
))}
|
||||
</CardGrid>
|
||||
</App>
|
||||
)
|
||||
}
|
||||
|
||||
export const unstable_getStaticProps = async (ctx: NextPageContext) => {
|
||||
const title = 'Преподаватели Шлиссельбургской ДХШ'
|
||||
const pages = await Promise.all(persons
|
||||
.map(page => requestGet<IPage>(createApiUrl(`/api/page?page=${page}`), null))
|
||||
)
|
||||
const data: CardData[] = pages
|
||||
.filter(Boolean)
|
||||
.map(x => {
|
||||
const image = x.preview.artifacts.large
|
||||
|
||||
return {
|
||||
title: x.title,
|
||||
caption: x.description,
|
||||
href: x.url,
|
||||
imageAlt: title,
|
||||
imageSrc: image.src,
|
||||
imageSrcSet: imageSrcSet(image.src, [ImageSize.medium, ImageSize.small])
|
||||
}
|
||||
})
|
||||
|
||||
return {
|
||||
props: {
|
||||
data,
|
||||
title,
|
||||
meta: meta({
|
||||
title,
|
||||
description: 'Преподаватели Шлиссельбургской ДХШ',
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export default Page
|
||||
@@ -1,71 +0,0 @@
|
||||
import React from 'react'
|
||||
import Head from 'next/head'
|
||||
import { App } from 'src/components/App'
|
||||
import Document from 'src/components/Document'
|
||||
import { Share } from 'src/components/Share'
|
||||
import { meta } from 'src/lib/meta'
|
||||
import { Meta } from 'src/components/Meta'
|
||||
import { createApiUrl, requestGet, IResponseItems } from 'src/next-lib'
|
||||
import { NextPage } from 'next'
|
||||
import { IMeta } from 'src/types'
|
||||
|
||||
type Props = {
|
||||
data: any //(file)
|
||||
meta: IMeta
|
||||
}
|
||||
|
||||
const Page: NextPage<Props> = props => {
|
||||
if (!props.data) {
|
||||
console.log('kek error', props)
|
||||
|
||||
return null
|
||||
}
|
||||
|
||||
return (
|
||||
<App
|
||||
showAuthor={true}
|
||||
>
|
||||
<Head>
|
||||
<title>{props.data.title}</title>
|
||||
<Meta meta={props.meta} />
|
||||
</Head>
|
||||
<Document {...props.data} />
|
||||
<Share />
|
||||
</App>
|
||||
)
|
||||
}
|
||||
|
||||
export const unstable_getStaticProps = async (ctx: any) => {
|
||||
const id = ctx.params.slug
|
||||
const data = await requestGet(createApiUrl(`/api/files/${id}`), {})
|
||||
|
||||
return {
|
||||
props: {
|
||||
data,
|
||||
meta: meta({
|
||||
// title: file.meta,
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export const unstable_getStaticPaths = async () => {
|
||||
const urls = await requestGet<IResponseItems<string>>(createApiUrl(`/api/files/urls`), null)
|
||||
if (!urls) {
|
||||
return null
|
||||
}
|
||||
|
||||
return {
|
||||
paths: urls.items
|
||||
.map(x => x.replace('/document/', ''))
|
||||
.map(slug => {
|
||||
return {
|
||||
params: {
|
||||
slug,
|
||||
},
|
||||
}
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
export default Page
|
||||
@@ -1,62 +0,0 @@
|
||||
import Head from 'next/head'
|
||||
import { App } from 'src/components/App'
|
||||
import { Meta } from 'src/components/Meta'
|
||||
import { PageGrid } from 'src/components/PageGrid'
|
||||
import { HudozkaTitle } from 'src/components/HudozkaTitle'
|
||||
import { MetaBuilder } from 'src/lib/meta'
|
||||
import { getPagesCardsByTags } from 'src/rest'
|
||||
import { NextPage } from 'next'
|
||||
import { IMeta, PageCardData } from 'src/types'
|
||||
|
||||
interface IProps {
|
||||
title: string
|
||||
meta: IMeta
|
||||
items: PageCardData[]
|
||||
}
|
||||
|
||||
const Index: NextPage<IProps> = props => (
|
||||
<App
|
||||
showAuthor={true}
|
||||
wide={true}
|
||||
>
|
||||
<Head>
|
||||
<title>{props.title}</title>
|
||||
<Meta meta={props.meta} />
|
||||
</Head>
|
||||
|
||||
<HudozkaTitle
|
||||
style={{
|
||||
marginBottom: 'var(--size-l)'
|
||||
}}
|
||||
/>
|
||||
|
||||
<PageGrid
|
||||
items={props.items}
|
||||
/>
|
||||
</App>
|
||||
)
|
||||
|
||||
export const unstable_getStaticProps = async () => {
|
||||
const items = await getPagesCardsByTags([
|
||||
'event',
|
||||
'album',
|
||||
'post',
|
||||
])
|
||||
const title = 'Шлиссельбургская ДХШ'
|
||||
const meta = (new MetaBuilder())
|
||||
.setTitle(title)
|
||||
.setData({
|
||||
url: '/',
|
||||
})
|
||||
.build()
|
||||
|
||||
return {
|
||||
props: {
|
||||
items,
|
||||
title,
|
||||
meta,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export default Index
|
||||
|
Before Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 7.9 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 131 KiB |
|
Before Width: | Height: | Size: 3.1 MiB |
|
Before Width: | Height: | Size: 772 KiB |
@@ -1,713 +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>
|
||||
<metadata>
|
||||
Created by FontForge 20090622 at Wed May 4 16:42:32 2016
|
||||
By deploy user
|
||||
</metadata>
|
||||
<defs>
|
||||
<font id="Shadow-Regular" horiz-adv-x="729" >
|
||||
<font-face
|
||||
font-family="Shadow"
|
||||
font-weight="400"
|
||||
font-stretch="normal"
|
||||
units-per-em="1000"
|
||||
panose-1="0 0 0 0 0 0 0 0 0 0"
|
||||
ascent="750"
|
||||
descent="-250"
|
||||
x-height="635"
|
||||
cap-height="638.5"
|
||||
bbox="-64.1538 -251 1003 860"
|
||||
underline-thickness="50"
|
||||
underline-position="-50"
|
||||
unicode-range="U+000D-U+20B4"
|
||||
/>
|
||||
<missing-glyph horiz-adv-x="500"
|
||||
/>
|
||||
<glyph glyph-name=".notdef" horiz-adv-x="500"
|
||||
/>
|
||||
<glyph glyph-name="NULL" horiz-adv-x="0"
|
||||
/>
|
||||
<glyph glyph-name="NULL" horiz-adv-x="0"
|
||||
/>
|
||||
<glyph glyph-name="nonmarkingreturn" unicode="
" horiz-adv-x="500"
|
||||
/>
|
||||
<glyph glyph-name="space" unicode=" " horiz-adv-x="323"
|
||||
/>
|
||||
<glyph glyph-name="uni0418" unicode="И" horiz-adv-x="750"
|
||||
d="M7 616q0 18 4.5 21.5t23.5 1.5q20 -2 40.5 -1.5t40.5 -0.5q12 0 24.5 1t25.5 -1q15 -2 20.5 -8.5t5.5 -22.5q1 -5 0.5 -9.5t-0.5 -9.5v-264v-13.5t1 -13.5q0 -7 5 -9q6 0 9 5q4 3 7 7t5 8q51 71 100.5 148.5t99.5 147.5q12 20 28 28.5t43 7.5q26 -3 53.5 -2t53.5 0
|
||||
q24 -2 31 -9t6 -31q-2 -102 -1.5 -209.5t-1.5 -209.5q-1 -39 0 -73.5t2 -73.5q0 -7 0.5 -12t-0.5 -12q-1 -9 -6 -14.5t-15 -3.5q-32 1 -65 2.5t-66 0.5q-7 0 -14 0.5t-13 3.5q-4 2 -7.5 7t-3.5 10q2 37 0 80t0 80q1 37 1 73.5t1 73.5q0 2 -1 6t-5 4q-3 0 -4.5 -2t-3.5 -4
|
||||
q-48 -59 -96 -127.5t-88 -134.5l-15.5 -24l-15.5 -24q-9 -15 -22 -19t-29 -6q-12 -1 -23.5 -0.5t-23.5 0.5q-20 1 -40.5 -0.5t-40.5 0.5q-23 2 -27.5 8t-3.5 30q2 37 2.5 73.5t0.5 73.5q0 38 -1 75.5l-2 75.5l0.5 15t0.5 39v55v63.5v63.5v55z" />
|
||||
<glyph glyph-name="uni0413" unicode="Г" horiz-adv-x="542"
|
||||
d="M8 293v50t-0.5 61l-1 64t-1 58.5t-1 44.5t-0.5 23v15t1 15q0 17 19 18q21 0 54.5 0.5t73 0.5h81h77.5t63.5 -0.5t38.5 -0.5q18 0 22 -4t6 -22q3 -31 2 -58.5t2 -58.5q2 -16 -2 -21.5t-19 -7.5q-6 -1 -33 -1.5t-61.5 -0.5t-69 -0.5t-56.5 -0.5q-16 0 -16 -17
|
||||
q0 -4 -0.5 -7.5t-0.5 -7.5q1 -75 0 -156t1 -156q1 -23 0.5 -40t0.5 -40q1 -14 -2 -31q-3 -15 -19 -15q-38 -2 -72.5 -2.5t-71.5 -1.5q-8 0 -10.5 4t-3.5 10q-1 7 -1 13.5v13.5v130t-1 129h1z" />
|
||||
<glyph glyph-name="uni041F" unicode="П" horiz-adv-x="688"
|
||||
d="M561 353q-2 -58 -3 -115l-2 -114q-1 -26 0.5 -47.5t2.5 -47.5q0 -15 -3.5 -19.5t-17.5 -5.5l-65.5 -4t-65.5 -3q-19 -1 -19 23q0 38 0.5 70.5t0.5 70.5q0 63 0.5 124.5t-0.5 123.5q0 27 -1 39t-6 16.5t-17 4t-34 0.5q-29 1 -58 1.5t-58 -0.5q-19 0 -23.5 -4.5t-4.5 -21.5
|
||||
v-175q1 -58 1.5 -116t1.5 -116q0 -5 -1 -8q-1 -13 -2 -20t-5 -10t-11 -3.5t-20 -0.5q-28 1 -56 1.5t-56 3.5q-22 2 -27 8.5t-5 28.5v450v133q0 14 3 16t18 1q48 -2 94.5 -1.5t94.5 0.5q66 -1 129 2t127 0q16 0 31 -0.5t31 -0.5q15 0 18.5 -3t3.5 -18v-93q0 -21 0.5 -50
|
||||
l1 -56t1.5 -45.5z" />
|
||||
<glyph glyph-name="uni0422" unicode="Т" horiz-adv-x="614"
|
||||
d="M468 637q7 -1 13.5 -1t13.5 -2q20 -3 25 -8t5 -26q0 -26 -0.5 -47t-1.5 -47q-1 -17 -5 -21t-20 -3q-12 0 -30.5 -0.5t-36.5 -0.5t-32.5 -0.5t-17.5 -0.5q-15 0 -23.5 -1t-12 -5t-4 -12t0.5 -23v-32.5t-1 -75.5t-1.5 -97.5t-1.5 -97.5t-1.5 -75t-0.5 -31q-3 -30 -32 -31
|
||||
h-21.5h-26t-22.5 0.5t-12 0.5q-16 0 -25 0.5t-13 4.5t-5 12.5t-1 24.5v33t0.5 60t1 77l1 83t0.5 77.5v61.5v27q1 17 -19 19q-13 0 -34 1t-41.5 1.5t-37 1.5t-19.5 1q-15 1 -20 6t-5 20v39t1 39v12q0 9 -1 19t4 16q3 5 13.5 3.5t19.5 -1.5q13 0 46.5 0.5t76.5 0.5t91 -0.5
|
||||
t91 -0.5t76 -0.5t45 -0.5z" />
|
||||
<glyph glyph-name="uni0428" unicode="Ш" horiz-adv-x="969"
|
||||
d="M255 -2q-51 1 -101 1.5t-101 1.5q-10 0 -15 1q-17 2 -22.5 8.5t-5.5 23.5q-2 69 -1 136t0 136q-1 55 -0.5 110t0.5 111q1 23 0 37t-2 37q0 7 1 13t2 13q5 15 20 14q10 -1 26 -1.5t32.5 -0.5t30 0.5t16.5 0.5q13 1 21 0t12.5 -4.5t6.5 -11t3 -20.5q5 -62 4 -118t1 -119
|
||||
q1 -42 -1 -86t0 -86q1 -14 4.5 -17.5t18.5 -4.5q25 -2 54 -0.5t53 0.5t29 3.5t4 27.5q0 38 -1 75.5t-1 75.5q0 54 0.5 106.5t0.5 106.5q0 16 1 26.5t-1 26.5q-2 20 16 20q34 -2 65.5 0t65.5 -1q14 -2 18 -7t4 -22q1 -87 1 -172.5v-172.5q0 -19 0.5 -37.5t1.5 -36.5
|
||||
q1 -14 5.5 -18t18.5 -4q27 -1 54 -0.5t55 0.5q17 0 17 16v55q-1 41 -0.5 81t-1.5 82q-2 50 -2.5 98.5t-2.5 98.5q0 4 -0.5 7.5t-0.5 8.5q0 11 4.5 15.5t16.5 4.5h60t61 -1q11 -1 17 -6t7 -22q3 -97 4.5 -193.5t-3.5 -194.5q-2 -45 -0.5 -87.5t1.5 -87.5q0 -31 -8.5 -39
|
||||
t-38.5 -8q-17 0 -59.5 -0.5t-97 -0.5h-115.5h-113.5t-90.5 0.5t-48 0.5z" />
|
||||
<glyph glyph-name="uni0420" unicode="Р" horiz-adv-x="614"
|
||||
d="M6 483q1 36 1.5 63.5t1.5 62.5q0 10 0.5 16t3.5 9t8.5 4t15.5 2q8 1 15.5 0.5t15.5 -0.5q11 0 23 0.5t23 0.5q7 0 23 0.5t34 2t34.5 2t23.5 0.5q20 -2 39 -3.5t38 -3.5q45 -5 81.5 -25t70.5 -47q5 -4 8.5 -8t8.5 -9q24 -22 35.5 -43.5t13.5 -44.5t-3 -48t-14 -55
|
||||
q-21 -67 -60 -104t-102 -56q-35 -11 -70.5 -13t-72.5 0q-23 2 -28 -2.5t-6 -27.5q-1 -34 -0.5 -68t0.5 -68q0 -20 -5 -25t-26 -4l-55.5 2l-56.5 2q-19 1 -20 23q-1 27 -1 54v54v202v17v41t0.5 50.5t1.5 46.5zM230 495q-8 0 -17 -0.5t-17 -0.5q-9 -1 -14.5 -4.5t-6.5 -13.5
|
||||
q0 -29 -0.5 -60t-1.5 -60q0 -15 16 -17q36 -4 70 0.5t66 21.5q18 10 28 26q8 12 10 28.5t-3 31.5t-16 26.5t-29 14.5q-11 2 -25 3.5t-27.5 2.5t-23 1h-9.5z" />
|
||||
<glyph glyph-name="uni041C" unicode="М" horiz-adv-x="979"
|
||||
d="M5 622q0 12 3.5 16t16.5 5q15 1 40.5 1t51 -1t45 -1t24.5 1q18 4 25 -12q28 -58 52.5 -103l47 -84.5l44.5 -77.5l45 -81q8 -15 17 -26q7 -11 15 0l102 165l23.5 40l31.5 56l29 53.5l17 32.5q16 36 55 33q30 -2 60 -2.5t60 -1.5q10 0 19 -3q8 -2 13 -6.5t5 -14.5
|
||||
q0 -41 1 -81.5l2 -81.5q2 -66 2.5 -132t2.5 -132l2 -81l2 -82q1 -18 -7 -25t-25 -6l-105 3q-12 0 -19 1t-10 4t-3.5 9t-0.5 18q0 68 -0.5 131.5t-0.5 132.5v9.5t-1 9.5t-1.5 11t-4.5 6q-3 1 -9.5 -7.5t-8.5 -10.5l-85.5 -128.5t-78.5 -131.5q-2 -3 -3.5 -6.5t-3.5 -6.5
|
||||
q-10 -16 -15 -25t-11 -12.5t-16 -4t-30 -0.5q-30 1 -59 0q-26 -3 -34 23l-5.5 15t-5.5 14q-11 25 -22 46t-22 46l-16.5 35.5l-16.5 35.5q-6 13 -11.5 26.5t-12.5 26.5q-5 11 -13.5 26t-12.5 15q-1 0 -1.5 -14.5t-0.5 -38v-53.5t0.5 -60l1 -57.5t0.5 -47.5v-11t-1 -12
|
||||
q-3 -21 -24 -19q-32 1 -63.5 0t-63.5 1q-18 1 -22.5 5.5t-5.5 21.5q-1 29 -1 53t-1 53q-1 39 -1.5 77.5t-0.5 77.5q0 13 0.5 25.5t0.5 24.5v15v39.5v56v64.5t-0.5 64t-0.5 56z" />
|
||||
<glyph glyph-name="uni041E" unicode="О"
|
||||
d="M654 323q-2 -46 -20 -97.5t-51 -101.5q-35 -51 -83 -82t-103 -52q-16 -6 -34.5 -10t-37.5 -5.5t-37.5 -0.5t-34.5 5q-18 4 -46 15.5t-60 29t-64 41.5t-58 54q-23 27 -34.5 59.5t-13.5 68.5q-3 54 4.5 106t30.5 102q12 26 32 54.5t51 54.5t74 48t102 36q29 6 65.5 5
|
||||
t74.5 -11q28 -7 56.5 -22t53.5 -33t44 -36.5t30 -32.5q31 -40 44.5 -86t14.5 -109zM302 154q27 -1 48.5 2.5t41.5 14.5q51 32 73 79t11 106q-5 29 -20.5 53t-38.5 41t-50.5 25t-56.5 4t-55.5 -12.5t-45.5 -31.5q-37 -42 -51 -91.5t1 -106.5q3 -10 10.5 -20t15.5 -17
|
||||
q27 -22 56.5 -35t60.5 -11z" />
|
||||
<glyph glyph-name="uni0429" unicode="Щ" horiz-adv-x="1083"
|
||||
d="M340 617q0 15 3 19.5t18 4.5q30 1 60 0.5t60 -1.5q17 0 17 -20q0 -44 0.5 -84t-0.5 -84q0 -66 -0.5 -132t-0.5 -132q-1 -17 2.5 -21t20.5 -5q29 -1 58.5 -1h58.5q13 0 20 1t10.5 4.5t4 10.5t0.5 19q0 42 -0.5 83.5t-0.5 83.5q-1 61 -1 122v122q0 11 0.5 17.5t3.5 10
|
||||
t9 4.5t17 1q30 1 60 -0.5t60 -3.5q12 0 14 -15q2 -20 3.5 -40.5t1.5 -40.5q1 -80 0 -159t2 -159l1.5 -41t5.5 -17.5t17 -4t36 -0.5l36.5 -2t36.5 -3q19 -2 20 -19q0 -7 1.5 -13.5t2.5 -13.5q2 -47 2.5 -93t2.5 -93q0 -6 -1 -11.5l-2 -11.5q-3 -18 -21 -18q-27 1 -54 1t-54 1
|
||||
q-19 0 -24 5t-7 23q-5 33 -6 66q-1 11 -5.5 16t-15.5 5q-20 0 -39 0.5t-39 0.5q-105 1 -209 1.5t-210 1.5q-67 0 -133.5 0.5t-133.5 0.5h-12t-11 2q-11 2 -17 9t-3 18q-2 21 -2 39v34.5t0.5 32.5t0.5 33q-2 52 0 103t-1 103q-4 60 -3.5 113.5t1.5 113.5v16q1 17 4.5 21
|
||||
t20.5 3q17 0 34.5 -1t34.5 -1q15 -1 29.5 -1.5t28.5 0.5q19 0 19 -18q-1 -23 -1.5 -40t-0.5 -40q1 -69 1.5 -138t0.5 -138q1 -17 0.5 -33t-0.5 -33q0 -21 3 -25.5t23 -5.5l52.5 -4t52.5 -2q15 0 22.5 1t10.5 4.5t3.5 11t0.5 20.5q-1 52 -1 104t-1 105l0.5 22.5t0.5 54.5
|
||||
v67.5v62.5z" />
|
||||
<glyph glyph-name="uni0427" unicode="Ч" horiz-adv-x="656"
|
||||
d="M550 471q-1 -107 -0.5 -213t-0.5 -213q0 -11 -0.5 -16.5l-1.5 -16.5q-2 -14 -6.5 -18t-18.5 -3q-30 2 -60 0t-60 2q-26 3 -26 36v117q0 14 -1 28.5l-2 29.5q-1 17 -17 9q-5 -2 -10.5 -5.5t-10.5 -5.5l-41.5 -16t-41.5 -14q-52 -14 -96.5 0t-85.5 44q-24 18 -39.5 42.5
|
||||
t-17.5 55.5l-4 67.5t-3 68.5v43t0.5 39l1 39t0.5 43q0 22 20 22q5 0 21.5 0.5t36.5 0.5h39h30q12 -1 19 -2t10 -4t3.5 -9.5t0.5 -17.5q-1 -42 -2.5 -74.5t-2.5 -73.5q0 -17 1 -33t5 -33q5 -24 21 -38.5t45 -14.5q50 -1 90 29q14 11 21.5 23.5t7.5 32.5q-2 48 -1 93t1 93v8
|
||||
q1 17 5.5 22t21.5 5h19h33.5h36h28.5q20 1 25 -5t7 -26q1 -17 1 -41.5v-46.5t-0.5 -37.5z" />
|
||||
<glyph glyph-name="uni0426" unicode="Ц"
|
||||
d="M6 611q-1 16 2.5 20t20.5 7q4 0 19.5 0.5t35.5 0.5t40 -0.5t32 -0.5q11 0 14.5 -4.5t3.5 -14.5q1 -28 1.5 -68t0.5 -85t-0.5 -90.5t-0.5 -84.5t-0.5 -67.5t0.5 -38.5q0 -22 24 -22h73.5t73.5 -1q20 0 18 20q-1 16 -1 47.5v72t-0.5 85.5t-0.5 87t-1 77.5t-2 56.5v10t1 10
|
||||
q3 15 19 15q30 -2 60 -2.5t60 -2.5q16 -2 19.5 -5.5t4.5 -20.5q1 -24 2 -58t1.5 -73t0.5 -78.5t0.5 -73.5t0.5 -59v-34q1 -11 1 -21.5t1 -21.5q1 -17 2 -25.5t5.5 -13t13 -5.5t25.5 -1q3 0 6 0.5t5 -0.5q18 -1 27 -2t12 -5t3 -12t1 -21q4 -43 5 -83t0 -87q0 -15 -6 -23.5
|
||||
t-21 -9.5q-26 0 -49 0.5t-49 -0.5q-22 0 -25 20q-2 14 -1 28.5t-1 28.5q-2 17 -17 18q-9 1 -19 1.5t-19 -1.5q-17 0 -46 -0.5t-63.5 -0.5t-71 -1t-69 -1t-58 -0.5t-37.5 -0.5h-31q-10 1 -21 0.5t-18 4.5q-5 4 -4.5 15t-0.5 21q-3 97 1 192t0 192l-2 68q-1 29 -1 61.5v60.5z
|
||||
" />
|
||||
<glyph glyph-name="uni042C" unicode="Ь" horiz-adv-x="594"
|
||||
d="M146 -2q-30 1 -52.5 1.5t-42.5 1.5q-16 0 -31 3q-7 2 -11.5 6.5t-2.5 12.5q0 48 -0.5 98t0.5 99v61.5v77v81.5v76v60v34q0 5 -0.5 9.5t0.5 9.5q3 20 24 20q30 -2 60 -3t60 -3q14 -1 22 -2t11.5 -5t4.5 -12t1 -22q1 -34 0.5 -59.5t1.5 -59.5q0 -18 3 -22t20 -5
|
||||
q22 -2 49 -1.5t49 -1.5q84 -6 142 -64q48 -49 54 -122q5 -83 -38 -156q-22 -36 -53 -60.5t-73 -35.5q-52 -14 -103 -18t-95 1zM191 251q2 -10 2 -29q0 -9 0.5 -18.5t0.5 -19.5q1 -26 6.5 -32t31.5 -4q15 1 30 6q14 4 28 10t25.5 16t18.5 23.5t7 33.5q0 19 -8 31t-21.5 19.5
|
||||
t-30 10.5t-34.5 5q-1 1 -4 1q-19 2 -29.5 2t-15.5 -5t-6 -16.5t-1 -33.5z" />
|
||||
<glyph glyph-name="uni042A" unicode="Ъ" horiz-adv-x="666"
|
||||
d="M76 324q-1 39 0.5 77.5t-0.5 77.5q-2 18 -6 21.5t-23 4.5q-23 1 -37.5 0t-23 3t-11 16t-1.5 39q1 14 0 27t-1 27q1 14 5 18.5t18 5.5h37.5t63.5 -0.5l69 -1t54 -1.5q3 1 9.5 1t12.5 -2.5t10.5 -8.5t4.5 -16v-28v-39v-42v-38q0 -22 20 -22q37 0 73 -3q51 -5 94 -24.5
|
||||
t76 -58.5q32 -38 41 -81t-2 -91q-14 -60 -50.5 -100t-94.5 -63q-41 -16 -81.5 -19t-82.5 -5q-37 -2 -74 0l-74 4q-18 1 -21 4t-3 20q-1 48 -1.5 95t-1.5 95v12v28.5t0.5 35t0.5 32.5zM302 136q7 1 16.5 1.5t19.5 2.5q8 2 16.5 6t13.5 10q19 20 25.5 43t-2.5 50
|
||||
q-15 49 -65 58q-21 4 -42 6q-17 2 -21.5 -2t-4.5 -22q-2 -66 0 -132q0 -14 3.5 -17t19.5 -4h21z" />
|
||||
<glyph glyph-name="uni042B" unicode="Ы" horiz-adv-x="823"
|
||||
d="M7 283q1 36 1.5 89l1 104t0.5 90v48q-1 18 3 22t23 5h23t40 -0.5l43 -1t32 -0.5q16 -1 19 -3t5 -18q2 -34 0.5 -67.5t0.5 -67.5q0 -13 1 -20.5t4 -11t10 -5t21 -3.5q10 -1 19.5 -1t19.5 -2q60 -10 105 -41t72 -88q18 -38 23 -77t-7 -81q-11 -40 -36 -74.5t-66 -50.5
|
||||
q-42 -17 -81.5 -20.5l-83.5 -7.5q-5 0 -24 -0.5t-44 -0.5t-50 -0.5t-40 -1.5q-23 -1 -28.5 4.5t-5.5 28.5q0 66 -0.5 130.5t-0.5 122.5zM194 167q0 -8 3 -13.5t11 -5.5q10 0 24.5 0.5t28.5 3.5t26.5 7.5t20.5 12.5t12.5 20t6 25t-0.5 26t-7 23t-18.5 18.5t-29.5 14t-33 8
|
||||
t-29 1.5q-14 -2 -15 -14v-127zM543 615q0 14 3.5 19.5t17.5 4.5h62t62 -2q17 -1 20.5 -5.5t3.5 -22.5q2 -42 2.5 -79t0.5 -79v-194t-2 -194q0 -30 0.5 -43.5t-5 -18t-20 -3.5t-44.5 1q-19 -1 -37 0t-37 1q-18 0 -24 5t-6 24v150.5t-1 151.5l1 30.5t1.5 74.5t1 93t0.5 86z
|
||||
" />
|
||||
<glyph glyph-name="uni0411" unicode="Б" horiz-adv-x="677"
|
||||
d="M156 -12q-31 1 -61.5 1t-62.5 2q-17 1 -22 6t-5 22q1 34 1.5 67.5t1.5 68.5v135v246q0 44 -3 89q0 11 4 14.5t14 3.5h38.5h60.5t71.5 -0.5t73 -0.5h65.5t47 1q11 1 21.5 1.5t21.5 -0.5q18 -1 25 -8t6 -26q-1 -25 -3 -47.5t-4 -47.5q-1 -8 -2 -13t-3.5 -7t-7.5 -2.5
|
||||
t-14 -0.5q-35 -1 -69.5 -0.5t-69.5 -0.5q-22 0 -45 -0.5t-44 -0.5q-16 0 -18 -16q-2 -17 -0.5 -33t0.5 -34q0 -9 5 -12t13 -3q28 -3 55.5 -2.5t56.5 0.5q29 -1 57 -7.5t56 -15.5q35 -12 60.5 -35t42.5 -55q14 -26 13 -51t-7 -62q-9 -56 -38 -90.5t-66.5 -53.5t-77.5 -25
|
||||
t-73 -6h-21.5h-39h-37t-16.5 -1zM233 256q-8 2 -17 1t-19 0q-20 2 -21 -17q0 -23 -0.5 -44.5t-0.5 -44.5q0 -17 18 -20q57 -12 110 11q14 6 22.5 17t11.5 24t-0.5 25.5t-14.5 22.5q-10 8 -22.5 12.5t-25.5 7.5q-9 3 -19.5 4t-21.5 1z" />
|
||||
<glyph glyph-name="uni041A" unicode="К" horiz-adv-x="677"
|
||||
d="M7 611q0 15 4 19.5t18 3.5q24 0 45 -1t46 -2q5 -1 11 -1h12q20 0 24 -3.5t5 -23.5q2 -32 2.5 -64t1.5 -64q1 -6 0 -11.5t0 -11.5l2 -10.5t3 -10.5q5 2 9 4.5t7 5.5l89 86.5l88 87.5q11 10 22 16.5t25 5.5q38 -1 75.5 -1.5t75.5 -1.5q3 0 7 -3t5 -5q1 -3 -1 -7.5t-4 -6.5
|
||||
l-76 -77.5l-76 -77.5q-14 -14 -28.5 -26.5t-28.5 -26.5q-14 -13 -14.5 -18t9.5 -21l41.5 -67.5l42.5 -67.5l61 -96.5l61 -96.5q8 -12 3.5 -22t-18.5 -12q-5 -1 -11 -1h-12q-21 -1 -42.5 -1t-42.5 -2q-23 -2 -39.5 6.5t-29.5 26.5q-14 20 -31 47t-31 47l-42 60.5l-42 60.5
|
||||
q-8 12 -13.5 12.5t-16.5 -9.5q-20 -16 -19 -44q2 -45 2.5 -89t1.5 -89q1 -20 -3.5 -25.5t-23.5 -5.5q-30 0 -64.5 1t-64.5 3q-23 1 -24 25q-1 18 -1 63v103.5v124v124.5v105v65z" />
|
||||
<glyph glyph-name="uni041B" unicode="Л" horiz-adv-x="751"
|
||||
d="M635 356q0 -48 -0.5 -95t0.5 -95q1 -42 2 -76t3 -76q1 -17 -13 -17q-35 1 -70 1.5t-70 1.5q-10 0 -12 5t-2 13v54.5t-1 55.5l-3 213q-1 25 0 50t0 51q0 11 -1 17.5t-4.5 9.5t-10 4t-18.5 2h-8q-10 0 -15.5 -0.5t-9 -2.5t-6 -7.5t-5.5 -14.5l-23.5 -84t-25.5 -83
|
||||
q-15 -45 -32 -89.5t-39 -86.5q-12 -23 -31.5 -42.5l-39.5 -38.5q-17 -17 -39 -23.5t-46 -7.5q-33 -2 -64 5t-61 18q-14 5 -17.5 11.5t-1.5 21.5q6 29 11.5 59t12.5 59q4 21 25 15l9 -3.5l9 -3.5q31 -11 59.5 -2.5t46.5 35.5q8 12 14.5 25t10.5 27l27 91.5t24 91.5
|
||||
q11 42 19 85t17 85q3 17 7.5 21.5t21.5 6.5q4 0 8 0.5t7 -0.5q17 0 43 0.5t56.5 0.5h62.5h61h52h35q18 -1 21.5 -5t3.5 -23q0 -47 -0.5 -93t-1.5 -93v-21.5t0.5 -24t1 -20z" />
|
||||
<glyph glyph-name="uni042F" unicode="Я" horiz-adv-x="687"
|
||||
d="M571 34v-23q-2 -20 -21 -18h-127q-18 1 -24 7t-6 23v54.5t1 54.5q0 17 0.5 34.5t0.5 35.5q0 15 -3.5 18t-18.5 5q-30 6 -46 -20l-57.5 -85t-55.5 -86q-7 -12 -12.5 -19.5t-13 -12.5t-19.5 -7t-31 -2h-34t-38 1q-21 0 -44 1q-6 2 -10 5q-8 6 -1 16q14 20 30 39.5t31 40.5
|
||||
l48 67.5l48 68.5q9 14 8.5 18.5t-14.5 10.5q-35 16 -55 43.5t-34 60.5q-14 35 -18.5 70.5t6.5 73.5q5 18 16 32.5t25 26.5q49 41 113 57q45 11 87 11.5t82 1.5q17 -1 42.5 -1t49 0.5t40.5 0.5h19q21 -3 28 -11t7 -29v-48v-87t0.5 -111t0.5 -119v-111.5v-87.5zM407 438
|
||||
q-1 4 -1 12.5t-1 17.5q-2 15 -14 16q-15 1 -43.5 2.5t-56 -1t-48.5 -12t-22 -30.5q-1 -37 17 -53.5t41 -21.5t44.5 -3.5t29.5 0.5q22 -2 32.5 1t14.5 11t4.5 23t2.5 38z" />
|
||||
<glyph glyph-name="uni0414" unicode="Д" horiz-adv-x="791"
|
||||
d="M570 179q1 -20 4.5 -24.5t23.5 -5.5q13 -1 25.5 -1t24.5 -1q15 0 21 -4t9 -18q1 -6 1 -12v-11q0 -33 0.5 -66t0.5 -66v-11.5t-1 -11.5q-3 -17 -22 -17q-21 0 -42.5 -0.5t-42.5 -0.5q-20 0 -17 20v3q0 17 -1 26t-5 13.5t-13 5.5t-25 1q-12 0 -42 0.5t-69 1t-82.5 1
|
||||
t-82 0.5h-67.5t-39 -1q-4 -1 -8 -6t-5 -10q-2 -11 -1.5 -27t0.5 -27q0 -6 -2.5 -11t-10.5 -5q-26 -1 -55 -2t-55 0q-14 0 -18 5t-5 19q-2 44 -1 87t-1 87q-1 14 2.5 17.5t17.5 1.5q22 -3 36 16l27.5 35t24.5 37q22 39 39.5 79.5t27.5 84.5q2 9 8 31.5t12 49t10 51.5t4 40
|
||||
q-1 20 1.5 36.5t3.5 36.5q1 19 20 18q49 0 97 0.5t96 -0.5q72 0 143 -3q17 -1 20.5 -5t3.5 -21q0 -19 0.5 -53.5t1.5 -77l2 -88.5t1.5 -88t1.5 -76.5t2 -52.5zM400 314v18t-1 44t-1.5 55t-1.5 51q0 5 -2 11t-4 6q-11 1 -22.5 1t-22.5 -2q-9 -2 -8.5 -9t-0.5 -14
|
||||
q-2 -16 -3 -29t-3 -30q-8 -65 -27.5 -128t-51.5 -121q-1 -3 -2 -5.5t-2 -5.5q-3 -6 -0.5 -9.5t8.5 -3.5q31 0 67.5 1t67.5 2q17 0 17 17v17.5t-1 17.5q-2 29 -3 58t-3 58z" />
|
||||
<glyph glyph-name="uni0416" unicode="Ж" horiz-adv-x="928"
|
||||
d="M352 369q2 0 3 12.5t2 29.5t1 36t-1 33q-2 38 -4.5 69.5t-4.5 69.5q-1 17 2.5 21t20.5 5q32 1 64 0.5t64 -0.5q11 0 13.5 -5t2.5 -15q0 -61 1 -116t2 -116v-8t2 -7q1 -2 4.5 -3t3.5 0q5 5 9 10t7 11l57.5 108t57.5 109q7 15 16.5 23t27.5 6q25 -2 50 -1t50 1q9 0 17 -1
|
||||
t13 -12q4 -10 1 -17t-8 -15l-74.5 -114.5l-74.5 -114.5q-9 -15 -9 -29t8 -29l24 -46l30 -57l31.5 -60.5l28.5 -56l22 -44t12 -23.5q9 -19 -11 -22q-17 -3 -34 -3q-23 2 -46.5 1t-46.5 1q-19 1 -27 18l-59 114.5l-60 114.5q-2 3 -3.5 6.5t-3.5 7.5q-3 3 -6 3q-4 0 -4 -5
|
||||
q-1 -7 -1.5 -13.5t-0.5 -13.5q2 -57 3 -111l2 -112q1 -10 -5 -16.5t-15 -3.5q-32 -1 -62 0.5t-61 -0.5q-17 -2 -20.5 2.5t-4.5 21.5l-2 114.5l-2 115.5v9.5t-1 9.5q0 5 -5 5q-5 2 -7 -2l-5.5 -7.5t-5.5 -8.5l-48.5 -81l-49.5 -82l-28 -44l-28 -44q-5 -8 -9.5 -9t-22.5 0
|
||||
q-3 2 -18 2.5t-34.5 0.5h-39h-30.5q-29 2 -12 25q8 13 17 24t17 24l27.5 41.5l31.5 48.5l32 49.5l29 44.5l21 32.5t9 13.5q14 20 2 40l-21.5 39l-21.5 39q-23 38 -45 69t-45 69q-11 18 -21 36.5t-21 36.5q-10 17 11 17q13 0 33.5 -0.5t39.5 -0.5t33.5 -0.5t16.5 -0.5
|
||||
q10 2 22 1.5t18 -4.5q9 -6 14.5 -17l10.5 -21l30 -55.5l30 -52l30 -51.5l31 -55q2 -3 4 -9t7 -6z" />
|
||||
<glyph glyph-name="uni0425" unicode="Х" horiz-adv-x="771"
|
||||
d="M649 -3q-47 -2 -90.5 -1t-89.5 -1q-11 0 -17 4t-11 12q-14 18 -27.5 39t-27.5 40l-22.5 30.5l-22.5 30.5q-14 19 -19 19t-18 -19l-31.5 -47l-31.5 -48l-8 -10.5t-7 -11.5q-26 -54 -88 -48q-32 -1 -54.5 0t-48.5 1q-10 0 -22 5q-12 3 -5 15l48.5 73l48.5 73l49 75l50 74
|
||||
q8 11 7 19.5t-8 17.5l-44.5 62.5l-43.5 62.5l-49.5 74l-49.5 74q-2 5 -4 9t-4 9q-3 12 10 12q41 1 81.5 1.5t81.5 1.5q8 0 12 -3.5t8 -9.5l50 -69.5l50 -69.5q2 -3 5 -6t5 -6q11 -14 21 0q5 8 10.5 15.5l11.5 15.5l38 54t37 56q15 21 38 21q33 0 66 0.5t67 1.5q9 0 12 -5
|
||||
t2 -13q-3 -12 -10 -24l-55.5 -85l-54.5 -84l-28 -45.5l-29 -44.5q-6 -9 -3.5 -14.5t7.5 -12.5l48.5 -60.5l48.5 -61.5l54 -73.5l53 -74.5q5 -7 9 -14t8 -15q6 -12 3 -16.5t-16 -4.5z" />
|
||||
<glyph glyph-name="uni0424" unicode="Ф" horiz-adv-x="812"
|
||||
d="M457 646q4 -3 5 -14t1.5 -24t0.5 -23.5t2 -12.5q2 -5 7.5 -6l10.5 -2q88 -8 144 -38t76 -71q19 -41 30 -84q16 -66 -4 -121.5t-61 -103.5q-29 -35 -70 -53.5t-87 -24.5q-17 -3 -25.5 -5t-13 -6.5t-5 -13.5t-0.5 -25v-16q0 -18 -19 -21q-33 -3 -65.5 -3.5t-65.5 6.5
|
||||
q-20 3 -20 23q-1 14 -2.5 28.5t-2.5 28.5q-14 3 -28 5.5t-28 5.5q-20 5 -39.5 9t-39.5 10q-26 9 -50.5 23t-45 35t-34.5 49t-20 64q-10 57 4.5 107.5t45.5 97.5q17 25 40 42t51 28q29 12 60.5 19t63.5 8q10 0 16 1t8.5 4t3 9.5t0.5 17.5v15q-3 27 5.5 33.5t33.5 8.5
|
||||
q6 1 23.5 0.5t37 -1.5t36 -3.5t20.5 -5.5zM298 337h1q0 17 0.5 33t0.5 33q-1 17 -4 22t-21 3q-9 0 -26.5 -8.5t-34.5 -23t-29.5 -33.5t-11.5 -41q1 -32 13.5 -53.5t28 -34.5t32 -18t27.5 -5q9 1 15.5 3t7.5 16q0 27 0.5 53.5t0.5 53.5zM462 225q0 -17 15 -14q24 5 45.5 14.5
|
||||
t35.5 29.5q20 26 21.5 56t-9.5 61q-11 26 -32 35t-44 14q-2 0 -8 2q-14 2 -18 -0.5t-5 -16.5q0 -11 -0.5 -36t-0.5 -53.5v-54v-37.5z" />
|
||||
<glyph glyph-name="uni0423" unicode="У"
|
||||
d="M159 641q14 0 22 -1.5t11.5 -5t3.5 -11t-2 -19.5q-5 -29 -0.5 -56t12.5 -54q16 -53 53 -81t84 -45q13 -5 17.5 -2t11.5 18l24 59l23 60l21 56l21 56q5 18 21 18l70 2t70 0q23 0 30 -9t-1 -32q-21 -62 -45 -120q-35 -94 -79 -181.5t-94 -173.5q-16 -28 -38 -49t-49 -38
|
||||
q-28 -17 -57.5 -30.5t-64.5 -16.5q-20 -1 -40 -0.5t-40 7.5q-28 9 -55.5 17t-52.5 25q-15 10 -16.5 14.5t5.5 22.5q10 28 18.5 55.5t19.5 54.5q8 22 18.5 24.5t30.5 -11.5q11 -8 22.5 -14.5t24.5 -11.5q38 -14 74 2t57 47q11 14 -7 20l-39 16l-39 16q-38 17 -68.5 42.5
|
||||
t-56.5 54.5q-27 31 -40.5 68t-20.5 77q-5 29 -8 54.5t-6 55.5q-1 14 2 17.5t17 3.5h28.5h40.5t39.5 -0.5t26.5 -0.5z" />
|
||||
<glyph glyph-name="uni0401" unicode="Ё" horiz-adv-x="593"
|
||||
d="M475 634q19 0 21 -18q0 -4 0.5 -20t0.5 -34t-0.5 -33t-0.5 -16q-1 -14 -4.5 -18t-18.5 -4q-16 0 -52.5 -0.5t-78 -1t-78.5 -1.5t-54 -1q-15 0 -20.5 -5.5t-6.5 -19.5q-2 -20 -2 -32v-31q0 -20 23 -20q21 0 41.5 -1l41.5 -2q19 -2 15 -21q-2 -14 -1.5 -28.5t-1.5 -28.5
|
||||
q-2 -17 -7.5 -21.5t-22.5 -4.5t-33 0.5t-33 0.5q-14 -1 -19 -5t-5 -18q1 -20 0 -40.5t1 -40.5q2 -17 7.5 -20.5t21.5 -2.5q27 0 56 0.5t56 0.5q34 -1 68 -1.5t68 -2.5q18 -1 24 -7t5 -23v-24.5t0.5 -28.5t0.5 -24.5v-12.5q-1 -16 -6.5 -21t-22.5 -5h-40h-75.5h-93.5h-93.5
|
||||
h-76h-40.5q-13 0 -20 0.5t-10.5 4t-4.5 10.5t-1 19q-1 61 -1 120t-1 120v89q1 43 2 78.5t2 78.5q1 24 0 48t0 48q0 17 3.5 20.5t20.5 3.5q47 1 93 0.5t93 -0.5l28.5 0.5t69 0t85 -1.5t77.5 -2zM127 695q-16 1 -29.5 7t-23.5 16.5t-15.5 23.5t-4.5 28q1 13 7.5 25t16.5 21
|
||||
t22.5 14.5t25.5 5.5q12 0 24.5 -6.5t22 -17t15.5 -23t6 -24.5q0 -15 -5.5 -28t-14.5 -22.5t-21.5 -15t-25.5 -4.5zM396 831q12 0 23.5 -5t20.5 -13.5t14 -19t5 -22.5q-1 -30 -18.5 -49.5t-44.5 -18.5q-29 0 -48 19.5t-19 49.5q-1 26 18 42.5t49 16.5z" />
|
||||
<glyph glyph-name="uni0419" unicode="Й" horiz-adv-x="708"
|
||||
d="M6 621q0 16 6 23t21 5q35 -2 67.5 0t67.5 -2q22 -2 20 -23v-35.5v-61.5t0.5 -73.5t1 -71t1.5 -53.5t2 -21q11 0 15 6q14 17 26.5 34l25.5 34l45.5 65l45.5 65l39.5 55l39.5 56q5 7 8.5 11t9 6.5t13 3t21.5 0.5h78q16 0 24 -0.5t12 -3.5t4.5 -10.5t1.5 -20.5
|
||||
q1 -25 1.5 -73t0.5 -106.5v-121t-0.5 -115t-0.5 -89.5v-45q0 -12 0.5 -20.5t-1.5 -20.5q-2 -13 -7 -17t-19 -3q-26 2 -52.5 0.5t-52.5 0.5q-9 1 -21.5 0t-15.5 2t-2 19t0 27q0 44 0.5 79t-0.5 79q0 23 -0.5 46.5t-1.5 46.5q0 7 -4 10q-4 2 -9 -3q-4 -4 -10 -12l-79 -103.5
|
||||
l-79 -103.5q-14 -20 -28.5 -37t-28.5 -37q-10 -15 -29 -15q-35 2 -69.5 1t-69.5 1q-8 0 -10.5 4t-3.5 11v13.5t-1 13.5q0 70 -0.5 139.5t-1.5 140.5q-1 0 -1 21v52.5v69v71v57.5v29zM308 710q-15 0 -29 6t-24 15.5t-16 21.5t-5 25q2 29 25 48.5t55 18.5q65 -1 68 -72
|
||||
q1 -12 -5.5 -23.5t-17 -20.5t-24 -14t-27.5 -5z" />
|
||||
<glyph glyph-name="uni042E" unicode="Ю" horiz-adv-x="969"
|
||||
d="M184 23q-1 -16 -5 -20.5t-19 -4.5q-29 1 -59 1t-59 2q-13 0 -20 1t-10 4.5t-3.5 10t-0.5 18.5q-2 79 -0.5 157t-0.5 157q-1 32 -1.5 64.5t1.5 64.5q2 37 2 70.5t-2 71.5q-1 14 1.5 18t13.5 4q36 0 69 -0.5t69 -0.5q16 -2 16 -17q1 -14 1 -27v-27q1 -37 0 -70.5t1 -71.5
|
||||
q0 -19 3.5 -22t21.5 -5q14 -1 27 -0.5t26 -0.5q17 -1 23 16q5 11 9.5 22.5t9.5 22.5q34 78 95 121t142 61q66 15 123 -1.5t107 -58.5q35 -31 60.5 -69t37.5 -86q9 -36 15 -72t2 -74q-5 -44 -17 -83.5t-38 -76.5q-19 -26 -40 -50t-49 -41q-53 -32 -109.5 -41.5t-117.5 -6.5
|
||||
q-42 3 -79 18t-72 38q-33 22 -52.5 54t-30.5 69q-7 22 -11.5 44l-9.5 45q-4 17 -20 18q-18 1 -28 0t-15.5 -6.5t-7 -15.5t-1.5 -28q0 -11 0.5 -38t0.5 -57.5t0.5 -59t0.5 -41.5zM442 324q0 -6 -0.5 -12t-0.5 -11q0 -34 15 -59.5t36.5 -43t44.5 -26t38 -8.5q72 0 111 47.5
|
||||
t39 125.5q0 12 -2 33.5t-13.5 44t-34.5 41t-65 26.5q-61 10 -104.5 -22t-59.5 -90q-2 -6 -2.5 -13.5l-1 -15t-0.5 -12.5v-5z" />
|
||||
<glyph glyph-name="uni0412" unicode="В" horiz-adv-x="646"
|
||||
d="M429 377q14 -5 25 -10l22 -10q9 -4 20 -16t20.5 -32t16 -48.5t6.5 -64.5q0 -29 -14 -58t-35.5 -54.5t-47.5 -45t-50 -28.5q-36 -14 -73.5 -19t-75.5 -6q-2 0 -4 0.5t-4 -0.5q-17 -2 -49.5 -1.5t-65.5 1.5q-39 1 -82 2q-7 0 -12 2t-9 5t-6 9q-5 17 -5 33q-1 79 -1 157.5
|
||||
v157.5q0 44 0.5 87t0.5 87q1 29 0.5 57.5t-2.5 57.5q0 15 12 15q64 1 120.5 2t120.5 0q23 0 45.5 -5t45.5 -11q29 -8 53 -25.5t44 -40.5q12 -15 17 -37q4 -20 6 -39.5t0.5 -37.5t-7.5 -35.5t-19 -33.5q-2 -3 -5 -6.5t-8 -8.5zM186 205v-26q-2 -20 -2 -30t4.5 -14t14.5 -4
|
||||
t28 -1q30 -2 57 8t51 27q40 27 14 70q-10 15 -28 27q-29 19 -59.5 19.5t-62.5 -3.5q-10 -2 -13 -7t-3 -14q0 -7 -0.5 -15.5t-0.5 -16.5v-20zM183 478v-41.5t6 -19.5t20 -4t43 4q12 2 23 6.5t22 10.5q14 8 20 21.5t5 29.5t-11 25.5t-24 13.5q-12 3 -24.5 4l-25.5 2
|
||||
q-12 1 -24 0t-23 -1q-2 -13 -3.5 -25.5t-3.5 -25.5z" />
|
||||
<glyph glyph-name="uni0421" unicode="С" horiz-adv-x="688"
|
||||
d="M-20 334q0 53 15.5 96.5t40.5 77t55.5 59t61 42.5t57 27t42.5 13q94 20 179 -19q19 -8 37.5 -19.5l35.5 -22.5q11 -6 10.5 -10.5t-9.5 -13.5l-45.5 -41.5l-45.5 -41.5q-14 -13 -32 -6q-30 11 -58 9q-18 -1 -44.5 -11t-51 -30t-42 -51.5t-17.5 -75.5q0 -53 23 -84.5
|
||||
t54 -47.5t62.5 -19.5t49.5 -0.5q32 5 57 22.5t45 43.5l9 10.5t6 4.5t7 -1.5t11 -7.5l39 -25t39 -26q14 -10 16 -16.5t-5 -21.5q-15 -34 -39 -60t-55 -46q-36 -23 -74.5 -39.5t-83.5 -18.5q-92 0 -153.5 26t-100.5 65t-58.5 84.5t-28 84.5t-9 65z" />
|
||||
<glyph glyph-name="uni042D" unicode="Э" horiz-adv-x="719"
|
||||
d="M624 300q1 -40 -9 -80.5t-31 -78.5t-54 -62q-34 -25 -68.5 -44.5t-75.5 -32.5q-73 -23 -141.5 -11.5t-135.5 40.5q-52 22 -95 62q-5 5 -8.5 9.5t-0.5 12.5l27 65.5l27 64.5q5 13 17 19q18 9 34 -7q14 -14 29 -27t32 -24q49 -33 100 -32.5t103 23.5q41 18 55 64
|
||||
q6 20 -14 20h-33t-58 -0.5t-58 -0.5h-34h-17t-17 1q-20 0 -20 21q0 11 -2 21t-2 21q-1 21 6.5 28.5t28.5 8.5q6 0 21.5 0.5t35.5 0.5h42.5h42.5t35.5 0.5t21.5 0.5q14 2 16 5.5t-2 16.5q-10 29 -32.5 44t-49.5 23q-92 26 -173 -18q-17 -9 -24.5 -5.5t-15.5 16.5l-24.5 39
|
||||
l-23.5 39q-3 5 -6 9.5t-7 8.5q-10 12 -9.5 16t11.5 14q78 66 178 69q61 3 121 -6q56 -8 99.5 -37.5t78.5 -71.5q44 -52 64 -112.5t15 -132.5z" />
|
||||
<glyph glyph-name="uni0417" unicode="З" horiz-adv-x="593"
|
||||
d="M403 626q44 -21 65.5 -57.5t23.5 -75.5t-13.5 -74.5t-45.5 -54.5q-6 -4 -9 -7q-4 -4 -4 -6.5t6 -6.5q11 -7 21 -15l20 -16q18 -16 28 -41.5t12 -53.5t-4 -54.5t-19 -44.5q-39 -54 -90 -83.5t-115 -38.5q-16 -2 -31.5 -3t-30.5 -1q-29 -2 -54.5 4t-49.5 16.5t-47.5 23.5
|
||||
l-46.5 27q-8 5 -11.5 13.5t0.5 18.5l22.5 52l22.5 52q2 4 8 6t11 1t9.5 -4.5t9.5 -5.5q35 -20 72.5 -34t79.5 -17q21 -2 38 6l34 16q5 3 8.5 10t5 15.5t1.5 17.5t-3 15q-17 42 -60 48q-14 2 -27.5 2t-27.5 1q-16 0 -16 15q-2 18 -3.5 36.5t-3.5 36.5q18 5 35.5 8.5t35.5 8.5
|
||||
l24 8t23 12q14 10 20.5 23t5 26t-10 24.5t-24.5 19.5q-20 11 -41 13t-44 -6t-45 -16.5t-43 -20.5q-19 -11 -27 -9.5t-20 21.5q-13 20 -25 40.5t-23 41.5q-2 4 -1 10t4 10q5 5 11 9t13 7q44 24 87 32t91 20q6 2 24.5 3t43 -0.5t51 -6.5t49.5 -17z" />
|
||||
<glyph glyph-name="one" unicode="1" horiz-adv-x="478"
|
||||
d="M387 29q1 -6 0.5 -14.5t-2.5 -10.5q-5 -4 -9.5 -3.5t-10.5 0.5q-29 -1 -58 -1h-58q-14 0 -18.5 5t-5.5 21q-3 78 -3 157q-1 50 0 99t1 99v12t-1 11q-1 6 -4.5 8t-8.5 -3l-10.5 -8t-10.5 -9l-34.5 -29.5t-35.5 -29.5q-14 -11 -22.5 -10.5t-20.5 13.5q-17 19 -33 39l-33 40
|
||||
q-13 16 2 31l21 19t20 20q36 38 76 70l82 65q10 8 20.5 13t23.5 4q30 0 58.5 1t58.5 -1q14 -1 17 -4t4 -19q0 -15 -0.5 -31t-0.5 -31q0 -35 0.5 -69t0.5 -68q-2 -105 -3 -189q0 -36 -0.5 -70.5t-1 -62t-0.5 -45v-19.5z" />
|
||||
<glyph glyph-name="two" unicode="2" horiz-adv-x="541"
|
||||
d="M225 0h-183q-14 0 -21.5 1t-11.5 5t-4.5 12t-0.5 22v39t-1 38q-2 28 19 44l40 32l40 31q40 30 74 65t62 77q11 16 14.5 33.5t-3.5 36.5q-11 37 -51 40q-23 2 -42.5 -5t-36.5 -21q-17 -16 -33 0l-36 35.5l-36 35.5q-7 6 -5.5 12t6.5 12q33 39 75 61q47 26 96 35.5
|
||||
t103 -2.5q28 -6 51.5 -20.5t40.5 -33.5t28 -41t15 -44q16 -87 -13.5 -155t-91.5 -125l-30.5 -27.5l-30.5 -27.5q-2 -2 -2.5 -6t-0.5 -7q0 -1 3.5 -2.5t5.5 -1.5h144q5 0 9.5 0.5t9.5 0.5q14 2 16 -12q2 -28 0.5 -55t-0.5 -54q0 -17 -6 -22t-22 -7h-43q-20 0 -45 0.5l-48 1
|
||||
t-38.5 0.5t-15.5 -1z" />
|
||||
<glyph glyph-name="zero" unicode="0" horiz-adv-x="552"
|
||||
d="M462 311q-3 -32 -4.5 -59.5t-5.5 -53.5q-8 -65 -36 -115t-82 -86q-30 -20 -68 -21.5t-72 5.5q-37 7 -68.5 25t-58.5 44q-20 19 -30.5 43t-15.5 50q-15 74 -17.5 147.5t12.5 148.5q7 34 17 65t34 57l26 28t27 25q42 32 92.5 35t98.5 -15q65 -23 97.5 -71t41.5 -114
|
||||
q5 -36 7.5 -71.5zM318 298v34q0 14 0.5 29.5t0.5 26.5q0 23 -8 44.5t-21 40.5q-6 9 -15.5 15t-21.5 8.5t-24.5 0.5t-23.5 -11q-22 -17 -31 -38.5t-14 -45.5q-11 -51 -8 -101t11 -101q2 -13 6.5 -25.5t12.5 -23.5q9 -14 23.5 -21t30.5 -6t30.5 8.5t22.5 22.5q9 15 16 31t7 33
|
||||
q0 20 3 39.5t3 39.5z" />
|
||||
<glyph glyph-name="three" unicode="3" horiz-adv-x="594"
|
||||
d="M226 -12q-22 0 -47.5 9t-48.5 18q-35 13 -66 34l-62 43q-5 4 -8.5 9t1.5 13l60 90q7 11 18 3l25 -18l24 -18q28 -15 55.5 -21.5t56.5 -7.5q22 -2 43.5 8.5t32.5 30.5q5 10 5 22.5t-4 24t-12 21t-18 14.5q-12 6 -25.5 7.5t-30.5 0.5q-8 3 -13 7t-6 14q-2 13 -1.5 26
|
||||
t-1.5 27q-3 19 18 29l18.5 5.5l16.5 5t16 6t19 10.5q5 3 9.5 12t7.5 20t4 21.5t0 16.5q-2 6 -8 14.5t-17.5 14.5t-28 6t-38.5 -11q-13 -8 -26 -20.5t-24 -17.5q-13 -6 -20 -5.5t-18 10.5q-8 8 -15 17t-15 18q-12 14 -18.5 22.5t-6 15.5t7.5 14.5t22 20.5q42 35 88 58t103 23
|
||||
q63 -1 105 -30.5t62 -87.5q15 -46 5.5 -89t-44.5 -79q-7 -8 -7 -13t10 -10q28 -15 43 -39.5t19 -52.5t-1 -57t-17 -52q-9 -17 -21.5 -43t-38.5 -50.5t-70.5 -42t-116.5 -17.5z" />
|
||||
<glyph glyph-name="four" unicode="4" horiz-adv-x="593"
|
||||
d="M472 329q0 -69 -1 -130.5t-1 -121.5q0 -16 1 -30.5t1 -30.5q1 -11 -4.5 -15t-19.5 -3q-27 1 -54.5 0t-54.5 -1q-20 1 -25 5t-5 24q-1 26 -1 53t-1 53q-1 17 -5.5 22t-21.5 7q-58 3 -116 2.5t-114 -0.5q-23 -3 -32.5 4.5t-11.5 29.5q-2 20 -2 39t-1 39q-1 19 13 35
|
||||
l145 156.5l144 157.5q16 18 37 15q28 -2 55 -1t55 -1q21 0 21 -21q0 -20 1 -39t0 -39q-1 -54 -0.5 -108t-1.5 -101zM231 295h58q18 0 18 16q1 52 0 105q0 12 -6 14.5t-14 -5.5l-39.5 -38l-38.5 -39q-11 -11 -23.5 -22t-16.5 -28q7 -1 18 -1.5t20.5 -1t16.5 -0.5h7z" />
|
||||
<glyph glyph-name="five" unicode="5" horiz-adv-x="583"
|
||||
d="M233 640q39 1 77.5 1h77.5q17 0 20 -3t6 -19l8 -40.5l8 -40.5q1 -5 0.5 -9t-0.5 -9q-1 -15 -6 -19t-20 -4q-32 2 -65 2.5t-66 -0.5q-18 0 -23.5 -5.5t-8.5 -22.5q-2 -11 -6 -23.5t1 -20.5q3 -5 8 -5.5t10.5 1l11.5 3t12 1.5q42 -2 79.5 -14t70.5 -38q19 -14 30 -34
|
||||
t19 -42q10 -26 10 -62.5t-8.5 -73t-25.5 -69.5t-41 -53q-21 -17 -44.5 -27.5t-49.5 -18.5q-66 -18 -130.5 -15t-129.5 23q-18 6 -35 17l-34 22q-21 13 -13 36l20 52.5t21 52.5q7 16 24 2q26 -23 56.5 -34.5t63.5 -16.5q29 -5 58 -3t56 17q10 6 19.5 14t16.5 18q9 13 11 28.5
|
||||
t-2 30.5t-13.5 27.5t-24.5 20.5q-11 6 -24 10.5t-26 4.5q-27 0 -54 -1.5t-53 -15.5q-9 -7 -20 0q-24 16 -37.5 28t-18 25t-1.5 30.5t11 46.5l29 101.5l28 101.5q3 12 8 18t19 5q11 -1 26.5 -1h29.5h34z" />
|
||||
<glyph glyph-name="six" unicode="6" horiz-adv-x="605"
|
||||
d="M8 287q0 75 18 129.5t45 93t60 63t62 38.5t51 19.5t28 7.5q16 4 44 4t55.5 -2t48.5 -5.5t24 -7.5t6 -19.5t5 -34l4 -36.5l3 -27q1 -11 -2 -14t-14 -1q-8 1 -24.5 3.5t-37.5 4t-44 0.5t-42 -8q-12 -4 -28 -15t-31.5 -26.5t-29 -35t-19.5 -41.5q-1 -3 -1 -8t2 -6
|
||||
q2 -2 7 -0.5t7 3.5q21 17 44.5 24.5t49.5 11.5q34 6 65.5 -1t62.5 -22q18 -9 32.5 -27t25.5 -42t17 -53t6 -59q0 -61 -26.5 -104t-91.5 -82q-47 -24 -92.5 -27.5t-87.5 8.5t-78.5 36.5t-63.5 56.5q-18 21 -29.5 48.5t-18 55.5t-9.5 53.5t-3 43.5zM285 148q7 0 10.5 -0.5
|
||||
t5.5 -0.5q26 0 42.5 16.5t16.5 43.5q-1 52 -58 52q-33 -2 -53 -23l-11.5 -13t-10.5 -13q-13 -17 -8.5 -31t24.5 -22q11 -4 22.5 -5.5t19.5 -3.5z" />
|
||||
<glyph glyph-name="seven" unicode="7" horiz-adv-x="573"
|
||||
d="M225 637q39 0 78 -0.5t78 -1.5q17 -1 35.5 0.5t35.5 -0.5q12 -1 18 -7.5t7 -17.5q2 -16 0.5 -34t-0.5 -34q1 -4 -1.5 -8.5t-4.5 -8.5q-35 -54 -61.5 -111l-52.5 -115l-64 -137.5l-64 -137.5q-5 -10 -12 -17t-20 -7h-140q-17 0 -10 15l12.5 24l12.5 24l91.5 191.5
|
||||
l91.5 191.5q12 25 9 30t-32 5h-100.5t-100.5 -1q-11 0 -17 3.5t-7 14.5q-2 29 -1.5 58.5t-0.5 58.5q-1 20 21 22h20q22 0 53 -0.5t59 -0.5t47.5 0.5z" />
|
||||
<glyph glyph-name="eight" unicode="8" horiz-adv-x="541"
|
||||
d="M245 653q41 0 74.5 -13.5t60.5 -45.5q16 -20 23.5 -45t7.5 -51.5t-6 -50.5t-18 -42q-9 -13 -8 -16.5t12 -14.5q43 -39 61.5 -87.5t16.5 -105.5q-2 -39 -22.5 -74.5t-51 -63.5t-68 -44.5t-73.5 -17.5q-61 2 -117 28t-92 68.5t-44.5 98t27.5 115.5q26 47 70 81
|
||||
q9 7 11.5 13.5t-4.5 17.5q-9 14 -12 30.5l-6 33.5q-6 35 3 65t27 58q21 31 54.5 47t73.5 16zM309 186q0 11 -4.5 24t-11.5 25t-16 22t-19 15q-7 5 -17 1q-20 -10 -36 -23.5t-24 -34.5q-6 -13 -3 -28q2 -13 11.5 -24.5t22 -20t27 -11.5t27.5 0q8 2 16 8t14 13.5t9.5 16
|
||||
t3.5 17.5zM248 522q-14 -1 -22 -6t-9 -15q-2 -23 4 -42.5t25 -33.5q2 -2 6 -2t6 2q12 14 19.5 30.5t5.5 36.5q-3 32 -35 30z" />
|
||||
<glyph glyph-name="nine" unicode="9" horiz-adv-x="604"
|
||||
d="M505 337q-2 -44 -7.5 -86t-20.5 -83q-38 -101 -132 -147q-145 -71 -286 15l-23 14t-23 15q-15 12 -4 31q14 23 27 47t27 47q5 8 9.5 10t14.5 -3q40 -24 83 -43q29 -14 58.5 -11t58.5 14q33 13 48 39t18 62q1 7 -3 9t-9 -2q-5 -2 -8.5 -5t-8.5 -5q-103 -60 -198 17
|
||||
q-20 16 -36.5 33t-28.5 39q-13 22 -18.5 49.5t-3 55t12 53.5t25.5 46q22 27 52 52.5t62 36.5q12 6 35.5 8t50.5 0.5t53.5 -7t46.5 -15.5q52 -25 77 -68.5t37 -94.5q8 -30 9.5 -61t4.5 -62zM322 431q1 18 -5.5 33t-17 24.5t-25 13t-30.5 -0.5q-14 -4 -25 -12.5t-13 -22.5
|
||||
q-3 -16 -6.5 -32.5t9.5 -33.5q11 -14 32.5 -21.5t40.5 -2.5q37 9 40 55z" />
|
||||
<glyph glyph-name="hyphen" unicode="-" horiz-adv-x="302"
|
||||
d="M125 293h95q11 0 9 -11l-3 -60q-1 -15 -5 -20t-19 -6q-20 -2 -39 -2h-39h-84q-17 0 -22.5 5t-10.5 20q-1 2 -1 3t-1 3q-2 26 -2.5 40t4.5 20t17.5 6h36.5h19t21 0.5t17 1z" />
|
||||
<glyph glyph-name="equal" unicode="=" horiz-adv-x="396"
|
||||
d="M29 308q-18 0 -20 20l-2 31.5t-1 31.5q0 11 4 14.5t15 4.5h17.5h39h52h55.5h50.5h36.5q19 0 20 -18q2 -12 4.5 -24.5t4.5 -24.5q3 -26 -22 -30q-4 -1 -21 -1.5t-41.5 -1t-53 -1l-55.5 -1t-49.5 -0.5h-33.5zM154 243h120q13 0 15 -2t1 -15q0 -17 0.5 -32.5t0.5 -31.5
|
||||
q-1 -14 -5 -18t-18 -5h-11l-219 3q-19 0 -23.5 4t-6.5 23q-2 13 -1.5 26t0.5 27q-1 13 2.5 16.5t17.5 4.5h127z" />
|
||||
<glyph glyph-name="parenleft" unicode="(" horiz-adv-x="323"
|
||||
d="M246 -14q-5 -2 -9 -4t-9 -2q-22 0 -43.5 -0.5t-44.5 0.5q-13 2 -22 14l-23.5 33.5t-20.5 34.5l-28.5 63l-26.5 63q-11 25 -13 50t0 51q5 73 33.5 135t74.5 117q6 7 12 13t11 14q26 32 60.5 38t71.5 2q6 0 6.5 -4.5t-2.5 -8.5l-15 -20.5t-15 -18.5q-21 -23 -37 -49.5
|
||||
t-29 -55.5q-26 -57 -31 -117t4 -121q6 -46 22 -87.5t37 -81.5q8 -15 17.5 -29z" />
|
||||
<glyph glyph-name="parenright" unicode=")" horiz-adv-x="312"
|
||||
d="M70 -20q-18 1 -27 2.5t-11.5 6t0.5 13.5t11 25l25 52l26 52q29 60 35.5 122t-4.5 127q-11 62 -36 116t-69 100q-6 7 -13 21q-5 11 -2 15t14 5h42t42 -1q5 -1 10.5 -4t9.5 -7q38 -36 65.5 -78.5t40.5 -93.5q14 -56 21.5 -112.5t-0.5 -115.5q-5 -41 -19 -79t-34 -73
|
||||
q-11 -20 -24.5 -38.5t-24.5 -38.5q-11 -18 -32 -18h-35q-2 0 -4 1q-2 0 -3.5 0.5t-3.5 0.5z" />
|
||||
<glyph glyph-name="period" unicode="." horiz-adv-x="229"
|
||||
d="M84 -4q-4 1 -10.5 2t-14.5 2q-15 3 -26.5 12t-18.5 21.5t-9 28.5t3 32q8 26 34 38.5t55 3.5q18 -6 32 -15q42 -28 28 -73q-7 -23 -26.5 -37.5t-46.5 -14.5z" />
|
||||
<glyph glyph-name="colon" unicode=":" horiz-adv-x="209"
|
||||
d="M154 355q-5 -38 -38 -58q-13 -8 -30 -8.5t-32.5 5t-28.5 16t-18 24.5q-6 16 -2.5 31.5t13.5 29.5q13 19 36 28.5t44 2.5q24 -7 40 -27t16 -44zM75 0q-36 2 -54 20.5t-16 52.5q1 14 6.5 26.5t15 21.5t21.5 14t25 4q73 -5 70 -74q-1 -29 -20.5 -48t-47.5 -17z" />
|
||||
<glyph glyph-name="comma" unicode="," horiz-adv-x="219"
|
||||
d="M145 46q0 -20 -7.5 -40t-20 -37.5t-29.5 -30.5t-35 -18q-3 -1 -6.5 0t-6.5 1q1 3 1 6.5t1 6.5q2 6 5.5 12.5t5.5 12.5q4 14 2 18.5t-15 12.5q-24 15 -32 40t3 48q12 23 37 31.5t51 -1.5q14 -5 23 -10.5t14 -12t7 -16t2 -23.5z" />
|
||||
<glyph glyph-name="semicolon" unicode=";" horiz-adv-x="239"
|
||||
d="M159 49q0 -16 -4.5 -29.5t-12.5 -27.5q-15 -29 -39 -45t-53 -27q-5 -2 -9.5 0.5t-9.5 3.5q2 4 3.5 7.5t3.5 7.5q3 5 7 9.5t7 10.5q7 12 4.5 18.5t-13.5 15.5q-6 5 -11.5 9t-10.5 9q-12 13 -15 29.5t1.5 32.5t15 29t25.5 18q20 7 38.5 6.5t37.5 -5.5q19 -4 24 -24
|
||||
q4 -11 6.5 -23.5t4.5 -24.5zM91 282q-17 0 -32 6t-27 16t-19.5 23t-7.5 27q0 15 6.5 29.5t17.5 26t25.5 18t29.5 6.5q36 0 60 -22.5t24 -54.5q-1 -33 -23 -54.5t-54 -20.5z" />
|
||||
<glyph glyph-name="quotesingle" unicode="'" horiz-adv-x="833"
|
||||
/>
|
||||
<glyph glyph-name="slash" unicode="/" horiz-adv-x="323"
|
||||
d="M57 -3q-9 0 -17.5 -0.5t-17.5 -0.5q-14 1 -17 4.5t1 17.5q11 42 19.5 84l17 84.5l17.5 85t21 83.5q14 49 25 97.5l23 97.5q2 8 3.5 12.5t4.5 7t7.5 3t12.5 0.5q39 1 78 0q14 0 18 -5t1 -19q-5 -26 -9.5 -52t-11.5 -52l-47 -195l-48 -195q-2 -10 -5 -19l-6 -18
|
||||
q-8 -24 -31 -23q-10 1 -19.5 1h-19.5v1z" />
|
||||
<glyph glyph-name="backslash" unicode="\" horiz-adv-x="344"
|
||||
d="M195 -6q-1 0 -4 -1t-6 -1q-15 -2 -24.5 -1t-15.5 5t-10 13t-8 24l-29.5 116.5l-29.5 116.5q-6 26 -13.5 52.5t-13.5 53.5q-4 19 -6 38t-6 38l-10 39.5l-10 39.5q-2 5 -3 10l-2 10q-2 8 1 13t11 5q26 1 51 1.5t51 0.5q6 0 8.5 -4.5t4.5 -9.5l63 -257.5l62 -257.5
|
||||
q2 -5 2.5 -10t1.5 -10q4 -16 0 -21t-19 -5q-11 -1 -21.5 0t-24.5 2z" />
|
||||
<glyph glyph-name="plus" unicode="+" horiz-adv-x="407"
|
||||
d="M175 425q23 -1 35.5 -1.5t18 -6t6 -17.5t-0.5 -36q-1 -2 -0.5 -3.5t0.5 -3.5q0 -17 1 -25t5.5 -11t13 -2.5t25.5 0.5h42q17 0 17 -17q0 -37 3 -71q1 -18 -15 -18q-17 -1 -32.5 -1t-31.5 -1q-14 0 -17 -3t-4 -17q-1 -12 -1 -27.5v-27.5q0 -24 -18 -19q-17 4 -33.5 3
|
||||
l-33.5 -2t-22 5t-6 24q-1 11 -1 26v26q-1 19 -20 19q-8 -1 -16 -1h-16q-7 0 -13 -1t-12 0q-14 1 -22 2t-13 4.5t-6.5 11.5t-1.5 25q0 10 -1.5 19t-1.5 19q1 12 5 16.5t17 5.5q15 1 30 0t30 -1t23.5 1t12 4.5t4 12t0.5 23.5q-1 14 -1.5 25.5t-1.5 25.5q0 17 18 17
|
||||
q9 0 18 -0.5t17 -1.5z" />
|
||||
<glyph glyph-name="uni0410" unicode="А" horiz-adv-x="760"
|
||||
d="M259 135q-11 0 -16.5 -1t-9 -3.5t-6 -8.5t-5.5 -16q-5 -18 -11 -35.5t-11 -35.5q-7 -34 -40 -34q-36 -2 -71.5 -2t-71.5 -1q-16 0 -11 16l47.5 144.5l46.5 145.5q14 44 26 87.5t26 87.5l20.5 60t19.5 61q6 20 18 28t30 8q21 -1 41.5 -1.5t40.5 -0.5q23 0 46 0.5t46 0.5
|
||||
q13 0 25.5 0.5t25.5 0.5q12 0 19 -1t11 -4t6.5 -9.5t5.5 -18.5l40 -155.5l41 -155.5l32.5 -116l33.5 -115q6 -24 8.5 -36.5t-1 -18.5t-14 -6.5t-30.5 0.5q-34 0 -67.5 1l-67.5 2q-18 1 -21 18q-2 15 -5 30.5l-6 30.5q-2 8 -4 15t-4 15q-5 20 -24 20q-13 -1 -25.5 -0.5
|
||||
t-24.5 0.5l-12 0.5t-29 1t-36 1t-32 0.5zM360 481q-2 3 -6 -6.5t-6 -12.5l-27 -81l-23 -65l-23 -66q-5 -14 -1.5 -18t18.5 -4q24 -1 48 -1h48q19 1 22 4.5t-2 23.5q-8 41 -17 81l-18 81q-2 7 -3.5 18t-3.5 21l-3.5 17.5t-2.5 7.5z" />
|
||||
<glyph glyph-name="uni041D" unicode="Н" horiz-adv-x="667"
|
||||
d="M554 94q1 -26 1.5 -41.5t0.5 -41.5q0 -11 -4.5 -14.5t-17.5 -2.5q-29 1 -58 1.5t-58 0.5q-17 0 -20.5 3t-4.5 20q-2 47 -4.5 96t-4.5 96v11t-1 12q0 12 -15 14q-40 2 -79.5 0.5t-78.5 0.5q-20 1 -18 -19q1 -49 -1 -95t0 -99q1 -7 1.5 -13.5t-0.5 -13.5q0 -14 -14 -14
|
||||
q-10 0 -19.5 0.5t-19.5 1.5q-27 2 -54 0.5t-54 0.5q-18 2 -23 6.5t-5 21.5q0 56 -1 104.5t0 104.5q1 89 2.5 176.5t3.5 176.5v31q0 19 19 19q14 0 28.5 0.5t29.5 -0.5q20 -1 38.5 -1.5t38.5 -2.5t24.5 -5.5t4.5 -23.5q1 -48 1 -85.5t-1 -84.5q0 -18 0.5 -28.5t5 -15.5
|
||||
t14.5 -6t28 -1q32 0 62.5 1.5t61.5 2.5q20 0 20 17q-1 5 -0.5 10t0.5 10q-2 54 -3 98t-3 98q-2 16 12 16h123q11 0 16 -1q15 -2 19.5 -6.5t5.5 -20.5q3 -72 3 -143q0 -39 -1 -77.5l-2 -77.5v-24v-57.5t0.5 -71t0.5 -64.5z" />
|
||||
<glyph glyph-name="uni0415" unicode="Е" horiz-adv-x="594"
|
||||
d="M88 -1h-54q-22 -1 -25.5 3t-3.5 27q0 25 0.5 50t0.5 50v227t1 226q0 5 -0.5 8.5t-0.5 7.5q0 15 0.5 23.5t5 13t13 6t24.5 1.5h38t71 -0.5t88 -1t89.5 -0.5h75t44.5 1q21 0 26.5 -6.5t5.5 -24.5q0 -26 -0.5 -49.5t0.5 -48.5q0 -22 -21 -22q-12 0 -23.5 1t-23.5 1h-147h-81
|
||||
q-15 0 -19 -4t-3 -19q1 -20 2 -36t2 -36q1 -22 22 -22h19.5h26h26h19.5q23 2 21 -20v-66q0 -11 -16 -13q-7 0 -19.5 -0.5t-26 -1.5t-26 -1.5t-19.5 -0.5q-11 -1 -16 -5.5t-5 -15.5v-78q-2 -21 21 -21q11 0 21 0.5t21 0.5q40 -1 79.5 -1t79.5 -1q16 0 31 0.5t31 0.5
|
||||
q14 0 19.5 -4t6.5 -17q2 -26 3.5 -51t1.5 -51q0 -21 -6.5 -27t-27.5 -5h-41.5h-63h-75.5t-76.5 0.5t-67.5 0.5t-48 1z" />
|
||||
<glyph glyph-name="question" unicode="?" horiz-adv-x="552"
|
||||
d="M231 184q-14 0 -27 -0.5t-27 0.5t-19.5 7t-5.5 20q0 31 10 58t35 47q18 15 37 27t42 20q21 7 30 22.5t13 35.5q6 36 -24 57q-8 6 -13 7q-17 4 -38 3t-40.5 -7.5t-35.5 -18.5t-23 -29q-3 -6 -5 -12.5t-13 -8.5q-11 -3 -20 -3.5t-20 6.5q-18 13 -36.5 24l-37.5 22
|
||||
q-11 6 -10.5 11.5t4.5 13.5q32 63 82 102t121 52q39 7 76.5 4t75.5 -14q42 -12 68 -41.5t40 -69.5q16 -44 10.5 -85.5t-24.5 -81.5q-6 -13 -17.5 -23t-22.5 -18t-23 -14t-23 -13q-23 -13 -39 -31t-21 -44q-3 -14 -10.5 -18.5t-18.5 -4.5q-7 0 -15 -0.5t-16 -0.5
|
||||
q-9 -1 -19 -1zM316 56q0 -14 -2 -22.5t-7 -14.5t-13 -11t-21 -10q-31 -11 -63.5 -2t-48.5 36q-11 20 -8 40q4 33 31 53t63 17q31 -2 50.5 -26.5t18.5 -59.5z" />
|
||||
<glyph glyph-name="exclam" unicode="!" horiz-adv-x="270"
|
||||
d="M157 636q13 -1 21.5 -2.5t12.5 -5.5t5 -12t1 -21q-1 -26 -3 -51.5t-5 -50.5l-15.5 -125.5l-15.5 -125.5q-1 -5 -1 -9.5t-1 -9.5q-3 -17 -8 -21t-23 -4q-21 0 -42 1t-42 1q-15 0 -15 12q-2 21 -3 41.5l-2 40.5q-4 78 -7 152t-7 152q0 4 -0.5 7.5t-0.5 7.5q1 14 5 19t18 4
|
||||
h27h38h37.5h25.5zM87 0q-34 1 -58 22t-23 50q0 18 7.5 33.5t19.5 27.5t27.5 19t32.5 7q16 0 31 -6.5t25.5 -17.5t16 -25.5t4.5 -30.5q-2 -15 -7.5 -29.5t-15.5 -26t-24.5 -18t-35.5 -5.5z" />
|
||||
<glyph glyph-name="emdash" unicode="—" horiz-adv-x="510"
|
||||
d="M390 301q15 0 18 -2.5t4 -16.5q2 -17 2 -32.5t1 -32.5q0 -18 -16 -19l-30 -2t-30 -1q-26 0 -72 -1t-92.5 -2.5t-84 -2.5t-47.5 -2q-19 -1 -28 3t-10 25q-2 20 -0.5 34.5t-0.5 31.5q-2 11 2.5 14.5t16.5 4.5h38h63h76.5h77.5t67 0.5t45 0.5z" />
|
||||
<glyph glyph-name="endash" unicode="–" horiz-adv-x="375"
|
||||
d="M154 296h120q13 0 15 -2t1 -16q0 -16 0.5 -31.5t0.5 -32.5q-1 -14 -5 -17.5t-18 -5.5h-11l-219 3q-19 0 -23.5 4t-6.5 23q-2 14 -1.5 27t0.5 26q-1 13 2.5 17t17.5 4q32 1 63.5 0.5t63.5 -0.5v1z" />
|
||||
<glyph glyph-name="uni0430" unicode="а" horiz-adv-x="760"
|
||||
d="M259 135q-11 0 -16.5 -1t-9 -3.5t-6 -8.5t-5.5 -16q-5 -18 -11 -35.5t-11 -35.5q-7 -34 -40 -34q-36 -2 -71.5 -2t-71.5 -1q-16 0 -11 16l47.5 144.5l46.5 145.5q14 44 26 87.5t26 87.5l20.5 60t19.5 61q6 20 18 28t30 8q21 -1 41.5 -1.5t40.5 -0.5q23 0 46 0.5t46 0.5
|
||||
q13 0 25.5 0.5t25.5 0.5q12 0 19 -1t11 -4t6.5 -9.5t5.5 -18.5l40 -155.5l41 -155.5l32.5 -116l33.5 -115q6 -24 8.5 -36.5t-1 -18.5t-14 -6.5t-30.5 0.5q-34 0 -67.5 1l-67.5 2q-18 1 -21 18q-2 15 -5 30.5l-6 30.5q-2 8 -4 15t-4 15q-5 20 -24 20q-13 -1 -25.5 -0.5
|
||||
t-24.5 0.5l-12 0.5t-29 1t-36 1t-32 0.5zM360 481q-2 3 -6 -6.5t-6 -12.5l-27 -81l-23 -65l-23 -66q-5 -14 -1.5 -18t18.5 -4q24 -1 48 -1h48q19 1 22 4.5t-2 23.5q-8 41 -17 81l-18 81q-2 7 -3.5 18t-3.5 21l-3.5 17.5t-2.5 7.5z" />
|
||||
<glyph glyph-name="uni0431" unicode="б" horiz-adv-x="635"
|
||||
d="M156 -12q-31 1 -61.5 1t-62.5 2q-17 1 -22 6t-5 22q1 34 1.5 67.5t1.5 68.5v135v246q0 44 -3 89q0 11 4 14.5t14 3.5h38.5h60.5t71.5 -0.5t73 -0.5h65.5t47 1q11 1 21.5 1.5t21.5 -0.5q18 -1 25 -8t6 -26q-1 -25 -3 -47.5t-4 -47.5q-1 -8 -2 -13t-3.5 -7t-7.5 -2.5
|
||||
t-14 -0.5q-35 -1 -69.5 -0.5t-69.5 -0.5q-22 0 -45 -0.5t-44 -0.5q-16 0 -18 -16q-2 -17 -0.5 -33t0.5 -34q0 -9 5 -12t13 -3q28 -3 55.5 -2.5t56.5 0.5q29 -1 57 -7.5t56 -15.5q35 -12 60.5 -35t42.5 -55q14 -26 13 -51t-7 -62q-9 -56 -38 -90.5t-66.5 -53.5t-77.5 -25
|
||||
t-73 -6h-21.5h-39h-37t-16.5 -1zM233 256q-8 2 -17 1t-19 0q-20 2 -21 -17q0 -23 -0.5 -44.5t-0.5 -44.5q0 -17 18 -20q57 -12 110 11q14 6 22.5 17t11.5 24t-0.5 25.5t-14.5 22.5q-10 8 -22.5 12.5t-25.5 7.5q-9 3 -19.5 4t-21.5 1z" />
|
||||
<glyph glyph-name="uni0432" unicode="в" horiz-adv-x="646"
|
||||
d="M429 377q14 -5 25 -10l22 -10q9 -4 20 -16t20.5 -32t16 -48.5t6.5 -64.5q0 -29 -14 -58t-35.5 -54.5t-47.5 -45t-50 -28.5q-36 -14 -73.5 -19t-75.5 -6q-2 0 -4 0.5t-4 -0.5q-17 -2 -49.5 -1.5t-65.5 1.5q-39 1 -82 2q-7 0 -12 2t-9 5t-6 9q-5 17 -5 33q-1 79 -1 157.5
|
||||
v157.5q0 44 0.5 87t0.5 87q1 29 0.5 57.5t-2.5 57.5q0 15 12 15q64 1 120.5 2t120.5 0q23 0 45.5 -5t45.5 -11q29 -8 53 -25.5t44 -40.5q12 -15 17 -37q4 -20 6 -39.5t0.5 -37.5t-7.5 -35.5t-19 -33.5q-2 -3 -5 -6.5t-8 -8.5zM186 205v-26q-2 -20 -2 -30t4.5 -14t14.5 -4
|
||||
t28 -1q30 -2 57 8t51 27q40 27 14 70q-10 15 -28 27q-29 19 -59.5 19.5t-62.5 -3.5q-10 -2 -13 -7t-3 -14q0 -7 -0.5 -15.5t-0.5 -16.5v-20zM183 478v-41.5t6 -19.5t20 -4t43 4q12 2 23 6.5t22 10.5q14 8 20 21.5t5 29.5t-11 25.5t-24 13.5q-12 3 -24.5 4l-25.5 2
|
||||
q-12 1 -24 0t-23 -1q-2 -13 -3.5 -25.5t-3.5 -25.5z" />
|
||||
<glyph glyph-name="uni0433" unicode="г" horiz-adv-x="542"
|
||||
d="M8 293v50t-0.5 61l-1 64t-1 58.5t-1 44.5t-0.5 23v15t1 15q0 17 19 18q21 0 54.5 0.5t73 0.5h81h77.5t63.5 -0.5t38.5 -0.5q18 0 22 -4t6 -22q3 -31 2 -58.5t2 -58.5q2 -16 -2 -21.5t-19 -7.5q-6 -1 -33 -1.5t-61.5 -0.5t-69 -0.5t-56.5 -0.5q-16 0 -16 -17
|
||||
q0 -4 -0.5 -7.5t-0.5 -7.5q1 -75 0 -156t1 -156q1 -23 0.5 -40t0.5 -40q1 -14 -2 -31q-3 -15 -19 -15q-38 -2 -72.5 -2.5t-71.5 -1.5q-8 0 -10.5 4t-3.5 10q-1 7 -1 13.5v13.5v130t-1 129h1z" />
|
||||
<glyph glyph-name="uni0434" unicode="д" horiz-adv-x="792"
|
||||
d="M570 179q1 -20 4.5 -24.5t23.5 -5.5q13 -1 25.5 -1t24.5 -1q15 0 21 -4t9 -18q1 -6 1 -12v-11q0 -33 0.5 -66t0.5 -66v-11.5t-1 -11.5q-3 -17 -22 -17q-21 0 -42.5 -0.5t-42.5 -0.5q-20 0 -17 20v3q0 17 -1 26t-5 13.5t-13 5.5t-25 1q-12 0 -42 0.5t-69 1t-82.5 1
|
||||
t-82 0.5h-67.5t-39 -1q-4 -1 -8 -6t-5 -10q-2 -11 -1.5 -27t0.5 -27q0 -6 -2.5 -11t-10.5 -5q-26 -1 -55 -2t-55 0q-14 0 -18 5t-5 19q-2 44 -1 87t-1 87q-1 14 2.5 17.5t17.5 1.5q22 -3 36 16l27.5 35t24.5 37q22 39 39.5 79.5t27.5 84.5q2 9 8 31.5t12 49t10 51.5t4 40
|
||||
q-1 20 1.5 36.5t3.5 36.5q1 19 20 18q49 0 97 0.5t96 -0.5q72 0 143 -3q17 -1 20.5 -5t3.5 -21q0 -19 0.5 -53.5t1.5 -77l2 -88.5t1.5 -88t1.5 -76.5t2 -52.5zM400 314v18t-1 44t-1.5 55t-1.5 51q0 5 -2 11t-4 6q-11 1 -22.5 1t-22.5 -2q-9 -2 -8.5 -9t-0.5 -14
|
||||
q-2 -16 -3 -29t-3 -30q-8 -65 -27.5 -128t-51.5 -121q-1 -3 -2 -5.5t-2 -5.5q-3 -6 -0.5 -9.5t8.5 -3.5q31 0 67.5 1t67.5 2q17 0 17 17v17.5t-1 17.5q-2 29 -3 58t-3 58z" />
|
||||
<glyph glyph-name="uni0435" unicode="е" horiz-adv-x="594"
|
||||
d="M88 -1h-54q-22 -1 -25.5 3t-3.5 27q0 25 0.5 50t0.5 50v227t1 226q0 5 -0.5 8.5t-0.5 7.5q0 15 0.5 23.5t5 13t13 6t24.5 1.5h38t71 -0.5t88 -1t89.5 -0.5h75t44.5 1q21 0 26.5 -6.5t5.5 -24.5q0 -26 -0.5 -49.5t0.5 -48.5q0 -22 -21 -22q-12 0 -23.5 1t-23.5 1h-147h-81
|
||||
q-15 0 -19 -4t-3 -19q1 -20 2 -36t2 -36q1 -22 22 -22h19.5h26h26h19.5q23 2 21 -20v-66q0 -11 -16 -13q-7 0 -19.5 -0.5t-26 -1.5t-26 -1.5t-19.5 -0.5q-11 -1 -16 -5.5t-5 -15.5v-78q-2 -21 21 -21q11 0 21 0.5t21 0.5q40 -1 79.5 -1t79.5 -1q16 0 31 0.5t31 0.5
|
||||
q14 0 19.5 -4t6.5 -17q2 -26 3.5 -51t1.5 -51q0 -21 -6.5 -27t-27.5 -5h-41.5h-63h-75.5t-76.5 0.5t-67.5 0.5t-48 1z" />
|
||||
<glyph glyph-name="uni0451" unicode="ё" horiz-adv-x="594"
|
||||
d="M475 634q19 0 21 -18q0 -4 0.5 -20t0.5 -34t-0.5 -33t-0.5 -16q-1 -14 -4.5 -18t-18.5 -4q-16 0 -52.5 -0.5t-78 -1t-78.5 -1.5t-54 -1q-15 0 -20.5 -5.5t-6.5 -19.5q-2 -20 -2 -32v-31q0 -20 23 -20q21 0 41.5 -1l41.5 -2q19 -2 15 -21q-2 -14 -1.5 -28.5t-1.5 -28.5
|
||||
q-2 -17 -7.5 -21.5t-22.5 -4.5t-33 0.5t-33 0.5q-14 -1 -19 -5t-5 -18q1 -20 0 -40.5t1 -40.5q2 -17 7.5 -20.5t21.5 -2.5q27 0 56 0.5t56 0.5q34 -1 68 -1.5t68 -2.5q18 -1 24 -7t5 -23v-24.5t0.5 -28.5t0.5 -24.5v-12.5q-1 -16 -6.5 -21t-22.5 -5h-40h-75.5h-93.5h-93.5
|
||||
h-76h-40.5q-13 0 -20 0.5t-10.5 4t-4.5 10.5t-1 19q-1 61 -1 120t-1 120v89q1 43 2 78.5t2 78.5q1 24 0 48t0 48q0 17 3.5 20.5t20.5 3.5q47 1 93 0.5t93 -0.5l28.5 0.5t69 0t85 -1.5t77.5 -2zM127 695q-16 1 -29.5 7t-23.5 16.5t-15.5 23.5t-4.5 28q1 13 7.5 25t16.5 21
|
||||
t22.5 14.5t25.5 5.5q12 0 24.5 -6.5t22 -17t15.5 -23t6 -24.5q0 -15 -5.5 -28t-14.5 -22.5t-21.5 -15t-25.5 -4.5zM396 831q12 0 23.5 -5t20.5 -13.5t14 -19t5 -22.5q-1 -30 -18.5 -49.5t-44.5 -18.5q-29 0 -48 19.5t-19 49.5q-1 26 18 42.5t49 16.5z" />
|
||||
<glyph glyph-name="uni0436" unicode="ж" horiz-adv-x="927"
|
||||
d="M352 369q2 0 3 12.5t2 29.5t1 36t-1 33q-2 38 -4.5 69.5t-4.5 69.5q-1 17 2.5 21t20.5 5q32 1 64 0.5t64 -0.5q11 0 13.5 -5t2.5 -15q0 -61 1 -116t2 -116v-8t2 -7q1 -2 4.5 -3t3.5 0q5 5 9 10t7 11l57.5 108t57.5 109q7 15 16.5 23t27.5 6q25 -2 50 -1t50 1q9 0 17 -1
|
||||
t13 -12q4 -10 1 -17t-8 -15l-74.5 -114.5l-74.5 -114.5q-9 -15 -9 -29t8 -29l24 -46l30 -57l31.5 -60.5l28.5 -56l22 -44t12 -23.5q9 -19 -11 -22q-17 -3 -34 -3q-23 2 -46.5 1t-46.5 1q-19 1 -27 18l-59 114.5l-60 114.5q-2 3 -3.5 6.5t-3.5 7.5q-3 3 -6 3q-4 0 -4 -5
|
||||
q-1 -7 -1.5 -13.5t-0.5 -13.5q2 -57 3 -111l2 -112q1 -10 -5 -16.5t-15 -3.5q-32 -1 -62 0.5t-61 -0.5q-17 -2 -20.5 2.5t-4.5 21.5l-2 114.5l-2 115.5v9.5t-1 9.5q0 5 -5 5q-5 2 -7 -2l-5.5 -7.5t-5.5 -8.5l-48.5 -81l-49.5 -82l-28 -44l-28 -44q-5 -8 -9.5 -9t-22.5 0
|
||||
q-3 2 -18 2.5t-34.5 0.5h-39h-30.5q-29 2 -12 25q8 13 17 24t17 24l27.5 41.5l31.5 48.5l32 49.5l29 44.5l21 32.5t9 13.5q14 20 2 40l-21.5 39l-21.5 39q-23 38 -45 69t-45 69q-11 18 -21 36.5t-21 36.5q-10 17 11 17q13 0 33.5 -0.5t39.5 -0.5t33.5 -0.5t16.5 -0.5
|
||||
q10 2 22 1.5t18 -4.5q9 -6 14.5 -17l10.5 -21l30 -55.5l30 -52l30 -51.5l31 -55q2 -3 4 -9t7 -6z" />
|
||||
<glyph glyph-name="uni0437" unicode="з" horiz-adv-x="593"
|
||||
d="M403 626q44 -21 65.5 -57.5t23.5 -75.5t-13.5 -74.5t-45.5 -54.5q-6 -4 -9 -7q-4 -4 -4 -6.5t6 -6.5q11 -7 21 -15l20 -16q18 -16 28 -41.5t12 -53.5t-4 -54.5t-19 -44.5q-39 -54 -90 -83.5t-115 -38.5q-16 -2 -31.5 -3t-30.5 -1q-29 -2 -54.5 4t-49.5 16.5t-47.5 23.5
|
||||
l-46.5 27q-8 5 -11.5 13.5t0.5 18.5l22.5 52l22.5 52q2 4 8 6t11 1t9.5 -4.5t9.5 -5.5q35 -20 72.5 -34t79.5 -17q21 -2 38 6l34 16q5 3 8.5 10t5 15.5t1.5 17.5t-3 15q-17 42 -60 48q-14 2 -27.5 2t-27.5 1q-16 0 -16 15q-2 18 -3.5 36.5t-3.5 36.5q18 5 35.5 8.5t35.5 8.5
|
||||
l24 8t23 12q14 10 20.5 23t5 26t-10 24.5t-24.5 19.5q-20 11 -41 13t-44 -6t-45 -16.5t-43 -20.5q-19 -11 -27 -9.5t-20 21.5q-13 20 -25 40.5t-23 41.5q-2 4 -1 10t4 10q5 5 11 9t13 7q44 24 87 32t91 20q6 2 24.5 3t43 -0.5t51 -6.5t49.5 -17z" />
|
||||
<glyph glyph-name="uni0438" unicode="и" horiz-adv-x="750"
|
||||
d="M7 616q0 18 4.5 21.5t23.5 1.5q20 -2 40.5 -1.5t40.5 -0.5q12 0 24.5 1t25.5 -1q15 -2 20.5 -8.5t5.5 -22.5q1 -5 0.5 -9.5t-0.5 -9.5v-264v-13.5t1 -13.5q0 -7 5 -9q6 0 9 5q4 3 7 7t5 8q51 71 100.5 148.5t99.5 147.5q12 20 28 28.5t43 7.5q26 -3 53.5 -2t53.5 0
|
||||
q24 -2 31 -9t6 -31q-2 -102 -1.5 -209.5t-1.5 -209.5q-1 -39 0 -73.5t2 -73.5q0 -7 0.5 -12t-0.5 -12q-1 -9 -6 -14.5t-15 -3.5q-32 1 -65 2.5t-66 0.5q-7 0 -14 0.5t-13 3.5q-4 2 -7.5 7t-3.5 10q2 37 0 80t0 80q1 37 1 73.5t1 73.5q0 2 -1 6t-5 4q-3 0 -4.5 -2t-3.5 -4
|
||||
q-48 -59 -96 -127.5t-88 -134.5l-15.5 -24l-15.5 -24q-9 -15 -22 -19t-29 -6q-12 -1 -23.5 -0.5t-23.5 0.5q-20 1 -40.5 -0.5t-40.5 0.5q-23 2 -27.5 8t-3.5 30q2 37 2.5 73.5t0.5 73.5q0 38 -1 75.5l-2 75.5l0.5 15t0.5 39v55v63.5v63.5v55z" />
|
||||
<glyph glyph-name="uni0439" unicode="й" horiz-adv-x="708"
|
||||
d="M6 621q0 16 6 23t21 5q35 -2 67.5 0t67.5 -2q22 -2 20 -23v-35.5v-61.5t0.5 -73.5t1 -71t1.5 -53.5t2 -21q11 0 15 6q14 17 26.5 34l25.5 34l45.5 65l45.5 65l39.5 55l39.5 56q5 7 8.5 11t9 6.5t13 3t21.5 0.5h78q16 0 24 -0.5t12 -3.5t4.5 -10.5t1.5 -20.5
|
||||
q1 -25 1.5 -73t0.5 -106.5v-121t-0.5 -115t-0.5 -89.5v-45q0 -12 0.5 -20.5t-1.5 -20.5q-2 -13 -7 -17t-19 -3q-26 2 -52.5 0.5t-52.5 0.5q-9 1 -21.5 0t-15.5 2t-2 19t0 27q0 44 0.5 79t-0.5 79q0 23 -0.5 46.5t-1.5 46.5q0 7 -4 10q-4 2 -9 -3q-4 -4 -10 -12l-79 -103.5
|
||||
l-79 -103.5q-14 -20 -28.5 -37t-28.5 -37q-10 -15 -29 -15q-35 2 -69.5 1t-69.5 1q-8 0 -10.5 4t-3.5 11v13.5t-1 13.5q0 70 -0.5 139.5t-1.5 140.5q-1 0 -1 21v52.5v69v71v57.5v29zM308 710q-15 0 -29 6t-24 15.5t-16 21.5t-5 25q2 29 25 48.5t55 18.5q65 -1 68 -72
|
||||
q1 -12 -5.5 -23.5t-17 -20.5t-24 -14t-27.5 -5z" />
|
||||
<glyph glyph-name="uni043A" unicode="к" horiz-adv-x="677"
|
||||
d="M7 611q0 15 4 19.5t18 3.5q24 0 45 -1t46 -2q5 -1 11 -1h12q20 0 24 -3.5t5 -23.5q2 -32 2.5 -64t1.5 -64q1 -6 0 -11.5t0 -11.5l2 -10.5t3 -10.5q5 2 9 4.5t7 5.5l89 86.5l88 87.5q11 10 22 16.5t25 5.5q38 -1 75.5 -1.5t75.5 -1.5q3 0 7 -3t5 -5q1 -3 -1 -7.5t-4 -6.5
|
||||
l-76 -77.5l-76 -77.5q-14 -14 -28.5 -26.5t-28.5 -26.5q-14 -13 -14.5 -18t9.5 -21l41.5 -67.5l42.5 -67.5l61 -96.5l61 -96.5q8 -12 3.5 -22t-18.5 -12q-5 -1 -11 -1h-12q-21 -1 -42.5 -1t-42.5 -2q-23 -2 -39.5 6.5t-29.5 26.5q-14 20 -31 47t-31 47l-42 60.5l-42 60.5
|
||||
q-8 12 -13.5 12.5t-16.5 -9.5q-20 -16 -19 -44q2 -45 2.5 -89t1.5 -89q1 -20 -3.5 -25.5t-23.5 -5.5q-30 0 -64.5 1t-64.5 3q-23 1 -24 25q-1 18 -1 63v103.5v124v124.5v105v65z" />
|
||||
<glyph glyph-name="uni043B" unicode="л" horiz-adv-x="750"
|
||||
d="M635 356q0 -48 -0.5 -95t0.5 -95q1 -42 2 -76t3 -76q1 -17 -13 -17q-35 1 -70 1.5t-70 1.5q-10 0 -12 5t-2 13v54.5t-1 55.5l-3 213q-1 25 0 50t0 51q0 11 -1 17.5t-4.5 9.5t-10 4t-18.5 2h-8q-10 0 -15.5 -0.5t-9 -2.5t-6 -7.5t-5.5 -14.5l-23.5 -84t-25.5 -83
|
||||
q-15 -45 -32 -89.5t-39 -86.5q-12 -23 -31.5 -42.5l-39.5 -38.5q-17 -17 -39 -23.5t-46 -7.5q-33 -2 -64 5t-61 18q-14 5 -17.5 11.5t-1.5 21.5q6 29 11.5 59t12.5 59q4 21 25 15l9 -3.5l9 -3.5q31 -11 59.5 -2.5t46.5 35.5q8 12 14.5 25t10.5 27l27 91.5t24 91.5
|
||||
q11 42 19 85t17 85q3 17 7.5 21.5t21.5 6.5q4 0 8 0.5t7 -0.5q17 0 43 0.5t56.5 0.5h62.5h61h52h35q18 -1 21.5 -5t3.5 -23q0 -47 -0.5 -93t-1.5 -93v-21.5t0.5 -24t1 -20z" />
|
||||
<glyph glyph-name="uni043C" unicode="м" horiz-adv-x="979"
|
||||
d="M5 622q0 12 3.5 16t16.5 5q15 1 40.5 1t51 -1t45 -1t24.5 1q18 4 25 -12q28 -58 52.5 -103l47 -84.5l44.5 -77.5l45 -81q8 -15 17 -26q7 -11 15 0l102 165l23.5 40l31.5 56l29 53.5l17 32.5q16 36 55 33q30 -2 60 -2.5t60 -1.5q10 0 19 -3q8 -2 13 -6.5t5 -14.5
|
||||
q0 -41 1 -81.5l2 -81.5q2 -66 2.5 -132t2.5 -132l2 -81l2 -82q1 -18 -7 -25t-25 -6l-105 3q-12 0 -19 1t-10 4t-3.5 9t-0.5 18q0 68 -0.5 131.5t-0.5 132.5v9.5t-1 9.5t-1.5 11t-4.5 6q-3 1 -9.5 -7.5t-8.5 -10.5l-85.5 -128.5t-78.5 -131.5q-2 -3 -3.5 -6.5t-3.5 -6.5
|
||||
q-10 -16 -15 -25t-11 -12.5t-16 -4t-30 -0.5q-30 1 -59 0q-26 -3 -34 23l-5.5 15t-5.5 14q-11 25 -22 46t-22 46l-16.5 35.5l-16.5 35.5q-6 13 -11.5 26.5t-12.5 26.5q-5 11 -13.5 26t-12.5 15q-1 0 -1.5 -14.5t-0.5 -38v-53.5t0.5 -60l1 -57.5t0.5 -47.5v-11t-1 -12
|
||||
q-3 -21 -24 -19q-32 1 -63.5 0t-63.5 1q-18 1 -22.5 5.5t-5.5 21.5q-1 29 -1 53t-1 53q-1 39 -1.5 77.5t-0.5 77.5q0 13 0.5 25.5t0.5 24.5v15v39.5v56v64.5t-0.5 64t-0.5 56z" />
|
||||
<glyph glyph-name="uni043D" unicode="н" horiz-adv-x="667"
|
||||
d="M554 94q1 -26 1.5 -41.5t0.5 -41.5q0 -11 -4.5 -14.5t-17.5 -2.5q-29 1 -58 1.5t-58 0.5q-17 0 -20.5 3t-4.5 20q-2 47 -4.5 96t-4.5 96v11t-1 12q0 12 -15 14q-40 2 -79.5 0.5t-78.5 0.5q-20 1 -18 -19q1 -49 -1 -95t0 -99q1 -7 1.5 -13.5t-0.5 -13.5q0 -14 -14 -14
|
||||
q-10 0 -19.5 0.5t-19.5 1.5q-27 2 -54 0.5t-54 0.5q-18 2 -23 6.5t-5 21.5q0 56 -1 104.5t0 104.5q1 89 2.5 176.5t3.5 176.5v31q0 19 19 19q14 0 28.5 0.5t29.5 -0.5q20 -1 38.5 -1.5t38.5 -2.5t24.5 -5.5t4.5 -23.5q1 -48 1 -85.5t-1 -84.5q0 -18 0.5 -28.5t5 -15.5
|
||||
t14.5 -6t28 -1q32 0 62.5 1.5t61.5 2.5q20 0 20 17q-1 5 -0.5 10t0.5 10q-2 54 -3 98t-3 98q-2 16 12 16h123q11 0 16 -1q15 -2 19.5 -6.5t5.5 -20.5q3 -72 3 -143q0 -39 -1 -77.5l-2 -77.5v-24v-57.5t0.5 -71t0.5 -64.5z" />
|
||||
<glyph glyph-name="uni043E" unicode="о"
|
||||
d="M654 323q-2 -46 -20 -97.5t-51 -101.5q-35 -51 -83 -82t-103 -52q-16 -6 -34.5 -10t-37.5 -5.5t-37.5 -0.5t-34.5 5q-18 4 -46 15.5t-60 29t-64 41.5t-58 54q-23 27 -34.5 59.5t-13.5 68.5q-3 54 4.5 106t30.5 102q12 26 32 54.5t51 54.5t74 48t102 36q29 6 65.5 5
|
||||
t74.5 -11q28 -7 56.5 -22t53.5 -33t44 -36.5t30 -32.5q31 -40 44.5 -86t14.5 -109zM302 154q27 -1 48.5 2.5t41.5 14.5q51 32 73 79t11 106q-5 29 -20.5 53t-38.5 41t-50.5 25t-56.5 4t-55.5 -12.5t-45.5 -31.5q-37 -42 -51 -91.5t1 -106.5q3 -10 10.5 -20t15.5 -17
|
||||
q27 -22 56.5 -35t60.5 -11z" />
|
||||
<glyph glyph-name="uni043F" unicode="п" horiz-adv-x="688"
|
||||
d="M561 353q-2 -58 -3 -115l-2 -114q-1 -26 0.5 -47.5t2.5 -47.5q0 -15 -3.5 -19.5t-17.5 -5.5l-65.5 -4t-65.5 -3q-19 -1 -19 23q0 38 0.5 70.5t0.5 70.5q0 63 0.5 124.5t-0.5 123.5q0 27 -1 39t-6 16.5t-17 4t-34 0.5q-29 1 -58 1.5t-58 -0.5q-19 0 -23.5 -4.5t-4.5 -21.5
|
||||
v-175q1 -58 1.5 -116t1.5 -116q0 -5 -1 -8q-1 -13 -2 -20t-5 -10t-11 -3.5t-20 -0.5q-28 1 -56 1.5t-56 3.5q-22 2 -27 8.5t-5 28.5v450v133q0 14 3 16t18 1q48 -2 94.5 -1.5t94.5 0.5q66 -1 129 2t127 0q16 0 31 -0.5t31 -0.5q15 0 18.5 -3t3.5 -18v-93q0 -21 0.5 -50
|
||||
l1 -56t1.5 -45.5z" />
|
||||
<glyph glyph-name="uni0440" unicode="р" horiz-adv-x="615"
|
||||
d="M6 483q1 36 1.5 63.5t1.5 62.5q0 10 0.5 16t3.5 9t8.5 4t15.5 2q8 1 15.5 0.5t15.5 -0.5q11 0 23 0.5t23 0.5q7 0 23 0.5t34 2t34.5 2t23.5 0.5q20 -2 39 -3.5t38 -3.5q45 -5 81.5 -25t70.5 -47q5 -4 8.5 -8t8.5 -9q24 -22 35.5 -43.5t13.5 -44.5t-3 -48t-14 -55
|
||||
q-21 -67 -60 -104t-102 -56q-35 -11 -70.5 -13t-72.5 0q-23 2 -28 -2.5t-6 -27.5q-1 -34 -0.5 -68t0.5 -68q0 -20 -5 -25t-26 -4l-55.5 2l-56.5 2q-19 1 -20 23q-1 27 -1 54v54v202v17v41t0.5 50.5t1.5 46.5zM230 495q-8 0 -17 -0.5t-17 -0.5q-9 -1 -14.5 -4.5t-6.5 -13.5
|
||||
q0 -29 -0.5 -60t-1.5 -60q0 -15 16 -17q36 -4 70 0.5t66 21.5q18 10 28 26q8 12 10 28.5t-3 31.5t-16 26.5t-29 14.5q-11 2 -25 3.5t-27.5 2.5t-23 1h-9.5z" />
|
||||
<glyph glyph-name="uni0441" unicode="с" horiz-adv-x="688"
|
||||
d="M-20 334q0 53 15.5 96.5t40.5 77t55.5 59t61 42.5t57 27t42.5 13q94 20 179 -19q19 -8 37.5 -19.5l35.5 -22.5q11 -6 10.5 -10.5t-9.5 -13.5l-45.5 -41.5l-45.5 -41.5q-14 -13 -32 -6q-30 11 -58 9q-18 -1 -44.5 -11t-51 -30t-42 -51.5t-17.5 -75.5q0 -53 23 -84.5
|
||||
t54 -47.5t62.5 -19.5t49.5 -0.5q32 5 57 22.5t45 43.5l9 10.5t6 4.5t7 -1.5t11 -7.5l39 -25t39 -26q14 -10 16 -16.5t-5 -21.5q-15 -34 -39 -60t-55 -46q-36 -23 -74.5 -39.5t-83.5 -18.5q-92 0 -153.5 26t-100.5 65t-58.5 84.5t-28 84.5t-9 65z" />
|
||||
<glyph glyph-name="uni0442" unicode="т" horiz-adv-x="615"
|
||||
d="M468 637q7 -1 13.5 -1t13.5 -2q20 -3 25 -8t5 -26q0 -26 -0.5 -47t-1.5 -47q-1 -17 -5 -21t-20 -3q-12 0 -30.5 -0.5t-36.5 -0.5t-32.5 -0.5t-17.5 -0.5q-15 0 -23.5 -1t-12 -5t-4 -12t0.5 -23v-32.5t-1 -75.5t-1.5 -97.5t-1.5 -97.5t-1.5 -75t-0.5 -31q-3 -30 -32 -31
|
||||
h-21.5h-26t-22.5 0.5t-12 0.5q-16 0 -25 0.5t-13 4.5t-5 12.5t-1 24.5v33t0.5 60t1 77l1 83t0.5 77.5v61.5v27q1 17 -19 19q-13 0 -34 1t-41.5 1.5t-37 1.5t-19.5 1q-15 1 -20 6t-5 20v39t1 39v12q0 9 -1 19t4 16q3 5 13.5 3.5t19.5 -1.5q13 0 46.5 0.5t76.5 0.5t91 -0.5
|
||||
t91 -0.5t76 -0.5t45 -0.5z" />
|
||||
<glyph glyph-name="uni0443" unicode="у"
|
||||
d="M159 641q14 0 22 -1.5t11.5 -5t3.5 -11t-2 -19.5q-5 -29 -0.5 -56t12.5 -54q16 -53 53 -81t84 -45q13 -5 17.5 -2t11.5 18l24 59l23 60l21 56l21 56q5 18 21 18l70 2t70 0q23 0 30 -9t-1 -32q-21 -62 -45 -120q-35 -94 -79 -181.5t-94 -173.5q-16 -28 -38 -49t-49 -38
|
||||
q-28 -17 -57.5 -30.5t-64.5 -16.5q-20 -1 -40 -0.5t-40 7.5q-28 9 -55.5 17t-52.5 25q-15 10 -16.5 14.5t5.5 22.5q10 28 18.5 55.5t19.5 54.5q8 22 18.5 24.5t30.5 -11.5q11 -8 22.5 -14.5t24.5 -11.5q38 -14 74 2t57 47q11 14 -7 20l-39 16l-39 16q-38 17 -68.5 42.5
|
||||
t-56.5 54.5q-27 31 -40.5 68t-20.5 77q-5 29 -8 54.5t-6 55.5q-1 14 2 17.5t17 3.5h28.5h40.5t39.5 -0.5t26.5 -0.5z" />
|
||||
<glyph glyph-name="uni0444" unicode="ф" horiz-adv-x="812"
|
||||
d="M457 646q4 -3 5 -14t1.5 -24t0.5 -23.5t2 -12.5q2 -5 7.5 -6l10.5 -2q88 -8 144 -38t76 -71q19 -41 30 -84q16 -66 -4 -121.5t-61 -103.5q-29 -35 -70 -53.5t-87 -24.5q-17 -3 -25.5 -5t-13 -6.5t-5 -13.5t-0.5 -25v-16q0 -18 -19 -21q-33 -3 -65.5 -3.5t-65.5 6.5
|
||||
q-20 3 -20 23q-1 14 -2.5 28.5t-2.5 28.5q-14 3 -28 5.5t-28 5.5q-20 5 -39.5 9t-39.5 10q-26 9 -50.5 23t-45 35t-34.5 49t-20 64q-10 57 4.5 107.5t45.5 97.5q17 25 40 42t51 28q29 12 60.5 19t63.5 8q10 0 16 1t8.5 4t3 9.5t0.5 17.5v15q-3 27 5.5 33.5t33.5 8.5
|
||||
q6 1 23.5 0.5t37 -1.5t36 -3.5t20.5 -5.5zM298 337h1q0 17 0.5 33t0.5 33q-1 17 -4 22t-21 3q-9 0 -26.5 -8.5t-34.5 -23t-29.5 -33.5t-11.5 -41q1 -32 13.5 -53.5t28 -34.5t32 -18t27.5 -5q9 1 15.5 3t7.5 16q0 27 0.5 53.5t0.5 53.5zM462 225q0 -17 15 -14q24 5 45.5 14.5
|
||||
t35.5 29.5q20 26 21.5 56t-9.5 61q-11 26 -32 35t-44 14q-2 0 -8 2q-14 2 -18 -0.5t-5 -16.5q0 -11 -0.5 -36t-0.5 -53.5v-54v-37.5z" />
|
||||
<glyph glyph-name="uni0445" unicode="х" horiz-adv-x="770"
|
||||
d="M649 -3q-47 -2 -90.5 -1t-89.5 -1q-11 0 -17 4t-11 12q-14 18 -27.5 39t-27.5 40l-22.5 30.5l-22.5 30.5q-14 19 -19 19t-18 -19l-31.5 -47l-31.5 -48l-8 -10.5t-7 -11.5q-26 -54 -88 -48q-32 -1 -54.5 0t-48.5 1q-10 0 -22 5q-12 3 -5 15l48.5 73l48.5 73l49 75l50 74
|
||||
q8 11 7 19.5t-8 17.5l-44.5 62.5l-43.5 62.5l-49.5 74l-49.5 74q-2 5 -4 9t-4 9q-3 12 10 12q41 1 81.5 1.5t81.5 1.5q8 0 12 -3.5t8 -9.5l50 -69.5l50 -69.5q2 -3 5 -6t5 -6q11 -14 21 0q5 8 10.5 15.5l11.5 15.5l38 54t37 56q15 21 38 21q33 0 66 0.5t67 1.5q9 0 12 -5
|
||||
t2 -13q-3 -12 -10 -24l-55.5 -85l-54.5 -84l-28 -45.5l-29 -44.5q-6 -9 -3.5 -14.5t7.5 -12.5l48.5 -60.5l48.5 -61.5l54 -73.5l53 -74.5q5 -7 9 -14t8 -15q6 -12 3 -16.5t-16 -4.5z" />
|
||||
<glyph glyph-name="uni0446" unicode="ц"
|
||||
d="M6 611q-1 16 2.5 20t20.5 7q4 0 19.5 0.5t35.5 0.5t40 -0.5t32 -0.5q11 0 14.5 -4.5t3.5 -14.5q1 -28 1.5 -68t0.5 -85t-0.5 -90.5t-0.5 -84.5t-0.5 -67.5t0.5 -38.5q0 -22 24 -22h73.5t73.5 -1q20 0 18 20q-1 16 -1 47.5v72t-0.5 85.5t-0.5 87t-1 77.5t-2 56.5v10t1 10
|
||||
q3 15 19 15q30 -2 60 -2.5t60 -2.5q16 -2 19.5 -5.5t4.5 -20.5q1 -24 2 -58t1.5 -73t0.5 -78.5t0.5 -73.5t0.5 -59v-34q1 -11 1 -21.5t1 -21.5q1 -17 2 -25.5t5.5 -13t13 -5.5t25.5 -1q3 0 6 0.5t5 -0.5q18 -1 27 -2t12 -5t3 -12t1 -21q4 -43 5 -83t0 -87q0 -15 -6 -23.5
|
||||
t-21 -9.5q-26 0 -49 0.5t-49 -0.5q-22 0 -25 20q-2 14 -1 28.5t-1 28.5q-2 17 -17 18q-9 1 -19 1.5t-19 -1.5q-17 0 -46 -0.5t-63.5 -0.5t-71 -1t-69 -1t-58 -0.5t-37.5 -0.5h-31q-10 1 -21 0.5t-18 4.5q-5 4 -4.5 15t-0.5 21q-3 97 1 192t0 192l-2 68q-1 29 -1 61.5v60.5z
|
||||
" />
|
||||
<glyph glyph-name="uni0447" unicode="ч" horiz-adv-x="656"
|
||||
d="M550 471q-1 -107 -0.5 -213t-0.5 -213q0 -11 -0.5 -16.5l-1.5 -16.5q-2 -14 -6.5 -18t-18.5 -3q-30 2 -60 0t-60 2q-26 3 -26 36v117q0 14 -1 28.5l-2 29.5q-1 17 -17 9q-5 -2 -10.5 -5.5t-10.5 -5.5l-41.5 -16t-41.5 -14q-52 -14 -96.5 0t-85.5 44q-24 18 -39.5 42.5
|
||||
t-17.5 55.5l-4 67.5t-3 68.5v43t0.5 39l1 39t0.5 43q0 22 20 22q5 0 21.5 0.5t36.5 0.5h39h30q12 -1 19 -2t10 -4t3.5 -9.5t0.5 -17.5q-1 -42 -2.5 -74.5t-2.5 -73.5q0 -17 1 -33t5 -33q5 -24 21 -38.5t45 -14.5q50 -1 90 29q14 11 21.5 23.5t7.5 32.5q-2 48 -1 93t1 93v8
|
||||
q1 17 5.5 22t21.5 5h19h33.5h36h28.5q20 1 25 -5t7 -26q1 -17 1 -41.5v-46.5t-0.5 -37.5z" />
|
||||
<glyph glyph-name="uni0448" unicode="ш" horiz-adv-x="969"
|
||||
d="M255 -2q-51 1 -101 1.5t-101 1.5q-10 0 -15 1q-17 2 -22.5 8.5t-5.5 23.5q-2 69 -1 136t0 136q-1 55 -0.5 110t0.5 111q1 23 0 37t-2 37q0 7 1 13t2 13q5 15 20 14q10 -1 26 -1.5t32.5 -0.5t30 0.5t16.5 0.5q13 1 21 0t12.5 -4.5t6.5 -11t3 -20.5q5 -62 4 -118t1 -119
|
||||
q1 -42 -1 -86t0 -86q1 -14 4.5 -17.5t18.5 -4.5q25 -2 54 -0.5t53 0.5t29 3.5t4 27.5q0 38 -1 75.5t-1 75.5q0 54 0.5 106.5t0.5 106.5q0 16 1 26.5t-1 26.5q-2 20 16 20q34 -2 65.5 0t65.5 -1q14 -2 18 -7t4 -22q1 -87 1 -172.5v-172.5q0 -19 0.5 -37.5t1.5 -36.5
|
||||
q1 -14 5.5 -18t18.5 -4q27 -1 54 -0.5t55 0.5q17 0 17 16v55q-1 41 -0.5 81t-1.5 82q-2 50 -2.5 98.5t-2.5 98.5q0 4 -0.5 7.5t-0.5 8.5q0 11 4.5 15.5t16.5 4.5h60t61 -1q11 -1 17 -6t7 -22q3 -97 4.5 -193.5t-3.5 -194.5q-2 -45 -0.5 -87.5t1.5 -87.5q0 -31 -8.5 -39
|
||||
t-38.5 -8q-17 0 -59.5 -0.5t-97 -0.5h-115.5h-113.5t-90.5 0.5t-48 0.5z" />
|
||||
<glyph glyph-name="uni0449" unicode="щ" horiz-adv-x="1083"
|
||||
d="M340 617q0 15 3 19.5t18 4.5q30 1 60 0.5t60 -1.5q17 0 17 -20q0 -44 0.5 -84t-0.5 -84q0 -66 -0.5 -132t-0.5 -132q-1 -17 2.5 -21t20.5 -5q29 -1 58.5 -1h58.5q13 0 20 1t10.5 4.5t4 10.5t0.5 19q0 42 -0.5 83.5t-0.5 83.5q-1 61 -1 122v122q0 11 0.5 17.5t3.5 10
|
||||
t9 4.5t17 1q30 1 60 -0.5t60 -3.5q12 0 14 -15q2 -20 3.5 -40.5t1.5 -40.5q1 -80 0 -159t2 -159l1.5 -41t5.5 -17.5t17 -4t36 -0.5l36.5 -2t36.5 -3q19 -2 20 -19q0 -7 1.5 -13.5t2.5 -13.5q2 -47 2.5 -93t2.5 -93q0 -6 -1 -11.5l-2 -11.5q-3 -18 -21 -18q-27 1 -54 1t-54 1
|
||||
q-19 0 -24 5t-7 23q-5 33 -6 66q-1 11 -5.5 16t-15.5 5q-20 0 -39 0.5t-39 0.5q-105 1 -209 1.5t-210 1.5q-67 0 -133.5 0.5t-133.5 0.5h-12t-11 2q-11 2 -17 9t-3 18q-2 21 -2 39v34.5t0.5 32.5t0.5 33q-2 52 0 103t-1 103q-4 60 -3.5 113.5t1.5 113.5v16q1 17 4.5 21
|
||||
t20.5 3q17 0 34.5 -1t34.5 -1q15 -1 29.5 -1.5t28.5 0.5q19 0 19 -18q-1 -23 -1.5 -40t-0.5 -40q1 -69 1.5 -138t0.5 -138q1 -17 0.5 -33t-0.5 -33q0 -21 3 -25.5t23 -5.5l52.5 -4t52.5 -2q15 0 22.5 1t10.5 4.5t3.5 11t0.5 20.5q-1 52 -1 104t-1 105l0.5 22.5t0.5 54.5
|
||||
v67.5v62.5z" />
|
||||
<glyph glyph-name="uni044A" unicode="ъ" horiz-adv-x="667"
|
||||
d="M76 324q-1 39 0.5 77.5t-0.5 77.5q-2 18 -6 21.5t-23 4.5q-23 1 -37.5 0t-23 3t-11 16t-1.5 39q1 14 0 27t-1 27q1 14 5 18.5t18 5.5h37.5t63.5 -0.5l69 -1t54 -1.5q3 1 9.5 1t12.5 -2.5t10.5 -8.5t4.5 -16v-28v-39v-42v-38q0 -22 20 -22q37 0 73 -3q51 -5 94 -24.5
|
||||
t76 -58.5q32 -38 41 -81t-2 -91q-14 -60 -50.5 -100t-94.5 -63q-41 -16 -81.5 -19t-82.5 -5q-37 -2 -74 0l-74 4q-18 1 -21 4t-3 20q-1 48 -1.5 95t-1.5 95v12v28.5t0.5 35t0.5 32.5zM302 136q7 1 16.5 1.5t19.5 2.5q8 2 16.5 6t13.5 10q19 20 25.5 43t-2.5 50
|
||||
q-15 49 -65 58q-21 4 -42 6q-17 2 -21.5 -2t-4.5 -22q-2 -66 0 -132q0 -14 3.5 -17t19.5 -4h21z" />
|
||||
<glyph glyph-name="uni044B" unicode="ы" horiz-adv-x="823"
|
||||
d="M7 283q1 36 1.5 89l1 104t0.5 90v48q-1 18 3 22t23 5h23t40 -0.5l43 -1t32 -0.5q16 -1 19 -3t5 -18q2 -34 0.5 -67.5t0.5 -67.5q0 -13 1 -20.5t4 -11t10 -5t21 -3.5q10 -1 19.5 -1t19.5 -2q60 -10 105 -41t72 -88q18 -38 23 -77t-7 -81q-11 -40 -36 -74.5t-66 -50.5
|
||||
q-42 -17 -81.5 -20.5l-83.5 -7.5q-5 0 -24 -0.5t-44 -0.5t-50 -0.5t-40 -1.5q-23 -1 -28.5 4.5t-5.5 28.5q0 66 -0.5 130.5t-0.5 122.5zM194 167q0 -8 3 -13.5t11 -5.5q10 0 24.5 0.5t28.5 3.5t26.5 7.5t20.5 12.5t12.5 20t6 25t-0.5 26t-7 23t-18.5 18.5t-29.5 14t-33 8
|
||||
t-29 1.5q-14 -2 -15 -14v-127zM543 615q0 14 3.5 19.5t17.5 4.5h62t62 -2q17 -1 20.5 -5.5t3.5 -22.5q2 -42 2.5 -79t0.5 -79v-194t-2 -194q0 -30 0.5 -43.5t-5 -18t-20 -3.5t-44.5 1q-19 -1 -37 0t-37 1q-18 0 -24 5t-6 24v150.5t-1 151.5l1 30.5t1.5 74.5t1 93t0.5 86z
|
||||
" />
|
||||
<glyph glyph-name="uni044C" unicode="ь" horiz-adv-x="593"
|
||||
d="M146 -2q-30 1 -52.5 1.5t-42.5 1.5q-16 0 -31 3q-7 2 -11.5 6.5t-2.5 12.5q0 48 -0.5 98t0.5 99v61.5v77v81.5v76v60v34q0 5 -0.5 9.5t0.5 9.5q3 20 24 20q30 -2 60 -3t60 -3q14 -1 22 -2t11.5 -5t4.5 -12t1 -22q1 -34 0.5 -59.5t1.5 -59.5q0 -18 3 -22t20 -5
|
||||
q22 -2 49 -1.5t49 -1.5q84 -6 142 -64q48 -49 54 -122q5 -83 -38 -156q-22 -36 -53 -60.5t-73 -35.5q-52 -14 -103 -18t-95 1zM191 251q2 -10 2 -29q0 -9 0.5 -18.5t0.5 -19.5q1 -26 6.5 -32t31.5 -4q15 1 30 6q14 4 28 10t25.5 16t18.5 23.5t7 33.5q0 19 -8 31t-21.5 19.5
|
||||
t-30 10.5t-34.5 5q-1 1 -4 1q-19 2 -29.5 2t-15.5 -5t-6 -16.5t-1 -33.5z" />
|
||||
<glyph glyph-name="uni044D" unicode="э"
|
||||
d="M624 300q1 -40 -9 -80.5t-31 -78.5t-54 -62q-34 -25 -68.5 -44.5t-75.5 -32.5q-73 -23 -141.5 -11.5t-135.5 40.5q-52 22 -95 62q-5 5 -8.5 9.5t-0.5 12.5l27 65.5l27 64.5q5 13 17 19q18 9 34 -7q14 -14 29 -27t32 -24q49 -33 100 -32.5t103 23.5q41 18 55 64
|
||||
q6 20 -14 20h-30t-51 -0.5t-51 -0.5h-31h-17t-17 1q-20 0 -20 21q0 11 -2 21t-2 21q-1 21 6.5 28.5t28.5 8.5q9 0 34.5 0.5t55 0.5t55 0.5t34.5 0.5q14 2 16 5.5t-2 16.5q-10 29 -32.5 44t-49.5 23q-92 26 -173 -18q-17 -9 -24.5 -5.5t-15.5 16.5l-24.5 39l-23.5 39
|
||||
q-3 5 -6 9.5t-7 8.5q-10 12 -9.5 16t11.5 14q78 66 178 69q61 3 121 -6q56 -8 99.5 -37.5t78.5 -71.5q44 -52 64 -112.5t15 -132.5z" />
|
||||
<glyph glyph-name="uni044E" unicode="ю" horiz-adv-x="969"
|
||||
d="M184 23q-1 -16 -5 -20.5t-19 -4.5q-29 1 -59 1t-59 2q-13 0 -20 1t-10 4.5t-3.5 10t-0.5 18.5q-2 79 -0.5 157t-0.5 157q-1 32 -1.5 64.5t1.5 64.5q2 37 2 70.5t-2 71.5q-1 14 1.5 18t13.5 4q36 0 69 -0.5t69 -0.5q16 -2 16 -17q1 -14 1 -27v-27q1 -37 0 -70.5t1 -71.5
|
||||
q0 -19 3.5 -22t21.5 -5q14 -1 27 -0.5t26 -0.5q17 -1 23 16q5 11 9.5 22.5t9.5 22.5q34 78 95 121t142 61q66 15 123 -1.5t107 -58.5q35 -31 60.5 -69t37.5 -86q9 -36 15 -72t2 -74q-5 -44 -17 -83.5t-38 -76.5q-19 -26 -40 -50t-49 -41q-53 -32 -109.5 -41.5t-117.5 -6.5
|
||||
q-42 3 -79 18t-72 38q-33 22 -52.5 54t-30.5 69q-7 22 -11.5 44l-9.5 45q-4 17 -20 18q-18 1 -28 0t-15.5 -6.5t-7 -15.5t-1.5 -28q0 -11 0.5 -38t0.5 -57.5t0.5 -59t0.5 -41.5zM442 324q0 -6 -0.5 -12t-0.5 -11q0 -34 15 -59.5t36.5 -43t44.5 -26t38 -8.5q72 0 111 47.5
|
||||
t39 125.5q0 12 -2 33.5t-13.5 44t-34.5 41t-65 26.5q-61 10 -104.5 -22t-59.5 -90q-2 -6 -2.5 -13.5l-1 -15t-0.5 -12.5v-5z" />
|
||||
<glyph glyph-name="uni044F" unicode="я" horiz-adv-x="688"
|
||||
d="M571 34v-23q-2 -20 -21 -18h-127q-18 1 -24 7t-6 23v54.5t1 54.5q0 17 0.5 34.5t0.5 35.5q0 15 -3.5 18t-18.5 5q-30 6 -46 -20l-57.5 -85t-55.5 -86q-7 -12 -12.5 -19.5t-13 -12.5t-19.5 -7t-31 -2h-34t-38 1q-21 0 -44 1q-6 2 -10 5q-8 6 -1 16q14 20 30 39.5t31 40.5
|
||||
l48 67.5l48 68.5q9 14 8.5 18.5t-14.5 10.5q-35 16 -55 43.5t-34 60.5q-14 35 -18.5 70.5t6.5 73.5q5 18 16 32.5t25 26.5q49 41 113 57q45 11 87 11.5t82 1.5q17 -1 42.5 -1t49 0.5t40.5 0.5h19q21 -3 28 -11t7 -29v-48v-87t0.5 -111t0.5 -119v-111.5v-87.5zM407 438
|
||||
q-1 4 -1 12.5t-1 17.5q-2 15 -14 16q-15 1 -43.5 2.5t-56 -1t-48.5 -12t-22 -30.5q-1 -37 17 -53.5t41 -21.5t44.5 -3.5t29.5 0.5q22 -2 32.5 1t14.5 11t4.5 23t2.5 38z" />
|
||||
<glyph glyph-name="A" unicode="A" horiz-adv-x="708"
|
||||
d="M436 638q18 1 23.5 -3t9.5 -21q8 -33 14.5 -64t14.5 -64l34 -142l34 -141l15.5 -64.5l15.5 -64.5l6 -25.5l6 -24.5q6 -23 -16 -27h-7q-36 -2 -72 -0.5t-71 -0.5q-15 0 -18.5 5t-5.5 22q-3 44 -16 88q-2 10 -8.5 11t-11.5 1q-36 1 -72 0l-71 -2q-8 0 -12 -4t-6 -11
|
||||
q-6 -23 -12.5 -43t-12.5 -43q-3 -11 -7.5 -15.5t-18.5 -4.5h-31h-50t-47.5 0.5t-22.5 0.5q-24 2 -16 25l20 60l21 59l42 133.5l43 133.5l17 56l19.5 64l16.5 53t8 24q3 10 4.5 16t5 9t11 4t21.5 1q12 0 40.5 -0.5t60 -0.5h60.5h42zM361 243q16 1 12 17l-16.5 71l-16.5 71
|
||||
q-1 3 -3 6.5t-6 3.5t-4.5 -3t-1.5 -5l-22 -64.5l-22 -64.5q-5 -15 -7 -22.5t0.5 -10.5t10 -3h21.5l6.5 0.5t15 1t18 1t15.5 1.5z" />
|
||||
<glyph glyph-name="a" unicode="a" horiz-adv-x="708"
|
||||
d="M436 638q18 1 23.5 -3t9.5 -21q8 -33 14.5 -64t14.5 -64l34 -142l34 -141l15.5 -64.5l15.5 -64.5l6 -25.5l6 -24.5q6 -23 -16 -27h-7q-36 -2 -72 -0.5t-71 -0.5q-15 0 -18.5 5t-5.5 22q-3 44 -16 88q-2 10 -8.5 11t-11.5 1q-36 1 -72 0l-71 -2q-8 0 -12 -4t-6 -11
|
||||
q-6 -23 -12.5 -43t-12.5 -43q-3 -11 -7.5 -15.5t-18.5 -4.5h-31h-50t-47.5 0.5t-22.5 0.5q-24 2 -16 25l20 60l21 59l42 133.5l43 133.5l17 56l19.5 64l16.5 53t8 24q3 10 4.5 16t5 9t11 4t21.5 1q12 0 40.5 -0.5t60 -0.5h60.5h42zM361 243q16 1 12 17l-16.5 71l-16.5 71
|
||||
q-1 3 -3 6.5t-6 3.5t-4.5 -3t-1.5 -5l-22 -64.5l-22 -64.5q-5 -15 -7 -22.5t0.5 -10.5t10 -3h21.5l6.5 0.5t15 1t18 1t15.5 1.5z" />
|
||||
<glyph glyph-name="B" unicode="B" horiz-adv-x="636"
|
||||
d="M3 604q0 14 5 21t19 10q8 1 16 1h16q37 -2 75 0q51 1 101.5 -1.5t101.5 -8.5q31 -4 54.5 -18t42.5 -37q6 -7 10.5 -19.5t8.5 -25.5t6.5 -23t2.5 -11q4 -35 -9.5 -64.5t-36.5 -54.5q-9 -10 -8 -12.5t14 -8.5l27.5 -13.5t25.5 -15.5q46 -36 48 -96q1 -89 -54 -163
|
||||
q-8 -11 -20.5 -19.5l-24.5 -16.5q-18 -12 -38.5 -18t-42.5 -8q-17 -1 -44 -1.5t-58.5 -0.5h-64.5t-61.5 0.5t-49.5 1t-29 0.5q-20 1 -26.5 8.5t-6.5 27.5v283l0.5 31t0.5 75t-0.5 92.5t-0.5 84.5zM171 140q0 -18 17 -17q12 1 24 0.5t23 1.5q20 4 39 10.5t35 21.5
|
||||
q23 23 19.5 48.5t-32.5 39.5q-26 11 -54.5 14.5t-57.5 2.5q-16 0 -16 -19q0 -6 0.5 -20.5l1 -30.5l1 -30.5t0.5 -21.5zM170 424q0 -19 16 -18q17 1 34 1.5t34 2.5q15 3 28 10.5t16 25.5q8 37 -21 57q-34 25 -77 24q-20 0 -24 -4t-5 -24v-13t-0.5 -22t-0.5 -23v-17z" />
|
||||
<glyph glyph-name="b" unicode="b" horiz-adv-x="636"
|
||||
d="M3 604q0 14 5 21t19 10q8 1 16 1h16q37 -2 75 0q51 1 101.5 -1.5t101.5 -8.5q31 -4 54.5 -18t42.5 -37q6 -7 10.5 -19.5t8.5 -25.5t6.5 -23t2.5 -11q4 -35 -9.5 -64.5t-36.5 -54.5q-9 -10 -8 -12.5t14 -8.5l27.5 -13.5t25.5 -15.5q46 -36 48 -96q1 -89 -54 -163
|
||||
q-8 -11 -20.5 -19.5l-24.5 -16.5q-18 -12 -38.5 -18t-42.5 -8q-17 -1 -44 -1.5t-58.5 -0.5h-64.5t-61.5 0.5t-49.5 1t-29 0.5q-20 1 -26.5 8.5t-6.5 27.5v283l0.5 31t0.5 75t-0.5 92.5t-0.5 84.5zM171 140q0 -18 17 -17q12 1 24 0.5t23 1.5q20 4 39 10.5t35 21.5
|
||||
q23 23 19.5 48.5t-32.5 39.5q-26 11 -54.5 14.5t-57.5 2.5q-16 0 -16 -19q0 -6 0.5 -20.5l1 -30.5l1 -30.5t0.5 -21.5zM170 424q0 -19 16 -18q17 1 34 1.5t34 2.5q15 3 28 10.5t16 25.5q8 37 -21 57q-34 25 -77 24q-20 0 -24 -4t-5 -24v-13t-0.5 -22t-0.5 -23v-17z" />
|
||||
<glyph glyph-name="C" unicode="C" horiz-adv-x="687"
|
||||
d="M-17 288q0 64 16 120.5t47 108.5q14 23 32.5 40.5t41.5 31.5q55 34 114 49t124 9q39 -4 75 -18.5l71 -29.5q25 -10 7 -34l-40.5 -49l-41.5 -49q-7 -8 -15 -9.5t-19 0.5q-21 4 -42.5 5t-41.5 -2q-30 -3 -53.5 -16t-40 -33t-24.5 -46t-6 -55l4 -34.5t7 -33.5
|
||||
q9 -28 27.5 -45.5t49.5 -21.5q20 -3 40 -5t40 3q28 7 46 20.5t38 39.5q14 29 38 12l51 -34t50 -36q15 -11 11 -20.5t-15 -26.5q-6 -8 -26 -26.5t-47 -38t-57 -37t-56 -24.5q-33 -9 -66 -11t-68 2q-45 6 -85.5 22.5t-75.5 45.5q-6 5 -16.5 14.5t-22 22t-23 27.5t-18.5 32
|
||||
t-12.5 33t-10.5 33q-4 17 -4.5 33.5t-2.5 30.5z" />
|
||||
<glyph glyph-name="c" unicode="c" horiz-adv-x="708"
|
||||
d="M3 288q0 64 16 120.5t47 108.5q14 23 32.5 40.5t41.5 31.5q55 34 114 49t124 9q39 -4 75 -18.5l71 -29.5q25 -10 7 -34l-40.5 -49l-41.5 -49q-7 -8 -15 -9.5t-19 0.5q-21 4 -42.5 5t-41.5 -2q-30 -3 -53.5 -16t-40 -33t-24.5 -46t-6 -55l4 -34.5t7 -33.5
|
||||
q9 -28 27.5 -45.5t49.5 -21.5q20 -3 40 -5t40 3q28 7 46 20.5t38 39.5q14 29 38 12l51 -34t50 -36q15 -11 11 -20.5t-15 -26.5q-6 -8 -26 -26.5t-47 -38t-57 -37t-56 -24.5q-33 -9 -66 -11t-68 2q-45 6 -85.5 22.5t-75.5 45.5q-6 5 -16.5 14.5t-22 22t-23 27.5t-18.5 32
|
||||
t-12.5 33t-10.5 33q-4 17 -4.5 33.5t-2.5 30.5z" />
|
||||
<glyph glyph-name="D" unicode="D" horiz-adv-x="709"
|
||||
d="M4 576q0 21 1 32.5t6.5 17t16.5 7t32 2.5q11 0 44 0.5t72 0.5t76 -1t57 -3q24 -2 48 -4.5t47 -10.5q21 -7 41.5 -18t38.5 -25q30 -20 52.5 -53.5t38 -68.5t24.5 -66t12 -47q13 -72 -9 -131t-71 -110q-34 -35 -74 -57t-89 -29q-63 -9 -124.5 -12.5t-124.5 -1.5
|
||||
q-26 0 -50.5 2t-49.5 2q-11 -1 -13.5 4t-2.5 13q0 4 -0.5 7.5t-0.5 7.5q0 71 0.5 141.5t0.5 141.5l0.5 28t0.5 68.5v85v77.5zM202 315q0 -33 -0.5 -66t-1.5 -66q0 -20 20 -21q43 -4 82 6t74 36q17 13 30 28t18 36q7 28 4.5 56t-11.5 56q-8 21 -22 37.5t-36 25.5
|
||||
q-32 14 -64.5 16t-65.5 2q-20 0 -23.5 -4t-3.5 -24q-1 -15 -0.5 -35t0.5 -39v-44z" />
|
||||
<glyph glyph-name="d" unicode="d" horiz-adv-x="708"
|
||||
d="M4 576q0 21 1 32.5t6.5 17t16.5 7t32 2.5q11 0 44 0.5t72 0.5t76 -1t57 -3q24 -2 48 -4.5t47 -10.5q21 -7 41.5 -18t38.5 -25q30 -20 52.5 -53.5t38 -68.5t24.5 -66t12 -47q13 -72 -9 -131t-71 -110q-34 -35 -74 -57t-89 -29q-63 -9 -124.5 -12.5t-124.5 -1.5
|
||||
q-26 0 -50.5 2t-49.5 2q-11 -1 -13.5 4t-2.5 13q0 4 -0.5 7.5t-0.5 7.5q0 71 0.5 141.5t0.5 141.5l0.5 28t0.5 68.5v85v77.5zM202 315q0 -33 -0.5 -66t-1.5 -66q0 -20 20 -21q43 -4 82 6t74 36q17 13 30 28t18 36q7 28 4.5 56t-11.5 56q-8 21 -22 37.5t-36 25.5
|
||||
q-32 14 -64.5 16t-65.5 2q-20 0 -23.5 -4t-3.5 -24q-1 -15 -0.5 -35t0.5 -39v-44z" />
|
||||
<glyph glyph-name="E" unicode="E" horiz-adv-x="583"
|
||||
d="M9 431q0 38 -1.5 75.5t-3.5 75.5q0 5 -0.5 10.5t-0.5 11.5q0 17 4 25t27 7q26 -1 65.5 -1h83h88.5t82.5 0.5t64.5 0.5h36q20 0 21 -19q1 -26 1 -57v-57q0 -3 -4.5 -7t-7.5 -4q-14 -2 -27.5 -3.5t-27.5 -1.5q-49 -1 -95 -1t-95 -1q-17 0 -26.5 -1t-13.5 -5.5t-4 -14
|
||||
t1 -27.5q0 -10 -0.5 -13t0.5 -12q1 -12 2 -19t4 -10.5t10 -4.5t20 -2q10 -2 27.5 -1t28.5 0q12 -1 17.5 -3.5t7.5 -7.5t1.5 -13t-0.5 -20q0 -4 -0.5 -7.5t0.5 -7.5q0 -18 -18 -18q-30 -2 -59 0q-16 0 -25 -0.5t-12.5 -4.5t-4 -12.5t-0.5 -23.5v-74q1 -21 21 -21h243
|
||||
q18 2 25 -2.5t8 -22.5q2 -28 2.5 -62t-0.5 -62q0 -4 -4.5 -8.5t-8.5 -5.5q-6 -1 -27.5 -1h-52t-66.5 0.5l-71 1t-66 0.5h-50q-23 -1 -47 0l-47 2q-19 1 -24.5 6.5t-5.5 24.5v66t1 66q0 23 0.5 44.5t1.5 44.5q-1 0 -0.5 19.5t1 47t1 58t0.5 52.5z" />
|
||||
<glyph glyph-name="e" unicode="e" horiz-adv-x="583"
|
||||
d="M9 431q0 38 -1.5 75.5t-3.5 75.5q0 5 -0.5 10.5t-0.5 11.5q0 17 4 25t27 7q26 -1 65.5 -1h83h88.5t82.5 0.5t64.5 0.5h36q20 0 21 -19q1 -26 1 -57v-57q0 -3 -4.5 -7t-7.5 -4q-14 -2 -27.5 -3.5t-27.5 -1.5q-49 -1 -95 -1t-95 -1q-17 0 -26.5 -1t-13.5 -5.5t-4 -14
|
||||
t1 -27.5q0 -10 -0.5 -13t0.5 -12q1 -12 2 -19t4 -10.5t10 -4.5t20 -2q10 -2 27.5 -1t28.5 0q12 -1 17.5 -3.5t7.5 -7.5t1.5 -13t-0.5 -20q0 -4 -0.5 -7.5t0.5 -7.5q0 -18 -18 -18q-30 -2 -59 0q-16 0 -25 -0.5t-12.5 -4.5t-4 -12.5t-0.5 -23.5v-74q1 -21 21 -21h243
|
||||
q18 2 25 -2.5t8 -22.5q2 -28 2.5 -62t-0.5 -62q0 -4 -4.5 -8.5t-8.5 -5.5q-6 -1 -27.5 -1h-52t-66.5 0.5l-71 1t-66 0.5h-50q-23 -1 -47 0l-47 2q-19 1 -24.5 6.5t-5.5 24.5v66t1 66q0 23 0.5 44.5t1.5 44.5q-1 0 -0.5 19.5t1 47t1 58t0.5 52.5z" />
|
||||
<glyph glyph-name="F" unicode="F" horiz-adv-x="635"
|
||||
d="M440 638q20 -1 40.5 -1.5t41.5 -0.5q11 0 13.5 -5t2.5 -14q1 -28 1 -56t1 -55q0 -19 -4 -24.5t-24 -5.5h-72t-72 1q-26 0 -51 0.5t-51 0.5q-10 0 -19.5 0.5t-19.5 -0.5q-21 -2 -25.5 -7t-5.5 -25q-1 -19 -1.5 -34t-1.5 -34q0 -23 4 -28.5t28 -7.5q29 -3 58.5 -1.5
|
||||
t58.5 -0.5q11 -1 23 -0.5t23 -0.5q18 -2 26.5 -2t11.5 -3.5t3 -11.5t2 -24q2 -20 2 -41t-1 -41q0 -13 -4 -16.5t-17 -3.5q-45 -1 -90 -1t-90 -1q-4 0 -7.5 0.5t-7.5 0.5q-18 0 -21.5 -3t-3.5 -20q-1 -27 -1 -61t-1 -61q0 -20 -1.5 -30.5t-6.5 -15t-15 -5t-29 -0.5
|
||||
q-25 1 -49 1.5t-49 1.5q-20 2 -25 6.5t-6 22.5q-1 50 -1 99.5t-1 99.5q0 19 -1 64.5t-1 97.5t0.5 99.5t2.5 70.5q2 15 1.5 25.5t1.5 26.5q1 18 5 21.5t23 4.5h16q16 -1 46.5 -1h68h78.5h78.5t68 -0.5t46.5 -0.5z" />
|
||||
<glyph glyph-name="f" unicode="f" horiz-adv-x="635"
|
||||
d="M440 638q20 -1 40.5 -1.5t41.5 -0.5q11 0 13.5 -5t2.5 -14q1 -28 1 -56t1 -55q0 -19 -4 -24.5t-24 -5.5h-72t-72 1q-26 0 -51 0.5t-51 0.5q-10 0 -19.5 0.5t-19.5 -0.5q-21 -2 -25.5 -7t-5.5 -25q-1 -19 -1.5 -34t-1.5 -34q0 -23 4 -28.5t28 -7.5q29 -3 58.5 -1.5
|
||||
t58.5 -0.5q11 -1 23 -0.5t23 -0.5q18 -2 26.5 -2t11.5 -3.5t3 -11.5t2 -24q2 -20 2 -41t-1 -41q0 -13 -4 -16.5t-17 -3.5q-45 -1 -90 -1t-90 -1q-4 0 -7.5 0.5t-7.5 0.5q-18 0 -21.5 -3t-3.5 -20q-1 -27 -1 -61t-1 -61q0 -20 -1.5 -30.5t-6.5 -15t-15 -5t-29 -0.5
|
||||
q-25 1 -49 1.5t-49 1.5q-20 2 -25 6.5t-6 22.5q-1 50 -1 99.5t-1 99.5q0 19 -1 64.5t-1 97.5t0.5 99.5t2.5 70.5q2 15 1.5 25.5t1.5 26.5q1 18 5 21.5t23 4.5h16q16 -1 46.5 -1h68h78.5h78.5t68 -0.5t46.5 -0.5z" />
|
||||
<glyph glyph-name="G" unicode="G" horiz-adv-x="718"
|
||||
d="M475 362h58t58 -1q17 -1 20.5 -4t6.5 -19q5 -32 -0.5 -62.5t-15.5 -59.5q-12 -37 -33 -68t-47 -59q-32 -35 -71 -58t-87 -31q-50 -8 -98.5 -6t-96.5 24q-26 11 -49 22t-45 29q-13 11 -22 24t-20 27q-7 14 -15.5 29.5t-13.5 31.5q-31 89 -18 171.5t60 160.5q27 45 69 73
|
||||
t93 43q55 17 109.5 16.5t109.5 -11.5q26 -5 48 -17t45 -23q8 -4 8 -10t-6 -11l-50.5 -45.5l-50.5 -45.5q-4 -3 -10.5 -5t-8.5 0q-20 14 -41.5 12l-42.5 -4q-17 -2 -33.5 -6t-31.5 -11q-29 -14 -51.5 -41.5t-32.5 -62t-5.5 -72.5t29.5 -74q23 -33 56.5 -47t74.5 -9q19 2 37 7
|
||||
t33 18q7 5 13 11t11 13q5 8 10 18.5t3 18.5q-1 5 -4.5 7t-8.5 2t-10.5 -0.5t-9.5 0.5q-7 1 -13 1t-13 1q-22 2 -28 8.5t-7 28.5q-1 13 -1 25t-2 24q-1 20 16 20q23 0 47 -0.5t47 -0.5q8 -1 15.5 -1.5t15.5 -0.5z" />
|
||||
<glyph glyph-name="g" unicode="g" horiz-adv-x="719"
|
||||
d="M474 362h58t58 -1q17 -1 20.5 -4t6.5 -19q5 -32 -0.5 -62.5t-15.5 -59.5q-12 -37 -33 -68t-47 -59q-32 -35 -71 -58t-87 -31q-50 -8 -98.5 -6t-96.5 24q-26 11 -49 22t-45 29q-13 11 -22 24t-20 27q-7 14 -15.5 29.5t-13.5 31.5q-31 89 -18 171.5t60 160.5q27 45 69 73
|
||||
t93 43q55 17 109.5 16.5t109.5 -11.5q26 -5 48 -17t45 -23q8 -4 8 -10t-6 -11l-50.5 -45.5l-50.5 -45.5q-4 -3 -10.5 -5t-8.5 0q-20 14 -41.5 12l-42.5 -4q-17 -2 -33.5 -6t-31.5 -11q-29 -14 -51.5 -41.5t-32.5 -62t-5.5 -72.5t29.5 -74q23 -33 56.5 -47t74.5 -9q19 2 37 7
|
||||
t33 18q7 5 13 11t11 13q5 8 10 18.5t3 18.5q-1 5 -4.5 7t-8.5 2t-10.5 -0.5t-9.5 0.5q-7 1 -13 1t-13 1q-22 2 -28 8.5t-7 28.5q-1 13 -1 25t-2 24q-1 20 16 20q23 0 47 -0.5t47 -0.5q8 -1 15.5 -1.5t15.5 -0.5z" />
|
||||
<glyph glyph-name="H" unicode="H" horiz-adv-x="645"
|
||||
d="M9 518q0 22 -0.5 49t-0.5 49q0 12 4 16.5t15 4.5h63t62 -1q30 -1 33 -32q1 -11 0.5 -25.5t-0.5 -25.5q-1 -30 -1.5 -60.5t-0.5 -60.5q0 -8 0.5 -16.5t2.5 -16.5q2 -5 7 -9t8 -4h15h106q18 0 28 0.5t15 5t6.5 14t1.5 27.5q2 41 1.5 84t-0.5 84q0 6 -0.5 11.5t1.5 10.5
|
||||
q1 15 18 15q31 -2 61.5 -1.5t62.5 -1.5q14 -1 16 -4t2 -19q0 -26 0.5 -56.5t0.5 -56.5q-1 -24 -1.5 -47.5t-0.5 -47.5q-1 -28 -0.5 -55.5t0.5 -55.5q1 -60 1 -118v-118q0 -7 0.5 -13t-0.5 -13q-2 -17 -9 -23.5t-24 -6.5q-29 -1 -57 -0.5t-57 -0.5q-16 0 -16 16
|
||||
q0 13 0.5 25.5t-0.5 25.5q-1 35 -1.5 68.5t-2.5 68.5q-1 10 -2 16t-4 8.5t-9 3.5t-16 1l-63 2t-62 -1q-10 -2 -15.5 -2.5t-8.5 -3.5t-4 -8.5t-1 -16.5q-1 -39 -1 -80.5v-80.5q0 -21 -7.5 -30t-29.5 -12q-1 -1 -3 -1q-29 0 -57 0.5t-57 0.5q-11 0 -15.5 5.5t-5.5 15.5
|
||||
q-1 13 -1.5 25.5t-0.5 25.5v123.5t1 123.5l0.5 22t1 53l1 65t0.5 59z" />
|
||||
<glyph glyph-name="h" unicode="h" horiz-adv-x="646"
|
||||
d="M9 518q0 22 -0.5 49t-0.5 49q0 12 4 16.5t15 4.5h63t62 -1q30 -1 33 -32q1 -11 0.5 -25.5t-0.5 -25.5q-1 -30 -1.5 -60.5t-0.5 -60.5q0 -8 0.5 -16.5t2.5 -16.5q2 -5 7 -9t8 -4h15h106q18 0 28 0.5t15 5t6.5 14t1.5 27.5q2 41 1.5 84t-0.5 84q0 6 -0.5 11.5t1.5 10.5
|
||||
q1 15 18 15q31 -2 61.5 -1.5t62.5 -1.5q14 -1 16 -4t2 -19q0 -26 0.5 -56.5t0.5 -56.5q-1 -24 -1.5 -47.5t-0.5 -47.5q-1 -28 -0.5 -55.5t0.5 -55.5q1 -60 1 -118v-118q0 -7 0.5 -13t-0.5 -13q-2 -17 -9 -23.5t-24 -6.5q-29 -1 -57 -0.5t-57 -0.5q-16 0 -16 16
|
||||
q0 13 0.5 25.5t-0.5 25.5q-1 35 -1.5 68.5t-2.5 68.5q-1 10 -2 16t-4 8.5t-9 3.5t-16 1l-63 2t-62 -1q-10 -2 -15.5 -2.5t-8.5 -3.5t-4 -8.5t-1 -16.5q-1 -39 -1 -80.5v-80.5q0 -21 -7.5 -30t-29.5 -12q-1 -1 -3 -1q-29 0 -57 0.5t-57 0.5q-11 0 -15.5 5.5t-5.5 15.5
|
||||
q-1 13 -1.5 25.5t-0.5 25.5v123.5t1 123.5l0.5 22t1 53l1 65t0.5 59z" />
|
||||
<glyph glyph-name="I" unicode="I" horiz-adv-x="302"
|
||||
d="M198 248v-226q0 -16 -4.5 -19.5t-21.5 -1.5q-33 4 -66 1.5t-69 -1.5q-31 -5 -31 26q-1 18 -0.5 34t0.5 35q1 45 1 90v90q0 68 -0.5 144t-1.5 144q0 12 0.5 24t1.5 24q2 14 5.5 17.5t16.5 5.5q38 4 74 3.5t73 -5.5q11 -1 18 -2t8 -12q2 -10 1.5 -25t-0.5 -25
|
||||
q-1 -66 -2 -148.5t-3 -172.5z" />
|
||||
<glyph glyph-name="i" unicode="i" horiz-adv-x="302"
|
||||
d="M198 248v-226q0 -16 -4.5 -19.5t-21.5 -1.5q-33 4 -66 1.5t-69 -1.5q-31 -5 -31 26q-1 18 -0.5 34t0.5 35q1 45 1 90v90q0 68 -0.5 144t-1.5 144q0 12 0.5 24t1.5 24q2 14 5.5 17.5t16.5 5.5q38 4 74 3.5t73 -5.5q11 -1 18 -2t8 -12q2 -10 1.5 -25t-0.5 -25
|
||||
q-1 -66 -2 -148.5t-3 -172.5z" />
|
||||
<glyph glyph-name="J" unicode="J" horiz-adv-x="636"
|
||||
d="M524 240q-8 -52 -27.5 -99t-53.5 -88q-19 -23 -42.5 -37.5t-53.5 -20.5q-20 -4 -38.5 -6.5t-38.5 -1.5q-6 0 -30.5 1.5t-56.5 10t-66.5 27.5t-60.5 55q-13 21 -22 44.5t-15 47.5q-7 29 -10.5 59.5t-7.5 60.5q-1 10 0 16.5t4 10.5t9 6.5t16 4.5h15.5h35.5t43 -0.5t38 -0.5
|
||||
q17 0 17 -19q-1 -13 -1 -26t2 -26q5 -39 29 -57t64 -12q36 6 53.5 21.5t25.5 52.5q9 48 9 96q0 59 -1.5 112t-2.5 113q-1 17 0 27t5.5 15t13.5 7t26 2q45 2 92 0q25 -1 31.5 -8.5t8.5 -34.5v-34.5v-58t-1 -72l-2 -74.5t-2.5 -66.5t-4.5 -47.5z" />
|
||||
<glyph glyph-name="j" unicode="j" horiz-adv-x="635"
|
||||
d="M524 240q-8 -52 -27.5 -99t-53.5 -88q-19 -23 -42.5 -37.5t-53.5 -20.5q-20 -4 -38.5 -6.5t-38.5 -1.5q-6 0 -30.5 1.5t-56.5 10t-66.5 27.5t-60.5 55q-13 21 -22 44.5t-15 47.5q-7 29 -10.5 59.5t-7.5 60.5q-1 10 0 16.5t4 10.5t9 6.5t16 4.5h15.5h35.5t43 -0.5t38 -0.5
|
||||
q17 0 17 -19q-1 -13 -1 -26t2 -26q5 -39 29 -57t64 -12q36 6 53.5 21.5t25.5 52.5q9 48 9 96q0 59 -1.5 112t-2.5 113q-1 17 0 27t5.5 15t13.5 7t26 2q45 2 92 0q25 -1 31.5 -8.5t8.5 -34.5v-34.5v-58t-1 -72l-2 -74.5t-2.5 -66.5t-4.5 -47.5z" />
|
||||
<glyph glyph-name="K" unicode="K" horiz-adv-x="656"
|
||||
d="M3 609q0 20 5.5 24.5t25.5 5.5h44t44 -1q26 -1 35 -12.5t8 -38.5q-2 -37 -0.5 -74t1.5 -74q0 -7 4 -9t10 2l63.5 55.5l63.5 56.5q18 16 38 39t38 40q11 11 23 14t27 2q55 -3 111 -3q8 0 16.5 -1t11.5 -10q6 -19 -11 -33q-20 -17 -41 -41t-41 -42l-62.5 -56.5l-62.5 -56.5
|
||||
q-8 -7 -12 -11t-4.5 -7.5t1.5 -8.5t7 -13l58 -99l58 -98l39.5 -62.5l39.5 -61.5q4 -6 7 -11t-2 -12q-7 -13 -25 -13q-9 1 -28 0.5t-39.5 -0.5t-39 0.5t-26.5 3.5t-14 10.5t-11 17t-9.5 19t-8.5 16.5l-54 90.5l-52 91.5l-12 18q-8 13 -18 4q-9 -8 -17.5 -16.5t-17.5 -16.5
|
||||
q-8 -7 -9 -16t-1 -18q0 -39 0.5 -77.5t0.5 -77.5v-26q-2 -20 -21 -20q-29 2 -57 0t-57 0q-16 2 -21.5 9t-5.5 24q-1 38 -1 79v79q0 33 0.5 66t0.5 66q-1 0 -1 31v75.5t0.5 93.5t0.5 84z" />
|
||||
<glyph glyph-name="k" unicode="k" horiz-adv-x="656"
|
||||
d="M3 609q0 20 5.5 24.5t25.5 5.5h44t44 -1q26 -1 35 -12.5t8 -38.5q-2 -37 -0.5 -74t1.5 -74q0 -7 4 -9t10 2l63.5 55.5l63.5 56.5q18 16 38 39t38 40q11 11 23 14t27 2q55 -3 111 -3q8 0 16.5 -1t11.5 -10q6 -19 -11 -33q-20 -17 -41 -41t-41 -42l-62.5 -56.5l-62.5 -56.5
|
||||
q-8 -7 -12 -11t-4.5 -7.5t1.5 -8.5t7 -13l58 -99l58 -98l39.5 -62.5l39.5 -61.5q4 -6 7 -11t-2 -12q-7 -13 -25 -13q-9 1 -28 0.5t-39.5 -0.5t-39 0.5t-26.5 3.5t-14 10.5t-11 17t-9.5 19t-8.5 16.5l-54 90.5l-52 91.5l-12 18q-8 13 -18 4q-9 -8 -17.5 -16.5t-17.5 -16.5
|
||||
q-8 -7 -9 -16t-1 -18q0 -39 0.5 -77.5t0.5 -77.5v-26q-2 -20 -21 -20q-29 2 -57 0t-57 0q-16 2 -21.5 9t-5.5 24q-1 38 -1 79v79q0 33 0.5 66t0.5 66q-1 0 -1 31v75.5t0.5 93.5t0.5 84z" />
|
||||
<glyph glyph-name="L" unicode="L" horiz-adv-x="521"
|
||||
d="M3 616q0 18 16 19q29 2 54.5 1.5t54.5 0.5q23 1 30 -6t8 -30q3 -71 3.5 -147.5t3.5 -147.5q1 -30 -0.5 -57t0.5 -56q1 -19 5 -23t24 -4q35 -2 70 -2h70h47t20.5 -6t6 -20t2.5 -42q2 -20 2.5 -38.5t2.5 -38.5q1 -20 -21 -20q-23 1 -47 1.5t-48 0.5h-124t-123 1h-11.5
|
||||
t-10.5 1q-20 2 -27 9.5t-7 28.5q0 42 0.5 84.5t0.5 84.5v21v55t0.5 77.5t0 89l-1 88t-1.5 75.5z" />
|
||||
<glyph glyph-name="l" unicode="l" horiz-adv-x="521"
|
||||
d="M3 616q0 18 16 19q29 2 54.5 1.5t54.5 0.5q23 1 30 -6t8 -30q3 -71 3.5 -147.5t3.5 -147.5q1 -30 -0.5 -57t0.5 -56q1 -19 5 -23t24 -4q35 -2 70 -2h70h47t20.5 -6t6 -20t2.5 -42q2 -20 2.5 -38.5t2.5 -38.5q1 -20 -21 -20q-23 1 -47 1.5t-48 0.5h-124t-123 1h-11.5
|
||||
t-10.5 1q-20 2 -27 9.5t-7 28.5q0 42 0.5 84.5t0.5 84.5v21v55t0.5 77.5t0 89l-1 88t-1.5 75.5z" />
|
||||
<glyph glyph-name="M" unicode="M" horiz-adv-x="980"
|
||||
d="M181 299q0 -7 -0.5 -8.5t0.5 -5.5l6 -131l6 -131q1 -14 -2 -17t-19 -5q-17 -2 -33 -2h-32h-45t-44 1q-15 0 -12 15q-1 57 -0.5 113.5t0.5 113.5q-3 184 -3 368q-1 17 3 21t20 5h26.5h39.5h40.5h28.5q16 2 25.5 -4t17.5 -20l59.5 -110.5l60.5 -109.5l72 -132
|
||||
q8 -14 13 -13.5t13 14.5l27 45l27 45q20 34 41.5 66.5t41.5 67.5l34.5 61.5l32.5 62.5q8 14 17.5 22.5t26.5 6.5q6 -1 25.5 -1h41t39.5 0.5t20 0.5q17 0 26 -1t13.5 -5.5t5 -14t0.5 -27.5q0 -99 1 -197t3 -197q1 -44 0.5 -84.5t1.5 -83.5q1 -23 -2.5 -27t-25.5 -3
|
||||
q-9 0 -27.5 0.5t-38.5 0.5h-38h-25q-14 -1 -18.5 3t-4.5 19q-1 69 -1.5 136t-1.5 136q0 8 -1 11q0 5 -4 9q-2 2 -3.5 0t-2.5 -3l-9 -13t-8 -13l-76.5 -131.5l-76.5 -132.5q-5 -8 -11 -14t-20 -6h-87q-22 0 -29 8.5t-15 25.5l-57 118l-59 117q-4 8 -8.5 16t-9.5 16
|
||||
q-1 2 -3.5 3.5t-2.5 -5.5z" />
|
||||
<glyph glyph-name="m" unicode="m" horiz-adv-x="979"
|
||||
d="M181 299q0 -7 -0.5 -8.5t0.5 -5.5l6 -131l6 -131q1 -14 -2 -17t-19 -5q-17 -2 -33 -2h-32h-45t-44 1q-15 0 -12 15q-1 57 -0.5 113.5t0.5 113.5q-3 184 -3 368q-1 17 3 21t20 5h26.5h39.5h40.5h28.5q16 2 25.5 -4t17.5 -20l59.5 -110.5l60.5 -109.5l72 -132
|
||||
q8 -14 13 -13.5t13 14.5l27 45l27 45q20 34 41.5 66.5t41.5 67.5l34.5 61.5l32.5 62.5q8 14 17.5 22.5t26.5 6.5q6 -1 25.5 -1h41t39.5 0.5t20 0.5q17 0 26 -1t13.5 -5.5t5 -14t0.5 -27.5q0 -99 1 -197t3 -197q1 -44 0.5 -84.5t1.5 -83.5q1 -23 -2.5 -27t-25.5 -3
|
||||
q-9 0 -27.5 0.5t-38.5 0.5h-38h-25q-14 -1 -18.5 3t-4.5 19q-1 69 -1.5 136t-1.5 136q0 8 -1 11q0 5 -4 9q-2 2 -3.5 0t-2.5 -3l-9 -13t-8 -13l-76.5 -131.5l-76.5 -132.5q-5 -8 -11 -14t-20 -6h-87q-22 0 -29 8.5t-15 25.5l-57 118l-59 117q-4 8 -8.5 16t-9.5 16
|
||||
q-1 2 -3.5 3.5t-2.5 -5.5z" />
|
||||
<glyph glyph-name="n" unicode="n" horiz-adv-x="750"
|
||||
d="M4 601v22q2 17 17 14q38 1 71.5 0t68.5 1q13 1 19.5 -3.5t13.5 -13.5q27 -39 54 -83l55.5 -87.5l58 -86t60.5 -78.5q7 -8 17 -18.5t14 -10.5t5 15t1 26q-1 33 -1.5 72t-1.5 78.5t-1.5 78.5t-1.5 72q-1 22 3.5 28t25.5 7q29 2 57 3t57 0q26 0 32 -6.5t6 -31.5
|
||||
q0 -21 -0.5 -48l-1 -55l-1 -55t-0.5 -48q2 -55 3.5 -110t3.5 -111q2 -38 2 -75.5t1 -75.5q0 -13 -3 -16.5t-16 -3.5h-84.5t-85.5 2q-6 0 -13 3.5t-12 8.5q-29 27 -50 54q-11 13 -27 35t-33.5 48.5l-36 55l-34.5 52.5l-27.5 41.5l-15.5 23.5q-1 2 -4 2t-5 1q-1 -1 -1 -2
|
||||
q-1 -1 -1 -5v-46.5t1 -46.5l2 -96t3 -96q0 -23 -7 -30t-30 -6l-31.5 2t-31.5 1q-16 -1 -37.5 0t-38.5 -2q-13 -3 -16 10q-2 8 -1 13t1 13q-3 68 -2 135t-1 134q-1 36 0 72t1 72l-0.5 17.5t-0.5 41.5t0.5 49.5t0.5 42.5z" />
|
||||
<glyph glyph-name="N" unicode="N" horiz-adv-x="750"
|
||||
d="M4 601v22q2 17 17 14q38 1 71.5 0t68.5 1q13 1 19.5 -3.5t13.5 -13.5q27 -39 54 -83l55.5 -87.5l58 -86t60.5 -78.5q7 -8 17 -18.5t14 -10.5t5 15t1 26q-1 33 -1.5 72t-1.5 78.5t-1.5 78.5t-1.5 72q-1 22 3.5 28t25.5 7q29 2 57 3t57 0q26 0 32 -6.5t6 -31.5
|
||||
q0 -21 -0.5 -48l-1 -55l-1 -55t-0.5 -48q2 -55 3.5 -110t3.5 -111q2 -38 2 -75.5t1 -75.5q0 -13 -3 -16.5t-16 -3.5h-84.5t-85.5 2q-6 0 -13 3.5t-12 8.5q-29 27 -50 54q-11 13 -27 35t-33.5 48.5l-36 55l-34.5 52.5l-27.5 41.5l-15.5 23.5q-1 2 -4 2t-5 1q-1 -1 -1 -2
|
||||
q-1 -1 -1 -5v-46.5t1 -46.5l2 -96t3 -96q0 -23 -7 -30t-30 -6l-31.5 2t-31.5 1q-16 -1 -37.5 0t-38.5 -2q-13 -3 -16 10q-2 8 -1 13t1 13q-3 68 -2 135t-1 134q-1 36 0 72t1 72l-0.5 17.5t-0.5 41.5t0.5 49.5t0.5 42.5z" />
|
||||
<glyph glyph-name="O" unicode="O" horiz-adv-x="728"
|
||||
d="M632 326q-5 -46 -15 -89t-29.5 -81.5t-49 -71t-71.5 -56.5q-33 -19 -68 -29t-73 -10q-62 0 -110.5 15.5t-85 40t-62 55t-42 60t-24.5 54.5t-9 40q-2 27 -4.5 54t2.5 55q10 49 33.5 96t60 85t86.5 64.5t112 33.5q37 5 73.5 -1t71.5 -19q60 -23 101 -64.5t67 -100.5
|
||||
q14 -32 26 -63t10 -68zM466 330q0 12 -0.5 18.5t-1.5 10.5t-2 7.5t-2 9.5q-3 15 -16.5 32.5t-33 33t-43 26t-45.5 10.5q-45 0 -75.5 -18t-49 -44.5t-27.5 -57.5t-10 -57q-1 -17 8.5 -39.5t29 -43t48 -35t64.5 -14.5q40 0 69 16.5t48.5 40.5t29 52t9.5 52z" />
|
||||
<glyph glyph-name="o" unicode="o"
|
||||
d="M634 326q-5 -46 -15 -89t-29.5 -81.5t-49 -71t-71.5 -56.5q-33 -19 -68 -29t-73 -10q-62 0 -110.5 15.5t-85 40t-62 55t-42 60t-24.5 54.5t-9 40q-2 27 -4.5 54t2.5 55q10 49 33.5 96t60 85t86.5 64.5t112 33.5q37 5 73.5 -1t71.5 -19q60 -23 101 -64.5t67 -100.5
|
||||
q14 -32 26 -63t10 -68zM468 330q0 12 -0.5 18.5t-1.5 10.5t-2 7.5t-2 9.5q-3 15 -16.5 32.5t-33 33t-43 26t-45.5 10.5q-45 0 -75.5 -18t-49 -44.5t-27.5 -57.5t-10 -57q-1 -17 8.5 -39.5t29 -43t48 -35t64.5 -14.5q40 0 69 16.5t48.5 40.5t29 52t9.5 52z" />
|
||||
<glyph glyph-name="p" unicode="p" horiz-adv-x="635"
|
||||
d="M11 527q1 17 0 34.5t-1 35.5q1 21 8 29t28 10q17 2 33 2h32q54 -1 108 -1t108 -2q56 -3 105 -21q14 -5 35.5 -21.5t41 -42t33.5 -58t14 -68.5q0 -56 -19 -95t-49 -66.5t-66.5 -45t-71.5 -28.5q-59 -18 -122 -12q-21 2 -25 -4t-4 -29q-1 -30 -0.5 -55.5t2.5 -54.5
|
||||
q1 -21 -6 -30t-28 -8q-31 0 -65 -1.5t-65 0.5q-14 1 -18.5 6.5t-6.5 20.5q-2 27 -1 54t0 54q-2 51 -2.5 100.5t-2.5 100.5l0.5 21.5t1 52t1.5 64.5t2 58zM225 520q-20 -2 -24 -6t-3 -24q0 -27 0.5 -64t1.5 -64q1 -14 5 -19t17 -4q10 1 34.5 2t50 9t44.5 25t19 50
|
||||
q0 26 -10.5 43.5t-26 28.5t-34 16t-34.5 6.5t-27 1t-13 -0.5z" />
|
||||
<glyph glyph-name="P" unicode="P" horiz-adv-x="635"
|
||||
d="M11 527q1 17 0 34.5t-1 35.5q1 21 8 29t28 10q17 2 33 2h32q54 -1 108 -1t108 -2q56 -3 105 -21q14 -5 35.5 -21.5t41 -42t33.5 -58t14 -68.5q0 -56 -19 -95t-49 -66.5t-66.5 -45t-71.5 -28.5q-59 -18 -122 -12q-21 2 -25 -4t-4 -29q-1 -30 -0.5 -55.5t2.5 -54.5
|
||||
q1 -21 -6 -30t-28 -8q-31 0 -65 -1.5t-65 0.5q-14 1 -18.5 6.5t-6.5 20.5q-2 27 -1 54t0 54q-2 51 -2.5 100.5t-2.5 100.5l0.5 21.5t1 52t1.5 64.5t2 58zM225 520q-20 -2 -24 -6t-3 -24q0 -27 0.5 -64t1.5 -64q1 -14 5 -19t17 -4q10 1 34.5 2t50 9t44.5 25t19 50
|
||||
q0 26 -10.5 43.5t-26 28.5t-34 16t-34.5 6.5t-27 1t-13 -0.5z" />
|
||||
<glyph glyph-name="q" unicode="q" horiz-adv-x="792"
|
||||
d="M679 27q13 -13 0 -21l-55 -38.5l-55 -37.5q-12 -8 -23 5l-27.5 33.5l-27.5 34.5q-12 17 -32 10q-16 -6 -32 -11t-33 -8q-42 -8 -82 -0.5t-79 21.5q-16 5 -31.5 12t-30.5 15q-47 23 -83.5 56.5t-55.5 83.5q-7 18 -12 39.5t-8.5 42.5t-5 40t-1.5 32q0 22 6.5 48t18.5 52.5
|
||||
t29 52t38 46.5q50 50 110 76.5t127 34.5q45 6 88.5 -5t82.5 -36q66 -40 102 -97.5t51 -132.5q11 -58 -0.5 -110t-37.5 -103l-12 -26t-3.5 -16.5t7 -16t19.5 -22.5l24 -27.5zM471 256q14 42 11.5 84t-26.5 76q-22 30 -49 43.5t-51.5 17.5t-42 2.5t-20.5 -1.5
|
||||
q-20 -5 -38.5 -17.5t-29.5 -30.5q-16 -25 -28 -55t-12 -56t5.5 -39.5l12.5 -30.5q20 -46 62 -64.5t93 -15.5q43 2 71 24.5t42 62.5z" />
|
||||
<glyph glyph-name="Q" unicode="Q" horiz-adv-x="792"
|
||||
d="M679 27q13 -13 0 -21l-55 -38.5l-55 -37.5q-12 -8 -23 5l-27.5 33.5l-27.5 34.5q-12 17 -32 10q-16 -6 -32 -11t-33 -8q-42 -8 -82 -0.5t-79 21.5q-16 5 -31.5 12t-30.5 15q-47 23 -83.5 56.5t-55.5 83.5q-7 18 -12 39.5t-8.5 42.5t-5 40t-1.5 32q0 22 6.5 48t18.5 52.5
|
||||
t29 52t38 46.5q50 50 110 76.5t127 34.5q45 6 88.5 -5t82.5 -36q66 -40 102 -97.5t51 -132.5q11 -58 -0.5 -110t-37.5 -103l-12 -26t-3.5 -16.5t7 -16t19.5 -22.5l24 -27.5zM471 256q14 42 11.5 84t-26.5 76q-22 30 -49 43.5t-51.5 17.5t-42 2.5t-20.5 -1.5
|
||||
q-20 -5 -38.5 -17.5t-29.5 -30.5q-16 -25 -28 -55t-12 -56t5.5 -39.5l12.5 -30.5q20 -46 62 -64.5t93 -15.5q43 2 71 24.5t42 62.5z" />
|
||||
<glyph glyph-name="R" unicode="R" horiz-adv-x="656"
|
||||
d="M235 638q54 -2 107.5 -6t105.5 -25q26 -11 47 -26.5t36 -38.5q23 -34 32 -71.5t6 -74t-16 -70t-34 -60.5q-10 -12 -24.5 -21.5l-28.5 -18.5q-8 -5 -9.5 -10t3.5 -13l34.5 -57.5l35.5 -57.5q7 -11 17 -30t18 -30q7 -12 2 -24q-3 -8 -8.5 -9t-12.5 -1q-32 2 -63 1t-63 -1
|
||||
q-11 0 -16 4t-10 12l-41.5 78.5t-42.5 78.5q-4 7 -8 13l-8 12q-8 15 -27 15q-11 0 -20.5 1.5t-20.5 1.5q-16 1 -21.5 -3.5t-5.5 -21.5l2 -78l2 -78q1 -14 -3 -20t-17 -9q-5 -2 -11 -2h-11q-26 0 -50.5 -0.5t-50.5 -0.5q-8 0 -15 0.5t-15 1.5q-17 2 -20 19q-1 8 -2.5 16.5
|
||||
t-1.5 16.5q1 40 1 80t2 80q1 38 1 74.5v74.5q1 61 0 121.5t-1 121.5q0 22 6 27.5t29 4.5h84l11.5 0.5t28.5 1.5t35 1.5t32 -0.5zM201 413q-1 -14 -1 -27v-41q0 -17 18 -17q20 2 39.5 2.5t39.5 2.5q20 3 38.5 11t33.5 24q11 12 14.5 29t0 33.5t-13.5 29t-25 16.5
|
||||
q-68 17 -133 14q-3 -1 -6.5 -5.5t-3.5 -7.5q-1 -14 -1 -32v-32z" />
|
||||
<glyph glyph-name="r" unicode="r" horiz-adv-x="656"
|
||||
d="M235 638q54 -2 107.5 -6t105.5 -25q26 -11 47 -26.5t36 -38.5q23 -34 32 -71.5t6 -74t-16 -70t-34 -60.5q-10 -12 -24.5 -21.5l-28.5 -18.5q-8 -5 -9.5 -10t3.5 -13l34.5 -57.5l35.5 -57.5q7 -11 17 -30t18 -30q7 -12 2 -24q-3 -8 -8.5 -9t-12.5 -1q-32 2 -63 1t-63 -1
|
||||
q-11 0 -16 4t-10 12l-41.5 78.5t-42.5 78.5q-4 7 -8 13l-8 12q-8 15 -27 15q-11 0 -20.5 1.5t-20.5 1.5q-16 1 -21.5 -3.5t-5.5 -21.5l2 -78l2 -78q1 -14 -3 -20t-17 -9q-5 -2 -11 -2h-11q-26 0 -50.5 -0.5t-50.5 -0.5q-8 0 -15 0.5t-15 1.5q-17 2 -20 19q-1 8 -2.5 16.5
|
||||
t-1.5 16.5q1 40 1 80t2 80q1 38 1 74.5v74.5q1 61 0 121.5t-1 121.5q0 22 6 27.5t29 4.5h84l11.5 0.5t28.5 1.5t35 1.5t32 -0.5zM201 413q-1 -14 -1 -27v-41q0 -17 18 -17q20 2 39.5 2.5t39.5 2.5q20 3 38.5 11t33.5 24q11 12 14.5 29t0 33.5t-13.5 29t-25 16.5
|
||||
q-68 17 -133 14q-3 -1 -6.5 -5.5t-3.5 -7.5q-1 -14 -1 -32v-32z" />
|
||||
<glyph glyph-name="s" unicode="s" horiz-adv-x="584"
|
||||
d="M384 631q26 -11 44 -30l37 -38q6 -6 4 -14t-7 -13l-36 -39.5l-37 -38.5q-8 -9 -20 -2l-20 16t-21 14l-28 15.5t-28 12.5q-17 6 -30.5 1.5t-20.5 -18.5q-6 -12 -3.5 -28.5t14.5 -25.5q16 -11 32.5 -20.5l33.5 -18.5l48.5 -27.5t47.5 -27.5t41.5 -33.5t35.5 -40.5
|
||||
q20 -26 24.5 -56t0.5 -61q-14 -120 -131 -161q-46 -16 -90.5 -14.5t-90.5 14.5q-42 11 -77 31.5l-70 42.5q-6 3 -12 9q-9 8 -13.5 12.5t-5.5 9.5t1.5 11.5t8.5 17.5q11 21 20.5 43l19.5 44q4 8 7 15t8 14q3 5 8 6.5t10 -3.5l22 -22l22 -22q26 -25 57.5 -39.5t64.5 -25.5
|
||||
q13 -4 30 -1q15 3 25 12t13.5 21t0.5 25t-14 24q-13 13 -28 23.5t-31 19.5q-26 16 -53 30.5t-55 27.5q-42 20 -65.5 52.5t-35.5 75.5q-15 62 21 112q14 20 28 33.5t44 28.5q41 20 80 25.5t71.5 3t58 -9.5t39.5 -13z" />
|
||||
<glyph glyph-name="S" unicode="S" horiz-adv-x="584"
|
||||
d="M384 631q26 -11 44 -30l37 -38q6 -6 4 -14t-7 -13l-36 -39.5l-37 -38.5q-8 -9 -20 -2l-20 16t-21 14l-28 15.5t-28 12.5q-17 6 -30.5 1.5t-20.5 -18.5q-6 -12 -3.5 -28.5t14.5 -25.5q16 -11 32.5 -20.5l33.5 -18.5l48.5 -27.5t47.5 -27.5t41.5 -33.5t35.5 -40.5
|
||||
q20 -26 24.5 -56t0.5 -61q-14 -120 -131 -161q-46 -16 -90.5 -14.5t-90.5 14.5q-42 11 -77 31.5l-70 42.5q-6 3 -12 9q-9 8 -13.5 12.5t-5.5 9.5t1.5 11.5t8.5 17.5q11 21 20.5 43l19.5 44q4 8 7 15t8 14q3 5 8 6.5t10 -3.5l22 -22l22 -22q26 -25 57.5 -39.5t64.5 -25.5
|
||||
q13 -4 30 -1q15 3 25 12t13.5 21t0.5 25t-14 24q-13 13 -28 23.5t-31 19.5q-26 16 -53 30.5t-55 27.5q-42 20 -65.5 52.5t-35.5 75.5q-15 62 21 112q14 20 28 33.5t44 28.5q41 20 80 25.5t71.5 3t58 -9.5t39.5 -13z" />
|
||||
<glyph glyph-name="T" unicode="T" horiz-adv-x="646"
|
||||
d="M350 32q0 -20 -5.5 -25.5t-25.5 -6.5q-26 0 -51.5 -0.5t-51.5 -0.5q-16 -1 -20 3t-5 20q-1 63 -1 125t-1 125q-1 35 -1.5 77.5t-2.5 77.5q-1 15 -1 22.5t-3 11t-11 4t-24 0.5h-103q-11 0 -17.5 1t-10 4t-5 9t-2.5 17q-2 30 -2.5 60.5t-0.5 60.5q0 10 6 13.5t14 3.5
|
||||
q120 3 239 3t239 -4q17 -1 27 -9t11 -22q2 -30 2.5 -59.5t1.5 -58.5q0 -18 -19 -16l-39 2t-38 1q-39 1 -78 0q-14 -1 -17 -4.5t-3 -17.5v-50t-0.5 -74t0 -85.5t0 -85t-0.5 -73.5v-49z" />
|
||||
<glyph glyph-name="t" unicode="t" horiz-adv-x="646"
|
||||
d="M350 32q0 -20 -5.5 -25.5t-25.5 -6.5q-26 0 -51.5 -0.5t-51.5 -0.5q-16 -1 -20 3t-5 20q-1 63 -1 125t-1 125q-1 35 -1.5 77.5t-2.5 77.5q-1 15 -1 22.5t-3 11t-11 4t-24 0.5h-103q-11 0 -17.5 1t-10 4t-5 9t-2.5 17q-2 30 -2.5 60.5t-0.5 60.5q0 10 6 13.5t14 3.5
|
||||
q120 3 239 3t239 -4q17 -1 27 -9t11 -22q2 -30 2.5 -59.5t1.5 -58.5q0 -18 -19 -16l-39 2t-38 1q-39 1 -78 0q-14 -1 -17 -4.5t-3 -17.5v-50t-0.5 -74t0 -85.5t0 -85t-0.5 -73.5v-49z" />
|
||||
<glyph glyph-name="U" unicode="U" horiz-adv-x="656"
|
||||
d="M6 611q0 18 4 22t24 4q30 -2 60 -0.5t60 0.5q17 -1 20 -3.5t3 -19.5l-2 -61.5l-2 -61.5q-1 -45 -0.5 -88.5t0.5 -87.5q0 -25 6 -48.5t20 -44.5q37 -61 105 -49q23 3 36 22q43 58 40 126q-2 60 -0.5 120t-0.5 120q0 5 -0.5 14.5t-1 20l-1 20.5t-0.5 15q0 6 17.5 7.5
|
||||
t41.5 1.5t47.5 -1.5t35.5 -2.5q9 -1 14.5 -0.5t9 0t5 -4t2.5 -12.5q2 -26 3.5 -56.5t2.5 -55.5q2 -37 0.5 -73.5t-2.5 -73.5q0 -25 -1.5 -50t-5.5 -50q-11 -73 -43 -132.5t-97 -100.5q-20 -13 -45.5 -20t-50 -10t-45.5 -3t-33 1q-8 1 -27.5 4.5t-44 13.5t-51.5 27t-49 44
|
||||
t-36.5 65.5t-14.5 91.5q-1 47 -1 93.5v93.5l-0.5 19.5t-1 48t-0.5 60v55.5z" />
|
||||
<glyph glyph-name="u" unicode="u" horiz-adv-x="656"
|
||||
d="M6 611q0 18 4 22t24 4q30 -2 60 -0.5t60 0.5q17 -1 20 -3.5t3 -19.5l-2 -61.5l-2 -61.5q-1 -45 -0.5 -88.5t0.5 -87.5q0 -25 6 -48.5t20 -44.5q37 -61 105 -49q23 3 36 22q43 58 40 126q-2 60 -0.5 120t-0.5 120q0 5 -0.5 14.5t-1 20l-1 20.5t-0.5 15q0 6 17.5 7.5
|
||||
t41.5 1.5t47.5 -1.5t35.5 -2.5q9 -1 14.5 -0.5t9 0t5 -4t2.5 -12.5q2 -26 3.5 -56.5t2.5 -55.5q2 -37 0.5 -73.5t-2.5 -73.5q0 -25 -1.5 -50t-5.5 -50q-11 -73 -43 -132.5t-97 -100.5q-20 -13 -45.5 -20t-50 -10t-45.5 -3t-33 1q-8 1 -27.5 4.5t-44 13.5t-51.5 27t-49 44
|
||||
t-36.5 65.5t-14.5 91.5q-1 47 -1 93.5v93.5l-0.5 19.5t-1 48t-0.5 60v55.5z" />
|
||||
<glyph glyph-name="V" unicode="V" horiz-adv-x="719"
|
||||
d="M177 635q9 0 12 -5.5t5 -10.5q5 -10 8 -20l6 -20l37 -137.5l37 -137.5q3 -10 8 -22q2 -2 4.5 -3t4.5 -3q2 0 5 5q4 10 6 14q29 76 61 151.5t55 153.5q11 35 44 35h40h49.5h43h20.5q14 -3 10 -17q0 -4 -1.5 -7.5t-3.5 -7.5l-21 -56t-21 -55l-60.5 -140.5l-59.5 -139.5
|
||||
l-39 -94.5l-39 -95.5q-8 -20 -14 -21.5t-25 -1.5h-167q-9 1 -11 7t-4 13l-15.5 51.5l-14.5 51.5l-38.5 145.5l-38.5 144.5q-12 43 -25 85l-26 84q-2 6 -3.5 11.5t-3.5 11.5q-5 19 1 25t26 5q4 0 24 0.5t44.5 0.5h47.5h32z" />
|
||||
<glyph glyph-name="v" unicode="v" horiz-adv-x="719"
|
||||
d="M177 635q9 0 12 -5.5t5 -10.5q5 -10 8 -20l6 -20l37 -137.5l37 -137.5q3 -10 8 -22q2 -2 4.5 -3t4.5 -3q2 0 5 5q4 10 6 14q29 76 61 151.5t55 153.5q11 35 44 35h40h49.5h43h20.5q14 -3 10 -17q0 -4 -1.5 -7.5t-3.5 -7.5l-21 -56t-21 -55l-60.5 -140.5l-59.5 -139.5
|
||||
l-39 -94.5l-39 -95.5q-8 -20 -14 -21.5t-25 -1.5h-167q-9 1 -11 7t-4 13l-15.5 51.5l-14.5 51.5l-38.5 145.5l-38.5 144.5q-12 43 -25 85l-26 84q-2 6 -3.5 11.5t-3.5 11.5q-5 19 1 25t26 5q4 0 24 0.5t44.5 0.5h47.5h32z" />
|
||||
<glyph glyph-name="W" unicode="W" horiz-adv-x="927"
|
||||
d="M604 308q2 0 3.5 4.5t2.5 11t1.5 13t1.5 10.5q11 63 21 130.5l20 130.5q1 5 2 9t2 9q3 12 16 12q35 -2 70 -1t70 -1q18 -2 21.5 -7.5t0.5 -23.5q-11 -57 -21.5 -122.5t-21.5 -122.5l-23.5 -133l-22.5 -132q-3 -17 -7.5 -34.5t-7.5 -33.5q-4 -16 -7 -19.5t-19 -4.5
|
||||
q-35 -1 -69.5 0.5t-69.5 -0.5q-16 -1 -24.5 6t-13.5 21l-25.5 61.5l-25.5 60.5l-26 59.5l-26 59.5q-2 2 -3.5 5.5t-5.5 3.5q-3 0 -5 -4t-4 -7q-34 -59 -61.5 -121l-53.5 -125q-2 -10 -6 -13q-4 -4 -8 -7t-9 -3q-29 -2 -57 -0.5t-57 -0.5q-14 0 -18 14l-24.5 105.5
|
||||
l-24.5 105.5l-22.5 103l-23.5 102q-4 18 -8 40l-8 45.5t-8.5 45.5l-8.5 40q-1 4 -2 7t-2 7q-2 14 4.5 19t20.5 4q9 -1 29 -1.5t42.5 -0.5t42 0.5t28.5 1.5q8 0 10.5 -3t4.5 -9q4 -14 7.5 -31l7 -35l7 -35.5t6.5 -30.5l19 -73.5t19 -72.5q1 -3 2.5 -6.5t6.5 -3.5q3 0 7 8
|
||||
l42 69t40 70q17 35 55 32q21 -2 42 -0.5t43 0.5q8 0 12 -4t8 -12q19 -45 39 -87.5l40 -86.5q2 -5 5.5 -11.5t7.5 -6.5z" />
|
||||
<glyph glyph-name="w" unicode="w" horiz-adv-x="927"
|
||||
d="M604 308q2 0 3.5 4.5t2.5 11t1.5 13t1.5 10.5q11 63 21 130.5l20 130.5q1 5 2 9t2 9q3 12 16 12q35 -2 70 -1t70 -1q18 -2 21.5 -7.5t0.5 -23.5q-11 -57 -21.5 -122.5t-21.5 -122.5l-23.5 -133l-22.5 -132q-3 -17 -7.5 -34.5t-7.5 -33.5q-4 -16 -7 -19.5t-19 -4.5
|
||||
q-35 -1 -69.5 0.5t-69.5 -0.5q-16 -1 -24.5 6t-13.5 21l-25.5 61.5l-25.5 60.5l-26 59.5l-26 59.5q-2 2 -3.5 5.5t-5.5 3.5q-3 0 -5 -4t-4 -7q-34 -59 -61.5 -121l-53.5 -125q-2 -10 -6 -13q-4 -4 -8 -7t-9 -3q-29 -2 -57 -0.5t-57 -0.5q-14 0 -18 14l-24.5 105.5
|
||||
l-24.5 105.5l-22.5 103l-23.5 102q-4 18 -8 40l-8 45.5t-8.5 45.5l-8.5 40q-1 4 -2 7t-2 7q-2 14 4.5 19t20.5 4q9 -1 29 -1.5t42.5 -0.5t42 0.5t28.5 1.5q8 0 10.5 -3t4.5 -9q4 -14 7.5 -31l7 -35l7 -35.5t6.5 -30.5l19 -73.5t19 -72.5q1 -3 2.5 -6.5t6.5 -3.5q3 0 7 8
|
||||
l42 69t40 70q17 35 55 32q21 -2 42 -0.5t43 0.5q8 0 12 -4t8 -12q19 -45 39 -87.5l40 -86.5q2 -5 5.5 -11.5t7.5 -6.5z" />
|
||||
<glyph glyph-name="X" unicode="X" horiz-adv-x="698"
|
||||
d="M107 639h73q18 0 25 -15q9 -21 21 -39.5t25.5 -36.5l27 -36.5t25.5 -37.5q6 -11 10 -10.5t11 11.5l42 66l41 67q4 8 7.5 13.5t8.5 9t13.5 5t23.5 1.5h75q14 0 32 0.5t32 -0.5q16 -1 14 -10t-10 -22l-53.5 -77l-52.5 -78l-41.5 -60.5l-41.5 -59.5q-8 -11 -7.5 -19.5
|
||||
t6.5 -19.5l21 -34t22 -34l64.5 -88.5l65.5 -87.5q1 -2 5.5 -7t8.5 -11.5t6.5 -13t0.5 -11.5q-2 -3 -12.5 -4t-18.5 -1q-36 0 -71.5 1.5t-70.5 0.5q-14 -1 -22.5 4.5t-15.5 15.5l-75 117q-2 4 -4.5 8t-5.5 8q-9 9 -16 -1l-14 -18t-14 -19l-35.5 -52l-35.5 -52q-7 -10 -19 -12
|
||||
h-72.5t-73.5 1q-7 0 -11 1q-25 6 -10 27l76.5 108l77.5 108q8 11 15 22t15 22q8 10 7 18t-7 17l-54 86l-54 87l-35 57l-36 57q-18 28 18 28h46h27z" />
|
||||
<glyph glyph-name="x" unicode="x" horiz-adv-x="698"
|
||||
d="M107 639h73q18 0 25 -15q9 -21 21 -39.5t25.5 -36.5l27 -36.5t25.5 -37.5q6 -11 10 -10.5t11 11.5l42 66l41 67q4 8 7.5 13.5t8.5 9t13.5 5t23.5 1.5h75q14 0 32 0.5t32 -0.5q16 -1 14 -10t-10 -22l-53.5 -77l-52.5 -78l-41.5 -60.5l-41.5 -59.5q-8 -11 -7.5 -19.5
|
||||
t6.5 -19.5l21 -34t22 -34l64.5 -88.5l65.5 -87.5q1 -2 5.5 -7t8.5 -11.5t6.5 -13t0.5 -11.5q-2 -3 -12.5 -4t-18.5 -1q-36 0 -71.5 1.5t-70.5 0.5q-14 -1 -22.5 4.5t-15.5 15.5l-75 117q-2 4 -4.5 8t-5.5 8q-9 9 -16 -1l-14 -18t-14 -19l-35.5 -52l-35.5 -52q-7 -10 -19 -12
|
||||
h-72.5t-73.5 1q-7 0 -11 1q-25 6 -10 27l76.5 108l77.5 108q8 11 15 22t15 22q8 10 7 18t-7 17l-54 86l-54 87l-35 57l-36 57q-18 28 18 28h46h27z" />
|
||||
<glyph glyph-name="Y" unicode="Y" horiz-adv-x="677"
|
||||
d="M169 637q8 0 12 -3.5t8 -9.5q23 -34 46 -77.5t46 -78.5l5.5 -7.5l5.5 -7.5q8 -11 18 0l9 12q12 14 30 39l34.5 49l28.5 42t13 19q9 18 20.5 21t28.5 3q13 0 33 -0.5t39.5 -0.5h34.5h18q7 -2 9.5 -8t-2.5 -13q-2 -5 -5.5 -10t-7.5 -9q-20 -23 -39.5 -50.5l-40 -56
|
||||
l-40.5 -55.5t-39 -50l-44 -50q-20 -20 -19 -50q4 -60 2.5 -130t2.5 -130q0 -11 -4 -17t-16 -7q-30 -2 -57 -1.5t-56 -0.5q-14 0 -18.5 5.5t-6.5 19.5q0 9 -0.5 33.5t-1 54t-0.5 57.5v43q0 13 -1 30t-4 34t-8 32.5t-14 27.5q-23 32 -42.5 65.5t-40.5 65.5q-20 29 -40.5 66.5
|
||||
t-40.5 66.5q-3 5 -7 8.5t-7 8.5q-6 8 -2.5 13.5t13.5 6.5h22t41 -0.5t46 -0.5t38 1z" />
|
||||
<glyph glyph-name="y" unicode="y" horiz-adv-x="677"
|
||||
d="M169 637q8 0 12 -3.5t8 -9.5q23 -34 46 -77.5t46 -78.5l5.5 -7.5l5.5 -7.5q8 -11 18 0l9 12q12 14 30 39l34.5 49l28.5 42t13 19q9 18 20.5 21t28.5 3q13 0 33 -0.5t39.5 -0.5h34.5h18q7 -2 9.5 -8t-2.5 -13q-2 -5 -5.5 -10t-7.5 -9q-20 -23 -39.5 -50.5l-40 -56
|
||||
l-40.5 -55.5t-39 -50l-44 -50q-20 -20 -19 -50q4 -60 2.5 -130t2.5 -130q0 -11 -4 -17t-16 -7q-30 -2 -57 -1.5t-56 -0.5q-14 0 -18.5 5.5t-6.5 19.5q0 9 -0.5 33.5t-1 54t-0.5 57.5v43q0 13 -1 30t-4 34t-8 32.5t-14 27.5q-23 32 -42.5 65.5t-40.5 65.5q-20 29 -40.5 66.5
|
||||
t-40.5 66.5q-3 5 -7 8.5t-7 8.5q-6 8 -2.5 13.5t13.5 6.5h22t41 -0.5t46 -0.5t38 1z" />
|
||||
<glyph glyph-name="Z" unicode="Z" horiz-adv-x="666"
|
||||
d="M521 635q8 0 15 -0.5t14 -1.5q14 -2 18 -6t3 -18q0 -11 0.5 -26t0.5 -31t-0.5 -31t-1.5 -26q1 -23 -22 -50t-55 -68q-17 -21 -47 -52.5l-61 -62.5l-58 -56.5l-38 -35.5q-6 -4 -6 -12q0 -5 5.5 -5h9.5q57 -1 114 -0.5t115 -0.5h9t9 -1q16 -3 20 -8t4 -21q1 -28 0.5 -53.5
|
||||
t1.5 -53.5q1 -10 -3 -13t-13 -3q-51 2 -100 0t-99 -1q-78 2 -155 2t-155 2q-6 0 -11.5 0.5t-10.5 1.5q-16 2 -16 17q-1 60 0 118q0 6 5 12.5t10 10.5q10 8 31 29l48.5 49l58 60l59.5 62l54.5 54.5t42.5 38.5l4.5 4.5t2.5 6.5t-5 4h-8q-69 2 -136.5 0.5t-136.5 -0.5
|
||||
q-21 0 -26.5 4.5t-5.5 26.5q-1 28 -0.5 55.5t1.5 54.5q2 16 7 21.5t18 4.5q22 -2 61 -2h87t100 1t99 1t85 -0.5t57 -1.5z" />
|
||||
<glyph glyph-name="z" unicode="z" horiz-adv-x="667"
|
||||
d="M521 635q8 0 15 -0.5t14 -1.5q14 -2 18 -6t3 -18q0 -11 0.5 -26t0.5 -31t-0.5 -31t-1.5 -26q1 -23 -22 -50t-55 -68q-17 -21 -47 -52.5l-61 -62.5l-58 -56.5l-38 -35.5q-6 -4 -6 -12q0 -5 5.5 -5h9.5q57 -1 114 -0.5t115 -0.5h9t9 -1q16 -3 20 -8t4 -21q1 -28 0.5 -53.5
|
||||
t1.5 -53.5q1 -10 -3 -13t-13 -3q-51 2 -100 0t-99 -1q-78 2 -155 2t-155 2q-6 0 -11.5 0.5t-10.5 1.5q-16 2 -16 17q-1 60 0 118q0 6 5 12.5t10 10.5q10 8 31 29l48.5 49l58 60l59.5 62l54.5 54.5t42.5 38.5l4.5 4.5t2.5 6.5t-5 4h-8q-69 2 -136.5 0.5t-136.5 -0.5
|
||||
q-21 0 -26.5 4.5t-5.5 26.5q-1 28 -0.5 55.5t1.5 54.5q2 16 7 21.5t18 4.5q22 -2 61 -2h87t100 1t99 1t85 -0.5t57 -1.5z" />
|
||||
<glyph glyph-name="guillemotleft" unicode="«" horiz-adv-x="537"
|
||||
d="M434 411h12.5t18.5 -1q4 0 8 -1.5t8 -2.5q-2 -4 -3 -8t-3 -7l-21 -26.5l-21 -25.5l-47.5 -55l-48.5 -54q-15 -18 -4 -38l96 -156q4 -7 9.5 -13.5t0.5 -14.5q-4 -5 -12 -7t-16 -3q-15 -2 -30 -2h-29q-4 0 -8.5 2t-6.5 5q-12 32 -33 58t-38 55q-13 23 -27.5 44l-28.5 42
|
||||
q-5 8 -5.5 13.5t6.5 13.5l71 86l71 85q5 6 14 8.5t17 4.5q11 1 22 0t28 -2zM125 -1q-12 -3 -19 2.5t-11 14.5q-17 42 -40 80.5l-45 77.5q-8 16 -7.5 27.5t10.5 25.5q26 38 50 77.5l47 79.5q9 16 21 24.5t32 6.5q16 -2 31.5 0.5t31.5 1.5q28 0 13 -21l-33.5 -50l-33.5 -49
|
||||
l-21.5 -34.5l-21.5 -34.5q-14 -21 -1 -46l40 -74.5l40 -74.5l6 -15t2 -12q-2 -4 -7.5 -5t-10.5 -3q-1 0 -11 0.5t-23 1t-24.5 0.5t-14.5 -1z" />
|
||||
<glyph glyph-name="guillemotright" unicode="»" horiz-adv-x="457"
|
||||
d="M50 -2q-7 0 -13 0.5t-12 1.5q-18 1 -19.5 3.5t6.5 19.5l34 78l34 77q6 12 5 21.5t-8 20.5q-17 32 -33 65.5l-33 66.5q-6 13 -3.5 16.5t17.5 4.5q20 2 39 2.5t38 -0.5q4 0 8.5 -4t6.5 -8l29 -58.5l29 -58.5q6 -12 14 -24.5t8 -25.5q1 -13 -7 -26t-13 -26
|
||||
q-11 -27 -23 -53.5t-22 -53.5q-9 -25 -25 -33.5t-40 -6.5q-5 1 -9 1h-8zM259 -3q-10 -1 -19.5 -1t-19.5 -1q-38 -3 -22 31l33 70.5l33 70.5q10 18 11 34.5t-9 35.5q-12 21 -23 43l-22 45l-6 10.5l-6 11.5q-9 23 16 26q14 2 26.5 2t26.5 2q12 2 20.5 -2t13.5 -16l36 -76.5
|
||||
l37 -76.5q4 -9 1.5 -15t-5.5 -14l-35.5 -81l-34.5 -81q-5 -11 -10.5 -16t-17.5 -3q-6 1 -15 0.5t-9 0.5z" />
|
||||
<glyph glyph-name="dollar" unicode="$" horiz-adv-x="584"
|
||||
d="M7 412q-1 49 -1.5 97t-1.5 97q0 16 5 22t21 7q11 1 22.5 0.5t23.5 -0.5q42 -2 84.5 -3.5t84.5 -3.5l49.5 -2t49.5 -4q29 -3 56 -14t47 -35q26 -32 41 -68.5t5 -80.5l-9.5 -41.5t-12.5 -40.5q-37 -81 -127 -96l-70 -10t-71 0q-3 1 -6.5 0.5t-7.5 -0.5q-13 0 -13 -13v-21
|
||||
q0 -18 17 -18q21 -1 42.5 -1.5t42.5 -1.5q19 -1 22 -4.5t4 -21.5q1 -17 0.5 -27t-5.5 -14.5t-14.5 -5.5t-26.5 -1h-70q-17 -2 -16 -19q1 -15 1.5 -30t0.5 -30q0 -17 -6 -24t-22 -7q-29 1 -58 1.5t-58 1.5q-15 0 -17.5 3t-3.5 17l-2 77t0 78q0 30 0.5 70.5t0.5 77.5v63t-1 26
|
||||
zM176 442q1 -14 0.5 -26.5t1.5 -26.5q0 -12 5 -16t17 -4q10 1 19.5 1t18.5 2l39.5 10t34.5 21q15 15 17 34.5t-13 34.5q-8 9 -19.5 17t-23.5 11q-20 4 -40 4t-41 1q-16 1 -16 -18v-28v-17z" />
|
||||
<glyph glyph-name="underscore" unicode="_" horiz-adv-x="494"
|
||||
d="M274 -143q24 1 36.5 1t22.5 0.5t22 0.5t35 1q15 0 18 -2.5t4 -16.5q2 -17 2 -33t1 -33q0 -18 -16 -19l-30 -2t-30 -1q-26 0 -38.5 -0.5t-22.5 -1.5t-22 -1.5t-38 -0.5q-11 0 -34.5 0.5t-50 1t-50 0.5t-33.5 -1q-19 -1 -26.5 4.5t-11.5 23.5q-3 16 -4.5 30t-3.5 31
|
||||
q-2 11 2.5 14.5t16.5 4.5q32 0 60.5 0.5t61.5 0.5q7 0 25.5 -0.5t39.5 -0.5t39.5 -0.5t24.5 -0.5z" />
|
||||
<glyph glyph-name="at" unicode="@" horiz-adv-x="698"
|
||||
d="M12 176q1 60 25.5 109t66.5 91q36 35 79 57.5t95 28.5q7 1 14 1t14 2q38 6 79.5 -2t79 -24t66.5 -36t41 -37q30 -43 38 -86.5t1 -82.5t-25 -71t-39 -51q-33 -30 -73 -33.5t-75 23.5q-10 8 -18 9.5t-20 -2.5q-27 -11 -55 -10t-54 15q-8 5 -16.5 11t-12.5 14
|
||||
q-9 22 -14.5 45t1.5 48q1 3 1.5 6.5t2.5 6.5q28 93 131 104q22 3 40.5 -1.5t37.5 -14.5q23 -13 19 -37q-5 -23 -0.5 -44.5t9.5 -42.5q2 -5 3 -9t3 -8q5 -8 12 -10.5t15 2.5t15.5 12t11.5 15q5 11 7.5 23.5t0.5 24.5q-8 63 -44.5 102t-103.5 44q-135 12 -211 -102
|
||||
q-7 -11 -11.5 -23.5t-8.5 -25.5q-11 -48 0 -91t43 -81q22 -26 51 -39.5t64 -8.5q21 2 31 2.5t15 -4t8.5 -14l9.5 -26.5q4 -12 6 -24q2 -14 -3 -22t-19 -13q-100 -35 -192 25q-41 26 -69.5 61t-49.5 77q-5 9 -9 23.5t-7 31t-5 33t-2 29.5z" />
|
||||
<glyph glyph-name="percent" unicode="%" horiz-adv-x="698"
|
||||
d="M180 -8q-18 1 -35.5 1t-34.5 1t-10 16l73 149q11 20 21 40.5l20 41.5l50.5 102.5l49.5 103.5l23.5 49.5l22.5 49.5q5 10 12.5 15.5t20.5 4.5q27 -1 53.5 0t52.5 1q12 1 14.5 -1.5t-2.5 -12.5l-24.5 -55l-25.5 -54l-70 -144.5l-70 -144.5q-17 -35 -35.5 -69t-35.5 -69
|
||||
q-13 -27 -42 -24q-7 1 -17.5 0.5t-10.5 -1.5zM379 120q1 34 12.5 57.5t29.5 38t42.5 21t52.5 5.5q28 -2 50.5 -17.5t34.5 -43.5q20 -48 6 -91.5t-48 -70.5q-47 -36 -100 -13q-5 2 -13 6q-40 18 -54.5 41t-12.5 67zM533 131q0 14 -11 23.5t-27 8.5q-12 -1 -23.5 -12
|
||||
t-10.5 -22q0 -15 13.5 -27t28.5 -12q13 0 21.5 12t8.5 29zM4 482q3 42 21.5 63t60.5 32q25 8 46 2.5t42 -19.5q18 -12 30 -29t16.5 -36.5t2 -40.5t-12.5 -40q-12 -21 -28.5 -35t-35.5 -21t-39.5 -5.5t-40.5 12.5q-31 16 -49 45t-13 72zM149 469q2 29 -29 31
|
||||
q-15 1 -26.5 -7.5t-10.5 -20.5q0 -11 11 -22t23 -12q11 -1 21 8.5t11 22.5z" />
|
||||
<glyph glyph-name="numbersign" unicode="#" horiz-adv-x="604"
|
||||
d="M298 1h-11q-14 0 -22 1.5t-11 5.5t-2 12t5 22l6 22l6 22q3 16 -12 17q-1 0 -1.5 0.5t-1.5 0.5q-22 2 -34.5 2t-20.5 -5t-13.5 -16.5t-12.5 -31.5q0 -1 -0.5 -1.5t-0.5 -2.5q-6 -11 -11.5 -23l-10.5 -24q-20 0 -39 -0.5t-38 0.5q-7 0 -10 5t-1 13q4 12 7.5 24t6.5 24
|
||||
q4 14 0.5 18t-18.5 6q-10 1 -19.5 0.5t-19.5 -0.5q-9 1 -13.5 4.5t-2.5 13.5q2 8 3.5 17t4.5 17l9.5 25.5t9.5 14t16 5.5t27 2q15 1 23.5 2.5t13.5 6t7 13t4 22.5q1 11 -1.5 14.5t-13.5 3.5h-46q-16 0 -11 17l10 30l10 30q6 19 27 18q9 -1 18 -0.5t17 0.5q18 1 22.5 4
|
||||
t10.5 20q12 35 21 74q2 7 5 11t11 4q20 0 41 0.5t41 0.5q14 0 9 -14l-24 -81q-4 -14 9 -13h28.5t28.5 2q20 1 24.5 5.5t10.5 24.5l10 34l10 34q1 3 4.5 6.5t6.5 3.5q31 1 63 0q17 0 21 -5t-1 -22q-5 -16 -9 -32t-9 -32q-2 -9 0 -12t12 -3q11 1 21 2.5t21 1.5q26 1 19 -24
|
||||
q-3 -9 -8 -19l-24 -54q-14 -1 -28 -1.5t-28 -1.5q-17 0 -21 -2.5t-10 -18.5q-1 -2 -1 -5t-1 -5q-6 -20 -3.5 -23t22.5 -3h39q23 0 16 -22q-5 -15 -11 -29.5t-11 -30.5q-7 -22 -31 -21q-12 0 -24.5 -1t-24.5 0q-17 0 -21 -15q-4 -14 -7.5 -29l-6.5 -29q-2 -10 -4 -15.5
|
||||
t-5.5 -8.5t-9.5 -3.5t-16 -0.5h-21v1zM259 199q10 0 19.5 -0.5t19.5 0.5q3 0 7 1t5 3q3 12 7 24t3 23q-1 9 -10 8.5t-17 -0.5q-10 1 -19.5 0.5t-19.5 0.5q-21 3 -28 -19q-5 -16 -7 -25t1 -12.5t12.5 -4t26.5 0.5z" />
|
||||
<glyph glyph-name="ampersand" unicode="&" horiz-adv-x="677"
|
||||
d="M3 175q-1 32 7 63t32 56q14 14 29.5 26t31.5 23q15 10 4 22q-30 38 -35 81t3 88q4 25 20 43.5t38 32.5q35 22 72.5 26.5t77.5 -6.5q34 -10 55 -32t35 -52q12 -27 14.5 -57.5t-3.5 -60.5t-20.5 -56t-36.5 -43q-16 -11 -16 -17t14 -21q7 -8 14 -14.5t13 -14.5q12 -14 24 0
|
||||
l11 17l14 22.5t12 21t6 12.5q5 20 29 19q21 -1 43 0t42 -1q14 -1 14 -15q-2 -48 -20.5 -91t-43.5 -81q-11 -15 -10.5 -20t12.5 -18l39 -40.5l39 -41.5q2 -2 5 -5.5t5 -5.5q5 -5 9 -11t0 -14q-3 -8 -9.5 -8.5t-14.5 -0.5h-62.5t-62.5 1q-3 0 -7 3t-8.5 7t-8.5 8l-6 6
|
||||
q-13 15 -31 4q-53 -32 -117 -46q-60 -13 -110 3.5t-93 54.5q-29 25 -40.5 59t-8.5 74zM227 132q8 0 16.5 3t17.5 7q9 3 10.5 9t-3.5 13l-27.5 32.5l-27.5 32.5q-8 8 -19 1q-17 -11 -24.5 -29.5t-2.5 -34.5q5 -13 25.5 -23.5t34.5 -10.5zM271 470q0 17 -6 26.5t-14 14
|
||||
t-16.5 4t-13.5 -2.5q-10 -4 -15.5 -12t-2.5 -19q5 -17 11.5 -32.5t14.5 -31.5q1 -2 5 -3t6 0q13 9 22 25.5t9 30.5z" />
|
||||
<glyph glyph-name="quotedblleft" unicode="“" horiz-adv-x="537"
|
||||
d="M434 411h12.5t18.5 -1q4 0 8 -1.5t8 -2.5q-2 -4 -3 -8t-3 -7l-21 -26.5l-21 -25.5l-47.5 -55l-48.5 -54q-15 -18 -4 -38l96 -156q4 -7 9.5 -13.5t0.5 -14.5q-4 -5 -12 -7t-16 -3q-15 -2 -30 -2h-29q-4 0 -8.5 2t-6.5 5q-12 32 -33 58t-38 55q-13 23 -27.5 44l-28.5 42
|
||||
q-5 8 -5.5 13.5t6.5 13.5l71 86l71 85q5 6 14 8.5t17 4.5q11 1 22 0t28 -2zM125 -1q-12 -3 -19 2.5t-11 14.5q-17 42 -40 80.5l-45 77.5q-8 16 -7.5 27.5t10.5 25.5q26 38 50 77.5l47 79.5q9 16 21 24.5t32 6.5q16 -2 31.5 0.5t31.5 1.5q28 0 13 -21l-33.5 -50l-33.5 -49
|
||||
l-21.5 -34.5l-21.5 -34.5q-14 -21 -1 -46l40 -74.5l40 -74.5l6 -15t2 -12q-2 -4 -7.5 -5t-10.5 -3q-1 0 -11 0.5t-23 1t-24.5 0.5t-14.5 -1z" />
|
||||
<glyph glyph-name="quotedblright" unicode="”" horiz-adv-x="448"
|
||||
d="M50 -2q-7 0 -13 0.5t-12 1.5q-18 1 -19.5 3.5t6.5 19.5l34 78l34 77q6 12 5 21.5t-8 20.5q-17 32 -33 65.5l-33 66.5q-6 13 -3.5 16.5t17.5 4.5q20 2 39 2.5t38 -0.5q4 0 8.5 -4t6.5 -8l29 -58.5l29 -58.5q6 -12 14 -24.5t8 -25.5q1 -13 -7 -26t-13 -26
|
||||
q-11 -27 -23 -53.5t-22 -53.5q-9 -25 -25 -33.5t-40 -6.5q-5 1 -9 1h-8zM259 -3q-10 -1 -19.5 -1t-19.5 -1q-38 -3 -22 31l33 70.5l33 70.5q10 18 11 34.5t-9 35.5q-12 21 -23 43l-22 45l-6 10.5l-6 11.5q-9 23 16 26q14 2 26.5 2t26.5 2q12 2 20.5 -2t13.5 -16l36 -76.5
|
||||
l37 -76.5q4 -9 1.5 -15t-5.5 -14l-35.5 -81l-34.5 -81q-5 -11 -10.5 -16t-17.5 -3q-6 1 -15 0.5t-9 0.5z" />
|
||||
<glyph glyph-name="less" unicode="<" horiz-adv-x="457"
|
||||
d="M391 398q-1 -14 -1.5 -26.5t-2.5 -26.5l-54 -24q-39 -17 -78.5 -32.5l-78.5 -31.5q-4 -2 -7 -5t-7 -5q3 -3 5.5 -6t6.5 -5q50 -30 101.5 -57t105.5 -50q25 -11 22 -38q-2 -19 -2 -37t-1 -37q-2 -17 -17 -11l-21 10l-21 10l-99 49.5l-100 50.5l-57.5 30.5l-57.5 30.5
|
||||
q-25 11 -23 39l2 30t0 30q-1 20 18 27l98.5 43.5l99.5 42.5l73.5 29.5l73.5 29.5q14 6 19 3t5 -17v-13t-0.5 -15t-1 -12.5z" />
|
||||
<glyph glyph-name="greater" unicode=">" horiz-adv-x="473"
|
||||
d="M6 119q-5 15 3 23.5t22 14.5l77 34.5l77 34.5q7 3 13.5 5.5t12.5 6.5q3 2 4.5 4.5t3.5 4.5q-5 5 -8 6q-26 11 -56 21q-38 11 -72 30t-69 36q-2 2 -4.5 6t-2.5 8q-1 23 -1 44.5t-1 44.5q0 15 18 10l54.5 -19.5t55.5 -20.5l88.5 -34.5l88.5 -34.5l31 -13.5t31 -12.5
|
||||
q10 -4 12.5 -10.5t2.5 -14.5q1 -18 0.5 -35.5t1.5 -34.5q1 -15 -4 -24.5t-19 -14.5l-35.5 -16l-35.5 -16l-112 -52.5l-112 -52.5q-7 -3 -13 -6l-12 -6q-17 -8 -24 -4t-10 22q-2 16 -3 32t-3 34z" />
|
||||
<glyph glyph-name="quotedblbase" unicode="„" horiz-adv-x="833"
|
||||
/>
|
||||
<glyph glyph-name="quotedbl" unicode=""" horiz-adv-x="833"
|
||||
/>
|
||||
<glyph glyph-name="uni0406" unicode="І" horiz-adv-x="302"
|
||||
d="M198 248v-226q0 -16 -4.5 -19.5t-21.5 -1.5q-33 4 -66 1.5t-69 -1.5q-31 -5 -31 26q-1 18 -0.5 34t0.5 35q1 45 1 90v90q0 68 -0.5 144t-1.5 144q0 12 0.5 24t1.5 24q2 14 5.5 17.5t16.5 5.5q38 4 74 3.5t73 -5.5q11 -1 18 -2t8 -12q2 -10 1.5 -25t-0.5 -25
|
||||
q-1 -66 -2 -148.5t-3 -172.5z" />
|
||||
<glyph glyph-name="uni0456" unicode="і" horiz-adv-x="302"
|
||||
d="M198 248v-226q0 -16 -4.5 -19.5t-21.5 -1.5q-33 4 -66 1.5t-69 -1.5q-31 -5 -31 26q-1 18 -0.5 34t0.5 35q1 45 1 90v90q0 68 -0.5 144t-1.5 144q0 12 0.5 24t1.5 24q2 14 5.5 17.5t16.5 5.5q38 4 74 3.5t73 -5.5q11 -1 18 -2t8 -12q2 -10 1.5 -25t-0.5 -25
|
||||
q-1 -66 -2 -148.5t-3 -172.5z" />
|
||||
<glyph glyph-name="uni0490" unicode="Ґ" horiz-adv-x="542"
|
||||
d="M8 293v50t-0.5 61l-1 64t-1 58.5t-1 44.5t-0.5 23v15t1 15q0 17 19 18q18 0 44.5 0.5t58.5 0.5h67h69v28.5v26.5t0.5 20t0.5 11q0 17 19 18q31 1 48.5 1h29.5t22 -0.5t27 -0.5q18 0 22 -4t6 -22q0 -3 0.5 -19t1 -39t1 -49.5t1 -50t1 -41.5t1.5 -23q2 -16 -2 -21.5
|
||||
t-19 -7.5q-6 -1 -33 -1.5t-61.5 -0.5t-69 -0.5t-56.5 -0.5q-16 0 -16 -17q0 -4 -0.5 -7.5t-0.5 -7.5q1 -75 0 -156t1 -156q1 -23 0.5 -40t0.5 -40q1 -14 -2 -31q-3 -15 -19 -15q-38 -2 -72.5 -2.5t-71.5 -1.5q-8 0 -10.5 4t-3.5 10q-1 7 -1 13.5v13.5v130t-1 129h1z" />
|
||||
<glyph glyph-name="uni0491" unicode="ґ" horiz-adv-x="542"
|
||||
d="M8 293v50t-0.5 61l-1 64t-1 58.5t-1 44.5t-0.5 23v15t1 15q0 17 19 18q18 0 44.5 0.5t58.5 0.5h67h69v28.5v26.5t0.5 20t0.5 11q0 17 19 18q31 1 48.5 1h29.5t22 -0.5t27 -0.5q18 0 22 -4t6 -22q0 -3 0.5 -19t1 -39t1 -49.5t1 -50t1 -41.5t1.5 -23q2 -16 -2 -21.5
|
||||
t-19 -7.5q-6 -1 -33 -1.5t-61.5 -0.5t-69 -0.5t-56.5 -0.5q-16 0 -16 -17q0 -4 -0.5 -7.5t-0.5 -7.5q1 -75 0 -156t1 -156q1 -23 0.5 -40t0.5 -40q1 -14 -2 -31q-3 -15 -19 -15q-38 -2 -72.5 -2.5t-71.5 -1.5q-8 0 -10.5 4t-3.5 10q-1 7 -1 13.5v13.5v130t-1 129h1z" />
|
||||
<glyph glyph-name="uni0407" unicode="Ї" horiz-adv-x="302"
|
||||
d="M9 719q-16 1 -29.5 7t-23.5 16.5t-15.5 23.5t-4.5 28q1 13 7.5 25t16.5 21t22.5 14.5t25.5 5.5q12 0 24.5 -6.5t22 -17t15.5 -23t6 -24.5q0 -15 -5.5 -28t-14.5 -22.5t-21.5 -15t-25.5 -4.5zM196 855q12 0 23.5 -5t20.5 -13.5t14 -19t5 -22.5q-1 -30 -18.5 -49.5
|
||||
t-44.5 -18.5q-29 0 -48 19.5t-19 49.5q-1 26 18 42.5t49 16.5zM198 248v-226q0 -16 -4.5 -19.5t-21.5 -1.5q-33 4 -66 1.5t-69 -1.5q-31 -5 -31 26q-1 18 -0.5 34t0.5 35q1 45 1 90v90q0 68 -0.5 144t-1.5 144q0 12 0.5 24t1.5 24q2 14 5.5 17.5t16.5 5.5q38 4 74 3.5
|
||||
t73 -5.5q11 -1 18 -2t8 -12q2 -10 1.5 -25t-0.5 -25q-1 -66 -2 -148.5t-3 -172.5z" />
|
||||
<glyph glyph-name="uni0457" unicode="ї" horiz-adv-x="302"
|
||||
d="M9 719q-16 1 -29.5 7t-23.5 16.5t-15.5 23.5t-4.5 28q1 13 7.5 25t16.5 21t22.5 14.5t25.5 5.5q12 0 24.5 -6.5t22 -17t15.5 -23t6 -24.5q0 -15 -5.5 -28t-14.5 -22.5t-21.5 -15t-25.5 -4.5zM196 855q12 0 23.5 -5t20.5 -13.5t14 -19t5 -22.5q-1 -30 -18.5 -49.5
|
||||
t-44.5 -18.5q-29 0 -48 19.5t-19 49.5q-1 26 18 42.5t49 16.5zM198 248v-226q0 -16 -4.5 -19.5t-21.5 -1.5q-33 4 -66 1.5t-69 -1.5q-31 -5 -31 26q-1 18 -0.5 34t0.5 35q1 45 1 90v90q0 68 -0.5 144t-1.5 144q0 12 0.5 24t1.5 24q2 14 5.5 17.5t16.5 5.5q38 4 74 3.5
|
||||
t73 -5.5q11 -1 18 -2t8 -12q2 -10 1.5 -25t-0.5 -25q-1 -66 -2 -148.5t-3 -172.5z" />
|
||||
<glyph glyph-name="uni0404" unicode="Є" horiz-adv-x="674"
|
||||
d="M-22 300q-5 72 15 132.5t64 112.5q35 42 78.5 71.5t99.5 37.5q60 9 121 6q100 -3 178 -69q11 -10 11.5 -14t-9.5 -16q-4 -4 -7 -8.5t-6 -9.5l-23.5 -39l-24.5 -39q-8 -13 -15.5 -16.5t-24.5 5.5q-81 44 -173 18q-27 -8 -49.5 -23t-32.5 -44q-4 -13 -2 -16.5t16 -5.5
|
||||
q9 0 33.5 -0.5t52 -0.5t52 -0.5t33.5 -0.5q21 -1 28.5 -8.5t6.5 -28.5q0 -11 -2 -21t-2 -21q0 -21 -20 -21q-8 -1 -17 -1h-17h-29.5t-48.5 0.5t-48.5 0.5h-28.5q-20 0 -14 -20q14 -46 55 -64q52 -23 103 -23.5t100 32.5q17 11 32 24t29 27q16 16 34 7q12 -6 17 -19l27 -64.5
|
||||
l27 -65.5q3 -8 -0.5 -12.5t-8.5 -9.5q-43 -40 -95 -62q-67 -29 -135.5 -40.5t-141.5 11.5q-41 13 -75.5 32.5t-68.5 44.5q-33 24 -54 62t-31 78.5t-9 80.5z" />
|
||||
<glyph glyph-name="uni0454" unicode="є" horiz-adv-x="674"
|
||||
d="M-22 300q-5 72 15 132.5t64 112.5q35 42 78.5 71.5t99.5 37.5q60 9 121 6q100 -3 178 -69q11 -10 11.5 -14t-9.5 -16q-4 -4 -7 -8.5t-6 -9.5l-23.5 -39l-24.5 -39q-8 -13 -15.5 -16.5t-24.5 5.5q-81 44 -173 18q-27 -8 -49.5 -23t-32.5 -44q-4 -13 -2 -16.5t16 -5.5
|
||||
q9 0 33.5 -0.5t52 -0.5t52 -0.5t33.5 -0.5q21 -1 28.5 -8.5t6.5 -28.5q0 -11 -2 -21t-2 -21q0 -21 -20 -21q-8 -1 -17 -1h-17h-29.5t-48.5 0.5t-48.5 0.5h-28.5q-20 0 -14 -20q14 -46 55 -64q52 -23 103 -23.5t100 32.5q17 11 32 24t29 27q16 16 34 7q12 -6 17 -19l27 -64.5
|
||||
l27 -65.5q3 -8 -0.5 -12.5t-8.5 -9.5q-43 -40 -95 -62q-67 -29 -135.5 -40.5t-141.5 11.5q-41 13 -75.5 32.5t-68.5 44.5q-33 24 -54 62t-31 78.5t-9 80.5z" />
|
||||
<glyph glyph-name="uni20B4" unicode="₴" horiz-adv-x="583"
|
||||
d="M261 271l-10 -6q-16 -9 -31 -19.5t-28 -23.5q-11 -11 -14 -24t0.5 -25t13.5 -21t25 -12q8 -2 15.5 -0.5t14.5 1.5q36 -1 65 6t57 21q14 7 23.5 12.5t20.5 16.5q5 5 10 3.5t8 -6.5q5 -7 8 -14t7 -15q10 -22 16 -36.5t11 -35.5q3 -11 5 -17.5t2 -11.5t-3.5 -9.5
|
||||
t-12.5 -12.5q-6 -6 -12 -9q-33 -17 -62 -27t-72 -15q-26 -3 -47 -5t-41.5 -1.5t-42.5 3.5t-50 9q-60 14 -92 57.5t-39 103.5q-4 31 0.5 59t24.5 54l5 7zM187 395l17 9l33.5 18.5t32.5 20.5q12 9 14.5 25.5t-3.5 28.5q-7 14 -20 15.5t-31 1.5q-22 0 -42 -5.5t-35 -12.5
|
||||
t-24.5 -13.5t-11.5 -7.5q-12 -7 -20 2q-9 9 -15 18.5t-11.5 19.5l-11 20t-14.5 20q-5 5 -7 13t4 14q19 19 34.5 32t41.5 24q14 6 39.5 12t58 7.5t71.5 -5.5t80 -27q30 -15 44 -28.5t28 -33.5q36 -50 21 -112q-5 -19 -12 -34.5t-18 -28.5zM491 443q15 0 18 -2.5t4 -16.5
|
||||
q1 -9 1.5 -12.5t0.5 -5.5t0.5 -5.5t0.5 -12.5q0 -18 -16 -19l-30 -2t-30 -1h-54t-81 0.5l-93 1t-89.5 1t-70.5 0.5h-36q-19 -1 -28 3t-10 25q0 8 -0.5 12t-0.5 14q0 11 3.5 14.5t15.5 4.5h47.5h86.5h107h108.5t91 0.5t54.5 0.5zM473 316q15 0 18 -2.5t4 -16.5
|
||||
q1 -9 1.5 -12.5t0.5 -5.5t0.5 -5.5t0.5 -12.5q0 -18 -16 -19l-30 -2t-30 -1h-54t-81 0.5l-93 1t-89.5 1t-70.5 0.5h-36q-19 -1 -28 3t-10 25q0 8 -0.5 12t-0.5 14q0 11 3.5 14.5t15.5 4.5h47.5h86.5h107h108.5t91 0.5t54.5 0.5z" />
|
||||
<hkern u1="Г" u2="а" k="70" />
|
||||
<hkern u1="Г" u2="А" k="70" />
|
||||
<hkern u1="Т" u2="а" k="50" />
|
||||
<hkern u1="Т" u2="А" k="50" />
|
||||
<hkern u1="А" u2="Т" k="50" />
|
||||
<hkern u1="а" u2="т" k="50" />
|
||||
<hkern u1="г" u2="а" k="70" />
|
||||
<hkern u1="т" u2="а" k="50" />
|
||||
<hkern u1="A" u2="T" k="50" />
|
||||
<hkern u1="a" u2="t" k="50" />
|
||||
<hkern u1="T" u2="a" k="50" />
|
||||
<hkern u1="T" u2="A" k="50" />
|
||||
<hkern u1="t" u2="a" k="50" />
|
||||
<hkern u1="Ґ" u2="а" k="70" />
|
||||
<hkern u1="Ґ" u2="А" k="70" />
|
||||
<hkern u1="ґ" u2="а" k="70" />
|
||||
</font>
|
||||
</defs></svg>
|
||||
|
Before Width: | Height: | Size: 113 KiB |
@@ -1,7 +0,0 @@
|
||||
@font-face {
|
||||
font-family: "Shadow";
|
||||
src: url("Shadow-Regular.eot");
|
||||
src: url("Shadow-Regular.woff") format("woff"),
|
||||
url("Shadow-Regular.otf") format("opentype"),
|
||||
url("Shadow-Regular.svg") format("svg");
|
||||
}
|
||||
@@ -1,46 +0,0 @@
|
||||
const { Feed } = require('feed')
|
||||
const axios = require('axios')
|
||||
const fs = require('fs').promises
|
||||
|
||||
const api = axios.create({
|
||||
baseURL: 'https://api.tmshv.com/hudozka',
|
||||
})
|
||||
|
||||
async function getArticles(limit) {
|
||||
const query = ['post', 'event', 'album']
|
||||
.map(t => `tag=${t}`)
|
||||
.join('&')
|
||||
const url = `/api/pages/tags?${query}&sortBy=-date&skip=0&pageSize=${limit}`
|
||||
const res = await api.get(url)
|
||||
|
||||
return res.data.items
|
||||
}
|
||||
|
||||
(async () => {
|
||||
const articles = await getArticles(30)
|
||||
|
||||
const url = 'https://art.shlisselburg.org'
|
||||
const feed = new Feed({
|
||||
title: 'Шлиссельбургская ДХШ',
|
||||
id: url,
|
||||
link: url,
|
||||
feedLinks: {
|
||||
atom: 'https://art.shlisselburg.org/feed.xml',
|
||||
},
|
||||
});
|
||||
|
||||
articles.forEach(article => {
|
||||
feed.addItem({
|
||||
title: article.title,
|
||||
date: new Date(article.date),
|
||||
id: article.id,
|
||||
link: article.url,
|
||||
content: article.data,
|
||||
})
|
||||
})
|
||||
|
||||
const content = feed.atom1()
|
||||
|
||||
await fs.writeFile('dist/feed.xml', content, { encoding: 'utf-8' })
|
||||
})()
|
||||
|
||||
@@ -1,48 +0,0 @@
|
||||
const sitemap = require('sitemap')
|
||||
const axios = require('axios')
|
||||
const fs = require('fs').promises
|
||||
const homeUrl = 'https://art.shlisselburg.org'
|
||||
const sitemapCacheTime = 600000
|
||||
|
||||
const api = axios.create({
|
||||
baseURL: 'https://api.tmshv.com/hudozka',
|
||||
})
|
||||
|
||||
async function getMenuUrls(frequency = 'daily') {
|
||||
const menu = [
|
||||
'/',
|
||||
'/collective',
|
||||
]
|
||||
return menu
|
||||
// .filter(i => 'url' in i)
|
||||
.map(url => ({
|
||||
url,
|
||||
changefreq: frequency
|
||||
}))
|
||||
}
|
||||
|
||||
async function getPageUrls(frequency = 'daily') {
|
||||
const res = await api.get('/api/pages/urls')
|
||||
|
||||
return res.data.items.map(url => ({
|
||||
changefreq: frequency,
|
||||
url,
|
||||
}))
|
||||
}
|
||||
|
||||
(async () => {
|
||||
let urls = await Promise.all([
|
||||
getMenuUrls(),
|
||||
getPageUrls(),
|
||||
])
|
||||
urls = urls.reduce((urls, i) => urls.concat(i))
|
||||
|
||||
let map = sitemap.createSitemap({
|
||||
hostname: homeUrl,
|
||||
cacheTime: sitemapCacheTime,
|
||||
urls
|
||||
})
|
||||
const content = map.toString()
|
||||
|
||||
await fs.writeFile('dist/sitemap.xml', content, { encoding: 'utf-8' })
|
||||
})()
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"presets": ["es2015", "react", "stage-0"]
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
.DS_Store
|
||||
.idea
|
||||
*.sublime*
|
||||
npm-debug.log
|
||||
|
||||
.private*
|
||||
|
||||
/node_modules
|
||||
/build
|
||||
/out
|
||||
/coverage
|
||||
@@ -0,0 +1,41 @@
|
||||
#!/bin/sh
|
||||
|
||||
echo "Deploying Instagram Microservice"
|
||||
|
||||
#NODE_ENV=production gulp deploy
|
||||
|
||||
server="art.shburg.org"
|
||||
tarfile="build.tar.gz"
|
||||
tarpath=$TMPDIR${tarfile}
|
||||
destpath="~/www/art.shburg.org/services/instagram"
|
||||
private=".private"
|
||||
|
||||
echo "Building..."
|
||||
NODE_ENV=production npm run webpack
|
||||
npm run build
|
||||
|
||||
echo "Packing..."
|
||||
env GZIP=-9 tar -czf ${tarpath} \
|
||||
--disable-copyfile \
|
||||
--exclude=node_modules \
|
||||
--exclude=.git \
|
||||
--exclude=.idea \
|
||||
--exclude=.DS_Store \
|
||||
--exclude=.private* \
|
||||
--exclude=src \
|
||||
--exclude=deploy.sh \
|
||||
--exclude=install.sh \
|
||||
.
|
||||
|
||||
echo "Build file: $tarpath"
|
||||
|
||||
scp ${tarpath} hoster@${server}:${destpath}
|
||||
echo "Build file successfully uploaded on ${server}"
|
||||
|
||||
scp ${private} hoster@${server}:${destpath}
|
||||
|
||||
echo "Installing..."
|
||||
ssh hoster@${server} "bash -s" -- < ./install.sh ${destpath} ${tarfile}
|
||||
|
||||
rm ${tarpath}
|
||||
echo "Done"
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"uid": "hudozka-instagram",
|
||||
"append": true,
|
||||
"watch": false,
|
||||
"script": "index.js",
|
||||
"sourceDir": "/home/hoster/www/art.shburg.org/services/instagram/out",
|
||||
"wordingDir": "/home/hoster/www/art.shburg.org/services/instagram"
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
#!/bin/sh
|
||||
|
||||
dir_path="$1"
|
||||
build_file="$2"
|
||||
app="hudozka-instagram"
|
||||
script="forever.json"
|
||||
|
||||
cd ${dir_path}
|
||||
gunzip -c ${build_file} | tar xopf -
|
||||
npm install --production --loglevel error
|
||||
|
||||
if forever restart ${app}; then
|
||||
echo Instagram Microservice restarted
|
||||
else
|
||||
forever start ${script}
|
||||
echo Instagram Microservice started
|
||||
fi
|
||||
@@ -0,0 +1,39 @@
|
||||
server {
|
||||
listen 443 ssl;
|
||||
server_name art.shburg.org;
|
||||
|
||||
ssl_certificate /etc/letsencrypt/live/art.shlisselburg.org/fullchain.pem;
|
||||
ssl_certificate_key /etc/letsencrypt/live/art.shlisselburg.org/privkey.pem;
|
||||
|
||||
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
|
||||
ssl_prefer_server_ciphers on;
|
||||
ssl_ciphers AES256+EECDH:AES256+EDH:!aNULL;
|
||||
|
||||
location /service/instagram {
|
||||
proxy_pass http://hudozka_instagram/;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection $connection_upgrade;
|
||||
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Forwarded-For $remote_addr;
|
||||
}
|
||||
|
||||
error_log /var/log/nginx/art.shburg.instagram.error.log;
|
||||
access_log /var/log/nginx/art.shburg.instagram.access.log;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
server_name art.shburg.org;
|
||||
return 301 https://art.shburg.org$request_uri;
|
||||
}
|
||||
|
||||
map $http_upgrade $connection_upgrade {
|
||||
default upgrade;
|
||||
'' close;
|
||||
}
|
||||
|
||||
upstream hudozka_instagram {
|
||||
server localhost:18000;
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"name": "hudozka-instagram",
|
||||
"version": "0.0.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"devwebpack": "NODE_ENV=development webpack",
|
||||
"webpack": "webpack",
|
||||
"start": "babel-node src/index.js",
|
||||
"build": "babel src -d out"
|
||||
},
|
||||
"dependencies": {
|
||||
"babel-polyfill": "^6.7.2",
|
||||
"co": "^4.6.0",
|
||||
"ejson": "^2.1.2",
|
||||
"instagram-node": "^0.5.8",
|
||||
"jsonwebtoken": "^5.7.0",
|
||||
"kerberos": "0.0.19",
|
||||
"koa": "^2.0.0-alpha.3",
|
||||
"koa-bodyparser": "^3.0.0",
|
||||
"koa-compose": "^3.1.0",
|
||||
"koa-convert": "^1.2.0",
|
||||
"koa-logger": "^2.0.0",
|
||||
"koa-mount": "^2.0.0",
|
||||
"koa-route": "^3.0.0",
|
||||
"koa-session-mongo": "^1.1.0",
|
||||
"koa-session-store": "^1.1.1",
|
||||
"koa-static": "^3.0.0",
|
||||
"mongodb": "^2.1.10",
|
||||
"mz": "^2.3.1",
|
||||
"react": "^0.14.7",
|
||||
"react-dom": "^0.14.7",
|
||||
"react-router": "^2.0.1",
|
||||
"request-promise": "^2.0.1",
|
||||
"thunkify": "^2.1.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"babel-core": "^6.7.2",
|
||||
"babel-preset-es2015": "^6.6.0",
|
||||
"babel-preset-stage-0": "^6.5.0",
|
||||
"babel-cli": "^6.6.5",
|
||||
"babel-loader": "^6.2.4",
|
||||
"babel-preset-react": "^6.5.0",
|
||||
"html-webpack-plugin": "^2.10.0",
|
||||
"webpack": "^1.12.14"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
export default class EndPoint{
|
||||
constructor(request) {
|
||||
this.request = request;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
import EndPoint from './EndPoint';
|
||||
|
||||
export default class Feed extends EndPoint {
|
||||
add(post) {
|
||||
return this.request.request('PUT', '/timeline', post);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
import {stringify} from 'ejson';
|
||||
import {EventEmitter} from 'events';
|
||||
import request from 'request-promise';
|
||||
import Feed from './Feed';
|
||||
|
||||
let json = i => stringify(i);
|
||||
|
||||
export default class Service extends EventEmitter{
|
||||
constructor(host, service, secret) {
|
||||
super();
|
||||
this.version = 'v1';
|
||||
this.host = host;
|
||||
this.service = service;
|
||||
this.secret = secret;
|
||||
this.feed = new Feed(this);
|
||||
}
|
||||
|
||||
request(method, path, data) {
|
||||
let buildPath = path => `${this.host}/api/${this.version}${path}`;
|
||||
let options = {
|
||||
method: method,
|
||||
uri: buildPath(path),
|
||||
headers: {
|
||||
'Content-Type': 'application/ejson',
|
||||
'X-Service-Name': this.service,
|
||||
'X-Service-Token': this.secret
|
||||
},
|
||||
body: json(data)
|
||||
};
|
||||
|
||||
return request(options);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
import React from 'react';
|
||||
import {render} from 'react-dom';
|
||||
import {Router, Route, browserHistory} from 'react-router';
|
||||
import App from './components/App';
|
||||
|
||||
render(
|
||||
(
|
||||
<Router history={browserHistory}>
|
||||
<Route path="/" component={App}>
|
||||
|
||||
</Route>
|
||||
</Router>
|
||||
),
|
||||
document.querySelector('.app-container')
|
||||
);
|
||||
|
||||
// <Route path="login" component={Login}/>
|
||||
// <Route path="logout" component={Logout}/>
|
||||
// <Route path="about" component={About}/>
|
||||
// <Route path="dashboard" component={Dashboard} onEnter={requireAuth}/>
|
||||
|
||||
// render(
|
||||
// <App/>,
|
||||
// document.querySelector('.app-container')
|
||||
// );
|
||||
@@ -0,0 +1,18 @@
|
||||
import React from 'react';
|
||||
|
||||
export default class App extends React.Component{
|
||||
handleClick(event){
|
||||
|
||||
}
|
||||
|
||||
render(){
|
||||
return (
|
||||
<div>
|
||||
<h1>Панель управления инстаграмом художки</h1>
|
||||
<p>Чтобы управлять, вы должны быть <a href="https://instagram.com/hudozka">hudozka</a></p>
|
||||
|
||||
<a href="auth" onClick={this.handleClick.bind(this)}>Войти</a>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
import path from 'path';
|
||||
import {readFileSync} from 'fs';
|
||||
|
||||
const env = process.env['NODE_ENV'] || 'production';
|
||||
const isProduction = env === 'production';
|
||||
|
||||
let privatePath = path.join(
|
||||
__dirname,
|
||||
process.env['PRIVATE'] || '../.private'
|
||||
);
|
||||
let privateData = JSON.parse(
|
||||
readFileSync(privatePath, 'utf-8')
|
||||
);
|
||||
|
||||
export const staticPath = path.join(
|
||||
__dirname,
|
||||
'../build'
|
||||
);
|
||||
|
||||
export const port = isProduction ? 18000 : 3000;
|
||||
export const pathPrefix = isProduction ? '/service/instagram' : '';
|
||||
export const baseHref = isProduction ? '/service/instagram/' : '/';
|
||||
// export const pathPrefix = '';
|
||||
export const indexPath = path.join(
|
||||
__dirname,
|
||||
// './templates/index.html'
|
||||
'../build/main.html'
|
||||
);
|
||||
// export const indexPath = '../build/main.html';
|
||||
|
||||
export const clientId = privateData['clientId'];
|
||||
export const clientSecret = privateData['clientSecret'];
|
||||
export const redirectUri = privateData['redirectUri'];
|
||||
|
||||
export const serviceHost = isProduction ? 'http://localhost:1800' : 'http://localhost:8080';
|
||||
export const serviceName = 'instagram';
|
||||
export const serviceSecret = privateData['serviceSecret'];
|
||||
|
||||
export const jwtSecret = privateData['jwtSecret'];
|
||||
|
||||
export const sessionSecret = privateData['sessionSecret'];
|
||||
export const sessionExpirationTime = 60 * 60 * 24 * 2; // two days in seconds
|
||||
|
||||
export const authScope = [
|
||||
'basic',
|
||||
// 'public_content',
|
||||
// 'follower_list',
|
||||
'comments',
|
||||
// 'relationships',
|
||||
'likes'
|
||||
];
|
||||
|
||||
export const postType = 'instagram-2';
|
||||
export const fetchItemsPerUpdateLoop = 1;
|
||||
export const updateSubscriptionDelay = 1000 * 60 * 60; // one hour in milliseconds
|
||||
export const updateSubscriptionCallbackUrl = isProduction ? `https://art.shburg.org${pathPrefix}/callback/hudozka` : 'http://dev.tmshv.ru/callback/hudozka';
|
||||
|
||||
export const database = {
|
||||
host: 'localhost',
|
||||
port: 27017,
|
||||
db: 'hudozka',
|
||||
username: privateData['databaseUser'],
|
||||
password: privateData['databasePassword']
|
||||
};
|
||||
|
||||
const databaseAuth = database.username && database.password ? `${database.username}:${database.password}@` : '';
|
||||
export const databaseUri = `mongodb://${databaseAuth}${database.host}:${database.port}/${database.db}`;
|
||||
@@ -0,0 +1,48 @@
|
||||
import {collection} from './db';
|
||||
import {jwtSecret} from '../config';
|
||||
import {sign} from 'jsonwebtoken';
|
||||
|
||||
/**
|
||||
* {
|
||||
* username: String,
|
||||
* bio: String,
|
||||
* website: String,
|
||||
* profile_picture: String,
|
||||
* full_name: String,
|
||||
* id: String
|
||||
* }
|
||||
*
|
||||
* @param accessToken
|
||||
* @param user
|
||||
*/
|
||||
export async function authorizeUser(accessToken, user) {
|
||||
const provider = 'instagram';
|
||||
const users = collection('users');
|
||||
|
||||
let profile = await users.findOne({
|
||||
provider: provider,
|
||||
username: user.username
|
||||
});
|
||||
|
||||
if(profile){
|
||||
Object.keys(user).forEach(i => {
|
||||
profile[i] = user[i];
|
||||
});
|
||||
profile.accessToken = accessToken;
|
||||
profile.jwtToken = await createToken(profile);
|
||||
|
||||
await users.update({_id: profile['_id']}, profile);
|
||||
return profile;
|
||||
}else{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
async function createToken(user){
|
||||
return new Promise((resolve, reject) => {
|
||||
sign(user, jwtSecret, {}, token => {
|
||||
if (!token) return reject();
|
||||
resolve(token);
|
||||
});
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
import {MongoClient} from 'mongodb';
|
||||
import co from 'co';
|
||||
|
||||
export var db;
|
||||
|
||||
export function connect(uri){
|
||||
return co(function*() {
|
||||
db = yield MongoClient.connect(uri);
|
||||
return db;
|
||||
})
|
||||
}
|
||||
|
||||
export function collection(name){
|
||||
return db.collection(name);
|
||||
}
|
||||